feat(server): report version in /health response#636
Merged
Conversation
Add a `version` field (uteke-server crate version) to GET /health so HTTP clients can gate features on the actual server capability. This matters for remote deployments: Corin previously derived the uteke version from the local `uteke` CLI, which is meaningless when talking to a user-managed remote server that may be older or newer. With /health reporting version, clients can probe the server directly. Backward compatible β `version` is an added JSON field.
π Cora AI Code Reviewβ No issues found. Code looks good! Review powered by cora-cli Β· BYOK Β· MIT |
CI rustfmt wraps the >100-col println! to match the existing /list help-text convention; local fmt did not flag it (toolchain mismatch).
ajianaz
added a commit
that referenced
this pull request
Jul 10, 2026
- Workspace version 0.7.1 β 0.7.2 - Crate dependency versions synced (uteke-core, uteke-mcp) - Cargo.lock updated - README.md + README.id.md badges updated - AGENT.md version string updated - docs/cli-reference.md version string updated - docs/docker.md version tag updated - CHANGELOG: [Unreleased] β [0.7.2] with #634, #635, #636 Post-v0.7.1 fixes: - #634 POST /doc/list default limit 5 β 1000 - #635 defensive datetime parsing (corruption row crash fix) - #636 version field in /health response
ajianaz
added a commit
that referenced
this pull request
Jul 10, 2026
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links * feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579) Add partial document update endpoint to uteke-serve HTTP API. Changes: - documents.rs: update_document() β dynamic SET clause, only updates provided fields, always increments version, returns updated doc - lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds chunks + re-embeds if content changed - types.rs: DocUpdateRequest struct + resolve_doc_id_update helper - handlers.rs: POST /doc/update route with 404 for missing docs API: POST /doc/update { id | slug, title?, content?, tags?, metadata? } β Full document (version incremented) β 404 if not found Partial update semantics: only fields present in request are modified. Content changes trigger chunk rebuild (old chunks deleted, new ones embedded and indexed). Non-content updates (title, tags) skip re-chunking. Follow-up to Corin #139 β Corin DocumentsView will use this for Save. * fix: clippy β remove unused variables, use if-let instead of unwrap * feat: add CLI command for partial document updates (#589) - Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags - Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.) - Content changes trigger chunk rebuild; metadata/title-only skip it - Validates at least one field is provided - Parses --metadata as JSON string - Supports --file - for stdin content input - Document in docs/cli-reference.md with examples and flag table Closes #589 * feat(mcp): add uteke_doc_move tool (#585) - Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional) - Add exec_doc_move() calling uteke.doc_move() - Register in tools/list and tools/call dispatcher * feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586) MCP room coverage is now 8/8 (was 2/8). New tools: - uteke_room_create: create room with optional title/namespace - uteke_room_list: list rooms with optional namespace filter - uteke_room_delete: delete room (memories preserved) - uteke_room_stats: memory count, participants, activity - uteke_room_summary: topic clustering, decisions, highlights - uteke_room_document: structured document by memory type * style: fix cargo fmt for room_list executor * feat(mcp): add uteke_doc_update tool (#584) Add MCP tool for partial document update. Content changes trigger automatic chunk rebuild; title/tags/metadata-only updates skip rebuild. Closes #584 * chore: trigger CI re-run * chore: trigger CI re-run * ci: trigger Cora Review re-run * feat(mcp): add tag management tools β list, rename, delete (#587) - uteke_tags_list: list tags with counts, optional namespace filter + sort - uteke_tags_rename: rename tag across all memories atomically - uteke_tags_delete: delete tag from all memories Rebased on develop (includes room tools from PR #594). Closes #587 * feat(mcp): add pin/unpin tools for memory persistence (#588) Add uteke_pin and uteke_unpin MCP tools, matching existing POST /pin and POST /unpin HTTP endpoints. - tool_pin(): pin memory by ID, immune to decay/pruning - tool_unpin(): unpin memory, restore normal decay - Follows existing ToolResult pattern (is_error for not-found) - Uses uteke.pin()/unpin() from uteke-core Closes #588 * fix(core): add room tables to SCHEMA constant Add rooms and room_memories CREATE TABLE statements to SCHEMA so fresh databases get room tables without needing migration. Matches migration v2βv3 columns exactly: - rooms: id, title, namespace, created_at, updated_at - room_memories: room_id, memory_id, author, role, joined_at * deps: update crossbeam-epoch 0.9.18 β 0.9.20 Fixes RUSTSEC-2026-0204 (invalid pointer dereference in fmt::Pointer impl for Atomic/Shared). Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch No code changes β Cargo.lock only. * fix(ci): graceful sync workflow + add missing cargo audit ignores (#598) - project-sync.yml: exit 0 when PR has no linked closing issues and is not on the project board, preventing spurious failures under set -e - security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps Co-authored-by: ajianaz <ajianaz@users.noreply.github.com> * docs: fix 16 documentation gaps + update for v0.7.0 features (#582) - cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7 - mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note - docker: v0.6.7 tag, expand MCP tools table to full list - architecture: schema v10βv12, cross-process file lock, slim Docker model path - hermes: clarify Mode B deprecation scope, add memory-provider section - README/README.id: version badge v0.6.7 - AGENT.md: version 0.6.7, main branch protection updated * feat: add 'uteke update' self-update command (#581) Check for latest release on GitHub, compare against installed version, prompt for confirmation, download with checksum verification, and atomically replace the running binary. Features: - Detects current binary path automatically - OS/arch detection (linux/darwin, x86_64/aarch64) - Primary: parse GitHub 302 redirect (no API rate limit) - Fallback: GitHub REST API - SHA256 checksum verification from release assets - Archive path traversal protection (CWE-22) - Atomic rename replace (safe on POSIX) - New binary verification before swap - --yes flag for non-interactive / CI use - Already-up-to-date detection (skip download) - Missing dev headers warning for cargo-installed binaries Closes #581 * fix: rename update command to upgrade β fix 5 compilation errors - Rename Commands::Update β Commands::Upgrade to avoid collision with existing document update command (uteke doc update <id>) - Remove from AgingCommands (semantically wrong β self-update is not aging) - Change return type from Result<(), Box<dyn Error>> β Result<(), String> to match the dispatcher contract - Fix entry.path() bug: was calling .map_err() on Cow<Path> which is not a Result type - Fix all .into() calls that no longer compile with String error type - Rename update.rs β upgrade.rs module file * fix: move Upgrade variant from DocCommands to Commands enum Upgrade was accidentally placed inside DocCommands enum instead of the top-level Commands enum. This caused: - E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it) - E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it) * fix(security): fail-hard on checksum verification failure during upgrade Previously, uteke upgrade silently skipped SHA-256 checksum verification when the checksums file failed to download or the archive name was not found. This allowed a MITM attack to deliver a tampered binary. Changes: - Fail with Err when checksums download fails (network error or HTTP error) - Fail when archive checksum is missing from checksums file - Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass - Cleanup temp files on all failure paths Found by: cora scan (glm-5.2 via Bifrost) * feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606) Move Extractor from uteke-cli to uteke-core for server reuse. Add three new HTTP endpoints to uteke-serve: - POST /extract: LLM fact extraction + auto-store (1MB limit) - POST /import: JSONL import with re-embedding (5MB limit) - GET /export: JSONL export (optional ?namespace= filter) Extraction reads [extraction] config from uteke.toml. API key never accepted from request body (config/env only). Write token required for all three endpoints. Closes #604, #605, #606 * fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String CI caught E0308: if/else arms had incompatible types. Explicit annotate as String and use .to_owned() for the &str branch. * fix(server): import tiny_http::Header in handlers.rs E0433 in /export handler β Header::from_bytes used without import. * fix: resolve all clippy warnings - handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching) - handlers.rs: &ctx β ctx (needless borrow) - types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired) - extract.rs: #[allow(unused_imports)] on re-exports module * feat(server): maintenance + monitoring endpoints (#607 #608) Add 6 new HTTP endpoints to uteke-serve: Maintenance (#607): - POST /prune: TTL-based deprecated memory cleanup (dry_run support) - POST /consolidate: near-duplicate merging (dry_run support) - POST /aging: memory lifecycle management (status/preview/cleanup) Monitoring (#608): - POST /importance: recalculate importance scores - POST /orphans: find disconnected low-importance memories (read-only) - POST /rebuild-backlinks: rebuild referenced_by from forward edges All destructive endpoints require write token. /orphans allows read-only token (read-only query). Aging cleanup supports dry_run for safety preview. Closes #607, #608 * fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet * feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md - Add init_opencode and init_opencode_memory_provider functions (AGENTS.md-based integration, matching OpenCode's convention) - Refactor init_pi to use install_skill_md() helper instead of hardcoded inline SKILL.md content (-43 lines) - Update CLI help text to include opencode in --agent list - Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms, knowledge graph, pinning, dream pipeline, timeline, upgrade) - Fix escaped-quote bug in install_skill_md error messages Breaking: none. All changes additive. * refactor(core): remove namespace isolation from documents (#614) - Migration v12βv13: add author column, deprecate namespace on documents, migrate duplicate slugs across namespaces to slug-nsname format, create global unique slug index - Remove namespace params from all doc_* functions in lib.rs and store - Remove namespace fields from server request structs and MCP tools - Update CLI commands to not accept namespace args - Fix DocumentSummary initializer (add author field) - Fix recall_unified_* callers (remove stale Some(ns) from doc_search) - All consumers verified: CLI, server, MCP β zero namespace references remain * fix(tests): update schema version assertions to 13 - Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12 - Fix clippy warning: unused variable config in doc command * feat: project-aware memory tagging for noise-free recall Add automatic project detection and tag-based scoping to all memory operations. This prevents noise when recalling β agents only see memories relevant to the current project. Changes: - SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules, examples, and rationale for project:{name} tagging - pi-memory-provider extension: Auto-detect project from cwd and user prompt text, filter recall by --tags project:<name>, auto-tag remember commands with project:<name> - Hermes hook extract (external): Auto-detect project from session messages file paths, add project:<name> tag on auto-extract - Hermes hook recall (external): Auto-detect project from user_message, filter recall by --tags project:<name> Detection strategies: 1. File paths: /repos/<project>/ pattern matching 2. CWD: walk up from current directory to known project roots 3. Majority vote when multiple projects mentioned in session No Uteke binary changes required β all implemented via existing --tags flag support. * chore: release v0.7.0 prep β changelog, version bump, docs, dep versions - Cargo.toml: workspace version 0.6.7 β 0.7.0 - crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0 - CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7) - docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init - docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram - docs/multi-agent.md: add 'Documents Are Global' section - docs/docker.md: update version example to v0.7.0 * fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace - cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export, prune, consolidate, aging, importance, orphans, rebuild-backlinks) - cli-reference.md: fix doc list description (documents are global, not namespace-scoped) - CHANGELOG.md: add missing [0.7.0] comparison link - VitePress config.ts: fix document-commands anchor link (pre-existing broken) * fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata - fix(core): add retry logic (3 attempts, exponential backoff) around embedding generation to prevent silent vector index desync (#621) - fix(core): retry index.save() up to 3 times in both remember and forget to prevent orphan entries on transient I/O failures (#621) - fix(cli): read from stdin when content argument is '-' instead of storing literal dash string (#620) - fix(cli): change room recall default limit from 20 to 0 (all) since rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623) - fix(core): enrich room recall memories with author from room_memories table, injected into metadata JSON field (#624) Note: #622 (line numbers in recall JSON) is a data issue β content was stored with line numbers from read_file output. Not a code bug. * chore(deps): bump clap_complete from 4.6.6 to 4.6.7 Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](clap-rs/clap@clap_complete-v4.6.6...clap_complete-v4.6.7) --- updated-dependencies: - dependency-name: clap_complete dependency-version: 4.6.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> * chore: release v0.7.1 prep β version bump, changelog, docs - Workspace version 0.7.0 β 0.7.1 - Crate dependency versions synced - Cargo.lock updated - README.md + README.id.md badges updated - AGENT.md version string updated - docs/cli-reference.md version string updated - docs/docker.md version tag updated - CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618) * fix(ci): restore main branch in pull_request trigger PR #613 removed 'main' from CI pull_request branches, which blocks sync developβmain PRs from getting CI checks. Branch protection on main requires Check, Format, Clippy, Test, Build β impossible without CI trigger. Restore to [develop, main] matching v0.7.0 release behavior. * fix(server): raise /doc/list default limit from 5 to 1000 (#634) The document list endpoint reused the memory pagination default of 5. Clients building a full hierarchy client-side (e.g. Corin's doc tree) silently saw only 5 documents when omitting . Documents are not paginated like memories, so add a dedicated default_doc_limit() = 1000 and apply it to DocListParams only. * feat(server): report version in /health response (#636) * feat(server): report version in /health response Add a `version` field (uteke-server crate version) to GET /health so HTTP clients can gate features on the actual server capability. This matters for remote deployments: Corin previously derived the uteke version from the local `uteke` CLI, which is meaningless when talking to a user-managed remote server that may be older or newer. With /health reporting version, clients can probe the server directly. Backward compatible β `version` is an added JSON field. * style: wrap /health help line to satisfy rustfmt max_width CI rustfmt wraps the >100-col println! to match the existing /list help-text convention; local fmt did not flag it (toolchain mismatch). * fix(core): defensive datetime parsing β tolerate missing timezone in RFC3339 fields (#635) One corrupted row (updated_at without timezone suffix, e.g. '2026-07-09T19:53:45.493962') caused load_all() to crash with 'premature end of input' because chrono::DateTime::parse_from_rfc3339() requires the +HH:MM/Z suffix. Two-pronged fix: 1. Parsing: Add parse_datetime_flexible() that tries strict RFC3339 first, then falls back to appending +00:00 (assumes UTC) for ISO 8601 strings without timezone. Applied to created_at, updated_at (required fields) and last_accessed, valid_from, valid_until (optional fields). 2. Data repair: Add repair_datetime_timezones() as a post-migration consistency check in ensure_schema_version(). Idempotent β scans memories + documents for datetime strings missing timezone suffix and appends +00:00. Runs on every DB open, auto-fixes legacy data. Files changed: - store.rs: parse_datetime_flexible() + parse_datetime_opt() helpers, updated row_to_memory() to use them - schema.rs: repair_datetime_timezones() in ensure_schema_version() Co-authored-by: ajianaz <ajianaz@users.noreply.github.com> * chore: release v0.7.2 prep β version bump, changelog (#637) - Workspace version 0.7.1 β 0.7.2 - Crate dependency versions synced (uteke-core, uteke-mcp) - Cargo.lock updated - README.md + README.id.md badges updated - AGENT.md version string updated - docs/cli-reference.md version string updated - docs/docker.md version tag updated - CHANGELOG: [Unreleased] β [0.7.2] with #634, #635, #636 Post-v0.7.1 fixes: - #634 POST /doc/list default limit 5 β 1000 - #635 defensive datetime parsing (corruption row crash fix) - #636 version field in /health response * release: v0.7.1 β develop β main (#633) (#638) * docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links * feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579) Add partial document update endpoint to uteke-serve HTTP API. Changes: - documents.rs: update_document() β dynamic SET clause, only updates provided fields, always increments version, returns updated doc - lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds chunks + re-embeds if content changed - types.rs: DocUpdateRequest struct + resolve_doc_id_update helper - handlers.rs: POST /doc/update route with 404 for missing docs API: POST /doc/update { id | slug, title?, content?, tags?, metadata? } β Full document (version incremented) β 404 if not found Partial update semantics: only fields present in request are modified. Content changes trigger chunk rebuild (old chunks deleted, new ones embedded and indexed). Non-content updates (title, tags) skip re-chunking. Follow-up to Corin #139 β Corin DocumentsView will use this for Save. * fix: clippy β remove unused variables, use if-let instead of unwrap * feat: add CLI command for partial document updates (#589) - Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags - Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.) - Content changes trigger chunk rebuild; metadata/title-only skip it - Validates at least one field is provided - Parses --metadata as JSON string - Supports --file - for stdin content input - Document in docs/cli-reference.md with examples and flag table Closes #589 * feat(mcp): add uteke_doc_move tool (#585) - Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional) - Add exec_doc_move() calling uteke.doc_move() - Register in tools/list and tools/call dispatcher * feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586) MCP room coverage is now 8/8 (was 2/8). New tools: - uteke_room_create: create room with optional title/namespace - uteke_room_list: list rooms with optional namespace filter - uteke_room_delete: delete room (memories preserved) - uteke_room_stats: memory count, participants, activity - uteke_room_summary: topic clustering, decisions, highlights - uteke_room_document: structured document by memory type * style: fix cargo fmt for room_list executor * feat(mcp): add uteke_doc_update tool (#584) Add MCP tool for partial document update. Content changes trigger automatic chunk rebuild; title/tags/metadata-only updates skip rebuild. Closes #584 * chore: trigger CI re-run * chore: trigger CI re-run * ci: trigger Cora Review re-run * feat(mcp): add tag management tools β list, rename, delete (#587) - uteke_tags_list: list tags with counts, optional namespace filter + sort - uteke_tags_rename: rename tag across all memories atomically - uteke_tags_delete: delete tag from all memories Rebased on develop (includes room tools from PR #594). Closes #587 * feat(mcp): add pin/unpin tools for memory persistence (#588) Add uteke_pin and uteke_unpin MCP tools, matching existing POST /pin and POST /unpin HTTP endpoints. - tool_pin(): pin memory by ID, immune to decay/pruning - tool_unpin(): unpin memory, restore normal decay - Follows existing ToolResult pattern (is_error for not-found) - Uses uteke.pin()/unpin() from uteke-core Closes #588 * fix(core): add room tables to SCHEMA constant Add rooms and room_memories CREATE TABLE statements to SCHEMA so fresh databases get room tables without needing migration. Matches migration v2βv3 columns exactly: - rooms: id, title, namespace, created_at, updated_at - room_memories: room_id, memory_id, author, role, joined_at * deps: update crossbeam-epoch 0.9.18 β 0.9.20 Fixes RUSTSEC-2026-0204 (invalid pointer dereference in fmt::Pointer impl for Atomic/Shared). Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch No code changes β Cargo.lock only. * fix(ci): graceful sync workflow + add missing cargo audit ignores (#598) - project-sync.yml: exit 0 when PR has no linked closing issues and is not on the project board, preventing spurious failures under set -e - security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps * docs: fix 16 documentation gaps + update for v0.7.0 features (#582) - cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7 - mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note - docker: v0.6.7 tag, expand MCP tools table to full list - architecture: schema v10βv12, cross-process file lock, slim Docker model path - hermes: clarify Mode B deprecation scope, add memory-provider section - README/README.id: version badge v0.6.7 - AGENT.md: version 0.6.7, main branch protection updated * feat: add 'uteke update' self-update command (#581) Check for latest release on GitHub, compare against installed version, prompt for confirmation, download with checksum verification, and atomically replace the running binary. Features: - Detects current binary path automatically - OS/arch detection (linux/darwin, x86_64/aarch64) - Primary: parse GitHub 302 redirect (no API rate limit) - Fallback: GitHub REST API - SHA256 checksum verification from release assets - Archive path traversal protection (CWE-22) - Atomic rename replace (safe on POSIX) - New binary verification before swap - --yes flag for non-interactive / CI use - Already-up-to-date detection (skip download) - Missing dev headers warning for cargo-installed binaries Closes #581 * fix: rename update command to upgrade β fix 5 compilation errors - Rename Commands::Update β Commands::Upgrade to avoid collision with existing document update command (uteke doc update <id>) - Remove from AgingCommands (semantically wrong β self-update is not aging) - Change return type from Result<(), Box<dyn Error>> β Result<(), String> to match the dispatcher contract - Fix entry.path() bug: was calling .map_err() on Cow<Path> which is not a Result type - Fix all .into() calls that no longer compile with String error type - Rename update.rs β upgrade.rs module file * fix: move Upgrade variant from DocCommands to Commands enum Upgrade was accidentally placed inside DocCommands enum instead of the top-level Commands enum. This caused: - E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it) - E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it) * fix(security): fail-hard on checksum verification failure during upgrade Previously, uteke upgrade silently skipped SHA-256 checksum verification when the checksums file failed to download or the archive name was not found. This allowed a MITM attack to deliver a tampered binary. Changes: - Fail with Err when checksums download fails (network error or HTTP error) - Fail when archive checksum is missing from checksums file - Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass - Cleanup temp files on all failure paths Found by: cora scan (glm-5.2 via Bifrost) * feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606) Move Extractor from uteke-cli to uteke-core for server reuse. Add three new HTTP endpoints to uteke-serve: - POST /extract: LLM fact extraction + auto-store (1MB limit) - POST /import: JSONL import with re-embedding (5MB limit) - GET /export: JSONL export (optional ?namespace= filter) Extraction reads [extraction] config from uteke.toml. API key never accepted from request body (config/env only). Write token required for all three endpoints. Closes #604, #605, #606 * fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String CI caught E0308: if/else arms had incompatible types. Explicit annotate as String and use .to_owned() for the &str branch. * fix(server): import tiny_http::Header in handlers.rs E0433 in /export handler β Header::from_bytes used without import. * fix: resolve all clippy warnings - handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching) - handlers.rs: &ctx β ctx (needless borrow) - types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired) - extract.rs: #[allow(unused_imports)] on re-exports module * feat(server): maintenance + monitoring endpoints (#607 #608) Add 6 new HTTP endpoints to uteke-serve: Maintenance (#607): - POST /prune: TTL-based deprecated memory cleanup (dry_run support) - POST /consolidate: near-duplicate merging (dry_run support) - POST /aging: memory lifecycle management (status/preview/cleanup) Monitoring (#608): - POST /importance: recalculate importance scores - POST /orphans: find disconnected low-importance memories (read-only) - POST /rebuild-backlinks: rebuild referenced_by from forward edges All destructive endpoints require write token. /orphans allows read-only token (read-only query). Aging cleanup supports dry_run for safety preview. Closes #607, #608 * fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet * feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md - Add init_opencode and init_opencode_memory_provider functions (AGENTS.md-based integration, matching OpenCode's convention) - Refactor init_pi to use install_skill_md() helper instead of hardcoded inline SKILL.md content (-43 lines) - Update CLI help text to include opencode in --agent list - Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms, knowledge graph, pinning, dream pipeline, timeline, upgrade) - Fix escaped-quote bug in install_skill_md error messages Breaking: none. All changes additive. * refactor(core): remove namespace isolation from documents (#614) - Migration v12βv13: add author column, deprecate namespace on documents, migrate duplicate slugs across namespaces to slug-nsname format, create global unique slug index - Remove namespace params from all doc_* functions in lib.rs and store - Remove namespace fields from server request structs and MCP tools - Update CLI commands to not accept namespace args - Fix DocumentSummary initializer (add author field) - Fix recall_unified_* callers (remove stale Some(ns) from doc_search) - All consumers verified: CLI, server, MCP β zero namespace references remain * fix(tests): update schema version assertions to 13 - Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12 - Fix clippy warning: unused variable config in doc command * feat: project-aware memory tagging for noise-free recall Add automatic project detection and tag-based scoping to all memory operations. This prevents noise when recalling β agents only see memories relevant to the current project. Changes: - SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules, examples, and rationale for project:{name} tagging - pi-memory-provider extension: Auto-detect project from cwd and user prompt text, filter recall by --tags project:<name>, auto-tag remember commands with project:<name> - Hermes hook extract (external): Auto-detect project from session messages file paths, add project:<name> tag on auto-extract - Hermes hook recall (external): Auto-detect project from user_message, filter recall by --tags project:<name> Detection strategies: 1. File paths: /repos/<project>/ pattern matching 2. CWD: walk up from current directory to known project roots 3. Majority vote when multiple projects mentioned in session No Uteke binary changes required β all implemented via existing --tags flag support. * chore: release v0.7.0 prep β changelog, version bump, docs, dep versions - Cargo.toml: workspace version 0.6.7 β 0.7.0 - crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0 - CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7) - docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init - docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram - docs/multi-agent.md: add 'Documents Are Global' section - docs/docker.md: update version example to v0.7.0 * fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace - cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export, prune, consolidate, aging, importance, orphans, rebuild-backlinks) - cli-reference.md: fix doc list description (documents are global, not namespace-scoped) - CHANGELOG.md: add missing [0.7.0] comparison link - VitePress config.ts: fix document-commands anchor link (pre-existing broken) * fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata - fix(core): add retry logic (3 attempts, exponential backoff) around embedding generation to prevent silent vector index desync (#621) - fix(core): retry index.save() up to 3 times in both remember and forget to prevent orphan entries on transient I/O failures (#621) - fix(cli): read from stdin when content argument is '-' instead of storing literal dash string (#620) - fix(cli): change room recall default limit from 20 to 0 (all) since rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623) - fix(core): enrich room recall memories with author from room_memories table, injected into metadata JSON field (#624) Note: #622 (line numbers in recall JSON) is a data issue β content was stored with line numbers from read_file output. Not a code bug. * chore(deps): bump clap_complete from 4.6.6 to 4.6.7 Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](clap-rs/clap@clap_complete-v4.6.6...clap_complete-v4.6.7) --- updated-dependencies: - dependency-name: clap_complete dependency-version: 4.6.7 dependency-type: direct:production update-type: version-update:semver-patch ... * chore: release v0.7.1 prep β version bump, changelog, docs - Workspace version 0.7.0 β 0.7.1 - Crate dependency versions synced - Cargo.lock updated - README.md + README.id.md badges updated - AGENT.md version string updated - docs/cli-reference.md version string updated - docs/docker.md version tag updated - CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618) * fix(ci): restore main branch in pull_request trigger PR #613 removed 'main' from CI pull_request branches, which blocks sync developβmain PRs from getting CI checks. Branch protection on main requires Check, Format, Clippy, Test, Build β impossible without CI trigger. Restore to [develop, main] matching v0.7.0 release behavior. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: ajianaz <ajianaz@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * release: v0.7.1 β develop β main (#633) (#639) * docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links * feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579) Add partial document update endpoint to uteke-serve HTTP API. Changes: - documents.rs: update_document() β dynamic SET clause, only updates provided fields, always increments version, returns updated doc - lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds chunks + re-embeds if content changed - types.rs: DocUpdateRequest struct + resolve_doc_id_update helper - handlers.rs: POST /doc/update route with 404 for missing docs API: POST /doc/update { id | slug, title?, content?, tags?, metadata? } β Full document (version incremented) β 404 if not found Partial update semantics: only fields present in request are modified. Content changes trigger chunk rebuild (old chunks deleted, new ones embedded and indexed). Non-content updates (title, tags) skip re-chunking. Follow-up to Corin #139 β Corin DocumentsView will use this for Save. * fix: clippy β remove unused variables, use if-let instead of unwrap * feat: add CLI command for partial document updates (#589) - Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags - Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.) - Content changes trigger chunk rebuild; metadata/title-only skip it - Validates at least one field is provided - Parses --metadata as JSON string - Supports --file - for stdin content input - Document in docs/cli-reference.md with examples and flag table Closes #589 * feat(mcp): add uteke_doc_move tool (#585) - Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional) - Add exec_doc_move() calling uteke.doc_move() - Register in tools/list and tools/call dispatcher * feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586) MCP room coverage is now 8/8 (was 2/8). New tools: - uteke_room_create: create room with optional title/namespace - uteke_room_list: list rooms with optional namespace filter - uteke_room_delete: delete room (memories preserved) - uteke_room_stats: memory count, participants, activity - uteke_room_summary: topic clustering, decisions, highlights - uteke_room_document: structured document by memory type * style: fix cargo fmt for room_list executor * feat(mcp): add uteke_doc_update tool (#584) Add MCP tool for partial document update. Content changes trigger automatic chunk rebuild; title/tags/metadata-only updates skip rebuild. Closes #584 * chore: trigger CI re-run * chore: trigger CI re-run * ci: trigger Cora Review re-run * feat(mcp): add tag management tools β list, rename, delete (#587) - uteke_tags_list: list tags with counts, optional namespace filter + sort - uteke_tags_rename: rename tag across all memories atomically - uteke_tags_delete: delete tag from all memories Rebased on develop (includes room tools from PR #594). Closes #587 * feat(mcp): add pin/unpin tools for memory persistence (#588) Add uteke_pin and uteke_unpin MCP tools, matching existing POST /pin and POST /unpin HTTP endpoints. - tool_pin(): pin memory by ID, immune to decay/pruning - tool_unpin(): unpin memory, restore normal decay - Follows existing ToolResult pattern (is_error for not-found) - Uses uteke.pin()/unpin() from uteke-core Closes #588 * fix(core): add room tables to SCHEMA constant Add rooms and room_memories CREATE TABLE statements to SCHEMA so fresh databases get room tables without needing migration. Matches migration v2βv3 columns exactly: - rooms: id, title, namespace, created_at, updated_at - room_memories: room_id, memory_id, author, role, joined_at * deps: update crossbeam-epoch 0.9.18 β 0.9.20 Fixes RUSTSEC-2026-0204 (invalid pointer dereference in fmt::Pointer impl for Atomic/Shared). Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch No code changes β Cargo.lock only. * fix(ci): graceful sync workflow + add missing cargo audit ignores (#598) - project-sync.yml: exit 0 when PR has no linked closing issues and is not on the project board, preventing spurious failures under set -e - security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps * docs: fix 16 documentation gaps + update for v0.7.0 features (#582) - cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7 - mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note - docker: v0.6.7 tag, expand MCP tools table to full list - architecture: schema v10βv12, cross-process file lock, slim Docker model path - hermes: clarify Mode B deprecation scope, add memory-provider section - README/README.id: version badge v0.6.7 - AGENT.md: version 0.6.7, main branch protection updated * feat: add 'uteke update' self-update command (#581) Check for latest release on GitHub, compare against installed version, prompt for confirmation, download with checksum verification, and atomically replace the running binary. Features: - Detects current binary path automatically - OS/arch detection (linux/darwin, x86_64/aarch64) - Primary: parse GitHub 302 redirect (no API rate limit) - Fallback: GitHub REST API - SHA256 checksum verification from release assets - Archive path traversal protection (CWE-22) - Atomic rename replace (safe on POSIX) - New binary verification before swap - --yes flag for non-interactive / CI use - Already-up-to-date detection (skip download) - Missing dev headers warning for cargo-installed binaries Closes #581 * fix: rename update command to upgrade β fix 5 compilation errors - Rename Commands::Update β Commands::Upgrade to avoid collision with existing document update command (uteke doc update <id>) - Remove from AgingCommands (semantically wrong β self-update is not aging) - Change return type from Result<(), Box<dyn Error>> β Result<(), String> to match the dispatcher contract - Fix entry.path() bug: was calling .map_err() on Cow<Path> which is not a Result type - Fix all .into() calls that no longer compile with String error type - Rename update.rs β upgrade.rs module file * fix: move Upgrade variant from DocCommands to Commands enum Upgrade was accidentally placed inside DocCommands enum instead of the top-level Commands enum. This caused: - E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it) - E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it) * fix(security): fail-hard on checksum verification failure during upgrade Previously, uteke upgrade silently skipped SHA-256 checksum verification when the checksums file failed to download or the archive name was not found. This allowed a MITM attack to deliver a tampered binary. Changes: - Fail with Err when checksums download fails (network error or HTTP error) - Fail when archive checksum is missing from checksums file - Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass - Cleanup temp files on all failure paths Found by: cora scan (glm-5.2 via Bifrost) * feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606) Move Extractor from uteke-cli to uteke-core for server reuse. Add three new HTTP endpoints to uteke-serve: - POST /extract: LLM fact extraction + auto-store (1MB limit) - POST /import: JSONL import with re-embedding (5MB limit) - GET /export: JSONL export (optional ?namespace= filter) Extraction reads [extraction] config from uteke.toml. API key never accepted from request body (config/env only). Write token required for all three endpoints. Closes #604, #605, #606 * fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String CI caught E0308: if/else arms had incompatible types. Explicit annotate as String and use .to_owned() for the &str branch. * fix(server): import tiny_http::Header in handlers.rs E0433 in /export handler β Header::from_bytes used without import. * fix: resolve all clippy warnings - handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching) - handlers.rs: &ctx β ctx (needless borrow) - types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired) - extract.rs: #[allow(unused_imports)] on re-exports module * feat(server): maintenance + monitoring endpoints (#607 #608) Add 6 new HTTP endpoints to uteke-serve: Maintenance (#607): - POST /prune: TTL-based deprecated memory cleanup (dry_run support) - POST /consolidate: near-duplicate merging (dry_run support) - POST /aging: memory lifecycle management (status/preview/cleanup) Monitoring (#608): - POST /importance: recalculate importance scores - POST /orphans: find disconnected low-importance memories (read-only) - POST /rebuild-backlinks: rebuild referenced_by from forward edges All destructive endpoints require write token. /orphans allows read-only token (read-only query). Aging cleanup supports dry_run for safety preview. Closes #607, #608 * fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet * feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md - Add init_opencode and init_opencode_memory_provider functions (AGENTS.md-based integration, matching OpenCode's convention) - Refactor init_pi to use install_skill_md() helper instead of hardcoded inline SKILL.md content (-43 lines) - Update CLI help text to include opencode in --agent list - Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms, knowledge graph, pinning, dream pipeline, timeline, upgrade) - Fix escaped-quote bug in install_skill_md error messages Breaking: none. All changes additive. * refactor(core): remove namespace isolation from documents (#614) - Migration v12βv13: add author column, deprecate namespace on documents, migrate duplicate slugs across namespaces to slug-nsname format, create global unique slug index - Remove namespace params from all doc_* functions in lib.rs and store - Remove namespace fields from server request structs and MCP tools - Update CLI commands to not accept namespace args - Fix DocumentSummary initializer (add author field) - Fix recall_unified_* callers (remove stale Some(ns) from doc_search) - All consumers verified: CLI, server, MCP β zero namespace references remain * fix(tests): update schema version assertions to 13 - Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12 - Fix clippy warning: unused variable config in doc command * feat: project-aware memory tagging for noise-free recall Add automatic project detection and tag-based scoping to all memory operations. This prevents noise when recalling β agents only see memories relevant to the current project. Changes: - SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules, examples, and rationale for project:{name} tagging - pi-memory-provider extension: Auto-detect project from cwd and user prompt text, filter recall by --tags project:<name>, auto-tag remember commands with project:<name> - Hermes hook extract (external): Auto-detect project from session messages file paths, add project:<name> tag on auto-extract - Hermes hook recall (external): Auto-detect project from user_message, filter recall by --tags project:<name> Detection strategies: 1. File paths: /repos/<project>/ pattern matching 2. CWD: walk up from current directory to known project roots 3. Majority vote when multiple projects mentioned in session No Uteke binary changes required β all implemented via existing --tags flag support. * chore: release v0.7.0 prep β changelog, version bump, docs, dep versions - Cargo.toml: workspace version 0.6.7 β 0.7.0 - crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0 - CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7) - docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init - docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram - docs/multi-agent.md: add 'Documents Are Global' section - docs/docker.md: update version example to v0.7.0 * fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace - cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export, prune, consolidate, aging, importance, orphans, rebuild-backlinks) - cli-reference.md: fix doc list description (documents are global, not namespace-scoped) - CHANGELOG.md: add missing [0.7.0] comparison link - VitePress config.ts: fix document-commands anchor link (pre-existing broken) * fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata - fix(core): add retry logic (3 attempts, exponential backoff) around embedding generation to prevent silent vector index desync (#621) - fix(core): retry index.save() up to 3 times in both remember and forget to prevent orphan entries on transient I/O failures (#621) - fix(cli): read from stdin when content argument is '-' instead of storing literal dash string (#620) - fix(cli): change room recall default limit from 20 to 0 (all) since rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623) - fix(core): enrich room recall memories with author from room_memories table, injected into metadata JSON field (#624) Note: #622 (line numbers in recall JSON) is a data issue β content was stored with line numbers from read_file output. Not a code bug. * chore(deps): bump clap_complete from 4.6.6 to 4.6.7 Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](clap-rs/clap@clap_complete-v4.6.6...clap_complete-v4.6.7) --- updated-dependencies: - dependency-name: clap_complete dependency-version: 4.6.7 dependency-type: direct:production update-type: version-update:semver-patch ... * chore: release v0.7.1 prep β version bump, changelog, docs - Workspace version 0.7.0 β 0.7.1 - Crate dependency versions synced - Cargo.lock updated - README.md + README.id.md badges updated - AGENT.md version string updated - docs/cli-reference.md version string updated - docs/docker.md version tag updated - CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618) * fix(ci): restore main branch in pull_request trigger PR #613 removed 'main' from CI pull_request branches, which blocks sync developβmain PRs from getting CI checks. Branch protection on main requires Check, Format, Clippy, Test, Build β impossible without CI trigger. Restore to [develop, main] matching v0.7.0 release behavior. --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: ajianaz <ajianaz@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: ajianaz <ajianaz@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ajianaz
added a commit
that referenced
this pull request
Jul 13, 2026
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links
* feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579)
Add partial document update endpoint to uteke-serve HTTP API.
Changes:
- documents.rs: update_document() β dynamic SET clause, only updates provided
fields, always increments version, returns updated doc
- lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds
chunks + re-embeds if content changed
- types.rs: DocUpdateRequest struct + resolve_doc_id_update helper
- handlers.rs: POST /doc/update route with 404 for missing docs
API:
POST /doc/update { id | slug, title?, content?, tags?, metadata? }
β Full document (version incremented)
β 404 if not found
Partial update semantics: only fields present in request are modified.
Content changes trigger chunk rebuild (old chunks deleted, new ones
embedded and indexed). Non-content updates (title, tags) skip re-chunking.
Follow-up to Corin #139 β Corin DocumentsView will use this for Save.
* fix: clippy β remove unused variables, use if-let instead of unwrap
* feat: add CLI command for partial document updates (#589)
- Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags
- Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.)
- Content changes trigger chunk rebuild; metadata/title-only skip it
- Validates at least one field is provided
- Parses --metadata as JSON string
- Supports --file - for stdin content input
- Document in docs/cli-reference.md with examples and flag table
Closes #589
* feat(mcp): add uteke_doc_move tool (#585)
- Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional)
- Add exec_doc_move() calling uteke.doc_move()
- Register in tools/list and tools/call dispatcher
* feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586)
MCP room coverage is now 8/8 (was 2/8). New tools:
- uteke_room_create: create room with optional title/namespace
- uteke_room_list: list rooms with optional namespace filter
- uteke_room_delete: delete room (memories preserved)
- uteke_room_stats: memory count, participants, activity
- uteke_room_summary: topic clustering, decisions, highlights
- uteke_room_document: structured document by memory type
* style: fix cargo fmt for room_list executor
* feat(mcp): add uteke_doc_update tool (#584)
Add MCP tool for partial document update. Content changes trigger
automatic chunk rebuild; title/tags/metadata-only updates skip rebuild.
Closes #584
* chore: trigger CI re-run
* chore: trigger CI re-run
* ci: trigger Cora Review re-run
* feat(mcp): add tag management tools β list, rename, delete (#587)
- uteke_tags_list: list tags with counts, optional namespace filter + sort
- uteke_tags_rename: rename tag across all memories atomically
- uteke_tags_delete: delete tag from all memories
Rebased on develop (includes room tools from PR #594).
Closes #587
* feat(mcp): add pin/unpin tools for memory persistence (#588)
Add uteke_pin and uteke_unpin MCP tools, matching existing
POST /pin and POST /unpin HTTP endpoints.
- tool_pin(): pin memory by ID, immune to decay/pruning
- tool_unpin(): unpin memory, restore normal decay
- Follows existing ToolResult pattern (is_error for not-found)
- Uses uteke.pin()/unpin() from uteke-core
Closes #588
* fix(core): add room tables to SCHEMA constant
Add rooms and room_memories CREATE TABLE statements to SCHEMA
so fresh databases get room tables without needing migration.
Matches migration v2βv3 columns exactly:
- rooms: id, title, namespace, created_at, updated_at
- room_memories: room_id, memory_id, author, role, joined_at
* deps: update crossbeam-epoch 0.9.18 β 0.9.20
Fixes RUSTSEC-2026-0204 (invalid pointer dereference in
fmt::Pointer impl for Atomic/Shared).
Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch
No code changes β Cargo.lock only.
* fix(ci): graceful sync workflow + add missing cargo audit ignores (#598)
- project-sync.yml: exit 0 when PR has no linked closing issues and is
not on the project board, preventing spurious failures under set -e
- security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and
RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* docs: fix 16 documentation gaps + update for v0.7.0 features (#582)
- cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7
- mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note
- docker: v0.6.7 tag, expand MCP tools table to full list
- architecture: schema v10βv12, cross-process file lock, slim Docker model path
- hermes: clarify Mode B deprecation scope, add memory-provider section
- README/README.id: version badge v0.6.7
- AGENT.md: version 0.6.7, main branch protection updated
* feat: add 'uteke update' self-update command (#581)
Check for latest release on GitHub, compare against installed version,
prompt for confirmation, download with checksum verification, and
atomically replace the running binary.
Features:
- Detects current binary path automatically
- OS/arch detection (linux/darwin, x86_64/aarch64)
- Primary: parse GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- SHA256 checksum verification from release assets
- Archive path traversal protection (CWE-22)
- Atomic rename replace (safe on POSIX)
- New binary verification before swap
- --yes flag for non-interactive / CI use
- Already-up-to-date detection (skip download)
- Missing dev headers warning for cargo-installed binaries
Closes #581
* fix: rename update command to upgrade β fix 5 compilation errors
- Rename Commands::Update β Commands::Upgrade to avoid collision with
existing document update command (uteke doc update <id>)
- Remove from AgingCommands (semantically wrong β self-update is not aging)
- Change return type from Result<(), Box<dyn Error>> β Result<(), String>
to match the dispatcher contract
- Fix entry.path() bug: was calling .map_err() on Cow<Path> which is
not a Result type
- Fix all .into() calls that no longer compile with String error type
- Rename update.rs β upgrade.rs module file
* fix: move Upgrade variant from DocCommands to Commands enum
Upgrade was accidentally placed inside DocCommands enum instead of the
top-level Commands enum. This caused:
- E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it)
- E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it)
* fix(security): fail-hard on checksum verification failure during upgrade
Previously, uteke upgrade silently skipped SHA-256 checksum verification
when the checksums file failed to download or the archive name was not
found. This allowed a MITM attack to deliver a tampered binary.
Changes:
- Fail with Err when checksums download fails (network error or HTTP error)
- Fail when archive checksum is missing from checksums file
- Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass
- Cleanup temp files on all failure paths
Found by: cora scan (glm-5.2 via Bifrost)
* feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606)
Move Extractor from uteke-cli to uteke-core for server reuse.
Add three new HTTP endpoints to uteke-serve:
- POST /extract: LLM fact extraction + auto-store (1MB limit)
- POST /import: JSONL import with re-embedding (5MB limit)
- GET /export: JSONL export (optional ?namespace= filter)
Extraction reads [extraction] config from uteke.toml.
API key never accepted from request body (config/env only).
Write token required for all three endpoints.
Closes #604, #605, #606
* fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String
CI caught E0308: if/else arms had incompatible types.
Explicit annotate as String and use .to_owned() for the &str branch.
* fix(server): import tiny_http::Header in handlers.rs
E0433 in /export handler β Header::from_bytes used without import.
* fix: resolve all clippy warnings
- handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching)
- handlers.rs: &ctx β ctx (needless borrow)
- types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired)
- extract.rs: #[allow(unused_imports)] on re-exports module
* feat(server): maintenance + monitoring endpoints (#607 #608)
Add 6 new HTTP endpoints to uteke-serve:
Maintenance (#607):
- POST /prune: TTL-based deprecated memory cleanup (dry_run support)
- POST /consolidate: near-duplicate merging (dry_run support)
- POST /aging: memory lifecycle management (status/preview/cleanup)
Monitoring (#608):
- POST /importance: recalculate importance scores
- POST /orphans: find disconnected low-importance memories (read-only)
- POST /rebuild-backlinks: rebuild referenced_by from forward edges
All destructive endpoints require write token.
/orphans allows read-only token (read-only query).
Aging cleanup supports dry_run for safety preview.
Closes #607, #608
* fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet
* feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md
- Add init_opencode and init_opencode_memory_provider functions
(AGENTS.md-based integration, matching OpenCode's convention)
- Refactor init_pi to use install_skill_md() helper instead of
hardcoded inline SKILL.md content (-43 lines)
- Update CLI help text to include opencode in --agent list
- Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms,
knowledge graph, pinning, dream pipeline, timeline, upgrade)
- Fix escaped-quote bug in install_skill_md error messages
Breaking: none. All changes additive.
* refactor(core): remove namespace isolation from documents (#614)
- Migration v12βv13: add author column, deprecate namespace on documents,
migrate duplicate slugs across namespaces to slug-nsname format,
create global unique slug index
- Remove namespace params from all doc_* functions in lib.rs and store
- Remove namespace fields from server request structs and MCP tools
- Update CLI commands to not accept namespace args
- Fix DocumentSummary initializer (add author field)
- Fix recall_unified_* callers (remove stale Some(ns) from doc_search)
- All consumers verified: CLI, server, MCP β zero namespace references remain
* fix(tests): update schema version assertions to 13
- Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12
- Fix clippy warning: unused variable config in doc command
* feat: project-aware memory tagging for noise-free recall
Add automatic project detection and tag-based scoping to all memory
operations. This prevents noise when recalling β agents only see memories
relevant to the current project.
Changes:
- SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules,
examples, and rationale for project:{name} tagging
- pi-memory-provider extension: Auto-detect project from cwd and user
prompt text, filter recall by --tags project:<name>, auto-tag remember
commands with project:<name>
- Hermes hook extract (external): Auto-detect project from session
messages file paths, add project:<name> tag on auto-extract
- Hermes hook recall (external): Auto-detect project from user_message,
filter recall by --tags project:<name>
Detection strategies:
1. File paths: /repos/<project>/ pattern matching
2. CWD: walk up from current directory to known project roots
3. Majority vote when multiple projects mentioned in session
No Uteke binary changes required β all implemented via existing --tags
flag support.
* chore: release v0.7.0 prep β changelog, version bump, docs, dep versions
- Cargo.toml: workspace version 0.6.7 β 0.7.0
- crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0
- CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7)
- docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init
- docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram
- docs/multi-agent.md: add 'Documents Are Global' section
- docs/docker.md: update version example to v0.7.0
* fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace
- cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export,
prune, consolidate, aging, importance, orphans, rebuild-backlinks)
- cli-reference.md: fix doc list description (documents are global, not namespace-scoped)
- CHANGELOG.md: add missing [0.7.0] comparison link
- VitePress config.ts: fix document-commands anchor link (pre-existing broken)
* fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata
- fix(core): add retry logic (3 attempts, exponential backoff) around
embedding generation to prevent silent vector index desync (#621)
- fix(core): retry index.save() up to 3 times in both remember and
forget to prevent orphan entries on transient I/O failures (#621)
- fix(cli): read from stdin when content argument is '-' instead of
storing literal dash string (#620)
- fix(cli): change room recall default limit from 20 to 0 (all) since
rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623)
- fix(core): enrich room recall memories with author from room_memories
table, injected into metadata JSON field (#624)
Note: #622 (line numbers in recall JSON) is a data issue β content was
stored with line numbers from read_file output. Not a code bug.
* chore(deps): bump clap_complete from 4.6.6 to 4.6.7
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)
---
updated-dependencies:
- dependency-name: clap_complete
dependency-version: 4.6.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore: release v0.7.1 prep β version bump, changelog, docs
- Workspace version 0.7.0 β 0.7.1
- Crate dependency versions synced
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618)
* fix(ci): restore main branch in pull_request trigger
PR #613 removed 'main' from CI pull_request branches, which blocks
sync developβmain PRs from getting CI checks. Branch protection on main
requires Check, Format, Clippy, Test, Build β impossible without CI trigger.
Restore to [develop, main] matching v0.7.0 release behavior.
* fix(server): raise /doc/list default limit from 5 to 1000 (#634)
The document list endpoint reused the memory pagination default of 5.
Clients building a full hierarchy client-side (e.g. Corin's doc tree)
silently saw only 5 documents when omitting .
Documents are not paginated like memories, so add a dedicated
default_doc_limit() = 1000 and apply it to DocListParams only.
* feat(server): report version in /health response (#636)
* feat(server): report version in /health response
Add a `version` field (uteke-server crate version) to GET /health so
HTTP clients can gate features on the actual server capability.
This matters for remote deployments: Corin previously derived the
uteke version from the local `uteke` CLI, which is meaningless when
talking to a user-managed remote server that may be older or newer.
With /health reporting version, clients can probe the server directly.
Backward compatible β `version` is an added JSON field.
* style: wrap /health help line to satisfy rustfmt max_width
CI rustfmt wraps the >100-col println! to match the existing /list
help-text convention; local fmt did not flag it (toolchain mismatch).
* fix(core): defensive datetime parsing β tolerate missing timezone in RFC3339 fields (#635)
One corrupted row (updated_at without timezone suffix, e.g. '2026-07-09T19:53:45.493962')
caused load_all() to crash with 'premature end of input' because
chrono::DateTime::parse_from_rfc3339() requires the +HH:MM/Z suffix.
Two-pronged fix:
1. Parsing: Add parse_datetime_flexible() that tries strict RFC3339 first,
then falls back to appending +00:00 (assumes UTC) for ISO 8601 strings
without timezone. Applied to created_at, updated_at (required fields)
and last_accessed, valid_from, valid_until (optional fields).
2. Data repair: Add repair_datetime_timezones() as a post-migration
consistency check in ensure_schema_version(). Idempotent β scans
memories + documents for datetime strings missing timezone suffix and
appends +00:00. Runs on every DB open, auto-fixes legacy data.
Files changed:
- store.rs: parse_datetime_flexible() + parse_datetime_opt() helpers,
updated row_to_memory() to use them
- schema.rs: repair_datetime_timezones() in ensure_schema_version()
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* chore: release v0.7.2 prep β version bump, changelog (#637)
- Workspace version 0.7.1 β 0.7.2
- Crate dependency versions synced (uteke-core, uteke-mcp)
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.2] with #634, #635, #636
Post-v0.7.1 fixes:
- #634 POST /doc/list default limit 5 β 1000
- #635 defensive datetime parsing (corruption row crash fix)
- #636 version field in /health response
* release: v0.7.1 β develop β main (#633) (#638)
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links
* feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579)
Add partial document update endpoint to uteke-serve HTTP API.
Changes:
- documents.rs: update_document() β dynamic SET clause, only updates provided
fields, always increments version, returns updated doc
- lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds
chunks + re-embeds if content changed
- types.rs: DocUpdateRequest struct + resolve_doc_id_update helper
- handlers.rs: POST /doc/update route with 404 for missing docs
API:
POST /doc/update { id | slug, title?, content?, tags?, metadata? }
β Full document (version incremented)
β 404 if not found
Partial update semantics: only fields present in request are modified.
Content changes trigger chunk rebuild (old chunks deleted, new ones
embedded and indexed). Non-content updates (title, tags) skip re-chunking.
Follow-up to Corin #139 β Corin DocumentsView will use this for Save.
* fix: clippy β remove unused variables, use if-let instead of unwrap
* feat: add CLI command for partial document updates (#589)
- Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags
- Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.)
- Content changes trigger chunk rebuild; metadata/title-only skip it
- Validates at least one field is provided
- Parses --metadata as JSON string
- Supports --file - for stdin content input
- Document in docs/cli-reference.md with examples and flag table
Closes #589
* feat(mcp): add uteke_doc_move tool (#585)
- Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional)
- Add exec_doc_move() calling uteke.doc_move()
- Register in tools/list and tools/call dispatcher
* feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586)
MCP room coverage is now 8/8 (was 2/8). New tools:
- uteke_room_create: create room with optional title/namespace
- uteke_room_list: list rooms with optional namespace filter
- uteke_room_delete: delete room (memories preserved)
- uteke_room_stats: memory count, participants, activity
- uteke_room_summary: topic clustering, decisions, highlights
- uteke_room_document: structured document by memory type
* style: fix cargo fmt for room_list executor
* feat(mcp): add uteke_doc_update tool (#584)
Add MCP tool for partial document update. Content changes trigger
automatic chunk rebuild; title/tags/metadata-only updates skip rebuild.
Closes #584
* chore: trigger CI re-run
* chore: trigger CI re-run
* ci: trigger Cora Review re-run
* feat(mcp): add tag management tools β list, rename, delete (#587)
- uteke_tags_list: list tags with counts, optional namespace filter + sort
- uteke_tags_rename: rename tag across all memories atomically
- uteke_tags_delete: delete tag from all memories
Rebased on develop (includes room tools from PR #594).
Closes #587
* feat(mcp): add pin/unpin tools for memory persistence (#588)
Add uteke_pin and uteke_unpin MCP tools, matching existing
POST /pin and POST /unpin HTTP endpoints.
- tool_pin(): pin memory by ID, immune to decay/pruning
- tool_unpin(): unpin memory, restore normal decay
- Follows existing ToolResult pattern (is_error for not-found)
- Uses uteke.pin()/unpin() from uteke-core
Closes #588
* fix(core): add room tables to SCHEMA constant
Add rooms and room_memories CREATE TABLE statements to SCHEMA
so fresh databases get room tables without needing migration.
Matches migration v2βv3 columns exactly:
- rooms: id, title, namespace, created_at, updated_at
- room_memories: room_id, memory_id, author, role, joined_at
* deps: update crossbeam-epoch 0.9.18 β 0.9.20
Fixes RUSTSEC-2026-0204 (invalid pointer dereference in
fmt::Pointer impl for Atomic/Shared).
Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch
No code changes β Cargo.lock only.
* fix(ci): graceful sync workflow + add missing cargo audit ignores (#598)
- project-sync.yml: exit 0 when PR has no linked closing issues and is
not on the project board, preventing spurious failures under set -e
- security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and
RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps
* docs: fix 16 documentation gaps + update for v0.7.0 features (#582)
- cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7
- mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note
- docker: v0.6.7 tag, expand MCP tools table to full list
- architecture: schema v10βv12, cross-process file lock, slim Docker model path
- hermes: clarify Mode B deprecation scope, add memory-provider section
- README/README.id: version badge v0.6.7
- AGENT.md: version 0.6.7, main branch protection updated
* feat: add 'uteke update' self-update command (#581)
Check for latest release on GitHub, compare against installed version,
prompt for confirmation, download with checksum verification, and
atomically replace the running binary.
Features:
- Detects current binary path automatically
- OS/arch detection (linux/darwin, x86_64/aarch64)
- Primary: parse GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- SHA256 checksum verification from release assets
- Archive path traversal protection (CWE-22)
- Atomic rename replace (safe on POSIX)
- New binary verification before swap
- --yes flag for non-interactive / CI use
- Already-up-to-date detection (skip download)
- Missing dev headers warning for cargo-installed binaries
Closes #581
* fix: rename update command to upgrade β fix 5 compilation errors
- Rename Commands::Update β Commands::Upgrade to avoid collision with
existing document update command (uteke doc update <id>)
- Remove from AgingCommands (semantically wrong β self-update is not aging)
- Change return type from Result<(), Box<dyn Error>> β Result<(), String>
to match the dispatcher contract
- Fix entry.path() bug: was calling .map_err() on Cow<Path> which is
not a Result type
- Fix all .into() calls that no longer compile with String error type
- Rename update.rs β upgrade.rs module file
* fix: move Upgrade variant from DocCommands to Commands enum
Upgrade was accidentally placed inside DocCommands enum instead of the
top-level Commands enum. This caused:
- E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it)
- E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it)
* fix(security): fail-hard on checksum verification failure during upgrade
Previously, uteke upgrade silently skipped SHA-256 checksum verification
when the checksums file failed to download or the archive name was not
found. This allowed a MITM attack to deliver a tampered binary.
Changes:
- Fail with Err when checksums download fails (network error or HTTP error)
- Fail when archive checksum is missing from checksums file
- Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass
- Cleanup temp files on all failure paths
Found by: cora scan (glm-5.2 via Bifrost)
* feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606)
Move Extractor from uteke-cli to uteke-core for server reuse.
Add three new HTTP endpoints to uteke-serve:
- POST /extract: LLM fact extraction + auto-store (1MB limit)
- POST /import: JSONL import with re-embedding (5MB limit)
- GET /export: JSONL export (optional ?namespace= filter)
Extraction reads [extraction] config from uteke.toml.
API key never accepted from request body (config/env only).
Write token required for all three endpoints.
Closes #604, #605, #606
* fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String
CI caught E0308: if/else arms had incompatible types.
Explicit annotate as String and use .to_owned() for the &str branch.
* fix(server): import tiny_http::Header in handlers.rs
E0433 in /export handler β Header::from_bytes used without import.
* fix: resolve all clippy warnings
- handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching)
- handlers.rs: &ctx β ctx (needless borrow)
- types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired)
- extract.rs: #[allow(unused_imports)] on re-exports module
* feat(server): maintenance + monitoring endpoints (#607 #608)
Add 6 new HTTP endpoints to uteke-serve:
Maintenance (#607):
- POST /prune: TTL-based deprecated memory cleanup (dry_run support)
- POST /consolidate: near-duplicate merging (dry_run support)
- POST /aging: memory lifecycle management (status/preview/cleanup)
Monitoring (#608):
- POST /importance: recalculate importance scores
- POST /orphans: find disconnected low-importance memories (read-only)
- POST /rebuild-backlinks: rebuild referenced_by from forward edges
All destructive endpoints require write token.
/orphans allows read-only token (read-only query).
Aging cleanup supports dry_run for safety preview.
Closes #607, #608
* fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet
* feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md
- Add init_opencode and init_opencode_memory_provider functions
(AGENTS.md-based integration, matching OpenCode's convention)
- Refactor init_pi to use install_skill_md() helper instead of
hardcoded inline SKILL.md content (-43 lines)
- Update CLI help text to include opencode in --agent list
- Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms,
knowledge graph, pinning, dream pipeline, timeline, upgrade)
- Fix escaped-quote bug in install_skill_md error messages
Breaking: none. All changes additive.
* refactor(core): remove namespace isolation from documents (#614)
- Migration v12βv13: add author column, deprecate namespace on documents,
migrate duplicate slugs across namespaces to slug-nsname format,
create global unique slug index
- Remove namespace params from all doc_* functions in lib.rs and store
- Remove namespace fields from server request structs and MCP tools
- Update CLI commands to not accept namespace args
- Fix DocumentSummary initializer (add author field)
- Fix recall_unified_* callers (remove stale Some(ns) from doc_search)
- All consumers verified: CLI, server, MCP β zero namespace references remain
* fix(tests): update schema version assertions to 13
- Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12
- Fix clippy warning: unused variable config in doc command
* feat: project-aware memory tagging for noise-free recall
Add automatic project detection and tag-based scoping to all memory
operations. This prevents noise when recalling β agents only see memories
relevant to the current project.
Changes:
- SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules,
examples, and rationale for project:{name} tagging
- pi-memory-provider extension: Auto-detect project from cwd and user
prompt text, filter recall by --tags project:<name>, auto-tag remember
commands with project:<name>
- Hermes hook extract (external): Auto-detect project from session
messages file paths, add project:<name> tag on auto-extract
- Hermes hook recall (external): Auto-detect project from user_message,
filter recall by --tags project:<name>
Detection strategies:
1. File paths: /repos/<project>/ pattern matching
2. CWD: walk up from current directory to known project roots
3. Majority vote when multiple projects mentioned in session
No Uteke binary changes required β all implemented via existing --tags
flag support.
* chore: release v0.7.0 prep β changelog, version bump, docs, dep versions
- Cargo.toml: workspace version 0.6.7 β 0.7.0
- crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0
- CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7)
- docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init
- docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram
- docs/multi-agent.md: add 'Documents Are Global' section
- docs/docker.md: update version example to v0.7.0
* fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace
- cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export,
prune, consolidate, aging, importance, orphans, rebuild-backlinks)
- cli-reference.md: fix doc list description (documents are global, not namespace-scoped)
- CHANGELOG.md: add missing [0.7.0] comparison link
- VitePress config.ts: fix document-commands anchor link (pre-existing broken)
* fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata
- fix(core): add retry logic (3 attempts, exponential backoff) around
embedding generation to prevent silent vector index desync (#621)
- fix(core): retry index.save() up to 3 times in both remember and
forget to prevent orphan entries on transient I/O failures (#621)
- fix(cli): read from stdin when content argument is '-' instead of
storing literal dash string (#620)
- fix(cli): change room recall default limit from 20 to 0 (all) since
rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623)
- fix(core): enrich room recall memories with author from room_memories
table, injected into metadata JSON field (#624)
Note: #622 (line numbers in recall JSON) is a data issue β content was
stored with line numbers from read_file output. Not a code bug.
* chore(deps): bump clap_complete from 4.6.6 to 4.6.7
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)
---
updated-dependencies:
- dependency-name: clap_complete
dependency-version: 4.6.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
* chore: release v0.7.1 prep β version bump, changelog, docs
- Workspace version 0.7.0 β 0.7.1
- Crate dependency versions synced
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618)
* fix(ci): restore main branch in pull_request trigger
PR #613 removed 'main' from CI pull_request branches, which blocks
sync developβmain PRs from getting CI checks. Branch protection on main
requires Check, Format, Clippy, Test, Build β impossible without CI trigger.
Restore to [develop, main] matching v0.7.0 release behavior.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* release: v0.7.1 β develop β main (#633) (#639)
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links
* feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579)
Add partial document update endpoint to uteke-serve HTTP API.
Changes:
- documents.rs: update_document() β dynamic SET clause, only updates provided
fields, always increments version, returns updated doc
- lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds
chunks + re-embeds if content changed
- types.rs: DocUpdateRequest struct + resolve_doc_id_update helper
- handlers.rs: POST /doc/update route with 404 for missing docs
API:
POST /doc/update { id | slug, title?, content?, tags?, metadata? }
β Full document (version incremented)
β 404 if not found
Partial update semantics: only fields present in request are modified.
Content changes trigger chunk rebuild (old chunks deleted, new ones
embedded and indexed). Non-content updates (title, tags) skip re-chunking.
Follow-up to Corin #139 β Corin DocumentsView will use this for Save.
* fix: clippy β remove unused variables, use if-let instead of unwrap
* feat: add CLI command for partial document updates (#589)
- Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags
- Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.)
- Content changes trigger chunk rebuild; metadata/title-only skip it
- Validates at least one field is provided
- Parses --metadata as JSON string
- Supports --file - for stdin content input
- Document in docs/cli-reference.md with examples and flag table
Closes #589
* feat(mcp): add uteke_doc_move tool (#585)
- Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional)
- Add exec_doc_move() calling uteke.doc_move()
- Register in tools/list and tools/call dispatcher
* feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586)
MCP room coverage is now 8/8 (was 2/8). New tools:
- uteke_room_create: create room with optional title/namespace
- uteke_room_list: list rooms with optional namespace filter
- uteke_room_delete: delete room (memories preserved)
- uteke_room_stats: memory count, participants, activity
- uteke_room_summary: topic clustering, decisions, highlights
- uteke_room_document: structured document by memory type
* style: fix cargo fmt for room_list executor
* feat(mcp): add uteke_doc_update tool (#584)
Add MCP tool for partial document update. Content changes trigger
automatic chunk rebuild; title/tags/metadata-only updates skip rebuild.
Closes #584
* chore: trigger CI re-run
* chore: trigger CI re-run
* ci: trigger Cora Review re-run
* feat(mcp): add tag management tools β list, rename, delete (#587)
- uteke_tags_list: list tags with counts, optional namespace filter + sort
- uteke_tags_rename: rename tag across all memories atomically
- uteke_tags_delete: delete tag from all memories
Rebased on develop (includes room tools from PR #594).
Closes #587
* feat(mcp): add pin/unpin tools for memory persistence (#588)
Add uteke_pin and uteke_unpin MCP tools, matching existing
POST /pin and POST /unpin HTTP endpoints.
- tool_pin(): pin memory by ID, immune to decay/pruning
- tool_unpin(): unpin memory, restore normal decay
- Follows existing ToolResult pattern (is_error for not-found)
- Uses uteke.pin()/unpin() from uteke-core
Closes #588
* fix(core): add room tables to SCHEMA constant
Add rooms and room_memories CREATE TABLE statements to SCHEMA
so fresh databases get room tables without needing migration.
Matches migration v2βv3 columns exactly:
- rooms: id, title, namespace, created_at, updated_at
- room_memories: room_id, memory_id, author, role, joined_at
* deps: update crossbeam-epoch 0.9.18 β 0.9.20
Fixes RUSTSEC-2026-0204 (invalid pointer dereference in
fmt::Pointer impl for Atomic/Shared).
Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch
No code changes β Cargo.lock only.
* fix(ci): graceful sync workflow + add missing cargo audit ignores (#598)
- project-sync.yml: exit 0 when PR has no linked closing issues and is
not on the project board, preventing spurious failures under set -e
- security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and
RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps
* docs: fix 16 documentation gaps + update for v0.7.0 features (#582)
- cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7
- mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note
- docker: v0.6.7 tag, expand MCP tools table to full list
- architecture: schema v10βv12, cross-process file lock, slim Docker model path
- hermes: clarify Mode B deprecation scope, add memory-provider section
- README/README.id: version badge v0.6.7
- AGENT.md: version 0.6.7, main branch protection updated
* feat: add 'uteke update' self-update command (#581)
Check for latest release on GitHub, compare against installed version,
prompt for confirmation, download with checksum verification, and
atomically replace the running binary.
Features:
- Detects current binary path automatically
- OS/arch detection (linux/darwin, x86_64/aarch64)
- Primary: parse GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- SHA256 checksum verification from release assets
- Archive path traversal protection (CWE-22)
- Atomic rename replace (safe on POSIX)
- New binary verification before swap
- --yes flag for non-interactive / CI use
- Already-up-to-date detection (skip download)
- Missing dev headers warning for cargo-installed binaries
Closes #581
* fix: rename update command to upgrade β fix 5 compilation errors
- Rename Commands::Update β Commands::Upgrade to avoid collision with
existing document update command (uteke doc update <id>)
- Remove from AgingCommands (semantically wrong β self-update is not aging)
- Change return type from Result<(), Box<dyn Error>> β Result<(), String>
to match the dispatcher contract
- Fix entry.path() bug: was calling .map_err() on Cow<Path> which is
not a Result type
- Fix all .into() calls that no longer compile with String error type
- Rename update.rs β upgrade.rs module file
* fix: move Upgrade variant from DocCommands to Commands enum
Upgrade was accidentally placed inside DocCommands enum instead of the
top-level Commands enum. This caused:
- E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it)
- E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it)
* fix(security): fail-hard on checksum verification failure during upgrade
Previously, uteke upgrade silently skipped SHA-256 checksum verification
when the checksums file failed to download or the archive name was not
found. This allowed a MITM attack to deliver a tampered binary.
Changes:
- Fail with Err when checksums download fails (network error or HTTP error)
- Fail when archive checksum is missing from checksums file
- Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass
- Cleanup temp files on all failure paths
Found by: cora scan (glm-5.2 via Bifrost)
* feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606)
Move Extractor from uteke-cli to uteke-core for server reuse.
Add three new HTTP endpoints to uteke-serve:
- POST /extract: LLM fact extraction + auto-store (1MB limit)
- POST /import: JSONL import with re-embedding (5MB limit)
- GET /export: JSONL export (optional ?namespace= filter)
Extraction reads [extraction] config from uteke.toml.
API key never accepted from request body (config/env only).
Write token required for all three endpoints.
Closes #604, #605, #606
* fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String
CI caught E0308: if/else arms had incompatible types.
Explicit annotate as String and use .to_owned() for the &str branch.
* fix(server): import tiny_http::Header in handlers.rs
E0433 in /export handler β Header::from_bytes used without import.
* fix: resolve all clippy warnings
- handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching)
- handlers.rs: &ctx β ctx (needless borrow)
- types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired)
- extract.rs: #[allow(unused_imports)] on re-exports module
* feat(server): maintenance + monitoring endpoints (#607 #608)
Add 6 new HTTP endpoints to uteke-serve:
Maintenance (#607):
- POST /prune: TTL-based deprecated memory cleanup (dry_run support)
- POST /consolidate: near-duplicate merging (dry_run support)
- POST /aging: memory lifecycle management (status/preview/cleanup)
Monitoring (#608):
- POST /importance: recalculate importance scores
- POST /orphans: find disconnected low-importance memories (read-only)
- POST /rebuild-backlinks: rebuild referenced_by from forward edges
All destructive endpoints require write token.
/orphans allows read-only token (read-only query).
Aging cleanup supports dry_run for safety preview.
Closes #607, #608
* fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet
* feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md
- Add init_opencode and init_opencode_memory_provider functions
(AGENTS.md-based integration, matching OpenCode's convention)
- Refactor init_pi to use install_skill_md() helper instead of
hardcoded inline SKILL.md content (-43 lines)
- Update CLI help text to include opencode in --agent list
- Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms,
knowledge graph, pinning, dream pipeline, timeline, upgrade)
- Fix escaped-quote bug in install_skill_md error messages
Breaking: none. All changes additive.
* refactor(core): remove namespace isolation from documents (#614)
- Migration v12βv13: add author column, deprecate namespace on documents,
migrate duplicate slugs across namespaces to slug-nsname format,
create global unique slug index
- Remove namespace params from all doc_* functions in lib.rs and store
- Remove namespace fields from server request structs and MCP tools
- Update CLI commands to not accept namespace args
- Fix DocumentSummary initializer (add author field)
- Fix recall_unified_* callers (remove stale Some(ns) from doc_search)
- All consumers verified: CLI, server, MCP β zero namespace references remain
* fix(tests): update schema version assertions to 13
- Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12
- Fix clippy warning: unused variable config in doc command
* feat: project-aware memory tagging for noise-free recall
Add automatic project detection and tag-based scoping to all memory
operations. This prevents noise when recalling β agents only see memories
relevant to the current project.
Changes:
- SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules,
examples, and rationale for project:{name} tagging
- pi-memory-provider extension: Auto-detect project from cwd and user
prompt text, filter recall by --tags project:<name>, auto-tag remember
commands with project:<name>
- Hermes hook extract (external): Auto-detect project from session
messages file paths, add project:<name> tag on auto-extract
- Hermes hook recall (external): Auto-detect project from user_message,
filter recall by --tags project:<name>
Detection strategies:
1. File paths: /repos/<project>/ pattern matching
2. CWD: walk up from current directory to known project roots
3. Majority vote when multiple projects mentioned in session
No Uteke binary changes required β all implemented via existing --tags
flag support.
* chore: release v0.7.0 prep β changelog, version bump, docs, dep versions
- Cargo.toml: workspace version 0.6.7 β 0.7.0
- crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0
- CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7)
- docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init
- docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram
- docs/multi-agent.md: add 'Documents Are Global' section
- docs/docker.md: update version example to v0.7.0
* fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace
- cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export,
prune, consolidate, aging, importance, orphans, rebuild-backlinks)
- cli-reference.md: fix doc list description (documents are global, not namespace-scoped)
- CHANGELOG.md: add missing [0.7.0] comparison link
- VitePress config.ts: fix document-commands anchor link (pre-existing broken)
* fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata
- fix(core): add retry logic (3 attempts, exponential backoff) around
embedding generation to prevent silent vector index desync (#621)
- fix(core): retry index.save() up to 3 times in both remember and
forget to prevent orphan entries on transient I/O failures (#621)
- fix(cli): read from stdin when content argument is '-' instead of
storing literal dash string (#620)
- fix(cli): change room recall default limit from 20 to 0 (all) since
rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623)
- fix(core): enrich room recall memories with author from room_memories
table, injected into metadata JSON field (#624)
Note: #622 (line numbers in recall JSON) is a data issue β content was
stored with line numbers from read_file output. Not a code bug.
* chore(deps): bump clap_complete from 4.6.6 to 4.6.7
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)
---
updated-dependencies:
- dependency-name: clap_complete
dependency-version: 4.6.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
* chore: release v0.7.1 prep β version bump, changelog, docs
- Workspace version 0.7.0 β 0.7.1
- Crate dependency versions synced
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618)
* fix(ci): restore main branch in pull_request trigger
PR #613 removed 'main' from CI pull_request branches, which blocks
sync developβmain PRs from getting CI checks. Branch protection on main
requires Check, Format, Clippy, Test, Build β impossible without CI trigger.
Restore to [develop, main] matching v0.7.0 release behavior.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: Optimize README for adoption β competitive positioning, infographic, benchmarks (#642)
- Rewrite README.md (EN) and README.id.md (ID) with punchy hook,
30-second quick start, and use-case driven structure
- Add comparison table: Uteke vs Mem0, AgentMemory, Letta, Zep, Engram
(6 columns, 9 rows: setup, API keys, offline, search, recall, rooms,
time-travel, graph edges, language)
- Add positioning callouts: Uteke vs Engram (same thesis, 10x features),
Uteke vs cloud tools (no API keys, no Docker, no cloud)
- Add FAQ entries for AgentMemory and Engram differentiation
- Add recall ~40ms badge to header
- Generate comparison infographic (docs/assets/uteke-comparison.png)
- Add performance benchmarks (docs/BENCHMARKS.md):
100/1K/10K memories, recall flat at ~42ms across all scales
- Source HTML for infographic saved (docs/assets/uteke-infographic.html)
Benchmark environment: Oracle ARM Ampere A1, 4 vCPU, ONNX CPU-only
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix: Fact-check all README claims against source code and live data (#643)
Corrected 11 inaccuracies across README.md, README.id.md, BENCHMARKS.md,
and infographic:
- Recall speed: 30ms β 45ms (matches benchmark: 40-45ms at 100-10K)
- Version: v0.7.1 β v0.7.2 (from Cargo.toml)
- Test count: 327 β 206 (actual #[test] + #[tokio::test] count)
- Mem0 stars: 48K β 60K (live GitHub API)
- Letta stars: 21K β 24K (live GitHub API)
- Zep stars: 24K β 5K (live GitHub API)
- Engram stars: 2.4K β 5K (top Engram repo)
- LongMemEval: removed from feature table (not shipped in binary)
- Embed Fallback: cloud API β no-op passthrough (never calls cloud)
- Server mode: removed fabricated 75x claim
- Infographic footer: Engram-centric tagline β Uteke-centric
- Re-rendered infographic PNG with all corrections
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix(core): include metadata field in UnifiedSearchResult recall output
recall JSON output now includes the metadata field from Memory,
closing a feature gap where consumers (agent, MCP, LongMemEval
benchmark) had to round-trip lookup by memory_id to access metadata.
- Add metadata: Option<serde_json::Value> to UnifiedSearchResult
- Populate from Memory.metadata in all 3 memory construction sites
- Set metadata: None for document results (documents have no metadata)
- skip_serializing_if = None keeps JSON clean for document results
- Updated test fixtures to cover the new field
* fix(benchmark): LongMemEval harness for uteke 0.7+ CLI changes + Mnemosyne comparison (#644)
* feat(benchmark): add Mnemosyne to comparison table, fix LongMemEval harness for uteke 0.7+
- README: add Mnemosyne column (closest competitor β same zero-dependency philosophy)
- Comparison highlights Uteke edges: Rust binary vs Python, curl|sh vs pip+venv, zero runtime deps
- Fix run_eval.py: tags positional β --tags flag (CLI v0.7 breaking change)
- Fix run_eval.py: recall session_id extraction via memory_id mapping (v0.7 recall JSON drops metadata fields)
- Quick test (5q): Recall@5=93.3%, NDCG@5=100% on temporal-reasoning subset
* docs(benchmark): add LongMemEval validation results
12-question diverse sample across all 6 question types:
- Overall: Recall@5=95.8%, NDCG@5=100%
- 5 of 6 types at 100% Recall@5
- knowledge-update at 75% (hardest β info changes over time)
* feat(benchmark): add resume support + periodic store reset for OOM prevention
- --resume flag: skip already-evaluated questions from existing results
- --reset-every N: wipe+recreate store every N questions (default 20)
Prevents memory buildup from uteke subprocess accumulation
- fout.flush() after each result for resume safety
Previous full run died at q75 (OOM/SIGKILL). With resume, can restart
from q69 without losing progress. With reset-every=10, store stays small.
---------
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix: use buffer-based serialization to bypass usearch C++ file I/O on Windows (#647) (#649)
Replace usearch's C++ fopen("wb") save with buffer-based serialization:
save_to_buffer() β std::fs::write() with atomic temp+rename pattern.
Root cause: usearch C++ output_file_t uses fopen("wb") which has known
Windows issues - MAX_PATH limit, exclusive access conflict with fs2
file lock (#543), and Windows Defender interference.
The buffer approach is safe because usearch already holds the full index
in RAM, serialized_length() returns exact buffer size, and atomic write
prevents corruption. Load still uses usearch native Index::restore() since
the on-disk format is identical.
Tests: existing save/load test + new round-trip test proving buffer-saved
files are loadable by usearch native restore. Both pass.
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* chore: release v0.7.3 prep β version bump, changelog, links (#650)
v0.7.2 β v0.7.3 patch release.
Changes since v0.7.2:
- Fixed: Windows vector index 0 bytes after save (#647)
- Fixed: recall --json missing metadata field (#646)
- Changed: README fact-check and optimization (#642, #643)
Release checklist:
- [x] Cargo.toml workspace version bump
- [x] Inter-crate version pins updated (4 crates)
- [x] Cargo.lock synced
- [x] CHANGELOG.md: [Unreleased] β [0.7.3] with empty [Unreleased]
- [x] CHANGELOG links: added 0.7.1, 0.7.2, 0.7.3 links
- [x] AGENT.md version string updated
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ajianaz
added a commit
that referenced
this pull request
Jul 14, 2026
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links
* feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579)
Add partial document update endpoint to uteke-serve HTTP API.
Changes:
- documents.rs: update_document() β dynamic SET clause, only updates provided
fields, always increments version, returns updated doc
- lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds
chunks + re-embeds if content changed
- types.rs: DocUpdateRequest struct + resolve_doc_id_update helper
- handlers.rs: POST /doc/update route with 404 for missing docs
API:
POST /doc/update { id | slug, title?, content?, tags?, metadata? }
β Full document (version incremented)
β 404 if not found
Partial update semantics: only fields present in request are modified.
Content changes trigger chunk rebuild (old chunks deleted, new ones
embedded and indexed). Non-content updates (title, tags) skip re-chunking.
Follow-up to Corin #139 β Corin DocumentsView will use this for Save.
* fix: clippy β remove unused variables, use if-let instead of unwrap
* feat: add CLI command for partial document updates (#589)
- Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags
- Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.)
- Content changes trigger chunk rebuild; metadata/title-only skip it
- Validates at least one field is provided
- Parses --metadata as JSON string
- Supports --file - for stdin content input
- Document in docs/cli-reference.md with examples and flag table
Closes #589
* feat(mcp): add uteke_doc_move tool (#585)
- Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional)
- Add exec_doc_move() calling uteke.doc_move()
- Register in tools/list and tools/call dispatcher
* feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586)
MCP room coverage is now 8/8 (was 2/8). New tools:
- uteke_room_create: create room with optional title/namespace
- uteke_room_list: list rooms with optional namespace filter
- uteke_room_delete: delete room (memories preserved)
- uteke_room_stats: memory count, participants, activity
- uteke_room_summary: topic clustering, decisions, highlights
- uteke_room_document: structured document by memory type
* style: fix cargo fmt for room_list executor
* feat(mcp): add uteke_doc_update tool (#584)
Add MCP tool for partial document update. Content changes trigger
automatic chunk rebuild; title/tags/metadata-only updates skip rebuild.
Closes #584
* chore: trigger CI re-run
* chore: trigger CI re-run
* ci: trigger Cora Review re-run
* feat(mcp): add tag management tools β list, rename, delete (#587)
- uteke_tags_list: list tags with counts, optional namespace filter + sort
- uteke_tags_rename: rename tag across all memories atomically
- uteke_tags_delete: delete tag from all memories
Rebased on develop (includes room tools from PR #594).
Closes #587
* feat(mcp): add pin/unpin tools for memory persistence (#588)
Add uteke_pin and uteke_unpin MCP tools, matching existing
POST /pin and POST /unpin HTTP endpoints.
- tool_pin(): pin memory by ID, immune to decay/pruning
- tool_unpin(): unpin memory, restore normal decay
- Follows existing ToolResult pattern (is_error for not-found)
- Uses uteke.pin()/unpin() from uteke-core
Closes #588
* fix(core): add room tables to SCHEMA constant
Add rooms and room_memories CREATE TABLE statements to SCHEMA
so fresh databases get room tables without needing migration.
Matches migration v2βv3 columns exactly:
- rooms: id, title, namespace, created_at, updated_at
- room_memories: room_id, memory_id, author, role, joined_at
* deps: update crossbeam-epoch 0.9.18 β 0.9.20
Fixes RUSTSEC-2026-0204 (invalid pointer dereference in
fmt::Pointer impl for Atomic/Shared).
Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch
No code changes β Cargo.lock only.
* fix(ci): graceful sync workflow + add missing cargo audit ignores (#598)
- project-sync.yml: exit 0 when PR has no linked closing issues and is
not on the project board, preventing spurious failures under set -e
- security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and
RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* docs: fix 16 documentation gaps + update for v0.7.0 features (#582)
- cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7
- mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note
- docker: v0.6.7 tag, expand MCP tools table to full list
- architecture: schema v10βv12, cross-process file lock, slim Docker model path
- hermes: clarify Mode B deprecation scope, add memory-provider section
- README/README.id: version badge v0.6.7
- AGENT.md: version 0.6.7, main branch protection updated
* feat: add 'uteke update' self-update command (#581)
Check for latest release on GitHub, compare against installed version,
prompt for confirmation, download with checksum verification, and
atomically replace the running binary.
Features:
- Detects current binary path automatically
- OS/arch detection (linux/darwin, x86_64/aarch64)
- Primary: parse GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- SHA256 checksum verification from release assets
- Archive path traversal protection (CWE-22)
- Atomic rename replace (safe on POSIX)
- New binary verification before swap
- --yes flag for non-interactive / CI use
- Already-up-to-date detection (skip download)
- Missing dev headers warning for cargo-installed binaries
Closes #581
* fix: rename update command to upgrade β fix 5 compilation errors
- Rename Commands::Update β Commands::Upgrade to avoid collision with
existing document update command (uteke doc update <id>)
- Remove from AgingCommands (semantically wrong β self-update is not aging)
- Change return type from Result<(), Box<dyn Error>> β Result<(), String>
to match the dispatcher contract
- Fix entry.path() bug: was calling .map_err() on Cow<Path> which is
not a Result type
- Fix all .into() calls that no longer compile with String error type
- Rename update.rs β upgrade.rs module file
* fix: move Upgrade variant from DocCommands to Commands enum
Upgrade was accidentally placed inside DocCommands enum instead of the
top-level Commands enum. This caused:
- E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it)
- E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it)
* fix(security): fail-hard on checksum verification failure during upgrade
Previously, uteke upgrade silently skipped SHA-256 checksum verification
when the checksums file failed to download or the archive name was not
found. This allowed a MITM attack to deliver a tampered binary.
Changes:
- Fail with Err when checksums download fails (network error or HTTP error)
- Fail when archive checksum is missing from checksums file
- Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass
- Cleanup temp files on all failure paths
Found by: cora scan (glm-5.2 via Bifrost)
* feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606)
Move Extractor from uteke-cli to uteke-core for server reuse.
Add three new HTTP endpoints to uteke-serve:
- POST /extract: LLM fact extraction + auto-store (1MB limit)
- POST /import: JSONL import with re-embedding (5MB limit)
- GET /export: JSONL export (optional ?namespace= filter)
Extraction reads [extraction] config from uteke.toml.
API key never accepted from request body (config/env only).
Write token required for all three endpoints.
Closes #604, #605, #606
* fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String
CI caught E0308: if/else arms had incompatible types.
Explicit annotate as String and use .to_owned() for the &str branch.
* fix(server): import tiny_http::Header in handlers.rs
E0433 in /export handler β Header::from_bytes used without import.
* fix: resolve all clippy warnings
- handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching)
- handlers.rs: &ctx β ctx (needless borrow)
- types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired)
- extract.rs: #[allow(unused_imports)] on re-exports module
* feat(server): maintenance + monitoring endpoints (#607 #608)
Add 6 new HTTP endpoints to uteke-serve:
Maintenance (#607):
- POST /prune: TTL-based deprecated memory cleanup (dry_run support)
- POST /consolidate: near-duplicate merging (dry_run support)
- POST /aging: memory lifecycle management (status/preview/cleanup)
Monitoring (#608):
- POST /importance: recalculate importance scores
- POST /orphans: find disconnected low-importance memories (read-only)
- POST /rebuild-backlinks: rebuild referenced_by from forward edges
All destructive endpoints require write token.
/orphans allows read-only token (read-only query).
Aging cleanup supports dry_run for safety preview.
Closes #607, #608
* fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet
* feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md
- Add init_opencode and init_opencode_memory_provider functions
(AGENTS.md-based integration, matching OpenCode's convention)
- Refactor init_pi to use install_skill_md() helper instead of
hardcoded inline SKILL.md content (-43 lines)
- Update CLI help text to include opencode in --agent list
- Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms,
knowledge graph, pinning, dream pipeline, timeline, upgrade)
- Fix escaped-quote bug in install_skill_md error messages
Breaking: none. All changes additive.
* refactor(core): remove namespace isolation from documents (#614)
- Migration v12βv13: add author column, deprecate namespace on documents,
migrate duplicate slugs across namespaces to slug-nsname format,
create global unique slug index
- Remove namespace params from all doc_* functions in lib.rs and store
- Remove namespace fields from server request structs and MCP tools
- Update CLI commands to not accept namespace args
- Fix DocumentSummary initializer (add author field)
- Fix recall_unified_* callers (remove stale Some(ns) from doc_search)
- All consumers verified: CLI, server, MCP β zero namespace references remain
* fix(tests): update schema version assertions to 13
- Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12
- Fix clippy warning: unused variable config in doc command
* feat: project-aware memory tagging for noise-free recall
Add automatic project detection and tag-based scoping to all memory
operations. This prevents noise when recalling β agents only see memories
relevant to the current project.
Changes:
- SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules,
examples, and rationale for project:{name} tagging
- pi-memory-provider extension: Auto-detect project from cwd and user
prompt text, filter recall by --tags project:<name>, auto-tag remember
commands with project:<name>
- Hermes hook extract (external): Auto-detect project from session
messages file paths, add project:<name> tag on auto-extract
- Hermes hook recall (external): Auto-detect project from user_message,
filter recall by --tags project:<name>
Detection strategies:
1. File paths: /repos/<project>/ pattern matching
2. CWD: walk up from current directory to known project roots
3. Majority vote when multiple projects mentioned in session
No Uteke binary changes required β all implemented via existing --tags
flag support.
* chore: release v0.7.0 prep β changelog, version bump, docs, dep versions
- Cargo.toml: workspace version 0.6.7 β 0.7.0
- crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0
- CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7)
- docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init
- docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram
- docs/multi-agent.md: add 'Documents Are Global' section
- docs/docker.md: update version example to v0.7.0
* fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace
- cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export,
prune, consolidate, aging, importance, orphans, rebuild-backlinks)
- cli-reference.md: fix doc list description (documents are global, not namespace-scoped)
- CHANGELOG.md: add missing [0.7.0] comparison link
- VitePress config.ts: fix document-commands anchor link (pre-existing broken)
* fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata
- fix(core): add retry logic (3 attempts, exponential backoff) around
embedding generation to prevent silent vector index desync (#621)
- fix(core): retry index.save() up to 3 times in both remember and
forget to prevent orphan entries on transient I/O failures (#621)
- fix(cli): read from stdin when content argument is '-' instead of
storing literal dash string (#620)
- fix(cli): change room recall default limit from 20 to 0 (all) since
rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623)
- fix(core): enrich room recall memories with author from room_memories
table, injected into metadata JSON field (#624)
Note: #622 (line numbers in recall JSON) is a data issue β content was
stored with line numbers from read_file output. Not a code bug.
* chore(deps): bump clap_complete from 4.6.6 to 4.6.7
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)
---
updated-dependencies:
- dependency-name: clap_complete
dependency-version: 4.6.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore: release v0.7.1 prep β version bump, changelog, docs
- Workspace version 0.7.0 β 0.7.1
- Crate dependency versions synced
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618)
* fix(ci): restore main branch in pull_request trigger
PR #613 removed 'main' from CI pull_request branches, which blocks
sync developβmain PRs from getting CI checks. Branch protection on main
requires Check, Format, Clippy, Test, Build β impossible without CI trigger.
Restore to [develop, main] matching v0.7.0 release behavior.
* fix(server): raise /doc/list default limit from 5 to 1000 (#634)
The document list endpoint reused the memory pagination default of 5.
Clients building a full hierarchy client-side (e.g. Corin's doc tree)
silently saw only 5 documents when omitting .
Documents are not paginated like memories, so add a dedicated
default_doc_limit() = 1000 and apply it to DocListParams only.
* feat(server): report version in /health response (#636)
* feat(server): report version in /health response
Add a `version` field (uteke-server crate version) to GET /health so
HTTP clients can gate features on the actual server capability.
This matters for remote deployments: Corin previously derived the
uteke version from the local `uteke` CLI, which is meaningless when
talking to a user-managed remote server that may be older or newer.
With /health reporting version, clients can probe the server directly.
Backward compatible β `version` is an added JSON field.
* style: wrap /health help line to satisfy rustfmt max_width
CI rustfmt wraps the >100-col println! to match the existing /list
help-text convention; local fmt did not flag it (toolchain mismatch).
* fix(core): defensive datetime parsing β tolerate missing timezone in RFC3339 fields (#635)
One corrupted row (updated_at without timezone suffix, e.g. '2026-07-09T19:53:45.493962')
caused load_all() to crash with 'premature end of input' because
chrono::DateTime::parse_from_rfc3339() requires the +HH:MM/Z suffix.
Two-pronged fix:
1. Parsing: Add parse_datetime_flexible() that tries strict RFC3339 first,
then falls back to appending +00:00 (assumes UTC) for ISO 8601 strings
without timezone. Applied to created_at, updated_at (required fields)
and last_accessed, valid_from, valid_until (optional fields).
2. Data repair: Add repair_datetime_timezones() as a post-migration
consistency check in ensure_schema_version(). Idempotent β scans
memories + documents for datetime strings missing timezone suffix and
appends +00:00. Runs on every DB open, auto-fixes legacy data.
Files changed:
- store.rs: parse_datetime_flexible() + parse_datetime_opt() helpers,
updated row_to_memory() to use them
- schema.rs: repair_datetime_timezones() in ensure_schema_version()
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* chore: release v0.7.2 prep β version bump, changelog (#637)
- Workspace version 0.7.1 β 0.7.2
- Crate dependency versions synced (uteke-core, uteke-mcp)
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.2] with #634, #635, #636
Post-v0.7.1 fixes:
- #634 POST /doc/list default limit 5 β 1000
- #635 defensive datetime parsing (corruption row crash fix)
- #636 version field in /health response
* release: v0.7.1 β develop β main (#633) (#638)
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links
* feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579)
Add partial document update endpoint to uteke-serve HTTP API.
Changes:
- documents.rs: update_document() β dynamic SET clause, only updates provided
fields, always increments version, returns updated doc
- lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds
chunks + re-embeds if content changed
- types.rs: DocUpdateRequest struct + resolve_doc_id_update helper
- handlers.rs: POST /doc/update route with 404 for missing docs
API:
POST /doc/update { id | slug, title?, content?, tags?, metadata? }
β Full document (version incremented)
β 404 if not found
Partial update semantics: only fields present in request are modified.
Content changes trigger chunk rebuild (old chunks deleted, new ones
embedded and indexed). Non-content updates (title, tags) skip re-chunking.
Follow-up to Corin #139 β Corin DocumentsView will use this for Save.
* fix: clippy β remove unused variables, use if-let instead of unwrap
* feat: add CLI command for partial document updates (#589)
- Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags
- Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.)
- Content changes trigger chunk rebuild; metadata/title-only skip it
- Validates at least one field is provided
- Parses --metadata as JSON string
- Supports --file - for stdin content input
- Document in docs/cli-reference.md with examples and flag table
Closes #589
* feat(mcp): add uteke_doc_move tool (#585)
- Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional)
- Add exec_doc_move() calling uteke.doc_move()
- Register in tools/list and tools/call dispatcher
* feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586)
MCP room coverage is now 8/8 (was 2/8). New tools:
- uteke_room_create: create room with optional title/namespace
- uteke_room_list: list rooms with optional namespace filter
- uteke_room_delete: delete room (memories preserved)
- uteke_room_stats: memory count, participants, activity
- uteke_room_summary: topic clustering, decisions, highlights
- uteke_room_document: structured document by memory type
* style: fix cargo fmt for room_list executor
* feat(mcp): add uteke_doc_update tool (#584)
Add MCP tool for partial document update. Content changes trigger
automatic chunk rebuild; title/tags/metadata-only updates skip rebuild.
Closes #584
* chore: trigger CI re-run
* chore: trigger CI re-run
* ci: trigger Cora Review re-run
* feat(mcp): add tag management tools β list, rename, delete (#587)
- uteke_tags_list: list tags with counts, optional namespace filter + sort
- uteke_tags_rename: rename tag across all memories atomically
- uteke_tags_delete: delete tag from all memories
Rebased on develop (includes room tools from PR #594).
Closes #587
* feat(mcp): add pin/unpin tools for memory persistence (#588)
Add uteke_pin and uteke_unpin MCP tools, matching existing
POST /pin and POST /unpin HTTP endpoints.
- tool_pin(): pin memory by ID, immune to decay/pruning
- tool_unpin(): unpin memory, restore normal decay
- Follows existing ToolResult pattern (is_error for not-found)
- Uses uteke.pin()/unpin() from uteke-core
Closes #588
* fix(core): add room tables to SCHEMA constant
Add rooms and room_memories CREATE TABLE statements to SCHEMA
so fresh databases get room tables without needing migration.
Matches migration v2βv3 columns exactly:
- rooms: id, title, namespace, created_at, updated_at
- room_memories: room_id, memory_id, author, role, joined_at
* deps: update crossbeam-epoch 0.9.18 β 0.9.20
Fixes RUSTSEC-2026-0204 (invalid pointer dereference in
fmt::Pointer impl for Atomic/Shared).
Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch
No code changes β Cargo.lock only.
* fix(ci): graceful sync workflow + add missing cargo audit ignores (#598)
- project-sync.yml: exit 0 when PR has no linked closing issues and is
not on the project board, preventing spurious failures under set -e
- security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and
RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps
* docs: fix 16 documentation gaps + update for v0.7.0 features (#582)
- cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7
- mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note
- docker: v0.6.7 tag, expand MCP tools table to full list
- architecture: schema v10βv12, cross-process file lock, slim Docker model path
- hermes: clarify Mode B deprecation scope, add memory-provider section
- README/README.id: version badge v0.6.7
- AGENT.md: version 0.6.7, main branch protection updated
* feat: add 'uteke update' self-update command (#581)
Check for latest release on GitHub, compare against installed version,
prompt for confirmation, download with checksum verification, and
atomically replace the running binary.
Features:
- Detects current binary path automatically
- OS/arch detection (linux/darwin, x86_64/aarch64)
- Primary: parse GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- SHA256 checksum verification from release assets
- Archive path traversal protection (CWE-22)
- Atomic rename replace (safe on POSIX)
- New binary verification before swap
- --yes flag for non-interactive / CI use
- Already-up-to-date detection (skip download)
- Missing dev headers warning for cargo-installed binaries
Closes #581
* fix: rename update command to upgrade β fix 5 compilation errors
- Rename Commands::Update β Commands::Upgrade to avoid collision with
existing document update command (uteke doc update <id>)
- Remove from AgingCommands (semantically wrong β self-update is not aging)
- Change return type from Result<(), Box<dyn Error>> β Result<(), String>
to match the dispatcher contract
- Fix entry.path() bug: was calling .map_err() on Cow<Path> which is
not a Result type
- Fix all .into() calls that no longer compile with String error type
- Rename update.rs β upgrade.rs module file
* fix: move Upgrade variant from DocCommands to Commands enum
Upgrade was accidentally placed inside DocCommands enum instead of the
top-level Commands enum. This caused:
- E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it)
- E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it)
* fix(security): fail-hard on checksum verification failure during upgrade
Previously, uteke upgrade silently skipped SHA-256 checksum verification
when the checksums file failed to download or the archive name was not
found. This allowed a MITM attack to deliver a tampered binary.
Changes:
- Fail with Err when checksums download fails (network error or HTTP error)
- Fail when archive checksum is missing from checksums file
- Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass
- Cleanup temp files on all failure paths
Found by: cora scan (glm-5.2 via Bifrost)
* feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606)
Move Extractor from uteke-cli to uteke-core for server reuse.
Add three new HTTP endpoints to uteke-serve:
- POST /extract: LLM fact extraction + auto-store (1MB limit)
- POST /import: JSONL import with re-embedding (5MB limit)
- GET /export: JSONL export (optional ?namespace= filter)
Extraction reads [extraction] config from uteke.toml.
API key never accepted from request body (config/env only).
Write token required for all three endpoints.
Closes #604, #605, #606
* fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String
CI caught E0308: if/else arms had incompatible types.
Explicit annotate as String and use .to_owned() for the &str branch.
* fix(server): import tiny_http::Header in handlers.rs
E0433 in /export handler β Header::from_bytes used without import.
* fix: resolve all clippy warnings
- handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching)
- handlers.rs: &ctx β ctx (needless borrow)
- types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired)
- extract.rs: #[allow(unused_imports)] on re-exports module
* feat(server): maintenance + monitoring endpoints (#607 #608)
Add 6 new HTTP endpoints to uteke-serve:
Maintenance (#607):
- POST /prune: TTL-based deprecated memory cleanup (dry_run support)
- POST /consolidate: near-duplicate merging (dry_run support)
- POST /aging: memory lifecycle management (status/preview/cleanup)
Monitoring (#608):
- POST /importance: recalculate importance scores
- POST /orphans: find disconnected low-importance memories (read-only)
- POST /rebuild-backlinks: rebuild referenced_by from forward edges
All destructive endpoints require write token.
/orphans allows read-only token (read-only query).
Aging cleanup supports dry_run for safety preview.
Closes #607, #608
* fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet
* feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md
- Add init_opencode and init_opencode_memory_provider functions
(AGENTS.md-based integration, matching OpenCode's convention)
- Refactor init_pi to use install_skill_md() helper instead of
hardcoded inline SKILL.md content (-43 lines)
- Update CLI help text to include opencode in --agent list
- Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms,
knowledge graph, pinning, dream pipeline, timeline, upgrade)
- Fix escaped-quote bug in install_skill_md error messages
Breaking: none. All changes additive.
* refactor(core): remove namespace isolation from documents (#614)
- Migration v12βv13: add author column, deprecate namespace on documents,
migrate duplicate slugs across namespaces to slug-nsname format,
create global unique slug index
- Remove namespace params from all doc_* functions in lib.rs and store
- Remove namespace fields from server request structs and MCP tools
- Update CLI commands to not accept namespace args
- Fix DocumentSummary initializer (add author field)
- Fix recall_unified_* callers (remove stale Some(ns) from doc_search)
- All consumers verified: CLI, server, MCP β zero namespace references remain
* fix(tests): update schema version assertions to 13
- Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12
- Fix clippy warning: unused variable config in doc command
* feat: project-aware memory tagging for noise-free recall
Add automatic project detection and tag-based scoping to all memory
operations. This prevents noise when recalling β agents only see memories
relevant to the current project.
Changes:
- SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules,
examples, and rationale for project:{name} tagging
- pi-memory-provider extension: Auto-detect project from cwd and user
prompt text, filter recall by --tags project:<name>, auto-tag remember
commands with project:<name>
- Hermes hook extract (external): Auto-detect project from session
messages file paths, add project:<name> tag on auto-extract
- Hermes hook recall (external): Auto-detect project from user_message,
filter recall by --tags project:<name>
Detection strategies:
1. File paths: /repos/<project>/ pattern matching
2. CWD: walk up from current directory to known project roots
3. Majority vote when multiple projects mentioned in session
No Uteke binary changes required β all implemented via existing --tags
flag support.
* chore: release v0.7.0 prep β changelog, version bump, docs, dep versions
- Cargo.toml: workspace version 0.6.7 β 0.7.0
- crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0
- CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7)
- docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init
- docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram
- docs/multi-agent.md: add 'Documents Are Global' section
- docs/docker.md: update version example to v0.7.0
* fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace
- cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export,
prune, consolidate, aging, importance, orphans, rebuild-backlinks)
- cli-reference.md: fix doc list description (documents are global, not namespace-scoped)
- CHANGELOG.md: add missing [0.7.0] comparison link
- VitePress config.ts: fix document-commands anchor link (pre-existing broken)
* fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata
- fix(core): add retry logic (3 attempts, exponential backoff) around
embedding generation to prevent silent vector index desync (#621)
- fix(core): retry index.save() up to 3 times in both remember and
forget to prevent orphan entries on transient I/O failures (#621)
- fix(cli): read from stdin when content argument is '-' instead of
storing literal dash string (#620)
- fix(cli): change room recall default limit from 20 to 0 (all) since
rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623)
- fix(core): enrich room recall memories with author from room_memories
table, injected into metadata JSON field (#624)
Note: #622 (line numbers in recall JSON) is a data issue β content was
stored with line numbers from read_file output. Not a code bug.
* chore(deps): bump clap_complete from 4.6.6 to 4.6.7
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)
---
updated-dependencies:
- dependency-name: clap_complete
dependency-version: 4.6.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
* chore: release v0.7.1 prep β version bump, changelog, docs
- Workspace version 0.7.0 β 0.7.1
- Crate dependency versions synced
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618)
* fix(ci): restore main branch in pull_request trigger
PR #613 removed 'main' from CI pull_request branches, which blocks
sync developβmain PRs from getting CI checks. Branch protection on main
requires Check, Format, Clippy, Test, Build β impossible without CI trigger.
Restore to [develop, main] matching v0.7.0 release behavior.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* release: v0.7.1 β develop β main (#633) (#639)
* docs: fix CHANGELOG β add v0.6.5 section, reorder descending, complete version links
* feat: POST /doc/update endpoint β partial document update with chunk rebuild (#579)
Add partial document update endpoint to uteke-serve HTTP API.
Changes:
- documents.rs: update_document() β dynamic SET clause, only updates provided
fields, always increments version, returns updated doc
- lib.rs: doc_update() β resolves doc by id/slug, partial update, rebuilds
chunks + re-embeds if content changed
- types.rs: DocUpdateRequest struct + resolve_doc_id_update helper
- handlers.rs: POST /doc/update route with 404 for missing docs
API:
POST /doc/update { id | slug, title?, content?, tags?, metadata? }
β Full document (version incremented)
β 404 if not found
Partial update semantics: only fields present in request are modified.
Content changes trigger chunk rebuild (old chunks deleted, new ones
embedded and indexed). Non-content updates (title, tags) skip re-chunking.
Follow-up to Corin #139 β Corin DocumentsView will use this for Save.
* fix: clippy β remove unused variables, use if-let instead of unwrap
* feat: add CLI command for partial document updates (#589)
- Add DocCommands::Update variant with --title, --content, --file, --tags, --metadata flags
- Calls uteke_core::doc_update() directly for partial updates (title-only, tags-only, etc.)
- Content changes trigger chunk rebuild; metadata/title-only skip it
- Validates at least one field is provided
- Parses --metadata as JSON string
- Supports --file - for stdin content input
- Document in docs/cli-reference.md with examples and flag table
Closes #589
* feat(mcp): add uteke_doc_move tool (#585)
- Add tool_doc_move() with inputSchema: id (required), parent (optional), namespace (optional)
- Add exec_doc_move() calling uteke.doc_move()
- Register in tools/list and tools/call dispatcher
* feat(mcp): add 6 room tools β create, list, delete, stats, summary, document (#586)
MCP room coverage is now 8/8 (was 2/8). New tools:
- uteke_room_create: create room with optional title/namespace
- uteke_room_list: list rooms with optional namespace filter
- uteke_room_delete: delete room (memories preserved)
- uteke_room_stats: memory count, participants, activity
- uteke_room_summary: topic clustering, decisions, highlights
- uteke_room_document: structured document by memory type
* style: fix cargo fmt for room_list executor
* feat(mcp): add uteke_doc_update tool (#584)
Add MCP tool for partial document update. Content changes trigger
automatic chunk rebuild; title/tags/metadata-only updates skip rebuild.
Closes #584
* chore: trigger CI re-run
* chore: trigger CI re-run
* ci: trigger Cora Review re-run
* feat(mcp): add tag management tools β list, rename, delete (#587)
- uteke_tags_list: list tags with counts, optional namespace filter + sort
- uteke_tags_rename: rename tag across all memories atomically
- uteke_tags_delete: delete tag from all memories
Rebased on develop (includes room tools from PR #594).
Closes #587
* feat(mcp): add pin/unpin tools for memory persistence (#588)
Add uteke_pin and uteke_unpin MCP tools, matching existing
POST /pin and POST /unpin HTTP endpoints.
- tool_pin(): pin memory by ID, immune to decay/pruning
- tool_unpin(): unpin memory, restore normal decay
- Follows existing ToolResult pattern (is_error for not-found)
- Uses uteke.pin()/unpin() from uteke-core
Closes #588
* fix(core): add room tables to SCHEMA constant
Add rooms and room_memories CREATE TABLE statements to SCHEMA
so fresh databases get room tables without needing migration.
Matches migration v2βv3 columns exactly:
- rooms: id, title, namespace, created_at, updated_at
- room_memories: room_id, memory_id, author, role, joined_at
* deps: update crossbeam-epoch 0.9.18 β 0.9.20
Fixes RUSTSEC-2026-0204 (invalid pointer dereference in
fmt::Pointer impl for Atomic/Shared).
Path: uteke-core β tokenizers β rayon β rayon-core β crossbeam-deque β crossbeam-epoch
No code changes β Cargo.lock only.
* fix(ci): graceful sync workflow + add missing cargo audit ignores (#598)
- project-sync.yml: exit 0 when PR has no linked closing issues and is
not on the project board, preventing spurious failures under set -e
- security.yml: ignore RUSTSEC-2026-0202 (cxx unsound) and
RUSTSEC-2026-0190 (anyhow unsound) β transitive deps awaiting upstream bumps
* docs: fix 16 documentation gaps + update for v0.7.0 features (#582)
- cli-reference: add 10 HTTP endpoints, memory-provider init, version v0.6.7
- mcp: tool count 15β28, add room/tag/pin/doc tools, JSON-RPC 2.0 note
- docker: v0.6.7 tag, expand MCP tools table to full list
- architecture: schema v10βv12, cross-process file lock, slim Docker model path
- hermes: clarify Mode B deprecation scope, add memory-provider section
- README/README.id: version badge v0.6.7
- AGENT.md: version 0.6.7, main branch protection updated
* feat: add 'uteke update' self-update command (#581)
Check for latest release on GitHub, compare against installed version,
prompt for confirmation, download with checksum verification, and
atomically replace the running binary.
Features:
- Detects current binary path automatically
- OS/arch detection (linux/darwin, x86_64/aarch64)
- Primary: parse GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- SHA256 checksum verification from release assets
- Archive path traversal protection (CWE-22)
- Atomic rename replace (safe on POSIX)
- New binary verification before swap
- --yes flag for non-interactive / CI use
- Already-up-to-date detection (skip download)
- Missing dev headers warning for cargo-installed binaries
Closes #581
* fix: rename update command to upgrade β fix 5 compilation errors
- Rename Commands::Update β Commands::Upgrade to avoid collision with
existing document update command (uteke doc update <id>)
- Remove from AgingCommands (semantically wrong β self-update is not aging)
- Change return type from Result<(), Box<dyn Error>> β Result<(), String>
to match the dispatcher contract
- Fix entry.path() bug: was calling .map_err() on Cow<Path> which is
not a Result type
- Fix all .into() calls that no longer compile with String error type
- Rename update.rs β upgrade.rs module file
* fix: move Upgrade variant from DocCommands to Commands enum
Upgrade was accidentally placed inside DocCommands enum instead of the
top-level Commands enum. This caused:
- E0599: no variant 'Upgrade' in Commands (dispatcher couldn't find it)
- E0004: non-exhaustive DocCommands::Upgrade (doc handler doesn't handle it)
* fix(security): fail-hard on checksum verification failure during upgrade
Previously, uteke upgrade silently skipped SHA-256 checksum verification
when the checksums file failed to download or the archive name was not
found. This allowed a MITM attack to deliver a tampered binary.
Changes:
- Fail with Err when checksums download fails (network error or HTTP error)
- Fail when archive checksum is missing from checksums file
- Add UTEKE_UPGRADE_SKIP_CHECKSUM=1 env opt-in for explicit bypass
- Cleanup temp files on all failure paths
Found by: cora scan (glm-5.2 via Bifrost)
* feat(server): POST /extract, POST /import, GET /export endpoints (#604 #605 #606)
Move Extractor from uteke-cli to uteke-core for server reuse.
Add three new HTTP endpoints to uteke-serve:
- POST /extract: LLM fact extraction + auto-store (1MB limit)
- POST /import: JSONL import with re-embedding (5MB limit)
- GET /export: JSONL export (optional ?namespace= filter)
Extraction reads [extraction] config from uteke.toml.
API key never accepted from request body (config/env only).
Write token required for all three endpoints.
Closes #604, #605, #606
* fix(core): type mismatch in Extractor::new β DEFAULT_MODEL is &str, config.model is String
CI caught E0308: if/else arms had incompatible types.
Explicit annotate as String and use .to_owned() for the &str branch.
* fix(server): import tiny_http::Header in handlers.rs
E0433 in /export handler β Header::from_bytes used without import.
* fix: resolve all clippy warnings
- handlers.rs: if let Err(_) β .is_err() (2x redundant pattern matching)
- handlers.rs: &ctx β ctx (needless borrow)
- types.rs: #[allow(dead_code)] on ImportRequest.tags (not yet wired)
- extract.rs: #[allow(unused_imports)] on re-exports module
* feat(server): maintenance + monitoring endpoints (#607 #608)
Add 6 new HTTP endpoints to uteke-serve:
Maintenance (#607):
- POST /prune: TTL-based deprecated memory cleanup (dry_run support)
- POST /consolidate: near-duplicate merging (dry_run support)
- POST /aging: memory lifecycle management (status/preview/cleanup)
Monitoring (#608):
- POST /importance: recalculate importance scores
- POST /orphans: find disconnected low-importance memories (read-only)
- POST /rebuild-backlinks: rebuild referenced_by from forward edges
All destructive endpoints require write token.
/orphans allows read-only token (read-only query).
Aging cleanup supports dry_run for safety preview.
Closes #607, #608
* fix: allow dead_code on ImportanceRequest.namespace and RebuildBacklinksRequest.quiet
* feat(cli): add opencode init support + refactor init_pi to use bundled SKILL.md
- Add init_opencode and init_opencode_memory_provider functions
(AGENTS.md-based integration, matching OpenCode's convention)
- Refactor init_pi to use install_skill_md() helper instead of
hardcoded inline SKILL.md content (-43 lines)
- Update CLI help text to include opencode in --agent list
- Update bundled SKILL.md to v0.6.7 (add docs, graph, rooms,
knowledge graph, pinning, dream pipeline, timeline, upgrade)
- Fix escaped-quote bug in install_skill_md error messages
Breaking: none. All changes additive.
* refactor(core): remove namespace isolation from documents (#614)
- Migration v12βv13: add author column, deprecate namespace on documents,
migrate duplicate slugs across namespaces to slug-nsname format,
create global unique slug index
- Remove namespace params from all doc_* functions in lib.rs and store
- Remove namespace fields from server request structs and MCP tools
- Update CLI commands to not accept namespace args
- Fix DocumentSummary initializer (add author field)
- Fix recall_unified_* callers (remove stale Some(ns) from doc_search)
- All consumers verified: CLI, server, MCP β zero namespace references remain
* fix(tests): update schema version assertions to 13
- Update 4 migration tests that still asserted CURRENT_SCHEMA_VERSION=12
- Fix clippy warning: unused variable config in doc command
* feat: project-aware memory tagging for noise-free recall
Add automatic project detection and tag-based scoping to all memory
operations. This prevents noise when recalling β agents only see memories
relevant to the current project.
Changes:
- SKILL.md: Add 'Project-Aware Memory (MANDATORY)' section with rules,
examples, and rationale for project:{name} tagging
- pi-memory-provider extension: Auto-detect project from cwd and user
prompt text, filter recall by --tags project:<name>, auto-tag remember
commands with project:<name>
- Hermes hook extract (external): Auto-detect project from session
messages file paths, add project:<name> tag on auto-extract
- Hermes hook recall (external): Auto-detect project from user_message,
filter recall by --tags project:<name>
Detection strategies:
1. File paths: /repos/<project>/ pattern matching
2. CWD: walk up from current directory to known project roots
3. Majority vote when multiple projects mentioned in session
No Uteke binary changes required β all implemented via existing --tags
flag support.
* chore: release v0.7.0 prep β changelog, version bump, docs, dep versions
- Cargo.toml: workspace version 0.6.7 β 0.7.0
- crates/*/Cargo.toml: uteke-core/uteke-mcp dep version 0.6.0 β 0.7.0
- CHANGELOG.md: add v0.7.0 section (18 PRs since v0.6.7)
- docs/cli-reference.md: version 0.7.0, uteke upgrade command, opencode init
- docs/architecture.md: schema v13, new HTTP endpoints, updated endpoint diagram
- docs/multi-agent.md: add 'Documents Are Global' section
- docs/docker.md: update version example to v0.7.0
* fix(docs): full audit β 9 missing HTTP endpoints, CHANGELOG link, anchors, doc list namespace
- cli-reference.md: add 9 new v0.7.0 HTTP endpoints (extract, import, export,
prune, consolidate, aging, importance, orphans, rebuild-backlinks)
- cli-reference.md: fix doc list description (documents are global, not namespace-scoped)
- CHANGELOG.md: add missing [0.7.0] comparison link
- VitePress config.ts: fix document-commands anchor link (pre-existing broken)
* fix(core,cli): resolve issues #620, #621, #623, #624 β vector desync, stdin pipe, room defaults, author metadata
- fix(core): add retry logic (3 attempts, exponential backoff) around
embedding generation to prevent silent vector index desync (#621)
- fix(core): retry index.save() up to 3 times in both remember and
forget to prevent orphan entries on transient I/O failures (#621)
- fix(cli): read from stdin when content argument is '-' instead of
storing literal dash string (#620)
- fix(cli): change room recall default limit from 20 to 0 (all) since
rooms are bounded contexts β add LIMIT clause only when limit > 0 (#623)
- fix(core): enrich room recall memories with author from room_memories
table, injected into metadata JSON field (#624)
Note: #622 (line numbers in recall JSON) is a data issue β content was
stored with line numbers from read_file output. Not a code bug.
* chore(deps): bump clap_complete from 4.6.6 to 4.6.7
Bumps [clap_complete](https://github.com/clap-rs/clap) from 4.6.6 to 4.6.7.
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.6.6...clap_complete-v4.6.7)
---
updated-dependencies:
- dependency-name: clap_complete
dependency-version: 4.6.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
* chore: release v0.7.1 prep β version bump, changelog, docs
- Workspace version 0.7.0 β 0.7.1
- Crate dependency versions synced
- Cargo.lock updated
- README.md + README.id.md badges updated
- AGENT.md version string updated
- docs/cli-reference.md version string updated
- docs/docker.md version tag updated
- CHANGELOG: [Unreleased] β [0.7.1] with post-v0.7.0 fixes (#620-#624, #613, #618)
* fix(ci): restore main branch in pull_request trigger
PR #613 removed 'main' from CI pull_request branches, which blocks
sync developβmain PRs from getting CI checks. Branch protection on main
requires Check, Format, Clippy, Test, Build β impossible without CI trigger.
Restore to [develop, main] matching v0.7.0 release behavior.
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: Optimize README for adoption β competitive positioning, infographic, benchmarks (#642)
- Rewrite README.md (EN) and README.id.md (ID) with punchy hook,
30-second quick start, and use-case driven structure
- Add comparison table: Uteke vs Mem0, AgentMemory, Letta, Zep, Engram
(6 columns, 9 rows: setup, API keys, offline, search, recall, rooms,
time-travel, graph edges, language)
- Add positioning callouts: Uteke vs Engram (same thesis, 10x features),
Uteke vs cloud tools (no API keys, no Docker, no cloud)
- Add FAQ entries for AgentMemory and Engram differentiation
- Add recall ~40ms badge to header
- Generate comparison infographic (docs/assets/uteke-comparison.png)
- Add performance benchmarks (docs/BENCHMARKS.md):
100/1K/10K memories, recall flat at ~42ms across all scales
- Source HTML for infographic saved (docs/assets/uteke-infographic.html)
Benchmark environment: Oracle ARM Ampere A1, 4 vCPU, ONNX CPU-only
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix: Fact-check all README claims against source code and live data (#643)
Corrected 11 inaccuracies across README.md, README.id.md, BENCHMARKS.md,
and infographic:
- Recall speed: 30ms β 45ms (matches benchmark: 40-45ms at 100-10K)
- Version: v0.7.1 β v0.7.2 (from Cargo.toml)
- Test count: 327 β 206 (actual #[test] + #[tokio::test] count)
- Mem0 stars: 48K β 60K (live GitHub API)
- Letta stars: 21K β 24K (live GitHub API)
- Zep stars: 24K β 5K (live GitHub API)
- Engram stars: 2.4K β 5K (top Engram repo)
- LongMemEval: removed from feature table (not shipped in binary)
- Embed Fallback: cloud API β no-op passthrough (never calls cloud)
- Server mode: removed fabricated 75x claim
- Infographic footer: Engram-centric tagline β Uteke-centric
- Re-rendered infographic PNG with all corrections
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix(core): include metadata field in UnifiedSearchResult recall output
recall JSON output now includes the metadata field from Memory,
closing a feature gap where consumers (agent, MCP, LongMemEval
benchmark) had to round-trip lookup by memory_id to access metadata.
- Add metadata: Option<serde_json::Value> to UnifiedSearchResult
- Populate from Memory.metadata in all 3 memory construction sites
- Set metadata: None for document results (documents have no metadata)
- skip_serializing_if = None keeps JSON clean for document results
- Updated test fixtures to cover the new field
* fix(benchmark): LongMemEval harness for uteke 0.7+ CLI changes + Mnemosyne comparison (#644)
* feat(benchmark): add Mnemosyne to comparison table, fix LongMemEval harness for uteke 0.7+
- README: add Mnemosyne column (closest competitor β same zero-dependency philosophy)
- Comparison highlights Uteke edges: Rust binary vs Python, curl|sh vs pip+venv, zero runtime deps
- Fix run_eval.py: tags positional β --tags flag (CLI v0.7 breaking change)
- Fix run_eval.py: recall session_id extraction via memory_id mapping (v0.7 recall JSON drops metadata fields)
- Quick test (5q): Recall@5=93.3%, NDCG@5=100% on temporal-reasoning subset
* docs(benchmark): add LongMemEval validation results
12-question diverse sample across all 6 question types:
- Overall: Recall@5=95.8%, NDCG@5=100%
- 5 of 6 types at 100% Recall@5
- knowledge-update at 75% (hardest β info changes over time)
* feat(benchmark): add resume support + periodic store reset for OOM prevention
- --resume flag: skip already-evaluated questions from existing results
- --reset-every N: wipe+recreate store every N questions (default 20)
Prevents memory buildup from uteke subprocess accumulation
- fout.flush() after each result for resume safety
Previous full run died at q75 (OOM/SIGKILL). With resume, can restart
from q69 without losing progress. With reset-every=10, store stays small.
---------
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix: use buffer-based serialization to bypass usearch C++ file I/O on Windows (#647) (#649)
Replace usearch's C++ fopen("wb") save with buffer-based serialization:
save_to_buffer() β std::fs::write() with atomic temp+rename pattern.
Root cause: usearch C++ output_file_t uses fopen("wb") which has known
Windows issues - MAX_PATH limit, exclusive access conflict with fs2
file lock (#543), and Windows Defender interference.
The buffer approach is safe because usearch already holds the full index
in RAM, serialized_length() returns exact buffer size, and atomic write
prevents corruption. Load still uses usearch native Index::restore() since
the on-disk format is identical.
Tests: existing save/load test + new round-trip test proving buffer-saved
files are loadable by usearch native restore. Both pass.
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* chore: release v0.7.3 prep β version bump, changelog, links (#650)
v0.7.2 β v0.7.3 patch release.
Changes since v0.7.2:
- Fixed: Windows vector index 0 bytes after save (#647)
- Fixed: recall --json missing metadata field (#646)
- Changed: README fact-check and optimization (#642, #643)
Release checklist:
- [x] Cargo.toml workspace version bump
- [x] Inter-crate version pins updated (4 crates)
- [x] Cargo.lock synced
- [x] CHANGELOG.md: [Unreleased] β [0.7.3] with empty [Unreleased]
- [x] CHANGELOG links: added 0.7.1, 0.7.2, 0.7.3 links
- [x] AGENT.md version string updated
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
HTTP clients (Corin) need to know the server's version to gate features. Corin currently derives the uteke version from the local
utekeCLI β meaningless when talking to a user-managed remote server that may be older or newer than the CLI. This causes false "uteke upgrade required" prompts for remote users.Change
Add a
versionfield toGET /health(uteke-server crate version viaCARGO_PKG_VERSION).{ "status": "ok", "version": "0.7.1", "memories": 123, "namespaces": 4 }Backward compatible β
versionis an added JSON field; existing consumers ignore it.Corin-side consumer: codecoradev/corin#159 (remote-aware version gating).
Checks
cargo fmt/cargo clippy -D warningsβcargo test -p uteke-serverβ