Changelog

Release notes for phi, from the project's CHANGELOG.md.

All notable changes to phi are documented here. The format is based on Keep a Changelog and the project adheres to Semantic Versioning.

[0.26.0] — 2026-09-10

Added

  • /diff: full-screen git diff review (working tree / staged / HEAD), line notes in .phi/review.json, a sends notes to the agent. See Interactive mode.
  • Extensions: ToolResult.Expanded opens the TUI tool row by default (e.g. plan body). User toggle still wins after the first interaction.
  • CI / make lint-markdown: markdownlint on **/*.md.

Fixed

  • Compaction file-op details are a typed session.CompactionDetails (not any), so persist/reload and later compact rounds keep prior read/modified files.
  • /diff: cursor movement no longer leaves a blue trail on swept rows; help overlay no longer fills with selection background. Notes autosave; drop unused GitHub-shaped comment fields and the redundant w save key.

[0.25.1] — 2026-09-10

Fixed

  • MCP HTTP transport: SSE bodies that interleave server notifications (e.g. notifications/message log frames, no id) before the JSON-RPC response frame now resolve to the response frame instead of the first parseable frame, which previously made tools/call return an empty result when a server streams log frames before answering.
  • Preserve Unicode when copying TUI text to the Windows clipboard.

[0.25.0] — 2026-09-09

Added

  • Sub-agents: optional per-role model defaults in agents.models (explore / review / worker). Palette: settings → agents → models → role → model (session-only; (inherit parent) clears). Omitted roles inherit the parent model. See Sub-agents.

Changed

  • Sub-agents: child gates use BashDefault=Allow (hard deny list still applies), so explore/review/worker can run non-allowlisted shell (make, pipelines, tests) without Ask→Deny folding. Hard deny now also blocks piping into sh/bash.

Fixed

  • Agent: mid-loop context-window overflow (prompt is too long and similar provider errors) now force-compacts once and retries the stream instead of failing the turn cold. A second overflow still fails closed.
  • Config: agents.enabled omitted under an agents: block (e.g. only agents.models set) no longer decodes as false; default stays on.

[0.24.0] — 2026-09-08

Added

  • Extensions: tools can be marked Readable (side-effect-free) via the Go SDK Tool.Readable or the Rust SDK Tool::readable(); the host surfaces it as Definition.Readable, so a batch of all-readable calls — including extension tools — runs concurrently.

Changed

  • Agent: when every tool call in a turn targets a read-only tool (Definition.Readable — read/grep/ls/find), the calls now execute concurrently; results keep call order, and any write-capable call in the batch falls back to sequential execution.
  • Rust SDK (ext/rust): tool execute handlers can now be async (Tool::new_async) — the SDK drives them to completion on a single-threaded tokio runtime, so network / IO calls work without blocking tricks; sync Tool::new handlers are unchanged.
  • LLM provider errors now read as one compact line — e.g. anthropic API error (400): prompt is too long — using the provider’s own message instead of a raw JSON body, which can no longer flood the terminal or session history.
  • TUI: assistant blocks that end in error state render their body in red under an Error: label, so failures read like tool errors.

[0.23.0] — 2026-09-07

Added

  • Gemini endpoints (Google AI Studio / Vertex AI): streaming chat and compaction with tool calling, image input, system prompts, and model thinking surfaced as reasoning.
  • phi plugin list / phi plugin update [repo[@ref]] [--check] / phi plugin remove <repo> (alias rm): audit and update extensions without manual removal. Install records the GitHub source in ~/.phi/extensions/<repo>/.phi-install.json; update re-resolves that source and swaps the directory atomically (release archive preferred, git clone fallback, pinned tags stay pinned unless overridden). Extensions not installed via phi plugin install are left untouched.

Changed

  • Rust SDK (ext/rust): tool-schema and confirm-dialog JSON now serializes with serde/serde_json instead of hand-rolled writers (wire output unchanged; preserve_order keeps key order).

Fixed

  • Fix PowerShell installer parsing of checksum mismatch errors.
  • Extension footer status (e.g. plan-mode hints) is reset when extensions are reloaded or the model is switched, so stale text no longer outlives the extension subprocess.

[0.22.0] — 2026-09-04

Changed

  • TUI: composer bottom-left status slot now toggles between activity/spinner (busy) and token stats (idle); busy state animates a highlight through the activity text (no block-glyph scan bar); the bottom footer row is reserved for extension status, live jobs, and update hints.
  • TUI: chat-input border chrome speaks one ambient voice (path, idle tokens, activity); model Identity remains the sole frame accent; context % escalates to Warning/Destructive only under pressure.
  • TUI color dialect: Identity ≠ Success; Title for panel/md structure; ToolName is the sole cool action accent (tools, keybinds, paths, code); Warning/Destructive reserved for risk; default theme is Dark (Terminal stays a compatibility option).

[0.21.1] — 2026-09-03

Added

  • Slash commands can declare NeedsArgs (Go) / needs_args (Rust). Picker accept or bare submit of /name leaves /name plus a trailing space in the composer so the user can type arguments instead of auto-running and toasting usage. Built-in /resume uses this.

Changed

  • Go author SDK nested module now publishes under github.com/pulseaiclub/phi/ext/go (imports …/ext/go/phi, …/ext/go/pxb; tags ext/go/vX.Y.Z), matching its repo location ext/go/ so proxies can resolve it.

Fixed

  • Publish Rust crate workflow: write exists to $GITHUB_OUTPUT so cargo publish actually runs when the version is new.

[0.21.0] — 2026-09-03

Added

  • Extension tools can set DetailFromArgs (Go) / detail_from_args (Rust) so the TUI shows a one-line summary instead of raw JSON args before execution.
  • phi plugin install prefers a GitHub Release archive for the current OS/arch ({repo}_{version}_{goos}_{goarch}.tar.gz, same layout as phi update), with optional checksum verification; falls back to shallow git clone when no matching asset exists.

[0.20.0] — 2026-09-02

Added

  • Extension tools can set TimeoutSec (Go SDK) / timeout_sec (Rust SDK) so the host waits longer than the default 30s RPC budget for slow tools (e.g. HTTP fetch). Clamped to 1–3600s.
  • Rust SDK: typed phi::Schema builder for tool parameters (replaces raw Vec<u8>), staying zero-dep instead of Codex-style schemars.

Changed

  • TUI chrome consistency: shared glyph/hint dialect (internal/components/chrome), unified ask/continue/confirm option rows, Theme.Identity for model/user/bash chrome (separate from Success status), and aligned transcript expand indent / status suffixes. Permission/continue/ confirm overlays navigate with arrows only (no Alt+N accelerators). Sessions list picker uses a wider panel (~90% / up to 112 cols) so previews truncate less.

Removed

  • Palette command clipboard copy last message (Ctrl+Shift+C); the key chord still copies selection / last message via the transcript handler.

[0.19.2] — 2026-09-02

Added

  • Rust author SDK: zero-dependency ext/rust crate (phi-ext) — PXB wire protocol (pxb) + Extension API (phi), byte-compatible with the Go SDK via golden fixtures, plus fake-host end-to-end tests. See Extensions.

[0.19.1] — 2026-09-01

Added

  • Publishable Go author SDK: nested module github.com/pulseaiclub/phi/ext (go get …@vX.Y.Z via ext/vX.Y.Z tags). See Extensions.

Fixed

  • Extension discovery follows symlinked directories (e.g. .phi/extensions/foo → examples/foo), so linked installs are no longer skipped.

[0.19.0] — 2026-09-01

Added

  • PXB extensions: native binary extensions speaking a length-prefixed binary protocol (ext/pxb) over stdin/stdout. Author SDK ext/phi. Layout: ~/.phi/extensions/<name>/phi.yaml + exec. See Extensions. Palette: extensions → list / reload. Disable with PHI_EXTENSIONS=off.
  • phi plugin install <github-repo[@tag]>: shallow-clone a GitHub repo into ~/.phi/extensions/<repo>/ (requires phi.yaml + compiled binary).
  • Extension full chain: user_input, turn_stopping, session_compact intercepts/events; SubscribeEvent with payload; SendUserMessage host request.
  • Extension Confirm dialog (blocking RPC).
  • /sessions opens an opaque filterable session picker (Enter resumes); no longer prints into the transcript.

Changed

  • Breaking: shell plugin.json hooks (internal/hooks, PHI_HOOKS, .phi/hooks) are removed. Rewrite policy as extensions (migration table in Extensions).
  • Breaking: yaegi-interpreted .go extensions are no longer loaded. Migrate to PXB binaries + phi.yaml.
  • TUI: agent_spawn / agent_wait tool rows show role in the detail line (explore · …).

Removed

  • Extension ShowPane / UpdatePane / ClosePane / OnPaneAction. Prefer Ctrl+K-style overlays for list UIs.
  • Shell hook plugins (plugin.json + type: "command"), doc/hooks.md, and related TUI hooks → commands.
  • Yaegi extension loader (github.com/pulseaiclub/yaegi dependency).

Fixed

  • /resume closes the previous extension runner and rebinds host UI (was leaking subprocesses and dropping Notify/Confirm).
  • Controller Close and headless phi run shut down extension subprocesses; TUI defers ctrl.Close() on exit.
  • Extension Notify / status frames now reach the TUI (Proc.onNotify wired in Runner.Bind).
  • Slash-command Submit from PXB CommandResponse is delivered to the composer.
  • Extension handshake registration respects the handshake timeout (no longer only checked between blocking reads).
  • session_before_switch toast without cancel is published (previously only on deny).
  • SDK command handlers receive a usable ctx.UI (maps to Notify / SetStatus).
  • OnToolResult.Stop now ends the agent loop (was discarded in the executor).
  • Duplicate turn_end from the TUI controller removed (engine owns turn indices).
  • Session ID / previous / target fields ride on lifecycle EventNotify; host pushes SessionMeta after /new / /resume.

[0.18.1] — 2026-08-28

Changed

  • Breaking: plugin.json hooks use an event-map shape (PreToolUse, PostToolUse, … + type: "command" shell commands). Legacy flat pre_tool / run manifests are no longer accepted. phi extensions: SessionShutdown (leaving the active session; SessionEnd is a deprecated alias), SessionBeforeSwitch, PostTurn, and Command slash hooks. See Hooks.
  • Hooks: drop unimplemented plugin.json fields (if, once, statusMessage, asyncRewake) until needed.

Fixed

  • /resume and /clear now replay tool executions (with their styled rows) instead of dropping them.

[0.18.0] — 2026-08-27

Added

  • Composer shortcut help: type ? at the start of the input (like / commands); Esc closes the picker.
  • Ctrl+A / Ctrl+E move the composer cursor to the start/end of the current line.
  • Ctrl+U clears the composer input, pending images, and pending skills.
  • Per-model image_enabled config key; the composer blocks clipboard and @ image attach and shows a warning when the active model does not support images.
  • make check runs deadcode -test against a baseline so new unreachable functions fail CI without blocking on known legacy dead code.

Changed

  • Splash hint now shows ? for shortcut help instead of the removed ! shell-command shortcut.

Removed

  • Dead code: unused layout widgets, StatusBlock, input package, orphan exported helpers, and unused clipboard read-text path.

Fixed

  • @ file picker: cancel in-flight fd searches on each keystroke / close, surface timeouts as actionable hints, and note when the match list is truncated.

[0.17.0] — 2026-08-25

Added

  • phi run --yolo: skip all permission checks for one headless run (benchmarks / CI).
  • phi run --tools: limit a headless run to selected built-in tools.
  • Hooks: session lifecycle events now include usage — token counts of the latest completed assistant turn.
  • Hooks: post_turn event fires after each completed assistant stream with per-round usage (for audit metrics such as cache hit ratio).
  • util/clipboard reads and writes the system clipboard (text; images via wl-paste/xclip, osascript/pngpaste, or PowerShell).
  • Composer image attachments: Ctrl+V clipboard, @ image files, pending queue, and LLM Images on submit.
  • util/image.Load reads an image file (raw bytes + content-sniffed MIME type; png/jpeg/gif/webp, up to 10 MiB).

Changed

  • System prompt and agent_spawn guidance now state the sub-agent concurrency cap (default 4; spawn beyond it fails, no queue).

Fixed

  • Tool errors no longer duplicate the error text in the TUI (Error and Output shown the same message twice).

[0.16.0] — 2026-08-22

Added

  • Hooks: command UI intents — status (footer), list (palette page).
  • Hooks: session lifecycle events session_start, session_shutdown, session_before_switch.

[0.15.0] — 2026-08-20

Removed

  • agent_list status filter parameter (always returns the full list; each row still includes status).

[0.14.0] — 2026-08-20

Added

  • Hook event command: plugin.json entries register TUI slash commands (/name runs run). stdout may submit a user message or toast.

Changed

  • write creates or overwrites files (no longer create-only). Use edit for surgical changes.
  • File tools resolve relative paths against the session cwd and print cwd-relative results (find/ls/grep/read/write/edit). Absolute paths are used internally (including rg/fd) and returned only when the file is outside cwd.
  • find (formerly glob) uses fd from ~/.phi/bin (same as rg): respects .gitignore, early-stops at limit, optional limit arg.
  • Renamed directory listing tool list → ls.

Removed

  • Built-in fetch tool (and permissions.fetch config). Use MCP if you still need URL fetching.
  • agent_log tool (parent agents only get agent_wait summaries; job logs remain on disk under ~/.phi/jobs/).

Fixed

  • phi update on Windows: stage the download next to the installed binary (same volume) and fall back to copy when rename still cannot cross drives.
  • Assistant fenced code blocks drop the box/----- chrome; a muted language caption sits above the highlighted code so mouse selection stays copy-clean.

[0.13.0] — 2026-08-18

Added

  • TUI hot-reloads the git branch in the path label: switching branches outside the app (another terminal, an editor) refreshes the label automatically.

Changed

  • TUI activity: tool rows keep a 1-cell braille spinner; the footer uses a Knight-Rider scan bar so the two don’t share the same glyph.
  • Tool routing: bash is no longer described as an inspection tool; grep/glob no longer nudge agent_spawn; edit.hash is the 4 hex chars after # in @file path#TAG (leading # / full header copy-paste is accepted).
  • Breaking: hooks are declared in plugin.json (one file, many hooks) instead of per-directory hook.json. Load ~/.phi/hooks/plugin.json and ~/.phi/hooks/<plugin>/plugin.json (same under the project .phi/hooks/).

Removed

  • Per-hook hook.json directories. Use plugin.json instead.

[0.12.0] — 2026-08-17

Added

  • Changelog gate: PRs must update CHANGELOG.md (with skip labels / [chore]), released sections are protected, and GitHub Release notes are taken from this file.

Changed

  • Hashline edit now requires a whole-file @file path#TAG (hash field) from read/grep; after a successful edit, re-read before another edit on that path. Per-line hashes are 3 letters (a-z) and no longer use digits.

Removed

  • Remove the redundant agent_task tool; compose agent_spawn + agent_wait instead.

[0.11.0] — 2026-08-16

Baseline release when this changelog became the source of truth for user-visible changes. Earlier releases are available from GitHub tags only.