vault-search — search your notes & documents (separately)

Category: skill Where it works: Telegram (Hermes) / CLI / dashboard drive Source: _infra/hermes/skills/vault-search/SKILL.md · engine _infra/scripts/wednesday-search.py

What it is

Hybrid search (keyword + meaning) over two separate personal corpora — your notes (Obsidian) and your documents (PDFs, ID/buletin, medical analyses). A document search never returns notes, and vice-versa. The index auto-refreshes every ~5 min, so anything you add is searchable within minutes — no manual reindex (the thing that always broke before).

How to trigger it

  • Notes: “caută în notele mele despre X”, “ce am scris despre Y”, “search my notes for Z”
  • Documents: “când expiră buletinul?”, “găsește documentul cu pașaportul”, “ce analize am din 2024”
  • Read inside a document: “care e salariul din ultimul contract?”, “ce scrie la articolul 2 din CIM?” — anything that lives in the document body, not just a known field.
  • Send a document: “trimite-mi buletinul / CIM-ul” → delivers the original file on the chat.
  • Redact a document: “trimite buletinul cu datele ascunse”, “redactează-l complet”, “ascunde doar CNP-ul și seria”, “acoperă adresa”.
  • Everything: “caută în tot X”
  • CLI: wsearch "q" --source notes|docs · wread <id> (full body) · wsend <id> (file) · wredact <id> [--fields all|cnp,series,…] [--style black|blur]

How to use it

Just ask in plain language; Wednesday picks the scope (notes vs documents) from how you phrase it. For documents she reads extracted fields (e.g. “când expiră buletinul?” → expiry date + source file), and for anything in the body she reads the document and pulls the value (e.g. the salary inside a contract / its latest amendment).

Redaction produces a copy with personal data covered by solid black bars, flattened so it is unrecoverable (no hidden text layer):

  • “redactează tot / complet” → covers every field and the photo.
  • “ascunde doar CNP-ul și seria” → covers only those values; the labels stay visible, so it reads like a template (you can see which fields are hidden). The rest stays readable.
  • If a field you asked for can’t be located, it refuses rather than send a document that looks redacted but still leaks it. Output: …/_infra/temp/redacted/<doc>_redacted[_scope].pdf.

Practical examples

  1. “ce note am despre ADHD?” → searches only notes → titles + snippets + paths.
  2. “când expiră buletinul?” → documents → 2024-10-25 + the PDF it came from.
  3. “care e salariul din ultimul contract de muncă?” → reads the latest amendment → the amount + source file.
  4. “trimite buletinul cu CNP-ul și seria ascunse” → sends a redacted copy: CNP + series blacked, labels + rest visible.
  5. “redactează buletinul complet” → sends a copy with all data + the photo blacked out.

Notes / limits

  • Documents need OCR for scanned PDFs (Apple Vision, automatic) — drop files into AOL/10 - Documents/ and the 5-min refresh OCRs + indexes them.
  • Embeddings are local (Ollama) — your medical/ID text never leaves the Mac.
  • Scope isolation is enforced in the database, not just the prompt.
  • Redaction is raster + flatten (black bars are not recoverable); blur is offered but black is the default for IDs.