diff --git a/.changeset/acp-agents-beta-stance.md b/.changeset/acp-agents-beta-stance.md deleted file mode 100644 index b39b8f72..00000000 --- a/.changeset/acp-agents-beta-stance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": patch ---- - -In-app agents ship as a beta. Every agent picker carries a "Beta" tag on its "In this app" section, and the agent catalog dialog is likewise marked. The sessions dock no longer defaults its "New" button to "Start an agent" before you've picked an agent — with none chosen it stays a neutral "New" that opens the picker, so starting an in-app agent is always an explicit choice. diff --git a/.changeset/acp-external-agents.md b/.changeset/acp-external-agents.md deleted file mode 100644 index c231f972..00000000 --- a/.changeset/acp-external-agents.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"@inkeep/open-knowledge": minor ---- - -Add in-app AI agent threads via the Agent Client Protocol (ACP). "Open with AI" now includes a "Start an agent" option that runs a coding agent (Claude, Codex, Gemini, Cursor, Copilot, OpenCode, and the rest of the ACP registry) inside OpenKnowledge itself, in both the desktop app and the browser. - -"Start an agent" is available from every launch surface: the sparkles popover, the file-tree and empty-space right-click menus, and as a selectable default in the Ask AI and create-project composers. Every agent gets OpenKnowledge's MCP tools: agents that support HTTP MCP connect to the running server directly, and all others are handed a stdio bridge, so tools like search, write, and edit work regardless of the agent's transport support. When the agent's own harness already has OpenKnowledge's managed MCP entry installed (a project or user config written by `ok init` or the desktop consent flow), the thread skips injecting a second copy — the agent connects through the installed entry instead of two same-named servers fighting over which one loads. The check matches on what the entry launches (OpenKnowledge's own server command), so a harness's own per-tool approval settings layered onto that entry don't defeat it. - -Threads show the agent's messages, its plan, tool calls with diffs, and permission prompts, and you approve or decline each sensitive action. Agent replies render as markdown — headings, lists, tables, links, and code blocks with a copy button — live while the text streams, closing half-finished formatting cleanly mid-stream instead of flashing raw `**` and backticks. Agents edit your notes through OpenKnowledge's own write path, so their changes are attributed to the agent and appear live in the editor. Each agent uses its own account and billing; nothing proprietary is bundled. Registry adapters install on first use and run as separate processes. For adapters that rely on an existing harness, OpenKnowledge detects locally installed Claude, Codex, Cursor, and OpenCode CLIs and offers those agents across the session dock, prompt composers, and Open with AI menus without overriding explicit choices or terminal defaults. - -Follow the file: while an agent works, the editor follows along, opening each document the agent creates, reads, or edits so you can watch the work happen live — including documents referenced through OpenKnowledge's own MCP tools (`write`, `edit`, `move`, and paths inside `exec` commands). Toggle it from the thread header (on by default). - -Switch agents any time: the thread dock's "+" lists every agent you've registered plus "Choose another agent…" to browse the catalog, so the first pick is never locked in. Reopening an empty sessions dock repeats that same preferred agent, CLI, or terminal choice, and the selected tab stays scrolled into view as the strip fills up. When an agent offers session settings — model, reasoning effort, fast mode, approval policy, or sandbox mode — they appear together in one labeled settings menu in the thread header (Agent Client Protocol session config options). - -Lifecycle and cost guarantees: closing a thread (or shutting down the server) kills the agent's entire process tree and waits for it to actually die, so a stuck agent can't keep running — and billing its account — invisibly after you close it. A turn still running with no window attached is asked to stop after 10 minutes and force-closed after 20. Stop shows "Stopping…" and, if the agent ignores the request, offers Force stop; a message that can't be delivered surfaces as a toast instead of vanishing; hiding the thread dock actually hides it. Long transcripts also render much more smoothly — events arrive in batches and the transcript updates incrementally instead of re-rendering the whole history on every streamed chunk. diff --git a/.changeset/acp-managed-runtime.md b/.changeset/acp-managed-runtime.md deleted file mode 100644 index 2e904a97..00000000 --- a/.changeset/acp-managed-runtime.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": minor ---- - -Agents that need `npx` or `uvx` now work even when those tools aren't installed. When you start an agent whose launcher requires Node.js (most agents — Claude, Codex, Gemini, and the rest of the npm-distributed catalog) or uv, and it isn't on your PATH, OpenKnowledge offers to download a private, pinned, checksum-verified copy for you and launches the agent through it — the same "just works" experience Zed provides, but nothing downloads without your explicit consent. The prompt appears inline in the thread with a size and source disclosure ("~45 MB from nodejs.org"), a progress bar while it installs, and a "Remember" option so you're asked at most once per machine. The runtime installs into `~/.ok/runtimes/` with its own private package cache, so it never touches the rest of your system, and declining still leaves you the manual-install path. This closes the gap where the desktop app — which bundles its own Node runtime but not npm — couldn't launch npm-distributed agents on a machine without a separate Node install. diff --git a/.changeset/acp-thread-history.md b/.changeset/acp-thread-history.md deleted file mode 100644 index b9d2be5c..00000000 --- a/.changeset/acp-thread-history.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@inkeep/open-knowledge": minor ---- - -Agent conversations are now saved and resumable. Every agent thread's transcript is persisted on disk as it streams (under the project's machine-local `.ok/local/threads/` — never committed, never shared), so closing a tab, an idle cleanup, or a server restart no longer destroys the conversation. - -A history menu in the thread dock lists past conversations (newest first); opening one shows the full transcript — messages, tool calls with diffs, permission decisions — with no agent process running. Closing a tab now always archives (the X is never destructive); permanent delete lives in the history menu behind a confirm. - -Type to resume: sending a message into an archived conversation respawns the agent and continues the same session where the agent supports it — via ACP `session/resume` when available (no history replay needed, since OpenKnowledge keeps its own transcript), falling back to `session/load` with the protocol's replay de-duplicated. Agents that can't resume (or whose session has expired on their side — Claude, for example, cleans its own sessions up after 30 days) keep the transcript intact and offer a one-click "New thread with this agent" instead. Document-edit attribution, write-flash, and per-session undo stay continuous across a resume. diff --git a/.changeset/acp-thread-rendering-parity.md b/.changeset/acp-thread-rendering-parity.md deleted file mode 100644 index a950299d..00000000 --- a/.changeset/acp-thread-rendering-parity.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@inkeep/open-knowledge': patch ---- - -Agent threads now render what the agent actually does. OK implements the ACP terminal surface, so agents can run commands through it and the transcript shows each command with its live output and exit code. Tool-call diffs are genuine line diffs (unchanged lines collapse) instead of full before/after dumps. A permission prompt that parks a turn now surfaces as an "awaiting approval" thread status in the tab strip, every prompt has an explicit Deny, and resolved prompts summarize as approved or denied by what was actually chosen. The composer footer shows the agent's reported context usage, and tool calls display their raw input. diff --git a/.changeset/acp-thread-titles.md b/.changeset/acp-thread-titles.md deleted file mode 100644 index 42ae064d..00000000 --- a/.changeset/acp-thread-titles.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@inkeep/open-knowledge": minor ---- - -Agent thread tabs now get useful titles. The title comes from what you actually typed to start the thread — not the boilerplate lead-in a launch adds — so a tab reads "Fix the login redirect" rather than the shared "You're an agent working inside OpenKnowledge…" preamble every launch opens with. Auto-titles also skip the filler most prompts open with ("please", "can you", "hey, could you take a look at…"), so the words that actually distinguish a conversation land in the tab instead of a shared prefix; when stripping would leave nothing meaningful, the raw prompt line is kept as before (non-English prompts always pass through untouched). Long titles now truncate at a word boundary, and hovering a tab shows the full title. - -Tabs are also renamable: double-click a tab to type a new name (Enter commits, Escape cancels). Manual titles stick — they survive archive and server restarts, win over auto-titling, and apply to archived conversations in the history menu too. diff --git a/.changeset/create-composer-enter-thread-mode.md b/.changeset/create-composer-enter-thread-mode.md deleted file mode 100644 index 0f2c1e0c..00000000 --- a/.changeset/create-composer-enter-thread-mode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": patch ---- - -Fixed the empty-state "Create" composer so pressing Enter launches whatever the Create button shows. Previously, when the composer was set to start an in-app agent ("Start an agent" / a registered agent), pressing Enter fell through to a different action instead of launching that agent — only a mouse click on the button worked. Enter now performs the same action as the button in every mode (in-app agent, terminal CLI, or desktop app agent), so the keyboard and pointer paths never diverge. Desktop builds also gain an opt-in `OK_FORCE_A11Y=1` launch flag that exposes the full web UI to the macOS accessibility tree, for VoiceOver and GUI-automation tooling. diff --git a/.changeset/follow-mode-flash-on-activation.md b/.changeset/follow-mode-flash-on-activation.md deleted file mode 100644 index e23d041a..00000000 --- a/.changeset/follow-mode-flash-on-activation.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": patch ---- - -Follow mode now flashes and scrolls to the agent's change even when it navigates you to the document *after* the write already landed — the common case that was silently doing nothing. Previously the scroll-and-flash only fired if the write arrived while you were already on that document; when following an agent across files, the tab would switch to each document and the edits would just "pop in" fully applied, with no highlight and no scroll. Agent writes now record which blocks they changed on the write-flash entry, so when follow mode brings a document into view the editor can still light up the changed section and scroll it into view. Writes you're already watching are unaffected (and never double-flash). diff --git a/.changeset/follow-mode-scroll-and-flash.md b/.changeset/follow-mode-scroll-and-flash.md deleted file mode 100644 index 2eda68c4..00000000 --- a/.changeset/follow-mode-scroll-and-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": minor ---- - -Follow mode now scrolls to where the agent is writing and flashes the exact text it changed. When you're following an agent (the thread's Follow toggle, on by default) and it writes the document you're viewing, the editor scrolls the changed region into view and briefly highlights it — so a section the agent appends to the bottom of a long document pulls the viewport down to it and lights up, instead of the change happening off-screen. The highlight targets only the bytes that actually changed (diffed from before/after), so a full-document rewrite that only appends a section flashes just that section, not the whole page. In-app agent-thread writes now drive the same write-flash the MCP agent writes always have. diff --git a/.changeset/graph-assembly-and-batch-follow.md b/.changeset/graph-assembly-and-batch-follow.md deleted file mode 100644 index 2ce3f4ef..00000000 --- a/.changeset/graph-assembly-and-batch-follow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": patch ---- - -The docked Graph tab assembles live while an agent builds a knowledge base: when pages land in a burst with the graph open, the whole project graph frames itself and grows in — new pages scale and fade in with a brief halo, new edges fade in, and nodes are colored by their `cluster:` frontmatter. Follow mode also now understands batch writes (`documents: [...]`), which previously produced no navigation at all — the editor sat still through entire builds; it now follows the agent to the most recent page in each batch. The graph's view choreography is entirely signal-driven, so the `graph_view` MCP tool is retired (one less tool in every agent's context) along with its view-command plumbing; the knowledge-base pack skill sheds its view-choreography instructions in favor of plain authoring guidance: link every page at creation and give related pages a shared cluster. diff --git a/.changeset/idle-shutdown-spares-live-servers.md b/.changeset/idle-shutdown-spares-live-servers.md deleted file mode 100644 index 052da4db..00000000 --- a/.changeset/idle-shutdown-spares-live-servers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@inkeep/open-knowledge": patch ---- - -Fix a stale server's idle shutdown killing the live one. When a leftover `ok start` process from an earlier session went idle, its cleanup blindly stopped whatever process was advertised in `ui.lock` — which, with the desktop app, is the live server itself (it serves the editor UI and advertises its own port there). The result was the whole workspace abruptly disconnecting mid-session — agent threads, unsaved cursors, everything — often looking like a random server crash. Idle shutdown now only stops the UI helper process it actually started, never an unrelated lock holder. diff --git a/.changeset/pre.json b/.changeset/pre.json index d2b45254..d16bb571 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -2,15 +2,15 @@ "mode": "pre", "tag": "beta", "initialVersions": { - "@inkeep/open-knowledge-docs": "0.0.31", - "@inkeep/open-knowledge-app": "0.36.0", - "@inkeep/open-knowledge": "0.36.0", - "@inkeep/open-knowledge-core": "0.36.0", - "@inkeep/open-knowledge-desktop": "0.36.0", - "@inkeep/md-conformance": "0.0.39", + "@inkeep/open-knowledge-docs": "0.0.32", + "@inkeep/open-knowledge-app": "0.37.0", + "@inkeep/open-knowledge": "0.37.0", + "@inkeep/open-knowledge-core": "0.37.0", + "@inkeep/open-knowledge-desktop": "0.37.0", + "@inkeep/md-conformance": "0.0.40", "@inkeep/open-knowledge-native-config": "0.0.0", "@inkeep/open-knowledge-plugin": "0.3.1", - "@inkeep/open-knowledge-server": "0.36.0" + "@inkeep/open-knowledge-server": "0.37.0" }, "changesets": [] } diff --git a/.changeset/unified-sessions-dock.md b/.changeset/unified-sessions-dock.md deleted file mode 100644 index 0192e991..00000000 --- a/.changeset/unified-sessions-dock.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@inkeep/open-knowledge": minor ---- - -Fold agent threads into one unified sessions dock. Terminals and in-app AI agents now live as tabs in a single dock instead of two competing right-edge columns — one tab strip, one reveal tab, one ⌘J toggle, one mental model. A shell and an agent are just tabs of a different kind: each carries a kind icon (a shell glyph, or the agent's avatar with a live status dot), and reorder, activate, rename, and close work the same across both, with behavior dispatched by kind (closing a terminal kills its shell; closing an agent archives the conversation, recoverable from history). - -The dock is now host-agnostic: it renders in the browser too (agent tabs only there), so web users get the same docked, resizable, right-or-bottom placement the desktop terminal already had. The "New" split button merges every launch into one menu — your registered agents, "Choose another agent" to browse the catalog, and (on desktop) every CLI plus a bare terminal — and its primary button repeats your last pick across all three families. Launching an agent from an "Open with AI" menu opens a tab in this one dock and reveals it automatically. Conversation history moves with it: a history menu next to "New" (and a chooser on an empty dock) reopens or permanently deletes past conversations, so closing a thread archives it rather than losing it. - -A full renderer reload now restores the dock's interleaved tab order and which tab was active, alongside the terminals and agent threads it already recovered. The standalone macOS terminal window is unchanged (terminals only). No settings, shortcuts, or stored preferences change. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 18495de1..ff0b969c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,11 @@ # @inkeep/open-knowledge-docs +## 0.0.32 + +### Patch Changes + +- @inkeep/open-knowledge-core@0.37.0 + ## 0.0.31 ### Patch Changes diff --git a/docs/package.json b/docs/package.json index b092c187..82003559 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@inkeep/open-knowledge-docs", - "version": "0.0.31", + "version": "0.0.32", "license": "GPL-3.0-or-later", "private": true, "packageManager": "pnpm@10.33.0", diff --git a/packages/app/package.json b/packages/app/package.json index 3a3cc60f..8da46778 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@inkeep/open-knowledge-app", - "version": "0.36.0", + "version": "0.37.0", "license": "GPL-3.0-or-later", "private": true, "type": "module", diff --git a/packages/cli/package.json b/packages/cli/package.json index df6ba0c0..b3ba445a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@inkeep/open-knowledge", - "version": "0.36.0", + "version": "0.37.0", "license": "GPL-3.0-or-later", "private": false, "type": "module", diff --git a/packages/core/package.json b/packages/core/package.json index b0b56698..ad351479 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@inkeep/open-knowledge-core", - "version": "0.36.0", + "version": "0.37.0", "license": "GPL-3.0-or-later", "private": true, "type": "module", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 46fca430..ec033540 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@inkeep/open-knowledge-desktop", "productName": "OpenKnowledge", - "version": "0.36.0", + "version": "0.37.0", "license": "GPL-3.0-or-later", "homepage": "https://openknowledge.ai", "author": { diff --git a/packages/server/assets/skills/discovery/SKILL.md b/packages/server/assets/skills/discovery/SKILL.md index 1f22bd3f..36f9326f 100644 --- a/packages/server/assets/skills/discovery/SKILL.md +++ b/packages/server/assets/skills/discovery/SKILL.md @@ -3,7 +3,7 @@ name: open-knowledge-discovery description: "Read when the user asks what OpenKnowledge is, wants to install it on a repository, wants to share an OpenKnowledge project with collaborators, or asks how `ok init` / `ok cowork` / OK Desktop set up a project. Do NOT load to perform OpenKnowledge reads/writes — the runtime guidance for editing markdown inside an initialized OK project ships as a separate project-local skill at `.claude/skills/open-knowledge/` whenever `ok init` runs. If the user appears to be editing markdown inside a `.ok/` project and this is the only OK skill loaded, advise them to re-run `ok init` to install the project-local skill." compatibility: "Any agent host — no MCP server required. Pure discovery + install guidance." metadata: - version: "0.36.0" + version: "0.37.0" author: "Inkeep" repository: "https://github.com/inkeep/open-knowledge" --- diff --git a/packages/server/assets/skills/project/SKILL.md b/packages/server/assets/skills/project/SKILL.md index 26ff6cc1..42009338 100644 --- a/packages/server/assets/skills/project/SKILL.md +++ b/packages/server/assets/skills/project/SKILL.md @@ -3,7 +3,7 @@ name: open-knowledge description: "Authoritative agent-runtime contract for working inside an OpenKnowledge project — a markdown-CRDT knowledge base exposed over MCP. Use whenever reading, listing, searching, editing, or linting any `.md` or `.mdx` file in the project, and before any `mcp__open-knowledge__*` tool call (`exec`, `search`, `write`, `edit`, `lint`, and the rest). Installed by `ok init`, so its presence means this is an OpenKnowledge project and it governs every markdown file here. Covers the read/write tool surface, grounding and linking rules, folder/template conventions, the live browser preview, and the rule that OK's MCP tools — never native file tools — handle in-scope markdown." compatibility: "Claude Code, Claude Desktop, Claude Cowork, Claude.ai web. Requires OpenKnowledge MCP server + code execution." metadata: - version: "0.36.0" + version: "0.37.0" author: "Inkeep" repository: "https://github.com/inkeep/open-knowledge" --- diff --git a/packages/server/assets/skills/write-skill/SKILL.md b/packages/server/assets/skills/write-skill/SKILL.md index 0786f105..40d006de 100644 --- a/packages/server/assets/skills/write-skill/SKILL.md +++ b/packages/server/assets/skills/write-skill/SKILL.md @@ -3,7 +3,7 @@ name: open-knowledge-write-skill description: "Use when the user wants to create, author, write, or design a new Agent Skill (a SKILL.md) — for OpenKnowledge or for their editors — including requests like 'help me write a skill', 'make a skill that…', 'turn this workflow into a skill', or improving an existing skill's triggering and discipline. Also use when capturing reusable agent guidance that should live as an installable skill rather than a one-off prompt. Covers choosing scope (project vs global), the SKILL.md frontmatter contract, progressive-disclosure structure, evaluating the skill, and installing it into the user's editors." compatibility: "OpenKnowledge project recommended (uses the `write` / `edit` / `install` MCP verbs). Authoring + validation are pure file ops; live preview + eval want a running server (`ok start`)." metadata: - version: "0.36.0" + version: "0.37.0" author: "Inkeep" repository: "https://github.com/inkeep/open-knowledge" --- diff --git a/packages/server/package.json b/packages/server/package.json index f29241b5..dc450753 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@inkeep/open-knowledge-server", - "version": "0.36.0", + "version": "0.37.0", "license": "GPL-3.0-or-later", "private": true, "type": "module",