217 Commits

  • feat(coding-agent): add read-only exploration tools (grep, find, ls) and --tools flag
    Add grep, find, and ls tools for safe code exploration without modification risk.
    These tools are available via the new --tools CLI flag.
    
    - grep: Uses ripgrep (auto-downloaded) for fast regex searching. Respects .gitignore,
      supports glob filtering, context lines, and hidden files.
    - find: Uses fd (auto-downloaded) for fast file finding. Respects .gitignore, supports
      glob patterns, and hidden files.
    - ls: Lists directory contents with proper sorting and directory indicators.
    - --tools flag: Specify available tools (e.g., --tools read,grep,find,ls for read-only mode)
    - Dynamic system prompt adapts to selected tools with relevant guidelines
    
    Closes #74
  • fix: file @ autocomplete performance using fd
    - Replace slow synchronous directory walking with fd for fuzzy file search
    - Auto-download fd to ~/.pi/agent/tools/ if not found in PATH
    - Performance improved from ~900ms to ~10ms per keystroke on large repos
    - Remove minimatch dependency from tui package
    - Graceful degradation if fd unavailable (empty results)
    
    Fixes #69
  • coding-agent: remove identity override from system prompt (#73)
    Models now use their native identity instead of being told they are Pi.
  • coding-agent: add pi-session- prefix to exported HTML files (#72)
    Makes exported session files easier to filter with .gitignore
  • feat: show git branch in footer
    - Footer now displays active git branch after directory path (e.g., ~/project (main))
    - Branch detected by reading .git/HEAD directly (fast, synchronous)
    - Cache refreshed after each assistant message to detect branch changes
    - Handles normal branches, detached HEAD, and non-git repos
    
    Closes #55
  • Add CLI file arguments support via @file prefix
    Implements ability to include files directly in the initial message using @ prefix.
    
    Features:
    - All @file arguments are coalesced into the first user message
    - Text files wrapped in <file name="path">content</file> tags
    - Images (.jpg, .jpeg, .png, .gif, .webp) attached as base64-encoded attachments
    - Supports ~ expansion, relative and absolute paths
    - Empty files are skipped silently
    - Non-existent files cause immediate error with clear message
    - Works in interactive, --print, and --mode text/json modes
    - Not supported in --mode rpc (errors with clear message)
    
    Examples:
      pi @prompt.md @image.png "Do this"
      pi --print @code.ts "Review this code"
      pi @requirements.md @design.png "Implement this"
    
    Closes #54
  • Improved HTML export with timestamps, better styling, and comprehensive stats
    - Added timestamps to each user and assistant message (HH:MM:SS format)
    - Fixed text clipping issues with comprehensive word-wrapping CSS
    - Improved font selection: ui-monospace, Cascadia Code, Source Code Pro
    - Reduced font sizes for more compact display (12px base, down from 14px)
    - Added model switch indicators in conversation timeline with subtle background
    - Created dedicated Tokens & Cost section showing:
      - Cumulative input/output/cache read/write tokens
      - Cost breakdown by token type with 4 decimal precision
      - Total cost in bold
      - Context usage with token count, percentage, and model identification
    - Now displays all unique models used during session (not just initial model)
    - Made Messages section more compact (reduced gaps, removed redundant fields)
    
    Closes #51
    Closes #52
  • Fix editor cursor navigation for wrapped lines, add word navigation
    - Up/down arrows now navigate visual (wrapped) lines instead of logical lines
    - Fixed double cursor display at wrap boundaries
    - Added word by word navigation via Option+Left/Right or Ctrl+Left/Right
    - Updated README keyboard shortcuts documentation
    
    Closes #61
  • Fix edit diff line number alignment and whitespace preservation
    - Fix line numbers showing incorrect values for edits far from file start
      (e.g., 1,2,3 instead of 336,337,338). Skip count was added after displaying
      lines instead of before.
    
    - Rewrite splitIntoTokensWithAnsi in pi-tui to preserve whitespace as separate
      tokens instead of discarding it. Wrapped lines now maintain proper alignment
      and code indentation.
    
    - Update mom README: rename title, remove em-dashes for cleaner prose
  • feat: fuzzy file search with @ prefix
    - Type @ to fuzzy-search files/folders across project
    - Respects .gitignore and skips hidden files
    - Pure Node.js implementation using readdir with withFileTypes
    - No external dependencies (fd/find) required
    - Also optimized Tab completion to use withFileTypes instead of statSync
    
    Based on PR #60 by @fightbulc, reimplemented for performance.
  • Merge pull request #59 from kiliman/kiliman/rpc-attachments
    fix: pass attachments to agent prompt from RPC interface
  • fix: emoji text wrapping crash in pi-tui
    Fixed crash when rendering text containing emojis followed by long content.
    The breakLongWord function was iterating over UTF-16 code units instead of
    grapheme clusters, causing emojis (surrogate pairs) to be miscounted during
    line wrapping. Now uses Intl.Segmenter to properly handle multi-codepoint
    characters.
  • docs: clarify that AGENTS.md files are loaded at every startup
    Removed confusing parenthetical that suggested context files aren't loaded when continuing/resuming sessions. They are always freshly loaded from disk at startup - the parenthetical only applied to console logging behavior.
  • fix: pass attachments to agent prompt from RPC interface
    This PR updates the call to `agent.prompt` with the `attachments` prop provided in the JSON input.
  • fix(coding-agent): suppress informational output in non-interactive modes
    In -p, --mode json, and --mode rpc modes, don't print informational
    messages like 'Loaded project context from:' or model restore messages.
    Only the actual output should be printed.
  • feat(coding-agent): allow starting CLI with prompt in interactive mode (#46)
    BREAKING CHANGE: Passing a prompt on the command line now starts interactive
    mode with the prompt pre-submitted, instead of exiting after completion.
    Use --print or -p to get the previous non-interactive behavior.
    
    - Add --print / -p flag for non-interactive mode
    - Update runInteractiveMode to accept initial messages
    - Update README documentation
    - Fix Model Selection Priority docs to include --models scope
  • Fix slash command autocomplete Enter behavior
    When pressing Enter on a highlighted slash command suggestion (e.g., typing
    `/mod` with `/model` highlighted), the completion is now applied before
    submitting. Previously, the partial text was submitted instead of the
    selected command.
    
    Fixes #49
  • feat: enhance model cycling with thinking levels and --thinking flag
    PR #47 enhancements:
    - Add thinking level syntax to --models (e.g., --models sonnet:high,haiku:low)
    - First model in scope used as initial model when starting new session
    - Auto-apply thinking level when cycling models with Ctrl+P
    - Save both model and thinking to session AND settings for persistence
    - Simplify UX by removing autoThinkingDisabled flag
    - Fix model matching to prioritize exact matches over partial
    - Support provider/modelId format (e.g., openrouter/openai/gpt-5.1-codex)
    
    Issue #45:
    - Add --thinking CLI flag to set thinking level directly
    - Takes highest priority over all other thinking level sources
    
    Closes #45
  • Fix path completion hanging and autocomplete arrow key behavior
    - Fixed catastrophic regex backtracking in extractPathPrefix that caused
      terminal to hang when text contained many / characters (e.g., URLs).
      Replaced complex regex with simple lastIndexOf approach. (#18)
    - Fixed arrow keys moving both autocomplete selection and editor cursor
      by adding missing return statement after handling arrow keys in
      autocomplete mode.
    
    Closes #18
  • feat: enhance model cycling with thinking level support
    - Add exact match support with '/' prefix (/gpt-5.1-codex or /provider/model)
    - Prefer exact ID matches over partial matches in fuzzy search
    - Parse thinking levels from --models flag (pattern:level format)
    - Use first scoped model as initial model with its thinking level
    - Auto-apply thinking when cycling with Ctrl+P
    - Track manual thinking changes to disable auto-switching
    - Clear model scope when using /model command
    - Support mixed configs: --models sonnet:high,haiku,opus:low
    - Silently ignore thinking for models that don't support it
    - Only allow Ctrl+P cycling when --models is explicitly provided
    - Update help text with examples
    - Improve code organization by resolving scope early
  • WIP: Add theming system with /theme command
    - Consolidated theme system into single src/theme/ directory
    - Created Theme class with fg(), bg(), bold(), italic(), underline()
    - Added dark and light built-in themes with 36 color tokens
    - Support for custom themes in ~/.pi/agent/themes/*.json
    - JSON schema for theme validation
    - Theme selector UI with /theme command
    - Save theme preference to settings
    - Uses chalk for text formatting to preserve colors
    
    TODO:
    - Replace hardcoded colors throughout TUI components
    - Apply markdown theming to Markdown components
    - Add theme support to all TUI elements
  • Release v0.7.29
    - Show offset/limit in read tool display (e.g., read src/main.ts:100-200)
    - Fix PI_CODING_AGENT_DIR env var name in help and code
    - Add all API key env vars to help text
  • Release v0.7.28
    - Add message queuing with configurable modes (one-at-a-time/all) (#15)
    - Add /queue command to select queue mode
    - Add TruncatedText component for proper viewport-aware text truncation
    - Queue mode setting persists in ~/.pi/agent/settings.json
    - Visual feedback for queued messages with proper ANSI handling
    - Press Escape to abort and restore queued messages to editor
  • Release v0.7.27
    - Fix slash command submission requiring two Enter presses (#30)
    - Fix slash command autocomplete not re-triggering after typos (#29)
  • Add custom headers support for models.json
    Fixes #39
    
    - Added headers field to Model type (provider and model level)
    - Model headers override provider headers when merged
    - Supported in all APIs:
      - Anthropic: defaultHeaders
      - OpenAI (completions/responses): defaultHeaders
      - Google: httpOptions.headers
    - Enables bypassing Cloudflare bot detection for proxied endpoints
    - Updated documentation with examples
    
    Also fixed:
    - Mistral/Chutes syntax error (iif -> if)
    - process.env.ANTHROPIC_API_KEY bug (use delete instead of = undefined)