Skip to content

v0.2.0 — HTTP daemon + working hooks

Choose a tag to compare

@nnaveenraju nnaveenraju released this 09 May 17:24
· 1 commit to main since this release

Added

  • HTTP daemon transport. New src/daemon.ts runs Smara as a long-lived background process on 127.0.0.1:3100 via Hono + @hono/node-server. Endpoints: POST /tools/call (invoke any smara.* tool without an MCP handshake), GET /health (liveness + version), GET /tools (list available tools). The stdio transport for Claude Desktop and other MCP clients is unchanged and still works alongside the daemon.
  • Daemon lifecycle CLI (smara-daemon) with start | stop | status | restart. PID file at ~/.smara/daemon.pid, logs at ~/.smara/daemon.log.
  • Working session-start hook (hooks/session-start.sh). When a project directory is opened, calls the HTTP daemon to fetch top memories and prints them as session context — the hook layer that 0.1.x documented as non-functional is now operational.
  • MEMORY_TRANSPORT=http and MEMORY_PORT env vars (and server.transport = "http" in config.toml) to select the daemon transport.
  • Five-method retrieval ablation in eval/run-benchmark.ts: FTS-only, vector-only, RRF (no decay), RRF + uniform decay, RRF + per-category decay. Generates eval/results/paper-table.json for direct citation in the paper.

Changed

  • Hook adapters now talk to the HTTP daemon. hooks/core/memory-client.sh rewritten as a thin curl client against 127.0.0.1:3100. Auto-starts the daemon if /health is unreachable. The previous shell-based MCP-stdio approach silently no-op'd; this replaces it.
  • hooks/README.md rewritten end-to-end to document daemon-based usage, install/uninstall flow, and per-tool wiring.
  • README updated with the daemon quick-start, troubleshooting, and an honest description of what the hook layer does today.

Fixed

  • FTS5 query sanitization (src/providers/sqlite/document-store.ts). Queries containing punctuation (:, ?, -) or FTS5 keywords (AND, OR, NOT, NEAR) no longer throw fts5: syntax error. User input is normalized before being passed to MATCH. Tracked as a known limitation in 0.1.5; closed.
  • SQL injection defense in queryMemories. sortBy and sortOrder are now strict whitelists; invalid values are rejected instead of being interpolated into ORDER BY.
  • Vector DB schema isolation (src/db/connection.ts). createConnection({ skipSchema: true }) lets SqliteVecStore open memory-vectors.db without running the full document schema, so the vectors file no longer carries unused tables.

Documentation

  • arXiv paper updated to v0.2.0: §7.4 ("Tool-Lifecycle Hooks via the HTTP Daemon") describes the dual-transport architecture; §11 (Limitations) reframes the remaining gaps honestly (synthetic eval corpus, no head-to-head comparison against external systems); a new "Availability and Reproducibility" block pins the seed (0x5ada7a) and reference timestamp (2026-04-21T00:00:00Z).

Known limitations

  • The 5-method ablation runs on a synthetic corpus generated by eval/generate-dataset.ts. No head-to-head comparison against external memory systems (e.g., Mem0, MemGPT, Letta) yet.
  • Per-client adapter coverage (Cursor, Windsurf, Aider) is incremental — see hooks/README.md for current wiring status.