You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changed
Vector identity no longer depends on the runtime. Switching GNO_LLAMA_GPU / NODE_LLAMA_CPP_GPU, the Bun version, the node-llama-cpp version or the CPU thread count reuses the existing vector partition and resumes its backlog when re-embedding up to 8 stored chunks reproduces their vectors (cosine >= 0.99 each; measured: Bun versions and thread counts bit-identical, GPU vs CPU >= 0.9993). The verdict is cached per partition and runtime. Existing indexes are re-keyed once without re-embedding: the most complete compatible partition becomes the runtime-independent one and the rest stay as shadow; an ambiguous tie keeps every partition and is reported. See Switching backend or Bun version.
A genuine fork is never silent: when a runtime cannot reproduce the stored vectors, gno embed states that it would build a separate partition, the full chunk count and a measured estimate, and requires confirmation (interactive prompt or --new-partition; --yes alone does not confirm). A confirmed partition is reused by later compatible versions of that runtime, and changing a vector-defining setting for a model that already has vectors needs the same confirmation. Queries from that runtime use lexical retrieval only, with a vector_runtime_incompatible warning.
gno status, gno doctor, REST /api/status, MCP gno_status and the SDK report embedding counts against the partition the calling runtime's queries read (same selection rule as retrieval, vectorRuntime) and list every vector partition (vectorPartitions) with state, chunk count, provenance such as CUDA, Bun 1.4.2, and the runtimes that read or cannot read it, so an incomplete shadow partition no longer reads as lost embeddings.
Remote callers no longer receive host absolute paths. A REST response to a caller that is not a same-host client (the localClient rule: loopback peer, loopback Host, no forwarding headers) and every Streamable HTTP MCP result omit source.absPath (search, vsearch, query, ask, get, multi-get, /api/doc), top-level absPath (capture and remember receipts, CAPTURE_SYNC_FAILED error details), similar[].absPath, and peek recent[].absPath; a gno:// resource read over HTTP names the collection-relative path on its source: line. Capture and remember errors for a file that was written but not indexed now name it by gno:// URI instead of its host path, on every surface. Identify and open results by uri plus the collection-relative relPath instead (/api/doc?uri=, /api/doc-asset?uri=, gno_get). The CLI, stdio MCP, the SDK, and the same-host Web UI keep absPath for Reveal and file-open. absPath is now optional in the mcp-capture-result, memory-remember, and peek schemas. See Host Paths and Remote Callers.
Added
gno status, gno serve --status, and gno daemon --status report background issues: a failing, parked, or overrunning background embed pass, or a detached resident that does not answer its status request. Each resident query is bounded to 500ms, so status never waits on a hung resident.
gno vec drop <partition> removes an abandoned shadow vector partition (legacy shadows included) the calling runtime does not read; status prints its hint for exactly those partitions, and every active partition, legacy included, is refused. gno vsearch from a runtime without a usable partition says vector search is unavailable and points to gno query / gno search or gno embed --new-partition.
Fixed
A resident gno serve / gno daemon no longer makes CLI writers fail with a raw database is locked: watcher syncs and background embedding now take the shared write lease (without waiting) and defer while a CLI writer holds it, so the CLI reports BUSY (exit 4) at worst.
gno serve --stop no longer escalates to SIGKILL when another process holds the database write lock; the resident caps its own SQLite busy wait at 500ms.
Background embedding no longer retries a failing pass every 30 seconds forever, and no longer drops a timed-out pass silently. Failed passes back off, park after 5 in a row, and are logged once per step.
Web UI: a tag save refreshes the document's tag list without a reload; a save whose response was lost says it may have completed and offers Retry save (the reload banner is kept for genuine outside changes); the home dashboard fits a 390px screen; and main Search snippets render highlights and drop Markdown escapes using the same renderer as session search.
Piped CLI output is no longer cut off at exit. When stdout or stderr was a pipe, output larger than the pipe buffer (for example gno search --json | jq or a subprocess reading through a pipe) was truncated to 8 KB or 16 KB, which left JSON consumers with invalid input. The CLI now flushes both streams before it exits, and a consumer that closes the pipe early (such as | head) still lets it exit promptly with the command's exit code.
spec/output-schemas/error.schema.json now lists every CLI error code, including BUSY (exit 4), so a schema-validating client no longer rejects a valid busy error. A contract test keeps the schema in step with the CLI's error codes.