You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.