WebKaptan'a hoş geldin

Tek bir sohbetten siteni yönet. İçerik üret, sayfa düzenle, rapor al — hepsi buradan.

Sitenin genel durumu Son blog yazısını özetle Sayfaları listele Site sağlığını kontrol et Blog konusu öner Bekleyen e-postalar
⚙️ Sistem ve Yönetim Ayarları
⚡

DeepSeek Harness Modüler Yönetim Merkezi

Cordis Microkernel v2.4

"Her Şey Bir Eklentidir" (Everything-is-a-Plugin): WebKaptan'ın tüm yetenekleri ve otonom motorları bağımsız birer mikro modüldür. İster sadece Hız Kontrolü (Lighthouse) modülünü tek başına bırakın, ister 3'lü kombinasyonlar seçin, sistem hatasız çalışır ve İş Akışı (Workflow) otomatik olarak anında yeniden yapılanır.

11 / 11 Modül Canlı
⚡ Hızlı Çalışma Modları (Harness Presets):

🔄 Dinamik İş Akışı Rotası (Seçilen Modüllere Göre Canlı Derlenen Boru Hattı)

🧩 Modüler Eklenti Listesi (Granular Switches)

Her modül tek başına veya grupça çalışabilir

🤖 Yapay Zekâ Modelleri & Dağılımı

Aktif
Strateji & Ana Konular En zor mimari ve büyüme görevleri
glm-5.3
Kodlama & Hızlı İşler Rutinler, araçlar ve anlık yanıtlar
glm-5.3-flash

🌐 Sunucu ve Alan Adı

Yönetilen Ana Alan Adı Prodüksiyon ortamı
kidspixel.com
Bağlı WordPress Sitesi Çift site yönetim kanalı
zhpalet.com
İzin Verilen Kapsam Güvenli çalışma alanı
Sadece kendi alanları

🤖 Görev Bazlı AI Model Dağılımı

Hangi otonom ajanın veya işlemin hangi yapay zeka modeliyle çalışacağını bu tablodan dinamik olarak belirleyebilirsiniz. Değişiklikler anında tüm ajan döngülerine uygulanır.

👑 Müdür AI & Strateji Sohbeti Ana Beyin
Genel yönetim, karar alma ve kullanıcı diyaloğu.
🎨 Tasarım, CSS & Kodlama Frontend
Visual Sandbox, estetik CSS ve responsive bileşen üretimi.
✍️ SEO & Blog İçerik Yazımı İçerik
1500+ kelimelik derin SEO blogları ve anahtar kelime kümeleme.
📱 Sosyal Medya Motoru Sosyal Hub
Instagram, LinkedIn, X, TikTok aylık takvim içerikleri.
🎯 Radar & B2B Lead Keşfi Büyüme
Harita tarama, telefon/web doğrulama ve DM taslakları.
👁️ Görsel Analiz (Vision) Multimodal
Ekran görüntüleri, afiş ve medya dosyalarını inceleme.
🛡️ Güvenlik & Log Taraması Sağlık
BULGU -> ROTA -> ONAY denetimi ve log analizi.
🔀 Kesintisiz Yedek Hat (Fallback) Yedek
Ana model zaman aşımına uğrarsa devreye giren hat.

Telegram Kullanıcı Yetkileri

Bot: @kidspixel_bot

Numara ekleyerek botu yönetme yetkisi tanımlayabilir veya dilediğiniz kullanıcıyı Pasif/Aktif konuma alabilirsiniz.

WhatsApp Kullanıcı Yetkileri & Rol Yönetimi

🟢 Çoklu Rol Aktif

WhatsApp üzerinden rol bazlı acil durum uyarıları, onay talepleri ve bülten bildirimleri almak için yetkili numara ekleyin.

📱 WhatsApp Web & Windows Yerel Eşleştirme (QR) Telefonunuzdan WhatsApp > Bağlı Cihazlar menüsünden QR kodu okutabilir veya yerel uygulamayı açabilirsiniz.
WhatsApp QR Code
🟢 Bağlantı Hazır: +44 7435 760957 (Yönetici Eşleşti)

QR kod ile tarama yapıldığında sistem bildirimleri anlık olarak kişisel veya kurumsal WhatsApp hattınıza yönlendirilir.

📋 Aktif Olarak Gelecek Bildirim ve Alarmlar

6 Alarm Aktif

Sistem aşağıdaki olaylar gerçekleştiğinde Telegram ve WhatsApp üzerinden yetkili yöneticilere anlık mesaj iletir:

