Skip to content

feat(assistant): Unified Assistant Context Store (OfflineAssistantContext)#43

Merged
selimmujdeci merged 2 commits into
mainfrom
feat/assistant-context-store
Jul 10, 2026
Merged

feat(assistant): Unified Assistant Context Store (OfflineAssistantContext)#43
selimmujdeci merged 2 commits into
mainfrom
feat/assistant-context-store

Conversation

@selimmujdeci

Copy link
Copy Markdown
Owner

Amaç

Voice Assistant · Companion AI · Safety Kernel · Offline Conversation · Deep Scan · Vehicle Learning · Diagnostic AI · Maintenance AI katmanlarının bugün ayrı ayrı okuduğu kaynakları tek merkezde toplayan, periyodik ve dondurulmuş (immutable) snapshot yayınlayan birleşik bağlam store'u.

Additive: hiçbir servise yazmaz, hiçbir tüketiciye ve SystemBoot'a bağlı değil → bu PR'da çalışma zamanı davranışı değişmez.

Yeni dosyalar

  • src/store/useAssistantContextStore.ts
  • src/__tests__/assistantContextStore.test.ts (25 test)

Değişen dosyalar

Başka hiçbir dosyaya dokunulmadı.

Tasarım — assistantSafetyKernel deseni

Katman Sorumluluk
buildSnapshot(sources, now, revision) SAF kurucu. Enjekte edilen kaynaklar üstünde çalışır, canlı servis okumaz, asla throw etmez, girdiyi mutate etmez, çıktısı Object.freeze'li
readLiveSources(now, coldRefreshMs) Canlı adaptör. Her kaynak izole try/catch → biri düşse diğer bölümler üretilmeye devam eder
startAssistantContext / stopAssistantContext Abonelikler start'ta bir kez kurulur, dispose'ta bir kez kapatılır

Bu ayrım sayesinde karar/şekillendirme mantığı cihazsız, mock'suz, deterministik test edilir.

Snapshot bölümleri

identity (fingerprintHash, manufacturer, profileHint, protocol) · health (healthScore, severity, driveSafe, maintenance) · learning (evidenceCount, patternCount, strongestConfidence, learnedVehicleCount) · deepScan · status (speed, rpm, coolantTemp, fuelLevel, batteryVoltage, ignition) · driver (fatigueScore, tripDuration, cognitiveMode) · navigation (isNavigating, destination, remainingKm, remainingTime) · media (playing, volume, ducking) · network (online, wifi, mobile) · device (tier, thermalStatus, powerSaver)

Kök nesne ve 10 bölümün hepsi ayrı ayrı Object.freeze'li.

⚠️ Kaynağı olmayan alanlar — uydurulmadı

Repo denetiminde şu alanları besleyen bir servis bulunamadı. Değer üretmek yerine dürüstçe null bırakıldı ve şemada yer tutuyor:

Alan Neden null
deepScan.* (5 alan) Projede genel bir Deep Scan servisi yok — yalnız DTCPanel.tsx içinde lokal isDeepScanning UI state'i var
driver.fatigueScore Sürücü yorgunluk skoru üreten servis yok
status.ignition Kontak durumu yayan sinyal yok
media.ducking audioService duck durumunu dışa açmıyor (_duckCount private)
network.wifi / mobile Yalnız navigator.connection.type kesin söylüyorsa dolar; connectivityService sync okuma API'si sunmuyor

Kaynakları eklendiğinde yalnız adaptör doldurulacak; şema ve tüketiciler değişmeyecek.

