v0.58.6
Released Aug 19, 2026.
Patch Changes
- An ACP agent whose credentials expire mid-conversation now returns the transcript to the sign-in surface with the reauthentication buttons the initial connection advertised, instead of parking the failed turn behind the opaque "Your message didn't reach X" card that had no path back. The prompt-catch on the server treated every non-cancel rejection as a generic
promptfailure, so an auth-required rejection coming back fromsession/promptnever reached the same sign-in machinerysession/new's auth-required branch already had — mirroring that branch closes the gap, and the auth-error classifier now recognizes both the ACP standard-32000shape and the Claude Agent SDK's-32603+data.errorKind === "authentication_failed"shape it emits for mid-turn OAuth expiry. The still-live agent process stays alive across the sign-in, soauthenticateruns on the same connection the initial handshake set up. - A failed ACP prompt now offers an "Edit and resend" action that pulls the message text back into the composer, so the reader doesn't have to retype it to try again after changing a setting (a smaller context window, a different model, an added attachment). The card previously offered no action at all — the reasoning was that "sending it again IS the retry," but the composer had already cleared and the message text was only visible in the transcript row above the notice. Only the most-recent prompt failure carries the button (mirroring the Retry button's one-card discipline), and the transcript keeps the failed attempt as history. Text-only for now — attachments still need to be re-picked.
- Clean up OpenKnowledge Desktop state and updater caches during uninstall on macOS, Windows, and Linux.
- Make
ok openandok <file>use platform-native launchers on macOS, Windows, and Linux, and report launcher failures instead of exiting successfully. - OpenKnowledge now presents accurate platform guidance throughout the app and docs. Download links route through the platform picker, terminal copy only appears where the built-in terminal is available, keyboard hints work across operating systems, and new projects ignore common macOS, Windows, and Linux metadata files.
- Your home directory is no longer treated as a project by any entry point. Setting one up there ran
git initin your home, wroteconfig.ymlinto~/.ok/(OpenKnowledge's own user-global directory), and landed project MCP config and skills on your editors' user-global paths, since at home every editor's project config path IS its global config. The refusal now lives in the two scaffold writers every path goes through,ensureProjectGitandinitContent, so it coversok init,ok share publish --project-dir, the desktop's Open Folder confirm, the desktopok-initIPC, andPOST /api/local-op/ok-init. Picking your home folder in the desktop is refused before the setup dialog opens, which also covers reopening a home "project" left behind by the old bug. Andok deinitrefuses to run in your home directory, where it used to queue your entire user-global store for removal:global.yml,skills/,auth.yml,secrets.yml. - Publish an accurate npm README and searchable package metadata, with release-time checks for the README and licensing files.
- The right-side rail no longer paints an empty phantom column between the editor and the agents chat panel. Both the terminal-right column and the agents column are permanent members of the resizable group (a workaround for a react-resizable-panels layout-cache bug), so a proportional-layout tick could hand a hidden column non-zero
flexGrowin the paint window between itsdefaultSize={0}and the nextreclaimHiddenRailColumnclamp — visible as a large empty gap that made the chat panel look like it had drifted off to the side. Two changes close it. The hidden panel now setsmaxSize="0px"alongside itsdefaultSize={0}— RRP's own layout validator appliesMath.min(maxSize, size)last (after the collapsible halfway snap), so the outerdata-panelflex item is hard-clamped to zero share every redistribution pass and never wins the transient share the reclaim microtask was chasing. The preceding drag handle getsdisplay: noneso its 1px separator bar and tab-stop drop out of the flow while hidden. The panel stays registered with the group (its width state stays coherent for the next toggle-visible) and re-inflates from persisted width when it comes back.