didier
de6480ba4e
feat: started to make things work
2026-06-07 12:30:08 -04:00
didier
a40542f7b4
feat: add vote_flashcard MCP tool
2026-06-05 17:04:05 -04:00
didier
cd8e872491
feat: add REST API for flashcards (/api/v1/flashcards/*)
2026-06-05 16:53:18 -04:00
didier
c86e34a01d
fix: materialize FTS hits before fetching entries to avoid sqlite deadlock
2026-06-05 16:09:46 -04:00
didier
98aa7dd68c
feat: added fts5 backend
2026-06-05 15:51:41 -04:00
didier
d5cae6efa9
Add sqlite write permission check and preStart chown
...
- newSqliteStore now checks directory writability before opening
- Immediate SELECT 1 ping catches readonly DB early
- Systemd preStart chown ensures db file ownership is correct
- Fixes: SQLITE_READONLY_CANTINIT (1032)
2026-06-04 09:23:59 -04:00
didier
e700a81c25
Add versioning, update tool, and soft-delete
...
Schema: public_id + version columns with UNIQUE constraint,
delete_timestamp for soft-delete.
Tools: store_flashcard accepts optional public_id, update_flashcard
creates a new version preserving history, delete_flashcard inserts
a tombstone row and removes the Qdrant point.
Qdrant: point ID is public_id (only latest version indexed).
2026-06-03 20:15:18 -04:00
didier
39c6185b70
feat: sqlite persistence with goose migrations, flashcard schema, zap logger
...
- Add SQLite as authoritative store alongside Qdrant (best-effort indexing)
- Use goose for embedded SQL migrations
- Schema matches flashcard format: id(INTEGER PK), note, repos, host, tags, user, context, created
- Replace std log with zap structured logger
- Split registerTools into registerStoreKnowledge + registerSearchKnowledge
- Qdrant index uses SQLite rowid directly as point ID (no SHA256 hash)
- Search enriches Qdrant results from SQLite by ID
- Lowercase auth header before prefix check
- Always handle json.MarshalIndent errors
- NixOS: StateDirectory, sqlitePath to /var/lib/st-pierre/st-pierre.sqlite
2026-06-02 10:01:28 -04:00