v0.7.0 — bring-your-own storage; per-language FTS
Changed
- Blob storage is now provider-neutral and genuinely optional. Object storage for raw ingested bytes is no longer DigitalOcean-specific: the
SPACES_*env vars becomeS3_*, with a newS3_ENDPOINT(+S3_FORCE_PATH_STYLEfor MinIO) so any S3-compatible provider works — AWS S3 (default), Cloudflare R2, MinIO, Backblaze B2, or DigitalOcean Spaces. The hard-coded*.digitaloceanspaces.comdefault is gone. OldSPACES_*names are still read as a fallback.- Fixed: storage was effectively mandatory — the settings module validated credentials eagerly at import (which the server does on boot), so a keyless deployment crashed at startup despite the no-op fallback. Storage config is now all-optional and import-safe; credentials are required only when
S3_BUCKETis set (a bucket without keys fails loudly instead of silently dropping bytes).
- Fixed: storage was effectively mandatory — the settings module validated credentials eagerly at import (which the server does on boot), so a keyless deployment crashed at startup despite the no-op fallback. Storage config is now all-optional and import-safe; credentials are required only when
Added
- Optional per-language full-text search.
kl_ingestgains an optionallanguageparameter, and each material records its ownfts_configso language-aware stemming can be applied per document — while the corpus default stays the language-neutralsimpleconfig. Migration0002adds the column. MCP tool contract → 1.2.0 (additive; existing clients unaffected).
CI
- The canonical CI job now runs a check-only lint step (
oxlint --type-aware, no autofix) after typecheck, so lint regressions can't merge unnoticed.
Images: ghcr.io/moai-team-llc/agenticmind-server:0.7.0 and …-worker:0.7.0 (also :latest).