title: Mimari description: “Hook handler, config yükleme ve policy değerlendirmesinin dahili olarak nasıl çalıştığı” icon: sitemap
Bu belge failproofai’nin dahili işleyişini açıklar: hook sistemi agent tool çağrılarını nasıl keser, yapılandırma nasıl yüklenir ve birleştirilir, policiler nasıl değerlendirilir ve dashboard agent aktivitesini nasıl izler.Genel Bakış
failproofai iki bağımsız alt sistemden oluşur:- Hook handler - Claude Code’un her agent tool çağrısında invoke ettiği hızlı bir CLI alt işlemi. Policileri değerlendirir ve bir karar döner.
- Agent Monitor (Dashboard) - Agent oturumlarını izlemek ve policileri yönetmek için bir Next.js web uygulaması.
~/.failproofai/ ve projenin .failproofai/ dizininde yapılandırma dosyalarını paylaşır, ancak ayrı işlemler olarak çalışırlar ve yalnızca dosya sistemi üzerinden iletişim kurarlar.
Hook handler
Claude Code ile Entegrasyon
failproofai policies --install çalıştırdığınızda, ~/.claude/settings.json dosyasına şu gibi girişler yazar:
failproofai --hook PreToolUse komutunu bir alt işlem olarak invoke eder, stdin üzerinde bir JSON payload iletir.
Payload formatı
PostToolUse olayları için, payload ayrıca tool’un çıktısını içeren tool_result öğesini içerir.
Handler 1 MB’lık stdin sınırını zorunlu kılar. Bu limiti aşan payload’lar atılır ve tüm policiler zımnen izin verir.
Yanıt formatı
Reddet (PreToolUse):- Çıkış kodu:
2 - Neden stderr’e yazılır (stdout’a değil)
- Çıkış kodu:
0 - Boş stdout
allow(message), bir policy işleme izin verildiğinde bile Claude’a bilgilendirici bağlam gönderebilir. Hook handler aşağıdaki JSON’u stdout’a yazar (bir config dosyasına değil — bu handler’ın Claude Code’a yanıtıdır, reddet ve talimat yanıtları gibi):
- Çıkış kodu:
0(işleme izin verilir) - Birden çok policy
allowile mesaj döndüğünde, mesajları satır sonlarıyla birleştirilmiş biradditionalContextdizesine katılır - Hiçbir policy mesaj sağlamıyorsa, stdout boştur (öncekiyle aynı)
İşleme hattı
src/hooks/handler.ts tam hattı uygular:
Yapılandırma yükleme
src/hooks/hooks-config.ts üç kapsamlı config yüklemeyi uygular.
enabledPolicies- üç dosya arasında birleştirilmiş tekil unionpolicyParams- policy başına anahtar, bunu tanımlayan ilk dosya tamamen kazanırcustomPoliciesPath- bunu tanımlayan ilk dosya kazanırllm- bunu tanımlayan ilk dosya kazanır
readHooksConfig() (yalnızca global) kullanır.
Policy değerlendirmesi
src/hooks/policy-evaluator.ts policileri sırayla çalıştırır.
Her policy için:
- Policy’nin
paramsşemasını ara (varsa). - Birleştirilmiş config’ten
policyParams[policy.name]oku. - Kullanıcı tarafından sağlanan değerleri schema varsayılanları üzerine birleştirerek
ctx.paramsoluştur. - Çözümlenen context ile
policy.fn(ctx)çağır. - Sonuç
denyise, hemen dur ve bu kararı döndür. - Sonuç
instructise, mesajı birikdir ve devam et. - Sonuç
allowise, sonraki policiye geç.
- Herhangi bir
denydöndürülüyse, deny yanıtını yayınla. - Herhangi bir
instructdönüşü toplanmışsa, tüm mesajlar birleştirilmiş tek bir instruct yanıtı yayınla. - Aksi halde, allow yanıtını yayınla (boş stdout, exit 0).
Yerleşik policiler
src/hooks/builtin-policies.ts 26 yerleşik policy’yi BuiltinPolicyDefinition nesneleri olarak tanımlar:
params kabul eden policiler, her parametre için türler ve varsayılanlar ile bir PolicyParamsSchema bildirirler. Policy değerlendiricisi çözümlenen değerleri fn çağrılmadan önce ctx.params içerisine enjekte eder. Policy fonksiyonları ctx.params okur, null kontrol etmez çünkü varsayılanlar her zaman önce uygulanır.
Policilerin içindeki desen eşleştirmesi, ham string eşleştirmesinde değil, ayrıştırılmış command token’larını (argv) kullanır. Bu, shell operatörü enjeksiyonu yoluyla bypass’ı engeller (örn. sudo systemctl status * için bir desen ; ekleyerek bypass edilemez rm -rf /`).
Özel policiler
src/hooks/custom-hooks-registry.ts globalThis destekli bir registry uygular:
src/hooks/custom-hooks-loader.ts kullanıcı policy dosyasını yükler:
- Config’ten
customPoliciesPathoku; yoksa atla. - Mutlak yola çöz; dosyayı kontrol et var mı.
- Tüm
from "failproofai"importlarını gerçek dist path’e yeniden yaz böylececustomPoliciesaynıglobalThisregistry’ye çözülür. - ESM uyumluluğunu sağlamak için geçişli yerel importları yinelemeli olarak yeniden yaz.
- Geçici
.mjsdosyaları yaz ve giriş dosyasınıimport()et. - Kayıtlı hook’ları almak için
getCustomHooks()çağır. - Tüm temp dosyaları bir
finallybloğunda temizle.
~/.failproofai/hook.log dosyasına kaydedilir ve loader boş bir dizi döner. Yerleşik policiler etkilenmez.
Özel policiler tüm yerleşik policilerden sonra değerlendirilir. Bir özel policy deny yine de diğer özel policileri kısa devreye soksa da (yerleşik policilerin tümü o noktada zaten çalıştırılmıştır).
Aktivite Logging
Her hook olayından sonra, handler~/.failproofai/hook-activity.jsonl dosyasına bir JSONL satırı ekler:
Dashboard mimarisi
Dashboard, App Router ile React Server Components ve Server Actions kullanan bir Next.js 16 uygulamasıdır.- Sayfa bileşenleri proje/oturum verilerini doğrudan dosya sisteminden okumak için
lib/projects.tsvelib/log-entries.tsçağırır (okumalar için API katmanı yok). - Policies sayfası tüm mutasyonlar (toggle, params güncelleme, install/remove) için Server Actions kullanır.
- Oturum viewer’ı Claude’un JSONL transkript formatını ayrıştırır ve mesajlar ile tool çağrılarının bir zaman çizelgesini renderler.
- Veritabanı yok - tüm kalıcı state düz dosyalardadır (
~/.failproofai/,~/.claude/projects/). - Mutasyonlar için Server Actions - CRUD işlemleri için REST API gerekli değil.
- Okuma sayfaları için React Server Components - daha hızlı ilk yükleme, veri getirme için client bundle yok.
- Client bileşenleri sadece etkileşimlilik gerekli yerlerde (policy toggle’ları, aktivite arama, log viewer).

