# Merkezi Komut + Olay + Lisans Mimarisi

fikatia-local'de **tüm komut çalıştırma tek noktadan** geçer → lisans gate, denetim (audit),
telemetri ve makro/plugin gözlemi tek merkezden yapılır. Bu belge sistemi ve genişletmeyi anlatır.

## Neden
Eskiden komutlar dağınıktı: menü/toolbar/palet/kısayol her biri `MenuOge.calistir`'ı **doğrudan**
çağırıyordu → gate/denetim için ortak nokta yoktu. Lisans (izin/kota/kullanım takibi) ancak tüm
komutlar tek dispatch'ten geçerse mümkün.

## Çekirdek: `Cekirdek::komutCalistir`
`motor/cekirdek/include/fiko/cekirdek/cekirdek.hpp`

```cpp
bool komutCalistir(const MenuOge& oge, const char* kaynak = "");
```
Akış: **lisans kapısı → `oge.etkinMi` → `oge.calistir` → `KomutCalisti` olayı yayınla**. Dönen:
komut çalıştı mı. `kaynak`: "menu"/"toolbar"/"palet"/"radyal"/"baglam"/"senaryo"/"sketch"/"kisayol"/"makro".

```cpp
void lisansKapisiAyarla(std::function<bool(const MenuOge&)> k);  // false → komut çalışmaz
```

## Denetim olayı: `KomutCalisti`
`motor/cekirdek/include/fiko/cekirdek/olay.hpp` — `OlayTuru::KomutCalisti`

```cpp
struct KomutCalisti { const char* ad, *kategori, *kaynak; bool basarili; };
```
POD, zero-alloc (char* senkron yayın süresince geçerli). C++ (`olaylar().abone<KomutCalisti>`), Lua
(`fiko.olay.dinle("KomutCalisti", fn)`) ve plugin'ler dinleyebilir.

**Takip nerede:** Olay in-memory halka tampona (4096, döngüsel) yazılır + tüm aboneler senkron
çağrılır. **Canlı/kalıcı takip = `LisansSistemi.kullanim` (in-memory sayaç, her an sorgulanır).**
Diske (`.fikolog`) tam olay günlüğü yazımı ON-DEMAND'dir ("Dosya → Olay Günlüğü Yaz" komutu; artımlı
export) — otomatik DEĞİL (çok-pencerede log yolu app-geneli → periyodik flush çakışırdı).

**Kümülatif kullanım kalıcılığı (oturumlar arası telemetri):** app-global `g_lisans` (tek instance,
çakışma yok) startup'ta `ayarOku("lisans_kullanim")` ile yükler, clean-exit'te `ayarYaz` ile kaydeder →
komut kullanım sayaçları oturumlar arası korunur. `LisansSistemi.kullanimSerialize/kullanimYukle`. NOT:
sadece SAYAÇLAR kalıcı; politika (kip/izinli gruplar) kalıcı DEĞİL (kullanıcı-ayarından yüklenmesi lisans
bypass'i olurdu — politika her oturum lisans kaynağından). Crash'te son oturum sayacı kaybolur (clean-exit
save; crash-durable istenirse periyodik save eklenebilir).

## Tüm komut yolları merkezden (bypass YOK)
| Yol | Dosya | kaynak |
|-----|-------|--------|
| Ana menü | main.cpp | menu |
| Üst toolbar | main.cpp | toolbar |
| Dinamik toolbar | motor/ui/src/arac_cubugu.cpp | toolbar |
| Komut paleti | motor/ui/src/komut_paleti.cpp | palet |
| Radyal menü | main.cpp | radyal |
| Bağlam/arama menü | main.cpp | baglam |
| Sketch'ten Çık | sketch_ui.cpp | sketch |
| Senaryo auto-runner | main.cpp | senaryo |
| Kısayol | main.cpp (`kisayolCalisti` → KomutCalisti) | kisayol |
| Lua `fiko.komut.calistir` | motor/betik/src/lua_api_diger.cpp | makro |

Universal palet zinciri: `FikoAramaOgesi.calistir → KomutKaydi::calistir → Komut.calistir → komutCalistir`.

## LisansSistemi
`motor/cekirdek/include/fiko/cekirdek/lisans.hpp` — merkezi komut akışının tüketicisi.

- **Takip:** her başarılı komutu sayar (`kullanim(ad)`, `toplamKomut()`, `tumKullanim()`).
- **Yönetim:** `Kip` (Serbest = hepsi / Kısıtlı = whitelist) + `grupIzinVer/Kaldir`.
- **Lisans:** `bagla(Cekirdek&)` tek çağrıyla lisans kapısını ayarlar + `KomutCalisti` dinler.
- Politika **veri-odaklı** (iş kuralı gömülü değil).

**App-global:** `g_lisans` (main.cpp) — belge-başına değil, uygulama-geneli. Her belge penceresi
`kur()`'da `g_lisans.bagla(cekirdek)` → tüm pencereler tek lisans + toplu kullanım.

## Görünür yönetim: `FikoLisansPanel`
`uygulama/fikocad/fiko_panel.hpp` — "Araçlar → 🔒 Komut Denetim". Lisans kipi radio + Kısıtlı grup
izin checkbox'ları + kullanım tablosu (sayıya göre sıralı) + sıfırla.

## Nasıl kullanılır (lisans aktive)
```cpp
g_lisans.kipAyarla(LisansSistemi::Kip::Kisitli);
g_lisans.grupIzinVer("Geometri");   // yalnız Geometri grubu komutları çalışır
// veya 🔒 Komut Denetim panelinden.
```
Telemetri: `g_lisans.kullanim("Kutu Ekle")` veya Lua:
```lua
fiko.olay.dinle("KomutCalisti", function(o) print(o.ad, o.kaynak, o.basarili) end)
```

## Yeni komut eklerken
Komutu `cekirdek.menuler().ekle({grup, ad, simge, sira, calistir, etkinMi, workbench})` ile kaydet —
otomatik olarak palet/toolbar/menü'de görünür VE merkezi dispatch'ten geçer (gate + audit bedava).

## Kalan (iş-özel)
Gerçek lisans-anahtarı/dosya doğrulama: `lisansKapisiAyarla`'yı imzalı bir lisans kaynağına bağla
(kullanıcı tanımlar). Belge-başına lisanslama istenirse `g_lisans` → belge üyesine geri alınabilir.
