- Replaced vendored highlight.js with CDN-hosted version to reduce bundle size by ~1200 lines.
- Added CSS, JS, and HTML minification functions to reduce exported file size.
- Implemented caching for minified template and JS assets to avoid redundant processing.
- Updated share preview URL to use gistpreview.github.io for session sharing.
- Add bash interceptor setting (disabled by default) to block shell commands
that have dedicated tools (grep, cat, find, etc.)
- Refactor settings UI to declarative definitions in settings-defs.ts
- Shell detection now respects $SHELL env var before falling back to bash/sh
- Tool binary detection uses Bun.which() instead of spawning processes
- Fix CLI help text to accurately list all default tools
- Introduced declarative settings definitions to eliminate duplicated setting logic across UI and handlers.
- Extracted settings configuration into settings-defs.ts for single-source-of-truth maintenance.
- Simplified SettingsSelectorComponent to generate UI from definitions rather than hardcoded items.
- Added bash interceptor toggle to allow users to control shell command interception behavior.
- Updated CLI help text to reflect all available tools with accurate default states.
- Consolidated settings change handling into unified handler dispatching by setting ID.
- Replaced hardcoded shell path detection with user's $SHELL preference for better environment compatibility.
- Simplified commandExists function to use Bun.which instead of spawning processes for faster tool detection.
- Updated getToolPath to return full binary path from Bun.which for more reliable tool resolution.
- Updated CI workflows to include explicit coding-agent build step for proper binary compilation.
- Changed TypeBox validation from ts-expect-error to explicit any cast to resolve CJS/ESM type mismatch.
- Replaced build-binaries workflow with unified publish workflow to consolidate release automation.
- Added matrix-based parallel binary builds across platforms for faster release cycles.
- Simplified CI workflow by removing concurrency settings and adding CLI smoke tests.
- Added npm publish step with provenance support for secure package distribution.
- Introduced skip_npm input to allow binary-only releases when needed.
- Replaced process group kill with descendant-aware tree traversal to handle non-leader processes.
- Added pgrep-based child discovery with /proc fallback for broader Linux compatibility.
- Introduced optional grace period parameter to allow SIGTERM before SIGKILL for graceful shutdown.
- Simplified focus return value in interactive mode for consistency.
- Added TabBar component to enable horizontal tab navigation with keyboard support.
- Refactored settings selector to use tabbed interface for better organization of Config, Exa, and Plugins sections.
- Added Shift+Space handling via Kitty protocol to fix space insertion in editor.
- Removed redundant LSP explanation text from system prompt for conciseness.
- Added specialized Exa web search tools for deep search, code context, URL crawling, LinkedIn, and company research.
- Implemented settings UI for granular control over Exa tool availability with per-feature toggles.
- Changed Exa addon defaults to disabled to prevent unexpected API usage for LinkedIn, company, researcher, and websets features.
- Added settings manager methods to persist individual Exa feature preferences.
- Added @typescript/native-preview dependency to enable faster type checking with tsgo.
- Updated check scripts across packages to use tsgo instead of tsc for improved performance.
- Extended root check script to include coding-agent package type checking.
- Removed ast and replace tools to simplify toolset and reduce maintenance overhead.
- Added LSP call hierarchy support (incoming_calls, outgoing_calls) for better code navigation.
- Added Exa as web search provider alongside Anthropic and Perplexity for broader search options.
- Enhanced tool descriptions with detailed usage guidelines to improve agent tool selection.
- Simplified task tool by removing single-mode execution and agentScope parameter.
- Added GitHub tree rendering and improved web-fetch documentation for better URL handling.
- Added fuzzy matching with Levenshtein distance to handle whitespace and indentation differences in edit operations.
- Implemented configurable similarity threshold (default 95%) to balance precision with flexibility.
- Added detailed error messages showing closest match location and similarity percentage to aid debugging.
- Updated edit tool schema to expose fuzzy parameter for user control over matching behavior.
- Renamed npm package scope from @mariozechner to @oh-my-pi across all packages for consistent branding.
- Removed packages/pods directory and all related pod management functionality.
- Updated import paths and module declarations throughout codebase to reflect new package names.
- Reformatted code with consistent trailing comma removal and ternary operator alignment.
- Added MCP (Model Context Protocol) support with stdio and HTTP transports for external tool integration.
- Implemented plugin system with install, enable, configure, and doctor commands for extensibility.
- Added 22 Exa MCP tools for web search, LinkedIn, company research, and websets operations.
- Introduced LSP tool with rust-analyzer support for code intelligence (diagnostics, hover, references, code actions).
- Added task tool for delegating work to specialized subagents with parallel execution support.
- Implemented web_search and web_fetch tools with Anthropic and Perplexity provider support.
- Added git context loading to system prompt to provide AI with repository state awareness.
- Implemented automatic detection of main/master branch to support varied repository conventions.
- Included current branch, git status, and recent commits snapshot for contextual understanding.
- Added emergency terminal restore function to reset terminal state on crashes without requiring instance access.
- Implemented crash handlers for SIGTERM, SIGHUP, uncaught exceptions, and unhandled rejections to ensure clean terminal exit.
- Added active terminal tracking to enable blind restore when no instance is available.
- Implemented a new welcome screen component for startup.
- Introduced a powerline-style footer with integrated git status, model info, and token usage.
- Consolidated extension loading messages into a new `/status` command.
- Added `?` hotkey to display shortcuts when the editor is empty.
Merged 53 commits from pi/main including:
- Export HTML rewrite with tree sidebar and /share command
- Hooks API enhancements (custom status, editor, session management)
- Edit diff preview before tool execution
- TUI fixes (Unicode format chars, OSC 8 hyperlinks, emoji optimization)
- Gemini CLI rate limit retry with server-provided delay
- Various bug fixes and documentation updates
Resolved conflicts by preserving Bun migration (spawn→Bun.spawn,
fs→Bun.file) while accepting upstream's new features and APIs.
- Migrated from Node.js to Bun runtime to leverage native TypeScript execution and faster startup times.
- Replaced npm with bun package manager and updated lockfile format.
- Converted Node.js APIs (child_process, fs, readline) to Bun equivalents across all packages.
- Updated shebang lines from node/tsx to bun for CLI entry points.
- Removed TypeScript build step by using source files directly as package entry points.
- Updated CI workflows to use Bun instead of Node.js for installation and testing.
BorderedLoader receives theme as a parameter but was creating
DynamicBorder() without passing it, causing DynamicBorder to
fall back to the global theme variable which is undefined when
loaded via jiti (separate module cache).
Added doc comment to DynamicBorder explaining the jiti issue.
Move line count from header to footer to avoid changing the first line
during streaming, which was triggering full screen re-renders in the
TUI's differential rendering logic.
Transfers context to a new focused session instead of compacting.
User provides a goal, hook generates a prompt with relevant context,
creates a new session with parent tracking, and loads the prompt
as a draft in the editor for review.
Inspired by Amp's handoff feature.
CustomToolContext now has:
- isIdle() - check if agent is streaming
- hasQueuedMessages() - check if user has queued messages
- abort() - abort current operation (fire-and-forget)
Changed abort() signature from Promise<void> to void in both
HookContext and CustomToolContext. The abort is fire-and-forget:
it calls session.abort() without awaiting, so the abort signal
is set immediately while waitForIdle() runs in the background.
Fixes#388
HookContext (all events):
- isIdle() - read-only state check
- hasQueuedMessages() - read-only state check
- abort() - fire-and-forget, does not wait
HookCommandContext (slash commands only):
- waitForIdle() - waits for agent to finish
- newSession(options?) - create new session
- branch(entryId) - branch from entry
- navigateTree(targetId, options?) - navigate session tree
Session control methods moved from HookAPI (pi.*) to HookCommandContext (ctx.*)
because they can deadlock when called from event handlers that run inside
the agent loop (tool_call, tool_result, context events).
HookAPI additions:
- pi.newSession(options?) - create new session with optional setup callback
- pi.branch(entryId) - branch from a specific entry
- pi.navigateTree(targetId, options?) - navigate the session tree
HookContext additions:
- ctx.isIdle() - check if agent is streaming
- ctx.waitForIdle() - wait for agent to finish
- ctx.abort() - abort current operation
- ctx.hasQueuedMessages() - check for queued user messages
These enable hooks to programmatically manage sessions (handoff, templates)
and check agent state before showing interactive UI.
Fixes#388
- Remove session_before_new and session_new hook events
- Add reason: 'new' | 'resume' to session_before_switch and session_switch events
- Remove 'new' reason from custom tool onSession (use 'switch' for both /new and /resume)
- Rename reset() to newSession(options?) in AgentSession
- Add NewSessionOptions with optional parentSession for lineage tracking
- Rename branchedFrom to parentSession in SessionHeader
- Rename RPC reset command to new_session with optional parentSession
- Update example hooks to use new event structure
- Update documentation and changelog
Based on discussion in #293
- Add optional 'export' section to theme JSON with pageBg, cardBg, infoBg
- If not specified, colors are auto-derived from userMessageBg
- Add export colors to dark.json and light.json
- Update theme-schema.json and TypeBox schema
- Add documentation to docs/theme.md
- Add margin-top back to tool-output for spacing between header and content