Skip to content

v1.3.0: Daemon Multi-Instance Architecture

Choose a tag to compare

@github-actions github-actions released this 14 Feb 20:51

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 status

What'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|status CLI commands
  • Auto-start daemon from mie --mcp with retry/backoff
  • MetaBackend interface for transparent local/remote storage
  • NewClientWithBackend constructor 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 MethodClose on close

Changed

  • mie --mcp requires 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