@kahinmcp/kahin 0.3.3 → 0.3.4

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,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.4] — 2026-08-05
4
+
5
+ ### Eklenen
6
+ - Mirage/Juggler için gerçek-zamanlı DOM stream: bounded semantic snapshot,
7
+ cursor tabanlı MutationObserver + input/focus/click/change event delta'ları,
8
+ reset/dropped sinyalleri ve canlı nodeId action yüzeyi.
9
+ - `kahin_mirage_dom_start`, `kahin_mirage_dom_snapshot`,
10
+ `kahin_mirage_dom_events`, `kahin_mirage_dom_action`,
11
+ `kahin_mirage_dom_stop` olmak üzere 5 yeni tool.
12
+ - Ajanların source okumadan kullanacağı [AI-native Juggler kılavuzu](docs/juggler-ai-native.md).
13
+
14
+ ### Değişen
15
+ - MCP server instructions artık adaptive Mirage DOM akışını, cursor/reset ve
16
+ canlı nodeId kurallarını doğrudan ajana bildiriyor.
17
+
18
+ ### Testler
19
+ - Gerçek Camoufox e2e: DOM snapshot + delta + canlı type/click action ve
20
+ navigation sonrası stream reset regresyonları.
21
+
3
22
  Tüm önemli değişiklikler bu dosyada tutulur. Format: [Keep a Changelog](https://keepachangelog.com/tr/1.1.0/) — [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
23
 
5
24
  ## [0.3.3] — 2026-08-05
@@ -103,6 +122,7 @@ Tüm önemli değişiklikler bu dosyada tutulur. Format: [Keep a Changelog](http
103
122
  - Zig Juggler harness: pipe transport, Browser/Page/Runtime/Network/Input/Emulation adapters, interception, process manager, perf + crash-recovery
104
123
  - CDP ansiklopedisi: 56 domain, 667 komut, 237 event, 609 type (Chrome 148)
105
124
 
125
+ [0.3.4]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.3.3...v0.3.4
106
126
  [0.3.3]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.3.2...v0.3.3
107
127
  [0.3.2]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.3.1...v0.3.2
108
128
  [0.2.0]: https://gitlab.com/void0x14/kahin-mcp/-/compare/v0.1.8...v0.2.0
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
- ## 104 Tool · 4 Kategori Ailesi · 2 Engine
19
+ ## 109 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 (72) | Juggler protokolü üstünde DOM, Input, PageEx, Tab, Network, Storage, Emulation, Dialog/Download/Worker/WS, Upload, Screencast, Accessibility, Engine sağlığı | 72 |
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 |
33
33
  | OBSCURA — Ayrı kategori | Obscura'ya özel tool'lar (hazırlanıyor) | 0 |
34
34
 
35
- **Toplam: 104 tool.**
35
+ **Toplam: 109 tool.**
36
36
 
37
37
  ## Bir satırda özet
38
38
 
@@ -99,6 +99,8 @@ Camoufox (Juggler native) ile, engine `mirage` seçilince:
99
99
  → kahin_mirage_set_file_chooser_intercept(true) → kahin_mirage_upload_files(["/abs/path"])
100
100
  → kahin_mirage_screencast_start → kahin_mirage_screencast_frame (base64 JPEG)
101
101
  → kahin_mirage_accessibility_tree → kahin_engine_health
102
+ → kahin_mirage_dom_start → kahin_mirage_dom_snapshot → kahin_mirage_dom_events
103
+ → kahin_mirage_dom_action (snapshot'tan alınan canlı nodeId ile)
102
104
  ```
103
105
 
104
106
  `kahin_browser_start` tek bir Camoufox/sidecar süreci açar. İlk sayfa işlemi
@@ -108,7 +110,8 @@ yerine `kahin_mirage_tab_new` ve `kahin_mirage_tab_switch` kullanın. Camoufox
108
110
  aktifken `kahin_execute_cdp` ve diğer CDP araçları, eşdeğer Juggler/Mirage
109
111
  çağrısına otomatik yönlendirilir ve CDP biçimli sonuç döndürür.
110
112
 
111
- Tam liste için: [AGENTS.md](AGENTS.md)
113
+ Tam liste için: [AGENTS.md](AGENTS.md). Juggler'ın ajan sözleşmesi ve gerçek-zamanlı
114
+ DOM akışı için [AI-native Juggler kılavuzuna](docs/juggler-ai-native.md) bakın.
112
115
 
113
116
  ## Proje Felsefesi
114
117
 
@@ -142,7 +145,7 @@ Kahin'de hata loglama ve kendini onarma sistemi gömülüdür:
142
145
 
143
146
  ```
144
147
  oracle.py → MCP server (bootstrap: mcp instance + engine lifecycle + main)
145
- tools/ → 104 tool, engine-ayrımlı kategori dosyaları
148
+ tools/ → 109 tool, engine-ayrımlı kategori dosyaları
146
149
  _common.py → _safe_cdp, _require_engine, _auto_learn
147
150
  grimoire/seraph/prophecy/healer → CDP bilgi + doğrulama + pattern (paylaşılan)
148
151
  pilot/trainman/dejavu → browser/session/debug (paylaşılan)
@@ -163,14 +166,14 @@ camoufox-harness/ → Zig sidecar (Juggler protocol, vendor binary gömül
163
166
 
164
167
  ## 🗺️ Yol Haritası
165
168
 
166
- - [ ] **Juggler protokolü** için de uçtan uca dökümantasyon,kullanım ve pratik örnekleri desteği eklenmesi
169
+ - [x] **Juggler protokolü** için AI-native uçtan uca dokümantasyon, kullanım ve pratik örnekleri
167
170
  - [x] **Camoufox entegrasyonu tamamlandı** — gerçek Camoufox (Zig sidecar + Juggler pipe) ile native çalışıyor; engine seçimi ajan tarafından `shadow`/`mirage` parametresiyle yapılıyor
168
171
  - [x] **Obscura entegrasyonu tamamlandı** — gerçek Obscura binary'si (WebSocket CDP) ile çalışıyor, startup problemleri giderildi
169
172
  - [ ] **SKILLS** destekleri ve konfigre edilebilir kişsiel hazır skills oluşturma özelliği
170
173
  - [x] **Tek tık kurulum** — `pnpm add -g @kahinmcp/kahin`, sonra `kahin` (ilk çalıştırmada Python ortamını otomatik kurar)
171
174
  - [ ] **Zero-dependency** hedefi (Go/Rust portu)
172
175
  - [ ] **LSP modu** — kod içinde hata yakalama, AI'a yanlışını yüzüne vurma
173
- - [x] **Tool sayısı 104** — Camoufox Juggler-native 72 tool (DOM, Input, Network, Storage, Emulation, Dialog, Tab, Worker/WS, Upload, Screencast, Accessibility) + paylaşılan 32 çekirdek
176
+ - [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
174
177
  - [ ] **Obscura ayrı tool'ları** — CDP-yeteneklerine özel pilot_obscura/trainman_obscura/dejavu_obscura kategorilerini doldur
175
178
 
176
179
  - [ ] **Gerçek zamanlı izleme** — AI'ın Kahin'i nasıl kullandığını canlı gör
@@ -192,7 +195,7 @@ camoufox-harness/ → Zig sidecar (Juggler protocol, vendor binary gömül
192
195
  ## Geliştirme
193
196
 
194
197
  ```bash
195
- uv run pytest tests/ # 84 test (83 pass, 1 skip)
198
+ uv run pytest tests/ # 109 tests (all pass when Camoufox is available)
196
199
  uv run ruff check kahin/ # lint
197
200
  uv run python -m kahin.oracle # manuel başlatma
198
201
  ```
package/bin/setup.mjs CHANGED
@@ -324,7 +324,7 @@ 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.3-py3-none-any.whl");
327
+ const KAHIN_WHEEL = join(dirname(fileURLToPath(import.meta.url)), "..", "lib", "kahin-0.3.4-py3-none-any.whl");
328
328
 
329
329
  // Gömülü wheel'i venv'e kurar. Postinstall'da ve `kahin setup`'ta çalışır.
330
330
  // PyPI'a bağımlı DEĞİL — wheel paketle birlikte gelir.
@@ -0,0 +1,436 @@
1
+ # Kahin Juggler: AI-native kullanım kılavuzu
2
+
3
+ Bu belge, bir ajanın Camoufox/Mirage tarayıcısını kaynak kodu okumadan
4
+ kullanabilmesi için sözleşmeyi anlatır. Mirage, Chrome CDP'si değildir:
5
+ Kahin'in Zig sidecar'ı gerçek Juggler mesajlarını JSONL olarak taşır ve MCP
6
+ tool'ları bu yüzeyi ajana güvenli, yapılandırılmış bir biçimde sunar.
7
+
8
+ ## 1. Zihinsel model
9
+
10
+ ```text
11
+ MCP tool
12
+ -> Kahin Mirage adapter
13
+ -> Zig sidecar (Juggler JSONL)
14
+ -> Camoufox Page/Browser
15
+ ```
16
+
17
+ - `engine="mirage"` bir Camoufox süreci ve tek bir sidecar başlatır.
18
+ - İlk sayfa ilk sayfa tool'u çağrıldığında tembel olarak oluşturulur.
19
+ - Aynı browser'ı ve aktif sekmeyi yeniden kullan. Başka sayfa gerektiğinde
20
+ yeni browser açmak yerine `kahin_mirage_tab_new` ve
21
+ `kahin_mirage_tab_switch` kullan.
22
+ - Juggler'da `Browser.*` browser köküne, `Page.*` ise aktif target/session'a
23
+ aittir. MCP araçları session routing'i ajandan saklar.
24
+ - `kahin_execute_cdp`, Mirage aktifken desteklenen CDP çağrılarını Juggler
25
+ eşdeğerine yönlendirir; Juggler'da bulunmayan her CDP domain'i varmış gibi
26
+ tahmin etme.
27
+
28
+ ## 2. Ajanın temel protokolü
29
+
30
+ Dinamik bir sayfada güvenilir akış şöyledir:
31
+
32
+ ```text
33
+ browser_start(mirage)
34
+ -> navigate
35
+ -> dom_start
36
+ -> dom_snapshot
37
+ -> [dom_events(after_seq, stream_id, wait_ms)]*
38
+ -> dom_action(live_node_id)
39
+ -> dom_snapshot veya evaluate ile doğrulama
40
+ ```
41
+
42
+ Zorunlu kurallar:
43
+
44
+ 1. Bilmediğin bir CDP methodunu göndermeden önce
45
+ `kahin_validate_command` kullan. Hata sonrası
46
+ `kahin_error_decode` ile düzeltmeyi öğren.
47
+ 2. CSS selector'ı eylem kimliği olarak uzun süre saklama. Snapshot'taki
48
+ `nodeId`, o document/frame içindeki canlı node'a bağlıdır.
49
+ 3. `reset`, `dropped` veya `requiresSnapshot` görüldüğünde eski node/cursor
50
+ bilgisine güvenme; yeni snapshot al.
51
+ 4. `truncated=true` tam sayfa anlamına gelmez. Selector, `max_nodes` veya
52
+ `max_depth` ile alanı daralt.
53
+ 5. Bir input'a yazdıktan, tıkladıktan veya navigation yaptıktan sonra sonucu
54
+ gözlemle. Eylem yanıtı tek başına uygulama başarısı değildir.
55
+
56
+ ## 3. Gerçek zamanlı DOM vericisi
57
+
58
+ DOM stream sayfanın kendi `MutationObserver`'ını ve DOM event listener'larını
59
+ kullanır. Sayfa tarafında bounded bir ring buffer tutulur; sidecar yalnızca
60
+ değişiklik sinyali taşır. Böylece hızlı bir sayfa, sidecar reader'ını büyük
61
+ DOM payload'ları ile bloke etmez.
62
+
63
+ ### 3.1 Tool sözleşmesi
64
+
65
+ | Tool | Amaç | Önemli parametreler |
66
+ |---|---|---|
67
+ | `kahin_mirage_dom_start` | Observer'ı mevcut ve sonraki document'lara kurar | `max_events`, `frame_id` |
68
+ | `kahin_mirage_dom_snapshot` | Sınırlandırılmış, anlamsal canlı ağaç döndürür | `selector`, `max_nodes`, `max_depth`, `include_hidden`, `text_limit`, `frame_id` |
69
+ | `kahin_mirage_dom_events` | Cursor sonrasındaki delta/event'leri okur | `after_seq`, `stream_id`, `limit`, `wait_ms`, `frame_id` |
70
+ | `kahin_mirage_dom_action` | Snapshot nodeId'si üzerinde allow-list eylemi yapar | `node_id`, `action`, `text`, `frame_id` |
71
+ | `kahin_mirage_dom_stop` | Mevcut frame observer'ını ve ring'i kapatır | `frame_id` |
72
+
73
+ `dom_start` sonucu ajanın saklaması gereken kimlik:
74
+
75
+ ```json
76
+ {
77
+ "status": "started",
78
+ "stream": {
79
+ "streamId": "mdd1-abc123",
80
+ "cursor": 0,
81
+ "revision": 0,
82
+ "pending": 0,
83
+ "active": true,
84
+ "url": "https://example.test/app",
85
+ "readyState": "complete"
86
+ }
87
+ }
88
+ ```
89
+
90
+ Snapshot sonucu, action için gereken `nodeId` ile birlikte anlamsal bilgi
91
+ verir:
92
+
93
+ ```json
94
+ {
95
+ "streamId": "mdd1-abc123",
96
+ "cursor": 4,
97
+ "revision": 4,
98
+ "url": "https://example.test/app",
99
+ "readyState": "complete",
100
+ "nodeCount": 8,
101
+ "truncated": false,
102
+ "focused": null,
103
+ "root": {
104
+ "nodeId": "n1",
105
+ "tag": "main",
106
+ "role": "main",
107
+ "name": "Account",
108
+ "text": "Name Save",
109
+ "visible": true,
110
+ "rect": {"x": 0, "y": 0, "width": 800, "height": 180},
111
+ "attributes": {"id": "account"},
112
+ "actions": [],
113
+ "children": [
114
+ {
115
+ "nodeId": "n4",
116
+ "tag": "input",
117
+ "role": "textbox",
118
+ "name": "Name",
119
+ "value": "",
120
+ "actions": ["focus", "type"]
121
+ }
122
+ ]
123
+ }
124
+ }
125
+ ```
126
+
127
+ Snapshot alanlarının anlamı:
128
+
129
+ - `role`, `name`, `text`: ajanın selector tahmini yerine kullanıcıya görünen
130
+ hedefi anlamasına yardım eder.
131
+ - `visible`, `rect`: görünürlük ve gerçek viewport geometrisidir.
132
+ - `attributes`: yalnızca güvenli tanımlayıcı/erişilebilirlik özniteliklerinin
133
+ bounded alt kümesidir.
134
+ - `value`: input/textarea/select/contenteditable için gelir; password input
135
+ değeri `[redacted]` olur.
136
+ - `actions`: node'un doğrudan desteklediği `click`, `focus`, `type`, `select`
137
+ ipuçlarını gösterir. `select` bu ilk action yüzeyinde uygulanmaz; select
138
+ için mevcut DOM/evaluate veya daha özel tool sözleşmesini kullan.
139
+ - `cursor`: o snapshot anındaki son sequence numarasıdır. Delta okumaya bu
140
+ cursor'dan devam edilir.
141
+
142
+ ### 3.2 Delta ve event akışı
143
+
144
+ ```json
145
+ {
146
+ "streamId": "mdd1-abc123",
147
+ "cursor": 7,
148
+ "revision": 7,
149
+ "reset": false,
150
+ "dropped": false,
151
+ "pending": 2,
152
+ "url": "https://example.test/app",
153
+ "events": [
154
+ {
155
+ "seq": 6,
156
+ "timestamp": 1780000000000,
157
+ "type": "childList",
158
+ "target": {"nodeId": "n1", "tag": "main"},
159
+ "added": [{"nodeId": "n8", "tag": "button", "role": "button", "name": "Save"}],
160
+ "removed": [],
161
+ "addedCount": 1,
162
+ "removedCount": 0
163
+ },
164
+ {
165
+ "seq": 7,
166
+ "timestamp": 1780000000010,
167
+ "type": "event",
168
+ "event": "input",
169
+ "target": {"nodeId": "n4", "tag": "input", "role": "textbox", "value": "Ada"}
170
+ }
171
+ ]
172
+ }
173
+ ```
174
+
175
+ `MutationObserver` kaynaklı `attributes`, `characterData` ve `childList`
176
+ event'lerine ek olarak `input`, `change`, `focusin`, `focusout` ve `click`
177
+ sayfa event'leri verilir. Bu event'ler neden-sonuç sinyalidir; tam güncel
178
+ durum için snapshot yetkilidir.
179
+
180
+ `dom_events` için önerilen çağrı:
181
+
182
+ ```json
183
+ {
184
+ "after_seq": 4,
185
+ "stream_id": "mdd1-abc123",
186
+ "limit": 100,
187
+ "wait_ms": 30000
188
+ }
189
+ ```
190
+
191
+ `wait_ms` en fazla 30 saniyeye clamp edilir. Yeni event gelirse veya timeout
192
+ olursa tool döner; ajan bunu kendi gözlem döngüsünde tekrar çağırabilir.
193
+
194
+ ### 3.3 Cursor güvenliği
195
+
196
+ | Durum | Anlam | Ajanın yapacağı |
197
+ |---|---|---|
198
+ | `reset=false`, `dropped=false` | Cursor hâlâ geçerli | Event'leri işle, cursor'u ilerlet |
199
+ | `reset=true` | Farklı document/streamId ile okuma yapıldı | Snapshot al, yeni `streamId`/cursor sakla |
200
+ | `dropped=true` | Eski delta ring buffer'dan düştü veya stream değişti | Snapshot al; eski event'leri birleştirmeye çalışma |
201
+ | `truncated=true` | Snapshot cap'i ağacın tamamını içermedi | Selector/cap ile daha dar snapshot al |
202
+ | `requiresSnapshot=true` | Node silindi, navigation oldu veya action stale | Yeni snapshot al, yeni nodeId seç |
203
+
204
+ Navigation document'ı yeniler ve nodeId'leri geçersiz kılar. Her frame'in
205
+ document'ı kendi `streamId`'sine sahiptir; `frame_id` verilirse snapshot,
206
+ event ve action aynı frame context'inde çalışır.
207
+
208
+ ### 3.4 Live action sözleşmesi
209
+
210
+ İzin verilen action'lar: `click`, `hover`, `focus`, `type`, `scroll`.
211
+
212
+ - `click` ve `hover`, node'un gerçek viewport koordinatını ölçer ve
213
+ `Page.dispatchMouseEvent` gönderir.
214
+ - `type`, canlı node'u focus eder ve gerçek `Page.insertText` çağrısı yapar.
215
+ `text` zorunludur.
216
+ - `focus`, canlı node'u focus eder.
217
+ - `scroll`, node'u görünür alana `scrollIntoView` ile getirir.
218
+ - Node bağlı değilse hiçbir replacement node'a fallback yapılmaz; yapılandırılmış
219
+ `stale_node`/`requiresSnapshot` döner.
220
+
221
+ Örnek:
222
+
223
+ ```json
224
+ {
225
+ "node_id": "n4",
226
+ "action": "type",
227
+ "text": "Ada"
228
+ }
229
+ ```
230
+
231
+ Başarılı action sonrası en az bir doğrulama yap:
232
+
233
+ ```text
234
+ dom_snapshot(selector="#name")
235
+ veya
236
+ kahin_evaluate("document.querySelector('#name').value")
237
+ ```
238
+
239
+ ## 4. Frame ve sekme kullanımı
240
+
241
+ 1. `kahin_mirage_tab_list` ile target'ları gör.
242
+ 2. `kahin_mirage_tab_new` ile sayfa aç veya
243
+ `kahin_mirage_tab_switch(target_id)` ile geç.
244
+ 3. `kahin_mirage_frame_tree` ile frame hiyerarşisini al.
245
+ 4. Frame içindeki DOM tool'larına `frame_id` ver.
246
+
247
+ Frame tool'ları `frame_id` için aynı aktif target'ın main-world execution
248
+ context'ini kullanır. Frame ayrıldığında context ve nodeId artık geçersizdir;
249
+ yeniden frame tree + snapshot gerekir.
250
+
251
+ ## 5. Juggler gerçeği: hangi primitive ne yapıyor?
252
+
253
+ DOM stream sahte CDP `DOM.*` event'leri üretmez. Camoufox Juggler'da mevcut
254
+ olmayan bir domain'i taklit etmek yerine gerçek browser primitives birleştirilir:
255
+
256
+ | Primitive | Rol |
257
+ |---|---|
258
+ | `Browser.addBinding` | Sayfa ile sidecar arasında düşük hacimli notify köprüsü |
259
+ | `Browser.setInitScripts` | Yeni document/frame'lerde stream init script'ini çalıştırır |
260
+ | `Page.bindingCalled` | Python tarafını uyandıran sinyal; DOM payload'ı taşımaz |
261
+ | `Runtime.evaluate` | Snapshot, delta drain ve action state'i sayfadan ister |
262
+ | `MutationObserver` | Gerçek DOM mutation kayıtlarını üretir |
263
+ | `Page.dispatchMouseEvent` | Click/hover için gerçek Juggler input |
264
+ | `Page.insertText` | Focus edilmiş input'a gerçek text insertion |
265
+
266
+ Init script gelecekteki document'ları kapsar; mevcut document için Kahin
267
+ script'i ayrıca evaluate eder. Observer sayfa tarafında bounded olduğu için
268
+ `dom_events` cursor olmadan geçmişi sınırsız saklamaz.
269
+
270
+ ## 6. Juggler tool kataloğu (A-Z)
271
+
272
+ Aşağıdaki liste Mirage'ın 77 Juggler-native tool'unun tamamıdır. `MIRAGE`
273
+ tool'ları `engine="mirage"` aktifken kullanılır.
274
+
275
+ ### DOM gözlem ve adaptif action (5)
276
+
277
+ - `kahin_mirage_dom_start`
278
+ - `kahin_mirage_dom_snapshot`
279
+ - `kahin_mirage_dom_events`
280
+ - `kahin_mirage_dom_action`
281
+ - `kahin_mirage_dom_stop`
282
+
283
+ ### DOM query/action (12)
284
+
285
+ - `kahin_mirage_query`, `kahin_mirage_query_all`
286
+ - `kahin_mirage_click`, `kahin_mirage_type`
287
+ - `kahin_mirage_get_text`, `kahin_mirage_get_attribute`
288
+ - `kahin_mirage_set_attribute`, `kahin_mirage_focus`
289
+ - `kahin_mirage_hover`, `kahin_mirage_get_html`
290
+ - `kahin_mirage_wait_selector`, `kahin_mirage_get_value`
291
+
292
+ ### Input (7)
293
+
294
+ - `kahin_mirage_mouse_click`, `kahin_mirage_mouse_move`
295
+ - `kahin_mirage_mouse_down`, `kahin_mirage_mouse_up`
296
+ - `kahin_mirage_key_press`, `kahin_mirage_key_text`
297
+ - `kahin_mirage_scroll`
298
+
299
+ ### PageEx (6)
300
+
301
+ - `kahin_mirage_reload`, `kahin_mirage_go_back`, `kahin_mirage_go_forward`
302
+ - `kahin_mirage_stop`, `kahin_mirage_frame_tree`, `kahin_mirage_page_content`
303
+
304
+ ### Tab/session (6)
305
+
306
+ - `kahin_mirage_tab_new`, `kahin_mirage_tab_switch`, `kahin_mirage_tab_close`
307
+ - `kahin_mirage_tab_list`, `kahin_mirage_tab_bring_front`
308
+ - `kahin_mirage_context_new`
309
+
310
+ ### Network/console (10)
311
+
312
+ - `kahin_mirage_network_requests`, `kahin_mirage_get_response_body`
313
+ - `kahin_mirage_intercept_requests`, `kahin_mirage_unintercept_requests`
314
+ - `kahin_mirage_network_continue`, `kahin_mirage_network_abort`
315
+ - `kahin_mirage_cache_disable`, `kahin_mirage_clear_cache`
316
+ - `kahin_mirage_console_log`, `kahin_mirage_errors_list`
317
+
318
+ ### Storage (6)
319
+
320
+ - `kahin_mirage_cookie_get`, `kahin_mirage_cookie_set`, `kahin_mirage_cookie_clear`
321
+ - `kahin_mirage_storage_local_get`, `kahin_mirage_storage_local_set`
322
+ - `kahin_mirage_storage_session_get`
323
+
324
+ ### Emulation (10)
325
+
326
+ - `kahin_mirage_set_user_agent`, `kahin_mirage_set_viewport`
327
+ - `kahin_mirage_set_device_scale_factor`, `kahin_mirage_set_media`
328
+ - `kahin_mirage_set_touch`, `kahin_mirage_set_color_scheme`
329
+ - `kahin_mirage_set_reduced_motion`, `kahin_mirage_set_locale`
330
+ - `kahin_mirage_set_timezone`, `kahin_mirage_set_geolocation`
331
+
332
+ ### Dialog/download/worker/WebSocket (7)
333
+
334
+ - `kahin_mirage_dialog_list`, `kahin_mirage_dialog_accept`,
335
+ `kahin_mirage_dialog_dismiss`
336
+ - `kahin_mirage_download_list`, `kahin_mirage_download_save`
337
+ - `kahin_mirage_worker_list`, `kahin_mirage_websocket_list`
338
+
339
+ ### Upload (2)
340
+
341
+ - `kahin_mirage_set_file_chooser_intercept`
342
+ - `kahin_mirage_upload_files`
343
+
344
+ ### Screencast (4)
345
+
346
+ - `kahin_mirage_screencast_start`, `kahin_mirage_screencast_frame`
347
+ - `kahin_mirage_screencast_stop`, `kahin_mirage_screencast_pending`
348
+
349
+ ### Accessibility ve health (2)
350
+
351
+ - `kahin_mirage_accessibility_tree`
352
+ - `kahin_engine_health`
353
+
354
+ ## 7. Hazır akışlar
355
+
356
+ ### 7.1 Dinamik form doldurma
357
+
358
+ ```text
359
+ 1. kahin_browser_start(engine="mirage", headless=true)
360
+ 2. kahin_navigate(url="https://example.test/account")
361
+ 3. kahin_mirage_dom_start(max_events=512)
362
+ 4. kahin_mirage_dom_snapshot()
363
+ 5. textbox nodeId'si ile kahin_mirage_dom_action(action="type", text="Ada")
364
+ 6. kahin_mirage_dom_snapshot(selector="#name") ile value doğrula
365
+ 7. Save button nodeId'si ile dom_action(action="click")
366
+ 8. kahin_mirage_dom_events(after_seq=..., stream_id=..., wait_ms=5000)
367
+ 9. Sonuç panelini snapshot/evaluate ile doğrula
368
+ ```
369
+
370
+ ### 7.2 SPA navigation veya hydration bekleme
371
+
372
+ ```text
373
+ dom_start
374
+ snapshot -> (streamId=S, cursor=C)
375
+ dom_events(after_seq=C, stream_id=S, wait_ms=30000)
376
+ event geldiyse: ilgili subtree'yi yeniden snapshot et
377
+ reset/dropped geldiyse: full snapshot al, S/C'yi yenile
378
+ timeout olduysa: küçük bir snapshot veya uygulama-ready kontrolü yap
379
+ ```
380
+
381
+ ### 7.3 Iframe
382
+
383
+ ```text
384
+ frame_tree -> frame_id=F
385
+ dom_snapshot(frame_id=F)
386
+ dom_action(node_id=N, action="click", frame_id=F)
387
+ dom_events(after_seq=C, stream_id=S, frame_id=F, wait_ms=5000)
388
+ ```
389
+
390
+ ## 8. Hata kurtarma matrisi
391
+
392
+ | Hata/sinyal | Sebep | Kurtarma |
393
+ |---|---|---|
394
+ | `Browser engine is not running` | Start yok | `kahin_browser_start(engine="mirage")` |
395
+ | `Browser engine is dead` | Sidecar/Camoufox öldü | `kahin_browser_stop`, sonra yeni `start` |
396
+ | `stale_node` | Node silindi veya document değişti | Snapshot + yeni nodeId |
397
+ | `reset`/`dropped` | Stream değişti veya ring overflow | Snapshot; eski cursor'u bırak |
398
+ | `not_found` | Selector artık yok | Event/snapshot ile yeni hedef bul |
399
+ | `truncated` | Snapshot cap'i küçük | Selector veya cap daralt/genişlet |
400
+ | `unsupported_action` | Action allow-list dışında | Yalnızca desteklenen action kullan |
401
+ | `not_text_input` | Hedef textbox değil | Role/name/action ipuçlarını tekrar değerlendir |
402
+ | `Method not found` | Juggler'da CDP methodu yok/yanlış | Validate + get command/dependency; native Mirage tool seç |
403
+
404
+ Hata alınca aynı hatayı körlemesine tekrarlama. Önce state'i yeniden oku,
405
+ gerekirse `kahin_error_decode` ve `kahin_get_dependencies` kullan.
406
+
407
+ ## 9. Güvenlik ve sınırlar
408
+
409
+ - DOM snapshot ve event payload'ları cap'lidir; bounded sonuçlar ajana açıkça
410
+ `truncated`, `pending`, `reset` ve `dropped` durumlarını verir.
411
+ - Password input değerleri snapshot/event descriptor'larında redacted olur.
412
+ - `attributes` tam HTML değildir; güvenli kimlik ve erişilebilirlik alanlarıyla
413
+ sınırlıdır. Tam HTML gerekiyorsa bunun maliyetini bilerek
414
+ `kahin_mirage_get_html` veya `kahin_mirage_page_content` kullan.
415
+ - `kahin_mirage_dom_action` allow-list dışı JavaScript çalıştırmaz.
416
+ `kahin_evaluate` genel amaçlıdır; sayfa verisi ve yan etkiler bakımından
417
+ ayrıca değerlendirilmelidir.
418
+ - DOM event'i uygulamanın başarılı olduğunu kanıtlamaz. Her write/click
419
+ sonrasında görünür sonucu veya state'i doğrula.
420
+
421
+ ## 10. Kaynak ve tasarım kararları
422
+
423
+ Bu tasarımda browser gözlemi için gerçek web platformu `MutationObserver`,
424
+ Juggler binding/init-script surface'i ve bounded cursor modeli kullanılır.
425
+ CDP DOM domain'indeki node-id/document reset fikriyle aynı güvenlik kuralı
426
+ uygulanır: document değişince eski node truth değildir.
427
+
428
+ - [MDN MutationObserver](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe)
429
+ - [Chrome DevTools Protocol DOM domain](https://chromedevtools.github.io/devtools-protocol/tot/DOM/)
430
+ - [Playwright Page API: init scripts and page lifecycle](https://playwright.dev/docs/api/class-page)
431
+ - [Model Context Protocol server concepts](https://modelcontextprotocol.io/docs/learn/server-concepts)
432
+
433
+ MCP resource subscription her istemci/SDK sürümünde aynı şekilde mevcut
434
+ olmadığından, taşınabilir ilk sözleşme tool + bounded long-poll'dur. İleride
435
+ resource subscription eklense bile `streamId`, `cursor`, `reset` ve
436
+ `dropped` kuralları değişmemelidir.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kahinmcp/kahin",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Kahin — CDP ansiklopedisi + anti-detect browser otomasyon MCP sunucusu. Kurulumda 22 AI CLI aracını otomatik tespit edip kendini kaydeder. Obscura ve Camoufox motorlarını kullanır, motor seçimini ajana bırakır.",
5
5
  "bin": {
6
6
  "kahin": "bin/kahin.mjs"
@@ -14,7 +14,8 @@
14
14
  "lib",
15
15
  "LICENSE",
16
16
  "CHANGELOG.md",
17
- "README.md"
17
+ "README.md",
18
+ "docs/juggler-ai-native.md"
18
19
  ],
19
20
  "engines": {
20
21
  "node": ">=18"