v1.3.0: Daemon Multi-Instance Architecture
Highlights
MIE now supports multiple concurrent MCP clients (Claude, Cursor, etc.) without "database locked" errors. A single daemon process holds the exclusive RocksDB lock and multiplexes access over a Unix domain socket.
How it works
mie --mcp → auto-starts daemon if not running → connects via socket
No configuration needed — it just works. You can also manage the daemon manually:
mie daemon start # foreground
mie daemon start --background # detached
mie daemon stop
mie daemon statusWhat's New
Added
- Daemon server serving CozoDB over Unix domain socket
- SocketBackend client forwarding queries to daemon via newline-delimited JSON
mie daemon start|stop|statusCLI commands- Auto-start daemon from
mie --mcpwith retry/backoff MetaBackendinterface for transparent local/remote storageNewClientWithBackendconstructor for daemon-connected clients- Ping-based liveness detection for stale socket cleanup
- PID file locking with
flock()to prevent concurrent starts - Socket permissions restricted to owner-only (
0600) - Embedding dimension validation (daemon ↔ client)
- 15 new tests (13 socket/daemon + 2 dimension validation)
Fixed
- Deadlock in
SocketBackend.Close()— mutex released before closing connection - Silent fallback to embedded mode — now fails with clear error instead
- PID file race condition — atomic
flock()instead of write-then-check - Stale socket from crashed daemon — ping + cleanup on connect
- Scanner errors in daemon now logged
- Context propagation in daemon dispatch
- Protocol response ID validation
- Clean disconnect via
MethodCloseon close
Changed
mie --mcprequires daemon (auto-started or manual) instead of opening CozoDB directly- Graceful shutdown waits up to 5s for active handlers
Full Changelog: v1.2.0...v1.3.0
Full Changelog: v1.2.0...v1.3.0