feat(ai): P1.2 sqlite-vec via EAS Build + DB-Schema für Vector-Store #440

Closed
opened 2026-06-06 16:28:52 +02:00 by pm-bot · 2 comments
Collaborator

Phase-1-Sub-Issue zu #122 (Decision Record 2026-06-06).

Ziel

sqlite-vec als native SQLite-Extension im Expo managed Workflow nutzbar machen + DB-Schema für persönlichen Vector-Store anlegen.

Scope

  • EAS Build Config-Plugin schreiben oder vorhandenes Plugin integrieren, das expo-sqlite um die sqlite-vec-Extension erweitert (Android + iOS).
  • Custom Dev Client bauen, lokale Verifikation der vec0-Funktionalität (vec_distance_cosine, vec_quantize_int8).
  • DB-Schema (Drizzle SQLite oder reines SQL):
    • vector_index (id, source_type, source_id, text_chunk, embedding BLOB, updated_at)
    • Vec-Tabelle vector_index_vec als sqlite-vec virtuelles Table verlinkt auf vector_index.embedding.
  • Index-API: upsert(sourceType, sourceId, chunk, embedding), search(queryEmbedding, k, filter?).
  • Storage-Größe-Schätzung: 6k Einträge × 471 dim × 4 byte + sqlite-vec-Overhead → ~20 MB; bei 50k Einträgen ~170 MB.

Akzeptanzkriterien

  • App startet auf Custom Dev Client mit sqlite-vec geladen (Smoke-Test: SELECT vec_version()).
  • EAS-Build-Pipeline dokumentiert (Drone-Step oder Build-Profile).
  • DB-Migration für vector_index + Vec-Table.
  • VectorStore-Service mit upsert/search-API, Vitest-Test über In-Memory-SQLite.
  • Falls iOS-Build-Probleme: dokumentiert + Workaround-Pfad.

Out-of-Scope

  • Embedding-Generierung selbst (P1.1)
  • DataSource-Anbindung (P1.3)
  • Background-Indexing (P1.4)
Phase-1-Sub-Issue zu #122 (Decision Record 2026-06-06). ## Ziel sqlite-vec als native SQLite-Extension im Expo managed Workflow nutzbar machen + DB-Schema für persönlichen Vector-Store anlegen. ## Scope - EAS Build Config-Plugin schreiben oder vorhandenes Plugin integrieren, das `expo-sqlite` um die sqlite-vec-Extension erweitert (Android + iOS). - Custom Dev Client bauen, lokale Verifikation der `vec0`-Funktionalität (`vec_distance_cosine`, `vec_quantize_int8`). - DB-Schema (Drizzle SQLite oder reines SQL): - `vector_index` (`id`, `source_type`, `source_id`, `text_chunk`, `embedding BLOB`, `updated_at`) - Vec-Tabelle `vector_index_vec` als sqlite-vec virtuelles Table verlinkt auf `vector_index.embedding`. - Index-API: `upsert(sourceType, sourceId, chunk, embedding)`, `search(queryEmbedding, k, filter?)`. - Storage-Größe-Schätzung: 6k Einträge × 471 dim × 4 byte + sqlite-vec-Overhead → ~20 MB; bei 50k Einträgen ~170 MB. ## Akzeptanzkriterien - [ ] App startet auf Custom Dev Client mit sqlite-vec geladen (Smoke-Test: `SELECT vec_version()`). - [ ] EAS-Build-Pipeline dokumentiert (Drone-Step oder Build-Profile). - [ ] DB-Migration für `vector_index` + Vec-Table. - [ ] `VectorStore`-Service mit `upsert`/`search`-API, Vitest-Test über In-Memory-SQLite. - [ ] Falls iOS-Build-Probleme: dokumentiert + Workaround-Pfad. ## Out-of-Scope - Embedding-Generierung selbst (P1.1) - DataSource-Anbindung (P1.3) - Background-Indexing (P1.4)
Author
Collaborator

Scope-Korrektur 2026-06-06 — Build-Pipeline-Realität

Ursprünglicher Issue-Text nennt „EAS Build / Custom Dev Client / EAS-Build-Pipeline dokumentiert". Repo-Realität ist anders:

Tatsächliche Build-Pipeline (siehe .drone.yml)

  • Kein EAS Cloud Build im Einsatz. apps/mobile/eas.json existiert als Konfig-Stub (development/preview/production Profile), wird aber lokal/CI nicht ausgeführt.
  • publish-apk-Step in Drone macht npx expo prebuild --clean --platform android + ./gradlew assembleRelease, Gradle-Cache, NDK 25, JDK 17.
  • e2e-mobile-Step nutzt die gleiche Pipeline mit assembleDebug für Maestro-Smoke-Tests.
  • Android-only — kein apps/mobile/ios/-Verzeichnis vorhanden, keine iOS-Build-Konfig in Drone.

