Replace the unconditional top-5 keyword recall with a deterministic,
layered gate so only relevant Knowledge entries reach the prompt.
- New src/memory/recall.rs: tokenization with stopword filtering and a
bounded term list; ranking combines lexical relevance, importance and
recency; double gate (min_relevance + min_score) drops weak or stale
matches; hard tokio::time::timeout wraps the SQL search so a slow FTS5
query never delays a turn.
- MemoryConfig gains recall_min_relevance, recall_min_score,
recall_recency_half_life_days, recall_timeout_ms (default 1000ms);
recall_limit is now actually wired instead of being a dead field.
- MemoryManager::recall_for_context exposes the gated path; the
memory_recall tool keeps the raw search.
- Storage::search_memories / search_memories_by_time share a single
jieba-based tokenizer via the new module; search_memories_by_terms
accepts pre-tokenized input for the gated path.
- Docs and example configs (README, about-picobot references, both
config.example.json templates) updated to reflect the new behavior.
- Store default SQLite database at <config_dir>/data/picobot.db instead of
the workspace, keeping session data independent of the workspace; the
reload equivalence check and docs follow the new default
- Add per-skill enable/disable persisted in <config_dir>/skills_state.json;
skills default to enabled, disabled skills are excluded from prompts,
listings, and get_skill at load time
- Add mcp.servers[].enabled (default true); disabled servers are skipped
at activation and by health checks
- WebUI Tools page: switches for Skills and MCP servers, plus a concrete
MCP tool list with connection status and errors
- Add PUT /api/skills/{name} API and expose enabled/tool details in the
skills/status APIs
- Bump version to 1.15.0