
AI एजेंटों के लिए ब्राउज़र स्वचालन, वेब क्रॉलिंग, और iOS + Android डिवाइस नियंत्रण। Zig-मूल, टोकन-कुशल CDP स्नैपशॉट, HAR रिकॉर्डिंग, नेटिव adb वायर-प्रोटोकॉल क्लाइंट, और एक स्टैंडअलोन फ़ेचर।
curl -fsSL https://kuri.trilok.ai/download | sh
macOS arm64/x86_64 और Linux x86_64/arm64. एकल बाइनरी, कोई रनटाइम निर्भरता नहीं।
सीधे डाउनलोड: [macOS arm64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-aarch64-macos.tar.gz) · [macOS x86_64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-x86_64-macos.tar.gz) · [Linux x86_64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-x86_64-linux.tar.gz) · [Linux arm64](https://kuri.trilok.ai/download/v0.6.0/kuri-v0.6.0-aarch64-linux.tar.gz)
---
**AI एजेंटों के लिए ब्राउज़र स्वचालन और वेब क्रॉलिंग। Zig में लिखा गया। शून्य Node.js।**
CDP ऑटोमेशन · A11y स्नैपशॉट · HAR रिकॉर्डिंग · स्टैंडअलोन फ़ेचर · इंटरैक्टिव टर्मिनल ब्राउज़र · एजेंटिक CLI · सुरक्षा परीक्षण · iOS + Android डिवाइस नियंत्रण
[त्वरित आरंभ](#-quick-start) · [बेंचमार्क](#-benchmarks) · [kuri-agent](#-kuri-agent) · [सुरक्षा परीक्षण](#-security-testing) · [API](#-http-api) · [कौशल](#-skills) · [परिवर्तन लॉग](https://github.com/justrach/kuri/blob/HEAD/CHANGELOG.md)
> **टीमें Kuri पर क्यों स्विच करती हैं:** वर्तमान Apple Silicon `ReleaseFast` बिल्ड प्रति बाइनरी 2 MB से कम रहते हैं, और 2026-04-23 को Google Flights के एक नए रीरन में पूरे `kuri-agent` लूप (`go→snap→click→snap→eval`) के लिए **3,392 टोकन** मापे गए। कोई प्रतिशत बताने से पहले क्रॉस-टूल डेल्टा को उसी वातावरण में दोबारा चलाया जाना चाहिए।
---
## Kuri एजेंटों के लिए क्यों जीतता है
अधिकांश ब्राउज़र टूलिंग QA इंजीनियरों के लिए बनाई गई थी। Kuri एजेंट लूप के लिए बनाया गया है: पेज पढ़ें, टोकन लागत कम रखें, स्थिर refs पर कार्य करें, और आगे बढ़ें।
- **135 HTTP एंडपॉइंट** — React निरीक्षण से Core Web Vitals तक, agent-browser और browser-use के साथ पूर्ण समानता।
- **वास्तविक पेजों पर agent-browser की तुलना में 7-12% कम टोकन**, `@eN` ref प्रारूप और ज़ीरो-प्रीफ़िक्स रेंडरिंग की बदौलत।
- **44x हल्के अवलोकन** — `/page/state` (48 टोकन) बनाम उसी Google Flights पेज का पूर्ण स्नैपशॉट (2,124 टोकन)।
- **बैच निष्पादन** — `POST /batch` एक HTTP कॉल में N कमांड भेजता है, जिससे N-1 राउंड-ट्रिप और N-1 LLM टर्न समाप्त हो जाते हैं।
- **React-संगत** — विश्वसनीय CDP माउस इवेंट और प्रति-कैरेक्टर की-इवेंट React 18/19 के `onClick` और `onChange` को ट्रिगर करते हैं।
### स्नैपशॉट टोकन: Google Flights `SIN → TPE`
इस वर्कस्पेस में 2026-05-24 को नया रीरन, `wc -c` और `chars/4` अनुमान से मापा गया।
| टूल / मोड | वर्ण | ~टोकन | नोट |
|---|---:|---:|---|
| `kuri snap` (पूर्ण) | 8,499 | **2,124** | सभी नोड + इंटरैक्टिव refs |
| `kuri snap` (केवल इंटरैक्टिव) | ~3,000 | **~750** | एजेंट लूप के लिए सर्वोत्तम |
| `kuri /page/state` | 190 | **48** | हल्का अवलोकन (url, शीर्षक, scroll%, गणनाएँ) |
| agent-browser snap (अनुमानित) | ~9,183 | **~2,295** | `[ref=e0]` प्रारूप ओवरहेड |
### टोकन दक्षता: kuri बनाम agent-browser
| पेज | kuri टोकन | agent-browser टोकन | बचत |
|---|---:|---:|---|
| example.com | 40 | 35 | -13% (साधारण पेज, agent-browser रूट छोड़ देता है) |
| Hacker News | 386 | ~440 | **12% कम** |
| Google Flights SIN→TPE | 2,124 | ~2,295 | **7% कम** |
बचत kuri के कॉम्पैक्ट प्रारूप से आती है:
- `@e0` refs (3 अक्षर) बनाम `[ref=e0]` (9 अक्षर)
- प्रति पंक्ति कोई `- ` उपसर्ग नहीं (2 अक्षर × पंक्ति गिनती बचाता है)
- समान इंडेंटेशन, समान नोड फ़िल्टरिंग
### पूर्ण वर्कफ़्लो लागत: `go → snap → click → snap → eval`
| टूल | प्रति चक्र टोकन |
|---|---:|
| **kuri-agent** | **~3,400** |
| दूसरे snap के बजाय `/page/state` के साथ | **~1,700** |
| `POST /batch` के साथ (सब कुछ एक कॉल में) | **~1,700** (समान टोकन, 5 के बजाय 1 HTTP कॉल) |
### kuri बनाम libretto
[libretto](https://github.com/saffron-health/libretto) (Playwright + Node) प्रति-चरण टोकन लागत पर सबसे नज़दीकी प्रतियोगी है। 2026-07-04 को आमने-सामने मापा गया — एक ही Chrome, एक ही टैब, वास्तविक `tiktoken` `o200k_base` गणनाएँ (पूर्ण कार्यप्रणाली और पुनरुत्पादन: **[benchmarks/libretto_comparison.md](https://github.com/justrach/kuri/blob/HEAD/benchmarks/libretto_comparison.md)**)। सच्चा विभाजन:
| अक्ष | विजेता | विवरण |
|---|---|---|
| प्रति कॉल विलंबता | **kuri** | 4–117 ms बनाम 1,344–1,500 ms (**13–376× तेज़** — स्थायी सर्वर बनाम प्रति-कमांड Node) |
| स्नैपशॉट टोकन, सामान्य पेज | **kuri** | साधारण पेज 61 बनाम 151 (2.5×), लेख 265 बनाम 363 (1.37×) — सघन व्याकरण |
| स्नैपशॉट टोकन, बड़ी सूची | विभाजित | kuri डिफ़ॉल्ट 4,424 बनाम 813 — kuri सभी 259 refs जारी करता है, libretto डिफ़ॉल्ट रूप से छोटा कर देता है। `limit=5` के साथ kuri 555 टोकन रेंडर करता है (**libretto से 1.46× कम**), 34 refs + `… +45 more` मार्कर |
| ट्रैजेक्टरी (फ़ीड, 9 क्लिक) | **kuri**, बमुश्किल | 898 बनाम 939 टोकन (`limit=5` आधार + diff लूप बनाम exec लूप) — बराबरी से थोड़ी बढ़त तक; सुबह का 5.1× नुकसान बिना ट्रंकेशन वाला आधार था |
| दोहराए जाने वाले रन | **libretto** | ट्रैजेक्टरी को Playwright स्क्रिप्ट में संकलित करता है → 0-टोकन रीप्ले; kuri हर रन पर लूप की लागत फिर से चुकाता है |
**libretto का अध्ययन करके kuri ने क्या हासिल किया** (यह सब इस रिलीज़ में शामिल है): एक diff-प्रथम लूप (`take_snapshot_diff`, ~38 टोकन/चरण); एक अनुकूली diff जो नेविगेशन पर `! page replaced` हेडर के साथ पूर्ण स्नैपशॉट पर वापस आ जाता है; केवल-पहचान वाली निष्कासन पंक्तियाँ; स्क्रीनशॉट डिस्क पर लिखे जाते हैं (पथ लौटाया जाता है, बाइट्स कभी संदर्भ में नहीं आते); MCP पर `get_page_state`; और — `parseA11yNodes` को एक वास्तविक DFS ट्री वॉक के रूप में फिर से लिखने के बाद — **ऑप्ट-इन सूची ट्रंकेशन** (`/snapshot?limit=N`, प्रति सीमित रन एक `… +K more` पंक्ति), **स्कोप्ड पुनः-कैप्चर** (`scope=@ref`), और **पदानुक्रम इंडेंटेशन**, जो MCP `take_snapshot` पर `uid`/`limit` के रूप में भी उजागर होते हैं। वह 9-क्लिक फ़ीड ट्रैजेक्टरी, जो साधारण पूर्ण री-स्नैपशॉट के साथ 44,285 टोकन खर्च करती थी, अब ट्रंकेटेड आधार + diffs के साथ **898** की लागत आती है — 49× सस्ती, और libretto के 939 से भी आगे।
> ऊपर दी गई पुरानी तालिकाएँ `chars/4` टोकन अनुमान का उपयोग करती हैं; libretto तुलना वास्तविक `tiktoken` गणनाओं का उपयोग करती है। कोई प्रतिशत बताने से पहले क्रॉस-टूल संख्याओं को अपने स्वयं के वातावरण में दोबारा चलाएँ।
### बाइनरी आकार और मेमोरी
Apple M4 Pro, macOS 26.4.1 पर मापा गया। वर्तमान बाइनरी `-Doptimize=ReleaseFast` के साथ बनाई गई थीं।
| बाइनरी | वर्तमान आकार |
|---|---:|
| `kuri` | 1,093,840 B (1.04 MiB) |
| `kuri-agent` | 629,904 B (615 KiB) |
| `kuri-browse` | 1,089,120 B (1.04 MiB) |
| `kuri-fetch` | 2,063,488 B (1.97 MiB) |
### Zig 0.16 माइग्रेशन में RSS स्थिर रहा
वर्तमान `v0.4.3` `ReleaseFast` बिल्ड के विरुद्ध `/usr/bin/time -l` से मापा गया।
| कमांड | `v0.4.3` औसत अधिकतम RSS |
|---|---:|
| `kuri-fetch --version` | ~2.45 MiB |
| `kuri-browse --version` | ~2.45 MiB |
| `kuri-fetch --quiet --dump markdown http://example.com/` | ~9.17 MiB |
## समस्या
हर ब्राउज़र ऑटोमेशन टूल अपने साथ Playwright (~300 MB), एक Node.js रनटाइम, और npm निर्भरताओं का झरना खींच लाता है। आपका AI एजेंट बस एक पेज पढ़ना, एक बटन क्लिक करना, और आगे बढ़ना चाहता है।
**Kuri एक एकल Zig बाइनरी है।** चार मोड, शून्य रनटाइम:```
kuri → CDP server (Chrome automation, a11y snapshots, HAR)
kuri-fetch → standalone fetcher (no Chrome, QuickJS for JS, ~2 MB)
kuri-browse → interactive terminal browser (navigate, follow links, search)
kuri-agent → agentic CLI (scriptable Chrome automation + security testing)
curl -fsSL https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/install.sh | sh
आपके प्लेटफ़ॉर्म का पता लगाता है, सही बाइनरी डाउनलोड करता है, और `~/.local/bin` में इंस्टॉल करता है।
डाउनलोड Kuri के स्व-प्रबंधित `release-channel` ब्रांच से आते हैं। macOS बाइनरी को Developer ID प्रमाणपत्र के साथ स्थानीय रूप से हस्ताक्षरित किया जाता है। GitHub Release एसेट्स इन्हीं टारबॉल्स को मिरर करते हैं।
### bun / npm```sh
bun install -g kuri-agent
# or: npm install -g kuri-agent
स्थापना के समय आपके प्लेटफ़ॉर्म के लिए सही नेटिव बाइनरी डाउनलोड करता है।
कुरी के स्थिर बाइनरी release-channel शाखा पर रहते हैं और सीधे GitHub raw URLs से परोसे जाते हैं।
https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/install.shhttps://raw.githubusercontent.com/justrach/kuri/release-channel/stable/latest.jsonhttps://github.com/justrach/kuri/tree/release-channel/stablehttps://raw.githubusercontent.com/justrach/kuri/release-channel/stable/<version>/kuri-<version>-<target>.tar.gzअपने प्लेटफ़ॉर्म के लिए टारबॉल को स्थिर रिलीज़ मेनिफेस्ट या GitHub Releases पृष्ठ से डाउनलोड करें और इसे अपने $PATH में अनपैक करें।
स्थिर इंस्टॉल URL:```sh curl -fsSL https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/install.sh | sh
मैनिफेस्ट में `aarch64-linux`, `x86_64-linux`, `aarch64-macos`, और `x86_64-macos` के लिए सटीक एसेट URL और SHA-256 चेकसम शामिल हैं।
### प्लेटफ़ॉर्म समर्थन
| प्लेटफ़ॉर्म | स्थिति |
|---|---|
| macOS (`aarch64`, `x86_64`) | पूर्व-निर्मित बाइनरी, हस्ताक्षरित + नोटरीकृत |
| Linux (`aarch64`, `x86_64`) | पूर्व-निर्मित बाइनरी |
| Windows (`x86_64`) | **प्रायोगिक — केवल क्रॉस-कंपाइल।** `zig build -Dtarget=x86_64-windows-gnu` CI-सत्यापित है, लेकिन Chrome स्वचालन, डेमॉनाइज़ेशन, सिग्नल-आधारित शटडाउन, HAR रिकॉर्डिंग, और फ़ाइल-आधारित प्रमाणीकरण स्टोर सभी रनटाइम पर `error.UnsupportedOnWindows` के साथ स्टब किए गए हैं। यदि आपको वास्तविक फीचर सेट चाहिए तो **WSL2** का उपयोग करें। ट्रैक किया गया: [#153](https://github.com/justrach/kuri/issues/153)। |
Kuri कई स्थानों पर POSIX प्रिमिटिव (`fork`, `clock_gettime`, रॉ सॉकेट) पर निर्भर करता है, इसलिए पूर्ण नेटिव Windows पोर्ट वास्तविक काम है। उपरोक्त कंपाइल-स्तरीय आधार रेखा `--version`/`--help` पथ और शुद्ध इन-मेमोरी ऑपरेशन चलाने की अनुमति देती है; पेचीदा हिस्से (Chrome, सॉकेट, daemonize) को स्टब सूची से हटने से पहले वास्तविक Win32 इम्प्लीमेंटेशन की आवश्यकता है। यदि आप उनमें से कोई भी कार्य अपने हाथ में लेना चाहते हैं, तो [#153](https://github.com/justrach/kuri/issues/153) को +1 करें या PR खोलें।
### स्रोत से निर्माण
इसके लिए [Zig ≥ 0.16.0](https://ziglang.org/download/) की आवश्यकता है।```bash
git clone https://github.com/justrach/kuri.git
cd kuri
zig build -Doptimize=ReleaseFast
# Binaries in zig-out/bin/: kuri kuri-agent kuri-fetch kuri-browse
आवश्यकताएँ: Zig ≥ 0.16.0 · Chrome/Chromium (CDP मोड के लिए)```bash git clone https://github.com/justrach/kuri.git cd kuri
zig build # build everything zig build test # run 252+ tests
./zig-out/bin/kuri
./zig-out/bin/kuri-fetch https://example.com
./zig-out/bin/kuri-browse https://example.com
(cd kuri-browser && zig build run -- render https://example.com) (cd kuri-browser && zig build run -- bench --offline)
### पहला रन, सबसे छोटा पथ```bash
# start the server; if CDP_URL is unset, kuri launches managed Chrome for you
./zig-out/bin/kuri
# discover tabs from that managed browser
curl -s http://127.0.0.1:8080/discover
# inspect the discovered tab list
curl -s http://127.0.0.1:8080/tabs
एजेंट-शैली HTTP उपयोग के लिए, हर कॉल पर tab_id दोहराने के बजाय एक सत्र हेडर और /tab/new, /page/info, और /snapshot का उपयोग करें।```bash
SESSION=hn-demo
BASE=http://127.0.0.1:8080
curl -s -H "X-Kuri-Session: $SESSION"
"$BASE/tab/new?url=https%3A%2F%2Fnews.ycombinator.com"
curl -s -H "X-Kuri-Session: $SESSION" "$BASE/page/info" SNAP=$(curl -s -H "X-Kuri-Session: $SESSION" "$BASE/snapshot?filter=interactive&format=compact") MORE_REF=$(printf '%s' "$SNAP" | python3 -c 'import re,sys; print(re.search(r""More" @(e\d+)", sys.stdin.read()).group(1))') curl -s -H "X-Kuri-Session: $SESSION" "$BASE/action?action=click&ref=$MORE_REF" curl -s -H "X-Kuri-Session: $SESSION" "$BASE/page/info"
`tools/kuri_harness.py` पर एक हल्का प्रयोगात्मक रैपर भी है, यदि आप उसी HTTP इंटरफ़ेस के ऊपर Python हेल्पर चाहते हैं।
यदि आपके पास पहले से ही रिमोट डीबगिंग के साथ Chrome चल रहा है, तो `CDP_URL` को WebSocket या HTTP एंडपॉइंट पर सेट करें:```bash
CDP_URL=ws://127.0.0.1:9222/devtools/browser/... ./zig-out/bin/kuri
# or
CDP_URL=http://127.0.0.1:9222 ./zig-out/bin/kuri
curl -s http://localhost:8080/discover
curl -s http://localhost:8080/tabs
curl -s "http://localhost:8080/navigate?tab_id=ABC123&url=https://vercel.com"
curl -s "http://localhost:8080/snapshot?tab_id=ABC123&filter=interactive"
---
## 🌐 HTTP API
सभी एंडपॉइंट JSON लौटाते हैं। वैकल्पिक प्रमाणीकरण `KURI_SECRET` env var के माध्यम से। **135 एंडपॉइंट** — agent-browser और browser-use के साथ पूर्ण समानता।
### मुख्य
| पथ | विवरण |
|------|-------------|
| `GET /health` | सर्वर स्थिति, टैब संख्या, संस्करण |
| `GET /tabs` | सभी पंजीकृत टैब की सूची |
| `GET /discover` | CDP के माध्यम से Chrome टैब स्वतः खोजें |
| `GET /tab/current` | `X-Kuri-Session` के लिए वर्तमान टैब प्राप्त करें या सेट करें |
| `GET /page/info` | सक्रिय टैब के लिए लाइव URL/शीर्षक/ready-state/व्यूपोर्ट/स्क्रॉल |
| `GET /page/state` | कॉम्पैक्ट पृष्ठ अवलोकन: url, शीर्षक, scroll%, व्यूपोर्ट, फ़ॉर्म/लिंक/छवियों/इनपुट की गिनती |
| `POST /batch` | एक HTTP कॉल में कई कमांड निष्पादित करें — परिणामों की सरणी लौटाता है |
| `GET /browdie` | 🌰 (ईस्टर एग) |
### ब्राउज़र नियंत्रण
| पथ | पैरामीटर | विवरण |
|------|--------|-------------|
| `GET /navigate` | `tab_id`, `url` | टैब को URL पर नेविगेट करें |
| `GET /tab/new` | `url`, `activate`, `wait` | एक नया टैब बनाएं और वैकल्पिक रूप से hydrate/वर्तमान टैब सेट करें |
| `GET /tab/close` | `tab_id` | एक टैब बंद करें |
| `GET /window/new` | `url`, `activate`, `wait` | एक नया विंडो/टैब लक्ष्य बनाएं |
| `GET /snapshot` | `tab_id`, `filter`, `format` | `eN` संदर्भों के साथ A11y ट्री स्नैपशॉट। कम-टोकन एजेंट लूप के लिए `filter=interactive&format=compact` उपयोग करें। |
| `GET /text` | `tab_id` | पृष्ठ टेक्स्ट निकालें |
| `GET /screenshot` | `tab_id`, `format`, `quality`, `save` | स्क्रीनशॉट कैप्चर करें (base64); `save=true` PNG को `STATE_DIR/screenshots` में लिखता है और इसके बजाय `{path,bytes}` लौटाता है |
| `GET /screenshot/annotated` | `tab_id` | क्रमांकित तत्व लेबल के साथ स्क्रीनशॉट |
| `GET /screenshot/diff` | `tab_id`, `baseline` | वर्तमान और बेसलाइन स्क्रीनशॉट के बीच दृश्य अंतर |
| `GET /action` | `tab_id`, `ref`, `action`, `value` | ref द्वारा क्लिक/टाइप/भरें/चुनें/स्क्रॉल/होवर/डबल-क्लिक/चेक/अनचेक/ब्लर |
| `GET /evaluate` | `tab_id`, `expression` | जावास्क्रिप्ट निष्पादित करें |
| `GET /evalhandle` | `tab_id`, `expression` | JS निष्पादित करें, objectId हैंडल लौटाएं (मान नहीं) |
| `GET /close` | `tab_id` | टैब बंद करें + सफाई |
| `GET /bringtofront` | `tab_id` | टैब को सामने लाएं |
### क्रियाएँ
| पथ | पैरामीटर | विवरण |
|------|--------|-------------|
| `GET /clear` | `ref` | इनपुट फ़ील्ड मान साफ़ करें |
| `GET /selectall` | `ref` | इनपुट/contenteditable में सभी टेक्स्ट चुनें |
| `GET /setvalue` | `ref`, `value` | इनपुट मान सीधे सेट करें (की इवेंट को बायपास करता है) |
| `GET /dispatch` | `ref`, `type` | तत्व पर कस्टम DOM इवेंट भेजें |
| `GET /boundingbox` | `ref` | तत्व की बाउंडिंग रेक्ट प्राप्त करें (x, y, चौड़ाई, ऊँचाई, centerX, centerY) |
| `GET /getattribute` | `ref`, `name` | नाम से तत्व विशेषता प्राप्त करें |
| `GET /inputvalue` | `ref` | वर्तमान इनपुट तत्व मान प्राप्त करें |
| `GET /element/state` | `ref`, `check` | त्वरित बूलियन: `exists`, `visible`, `enabled`, `checked` |
| `GET /find-element` | `text`/`role`/`label`/`placeholder`/`testid` | सिमेंटिक लोकेटर — स्नैप के बिना तत्व खोजें |
| `GET /highlight` | `ref` or `selector` | ओवरले के साथ तत्व हाइलाइट करें |
### माउस और टच
| पथ | पैरामीटर | विवरण |
|------|--------|-------------|
| `GET /mouse/move` | `x`, `y` | माउस को निर्देशांकों पर ले जाएँ |
| `GET /mouse/down` | `x`, `y`, `button` | माउस बटन दबाएँ |
| `GET /mouse/up` | `x`, `y`, `button` | माउस बटन छोड़ें |
| `GET /mouse/wheel` | `x`, `y`, `deltaX`, `deltaY` | माउस व्हील स्क्रॉल |
| `GET /tap` | `x`, `y` | टच टैप (touchStart + touchEnd) |
| `GET /swipe` | `startX`, `startY`, `endX`, `endY` | टच स्वाइप जेस्चर |
| `GET /drag` | `src_ref`, `tgt_ref` | तत्व को लक्ष्य तक खींचें |
### कीबोर्ड
| पथ | पैरामीटर | विवरण |
|------|--------|-------------|
| `GET /keyboard/type` | `tab_id`, `text` | की इवेंट के माध्यम से टेक्स्ट टाइप करें |
| `GET /keyboard/inserttext` | `tab_id`, `text` | टेक्स्ट सीधे सम्मिलित करें |
| `GET /keydown` | `tab_id`, `key` | की दबाने की घटना |
| `GET /keyup` | `tab_id`, `key` | की छोड़ने की घटना |
### सामग्री निष्कर्षण
| पथ | विवरण |
|------|-------------|
| `GET /markdown` | पृष्ठ को Markdown में बदलें |
| `GET /links` | सभी लिंक निकालें |
| `GET /dom/query` | CSS सेलेक्टर क्वेरी |
| `GET /dom/html` | तत्व HTML प्राप्त करें |
| `GET /dom/attributes` | तत्व विशेषताएँ प्राप्त करें |
| `GET /pdf` | पृष्ठ को PDF में प्रिंट करें |
| `GET /find` | पृष्ठ के भीतर टेक्स्ट खोज |
### प्रतीक्षा
| पथ | पैरामीटर | विवरण |
|------|--------|-------------|
| `GET /wait` | `selector`, `text`, `url`, `state`, `visible`, `timeout` | सेलेक्टर/टेक्स्ट/URL पैटर्न/networkidle/लोड स्थिति की प्रतीक्षा करें |
| `GET /wait/function` | `expression`, `timeout` | मनमाने JS एक्सप्रेशन के सत्य होने की प्रतीक्षा करें |
| `GET /wait/download` | `timeout` | फ़ाइल डाउनलोड पूर्ण होने की प्रतीक्षा करें |
### डायलॉग हैंडलिंग
| पथ | विवरण |
|------|-------------|
| `GET /dialog/auto` | सभी JS डायलॉग को स्वचालित रूप से संभालें (स्वीकार करें या खारिज करें) |
| `GET /dialog/accept` | वर्तमान डायलॉग स्वीकार करें (वैकल्पिक प्रॉम्प्ट टेक्स्ट के साथ) |
| `GET /dialog/dismiss` | वर्तमान डायलॉग खारिज करें |
### नेटवर्क और HAR
| पथ | विवरण |
|------|-------------|
| `GET /har/start` | नेटवर्क ट्रैफ़िक रिकॉर्ड करना शुरू करें |
| `GET /har/stop` | रोकें + HAR 1.2 JSON लौटाएँ |
| `GET /har/status` | रिकॉर्डिंग स्थिति + प्रविष्टि संख्या |
| `GET /har/replay` | curl/fetch/python कोड स्निपेट के साथ API मानचित्र |
| `GET /cookies` | कुकीज़ प्राप्त करें |
| `GET /cookies/set` | कुकीज़ सेट करें |
| `GET /cookies/delete` | कुकीज़ हटाएँ |
| `GET /cookies/clear` | सभी कुकीज़ साफ़ करें |
| `GET /headers` | कस्टम अनुरोध हेडर सेट करें |
| `GET /intercept/start` | अनुरोध अवरोधन शुरू करें |
| `GET /intercept/stop` | अनुरोध अवरोधन रोकें |
| `GET /intercept/requests` | अवरोधित अनुरोधों की सूची |
| `GET /request/detail` | अनुरोध ID के लिए प्रतिक्रिया निकाय प्राप्त करें |
| `GET /response/body` | URL लाएं और प्रतिक्रिया निकाय लौटाएँ |
| `GET /network` | नेटवर्क ट्रैफ़िक आँकड़े |
| `GET /download` | फ़ाइल डाउनलोड ट्रिगर करें |
### नेविगेशन और स्थिति
| पथ | विवरण |
|------|-------------|
| `GET /back` | ब्राउज़र पीछे |
| `GET /forward` | ब्राउज़र आगे |
| `GET /reload` | पृष्ठ पुनः लोड करें |
| `GET /stop` | पृष्ठ लोडिंग रोकें |
| `GET /pushstate` | history.pushState के माध्यम से SPA नेविगेशन |
| `GET /storage/local` | localStorage प्राप्त/सेट करें |
| `GET /storage/session` | sessionStorage प्राप्त/सेट करें |
| `GET /storage/local/clear` | localStorage साफ़ करें |
| `GET /storage/session/clear` | sessionStorage साफ़ करें |
| `GET /session/save` | ब्राउज़र सत्र सहेजें |
| `GET /session/load` | ब्राउज़र सत्र पुनर्स्थापित करें |
| `GET /session/list` | सहेजे गए सत्रों की सूची |
| `GET /setcontent` | पृष्ठ HTML सीधे सेट करें (POST) |
### प्रमाणीकरण प्रोफ़ाइलें
| पथ | विवरण |
|------|-------------|
| `GET /auth/profile/save` | कुकीज़ + स्टोरेज को नामित प्रमाणीकरण प्रोफ़ाइल के रूप में सहेजें |
| `GET /auth/profile/load` | किसी नामित प्रमाणीकरण प्रोफ़ाइल को टैब में पुनर्स्थापित करें |
| `GET /auth/profile/list` | सहेजी गई प्रमाणीकरण प्रोफ़ाइलों की सूची |
| `GET /auth/profile/delete` | सहेजी गई प्रमाणीकरण प्रोफ़ाइल हटाएँ |
| `GET /auth/extract` | प्रमाणीकरण टोकन निकालें (JWT, कुकीज़, हेडर) |
| `GET /set/credentials` | HTTP बेसिक प्रमाणीकरण क्रेडेंशियल सेट करें |
macOS पर, प्रमाणीकरण प्रोफ़ाइल रहस्य उपयोगकर्ता Keychain में संग्रहीत किए जाते हैं।
### एमुलेशन
| पथ | पैरामीटर | विवरण |
|------|--------|-------------|
| `GET /emulate` | device type, screen size | डिवाइस एमुलेशन |
| `GET /set/viewport` | `width`, `height` | व्यूपोर्ट आकार सेट करें |
| `GET /set/useragent` | `ua` | उपयोगकर्ता एजेंट सेट करें |
| `GET /set/media` | `media` | मीडिया प्रकार एमुलेट करें |
| `GET /set/offline` | `offline` | ऑफ़लाइन मोड टॉगल करें |
| `GET /geolocation` | `lat`, `lng` | भू-स्थान ओवरराइड करें |
| `GET /timezone` | `timezone` | समयक्षेत्र ओवरराइड करें (जैसे `America/New_York`) |
| `GET /locale` | `locale` | लोकेल ओवरराइड करें (जैसे `en-US`) |
| `GET /permissions` | `name`, `state` | अनुमतियाँ अनुदान/अस्वीकार करें (भू-स्थान, सूचनाएँ, क्लिपबोर्ड) |
### स्क्रिप्ट और इंजेक्शन
| पथ | विवरण |
|------|-------------|
| `GET /script/inject` | पृष्ठ में जावास्क्रिप्ट इंजेक्ट करें (नेविगेशन के दौरान बना रहता है) |
| `GET /initscript/remove` | पहले इंजेक्ट किया गया init स्क्रिप्ट हटाएँ |
| `GET /addstyle` | CSS स्टाइलशीट इंजेक्ट करें |
| `GET /expose` | पृष्ठ JS संदर्भ में नामित फ़ंक्शन उजागर करें |
### React निरीक्षण
| पथ | विवरण |
|------|-------------|
| `GET /react/tree` | DevTools हुक के माध्यम से React घटक ट्री |
| `GET /react/inspect` | React घटक props और state |
| `GET /react/renders` | React रेंडर ट्रैकिंग (शुरू/रोकें) |
| `GET /react/suspense` | React Suspense बाउंड्री स्थिति |
### रिकॉर्डिंग और प्रदर्शन
| पथ | विवरण |
|------|-------------|
| `GET /recording/start` | उपयोगकर्ता क्रियाएँ रिकॉर्ड करें (क्लिक, इनपुट, नेविगेट) |
| `GET /recording/stop` | रिकॉर्डिंग रोकें + क्रिया लॉग लौटाएँ |
| `GET /vitals` | कोर वेब विटल्स (LCP, CLS, FID, TTFB, FCP, domInteractive) |
| `GET /perf/lcp` | Largest Contentful Paint समय |
| `GET /trace/start` | प्रदर्शन ट्रेस शुरू करें |
| `GET /trace/stop` | ट्रेस रोकें |
| `GET /profiler/start` | JS प्रोफाइलर शुरू करें |
| `GET /profiler/stop` | प्रोफाइलर रोकें |
### डिबगिंग
| पथ | विवरण |
|------|-------------|
| `GET /debug/enable` | पृष्ठ में डिबग HUD और वैकल्पिक फ्रीज़ मोड सक्षम करें |
| `GET /debug/disable` | पृष्ठ में डिबग HUD अक्षम करें |
| `GET /inspect` | तत्व निरीक्षण |
| `GET /errors` | JS त्रुटियाँ एकत्र करें |
| `GET /console` | कंसोल लॉग पढ़ें |
| `GET /frames` | पृष्ठ फ़्रेम सूचीबद्ध करें |
| `GET /frame` | नाम या URL द्वारा iframe संदर्भ पर स्विच करें |
| `GET /mainframe` | मुख्य फ़्रेम पर वापस स्विच करें |
| `GET /diff/snapshot` | इस टैब के लिए पिछली कॉल की तुलना में कॉम्पैक्ट `+`/`~`/`-` अंतर — टोकन-कुशल क्रिया लूप (`/snapshot/changes` द्वारा उपनामित)। बड़े बदलाव पर `! page replaced` हेडर के साथ पूर्ण स्नैपशॉट पर फॉलबैक करता है। |
| `GET /diff/url` | दो URLs की साथ-साथ तुलना करें (नेविगेट करें, स्नैपशॉट लें, अंतर देखें) |
### स्ट्रीमिंग
| पथ | विवरण |
|------|-------------|
| `GET /screencast/start` | स्क्रीन रिकॉर्डिंग शुरू करें |
| `GET /screencast/stop` | स्क्रीन रिकॉर्डिंग रोकें |
| `GET /video/start` | वीडियो कैप्चर शुरू करें |
| `GET /video/stop` | वीडियो कैप्चर रोकें |
| `GET /ws/start` | WebSocket टनल शुरू करें |
| `GET /ws/stop` | WebSocket टनल रोकें |
### एजेंट-अनुकूल लूप
सबसे कम घर्षण वाला सर्वर लूप है:
1. `GET /tab/new?url=...`
2. `GET /page/state` (हल्का) या `GET /snapshot?filter=interactive&format=compact` (पूर्ण)
3. `GET /action?action=click&ref=eN`
4. दोहराएँ — या एक कॉल में बहु-चरणीय संचालन के लिए `POST /batch` उपयोग करें
`url` और `expression` क्वेरी पैराम्स percent-decoded होते हैं। सर्वर-साइड टैब संदर्भ बनाए रखने के लिए `X-Kuri-Session: my-agent` भेजें।
---
## 🧠 कौशल
रिपॉजिटरी में एक उपयोगकर्ता-विस्तार योग्य कौशल क्षेत्र शामिल है:
- `skills/kuri-skill.md` आधार Kuri HTTP-एजेंट कौशल है
- `skills/custom/` आपके अपने प्रोजेक्ट-विशिष्ट कौशल के लिए आरक्षित है
- `skills/custom/hackernews-page-2.md` एक ठोस उदाहरण कस्टम कौशल है
- `.claude/skills/kuri-server/SKILL.md` Claude-शैली रिपॉजिटरी कौशल के लिए सिंक में रहता है
आधार कौशल अब यह भी बताता है कि कौन सा ब्राउज़र पथ उपयोग करना है:
- `kuri` HTTP API: सत्र, स्नैपशॉट, क्रियाएँ, HAR, कुकीज़ और स्क्रीनशॉट के साथ उत्पादन Chrome/CDP स्वचालन
- `kuri-fetch`: स्टैंडअलोन no-Chrome fetch/टेक्स्ट निष्कर्षण
- `kuri-browse`: इंटरैक्टिव टर्मिनल ब्राउज़िंग
- `kuri-agent`: Kuri सर्वर के विरुद्ध स्क्रिप्ट करने योग्य CLI स्वचालन
- `kuri-browser/`: पैरिटी कार्य के लिए प्रयोगात्मक अलग Zig-नेटिव ब्राउज़र रनटाइम
प्रयोगात्मक ब्राउज़र CLI के लिए:```bash
cd kuri-browser
zig build run -- render https://news.ycombinator.com --selector ".titleline a" --dump text
zig build run -- render https://todomvc.com/examples/react/dist/ --js --wait-eval "document.querySelectorAll('.todo-list li').length >= 1"
zig build run -- parity --offline
zig build run -- bench --offline
zig build run -- serve-cdp --port 9333
kuri-browser serve-cdp क्रोम-शैली HTTP डिस्कवरी के साथ-साथ प्रोटोकॉल स्मोक टेस्ट के लिए एक न्यूनतम WebSocket JSON-RPC राउटर उजागर करता है। Runtime eval QuickJS द्वारा समर्थित V8-आकार के CDP रिमोट ऑब्जेक्ट लौटाता है; यह V8 निर्भरता नहीं जोड़ता है और अभी तक पूर्ण Playwright/Puppeteer संगतता नहीं है।
kuri-browser में स्क्रीनशॉट वर्तमान में मुख्य Kuri/CDP रेंडरर को सौंपे जाते हैं। पहले ./zig-out/bin/kuri शुरू करें, फिर:```bash
cd kuri-browser
zig build run -- screenshot https://example.com --out example.jpg --compress --kuri-base http://127.0.0.1:8080
`--compress` एक PNG बेसलाइन और JPEG उम्मीदवार को कैप्चर करता है, छोटी फ़ाइल लिखता है, और बाइट बचत की रिपोर्ट करता है। `https://example.com` पर वर्तमान स्थानीय माप: `20,523` बाइट्स PNG से `18,183` बाइट्स JPEG गुणवत्ता 50, `2,340` बाइट्स या `11%` की बचत।
### उन्नत
| Path | विवरण |
|------|-------------|
| `GET /diff/snapshot` | पिछले स्नैपशॉट के सापेक्ष कॉम्पैक्ट `+`/`~`/`-` डेल्टा (एजेंट क्रिया लूप) |
| `GET /emulate` | डिवाइस इम्यूलेशन |
| `GET /geolocation` | जियोलोकेशन सेट करें |
| `POST /upload` | फ़ाइल अपलोड |
| `GET /script/inject` | JavaScript इंजेक्ट करें |
| `GET /intercept/start` | अनुरोध इंटरसेप्शन शुरू करें |
| `GET /intercept/stop` | इंटरसेप्शन रोकें |
| `GET /screenshot/annotated` | एलिमेंट एनोटेशन के साथ स्क्रीनशॉट |
| `GET /screenshot/diff` | स्क्रीनशॉट के बीच विज़ुअल अंतर |
| `GET /screencast/start` | स्क्रीनकास्ट शुरू करें |
| `GET /screencast/stop` | स्क्रीनकास्ट रोकें |
| `GET /video/start` | वीडियो रिकॉर्डिंग शुरू करें |
| `GET /video/stop` | वीडियो रिकॉर्डिंग रोकें |
| `GET /console` | कंसोल संदेश प्राप्त करें |
| `GET /stop` | पेज लोडिंग रोकें |
| `GET /get` | सीधा HTTP फ़ेच (सर्वर-साइड) |
| `GET /scrollintoview` | संदर्भित एलिमेंट को दृश्य में स्क्रॉल करें |
| `GET /drag` | एक ref से दूसरे ref तक खींचें |
| `GET /keyboard/type` | की इवेंट के साथ टेक्स्ट टाइप करें |
| `GET /keyboard/inserttext` | सीधे टेक्स्ट डालें |
| `GET /keydown` | keydown इवेंट भेजें |
| `GET /keyup` | keyup इवेंट भेजें |
| `GET /wait` | रेडी स्टेट या एलिमेंट शर्तों की प्रतीक्षा करें |
| `GET /tab/close` | टैब बंद करें |
| `GET /highlight` | ref या सेलेक्टर द्वारा एलिमेंट को हाइलाइट करें |
| `GET /errors` | पेज/रनटाइम त्रुटियां प्राप्त करें |
| `GET /set/offline` | ऑफ़लाइन नेटवर्क इम्यूलेशन टॉगल करें |
| `GET /set/media` | इम्यूलेटेड मीडिया फ़ीचर सेट करें |
| `GET /set/credentials` | HTTP बेसिक ऑथ क्रेडेंशियल सेट करें |
| `GET /find` | वर्तमान पेज में टेक्स्ट मिलान खोजें |
| `GET /trace/start` | Chrome ट्रेसिंग शुरू करें |
| `GET /trace/stop` | ट्रेसिंग रोकें और ट्रेस डेटा लौटाएं |
| `GET /profiler/start` | JS प्रोफाइलर शुरू करें |
| `GET /profiler/stop` | JS प्रोफाइलर रोकें |
| `GET /inspect` | एलिमेंट या पेज स्टेट का निरीक्षण करें |
| `GET /set/viewport` | व्यूपोर्ट आकार सेट करें |
| `GET /set/useragent` | यूज़र एजेंट ओवरराइड करें |
| `GET /dom/attributes` | एलिमेंट विशेषताएँ प्राप्त करें |
| `GET /frames` | फ्रेम ट्री सूचीबद्ध करें |
| `GET /network` | नेटवर्क स्थिति/अनुरोधों का निरीक्षण करें |
---
## 🛡️ स्टेल्थ और बॉट एवेज़न
Kuri स्टार्टअप पर स्वचालित रूप से एंटी-डिटेक्शन पैच लागू करता है — किसी मैन्युअल कॉन्फ़िगरेशन की आवश्यकता नहीं है।
### क्या लागू किया जाता है
- **`Page.addScriptToEvaluateOnNewDocument`** — स्टेल्थ पैच किसी भी पेज JS से पहले चलते हैं
- **navigator.webdriver = false** — Chromium स्तर पर ऑटोमेशन फ़्लैग छुपाता है (`--disable-blink-features=AutomationControlled`)
- **WebGL/Canvas/AudioContext स्पूफिंग** — फ़िंगरप्रिंट-आधारित डिटेक्शन को विफल करता है
- **UA रोटेशन** — 5 यथार्थवादी Chrome/Safari/Firefox यूज़र एजेंट
- **chrome.csi/chrome.loadTimes** — Akamai-विशिष्ट जांचों के लिए स्टब्स
### बॉट ब्लॉक डिटेक्शन
Navigate स्वचालित रूप से ब्लॉक का पता लगाता है और संरचित फ़ॉलबैक लौटाता है:```bash
curl -s "http://localhost:8080/navigate?tab_id=ABC&url=https://protected-site.com"
# If blocked:
# {"blocked":true,"blocker":"akamai","ref_code":"0.7d...",
# "fallback":{"suggestions":["Open URL directly in browser","Use KURI_PROXY"]}}
# If ok: normal CDP response
Detects: Akamai, Cloudflare, PerimeterX, DataDome, सामान्य कैप्चा।
KURI_PROXY=socks5://user:pass@residential-proxy:1080 ./zig-out/bin/kuri KURI_PROXY=http://proxy:8080 ./zig-out/bin/kuri
### परीक्षित साइटें
| साइट | सुरक्षा | परिणाम |
|------|-----------|--------|
| Singapore Airlines | Akamai WAF | ✅ बायपास किया गया (v0.4.0 से पहले अवरुद्ध था) |
| Shopee SG | Custom anti-fraud | ✅ पेज लोड होता है, लॉगिन पर रीडायरेक्ट करता है |
| Google Flights | कोई नहीं | ✅ पूर्ण इंटरैक्शन |
| Booking.com | PerimeterX | ⚠️ प्रॉक्सी की आवश्यकता है |
---
## 🔧 kuri-fetch
स्टैंडअलोन HTTP फ़ेचर — कोई Chrome नहीं, कोई Playwright नहीं, कोई npm नहीं। यह ~2 MB बाइनरी के रूप में आता है, जिसमें JS निष्पादन के लिए बिल्ट-इन QuickJS है।```bash
zig build fetch # build + run
# Default: convert to Markdown
kuri-fetch https://example.com
# Extract links
kuri-fetch -d links https://news.ycombinator.com
# Structured JSON output
kuri-fetch --json https://example.com
# Execute inline scripts via QuickJS
kuri-fetch --js https://example.com
# Write to file, quiet mode
kuri-fetch -o page.md -q https://example.com
# Pipe-friendly: content → stdout, status → stderr
kuri-fetch -d text https://example.com | wc -w
markdown, html, links, text, json--js इनलाइन <script> टैग निष्पादित करता हैdocument.querySelector, getElementById, window.location, document.title, console.log, setTimeout (SSR-शैली)NO_COLOR, , , TTY पहचान का सम्मान करता हैइंटरैक्टिव टर्मिनल ब्राउज़र — अपने टर्मिनल से वेब ब्राउज़ करें। Chrome की आवश्यकता नहीं।```bash zig build browse # build + run
kuri-browse https://example.com
No input content was provided after "INPUT:" — there is no text to translate. Please supply the chunk content.```
🌰 kuri-browse — terminal browser
→ loading https://example.com
# Example Domain
This domain is for use in documentation examples...
Learn more [1]
───── Links ─────
[1] https://iana.org/domains/example
✓ 528 bytes, 1 links (133ms)
[nav] https://example.com> 1 ← type 1 to follow the link
[N] मिलता है, उसका अनुसरण करने के लिए संख्या टाइप करें/term सभी मिलानों को हाइलाइट करता हैjavascript: और mailto: hrefs को छोड़ देता हैChrome स्वचालन के लिए स्क्रिप्टेबल CLI — आपके टर्मिनल या शेल स्क्रिप्ट से ब्राउज़र को कमांड-दर-कमांड चलाता है। यह ~/.kuri/session.json के माध्यम से विभिन्न इनवोकेशन के बीच सत्र स्थिति साझा करता है।```bash
zig build agent # build kuri-agent
kuri-agent tabs
kuri-agent use ws://127.0.0.1:9222/devtools/page/ABC123
kuri-agent go https://example.com kuri-agent snap --interactive # → [{"ref":"e0","role":"link","name":"More info"}] kuri-agent click e0 kuri-agent shot # saves ~/.kuri/screenshots/.png
### कमांड्स
| कमांड | विवरण |
|---------|-------------|
| `tabs [--port N]` | Chrome टैब्स की सूची दिखाएँ |
| `use <ws_url>` | एक टैब से जुड़ें (सत्र सहेजता है) |
| `open [url] [--port N]` | नया टैब खोलें (वैकल्पिक रूप से URL पर नेविगेट करें) |
| `status` | वर्तमान सत्र दिखाएँ |
| `go <url>` | URL पर नेविगेट करें |
| `snap [--interactive] [--json] [--text] [--depth N]` | एक्सेसिबिलिटी स्नैपशॉट, `eN` रेफ़्स सहेजता है |
| `click <ref>` | रेफ़ द्वारा एलिमेंट पर क्लिक करें (CDP माउस इवेंट्स, React-संगत) |
| `type <ref> <text>` | एलिमेंट में टाइप करें (प्रति-अक्षर की-इवेंट्स, React-संगत) |
| `fill <ref> <text>` | इनपुट मान भरें |
| `select <ref> <value>` | ड्रॉपडाउन विकल्प चुनें |
| `hover <ref>` | एलिमेंट पर होवर करें |
| `focus <ref>` | एलिमेंट को फोकस करें |
| `scroll` | पेज को स्क्रॉल करें |
| `viewport [width height]` | व्यूपोर्ट आयाम प्राप्त या सेट करें |
| `eval <js>` | जावास्क्रिप्ट का मूल्यांकन करें |
| `text [selector]` | पेज का टेक्स्ट प्राप्त करें |
| `shot [--out file.png]` | स्क्रीनशॉट लें |
| `back` | पीछे नेविगेट करें |
| `forward` | आगे नेविगेट करें |
| `reload` | वर्तमान पेज पुनः लोड करें |
| `cookies` | सुरक्षा फ़्लैग्स के साथ कुकीज़ सूचीबद्ध करें |
| `headers` | सुरक्षा प्रतिक्रिया हेडर्स जाँचें |
| `audit` | पूर्ण सुरक्षा ऑडिट |
| `storage [local\|session\|all]` | localStorage / sessionStorage डंप करें |
| `jwt` | कुकीज़ और स्टोरेज से JWT निकालें और डिकोड करें |
| `fetch <method> <url> [--data <json>]` | पेज कुकीज़ का उपयोग करके प्रमाणित fetch |
| `probe <url-template> <start> <end>` | IDOR जाँच: URL में संख्यात्मक ID को पुनरावृत्त करें |
| `grab <ref>` | रेफ़ पर क्लिक करें, `window.open` इंटरसेप्ट करें, टैब में रीडायरेक्ट का अनुसरण करें |
| `wait-for-tab [--port N]` | नए टैब के लिए पोल करें, सत्र को स्वतः स्विच करें |
| `stealth` | एंटी-डिटेक्शन पैच लागू करें |
| `set-header <name> <value>` | सभी अनुरोधों में एक कस्टम हेडर जोड़ें |
| `show-headers` | संग्रहीत अतिरिक्त हेडर्स दिखाएँ |
| `clear-headers` | सभी अतिरिक्त हेडर्स हटाएँ |
---
## 📱 kuri-mobile (iOS + Android)
iOS सिमुलेटर, वास्तविक iPhones (सूची + लॉन्च/टर्मिनेट), और Android डिवाइस/एम्युलेटर चलाने के लिए नेटिव Zig CLI — [`mobile-device-mcp`](https://github.com/srmorete/mobile-device-mcp) से प्रेरित, बिल्ड पथ में Bun/Node/Gradle/Xcode के बिना Zig में पुनः कार्यान्वित।```bash
cd kuri-mobile && zig build && cp zig-out/bin/kuri-mobile ../zig-out/bin/
# The main `kuri` binary forwards android/ios subcommands to kuri-mobile:
kuri ios list-devices # sims + real devices (usbmuxd, native)
kuri ios openurl https://example.com # navigate Safari
kuri ios screenshot out.png # auto-picks booted sim
kuri ios launch com.apple.Preferences
kuri android list-devices # native Zig adb wire-protocol client
kuri android tap 540 1200
kuri android swipe 100 1500 100 500
kuri android screenshot phone.png
kuri android uitree # flat element list via uiautomator dump
What's native Zig: adb होस्ट प्रोटोकॉल (libc सॉकेट, host:transport:/shell:/exec: पर 4-हेक्स फ्रेमिंग), Android XML UI ट्री पार्सर, usbmuxd ListDevices plist क्लाइंट।
What shells out: xcrun simctl (iOS सिम्युलेटर), xcrun devicectl (iOS रियल-डिवाइस लॉन्च/टर्मिनेट)।
ड्राइवरलेस बाय डिज़ाइन: कोई ऑन-डिवाइस ऐप इंस्टॉल नहीं होता, इसलिए वास्तविक iOS डिवाइसों पर run_code सैंडबॉक्स और XCUITest-आधारित tap/uitree जानबूझकर उपलब्ध नहीं हैं। पूर्ण पैरिटी मैट्रिक्स के लिए kuri-mobile/README.md देखें।
kuri-agent ब्राउज़र-नेटिव सुरक्षा ट्रैजेक्टोरियों का समर्थन करता है — एक बार लॉग इन करें, फिर टर्मिनल छोड़े बिना रिकॉनिसेंस और हेडर/कुकी ऑडिट चलाएँ।
Enumerate → Inspect — प्रमाणीकरण के बाद, प्रमाणीकरण कुकीज़ डंप करें और सुरक्षा फ़्लैग जाँचें:```bash kuri-agent go https://target.example.com/login kuri-agent snap --interactive kuri-agent fill e2 myuser kuri-agent fill e3 mypassword kuri-agent click e4 # submit login
kuri-agent cookies
**Header audit** — जाँचें कि लक्ष्य द्वारा कौन-से सुरक्षा हेडर भेजे जाते हैं:```bash
kuri-agent go https://target.example.com
kuri-agent headers
# → {"url":"https://...","status":200,"headers":{
# "content-security-policy":"default-src 'self'",
# "strict-transport-security":"max-age=31536000",
# "x-frame-options":"(missing)",
# "x-content-type-options":"nosniff", ...}}
पूर्ण ऑडिट — HTTPS, लापता हेडर, JS-दृश्यमान कुकीज़ एक ही बार में:```bash kuri-agent audit
**क्रॉस-अकाउंट ट्रैजेक्टरी** — अलग-अलग टोकन के साथ API कॉल्स को दोबारा चलाने के लिए `eval` का उपयोग करें:```bash
# After login, grab the auth token from localStorage
kuri-agent eval "localStorage.getItem('token')"
# Probe a resource ID with the current session
kuri-agent eval "fetch('/api/assessments/42').then(r=>r.status)"
# Check for IDOR: does a different user's resource return 200 or 403?
kuri-agent eval "fetch('/api/assessments/99').then(r=>r.status)"
kuri-agent पाइपलाइन एकीकरण के लिए उपयुक्त JSON आउटपुट करता है। प्रत्येक सुरक्षा कमांड एक एकल JSON लाइन उत्सर्जित करती है — ट्राइएज के लिए jq के माध्यम से पाइप करें:```bash
kuri-agent audit | jq '.issues[]'
kuri-agent cookies | head -20
kuri-agent headers | jq '.headers | to_entries[] | select(.value == "(missing)") | .key'
---
## 🏗 आर्किटेक्चर```
┌──────────────────────────────────────────────────────────┐
│ HTTP API Layer │
│ (std.http.Server, thread-per-connection) │
├──────────────┬──────────────────┬────────────────────────┤
│ Browser │ Crawler Engine │ kuri-fetch / browse │
│ Bridge │ │ (standalone CLIs) │
├──────────────┼──────────────────┼────────────────────────┤
│ CDP Client │ URL Validator │ std.http.Client │
│ Tab Registry │ HTML→Markdown │ QuickJS JS Engine │
│ A11y Snapshot│ Link Extractor │ DOM Stubs (Layer 3) │
│ Ref Cache │ Text Extractor │ SSRF Validator │
│ HAR Recorder │ │ Colored Renderer │
│ Stealth JS │ │ History + REPL │
├──────────────┴──────────────────┴────────────────────────┤
│ Chrome Lifecycle Manager │
│ (launch, health-check, auto-restart, port detection) │
└──────────────────────────────────────────────────────────┘
deinit() कॉल में मुक्त हो जाती हैGeneralPurposeAllocator डिबग मोड में हर लीक को पकड़ लेता हैLauncher → Bridge → CdpClients → HarRecorders → Snapshots → Tabserrdefer गार्ड — आंशिक विफलताएँ स्वच्छ रूप से रोलबैक हो जाती हैं| मोड | व्यवहार |
|---|---|
प्रबंधित (कोई CDP_URL नहीं) | हेडलेस Chrome लॉन्च करता है, खाली CDP पोर्ट ढूंढता है, निगरानी करता है, क्रैश पर स्वतः पुनः प्रारंभ करता है (अधिकतम 3 प्रयास), शटडाउन पर बंद कर देता है |
| ( सेट) |
kuri/ ├── build.zig # Build system (Zig 0.16.0) ├── build.zig.zon # Package manifest + QuickJS dep ├── src/ │ ├── main.zig # CDP server entry point │ ├── fetch_main.zig # kuri-fetch CLI entry point │ ├── browse_main.zig # kuri-browse CLI entry point │ ├── js_engine.zig # QuickJS wrapper + DOM stubs │ ├── bench.zig # Benchmark harness │ ├── chrome/ │ │ └── launcher.zig # Chrome lifecycle manager │ ├── server/ │ │ ├── router.zig # HTTP route dispatch (40+ endpoints) │ │ ├── middleware.zig # Auth (constant-time comparison) │ │ └── response.zig # JSON response helpers │ ├── bridge/ │ │ ├── bridge.zig # Central state (tabs, CDP, HAR, snapshots) │ │ └── config.zig # Env var configuration │ ├── cdp/ │ │ ├── client.zig # CDP WebSocket client │ │ ├── websocket.zig # WebSocket frame codec │ │ ├── protocol.zig # CDP method constants │ │ ├── actions.zig # High-level CDP actions │ │ ├── stealth.zig # Bot detection bypass │ │ └── har.zig # HAR 1.2 recorder │ ├── snapshot/ │ │ ├── a11y.zig # A11y tree with interactive filter │ │ ├── diff.zig # Snapshot delta diffing │ │ └── ref_cache.zig # eN ref → node ID cache │ ├── crawler/ │ │ ├── validator.zig # SSRF defense, URL validation │ │ ├── markdown.zig # HTML → Markdown (SIMD tag counting) │ │ ├── fetcher.zig # Page fetching │ │ ├── extractor.zig # Readability extraction │ │ └── pipeline.zig # Parallel crawl pipeline │ ├── storage/ │ │ ├── local.zig # Local file writer │ │ └── r2.zig # R2/S3 uploader │ ├── util/ │ │ └── json.zig # JSON helpers │ └── test/ │ ├── harness.zig # Test HTTP client │ ├── integration.zig # Integration tests │ └── merjs_e2e.zig # E2E tests ├── js/ │ ├── stealth.js # Bot detection bypass │ └── readability.js # Content extraction ├── kuri-browser/ # Native Zig rendering experiments └── kuri-mobile/ # iOS + Android device control (Zig-native adb + usbmuxd) ├── src/ │ ├── common/ # io helpers, unified UI tree parser │ ├── android/ # adb wire protocol client, driver, CLI │ └── ios/ # simctl, usbmuxd, devicectl, CLI └── README.md # Full parity matrix vs mobile-device-mcp
---
## ⚙️ कॉन्फ़िगरेशन
| Env Var | डिफ़ॉल्ट | विवरण |
|---------|---------|-------------|
| `HOST` | `127.0.0.1` | सर्वर बाइंड पता |
| `PORT` | `8080` | सर्वर पोर्ट |
| `CDP_URL` | *(none)* | मौजूदा Chrome से कनेक्ट करें (`ws://...` या `http://127.0.0.1:9222`) |
| `KURI_SECRET` | *(none)* | API अनुरोधों के लिए प्रमाणीकरण गुप्त कुंजी |
| `STATE_DIR` | `.kuri` | सत्र स्थिति निर्देशिका |
| `REQUEST_TIMEOUT_MS` | `30000` | HTTP अनुरोध टाइमआउट |
| `NAVIGATE_TIMEOUT_MS` | `30000` | नेविगेशन टाइमआउट |
| `STALE_TAB_INTERVAL_S` | `30` | पुराने टैब सफाई अंतराल |
| `NO_COLOR` | *(none)* | रंगीन CLI आउटपुट अक्षम करें |
---
## 💰 टोकन लागत
50-पृष्ठ की निगरानी कार्य के लिए (Pinchtab बेंचमार्क से):
| विधि | टोकन | लागत ($) | सर्वोत्तम उपयोग |
|--------|--------|----------|----------|
| `/text` | ~40,000 | $0.20 | पठन-प्रधान (स्क्रीनशॉट से 13× सस्ता) |
| `/snapshot?filter=interactive&format=compact` | ~40,000 | $0.20 | कम-टोकन तत्व इंटरैक्शन |
| `/snapshot` (full) | ~525,000 | $2.63 | पूर्ण पेज समझ |
| `/screenshot` | ~100,000 | $1.00 | दृश्य सत्यापन |
---
## 🤝 योगदान
बड़ा PR सबमिट करने से पहले एक issue खोलें ताकि हम दृष्टिकोण पर सहमत हो सकें।```bash
git clone https://github.com/justrach/kuri.git
cd kuri
zig build test # 252+ tests must pass
zig build test-fetch # kuri-fetch tests (69 tests)
zig build test-browse # kuri-browse tests (22 tests)
See CONTRIBUTORS.md for guidelines.
Apache-2.0
TERM=dumb--no-color-o / --output बाइट गिनती + समय सारांश के साथ--user-agent फ़्लैग-q stderr स्थिति को दबाता है| Command | Action |
|---|
<number> | लिंक [N] पर जाएँ |
<url> | नेविगेट करें (यदि इसमें . है) |
:go <url> | URL पर जाएँ |
:back, :b | इतिहास में पीछे जाएँ |
:forward, :f | आगे जाएँ |
:reload, :r | वर्तमान पृष्ठ को फिर से लाएँ |
:links, :l | लिंक सूचकांक दिखाएँ |
/<term> | पृष्ठ में खोजें (मिलानों को हाइलाइट करता है) |
:search <t> | पृष्ठ में खोजें |
:n, :next | खोज को फिर से हाइलाइट करें |
:history | नेविगेशन इतिहास दिखाएँ |
:help, :h | सभी कमांड दिखाएँ |
:quit, :q | बाहर निकलें |
CDP_URLमौजूदा Chrome से जुड़ता है, /json/version के माध्यम से हेल्थ-चेक करता है, शटडाउन पर बंद नहीं करता |
| प्रोजेक्ट | हमने क्या उधार लिया |
|---|
| agent-browser | @eN रेफ प्रणाली, स्नैपशॉट डिफिंग, HAR रिकॉर्डिंग पैटर्न |
| Pinchtab | AI एजेंटों के लिए ब्राउज़र नियंत्रण आर्किटेक्चर |
| Pathik | उच्च-प्रदर्शन क्रॉलिंग पैटर्न |
| QuickJS-ng via mitchellh/zig-quickjs-ng | kuri-fetch के लिए JS इंजन |
| Lightpanda | Zig-नेटिव हेडलेस ब्राउज़र अग्रणी, CDP संगतता पैटर्न |
| Zig 0.16.0 | पूरा स्टैक |