# Feature: Kunnskaps-Bridge (Cross-Workspace Discovery) **Filsti:** `docs/features/kunnskaps_bridge.md` ## 1. Konsept En valgfri, opt-in feature som lar brukere oppdage semantisk beslektet kunnskap på tvers av workspaces de har tilgang til. Bryter ikke workspace-isolasjonen — resultatet er en *peker* ("dette finnes i Podcast B"), ikke selve innholdet. Brukeren må ha tilgang til begge workspaces for å se treffet. ## 2. Avgrensning: Hva dette IKKE er - **Ikke datadeling.** Ingen data kopieres mellom workspaces. Bridge viser kun at en relevant node *finnes*. - **Ikke automatisk.** Begge workspaces må ha Bridge eksplisitt aktivert av en admin. - **Ikke synlig for gjester.** Kun for workspace-medlemmer med tilgang til begge sider. - **Ikke et søk i andres data.** Du ser bare treff i workspaces du allerede er medlem av. ## 3. Teknisk arkitektur ### 3.1 Vector Embeddings (pgvector) Krever `pgvector`-extension i PostgreSQL: ```sql CREATE EXTENSION IF NOT EXISTS vector; ALTER TABLE actors ADD COLUMN embedding vector(768); ALTER TABLE topics ADD COLUMN embedding vector(768); ALTER TABLE factoids ADD COLUMN embedding vector(768); CREATE INDEX idx_actors_embedding ON actors USING ivfflat (embedding vector_cosine_ops); CREATE INDEX idx_topics_embedding ON topics USING ivfflat (embedding vector_cosine_ops); CREATE INDEX idx_factoids_embedding ON factoids USING ivfflat (embedding vector_cosine_ops); ``` ### 3.2 Embedding-generering (`generate_embeddings`) En jobbkø-jobb som genererer embeddings for nye/endrede noder: 1. Rust-worker plukker opp jobben fra jobbkøen. 2. Bygger en tekst-representasjon av noden (navn, body, tilknyttede faktoider). 3. Sender til AI Gateway (`sidelinja/rutine`) for embedding-generering. 4. Lagrer vektoren i pgvector-kolonnen. 5. Re-genereres ved vesentlige endringer av noden. ### 3.3 Cross-workspace søk Når en bruker utforsker en node (f.eks. Tema "Skolepolitikk"): 1. SvelteKit server-side henter brukerens tilgjengelige workspaces fra `workspace_members`. 2. Kjører et similarity-søk med `<=>` (cosine distance) **som superuser** (bypasser RLS) — men filtrerer eksplisitt mot brukerens workspace-liste: ```sql SELECT n.workspace_id, t.name, t.embedding <=> $target_embedding AS distance FROM topics t JOIN nodes n ON t.id = n.id WHERE n.workspace_id = ANY($user_workspace_ids) AND n.workspace_id != $current_workspace_id AND t.embedding <=> $target_embedding < 0.3 ORDER BY distance LIMIT 10; ``` 3. Resultatet vises som en diskret "Finnes også i..."-seksjon i UI-et. ### 3.4 Workspace-config Bridge aktiveres per workspace i `workspaces.settings`: ```json { "bridge_enabled": true, "bridge_discoverable": true } ``` - `bridge_enabled` — workspace kan søke i andre workspaces - `bridge_discoverable` — andre workspaces kan finne noder i dette workspace-et Begge må være `true` for at en kobling skal vises. ## 4. Dataklassifisering | Data | Kategori | Detaljer | |---|---|---| | Embedding-vektorer | Avledet (PG) | Kan regenereres fra nodeinnhold | ## 5. Instruks for Claude Code * pgvector er en ny avhengighet — dokumenter i docker-compose og setup-guides. * Cross-workspace søk er det **eneste** stedet i systemet der bruker-initierte handlinger bypasser RLS. Isolér denne koden grundig — egen funksjon med eksplisitt workspace-filtrering, aldri gjenbruk i andre kontekster. * Embedding-dimensjon (768) bør matche modellen som brukes. Konfigurér som konstant, ikke hardkod overalt. * Jobbtype `generate_embeddings` bruker `sidelinja/rutine` som modellalias. * Bridge er **Lag 4+** — krever fylt kunnskapsgraf i minst to workspaces.