@kahinmcp/kahin 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,137 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## [0.3.8] — 2026-08-08
6
+
7
+ ### Eklenen
8
+ - `kahin_mirage_expect` / `kahin_mirage_check` / `kahin_mirage_uncheck` /
9
+ `kahin_mirage_select_option` / `kahin_mirage_dblclick` / `kahin_mirage_drag` /
10
+ `kahin_mirage_wait_for_text` / `kahin_mirage_wait_for_timeout` /
11
+ `kahin_mirage_route` eklendi: retry'li web-first assertion, doğrulamalı
12
+ checkbox/radio/select eylemleri, gerçek çift tıklama, sınırlı drag-and-drop,
13
+ metin/süre bekleme ve tek sonraki istek için abort/continue/fulfill route.
14
+ - `kahin_mirage_wait_selector` artık `state=attached|visible|enabled`
15
+ (varsayılan `visible`) destekler; timeout yanıtı `code:"timeout"` ve son
16
+ `reason` ile döner.
17
+ - `kahin_mirage_query` / `kahin_mirage_query_all` / `kahin_mirage_type` /
18
+ `kahin_mirage_wait_selector` locator motorunu kabul eder (`css=` / `text=` /
19
+ `role=` / `xpath=` / `nth=` ve `>>` zincirleme).
20
+ - `kahin_mirage_click` / `kahin_mirage_hover` / `kahin_mirage_focus` aksiyon
21
+ öncesi Playwright tarzı actionability bekler (görünür, enabled, stabil,
22
+ engelsiz; retry + `timeout` parametresi).
23
+ - `kahin_navigate` artık `wait_until=commit|domcontentloaded|load|networkidle`,
24
+ bounded `timeout` ve `referer` kabul eder; lifecycle beklemesi aşılırsa
25
+ `code:"navigation_timeout"` döner.
26
+ - Faz 2 agent-native yüzey: `kahin_mirage_snapshot` (ref'li, token bütçeli
27
+ satırlar; truncation asla sessiz değildir), `kahin_mirage_fill_form`
28
+ (ref'lerle çok alanlı doldurma; stale ref `requiresSnapshot` döner) ve
29
+ click/type/check/uncheck/select_option/dblclick/drag'e opsiyonel
30
+ `return_snapshot` kancası.
31
+ - Oturum kalıcılığı: `kahin_mirage_state_save` / `kahin_mirage_state_load`
32
+ (url + cookie + local/sessionStorage; mutlak yol zorunlu, load önce
33
+ kaydedilen url'e döner).
34
+ - Kimlik kalıcılığı: `kahin_identity_new` / `kahin_identity_save` /
35
+ `kahin_identity_list` / `kahin_identity_delete` / `kahin_identity_report` +
36
+ `kahin_browser_start(identity=...)` ile gerçek Camoufox fingerprint
37
+ pinleme; rapor canlı `navigator.userAgent`'ı sayfa-içi doğrular.
38
+ - `kahin_agent_status`: agent döngüsü özeti — engine liveness, sayfa durumu,
39
+ sekme sayısı, gerçek DOM-stream bookkeeping'inden `refsLive`/`domCursor`,
40
+ dialog/network/console sayaçları ve identity; engine yoksa yapılandırılmış
41
+ idle yanıt, asla hata fırlatmaz.
42
+ - Faz 3 stealth/anti-detect yüzeyi: `kahin_stealth_audit` (14 salt-okunur
43
+ leak probe'u, skor `{passed, total, ratio}`; hiçbir check atlanmaz),
44
+ `kahin_mirage_mouse_trajectory` / `kahin_mirage_click_humanized` ve
45
+ cadence'li `kahin_mirage_key_text` (jitter'lı Bézier yörünge, gerçek DOM
46
+ tıklaması, jitter'lı tuş hızı; hepsi seed'li deterministik).
47
+ - Domain başına kimlik rotasyonu: `kahin_identity_pin` / `kahin_identity_unpin`
48
+ / `kahin_identity_pins` / `kahin_identity_for_domain` — kanonik domain
49
+ anahtarlı, bounded ve doğrulanmış `~/.config/kahin/pins.json` deposu.
50
+ - `kahin_fingerprint_report` (canlı sayfadan sitenin göreceği fingerprint;
51
+ emülasyon onayından kanıt üretmez) ve `kahin_proxy_resolve` + `kahin_browser_start(proxy=...)`
52
+ (proxy exit-IP geo + timezone/locale/geolocation önerileri; URL kimlik
53
+ bilgileri asla loglanmaz; aktif engine config'iyle çakışma
54
+ `engine_config_conflict`).
55
+ - Stealth CI kapısı: `KAHIN_REQUIRE_STEALTH=1` altında audit ratio ≥ 0.8 ve
56
+ identity rotasyonu tam fingerprint özetini değiştirmek zorunludur;
57
+ `scripts/stealth-regression.py` drift-watcher'ı sabitlenmiş
58
+ `camoufox-harness/tests/perf/stealth-baseline.json` ile karşılaştırır
59
+ (0 = temiz, 1 = yeni leak, 2 = ortam; baseline yalnızca
60
+ `KAHIN_UPDATE_BASELINE=1` ile yeniden yazılır) ve GitLab `stealth-regression`
61
+ job'ı (`stage: verify`, real-e2e ile aynı unprivileged/GTK kurulumu)
62
+ schedule/main'da suite + regression'ı çalıştırır.
63
+ - Faz 4 performans yüzeyi: Zig sidecar non-blocking'e geçti — tek-in-flight
64
+ darboğazı kalktı, stdin işleme browser yanıtını asla bloklamaz ve birden
65
+ fazla istek aynı anda in-flight olabilir (IPC sözleşmesi değişmedi). N=20
66
+ `Runtime.evaluate` concurrency probe'u
67
+ (`camoufox-harness/tests/perf/concurrency.md`): seri 74.78 → 28.56 ms,
68
+ paralel duvar süresi 56.89 → 8.71 ms (6.5× düşüş), ratio 1.314 → 3.281.
69
+ - `kahin_engine_stats` eklendi: monotonic clock ile uptime + healer
70
+ tracker'dan bounded per-tool rollup (`tool_calls`/`tool_errors`,
71
+ `top_slow` ≤ 10, `last_error`); tüm `safe()` süre ölçümleri
72
+ `time.monotonic()`'a taşındı; engine yoksa yapılandırılmış
73
+ `engine_unavailable` yanıtı döner.
74
+ - Identity başına bounded profile prewarm: stabil sha256 identity hash +
75
+ ölçülen hazırlık süreleri in-process cache (max 8, FIFO) ve
76
+ `~/.cache/kahin/profiles/<hash>.json` içinde tutulur; gerçek launch işi
77
+ asla atlanmaz (dürüst metadata/reuse kaydı; kimlik payload'ı metadata'da
78
+ saklanmaz).
79
+
80
+ ### Düzeltilen
81
+ - Obscura/Shadow doğrudan screenshot çağrısını artık fail-closed reddeder;
82
+ görsel capture sözleşmesi Mirage’a ait kalır ve generic CDP yolu Mirage’a
83
+ doğru şekilde yükseltilir.
84
+ - Stealth CI gate’i Xvfb ile sabit bir grafik yüzeyinde ve `TZ=Etc/UTC` ile
85
+ çalışır; timezone probe’u geçerli `UTC` çıktısını da kabul eder. Böylece
86
+ runner’ın DISPLAY/TZ farkları gerçek stealth drift’i gibi raporlanmaz.
87
+ - Release tag’leri stealth regression kapısından geçmeden npm publish’e
88
+ ulaşamaz; npm publish sonrası registry’den sürüm tekrar okunarak local
89
+ package sürümüyle birebir eşleşme kanıtlanır.
90
+ - Identity rotation e2e gate’i Linux/Windows kimlik çiftiyle en az iki canlı
91
+ fingerprint boyutunu deterministik doğrular; yalnızca runner WebGL’ine
92
+ bağlı rastgele identity çakışması artık release’i düşürmez.
93
+ - CI browser image’larına Mesa/llvmpipe runtime’ı eklenerek WebGL stealth
94
+ probe’u gerçek software-rendered context üzerinde doğrulanır; baseline
95
+ gevşetilmez.
96
+ - Runner’da Mesa’nın gerçek software renderer’ı açıkça `llvmpipe` olarak
97
+ seçilir; WebGL gate’i yalnızca kütüphanelerin kurulu olmasına güvenmez.
98
+ - Stealth audit’in webgl check’i artık runner grafik yığınından bağımsız:
99
+ WebGL API varlığını (context entry point) doğrular; GL’siz CI runner’ında
100
+ context oluşturma başarısızlığı artık sahte “leak” olarak raporlanmaz.
101
+ CI browser gate’leri ayrıca Mesa GL kütüphanelerini kurar, böylece GL
102
+ sunan runner’larda `fingerprint_report` gerçek WebGL değerlerini okur.
103
+ - `lib/` içindeki gömülü wheel HEAD kaynağından yeniden üretildi: Obscura
104
+ screenshot guard’ı, stealth/agent/reliability modülleri ve güncel Zig
105
+ sidecar dahil — npm paketinin taşıdığı wheel ile kaynak ağacı senkron
106
+ kalır.
107
+
108
+ ## [0.3.7] — 2026-08-06
109
+
110
+ ### Eklenen
111
+ - Gerçek Camoufox/Mirage akışı için canlı DOM snapshot/event cursor sözleşmesi;
112
+ stale node, reset ve dropped durumları artık ajanı yeni snapshot almaya zorlar.
113
+ - CI üzerinde Playwright veya sahte e2e yerine checkout'tan derlenen Zig sidecar,
114
+ resmi Camoufox ve zorunlu gerçek browser testlerinden oluşan release gate'i.
115
+
116
+ ### Düzeltilen
117
+ - Mirage çağrıları, DOM/input/network/storage/screencast ve iframe işlemlerinde
118
+ doğru page/session sahipliğine sabitlendi; paralel sekmeler birbirine karışmaz.
119
+ - Sidecar IPC ve process lifecycle hataları artık yutulmadan fail-closed davranır;
120
+ screenshot, upload, accessibility ve network yanıtları bounded hale getirildi.
121
+ - npm launcher her kurulumda gömülü wheel'i günceller ve Camoufox binary'sini
122
+ hazırlar; npm release sorgusu ağ/auth hatalarını yanlışlıkla başarı saymaz.
123
+ - GitLab gerçek-browser job'u Firefox'u Docker root olarak çalıştırmaz; npm
124
+ publish artık release-check yanında real-e2e kapısına da bağlıdır.
125
+ - CI image'ına Camoufox'un GTK/DBus/audio/X11 runtime bağımlılıkları eklendi;
126
+ testten önce gerçek binary `--version` ile başlatılabilirliği doğrulanıyor.
127
+ - Network response-body çağrıları, request event'i gövde erişilebilir olmadan
128
+ geldğinde native completion yarışını sınırlı retry ile güvenle tamamlıyor.
129
+
130
+ ### Testler
131
+ - Gerçek Camoufox/Mirage uygulama suite'i: 120 passed.
132
+ - Zig sidecar testleri: 201/201 passed; ruff, compile, shell/YAML ve npm pack
133
+ release kontrolleri başarılı.
134
+
3
135
  ## [0.3.6] — 2026-08-06
4
136
 
5
137
  ### Düzeltilen
@@ -171,3 +303,5 @@ Tüm önemli değişiklikler bu dosyada tutulur. Format: [Keep a Changelog](http
171
303
  [0.1.8]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.1.7...v0.1.8
172
304
  [0.1.7]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.1.6...v0.1.7
173
305
  [0.3.6]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.3.5...v0.3.6
306
+ [0.3.7]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.3.6...v0.3.7
307
+ [0.3.8]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.3.7...v0.3.8
package/README.md CHANGED
@@ -16,7 +16,7 @@ AI modeller Chrome'un içine girip sayfa gezip kod çalıştırabilir ama CDP'yi
16
16
 
17
17
  56 domain, 667 komut, 237 event, 609 type — Chrome 148 protokolü gömülü.
18
18
 
19
- ## 109 Tool · 4 Kategori Ailesi · 2 Engine
19
+ ## 139 Tool · 4 Kategori Ailesi · 2 Engine
20
20
 
21
21
  Tool'lar engine-ayrımlı kategori dosyalarında (`kahin/tools/`): paylaşılan çekirdek + Obscura + Camoufox aileleri.
22
22
 
@@ -29,10 +29,10 @@ Tool'lar engine-ayrımlı kategori dosyalarında (`kahin/tools/`): paylaşılan
29
29
  | DEJA_VU — Debug | CDP event geçmişi, network istekleri, console mesajları | 4 |
30
30
  | PROPHECY — Pattern DB | Kullanım desenlerini öğren, sorgula, öner | 5 |
31
31
  | HEALER | Hata istatistikleri | 1 |
32
- | MIRAGE — Camoufox Native (77) | Juggler protokolü üstünde gerçek-zamanlı DOM stream, DOM, Input, PageEx, Tab, Network, Storage, Emulation, Dialog/Download/Worker/WS, Upload, Screencast, Accessibility, Engine sağlığı | 77 |
32
+ | MIRAGE — Camoufox Native (107) | Juggler protokolü üstünde gerçek-zamanlı DOM stream, DOM, Reliability, Input, PageEx, Tab, Network, Storage, Emulation, Dialog/Download/Worker/WS, Upload, Screencast, Accessibility, Engine sağlığı/istatistik, Agent-native snapshot/form/state/identity/status, Stealth audit/insansı girdi/identity rotasyonu/proxy-geo | 107 |
33
33
  | OBSCURA — Ayrı kategori | Obscura'ya özel tool'lar (hazırlanıyor) | 0 |
34
34
 
35
- **Toplam: 109 tool.**
35
+ **Toplam: 139 tool.**
36
36
 
37
37
  ## Bir satırda özet
38
38
 
@@ -40,7 +40,9 @@ CDP'yi bilmeyen AI'a Chrome'u kontrol etmeyi öğreten, yanlış yapınca düzel
40
40
 
41
41
  ## Kurulum
42
42
 
43
- Zorunlu: Python 3.12+ · Chrome/Chromium · Node.js 18+ (npm launcher için)
43
+ Zorunlu: Python 3.12+ · Node.js 18+ (npm launcher için). Kahin'in varsayılan
44
+ Camoufox binary'si kurulum sırasında resmi `camoufox fetch` komutuyla hazır edilir;
45
+ Chrome/Chromium kurulumu gerekmez.
44
46
 
45
47
  ### Otomatik kurulum — tek komut
46
48
 
@@ -104,9 +106,12 @@ Camoufox (Juggler native) ile:
104
106
  → kahin_mirage_set_user_agent / set_viewport / set_geolocation
105
107
  → kahin_mirage_set_file_chooser_intercept(true) → kahin_mirage_upload_files(["/abs/path"])
106
108
  → kahin_mirage_screencast_start → kahin_mirage_screencast_frame (base64 JPEG)
107
- → kahin_mirage_accessibility_tree → kahin_engine_health
109
+ → kahin_mirage_accessibility_tree → kahin_engine_health → kahin_engine_stats
108
110
  → kahin_mirage_dom_start → kahin_mirage_dom_snapshot → kahin_mirage_dom_events
109
111
  → kahin_mirage_dom_action (snapshot'tan alınan canlı nodeId ile)
112
+ → kahin_mirage_snapshot (ref'li ajan görünümü) → kahin_mirage_fill_form
113
+ → kahin_mirage_state_save/load → kahin_identity_new/save/list/delete/report
114
+ → kahin_agent_status (agent döngüsü özeti)
110
115
  ```
111
116
 
112
117
  `kahin_browser_start` tek bir Camoufox/sidecar süreci açar. İlk sayfa işlemi
@@ -156,15 +161,15 @@ Kahin'de hata loglama ve kendini onarma sistemi gömülüdür:
156
161
 
157
162
  ```
158
163
  oracle.py → MCP server (bootstrap: mcp instance + engine lifecycle + main)
159
- tools/ → 109 tool, engine-ayrımlı kategori dosyaları
164
+ tools/ → 139 tool, engine-ayrımlı kategori dosyaları
160
165
  _common.py → capability routing, _safe_cdp, _require_engine, _auto_learn
161
166
  the_twins/capabilities → motor-yetenek sözleşmesi ve Mirage yükseltme matrisi
162
167
  grimoire/seraph/prophecy/healer → CDP bilgi + doğrulama + pattern (paylaşılan)
163
168
  pilot/trainman/dejavu → browser/session/debug (paylaşılan)
164
169
  pilot_mirage/trainman_mirage/dejavu_mirage → Camoufox DOM+Input+PageEx / Tab / Network+Console
165
170
  storage_mirage/emulation_mirage/dialog_mirage → Storage / Emulation / Dialog+Download+Worker+WS
166
- pilot_obscura/trainman_obscura/dejavu_obscura → Obscura ayrı kategoriler (hazırlanıyor)
167
- engine.py → engine_health
171
+ pilot_obscura/trainman_obscura/dejavu_obscura → Shadow için ayrılmış paket sınırları; sahte tool kaydetmez
172
+ engine.py → engine_health + engine_stats
168
173
  _healer.py → Hata yönetimi, loglama, kendini onarma
169
174
  the_source/architect → CDP şema motoru (56 domain, 667 komut)
170
175
  the_twins/shadow → Obscura engine (gerçek Obscura binary, WebSocket CDP)
@@ -185,7 +190,8 @@ camoufox-harness/ → Zig sidecar (Juggler protocol, vendor binary gömül
185
190
  - [x] **Tek tık kurulum** — `pnpm add -g @kahinmcp/kahin`, sonra `kahin` (ilk çalıştırmada Python ortamını otomatik kurar)
186
191
  - [ ] **Zero-dependency** hedefi (Go/Rust portu)
187
192
  - [ ] **LSP modu** — kod içinde hata yakalama, AI'a yanlışını yüzüne vurma
188
- - [x] **Tool sayısı 109** — Camoufox Juggler-native 77 tool (gerçek-zamanlı DOM stream, DOM, Input, Network, Storage, Emulation, Dialog, Tab, Worker/WS, Upload, Screencast, Accessibility) + paylaşılan 32 çekirdek
193
+ - [x] **Tool sayısı 139** — Camoufox Juggler-native 107 tool (gerçek-zamanlı DOM stream, DOM, Reliability, Input, Network, Storage, Emulation, Dialog, Tab, Worker/WS, Upload, Screencast, Accessibility, Engine sağlığı/istatistik, Agent-native snapshot/form/state/identity/status, Stealth audit/humanized input/identity pins/proxy geo) + paylaşılan 32 çekirdek
194
+ - [x] **Faz 4 performans yüzeyi** — non-blocking Zig sidecar (N=20 probe: paralel duvar 56.89 → 8.71 ms, ratio 1.314 → 3.281), `kahin_engine_stats` (monotonic uptime + per-tool rollup, top_slow ≤ 10) ve identity başına bounded prewarm metadata (launch asla atlanmaz; dürüst reuse kaydı)
189
195
  - [ ] **Obscura ayrı tool'ları** — CDP-yeteneklerine özel pilot_obscura/trainman_obscura/dejavu_obscura kategorilerini doldur
190
196
 
191
197
  - [ ] **Gerçek zamanlı izleme** — AI'ın Kahin'i nasıl kullandığını canlı gör
@@ -207,7 +213,7 @@ camoufox-harness/ → Zig sidecar (Juggler protocol, vendor binary gömül
207
213
  ## Geliştirme
208
214
 
209
215
  ```bash
210
- uv run pytest tests/ # 109 tests (all pass when Camoufox is available)
216
+ uv run pytest -q tests/ # gerçek motor mevcutsa E2E dahil tam suite
211
217
  uv run ruff check kahin/ # lint
212
218
  uv run python -m kahin.oracle # manuel başlatma
213
219
  ```
package/bin/kahin.mjs CHANGED
@@ -14,6 +14,10 @@ const PY = process.platform === "win32" ? join(VENV, "Scripts", "python.exe") :
14
14
  function sh(cmd, args, opts = {}) {
15
15
  return new Promise((resolve) => {
16
16
  const c = spawn(cmd, args, { stdio: ["ignore", "ignore", "pipe"], ...opts });
17
+ c.on("error", (err) => {
18
+ process.stderr.write(`[kahin] ${cmd} başlatılamadı: ${err.message}\n`);
19
+ resolve(1);
20
+ });
17
21
  c.stderr.on("data", (d) => process.stderr.write(`[kahin] ${d}`));
18
22
  c.on("close", (code) => resolve(code));
19
23
  });
@@ -41,6 +45,12 @@ const args = process.argv.slice(2);
41
45
  if (args[0] === "setup") {
42
46
  const { setup: registerClients } = await import("./setup.mjs");
43
47
  registerClients();
48
+ const { installPython } = await import("./setup.mjs");
49
+ const install = await installPython();
50
+ if (install && install.error) {
51
+ process.stderr.write(`[kahin] Python/Camoufox kurulumu başarısız (çıkış ${install.error})\n`);
52
+ process.exit(1);
53
+ }
44
54
  process.exit(0);
45
55
  }
46
56
 
package/bin/setup.mjs CHANGED
@@ -324,10 +324,12 @@ export function setup() {
324
324
  const KAHIN_HOME = process.env.KAHIN_HOME || join(homedir(), ".local", "share", "kahin");
325
325
  const KAHIN_VENV = join(KAHIN_HOME, "venv");
326
326
  const KAHIN_PY = process.platform === "win32" ? join(KAHIN_VENV, "Scripts", "python.exe") : join(KAHIN_VENV, "bin", "python");
327
- const KAHIN_WHEEL = join(dirname(fileURLToPath(import.meta.url)), "..", "lib", "kahin-0.3.6-py3-none-any.whl");
327
+ const KAHIN_WHEEL = join(dirname(fileURLToPath(import.meta.url)), "..", "lib", "kahin-0.3.8-py3-none-any.whl");
328
328
 
329
- // Gömülü wheel'i venv'e kurar. Postinstall'da ve `kahin setup`'ta çalışır.
330
- // PyPI'a bağımlı DEĞİL — wheel paketle birlikte gelir.
329
+ // Gömülü wheel'i venv'e kurar ve varsayılan Camoufox binary'sini hazırlar.
330
+ // PyPI'a bağımlı DEĞİL — wheel paketle birlikte gelir; wheel'in bağımlılıkları
331
+ // (Camoufox dahil) pip tarafından kurulup resmi `camoufox fetch` ile tarayıcı
332
+ // cache'i doldurulur.
331
333
  export async function installPython() {
332
334
  if (process.env.KAHIN_SKIP_PYTHON) {
333
335
  log("python kurulumu atlandı (KAHIN_SKIP_PYTHON)");
@@ -347,24 +349,35 @@ export async function installPython() {
347
349
  return { error: code };
348
350
  }
349
351
  }
350
- const check = await run(KAHIN_PY, ["-c", "import kahin; print(kahin.__version__)"]);
351
- if (check === 0) {
352
- log("kahin zaten kurulu, atlandı");
353
- return { installed: true };
354
- }
355
352
  log(`wheel kuruluyor: ${KAHIN_WHEEL}`);
356
353
  const code = await run(KAHIN_PY, ["-m", "pip", "install", "--upgrade", KAHIN_WHEEL]);
357
354
  if (code !== 0) {
358
355
  log(`wheel kurulamadı (çıkış ${code})`);
359
356
  return { error: code };
360
357
  }
361
- log("kahin python paketi kuruldu");
362
- return { installed: true };
358
+ log("kahin python paketi kuruldu/güncellendi");
359
+
360
+ if (process.env.KAHIN_SKIP_CAMOUFOX_FETCH) {
361
+ log("Camoufox fetch atlandı (KAHIN_SKIP_CAMOUFOX_FETCH)");
362
+ return { installed: true, camoufox: "skipped" };
363
+ }
364
+ log("Camoufox browser hazırlanıyor (resmi camoufox fetch)...");
365
+ const browserCode = await run(KAHIN_PY, ["-m", "camoufox", "fetch"]);
366
+ if (browserCode !== 0) {
367
+ log(`Camoufox browser hazırlanamadı (çıkış ${browserCode}); kahin browser_start sırasında tekrar deneyecek`);
368
+ return { installed: true, camoufox: "error", error: browserCode };
369
+ }
370
+ log("Camoufox browser hazır");
371
+ return { installed: true, camoufox: "ready" };
363
372
  }
364
373
 
365
374
  function run(cmd, args) {
366
375
  return new Promise((resolve) => {
367
376
  const c = spawn(cmd, args, { stdio: ["ignore", "ignore", "pipe"] });
377
+ c.on("error", (err) => {
378
+ process.stderr.write(`[kahin] ${cmd} başlatılamadı: ${err.message}\n`);
379
+ resolve(1);
380
+ });
368
381
  c.stderr.on("data", (d) => process.stderr.write(`[kahin] ${d}`));
369
382
  c.on("close", (code) => resolve(code));
370
383
  });
@@ -372,5 +385,6 @@ function run(cmd, args) {
372
385
 
373
386
  if (process.argv[1] && process.argv[1].endsWith("setup.mjs")) {
374
387
  setup();
375
- installPython();
388
+ const result = await installPython();
389
+ if (result?.error) process.exitCode = 1;
376
390
  }
@@ -141,8 +141,8 @@ Snapshot alanlarının anlamı:
141
141
  - `value`: input/textarea/select/contenteditable için gelir; password input
142
142
  değeri `[redacted]` olur.
143
143
  - `actions`: node'un doğrudan desteklediği `click`, `focus`, `type`, `select`
144
- ipuçlarını gösterir. `select` bu ilk action yüzeyinde uygulanmaz; select
145
- için mevcut DOM/evaluate veya daha özel tool sözleşmesini kullan.
144
+ ipuçlarını gösterir. `select` için `kahin_mirage_dom_action(action="select", text=...)`
145
+ option value veya görünen metinle gerçek input/change event'lerini gönderir.
146
146
  - `cursor`: o snapshot anındaki son sequence numarasıdır. Delta okumaya bu
147
147
  cursor'dan devam edilir.
148
148
 
@@ -212,9 +212,14 @@ Navigation document'ı yeniler ve nodeId'leri geçersiz kılar. Her frame'in
212
212
  document'ı kendi `streamId`'sine sahiptir; `frame_id` verilirse snapshot,
213
213
  event ve action aynı frame context'inde çalışır.
214
214
 
215
+ Not: `reset`/`dropped` tespiti, çağrıya geçtiğiniz `stream_id` ile sayfadaki
216
+ mevcut `streamId`'yi karşılaştırır. `dom_start`'ten aldığınız `streamId`'yi
217
+ her `dom_events` çağrısında geçirin; `stream_id` verilmezse navigation sessiz
218
+ kalır ve eski cursor yeni document'ın event'leriyle karışabilir.
219
+
215
220
  ### 3.4 Live action sözleşmesi
216
221
 
217
- İzin verilen action'lar: `click`, `hover`, `focus`, `type`, `scroll`.
222
+ İzin verilen action'lar: `click`, `hover`, `focus`, `type`, `scroll`, `select`.
218
223
 
219
224
  - `click` ve `hover`, node'un gerçek viewport koordinatını ölçer ve
220
225
  `Page.dispatchMouseEvent` gönderir.
@@ -222,6 +227,8 @@ event ve action aynı frame context'inde çalışır.
222
227
  `text` zorunludur.
223
228
  - `focus`, canlı node'u focus eder.
224
229
  - `scroll`, node'u görünür alana `scrollIntoView` ile getirir.
230
+ - `select`, `<select>` üzerinde option value veya görünen metinle eşleşir ve
231
+ gerçek `input`/`change` event'leri gönderir. `text` zorunludur.
225
232
  - Node bağlı değilse hiçbir replacement node'a fallback yapılmaz; yapılandırılmış
226
233
  `stale_node`/`requiresSnapshot` döner.
227
234
 
@@ -276,7 +283,7 @@ script'i ayrıca evaluate eder. Observer sayfa tarafında bounded olduğu için
276
283
 
277
284
  ## 6. Juggler tool kataloğu (A-Z)
278
285
 
279
- Aşağıdaki liste Mirage'ın 77 Juggler-native tool'unun tamamıdır. `MIRAGE`
286
+ Aşağıdaki liste Mirage'ın 107 Juggler-native tool'unun tamamıdır. `MIRAGE`
280
287
  tool'ları `engine="mirage"` aktifken kullanılır.
281
288
 
282
289
  ### DOM gözlem ve adaptif action (5)
@@ -296,6 +303,15 @@ tool'ları `engine="mirage"` aktifken kullanılır.
296
303
  - `kahin_mirage_hover`, `kahin_mirage_get_html`
297
304
  - `kahin_mirage_wait_selector`, `kahin_mirage_get_value`
298
305
 
306
+ ### Reliability (9)
307
+
308
+ - `kahin_mirage_expect`
309
+ - `kahin_mirage_check`, `kahin_mirage_uncheck`
310
+ - `kahin_mirage_select_option`, `kahin_mirage_dblclick`
311
+ - `kahin_mirage_drag`
312
+ - `kahin_mirage_wait_for_text`, `kahin_mirage_wait_for_timeout`
313
+ - `kahin_mirage_route`
314
+
299
315
  ### Input (7)
300
316
 
301
317
  - `kahin_mirage_mouse_click`, `kahin_mirage_mouse_move`
@@ -308,11 +324,11 @@ tool'ları `engine="mirage"` aktifken kullanılır.
308
324
  - `kahin_mirage_reload`, `kahin_mirage_go_back`, `kahin_mirage_go_forward`
309
325
  - `kahin_mirage_stop`, `kahin_mirage_frame_tree`, `kahin_mirage_page_content`
310
326
 
311
- ### Tab/session (6)
327
+ ### Tab/session (7)
312
328
 
313
329
  - `kahin_mirage_tab_new`, `kahin_mirage_tab_switch`, `kahin_mirage_tab_close`
314
330
  - `kahin_mirage_tab_list`, `kahin_mirage_tab_bring_front`
315
- - `kahin_mirage_context_new`
331
+ - `kahin_mirage_context_new`, `kahin_mirage_context_close`
316
332
 
317
333
  ### Network/console (10)
318
334
 
@@ -359,10 +375,68 @@ frame'i bekler. Sayfa mutation'ı veya viewport değişiminden sonra görsel
359
375
  doğrulama için bu yol kullanılmalıdır; varsayılan `fresh=false` ise kuyruktaki
360
376
  en eski frame FIFO olarak döner.
361
377
 
362
- ### Accessibility ve health (2)
378
+ ### Accessibility ve engine (3)
363
379
 
364
380
  - `kahin_mirage_accessibility_tree`
365
381
  - `kahin_engine_health`
382
+ - `kahin_engine_stats` — monotonic clock ile uptime + healer tracker'dan
383
+ bounded per-tool rollup (`tool_calls`, `tool_errors`, `top_slow` ≤ 10,
384
+ `last_error`); Mirage aktifse `prewarm` metadata'sı; engine yoksa
385
+ yapılandırılmış `engine_unavailable` yanıtı (asla hata fırlatmaz)
386
+
387
+ ### Agent-native (10)
388
+
389
+ - `kahin_mirage_snapshot` — canlı DOM ağacını token bütçeli, ref'li satırlara
390
+ çevirir; her ref canlı `nodeId`'dir ve `dom_action` üzerinde doğrudan
391
+ çalışır (`truncated` asla sessiz değildir)
392
+ - `kahin_mirage_fill_form` — `{ref, text}` listesiyle birden fazla alanı
393
+ doldurur; stale ref `requiresSnapshot: true` ile döner
394
+ - `kahin_mirage_state_save` / `kahin_mirage_state_load` — url + cookie +
395
+ local/sessionStorage'ı mutlak yola kaydeder/geri yükler (load önce
396
+ kaydedilen url'e gider; storage origin'e bağlıdır)
397
+ - `kahin_identity_new` / `kahin_identity_save` / `kahin_identity_list` /
398
+ `kahin_identity_delete` — Camoufox fingerprint kimlikleri (yeni/manuel/
399
+ listele/sil); `kahin_browser_start(identity=...)` ile başlatmada uygulanır
400
+ - `kahin_identity_report` — aktif engine'in kimlik özeti + sayfa-içi canlı
401
+ `navigator.userAgent` (set_user_agent onayından uydurulmaz)
402
+ - `kahin_agent_status` — agent döngüsü özeti: engine/alive, url/title/
403
+ readyState, tabCount/currentTab, `refsLive` + `domCursor` (gerçek DOM-stream
404
+ bookkeeping; snapshot sonrası live, reset/dropped/stale/stop sonrası geçersiz),
405
+ pendingDialogs, networkEvents, consoleMessages, identity; engine yoksa
406
+ yapılandırılmış idle yanıt döner ve asla hata fırlatmaz
407
+
408
+ ### Stealth ve anti-detect (9)
409
+
410
+ - `kahin_stealth_audit` — salt-okunur leak probe paketi (14 check: webdriver,
411
+ cdp-markers, binding-hidden, plugins, languages, platform, oscpu,
412
+ timezone-sane, screen-sane, prototype-integrity, permissions-api, webgl,
413
+ audio, hardware-concurrency); skor `{passed, total, ratio}` ile döner,
414
+ hiçbir check atlanmaz (bilinmeyen → fail + `detail:"unsupported"`)
415
+ - `kahin_mirage_mouse_trajectory` — jitter'lı Bézier fare yörüngesi
416
+ (steps ≤ 200, jitter ≤ 20px, seed'li deterministik); bitiş noktası birebir
417
+ pinlenir
418
+ - `kahin_mirage_click_humanized` — yörüngeli + insansı gecikmeli gerçek DOM
419
+ tıklaması (mousedown+mouseup)
420
+ - `kahin_mirage_key_text` (çapraz liste) — jitter'lı tuş cadence'i ile metin yazma
421
+ (`delay_ms=0` → hızlı yol; gerçek keydown/keyup çiftleri); Input (7) altında
422
+ sayılır — tek kayıt, Stealth sayımına dahil değil
423
+ - `kahin_identity_pin` / `kahin_identity_unpin` / `kahin_identity_pins` /
424
+ `kahin_identity_for_domain` — domain başına identity rotasyon politikası;
425
+ kanonik domain anahtarlı, bounded ve doğrulanmış `~/.config/kahin/pins.json`
426
+ - `kahin_fingerprint_report` — canlı sayfa evaluate'sinden sitenin göreceği
427
+ fingerprint (userAgent/platform/oscpu/languages/timezone/locale/screen/
428
+ viewport/WebGL); kanıt her zaman sayfadan, asla emülasyon onayından gelmez
429
+ - `kahin_proxy_resolve` — proxy üzerinden exit-IP geo çözümü +
430
+ timezone/locale/geolocation önerisi; URL'deki kimlik bilgileri asla
431
+ yankılanmaz; `browser_start(proxy=...)` ile gerçek proxy env uygulanır,
432
+ aktif engine config'iyle çakışma `engine_config_conflict` döner
433
+
434
+ Stealth CI kapısı: `KAHIN_REQUIRE_STEALTH=1` altında audit ratio ≥ 0.8 ve
435
+ identity rotasyonu tam fingerprint özetini değiştirmek zorundadır;
436
+ `scripts/stealth-regression.py` drift-watcher'ı sabitlenmiş
437
+ `camoufox-harness/tests/perf/stealth-baseline.json` ile karşılaştırır
438
+ (0 = temiz, 1 = yeni leak, 2 = ortam; baseline yalnızca
439
+ `KAHIN_UPDATE_BASELINE=1` ile yeniden yazılır).
366
440
 
367
441
  ## 7. Hazır akışlar
368
442
 
@@ -404,14 +478,16 @@ dom_events(after_seq=C, stream_id=S, frame_id=F, wait_ms=5000)
404
478
 
405
479
  | Hata/sinyal | Sebep | Kurtarma |
406
480
  |---|---|---|
407
- | `Browser engine is not running` | Start yok | `kahin_browser_start()` |
408
- | `Browser engine is dead` | Sidecar/Camoufox öldü | `kahin_browser_stop`, sonra yeni `start` |
481
+ | `No browser engine running. Use kahin_browser_start first.` | Start yok | `kahin_browser_start()` |
482
+ | `Browser engine is dead (crashed). Use kahin_browser_stop, then kahin_browser_start to restart.` | Sidecar/Camoufox öldü | `kahin_browser_stop`, sonra yeni `start` |
409
483
  | `stale_node` | Node silindi veya document değişti | Snapshot + yeni nodeId |
410
484
  | `reset`/`dropped` | Stream değişti veya ring overflow | Snapshot; eski cursor'u bırak |
411
485
  | `not_found` | Selector artık yok | Event/snapshot ile yeni hedef bul |
412
486
  | `truncated` | Snapshot cap'i küçük | Selector veya cap daralt/genişlet |
413
487
  | `unsupported_action` | Action allow-list dışında | Yalnızca desteklenen action kullan |
414
488
  | `not_text_input` | Hedef textbox değil | Role/name/action ipuçlarını tekrar değerlendir |
489
+ | `not_select` | `action=select` hedefi `<select>` değil | Snapshot'taki action ipuçlarını tekrar değerlendir |
490
+ | `option_not_found` | Option value/görünen metin eşleşmedi | Snapshot/events ile option value'larını doğrula, `text`'i düzelt |
415
491
  | `Method not found` | Juggler'da CDP methodu yok/yanlış | Validate + get command/dependency; native Mirage tool seç |
416
492
 
417
493
  Hata alınca aynı hatayı körlemesine tekrarlama. Önce state'i yeniden oku,
@@ -421,6 +497,22 @@ gerekirse `kahin_error_decode` ve `kahin_get_dependencies` kullan.
421
497
 
422
498
  - DOM snapshot ve event payload'ları cap'lidir; bounded sonuçlar ajana açıkça
423
499
  `truncated`, `pending`, `reset` ve `dropped` durumlarını verir.
500
+ - Sidecar istek işleme non-blocking'dir: birden fazla istek aynı anda
501
+ in-flight olabilir, stdin işleme browser yanıtını asla bloklamaz; IPC
502
+ sözleşmesi (id-matching, event forwarding, timeouts, death detection)
503
+ değişmez. N=20 `Runtime.evaluate` concurrency probe'u
504
+ `camoufox-harness/tests/perf/concurrency.md`'dedir (paralel duvar
505
+ 56.89 → 8.71 ms, ratio 1.314 → 3.281).
506
+ - `kahin_engine_stats` `top_slow` değeri ortalama süreye göre en yavaş 10
507
+ araçla sınırlıdır; tracker process-genelidir, bu yüzden tek bir hızlı
508
+ aracın listede olması garanti edilmez (rollup şekli ve `tool_calls`
509
+ sayaçları güvenilir sinyallerdir).
510
+ - Identity profile prewarm bir **metadata/reuse kaydıdır**, cache değildir:
511
+ stabil identity hash + ölçülen hazırlık süreleri (`options_ms`,
512
+ `profile_ms`, `hits`, `starts`) in-process (max 8, FIFO) ve
513
+ `~/.cache/kahin/profiles/<hash>.json` içinde (≤ 4 KiB, tmp+rename) tutulur;
514
+ gerçek launch işi asla atlanmaz (per-launch rastgelelik korunur) ve
515
+ metadata kimlik payload'ı içermez.
424
516
  - Password input değerleri snapshot/event descriptor'larında redacted olur.
425
517
  - `attributes` tam HTML değildir; güvenli kimlik ve erişilebilirlik alanlarıyla
426
518
  sınırlıdır. Tam HTML gerekiyorsa bunun maliyetini bilerek
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kahinmcp/kahin",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "Kahin \u2014 CDP ansiklopedisi + anti-detect browser otomasyon MCP sunucusu. Kurulumda 22 AI CLI arac\u0131n\u0131 otomatik tespit edip kendini kaydeder. Camoufox g\u00f6rsel varsay\u0131land\u0131r; Obscura h\u0131zl\u0131 CDP i\u015fleri i\u00e7in opt-in'dir.",
5
5
  "bin": {
6
6
  "kahin": "bin/kahin.mjs"
Binary file