89 Commits
Author SHA1 Message Date
Mustafa Yildiz 9cd4ccf298 fix: dilekçe kataloğunu tek, DB-destekli kaynağa birleştir (Faz 3.5)
Gerçek bir sessiz veri kalitesi hatası bulundu: laawos-backend'deki dilekçe
kataloğu (petitionKnowledge.ts, 18 tür) ile laawos/Drafting.tsx ekranının
GERÇEKTEN kullandığı frontend kataloğu (petitionController.ts, 79 tür)
birbirinden bağımsız iki ayrı kopyaydı. Drafting.tsx backend'in
/drafting/catalog endpoint'ini hiç çağırmıyordu — kullanıcı ekrandaki 79
türden backend'in bilmediği 61'ini seçtiğinde, AI'ya hiçbir özel talimat/
zorunlu unsur listesi gitmiyordu (resolvePetitionContext sessizce boş
addon dönüyordu).

Yeni petitionCatalogService.ts, frontend'deki daha zengin 79'luk kataloğu
tek doğru kaynak olarak Supabase'e (sql/24_petition_types.sql, laawos
reposunda) taşıyor — 5dk cache + Supabase okunamazsa/migration henüz
çalıştırılmamışsa FALLBACK_PETITION_TYPES'a (programatik olarak birebir
çıkarılmış) düşme garantisi. getPetitionById/resolvePetitionContext artık
async ve bu servisi kullanıyor. Kategoriler (10 adet) kodda sabit kaldı.

