235 lines
11 KiB
Markdown
235 lines
11 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to **EverOS** are documented in this file.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
## [Unreleased]
|
|
|
|
## [1.1.2] - 2026-07-07
|
|
|
|
### Fixed
|
|
|
|
- **Agent-track search broken by `deprecated_by IS NULL` filter** —
|
|
`compile_filters()` unconditionally appended a `deprecated_by IS NULL`
|
|
clause to every LanceDB query, but only `episode` and `atomic_fact`
|
|
tables have this column. Agent-track search (`agent_case`,
|
|
`agent_skill`) failed on any method. The clause is now conditional on
|
|
`owner_type == "user"`.
|
|
|
|
## [1.1.1] - 2026-07-06
|
|
|
|
### Added
|
|
|
|
- **DashScope rerank provider** — Aliyun Bailian `gte-rerank-v2` adapter;
|
|
configure with `rerank.provider = "dashscope"` in `everos.toml`.
|
|
- **`everos demo` TUI command** — Textual-based interactive CLI demo for
|
|
showcasing EverOS core features.
|
|
- **Benchmark runner** — full LoCoMo benchmark suite: `benchmarks/run.py`
|
|
with TOML configuration, automated ingestion, search evaluation, and
|
|
scoring.
|
|
- **Hybrid search: heap-expand algorithm** — rewrote `hierarchy.py` to
|
|
heap-driven lazy expansion with global top-N competition, replacing the
|
|
serial four-layer pipeline.
|
|
|
|
### Fixed
|
|
|
|
- **Knowledge: atomic upsert prevents StaleDataError** — cascade handler
|
|
switched from get→update to `INSERT ... ON CONFLICT DO UPDATE`, fixing
|
|
concurrent cascade race conditions.
|
|
- **API: OpenAPI version read from `__version__`** — no longer hardcoded to
|
|
`0.1.0`; version now stays in sync with `pyproject.toml`.
|
|
- **Profile middleware no longer swallows exceptions** — inner handler
|
|
errors now re-raise correctly instead of silently returning HTTP 200.
|
|
|
|
### Performance
|
|
|
|
- **Cascade optimize throttle 1s → 10s** — reduced unnecessary LanceDB
|
|
`optimize()` I/O by raising the minimum interval between calls.
|
|
|
|
### CI / Build
|
|
|
|
- **CI Python version matrix** — test and integration jobs now run on both
|
|
Python 3.12 and 3.13.
|
|
- **pyproject.toml improvements** — added `project.urls`, `Typing :: Typed`
|
|
classifier, relaxed `jieba` version constraint, removed unused
|
|
`python-dotenv` dependency, cleaned up sdist include list, added `RUF`
|
|
lint rules and coverage configuration.
|
|
- **`make ci` includes coverage** — `ci` target now runs
|
|
`lint + test + integration + cov`.
|
|
|
|
### Documentation
|
|
|
|
- Fixed stale references across 13 files (v1.1.0 freshness sweep).
|
|
- Added GitHub sync guide (`docs/github-sync.md`).
|
|
- Added v1.1.0 release notes and v1.0.0 migration guide as standalone docs.
|
|
- Added `README.zh-CN.md` (Chinese README).
|
|
- Expanded `QUICKSTART.md` with source install instructions and `uv run`
|
|
usage notes.
|
|
- Clarified cascade `optimize()` semantics in docstrings and runbook.
|
|
|
|
## [1.1.0] - 2026-06-24
|
|
|
|
### Added
|
|
|
|
- **Knowledge base subsystem** — full-stack document management exposed via
|
|
`/api/v1/knowledge/*`. Upload documents (PDF / HTML / DOCX via multimodal
|
|
parser), CRUD operations, and hybrid search (BM25 + vector + rerank +
|
|
category boost). Ships with a 20-category default taxonomy
|
|
(`.taxonomy.md`, auto-generated on first use). Original uploaded files are
|
|
preserved alongside extracted Markdown. New settings group:
|
|
`knowledge.*` (search tuning, `max_upload_bytes`, etc.).
|
|
- **Reflection V1** — offline memory self-improvement engine.
|
|
Select → Merge → Re-extract → Deprecate: clusters related episodes within
|
|
existing 7-day windows, merges them via LLM, re-extracts consolidated
|
|
episodes, and deprecates the originals. Runs as an OME strategy
|
|
(`reflect_episodes`); configure via `ome.toml`
|
|
(`[strategies.reflect_episodes]`, cron `0 2 * * 1`), changes are
|
|
hot-reloaded within ~2 s, no restart needed; **disabled by default**.
|
|
Requires `everalgo-user-memory>=0.3.1`.
|
|
- **Standardized error response contract.** All API errors now return a
|
|
canonical envelope with a semantic `ErrorCode` (10 codes: `NOT_FOUND`,
|
|
`CONFLICT`, `INVALID_INPUT`, `EXTRACTION_EMPTY`, `UNSUPPORTED_FORMAT`,
|
|
`EXTERNAL_SERVICE_UNAVAILABLE`, `CAPABILITY_UNAVAILABLE`,
|
|
`CONFIGURATION_ERROR`, `INTERNAL_ERROR`, `BAD_REQUEST`), per-type
|
|
exception handlers with MRO dispatch, and an `ErrorResponse` Pydantic
|
|
model visible in OpenAPI docs. Replaces the v1.0 two-code scheme
|
|
(`HTTP_ERROR` / `SYSTEM_ERROR`).
|
|
- **Search: hierarchical fact eviction** (Layer-4) with `min_score` floor —
|
|
low-confidence atomic facts are evicted before fusion, improving
|
|
precision.
|
|
- **Knowledge search degradation guidance** — when the embedding or rerank
|
|
provider fails at call time, the knowledge search route enriches the
|
|
error message with actionable guidance (e.g. retry with `method=keyword`,
|
|
which needs no embedding) before returning `503`.
|
|
- **Knowledge topic recaller** — dual-column BM25 recall for knowledge
|
|
topics, integrated into the search manager alongside existing recall
|
|
types.
|
|
|
|
### Changed
|
|
|
|
- **`everos init` now generates `gpt-4.1-mini`** as the default LLM model
|
|
(was `gpt-4o-mini`). Existing user configurations are not affected.
|
|
- **API error `code` values have changed.** v1.0 returned only `HTTP_ERROR`
|
|
(all 4xx) and `SYSTEM_ERROR` (all 5xx). v1.1 returns fine-grained
|
|
semantic codes (see Added above). Clients that match on `error.code`
|
|
string values need to update. The envelope structure
|
|
(`request_id` + `error.{code, message, timestamp, path}`) is unchanged.
|
|
- **DDD-aligned exception hierarchy** — domain errors reorganized:
|
|
`ValidationError` → `InvalidInputError`;
|
|
`DocumentAlreadyExistsError` → `DuplicateDocumentError`;
|
|
`EmbeddingError` → `EmbeddingServiceError`;
|
|
`RerankError` → `RerankServiceError`;
|
|
`LLMError` → `LLMServiceError` (at the boundary);
|
|
`MultimodalError` split into `UnsupportedModalityError` (domain) +
|
|
`MultimodalNotEnabledError` (infrastructure).
|
|
New base classes: `CapabilityError`, `ConfigurationError`.
|
|
- **`infra/` restructured** — storage adapters moved under
|
|
`infra/persistence/{markdown,sqlite,lancedb}`; each sub-package's
|
|
`__init__.py` is the sole public API (enforced by import-linter).
|
|
- **Parser capability extracted** to `component/parser` (shared by memorize
|
|
and knowledge upload paths).
|
|
|
|
### Fixed
|
|
|
|
- **Knowledge search no longer returns a bare `500 INTERNAL_ERROR` when the
|
|
embedding or rerank provider is unconfigured.** `_require_search_providers`
|
|
now raises `ConfigurationError` → `500 CONFIGURATION_ERROR`. A provider
|
|
that is configured but fails at call time still surfaces as
|
|
`503 EXTERNAL_SERVICE_UNAVAILABLE`.
|
|
- **Knowledge document uploads are capped** at `knowledge.max_upload_bytes`
|
|
(default 50 MiB); oversized uploads are rejected with `422` before parsing.
|
|
- **Knowledge search `query` is bounded** to 2000 chars.
|
|
- **`GET /knowledge/documents?sort_by=updated_at`** is now accepted.
|
|
- **`POST /knowledge/documents` returns `original_file_path`** so callers no
|
|
longer need a follow-up `GET` to locate the preserved upload.
|
|
- **Rerank providers no longer echo the upstream HTTP response body** into the
|
|
client-facing `503` message (vLLM / DeepInfra); the body is logged instead.
|
|
- **Knowledge FK cascade race** — removed the foreign key on
|
|
`knowledge_topics.doc_id` that caused delete-order race conditions;
|
|
cascade cleanup handled at application level.
|
|
- **Knowledge `replace_document`** — atomic PUT: backup old Markdown before
|
|
re-extraction; removed explicit SQLite delete for atomicity.
|
|
- **Knowledge duplicate `doc_id`** rejected on create; title collision
|
|
resolved by appending `doc_id` to directory name.
|
|
- **Knowledge `md_path` resolution** fixed in `delete_document` (was not
|
|
resolved against `memory_root`).
|
|
- **OME file-handle leak** — portalocker file handle is now closed on lock
|
|
contention instead of being left open.
|
|
- **jieba / Python 3.12 compatibility** — deferred jieba import to avoid
|
|
`SyntaxError` from invalid escape sequences; suppressed
|
|
`DeprecationWarning` in tests.
|
|
- **Test isolation** — tests no longer leak `.env` state or depend on module
|
|
import ordering.
|
|
|
|
### Documentation
|
|
|
|
- Added knowledge base technical documentation.
|
|
- Corrected the onboarding flow: `everos init` writes `everos.toml` +
|
|
`ome.toml` (TOML), not a `.env` file; removed the nonexistent
|
|
`--xdg` / `--env-file` options and the false `0600`-permissions claim
|
|
from `README.md` / `QUICKSTART.md`; fixed the stable-version line
|
|
(`v1.0.1`) and completed the `docs/cli.md` command tree.
|
|
- Updated error handling docs to match the new DDD exception hierarchy.
|
|
|
|
## [1.0.1] - 2026-06-16
|
|
|
|
### Security
|
|
|
|
- **Path-traversal hardening for caller-supplied identifiers.** `sender_id`
|
|
(which flows through to `owner_id` and becomes a directory segment on the
|
|
episode write path) now carries the same path-safety guard as `app_id` /
|
|
`project_id`: a character whitelist plus rejection of the `.` / `..` tokens.
|
|
The whitelist admits `@` and `+` so real-world ids (email-style,
|
|
plus-addressing) still pass.
|
|
- **Defense-in-depth write containment.** `MarkdownWriter` now rejects any
|
|
write target that resolves outside the configured memory root, before any
|
|
filesystem touch (both the write `mkdir` and the append read-modify-write
|
|
read). This backstop holds even if an identifier reaches the writer
|
|
unsanitised (e.g. an `owner_id` set in the extract pipeline rather than from
|
|
the DTO). The API layer maps the resulting error to HTTP 400.
|
|
|
|
### Documentation
|
|
|
|
- Add a multimodal usage guide and correct the multimodal error semantics
|
|
after end-to-end verification.
|
|
- Rename the algorithm library to `everalgo` across docs and
|
|
code comments (no code identifiers changed).
|
|
- Fix accuracy drift found in an adversarial doc audit; reflect the
|
|
`everalgo` packages being published and the v1.0.0 stable status.
|
|
|
|
## [1.0.0] - 2026-06-03
|
|
|
|
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 `.md` files you
|
|
can open, edit, grep, and version with Git.
|
|
- **Lightweight three-piece storage** — Markdown (truth) + SQLite (state / queue
|
|
/ audit) + LanceDB (vector + BM25 + scalar index). No external services
|
|
required.
|
|
- **Hybrid retrieval** — BM25, vector, and scalar filtering in a single LanceDB
|
|
query.
|
|
- **Cascade index sync** — editing a `.md` file triggers a file watcher →
|
|
entry-level diff → sub-second LanceDB sync.
|
|
- **Dual-track memory** — user-track (Episodes / Profiles) and agent-track
|
|
(Cases / Skills).
|
|
- **Multi-source extraction** — conversations, workflows, agent traces, and file
|
|
knowledge.
|
|
- **CLI + HTTP API** — the `everos` command-line tool and a FastAPI server,
|
|
async-first throughout.
|
|
- **Pluggable providers** — LLM / embedding / rerank via the OpenAI-compatible
|
|
protocol (works with OpenAI, OpenRouter, vLLM, Ollama, …).
|
|
- **Decoupled algorithms** — memory extraction algorithms live in the standalone
|
|
`everalgo-*` libraries published on PyPI.
|
|
|
|
[Unreleased]: https://github.com/EverMind-AI/everos/compare/v1.1.2...HEAD
|
|
[1.1.2]: https://github.com/EverMind-AI/everos/compare/v1.1.1...v1.1.2
|
|
[1.1.1]: https://github.com/EverMind-AI/everos/compare/v1.1.0...v1.1.1
|
|
[1.1.0]: https://github.com/EverMind-AI/everos/compare/v1.0.1...v1.1.0
|
|
[1.0.1]: https://github.com/EverMind-AI/everos/releases/tag/v1.0.1
|
|
[1.0.0]: https://github.com/EverMind-AI/everos/releases/tag/v1.0.0
|