create or replace function match_thoughts(
  query_embedding  vector,
  match_threshold  float   default 0.7,
  match_count      int     default 10,
  filter           jsonb   default '{}'::jsonb,
  embedding_model  text    default ''
)
returns table (
  id          uuid,
  content     text,
  metadata    jsonb,
  similarity  float,
  created_at  timestamptz
)
language plpgsql
as $$
begin
  return query
  select
    t.guid,
    t.content,
    t.metadata,
    1 - (e.embedding <=> query_embedding) as similarity,
    t.created_at
  from thoughts t
  join embeddings e on e.thought_id = t.guid
  where 1 - (e.embedding <=> query_embedding) > match_threshold
    and t.archived_at is null
    and (embedding_model = '' or e.model = embedding_model)
    and (filter = '{}'::jsonb or t.metadata @> filter)
  order by e.embedding <=> query_embedding
  limit match_count;
end;
$$;