Gerçek testle doğrulandı: "Kira Tespit / Kira Uyarlama Dava Dilekçesi"
(TBK m. 344) — eskiden backend'in 18'lik listesinde olmayan, artık doğru
şekilde zengin systemPromptAddon üretiyor.
2026-08-30 13:36:57 +03:00
Mustafa Yildiz b689b0f8fc feat: dinamik AI prompt yönetimi (ai_prompts tablosu + promptService)
20 AI system prompt'unu (chat/analiz/dilekçe/içtihat) koddan Supabase'e
taşıyan promptService.ts eklendi — artık bir prompt metnini değiştirmek
için redeploy gerekmiyor, admin panelden Supabase'e yazılıp 5dk içinde
devreye giriyor (bkz. laawos/docs/DINAMIK_PROMPT_MIMARISI_VE_YONETIMI.md,
laawos/sql/23_ai_prompts.sql — Supabase Studio'da elle çalıştırılmalı).

Canlı kullanıcı olduğu için davranış değişikliği YOK: promptService'in
fallback metinleri bugünkü hardcoded prompt'ların birebir kopyası
(programatik script ile karakter karakter doğrulandı), Supabase migration
çalıştırılmadan/erişilemezken sistem bugünkü gibi çalışmaya devam ediyor.
Bilinçli olarak dokunulmayanlar: model seçimi (tek global AI_MODEL env),
temperature (hiç gönderilmiyor), max_tokens (call-site'a göre değişiyor)
— hiçbiri gerçek AI çağrısına yansıtılmıyor, sadece prompt METNİ dinamik.

chat_intern iki farklı promptun (canlı sohbet vs. anlık soru-cevap) aynı
chat_mode='intern' etiketini paylaştığı görüldüğü için chat_intern_live
ve chat_intern_qa olarak ayrıştırıldı. Ayrıca kodda var olup dokümanda
listelenmeyen doc_strategy, doc_mediation, legislation_keywords, chat_title
ve chat_thread_general de tabloya eklendi.
2026-08-30 12:25:10 +03:00
Mustafa Yildiz dd7fccdd0c feat(drafting): centralize petition knowledge, CMK/HMK procedural rules, and prompt resolver on backend 2026-08-22 19:20:35 +03:00
Mustafa Yildiz 6b92f75e4b fix: install python3/make/g++ in Docker build for better-sqlite3
better-sqlite3'ün native modülü Alpine tabanlı imajda derlenemiyordu
(node-gyp Python/make/g++ bulamadığı için npm ci başarısız oluyordu) —
bu, Faz 4'te better-sqlite3 eklendiğinden beri (7468486) production
deploy'unu kırıyordu. Builder aşamasına kalıcı, runner aşamasına
geçici (.build-deps, npm ci sonrası kaldırılıyor) build araçları
eklendi.
2026-08-20 13:22:14 +03:00
Mustafa Yildiz 2744899f2a fix: raise global rate limit for local-first backup traffic
Faz 1-4 (yerel-öncelikli veri mimarisi) her dava dosyası için OCR,
register-local, tekil evrak yedeği, case.sqlite/master-index yedeği ve
register-case-path gibi çok sayıda ek istek üretiyor. Eski 5000/gün
limiti gerçek kullanımda kolayca doluyor ve Drive yedeğini sessizce
"pending" bırakıyordu.
2026-08-20 13:14:12 +03:00
Mustafa YildizandClaude Sonnet 5 746848606a feat: mobil için Google Drive ince-köprü endpoint'i ekle (Faz 4)
Yeni GET /api/mobile-relay/case/:caseId/summary — kullanıcının Drive'ındaki
case.sqlite'ı anlık olarak açıp sadece belge metadata'sı (extracted_text
HARİÇ) ve AI analiz özetlerini döner, hiçbir şey kalıcı olarak saklanmaz
(geçici dosya işlem sonunda silinir). google_drive_files'ı reuse eden
yeni /google-drive/register-case-path endpoint'i, case_id ↔ Drive'daki
local_path eşleşmesini tutan yeni case_drive_files tablosuna yazıyor
(migration: laawos/sql/21_case_drive_files.sql, Supabase'de elle
çalıştırılması gerekiyor).

better-sqlite3 + @types/better-sqlite3 eklendi; node:22-alpine (musl)
için gerekli prebuild paketle geliyor, ek derleme adımı gerekmiyor
(doğrulandı).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 00:44:12 +03:00
Mustafa YildizandClaude Sonnet 5 ab20d88422 feat: documents/analyses/drafts Postgres yazmalarını geçiş bayrağının arkasına al
Yerel-öncelikli veri mimarisi (Faz 3) — registerLocalDocument, case.
controller.ts'in 6 fonksiyonu (5 analiz + Dijital Stajyer) ve drafting.
controller.ts'in generateDraft/generateAngarya'sı artık PERSIST_TO_
POSTGRES ortam değişkenine göre davranıyor.

Bayrak varsayılan olarak true (mevcut davranış birebir korunuyor) —
kod deploy'u gerçek davranışı DEĞİŞTİRMİYOR. Kullanıcı gerçek veriyle
Faz 1/2'yi (yerel SQLite'a çift yazma + istekten metin kabul etme) test
edip güvendiğinde, PERSIST_TO_POSTGRES=false ayarıyla (kod değişikliği
gerekmeden) yazmalar durur; geri dönüş de aynı şekilde anlık.

case_events ve chat_messages kapsam dışı, dokunulmadı. Angarya taslakları
için bilinen bir sınırlama var: Faz 1'de yerel dual-write eklenmediğinden,
bayrak kapatıldığında bu taslaklar hiçbir yerde kalıcı olmayacak.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 00:31:59 +03:00
Mustafa YildizandClaude Sonnet 5 fd5cd8503a feat: analiz/sohbet/dilekçe endpoint'lerine istekten belge/analiz kabul etme desteği ekle
Yerel-öncelikli veri mimarisi (Faz 2) — case.controller.ts'in 5 analiz
fonksiyonu ve analyzeDigitalIntern artık req.body.documents'ı öncelikli
kaynak olarak kullanıyor (Electron'un yerel SQLite'tan gönderdiği),
yoksa mevcut Postgres sorgusuna düşüyor. buildCaseChatContext ve
generateDraft da aynı şekilde caseDocuments/latestAnalysisSummaryJson
opsiyonel alanlarını kabul ediyor. WhatsApp entegrasyonu (whatsapp.
controller.ts) bilinçli olarak dokunulmadı — yerel dosya erişimi
olmadığından mevcut Postgres yedek yoluna düşmeye devam edecek.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 00:23:07 +03:00
Mustafa YildizandClaude Sonnet 5 7c76913cf9 feat: ceza/hukuk mahkeme referanslarını kalan analiz ve taslak promptlarına yay
Kapsam genişletildi: ilk yükleme analizi, iddianame ön-analizi (sadece ceza),
Çelişki Avcısı'na hukuk referansı, Uzlaşma/Arabuluculuk analizi ve Dilekçe
Taslağı promptlarına da ceza muhakemesi ve/veya hukuk mahkemeleri referansı
eklendi. Angarya (Süre Tutum/Mazeret/Vekaletname) kasıtlı olarak dışarıda
bırakıldı — o araç tanımı gereği hiçbir hukuki tartışmaya girmiyor.

CEZA_MUHAKEMESI_REFERANSI ve HUKUK_MAHKEMELERI_REFERANSI export edildi ki
drafting.controller.ts document.controller.ts'den import edebilsin.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 23:00:46 +03:00
Mustafa YildizandClaude Sonnet 5 63eba80dac feat: hukuk mahkemeleri sistem referansını dava analiz promptlarına ekle
Dava Özeti, Dava İlerlemesi ve Strateji Analizi promptlarına mahkeme türü
(Asliye Hukuk, Sulh Hukuk, Aile, Asliye Ticaret, İş, Tüketici, İcra Hukuk,
Fikri ve Sınai Haklar, Kadastro), yargılama usulü ve zorunlu arabuluculuk
şartlarını özetleyen bir referans bloğu eklendi. Çelişki Avcısı'na
eklenmedi — o araç ceza usulüne özgü kolluk/savcılık/mahkeme aşamaları
arası ifade çelişkilerine odaklı, hukuk davalarında karşılığı yok.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 22:54:56 +03:00
Mustafa YildizandClaude Sonnet 5 407306914c chore: kaldırılan scratch.js dosyasını temizle
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 22:41:21 +03:00
Mustafa YildizandClaude Sonnet 5 aab94db1fa fix: kayıt sonrası deneme süresi mesajını 7 güne güncelle
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 22:39:36 +03:00
Mustafa YildizandClaude Sonnet 5 6202aadc8f feat: ceza muhakemesi usul/evrak/hüküm türü referansını dava analiz promptlarına ekle
Dava Özeti, Dava İlerlemesi, Çelişki Avcısı ve Strateji Analizi promptlarına
soruşturma/kovuşturma sırası, evrak türleri ve CMK m.223 hüküm türlerini
özetleyen ortak bir referans bloğu eklendi; AI dosyanın ceza davası olup
olmadığına kendi karar veriyor, rijit bir dava-türü sınıflandırması yok.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 22:38:33 +03:00
Mustafa YildizandClaude Sonnet 5 5fe4b0b8bc feat: WhatsApp AI hattı (n8n + Evolution API) için yeni uç nokta
chat.controller.ts'teki dosya-bağlamı toplama mantığı (belgeler + analiz
özeti + geçmiş mesajlar) buildCaseChatContext() olarak paylaşılan hale
getirildi — mevcut SSE sohbeti (chatMessage) davranış değişmeden bunu
kullanıyor, yeni POST /api/whatsapp/message uç noktası da aynı motoru
tek-seferlik (non-streaming) çağırıyor.

