v0.69.0
Minor Changes
-
The success responses of
/api/agent-write,/api/agent-write-md,/api/agent-patch,/api/frontmatter-patch,/api/rollbackand/api/lint/fixremove the deprecated singularwarningfield. Write and rollback advisories use the pluralwarningsarray; every advisory the singular carried was already present inwarningson the same response, so a caller that reads the plural sees no change.For
/api/lint/fix, a durable fix whose post-write re-lint throws or loses a lint source that succeeded before the fix returnsdiagnosticsArePreFix: trueandreLintFailure: { reason, message }, wherereasonis the closed discriminantre-lint-threworsource-went-blindandmessageis the prose explanation. The reporteddiagnosticsand theirerrorCount/warningCountare the pre-fix set and may overstate what remains.fixedCountis 0 because the post-fix count could not be determined, not because nothing was fixed. Treat the fix as applied and re-runlintto confirm. Configuration and plugin warnings remain inwarnings; the endpoint no longer emits aRe-lint after fix failed:entry.The MCP lint text renderer is the reader this change migrates. The editor's Problems panel calls the same endpoint for
Fix all, discards the response body and re-audits the project when the sweep settles, so it never read the singular field and does not read the new flag.The MCP
lintrenderer recognizes the boolean, the typedreLintFailure, and legacy prefixed entries in eitherwarningsor singularwarningas pre-fix signals. It emitsdiagnosticsArePreFix: truefor any of these signals and puts a trimmed, non-empty explanation inreLintFailure.messagewith the discriminant inreLintFailure.reason, preferring the typed server failure over legacy entries; a legacy entry normalizes toreason: 're-lint-threw'. The flag can be present withoutreLintFailurewhen no non-empty message is available. Both the structuredwarningsarray and the human warning block exclude legacy prefixed entries and retain ordinary warnings.The reverse pairing is the one that degrades, and it is reachable because
ok mcpattaches to whatever server is already running rather than pinning one. Anok mcppublished before this release, pointed at a server from this release or later, reads only the removed singular field, so it loses the pre-fix header and reports the pre-fix diagnostics as remaining work. Upgrade both together.Restart the server and MCP client after upgrading to load both updated components.
ok stopdeclines while an editor window or agent is still connected, so close them first or runok stop --force, thenok start. Run it from anywhere inside the project;ok stopanchors to the enclosing project root. From outside, name the target withok stop <path>, orok stop allto stop every running server. If the desktop app is hosting the server, quit and reopen it.
Patch Changes
-
Stop the crash prompt firing for deaths that were not crashes.
Three bounds on the crash reporter:
- A minidump written inside the 30-second teardown that follows a recorded update handoff no longer arms a report invitation. The process was already committed to quitting so the installer could replace it, and a fault on the way out is not something the user can act on. A dump past that window still prompts, because an install can be in flight for up to 30 minutes and a fault inside it is the app failing on its own. Only a dump this app can positively claim is shadowed; one it cannot parse still prompts, as it does elsewhere in the crash reporter.
- A death the app can date to more than a week ago no longer prompts. The death is dated by the latest evidence the app was alive — the newest crash dump or the previous session's last heartbeat, whichever is later, ignoring a heartbeat that postdates the launch reading it — so an old dump left on disk can neither make a recent death look stale nor become the subject of the report. Before this, a sentinel prompted the same at twelve seconds and twelve days old, and an un-acknowledged dump re-armed the same prompt on every launch indefinitely. A session that left no heartbeat and no dump cannot be dated, so it is exempt and still prompts: sentinels written before 0.35 carry no heartbeat, and their boot time answers when the session started rather than when it died.
- An armed invitation nobody answered within 24 hours is dropped undelivered instead of waiting for the lifetime of the process. The bound is per process, not per crash: a relaunch offers the same crash again, because a new launch is a new chance to ask and a session that never showed the prompt should not silently lose it.
The report note now carries when the crash happened and how long ago whenever the app can date the death itself — never by borrowing a crash dump the same report says was not the cause — so a stale report is legible without decoding the boot id.
The relative-time wording it uses is now shared with
ok ps, which changes that command'sSTARTEDcolumn in two visible ways: an age under a minute reads30s agorather than30s, so no cell reads as a bare duration, and a start time that postdates now reads0s agorather than a negative duration. A stamp the command cannot parse still renders as the table's—.
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 |