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,asends notes to the agent. See Interactive mode.- Extensions:
ToolResult.Expandedopens 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(notany), 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 redundantwsave key.
[0.25.1] — 2026-09-10
Fixed
- MCP HTTP transport: SSE bodies that interleave server notifications
(e.g.
notifications/messagelog frames, noid) before the JSON-RPC response frame now resolve to the response frame instead of the first parseable frame, which previously madetools/callreturn 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 intosh/bash.
Fixed
- Agent: mid-loop context-window overflow (
prompt is too longand 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.enabledomitted under anagents:block (e.g. onlyagents.modelsset) 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 SDKTool.Readableor the Rust SDKTool::readable(); the host surfaces it asDefinition.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): toolexecutehandlers 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; syncTool::newhandlers 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>(aliasrm): audit and update extensions without manual removal. Install records the GitHub source in~/.phi/extensions/<repo>/.phi-install.json;updatere-resolves that source and swaps the directory atomically (release archive preferred, git clone fallback, pinned tags stay pinned unless overridden). Extensions not installed viaphi plugin installare left untouched.
Changed
- Rust SDK (
ext/rust): tool-schema and confirm-dialog JSON now serializes withserde/serde_jsoninstead of hand-rolled writers (wire output unchanged;preserve_orderkeeps 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/nameleaves/nameplus a trailing space in the composer so the user can type arguments instead of auto-running and toasting usage. Built-in/resumeuses this.
Changed
- Go author SDK nested module now publishes under
github.com/pulseaiclub/phi/ext/go(imports…/ext/go/phi,…/ext/go/pxb; tagsext/go/vX.Y.Z), matching its repo locationext/go/so proxies can resolve it.
Fixed
- Publish Rust crate workflow: write
existsto$GITHUB_OUTPUTsocargo publishactually 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 installprefers a GitHub Release archive for the current OS/arch ({repo}_{version}_{goos}_{goarch}.tar.gz, same layout asphi 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::Schemabuilder for tool parameters (replaces rawVec<u8>), staying zero-dep instead of Codex-styleschemars.
Changed
- TUI chrome consistency: shared glyph/hint dialect
(
internal/components/chrome), unified ask/continue/confirm option rows,Theme.Identityfor 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/rustcrate (phi-ext) — PXB wire protocol (pxb) +ExtensionAPI (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.Zviaext/vX.Y.Ztags). 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 SDKext/phi. Layout:~/.phi/extensions/<name>/phi.yaml+exec. See Extensions. Palette: extensions → list / reload. Disable withPHI_EXTENSIONS=off. phi plugin install <github-repo[@tag]>: shallow-clone a GitHub repo into~/.phi/extensions/<repo>/(requiresphi.yaml+ compiled binary).- Extension full chain:
user_input,turn_stopping,session_compactintercepts/events;SubscribeEventwith payload;SendUserMessagehost request. - Extension Confirm dialog (blocking RPC).
/sessionsopens an opaque filterable session picker (Enter resumes); no longer prints into the transcript.
Changed
- Breaking: shell
plugin.jsonhooks (internal/hooks,PHI_HOOKS,.phi/hooks) are removed. Rewrite policy as extensions (migration table in Extensions). - Breaking: yaegi-interpreted
.goextensions are no longer loaded. Migrate to PXB binaries +phi.yaml. - TUI:
agent_spawn/agent_waittool 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/yaegidependency).
Fixed
/resumecloses the previous extension runner and rebinds host UI (was leaking subprocesses and dropping Notify/Confirm).- Controller
Closeand headlessphi runshut down extension subprocesses; TUI defersctrl.Close()on exit. - Extension
Notify/ status frames now reach the TUI (Proc.onNotifywired inRunner.Bind). - Slash-command
Submitfrom PXBCommandResponseis delivered to the composer. - Extension handshake registration respects the handshake timeout (no longer only checked between blocking reads).
session_before_switchtoast without cancel is published (previously only on deny).- SDK command handlers receive a usable
ctx.UI(maps toNotify/SetStatus). OnToolResult.Stopnow ends the agent loop (was discarded in the executor).- Duplicate
turn_endfrom the TUI controller removed (engine owns turn indices). - Session ID / previous / target fields ride on lifecycle
EventNotify; host pushesSessionMetaafter/new//resume.
[0.18.1] — 2026-08-28
Changed
- Breaking:
plugin.jsonhooks use an event-map shape (PreToolUse,PostToolUse, … +type: "command"shell commands). Legacy flatpre_tool/runmanifests are no longer accepted. phi extensions:SessionShutdown(leaving the active session;SessionEndis a deprecated alias),SessionBeforeSwitch,PostTurn, andCommandslash hooks. See Hooks. - Hooks: drop unimplemented
plugin.jsonfields (if,once,statusMessage,asyncRewake) until needed.
Fixed
/resumeand/clearnow 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+Emove the composer cursor to the start/end of the current line.Ctrl+Uclears the composer input, pending images, and pending skills.- Per-model
image_enabledconfig key; the composer blocks clipboard and@image attach and shows a warning when the active model does not support images. make checkrunsdeadcode -testagainst 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,inputpackage, orphan exported helpers, and unused clipboard read-text path.
Fixed
@file picker: cancel in-flightfdsearches 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_turnevent fires after each completed assistant stream with per-roundusage(for audit metrics such as cache hit ratio). util/clipboardreads 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 LLMImageson submit. util/image.Loadreads an image file (raw bytes + content-sniffed MIME type; png/jpeg/gif/webp, up to 10 MiB).
Changed
- System prompt and
agent_spawnguidance 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:
commandUI 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_liststatusfilter parameter (always returns the full list; each row still includesstatus).
[0.14.0] — 2026-08-20
Added
- Hook event
command:plugin.jsonentries register TUI slash commands (/namerunsrun). stdout maysubmita user message ortoast.
Changed
writecreates or overwrites files (no longer create-only). Useeditfor 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(formerlyglob) usesfdfrom~/.phi/bin(same asrg): respects.gitignore, early-stops at limit, optionallimitarg.- Renamed directory listing tool
list→ls.
Removed
- Built-in
fetchtool (andpermissions.fetchconfig). Use MCP if you still need URL fetching. agent_logtool (parent agents only getagent_waitsummaries; job logs remain on disk under~/.phi/jobs/).
Fixed
phi updateon 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.hashis 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-directoryhook.json. Load~/.phi/hooks/plugin.jsonand~/.phi/hooks/<plugin>/plugin.json(same under the project.phi/hooks/).
Removed
- Per-hook
hook.jsondirectories. Useplugin.jsoninstead.
[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
editnow requires a whole-file@file path#TAG(hashfield) fromread/grep; after a successful edit, re-read before anotherediton that path. Per-line hashes are 3 letters (a-z) and no longer use digits.
Removed
- Remove the redundant
agent_tasktool; composeagent_spawn+agent_waitinstead.
[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.