Kimlik doğrulama farklı: bu uç nokta bir Supabase oturumu taşımıyor
(n8n'den gelen anonim WhatsApp mesajı), X-Webhook-Secret ile korunuyor.
Telefon → hesap eşleştirmesi profiles.phone üzerinden, hangi dava
dosyasıyla konuşulduğu whatsapp_sessions'ta tutuluyor (bkz. laawos
sql/20_whatsapp_integration.sql).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 13:08:02 +03:00
Mustafa YildizandClaude Sonnet 5 fed881de49 fix: hardcoded 14 günlük trial fallback'i app_settings.trial_days'e taşı
Profil bulunamadığında otomatik açılan trial süresi Postgres trigger'ıyla
(handle_new_user, 3 gün) tutarsızdı. İkisi de artık aynı app_settings
tablosundan okuyor (bkz. laawos/sql/19_configurable_trial_and_status_gate.sql).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-18 12:43:01 +03:00
Mustafa Yildiz a5946eeb4a feat: Dava Özeti, Çelişki Avcısı ve Dilekçe Taslağı'na mevzuat entegrasyonu
mevzuat-etl'in doldurduğu Supabase mevzuat/mevzuat_madde tablolarından
(aynı proje) ilgili kanun maddelerini bulup analiz/taslak üretiminden önce
prompt'a ekliyor. Bulma: önce dava metnindeki açık atıfları regex ile yakala
(TCK m.141, 5237 sayılı Kanun'un 141. maddesi gibi, tur-agnostik), boşsa
precedent.controller.ts'deki AI-keyword-sıkıştırma + tam-metin arama
desenine düşer. Hiçbir zaman exception fırlatmaz, mevzuat bulunamazsa analiz
normal devam eder.

Dilekçe Taslağı (generateDraft) farklı ele alınıyor — çıktısı JSON değil düz
metin ve aynen dilekçe belgesi olarak kullanılıyor, bu yüzden referans
bloğu ayrıca işaretlenip sistem promptuna "kopyalama, sadece atıf yap"
talimatı eklendi. generateAngarya (Süre Tutum/Mazeret/Vekaletname) bilerek
dışarıda bırakıldı — hukuki tartışma içermeyen idari dilekçeler.

Tasarım: mevzuat-etl/docs/superpowers/specs/2026-08-17-laawos-mevzuat-entegrasyonu-design.md

Not: drafts.used_legislation (jsonb) sütunu Supabase Studio'dan elle eklendi.
2026-08-17 00:46:26 +03:00
Mustafa Yildiz 66a3960d90 fix: Ollama KEEP_ALIVE=-1 ve AbortError mesaj netliği, callAiModelRaw'a opsiyonel timeoutMs
KEEP_ALIVE '30m' -> -1: GPU'da bolca boş VRAM var, modeli sürekli bellekte
tutmanın maliyeti yok, 30dk sınırı gereksiz soğuk-başlangıç gecikmelerine
sebep oluyordu (bkz. 2026-08-14 log: 44GB boş / 17.5GB kullanılan).
2026-08-17 00:46:10 +03:00
Mustafa Yildiz 2324cb78a6 fix: resolve TypeScript TS18047 profile null type error in auth middleware 2026-08-15 17:04:14 +03:00
Mustafa Yildiz 146ba93a9b fix: auto-bind case user_id and auto-create missing user trial profiles in auth middleware to prevent 403 Forbidden errors 2026-08-15 17:01:30 +03:00
Mustafa Yildiz 6155a72830 fix: resolve false positive deficiency claims (görevsizlik kararı, doktor raporu, tanık beyanı) in case deficiency analysis 2026-08-15 16:58:58 +03:00
Mustafa Yildiz d86d843c61 feat: add CDATA section parser for UDF 1.8 template XML format 2026-08-15 11:08:20 +03:00
Mustafa Yildiz cab55c4fae fix: resolve UDF extraction false positive rejection on real UDF content.xml files 2026-08-15 11:06:41 +03:00
Mustafa Yildiz 389bbe33ef fix: filter out ZIP header metadata strings like content.xml and content.xmlPK from UDF text extractor 2026-08-15 11:03:26 +03:00
Mustafa Yildiz 9229c82806 fix: resolve 400 Bad Request on UDF attachment extraction with iconv-lite Turkish encoding support and fallback guarantee 2026-08-15 10:46:51 +03:00
Mustafa Yildiz 8962a63cf5 fix: upgrade UDF text extraction with multi-offset PK search and binary noise filter 2026-08-15 10:43:54 +03:00
Mustafa Yildiz 977239b0ca fix: improve UDF xml text extraction buffer reading 2026-08-15 10:31:16 +03:00
Mustafa Yildiz ad1f3107de fix: add robust fallback insert strategy for template upload to guarantee 100% upload success for UDF/binary files 2026-08-15 10:25:31 +03:00
Mustafa Yildiz 49841241be fix: add sanitizePostgresText to filter null bytes and malformed Unicode escape sequences before inserting template text into Supabase 2026-08-15 10:20:54 +03:00
mstfyldz 95478c09e8 fix: PK signature offset searching for UDF files in backend 2026-08-14 13:23:48 +03:00
mstfyldz 6dd34fe703 feat: enhance UDF file extraction pipeline to unzip container and handle content.xml or embedded PDF files 2026-08-14 13:13:37 +03:00
mstfyldz 644d5f4052 fix: strictly penalize pure mahkumiyet onamasi decisions on beraat search and extract beraat passages 2026-08-14 12:15:46 +03:00
mstfyldz 8ae98a9500 feat: smart intent-based precedent re-ranking for beraat/bozma/tazminat outcomes 2026-08-14 12:12:19 +03:00
mstfyldz 58ae3655b6 fix: insert assistant digital-intern responses into chat_messages table 2026-08-14 12:06:19 +03:00
mstfyldz ee83ea648d feat: complete targetPersona opponent attorney cross examination simulator prompts 2026-08-14 11:56:28 +03:00
mstfyldz d2ea58942c fix: add stream routes and guarantee finalJson answer property 2026-08-14 11:53:04 +03:00
mstfyldz c4947422dc feat: add digital-intern live-qa endpoints for pinpoint hearing assistance 2026-08-14 11:48:49 +03:00
mstfyldz d3f91d4da6 fix: support both clientName and client_name in analyzeStrategy and analyzeMediation 2026-08-14 11:42:59 +03:00
mstfyldz d7a99a9db0 fix: add role-based strategic goals and winSteps to runStrategyAnalysis 2026-08-14 11:39:37 +03:00
mstfyldz 11c26d6029 fix: re-orient STATEMENT_ANALYSIS_SYSTEM_PROMPT to focus on stage and cross-witness contradictions 2026-08-14 11:34:49 +03:00
mstfyldz 9f1ffedb88 fix: enforce K.H. Kamu Hukuku exclusion rule in STATEMENT_ANALYSIS_SYSTEM_PROMPT and filter output 2026-08-14 11:31:51 +03:00
mstfyldz 7da869224f fix: add alias routes for case analysis endpoints 2026-08-14 01:16:05 +03:00
mstfyldz fab80e05a0 feat: upgrade AI prompts to v2 specification with grounding and injection shield 2026-08-14 00:52:41 +03:00
mstfyldz f1457b02ca fix(chat): allow AI to finish and save responses even if client disconnects 2026-08-12 13:02:40 +03:00
mstfyldz d10ea1b0fd fix(chat): add SSE padding to bypass proxy buffering 2026-08-12 12:48:04 +03:00
mstfyldz 7b6b27909c chore: remove test files 2026-08-12 11:22:27 +03:00
mstfyldz e25bab8146 fix: Supabase storage upload hatasını çözmek için dosya adlarındaki Türkçe karakterler ve boşluklar temizlendi 2026-08-12 11:22:05 +03:00
mstfyldz 571e1f63d1 feat: Arabuluculuk & Müzakere Asistanı analiz endpoint'leri eklendi 2026-08-12 10:58:44 +03:00
mstfyldz 6916a7d9ba perf: prevent duplicate CDN uploads by checking Supabase first 2026-08-12 10:41:08 +03:00
mstfyldz b86aa54378 feat: migrate local file cache to BunnyCDN storage API 2026-08-12 10:35:44 +03:00
mstfyldz 437f973d6f feat: Add precedent caching mechanism via txt and supabase 2026-08-12 02:17:57 +03:00