🚨 1. Kesinti & Uptime Alarmı Siteye erişilemediğinde anında acil durum uyarısı.
🔒 2. SSL Bitiş Uyarısı (<14 gün) Sertifika yenileme zamanı yaklaştığında uyarı.
📧 3. Önemli E-posta Bildirimi Destek, finans veya ortaklık e-postası geldiğinde.
☀️ 4. Günlük Sağlık & İş Özeti Her sabah 09:00'da son 24 saatin özet raporu.
📝 5. Blog Yayınlandı Bildirimi Yeni bir blog yazısı canlıya alındığında teyit mesajı.
📱 6. Sosyal Medya Paylaşım Bildirimi Instagram/LinkedIn içeriği yayınlandığında bildirim.

Sosyal Medya Mesajları & Telegram / İletişim Yönlendirme

🟢 Anlık İletim Devrede

Facebook Sayfası, Instagram ve LinkedIn üzerinden gelen tüm doğrudan mesajlar (DM) ve müşteri soruları anında Telegram yöneticisine iletilir ve İletişim Gelen Kutusuna kaydedilir.

Canlı İletim Testi:

💬 Bildirim Örnek Mesajı (Canlı Önizleme)

Telegram / WhatsApp Formatı
☀️ WebKaptan Günlük Sağlık ve Operasyon Özeti

🟢 Site Durumu: kidspixel.com (HTTP 200 • 23 ms)
🔒 SSL: Geçerli (60 gün kaldı)
📝 İçerik: 1 yeni blog taslağı hazırlandı · 1 Instagram gönderisi onay bekliyor
⚡ Öneri: Günlük gelişim önerisi incelenmeye hazır.

[Detayları İncele] · [Onayla ve Yayınla]

🔔 Bildirim Kanalları & Seçenekleri

Yükleniyor…

🛠️ Araç ve Yetenek (Skill) Kayıt Defteri

PostgreSQL Hafızalı

Müdür AI'ın kullanabileceği araçların durumunu buradan yönetebilirsiniz. Pasife alınan araçlar otomatik olarak plan dışı bırakılır.

Yükleniyor...

📊 Canlı İçerik Sayaçları

Sayfalar
-
Bloglar
-
Görseller
-
Panel Sayfaları
-

📝 Canlı Sistem Logları

🖥️
Ubuntu 24.04 LTS (x86_64) · WebKaptan Cloud Sandbox (cloud-vm-01)
Canlı Sandbox Aktif (Plesk VDS · 104.247.166.141) Kernel 6.8.0 Otonom Ajan v2.2
RAM6.2 / 7.6 GB
CPU4 Core (%12)
Ping42 ms
Uptime16g 15s
🔒 https://
● Computer Use Aktif
🤖 [Tıklanıyor: #overview-stats]
🕹️ Manuel Kontrol Devrede — Ekrana Tıklayarak İşlem Yapabilirsiniz
💻 webkaptan@cloud-vm-01: /var/www/vhosts (bash)
Welcome to WebKaptan Ubuntu 24.04 LTS (GNU/Linux 6.8.0-45-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Sun Aug 30 2026:
  System load:  0.42, 0.28, 0.25      Processes:             218
  Usage of /:   88.4% of 98.40GB      Users logged in:       1
  Memory usage: 81% (6.2GB/7.6GB)     IPv4 address for eth0: 104.247.166.141

 webkaptan@cloud-vm-01:~$ _
webkaptan@cloud-vm-01:~$
🧠 Otonom Ajan Zihin Akışı & Adım Adım Karar Günlüğü Ortalama Karar Gecikmesi: 142ms
👁️
Gözlem: Ekran Yüzeyi & DOM İncelendi

Hedef site yapısı analiz edildi. KidsPixel Facebook sayfası ve WordPress demo klonu aktif durumda.

Zaman: 23:40:12 · Latency: 38ms · Model: GLM-5.3 Flash / DeepSeek
🧠
Düşünce: İş Akışı Kararı

ZHPalet WordPress klonunda ve KidsPixel sosyal medya kanallarında onay bekleyen içerik rotaları tespit edildi.

Zaman: 23:40:14 · Tokens: 412 · Karar: Çapraz Dağıtım Hazırlığı
⚡
Eylem: Composio MCP & REST Araç Çağrısı

FACEBOOK_CREATE_POST ve WORDPRESS_SYNC çağrıları hazırlandı, operatör onay kuyruğuna iletildi.

Zaman: 23:40:15 · Status: OK · Sandbox: cloud-vm-01
📁 Dizin Yapısı (/var/www/vhosts)
  • 📁 kidspixel.com
    • 📄 httpdocs/index.html
    • ⚡ backend/agent.js
    • ⚡ backend/sites-registry.js
  • 📁 webkaptan.com
    • 📄 deneme/klasik-modern.html
    • 🔒 wpdemo/wp-config.php
/var/www/vhosts/kidspixel.com/webkaptan/releases/v2/backend/sites-registry.js
// Multi-Site Registry (Faz 2) Live File Viewer
module.exports = {
  kidspixel: { name: 'KidsPixel', url: 'https://kidspixel.com', type: 'custom' },
  zhp: { name: 'ZHPalet Online', url: 'https://zhpalet.com', type: 'wordpress' },
  wpd: { name: 'ZHPalet Demo', url: 'https://wpdemo.webkaptan.com', type: 'wordpress' }
};
AÇIKPort 2232 / SSH
Plesk Güvenli Uzaktan Yönetim Portu
Protokol: TCP · Servis: OpenSSH 9.6p1
AÇIKPort 443 / HTTPS
Nginx SSL / TLS 1.3 Web Trafiği
Sertifika: Let's Encrypt Wildcard (*.webkaptan.com)
AÇIKPort 3213 / Node.js
WebKaptan Otonom Ajan REST & WebSocket Çekirdeği
Çalışma Modu: Production · Uptime: 16 Gün
AÇIKPort 5432 / PostgreSQL
WebKaptan Master Veritabanı Kümesi
Durum: Sağlıklı · 7 Master Tablo Aktif
🛍️ ZHPalet Yazılarını Tara ⚡ KidsPixel Hızını Ölç 📜 Hata Loglarını Tara 📘 Sosyal Medyayı Kontrol Et
⚡ GLM 5.3 Flash Tasarım & Kodlama Motoru
Hazır
Seçim yokBir alanı seçin veya tüm sayfa için isteğinizi yazın.

Alanı düzenle

Kaydettiğinde kidspixel.com güncellenir.

'; } updateDesignDraftControls(); loadDesignVersions(); } function designTextOf(el) { if (!el) return ''; const tag = String(el.tagName || '').toUpperCase(); if (tag === 'IMG') return (el.getAttribute('alt') || el.getAttribute('src') || '').trim(); if (tag === 'INPUT' || tag === 'TEXTAREA') return (el.value || el.getAttribute('value') || '').trim(); return (el.textContent || '').replace(/\s+/g, ' ').trim(); } function designElementKind(el) { const tag = String(el && el.tagName || '').toUpperCase(); if (/^H[1-4]$/.test(tag)) return 'Başlık'; if (tag === 'P') return 'Paragraf'; if (tag === 'A') return 'Link'; if (tag === 'BUTTON') return 'Buton'; if (tag === 'IMG') return 'Görsel'; if (tag === 'INPUT' || tag === 'TEXTAREA') return 'Form alanı'; if (tag === 'LI') return 'Liste öğesi'; if (tag === 'SECTION' || tag === 'ARTICLE' || tag === 'HEADER' || tag === 'FOOTER' || tag === 'NAV') return 'Bölüm'; return 'Metin'; } function designFriendlyLabel(el) { const kind = designElementKind(el); const text = designTextOf(el); return kind + (text ? ' · ' + text.slice(0, 54) : ''); } function cleanDesignOuterHtml(el) { if (!el) return ''; const clone = el.cloneNode(true); function clean(node) { if (!node || node.nodeType !== 1) return; node.removeAttribute('data-wk-edit'); node.classList.remove('wk-hovered', 'wk-selected'); if (node.getAttribute('class') === '') node.removeAttribute('class'); if (node.id === 'wk-hover-label') node.remove(); Array.from(node.children || []).forEach(clean); } clean(clone); return clone.outerHTML || ''; } function setDesignSelection(label, detail) { const selection = document.getElementById('designSelectionStatus'); if (!selection) return; selection.innerHTML = ''; const strong = document.createElement('strong'); strong.textContent = label || 'Seçim yok'; const span = document.createElement('span'); span.textContent = detail || 'Sayfada bir alanın üzerine gel, tıkla ve düzenle.'; selection.appendChild(strong); selection.appendChild(span); } function formatDesignVersion(v) { const date = v.createdAt ? new Date(v.createdAt) : null; const when = date && !Number.isNaN(date.getTime()) ? date.toLocaleString('tr-TR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }) : 'Tarih yok'; const label = String(v.label || v.source || 'Versiyon').replace(/\s+/g, ' ').trim(); return when + ' · ' + label.slice(0, 44); } async function loadDesignVersions() { const select = document.getElementById('designVersionSelect'); const undo = document.getElementById('designUndoBtn'); const restore = document.getElementById('designRestoreBtn'); if (!select) return; try { const [draftResponse, publishResponse, legacyResponse] = await Promise.all([ fetch('/api/design/drafts?path=' + encodeURIComponent(designCurrentPath) + '&limit=60', { cache: 'no-store' }), fetch('/api/design/publishes?path=' + encodeURIComponent(designCurrentPath) + '&limit=40', { cache: 'no-store' }), fetch('/api/design/versions?path=' + encodeURIComponent(designCurrentPath), { cache: 'no-store' }) ]); const [draftData, publishData, legacyData] = await Promise.all([draftResponse.json(), publishResponse.json(), legacyResponse.json()]); if (!draftResponse.ok || !draftData.ok) throw new Error(draftData.error || ('HTTP ' + draftResponse.status)); if (!publishResponse.ok || !publishData.ok) throw new Error(publishData.error || ('HTTP ' + publishResponse.status)); if (!legacyResponse.ok || !legacyData.ok) throw new Error(legacyData.error || ('HTTP ' + legacyResponse.status)); designDrafts = Array.isArray(draftData.drafts) ? draftData.drafts.filter(item => item.status !== 'discarded') : []; designPublishes = Array.isArray(publishData.publishes) ? publishData.publishes : []; designVersions = Array.isArray(legacyData.versions) ? legacyData.versions : []; select.innerHTML = ''; if (!designDrafts.length && !designPublishes.length && !designVersions.length) { const opt = document.createElement('option'); opt.value = ''; opt.textContent = 'Geçmiş yok'; select.appendChild(opt); } if (designDrafts.length) { const group = document.createElement('optgroup'); group.label = 'Taslaklar'; for (const draft of designDrafts) { const opt = document.createElement('option'); opt.value = 'draft:' + draft.id; const date = draft.createdAt ? new Date(draft.createdAt).toLocaleString('tr-TR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }) : ''; const state = draft.status === 'ready' ? 'Hazır' : draft.status === 'published' ? 'Yayınlandı' : draft.status === 'failed' ? 'Hata' : 'Hazırlanıyor'; opt.textContent = date + ' · ' + state + ' · ' + String(draft.brief || 'Tasarım').slice(0, 44); opt.title = draft.error || draft.warning || draft.brief || ''; if (designActiveDraft && designActiveDraft.id === draft.id) opt.selected = true; group.appendChild(opt); } select.appendChild(group); } const restorablePublishes = designPublishes.filter(item => item.type === 'publish'); if (restorablePublishes.length) { const group = document.createElement('optgroup'); group.label = 'Yayın geçmişi'; for (const item of restorablePublishes) { const opt = document.createElement('option'); opt.value = 'publish:' + item.id; const date = item.createdAt ? new Date(item.createdAt).toLocaleString('tr-TR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }) : ''; opt.textContent = date + ' · ' + (item.rolledBackAt ? 'Geri alındı' : 'Yayında') + ' · ' + String(item.brief || 'Tasarım').slice(0, 38); group.appendChild(opt); } select.appendChild(group); } if (designVersions.length) { const group = document.createElement('optgroup'); group.label = 'Eski yedekler'; for (const v of designVersions) { const opt = document.createElement('option'); opt.value = 'legacy:' + v.id; opt.textContent = formatDesignVersion(v); opt.title = (v.summary || v.label || '') + (v.legacy ? ' (eski yedek)' : ''); group.appendChild(opt); } select.appendChild(group); } if (undo) undo.disabled = !designActiveDraft && !restorablePublishes.length; if (restore) restore.disabled = !select.value; } catch (e) { designDrafts = []; designPublishes = []; designVersions = []; select.innerHTML = ''; if (undo) undo.disabled = true; if (restore) restore.disabled = true; setDesignStatus('Versiyonlar okunamadı: ' + e.message, 'err'); } } async function restoreDesignVersionById(id) { if (!id) return; const version = designVersions.find(v => v.id === id); const label = version ? formatDesignVersion(version) : 'seçili versiyon'; if (!confirm(label + ' geri yüklensin mi? Mevcut hali de otomatik yeni bir versiyon olarak saklanacak.')) return; setDesignStatus('Versiyon geri yükleniyor...', 'busy'); try { const res = await fetch('/api/design/restore', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, path: designCurrentPath }) }); const data = await res.json(); if (!res.ok || !data.ok) throw new Error(data.error || ('HTTP ' + res.status)); closeEditPopover(); setDesignStatus(data.unchanged ? 'Zaten bu versiyonda' : 'Versiyon geri yüklendi', 'ok'); await loadDesignVersions(); setTimeout(function() { loadDesignPage(); }, 300); } catch (e) { setDesignStatus('Geri alma hatası: ' + e.message, 'err'); } } function undoLatestDesignVersion() { if (designActiveDraft) { if (designActiveDraft.parentId) { const parent = designDrafts.find(item => item.id === designActiveDraft.parentId); if (parent) { activateDesignDraft(parent); return; } } designActiveDraft = null; designPreviewMode = 'live'; updateDesignDraftControls(); loadDesignPage(); return; } const latest = designPublishes.find(item => item.type === 'publish' && !item.rolledBackAt); if (latest) rollbackDesignPublish(latest.id); } function restoreSelectedDesignVersion() { const select = document.getElementById('designVersionSelect'); const value = select && select.value || ''; if (value.startsWith('draft:')) { const draft = designDrafts.find(item => item.id === value.slice(6)); if (draft && ['ready', 'published'].includes(draft.status)) activateDesignDraft(draft); else if (draft) setDesignStatus(draft.error || 'Taslak henüz hazır değil', 'err'); return; } if (value.startsWith('publish:')) { rollbackDesignPublish(value.slice(8)); return; } if (value.startsWith('legacy:')) restoreDesignVersionById(value.slice(7)); } async function rollbackDesignPublish(id) { const item = designPublishes.find(entry => entry.id === id); if (!item) return; if (!confirm('Bu yayın geri alınsın mı? Geri almadan önce bugünkü görünüm de otomatik yedeklenecek.')) return; setDesignStatus('Tasarım geri alınıyor...', 'busy'); try { const response = await fetch('/api/design/publishes/' + encodeURIComponent(id) + '/rollback', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ confirmRollback: true }) }); const data = await response.json(); if (!response.ok || !data.ok) throw new Error(data.error || ('HTTP ' + response.status)); designActiveDraft = null; designPreviewMode = 'live'; setDesignStatus('Önceki tasarım geri yüklendi', 'ok'); await loadDesignPage(); } catch (error) { setDesignStatus('Geri alma hatası: ' + error.message, 'err'); } } function injectDesignScript() { const iframe = document.getElementById('designIframe'); try { const doc = iframe.contentDocument || iframe.contentWindow.document; if (!doc || !doc.body) { setTimeout(injectDesignScript, 1000); return; } // remove existing WK styles to avoid duplicates const oldStyle = doc.getElementById('wk-edit-style'); if (oldStyle) oldStyle.remove(); const style = doc.createElement('style'); style.id = 'wk-edit-style'; style.textContent = [ '[data-wk-edit]{cursor:pointer;outline:2px dashed transparent;outline-offset:2px;transition:outline .12s,box-shadow .12s,background-color .12s}', '[data-wk-edit].wk-hovered{outline:2px solid #38bdf8!important;box-shadow:0 0 0 4px rgba(56,189,248,.18)!important;background-color:rgba(56,189,248,.06)!important}', '[data-wk-edit].wk-selected{outline:3px solid #16c8ff!important;box-shadow:0 0 0 5px rgba(22,200,255,.20)!important;background-color:rgba(22,200,255,.07)!important}', '#wk-hover-label{position:fixed;z-index:2147483647;display:none;pointer-events:none;background:#0f172a;color:white;border:1px solid rgba(255,255,255,.18);box-shadow:0 10px 28px rgba(15,23,42,.28);border-radius:999px;padding:7px 10px;font:700 12px/1.2 system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;max-width:min(460px,calc(100vw - 24px));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}', '#wk-hover-label:before{content:"";position:absolute;left:14px;bottom:-5px;width:10px;height:10px;background:#0f172a;transform:rotate(45deg);border-right:1px solid rgba(255,255,255,.18);border-bottom:1px solid rgba(255,255,255,.18)}' ].join(''); doc.head.appendChild(style); const oldLabel = doc.getElementById('wk-hover-label'); if (oldLabel) oldLabel.remove(); const label = doc.createElement('div'); label.id = 'wk-hover-label'; doc.body.appendChild(label); // clean old listeners by cloning body (simplest reliable way) const newBody = doc.body.cloneNode(true); doc.body.parentNode.replaceChild(newBody, doc.body); const hoverLabel = doc.getElementById('wk-hover-label'); let hoveredEl = null; function editableTarget(start) { let el = start && start.nodeType === 1 ? start : start && start.parentElement; if (!el || el === doc.body) return null; const preferred = el.closest('a,button,img,input,textarea,label,h1,h2,h3,h4,p,span,li'); if (preferred && preferred !== doc.body) return preferred; const block = el.closest('section,article,header,nav,footer,div'); return (!block || block === doc.body) ? null : block; } function elementSelector(el) { if (!el) return ''; const parts = []; let node = el; while (node && node.nodeType === 1 && node !== doc.body && parts.length < 4) { let part = node.tagName.toLowerCase(); if (node.id) { part += '#' + node.id; parts.unshift(part); break; } const cls = String(node.className || '').split(/\s+/).filter(Boolean).filter(c => !/^wk-/.test(c)).slice(0, 3); if (cls.length) part += '.' + cls.join('.'); const parent = node.parentElement; if (parent) { const same = Array.from(parent.children).filter(x => x.tagName === node.tagName); if (same.length > 1) part += ':nth-of-type(' + (same.indexOf(node) + 1) + ')'; } parts.unshift(part); node = parent; } return parts.join(' > '); } function elementSummary(el) { return designFriendlyLabel(el); } function showHover(el) { if (!el || !hoverLabel) return; if (hoveredEl && hoveredEl !== el) hoveredEl.classList.remove('wk-hovered'); hoveredEl = el; el.setAttribute('data-wk-edit', '1'); el.classList.add('wk-hovered'); const rect = el.getBoundingClientRect(); hoverLabel.textContent = 'Tıkla: ' + elementSummary(el); hoverLabel.style.display = 'block'; hoverLabel.style.left = Math.max(8, Math.min(rect.left, doc.documentElement.clientWidth - 24)) + 'px'; hoverLabel.style.top = Math.max(8, rect.top - 36) + 'px'; } function clearHover() { if (hoveredEl) hoveredEl.classList.remove('wk-hovered'); hoveredEl = null; if (hoverLabel) hoverLabel.style.display = 'none'; } doc.body.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); let el = editableTarget(e.target); if (!el) return; doc.querySelectorAll('[data-wk-edit].wk-selected').forEach(x => x.classList.remove('wk-selected')); el.setAttribute('data-wk-edit', '1'); el.classList.add('wk-selected'); showHover(el); handleElementClick(el, doc, elementSelector(el), elementSummary(el)); }, true); doc.body.addEventListener('mousemove', function(e) { const el = editableTarget(e.target); if (el) showHover(el); else clearHover(); }, true); doc.body.addEventListener('mouseleave', clearHover, true); doc.body.querySelectorAll('header,nav,main,section,article,footer,h1,h2,h3,h4,p,span,a,img,button,input,textarea,label,li,div').forEach(function(el) { if (!el.getAttribute('data-wk-edit')) el.setAttribute('data-wk-edit', '1'); }); setDesignStatus('Hazır', 'ok'); setDesignSelection('Seçim yok', 'Sayfada bir alanın üzerine gel, tıkla ve düzenle.'); } catch (err) { console.log('inject err:', err.message); } } function handleElementClick(el, doc, selector, summary) { selector = selector || el.tagName.toLowerCase(); designCurrentSelector = selector; designCurrentSummary = summary || designFriendlyLabel(el); designCurrentLabel = designFriendlyLabel(el); designCurrentOldText = designTextOf(el); designCurrentOuterHtml = cleanDesignOuterHtml(el); designCurrentTagName = String(el.tagName || '').toUpperCase(); document.getElementById('editSelectorLabel').textContent = designElementKind(el) + ' düzenle'; const hint = document.getElementById('editElementHint'); if (hint) hint.textContent = 'Değişiklik önce taslakta saklanır; canlı site değişmez.'; setDesignSelection('Seçili: ' + designCurrentLabel.slice(0, 64), 'Kaydettiğinizde yeni bir taslak sürümü oluşur.'); const text = designCurrentOldText; document.getElementById('editContent').value = text; const pop = document.getElementById('editPopover'); const rect = el.getBoundingClientRect(); const frameRect = document.getElementById('designFrameWrap').getBoundingClientRect(); pop.style.left = Math.max(10, Math.min(rect.left, frameRect.width - 420)) + 'px'; pop.style.top = Math.max(10, Math.min(rect.bottom + 10, frameRect.height - 220)) + 'px'; pop.classList.add('open'); } function closeEditPopover() { document.getElementById('editPopover').classList.remove('open'); } function setDesignStatus(message, kind) { const el = document.getElementById('designRunStatus'); if (!el) return; el.textContent = message || ''; el.className = 'design-status' + (kind ? ' ' + kind : ''); } function setDesignCommandBusy(active, scope) { const ids = ['designSelectedButton', 'designPageButton', 'designSiteButton']; ids.forEach(id => { const button = document.getElementById(id); if (!button) return; if (!button.dataset.label) button.dataset.label = button.textContent; button.disabled = Boolean(active); button.textContent = active && ((scope === 'selected' && id === 'designSelectedButton') || (scope === 'page' && id === 'designPageButton') || (scope === 'site' && id === 'designSiteButton')) ? 'Hazırlanıyor...' : button.dataset.label; }); } async function runDesignPrompt(scope) { const input = document.getElementById('designCommandInput'); const typedBrief = (input && input.value || '').trim(); const defaults = { selected: 'Seçili alanı mevcut içerik ve işlevleri koruyarak daha anlaşılır, dengeli ve KidsPixel markasına uygun biçimde yeniden tasarla.', page: 'Bu sayfadaki tüm gerçek içerikleri, verileri, formları ve bağlantıları koru. Navigasyon, hero, bütün içerik bölümleri, kart ve grid yerleşimleri, çağrı alanları, formlar ve alt bölüm dahil sayfanın tamamını KidsPixel markasına uygun, modern, güven veren, okunaklı ve mobil uyumlu biçimde yeniden tasarla. Yalnızca hero veya renkleri değiştirmekle yetinme.', site: 'Sitedeki tüm gerçek içerikleri, verileri, formları ve bağlantıları koru. Her sayfanın navigasyon, hero, bütün içerik bölümleri, kart ve grid yerleşimleri, çağrı alanları, formları ve alt bölümü dahil tamamında çalışan, KidsPixel markasına uygun, modern, güven veren, erişilebilir ve mobil uyumlu bir tasarım sistemi oluştur.' }; const brief = typedBrief || defaults[scope] || defaults.page; if (scope === 'selected') { if (!designCurrentSelector) { setDesignStatus('Önce sayfada bir alan seçin.', 'err'); return; } } setDesignCommandBusy(true, scope); try { const busyText = scope === 'site' ? 'Tüm site taslağı hazırlanıyor...' : scope === 'selected' ? 'Seçili alan tasarlanıyor...' : 'Sayfa taslağı hazırlanıyor...'; setDesignStatus(busyText, 'busy'); const compatibleParent = designActiveDraft && designActiveDraft.status !== 'failed' && (scope === 'selected' || designActiveDraft.scope === scope) ? designActiveDraft.id : ''; const response = await fetch('/api/design/drafts/generate', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ scope, path: designCurrentPath, brief, selector: scope === 'selected' ? designCurrentSelector : '', parentId: compatibleParent }) }); const data = await response.json(); if (!response.ok || !data.ok) throw new Error(data.error || ('HTTP ' + response.status)); designActiveDraft = data.draft; designPreviewMode = 'live'; updateDesignDraftControls(); closeEditPopover(); const startedAt = Date.now(); while (Date.now() - startedAt < 180000) { await new Promise(resolve => { designDraftPollTimer = setTimeout(resolve, 1500); }); const statusResponse = await fetch('/api/design/drafts/' + encodeURIComponent(data.draft.id), { cache: 'no-store' }); const statusData = await statusResponse.json(); if (!statusResponse.ok || !statusData.ok) throw new Error(statusData.error || ('HTTP ' + statusResponse.status)); designActiveDraft = statusData.draft; updateDesignDraftControls(); if (statusData.draft.status === 'failed') throw new Error(statusData.draft.error || 'Tasarım taslağı hazırlanamadı'); if (statusData.draft.status === 'ready') { if (input && typedBrief) input.value = ''; designPreviewMode = 'draft'; const coverage = statusData.draft.coverage || {}; const sectionSummary = coverage.fullPage && coverage.coveredSectionCount ? coverage.coveredSectionCount + ' bölümün yerleşimi yenilendi' : 'Taslak hazır'; setDesignStatus(statusData.draft.warning ? sectionSummary + '; güvenli tam sayfa tasarımı kullanıldı' : sectionSummary, 'ok'); await loadDesignPage(); return; } } throw new Error('Tasarım hazırlanması zaman aşımına uğradı'); } catch (e) { setDesignStatus('Hata: ' + e.message, 'err'); } finally { setDesignCommandBusy(false, scope); } } async function saveElement() { if (!designCurrentSelector) return; const newContent = document.getElementById('editContent').value.trim(); if (!newContent) { setDesignStatus('Icerik bos olamaz.', 'err'); return; } document.getElementById('editLoading').style.display = 'block'; setDesignStatus('Kaydediliyor...', 'busy'); try { const payload = JSON.stringify({ path: designCurrentPath, selector: designCurrentSelector, label: designCurrentLabel, oldText: designCurrentOldText, newContent, outerHtml: designCurrentOuterHtml, tagName: designCurrentTagName, parentId: designActiveDraft && ['ready', 'published'].includes(designActiveDraft.status) ? designActiveDraft.id : '' }); const r = await fetch('/api/design/drafts/element', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: payload }); const d = await r.json(); if (!r.ok || !d.ok) throw new Error(d.error || ('HTTP ' + r.status)); document.getElementById('editLoading').style.display = 'none'; designActiveDraft = d.draft; designPreviewMode = 'draft'; setDesignStatus('Yeni taslak sürümü hazır', 'ok'); closeEditPopover(); await loadDesignPage(); } catch (e) { document.getElementById('editLoading').style.display = 'none'; setDesignStatus('Hata: ' + e.message, 'err'); } } function openDesignPublishConfirm() { if (!designActiveDraft || designActiveDraft.status !== 'ready') return; const text = document.getElementById('designPublishConfirmText'); if (text) { const scope = designActiveDraft.scope === 'site' ? 'Tüm site' : designActiveDraft.scope === 'selected' ? 'Seçili alan' : 'Bu sayfa'; text.textContent = scope + ' için hazırlanan taslak ' + (designActiveDraft.fileCount || 0) + ' dosyada canlı kidspixel.com görünümünü değiştirecek. Emin misiniz?'; } document.getElementById('designPublishConfirm').classList.add('open'); } function closeDesignPublishConfirm() { document.getElementById('designPublishConfirm').classList.remove('open'); } async function confirmPublishDesignDraft() { if (!designActiveDraft || designActiveDraft.status !== 'ready') return; const button = document.getElementById('designPublishConfirmButton'); button.disabled = true; button.textContent = 'Yayınlanıyor...'; setDesignStatus('Otomatik yedek alınıyor ve yayınlanıyor...', 'busy'); try { const response = await fetch('/api/design/drafts/' + encodeURIComponent(designActiveDraft.id) + '/publish', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ confirmPublish: true }) }); const data = await response.json(); if (!response.ok || !data.ok) throw new Error(data.error || ('HTTP ' + response.status)); closeDesignPublishConfirm(); designActiveDraft = null; designPreviewMode = 'live'; setDesignStatus('Yayınlandı · otomatik yedek hazır', 'ok'); await loadDesignPage(); } catch (error) { setDesignStatus('Yayınlama hatası: ' + error.message, 'err'); } finally { button.disabled = false; button.textContent = 'Evet, yayınla'; } } async function discardActiveDesignDraft() { if (!designActiveDraft || designActiveDraft.status === 'published') return; if (!confirm('Bu taslak silinsin mi? Canlı site değişmeyecek.')) return; setDesignStatus('Taslak siliniyor...', 'busy'); try { const response = await fetch('/api/design/drafts/' + encodeURIComponent(designActiveDraft.id) + '/discard', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ confirmDiscard: true }) }); const data = await response.json(); if (!response.ok || !data.ok) throw new Error(data.error || ('HTTP ' + response.status)); designActiveDraft = null; designPreviewMode = 'live'; setDesignStatus('Taslak silindi; canlı site değişmedi', 'ok'); await loadDesignPage(); } catch (error) { setDesignStatus('Taslak silinemedi: ' + error.message, 'err'); } } window.toggleDesign = toggleDesign; window.loadDesignPage = loadDesignPage; window.injectDesignScript = injectDesignScript; window.runDesignPrompt = runDesignPrompt; window.saveElement = saveElement; window.loadDesignVersions = loadDesignVersions; window.undoLatestDesignVersion = undoLatestDesignVersion; window.restoreSelectedDesignVersion = restoreSelectedDesignVersion; window.setDesignPreviewMode = setDesignPreviewMode; window.openDesignPublishConfirm = openDesignPublishConfirm; window.closeDesignPublishConfirm = closeDesignPublishConfirm; window.confirmPublishDesignDraft = confirmPublishDesignDraft; window.discardActiveDesignDraft = discardActiveDesignDraft; openBlogDraftFromRoute(); openSocialPostFromRoute();
🛡️

Sunucu Donanım & Saldırı Radarı Kokpiti

🟢 Güvenli (Saldırı Yok)
Aktif TCP: 35 · Engellenen IP: 0 · Uptime: 16 Gün · TTFB: 42 ms
🧠 RAM (Bellek) 6.2 GB / 7.6 GB
Kullanım: %81 Boş: 1.4 GB
⚡ CPU (İşlemci Yükü) Load: 0.57
Çekirdek: 4 Core Xeon Durum: Stabil
💾 Disk (SSD Alanı) 81 GB / 98 GB
Doluluk: %82 Kalan Boş: 17 GB
🔒 WAF & Tehdit Kalkanı Aktif Koruma
Filtreleme: 0 Kötü Niyetli İstek
SSL: 100% Geçerli
Site Durumu
—
Kontrol bekleniyor
SSL
—
gün geçerli
Sayfalar
—
yayında
Blog
—
yazı
Görseller
—
medya dosyası
Kredi
—
kalan
📧 E-posta
—
Yükleniyor…
🔄 İşler & Rutinler
—
Yükleniyor…
📱 Sosyal Medya
—
Yükleniyor…
🎯 Fırsat Radarı
—
Nitelikli fırsat kaydı
🛡️ Güvenlik
Yükleniyor…
⚡ Hızlı İşlemler
Kabinden çıkmadan en sık işlere atla.