Korrigiertes Vorgehen

  1. expo-sqlite als Dependency hinzufügen (mobile peer der vec-Extension).
  2. Config-Plugin with-sqlite-vec.js schreiben (analog zu vorhandenem with-onnxruntime-package.js):
    • kopiert sqlite-vec vec0.so (jniLibs/arm64-v8a etc.) in den Android-Build via withDangerousMod
    • registriert Loader-Hook im MainApplication.kt (Extension-Auto-Load beim DB-Open) ODER setzt entsprechenden Gradle-Build-Schalter, je nach was expo-sqlite ab v15+ bereitstellt.
  3. Smoke-Test über den bestehenden e2e-mobile-Drone-Step (assembleDebug + Maestro) verifiziert SELECT vec_version() beim App-Start. Kein neuer Pipeline-Schritt nötig.
  4. DB-Schema mobile — neu, gibt's noch nicht im mobile-App. Drizzle SQLite-Migration oder reine SQL-Migration via expo-sqlite Migration-Hooks.
  5. VectorStore-Service mit upsert/search-API + Vitest-Test über In-Memory-SQLite (better-sqlite3 Node-Side mit sqlite-vec-Bundle für die Unit-Tests).

Akzeptanzkriterien (korrigiert)

  • App startet auf Dev-Client mit sqlite-vec geladen (Smoke-Test: SELECT vec_version() loggt eine Version-Zahl)
  • EAS-Build-Pipeline dokumentiertentfällt — keine EAS-Build-Pipeline im Projekt, prebuild + gradlew assembleRelease ist bestehend
  • DB-Migration für vector_index + Vec-Table
  • VectorStore-Service mit upsert/search-API, Vitest-Test über In-Memory-SQLite
  • iOS-Build-Workaround dokumentiertentfällt — kein iOS-Target im Projekt

Effort-Schätzung neu

Unverändert mittel — ~2-3 Tage. Native-Lib-Integration via Config-Plugin ist nicht trivial (.so-Auswahl pro ABI, Loader-Hook, Android-NDK-Kompatibilität) und das DB-Schema + VectorStore-Service ist greenfield.

## Scope-Korrektur 2026-06-06 — Build-Pipeline-Realität Ursprünglicher Issue-Text nennt „EAS Build / Custom Dev Client / EAS-Build-Pipeline dokumentiert". Repo-Realität ist anders: ### Tatsächliche Build-Pipeline (siehe `.drone.yml`) - **Kein EAS Cloud Build** im Einsatz. `apps/mobile/eas.json` existiert als Konfig-Stub (`development`/`preview`/`production` Profile), wird aber lokal/CI nicht ausgeführt. - `publish-apk`-Step in Drone macht `npx expo prebuild --clean --platform android` + `./gradlew assembleRelease`, Gradle-Cache, NDK 25, JDK 17. - `e2e-mobile`-Step nutzt die gleiche Pipeline mit `assembleDebug` für Maestro-Smoke-Tests. - **Android-only** — kein `apps/mobile/ios/`-Verzeichnis vorhanden, keine iOS-Build-Konfig in Drone. ### Korrigiertes Vorgehen 1. **`expo-sqlite` als Dependency** hinzufügen (mobile peer der vec-Extension). 2. **Config-Plugin `with-sqlite-vec.js`** schreiben (analog zu vorhandenem `with-onnxruntime-package.js`): - kopiert sqlite-vec `vec0.so` (jniLibs/arm64-v8a etc.) in den Android-Build via `withDangerousMod` - registriert Loader-Hook im `MainApplication.kt` (Extension-Auto-Load beim DB-Open) ODER setzt entsprechenden Gradle-Build-Schalter, je nach was expo-sqlite ab v15+ bereitstellt. 3. **Smoke-Test** über den **bestehenden** `e2e-mobile`-Drone-Step (`assembleDebug` + Maestro) verifiziert `SELECT vec_version()` beim App-Start. Kein neuer Pipeline-Schritt nötig. 4. **DB-Schema mobile** — neu, gibt's noch nicht im mobile-App. Drizzle SQLite-Migration oder reine SQL-Migration via `expo-sqlite` Migration-Hooks. 5. **VectorStore-Service** mit `upsert`/`search`-API + Vitest-Test über In-Memory-SQLite (`better-sqlite3` Node-Side mit `sqlite-vec`-Bundle für die Unit-Tests). ### Akzeptanzkriterien (korrigiert) - [ ] App startet auf Dev-Client mit sqlite-vec geladen (Smoke-Test: `SELECT vec_version()` loggt eine Version-Zahl) - [x] ~~EAS-Build-Pipeline dokumentiert~~ → **entfällt** — keine EAS-Build-Pipeline im Projekt, `prebuild + gradlew assembleRelease` ist bestehend - [ ] DB-Migration für `vector_index` + Vec-Table - [ ] `VectorStore`-Service mit `upsert`/`search`-API, Vitest-Test über In-Memory-SQLite - [ ] ~~iOS-Build-Workaround dokumentiert~~ → **entfällt** — kein iOS-Target im Projekt ### Effort-Schätzung neu Unverändert mittel — ~2-3 Tage. Native-Lib-Integration via Config-Plugin ist nicht trivial (.so-Auswahl pro ABI, Loader-Hook, Android-NDK-Kompatibilität) und das DB-Schema + VectorStore-Service ist greenfield.
Author
Collaborator

Implementation komplett — integriert in PR #444 (wireup/ai-foundation-phase1). Device-Pass läuft am übergeordneten Epic #122. Issue wird geschlossen.

Implementation komplett — integriert in PR #444 (`wireup/ai-foundation-phase1`). Device-Pass läuft am übergeordneten Epic #122. Issue wird geschlossen.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp#440
No description provided.