Performans bütçesi

  • Periyot 5 sn; DeviceTier === 'low'10 sn.
  • Görev runtimeManager.scheduleTask üstünde: criticality: 'NORMAL' (güvenlik kararı üretmez → düşük tier'da mod çarpanıyla yavaşlaması istenir) + deferIdle: true (requestIdleCallback) → hot-path'e (3Hz hız/RPM) girmez.
  • Dirty-flag: hiçbir kaynak değişmediyse ve snapshot bayat değilse tik hiçbir şey ayırmaz (park hâlinde sıfır maliyet). 60 sn bayatlama tavanı soğuk bölümlerin taze kalmasını garanti eder.
  • Ağır soğuk-yol bölümleri (identity, learning) her tikte değil, 30 sn (low: 60 sn) aralıkla okunur; arada önbellek döner. learning okuması zaten memoized + bounded(512) + tier-farkında vehicleLearningIntegrationService üstünden gelir (low tier'da ağır pattern detayı kapalı).
  • DTC → severity/driveSafe türevi yalnız kod listesi değişince yeniden hesaplanır.

Gizlilik

VIN · MAC · GPS koordinatı · ham PID/DID/CAN snapshot'a asla girmez. Kurucu whitelist çalışır: girdiye fazladan alan eklense bile snapshot'a sızamaz (yapısal garanti, testle kilitli). Navigasyon hedefi yalnız görünen ad (koordinatsız, ≤64 karakter).

Zero-leak

Snapshot başına subscribe/unsubscribe döngüsü yok (abonelikler start'ta bir kez). start/stop idempotent. Dispose: scheduler görevi kaldırılır, tüm abonelikler kapatılır, önbellekler ve yayınlanan snapshot temizlenir (eski referans tutulmaz). Dispose sonrası elde kalmış bir görev referansı tetiklense bile tick() sessizce çıkar (dangling görev guard'ı).

Dokunulmayanlar

assistantSafetyKernel.ts · companionContext.ts · vehicleLearningDecay.ts · vehicleLearningPatternEngine.ts · diagnosticKnowledgeEngine.ts · Fingerprint algoritması · Vehicle Learning algoritması · Discovery Pipeline · OBD polling · Native Android · SQL/Supabase · PR #11 / PR #20

Testler — 25 test

Snapshot oluşturma (3) · tier periyodu low=10s / mid+high=5s (2) · freeze + immutability + girdi mutasyonsuzluğu (3) · fail-soft (2) · null servis / throw eden kaynak (2) · dispose + start/stop idempotency + dangling görev (4) · gizlilik (2) · dirty flag (3) · manuel refresh (1) · bellek büyümesi yok (1) · hot-path koruması (2).

CI beklentisi

Yerel: tsc -b temiz · eslint temiz · 170 dosya / 2628 test yeşil (baseline 2603 + 25 yeni; regresyon yok).

Risk

Düşük. Yeni, izole bir dosya; hiçbir mevcut çağrı yolu değişmedi. Store başlatılmadığı sürece (startAssistantContext çağrılmadıkça) tek etkisi modül import'u. Başlatıldığında dahi: yalnız okur, yazmaz; güvenlik/tanı kararlarını değiştirmez; görev NORMAL + idle → hot-path ve BASIC_JS bütçesi korunur. Asıl risk tüketici bağlama (wiring) PR'ında doğar — orada snapshot'ın bayatlığı ve null alanların tüketicilerce doğru ele alınması doğrulanmalıdır.

Ledger

Kayıt #28 — 🔴 cihazda test edilmedi. Numara 28 seçildi çünkü 26 ve 27 açık PR'larda (#41, #42) rezerve.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q74z6tXWP39iBSXZYnLQW1

…text)

Voice Assistant · Companion AI · Safety Kernel · Offline Conversation ·
Vehicle Learning · Diagnostic AI · Maintenance AI katmanlarının BUGÜN ayrı ayrı
okuduğu kaynakları TEK merkezde toplayan, periyodik + dondurulmuş snapshot
yayınlayan store.

useAssistantContextStore (yeni, tek dosya):
- buildSnapshot(): SAF kurucu — enjekte kaynaklar, throw ETMEZ, girdiyi mutate
  ETMEZ, çıktı Object.freeze'li (kök + 10 bölüm). Whitelist: girdiye fazladan
  alan eklense bile snapshot'a SIZAMAZ.
- readLiveSources(): canlı adaptör — her kaynak İZOLE try/catch (fail-soft);
  biri düşse diğer bölümler üretilmeye devam eder.
- Lifecycle: abonelikler start'ta BİR KEZ kurulur, dispose'ta BİR KEZ kapatılır
  → snapshot başına subscribe/unsubscribe döngüsü YOK. start/stop idempotent,
  dangling görev guard'lı (zero-leak).

Performans bütçesi: periyot 5 sn · DeviceTier=low → 10 sn. Görev
runtimeManager.scheduleTask üstünde criticality:'NORMAL' + deferIdle:true →
hot-path'e (3Hz hız/RPM) GİRMEZ. Dirty-flag ile park hâlinde tik sıfır ayırma
yapar (60 sn bayatlama tavanı). Ağır soğuk-yol bölümleri (identity/learning)
30 sn (low: 60 sn) aralıkla okunur, arada önbellek döner; learning okuması
zaten memoized + bounded(512) + tier-farkında entegrasyon servisinden gelir.

Gizlilik: VIN · MAC · GPS koordinatı · ham PID/DID/CAN snapshot'a ASLA girmez.
Navigasyon hedefi yalnız görünen ad (koordinatsız, ≤64 karakter).

Kaynağı OLMAYAN alanlar uydurulmadı, dürüstçe null: deepScan.* (projede genel
bir Deep Scan servisi YOK — yalnız DTCPanel'de lokal isDeepScanning UI state'i),
driver.fatigueScore, status.ignition, media.ducking, network.wifi/mobile
(yalnız navigator.connection.type kesinse dolar).

Additive: hiçbir servise YAZMAZ, severity/driveSafe/diagnostic kararını
DEĞİŞTİRMEZ (yalnız okur), henüz hiçbir tüketiciye ve SystemBoot'a bağlı
DEĞİL → bu PR'da çalışma zamanı davranışı değişmez.

Test: 25 test (snapshot · tier periyodu · freeze/immutability · fail-soft ·
null servis · dispose · zero-leak · gizlilik · dirty flag · manuel refresh ·
bellek büyümesi · hot-path). tsc -b temiz, lint temiz, tam suite 2628 yeşil
(regresyon yok). Ledger #28 (cihazda test bekliyor).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q74z6tXWP39iBSXZYnLQW1
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
car-launcher-pro Ready Ready Preview, Comment Jul 10, 2026 7:19pm
carospro Ready Ready Preview, Comment Jul 10, 2026 7:19pm

…t-store

# Conflicts:
#	docs/DEVICE_VALIDATION_LEDGER.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant