Yapay zeka kodlama ajanının sunucularında ne çalıştırdığını nasıl görürsün
Ajanın bir production sunucusunda çalışıyor ve terminal yalnızca bir araç çağırdığını söylüyor. Hangi komutu çalıştırdı, makine ne cevap verdi? Transkript bunu sana iş işten geçtikten sonra söyler. Bunu olurken nasıl görünür kıldığımızı, önce neyi denediğimizi ve aynısını bizim uygulamamız olmadan nasıl elde edeceğini anlatıyoruz.
Bir DevOps ajanına production API'sinin neden yavaş olduğunu soruyorsun. İşe koyuluyor. Terminalinde bir araç çağırdığını söyleyen bir satır görüyorsun, sonra bir tane daha, sonra bir tane daha. Altı çağrı sonra diskin %97 dolu olduğunu söylüyor ve log klasörünü temizlemeyi öneriyor.
O makinede gerçekte ne çalıştırdı? Hangi du, hangi find, bir şeyi silmiş mi bile? Cevap var, ama oturum transkriptinde, JSON olarak yazılmış ve sen onu iş işten geçtikten sonra okuyorsun. Bir dizüstü bilgisayarda bu sorun değil. Bir production sunucusunda ise sonradan okumak, "dur, o klasör değil" demek için çok geç.
Kodlama ajanlarını çalıştıran ve onlara sunucularına, veritabanlarına ve kümelerine erişecek araçlar veren bir masaüstü uygulaması olan AgentsRoom'u geliştiriyoruz. Bu yazı, o çağrıları olurken nasıl görünür kıldığımızın hikayesi: işe yaramayan sürüm, işe yarayanın arkasındaki rakamlar ve bizim uygulamamızı kullanmıyorsan aynısını nasıl elde edeceğin.
Kısa cevap
- CLI sana bir aracın çalıştığını gösterir, öbür taraftaki oturumu değil. Tam komut ve çıktısı diskindeki transkripte gider.
- Canlı izlemek için bir şeyin her çağrıyı başladığı anda kaydetmesi gerekir, oturum bittiğinde değil.
- Bağlantı başına bir günlük işe yarar. Komut başına bir terminal sekmesi yaramaz. Tek bir oturumda 166 uzak komut ölçtük.
- O günlüğü kendi makinende tut. Bir production sunucusundaki komut satırı sırlar ve müşteri verisi taşır.
- Bizim uygulamamız olmadan: her shell komutunu bir dosyaya ekleyen bir Claude Code hook'u seni yolun büyük kısmına götürür, gerisini transkript tamamlar.
Transkript bir sunucuda neden yetmez
Claude Code, Codex ve diğer CLI'lar gerçekten her şeyi kaydeder. Claude Code oturum başına bir JSONL dosyasını ~/.claude/projects/ altına yazar, Codex ise ~/.codex/sessions/ altına. Her araç çağrısı girdisi ve sonucuyla orada.
Sorun eksiksizlik değil, zamanlama ve biçim. Transkript CLI için, bir oturumu sürdürebilsin diye yazılır. Sen onu ajan durduktan sonra, JSON satırlarını karıştırarak okursun. Üç ajan aynı anda çalışınca üç dosya okursun. Ve ajanın terminali, yani gerçekten baktığın yer, her çağrının yalnızca katlanmış bir özetini gösterir.
Dizüstündeki kod için sonradan okumak normal inceleme döngüsüdür: commit etmeden önce diff'e bakarsın. Bir sunucunun diff'i yoktur. Bir systemctl restart ya da bir DELETE, çalıştığı anda etkisini gösterir.
Önce neyi denedik ve 166 komut
Ajanlar için ilk uzak aracımız, bağlantıyı bir terminal sekmesinde açıyordu. Doğru görünüyordu: kullanıcı oturumu görebiliyordu. Ama beklemediğimiz bir şekilde başarısız oldu.
Araç, ajana az önce açtığı sekmede ne olduğunu okumanın hiçbir yolunu vermiyordu. Böylece bir kullanıcının projesinde ajan onu kullanmayı bıraktı. O oturumdaki sayım: bağlantı aracımıza 16 çağrı ve ajanın kendi shell aracıyla çalıştırılan 166 sshpass komutu; ajan kullanıcıdan şifreyi istiyor, kullanıcı da onu sohbete yapıştırıyordu. Production kimlik bilgileri transkriptlerde, her komut çalışırken ps aux içinde ve /tmp altındaki bir dosyada düz metin olarak kaldı.
Ders "ajanlar pervasızdır" değildi. Ajan işe yarayan tek şeyi yaptı. Ajanın işini yapmasına izin vermeyen güvenli bir aracın etrafından dolaşılır ve bu dolanma, hiç araç olmamasından daha kötüdür.
Bu yüzden ssh_exec'i yazdık: ajan tek bir komut gönderir, AgentsRoom onu şifreyi uygulamanın içinde tutarak kayıtlı bağlantı üzerinde çalıştırır ve çıktıyı ve çıkış kodunu döndürür. Ajan kimlik bilgisini hiç görmez ve bir sshpass satırı kurmak için hiçbir nedeni kalmaz.
Bu güvenlik sorununu çözdü ve bir görünürlük sorunu yarattı. Her ssh_exec bir sekme açsaydı, o oturum 166 sekme üretirdi. Bu yüzden ssh_exec hiç sekme açmıyordu ve iki ay boyunca bu komutları görmenin tek yeri, yine ajanın sohbetiydi.
Bağlantı başına bir günlük
29 Ekim 2026'da yayınladığımız sürüm (AgentsRoom 1.242.0) tek bir kuralı koruyor: komut başına sekme yok. Bunun yerine her çağrı, bağlantı başına bir tane olmak üzere bir günlüğe düşüyor.
- Sağ paneldeki Dosyalar, Değişiklikler ve Testler'in yanında duran Etkinlik sekmesi, ajanların dokunduğu bağlantıları kartlar halinde (son komut, ajan, saat, durum) ve en son 40 çağrıyı bir zaman akışında listeler. Ajana göre filtrelenir; komutlarda, bağlantı adlarında ve çıktıda arama yapar.
- Bir bağlantının günlüğü bir terminal gibi okunur:
ajan · saat, ardından$ komut, ardından çıktı, ardındanTamamlandı · çıkış 0 · 1,2 sn. SSH çıktısı canlı akar ve sen yukarı kaydırana kadar görünüm en altı takip eder. Bir düğme tüm günlüğü metin olarak kopyalar. - Ajanın başlığındaki etiketler, o ajanın dokunduğu her sunucu, veritabanı ya da küme için bir tane, çağrı sırasında yeşil bir noktayla. Tek tıklama o günlüğü açar.
- Sunucular, Veritabanları ve Kubernetes pencerelerinde bağlantının satırında, yalnızca bir çağrı sürerken görünen Ajan çalışıyor rozeti.
Günlük salt okunurdur. Makineye kendin bir şey yazmak için giriş kapısı hâlâ Sunucular penceresinin SSH sekmesi. Özelliğin tam sayfası yapay zeka ajanları için SSH bağlantıları, veritabanı tarafı ise veritabanı bağlantıları sayfasında.
Ne kaydediliyor, ne kaydedilmiyor
| Çağrı | Günlükte | Neden |
|---|---|---|
ssh_exec (SSH, AWS SSM, WinRM) | Evet | Ana durum: kendi sekmesi olmayan, uzak bir makinedeki bir komut |
ssh_transfer | Evet | Bir sunucuya ya da sunucudan kopyalanan dosya, o sunucu üzerinde bir eylemdir |
db_query, db_schema | Evet | Ajanın yazdığı haliyle SQL ve sonucun ilk satırları |
kube_kubectl | Evet | Argümanlarıyla birlikte kubectl satırı olarak gösterilir |
commands_run, ssh_connect | Hayır | Zaten izleyebileceğin bir terminal sekmesi açıyorlar |
Ajanın kendi shell aracı (doğrudan yazılan ssh, psql, kubectl) | Hayır | AgentsRoom'dan geçmez: ajanın terminalinde ve transkriptinde yer alır |
Son satır dürüst sınırdır. Günlük, araçlarımızdan geçeni görür. Her uzak eylemin orada görünmesini istiyorsan, araçların ajan için en kolay yol olması gerekir; 166 komutun dersi de bu.
Bir ayrıntı daha: komut çalışırken çıktıyı yalnızca SSH akıtır, çünkü makinendeki gerçek bir terminalden geçer. WinRM, SQL ve kubectl sonuçları çağrı bittiğinde görünür.
Günlüğü tutmanın maliyeti
Kullanıcılarımız aynı anda çok sayıda ajan çalıştırıyor: bir makinede 18 projeye yayılmış 45 ajan, bir başkasında 48 konsol. Ajan başına ya da çıktı parçası başına sayılan her şey bununla çarpılır, bu yüzden günlüğün kesin sınırları var:
- Proje başına 120 çağrı, önce en eskiler silinir.
- Çağrı başına 32.000 karakter çıktı, hataların ve çıkış kodlarının bulunduğu son kısım korunur.
- Çağrı başına 2.000 karakter komut ya da SQL.
- Canlı çıktı için her 120 ms'de çağrı başına bir güncelleme mesajı, asla terminal çıktısının her parçası için bir tane değil.
- Boştayken zamanlayıcı yok. Hiçbir ajan uzak bir araç çağırmadığı sürece günlüğün hiçbir maliyeti yok.
Kayıt tek bir noktada yapılır: her CLI'ın araç çağrılarının geçtiği köprüde. Bu yüzden Claude Code, Codex, Antigravity CLI ya da uygulamanın çalıştırdığı diğer CLI'ların herhangi biri için, sağlayıcı başına kod olmadan aynı şekilde çalışır.
Seçtiğimiz sınır: hiçbir şey makineden çıkmaz
Günlük masaüstü uygulamasının belleğinde tutulur ve uygulamadan çıktığında kaybolur. Sunucularımızla senkronize edilmez, ki bu bizim için alışılmadık bir durum: AgentsRoom'daki neredeyse her şey hesabını bilgisayardan bilgisayara takip eder.
Bu takip etmez, bilerek. Bir sunucudaki env çıktısı sırlar içerir. Bir müşteri tablosundaki SELECT müşteri verisi içerir. Bunları görünür kılmak için yapılmış bir araç, bir de onları yeni bir yere kopyalamamalı.
Telefon aynı günlüğü ajanın profilinden takip edebilir (mobil uygulama 2.47 ve sonrası). Akış bilgisayarından telefonuna uçtan uca şifreli bağlantı üzerinden gider, sırlar çıkmadan önce maskelenir (API anahtarları, KEY=value çiftleri, URL'lerdeki şifreler, token'lar) ve hiçbir şey bir sunucuda saklanmaz. Aynı çağrı, eskisi gibi ajanın sohbetinde de okunabilir kalır.
Claude Code denetim kayıtları başka bir şey
"Claude Code audit log" diye arattıysan, büyük ihtimalle Anthropic'in Claude Enterprise için Compliance API'sini buldun: bir etkinlik akışı, denetim kaydı olayları ve Enterprise hesabına giriş yapılmış yerel oturumlar için oturum transkriptleri. Yöneticiler ve uyumluluk ekipleri için yapılmıştır, kuruluşu kapsar ve iş işten geçtikten sonra okunur.
Bu, "şirkette kim Claude ile ne yaptı" sorusuna cevap verir. "Ajanım şu anda veritabanı sunucusunda hangi komutu çalıştırıyor" sorusuna cevap vermez. İkisi bir arada var olabilir ve uyumluluk yükümlülüğü olan bir şirkette çalışıyorsan, ikincisi için ne kullanırsan kullan muhtemelen birincisine yine de ihtiyacın var.
AgentsRoom kullanmıyorsan
Bunun büyük bir kısmını CLI'ların zaten sunduklarıyla elde edebilirsin.
Her shell komutunu başladığı anda logla. Claude Code hook'ları her araç çağrısından önce bir komut çalıştırabilir. Hook rehberi bu kalıbı gösteriyor: Bash aracı üzerinde, jq -r .tool_input.command çıktısını bir log dosyasına aktaran bir PreToolUse hook'u. İkinci bir terminalde o dosya üzerinde tail -f çalıştır; ajanın gönderdiği her komutu, ssh satırları dahil, gönderildiği anda görürsün.
Çıktıya ihtiyacın olduğunda transkripti oku. Hook sana komutu verir, sunucunun ne cevap verdiğini değil. Bunun için ~/.claude/projects/ altındaki oturum dosyası (Codex için ~/.codex/sessions/) her çağrının tam sonucunu içerir.
Ajana sunucuda kendi hesabını ver. Ayrı bir kullanıcı, her bağlantıyı sunucunun kimlik doğrulama kaydında kime ait olduğu belli hale getirir; sunucularında auditd çalışıyorsa, o kullanıcı için execve üzerine bir kural, başlattığı her süreci sunucu tarafında, ajanın atlayamayacağı yerde kaydeder.
Kimlik bilgilerini ajanın erişiminden uzak tut. Bağlanmanın tek yolu ajanın senden istemek zorunda olduğu bir şifreyse, sohbette sshpass satırları görürsün. Ajanın hiç okumadığı bir anahtar ya da sırrı onun yerine tutan bir araç kullan. Bir ajana sırrı prompta koymadan nasıl verirsin konusunda ayrı bir rehber yazdık.
Bu düzenin sana vermediği şey üçü arasındaki bağlantı: hangi ajan, hangi bağlantıda, hangi canlı çıktıyla, tek bir yerde. Bizim inşa ettiğimiz kısım bu.
İnsanların gerçekten sorduğu sorular
Claude Code uzak bir sunucuda çalışırken ne yaptığını görebilir miyim?
Terminalde araç çağrısını ve bittiğinde kısa bir sonucu görürsün. Tam komut ve çıktısı diskindeki oturum transkriptine yazılır, sen de onu sonradan okursun. Olurken izlemek için her çağrıyı başladığı anda kaydeden bir şeye ihtiyacın var: her Bash komutunu bir log dosyasına yazan bir Claude Code hook'u ya da uzak çağrıları ajan adına çalıştırıp canlı gösteren bir uygulama. AgentsRoom'un Etkinlik sekmesinin yaptığı da bu.
Claude Code çalıştırdığı komutların kaydını nerede tutuyor?
Oturum transkriptinde, ~/.claude/projects/ altında bir JSONL dosyasında: proje başına bir klasör, oturum başına bir dosya. Her araç çağrısı, girdisi ve sonucuyla birlikte bir satırdır. Codex de oturum başına benzer bir dosyayı ~/.codex/sessions/ altında tutar. İkisi de eksiksizdir ve ikisi de bir insanın göz gezdirmesi için değil, CLI'ın bir oturumu sürdürebilmesi için yazılır.
Bu, Claude Code denetim kayıtlarıyla aynı şey mi?
Hayır. İnsanların bu adla aradığı denetim kayıtları, Anthropic'in Enterprise planında Compliance API üzerinden sunduğu kuruluş düzeyindeki kayıtlardır: bir etkinlik akışı, denetim olayları ve oturum açılmış oturumlar için transkriptler; bunları daha sonra bir yönetici okur. Kuruluşta kimin ne yaptığı sorusuna cevap verirler. Tek bir sunucudaki komutların canlı görünümü ise başka bir kişi için başka bir araçtır.
Neden ajanın çalıştırdığı her komut için bir terminal sekmesi açılmasın?
O yolu denedik ve ölçtük: bir production sorunu üzerinde çalışan bir ajan tek bir oturumda 166 uzak komut çalıştırdı. Komut başına bir sekme, sekme çubuğunu on dakika sonra kullanılmaz hale getirir. İşe yarayan şey bağlantı başına bir günlük: her çağrı, komutu, canlı çıktısı, çıkış kodu ve süresiyle bir kayıttır.
AgentsRoom komutları ve çıktılarını bir sunucuya gönderiyor mu?
Hayır. Günlük masaüstü uygulamasının belleğinde yaşar, proje başına 120 çağrıyla sınırlıdır ve uygulamadan çıktığında silinir. Telefon onu ajanın profilinden takip edebilir (mobil uygulama 2.47 ve sonrası): akış bilgisayarından telefonuna uçtan uca şifreli bağlantı üzerinden gider, sırlar maskelenir ve hiçbir şey bir sunucuda saklanmaz.
Etkinlik sekmesi ajanın hangi komutlarını göstermez?
Yalnızca AgentsRoom araçlarından geçen çağrılar kaydedilir: ssh_exec, ssh_transfer, db_query, db_schema ve kube_kubectl. Ajanın kendi shell aracıyla çalıştırdığı bir komut, örneğin düz bir ssh ya da psql satırı, terminalinde ve transkriptinde yer alır ama günlükte yer almaz. commands_run ve ssh_connect bilerek dışarıda bırakıldı, çünkü zaten izleyebileceğin bir terminal sekmesi açıyorlar.
Kısa versiyon
Sunucudaki bir ajanın senden iki şeye ihtiyacı var: şifreni gerektirmeyen bir çalışma yolu ve onun ne yaptığını yaparken görebilmen için bir yol. İkincisi olmadan birincisi, seni iş işten geçtikten sonra JSON okumak zorunda bırakır. Birincisi olmadan ikincisinin etrafından, sshpass satırları yapıştıran bir ajan dolaşır.
Sonunda bağlantı başına bir günlükte karar kıldık: sınırlı ve senin makinende tutulan. Denemek istersen AgentsRoom ücretsiz indirilebilir ve SSH bağlantıları sayfası kurulumu adım adım gösteriyor. Yalnızca CLI'ınla kalmayı tercih edersen, PreToolUse hook'u ve bir tail -f ile başla: beş dakika sürer ve son altı araç çağrısının ne olduğunu bir daha asla merak etmezsin.
AgentsRoom'u İndir
Tüm yapay zeka ajanlarını, tüm projelerinde, tek bir pencereden çalıştır.
Yardımcı uygulama: hareket halindeyken ajanlarını izle
Claude, Codex, Antigravity CLI veya başka bir AI sağlayıcı kullan.
Hataları ve istekleri doğrudan genel backloguna gönder.
Okumaya devam et
On ajan aynı tip kontrolünü aynı anda çalıştırdı. Çözüm bir klasördü.
Tek bir checkout içinde on yedi kod ajanı, aynı anda on tsc süreci, load average 37 ve 87 MB boş bellek. Doksan saniyelik bir tip kontrolü 7 dk 36 sürdü. İşte ölçüm, makinenin neden hesap yapmadığı ve sorunu çözen küçük paylaşımlı kilit. Her depoya kopyalanabilir.
Makaleyi okuYapay Zekâ Koşu Koçum Bir Git Deposu ve Bir Claude Ajanı
Antrenmanı bitiriyorum, saatim senkronize oluyor ve üç dakika sonra analiz depoma yazılmış, hafta yeniden ayarlanmış ve koçum Strava aktivitesinin altına yorumunu bırakmış oluyor. Yazılmış bir uygulama yok, kurulmuş bir sunucu yok, token başına fatura yok: bir Claude aboneliği, AgentsRoom ve Markdown dosyaları. İşte kurulumun tamamı, tekrar edilebilir hâliyle.
Makaleyi okuBir Kodlama Ajanına Prompt'a Yazmadan Gizli Bilgi Nasıl Verilir
Bir ajanın komutunu çalıştırmak için bir Stripe anahtarına ya da veritabanı parolasına ihtiyacı var. Onu sohbete yapıştırdığın anda diskindeki transkripte, model sağlayıcısına ve bazen bir commit'e düşer. Kendi üç hatamızdan sonra vardığımız kural: bir gizli bilgi bir ajana yalnızca ortam değişkeniyle ulaşır, başka hiçbir yolla değil.
Makaleyi oku