Skip to content

v0.65.1

Choose a tag to compare

@inkeep-internal-ci inkeep-internal-ci released this 29 Aug 00:17

Point release over v0.65.0: the current stable plus 7 applied commit(s), isolated from the changes still soaking on main.

Applied: c54a145, 9104ce4, 22c374c, d1eda6a, fdb79d6, f73e964, fbb4ab9

Patch Changes

  • Fixed dragging the divider of a right-docked Terminal on Linux, which closed the column instead of resizing it. The workaround of using the bottom dock is no longer needed.

    The resize library treated any pointer event that left the window mid-drag as a full-width jump rather than as the distance the pointer had actually travelled, and a column that can be dragged shut reads a full-width jump as "shut". Electron 43 was the version that started emitting such an event on Linux, but the misreading was there all along, so the fix is to measure the drag from where it started no matter what interrupts it.

  • OKF provenance timestamps are now read as ISO 8601 datetimes carrying an explicit UTC offset, which is what OKF v0.2 §5 asks for. This changes the okf lint plugin in both directions, and one of the two is a tightening.

    • Documents that already follow OKF v0.2 stop warning. stale_after, usage_window.from, usage_window.to, and each sources[] entry's last_modified plus its own window bounds previously accepted only a bare YYYY-MM-DD calendar date, so a conformant value such as 2026-09-23T00:00:00Z was reported as a frontmatter-provenance warning. It no longer is.
    • Documents still written with date-only values start warning. A value such as stale_after: 2026-09-23 now reports one frontmatter-provenance warning, because the format now asks for an explicit offset. The remedy is to write it: stale_after: 2026-09-23T00:00:00Z. A datetime carrying no offset (2026-09-23T00:00:00) is rejected for the same reason, and the warning now names the shape to write rather than only the schema keyword.

    Why now. OKF revised §5 in place on 2026-08-21, adding "Every timestamp-valued key in OKF is an ISO 8601 datetime with an explicit UTC offset" and migrating every example in the spec, without bumping the version. Both revisions are labeled v0.2 and a document written to either declares okf_version: "0.2", so the declared version does not tell you which reading a document was authored against. The plugin now records the upstream commit its reading is pinned to.

    Other v0.2 checkers have not caught up yet. okf-conformance still warns on a stale_after that is not a bare YYYY-MM-DD, which is the pre-revision wording of §5.5, so the two tools currently disagree about the same document. OpenKnowledge follows the current spec text and the format's own reference bundles, which now write stale_after: 2026-12-31T00:00:00Z.

    Log files are unaffected. OKF §9 governs the date's form in a log.md entry heading, not these frontmatter keys, and log-shape is unchanged: ## 2026-06-30 and ## 2026-06-30: Shipped v2 both stay conformant.

    The okf plugin ships disabled by default, so this reaches only projects that turned it on, and it emits advisory warnings rather than blocking anything.

  • Fixed a macOS auto-update failure that could leave OpenKnowledge missing from your Applications folder, and a "Check for Updates" dialog that named a version it was not going to install.

    The app arms an update at download time and installs it when you quit. Underneath, Squirrel arms it by launching ShipIt, which then waits — with no timeout of its own — for the app to exit. Downloading a newer build did not replace that pending request, it armed a second ShipIt beside the first; both then woke in the same instant at quit and raced the same bundle swap. The loser moved aside the bundle the winner had just installed, and when it could not put it back the app was left missing from /Applications until a later restore.

    On macOS a build already staged in this session is now installed as-is: newer offers are declined until the next session, including the freshness check on the "Relaunch now" click, and a manual check for updates says the staged build is ready rather than advertising the one it declined. Windows and Linux keep taking newer builds mid-session, because neither leaves a second installer armed: Windows runs whichever installer was downloaded last, and Linux arms nothing until you click relaunch.

    Bug reports also collect the numeric-suffixed ShipIt logs (ShipIt_stderr.log.1, .2, …). Squirrel falls back to those when the base log is not writable, which is what happens once the log is owned by root — precisely the machines where a failing install is worth diagnosing.

  • A bug report from a desktop freeze while opening a folder now names the step the open had reached.

    Opening a folder runs a long admission funnel: working out what the picked folder actually is, confirming an ancestor project, the first-open consent dialog and its content probe, git and content scaffolding, the editor and AI-tool writes, and finally the window itself. Until now that whole stretch reported one line as it started and one line once the window existed, and nothing in between. Every diagnostic along the way was a console.warn, which the packaged app discards. A session that stopped anywhere inside the funnel therefore produced a report indistinguishable from one that stopped anywhere else, which is why several reports of a freeze right after picking a folder could establish that the app had stopped and not where.

    The funnel now reports one line per decision it makes and per step that can run long, on both the first-open and existing-project paths: entering the admission resolution, the folder-size probe and the git-root lookup inside it, what the pick resolved to and whether it was promoted to an ancestor folder or a git root, each dialog being raised and the answer coming back, the waits for the Navigator to load and for git and content scaffolding, the artifact writes, and entering the window creation rather than only finishing it. A report now points at one step instead of the whole funnel. Creating a new project resolves the new folder's location through a separate admission pass before this funnel is reached, and that pass is not covered; the open that follows it runs this funnel and reports the steps that apply to it.

    The size probe that decides whether an oversized ancestor needs confirmation also reports its own failure through the same log. That failsafe quietly changes which branch the open takes, and it previously said so only on a sink the shipped app throws away.

    One line per step per open. The new lines carry folder names, enumerated states, counts and booleans rather than file contents. The probe failure is the exception, and deliberately so: it reports the error itself, whose message carries the path the probe could not read, because knowing which failure flipped the branch is the reason that line was promoted off the discarded sink in the first place.

  • Ephemeral single-file sessions (ok <file>, or opening a loose file in the desktop app) are now resilient when their server stops.

    • Single-file servers no longer idle-die under an open editor. A single-file window now holds its server alive for as long as the window is open, the same way a project window already did. Previously the single-file server inherited the 30-minute idle-shutdown default with nothing holding it up, so it could shut down while you were still editing.

    • "Restart server" now works for a single file. The restart action is routed to the correct server by the window that requested it, so restarting a stopped single-file session actually respawns it (before, it failed with "Couldn't restart the server"). Reopening a file whose server has stopped, or restarting it, converges to a single live window instead of leaving a dead one lingering.

    • The connection notice is honest, and the editor stops retrying a dead server. After a short grace with no reconnection the "keep this tab open, your edits will sync when reconnected" notice changes to a clear "the server stopped — restart it to reconnect," and the renderer stops re-authenticating against an unreachable server instead of looping until the tab is closed. A genuine transient blip still reconnects within the grace and shows "Reconnected." If the connection comes back but editing still doesn't resume, the notice says so ("Connected, but your edits aren't reaching the server yet") and keeps the Restart button, instead of leaving a stale claim on screen. Navigating during an outage — to another document, an image, a folder view — no longer silences the notice, and no longer restarts the grace behind it, so hopping between tabs can't win back the "will sync when reconnected" message from a server that has actually stopped. The notice updates the next time a document is in focus.

    Behavior change for self-hosted deployments: a loopback-bound server that declares itself externally reachable (server.allowExternal + server.externalUrl — the tunnel-to-loopback remote recipe) now defaults server.idleShutdown to off instead of 30m. The idle timer only counts editor WebSocket connections and cannot see remote MCP agents, so such a server previously tore down under a remote agent mid-session unless you set idleShutdown: off by hand. A plain loopback server with no external URL is unchanged (30m).

  • Runtime warnings from Codex now read as status instead of as part of the agent's answer. When Codex reports something mid-turn, such as skill descriptions being shortened to fit its context budget or invalid entries being ignored in config.toml, that text used to arrive in the transcript as ordinary assistant prose, so it looked like something the agent had said.

    Those warnings now get their own inline card at the point in the conversation where they arrived, carrying a "Warning" label, a warning glyph, and a border that stays visible under high contrast and forced colors, so the severity never depends on seeing the amber tint. The wording is the agent runtime's own, left as it was sent, and the answer that follows stays separate.

    The card is passive. There is no toast, no banner, no dismiss control, and nothing to retry. It lives in the transcript, so reopening a thread started on this version shows the warning again in its original place. Threads recorded before this version can still show an older warning as ordinary prose, because their transcripts were stored that way. A screen reader hears the opening line of each newly arrived warning once, in the order the warnings arrived, with the full text left on the card, while reopening a past thread stays silent and keyboard focus never moves.

    Only the exact warning format of Codex added from the agent registry is treated this way. Everything else renders exactly as it did before, including a reply that happens to begin with the word "Warning", a Codex you configured yourself, and warnings from other agents.

  • Documents and folders whose name contains #, ? or % are addressable again.
    Opening one used to mint a New Tab, drop the tab on restart, and leave the
    sidebar without a selection, because the route hash was built with the name
    unescaped and the first # was then read as a section anchor.

Downloads

Platform Architecture Download
macOS Apple Silicon OpenKnowledge-arm64.dmg
Windows x64 OpenKnowledge-Setup-x64.exe
Windows arm64 OpenKnowledge-Setup-arm64.exe
Debian / Ubuntu x64 OpenKnowledge-amd64.deb
Debian / Ubuntu arm64 OpenKnowledge-arm64.deb
Fedora / RHEL x64 OpenKnowledge-x86_64.rpm
Fedora / RHEL arm64 OpenKnowledge-aarch64.rpm