Müşteri kurulumlarında görünen davranış değişiklikleri. Daha eski sürümler için git geçmişine bakın.
RDP masaüstünü korurken uzak fare/klavye sessizce düşüyordu. Ajan artık bunu algılar: müşteride amber bant + Yönetici olarak yeniden başlat düğmesi, teknisyene sohbetten açıklama; düzelince «Uzak kontrol yeniden çalışıyor». SendInput hataları ve sayaçlar tanı günlüğüne yazılır.
basmaz), tarama kodu eklenir.
identity.json artık tek başına servis modu sayılmaz;servis gerçekten kayıtlı olmalı. Elle açılan ajan yeniden doğrudan sunucuya bağlanır (eş bağlantısı çalışır).
kala** ve bittikten sonra bir kez (en geç 3 gün içinde) bayi yöneticisine e-posta gider. Saatlik tarama; her eşik pencere başına bir kez (işaret e-postadan önce koşullu yazılır). Süper yönetici süreyi uzatırsa takvim baştan başlar. Eşikler BayiBasvuru:HatirlatmaGunleri (varsayılan 7,1; boş = kapalı). E-posta kanalı yoksa tarama sessizce atlar.
silinmez — süre uzatılınca kaldığı yerden devam eder.
paket, başlangıç, bitiş, kalan gün; deneme notu; Satın al — Yakında (ödeme altyapısı K1 gelince açılır, devre dışı + neden ipucu); «Süre uzatma talebi» (info@erp.tr). Süre bitmek üzereyken ya da dolunca Özet'in üstünde uyarı bandı. /api/admin/bayi/ozet yanıtına abonelik alanı eklendi.
bayinin markasını gönderir: kod, ad, logo yolu, renk. Yalnız etkin bayi ve paketinde marka olan (Pro, Kurumsal) bayi için; Başlangıç paketinde, pasif bayide ve varsayılan bayide alan boş kalır. Logo yalnız bu sunucudaki /api/partners/<bayi>/logo yolu olarak gider, renk yalnız geçerli #RRGGBB.
sunucusundan, en çok 256 KB çekilir; başka adres reddedilir, çözülemeyen görselde yalnız ad görünür. Alanı göndermeyen eski sunucuda görünüm değişmez.
<bayi>.<alan> üzerinden açılan /hizli o bayinin Hızlı Destek sayfasını gösterir (alt alançözümü açıksa; varsayılan kapalı). Hızlı Destek bayi sayfasında da bayi logosu ya da baş harf rozeti var.
https://rdp.erp.tr/hizli (genel, site haritasında) ve /hizli/<bayi> (bayi adıyla, arama motorlarına kapalı; yalnız etkin bayi, aksi 404). Dört adımlı anlatım, her zaman görünen imza uyarısı, tam uygulamaya bağlantı; tr/en. İndirme /download/hizli-destek?bayi= → ErpDesk-HizliDestek-<bayi>.exe. Dosya yapılandırılmadıkça (AgentRelease:HizliDestekLocalFile) sayfa «henüz hazır değil» der ve indirme 404 döner.
ephemeral bildirir; saklama süpürücüsü 24 saat görülmeyen geçicikayıtları siler. Kalıcı cihazlar etkilenmez; alanı göndermeyen eski ajanlar kalıcı sayılır.
(denetimsiz kabul yok), kimlik yalnız bellekte, oturum bitince uygulama kapanır. Tam ajanın davranışı değişmedi.
deploy/publish-hizli-destek.ps1 (tek dosya, FFmpeg'siz, SHA-256 yanında)./?talep=SN-123&musteri=Acme ile açılabiliyor; üstte «Talep SN-123 · Acme» bandı çıkar, Bağlan diyaloğunun Talep alanı ve Neden metni önceden dolar. SupportNova talep ekranındaki «ERPdesk ile bağlan» düğmesi bu adresi açar. Talep numarası yalnız harf, rakam ve -_./# (≤64), müşteri adı ≤80 karakter kabul edilir; geçersizse bant çıkmaz.
TSİ zaman aralığı, oturum kimliği). Dakika yuvarlaması destek süresi raporuyla aynı (başlamış dakika tam sayılır); oturum kimliği dış anahtar olduğu için not tekrar yazılmaz. Not yazımı ERP geri yazımıyla paralel ve aynı 10 sn sınırında; masa erişilemezse oturum kapanışı etkilenmez. Ayar Talep:SupportNova:BaseUrl + ApiKey (yazma izinli Nova API anahtarı, yalnız sunucu yapılandırmasında); boşsa özellik kapalı.
14.490 ₺, Kurumsal 25.990 ₺'den (yıllık, KDV hariç), ek kalemler (ek oturum 2.590 ₺, Translate 9.900 ₺, kayıt uzatma 2.900 ₺, kurulum+eğitim 15.000 ₺) ve kurucu bayi teklifi (plan 5.3, BAYI-PAKETI B-7).
yıllık bedel; 07.10.2026 tarihli kaynak notu.
yıllık tasarruf. CSP gereği dış betik (/fiyat-hesap.js); JavaScript yoksa tablo tüm rakamları verir.
dakika, saat, ortalama süre, ilk/son oturum (plan 5.6). «Oturumlar» çipiyle eski oturum dökümüne dönülür; seçim tarayıcıda hatırlanır.
yuvarlanır). Ücret bayi başına yalnız tarayıcıda saklanır, sunucuya gitmez. Excel dökümünde sayılar gerçek sayıdır.
/healthz artık lisans alanı da veriyor (kapsam-disi, Y-424). Konsol kendisi lisans denetlemez; lisans ERPdesk Server'da denetlenir, bunu Server'ın /healthz'i gösterir.pop: 1 bildirir. Sunucu agent.register.challengegönderirse kaydı aynı bağlantıda, bu nonce'u kapsayan ve kayıtlı özel anahtarla imzalanmış biçimde yeniden gönderirler. Protokol Windows ajanı 0.9.10 ile aynıdır, sunucuda değişiklik gerekmedi. Eski sunucu meydan okumazsa tek kayıt yapılır; davranış eskisiyle aynıdır.
FixPoint.Shared → KayitIstemcisi (imza + kayıt yükü) ve MeydanOkumaDurumu (bağlantıbaşına tek yanıt). Windows ajanına dokunulmadı.
- Linux: ~/.config/erpdesk/identity.json dosyası 0600 izniyle oluşturulur. Geçici dosyaya yazılıp atomik olarak yeniden adlandırılır. Daha geniş izinli eski dosya ilk yüklemede daraltılır. Dizin ilk kez oluşturuluyorsa 0700 açılır. - Android: uygulamaya özel FilesDir korunur. Dosya 0600 ve atomik yazılır. - Dosya biçimi iki platformda da değişmedi; numara korunur.
auth.key.mismatch, auth.pop.invalid, auth.pop.required) günlükteaçıklar. Açılış satırı artık gerçek sürümü gösterir.
- Windows, Linux ve Android için ayrı kart: cihaz sayısı, kanıtlı, kanıtsız ve sorunlu cihazlar. - Her kartta platforma özel hazırlık durumu: «Eski ret hazır», «Zorla'ya hazır», «Hazır değil» ya da «Cihaz yok». - Cihaz ve sürüm tablolarına Platform kolonu eklendi (küme filtreli). - Platform, ajanın bildirdiği info.os alanından belirlenir.
- Server 737: Linux/Android yükleri en sıkı ayarda (Zorla + EskiAjanaIzin=false) «Dogrulandi» oluyor; platform özeti doğru. - Yeni FixPoint.Agent.Linux.Tests 9 test: gerçek Linux istemcisi sahte sunucuya karşı meydan okuma, eski sunucu ve ikinci meydan okuma senaryolarında; Android kimliği; ortak kod. 0600 testi yalnız Unix'te koşar. - Agent 633 ve Console 142 testi yeşil.
ObjectDisposedExceptiondüşüyordu (bağlantı davranışı etkilenmiyordu). Bağlantı kapatma artık tek seferlik; ikinci çağrı sessizce geçer.
existingId) farklı bir açık anahtarla gelince sunucu bunu karşılaştırmıyordu.Numarayı bilen biri kendi anahtarıyla o cihazın bağlantı yerini alabiliyordu: oturum ele geçirme ya da hizmet engelleme. 0.9.43 yalnız uyarı yazıyordu.
değiştiremez.
pop: 1 bildirir. Sunucu agent.register.challenge ile nonce verir: tek kullanımlık, 60 sn geçerli, bağlantıya bağlı. Ajan kaydı bu nonce'u kapsayan, kayıtlı özel anahtarla imzalanmış biçimde aynı bağlantıda yeniden gönderir. Mevcut imza biçimi kullanılır; protokole yalnız iki isteğe bağlı alan eklendi (pop, challenge). Eski ajan bu alanları göndermez ve meydan okuma almaz.
ErpDesk:Kayit:AnahtarDogrulama (varsayılan Gozlem, yani davranış değişmez): - Gozlem: uyuşmaz anahtar, geçersiz kanıt ve kanıtsız (eski) kayıt günlüğe ve denetim izine yazılır, bağlantı sürer. - Zorla: uyuşmaz anahtar (auth.key.mismatch) ve geçersiz kanıt (auth.pop.invalid) reddedilir. - Kanıtsız eski ajan EskiAjanaIzin'e bağlıdır (varsayılan true; false ise auth.pop.required). - Yeni cihaz her kipte kaydolur.
agent.register.key_mismatch / proof_invalid / unproven (cihaz başına günde bir) / refused / key_rebound ve agent.key_reset.
(«Kayıt güvenliği» ekranı) ya da cihazın bayisi (Bayi Paneli → Özet → «Cihaz anahtarını sıfırla») anahtarı sıfırlar. Ardından 72 saat içinde yeni bir anahtar bu numaraya bir kez bağlanabilir.
kayıt sınıfları, ajan sürüm dağılımı, olaylar ve «Zorla'ya hazır mı» kutusu burada. Tüm tablolar kmpGrid; ekran tr/en/de.
agents.son_kanit, agents.anahtar_sifirlama (NULL'a izinli, açılışta idempotent).pop: 1 gönderir ve meydan okumaya imzalı yeniden kayıtlayanıt verir. Eski sunucu meydan okumaz; davranış aynı kalır.
yakalandı.
docs/GUVENLIK.md. Zorla'ya geçiş kuyrukta(🙋 HAKAN).
kuran müşteride cihaz bayisiz kalıyor, aynı bilgisayar iki numarayla görünüyordu.
--install-service --kimlik-kaynak <klasör> olarak yükseltilmiş başlatır; servis oluşturulmadan ÖNCE tek başına uygulamanın kimliği (9 haneli numara + anahtar çifti) %ProgramData%\FixPoint deposuna devredilir. Sunucudaki bayi/müşteri bağı numaraya bağlı olduğu için kendiliğinden korunur: tek cihaz = tek numara. Uygulama henüz kaydolmadıysa bekleyen kurulum kodu da servise geçer (servis ilk kaydında gönderir). Ayarlar penceresi sonucu söyler (tr/en/de).
SYSTEM + Administrators (kalıtım kapalı; Users okuyamaz). LocalMachine kapsamı gerekçesi: dosyayı yükseltilmiş yönetici yazar, LocalSystem okur — CurrentUser kapsamı bunu taşıyamaz; asıl erişim engeli ACL, DPAPI dosyanın makine dışına kopyasını işe yaramaz kılar. Sır hiçbir günlüğe yazılmaz. Eski (≤ 0.9.9) düz servis kimliği okunmaya devam eder, içeriğine dokunulmaz (eski sürüme dönüşte okunabilsin), yalnız ACL'i sıkılaştırılır. ⚠ 0.9.10'un yazdığı korumalı kimliği 0.9.9 okuyamaz — servis kurulu cihazda 0.9.10 → 0.9.9 elle geri dönüş desteklenmez.
yönetici komut isteminde ErpDesk.exe --servis-kimligini-birlestir (servisi durdurur, eski servis kimliğini korumalı yedeğe alır, uygulamanın numarasına geçirir, servisi başlatır).
role alanı eklendi (service / app). Kural servis öncelikli: servis çevrimiçiyken gelen uygulama bağlantısı reddedilir (agent.superseded.service); servis bağlanınca açık uygulama bağlantısı aynı kodla kapatılır. Uygulama bu kodda 60 sn'de bir dener (servis düşerse devralır); yeniden açılınca zaten servise bağlanan arayüz (pipe) olur. Kural yalnız aynı açık anahtarı taşıyan iki kopya arasında işler; rolsüz eski ajanlarda «son bağlanan kazanır» aynen sürer. Kayıtlı numara farklı anahtarla gelirse sunucu uyarı günlüğü yazar (davranış değişmedi — ayrı güvenlik maddesi).
/kurartık kısa kurulum kodunu 4'lü gruplar hâlinde gösterir (yalnız ajan ≥ 0.9.10 sunuluyorsa); ajan ilk açılışta (henüz numara yokken, dosya adından kod gelmediyse) bir «Kurulum kodunuz var mı?» alanı gösterir — kod girilir ya da «Kodsuz devam» denir (90 sn sonra kendiliğinden devam). Alan yalnız ilk kayıttan önce görünür; numara alınınca gizlenir. Tire/boşluk/büyük harf önemsiz, dosya adının tamamı da yapıştırılabilir.
?dil=tr|en|de ya da tarayıcı dili; sayfada dil seçici (aynı jeton). gerçek SignalingClient, gerçek %ProgramData%/%LocalAppData% kimliğine dokunmadan): kurulum sayfasındaki kod elle girilir → cihaz bayiye bağlanır → kimlik geçici servis klasörüne devredilir → servis rolüyle aynı numara bağlanır, uygulama «servis öncelikli» ile düşer, bayi panelinde cihaz sayısı 1 kalır ✓.
/download/agent?enroll= parametreyi yok sayıyordu, Windows ajanı da kayıtta enroll alanını göndermiyordu. Cihaz bayisiz kaydoluyordu.
ErpDesk-Kur-<kod>.exe adıyla verir (16 karakterlik kısa kod jetonun jti'sinden sunucu anahtarıyla HMAC ile türer; yeni tablo dbo.enrollment_codes, açılışta kendiliğinden oluşur, süresi geçen satırlar kendiliğinden silinir). Ajan kaydında kod (ya da eski usul ham jeton) çözülür; imza, süre, bayi kapsamı (müşteri etkin ve o bayiye ait, bayi etkin) ve tek kullanım denetlenir, cihaz bayi + müşteriye bağlanır. Davranış değişikliği: geçersiz / süresi dolmuş / kullanılmış / kapsam dışı jeton artık kaydı REDDETMEZ — cihaz bayisiz (varsayılan bayi) kaydolur, sunucu nedenini günlüğe ve denetim izine (agent.enrolled / agent.enroll_rejected) yazar. Jeton ve kod değeri hiçbir günlüğe yazılmaz.
(tarayıcının « (1)» kopya eki dahil), ilk agent.register'da gönderir, agent.register.ok gelince siler (yalnız özeti tutulur, aynı ad tekrar gönderilmez). Numara almış cihazda hiçbir şey değişmez. Servis kipinde aynı kural %ProgramData%\FixPoint deposuyla işler. Hızlı Destek kipi kod okumaz.
/kur metni sunulan ajan sürümüne göre değişir: ≥ 0.9.10 → «cihazınız kendiliğinden kaydolur»(bayi kodu yedek), daha eski → bayi kodu adımı. Bayi Paneli kurulum adımı metni (Console 0.9.32, tr/en/de) aynı ayrımı yapar. Hazır müşteri mesajı bayi kodunu içermeye devam eder (her sürümde çalışan yol).
protokolüne alan eklenmedi (enroll 0.7'den beri vardı). İmzalı güncelleme rölesi (Y-072) ve lisans değişmedi.
genel kanal (Hakan kararı). Ayrıntı ERP/yapilacaklar S-057 (A sunucu → B iç test → C genel kanal).
rdp.erp.tr/bayi-ol formu (sunucu tarafı HTML, JS'siz). Robot süzgeci CAPTCHA'sız: görünmez tuzak alanı + imzalı açılış zamanı (≥ 3 sn, ≤ 2 saat) + IP başına 10 dakikada 5 gönderim. Yanıt her durumda aynı «teşekkürler» sayfası; aynı e-postayla bekleyen başvuru yeni satır açmaz. Bayi sözleşmesi ve KVKK aydınlatma metni şimdilik TASLAK sayfası (/bayi-ol/sozlesme, /bayi-ol/kvkk; ErpDesk:BayiBasvuru:SozlesmeUrl/KvkkUrl ile değiştirilir). Varsayılan KAPALI (ErpDesk:BayiBasvuru:Enabled).
penceresi (varsayılan 30 gün, 2 eşzamanlı) + davet e-postası (ErpPosta; parola yerine tek kullanımlık «parolanızı belirleyin» bağlantısı, 72 saat). ✖ ret = iç not, başvurana otomatik e-posta yok. Uçlar /api/admin/bayi-basvurulari[/{id}/onayla|reddet]; denetim izi partner.application.*.
baytlarından doğrulanır, SVG yok, dosya adı yalnız bayi kimliğinden), marka rengi (#RRGGBB), önizleme. Başlangıç paketinde kapalı (sunucu 403). Logo herkese açık GET /api/partners/{kod}/logo ile sunulur.
rdp.erp.tr/kur?t=…: kurulum bağlantısı artık müşteriyi bayinin logosu/adıyla karşılayansayfaya getirir (indir düğmesi, bayi kodu, üç adım, kod imzası yok uyarısı). Hazır mesaj bayi kodunu da içerir.
metinleri kaldırıldı; müşteri «Yardım talep et»e bayi kodunu yazar (bilinen sınırlama, ajan işi açık).
ErpDesk:Retention:PaketBazliKayitSaklama=true ise şifreli oturum kaydı bayi paketine göre süpürülür (Başlangıç 30 · Pro 365 · Kurumsal genel süre); RecordingDays > 0 ise KVKK üst sınırıdır. Varsayılan KAPALI.
rdp.erp.tr/maliyet-hesaplayici: kullanıcının girdiği oturum sayısı, oturum başı bedel ve zamoranıyla bugünkü/zamlı/1–5 yıllık maliyet; ERPdesk teklifi ve faturalanamayan destek saati isteğe bağlı. Üretici adı ya da fiyatı içermez. Site haritasına eklendi.
-p:HizliDestek=true FFmpeg'siz derleme (78 MB, tam ajan ~270 MB). Ajan davranışı ve sürümü değişmedi, yayınlanmadı. Tasarım: docs/superpowers/specs/2026-10-05-hizli-destek-tasarim.md.
/bayi), bayi yöneticisine açık (süper yönetici bayi seçerek görür):- Özet: paket (eşzamanlı oturum sınırından: Başlangıç 2 · Pro 5 · Kurumsal 10+), eşzamanlı teknisyen doluluğu, aktif müşteri, kayıtlı cihaz, teknisyen sayısı, lisans bitişi; 4 adımlı müşteri kurulum rehberi. - Müşteriler: kmpGrid (arama, süzgeç, gruplama, Excel/PDF); ekle, düzenle, kopyala, aktif/pasif; kurulum bağlantısı (tek kullanımlık, 7 gün) + müşteriye hazır WhatsApp/e-posta mesajı, panoya kopyala. Bayi yöneticisi artık kendi müşterilerini kendisi yönetir (önceden yalnız süper yöneticideydi). - Destek süresi: Bu ay / Geçen ay / Bu yıl / Tümü; müşteriye göre gruplu, Σ dakika, Excel. Yalnız tamamlanan oturumlar; başlamış her dakika sayılır.
GET /api/admin/bayi/ozet, GET /api/admin/bayi/destek-suresi (salt-okur; bayi yöneticisi kendi bayisinekapsanır, başka bayi 403).
(yalnız Demo:Enabled=true; canlıda kapalı).
FixPoint.Console.styles.css) istiyordu → 404; ErpDesk.Console.styles.css yükleniyor.
indirilen dosya ErpDesk-<sürüm>.exe. Kimlik, ayarlar, kayıtlı bağlantılar ve iç servis adı değişmez; eski FixPoint.exe kurulumları yerinde güncellenir, servis yardımcısı yeni ve eski ikili adını tanır.
ERP ErpDesk Server ve ERP ErpDesk Console adını aldı (servis adı = görünen ad)./giris (kök / da çalışmaya devam eder); girişten sonra güvenli yerel ReturnUrl'e döner. Kullanıcı adı alanı artık boş gelir ("admin" ön-değeri kaldırıldı).
WApi:BaseUrl + WApi:ApiKey + WApi:SessionId doluysa sıfırlamabağlantısı teknisyenin kayıtlı telefonuna WhatsApp ile gider; iki kanal da hazırsa kullanıcı seçer, hiçbiri hazır değilse düğme gizlenir. Parola hiçbir kanalda gönderilmez — yalnız tek kullanımlık bağlantı.
demo bayisinin hesapları için bağlantı üretilmez. ErpDesk:PasswordReset:AdminEmail adresine (varsayılan hakan.berk@erp.tr) gider; DB'ye yazılmaz.
Demo:Enabled açıkken giriş kartında demo-admin / demo-user düğmeleri.GET /api/giris/secenekler → {eposta, whatsapp, demo} (yalnız bayrak).ERP Standardı sütun 2 gereği tek desteklenen üretim motoru SQL Server'dır. Postgres sağlayıcısı (Karar, Kararlar #10 — 19.09.2026) kaldırıldı: SQLite v0.9.9'da zaten emekli olmuştu, Postgres'in hiçbir canlı kurulumda tüketicisi yoktu. Storage:Provider artık yalnızca sqlserver kabul eder; Npgsql bağımlılığı ve tüm Postgres*Store sınıfları kaldırıldı.
KVKK saklama (retention) politikası: canlı ortamda ErpDesk:Retention (AuditDays/SessionDays/ RecordingDays) 90 gün olarak ayarlandı (Kararlar #8, Hakan kararı).
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.