
AI एजेंटों के लिए ब्राउज़र स्वचालन, वेब क्रॉलिंग, और iOS + Android डिवाइस नियंत्रण। Zig-मूल, टोकन-कुशल CDP स्नैपशॉट, HAR रिकॉर्डिंग, नेटिव adb वायर-प्रोटोकॉल क्लाइंट, और एक स्टैंडअलोन फ़ेचर।
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/13639/7915bba5fb25229c11f59482cfcd4a0eaf2945ee066dbf5cec395df880b53268.png" alt="Kuri" width="200" />
</p>
<h1 align="center">Kuri 🌰</h1>
<p align="center">
<a href="https://kuri.trilok.ai/download/latest.json"><img src="https://img.shields.io/badge/stable-v0.6.1-brightgreen?style=flat-square" alt="Stable release"></a>
<a href="https://github.com/justrach/kuri/blob/main/LICENSE"><img src="https://img.shields.io/github/license/justrach/kuri?style=flat-square" alt="License"></a>
<img src="https://img.shields.io/badge/zig-0.16.0-f7a41d?style=flat-square" alt="Zig">
<img src="https://img.shields.io/badge/node__modules-0_files-brightgreen?style=flat-square" alt="node_modules">
<img src="https://img.shields.io/badge/status-stable-brightgreen?style=flat-square" alt="status">
</p>
## इंस्टॉल
```sh
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.1/kuri-v0.6.1-aarch64-macos.tar.gz) · [macOS x86_64](https://kuri.trilok.ai/download/v0.6.1/kuri-v0.6.1-x86_64-macos.tar.gz) · [Linux x86_64](https://kuri.trilok.ai/download/v0.6.1/kuri-v0.6.1-x86_64-linux.tar.gz) · [Linux arm64](https://kuri.trilok.ai/download/v0.6.1/kuri-v0.6.1-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/main/CHANGELOG.md)
> **टीमें Kuri पर क्यों स्विच करती हैं:** मौजूदा Apple Silicon `ReleaseFast` बिल्ड्स प्रति बाइनरी sub-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 के साथ पूर्ण समानता।
- `@eN` ref फॉर्मेट और ज़ीरो-प्रीफिक्स रेंडरिंग की बदौलत असली पेजों पर agent-browser की तुलना में **7-12% कम टोकन**।
- उसी Google Flights पेज के लिए `/page/state` (48 टोकन) बनाम पूर्ण स्नैपशॉट (2,124 टोकन) के साथ **44x हल्के ऑब्ज़र्वेशन**।
- **बैच एक्ज़ीक्यूशन** — `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` अनुमान से मापा गया।
| टूल / मोड | Chars | ~टोकन | नोट |
|---|---:|---:|---|
| `kuri snap` (पूर्ण) | 8,499 | **2,124** | सभी नोड्स + इंटरैक्टिव refs |
| `kuri snap` (केवल इंटरैक्टिव) | ~3,000 | **~750** | एजेंट लूप्स के लिए सर्वोत्तम |
| `kuri /page/state` | 190 | **48** | हल्का ऑब्ज़र्वेशन (url, title, scroll%, counts) |
| 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 chars) बनाम `[ref=e0]` (9 chars)
- प्रति लाइन कोई `- ` प्रीफिक्स नहीं (2 chars × लाइन काउंट बचता है)
- समान इंडेंटेशन, समान नोड फ़िल्टरिंग
### पूर्ण वर्कफ़्लो लागत: `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/main/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)
```
---
## 📦 इंस्टॉलेशन
### वन-लाइन इंस्टॉल (macOS / Linux)
```sh
curl -fsSL https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/install.sh | sh
```
यह आपके प्लेटफ़ॉर्म का पता लगाता है, सही बाइनरी डाउनलोड करता है, और `~/.local/bin` में इंस्टॉल करता है।
डाउनलोड Kuri की स्व-प्रबंधित `release-channel` ब्रांच से आते हैं। macOS बाइनरीज़ स्थानीय रूप से Developer ID प्रमाणपत्र के साथ हस्ताक्षरित होती हैं। GitHub Release एसेट्स इन्हीं tarballs की प्रतिलिपि हैं।
### bun / npm
```sh
bun install -g kuri-agent
# or: npm install -g kuri-agent
```
इंस्टॉल के समय आपके प्लेटफ़ॉर्म के लिए सही नेटिव बाइनरी डाउनलोड करता है।
### रिलीज़ चैनल
Kuri की स्थिर बाइनरीज़ `release-channel` ब्रांच पर रहती हैं और सीधे GitHub raw URLs से सर्व की जाती हैं।
- स्थिर इंस्टॉलर: `https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/install.sh`
- स्थिर मैनिफ़ेस्ट: `https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/latest.json`
- ब्रांच व्यू: `https://github.com/justrach/kuri/tree/release-channel/stable`
- सीधा डाउनलोड पैटर्न: `https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/<version>/kuri-<version>-<target>.tar.gz`
### मैन्युअल
[स्थिर रिलीज़ मैनिफ़ेस्ट](https://raw.githubusercontent.com/justrach/kuri/release-channel/stable/latest.json) या [GitHub Releases पेज](https://github.com/justrach/kuri/releases) से अपने प्लेटफ़ॉर्म के लिए tarball डाउनलोड करें और इसे अपने `$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, सॉकेट्स, डेमोनाइज़) को स्टब सूची से हटाने से पहले वास्तविक 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](https://ziglang.org/download/) · Chrome/Chromium (CDP मोड के लिए)
```bash
git clone https://github.com/justrach/kuri.git
cd kuri
zig build # build everything
zig build test # run 252+ tests
# CDP mode — launches Chrome automatically
./zig-out/bin/kuri
# Standalone mode — no Chrome needed
./zig-out/bin/kuri-fetch https://example.com
# Interactive browser — browse from your terminal
./zig-out/bin/kuri-browse https://example.com
# Experimental standalone browser runtime — separate build, not production
(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
```
### 4 कमांड में vercel.com ब्राउज़ करें
```bash
# 1. Discover Chrome tabs
curl -s http://localhost:8080/discover
# → {"discovered":1,"total_tabs":1}
# 2. Get tab ID
curl -s http://localhost:8080/tabs
# → [{"id":"ABC123","url":"chrome://newtab/","title":"New Tab"}]
# 3. Navigate
curl -s "http://localhost:8080/navigate?tab_id=ABC123&url=https://vercel.com"
# 4. Get accessibility snapshot (token-optimized for LLMs)
curl -s "http://localhost:8080/snapshot?tab_id=ABC123&filter=interactive"
# → [{"ref":"e0","role":"link","name":"VercelLogotype"},
# {"ref":"e1","role":"button","name":"Ask AI"}, ...]
```
---
## 🌐 HTTP API
सभी endpoints JSON लौटाते हैं। `KURI_SECRET` env var के माध्यम से वैकल्पिक auth। **135 endpoints** — agent-browser और browser-use के साथ पूर्ण समानता।
### Core
| Path | Description |
|------|-------------|
| `GET /health` | Server status, tab count, version |
| `GET /tabs` | सभी registered tabs की सूची |
| `GET /discover` | CDP के माध्यम से Chrome tabs को auto-discover करें |
| `GET /tab/current` | `X-Kuri-Session` के लिए current tab प्राप्त करें या सेट करें |
| `GET /page/info` | active tab के लिए live URL/title/ready-state/viewport/scroll |
| `GET /page/state` | संक्षिप्त page observation: url, title, scroll%, viewport, forms/links/images/inputs की गिनती |
| `POST /batch` | एक HTTP call में कई commands निष्पादित करें — results की array लौटाता है |
| `GET /browdie` | 🌰 (easter egg) |
### Browser Control
| Path | Params | Description |
|------|--------|-------------|
| `GET /navigate` | `tab_id`, `url` | tab को URL पर navigate करें |
| `GET /tab/new` | `url`, `activate`, `wait` | नया tab बनाएं और वैकल्पिक रूप से hydrate/current tab सेट करें |
| `GET /tab/close` | `tab_id` | tab बंद करें |
| `GET /window/new` | `url`, `activate`, `wait` | नया window/tab target बनाएं |
| `GET /snapshot` | `tab_id`, `filter`, `format` | `eN` refs के साथ A11y tree snapshot। low-token agent loops के लिए `filter=interactive&format=compact` का उपयोग करें। |
| `GET /text` | `tab_id` | page text निकालें |
| `GET /screenshot` | `tab_id`, `format`, `quality`, `save` | screenshot capture करें (base64); `save=true` PNG को `STATE_DIR/screenshots` में लिखता है और इसके बजाय `{path,bytes}` लौटाता है |
| `GET /screenshot/annotated` | `tab_id` | numbered element labels के साथ screenshot |
| `GET /screenshot/diff` | `tab_id`, `baseline` | current और baseline screenshots के बीच visual diff |
| `GET /action` | `tab_id`, `ref`, `action`, `value` | ref द्वारा Click/type/fill/select/scroll/hover/dblclick/check/uncheck/blur |
| `GET /evaluate` | `tab_id`, `expression` | JavaScript निष्पादित करें |
| `GET /evalhandle` | `tab_id`, `expression` | JS निष्पादित करें, objectId handle लौटाएं (value नहीं) |
| `GET /close` | `tab_id` | tab बंद करें + cleanup |
| `GET /bringtofront` | `tab_id` | tab को सामने लाएं |
### Actions
| Path | Params | Description |
|------|--------|-------------|
| `GET /clear` | `ref` | input field value साफ़ करें |
| `GET /selectall` | `ref` | input/contenteditable में सभी text चुनें |
| `GET /setvalue` | `ref`, `value` | input value सीधे सेट करें (key events को bypass करता है) |
| `GET /dispatch` | `ref`, `type` | element पर custom DOM event dispatch करें |
| `GET /boundingbox` | `ref` | element bounding rect प्राप्त करें (x, y, width, height, centerX, centerY) |
| `GET /getattribute` | `ref`, `name` | name द्वारा element attribute प्राप्त करें |
| `GET /inputvalue` | `ref` | current input element value प्राप्त करें |
| `GET /element/state` | `ref`, `check` | त्वरित boolean: `exists`, `visible`, `enabled`, `checked` |
| `GET /find-element` | `text`/`role`/`label`/`placeholder`/`testid` | Semantic locator — snap के बिना element खोजें |
| `GET /highlight` | `ref` or `selector` | overlay के साथ element highlight करें |
### Mouse & Touch
| Path | Params | Description |
|------|--------|-------------|
| `GET /mouse/move` | `x`, `y` | mouse को coordinates पर ले जाएं |
| `GET /mouse/down` | `x`, `y`, `button` | Mouse button down |
| `GET /mouse/up` | `x`, `y`, `button` | Mouse button up |
| `GET /mouse/wheel` | `x`, `y`, `deltaX`, `deltaY` | Mouse wheel scroll |
| `GET /tap` | `x`, `y` | Touch tap (touchStart + touchEnd) |
| `GET /swipe` | `startX`, `startY`, `endX`, `endY` | Touch swipe gesture |
| `GET /drag` | `src_ref`, `tgt_ref` | element को target पर drag करें |
### Keyboard
| Path | Params | Description |
|------|--------|-------------|
| `GET /keyboard/type` | `tab_id`, `text` | key events के माध्यम से text type करें |
| `GET /keyboard/inserttext` | `tab_id`, `text` | text सीधे insert करें |
| `GET /keydown` | `tab_id`, `key` | Key down event |
| `GET /keyup` | `tab_id`, `key` | Key up event |
### Content Extraction
| Path | Description |
|------|-------------|
| `GET /markdown` | page को Markdown में बदलें |
| `GET /links` | सभी links निकालें |
| `GET /dom/query` | CSS selector query |
| `GET /dom/html` | element HTML प्राप्त करें |
| `GET /dom/attributes` | element attributes प्राप्त करें |
| `GET /pdf` | page को PDF में print करें |
| `GET /find` | In-page text search |
### Waiting
| Path | Params | Description |
|------|--------|-------------|
| `GET /wait` | `selector`, `text`, `url`, `state`, `visible`, `timeout` | selector/text/URL pattern/networkidle/load state की प्रतीक्षा करें |
| `GET /wait/function` | `expression`, `timeout` | मनमाने JS expression के truthy होने की प्रतीक्षा करें |
| `GET /wait/download` | `timeout` | file download पूरा होने की प्रतीक्षा करें |
### Dialog Handling
| Path | Description |
|------|-------------|
| `GET /dialog/auto` | सभी JS dialogs को auto-handle करें (accept या dismiss) |
| `GET /dialog/accept` | current dialog accept करें (वैकल्पिक prompt text के साथ) |
| `GET /dialog/dismiss` | current dialog dismiss करें |
### Network & HAR
| Path | Description |
|------|-------------|
| `GET /har/start` | network traffic record करना शुरू करें |
| `GET /har/stop` | रोकें + HAR 1.2 JSON लौटाएं |
| `GET /har/status` | Recording state + entry count |
| `GET /har/replay` | curl/fetch/python code snippets के साथ API map |
| `GET /cookies` | cookies प्राप्त करें |
| `GET /cookies/set` | cookies सेट करें |
| `GET /cookies/delete` | cookies हटाएं |
| `GET /cookies/clear` | सभी cookies साफ़ करें |
| `GET /headers` | custom request headers सेट करें |
| `GET /intercept/start` | request interception शुरू करें |
| `GET /intercept/stop` | request interception रोकें |
| `GET /intercept/requests` | intercepted requests की सूची |
| `GET /request/detail` | request ID के लिए response body प्राप्त करें |
| `GET /response/body` | URL fetch करें और response body लौटाएं |
| `GET /network` | Network traffic stats |
| `GET /download` | file download trigger करें |
### Navigation & State
| Path | Description |
|------|-------------|
| `GET /back` | Browser back |
| `GET /forward` | Browser forward |
| `GET /reload` | page reload करें |
| `GET /stop` | page loading रोकें |
| `GET /pushstate` | history.pushState के माध्यम से SPA navigation |
| `GET /storage/local` | localStorage प्राप्त/सेट करें |
| `GET /storage/session` | sessionStorage प्राप्त/सेट करें |
| `GET /storage/local/clear` | localStorage साफ़ करें |
| `GET /storage/session/clear` | sessionStorage साफ़ करें |
| `GET /session/save` | browser session सहेजें |
| `GET /session/load` | browser session पुनर्स्थापित करें |
| `GET /session/list` | सहेजे गए sessions की सूची |
| `GET /setcontent` | page HTML सीधे सेट करें (POST) |
### Auth Profiles
| Path | Description |
|------|-------------|
| `GET /auth/profile/save` | cookies + storage को named auth profile के रूप में सहेजें |
| `GET /auth/profile/load` | named auth profile को tab में पुनर्स्थापित करें |
| `GET /auth/profile/list` | सहेजे गए auth profiles की सूची |
| `GET /auth/profile/delete` | सहेजा गया auth profile हटाएं |
| `GET /auth/extract` | auth tokens निकालें (JWT, cookies, headers) |
| `GET /set/credentials` | HTTP basic auth credentials सेट करें |
macOS पर, auth profile secrets user Keychain में संग्रहीत होते हैं।
### Emulation
| Path | Params | Description |
|------|--------|-------------|
| `GET /emulate` | device type, screen size | Device emulation |
| `GET /set/viewport` | `width`, `height` | viewport size सेट करें |
| `GET /set/useragent` | `ua` | user agent सेट करें |
| `GET /set/media` | `media` | media type emulate करें |
| `GET /set/offline` | `offline` | offline mode toggle करें |
| `GET /geolocation` | `lat`, `lng` | geolocation override करें |
| `GET /timezone` | `timezone` | timezone override करें (जैसे `America/New_York`) |
| `GET /locale` | `locale` | locale override करें (जैसे `en-US`) |
| `GET /permissions` | `name`, `state` | permissions grant/deny करें (geolocation, notifications, clipboard) |
### Scripts & Injection
| Path | Description |
|------|-------------|
| `GET /script/inject` | page में JavaScript inject करें (nav के दौरान persist रहता है) |
| `GET /initscript/remove` | पहले injected init script हटाएं |
| `GET /addstyle` | CSS stylesheet inject करें |
| `GET /expose` | page JS context में named function expose करें |
### React Inspection
| Path | Description |
|------|-------------|
| `GET /react/tree` | DevTools hook के माध्यम से React component tree |
---
[Read more](https://github.com/justrach/kuri)