Collection indexing now behaves identically whether started via the streaming
(SSE) route or the background worker. The two paths had duplicated and drifted:
the background worker did not persist a collection's ``embedding_dimension`` (so
collections indexed in the background lost it), and the SSE route skipped the
force-reindex cleanup that clears old chunks and FAISS indices (so a streamed
force-reindex could leave stale, mixed-model vectors behind). The shared
embedding-metadata, force-reindex cleanup, and document-query logic is now
factored into single helpers used by both paths.
