diff --git a/.changeset/document-retries-its-first-sync.md b/.changeset/document-retries-its-first-sync.md new file mode 100644 index 000000000..6c9d495d4 --- /dev/null +++ b/.changeset/document-retries-its-first-sync.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +A document that fails its first sync now retries itself, at most three times, as soon as the connection reports it in sync, instead of holding the error screen for the life of the window. The stalled-sync warning also names the document it is about. diff --git a/.changeset/external-link-cue-marks-the-end.md b/.changeset/external-link-cue-marks-the-end.md new file mode 100644 index 000000000..373ed34bc --- /dev/null +++ b/.changeset/external-link-cue-marks-the-end.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +An external link now shows its leaves-the-workspace arrow once, at its end, even while a collaborator's caret sits inside it. A caret in the middle of a URL used to split the link on screen and give every piece its own arrow until you switched to Markdown source and back. diff --git a/.changeset/large-documents-stay-responsive.md b/.changeset/large-documents-stay-responsive.md new file mode 100644 index 000000000..e18d4bcb9 --- /dev/null +++ b/.changeset/large-documents-stay-responsive.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +Pausing while typing in a large document no longer freezes the editor: the word count is computed off the main thread, and lint markers update only the blocks that changed. diff --git a/.changeset/markdown-bridge-removed.md b/.changeset/markdown-bridge-removed.md new file mode 100644 index 000000000..d50d46057 --- /dev/null +++ b/.changeset/markdown-bridge-removed.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +The markdown bridge is gone from the server, so agent writes, disk saves and rollbacks do less work. Its four switches — `bridge.deferGuard`, `fixedPoint`, `preDrain` and `lossDetector` — are removed; `ok config migrate` strips them from an existing config. Eight bridge counters remain in the metrics payload at rest. diff --git a/.changeset/migrate-prunes-emptied-parent.md b/.changeset/migrate-prunes-emptied-parent.md new file mode 100644 index 000000000..ea6b15ce6 --- /dev/null +++ b/.changeset/migrate-prunes-emptied-parent.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +`ok config migrate` no longer leaves an empty parent behind. Clearing the last key under a mapping wrote back a husk — `bridge: {}` once the retired bridge switches were stripped — which validates but leaves a dead stanza in your config file. diff --git a/.changeset/one-undo-history.md b/.changeset/one-undo-history.md new file mode 100644 index 000000000..22cb241e3 --- /dev/null +++ b/.changeset/one-undo-history.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +Undo and redo now run one history across the rich-text and Markdown views, so a step taken in one view can be taken back from the other. Replacing a whole document — an agent rewrite, a Timeline restore — clears that history in both views. diff --git a/.changeset/server-names-dropped-upgrades.md b/.changeset/server-names-dropped-upgrades.md new file mode 100644 index 000000000..8e2e0ac8c --- /dev/null +++ b/.changeset/server-names-dropped-upgrades.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +The server now says when it drops a WebSocket upgrade. A request no handler claimed was closed without a word in the log, so a routing fault on the server and a connection fault in the browser looked identical. It is now logged with the paths the collaboration host serves. diff --git a/.changeset/single-source-of-truth.md b/.changeset/single-source-of-truth.md new file mode 100644 index 000000000..bc36ce289 --- /dev/null +++ b/.changeset/single-source-of-truth.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +The rich-text and Markdown views now read one copy of your document, derived on your own machine. An edit writes only the bytes of the blocks you changed, and collaborators' carets now show across the two views: someone typing in Markdown appears in rich text, and the reverse. diff --git a/.changeset/slash-command-undo-clears-its-query.md b/.changeset/slash-command-undo-clears-its-query.md new file mode 100644 index 000000000..010218b84 --- /dev/null +++ b/.changeset/slash-command-undo-clears-its-query.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +Undoing a slash command no longer leaves its query behind. Taking back a heading inserted from `/he` put the literal `/he` back into the paragraph, so you had to delete it by hand. The query and the block it produced are now retracted together. diff --git a/.changeset/trailing-space-saves-with-the-next-word.md b/.changeset/trailing-space-saves-with-the-next-word.md new file mode 100644 index 000000000..d79f4ef25 --- /dev/null +++ b/.changeset/trailing-space-saves-with-the-next-word.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +A space typed at the end of a line is no longer saved on its own: it is kept while your caret sits after it, and written to the file with the next word you type. Moving the caret away first drops it. diff --git a/.changeset/undo-outside-the-editors.md b/.changeset/undo-outside-the-editors.md new file mode 100644 index 000000000..6b86446f6 --- /dev/null +++ b/.changeset/undo-outside-the-editors.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +Undo and redo now reach the app's own history when focus sits outside both editors, after clicking the mode toggle for instance, and from the desktop Edit menu. They previously reached the browser's undo, which could skip an edit or put a deleted one back. diff --git a/.changeset/undo-survives-writes-while-away.md b/.changeset/undo-survives-writes-while-away.md new file mode 100644 index 000000000..4ab0ebb55 --- /dev/null +++ b/.changeset/undo-survives-writes-while-away.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +Returning to Markdown source keeps your undo history when something else wrote to the document while you were away — a collaborator typing, a change on disk, or a field in the **Properties** panel. diff --git a/.changeset/version-history-batches-rapid-writes.md b/.changeset/version-history-batches-rapid-writes.md new file mode 100644 index 000000000..9e637280c --- /dev/null +++ b/.changeset/version-history-batches-rapid-writes.md @@ -0,0 +1,5 @@ +--- +"@inkeep/open-knowledge": patch +--- + +Two writes to one file landing back-to-back can now share a single version-history entry, because the write path is fast enough that both fall inside the same save window. Nothing is lost: the file holds every write, and edits made seconds apart still get their own entry. diff --git a/.gitignore b/.gitignore index f1729668a..848f12dea 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ tmp/ .source/ .idea/ *.tsbuildinfo +__pycache__/ +*.pyc .vercel/ packages/content/ test-results/ @@ -29,6 +31,11 @@ blob-report/ .mirror-output/ /test-doc.md +# Local-only working notes for the single-CRDT migration. Not part of the public +# mirror and deliberately kept out of branch history; see the archive branch +# single-crdt-specs-archive for the versioned copy. +/feature-specs/ + # Env files (keep .env.example committed) .env .env.local diff --git a/docs/content/features/assets-and-embeds.mdx b/docs/content/features/assets-and-embeds.mdx index a91845d7c..cc1280b42 100644 --- a/docs/content/features/assets-and-embeds.mdx +++ b/docs/content/features/assets-and-embeds.mdx @@ -16,7 +16,7 @@ AI agents add assets through the MCP [`write`](/docs/reference/mcp) tool's `asse - **Images render inline** with click-to-zoom. Select one to align it left / center / right from the bubble menu, or set alt text and dimensions in its settings. - **Video and audio render native players.** The video block also takes YouTube, Vimeo, and Loom URLs and renders each host's own player. -- **PDFs and other documents** (`.docx`, `.zip`, `.csv`, …) insert a file attachment row — icon, name, size — linking to the file. To render pages in the doc, use the **PDF** block instead: a multi-page viewer with thumbnails, page navigation, and zoom; set `page=3` in its `anchor` setting to open at that page. +- **PDFs and other documents** (`.docx`, `.zip`, `.csv`, …) insert a file attachment row — icon and name — linking to the file. To render pages in the doc, use the **PDF** block instead: a multi-page viewer with thumbnails, page navigation, and zoom; set `page=3` in its `anchor` setting to open at that page. In the markdown source, dropped media serializes as `` / `