v0.17.7最新
Agent status comes from OSC 7501
Paneflow 0.17.7 makes OSC 7501 the only source of agent turn status. Any program, agent or not, can report working, blocked, done, or error with one escape sequence: the pane header shows it, a blocked or failed program enters the Attention queue and sends a notification that names the pane, and a declared done or error stays until you type in the pane. Paneflow no longer reads agent status off the screen or from hooks, so an agent that does not emit OSC 7501 shows no turn status. The release also moves the terminal engine to Ghostty b699ea79: trackpad scrolling follows the gesture by the pixel, the mouse pointer takes the shape a program asks for, and each character is drawn on its own cell. Six built-in agents are removed.
Upgrade notes
- Agent turn status now needs OSC 7501. In 0.17.6, Claude Code, Codex, Gemini, OpenCode, Pi, Hermes Agent, and fx got a turn status from hooks or screen rules. From 0.17.7, an agent that does not report its state with OSC 7501 shows no turn status: no working or waiting state in the sidebar, no Attention queue entry, and no notification. Claude Code and Codex hooks stay installed and still resume conversations, name tabs, and report the last result. For such an agent,
paneflow send --submitreportsno_signalandpaneflow wait --idlewaits for the output to go quiet instead of returning at the end of the turn. Paneflow offers no replacement: the status comes back once the agent itself emits OSC 7501. - Script-visible fields changed.
activity_sourceis nowdeclaredornone(it washooks,screen, ornone) inpaneflow sessions, Controller events,paneflow status --json, andfleet.list.attention_reasonandmenu_prompt_activeare gone.hookedis true only after a hook event from a runtime that has a hook installer (Claude Code and Codex), wherefleet.listrows always saidtrue. An outcome is nowcompletedorfailed, optionallyfailed:<reason>;expiredandcancelledare no longer produced. A script that waited foractivity_sourceto behooksorscreenshould test fordeclaredinstead, and one that readattention_reasonormenu_prompt_activeshould readstatusinstead. - Sessions that outlive the update end as
Incompatible. The session host embeds the terminal engine, and a host started by the previous version cannot serve a desktop built on the new engine. Updating from inside Paneflow stops the host before restarting, so this only happens after an update made outside the app (a system package, Homebrew, or an MSI installed by hand) or when you choose Keep sessions running before updating. Each such session ends withRetryandStop host and restart; chooseStop host and restartto start the new host, or let the sessions finish first.
Added
- The mouse pointer takes the shape a program requests with OSC 22, such as a hand over a link or a resize arrow over a splitter. The scrollbar and a Ctrl-hovered link keep their own pointer, and a shape Paneflow cannot draw shows the default arrow.
- Trackpad scrolling through the scrollback follows the gesture by the pixel instead of jumping a line at a time. Mouse wheels keep line-by-line scrolling, and so does
reduce_motion, which also drops an offset already on screen at the next frame. A program that reads the mouse, or an alternate screen that scrolls alternately, always gets whole lines and an unshifted grid. - Any program can report its own status with OSC 7501, agent or not, and the pane header shows it. For example, a script that runs
printf '\033]7501;state=blocked:kind=permission:app=deploy:msg=QXBwbHk/\033\\'showsblocked: permission · Apply?in the pane header (msgis base64), and the Attention queue and the notification name itdeploy. A program without an agent that reportsblockedorerrorenters the Attention queue and sends a desktop notification that names the pane, such asdeploy needs input in buildorcargo failed in build, at most once every 10 seconds per pane, whenagent_panel.notify_when_agent_waitingallows it. Anerrorentry leaves the queue once you have looked at the pane, while the pane header keepserroruntil you type in it. - A declared
doneorerrorstays until you type in the pane, whileworking,blocked, andidleclear when the shell prompt returns or the program exits, as the OSC 7501 spec requires. Text sent bypaneflow sendorwrite_panedoes not count as typing. - A manual
resetclears the declared status, the progress bar, and the title, likeESC c(RIS) does. - A burst of thousands of status reports in one write loses no transition; past a 256 KiB budget, Paneflow clears every declared status instead of keeping a partial one, and logs a warning.
- Conformance suites such as vttest and esctest can get DECRQCRA checksum replies by setting
terminal.xt_checksum_reporttotrue, with the calculation tuned byterminal.xt_checksum_extension(0to31). Checksums stay off by default, because a program could otherwise read back the whole screen one cell at a time. Anxt_checksum_extensionoutside0to31falls back to0with a warning naming the key, and the rest ofpaneflow.jsonstill applies. host.statusreports how much memory each session's terminal holds, underresources.sessions[].memory:resident_bytes,virtual_bytes,compressed_bytes,image_bytes, andcompression_supported. Every session is listed: one that has not started, has exited, or does not answer reportsmemory: nullwithnot_started,exited, ortimeoutinmemory_unavailable, never 0. All sessions are queried at once under one 500 ms deadline, so a reply with 64 stalled sessions still arrives in under 600 ms. See the work counters section ofbench/README.md.
Changed
- Agent status now comes only from OSC 7501. An agent's sidebar state, Attention queue entry, and notifications follow what it declares:
workingshows as working,blockedas waiting,idleanddoneas idle, anderroras errored. Enteringblockedorerrorsends a needs-input notification, anddoneafter a turn sends a finished notification;idlesends none. An agent that declares nothing shows no turn status.paneflow send --submitandpaneflow wait --idlefollow the declared state. - A needs-input notification names the pane and its workspace, such as
Claude Code needs input in build (backend), or only the one that has a name. - Reattaching to a session with a long scrollback stores the restored history compressed, so the desktop no longer holds a second uncompressed copy of the host's scrollback. In a 50,000-line test, the restored terminal's resident memory drops from about 35 MB to 1.3 MB. Scrolling into the history or searching it shows the same content as before, and after 2 seconds without activity the history is compressed again in small steps off the UI thread.
- The pinned
libghostty-vtarchive moves from Ghostty0c2a290dtob699ea79. Character widths follow Unicode 18.0.0 (uucode9d555245), up from Unicode 17.0.0.
Fixed
- On Windows, enlarging a pane no longer pulls lines back out of the scrollback, so the next output from ConPTY lands on the row it was meant for instead of being shifted.
- Each character is drawn on its own cell. A narrow no-break space drawn from a fallback font, such as the thousands separator in a French
dirlisting, no longer pulls the following digits onto it, and text after an emoji or a CJK character no longer overlaps it. - A full-screen program that redraws with synchronized output (DEC mode 2026) shows exactly the frame it finished, never a half-drawn one, even when it ends one redraw and starts the next in the same write. A program that never ends its redraw still releases the screen after 150 ms. Scrolling or selecting during a redraw shows live content without replacing the finished frame, which comes back until the redraw ends.
- Narrowing a pane whose last column holds the left half of an emoji or a CJK character no longer leaves that half behind, which could write past the row and crash the terminal.
- After a resize, the cursor and the cursor a program saved keep their position and their pending line wrap, so the next character lands where the program expects, even after several widenings in a row.
- Moving the cursor left with reverse wrap no longer jumps it to another row when the scroll region starts below the cursor.
- Double-clicking either half of a wide character selects the whole word, a word selection no longer runs past a hard line break, and a triple-click on blank cells between two prompt marks no longer pulls in the neighboring prompt.
- A character above U+00FF prints as itself in the DEC Special Graphics and British character sets, and a single shift (
SS2,SS3) maps exactly one printed character. - CAN and SUB cancel an OSC in progress, so
ESC ] 2 ; titlefollowed by CAN no longer changes the title, and OSC indexes such asOSC 4 ; 1_0are rejected instead of being read as10. ESC c(RIS) restores your theme's 256-color palette after a program changed it with OSC 4.- The ANSI form of DECRQM (
CSI 4 $ p) is answered, and a query for a mode above 32767 is answered for that mode instead of aliasing a lower one. - Erasing a whole line clears the kitty graphics placeholder mark of that row.
- A follower of
paneflow sessions --followor the Controller API receives each session's title with its events, so reconnecting after a worker restart no longer replays a row whose only change was its title. - On Windows, an agent started in a pane is recognized even when it prints nothing right after it starts; Paneflow looks at the pane again once its process list covers the launch.
Removed
- Paneflow no longer reads agent status off the screen. The built-in
screen.tomlrules, local overrides in~/.paneflow/runtimes/, the signed screen rule catalog and its download from GitHub Releases,paneflow agent capture, andpaneflow agent explainare removed. Themenu_attention_detectionandagents.remote_screen_catalogsettings are ignored, and~/.paneflow/cache/screen-catalog/can be deleted. - The terminal bell no longer puts an agent in the Attention queue, and
attention_reasonis gone fromstatus --json. Pressing Escape in an agent pane no longer settles its turn on Paneflow's side. - Six built-in agents are gone: Antigravity, CodeBuddy, Cursor Agent, DeepSeek Harness, Kiro, and Qoder. Their launcher buttons, their PATH shims (
agy,codebuddy,cursor-agent,dsh,kiro-cli,qodercli), their rows in Settings, and the Kiro conversations in the session sidebar are removed. A leftover*_button_visiblekey for one of them is ignored, and anagent_profilesentry based on one of them is skipped with a warning.
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 38094573398.
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.6...v0.17.7
贡献者
v0.17.6
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
贡献者
v0.17.5
A hardening release
Paneflow 0.17.5 comes out of a full audit of the app. Edits in the code editor are no longer lost when you close a tab or quit, removing a worktree no longer deletes uncommitted files that git status hid, and the git commands Paneflow runs in the background no longer execute a repository's hooks, filters, or fsmonitor. The terminal and its session host now agree on the theme and on Reset and Clear, the MCP bridge works with Claude Code again, and the IPC and CLI answer with precise errors instead of acting on the wrong pane. The release also adds an insert-path picker, image paste for agents, and an Interface style setting that brings transparency to Linux.
Upgrade notes
- Program notifications follow your notification setting. A desktop notification sent by a program with OSC 9 or OSC 777 used to show whenever its pane was hidden, whatever your settings. It now follows Settings > General > Native OS notifications (
agent_panel.notify_when_agent_waiting), which is off by default, and a pane sends at most 3 per minute. Turn that toggle on, or set"agent_panel": {"notify_when_agent_waiting": "PrimaryScreen"}, to keep build and program notifications. - macOS: the sidebar is opaque by default.
macos_chrome_materialnow defaults tofalse, to match the defaultThemedinterface style. PickBlendedin Settings > Appearance > Interface style, or set"macos_chrome_material": true, to bring the native Sidebar material back. - macOS: Next Workspace moves to
Ctrl+Tab. Its default wasCmd+Tab, which the app switcher always took, so it never worked.Ctrl+Tabno longer reaches programs in the terminal on macOS; remapnext_workspaceif you need it there. On every platform,Cmd/Ctrl+1to9and Next Workspace now follow the sidebar order, which groups checkouts of the same repository, instead of creation order. Ctrl+Shift+I(Cmd+Shift+Ion macOS) opens the new path picker in a terminal pane and no longer reaches the program. Remove or remapinsert_pathif a program you run uses that key.- Pasting an image pastes a file path. With only an image on the clipboard, Paste used to send
Ctrl+V(0x16) to the program. Paneflow now saves the image and pastes its path, which Claude Code and Codex attach as an image, including Claude Code on Windows, whereCtrl+Vattached nothing. - A multi-line paste into a program without bracketed paste asks first. Each line would run as soon as it arrived, so Paneflow now asks
Paste N lines?withPasteandCancel. One line with no trailing newline, or a paste into a program that enables bracketed paste, never prompts. - IPC and CLI scripts:
workspace.closeandworkspace.selectrequireindex.workspace.closewithout it used to close the active workspace.- A parameter of the wrong type is refused with JSON-RPC
-32602instead of falling back to a default. A"surface_id": "42"string used to send text to the active pane. - Errors carry specific codes instead of
-32603:-32602invalid parameters,-32005confirmation required in Paneflow (unsaved files or busy agents on close),-32002timeout,-32003the pane runtime is gone or refused the input,-32000busy,-32800search superseded.surface.send_textandsurface.send_keystrokenow fail with-32003when the pane did not take the input, where they answered{"sent": true}and lost the text, andsurface.readandsurface.searchfail instead of returning empty results. workspace.createwith a layout andworkspace.restore_layoutrequirePANEFLOW_IPC_ORCHESTRATION=1orPANEFLOW_IPC_SCRIPTING=1when the layout carries a command, a prompt, an environment, a session, or scrollback.surface.splitrefuses acwdoutside the worktree bound to the tab, andmanaged_worktreeopens the pane in the tab bound to that worktree.- The
ai.*methods are gone from the app socket (-32601). Agent status comes from thepaneflow-ai-hookreporter thatpaneflow integrations install <runtime>sets up;events.subscribestill deliversai.*events. workspace.currentno longer includes surface scrollback, andPANEFLOW_ALLOW_MULTIPLEonly takes effect with the exact value1.
- MCP bridge:
- Reads are scoped to the workspace of the session the agent runs in, through
PANEFLOW_SESSION_ID. An agent started outside a Paneflow pane now gets every read refused; launch it from a pane, or setPANEFLOW_MCP_SCOPE=allto read the whole instance on purpose. - If you set
CLAUDE_CONFIG_DIRorOPENCODE_CONFIG_DIR, runpaneflow mcp installagain: the entry now goes to$CLAUDE_CONFIG_DIR/.claude.jsonand$OPENCODE_CONFIG_DIR/opencode.json[c]. The old entry in~/.claude.jsonor$OPENCODE_CONFIG_DIR/opencode/stays where it was until you remove it. - A relative
CLAUDE_CONFIG_DIR,CODEX_HOME, orOPENCODE_CONFIG_DIRis ignored with a warning, and the default location is used. - Codex started in a pane runs with
--no-daemon, so its hooks and the bridge see that pane instead of the first pane that started the shared daemon.
- Reads are scoped to the workspace of the session the agent runs in, through
- Files Paneflow writes:
- A read-only
paneflow.json, for example a link into the Nix store, is no longer replaced: each change showsCould not save setting: <key>. - Symlinked
paneflow.json,session.json,window-state.json, and agent configs stay symlinks, and a dangling link fails the write instead of being replaced by a file. - On Linux and macOS,
~/.paneflowis tightened to0700at launch. A home chosen withPANEFLOW_HOMEkeeps its mode. PANEFLOW_HOOK_LOGmust be an absolute path; a relative one logs nothing.
- A read-only
- IPC socket path. On macOS, an exported
XDG_RUNTIME_DIRis now ignored and the socket lives at$TMPDIR/paneflow/paneflow.sock. On Linux, anXDG_RUNTIME_DIRthat is not a writable directory is skipped for$TMPDIR, where Paneflow used to refuse to serve IPC at all. Scripts should readPANEFLOW_SOCKET_PATH, which every pane exports, rather than hard-code a path. - Terminal environment.
terminal.envcan no longer setZDOTDIRorPANEFLOW_ORIG_ZDOTDIR; each ignored key is logged once.LANG=en_US.UTF-8is injected only whenLANG,LC_ALL, andLC_CTYPEare all unset. - Sessions kept running through the update stay on the previous session host until they stop. On those, theme changes do not reach the host, and Clear scroll history and Reset terminal show a toast when the host cannot apply them. Stopping those sessions, or quitting with Stop everything, moves the next launch to the new host.
Added
- Insert-path picker.
Ctrl+Shift+I(Cmd+Shift+Ion macOS), orInsert pathin the command palette, opens a 420 px picker at the terminal cursor. An empty query lists up to 5 recent paths, then the working directory with folders first and hidden files left out. A query fuzzy-matches a background index of the working directory that follows.gitignore, and a query with a separator or~browses that folder.Tabcompletes,Enteror a click inserts the path relative to the working directory when it is inside it, absolute otherwise, quoted for the pane's shell, andEsccloses. Recent paths live in~/.paneflow/path-history.json, 50 at most. In awsl.exepane on Windows, the picker browses/mnt/<drive>and the distribution, and inserts Linux paths. - Image paste for agents. Pasting an image-only clipboard (
Ctrl+Shift+V,Ctrl+Von Linux and Windows,Cmd+Von macOS) saves the image under~/.paneflow/cache/clipboard-images/and pastes its path. PNG, JPEG, GIF, and WebP are kept as is, BMP and TIFF are converted to PNG, and images older than 7 days are removed at the next image paste. Awsl.exepane receives the/mnt/c/...form. - Interface style. Settings > Appearance, under the theme preset, and
Interface stylein the command palette.Themedpaints the app in solid theme colors.Blendedturns on every window material: Mica behind the sidebar and the terminal on Windows, the native Sidebar material on macOS, and on Linux a theme veil behind the sidebar and the title bar with a denser one behind the terminal. When the individual switches disagree, the setting readsCustom. - Linux transparency. New
linux_chrome_materialandlinux_terminal_materialkeys, also in Settings > Appearance > Linux > Sidebar transparency and Settings > Terminal > Window > Terminal transparency. The window turns transparent on Wayland and X11; the sidebar veil is 72% opaque on dark themes and 62% on light ones, and the terminal card is a 35% shade. Paneflow requests no blur: your compositor provides it, for example Blur my Shell on GNOME. terminal.osc52_clipboard.copy(default) lets the focused terminal write the clipboard with OSC 52, as before;offrefuses every OSC 52 write. OSC 52 reads stay denied.- Undo close reattaches the session. A pane or tab closed without a dialog keeps its session for 5 seconds, and
Cmd/Ctrl+Shift+Twithin that time brings back the same process with its screen, styles, links, and cursor. Later, it opens a fresh shell in the same folder, as before. TheTab closedtoast now stays 5 seconds. - Unsaved-changes dialog. Closing a tab or a workspace, quitting, or restarting to update with modified files in the code editor asks
Save changes before ...?withCancel,Don't Save, andSave. A file that fails to save stays open and nothing is closed. - MCP:
resources/templates/listand paging onpane://surface/{surface_id}/content{?lines,offset}(lines1 to 4000, default 200). - CLI:
paneflow helpprints the help and exits 0 (it was an unknown-verb error),paneflow --helplists every verb, andpaneflow mcp install --force-devis required to point agents at a debug build.
Changed
- Toasts lose the check icon on success (errors keep their alert glyph), become a 20 px squircle with 16 by 12 px padding, and show an arrow cursor instead of the terminal I-beam. At most 5 wait in the queue, and a repeat of the last one is dropped.
- Hover and selection tints of sidebar rows, menus, Settings navigation, and title bar controls derive from the theme text color, 10% on hover and 16% when active, instead of fixed white or gray. The active pane tab uses the same tint instead of a solid fill.
- Multi-agent actions cover every tab. Broadcast, jump to the next waiting agent (
Cmd/Ctrl+Shift+J), the attention queue (Cmd/Ctrl+Shift+U), and fleet search (Alt+F) reach panes in inactive tabs and panes hidden by a zoom. Switching tabs no longer removes panes from their broadcast group. - Focus returns where it was after the attention queue, fleet search, the broadcast picker, the close and quit dialogs, the unsaved-changes dialog, and the pane palette.
- Swap mode (
Cmd/Ctrl+Shift+S) marks the source pane withSwap: pick a direction, Esc cancels, stays in its own window, and ends when the source pane closes. - Accessibility: toggles, selects, filter fields, window controls, text fields, and pane header buttons expose roles and names, and show their label as a tooltip. Selects open from the keyboard. An agent error in a pane header shows an alert icon instead of a red dot. Reduce motion now also stops toast, progress, and spinner animations. The
Install MCP bridgebutton meets 4.5:1 contrast on every built-in theme. - Updates no longer fail when a download takes longer than 30 seconds: a download now stops only after 60 seconds without data or 15 minutes in total.
- Reset terminal (
Cmd/Ctrl+Shift+R) resets the emulator and the session host instead of typingESC cinto the program. Clear scroll history (Cmd/Ctrl+Shift+K,Cmd+Kon macOS) also clears the host, so the history no longer comes back after a reattach, a restart, or in the saved final output, and on the alternate screen it keeps the full-screen program's display. - Programs that ask for colors get the Paneflow theme. OSC 10, 11, and 4 queries, the dark or light report (
CSI ?996n, mode 2031), and the window and cell size in pixels now use the real theme and cell size instead of the engine defaults and 8 by 16 px cells. - Settings > Shortcuts lists every key bound to an action,
Ctrl+-and⌘-read correctly, and Escape with the theme menu open closes only that menu. paneflow wait --patternmatches a second occurrence of a line it already saw, fails when it cannot read the starting screen, andpaneflow wait --idleexits 1 when the pane closes.- Open in editor skips terminal editors named by
$VISUALor$EDITOR, such as vim or nvim, which used to start without a terminal. - Package metadata (AppStream,
.desktop, Debian) describes Paneflow as a native terminal multiplexer for coding agents.
Fixed
- Code editor:
Ctrl+Sunder the "changed on disk" banner no longer overwrites the other version, andKeep mineoverrides only the version the banner showed. A write that lands while saving becomes a conflict instead of being overwritten. Reloading a file that turned binary, non-UTF-8, or larger than 10 MiB shows that state instead of "deleted", and saving a symlinked file keeps the link. On Linux, a program merely opening the file, Paneflow included, no longer triggers a reload. - Hunk revert in the Changes tab leaves line endings outside the hunk alone, refuses when the file changed on disk, and refuses symlinks and read-only files instead of replacing them.
- Worktrees:
Remove worktreein the tab menu always confirms, and rechecks running sessions before deleting. The clean check now sees untracked files hidden bystatus.showUntrackedFiles=noand modified submodules set toignore=all, which used to be deleted without a snapshot. A kept worktree shows why in a toast, and so does a.worktreeincludeentry that cannot be copied.paneflow upsetup commands are no longer killed by a long error output, and print their last error lines on timeout. - Git state: a background check no longer takes
index.lock, so an agent'sgit commitno longer fails on it. Acdinto another repository no longer paints that repository's branch on the workspace, a failed check keeps the previous diff stats instead of showing 0, a branch named like a tag no longer readsheads/<name>, and reftable repositories no longer show.invalid. A failed pull request check retries after 10 minutes instead of at the next launch. - Terminal:
- A burst of bells or notifications no longer marks a running pane as exited.
- Mouse reports land on the right cell with fractional cell sizes, and the 1015 and 1016 mouse modes are supported.
- Ctrl or Cmd link hover works while scrolled back.
- Dragging from a link selects text instead of opening it.
- A selection over 400 KB keeps the selection and says it was not copied.
- IME preedit text is visible, and the glyph under a block cursor stays readable on light themes.
- The shell integration reports working directories with spaces,
%,#, or non-ASCII names correctly, including under macOS/bin/bash, and ignores directories reported by a remote host over SSH. - A missing or non-executable
default_shellfalls back to the platform shell with a toast, anddefault_shellaccepts~/. - Restoring many panes at once no longer lets a shell read a half-written integration script.
- On Windows, files dropped or pasted into a
wsl.exepane are quoted for the Linux shell, so their backslashes survive.
- Text fields: the IME candidate window follows the caret in multi-line fields, a click lands on the right character in fields away from the window edge, the terminal search field keeps the terminal shortcuts and copies and pastes into itself, and Markdown search is a real text field with a cursor, paste, and IME.
- Responsiveness:
- Reading and searching a pane's scrollback no longer runs on the render thread, so
paneflow waitno longer stalls the window. - Session restore no longer blocks on a missing or unresponsive folder, such as a stuck network mount: a vanished workspace folder opens in the launch folder with a toast.
- Links, help, and release pages open off the render thread and say so when no browser could be started.
- On Linux and macOS, a background job started by your shell profile no longer makes Paneflow lose the
PATHit imports from your login shell.
- Reading and searching a pane's scrollback no longer runs on the render thread, so
- IPC and CLI: a request reported as timed out no longer runs afterwards, a multi-line prompt from a workspace template or
workspace.uparrives as one paste instead of submitting each line, andpaneflow flowunits with their own worktree run in that worktree instead of the first unit's checkout. The CLI gives up on an unreachable Paneflow after 10 seconds, andpaneflow search --humanprints real line numbers. - Panes: a service chip no longer labels a port with the framework printed for another one, a pane is named after the program in the foreground of its terminal rather than a background helper, and on macOS listening ports are found past the first 1024 file descriptors.
- MCP bridge:
list_panes,read_pane, andsearch_panework from Claude Code again; every call failed on the_metafield Claude Code sends. Reads follow a tab moved to another workspace, and a terminal stacked behind another in its pane can be read. - Agent integrations:
- Updating the Codex MCP entry keeps your
env, timeouts, tool lists, andenabled = false. - Codex hooks work under a Windows profile with a space in its name.
- Gemini's
settings.jsonwith comments is edited in place, and a userenabled: falsein opencode is kept. - Two Paneflow helper folders on
PATHno longer make the agent shim loop, and helper folders of past versions are removed at startup. - An agent waiting for input lights its pane's attention marker even without a message, agent rows follow a tab dragged to another workspace, and two agents of the same tool keep separate rows.
- The Sessions sidebar keeps a Claude or Pi session whose log has a line cut in the middle of a character.
- Updating the Codex MCP entry keeps your
- Workspaces and tabs: undo close pane restores into the workspace and tab it came from, a rename no longer lands on another tab after a close, the close button of a modified file tab ignores a double click, hiding the sidebar during a rename keeps the typed name, and toggling the sidebar while Settings is open closes Settings first.
- Settings: fast changes, such as clicking a stepper, no longer snap back, and a value the schema rejects says so instead of doing nothing.
Reset all to defaultsfirst savespaneflow.json.before-reset, and recording a shortcut while filtering binds the action you picked. An invalidpaneflow.jsonbeing edited no longer resets the theme, config errors are now logged on macOS and Windows, and the JSON schema accepts thepathandsessionsurface keys Paneflow writes. - Updates: on a macOS or Windows install Paneflow cannot classify, Update opens the release page instead of failing on the Linux tarball.
- macOS menus bring the Paneflow window forward and act on it when it is minimized or another window is in front, Quit works with no window open, and
Window > Next Workspacefollows the sidebar order. - Files: a FIFO in place of
paneflow.json,session.json, or an open file no longer hangs Paneflow, including at startup. - Telemetry toasts are in English.
Security
- Background git commands no longer run a repository's fsmonitor, hooks, external diff, textconv, or filter drivers declared in its own config, so opening an untrusted repository no longer executes its code. Filters from your global or system config, such as Git LFS, still apply.
.worktreeincludecopies recreate symlinks as links and never follow them, so a.envlinked to a secret outside the repository is no longer copied into a new worktree.- Update downloads follow at most 5 redirects, each over HTTPS to a GitHub host, and the release page link is validated.
- A dev server URL in a service chip is used only when it is a real loopback address on the detected port.
- An MCP bridge in a session with no workspace reaches only its own pane, where it could read every other such session.
- Kitty graphics PNGs are capped at 8192 px per side before decoding. A long image such as 16384 by 1024 px, accepted before, is now refused.
- Every authorized write into a pane through IPC is logged at info level under
paneflow::ipc::write, with the method, pane, caller, length, and authorization, never the text. Onlyai_unrestrictedwrites were logged before, underpaneflow::ipc::unrestricted.
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 36862379114.
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.4...v0.17.5
贡献者
v0.17.4
Paneflow 0.17.4 removes the cap of 20 open workspaces. Past the twentieth, creating a workspace did nothing at all, whether from the sidebar, the title bar, the shortcut, a folder drop, or the CLI, which read as being unable to create a workspace. You can now open as many workspaces as you need, and a session with more than 20 of them restores in full.
Upgrade notes
- Downgrading drops workspaces past the twentieth. A version up to 0.17.3 still restores only the first 20 workspaces of a session, and its next save rewrites
session.jsonwith only those. Stay on 0.17.4 or later once you run more than 20 workspaces. - IPC clients:
workspace.createandworkspace.upno longer answerWorkspace limit reached. At 20 workspaces or more, that error used to mask their parameter validation errors, which now come through.
Changed
- No cap on open workspaces. Every way to create a workspace works past the twentieth:
- The sidebar
New workspacebutton, the title barFiles > New Workspaceitem, the command paletteNew workspaceentry, the shortcut (Ctrl+Shift+N,Cmd+Shift+Non macOS), andWindow > New Workspaceon macOS. At the cap, none of them opened the folder picker, and nothing said why. - Dropping folders on the sidebar, which opened folders only up to the twentieth workspace and silently skipped the rest. At the cap, dropping a folder that was already open did not switch to it either.
- Cloning a repository, which at the cap finished the clone on disk and closed the dialog without opening its workspace.
- Opening a row from the sidebar
Other sessionsgroup with no workspace for it, which showed the toastMaximum workspace count reached (20). paneflow newandpaneflow up(andpaneflow flow run), which exited 1 withWorkspace limit reachedfromworkspace.create(JSON-RPC-32603) andworkspace.up(-32602).paneflow upalso rolled back the worktrees it had just created.
- The sidebar
- Sessions with more than 20 workspaces restore in full. Session restore no longer keeps only the first 20 workspaces, so a larger session survives a restart instead of losing its extra workspaces at the next save.
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 36352630749.
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.3...v0.17.4
贡献者
v0.17.3
Paneflow 0.17.3 makes the update pill say what a click does, and gives feedback once you click it: after Restart to update, the pill stays blue with a spinning comet while Paneflow stops its sessions and restarts into the new version. On Windows it no longer turns into a grey Installing update… pill at that moment. The quit dialog that reports a stop or save problem now reads in plain words, with session counts instead of raw host errors, and keeps those errors behind Show details for a bug report.
It also fixes a quit that could not finish: a terminal restored from a session created before 0.17, once an agent had run in it, blocked every quit on "Unable to save the final state".
Upgrade notes
- A release can no longer be hidden. The
×on the update pill is gone. The pill stays until the release is installed, and on installs managed by a package manager, theUpdate via package managerandUpdate via rpm-ostreepills stay for the session. - Still on 0.17.0 or 0.17.1 on Windows? Run the MSI by hand once. The updater of those two versions defers every update. Download
paneflow-0.17.3-x86_64-pc-windows-msvc.msifrom this release and run it: it upgrades in place and leaves%USERPROFILE%\.paneflowuntouched. From 0.16, and from 0.17.2 onward, the in-app update works.
Changed
The update pill says what a click does. Its labels:
Restart to updatereplacesRestart Paneflow.Retry updatereplacesUpdate failed, andRetry update checkreplacesUpdate check failed, each with a 12 px alert glyph.v<x.y.z> available,Downloading update…,Installing update…,Checking for updates…, and the package-manager labels are unchanged.
It acts on click release instead of press, so dragging off it cancels. Every state now uses 12 px Medium text with 10 px horizontal padding, like the Quit dialog's buttons, and 12 px glyphs. The blue states move from
#3a83f7to#1a6ff6, so the white label reaches 4.5:1 contrast (3.6:1 before), and hovering darkens the blue instead of lightening it.A restart shows progress. After a click on
Restart to update, the pill keeps its blue and label and replaces its icon with a spinning comet while Paneflow stops its sessions and restarts. The same comet, one turn per 700 ms, now marks every busy state (Checking for updates…,Downloading update…,Installing update…) in place of the 1 s loader, and stands still under reduced motion.Plain-words quit dialog. When a stop or save goes wrong at quit or before an update restart, the dialog counts sessions (
2 sessions could not be confirmed stopped.,Paneflow could not record how 1 session ended.,The session host did not shut down.) instead of printing host errors, session IDs, and file paths. Those move to a collapsedShow details/Hide detailssection, one error per line in Geist Mono, scrolling past 160 px. When only saving failed, the dialog readsUnable to save session stateunderAll sessions stopped., and its override button readsQuit anyway, orQuit without updatingduring an update, instead ofQuit with unsaved final state. The details toggle comes first in the keyboard order.Sidebar update banner. The
Update check failedbanner gains an explicitRetrybutton instead of retrying on any click, and no longer dims to 80% at rest. Its close button and the release toast's become 24 px squircleDismissbuttons with a tooltip, and the toast action buttons (Retry,Open releases,Undo) take the same squircle shape in Medium weight.
Fixed
- Quitting after restoring a pre-0.17 session. A terminal restored from a session created before 0.17 had no data directory, so once an agent ran in it, every save of its final state failed and quitting stopped on "Unable to save the final state". A restart now creates the session's data directory, and a hook record with no directory left is skipped instead of retried every 5 s, because the session record already holds it.
- Stopping a terminal Paneflow failed to attach. The session host now releases such a terminal as the stop begins, so a shell with unread output can exit. On macOS, every stop of such a session timed out before.
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 36333593112.
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.2...v0.17.3
贡献者
v0.17.2
Paneflow 0.17.2 repairs the in-app update on Windows. From 0.16, the update pill ran the installer while the session host (paneflow-host.exe) was still running from the install folder: Windows Installer asked to close paneflow-host, could not close a process that has no window, and stopped on error 1611. From 0.17.0 and 0.17.1, the updater tested write access to paneflow-host.exe, which it never has under Program Files, so every update was deferred and the same version relaunched without a word. The installer now stops the host itself during an upgrade, and the updater no longer runs that test.
The title bar update pill also becomes the single place for updates: it appears for any release Paneflow finds, not only after a manual check, and follows the download, the install, and the restart.
Upgrade notes
- From 0.17.0 or 0.17.1 on Windows, run this MSI by hand once. The updater that runs is the one already installed, and in those two versions it defers every update. Download
paneflow-0.17.2-x86_64-pc-windows-msvc.msifrom this release and run it: it upgrades in place and leaves%USERPROFILE%\.paneflowuntouched. From 0.16, and from 0.17.2 onward, the in-app update works. - A Windows upgrade ends the sessions still running in the host. During an upgrade, the installer asks a
paneflow-host.exerunning from the install folder to stop withpaneflow host stop --force, waits up to 15 s, then terminates what is left of that exact image and waits up to 10 s more. A host running from any other folder, such as a development build, is left alone. The 0.17 in-app update already stops sessions after confirmation before it installs, so this changes updates started by 0.16 and installers run by hand.
Changed
One update pill for every update state. The pill between the title and the window controls (24 px high, 11 px Medium) now appears for any release Paneflow knows about, whether the startup check, the four-hourly recheck, or Help > Check for Updates… (PaneFlow > Check for Updates… on macOS) found it. Before, only a manual check raised it and it disappeared once the download started, so a release found in the background had no control, and an AppImage, tarball, or macOS update staged with no restart button. Its states:
v<x.y.z> availableandRestart Paneflow: solid#3a83f7with a white download or refresh glyph. A click installs, or restarts through the same session dialog as quitting.Downloading update…andInstalling update…: an 11 px spinning loader, dimmed.Update failed: a red wash. A click retries, and after three failures a toast offers the releases page.Update via rpm-ostreeandUpdate via package manager: a click copies the upgrade command, or the update explanation of a distribution build.- A manual check still lays
Checking for updates…, thenPaneflow is up to dateorUpdate check failedfor 3 s, over the same slot.
The
×on the available, failed, and package-manager states hides that release until a newer one ships; a manual check brings it back.
Fixed
- Windows: updating from 0.16 no longer stalls on error 1611. The MSI runs a
StopInstalledHostaction beforeInstallValidateon every upgrade, so Windows Installer no longer findspaneflow-host.exein use and never asks to close it. - Windows: the in-app update installs under Program Files. The update relay no longer opens
paneflow-host.exefor write access to decide whether to install. It still waits up to 30 s for the session host to stop answering, and defers the update if it does not. - Windows: no more 75 MB copies in the temporary folder. Each update ran from a copy of
paneflow.exein%TEMP%(paneflow-msi-relay-<pid>.exe) that it could never delete. Every start now removes the copies no process still runs, including those left by earlier versions, and keeps the relay andmsiexeclogs for diagnosis. - Agent rows built from the screen leave the sidebar. When a hook event from another process had been refused first, a row Paneflow built from the agent's screen stayed after the agent exited.
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 36315869731.
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
Before tagging, the release dry-run run 36308397704 upgraded an installed 0.17.1 to this build while its session host was running, once with the updater's msiexec arguments and once without MSIRESTARTMANAGERCONTROL=Disable, as 0.16 runs it.
Full Changelog: https://github.com/arthjean/paneflow/compare/v0.17.1...v0.17.2
贡献者
v0.17.1
A cleaner upgrade to 0.17
Paneflow 0.17.1 fixes the path from 0.16.0 into the 0.17 agent status worker. 0.17.0 stopped injecting Claude Code and Codex hooks at launch and asked for a one-time install; a home that 0.16.0 had already hooked now gets that install on its own. Panes restored after an upgrade run the current version's agent shims and hook reporter instead of the previous version's, and an agent whose hooks never reach Paneflow still shows its state in the sidebar, read from its screen.
Stop everything also means what it says on the next launch: the layout comes back with a fresh shell in every terminal pane instead of a row of ended sessions. The quit dialog works from the keyboard, pane tabs lead with a terminal or agent badge, and sidebar rows reveal their actions inline.
Upgrade fixes
- Hooks from 0.16.0 are adopted once. When the
paneflow serveworker starts on a home where 0.16.0 injected hooks at launch (it finds<home>/agent-config-leases/), it installs the Claude Code and Codex integrations for each runtime it detects onPATHor through its config directory: the global hooks and thepaneflowMCP server, exactly as Settings > Agents orpaneflow integrations installwould. Once every install succeeds it writes<home>/integrations/launch-time-adoption.jsonand never adopts again; if one fails, it retries at the next worker start. - Restored panes use the current helpers. The host now always sets
PANEFLOW_BIN_DIRto the helper directory of the running version and removes every older<home>/cache/bin/<version>entry, and the previousPANEFLOW_BIN_DIR, from the panePATHbefore prepending the current one. The helper search order puts the versioned shim directory ahead of the hook-only<home>/bin, and the desktop extracts the agent shims at launch, before it starts the host. On Windows release builds the shims ship in the install directory and nothing is extracted. - Status from the screen when no hook reports. When an agent is recognized in a pane but no hook event has arrived, the worker builds its sidebar row from the screen: working reads as thinking, idle as finished, and a numbered approval menu as needing input when
menu_attention_detectionis on. The first accepted hook event takes the row over, and the screen-built row goes away when the screen no longer shows the agent.
Upgrade notes
- An integration you removed under 0.17.0 comes back once if the home was used by 0.16.0. The one-time adoption above cannot tell a removal from a missing install, so it reinstalls Claude Code or Codex at the first 0.17.1 worker start. Run
paneflow integrations remove claude-code(orcodex) again, or use Settings > Agents; after the adoption record exists, a removal sticks. PANEFLOW_BIN_DIRin a pane's environment is overridden by the host whenever a helper directory resolves. A custom value is kept only when none does.- Fresh terminals after Stop everything apply to exits made with 0.17.1. A layout saved by 0.17.0 after its own Stop everything still restores its ended panes once.
- Enter in the quit dialog now runs the highlighted default. On an update restart that is Cancel (Enter did nothing before); after a failed final save it is Retry save (Enter used to quit keeping sessions).
Changed
- Fresh terminals after Stop everything. After Stop everything and quit or Stop everything and restart, including
on_quit: "stop", a quit with no live session and an update restart that stops sessions, the next launch reopens the layout with a new shell in every terminal pane, in its last directory, with its name and font size. Agents and previous sessions are not relaunched: the host removes the stopped session records within the same 5 s stop budget, andsession.jsonis saved again without them. If that save fails, Paneflow stays open and says why. - Keyboard in the quit dialog. A focus ring (a 1 px squircle, 3 px outside the control) starts on the default action: Keep sessions running on quit, Cancel on an update restart, Keep running and quit when a stop at quit could not be confirmed, Retry save after a failed final save. Tab and Right move forward, Shift+Tab and Left move back, Enter or Space runs the ringed control, Escape closes. The default renders as a solid blue button, the stop and unsaved-quit actions as destructive buttons on the leading edge, and the retry buttons read Retry stopping, Retry update and Retry save. The update prompt reads "Restart to update?", and the failure titles read "Some sessions may still be running", "Unable to update yet" and "Unable to save the final state".
- Pane tab badges. Terminal tabs lead with a 22 by 18 px squircle badge instead of a flat glyph. A shell shows a green prompt on a graphite tile; once Paneflow detects an agent in the pane, the tile shows its logo, on the agent's brand color for Claude Code, Amp, DeepSeek Harness, Muse Code and Qoder, and on graphite for the others. Non-terminal tabs keep their icon.
- Inline row actions in the Workspaces sidebar. Hovering a tab row reveals its close glyph, and hovering a workspace row its new-tab glyph, inline just left of the agent or pull-request badge. The glyph grows from 0 to 11 px wide and fades in over 120 ms (instantly under Reduce motion), with no button background, and brightens on hover. The badge, and a tab's diffstat, stay visible instead of hiding behind a 22 px button at the row's edge, and a row with no badge no longer reserves an empty slot. Badge glyphs sit 5 px from the top of the row.
Fixed
- Clicking outside the focused sidebar filter hands focus back to the active pane. The query is kept; Escape still clears it.
- The host logs a refused hook event from an older reporter once per session generation instead of once per event. A restored session could write thousands of warnings to
host.log.
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 36275074548.
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.0...v0.17.1
贡献者
v0.17.0
Agent status that survives the window
Paneflow 0.17.0 moves agent status out of the window and out of the terminal host into a third process, a per-home worker started as paneflow serve run. The worker owns no terminal. It reads the lifecycle hooks Claude Code and Codex report, reduces them to one state per session (thinking, needs input, finished, errored), rebuilds that state from disk when it restarts, and decides which desktop notifications fire. The desktop follows it, the new paneflow sessions verb reads it without a window, and stopping or replacing it never touches a running shell.
Hooks are installed once per machine instead of on every launch. The shim no longer writes hook files into project directories or agent configs at each start; Claude Code and Codex get a global integration that stays inert outside a Paneflow pane. Until it is installed, those agents report no hook status, so read the upgrade notes below.
The same release hardens persistent sessions: a session keeps owning every process it started until their fate is proven, a finished shell leaves its final output on screen, restoring a layout never starts a process on its own, and quitting or updating stops everything under one bounded, reported pass. The terminal gains automatic text contrast on by default and a palette derived from the theme, and the command palette is rebuilt around about a hundred context-aware commands.
The worker
- The desktop starts, adopts or replaces the worker at every launch: a worker of the same build is adopted, any other is drained and replaced. It runs detached, one per
PANEFLOW_HOME, and outlives the window likepaneflow-hostdoes. - New files under the state home:
serve/owner.lock,serve/instance.json,serve/serve.log, and on Windowsserve/runtime/<sha256>/, a copy of the executable the worker runs from so the installed binary stays replaceable by the updater. The endpoint ispaneflow-serve-<fingerprint>.sockin the runtime directory, or\\.\pipe\paneflow-serve-<fingerprint>on Windows, owner-only on both. - When the worker cannot start, the Workspaces sidebar shows the error with a Retry button. Session rows dim while the worker stream is disconnected.
paneflow serve start # start or adopt the worker for this PANEFLOW_HOME
paneflow serve status # pid, protocol, home, session count, capabilities
paneflow serve stop [--drain-ms 5000]
paneflow sessions [--json] [--follow]
paneflow sessions ack <session-id>...
paneflow sessions prints the same projection the sidebar shows, and --follow prints one line per transition and reconnects on its own when the worker restarts. ack lowers the unread flag a finished turn raises; the desktop lowers it too when the pane is in view.
One-time hook integrations
- Claude Code and Codex are the two runtimes with an installer. Install from Settings > Agents (the Install hooks button on the agent's row; a green check marks it installed, and clicking it removes the hooks), or from the CLI:
paneflow integrations list
paneflow integrations install claude-code # or: claude, codex
paneflow integrations remove codex
paneflow hooks setup # installs every detected runtime that has an installer
- Claude Code hooks go to
$CLAUDE_CONFIG_DIR/settings.json(default~/.claude/settings.json), Codex hooks to$CODEX_HOME/hooks.json(default~/.codex/hooks.json). Installing also registers thepaneflowMCP server in~/.claude.jsonor in Codexconfig.toml, and writes a marker under<home>/integrations/. Codex asks you once to trust the new hooks with/hooks. - The hooks exit immediately outside a Paneflow-hosted pane. The worker refreshes installed integrations when it starts and adopts Paneflow hook entries a previous
paneflow hooks setupleft in the global config. - Installing or removing now edits only Paneflow's own handlers inside a hook group, so a handler of yours that shares the group is kept. Before, the whole group was deleted.
How status is decided
- A session becomes hook-owned at its first hook: busy on prompt submit, idle on Stop, needs input on a permission request. Output alone never starts a busy state, and agent state is no longer guessed from terminal progress (OSC 9;4) or notification text.
- Pressing Esc to interrupt Claude Code, Gemini CLI or Muse Code in a pane Paneflow launched settles the pane to idle as canceled, with no "finished" notification. A lone Esc counts after 150 ms with no following byte.
- A Claude Code pane stays busy while subagents run after the main turn stops, and settles when the last one ends.
- A turn whose Stop hook never arrives returns to idle after 5 minutes without a screen change, silently. Events from a runtime generation the session has left are refused.
- Claude Code and Codex numbered approval menus, which fire no hook, mark the session as needing input in the sidebar.
menu_attention_detection(defaulttrue) turns this off; the worker reads it when it starts. - Desktop notifications: " finished" fires only for a turn that completed, never for a failure, an interrupt, an expiry or an exit. " needs input" fires at most once per 10 s. The body is the agent's last message, up to 200 characters.
Upgrade notes
- Agent hooks need a one-time install. 0.16.0 injected Claude Code and Codex hooks on every launch through the shim; 0.17.0 does not. Until you install the integration (Settings > Agents,
paneflow integrations install, orpaneflow hooks setup), Claude Code and Codex panes show no hook-driven status. If you already ranpaneflow hooks setup, the worker adopts those entries on its first start and nothing else is needed. Gemini CLI, Cursor, Qoder, CodeBuddy, OpenCode, Hermes Agent, Grok, Muse Code, Pi and DeepSeek Harness lose their per-launch hooks with no replacement and are detection only. paneflow hookschanges meaning.setupnow installs the integrations above, MCP server included;uninstallalso removes thepaneflowMCP entry, including onepaneflow mcp installwrote;statusprints one<runtime>: <state>line for all 18 runtimes and always exits 0.- A finished terminal stays open. A shell or command that exits, with any exit code, now leaves its pane, detached window or Changes dock tab in place as a read-only final view. Typing
exitno longer closes the pane; close it like any other. - Nothing restarts on its own. Restoring a layout or clicking an ended session in the sidebar attaches to it and never starts a process. The pane bar offers Restart (was Resume), New terminal when the record is gone, Attach or Retry; Enter triggers it. From the sidebar, an ended session restarts through its Resume session menu item.
- A 0.16.0 host that outlives the upgrade is left running. 0.16.0 retired a host from another build at launch; 0.17.0 keeps it and its sessions. If you quit 0.16.0 with Keep running, or upgraded through a package manager while sessions ran, panes open on "The running local host is incompatible with this build and keeps its sessions" with Retry and Stop host and restart, which ends that host's sessions and starts a fresh one. An in-app update from 0.16.0 stops the sessions and the host first and is not affected.
- Terminal contrast is on by default.
terminal.minimum_contrastnow defaults to Auto, APCA Lc 60, and corrects only the colors a program chose (truecolor and palette indices 16 to 255), never the theme's sixteen ANSI colors, foreground or background. Set"terminal": {"minimum_contrast": 0}to keep program colors verbatim. An explicit value now applies to program colors instead of the theme's ANSI colors, and a negative or non-numeric value means Auto instead of Off. - Palette indices 16 to 255 follow the theme. They come from a palette generated from the active theme instead of the fixed xterm cube, on screen and in OSC 4 replies. On light presets the cube runs from the background to the foreground, so index 16 is the background and 231 the foreground. This is not configurable.
- Windows launch surfaces list five agents. The pane palette, the New pane menu and the welcome screen offer Claude Code, Codex, Amp, Gemini and Copilot, the runtimes that declare Windows support, and hide
agent_profilesentries based on the others. Linux and macOS keep all 18. - Without a window,
paneflow psandpaneflow statusreportunknownfor hooked agents andpaneflow send --submitcannot confirm through hook state. Usepaneflow sessions, which reads the worker. - Launch Pad is gone, with its
open_launch_padaction andCmd/Ctrl+Shift+L. Use New branch… in the New pane palette or the tab context menu; there is no prompt pre-fill there. Ashortcutsentry namingopen_launch_padis skipped with a log warning and has to be removed frompaneflow.jsonby hand. - Removed config keys
agent_panel.max_content_width,agent_panel.thinking_display,agent_panel.profiles,agent_panel.default_profileandtool_permissionswere never read. A config that sets them still loads, but editors that validate against the published schema now flag them. - The
contextfield ofsurface.splitandworkspace.createpane specs is ignored andPANEFLOW_CONTEXT_FILEis no longer set. Pass values throughenv. - A custom
PANEFLOW_HOMEgets its own IPC endpoint,paneflow-ipc-<fingerprint>. Clients that export the samePANEFLOW_HOMEfind it; a desktop given both a custom home and aPANEFLOW_SOCKET_PATHof another instance ignores the socket unlessPANEFLOW_ALLOW_SOCKET_OVERRIDE=1. - macOS
option_as_meta: truenow takes effect: Option plus a letter sends Meta (ESC prefix) instead of composing a character, and a config reload applies it to open terminals. The macOS default staysfalse. - Direct
agent.eventsenders on the host endpoint must passruntime_generation. The shipped hook helper does.
Added
- Automatic terminal contrast. Corrections keep their hue: lightness moves in OKLCH and chroma is clipped to sRGB, and a color whose saturation has to drain snaps to the nearest theme color instead of turning grey. Box drawing, blocks, Braille, Powerline and Legacy Computing glyphs, and text drawn in its own background color, are never corrected. Settings > Terminal > Minimum contrast and a Minimum contrast palette command both offer Auto, Off, 45, 60, 75 and 90. The default correction costs about 6 percent on a full 220 by 60 layout pass (
scripts/bench-terminal, Windows x86_64 release build). - Command palette rebuilt. 104 commands in a fixed catalog, shown when the focused pane can run them: terminal, search and Markdown commands appear on the matching surface. Nested pickers for theme, theme mode, workspace, tab, layout, Settings section, open in editor, terminal font, size, weight, line height, cell width, cursor shape, shell, editor, quit behavior and ended sessions apply a preference as you arrow through it and write it to
paneflow.json; Escape leaves the picker without reverting. Toggles flip in place. The query is a real text field, matches are highlighted, the panel sizes to its content between 420 and 640 px, rows are 29 px with 14 px labels, and 26 commands carry a glyph. Closing the palette returns focus where it was. - Reopen a closed tab. Closing a tab shows "Tab closed. Press Ctrl+Shift+T to reopen it." (⌘⇧T on macOS) with an Undo button, and the shortcut restores the most recently closed tab or pane with its split layout, working directories, scrollback, names and font sizes. The terminals come back as new shells.
- Keyboard navigation in the Workspaces sidebar.
focus_workspaces_sidebar(Ctrl+Alt+S, ⌘⌥S on macOS) focuses the list; arrows, Home and End move, Enter opens, Space folds, Left and Right fold or step in, F2 renames, Delete closes a tab, Alt+Up and Alt+Down reorder, Escape returns to the pane. The list exposes a tree to screen readers. - Final output of ended sessions. When a hosted shell exits, the host keeps up to 512 KiB of its final screen and scrollback in
<home>/host/session-data/<id>/final-output.txt, within a 64 MiB budget per home evicted oldest first. Reopening the ended session shows that text read-only, with a note when it was incomplete or has been evicted. - Other sessions. Sessions no open workspace claims are listed once under an Other sessions group, even with no workspace open; opening one attaches it without starting a shell.
paneflow host statusreports aresourcesobject: persistence queue, checkpoint captures, live runtimes, pending launches, connections and per-session buffer usage.- Settings > Agents lists the agents found on PATH with their hook state inline, folds the others into a Not installed card showing three before Show more, and gives Profiles a description and a + New profile row.
Changed
- Session ownership. The host tracks every process of a session, its process group and its descendants, and reports it exited only when all of them are gone. A background job that outlives its shell keeps the session unverified until the job ends, and Stop terminates tracked descendants: through pidfd on Linux, audit-token signals on macOS, and retained handles on Windows. A stop the host cannot confirm now reads unverified instead of lost.
- Stop everything on quit or update also stops owned sessions no pane shows, under one 5 s budget. When a stop cannot be confirmed the window stays open with Retry, Keep running and quit and Cancel; when only the final save failed it offers Quit with unsaved final state. An update restart first checks that the replacement is staged and the host answered, and says why in a toast when it defers.
- Windows updates. The MSI update goes through the same stop dialog. The relay waits up to 30 s for the host to let go, and when the host still serves or its binary is locked it relaunches the current version and keeps the staged MSI instead of running msiexec. msiexec runs with
MSIRESTARTMANAGERCONTROL=Disable, so Restart Manager cannot kill a retained host. - Host durability. Session records are written by a dedicated thread off the terminal path. Creation, restart and accepted agent events wait for their write, exit and final states are synced to disk and retried until storage recovers, and an older queued write can no longer overwrite a newer record. Hard limits now answer with explicit errors: 4,194,304 cells per terminal, 2 MiB of input queued for a child that stopped reading, 2 concurrent checkpoint captures within 256 MiB, 120 streaming connections with 8 reserved for control, 64 KiB control replies.
- Idle cost. Output followers wait on a condition variable instead of polling every 15 ms, the session runtime blocks on deadlines instead of a 20 ms tick, and the viewport scan skips a quiet session. On Linux glibc builds the host caps malloc arenas at 2 unless
MALLOC_ARENA_MAXis set and returns freed memory when a session retires. - Hosts from another build are kept. The client build is logged, not enforced: a host that matches the protocol and the terminal engine is attached, and an incompatible one is left running with Retry and Stop host and restart on its panes.
- Codex rows in the Sessions sidebar come from Paneflow-hosted sessions reported by the integration, within the host retention window, titled with the last tool name or a short session id. Codex sessions run outside Paneflow no longer appear.
- Gemini sessions are read from the trailing
[<session-id>]of eachgemini --list-sessionsline and resumed with that id; the index and age are stripped from the title. - Light themes darken their added, deleted and error hues and their muted text to clear 4.5:1, and the sidebar Input and Done colors and the match highlight get light-theme values. 38 preset colors are retuned to clear APCA tiers, notably red, blue, magenta and bright black on the dark presets and the Claude Dark and Tailwind Dark accents.
- Workspaces sidebar. Folding a workspace animates its tab rows over 180 ms and crossfades the folder icon; the active tab rests on the active tint; workspace groups are 10 px apart; titles and branches longer than 13 characters show in full in a tooltip; menu labels use sentence case; the thinking indicator holds still under Reduce motion.
- Changes dock slides closed over 280 ms from the pane toggle and its collapse buttons, and snaps under Reduce motion or when maximized.
- Help > System Info puts the build line beside the app icon, groups the report into System and Rendering panels and makes Copy the primary action; Escape closes, Enter copies. Help > About Paneflow follows the active theme and links the website, the source code and the release notes of the running version. The copied report is unchanged.
- Tailwind Dark paints Settings and dialog cards in its own zinc neutral (
#1f2023) and liftssurfaceto#212225andsubtleto#2b2c30. - Settings cards use 16 px horizontal padding and toggle rows 12 px vertical padding.
- Terminal file links open in the editor chosen in Settings (
external_editor), with Auto keeping the$VISUAL,$EDITOR, known-editor chain;visual_studiois accepted by the schema. - Changes dock file tabs use the same icons as the Files sidebar, which now also recognizes
.scss,.sass,.less,.jsoncand.text. - Shell integration no longer emits OSC 133 D after each command, and the PowerShell prompt no longer calls
Get-Historyon every prompt. Nothing in Paneflow read it. - Terminals no longer answer Glyph Protocol queries, and a Linux middle-click paste reaches the engine as the primary selection.
- A tab title saved with the retired
autosource restores as a title you set, and the repair that moves a workspace rooted at/now runs only when a version 1session.jsonis migrated. - Secondary, destructive and solid buttons report the Button role and their label to assistive technology.
- A desktop started from inside a Paneflow pane keeps its own home and socket instead of taking over the running instance, and no longer passes that pane's session markers to its own terminals.
Removed
- The Launch Pad, the
contextpane-spec field and the five unread config keys listed in the upgrade notes. - Per-launch hook injection by the shim, and the 400 ms poll of
~/.claude/sessionsthat stood in for Claude Code hooks. - The Hermes Agent and Cursor readers of the Sessions sidebar, which never produced a resumable session for the current directory.
Fixed
- The host no longer crashes on hook text over 4 KiB that contains accented, CJK or emoji characters.
- The first keystroke after a minute of idle in a persistent terminal is no longer lost: control connections no longer time out after 60 s.
- macOS: IPC replies larger than 8 KiB, such as
surface.listwith many panes or a longsurface.read, were cut at 8192 bytes. They arrive whole. - macOS: a background process started just before a session's shell exits stays owned by the session, so stopping the session stops it.
- Windows: a recycled process id can no longer make an unrelated or system process count as a session descendant and hold the session unverified.
- Unix: a host started on a socket another live host serves refuses instead of unlinking it and stranding that host's sessions.
surface.renameaccepts the documentednameparameter; before, a documented call cleared the pane name.- With no window running,
paneflowCLI and MCP calls that address a pane bysurface_idreach the listed pane. - Hovering command palette rows no longer lags: only the rows in view are laid out.
- Windows: the Gemini CLI, Kiro, Grok and OpenCode session lists find
.cmdshims throughPATHEXT.
Security
- On Windows the host pipe is owner-only: its ACL drops the SYSTEM and Administrators grants. The worker endpoint is owner-only on every platform.
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 36247383226.
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 -- -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.16.0...v0.17.0
贡献者
v0.16.0
Sessions that outlive the window
Paneflow 0.16.0 moves every terminal out of the window and into paneflow-host, a detached process with no GPU dependency that owns the PTYs, the child processes and the canonical libghostty terminal state. Quitting Paneflow, closing a window or restarting into an update no longer ends the shells and agents running inside it. The desktop reattaches to the same sessions with their screen and scrollback, and every restored pane resumes at startup without a click. The sidebar lists those sessions as first-class objects with resume, stop, hide and remove, one close policy asks once before a busy agent is stopped, and removing a worktree asks before pulling a checkout out from under a live shell.
Three things change for existing users and are covered under Upgrade notes: session.json moves to schema version 3 and migrates in place, Review mode is removed, and unfocused panes no longer dim by default. The terminal engine (libghostty on every target), the configuration file, the IPC and MCP method names and the paneflow CLI verbs are unchanged; the CLI and MCP bridge gain the ability to work without a window.
The host
paneflow-host ships beside the desktop in the .deb, .rpm, AppImage, .tar.gz, .dmg and MSI. The desktop and paneflow host start share one bootstrap that adopts a compatible host already serving the same PANEFLOW_HOME or spawns one detached from the window: on Windows it breaks away from the desktop's job object with no console and an explicit inherited-handle list, on Linux and macOS it runs under setsid with redirected stdio. The host holds an owner lock so one home has one owner, and a host left over from another Paneflow build is retired and replaced on the next launch; its sessions come back as a new generation with a fresh shell in their recorded directory.
The protocol is JSON-RPC 2.0 lines on a per-home local endpoint. Every connection opens with host.hello, which checks the protocol version, the engine identity and the client build before any effect. Control frames are capped at 64 KiB and checkpoints at 64 MiB, and oversized or malformed input is refused without unbounded buffering. Session records live under <home>/host/; the host keeps the twenty-five most recent finished records and never drops a live one.
Every terminal view attaches to a hosted session: it decodes the native libghostty checkpoint, follows session.output from that offset, skips overlapping bytes and requests a fresh checkpoint on a gap or eviction. Input, resize, paste and focus travel to the host over the control connection, and the mirror never answers terminal queries itself. Reconnecting, ended and unavailable states draw over the last rendered frame with an explicit action. Three integration tests drive a real host and an attached mirror through checkpoint restore without replay, session survival when the client drops, and scrollback retention across the first render resize.
paneflow host start
paneflow host status
paneflow host stop # refused while a session is live, lists them
paneflow host stop --force # stops every live session first, reports the count
paneflow-host session list|create|inspect|stop|restart|remove
The CLI and paneflow-mcp target the host when no window is listening, so listing, read, search, status, fleet and already-authorized send_text keep working against host-owned state. Agent state lives in the host too: it ingests ai-hook events, persists the summary on the session manifest, reconciles busy records as stale after a restart and broadcasts every event on an agent.follow stream the desktop follows. A hidden session shows its host state, or stale while the stream is disconnected.
Sessions in the sidebar
Every session the host owns for a workspace is listed under its last tab. Live rows keep their agent lane; ended rows dim, carry a tooltip with the lifecycle and its age, and collapse under one "N more ended sessions" row past sidebar_ended_sessions (default 5, allowed 0, 3, 5 or 10, Settings > General). Nothing is pruned automatically, a failed listing keeps the previous rows and marks them stale, and a record this build cannot parse is skipped with a log line.
Left-click reopens a live session and resumes an ended one. Right-click offers Open in layout and Stop session for a live row, Resume and Remove from list for an ended one. Hide from Layout drops a pane from the layout while its process keeps running. Resume ended sessions, from the workspace menu and the command registry, brings back every ended restartable pane of a workspace in layout order, and a window that opens with at least two of them offers it once through a toast. A kept session whose directory sits inside an open workspace is listed under that workspace.
One close policy
Closing a pane, a surface tab, a workspace tab, a workspace, or quitting resolves the same policy before anything is removed: stop at once when the session hosts no agent or its agent is finished or errored, ask once for the whole action when an agent is thinking, waiting or in a state the desktop cannot read. The dialog offers Keep running (Enter, the default), Stop and Cancel. Quitting with live sessions asks too, and on_quit (ask, keep, stop) can skip the dialog. Restarting into an update warns how many running sessions it is about to end. Every stop, from a close path or the quit dialog, goes through the host link, which a guard test enforces.
Quitting, restarting and the MSI self-update save the session asynchronously and only exit once the write lands, so closing Paneflow no longer blocks the render thread or drops the final snapshot. When the previous session could not be restored, its file is protected: no new snapshot overwrites it, and a startup prompt offers to retry, quit, or start a new session after backing the original up.
Worktree removal that names what it ends
Remove in Settings > Worktrees used to go straight to git. It now asks the host what is live and, when something uses the worktree, opens a card naming the workspaces rooted there, the tabs bound to it in any window and the sessions whose working directory sits inside it, each identified by workspace, tab position or program and path. Confirming stops those sessions, closes those tabs and workspaces, and then removes the checkout, retrying for a short while on Windows because a process releasing a directory is not instant. Nothing changes when nothing is using it.
Managed worktrees now prove their ownership from the paneflow-owner marker in their own git dir instead of their path under the current worktrees.dir, so changing that setting no longer drops every worktree created under the previous root from the inventory, the keep limit and the removal path. A snapshot restores where it was taken. Repository identity is canonicalized before it is hashed, so two spellings of one path no longer produce two parent directories.
Added
Windows PTYs on a pinned ConPTY runtime
Windows PTYs open through the shared paneflow_host::pty::open entry point, which installs the embedded Microsoft conpty.dll and OpenConsole.exe pair under cache/conpty/<version>/<target> on a worker thread and loads the DLL by absolute path before portable-pty resolves its ConPTY functions. The system renderer, which can emit a DEC 2026 end marker before restoring the cursor, is out of the path. The binaries are pinned in native/conpty/manifest.json, fetched by scripts/fetch-conpty.ps1 and verified twice, and tests/conpty.rs drives a real child through the production PTY. A new PowerShell pane also opens on a prompt instead of the version banner.
Panes in native windows, one tab chrome, a New pane menu
Panes detach into native windows, and tabs and surfaces transfer between windows with one shared tab chrome. The pane tab bar + opens a menu of New pane presets, Terminal then the visible agents then the workspace custom buttons, in the docked bar and in a detached window. Every popup menu shares one geometry (34 px rows, a 1 px gap, 7 px of padding inside the 18 px menu surface), and a unit test fails if those constants stop agreeing.
Settings search and a rebuilt Keyboard Shortcuts page
Settings search matches every setting's title and description as well as the navigation labels, moves the panel to the first matching section without taking focus, highlights the matches in blue and collapses the rows and blocks that do not match, animated over 180 ms. The field is the same 36 px capsule as the sidebar workspace filter, which is now animated too.
The Keyboard Shortcuts page is a register of menu panels: chords drawn as individual keycaps, a 5 px accent dot and a hover reset on every binding that differs from its default, Backspace during recording to unassign an action, a chord another action owns held and flagged until pressed again, group eyebrows naming the context a binding needs (Terminal, Search, Markdown), a Name | Key filter pair, and a footer that counts the customized bindings and holds the global reset.
Manual update check
A manual check from the macOS Paneflow menu, the Windows and Linux Help menu and the command palette, plus a Settings entry on Cmd/Ctrl+,. The result lands in a title bar pill: a spinner while checking, green when up to date, red when the feed is unreachable (both leave after 3 s), and a solid blue pill that installs on click and stays until used. The sidebar update banner is gone, so a single control installs a release.
Tailwind theme, select all, overlay scrollbar
A Tailwind preset, light and dark, with the ANSI palette, foreground, background, cursor and selection from Unpeel (MIT, UX Themes AS, see THIRD_PARTY_NOTICES.md): Tailwind 500 for the normal colors, 400 for the brights, #fafafa on #1a1b1d in dark and #09090b on white in light. It ships its own chrome colors, so the window follows the palette.
Ctrl+Shift+A (Cmd+A on macOS) and Edit > Select All select the whole terminal buffer, scrollback included, the way Ghostty does: leading and trailing blank cells are skipped, the selection stays highlighted, and the text is copied with the usual toast. The buffer is formatted off the render thread.
The terminal scrollbar is an overlay in the style of Ghostty's native scrollers: any viewport move shows it, it holds for a second and fades over 200 ms, hovering the 10 px gutter or dragging pins it, widens the 6 px thumb and reveals a track. reduce_motion snaps instead of fading and terminal.scrollbar: false (Settings > Terminal > Scrollbar) hides it. Refs
#63.
Changed
- Unfocused panes no longer dim by default:
unfocused_pane_opacitydefaults to 1.0. Focus reads from the pane border and title bar; set a value below 1.0 to fade the siblings again. - Programming ligatures are on by default (
terminal.ligatures: true), matching Ghostty. The bundled JetBrains Mono Nerd Font ligates->,=>,!=and//; setfalseto keep the plain glyphs. - On macOS a font size is a point, as it is in Ghostty and every macOS terminal:
font_size: 13renders 13 logical pixels there instead of the 96 DPI conversion that made the same number a third larger than on Linux and Windows. - Every bundled icon moves to a single 24 by 24 outline family at stroke 1.5, workspace folders use the Unpeel folder icons, rows line up on one baseline, and the right panel closes with a layout-sidebar-right icon rather than a cross.
- The attention queue moves from
Cmd/Ctrl+Shift+AtoCmd/Ctrl+Shift+U, freeing the chord every terminal uses for select all. The diff dock maximize shortcut moves toCmd/Ctrl+Alt+M. - The pinned
libghostty-vtarchive moves to Ghostty0c2a290d, which adds theghostty_search_*API the terminal search now uses.
Removed
- Review mode. The Changes and Files tabs of the Agents dock replaced the Review grid, so the mode switch, the diff pane grid, the Workspaces and Changes rails, the diff sidebar and the review keybindings are gone, with the pricing, session usage scans, attribution ranking and worktree diff stats nothing used anymore. The sidebar footer is a single Settings row.
- The profile menu, unreachable since its title bar trigger went, and the theme picker overlay it opened. Theme selection stays in Settings > Appearance; the Files and Help menus move to the title bar.
Fixed
- A pane no longer flashes pure black for about half a second at startup. The placeholder grid shown before the engine's first frame carried an opaque black background instead of the theme background. Measured on a release build with a full-screen capture harness: 21.7 to 23.4 percent of the screen was black from 789 ms to 1301 ms before, 0.0 percent across every frame after.
- Pasting frames the text with
ghostty_terminal_pasteon the runtime thread, so the bracketed paste markers and the newline conversion come from the parser's state at that instant instead of a stale mirror of mode 2004. Mode transitions and each paste frame are traced at debug level underpaneflow::terminal::ghostty. Refs
#65. - Terminal
bright_blackis legible again in Paneflow Dark and Cursor Dark: it sat at APCA Lc 13 against the normalized#181818surface, so the secondary text agents print in that slot was unreadable. The palette value now carries Lc 26. Ctrl+Shift+Fopens the terminal search again on Windows and Linux, where the diff dock maximize shortcut shadowed it, and macOS also getsCmd+F. A test fails the build whenever a global default shares its resolved chord with any other default. Refs
#63.- Terminal search highlights stay on their text while the program keeps writing, and the match count follows the buffer. Plain-text queries run on Ghostty's incremental search, which tracks matches across output, resize, reflow and history pruning; regex queries keep Paneflow's scanner and are re-anchored as the scrollback grows. Refs
#63. - A session listing no longer carries every session's launch environment, which pushed the response past the 64 KiB control frame around fifteen sessions and blinded the sessions sidebar and the worktree removal card. The host no longer refuses a seventeenth attached pane, and a session left running is never forgotten.
- Terminal row layouts are reused across frames and interactive output is prioritized over bulk output; the Ghostty search path and its keyboard navigation shed redundant work.
Upgrade notes
session.jsonmoves to schema version 3. A version 2 file migrates in place on first launch: every workspace gets an id and every terminal surface a session reference, without touching tab order, titles, directories, worktree bindings or detached-window layout. Recorded agent commands stay metadata that restore never re-runs, and the host records under<home>/host/are a new directory older builds never read.- Review mode is removed. Old session files still load: retired keys are ignored and a detached pane saved by Review is dropped instead of the whole session. Review keybindings no longer resolve.
- Two defaults change:
unfocused_pane_opacityfrom0.7to1.0andterminal.ligaturesfromfalsetotrue. Set the previous values explicitly to keep the old rendering. Two keys are added,on_quit(defaultask) andsidebar_ended_sessions(default5), plusterminal.scrollbar(defaulttrue). No key is removed or renamed. - Two default chords move: the attention queue to
Cmd/Ctrl+Shift+Uand the diff dock maximize toCmd/Ctrl+Alt+M. Custom bindings are untouched. - Every package now installs
paneflow-hostbesidepaneflow. The tar.gzinstall.shplaces both; a hand-made install that copies only the desktop binary opens every pane dead, because the desktop resolves the host from its own directory. - The first launch after the update retires any host process left from 0.15.x. Sessions that were running under a 0.16.0 host survive a later update as manifests and restart as fresh shells; their child processes do not survive, and the updater says how many it is about to end.
- On Windows the ConPTY runtime is installed under
<home>/cache/conpty/on first use. The terminal engine stays libghostty on every target, and the IPC and MCP method names and thepaneflowCLI verbs are unchanged.
Install and validation
Every package grows with the host binary and, on Windows, the pinned ConPTY runtime. Download sizes, 0.15.1 to 0.16.0:
| Artifact | 0.15.1 | 0.16.0 |
|---|---|---|
x86_64 .deb |
17.8 MiB | 19.3 MiB |
x86_64 .rpm |
18.0 MiB | 19.7 MiB |
| x86_64 AppImage | 31.3 MiB | 33.9 MiB |
aarch64 .dmg |
29.9 MiB | 32.3 MiB |
| x86_64 MSI | 27.5 MiB | 30.7 MiB |
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 35366739041.
Legs that passed:
- Build:
x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,aarch64-apple-darwin,x86_64-pc-windows-msvc - Release test gate on Linux x86_64:
cargo fmt --check,cargo clippy --workspace --locked -- -D warnings,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.15.1...v0.16.0
贡献者
v0.15.1
Instant startup and a welcome screen
Paneflow 0.15.1 opens straight into the workspace. The "Paneflow" splash and its 900 ms floor are gone, and the two synchronous stalls that followed it, the singleton guard's named-pipe retries on Windows and the which walk over seventeen agent binaries on the render thread, are off the critical path. On the reference Windows machine the first presented frame moves from about 1.5 s to 0.3 s.
With nothing to restore, that first frame is now a welcome screen instead of a workspace fabricated from the launch directory: open a folder, clone a repository, or reach every action through a new command palette on secondary-shift-p. The file tree colors its rows by git status, a toast announces each update with a link to its release notes, Ctrl+V pastes into terminals on Windows and Linux, and Muse Code and DeepSeek Harness join the built-in agents with live sidebar state.
No configuration key is removed and none changes meaning. The session format, the terminal engine (libghostty on every target), the packaging contract, the IPC and MCP method names, and the paneflow CLI are unchanged. One habit changes: paneflow launched from a terminal inside a project opens the welcome screen, not that project.
Behavior changes
The window opens in under a third of a second
Three fixes, each measured with the new startup probe (release build, medians of 10 launches on a seeded home, Windows 11):
| Scenario | Splash removed only | 0.15.1 |
|---|---|---|
| Welcome screen (empty session) | 448 ms | 292 ms |
| Restored session, 3 workspaces with one terminal each | 450 ms | 299 ms |
Add the 900 ms splash floor to the left column for what 0.14.0 shipped.
- On Windows the singleton guard paid three connect attempts and two 70 ms sleeps on every launch when no other instance was running. A missing named pipe now returns at once; the retry loop stays for the rebind race it was written for.
is_installedfor the seventeen agent CLIs walkedPATHon the render thread every 2 s, from the welcome screen, the pane palette, the launch pad, and the Agents settings. The boot warms that cache off-thread and a stale cache refreshes on its own thread, so reads never block. The welcome screen reads "Looking for agent CLIs on this machine." while the first scan runs.- The splash is removed and the app mounts as the window root.
PANEFLOW_STARTUP_TRACE=<file> makes a release build write its mark timeline at the first presented frame and quit; scripts/bench-startup.sh (or .ps1) runs that probe against two seeded homes and compares with bench/startup-baseline.json. What remains is inside GPUI's Windows platform init (D3D11CreateDevice, about 148 ms, and the system font collection scan, about 70 ms), tracked upstream.
paneflow from a project directory opens the welcome screen
0.14.0 fabricated a workspace from the directory Paneflow was launched in, so a first run looked like a session that had always existed. 0.15.1 opens the welcome screen when there is no session to restore. To open the project you are standing in, pick it from Get started > Open folder, or from the recent workspaces once it has been opened once. A restored session is unaffected.
Ctrl+V pastes into the terminal on Windows and Linux
Ctrl+V now invokes paste in terminal panes instead of reaching the shell or the TUI, so tools that finish dictation by simulating Ctrl+V (Superwhisper and the like) land their text in the pane. Ctrl+Shift+V keeps working on every platform, Cmd+V stays the macOS binding, and Ctrl+C still reaches the shell. Settings shows the native shortcut and falls back to Ctrl+Shift+V when it is disabled or reassigned. To hand Ctrl+V back to the program in the pane:
{
"shortcuts": { "ctrl-v": "none" }
}
Added
Welcome screen, recent workspaces, and an always-usable surface
With no session to restore, Paneflow opens a welcome screen on the pane card surface: a Get started section (Open folder, Clone repository, Command palette), then the recent workspaces or a Configure section, then one line naming the agent CLIs found on the machine. Recent workspaces answer secondary-1 to secondary-5, live in ~/.paneflow/recents.json, cap at eight, and drop folders that no longer exist. An empty Workspaces rail states the same choice in 192 px.
A workspace with no pane installs the pane palette on the tab it already owns, so a new workspace lands on a usable surface rather than a blank panel; the palette cannot be closed while it is the workspace's only surface.
Command palette
secondary-shift-p opens a palette listing every action that needs no key context, with its Settings description and its binding, filtered on whole words.
Clone repository
A quick pick under Get started. A repository URL typed in becomes a Clone <url> row; Clone from GitHub lists the repositories gh repo list returns, filtered as you type. A GitHub target (a github.com URL, an owner/name shorthand, or a row of that list) clones through gh repo clone, which carries gh's credentials for private repositories and adds an upstream remote on a fork. When gh is missing or signed out, Paneflow falls back to git clone and expands the shorthand to an HTTPS remote; every other host clones with git. While a clone runs the modal shows the target, a percentage, git's phase, and its throughput.
Clone URLs that start with a dash or use the ext:: transport are refused, the URL is passed after --, and the destination name rejects ., .., and empty tails.
The file tree is colored by git status
Ported from Zed's project panel. The row label takes the version control hue in Zed's order: conflict, then deleted, then modified, then created for a staged addition or an untracked path. A file shows a status letter at the right of the row: ! for a conflict, U for untracked, D and M for the worktree side before the same two for the index, A for a staged addition. A directory shows a dot summing every descendant, so a collapsed tree still tells where the changes are. Colors come from the vc_* roles of the active theme, so the decoration follows all eight bundled themes.
The status read runs on the files worker thread at the existing scan debounce, never on the render thread, and the worker now watches the resolved git directory, so a git add, a commit, or a checkout run by an agent in another pane recolors the tree.
Release notes toast after an update
The first launch of a newer version raises a toast in the bottom right: "Updated to Paneflow 0.15.1", a View release notes button, and a close button. The button, or a click anywhere on the surface, opens https://paneflow.dev/docs/changelog/v0.15.1 in the default browser. It is the one toast that never auto-closes; only the close button, the surface click, or another queued toast removes it. Detection compares a version marker at <paneflow home>/cache/last-launched-version with the running version, so it covers every update path: in-app self-update, DMG, AppImage, tar.gz, and the apt, rpm, and Homebrew packages. Nothing shows on a first install or a downgrade.
Muse Code and DeepSeek Harness
Two more built-in agents with live state. The Muse Code tab-bar button runs muse, muse_button_visible controls it, and the shim wraps muse so the sidebar spins while a turn runs, names the active tool, shows the approval wait, and settles on Done or Error. Muse Code runs its hooks with a cleared environment, so the shim registers a Paneflow-owned hook file through managed_hooks_path in ~/.config/muse/settings.json and forwards the PANEFLOW_* variables through managed_hooks_env_vars; both entries are removed when the last session exits, and a settings file that already points managed_hooks_path elsewhere is left untouched. Muse Code 1.2 does not run its Stop hook on the Meta provider, so the turn end is also taken from PostLLMCall.
The DeepSeek Harness button runs dsh --profile tui, deepseek_harness_button_visible controls it, and the shim boots dsh through a patch overlay that mounts the harness's own @deepseek-ai/dsh-hooks-claude-code bridge. The overlay and its hook config live under the harness home and are removed when the last session exits; dsh plugin, --help, --version, and the config dumps reach dsh untouched. A harness install without the bridge package falls back to start, exit code, and end.
Fixed
- Agent profile environment variables are readable and expand shell-style names. The Environment variables control in Settings > Agents takes the full width of the editor, and the remove button sits beside the value instead of over its last characters. A value can use
$NAME,${NAME}, or%NAME%alongside the leading~, each resolved against Paneflow's own environment, with the resolved value shown under the row as you type. A name your environment does not define is refused on save instead of silently pointing the agent at a junk path. Note thatterminal.envstill passes values verbatim; the expansion applies toagent_profiles.*.env. - On Windows, "Open in File Explorer" opens the workspace directory, including paths with spaces; it used to pass Explorer a combined
/select,<path>argument. Editor and folder launches run detached from Paneflow's process job and standard streams, off the UI thread, and the log records the resolved editor, arguments, PID, and exit status, with a toast on a failed launcher. - Worktree paths reported by
git worktree listare translated back onto the Paneflow root they belong to. A worktrees root reached through a symlink (/varto/private/varon macOS) or a Windows 8.3 short name (RUNNER~1) used to make Paneflow plan a duplicate checkout for a branch it had created a moment earlier, trip the "exists but holds another branch" guard, and lose track of a managed worktree on session restore. - The update toast spells Paneflow with a lowercase f.
0.15.1 is the first published build of this line: the v0.15.0 tag stopped at the Windows MSI smoke test, which launched a fresh install and waited for a terminal backend diagnostic that the new welcome screen never emits. The smoke test now seeds a one-terminal session before launching. No application code differs between the two tags apart from the version string.
Upgrade notes
- Two configuration keys are added, both default
true:muse_button_visibleanddeepseek_harness_button_visible. No key is removed or renamed. - Ctrl+V is now bound to paste on Windows and Linux. Restore the previous behavior with
"shortcuts": { "ctrl-v": "none" }. ~/.paneflow/recents.jsonand~/.paneflow/cache/last-launched-versionare new files under the Paneflow home. A 0.14.0 build ignores both.- The session schema, the terminal engine, the packaging contract, the IPC and MCP method names, and the
paneflowCLI are unchanged. Downgrading to 0.14.0 works.
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 34786328605.
Legs that passed:
- Build:
x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,aarch64-apple-darwin,x86_64-pc-windows-msvc - Release test gate on Linux x86_64:
cargo fmt --check,cargo clippy --workspace --locked -- -D warnings,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.14.0...v0.15.1
贡献者
早期版本
- v0.14.0One home directory and managed worktrees
- v0.13.0Tabs that name themselves
- v0.12.0Review rails and word diffs
- v0.11.0Worktrees per tab, faster terminal
- v0.10.0One terminal engine everywhere
- v0.9.0Workspace tabs and dock editor
- v0.8.2Windows title bar material fix
- v0.8.1Ghostty becomes the Windows terminal engine
- v0.8.0Ghostty becomes the Linux terminal engine
- v0.7.11Workspace navigation and terminal polish
- v0.7.10Sidebar title containment
- v0.7.9Windows updater recovery
- v0.7.8
- v0.7.7
- v0.7.6
- v0.7.5
- v0.7.4
- v0.7.3
- v0.7.2
- v0.7.1
- v0.7.0
- v0.6.10
- v0.6.9
- v0.6.8
- v0.6.7
- v0.6.6
- v0.6.5
- v0.6.4-rc.1
- v0.6.4
- v0.6.3
- v0.6.2
- v0.6.1
- v0.6.0
- v0.5.10
- v0.5.9
- v0.5.8
- v0.5.7
- v0.5.6
- v0.5.5
- v0.5.4
- v0.5.3
- v0.5.2
- v0.5.1
- v0.5.0
- v0.4.4
- v0.4.3
- v0.4.2
- v0.4.1
- v0.4.0Paneflow v0.4.0
- v0.3.9
- v0.3.8
- v0.3.7In-app diffs and agent branch reviews
- v0.3.6
- v0.3.5
- v0.3.4
- v0.3.3
- v0.3.2Terminal Threads, editable rename, auto-titled threads
- v0.3.1
- v0.3.0
- v0.2.17
- v0.2.16
- v0.2.15
- v0.2.14
- v0.2.13
- v0.2.12
- v0.2.11
- v0.2.10
- v0.2.9
- v0.2.8
- v0.2.7
- v0.2.6
- v0.2.5
- v0.2.4
- v0.2.3
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.7
- v0.1.6
- v0.1.5
- v0.1.4
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1.0
- screen-catalog-v3Screen rule catalog v3
- screen-catalog-v2Screen rule catalog v2
- screen-catalog-v1Screen rule catalog v1