@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
|
-
##
|
|
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 (
|
|
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:
|
|
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/ →
|
|
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
|
-
- [
|
|
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ı
|
|
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/ #
|
|
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.
|
|
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.
|
|
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.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"
|