Skip to content

merge: develop β†’ main v0.13.2 - #998

Merged
ajianaz merged 6 commits into
mainfrom
merge/develop-to-main-v0.13.2
Aug 11, 2026
Merged

merge: develop β†’ main v0.13.2#998
ajianaz merged 6 commits into
mainfrom
merge/develop-to-main-v0.13.2

Conversation

@ajianaz

@ajianaz ajianaz commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

What

Sync develop β†’ main for v0.13.2 release.

Why

All changes since v0.13.1 have been merged to develop and CI-verified. This PR promotes them to main for tagging.

Changes

All commits from v0.13.1..develop (5 commits):

Testing

CI will run full suite on this PR.

ajianaz and others added 6 commits August 10, 2026 16:07
* feat: add update check to all surfaces (CLI, MCP, HTTP)

Move update-check logic from uteke-cli to uteke-core so all three
runtime surfaces share one code path. Each surface now notifies users
when a newer version is available.

Core (uteke-core/src/update_check.rs):
- UpdateInfo struct with is_update_available() + banner()
- check_cached(): instant cache lookup (24h TTL)
- check_network(): blocking GitHub fetch, updates cache
- check(): cached first, falls back to network
- check_and_notify(): prints banner to stderr if update available
- Cache file: ~/.config/uteke/update-cache.json
- Primary: GitHub 302 redirect (no API rate limit)
- Fallback: GitHub REST API
- 5 unit tests for version comparison + banner formatting

MCP server:
- Spawn detached background thread at startup
- Writes to stderr (MCP uses stdout for JSON-RPC)
- Uses check() which tries cache first

HTTP server:
- Background thread: check on startup + every 24h
- Logs via warn! for structured log visibility
- /health endpoint gains update_available field (from cache)
- Periodic loop respects SHUTDOWN flag (hourly wake for fast exit)

CLI (thin wrapper):
- Calls uteke_core::update_check::check_cached/check_network
- Respects update_check = false from uteke.toml (CLI-only config)

Tests: 479 pass, 0 fail, 0 warnings, 0 clippy errors

* fix: HTTP update check cache-first + regenerate API docs

- HTTP server update thread now tries cache before hitting network
- Regenerate docs/api-reference.md for new update_available field

* fix: use REPO constant for redirect URL parsing (cora review)

Avoid hardcoded repo path in strip_prefix β€” use format! with REPO
constant so it stays in sync if the repo path ever changes.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Root cause: load_all() returned rows with NULL embedding blobs, which
row_to_memory() silently converted to vec![]. When these reached
index.build(), the dimension validator rejected them (0 != 768),
crashing the server on startup and blocking repair_index.

Fix applied at two levels:
- SQL level: load_all() now filters 'WHERE embedding IS NOT NULL'
- Call sites: lib.rs and maintenance.rs add .filter(|m| !m.embedding.is_empty())
  as defense-in-depth guard before index.build()

Added regression test: test_load_all_excludes_null_embeddings

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* chore: update messaging hierarchy, install URL, banner & logo

- Tagline: 'Give your AI a memory...' β†’ 'One memory. Every agent. Zero cloud.'
- Subtitle: add MCP compatibility mention (Claude, Cursor, Copilot)
- Install: codecora.dev/install β†’ codecora.dev/uteke/install (3 locations)
- Docs hero: sync tagline + OG meta to new messaging
- Banner: new neural-network logo, updated tagline + install command
- Favicon: redesigned as memory graph icon (amber on dark)

* revert: roll back banner PNG and favicon SVG (assets not final)

Text changes (tagline, install URL, descriptions) remain.
Binary assets will be updated in a follow-up PR.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
* fix(core): handle absolute URLs in update check redirect parser

GitHub 302 redirects return absolute URLs
(https://github.com/codecoradev/uteke/releases/tag/v0.13.1),
not relative paths. The previous strip_prefix('/codecoradev/...')
always failed on absolute URLs, falling through to the rsplit
fallback which required a 'v' prefix.

Fix: use find() to locate the tag marker anywhere in the URL,
and relax the rsplit fallback to accept any non-empty tag.

Found by Cora Code review on PR #990.

* fix(core): use split_once for UTF-8 safe URL parsing in update check

Cora finding: byte-indexed slicing (&loc[idx+len..]) could panic on
non-char-boundary if Location header contains multi-byte UTF-8.

Replace with split_once() β€” idiomatic, zero-cost, UTF-8 safe.

---------

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
…#996)

Add --min 0.0 to recall command to evaluate raw retrieval ranking
without CLI default threshold (0.3) filtering relevant results.

Also document threshold chain inconsistency:
- CLI default: 0.3 (from config [recall] min_score)
- HTTP API default: 0.0 (DEFAULT_MIN_SCORE constant)
- MCP default: 0.0

This caused 8/500 false negatives in Oracle benchmark because
relevant sessions scoring 0.30-0.40 were silently filtered.

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
Version bump 0.13.1 β†’ 0.13.2 + CHANGELOG.

Changes since v0.13.1:
- feat: update check (CLI, MCP, HTTP) (#990)
- fix: NULL embeddings crash vector index (#992, #993)
- fix: absolute URL in update check redirect (#994)
- fix: LongMemEval benchmark threshold false negatives (#995, #996)
- chore: branding refresh (#991)

Co-authored-by: ajianaz <ajianaz@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

πŸ” Cora AI Code Review

⚠️ Review could not complete. Cora produced an empty result. Check the workflow logs for errors.


Review powered by cora-code Β· BYOK Β· MIT

@ajianaz
ajianaz merged commit bceba84 into main Aug 11, 2026
12 of 14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant