@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 +134 -0
- package/README.md +16 -10
- package/bin/kahin.mjs +10 -0
- package/bin/setup.mjs +25 -11
- package/docs/juggler-ai-native.md +101 -9
- package/lib/kahin-0.3.8-py3-none-any.whl +0 -0
- package/package.json +1 -1
- package/lib/kahin-0.3.6-py3-none-any.whl +0 -0
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
|
-
##
|
|
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 (
|
|
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:
|
|
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+ ·
|
|
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/ →
|
|
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 →
|
|
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ı
|
|
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/
|
|
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.
|
|
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
|
|
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
|
-
|
|
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`
|
|
145
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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
|
-
| `
|
|
408
|
-
| `Browser engine is dead
|
|
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.
|
|
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
|