Releases: EverMind-AI/EverOS
Release list
EverOS 1.2.1
[embedding] and [rerank] configuration become optional at runtime — EverOS now boots with only [llm] configured and degrades into three capability tiers, with a new everos cascade backfill command to fill in rows written without an embedding provider.
This release also hardens the cascade queue's retry and delete handling, and fixes a path traversal in knowledge upload — see Security for the affected versions.
Added
[embedding]and[rerank]are now soft runtime dependencies — EverOS boots and serves requests with only[llm]configured. A missing or misconfigured embedding / rerank / multimodal provider no longer aborts startup; the accessor logs<provider>_capability_build_failedand reportsavailable=False. Features degrade into three tiers: Tier 1 ([llm]only) → KEYWORD search + add/flush + md writes + cascade sync; Tier 2 (+ [embedding]) → adds VECTOR/HYBRID search + reflection + skill extraction + backfill; Tier 3 (+ [rerank]) → adds AGENTIC search + knowledge write/search. Tier upgrades require a server restart. Downgrades are read-safe: knowledge documents stay readable / renamable / deletable after a Tier-3 → Tier-2 downgrade; only write and search endpoints return 422.everos cascade backfillCLI command — three-phase interactive backfill (vectors→clusters→skills, or--phase all) that upgrades Tier-1 rows to Tier-2 once[embedding]is configured. Each phase prints row / token estimates and blocks ony/N;--yes/-yfor CI. Exit codes:0success,1user declined,2phase preconditions unmet,3server running,4completed-with-failures,130SIGINT.- LanceDB schema v2 — the six business tables (
episode,atomic_fact,foresight,agent_case,agent_skill,knowledge_topic) now allowvector NULL, so cascade can write rows without vectors when[embedding]is unavailable and a later backfill fills them in. The migration runs once on first startup under a cross-processmemory_root_lock(fcntl.flock), followed by a per-tableoptimize(cleanup_older_than=timedelta(0))to physically prune older manifest versions. - Startup unbackfilled-rows banner — after the LanceDB lifespan, a sweep emits
unbackfilled_memory_rowswhen rows withvector IS NULLexist, pointing ateveros cascade backfill. - PyPI Trusted Publishing workflow — tag-triggered
.github/workflows/release.ymlbuilds, smoke-tests and uploads via OIDC (no stored token) behind thereleaseenvironment's manual-approval gate. A version / tag mismatch aborts the publish. Companion/releaseskill lives under.claude/skills/release/.
Changed
ProviderNotConfiguredError→ HTTP 422CAPABILITY_UNAVAILABLE— write / search endpoints that need embed or rerank now return 422 with a section-aware hint (pointing at theeveros.tomlsection, never atEVEROS_*env vars) instead of erroring at startup or 500-ing at request time.GET /healthreturns a PydanticHealthResponsemodel — with typedcapabilitiesanddisabled_featuresfields, so OpenAPI codegen produces real shapes instead ofadditionalProperties: true.MemoryRoot.default()→MemoryRoot.resolve()— renamed to make the precedence walk (--root/EVEROS_ROOT/ default) explicit. Adefault()alias is kept as a backward-compatibility shim that forwards toresolve()and emits aDeprecationWarning; it will be removed in a future major release, so update call sites when convenient.- Uncalibrated recall scores moved to their own name —
KEYWORDand single-routeVECTORsearches now report their top score asrecall_top_score_raw;recall_top_scoreis reserved for the calibrated methods (HYBRIDLR sigmoid,AGENTICcross-encoder), whose values share a comparable[0, 1]scale. Langfuse aggregates scores by name, so the previous single name meant a chart could average an unbounded BM25 score together with a probability. Every recall score also carriesmetadata = {"method": ..., "calibrated": ...}. Dashboards built onrecall_top_scorefor keyword search need to switch to the new name. - Docs and examples now use
/api/v2— README, QUICKSTART, thedocs/reference set, the Langfuse example andeveros demo --liveall call the canonical/api/v2prefix./api/v1keeps resolving to the same handlers, so nothing breaks, but it is now described as a legacy compatibility alias that may be removed in a future major release rather than a permanent one. New integrations should target/api/v2. cluster_repo.find_cluster_id_for_membernow requires(app_id, project_id, owner_id)— reverse-index lookups JOINClusterfor scope filtering.entry_idis per-owner unique by design, so the reverse index alone could collide across owners writing on the same day.- All six cascade handlers register unconditionally — a Tier-3 → Tier-2/1 downgrade no longer strands DELETE / PATCH events. Embed-requiring branches inside each handler body-guard on capability availability at execution time.
- Interactive TTY log level defaults to WARNING — keeps INFO lines from drowning out the backfill
y/Nprompts; non-interactive / CI stays at INFO, and--verbose/-vforces INFO. click>=8.1promoted to a first-class dependency — previously transitive via typer.typer.Abortandclick.exceptions.Abortare distinct classes under typer 0.15+, so the interrupt catch incascade backfillcovers both.- Test harness pins
EVEROS_ROOTto a temp path —conftest.pyscrubs everyEVEROS_*env var so a developer's~/.everos/everos.tomlcannot make tests accidentally green against a real provider.
Fixed
- Cascade retry classification and total-retry budget — the worker now catches
ExternalServiceError(transient embedding / LLM / rerank failures) and retries inline up to 3 times before marking a rowretryable=True. A total budget of 12 attempts across scanner cycles bounds retrying during a prolonged outage, andfailedrows withretryable=Falseon a stable mtime skip auto-retry, so editing and re-saving the md is what grants another attempt. - The reconciler no longer overwrites the worker's
mark_done—pending/processingrows with a stable mtime are no longer re-enqueued. SQLiteREALround-trip precision loss in mtime comparisons is absorbed with a 10 ms tolerance. - A file deleted while its
modifiedevent was still queued is now processed as a deletion — previously the handler raisedFileNotFoundError, which left a stale indexed row and a permanently failed queue item behind. - Stuck
optimize()escalates to a full index rebuild — after 5 consecutive failures the worker falls back todrop_index + create_indexinstead of letting compaction and version cleanup stay wedged (workaround for thelance-format/lance#7653panic path). - The embedding provider raises on HTTP 200 with empty
data— it previously returned zero-length vectors silently, corrupting search results. - Episode extraction retries on malformed LLM output — the synchronous
/flushpath retries everalgoValueError(typically a truncated provider response) twice with 1 s / 2 s backoff before surfacing a 500. - Filename validation on knowledge upload — NUL bytes and filenames longer than 255 UTF-8 bytes now fail fast with
InvalidInputError→ HTTP 400 instead of surfacing OS errors as a 500 with a half-written md file. - HTML upload no longer takes the UTF-8 fast path — knowledge upload's plaintext short-circuit uses an explicit allowlist (
text/plain,text/markdown,text/x-rst,text/x-markdown) plus known extensions;text/htmlis deliberately excluded so HTML still goes through everalgo'sclean_html_for_llm. Prevents a 503 when a Tier-3 user without[multimodal]uploads a markdown doc. - Broken table-of-contents links in
docs/api.md— the endpoint anchors still pointed at the pre-1.2.0#post-apiv1…slugs after the headings moved to/api/v2, leaving all five TOC links dead.
Removed
- README "Star us" section.
Security
-
Knowledge upload path traversal (CWE-22) — the knowledge document upload joined the untrusted multipart filename into
_original/verbatim, so an absolute or..-laden filename let a caller write attacker-controlled bytes outside the document directory. The filename is now reduced to a safe basename, and the resolved target is asserted to stay inside_original/before any filesystem touch.Affected: every release before
1.1.4, and1.2.0. Not affected:1.1.4. Fixed in:1.2.1. The fix shipped in1.1.4but was not present on the branch1.2.0was built from, so upgrading1.1.4 → 1.2.0reintroduced it.
Upgrade
pip install --upgrade everos # or: uv sync
On first startup after upgrading, LanceDB runs the schema-v2 migration once — it takes a cross-process lock and optimizes each table afterwards. No manual steps. If rows were written while [embedding] was unavailable, the startup banner will point you at everos cascade backfill to fill in their vectors.
Full changelog: v1.2.0...v1.2.1
EverOS 1.2.0
EverOS 1.2.0
Minor release adding the /api/v2 API prefix and native OpenTelemetry tracing.
Added
/api/v2API prefix — every business endpoint (memory/*,ome/*,knowledge/*) is now served under/api/v2, aligning the open-source API with the EverOS Cloud contract./api/v1is retained as a permanent, backward-compatible alias: both prefixes resolve to the same handlers with identical contracts, so existing integrations keep working unchanged.- Native OpenTelemetry tracing — memory operations (add/flush, memcell boundary, episode extraction, search, and OME reflection) export to any OTLP backend (e.g. Langfuse) as nested traces carrying LLM/embedding token usage, per-request correlation, and recall-quality scores. Off by default; enable via
[observability]with the optionalotelextra. Content capture (query / extracted memory) is opt-in and redaction-aware.
Upgrade
pip install --upgrade everos
Or update the project environment with uv sync.
Full changelog: v1.1.4...v1.2.0
EverOS 1.1.4
Note on the published package: the
everos==1.1.4release on PyPI was built from a separate internal release lane and contains fixes that are not in this tag's source — including a knowledge-upload path-traversal fix (CWE-22). See the 1.1.4 section ofCHANGELOG.mdfor the full list, and the v1.2.1 notes for the affected-version range.
EverOS 1.1.4
Patch release adding Langfuse observability and fixing cascade file deletion races.
Added
- Langfuse OpenTelemetry integration example for tracing add, flush and extraction, search, and reflection operations.
Fixed
- Process a queued modified event as a deletion when the source file disappears, preventing stale indexed rows and permanently failed queue items.
- Limit synthetic Langfuse child spans to responses with stage details so live-server traces use real telemetry.
Upgrade
pip install --upgrade everos
Or update the project environment with uv sync.
Full changelog: v1.1.3...v1.1.4
EverOS 1.1.3
EverOS 1.1.3
Fixes unbounded index growth from a LanceDB FTS regression.
Fixed
-
LanceDB FTS
with_positioncrashesoptimize(), bloating the index
until the disk fills. On lancedb ≥ 0.32, FTS indexes built with
with_position=Truecrash lance'soptimize()/ compaction when it merges
an unindexed tail (Max offset exceeds length of values— an upstream
lance-encodingv4 → v6 regression, reported at
lance-format/lance#7653).
Because the crash abortedoptimize()including version cleanup, the
index directory grew without bound.The fix:
- FTS now defaults to
with_position=False— lossless for EverOS, since
recall uses OR-mode BM25 and never runs phrase queries. - A marker-guarded startup migration rebuilds pre-fix indexes and reclaims
the orphaned fragments automatically. - Consecutive
optimize()failures now escalatewarning → errorinstead
of being swallowed silently.
- FTS now defaults to
Upgrade
pip install --upgrade everos # or: uv syncExisting installations are migrated automatically on next startup — the
pre-fix index is rebuilt once and the leaked fragments are reclaimed. No
manual steps required.
Full changelog: v1.1.2...v1.1.3
EverOS 1.1.2
EverOS 1.1.2
Fixes agent-track search.
Fixed
- Agent-track search broken by
deprecated_by IS NULLfilter.
compile_filters()unconditionally appended adeprecated_by IS NULL
clause to every LanceDB query, but only theepisodeandatomic_fact
tables carry that column. As a result, agent-track search (agent_case,
agent_skill) failed on every method. The clause is now applied
conditionally, only whenowner_type == "user".
Upgrade
pip install --upgrade everos # or: uv syncNo configuration or data-migration changes required.
Full changelog: v1.1.1...v1.1.2
EverOS 1.1.1
EverOS 1.1.1
EverOS 1.1.1 focuses on benchmark reproducibility, search quality, and keeping the public GitHub release aligned with the 1.1.1 source package while preserving GitHub-only project assets.
Highlights
- Added the LoCoMo benchmark runner under
benchmarks/, including TOML configuration, an environment template, staged ingestion/search/answer/judge execution, result artifacts, and benchmark documentation to make metric reproduction easier. - Improved hybrid search with heap-driven lazy expansion and global top-N competition. The 1.1.1 benchmark package reports stable LoCoMo targets around 91% for hybrid search and 93% for agentic search.
- Synced the 1.1.1 source package while preserving GitHub-only workflows, templates, contributor-doc checks, public release support, use-case material, and the existing English
README.mdstructure. - Expanded CI coverage to Python 3.12 and 3.13, refreshed package metadata, and kept docs/OpenAPI checks in the release flow.
- Updated quickstart, benchmark, Chinese README, docs index, and cross-document references for the current setup and benchmark workflow.
Fixes
- Fixed concurrent Knowledge cascade upserts by switching to an atomic
INSERT ... ON CONFLICT DO UPDATEpath. - Kept the OpenAPI application version in sync with package metadata instead of a hardcoded version.
- Fixed profile middleware so inner handler exceptions are re-raised instead of being swallowed.
- Reduced unnecessary LanceDB
optimize()I/O by throttling cascade optimize calls.
Compatibility Notes
- Existing EverOS demo TUI and live demo changes remain preserved.
- Existing DashScope rerank provider support remains preserved.
- The English
README.mdkeeps the GitHubmainstructure; release-package README changes were not applied to the default README. - Existing local-first
file://URI handling remains allow-any by default. For server deployments, configureFILE_URI_ALLOW_DIRSexplicitly to constrain readable file paths. - GitLab/internal-only artifacts such as
.gitlab/,.gitlab-ci.yml,.vscode/,.claude/skills/release/SKILL.md, andevaluation/are not part of the GitHub release.
Upgrade Notes
- Run
uv sync --frozenagainst the updateduv.lock. - Use
benchmarks/README.mdandbenchmarks/config.tomlas the entrypoint for LoCoMo benchmark reproduction. - Review updated config templates in
src/everos/config/default.toml,src/everos/config/default_ome.toml, andsrc/everos/templates/env.template. - Review
CHANGELOG.mdfor the complete 1.1.1 changelog.
Verification
This release was checked with:
make docs-checkuv lock --checkmake lintuv run pytest tests/unit/test_scripts/test_check_github_contributor_docs.py -q- PR #327 full CI: unit tests, integration tests, lint, links, package build, commit-message check, and PR-title check on Python 3.12 and 3.13
EverOS 1.1.0
EverOS 1.1.0
EverOS 1.1.0 expands the memory system beyond user episodes with first-class
knowledge management, reflection, and stronger operational guarantees around
search, persistence, and API contracts.
Highlights
- Added Knowledge APIs and storage for document creation, listing, patching,
deletion, taxonomy handling, and knowledge-topic search. - Added Reflection orchestration for periodically merging and refining episode
clusters. - Expanded OME runtime support with event IDs, run-record storage migration,
configuration reload behavior, and testing harness improvements. - Improved search and get behavior for agent-owned memory, including agent
cases, agent skills, and owner-type isolation. - Reworked API error handling around typed exception handlers and consistent
error envelopes. - Updated docs, OpenAPI schema, configuration examples, and test coverage for
the 1.1.0 surface area.
Compatibility Notes
- Existing local TUI demo registration remains available.
- Existing DashScope rerank support is preserved; the DashScope provider file
is not replaced by the 1.1.0 update. - The release intentionally leaves directories outside the 1.1.0 update scope,
including existing use-case and iOS demo material, untouched. - Knowledge search requires configured embedding and rerank providers. Missing
providers now fail explicitly with configuration errors rather than silently
returning degraded results.
Upgrade Notes
- Regenerate or review
docs/openapi.jsonafter route or DTO changes. - Run
uv sync --frozenagainst the updateduv.lock. - Review
config.example.toml,src/everos/config/default.toml, and
src/everos/config/default_ome.tomlfor new Knowledge and OME settings. - If running e2e tests without live provider credentials, use dummy provider
environment variables for startup-only checks; live vector and rerank paths
remain behind slow/live markers.
Verification
This release was checked with:
uv run ruff check .uv run pytest tests/unituv run pytest tests/integrationuv run lint-importsuv run pytest tests/e2ewith dummy LLM and embedding environment variables- Targeted search/get regression tests for agent and deprecated-filter handling
EverOS 1.0.1
Security
- Path-traversal hardening for caller-supplied identifiers.
sender_idnow carries the same path-safety guard asapp_id/project_id: a character whitelist plus rejection of the./..tokens. The whitelist admits@and+so email-style ids and plus-addressing still pass. - Defense-in-depth write containment.
MarkdownWriternow rejects any write target that resolves outside the configured memory root before reading, creating parent directories, or writing files. The API layer maps this backstop error to HTTP 400.
Documentation
- Add a multimodal usage guide and correct the multimodal error semantics after end-to-end verification.
- Document the upcoming Knowledge Wiki and idle/offline Reflection/Dreaming roadmap in the README and documentation set.
- Rename outdated algorithm-library references to
everalgoacross docs and code comments; no code identifiers changed. - Fix accuracy drift found in a documentation audit; reflect the
everalgopackages being published and the v1.0.0 stable status.
EverOS 1.0.0
Superseded: EverOS 1.0.1 is available with security hardening for caller-supplied identifiers and markdown write containment. See EverOS 1.0.1.
First public release of EverOS — a Markdown-first memory extraction framework for AI agents.
Added
- Markdown as source of truth: all memory persists as plain
.mdfiles you can open, edit, grep, and version with Git. - Lightweight three-piece storage: Markdown, SQLite, and LanceDB. No external services required.
- Hybrid retrieval: BM25, vector, and scalar filtering in a single LanceDB query.
- Cascade index sync: editing a
.mdfile triggers file-watcher based index sync. - Dual-track memory for user memories and agent memories.
- CLI and FastAPI HTTP API, async-first throughout.
- Pluggable OpenAI-compatible providers for LLM, embedding, and rerank.
- Decoupled memory extraction algorithms via the standalone
everalgo-*libraries.