From 129c83971cc6495a5b47094ab9715fe7d6e56f4b Mon Sep 17 00:00:00 2001 From: bilalgursen Date: Thu, 8 Oct 2026 23:27:42 +0300 Subject: [PATCH] =?UTF-8?q?fix(revizyon):=20g=C3=BCvenlik-uyum=20bulgular?= =?UTF-8?q?=C4=B1=20=E2=80=94=20kredi=20=C5=9Fart=C4=B1=20metinde,=20hata?= =?UTF-8?q?=20metinleri,=20ba=C4=9Flant=C4=B1=20logu=20yaln=C4=B1z=20kay?= =?UTF-8?q?=C4=B1tl=C4=B1=20slug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pazarlama maddesi "Liste revizyonu sayısı sınırsız (her istek 1 sohbet kredisi)"; revizyon hata metinleri "kredin etkilenmedi" demiyor (mesajın kredisi düşüyor); "revizyon hakkı" ifadesi kalktı; bağlantı düzeltme logu modelin ham slug'ını değil yalnız kayıtlı slug'ı yazıyor. Co-Authored-By: Claude Fable 5.1 --- src/app/page.tsx | 2 +- src/features/odeme/components/paket-satinal.tsx | 2 +- src/features/rapor/liste-revizyon.ts | 4 ++-- src/lib/ai/rapor.ts | 2 +- src/lib/ai/sohbet-akisi.ts | 5 +++-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index ce82edb..f7c72ca 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -244,7 +244,7 @@ const paketOzellikleri = [ text: `Her tercih için yerleşme riski ve trend analizi (son ${VERI_YIL_SAYISI} yıl)`, }, { icon: FileText, text: "Veliyle paylaşılabilir PDF rapor" }, - { icon: RefreshCcw, text: "Sınırsız liste revizyonu (danışmanla sohbetten)" }, + { icon: RefreshCcw, text: "Liste revizyonu sayısı sınırsız (sohbetten; her istek 1 sohbet kredisi)" }, { icon: MessageCircleQuestion, text: `${URUNLER.paket.credits} yapay zekâ danışman sorusu`, diff --git a/src/features/odeme/components/paket-satinal.tsx b/src/features/odeme/components/paket-satinal.tsx index 2011579..2b1ff1b 100644 --- a/src/features/odeme/components/paket-satinal.tsx +++ b/src/features/odeme/components/paket-satinal.tsx @@ -34,7 +34,7 @@ const OZELLIKLER = [ text: `Her tercih için yerleşme riski ve trend analizi (son ${VERI_YIL_SAYISI} yıl)`, }, { icon: FileText, text: "Veliyle paylaşılabilir PDF rapor" }, - { icon: RefreshCcw, text: "Sınırsız liste revizyonu (danışmanla sohbetten)" }, + { icon: RefreshCcw, text: "Liste revizyonu sayısı sınırsız (sohbetten; her istek 1 sohbet kredisi)" }, { icon: MessageCircleQuestion, text: `${URUNLER.paket.credits} Yapay Zeka danışman sorusu (her mesaj 1 kredi)`, diff --git a/src/features/rapor/liste-revizyon.ts b/src/features/rapor/liste-revizyon.ts index 04db04e..f762603 100644 --- a/src/features/rapor/liste-revizyon.ts +++ b/src/features/rapor/liste-revizyon.ts @@ -36,10 +36,10 @@ function hataMesaji(err: unknown): string { err instanceof Error && /abort|timeout|timed out/i.test(`${err.name} ${err.constructor.name} ${err.message}`) ) { - return "Liste üretimi bu sefer çok uzun sürdü ve durduruldu; kredin/paketin etkilenmedi."; + return "Liste üretimi bu sefer çok uzun sürdü ve durduruldu; revizyon bedeli alınmadı (bu mesajın 1 sohbet kredisi düştü)."; } console.error("[revizyon] üretim hatası:", err instanceof Error ? err.message : String(err)); - return "Liste yeniden kurulurken bir sorun oluştu; kredin/paketin etkilenmedi."; + return "Liste yeniden kurulurken bir sorun oluştu; revizyon bedeli alınmadı (bu mesajın 1 sohbet kredisi düştü)."; } function ozetCikar(rapor: RaporSonuc): Extract { diff --git a/src/lib/ai/rapor.ts b/src/lib/ai/rapor.ts index 0307387..6331d7a 100644 --- a/src/lib/ai/rapor.ts +++ b/src/lib/ai/rapor.ts @@ -709,7 +709,7 @@ export async function raporUretAyrintili( )}`, ); throw new RaporUretimHatasi( - "Rapor üretilemedi (doğrulama iki denemede de başarısız). Tekrar dener misin? Revizyon hakkın kullanılmadı.", + "Rapor üretilemedi (doğrulama iki denemede de başarısız). Tekrar dener misin?", ); } // İlk üretimde zaman aşımı (bkz. ZAMAN_ASIMINDA_KODLA_KUR): liste tamamen diff --git a/src/lib/ai/sohbet-akisi.ts b/src/lib/ai/sohbet-akisi.ts index 294765a..a1b7e35 100644 --- a/src/lib/ai/sohbet-akisi.ts +++ b/src/lib/ai/sohbet-akisi.ts @@ -218,7 +218,7 @@ export function danismanAkisi(opts: { } if (tampon) { baglantiDuzeltme += tampon.duzeltmeler.length; - for (const d of tampon.duzeltmeler) duzeltilenSluglar.push(d.yeniSlug ? `${d.slug}→${d.yeniSlug}` : `${d.slug}→(düz)`); + for (const d of tampon.duzeltmeler) duzeltilenSluglar.push(d.yeniSlug ? `→${d.yeniSlug}` : "→(düz)"); tampon = null; } } else if (parca.type === "error") { @@ -277,7 +277,8 @@ export function danismanAkisi(opts: { const semaSizintisi = semaSizintisiVar(metin, ARAC_ADLARI); if (semaSizintisi) console.warn("[soru] olası iç şema sızıntısı: cevapta araç adları / şema anahtarları var"); if (reddedilenArac) console.info("[soru] araç sınırı:", reddedilenArac, "çağrı çalıştırılmadı"); - // Slug kişisel veri değildir; hangi uydurma adresin neye döndüğü loglanır + // Yalnız sayaç + kayıtlı (gerçek) slug loglanır; modelin yazdığı ham slug + // kullanıcı metninden gelebileceği için log'a geçmez (güvenlik-uyum, 7 Eki 2026). if (baglantiDuzeltme) console.info("[soru] rehber bağlantısı düzeltildi:", baglantiDuzeltme, duzeltilenSluglar.join(", ")); opts.onDenetim?.({ jevP, vaatRegex, vaatNotu, reddedilenArac, kayitNotu, revizeNotu, semaSizintisi, baglantiDuzeltme }); await opts.onTamam(metin);