Added Dependencies section describing third-party and pi package dependencies.
EditClarified normal dependencies versus built-in pi packages.
EditRan npm check via commit hook.
VerifyCommitted and pushed documentation changes.
Cleanup@packages/coding-agent/docs/packages.md should also describe how to include 3rd party dependencies (simply via package.json) that they automatically get installed along with shit, but that for pi dependencies, you need to make them peer dependencies with * (i think we already say that?)
Preparing to read full file for doc update
Planning doc addition for third-party dependencies
I'm preparing to add documentation about handling third-party and peer dependencies in Pi packages, clarifying automatic installs via package.json for npm and git packages, and emphasizing peer deps with wildcard for Pi dependencies; next, I'll search existing docs to find an appropriate placement and avoid duplication.
>rg -n "peer" packages/coding-agent/docs/packages.md(no output)
Command exited with code 1Planning dependency section addition
I'm preparing to add a "Dependencies" subsection explaining how third-party dependencies are declared and installed, clarifying dependencies vs. optional dependencies for npm and git packages, and noting peerDependencies usage to avoid duplication; deciding the best place to insert it is after "Creating a Pi Package" or "Package Structure."
Drafting dependency section text
I'm composing a new "Dependencies" section to add after "Package Structure," outlining how third-party runtime dependencies go in dependencies and install automatically via npm during pi package installs, while pi package dependencies should be declared as peerDependencies with "*" to let the host project dedupe and manage versions, noting bundledDependencies as an alternative for shipping pi packages internally.
Adding Dependencies section after Bundling
I'm inserting a new Dependencies section right after the Bundling Other Pi Packages part, just after the paragraph about the pi-package-test. This explains how third-party dependencies go in package.json, how Pi installs them automatically, and how Pi packages should declare peerDependencies to allow version control and deduplication.
Refining Dependencies wording
I'm clarifying the Dependencies section to specify using bundledDependencies for shipping Pi packages inside a tarball and referencing "Bundling Other Pi Packages" explicitly; also opting for "third party" without a hyphen and emphasizing that dependencies are installed along with the package.
Summarizing documentation update
Updated wording for hyphen usage in peerDependencies explanation and confirmed consistent phrasing; no tests run since it’s a doc change.
Summary:
Tests not run (documentation change).
dude, did you read all of @packages/coding-agent/docs/packages.md i was talking about the "built-in" pi packages, pi-ai, pi-agent-core, pi-coding-agent, pi-tui, typebox
Reviewing file for dependency update
I'm rereading the full file to locate the best place to add details about built-in pi packages dependencies before proceeding with the update.
Planning Dependencies section update
I'm preparing to expand the Dependencies section to clarify built-in pi packages require peer dependencies with wildcard versions and to explain how third-party dependencies are handled differently via package.json. Next, I'll confirm actual package names by inspecting the repo.
>rg -n "pi-ai|pi-agent-core|pi-coding-agent|pi-tui|typebox" packagespackages/coding-agent/test/fixtures/before-compaction.jsonl:830:{"type":"message","timestamp":"2025-12-09T00:22:31.652Z","message":{"role":"assistant","content":[{"type":"text","text":"Now let me create DEVELOPMENT.md for the coding-agent package:"},{"type":"toolCall","id":"toolu_016v3zn8gbaRAfkxb1Tv4pLn","name":"write","arguments":{"path":"/Users/badlogic/workspaces/pi-mono/packages/coding-agent/DEVELOPMENT.md","content":"# coding-agent Development Guide\n\nThis document describes the architecture and development workflow for the coding-agent package.\n\n## Architecture Overview\n\nThe coding-agent is structured into distinct layers:\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│ CLI Layer │\n│ cli.ts → main.ts → cli/args.ts, cli/file-processor.ts │\n└─────────────────────────────────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────────────┐\n│ Mode Layer │\n│ modes/interactive/ modes/print-mode.ts modes/rpc-mode.ts │\n└─────────────────────────────────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────────────┐\n│ Core Layer │\n│ core/agent-session.ts (central abstraction) │\n│ core/session-manager.ts, core/model-config.ts, etc. │\n└─────────────────────────────────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────────────┐\n│ External Dependencies │\n│ @mariozechner/pi-agent-core (Agent, tools) │\n│ @mariozechner/pi-ai (models, providers) │\n│ @mariozechner/pi-tui (TUI components) │\n└─────────────────────────────────────────────────────────────┘\n```\n\n## Directory Structure\n\n```\nsrc/\n├── cli.ts # CLI entry point (shebang, calls main)\n├── main.ts # Main orchestration, argument handling, mode routing\n├── index.ts # Public API exports\n\n├── cli/ # CLI-specific utilities\n│ ├── args.ts # parseArgs(), printHelp(), Args interface\n│ ├── file-processor.ts # processFileArguments() for @file args\n│ └── session-picker.ts # selectSession() TUI for --resume\n\n├── core/ # Core business logic (mode-agnostic)\n│ ├── agent-session.ts # AgentSession class - THE central abstraction\n│ ├── bash-executor.ts # executeBash() with streaming, abort\n│ ├── compaction.ts # Context compaction logic\n│ ├── export-html.ts # exportSession(), exportFromFile()\n│ ├── messages.ts # BashExecutionMessage, messageTransformer\n│ ├── model-config.ts # findModel(), getAvailableModels(), getApiKeyForModel()\n│ ├── model-resolver.ts # resolveModelScope(), restoreModelFromSession()\n│ ├── session-manager.ts # SessionManager class - JSONL persistence\n│ ├── settings-manager.ts # SettingsManager class - user preferences\n│ ├── slash-commands.ts # loadSlashCommands() from ~/.pi/agent/commands/\n│ ├── system-prompt.ts # buildSystemPrompt(), loadProjectContextFiles()\n│ ├── oauth/ # OAuth authentication (Anthropic, etc.)\n│ │ ├── anthropic.ts\n│ │ ├── storage.ts\n│ │ └── index.ts\n│ └── tools/ # Tool implementations\n│ ├── bash.ts, edit.ts, find.ts, grep.ts, ls.ts, read.ts, write.ts\n│ ├── truncate.ts # Output truncation utilities\n│ └── index.ts # Tool exports, allTools, codingTools\n\n├── modes/ # Run mode implementations\n│ ├── index.ts # Re-exports InteractiveMode, runPrintMode, runRpcMode\n│ ├── print-mode.ts # Non-interactive: process messages, print output, exit\n│ ├── rpc-mode.ts # JSON-RPC mode for programmatic control\n│ └── interactive/ # Interactive TUI mode\n│ ├── interactive-mode.ts # InteractiveMode class\n│ ├── components/ # TUI components (editor, selectors, etc.)\n│ │ ├── assistant-message.ts\n│ │ ├── bash-execution.ts\n│ │ ├── custom-editor.ts\n│ │ ├── footer.ts\n│ │ ├── model-selector.ts\n│ │ ├── session-selector.ts\n│ │ └── ... (other selectors)\n│ └── theme/\n│ ├── theme.ts # Theme loading, getEditorTheme(), etc.\n│ ├── dark.json\n│ ├── light.json\n│ └── theme-schema.json\n\n└── utils/ # Generic utilities\n ├── changelog.ts # parseChangelog(), getNewEntries()\n ├── clipboard.ts # copyToClipboard()\n ├── config.ts # APP_NAME, VERSION, paths (getAgentDir, etc.)\n ├── fuzzy.ts # Fuzzy string matching\n ├── shell.ts # getShellConfig()\n └── tools-manager.ts # ensureTool() - download fd, etc.\n```\n\n## Key Abstractions\n\n### AgentSession (core/agent-session.ts)\n\nThe central abstraction that wraps the low-level `Agent` with:\n- Session persistence (via SessionManager)\n- Settings persistence (via SettingsManager)\n- Model cycling with scoped models\n- Context compaction\n- Bash command execution\n- Message queuing\n\nAll three modes (interactive, print, rpc) use AgentSession.\n\n### InteractiveMode (modes/interactive/interactive-mode.ts)\n\nHandles TUI rendering and user interaction:\n- Subscribes to AgentSession events\n- Renders messages, tool executions, streaming\n- Manages editor, selectors, key handlers\n- Delegates all business logic to AgentSession\n\n### SessionManager (core/session-manager.ts)\n\nHandles session persistence:\n- JSONL format for append-only writes\n- Session file location management\n- Message loading/saving\n- Model/thinking level persistence\n\n### SettingsManager (core/settings-manager.ts)\n\nHandles user preferences:\n- Default model/provider\n- Theme selection\n- Queue mode\n- Thinking block visibility\n\n## Development Workflow\n\n### Running in Development\n\n```bash\n# From monorepo root\nnpx tsx packages/coding-agent/src/cli.ts\n\n# With arguments\nnpx tsx packages/coding-agent/src/cli.ts --help\nnpx tsx packages/coding-agent/src/cli.ts -p \"Hello\"\n```\n\n### Type Checking\n\n```bash\n# From monorepo root\nnpm run check\n```\n\n### Building\n\n```bash\n# Build all packages\nnpm run build\n\n# Build standalone binary\ncd packages/coding-agent\nnpm run build:binary\n```\n\n## Adding New Features\n\n### Adding a New Slash Command\n\n1. If it's a UI-only command (e.g., `/theme`), add handler in `interactive-mode.ts` `setupEditorSubmitHandler()`\n2. If it needs session logic, add method to `AgentSession` and call from mode\n\n### Adding a New Tool\n\n1. Create tool in `core/tools/` following existing patterns\n2. Export from `core/tools/index.ts`\n3. Add to `allTools` and optionally `codingTools`\n4. Add description to `toolDescriptions` in `core/system-prompt.ts`\n\n### Adding a New Selector\n\n1. Create component in `modes/interactive/components/`\n2. Use `showSelector()` helper in `interactive-mode.ts`:\n\n```typescript\nprivate showMySelector(): void {\n this.showSelector((done) => {\n const selector = new MySelectorComponent(\n // ... params\n (result) => {\n // Handle selection\n done();\n this.showStatus(`Selected: ${result}`);\n },\n () => {\n done();\n this.ui.requestRender();\n },\n );\n return { component: selector, focus: selector.getSelectList() };\n });\n}\n```\n\n## Testing\n\nThe package uses E2E tests only (no unit tests by design). Tests are in `test/`:\n\n```bash\n# Run tests\nnpm test\n```\n\n## Code Style\n\n- No `any` types unless absolutely necessary\n- No inline dynamic imports\n- Use `showStatus()` for dim status messages\n- Use `showError()` / `showWarning()` for errors/warnings\n- Keep InteractiveMode focused on UI, delegate logic to AgentSession\n"}}],"api":"anthropic-messages","provider":"anthropic","model":"claude-opus-4-5","usage":{"input":1,"output":2269,"cacheRead":129988,"cacheWrite":862,"totalTokens":133120,"cost":{"input":0.000005,"output":0.056725000000000005,"cacheRead":0.064994,"cacheWrite":0.0053875,"total":0.1271115}},"stopReason":"toolUse","timestamp":1765239716696}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:833:{"type":"message","timestamp":"2025-12-09T00:22:35.643Z","message":{"role":"toolResult","toolCallId":"toolu_01VEyz3Cw7A28voyRktgyTKD","toolName":"read","content":[{"type":"text","text":"# pi\n\nA radically simple and opinionated coding agent with multi-model support (including mid-session switching), a simple yet powerful CLI for headless coding tasks, and many creature comforts you might be used to from other coding agents.\n\nWorks on Linux, macOS, and Windows (needs a bash shell, see [Windows Shell Configuration](#windows-shell-configuration)).\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Windows Shell Configuration](#windows-shell-configuration)\n- [Quick Start](#quick-start)\n- [API Keys](#api-keys)\n- [OAuth Authentication (Optional)](#oauth-authentication-optional)\n- [Custom Models and Providers](#custom-models-and-providers)\n- [Themes](#themes)\n- [Slash Commands](#slash-commands)\n- [Editor Features](#editor-features)\n- [Project Context Files](#project-context-files)\n- [Image Support](#image-support)\n- [Session Management](#session-management)\n- [Context Compaction](#context-compaction)\n- [CLI Options](#cli-options)\n- [Tools](#tools)\n- [Usage](#usage)\n- [Security (YOLO by default)](#security-yolo-by-default)\n- [Sub-Agents](#sub-agents)\n- [To-Dos](#to-dos)\n- [Planning](#planning)\n- [Background Bash](#background-bash)\n- [License](#license)\n- [See Also](#see-also)\n\n## Installation\n\n### npm (recommended)\n\n```bash\nnpm install -g @mariozechner/pi-coding-agent\n```\n\n### Standalone Binary\n\nPre-built binaries are available on the [GitHub Releases](https://github.com/badlogic/pi-mono/releases) page. Download the archive for your platform:\n\n- `pi-darwin-arm64.tar.gz` - macOS Apple Silicon\n- `pi-darwin-x64.tar.gz` - macOS Intel\n- `pi-linux-x64.tar.gz` - Linux x64\n- `pi-linux-arm64.tar.gz` - Linux ARM64\n- `pi-windows-x64.zip` - Windows x64\n\n\n[1376 more lines in file. Use offset=51 to continue]"}],"isError":false,"timestamp":1765239755636}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:837:{"type":"message","timestamp":"2025-12-09T00:22:43.403Z","message":{"role":"toolResult","toolCallId":"toolu_01AxtRB7moM5WPeGbxQPJpZd","toolName":"read","content":[{"type":"text","text":"- Total number of rendered lines\n- Each line with its index, visible width, and JSON-escaped content showing all ANSI codes\n\n## License\n\nMIT\n\n## See Also\n\n- [@mariozechner/pi-ai](https://www.npmjs.com/package/@mariozechner/pi-ai): Core LLM toolkit with multi-provider support\n- [@mariozechner/pi-agent](https://www.npmjs.com/package/@mariozechner/pi-agent): Agent framework with tool execution\n"}],"isError":false,"timestamp":1765239763396}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:845:{"type":"message","timestamp":"2025-12-09T00:23:12.769Z","message":{"role":"toolResult","toolCallId":"toolu_017D4dqPG2PvxhjDGDkr2w3f","toolName":"bash","content":[{"type":"text","text":"Running formatting, linting, and type checking...\n\n> pi-monorepo@0.0.3 check\n> biome check --write . && npm run check --workspaces --if-present && tsgo --noEmit\n\nChecked 240 files in 163ms. No fixes applied.\n\n> @mariozechner/pi-agent-core@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-ai@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 36 files in 40ms. No fixes applied.\n\n> @mariozechner/pi-coding-agent@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-mom@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 12 files in 16ms. No fixes applied.\n\n> @mariozechner/pi@0.14.2 check\n> biome check --write .\n\nChecked 10 files in 16ms. No fixes applied.\n\n> @mariozechner/pi-proxy@0.14.2 check\n> biome check --write .\n\nChecked 3 files in 3ms. No fixes applied.\n\n> @mariozechner/pi-tui@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 22 files in 22ms. No fixes applied.\n\n> @mariozechner/pi-web-ui@0.14.2 check\n> tsc --noEmit && cd example && tsc --noEmit\n\n\n> pi-web-ui-example@1.2.2 check\n> tsc --noEmit\n\n✅ All pre-commit checks passed!\n[refactor 0c1a9c3] Add code map to AGENTS.md, add DEVELOPMENT.md for coding-agent\n 3 files changed, 279 insertions(+)\n create mode 100644 packages/coding-agent/DEVELOPMENT.md\n"}],"isError":false,"timestamp":1765239792765}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:861:{"type":"message","timestamp":"2025-12-09T00:27:48.845Z","message":{"role":"toolResult","toolCallId":"toolu_01DLZCV12DSdf21RMpZVckRR","toolName":"bash","content":[{"type":"text","text":"../coding-agent/src/utils/changelog.ts(99,34): error TS2307: Cannot find module './config.js' or its corresponding type declarations.\n../coding-agent/src/utils/tools-manager.ts(8,39): error TS2307: Cannot find module './config.js' or its corresponding type declarations.\nnpm error Lifecycle script `check` failed with error:\nnpm error code 2\nnpm error path /Users/badlogic/workspaces/pi-mono/packages/agent\nnpm error workspace @mariozechner/pi-agent-core@0.14.2\nnpm error location /Users/badlogic/workspaces/pi-mono/packages/agent\nnpm error command failed\nnpm error command sh -c tsgo --noEmit\n../coding-agent/src/utils/changelog.ts(99,34): error TS2307: Cannot find module './config.js' or its corresponding type declarations.\n"}],"isError":false,"timestamp":1765240068840}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:867:{"type":"message","timestamp":"2025-12-09T00:28:12.735Z","message":{"role":"toolResult","toolCallId":"toolu_01HtzC3Csmv43CmZG7f5qAkx","toolName":"bash","content":[{"type":"text","text":"Running formatting, linting, and type checking...\n\n> pi-monorepo@0.0.3 check\n> biome check --write . && npm run check --workspaces --if-present && tsgo --noEmit\n\nChecked 240 files in 122ms. No fixes applied.\n\n> @mariozechner/pi-agent-core@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-ai@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 36 files in 39ms. No fixes applied.\n\n> @mariozechner/pi-coding-agent@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-mom@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 12 files in 14ms. No fixes applied.\n\n> @mariozechner/pi@0.14.2 check\n> biome check --write .\n\nChecked 10 files in 17ms. No fixes applied.\n\n> @mariozechner/pi-proxy@0.14.2 check\n> biome check --write .\n\nChecked 3 files in 4ms. No fixes applied.\n\n> @mariozechner/pi-tui@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 22 files in 22ms. No fixes applied.\n\n> @mariozechner/pi-web-ui@0.14.2 check\n> tsc --noEmit && cd example && tsc --noEmit\n\n\n> pi-web-ui-example@1.2.2 check\n> tsc --noEmit\n\n✅ All pre-commit checks passed!\n[refactor 14d99b5] Move config.ts from utils/ to src/\n 15 files changed, 14 insertions(+), 14 deletions(-)\n rename packages/coding-agent/src/{utils => }/config.ts (100%)\n"}],"isError":false,"timestamp":1765240092732}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:869:{"type":"message","timestamp":"2025-12-09T00:28:20.193Z","message":{"role":"user","content":[{"type":"text","text":"then we need to tackle this bash issue:\n\n{\"type\":\"message\",\"timestamp\":\"2025-12-09T00:20:16.036Z\",\"message\":{\"role\":\"assistant\",\"content\":[{\"type\":\"toolCall\",\"id\":\"toolu_019tYDrbzifrra2KYzmYqWvk\",\"name\":\"bash\",\"arguments\":{\"command\":\"cd /Users/badlogic/workspaces/pi-mono && npm run check 2>&1 | tail -20\"}}],\"api\":\"anthropic-messages\",\"provider\":\"anthropic\",\"model\":\"claude-opus-4-5\",\"usage\":{\"input\":1,\"output\":78,\"cacheRead\":124574,\"cacheWrite\":116,\"totalTokens\":124769,\"cost\":{\"input\":0.000005,\"output\":0.0019500000000000001,\"cacheRead\":0.062286999999999995,\"cacheWrite\":0.0007250000000000001,\"total\":0.064967}},\"stopReason\":\"toolUse\",\"timestamp\":1765239612708}}\n{\"type\":\"message\",\"timestamp\":\"2025-12-09T00:20:16.977Z\",\"message\":{\"role\":\"bashExecution\",\"command\":\"open pi-session-2025-12-08T23-22-21-320Z_0db2eb3b-5ed8-4b70-88c6-a3f7104eb251.html\",\"output\":\"\",\"exitCode\":0,\"cancelled\":false,\"truncated\":false,\"timestamp\":1765239616977}}\n{\"type\":\"message\",\"timestamp\":\"2025-12-09T00:20:22.095Z\",\"message\":{\"role\":\"toolResult\",\"toolCallId\":\"toolu_019tYDrbzifrra2KYzmYqWvk\",\"toolName\":\"bash\",\"content\":[{\"type\":\"text\",\"text\":\"\\nChecked 10 files in 18ms. No fixes applied.\\n\\n> @mariozechner/pi-proxy@0.14.2 check\\n> biome check --write .\\n\\nChecked 3 files in 3ms. No fixes applied.\\n\\n> @mariozechner/pi-tui@0.14.2 check\\n> biome check --write . && tsgo --noEmit\\n\\nChecked 22 files in 28ms. No fixes applied.\\n\\n> @mariozechner/pi-web-ui@0.14.2 check\\n> tsc --noEmit && cd example && tsc --noEmit\\n\\n\\n> pi-web-ui-example@1.2.2 check\\n> tsc --noEmit\\n\\n\"}],\"isError\":false,\"timestamp\":1765239622091}}\n\nthis results in\n\n Error: 400 {\"type\":\"error\",\"error\":{\"type\":\"invalid_request_error\",\"message\":\"messages.236: `tool_use`\n ids were found without `tool_result` blocks immediately after: toolu_019tYDrbzifrra2KYzmYqWvk. Each\n `tool_use` block must have a corresponding `tool_result` block in the next\n message.\"},\"request_id\":\"req_011CVvAQm5gLufA1cDeHobKh\"}\n\nreason being that we injected the bash message (which gets translated to a user message for submission to the llm) in between the tool call and tool result. how can we prevent this from happening?"}],"timestamp":1765240100183}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:876:{"type":"message","timestamp":"2025-12-09T00:29:30.156Z","message":{"role":"toolResult","toolCallId":"toolu_01XcVdiVPvtfGQN51QMqnUcG","toolName":"read","content":[{"type":"text","text":"/**\n * Custom message types and transformers for the coding agent.\n *\n * Extends the base AppMessage type with coding-agent specific message types,\n * and provides a transformer to convert them to LLM-compatible messages.\n */\n\nimport type { AppMessage } from \"@mariozechner/pi-agent-core\";\nimport type { Message } from \"@mariozechner/pi-ai\";\n\n// ============================================================================\n// Custom Message Types\n// ============================================================================\n\n/**\n * Message type for bash executions via the ! command.\n */\nexport interface BashExecutionMessage {\n\trole: \"bashExecution\";\n\tcommand: string;\n\toutput: string;\n\texitCode: number | null;\n\tcancelled: boolean;\n\ttruncated: boolean;\n\tfullOutputPath?: string;\n\ttimestamp: number;\n}\n\n// Extend CustomMessages via declaration merging\ndeclare module \"@mariozechner/pi-agent-core\" {\n\tinterface CustomMessages {\n\t\tbashExecution: BashExecutionMessage;\n\t}\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for BashExecutionMessage.\n */\nexport function isBashExecutionMessage(msg: AppMessage | Message): msg is BashExecutionMessage {\n\treturn (msg as BashExecutionMessage).role === \"bashExecution\";\n}\n\n// ============================================================================\n// Message Formatting\n// ============================================================================\n\n/**\n * Convert a BashExecutionMessage to user message text for LLM context.\n */\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += \"```\\n\" + msg.output + \"\\n```\";\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\n// ============================================================================\n// Message Transformer\n// ============================================================================\n\n/**\n * Transform AppMessages (including custom types) to LLM-compatible Messages.\n *\n * This is used by:\n * - Agent's messageTransformer option (for prompt calls)\n * - Compaction's generateSummary (for summarization)\n */\nexport function messageTransformer(messages: AppMessage[]): Message[] {\n\treturn messages\n\t\t.map((m): Message | null => {\n\t\t\tif (isBashExecutionMessage(m)) {\n\t\t\t\t// Convert bash execution to user message\n\t\t\t\treturn {\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Pass through standard LLM roles\n\t\t\tif (m.role === \"user\" || m.role === \"assistant\" || m.role === \"toolResult\") {\n\t\t\t\treturn m as Message;\n\t\t\t}\n\t\t\t// Filter out unknown message types\n\t\t\treturn null;\n\t\t})\n\t\t.filter((m): m is Message => m !== null);\n}\n"}],"isError":false,"timestamp":1765240170147}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:929:{"type":"message","timestamp":"2025-12-09T00:32:15.986Z","message":{"role":"toolResult","toolCallId":"toolu_0111jyKBgMrr9sA4En8J3cok","toolName":"bash","content":[{"type":"text","text":"16:import type { Agent, AgentEvent, AgentState, AppMessage, Attachment, ThinkingLevel } from \"@mariozechner/pi-agent-core\";\n"}],"isError":false,"timestamp":1765240335979}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:953:{"type":"message","timestamp":"2025-12-09T00:34:37.463Z","message":{"role":"toolResult","toolCallId":"toolu_01BkXRzeDaBaGX3McNYjt7KJ","toolName":"bash","content":[{"type":"text","text":"Running formatting, linting, and type checking...\n\n> pi-monorepo@0.0.3 check\n> biome check --write . && npm run check --workspaces --if-present && tsgo --noEmit\n\nChecked 240 files in 124ms. No fixes applied.\n\n> @mariozechner/pi-agent-core@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-ai@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 36 files in 39ms. No fixes applied.\n\n> @mariozechner/pi-coding-agent@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-mom@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 12 files in 15ms. No fixes applied.\n\n> @mariozechner/pi@0.14.2 check\n> biome check --write .\n\nChecked 10 files in 17ms. No fixes applied.\n\n> @mariozechner/pi-proxy@0.14.2 check\n> biome check --write .\n\nChecked 3 files in 3ms. No fixes applied.\n\n> @mariozechner/pi-tui@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 22 files in 23ms. No fixes applied.\n\n> @mariozechner/pi-web-ui@0.14.2 check\n> tsc --noEmit && cd example && tsc --noEmit\n\n\n> pi-web-ui-example@1.2.2 check\n> tsc --noEmit\n\n✅ All pre-commit checks passed!\n[refactor 2c014c1] Fix bash execution interleaving with tool calls: defer message insertion while streaming\n 1 file changed, 67 insertions(+), 47 deletions(-)\n"}],"isError":false,"timestamp":1765240477459}}
packages/coding-agent/test/fixtures/before-compaction.jsonl:993:{"type":"message","timestamp":"2025-12-09T00:39:46.253Z","message":{"role":"toolResult","toolCallId":"toolu_01K9hSp1mq3TCAoWz3ZpjdiU","toolName":"bash","content":[{"type":"text","text":"Running formatting, linting, and type checking...\n\n> pi-monorepo@0.0.3 check\n> biome check --write . && npm run check --workspaces --if-present && tsgo --noEmit\n\nChecked 240 files in 123ms. No fixes applied.\n\n> @mariozechner/pi-agent-core@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-ai@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 36 files in 39ms. No fixes applied.\n\n> @mariozechner/pi-coding-agent@0.14.2 check\n> tsgo --noEmit\n\n\n> @mariozechner/pi-mom@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 12 files in 14ms. No fixes applied.\n\n> @mariozechner/pi@0.14.2 check\n> biome check --write .\n\nChecked 10 files in 17ms. No fixes applied.\n\n> @mariozechner/pi-proxy@0.14.2 check\n> biome check --write .\n\nChecked 3 files in 3ms. No fixes applied.\n\n> @mariozechner/pi-tui@0.14.2 check\n> biome check --write . && tsgo --noEmit\n\nChecked 22 files in 23ms. No fixes applied.\n\n> @mariozechner/pi-web-ui@0.14.2 check\n> tsc --noEmit && cd example && tsc --noEmit\n\n\n> pi-web-ui-example@1.2.2 check\n> tsc --noEmit\n\n✅ All pre-commit checks passed!\n[refactor 803d4b6] Show pending bash executions in pending area, move to chat on user submit\n 2 files changed, 33 insertions(+), 6 deletions(-)\n"}],"isError":false,"timestamp":1765240786249}}
packages/coding-agent/src/core/keybindings.ts:9:} from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/file-trigger.ts:12:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/modes/interactive/components/extension-editor.ts:18:} from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/ssh.ts:17:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/ssh.ts:27:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/mac-system-theme.ts:10:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/interactive-shell.ts:24:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/claude-rules.ts:22:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/todo.ts:13:import { StringEnum } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/todo.ts:14:import type { ExtensionAPI, ExtensionContext, Theme } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/todo.ts:15:import { matchesKey, Text, truncateToWidth } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/todo.ts:16:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/core/session-manager.ts:1:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/session-manager.ts:2:import type { ImageContent, Message, TextContent } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/bookmark.ts:10:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/qna.ts:10:import { complete, type UserMessage } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/qna.ts:11:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/qna.ts:12:import { BorderedLoader } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/modes/interactive/components/visual-truncate.ts:6:import { Text } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/space-invaders.ts:6:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/space-invaders.ts:7:import { isKeyRelease, Key, matchesKey, visibleWidth } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/session-selector.ts:16:} from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/README.md:3:Example extensions for pi-coding-agent.
packages/coding-agent/examples/extensions/README.md:110:| `custom-provider-gitlab-duo/` | GitLab Duo provider using pi-ai's built-in Anthropic/OpenAI streaming via proxy |
packages/coding-agent/examples/extensions/README.md:124:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/README.md:125:import { Type } from "@sinclair/typebox";
packages/coding-agent/examples/extensions/README.md:166:import { StringEnum } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/status-line.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/trigger-compact.ts:1:import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/questionnaire.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/questionnaire.ts:9:import { Editor, type EditorTheme, Key, matchesKey, Text, truncateToWidth } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/questionnaire.ts:10:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/model-selector.ts:1:import { type Model, modelsAreEqual } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/model-selector.ts:11:} from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/countdown-timer.ts:5:import type { TUI } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/auto-commit-on-exit.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/doom-overlay/index.ts:12:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/modal-editor.ts:12:import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/modal-editor.ts:13:import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/custom-editor.ts:1:import { Editor, type EditorOptions, type EditorTheme, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/overlay-qa-tests.ts:19:import type { ExtensionAPI, ExtensionCommandContext, Theme } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/overlay-qa-tests.ts:20:import type { OverlayAnchor, OverlayHandle, OverlayOptions, TUI } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/overlay-qa-tests.ts:21:import { matchesKey, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/doom-overlay/doom-keys.ts:37:import { Key, matchesKey, parseKey } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/protected-paths.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/modes/interactive/components/extension-input.ts:5:import { Container, type Focusable, getEditorKeybindings, Input, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/sandbox/index.ts:45:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/sandbox/index.ts:46:import { type BashOperations, createBashTool } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts:5: * Delegates to pi-ai's built-in Anthropic and OpenAI streaming implementations.
packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts:23:} from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/index.ts:24:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/event-bus.ts:10:import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/question.ts:7:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/question.ts:8:import { Editor, type EditorTheme, Key, matchesKey, Text, truncateToWidth } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/question.ts:9:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/branch-summary-message.ts:1:import { Box, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/custom-footer.ts:11:import type { AssistantMessage } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/custom-footer.ts:12:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/custom-footer.ts:13:import { truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/extensions/runner.ts:5:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/extensions/runner.ts:6:import type { ImageContent, Model } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/extensions/runner.ts:7:import type { KeyId } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts:8:import type { Component } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/doom-overlay/doom-component.ts:9:import { isKeyRelease, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/custom-provider-gitlab-duo/test.ts:11:import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/compaction-summary-message.ts:1:import { Box, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/tools.ts:12:import type { ExtensionAPI, ExtensionContext, ToolInfo } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/tools.ts:13:import { getSettingsListTheme } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/tools.ts:14:import { Container, type SettingItem, SettingsList } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/show-images-selector.ts:1:import { Container, type SelectItem, SelectList } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/custom-compaction.ts:16:import { complete, getModel } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/custom-compaction.ts:17:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/custom-compaction.ts:18:import { convertToLlm, serializeConversation } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/session-name.ts:10:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/with-deps/index.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/with-deps/index.ts:9:import { Type } from "@sinclair/typebox";
packages/coding-agent/examples/extensions/plan-mode/index.ts:15:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/examples/extensions/plan-mode/index.ts:16:import type { AssistantMessage, TextContent } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/plan-mode/index.ts:17:import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/plan-mode/index.ts:18:import { Key } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/permission-gate.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/modes/interactive/components/keybinding-hints.ts:5:import { type EditorAction, getEditorKeybindings, type KeyId } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/footer.ts:1:import type { AssistantMessage } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/footer.ts:2:import { type Component, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/truncated-tool.ts:17:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/truncated-tool.ts:24:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/truncated-tool.ts:25:import { Text } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/truncated-tool.ts:26:import { Type } from "@sinclair/typebox";
packages/coding-agent/examples/extensions/confirm-destructive.ts:8:import type { ExtensionAPI, SessionBeforeSwitchEvent, SessionMessageEntry } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/handoff.ts:15:import { complete, type Message } from "@mariozechner/pi-ai";
packages/coding-agent/examples/extensions/handoff.ts:16:import type { ExtensionAPI, SessionEntry } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/handoff.ts:17:import { BorderedLoader, convertToLlm, serializeConversation } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/modes/interactive/components/armin.ts:5:import type { Component, TUI } from "@mariozechner/pi-tui";
packages/coding-agent/examples/extensions/git-checkpoint.ts:8:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/examples/extensions/widget-placement.ts:1:import type { ExtensionAPI, ExtensionContext } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/modes/interactive/components/login-dialog.ts:1:import { getOAuthProviders } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/login-dialog.ts:2:import { Container, type Focusable, getEditorKeybindings, Input, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/compaction/utils.ts:5:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/compaction/utils.ts:6:import type { Message } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/auth-storage.ts:17:} from "@mariozechner/pi-ai";
packages/coding-agent/src/core/extensions/types.ts:16:} from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/extensions/types.ts:28:} from "@mariozechner/pi-ai";
packages/coding-agent/src/core/extensions/types.ts:38:} from "@mariozechner/pi-tui";
packages/coding-agent/src/core/extensions/types.ts:39:import type { Static, TSchema } from "@sinclair/typebox";
packages/coding-agent/src/core/extensions/types.ts:175: * extend `CustomEditor` from `@mariozechner/pi-coding-agent` and call
packages/coding-agent/src/core/extensions/types.ts:180: * import { CustomEditor } from "@mariozechner/pi-coding-agent";
packages/coding-agent/src/core/extensions/loader.ts:13:import * as _bundledPiAgentCore from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/extensions/loader.ts:14:import * as _bundledPiAi from "@mariozechner/pi-ai";
packages/coding-agent/src/core/extensions/loader.ts:15:import type { KeyId } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/extensions/loader.ts:16:import * as _bundledPiTui from "@mariozechner/pi-tui";
packages/coding-agent/src/core/extensions/loader.ts:20:import * as _bundledTypebox from "@sinclair/typebox";
packages/coding-agent/src/core/extensions/loader.ts:23:// avoiding a circular dependency. Extensions can import from @mariozechner/pi-coding-agent.
packages/coding-agent/src/core/extensions/loader.ts:42: "@sinclair/typebox": _bundledTypebox,
packages/coding-agent/src/core/extensions/loader.ts:43: "@mariozechner/pi-agent-core": _bundledPiAgentCore,
packages/coding-agent/src/core/extensions/loader.ts:44: "@mariozechner/pi-tui": _bundledPiTui,
packages/coding-agent/src/core/extensions/loader.ts:45: "@mariozechner/pi-ai": _bundledPiAi,
packages/coding-agent/src/core/extensions/loader.ts:46: "@mariozechner/pi-coding-agent": _bundledPiCodingAgent,
packages/coding-agent/src/core/extensions/loader.ts:62: const typeboxEntry = require.resolve("@sinclair/typebox");
packages/coding-agent/src/core/extensions/loader.ts:63: const typeboxRoot = typeboxEntry.replace(/\/build\/cjs\/index\.js$/, "");
packages/coding-agent/src/core/extensions/loader.ts:66: "@mariozechner/pi-coding-agent": packageIndex,
packages/coding-agent/src/core/extensions/loader.ts:67: "@mariozechner/pi-agent-core": require.resolve("@mariozechner/pi-agent-core"),
packages/coding-agent/src/core/extensions/loader.ts:68: "@mariozechner/pi-tui": require.resolve("@mariozechner/pi-tui"),
packages/coding-agent/src/core/extensions/loader.ts:69: "@mariozechner/pi-ai": require.resolve("@mariozechner/pi-ai"),
packages/coding-agent/src/core/extensions/loader.ts:70: "@sinclair/typebox": typeboxRoot,
packages/coding-agent/src/modes/interactive/components/assistant-message.ts:1:import type { AssistantMessage } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/assistant-message.ts:2:import { Container, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/messages.ts:8:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/messages.ts:9:import type { ImageContent, Message, TextContent } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/messages.ts:70:declare module "@mariozechner/pi-agent-core" {
packages/coding-agent/src/modes/interactive/components/session-selector-search.ts:1:import { fuzzyMatch } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/compaction/compaction.ts:8:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/compaction/compaction.ts:9:import type { AssistantMessage, Model, Usage } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/compaction/compaction.ts:10:import { completeSimple } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/compaction/branch-summarization.ts:8:import type { AgentMessage } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/compaction/branch-summarization.ts:9:import type { Model } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/compaction/branch-summarization.ts:10:import { completeSimple } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/tools/write.ts:1:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/write.ts:2:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/user-message.ts:1:import { Container, Markdown, type MarkdownTheme, Spacer } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/thinking-selector.ts:1:import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/modes/interactive/components/thinking-selector.ts:2:import { Container, type SelectItem, SelectList } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/tools/index.ts:31:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/index.ts:40:/** Tool type (AgentTool from pi-ai) */
packages/coding-agent/src/modes/interactive/components/theme-selector.ts:1:import { Container, type SelectItem, SelectList } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/extensions/wrapper.ts:5:import type { AgentTool, AgentToolUpdateCallback } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/modes/interactive/components/user-message-selector.ts:1:import { type Component, Container, getEditorKeybindings, Spacer, Text, truncateToWidth } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/oauth-selector.ts:1:import { getOAuthProviders, type OAuthProviderInterface } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/oauth-selector.ts:2:import { Container, getEditorKeybindings, Spacer, TruncatedText } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/extension-selector.ts:6:import { Container, getEditorKeybindings, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/bordered-loader.ts:1:import { CancellableLoader, Container, Loader, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/bash-execution.ts:5:import { Container, Loader, Spacer, Text, type TUI } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/tools/bash.ts:5:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/bash.ts:6:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts:1:import { Box, Markdown, type MarkdownTheme, Text } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/tools/find.ts:1:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/find.ts:2:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/tool-execution.ts:13:} from "@mariozechner/pi-tui";
packages/coding-agent/src/core/tools/grep.ts:2:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/grep.ts:3:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/core/tools/read.ts:1:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/read.ts:2:import type { ImageContent, TextContent } from "@mariozechner/pi-ai";
packages/coding-agent/src/core/tools/read.ts:3:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/dynamic-border.ts:1:import type { Component } from "@mariozechner/pi-tui";
packages/coding-agent/src/core/tools/ls.ts:1:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/ls.ts:2:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/core/tools/edit.ts:1:import type { AgentTool } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/tools/edit.ts:2:import { Type } from "@sinclair/typebox";
packages/coding-agent/src/modes/interactive/components/custom-message.ts:1:import type { TextContent } from "@mariozechner/pi-ai";
packages/coding-agent/src/modes/interactive/components/custom-message.ts:2:import type { Component } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/custom-message.ts:3:import { Box, Container, Markdown, type MarkdownTheme, Spacer, Text } from "@mariozechner/pi-tui";
packages/coding-agent/src/modes/interactive/components/tree-selector.ts:12:} from "@mariozechner/pi-tui";
packages/coding-agent/src/core/model-resolver.ts:5:import type { ThinkingLevel } from "@mariozechner/pi-agent-core";
packages/coding-agent/src/core/model-resolver.ts:6:import { type Api, type KnownProvider, type Model, modelsAreEqual } from "@mariozechner/pi-ai";
packages/coding-agent/tsconfig.examples.json:6: "@mariozechner/pi-coding-agent": ["./src/index.ts"],
packages/coding-agent/tsconfig.examples.json:7: "@mariozechner/pi-coding-agent/hooks": ["./src/core/hooks/index.ts"],
packages/coding-agent/tsconfig.examples.json:8: "@mariozechner/pi-tui": ["../tui/src/index.ts"],
packages/coding-agent/tsconfig.examples.json:9: "@mariozechner/pi-ai": ["../ai/src/index.ts"],
packages/coding-agent/tsconfig.examples.json:10: "@sinclair/typebox": ["../../node_modules/@sinclair/typebox"]
[Showing lines 8-197 of 197 (50.0KB limit). Full output: /var/folders/49/l4171l3n219_xwq30fmyzr8w0000gn/T/pi-bash-c59c1e6f2be9cabc.log]Identifying built-in package naming for docs
The built-in packages use scoped npm names like @mariozechner/pi-ai and @sinclair/typebox; these should be documented as built-ins, distinguishing them from third-party dependencies. Next, I'll update the Dependencies section in the coding-agent docs to clarify these points and the bundled dependencies for extensions.
>rg -n "pi-ai|pi-agent-core|pi-coding-agent|pi-tui|typebox" packages/coding-agent/docspackages/coding-agent/docs/custom-provider.md:24:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/custom-provider.md:161:import type { OAuthCredentials, OAuthLoginCallbacks } from "@mariozechner/pi-ai";
packages/coding-agent/docs/custom-provider.md:273:} from "@mariozechner/pi-ai";
packages/coding-agent/docs/session.md:37:For TypeScript definitions in your project, inspect `node_modules/@mariozechner/pi-coding-agent/dist/` and `node_modules/@mariozechner/pi-ai/dist/`.
packages/coding-agent/docs/session.md:72:### Base Message Types (from pi-ai)
packages/coding-agent/docs/session.md:119:### Extended Message Types (from pi-coding-agent)
packages/coding-agent/docs/sdk.md:19:import { AuthStorage, createAgentSession, ModelRegistry, SessionManager } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:43:npm install @mariozechner/pi-coding-agent
packages/coding-agent/docs/sdk.md:57:import { createAgentSession } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:164:The `Agent` class (from `@mariozechner/pi-agent-core`) handles the core LLM interaction. Access it via `session.agent`.
packages/coding-agent/docs/sdk.md:281:import { getModel } from "@mariozechner/pi-ai";
packages/coding-agent/docs/sdk.md:282:import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:329:import { AuthStorage, ModelRegistry } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:365:import { createAgentSession, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:385:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:413:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:442:import { Type } from "@sinclair/typebox";
packages/coding-agent/docs/sdk.md:443:import { createAgentSession, type ToolDefinition } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:474:import { createAgentSession, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:496:import { createEventBus, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:516:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:542:import { createAgentSession, DefaultResourceLoader } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:566:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:593:import { createAgentSession, SessionManager } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:664:import { createAgentSession, SettingsManager, SessionManager } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:713:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:754:import { getModel } from "@mariozechner/pi-ai";
packages/coding-agent/docs/sdk.md:755:import { Type } from "@sinclair/typebox";
packages/coding-agent/docs/sdk.md:766:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:843:import { createAgentSession, InteractiveMode } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:864:import { createAgentSession, runPrintMode } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/sdk.md:881:import { createAgentSession, runRpcMode } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:58:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:59:import { Type } from "@sinclair/typebox";
packages/coding-agent/docs/extensions.md:140:| `@mariozechner/pi-coding-agent` | Extension types (`ExtensionAPI`, `ExtensionContext`, events) |
packages/coding-agent/docs/extensions.md:141:| `@sinclair/typebox` | Schema definitions for tool parameters |
packages/coding-agent/docs/extensions.md:142:| `@mariozechner/pi-ai` | AI utilities (`StringEnum` for Google-compatible enums) |
packages/coding-agent/docs/extensions.md:143:| `@mariozechner/pi-tui` | TUI components for custom rendering |
packages/coding-agent/docs/extensions.md:154:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:495:import { isBashToolResult } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:736:import { Type } from "@sinclair/typebox";
packages/coding-agent/docs/extensions.md:737:import { StringEnum } from "@mariozechner/pi-ai";
packages/coding-agent/docs/extensions.md:885:import type { AutocompleteItem } from "@mariozechner/pi-tui";
packages/coding-agent/docs/extensions.md:1092:import { Type } from "@sinclair/typebox";
packages/coding-agent/docs/extensions.md:1093:import { StringEnum } from "@mariozechner/pi-ai";
packages/coding-agent/docs/extensions.md:1094:import { Text } from "@mariozechner/pi-tui";
packages/coding-agent/docs/extensions.md:1133:**Important:** Use `StringEnum` from `@mariozechner/pi-ai` for string enums. `Type.Union`/`Type.Literal` doesn't work with Google's API.
packages/coding-agent/docs/extensions.md:1170:import { createReadTool, createBashTool, type ReadOperations } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:1215:} from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:1279:import { Text } from "@mariozechner/pi-tui";
packages/coding-agent/docs/extensions.md:1323:import { keyHint } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:1489:import { Text, Component } from "@mariozechner/pi-tui";
packages/coding-agent/docs/extensions.md:1547:import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/extensions.md:1548:import { matchesKey } from "@mariozechner/pi-tui";
packages/coding-agent/docs/extensions.md:1588:import { Text } from "@mariozechner/pi-tui";
packages/coding-agent/docs/extensions.md:1637:import { highlightCode, getLanguageFromPath } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/rpc.md:5:**Note for Node.js/TypeScript users**: If you're building a Node.js application, consider using `AgentSession` directly from `@mariozechner/pi-coding-agent` instead of spawning a subprocess. See [`src/core/agent-session.ts`](../src/core/agent-session.ts) for the API. For a subprocess-based TypeScript client, see [`src/modes/rpc/rpc-client.ts`](../src/modes/rpc/rpc-client.ts).
packages/coding-agent/docs/compaction.md:12:For TypeScript definitions in your project, inspect `node_modules/@mariozechner/pi-coding-agent/dist/`.
packages/coding-agent/docs/compaction.md:308:import { convertToLlm, serializeConversation } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:7:**Source:** [`@mariozechner/pi-tui`](https://github.com/badlogic/pi-mono/tree/main/packages/tui)
packages/coding-agent/docs/tui.md:36:import { CURSOR_MARKER, type Component, type Focusable } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:62:import { Container, type Focusable, Input } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:182:Import from `@mariozechner/pi-tui`:
packages/coding-agent/docs/tui.md:185:import { Text, Box, Container, Spacer, Markdown } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:267:import { matchesKey, Key } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:293:import { visibleWidth, truncateToWidth } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:314:} from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:428:import { getMarkdownTheme } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:429:import { Markdown } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:590:For letting users pick from a list of options. Use `SelectList` from `@mariozechner/pi-tui` with `DynamicBorder` for framing.
packages/coding-agent/docs/tui.md:593:import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:594:import { DynamicBorder } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:595:import { Container, type SelectItem, SelectList, Text } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:653:import { BorderedLoader } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:682:For toggling multiple settings. Use `SettingsList` from `@mariozechner/pi-tui` with `getSettingsListTheme()`.
packages/coding-agent/docs/tui.md:685:import { getSettingsListTheme } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:686:import { Container, type SettingItem, SettingsList, Text } from "@mariozechner/pi-tui";
packages/coding-agent/docs/tui.md:795:import { CustomEditor, type ExtensionAPI } from "@mariozechner/pi-coding-agent";
packages/coding-agent/docs/tui.md:796:import { matchesKey, truncateToWidth } from "@mariozechner/pi-tui";Updating dependencies doc with built-ins guidance
I'm adding a paragraph clarifying that core pi packages like pi-ai, pi-agent-core, pi-coding-agent, pi-tui, and @sinclair/typebox are bundled and available at runtime, so extensions should list them as peerDependencies with "*" to avoid duplicates, while all other packages go in dependencies. I'll also adjust the existing Dependencies section and consider including a concise example and explicit bullet list.
Revising Dependencies section text
I'm rewriting the Dependencies section to clearly state that core pi packages used by extensions are bundled and must be listed as peerDependencies with "*", excluding them from dependencies and bundledDependencies; other pi packages should also be peerDependencies for separate installation, while third-party dependencies go in dependencies installed automatically with the package. I'll keep the style clean with sentences and avoid em dashes as requested.
Summary:
Tests not run (documentation change).
+132 Other pi packages should also be peerDependencies with a "*" range so users install them
separately via settings or pi install, which keeps a single copy. Use bundledDependencies only if you
want to ship a pi package inside your tarball.
no, pi packages depending on other pi packages must bundle, otherwise we get into devil's kitchen. the modules are loaded separately from each other and can't collide
Confirming full file reread before editing
The file was previously read fully before the first edit, but since it changed after that, I'll reread the complete, updated file before applying the new doc adjustment.
Planning doc update to clarify pi package dependencies
I'll update the doc to say pi packages depending on other pi packages must list those as dependencies and in bundledDependencies to ensure bundling, replacing the prior peerDependency guidance for these cases, while keeping built-in packages as peerDependencies with "*". This clarifies the separate loading environment and bundling requirement.
Revising pi package bundling guidance
I'm updating the paragraph to clarify that other pi packages must be bundled by adding them to dependencies and bundledDependencies and referencing via node_modules paths, emphasizing isolated module roots prevent sharing. I'll avoid em dashes and structure as straightforward sentences.
Summary:
Tests not run (documentation change).
do we state the other pi packages shit twice now? read the ful lfile
Identifying redundant sections
The file has two sections covering bundling other pi packages, which appear redundant but not exact duplicates. Should I propose removing one and consolidating them?
Yes. It is covered in two places: the “Bundling Other Pi Packages” section under Package Structure and the Dependencies section. Do you want me to consolidate into one section and remove the other?
consolidate
Planning doc consolidation and hyphen cleanup
I'm preparing to remove the "Bundling Other Pi Packages" section and move its example into the Dependencies section, consolidating guidance while avoiding introducing spaced hyphens as sentence interrupters.
Detailing exact doc edits for consolidation
I'm preparing precise edits to remove the entire "Bundling Other Pi Packages" section and insert its JSON example plus bundling instructions into the Dependencies section, ensuring no spaced hyphens or em dashes appear and maintaining proper spacing to avoid double blank lines.
Summary:
Tests not run (documentation change).
commit and push
Committing and pushing changes
I'll check the git status, add the specific file, commit with a clear message, and push the changes.
>git status --shortM packages/coding-agent/docs/packages.md>git add packages/coding-agent/docs/packages.md(no output)>git commit -m "docs(coding-agent): clarify pi package dependency bundling"Running formatting, linting, and type checking...
> pi-monorepo@0.0.3 check
> biome check --write . && tsgo --noEmit && cd packages/web-ui && npm run check
Checked 440 files in 279ms. No fixes applied.
> @mariozechner/pi-web-ui@0.50.0 check
> biome check --write . && tsc --noEmit && cd example && biome check --write . && tsc --noEmit
Checked 73 files in 41ms. No fixes applied.
Checked 3 files in 8ms. No fixes applied.
✅ All pre-commit checks passed!
[main 484b605c] docs(coding-agent): clarify pi package dependency bundling
1 file changed, 9 insertions(+), 4 deletions(-)Pushing committed changes
>git pushTo https://github.com/badlogic/pi-mono.git
6159eb4b..484b605c main -> mainSummary:
Tests: npm run check (triggered by commit hook).
what about plain old dependencies?
Answering about plain dependencies
Third-party dependencies go in dependencies and install with npm install. For pi built-ins, peerDependencies are set to "*". Other pi packages require bundling. I can update the docs if needed.
Plain third party deps go in dependencies. Pi runs npm install on install, so they are installed automatically. The special cases are the built-in pi packages as peerDependencies with "*" and other pi packages bundled. If you want this called out more explicitly in the doc, say where.
in the same section you just consolidated. "normal dependencies that themselves don't register extensions, skills, prompt tempaltes, or themes go into the regular "dependencies""
Editing Dependencies section wording
Adding a clear, simple sentence to the first paragraph in the Dependencies section to specify that dependencies not registering extensions, skills, prompt templates, or themes belong in dependencies; avoiding em dashes and quotes per instructions.
Summary:
Tests not run (documentation change).
commit and push
>git status --shortM packages/coding-agent/docs/packages.md>git add packages/coding-agent/docs/packages.md(no output)>git commit -m "docs(coding-agent): clarify dependency categories"Running formatting, linting, and type checking...
> pi-monorepo@0.0.3 check
> biome check --write . && tsgo --noEmit && cd packages/web-ui && npm run check
Checked 440 files in 275ms. No fixes applied.
> @mariozechner/pi-web-ui@0.50.0 check
> biome check --write . && tsc --noEmit && cd example && biome check --write . && tsc --noEmit
Checked 73 files in 37ms. No fixes applied.
Checked 3 files in 8ms. No fixes applied.
✅ All pre-commit checks passed!
[main bec72c42] docs(coding-agent): clarify dependency categories
1 file changed, 1 insertion(+), 1 deletion(-)>git pushTo https://github.com/badlogic/pi-mono.git
484b605c..bec72c42 main -> mainSummary:
Tests: npm run check (commit hook).