Fixed
- Debian Chromium SIGTRAP crash in Kubernetes. The
Dockerfilepreviously installed the OS-levelchromiumpackage from Debian 12. When run as a non-root user in strict Docker/Kubernetes environments, this package consistently crashed at startup withCode: nullandTrace/breakpoint trap (core dumped). On amd64 theDockerfilenow downloads Chrome for Testing via Puppeteer during the build phase (avoiding the Debian package's SIGTRAP); arm64 keeps Debian'schromium, since Chrome for Testing publishes no linux-arm64 build. Both resolve to a singlePUPPETEER_EXECUTABLE_PATHsymlink. This resolves the persistent browser launch failures on restricted environments without requiring insecure workarounds like--no-zygoteor disabling Seccomp/AppArmor. Thanks @muhfalihr.
Added
- Global message search across sessions.
GET /api/searchfinds messages across all sessions through an openSearchProvidercontract, with a built-in database full-text provider (PostgreSQLtsvector/GIN, SQLiteFTS5) as the zero-dependency default — no external service required. Search works out of the box on both SQLite and PostgreSQL and survives repeated dialect switching and export/import round-trips; a non-FTS5 SQLite build skips the index gracefully and the route returns501instead of crashing boot. SetSEARCH_ENABLED=falseto disable the route and module entirely (the index is DB-maintained per-write regardless, at negligible in-process cost). Advanced backends (typo-tolerance, CJK word-segmentation, large-scale relevance) will be available as provider plugins. message:persistedplugin hook. A new general extension point fired when a message is durably persisted — on outbound send (fromMessageService) and on inbound receive (fromSessionService, where both engine adapters converge on the single persist) — so plugins can react to persisted messages (e.g. an external search indexer) without coupling to the message/session services. The built-in FTS search provider is DB-synced and does not consume this hook; it exists for plugin providers and general use. Fire-and-forget: a handler error is swallowed and never breaks the send/receive path.- Redis authentication via username. Added support for
REDIS_USERNAMEto configure the Redis cache connection and BullMQ queue connections that require a username. Thanks @muhfalihr. - OpenAPI/Swagger snapshot export + enriched, auth-accurate API docs. The published spec (served at
/api/docsand exportable viascripts/export-openapi.ts) now mirrors the runtime auth model:@Public()routes (/api/health*,/api/infra/health, and the integration ingress wildcard) are marked as not requiring anX-API-Key, matching what theApiKeyGuardactually enforces. Thewebhookeventsenum now advertises the*subscribe-all wildcard the dispatch layer already honors, and request/response schemas are filled in across the catalog, status, stats, integration-instance, and auth endpoints — notably typing the integrationInstanceView(and itsIngressUrlentries) as real schemas so generated clients no longer receive opaque objects. The export script pins a hermetic environment (in-memory SQLite, queue/MCP off) so it is safe to run anywhere without touching a real database or opening a Redis connection.