Müşteri kurulumlarında görünen davranış değişiklikleri. Daha eski sürümler için git geçmişine bakın.
Eski sürümden güncellenen müşterilerin yerel ayarları, kimliği ve önbellekleri yeni FixPoint klasörlerine kendiliğinden taşınır. Eski klasör rollback için yerinde kalır; ek bir işlem gerekmez.
%ProgramData%) da otomatik taşınır./download sayfası yeni kimliğe uyarlandı (favicon, tema rengi).Ürünün adı FixPoint olarak güncellendi. Bu sürüm sessiz bir altyapı geçişiydi; kullanıcı davranışında değişiklik yok. Önceki kurulumlar bu sürümden sonra v0.9.1 + v0.9.2 ile görsel ve yerel veri taşımayı tamamladı. Müşterinin ERP sistemine entegrasyon (IErpAdapter ailesi, ErpProduct alanı) ve erp.tr alan adı korundu.
v0.8.x patch serisi diagnostics + stability + capture-side resilience ekseninde yedi release ile tamamlanıyor. Bu son patch operasyonel görünürlük katmanı:
ResilientScreenCapture.ActiveEngine property eklendi ("dxgi" / "gdi" / "other"). StartAsync ile birlikte StatusChanged?.Invoke("engine:dxgi|gdi") emit ediliyor; swap tamamlanınca yeni engine label da event akışına düşüyor. Downstream observer'lar polling yapmadan engine değişimini takip edebilir.StreamPublisher.HeartbeatLoopAsync — 60 saniyede bir aktif sahada şu satırı emit ediyor: stream:heartbeat engine=dxgi frames=12345 deltas=987 full=23 dropped=1 quality=70. 60 sn cadence 2 MB log cap ile uyumlu (24 saatte ~150 KB).Capture initialized — engine=dxgi monitors=2 primary=\\.\DISPLAY1. Support call'da agent ortamı tek satırda görünüyor.Test: 173 toplam (+3 yeni ResilientScreenCapture test'i: ActiveEngine baseline, Start emits engine label, swap emits new engine label).
| Release | Tema | Öz |
|---|---|---|
| v0.8.0 | Anonim peer connect + v0.8 features | Faz D-1, altyazı dil seçici, monitor topology, caption history, KVKK retention API, Mikro/Netsis ERP adapter |
| v0.8.1 | Native viewer UX + stream stability | F11 fullscreen, 📊 stats overlay, stub close, TR loading copy, WS reconnect + ping, encode-error rate limit |
| v0.8.2 | Connect-failure UX (C section) | DiagnosticLogger.GetConnectAdvice — DNS/refused/timeout/tls/not-ws/http için somut Türkçe yönlendirme |
| v0.8.3 | Diagnostics complete (D section) | ConnectClassifier Shared'a taşındı (Console + Agent ortak); /api/diag/server; saat skew uyarısı |
| v0.8.4 | TLS pinning + UI polish | expectedTlsThumbprint MITM kesin tespiti; troubleshoot hyperlink; .error pre-line |
| v0.8.5 | Capture mid-session resilience | ResilientScreenCapture — DXGI fatal'da otomatik GDI fallback; SelectMonitor swap'tan korunuyor |
| v0.8.6 | Capture observability | ActiveEngine + 60 sn heartbeat + boot banner — operasyonel görünürlük |
v0.9 zemini: WebRTC P2P data channel, MAUI mobile teknisyen viewer, Linux/Android capture ilk implementasyon, ek server-side audit retention sweep perf (batch delete + index review).
Önceki davranış: agent DXGI ile başlar, RDP tespit edilirse veya init başarısız olursa GDI'ya düşerdi — ama mid-session DXGI çökerse (sürpriz UAC prompt, secure-desktop transition, GPU sürücü hıçkırığı, monitor takıp-çıkarma kombinasyonu) capture loop sonsuza dek "recreate-failed" log'lardı ve viewer donmuş kare gösterirdi. Müşterinin tek çıkış yolu agent restart'tı.
Yeni davranış: ResilientScreenCapture wrapper'ı primary DXGI'yi izliyor; DXGI 20 ardışık frame failure'da "fatal:..." status'u raise ediyor, wrapper bunu yakalayıp arka plan task'ında DXGI'yi dispose edip GDI'yi spin-up'lıyor. SelectMonitor seçimi swap boyunca korunuyor (operatör monitor 2'deyken DXGI ölürse, GDI da monitor 2'de açılır). Stream publisher ve viewer için bu görünmez bir geçiş — IScreenCapture event sequence aynı kalıyor.
Hem MainWindow.xaml.cs (kullanıcı session'ı) hem Service/CaptureWorker.cs (service-mode unattended) sarmalayıcıyı kullanıyor.
Test: 170 (önceki 33'e +137 — toplam suite — tüm var olan testler dahil; bu dalga +5 ResilientScreenCaptureTests ekledi: normal pass-through, fatal triggers swap exactly-once, post-swap events come from fallback, selected monitor persists, second-fatal-on-fallback no re-swap).
v0.9 adayları: WebRTC P2P data channel, MAUI mobile teknisyen viewer, Linux/Android capture ilk implementasyon.
/api/diag/server payload'una opsiyonel expectedTlsThumbprint alanı eklendi (SHA-256, uppercase hex, separator-yok). Operatör appsettings.Production.json'da FixPoint:ExpectedTlsThumbprint ile pinleyebiliyor. Agent kendi HTTPS handshake'i sırasında SocketsHttpHandler.SslOptions.RemoteCertificateValidationCallback ile karşı tarafın cert thumbprint'ini gözlemleyip server'ın advertise ettiği ile karşılaştırıyor:
TlsThumbprintMismatch = true → "Bağlantıyı sına" yeşil yerine kırmızı + Sertifika eşleşmedi — beklenen ve gözlenen TLS parmak izi farklı. Kurumsal MITM proxy (Zscaler, Netskope vb.) trafiği inceliyor olabilir; IT departmanınızla teyit edin.Thumbprint normalize ediliyor (: - space karakterleri ve case temizleniyor) — operatör Windows cert dialog'undan kopyala-yapıştır yapabilsin diye.
https://rdp.erp.tr/guide#bağlantı-sorunları'na yönlendiriyor. Online'a dönünce otomatik gizleniyor..error CSS'i white-space: pre-line — v0.8.3'te eklenen iki-satırlı Bağlanamadı X\n→ Lütfen Y mesajının \n'i artık görsel olarak alt satıra düşüyor (önceden tek satırda birleşiyordu).33 testi geçiyor (önceki 23'e 10 yeni HealthCheckerThumbprintTests):
v0.9 adayları: WebRTC P2P data channel, Mobile MAUI teknisyen viewer, Linux/Android capture ilk implementasyon.
v0.8.2 C-section sadece müşteri Agent tarafını zenginleştirmişti; teknisyen Console tarafı hâlâ ham exception bubble ediyordu. Bu dalga eksiği tamamlıyor:
ConnectClassifier.Classify + GetAdvice artık FixPoint.Shared.Diagnostics altında, hem Windows-only Agent hem cross-platform Console kullanabiliyor. FixPoint.Agent.Services.DiagnosticLogger aynı API'yi ince wrapper ile koruyor (mevcut çağrı yerleri etkilenmedi). Console'un TechClient.ConnectAndAuthAsync artık WS connect exception'ını da yakalayıp LastAuthErrorMessage ile birlikte enriched advice basıyor; LoginForm NetworkError outcome'unda bu mesajı verbatim gösteriyor — "geçersiz kullanıcı/parola" yerine "DNS bulunamadı: rdp.erp.tr — IT'den iç DNS'e ekleme isteyin." LastConnectErrorCode field'ı UI'ya ikon/yardım linki seçmek için sınıflandırma kodunu da sunuyor./api/diag/server endpoint: Sunucu artık GET /api/diag/server ile kendi kimliğini açıkça döndürüyor: ``json { "identity": "FixPoint", "serverVersion": "0.8.3", "latestAgentVersion": "0.8.3", "minimumAgentVersion": "0.6.0", "serverTimeUtc": "2026-05-23T...", "downloadUrl": "https://rdp.erp.tr/download/agent" } `` Captive portal / yanlış host şüphesinde agent'ın "evet, gerçekten FixPoint sunucusuna varıyorum" diye doğrulayabilmesi için. Auth gerektirmiyor (agent'ın henüz kimliği yok); secret içermiyor. GET + HEAD destekli (monitoring probe'ları için).
/health'in yanında /api/diag/server'ı da çağırıyor. Sunucu yanıtının serverTimeUtc alanı ile yerel saat arasında 60 saniyeden fazla fark olursa "Saat farkı: N sn — sistem saatinizi senkronize edin (w32tm /resync)" uyarısı tek satırda görünür. Bu hata kategorisi auth.signature.badsignature zinciri için en sık kök neden (±5 dakika imza penceresi).Test: 23 ConnectAdvice testi geçiyor (önceki 17'ye 6 yeni: Shared classifier null-logHint fallback, custom logHint, ve Shared↔wrapper drift guard). v0.9 adayları: WebRTC P2P data channel; Mobile teknisyen viewer; TLS sertifika fingerprint pinning (D2'nin advanced phase'i — MITM kesin tespiti).
Önceden bir agent sunucuya bağlanamadığında ekrana sadece "DNS bulunamadı" gibi kısa bir hata yazıyordu — müşteri ne yapacağını bilemiyordu. Şimdi her sınıflandırma kodu için somut yönlendirme sunuluyor.
Ayrıca boot banner'a sistem proxy varlığı eklendi (system proxy: configured=true/false). Kurumsal hostname leakage olmasın diye proxy URL'i log'a basılmıyor — sadece "yapılandırılmış mı?" boolean'ı.
Bu enriched mesaj agent.log'a yazılan teknik detayı ezmiyor, kullanıcıya gösterilen satırın altına "→ {advice}" şeklinde ekleniyor. Operatör log'u her zaman tam exception zinciri ile birlikte bulur.
Test: tests/FixPoint.AgentService.Tests/ConnectAdviceTests.cs — 7 testle her code → advice cümlesi pin'lendi. v0.8.3+ adayları: TechClient (teknisyen tarafı) connect path'i için aynı enriched UX; /api/diag/connect server endpoint'i (TLS fingerprint + identity yanıtı).
⛶ toggle + F11 kısayolu; Esc ile çıkış. WindowStyle/State/ResizeMode geri-restore stack'i — çıkışta önceki boyut/ekran konumu korunur.📊 toggle; canvas'ın sağ-üstünde 1920×1080 14.9 fps · 320 KB/s · 423 frames pill. 1 saniyelik örnekleme.%APPDATA%\FixPoint\viewer-window.json; sadece Normal state. Monitör topolojisi değişince (off-screen tespiti) default'a düşer./ws/stream socket'i artık supervisor loop'u ile çalışıyor. Mid-session network drop → 1s→2s→4s→8s→15s backoff ile aynı session/token üzerinden yeniden bağlanır; "Oturum sonlandır" veya pencere kapatma ise intentional close olarak işaretlenir, gereksiz yeniden bağlanma denemeleri tetiklemez.KeepAliveInterval set edildi; ölü TCP bağlantıları artık birkaç dakika değil saniyeler içinde fark ediliyor.agent.log'a saniyede 15 hata satırı basıyordu; artık ilk hata + her 100'üncüsünde tek satır. Successful frame görünce sayaç sıfırlanıyor — kısa transient'ler bir sonraki olayda tekrar raporlanır.Bağlan diyaloğunda kullanıcı adı + parolayı boş bırakırsanız, native viewer teknisyen kimliği olmadan açılır. Bunun yerine hedef bilgisayardaki müşterinin onay diyaloğu kontrol noktası olur — AnyDesk'in "ID yaz, karşı taraf izin versin" akışıyla birebir. KVKK audit'te bu seanslar peer:{çağıran-9-haneli-id} formatında etiketlenir; klasik teknisyen seansları aynen önceki gibi peer: prefix'i olmadan kayda geçer, sorgu/filtre net.
OpenPeerRemoteAsync aktif (TechSignalingClient yok, /ws/tech yok); biri dolu biri boşsa "her ikisini de doldur veya her ikisini de boş bırak" mesajı çıkar.SessionBroker.RequestPeerAsync synthetic kimlikle seans yaratır; mevcut SessionInvite envelope'u target'a aynen gider. Accept → AgentPeerInfo (yeni envelope) caller'ın /ws/agent socket'ine stream token taşır. Decline/Timeout/End yolları caller agent'ı da unbusy yapar.Native viewer toolbar'ında 🌐 dropdown: tr/en/de/fr/es/de/it/ja/zh seçilir, sunucu o anki kullanıcı için FixPoint Translate'i o dilde çağırır. Multilingual çağrı merkezi senaryoları için (ör. TR konuşan müşteri + EN konuşan uzman) anlık çift yönlü altyazı.
Müşteri seans sırasında ikinci ekranı taksa veya çıkarsa, agent yeni listeyi sunucuya yansıtır; teknisyenin monitor picker dropdown'ı kendiliğinden tazelenir. Önceden Bağlan'ı kapatıp tekrar açmak gerekiyordu.
Native viewer'ın sağında kayar caption history sidebar: o seans boyunca söylenenler kronolojik liste halinde, partial/final ayrımı korunarak. Kaydırılır, kopyalanır.
src/FixPoint.Agent.Linux/Capture/ ve src/FixPoint.Agent.Mobile/Capture/ projeleri eklendi. Henüz boş iskelet — PipeWire portal / X11 / MediaProjection sarmalları next sprint için yapı koyuldu. Windows agent değişmedi.
Yönetici tarafında yeni endpoint'ler: GET /api/admin/audit/retention (kaç gün, kaç kayıt, son sweep), POST /api/admin/audit/retention/sweep (manuel tetikle). Otomatik nightly sweep'in ne yaptığı, kaç satır sildiği denetlenebilir hale geldi.
AgentSettings.UseNativeViewer opt-in bayrağı kaldırıldı (native viewer tek path), AgentSettings.Autostart ölü alanı kaldırıldı (Faz B sonrası kullanılmıyordu). Public davranışta değişiklik yok, ileride bakım yükünü azaltır.
Daha önce stub olan MikroErpAdapter ve NetsisErpAdapter artık gerçek REST entegrasyonlu: ticket fetch (GET /ws/tickets/{id}) + session not write-back (POST /ws/tickets/{id}/notes). Tenant URL'i ve API token'ı per-partner ayardan okunuyor; eski Logo adapter ile aynı kontrat. Test coverage: MikroErpAdapterTests, NetsisErpAdapterTests.
og:image 1200×630 markalı PNG, summary_large_image kart). Facebook/LinkedIn/Slack/WhatsApp önizlemeleri artık görsel + başlık + açıklama dolu çıkıyor.@graph (Organization + SoftwareApplication + WebSite) — Google'ın tercih ettiği yapısal veri formatı; microdata schema.org fallback olarak korundu.tr + x-default) — landing yalnız Türkçe; eski yanıltıcı og:locale:alternate en_US/de_DE kaldırıldı.<link rel="preconnect"> + dns-prefetch for ud.erp.tr (~100-300ms gain)./, /download, /guide, /changelog için tutarlı. Tüm bu URL'ler GET + HEAD method'unu destekliyor — Googlebot HEAD probe'larıyla validation yapıyor, eski 405 cevabı bazı URL'leri index priority queue'sundan düşürüyordu./download sayfasının üstüne slim sticky nav: sol "E FixPoint Destek" → rdp.erp.tr, sağ "Teknisyen Konsolu →" → ud.erp.tr. Müşteri indirme sonrası tek tıkla geri dönebilir.FixPoint.Agent, binary adı FixPoint.Agent.exe ve Windows servis adı FixPointAgentService korunuyor (müşteri görmez).Teknisyen tarafı outbound viewer artık Edge runtime bağımlılığı olmadan, FFmpeg.AutoGen ile direkt H.264 decode + WriteableBitmap render üzerinden çalışıyor. WebView2 paketi (Microsoft.Web.WebView2) tamamen kaldırıldı. Web tarafı (ud.erp.tr Session.razor + viewer.js) hiç dokunulmadı — tarayıcıdan teknisyen bağlanma yolu paralel olarak aynı protokolle çalışmaya devam ediyor.
H264Decoder (avcodec_send_packet / receive_frame) → YUV420P → BGRA → WriteableBitmap.AudioBridge yeniden kullanıldı.📎 Dosya butonu ya da pencere üzerine drag-and-drop; geliyor/gidiyor için progress bar.SubtitleWorker çıktısı (Whisper STT + opsiyonel çeviri) viewer'ın alt-orta caption pill'inde, partial/final farkıyla.Bağlan'da kullanıcı adı/parola sorulmaz (tech.reauth ile geçilir).StreamFraming.AudioHeaderSize 4 byte eksik hesaplanmış (seq alanı sayılmamış). PackAudioPcm her seferinde ArgumentException fırlatıyordu, AudioBridge'in catch bloğu sessizce yutuyordu. Hiçbir önceki sürümde mikrofon sesi wire'a çıkmıyordu — push-to-talk şimdi gerçekten çalışıyor.
.msi yok. Müşteri zip'i indirir, FixPoint.Agent.exe'yi istediği klasöre koyar, çift tıklar. Yönetici onayı (UAC) sorulmaz. installer/ klasörü ve deploy/build-msi.ps1 repo'dan silindi.chmod +x + çalıştır (~40 MB self-contained).sc.exe'yi UAC ile çağırarak Windows servisini kurar. Bir kerelik onay sonrası kullanıcı oturumu kapansa veya bilgisayar kilitli olsa bile bağlantı sürer. MSI gerekmez.FixPoint.Agent.exe --register-autostart, --unregister-autostart, --install-service, --uninstall-service.rdp.erp.tr/download ve Platformlar bölümü artık üç platformda da "kurulum yok" framing'ini taşıyor.FixPoint.MigrateToSqlServer tools projesi eklendi (v0.7.5'te basmıştık, sln'e dahil değildi)._outgoingFileSeq ve UseNativeViewer gibi ölü field/setting'ler temizlendi.FixPointTheme eklendi. Açılış sırasındaki beyaz flash kaldırıldı; status/navigation bar arka planla aynı #0E0F12. Landing page ile aynı palet (#1A1B20 kart, #EF3340 brand red, #FBBF24 BETA badge).BrandButton (kırmızı, hover/disabled state) ve GhostButton (border + dark), edit_bg focus state'inde kırmızı border. Tüm ripple efektleri 8dp radius'a uyumlu.SharedPreferences("lastId") ile son alınan ID açılışta hero kartta görünüyor (placeholder yerine).%LocalAppData%\FixPoint\identity.json kimliği vs servis'in %ProgramData%\FixPoint\identity.json kimliği). Sonuç: tek bir makinenin Console'da iki ID ile görünmesi + "helper kapatılınca ajan hâlâ çevrimiçi" görünümü. v0.7.5 helper'ı startup'ta %ProgramData%\FixPoint\identity.json varlığını kontrol ediyor; varsa --launched-by-service olmasa bile pipe/IPC mode'a giriyor. Tek kimlik → tek server kaydı. Servis durdurulmuşsa mevcut 10sn pipe grace timeout'u sonrası standalone'a fallback eski davranışla aynı. Agent binary 0.7.3 → 0.7.5.agent.update.installNow localization anahtarı TR ve EN bundle'larından eksik olduğu için literal "agent.update.installNow" olarak görünüyordu (sadece DE'de tanımlıydı). LocaleManager fallback'i lookup başarısız olunca anahtarı olduğu gibi döndürür, bug sessizce shipping. Üç anahtar TR + EN'e eklendi (installNow, downloading, restarting). Diğer eksikler: EN için console.session.macros; EN + DE için errors.auth.locked, errors.auth.totp.invalid, errors.auth.totp.required. Locale-parity regression test eklendi (LocaleManagerTests.All_locale_bundles_have_identical_key_sets).{downloadCtaBottom} ve footer'da v{ver} görünüyordu. Kök sebep: v0.7.4 Platformlar bölümü eklenirken üç koşullu indirme butonu için $@"..." literal'i + @"..." (interpolasyon kapalı) segmentlerine bölünmüş, son segment yanlışlıkla + @"..." olarak bırakılmıştı. Son segment + $@"..."'a çevrildi. Render regression test eklendi (LandingPageRenderingTests).versionCode 1 → 2 bumpı (in-place update için), versionName 0.1.0 → 0.1.1. Manifest LatestVersion: 0.7.5. Linux ve Windows agent binary'leri değişmedi.Storage:Provider="sqlserver" artık desteklenir; Microsoft.Data.SqlClient ile dört çekirdek store (SqlServerAgentStore, SqlServerSessionStore, SqlServerTechnicianStore, SqlServerAuditLog). Tablolar IF OBJECT_ID(...) ile idempotent; upsert'ler MERGE WITH (HOLDLOCK) + serializable transaction ile MSDN'in dökümante ettiği MERGE concurrency PK-race'inden korunuyor.tools/FixPoint.MigrateToSqlServer — bir kerelik SQLite→SqlServer kopyalayıcı. Source ReadOnly açılır (kazara mutasyon yok), audit_log için SET IDENTITY_INSERT ON ile legacy id'ler birebir korunur, sonunda SQLite-vs-SqlServer satır-sayısı diff'i basar; mismatch → exit 1. --verify-only ile yalnızca parity check.Provider ayarı yoksa SQLite çalışır (default).erpdesk-agent-linux, ~40 MB) — sunucu odasındaki Linux ERP makineleri için headless ajan. Aynı 9 haneli ID + ECDsa P-256 register protokolü; Windows agent ile birlikte tek roster içinde görünüyor. v0.1 kapsamı: register + heartbeat + invite + sohbet + dosya transferi. ~/.config/erpdesk/{settings,identity}.json. Lights-out senaryo için Unattended:true + TrustedTechnicians[] ile auto-accept. Ekran paylaşımı v0.2'de (X11 + Wayland/PipeWire portal).erpdesk-agent.apk, ~11 MB) — müşterinin tablet/telefonunda çalışan ajan. Activity-driven UI + arka plan Service çiftiyle WebSocket loop. v0.1 kapsamı: register + sohbet + Android dialog ile invite kabul/red. Ekran yansıtma (MediaProjection) v0.2'de./download/agent-linux ve /download/agent-android endpoint'leri (HEAD + Range + application/vnd.android.package-archive). Landing'de yeni Platformlar section'ı Windows STABLE / Linux BETA / Android BETA kartlarıyla.LatestVersion: 0.7.4 manifesti altında — /api/version Windows agent için unchanged tutuluyor (binary'si hâlâ 0.7.3.0), bumpı yalnızca dağıtım kapsamını işaretliyor.AgentService:Capture:Enabled=true ile aktive edilir. (Winlogon secure-desktop yakalama için SE_TCB child helper Phase C'de.)stream.h264 Annex-B olarak append ediliyor; ffplay/VLC/MPV ile direkt oynatılır.RecordingEncryption.Keys[] registry — anahtarları rotate ederken eski kayıtlara erişim korunuyor. KeyId her dosyaya gömülü (EDEncv2)./download/agent self-hosted dağıtım: 100MB+ ajan zip'i artık server tarafından stream ediliyor (range request desteği).rdp.erp.tr/): use-case'ler, karşılaştırma tablosu, güvenlik, FAQ, SEO (sitemap + robots + microdata)./api/admin/* non-Development env'de admin key zorunlu (503 fail-closed); 32-byte base64 anahtar admin-api-key.txt ACL-restricted.ChangePasswordRequired döner — sadece /api/account/password izin verir, diğer gated endpoint'ler reddeder.StreamTokenStore, 2h sliding TTL); önceki token == sessionId zayıflığı kapandı.docs/operations.md.deploy/deploy-server.ps1: kalıcı deploy script — downloads/, Data/, logs/, appsettings.Production.json, admin-api-key.txt korunuyor; /health 200 readiness poll.agent.log envelope ile server'a düşüyor; Console /logs'ta source=service:* filtresi.SERVICE_CONTROL_SESSIONCHANGE → <100ms latency; eski 2s polling 30s backstop'a indi.FallbackSignalingChannel).scripts/test.ps1 build + test ayrımı ile MSB4242 race kapandı.TechSessionStore + bearer middleware; Console token capture.