@polderlabs/bizar 10.7.1 → 10.7.2
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/.claude/agents/_shared/AGENT_BASELINE.md +266 -0
- package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
- package/.claude/agents/_shared/SKILLS.md +109 -0
- package/.claude/agents/brand-designer.md +55 -0
- package/.claude/agents/exec-assistant.md +34 -0
- package/.claude/agents/help-desk.md +44 -0
- package/.claude/agents/it-lead.md +53 -0
- package/.claude/agents/knowledge-manager.md +49 -0
- package/.claude/agents/office-coordinator.md +39 -0
- package/.claude/agents/office-greeter.md +53 -0
- package/.claude/agents/office-manager.md +287 -0
- package/.claude/agents/principal-engineer.md +58 -0
- package/.claude/agents/qa-reviewer.md +51 -0
- package/.claude/agents/research-analyst.md +53 -0
- package/.claude/agents/senior-engineer.md +55 -0
- package/.claude/agents/support-tech.md +87 -0
- package/.claude/agents/vp-engineering.md +54 -0
- package/.claude/commands/audit.md +48 -0
- package/.claude/commands/bizar.md +22 -0
- package/.claude/commands/cron.md +36 -0
- package/.claude/commands/explain.md +17 -0
- package/.claude/commands/goal.md +99 -0
- package/.claude/commands/init.md +15 -0
- package/.claude/commands/learn.md +46 -0
- package/.claude/commands/plan.md +35 -0
- package/.claude/commands/plow-through.md +50 -0
- package/.claude/commands/pr-review.md +49 -0
- package/.claude/commands/setup-provider.md +96 -0
- package/.claude/commands/spec.md +47 -0
- package/.claude/commands/sprint.md +43 -0
- package/.claude/commands/tailscale-serve.md +100 -0
- package/.claude/commands/team.md +132 -0
- package/.claude/commands/test.md +62 -0
- package/.claude/commands/validate.md +68 -0
- package/.claude/commands/visual-plan.md +24 -0
- package/.claude/hooks/README.md +108 -0
- package/.claude/hooks/__tests__/pretooluse-editwrite.test.mjs +146 -0
- package/.claude/hooks/__tests__/sessionend-recall.test.mjs +256 -0
- package/.claude/hooks/__tests__/sessionstart-prime.test.mjs +325 -0
- package/.claude/hooks/__tests__/thinking-route.test.mjs +319 -0
- package/.claude/hooks/auto-instinct.sh +81 -0
- package/.claude/hooks/learning-extract.mjs +92 -0
- package/.claude/hooks/post-merge-audit.sh +93 -0
- package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
- package/.claude/hooks/pretooluse-bash.mjs +87 -0
- package/.claude/hooks/pretooluse-editwrite.mjs +117 -0
- package/.claude/hooks/sessionend-recall.mjs +384 -0
- package/.claude/hooks/sessionstart-prime.mjs +278 -0
- package/.claude/hooks/thinking-route.mjs +314 -0
- package/.claude/hooks/worker-suggest.mjs +110 -0
- package/.claude/settings.json +167 -0
- package/.claude/skills/9router/SKILL.md +80 -0
- package/.claude/skills/9router-chat/SKILL.md +73 -0
- package/.claude/skills/9router-embeddings/SKILL.md +69 -0
- package/.claude/skills/9router-image/SKILL.md +86 -0
- package/.claude/skills/9router-stt/SKILL.md +79 -0
- package/.claude/skills/9router-tts/SKILL.md +80 -0
- package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
- package/.claude/skills/9router-web-search/SKILL.md +91 -0
- package/.claude/skills/agent-browser/SKILL.md +64 -0
- package/.claude/skills/bizar/README.md +9 -0
- package/.claude/skills/bizar/SKILL.md +447 -0
- package/.claude/skills/cpp-coding-standards/README.md +28 -0
- package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
- package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
- package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
- package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
- package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
- package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
- package/.claude/skills/cpp-testing/README.md +28 -0
- package/.claude/skills/cpp-testing/SKILL.md +304 -0
- package/.claude/skills/cpp-testing/references/coverage.md +370 -0
- package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
- package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
- package/.claude/skills/cpp-testing/references/mocking.md +364 -0
- package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
- package/.claude/skills/cubesandbox/SKILL.md +148 -0
- package/.claude/skills/de-sloppify/SKILL.md +38 -0
- package/.claude/skills/de-sloppify/cleanup.mjs +253 -0
- package/.claude/skills/de-sloppify/cleanup.test.mjs +189 -0
- package/.claude/skills/embedded-esp-idf/README.md +41 -0
- package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
- package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
- package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
- package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
- package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
- package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
- package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
- package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
- package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
- package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
- package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
- package/.claude/skills/glyph/SKILL.md +163 -0
- package/.claude/skills/harness-engineering/SKILL.md +142 -0
- package/.claude/skills/lightrag/SKILL.md +81 -0
- package/.claude/skills/memory-protocol/SKILL.md +105 -0
- package/.claude/skills/obsidian/SKILL.md +306 -0
- package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
- package/.claude/skills/self-improvement/SKILL.md +64 -0
- package/.claude/skills/skillopt/SKILL.md +129 -0
- package/.claude/skills/thinking-archetypes/SKILL.md +90 -0
- package/.claude/skills/thinking-bayesian/SKILL.md +267 -0
- package/.claude/skills/thinking-bounded-rationality/SKILL.md +406 -0
- package/.claude/skills/thinking-circle-of-competence/SKILL.md +216 -0
- package/.claude/skills/thinking-cynefin/SKILL.md +70 -0
- package/.claude/skills/thinking-debiasing/SKILL.md +192 -0
- package/.claude/skills/thinking-dual-process/SKILL.md +282 -0
- package/.claude/skills/thinking-effectuation/SKILL.md +366 -0
- package/.claude/skills/thinking-feedback-loops/SKILL.md +464 -0
- package/.claude/skills/thinking-fermi-estimation/SKILL.md +263 -0
- package/.claude/skills/thinking-first-principles/SKILL.md +167 -0
- package/.claude/skills/thinking-five-whys-plus/SKILL.md +139 -0
- package/.claude/skills/thinking-inversion/SKILL.md +195 -0
- package/.claude/skills/thinking-jobs-to-be-done/SKILL.md +363 -0
- package/.claude/skills/thinking-kepner-tregoe/SKILL.md +154 -0
- package/.claude/skills/thinking-leverage-points/SKILL.md +390 -0
- package/.claude/skills/thinking-lindy-effect/SKILL.md +331 -0
- package/.claude/skills/thinking-map-territory/SKILL.md +111 -0
- package/.claude/skills/thinking-margin-of-safety/SKILL.md +330 -0
- package/.claude/skills/thinking-model-combination/SKILL.md +406 -0
- package/.claude/skills/thinking-model-router/SKILL.md +360 -0
- package/.claude/skills/thinking-model-selection/SKILL.md +341 -0
- package/.claude/skills/thinking-occams-razor/SKILL.md +129 -0
- package/.claude/skills/thinking-ooda/SKILL.md +127 -0
- package/.claude/skills/thinking-opportunity-cost/SKILL.md +360 -0
- package/.claude/skills/thinking-pre-mortem/SKILL.md +170 -0
- package/.claude/skills/thinking-probabilistic/SKILL.md +324 -0
- package/.claude/skills/thinking-red-team/SKILL.md +142 -0
- package/.claude/skills/thinking-regret-minimization/SKILL.md +335 -0
- package/.claude/skills/thinking-reversibility/SKILL.md +326 -0
- package/.claude/skills/thinking-scientific-method/SKILL.md +162 -0
- package/.claude/skills/thinking-second-order/SKILL.md +184 -0
- package/.claude/skills/thinking-socratic/SKILL.md +198 -0
- package/.claude/skills/thinking-steel-manning/SKILL.md +332 -0
- package/.claude/skills/thinking-systems/SKILL.md +238 -0
- package/.claude/skills/thinking-theory-of-constraints/SKILL.md +338 -0
- package/.claude/skills/thinking-thought-experiment/SKILL.md +354 -0
- package/.claude/skills/thinking-triz/SKILL.md +171 -0
- package/.claude/skills/thinking-via-negativa/SKILL.md +358 -0
- package/cli/install/postinstall.mjs +54 -28
- package/cli/install/postinstall.test.mjs +98 -0
- package/package.json +7 -2
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 9router-tts
|
|
3
|
+
description: Text-to-speech via 9Router /v1/audio/speech using OpenAI / ElevenLabs / Deepgram / Edge TTS / Google TTS / Hyperbolic / Inworld voices. Use when the user wants to convert text to speech, generate audio, voiceover, narrate, or read text aloud.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 9Router — Text-to-Speech
|
|
7
|
+
|
|
8
|
+
Requires `NINEROUTER_URL` (and `NINEROUTER_KEY` if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
|
|
9
|
+
|
|
10
|
+
## Discover
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# 1) List models
|
|
14
|
+
curl $NINEROUTER_URL/v1/models/tts | jq '.data[].id'
|
|
15
|
+
# 2) Per-model metadata (params, voicesUrl if voice-by-id)
|
|
16
|
+
curl "$NINEROUTER_URL/v1/models/info?id=el/eleven_multilingual_v2"
|
|
17
|
+
# 3) List voices (elevenlabs, edge-tts, deepgram, inworld, local-device). Optional ?lang=vi
|
|
18
|
+
curl "$NINEROUTER_URL/v1/audio/voices?provider=edge-tts&lang=vi" | jq '.data[].model'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`model` field in `/v1/audio/speech` = voice ID directly (e.g. `edge-tts/vi-VN-HoaiMyNeural`, `el/<voice_id>`, or `openai/tts-1` model+default voice).
|
|
22
|
+
|
|
23
|
+
## Endpoint
|
|
24
|
+
|
|
25
|
+
`POST $NINEROUTER_URL/v1/audio/speech`
|
|
26
|
+
|
|
27
|
+
| Field | Required | Notes |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| `model` | yes | voice ID from `/v1/models/tts` |
|
|
30
|
+
| `input` | yes | text to speak |
|
|
31
|
+
|
|
32
|
+
Query `?response_format=mp3` (default, raw bytes) or `?response_format=json` (`{audio: base64, format}`).
|
|
33
|
+
|
|
34
|
+
## Examples
|
|
35
|
+
|
|
36
|
+
Save MP3:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
curl -X POST "$NINEROUTER_URL/v1/audio/speech" \
|
|
40
|
+
-H "Authorization: Bearer $NINEROUTER_KEY" \
|
|
41
|
+
-H "Content-Type: application/json" \
|
|
42
|
+
-d '{"model":"openai/tts-1","input":"Hello world"}' \
|
|
43
|
+
--output speech.mp3
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
JS (save file):
|
|
47
|
+
|
|
48
|
+
```js
|
|
49
|
+
import { writeFile } from "node:fs/promises";
|
|
50
|
+
const r = await fetch(`${process.env.NINEROUTER_URL}/v1/audio/speech`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
|
|
53
|
+
body: JSON.stringify({ model: "el/eleven_multilingual_v2", input: "Xin chào" }),
|
|
54
|
+
});
|
|
55
|
+
await writeFile("speech.mp3", Buffer.from(await r.arrayBuffer()));
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Response shape
|
|
59
|
+
|
|
60
|
+
Default → raw audio bytes (Content-Type `audio/mp3`).
|
|
61
|
+
|
|
62
|
+
`?response_format=json`:
|
|
63
|
+
```json
|
|
64
|
+
{ "audio": "SUQzBAAAA...", "format": "mp3" }
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Provider quirks (model format)
|
|
68
|
+
|
|
69
|
+
| Provider | `model` format | Notes |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `openai` | `tts-1/alloy` (model/voice) or just voice | Default model `gpt-4o-mini-tts` |
|
|
72
|
+
| `elevenlabs` | `<model_id>/<voice_id>` or `<voice_id>` | Default model `eleven_flash_v2_5`; list voices in Dashboard |
|
|
73
|
+
| `openrouter` | `openai/gpt-4o-mini-tts/alloy` | Streamed via chat-completions audio modality |
|
|
74
|
+
| `edge-tts` | voice id e.g. `vi-VN-HoaiMyNeural` | **noAuth**; default `vi-VN-HoaiMyNeural` |
|
|
75
|
+
| `google-tts` | language code e.g. `en`, `vi` | **noAuth** |
|
|
76
|
+
| `local-device` | OS voice name (`say -v ?` / SAPI) | **noAuth**; needs `ffmpeg` |
|
|
77
|
+
| `deepgram` | `aura-asteria-en` etc | Token auth |
|
|
78
|
+
| `nvidia`, `inworld`, `cartesia`, `playht` | `model/voice` | Provider-specific auth header |
|
|
79
|
+
| `coqui`, `tortoise` | speaker / voice id | Localhost noAuth |
|
|
80
|
+
| `hyperbolic` | model id | Body = `{text}` only |
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 9router-web-fetch
|
|
3
|
+
description: Fetch URL → markdown / text / HTML via 9Router /v1/web/fetch using Firecrawl / Jina Reader / Tavily Extract / Exa Contents. Use when the user wants to scrape a webpage, extract URL content, read article, or convert a URL to markdown.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 9Router — Web Fetch
|
|
7
|
+
|
|
8
|
+
Requires `NINEROUTER_URL` (and `NINEROUTER_KEY` if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
|
|
9
|
+
|
|
10
|
+
## Discover
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
curl $NINEROUTER_URL/v1/models/web | jq '.data[] | select(.kind=="webFetch") | .id'
|
|
14
|
+
# Per-provider params
|
|
15
|
+
curl "$NINEROUTER_URL/v1/models/info?id=firecrawl/fetch"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
IDs end in `/fetch` (e.g. `firecrawl/fetch`, `jina/fetch`). `fetch-combo` chains providers with auto-fallback.
|
|
19
|
+
|
|
20
|
+
## Endpoint
|
|
21
|
+
|
|
22
|
+
`POST $NINEROUTER_URL/v1/web/fetch`
|
|
23
|
+
|
|
24
|
+
| Field | Required | Notes |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| `model` (or `provider`) | yes | from `/v1/models/web` (e.g. `firecrawl` or `jina-reader`) |
|
|
27
|
+
| `url` | yes | URL to extract |
|
|
28
|
+
| `format` | no | `markdown` (default) / `text` / `html` |
|
|
29
|
+
| `max_characters` | no | truncate output |
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Jina Reader
|
|
34
|
+
```bash
|
|
35
|
+
curl -X POST $NINEROUTER_URL/v1/web/fetch \
|
|
36
|
+
-H "Authorization: Bearer $NINEROUTER_KEY" \
|
|
37
|
+
-H "Content-Type: application/json" \
|
|
38
|
+
-d '{"model":"jina-reader","url":"https://9router.com","format":"markdown"}'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Exa
|
|
42
|
+
```bash
|
|
43
|
+
curl -X POST $NINEROUTER_URL/v1/web/fetch \
|
|
44
|
+
-H "Authorization: Bearer $NINEROUTER_KEY" \
|
|
45
|
+
-H "Content-Type: application/json" \
|
|
46
|
+
-d '{"model":"exa","url":"https://example.com","format":"markdown","max_characters":0}'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Firecrawl
|
|
50
|
+
```bash
|
|
51
|
+
curl -X POST $NINEROUTER_URL/v1/web/fetch \
|
|
52
|
+
-H "Authorization: Bearer $NINEROUTER_KEY" \
|
|
53
|
+
-H "Content-Type: application/json" \
|
|
54
|
+
-d '{"model":"firecrawl","url":"https://example.com","format":"markdown","max_characters":0}'
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Tavily
|
|
58
|
+
```bash
|
|
59
|
+
curl -X POST $NINEROUTER_URL/v1/web/fetch \
|
|
60
|
+
-H "Authorization: Bearer $NINEROUTER_KEY" \
|
|
61
|
+
-H "Content-Type: application/json" \
|
|
62
|
+
-d '{"model":"tavily","url":"https://example.com","format":"markdown","max_characters":0}'
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
JS:
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
const r = await fetch(`${process.env.NINEROUTER_URL}/v1/web/fetch`, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
|
|
72
|
+
body: JSON.stringify({ model: "fetch-combo", url: "https://example.com", format: "markdown", max_characters: 5000 }),
|
|
73
|
+
});
|
|
74
|
+
const { data } = await r.json();
|
|
75
|
+
console.log(data.title, data.content.length);
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Response shape
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"provider": "jina-reader",
|
|
83
|
+
"url": "...",
|
|
84
|
+
"title": "...",
|
|
85
|
+
"content": { "format": "markdown", "text": "...", "length": 1234 },
|
|
86
|
+
"metadata": { "author": null, "published_at": null, "language": null },
|
|
87
|
+
"usage": { "fetch_cost_usd": 0 },
|
|
88
|
+
"metrics": { "response_time_ms": 850, "upstream_latency_ms": 700 }
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Provider quirks
|
|
93
|
+
|
|
94
|
+
| Provider | Auth | Best for |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `firecrawl` | Bearer | JS-rendered pages, `format=markdown/html` |
|
|
97
|
+
| `jina-reader` | Bearer (optional) | Free tier (~1M chars/mo); fastest plain markdown |
|
|
98
|
+
| `tavily` | Bearer | Bulk extract; returns `raw_content` |
|
|
99
|
+
| `exa` | `x-api-key` | Pre-indexed pages; fast text extraction |
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 9router-web-search
|
|
3
|
+
description: Web search via 9Router /v1/search using Tavily / Exa / Brave / Serper / SearXNG / Google PSE / Linkup / SearchAPI / You.com / Perplexity. Use when the user wants to search the web, look up information, find articles, or query a search engine.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 9Router — Web Search
|
|
7
|
+
|
|
8
|
+
Requires `NINEROUTER_URL` (and `NINEROUTER_KEY` if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
|
|
9
|
+
|
|
10
|
+
## Discover
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
curl $NINEROUTER_URL/v1/models/web | jq '.data[] | select(.kind=="webSearch") | .id'
|
|
14
|
+
# Per-provider params (searchTypes, maxResults, required options like cx for google-pse)
|
|
15
|
+
curl "$NINEROUTER_URL/v1/models/info?id=tavily/search"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
IDs end in `/search` (e.g. `tavily/search`). Combos (`owned_by:"combo"`) chain providers with auto-fallback.
|
|
19
|
+
|
|
20
|
+
## Endpoint
|
|
21
|
+
|
|
22
|
+
`POST $NINEROUTER_URL/v1/search`
|
|
23
|
+
|
|
24
|
+
| Field | Required | Notes |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| `model` (or `provider`) | yes | from `/v1/models/web` (e.g. `tavily` or `brave`) |
|
|
27
|
+
| `query` | yes | search query |
|
|
28
|
+
| `max_results` | no | default 5 |
|
|
29
|
+
| `search_type` | no | `web` (default) / `news` |
|
|
30
|
+
| `country`, `language`, `time_range`, `domain_filter` | no | provider-dependent |
|
|
31
|
+
|
|
32
|
+
## Examples
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
curl -X POST $NINEROUTER_URL/v1/search \
|
|
36
|
+
-H "Authorization: Bearer $NINEROUTER_KEY" \
|
|
37
|
+
-H "Content-Type: application/json" \
|
|
38
|
+
-d '{"model":"tavily","query":"9Router open source","max_results":5}'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
JS:
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
const r = await fetch(`${process.env.NINEROUTER_URL}/v1/search`, {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: { "Authorization": `Bearer ${process.env.NINEROUTER_KEY}`, "Content-Type": "application/json" },
|
|
47
|
+
body: JSON.stringify({ model: "search-combo", query: "latest LLM benchmarks", max_results: 10 }),
|
|
48
|
+
});
|
|
49
|
+
console.log(await r.json());
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Response shape
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"provider": "tavily",
|
|
57
|
+
"query": "9Router open source",
|
|
58
|
+
"results": [
|
|
59
|
+
{
|
|
60
|
+
"title": "...", "url": "https://...", "display_url": "github.com/...",
|
|
61
|
+
"snippet": "...", "position": 1, "score": 0.92,
|
|
62
|
+
"published_at": null, "favicon_url": null, "content": null,
|
|
63
|
+
"metadata": { "author": null, "language": null, "source_type": null, "image_url": null },
|
|
64
|
+
"citation": { "provider": "tavily", "retrieved_at": "2026-...", "rank": 1 }
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"answer": null,
|
|
68
|
+
"usage": { "queries_used": 1, "search_cost_usd": 0.008 },
|
|
69
|
+
"metrics": { "response_time_ms": 850, "upstream_latency_ms": 700, "total_results_available": 12 },
|
|
70
|
+
"errors": []
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Provider quirks
|
|
75
|
+
|
|
76
|
+
All accept `query` + `max_results`. Optional fields vary:
|
|
77
|
+
|
|
78
|
+
| Provider | Supports | Required extras |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `tavily` | country, domain_filter, news topic | — |
|
|
81
|
+
| `exa` | domain_filter (incl/excl), news category | — |
|
|
82
|
+
| `brave-search` | country, language | — |
|
|
83
|
+
| `serper` | country, language, news endpoint | — |
|
|
84
|
+
| `perplexity` | country, language, domain_filter | — |
|
|
85
|
+
| `linkup` | domain_filter, time_range | `depth: fast/standard/deep` (option) |
|
|
86
|
+
| `google-pse` | country, language, time_range, offset | **`cx` required** (providerOptions) |
|
|
87
|
+
| `searchapi` | country, language, pagination | — |
|
|
88
|
+
| `youcom` | country, language, time_range, domain_filter, full_page | — |
|
|
89
|
+
| `searxng` | language, time_range | Self-hosted, **noAuth** |
|
|
90
|
+
|
|
91
|
+
Provider IS the model — `"provider":"tavily" ≡ "model":"tavily"`.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kevin
|
|
3
|
+
description: Drives a real browser via the kevin Rust CLI or its MCP stdio server. Use for end-to-end web verification — screenshots, accessibility snapshots, click/fill by ref, JS-rendered page interaction. Prefer over curl/HTML parsing for any task that requires a real browser.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# kevin — Browser-Driven E2E
|
|
7
|
+
|
|
8
|
+
## When to use
|
|
9
|
+
|
|
10
|
+
- Verify a web app actually works (screenshot, accessibility snapshot, click flow)
|
|
11
|
+
- Confirm a JS-rendered page contains expected content
|
|
12
|
+
- Capture a snapshot for a PR review or regression baseline
|
|
13
|
+
- Interact with a page that requires real browser semantics (auth, JS, iframes)
|
|
14
|
+
|
|
15
|
+
Skip for static HTML — `WebFetch` or `curl` is faster.
|
|
16
|
+
|
|
17
|
+
## Two ways to call it
|
|
18
|
+
|
|
19
|
+
### 1. Bash + CLI (always available)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
kevin open <url>
|
|
23
|
+
kevin snapshot --json # accessibility tree with refs
|
|
24
|
+
kevin click @e2 # click by ref
|
|
25
|
+
kevin fill @e3 "test@example.com" # fill by ref
|
|
26
|
+
kevin get text @e1
|
|
27
|
+
kevin screenshot page.png
|
|
28
|
+
kevin close
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
100+ typed CLI commands ship with the binary; `kevin --help` is the source of truth.
|
|
32
|
+
|
|
33
|
+
### 2. MCP stdio tools (`mcp__agent-browser__*`)
|
|
34
|
+
|
|
35
|
+
The kevin binary also ships an MCP stdio server (`kevin mcp`). After F-108 it is registered in `.claude/settings.json:mcpServers`, exposing typed tools (`open`, `snapshot`, `click`, `fill`, `screenshot`, `close`, …). Prefer MCP over Bash for typed args — no shell escaping.
|
|
36
|
+
|
|
37
|
+
## Refs vs selectors
|
|
38
|
+
|
|
39
|
+
Prefer **refs** (`@e2`) — stable across page snapshots and independent of DOM structure. Use selectors (`"#submit"`, `role=button[name=Submit]`) only when no snapshot has been taken yet.
|
|
40
|
+
|
|
41
|
+
## Setup
|
|
42
|
+
|
|
43
|
+
If the daemon is not running: `cli/kevin-up.mjs start` (or `bizar browser-agent-up start`).
|
|
44
|
+
|
|
45
|
+
## Plugin system
|
|
46
|
+
|
|
47
|
+
kevin supports plugins — e.g. `kevin-plugin-vault` for credential storage. Configure in `kevin.json`:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"plugins": [
|
|
52
|
+
{ "name": "vault", "command": "kevin-plugin-vault",
|
|
53
|
+
"capabilities": ["credential.read"] }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Natural-language chat
|
|
59
|
+
|
|
60
|
+
`kevin chat "open google.com and search for cats"` translates instructions into kevin commands and streams results. Requires `AI_GATEWAY_API_KEY`.
|
|
61
|
+
|
|
62
|
+
## Where the kevin agent uses this
|
|
63
|
+
|
|
64
|
+
The `@kevin` agent drives this tool exclusively (no Edit/Write access). Dispatch it via Odin for end-to-end web verification tasks — it reads the page, takes a snapshot, and reports back. It never modifies project code.
|