Class: Mneme::Search

Inherits:
Object
  • Object
show all
Defined in:
lib/mneme/search.rb

Overview

Full-text search over message history using SQLite FTS5. Covers user messages, agent messages, and think messages across all sessions.

The interface is intentionally abstract — callers receive Result structs and never touch FTS5 directly. A future semantic search backend (embeddings, BM25 + re-ranking) can replace the implementation without changing callers.

Examples:

Search across all sessions

results = Mneme::Search.query("authentication flow")
results.each { |r| puts "message #{r.message_id}: #{r.snippet}" }

Search within a single session

results = Mneme::Search.query("OAuth config", session_id: 42)

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(terms, session_id: nil, limit: 5) ⇒ Search

Returns a new instance of Search.



37
38
39
40
41
42
# File 'lib/mneme/search.rb', line 37

def initialize(terms, session_id: nil, limit: 5)
  @terms = sanitize_query(terms)
  @session_id = session_id
  @limit = limit
  @recency_decay = Anima::Settings.recall_recency_decay
end

Class Method Details

.query(terms, session_id: nil, limit: Anima::Settings.recall_max_results) ⇒ Array<Result>

Searches message history for the given terms.

Parameters:

  • terms (String)

    search query (FTS5 syntax: words, phrases, OR/AND/NOT)

  • session_id (Integer, nil) (defaults to: nil)

    scope to a specific session (nil = all sessions)

  • limit (Integer) (defaults to: Anima::Settings.recall_max_results)

    maximum results

Returns:

  • (Array<Result>)

    ranked by relevance (best first)



33
34
35
# File 'lib/mneme/search.rb', line 33

def self.query(terms, session_id: nil, limit: Anima::Settings.recall_max_results)
  new(terms, session_id: session_id, limit: limit).call
end

Instance Method Details

#callArray<Result>

Returns ranked by relevance (best first).

Returns:

  • (Array<Result>)

    ranked by relevance (best first)



45
46
47
48
49
50
# File 'lib/mneme/search.rb', line 45

def call
  return [] if @terms.blank?

  rows = execute_fts_query
  rows.map { |row| build_result(row) }
end