The react provider wrapper defers provider.destroy() by a timeout on
unmount, so a room for the same document mounting in the same commit
attaches while the old provider is still registered on the shared
socket and crashes with 'Cannot attach two providers with the same
effective name'. A local CollabRoom replaces it: synchronous destroy
keeps unmount-before-mount ordering, and attach evicts any provider a
previously interrupted teardown leaked so the crash cannot wedge a
document until reload.
* advanced search filters
* improve labelId filtering in query
* index label ids on typesense
* index label ids on typesense
* filters on AI search
* refactor: detect typesense schema drift from the declared collection schema
* feat: show secondary search filters only when applied
Created by and Labels now stay hidden until they hold a value; a Filter
button at the right end of the bar lists the hidden ones and opens the
picked filter's dropdown immediately.
* fix: keep applied search filters in the order they were added
* feat: add title-only search mode
Adds a titleOnly flag to page search: the Postgres driver matches
titles via trigram-indexed unaccented LIKE ranked by word_similarity,
and a Match filter in the search spotlight switches between everything
and title-only matching.
* refactor: make title-only search a toggle chip
* fix: drop stale results when the search content type changes
* feat: add trigram index on attachment file names
* feat: extend title-only search to attachments
The titleOnly flag now matches attachment file names via the
separator-normalized trigram expression, and the toggle chip stays
available in attachment mode as File name only.
* refactor: keep the title-only label uniform across search modes
* feat: index txt attachments for content search
* feat: pin the current user at the top of the creator filter
* refactor: dim the you suffix in the creator filter
* feat: browse label-filtered pages without a query
Selecting labels now lists their pages newest-first before any text is
typed, on both the Postgres and Typesense drivers.
* fix: match any selected label instead of requiring all
* fix: use a gray spotlight selection instead of primary blue
* feat: include search results in the spotlight tab order
* feat: show last updated time on search results
* fix: stop empty-state flicker while the search query debounces
* feat: browse creator-filtered results without a query
Selecting a creator with an empty query now lists their pages (or
attachments in attachment mode) newest-first, with the same space and
page permission filtering as typed search.
* fix: show Untitled for pages without a title in search results
* quick page sharing fix
* minor search filter fixes
---------
Co-authored-by: Philipinho <16838612+Philipinho@users.noreply.github.com>
* feat(ai): add AI_VECTOR_DRIVER and turbopuffer configuration
* feat(ai): carry workspace and target space ids on vector lifecycle events
* feat(ai): add vector driver interface and turbopuffer request helpers
* feat(ai): add pgvector driver behind the vector driver interface
* refactor(ai): route vector reads and writes through the vector driver
* feat(ai): add turbopuffer vector driver
* feat(ai): rebuild turbopuffer namespaces when the embedding model changes
* feat(ai): warm the vector namespace cache on session start
* fix(ai): harden turbopuffer misconfiguration and reset failure paths
* fix(ai): collapse blank-line runs in extracted page text
* fix(ai): skip full re-embed when ai search is re-enabled within the delete grace window
* sync
* fix(ai): store real embedding dimensions instead of serialized vector length
* fix(ai): filter search hits by the page's current space at query time
* fix(ai): retry the page moved-to-space vector patch job
* sync
* feat(ai): pre-warm the vector namespace
* fix(ai): pass AI_VECTOR_DRIVER through the client build config