v0.17.6Latest
Resumable, cooperating agents
Agents that survive, report, and cooperate
Paneflow 0.17.6 reworks how it works with coding agents. A conversation that was running when its session host went away, after a reboot or a forced stop, reopens in its pane on the next launch. Agent status comes from declared, testable screen rules and from the hooks each runtime really provides, so a pane no longer reads as idle while its agent waits on a menu. Agents can message each other through the MCP bridge once you allow the pair, and Claude Code agent teams open their teammates in Paneflow panes on Linux and macOS. The release also cuts idle and thinking costs: with an agent thinking, the desktop used 2.79% of a core instead of 25.04% in v0.17.5 on the same Linux machine.
Upgrade notes
- Conversations reopen after the host is lost. With the new
agents.restore_conversationskey at its defaulttrue, a restored pane whose session did not survive types the agent's resume command into a fresh shell, for exampleclaude --resume <id>. Set"agents": {"restore_conversations": false}to only reopen the shell. Conversations are recorded from now on, so asession.jsonwritten by 0.17.5 has none to reopen. - Paneflow now downloads signed screen rules. The session host fetches a minisign-signed rule catalog from the Paneflow GitHub releases one minute after it starts, then daily, and within the hour when GitHub cannot be reached. A catalog applies only when its signature verifies against the key built into Paneflow and its version is newer than the cached one; it is cached in
~/.paneflow/cache/screen-catalog/. Set"agents": {"remote_screen_catalog": false}to keep the built-in rules only. - Menu attention follows each agent's rules. A menu on screen used to raise attention in any pane. It now does so only for agents with screen rules: Claude Code, Codex, Gemini, OpenCode, Pi, Hermes Agent, and fx. A plain shell running
npm initno longer lights the pane, and neither do other agents' menus. A local~/.paneflow/runtimes/<slug>/screen.tomlcan add rules for another runtime. paneflow sendrefuses to type into a waiting agent. When the target agent waits for a decision, or no longer runs in the foreground,sendwrites nothing and exits 3 with a message naming the reason.--forcewrites anyway and is logged.paneflow send --submitreports what happened. A start is confirmed only by an agent state transition, within 5 s instead of 3 s. The reply carriesdelivered,started(true,false, ornull),reason(state_transition,no_state_transition, orno_signal), andstate.reasonreplacesstart_reasonand its valueshook_state_changed,output_generation_changed, andno_hook_state_or_output_confirmation. An unconfirmed start prints the JSON report and exits 1, where it used to raise an error with no JSON.- Writes from a pane stay in its workspace.
paneflow send,paneflow key, and thesendsteps ofpaneflow flow runstarted inside a pane refuse a target in another workspace. Pass--scope all, which needsPANEFLOW_IPC_ORCHESTRATION=1, to cross workspaces. Scripts started outside any pane keep the whole instance. - The session host gates headless clients. A client that is not the Paneflow window, such as the CLI with no window open, the MCP bridge, or a socket script, needs
PANEFLOW_IPC_SCRIPTING=1for hostsession.input, andPANEFLOW_IPC_ORCHESTRATION=1for asession.createthat carries a command, prompt, shell, arguments, or environment."ai_unrestricted": truegrants both. paneflow mcp install --force-devis now--force.--force-devfails with exit 2. A debug build no longer needs a flag for a fresh install. When an existing hook or MCP entry belongs to another Paneflow home that is still installed,paneflow mcp install,paneflow integrations install <runtime>, and the Settings install buttons refuse and name both homes;--forceon the CLI takes the entry over. Entries of a removed home are taken over silently.- Agent status fields. Host replies no longer contain
state: "unknown",reason, orreduced_by;paneflow statusprintsno stateinstead ofunknown.output_generationis the real counter or absent, where it was always0, andhookedis true only for Claude Code and Codex in their current launch. A newstate_seqcounts state transitions. - Hook integrations match what each runtime provides. CodeBuddy, Cursor Agent, Grok, Hermes Agent, Muse Code, OpenCode, Qoder, and Gemini no longer count as hook-driven; their status comes from their screen or their output. A hook that names no tool now takes the pane's detected agent instead of defaulting to Claude Code, and is refused when the pane has none.
- Inactive windows. A terminal in a Paneflow window that is not the active window now counts as unfocused: its cursor is hidden, programs using focus reporting receive focus-out, and OSC 52 clipboard writes from it are dropped until you return to the window.
- The MCP bridge can write, with your approval. Agents that already have the bridge registered see a fourth tool,
write_pane, without reinstalling. Nothing is written until you allow that pair of agents in Paneflow.
Added
- Conversation restore. A pane records the agent conversation it runs from the agent's
SessionStarthook, and forgets it when the agent ends or the pane returns to its shell prompt. When the pane's session is missing, lost, replaced, or exited with an error on the next launch, Paneflow opens a shell in the recorded folder (your home folder when it is gone), waits for 300 ms of quiet output (5 s at most), clears the line, and types the resume command. Panes resume in order, at least 250 ms apart. Claude Code resumes withclaude --resume <id>, Codex withcodex -c check_for_update_on_startup=false resume <id>, and fx withfx --continue. A banner at the top of the pane reports what could not resume:Conversation already resumed in pane N of <workspace>when the same conversation was restored in several panes; only the first resumes.Input was typed before the conversation could be resumed, withResume conversation.Folder not found: <path>.Resume failed: <reason>when the agent prints its "no conversation found" message or exits with an error within 15 s, withNew session.Several fx panes share this folder, so none resumed on its own, withResume conversation.
- Fork conversation.
Fork conversationin the pane context menu and the command palette opens a branch of the current Claude Code or Codex conversation in a split to the right (claude --resume <id> --fork-session,codex fork <id>). New bindable actions with no default shortcut:fork_conversation,accept_conversation_notice, anddismiss_conversation_notice. agents.claude_preassign_session_id(defaultfalse). When on, the Claude Code shim starts a fresh interactiveclaudewith--session-id <uuid>, so the pane knows its conversation before the first hook.- Agent-to-agent messages. The MCP bridge's new
write_panetool takestarget,text(16 KiB at most), andsubmit. The first write from one agent to another shows<source> wants to write into this panein the target pane, in the Attention Queue (Aallows,Ddenies), and in the command palette, withAllow for this agent sessionandDeny. An approval lasts until either agent exits or relaunches, an unanswered request expires after 120 s, and writes are limited to a burst of 3 then 1 per second per pair. The text is relayed as a paste, stripped of control characters, and prefixed with[Paneflow: message from <name>, surface <N>]. An agent cannot write into its own pane or into an agent waiting for a decision. New host methodspane.write,approval.follow, andapproval.decide; only the Paneflow window can follow or decide approvals. - Claude Code agent teams in panes (Linux and macOS). The launcher's new
Claude Code (team)entry runsclaude --teammate-mode tmuxwith agent teams enabled. Each teammate opens in its own Paneflow pane, named by the team and closed when the team ends it, through a tmux shim at~/.paneflow/bin/tmux-compat/tmuxthat only that agent sees. A team holds at most 64 panes, closing the lead's pane releases its teammates as ordinary panes, and the team cannot close the lead. New IPC methodtmux.compat. - Screen rules. Each agent's working, idle, and blocked states come from
runtimes/<slug>/screen.tomlrules with a priority, a screen region, and regular expressions. A local~/.paneflow/runtimes/<slug>/screen.tomlreplaces, disables, or adds rules by id and applies within a second; an invalid file keeps the previous rules. A source holds at most 256 rules and 64 patterns per condition. OpenCode, Pi, and Hermes Agent now report working, idle, and blocked from their screens, and Gemini's API key entry box reads as blocked. paneflow agent capture <target> --state working|idle|blocked [--out DIR]saves the agent's screen, by default under~/.paneflow/cache/captures/<slug>/, andpaneflow agent explain <target> [--json]shows every rule that applies to the pane, which one won, and where each came from.- fx (Linux and macOS). fx is a new agent runtime, recognized only when its pane title starts with
fx v, with a launcher button (fx_button_visible), screen rules, a bell that raises attention, and an MCP entry in~/.fx/mcp.json. - Conductor skill.
paneflow integrations install claude-code, and Install hooks in Settings > Agents, also install thepaneflow-conductorskill in~/.claude/skills/(or underCLAUDE_CONFIG_DIR). A copy you edited is kept, and removing the integration deletes it only when unmodified. - The terminal bell raises attention for agents without full hooks, at most once every 2 s. Your next keystroke clears it.
- A failed agent turn raises attention. A Claude Code
StopFailurehook now marks the pane withfailed:<error>and a needs-input notification, where the pane quietly went idle. paneflow wait --idlefollows an agent's turn for agents with hooks or screen rules: it returns on idle, attention, or blocked, at once when the agent already waits, and no longer needs a window.- macOS microphone access. Programs in a pane, such as voice input in a coding agent, can use the microphone after macOS asks: "Programs you run in PaneFlow, such as voice input in coding agents, may use the microphone." (
#104)
Changed
- The insert-path picker searches anywhere, not only the working directory. A query also fuzzy-matches your home folder, the folders that hold your recent workspaces (a workspace in
C:\dev\appbrings in all ofC:\dev), and Paneflow's worktrees, with matches from the working directory ranked first. Typing a folder then a fragment, such as~/Downloads/shot, searches everything below that folder. Recent paths come back from any folder, and hidden files such as.envor~/.zshrcare found by name. Hidden folders,.git,node_modules,AppDataon Windows, andLibraryon macOS are not searched inside unless you type their path. The index is released from memory 10 minutes after the last use and cached in~/.paneflow/cache/path-index.bin; a folder indexed more than 10 minutes ago is walked again in the background. On a million paths, a keystroke takes 12 to 24 ms instead of 200 to 280 ms, and the index holds them in 31 MB instead of 208 MB. - The
Updated to Paneflowtoast is a standard toast. It drops its framed card, shadow, and close button for aView release notesaction, and closes on its own after about 6 seconds. - Agent detection comes from the session host. The tab badge and sidebar rows follow the agent the host observes in the pane's foreground, so agents without hooks, such as Amp, show as soon as they start, and a Codex pane has one sidebar row.
- Settings agent lists show your platform's agents. On Windows, Settings > Agents and the profile agent picker list Claude Code, Codex, Amp, Gemini, and GitHub Copilot.
- Codex resumes and forks skip its update check (
-c check_for_update_on_startup=false), so an available Codex update no longer stalls a restore. - Codex's "Hooks need review" and "Update available" menus read as blocked, so
paneflow sendno longer types into them. paneflow mcp installlists agents in launcher order: Claude Code, Codex, OpenCode, Gemini.- Symlinked agent config files are edited through the link by the integration and MCP installers, where they were refused.
- Lower idle and thinking cost. Measured on Linux against v0.17.5 with an agent thinking: desktop CPU 25.04% to 2.79% of a core, GPU 39% to 12%.
- Thinking spinners step on one shared clock, about 11 times a second, instead of redrawing the window at the display rate, and the cursor blink moves from 530 to 540 ms to land on the same steps.
- A window that is not active no longer redraws for the cursor blink.
- The session host lists processes once per 500 ms for all sessions instead of once per session, and reuses the foreground observation while it is unchanged.
- Agent snapshots are sent and applied only when they change, and IPC requests wake the app instead of a 50 ms poll.
- A sidebar diff-stat probe runs 3 git processes instead of 5, and the git watcher no longer reacts to its own probes.
- Agent hooks no longer queue behind each other's disk writes: with a 100 ms write latency, the slowest 5% of a 200-hook burst went from 20.9 s to 222 ms.
- On Linux and macOS, startup after a crash no longer waits about 140 ms on the stale IPC socket.
Fixed
- Quit no longer hangs on a recycled process id. When a process started in a pane exited and the system gave its id to another program, every stop ran to its deadline and quit reported a pending stop without closing. Fixed on Linux, macOS, and Windows; the program now holding the id is never signaled.
- Windows:
Ctrl+Cinterrupts programs in a pane again when the session host was started withCtrl+Cignored. - A pane keeps the name it was created with when its program sets a terminal title, so it can still be targeted by that name.
- A shell left by an exited agent no longer runs that agent's screen rules, so a menu in the shell no longer raises attention.
- Codex's memory consolidation session no longer replaces the conversation recorded for a pane.
- The agent shim no longer skips a folder that holds a stray
paneflow-ai-hookbeside the real agent CLI, which made the agent fail to start with exit 127. - A prompt submitted before the agent was first detected keeps its turn.
- Background integration refreshes use the home they belong to, so an isolated
PANEFLOW_HOMEno longer refreshes integrations against another home. - A pane whose shell exits while a child process still runs reports Unverified instead of briefly showing Exited.
- The legacy state migration says it copied its files, which it always did.
Security
- Agents can write into another pane only after a human allows that pair in the Paneflow window; no CLI verb, MCP tool, or script can grant the approval.
- The session host refuses input and command-launching session creation from clients other than the window unless scripting or orchestration is enabled, and logs each accepted control-client write without its content.
- Remote screen rules apply only with a valid minisign signature from the key built into Paneflow.
Install and validation
Download the signed artifacts from this release or use the installation instructions.
Every primary artifact carries a .sha256 sidecar and a minisign .minisig; each AppImage also ships an .AppImage.zsync for delta updates. 35 assets in total.
Pipeline: run 37528910677.
Legs that passed:
- Build:
x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,aarch64-apple-darwin,x86_64-pc-windows-msvc, each gated bycargo fmt --checkandcargo clippy --workspace --locked --target <target> -- -D warnings - Release test gate on Linux x86_64:
cargo test --workspace --locked - Package smoke tests: Debian 12 and Ubuntu 22.04 (
.debpostinst), Fedora 40 and openSUSE Tumbleweed (.rpmpostinst), Arch Linux (tar.gzbinary), Windows MSI install and relay - Auto-update end to end on Linux x86_64
Full Changelog: https://github.com/arthjean/paneflow/compare/v0.17.5...v0.17.6