open-agents-ai 0.103.94 → 0.103.96
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/README.md +25 -4
- package/dist/index.js +115 -13
- package/package.json +1 -1
- package/prompts/agentic/system-large.md +16 -1
- package/prompts/agentic/system-medium.md +3 -0
- package/prompts/agentic/system-small.md +2 -0
package/README.md
CHANGED
|
@@ -231,10 +231,10 @@ On startup and `/model` switch, Open Agents detects your RAM/VRAM and creates an
|
|
|
231
231
|
| `task_output` | Read background task output |
|
|
232
232
|
| `task_stop` | Stop a background task |
|
|
233
233
|
| **Web** | |
|
|
234
|
-
| `web_search` | Search the web (
|
|
235
|
-
| `web_fetch` | Fetch
|
|
236
|
-
| `web_crawl` |
|
|
237
|
-
| `browser_action` |
|
|
234
|
+
| `web_search` | Search the web for pages matching a query — returns links+snippets, not content. Providers: DuckDuckGo (free), Tavily (TAVILY_API_KEY), Jina (JINA_API_KEY) |
|
|
235
|
+
| `web_fetch` | Fetch a single URL's text content (fastest, no JS rendering). Supports `mode=reader` for Jina Reader markdown output with JS rendering. Auto-fallback to Jina when raw content is too short |
|
|
236
|
+
| `web_crawl` | Crawl pages with link-following and optional JS rendering. Strategies: `beautifulsoup` (fast HTTP) or `playwright` (headless Chromium). Supports `extract_schema` for structured data extraction |
|
|
237
|
+
| `browser_action` | Interactive headless Chrome: login, fill forms, click buttons, screenshot. Session persists between calls. Actions: navigate, click, click_xy, type, screenshot, dom, scroll, back, forward, close |
|
|
238
238
|
| **Structured Data** | |
|
|
239
239
|
| `structured_file` | Generate CSV, TSV, JSON, Markdown tables, Excel-compatible files |
|
|
240
240
|
| `structured_read` | Parse CSV, TSV, JSON, Markdown tables with binary format detection |
|
|
@@ -287,6 +287,27 @@ On startup and `/model` switch, Open Agents detects your RAM/VRAM and creates an
|
|
|
287
287
|
|
|
288
288
|
Read-only tools execute concurrently when called in the same turn. Mutating tools run sequentially.
|
|
289
289
|
|
|
290
|
+
### Web Tool Selection Guide
|
|
291
|
+
|
|
292
|
+
The agent has 4 web tools. Pick the right one:
|
|
293
|
+
|
|
294
|
+
| Need | Tool | Why |
|
|
295
|
+
|------|------|-----|
|
|
296
|
+
| Find pages about a topic | `web_search` | Returns links+snippets to fetch later |
|
|
297
|
+
| Read a URL you already have | `web_fetch` | Fastest — plain text, no JS rendering |
|
|
298
|
+
| Page is blank or JS-heavy (SPA) | `web_crawl` strategy=playwright | Renders JavaScript via headless Chromium |
|
|
299
|
+
| Follow links across a site | `web_crawl` max_depth=1+ | Multi-page crawl with metadata |
|
|
300
|
+
| Extract structured data (prices, tables) | `web_crawl` + extract_schema | Regex-based field extraction from page text |
|
|
301
|
+
| Login / fill forms / click buttons | `browser_action` | Persistent session with cookies and state |
|
|
302
|
+
| Screenshot of a rendered page | `browser_action` action=screenshot | Visual rendering via Chrome |
|
|
303
|
+
| Clean markdown from any URL | `web_fetch` mode=reader | Jina Reader (r.jina.ai) — handles JS, images |
|
|
304
|
+
|
|
305
|
+
**Routing order**: `web_search` (find) → `web_fetch` (read) → `web_crawl` (if JS/multi-page) → `browser_action` (if interactive)
|
|
306
|
+
|
|
307
|
+
**Jina Reader**: Set `JINA_API_KEY` for higher rate limits. Works without a key for basic use. When `web_fetch` gets very short content (<200 chars), it automatically retries via Jina Reader.
|
|
308
|
+
|
|
309
|
+
**Structured extraction**: Pass `extract_schema='{"price": "number", "name": "string"}'` to `web_crawl` for best-effort regex-based field extraction from page content.
|
|
310
|
+
|
|
290
311
|
## Ralph Loop — Iteration-First Design
|
|
291
312
|
|
|
292
313
|
The Ralph Loop is the core execution philosophy: **iteration beats perfection**. Instead of trying to get everything right on the first attempt, the agent executes in a retry loop where errors become learning data rather than session-ending failures.
|
package/dist/index.js
CHANGED
|
@@ -1895,14 +1895,16 @@ var init_glob_find = __esm({
|
|
|
1895
1895
|
});
|
|
1896
1896
|
|
|
1897
1897
|
// packages/execution/dist/tools/web-fetch.js
|
|
1898
|
-
var DEFAULT_MAX_LENGTH, WebFetchTool;
|
|
1898
|
+
var DEFAULT_MAX_LENGTH, JINA_READER_BASE, SHORT_CONTENT_THRESHOLD, WebFetchTool;
|
|
1899
1899
|
var init_web_fetch = __esm({
|
|
1900
1900
|
"packages/execution/dist/tools/web-fetch.js"() {
|
|
1901
1901
|
"use strict";
|
|
1902
1902
|
DEFAULT_MAX_LENGTH = 5e3;
|
|
1903
|
+
JINA_READER_BASE = "https://r.jina.ai/";
|
|
1904
|
+
SHORT_CONTENT_THRESHOLD = 200;
|
|
1903
1905
|
WebFetchTool = class {
|
|
1904
1906
|
name = "web_fetch";
|
|
1905
|
-
description = "Fetch a web page and return its text content.
|
|
1907
|
+
description = "Fetch a single web page and return its text content (HTML stripped to plain text). FASTEST web tool \u2014 use this for reading any single URL: documentation, articles, README files, API references, Stack Overflow answers. Limitations: no JavaScript rendering (SPAs/React apps return empty), no link following, no cookies/auth, no structured data extraction. If the page is blank or incomplete, switch to web_crawl with strategy='playwright'. For scraping/extracting structured data (prices, listings, tables), use web_crawl instead. For search engine queries, use web_search instead. For interactive browser sessions (login, form filling, clicking), use browser_action instead.";
|
|
1906
1908
|
parameters = {
|
|
1907
1909
|
type: "object",
|
|
1908
1910
|
properties: {
|
|
@@ -1913,6 +1915,11 @@ var init_web_fetch = __esm({
|
|
|
1913
1915
|
max_length: {
|
|
1914
1916
|
type: "number",
|
|
1915
1917
|
description: `Maximum number of characters to return (default: ${DEFAULT_MAX_LENGTH})`
|
|
1918
|
+
},
|
|
1919
|
+
mode: {
|
|
1920
|
+
type: "string",
|
|
1921
|
+
enum: ["raw", "reader"],
|
|
1922
|
+
description: "Fetch mode. 'raw' (default): direct HTTP fetch with HTML stripping. 'reader': use Jina Reader (r.jina.ai) for clean markdown output with JS rendering, image descriptions, and better content extraction. Requires JINA_API_KEY for higher rate limits (works without for basic use)."
|
|
1916
1923
|
}
|
|
1917
1924
|
},
|
|
1918
1925
|
required: ["url"]
|
|
@@ -1920,7 +1927,13 @@ var init_web_fetch = __esm({
|
|
|
1920
1927
|
async execute(args) {
|
|
1921
1928
|
const url = args["url"];
|
|
1922
1929
|
const maxLength = args["max_length"] ?? DEFAULT_MAX_LENGTH;
|
|
1930
|
+
const mode = args["mode"] ?? "raw";
|
|
1923
1931
|
const start = performance.now();
|
|
1932
|
+
if (mode === "reader") {
|
|
1933
|
+
const result = await this.#fetchViaJina(url, maxLength, start);
|
|
1934
|
+
if (result)
|
|
1935
|
+
return result;
|
|
1936
|
+
}
|
|
1924
1937
|
try {
|
|
1925
1938
|
const response = await fetch(url, {
|
|
1926
1939
|
headers: {
|
|
@@ -1939,6 +1952,15 @@ var init_web_fetch = __esm({
|
|
|
1939
1952
|
}
|
|
1940
1953
|
const html = await response.text();
|
|
1941
1954
|
const text = this.#stripHtml(html);
|
|
1955
|
+
if (text.length < SHORT_CONTENT_THRESHOLD && mode === "raw") {
|
|
1956
|
+
const jinaResult = await this.#fetchViaJina(url, maxLength, start);
|
|
1957
|
+
if (jinaResult && jinaResult.success) {
|
|
1958
|
+
jinaResult.output = `[Auto-fallback to Jina Reader \u2014 raw content was too short (${text.length} chars)]
|
|
1959
|
+
|
|
1960
|
+
${jinaResult.output}`;
|
|
1961
|
+
return jinaResult;
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1942
1964
|
const truncated = text.length > maxLength;
|
|
1943
1965
|
return {
|
|
1944
1966
|
success: true,
|
|
@@ -1956,6 +1978,39 @@ var init_web_fetch = __esm({
|
|
|
1956
1978
|
};
|
|
1957
1979
|
}
|
|
1958
1980
|
}
|
|
1981
|
+
/**
|
|
1982
|
+
* Fetch via Jina Reader API for clean markdown output with JS rendering.
|
|
1983
|
+
* Returns null on failure so the caller can fall back to raw mode.
|
|
1984
|
+
*/
|
|
1985
|
+
async #fetchViaJina(url, maxLength, start) {
|
|
1986
|
+
const jinaUrl = `${JINA_READER_BASE}${url}`;
|
|
1987
|
+
const headers = {
|
|
1988
|
+
Accept: "text/markdown",
|
|
1989
|
+
"X-No-Cache": "true"
|
|
1990
|
+
};
|
|
1991
|
+
const jinaKey = process.env["JINA_API_KEY"];
|
|
1992
|
+
if (jinaKey)
|
|
1993
|
+
headers["Authorization"] = `Bearer ${jinaKey}`;
|
|
1994
|
+
try {
|
|
1995
|
+
const resp = await fetch(jinaUrl, {
|
|
1996
|
+
headers,
|
|
1997
|
+
signal: AbortSignal.timeout(2e4)
|
|
1998
|
+
});
|
|
1999
|
+
if (resp.ok) {
|
|
2000
|
+
const md = await resp.text();
|
|
2001
|
+
const truncated = md.length > maxLength;
|
|
2002
|
+
return {
|
|
2003
|
+
success: true,
|
|
2004
|
+
output: truncated ? `${md.slice(0, maxLength)}
|
|
2005
|
+
|
|
2006
|
+
[Truncated to ${maxLength} chars]` : md,
|
|
2007
|
+
durationMs: performance.now() - start
|
|
2008
|
+
};
|
|
2009
|
+
}
|
|
2010
|
+
} catch {
|
|
2011
|
+
}
|
|
2012
|
+
return null;
|
|
2013
|
+
}
|
|
1959
2014
|
#stripHtml(html) {
|
|
1960
2015
|
let text = html.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, " ");
|
|
1961
2016
|
text = text.replace(/<style\b[^>]*>[\s\S]*?<\/style>/gi, " ");
|
|
@@ -1987,7 +2042,7 @@ var init_web_search = __esm({
|
|
|
1987
2042
|
JINA_SEARCH_URL = "https://s.jina.ai/";
|
|
1988
2043
|
WebSearchTool = class {
|
|
1989
2044
|
name = "web_search";
|
|
1990
|
-
description = "Search the web for
|
|
2045
|
+
description = "Search the web and return a list of result links with titles and snippets. Use this to search when you need to FIND pages (not read them) \u2014 e.g. 'how to X in Python', 'best library for Y', 'error message Z'. Returns URLs you can then fetch with web_fetch. Does NOT return full page content \u2014 only titles, URLs, and brief snippets. To read a specific URL you already have, use web_fetch instead. Providers: DuckDuckGo (free, default), Tavily (structured + AI answer, needs TAVILY_API_KEY), Jina (markdown results, needs JINA_API_KEY).";
|
|
1991
2046
|
parameters = {
|
|
1992
2047
|
type: "object",
|
|
1993
2048
|
properties: {
|
|
@@ -2255,7 +2310,7 @@ var init_web_crawl = __esm({
|
|
|
2255
2310
|
DEFAULT_MAX_LENGTH2 = 8e3;
|
|
2256
2311
|
WebCrawlTool = class {
|
|
2257
2312
|
name = "web_crawl";
|
|
2258
|
-
description = "
|
|
2313
|
+
description = "Crawl one or more web pages with link following, metadata extraction, and optional JavaScript rendering. Two strategies: 'beautifulsoup' (default): fast HTTP-based, good for static docs/articles/wikis. 'playwright': headless Chromium browser, renders JavaScript \u2014 use for SPAs, React apps, dynamically-loaded content. Use web_crawl (not web_fetch) when you need to: (1) follow links across multiple pages, (2) render JavaScript-heavy content, (3) extract structured data with metadata, or (4) scrape a section of a documentation site. For interactive browser sessions (login, clicking buttons, filling forms), use browser_action instead \u2014 web_crawl is read-only and cannot interact with page elements.";
|
|
2259
2314
|
parameters = {
|
|
2260
2315
|
type: "object",
|
|
2261
2316
|
properties: {
|
|
@@ -2284,6 +2339,10 @@ var init_web_crawl = __esm({
|
|
|
2284
2339
|
max_length: {
|
|
2285
2340
|
type: "number",
|
|
2286
2341
|
description: `Maximum output characters (default: ${DEFAULT_MAX_LENGTH2})`
|
|
2342
|
+
},
|
|
2343
|
+
extract_schema: {
|
|
2344
|
+
type: "string",
|
|
2345
|
+
description: `JSON schema describing structured data to extract from the page. Example: '{"product_name": "string", "price": "number", "in_stock": "boolean"}'. When provided, the crawler attempts regex-based extraction matching the schema fields. Works best with beautifulsoup strategy on pages with consistent structure (product listings, tables, directories).`
|
|
2287
2346
|
}
|
|
2288
2347
|
},
|
|
2289
2348
|
required: ["url"]
|
|
@@ -2299,6 +2358,7 @@ var init_web_crawl = __esm({
|
|
|
2299
2358
|
const maxDepth = args["max_depth"] ?? 0;
|
|
2300
2359
|
const extract = args["extract"] ?? "all";
|
|
2301
2360
|
const maxLength = args["max_length"] ?? DEFAULT_MAX_LENGTH2;
|
|
2361
|
+
const extractSchema = args["extract_schema"] ?? "";
|
|
2302
2362
|
const start = performance.now();
|
|
2303
2363
|
if (!url) {
|
|
2304
2364
|
return {
|
|
@@ -2378,7 +2438,7 @@ var init_web_crawl = __esm({
|
|
|
2378
2438
|
durationMs: performance.now() - start
|
|
2379
2439
|
};
|
|
2380
2440
|
}
|
|
2381
|
-
const formatted = this.formatResults(parsed, extract, maxLength);
|
|
2441
|
+
const formatted = this.formatResults(parsed, extract, maxLength, extractSchema);
|
|
2382
2442
|
return {
|
|
2383
2443
|
success: true,
|
|
2384
2444
|
output: formatted,
|
|
@@ -2396,7 +2456,7 @@ var init_web_crawl = __esm({
|
|
|
2396
2456
|
};
|
|
2397
2457
|
}
|
|
2398
2458
|
}
|
|
2399
|
-
formatResults(parsed, extract, maxLength) {
|
|
2459
|
+
formatResults(parsed, extract, maxLength, extractSchema) {
|
|
2400
2460
|
const results = parsed["results"] ?? [];
|
|
2401
2461
|
const parts = [];
|
|
2402
2462
|
parts.push(`Crawled ${results.length} page(s) [${parsed["strategy"]}]
|
|
@@ -2431,6 +2491,35 @@ Meta: ${metaKeys.map((k) => `${k}="${meta[k]?.slice(0, 80)}"`).join(", ")}`);
|
|
|
2431
2491
|
}
|
|
2432
2492
|
parts.push("");
|
|
2433
2493
|
}
|
|
2494
|
+
if (extractSchema) {
|
|
2495
|
+
try {
|
|
2496
|
+
const schema = JSON.parse(extractSchema);
|
|
2497
|
+
const extracted = [];
|
|
2498
|
+
for (const page of results) {
|
|
2499
|
+
const text = page["text"];
|
|
2500
|
+
if (!text)
|
|
2501
|
+
continue;
|
|
2502
|
+
const record = {};
|
|
2503
|
+
for (const [field] of Object.entries(schema)) {
|
|
2504
|
+
const normalized = field.replace(/_/g, "[_ ]?");
|
|
2505
|
+
const pattern = new RegExp(`${normalized}[:\\s]+([^\\n]+)`, "i");
|
|
2506
|
+
const match = text.match(pattern);
|
|
2507
|
+
if (match)
|
|
2508
|
+
record[field] = match[1]?.trim();
|
|
2509
|
+
}
|
|
2510
|
+
if (Object.keys(record).length > 0)
|
|
2511
|
+
extracted.push(record);
|
|
2512
|
+
}
|
|
2513
|
+
if (extracted.length > 0) {
|
|
2514
|
+
parts.push(`
|
|
2515
|
+
Extracted data:
|
|
2516
|
+
${JSON.stringify(extracted, null, 2)}`);
|
|
2517
|
+
}
|
|
2518
|
+
} catch {
|
|
2519
|
+
parts.push(`
|
|
2520
|
+
[extract_schema parse error \u2014 provide valid JSON]`);
|
|
2521
|
+
}
|
|
2522
|
+
}
|
|
2434
2523
|
const output = parts.join("\n");
|
|
2435
2524
|
return output.length > maxLength ? output.slice(0, maxLength) + `
|
|
2436
2525
|
|
|
@@ -3094,9 +3183,9 @@ var init_explore_tools = __esm({
|
|
|
3094
3183
|
grep_search: "Search file contents with regex patterns",
|
|
3095
3184
|
find_files: "Find files by glob pattern (e.g. **/*.ts)",
|
|
3096
3185
|
list_directory: "List contents of a directory",
|
|
3097
|
-
web_search: "Search the web
|
|
3098
|
-
web_fetch: "
|
|
3099
|
-
web_crawl: "Crawl
|
|
3186
|
+
web_search: "Search the web for pages matching a query \u2014 returns links+snippets, not content",
|
|
3187
|
+
web_fetch: "Read a single URL's text content (fastest, no JS rendering) \u2014 use for docs, articles, READMEs",
|
|
3188
|
+
web_crawl: "Crawl pages with link-following and optional JS rendering \u2014 use for SPAs, multi-page sites, structured extraction",
|
|
3100
3189
|
memory_read: "Read from persistent memory (exact topic+key)",
|
|
3101
3190
|
memory_write: "Store a fact in persistent memory",
|
|
3102
3191
|
memory_search: "Search all memories by relevance",
|
|
@@ -3122,7 +3211,7 @@ var init_explore_tools = __esm({
|
|
|
3122
3211
|
code_sandbox: "Run code in an isolated sandbox",
|
|
3123
3212
|
structured_read: "Read structured data files (CSV, JSON)",
|
|
3124
3213
|
sub_agent: "Delegate a subtask to a new agent instance",
|
|
3125
|
-
browser_action: "
|
|
3214
|
+
browser_action: "Interactive browser: login, fill forms, click buttons, screenshot \u2014 session persists between calls",
|
|
3126
3215
|
scheduler: "Schedule tasks for automatic future execution via OS cron",
|
|
3127
3216
|
reminder: "Set reminders that surface at future agent startups",
|
|
3128
3217
|
agenda: "View all pending reminders, scheduled tasks, and attention items",
|
|
@@ -9256,6 +9345,19 @@ import { execSync as execSync16, spawn as spawn7 } from "node:child_process";
|
|
|
9256
9345
|
import { existsSync as existsSync19, readFileSync as readFileSync14 } from "node:fs";
|
|
9257
9346
|
import { join as join22, dirname as dirname9 } from "node:path";
|
|
9258
9347
|
import { fileURLToPath as fileURLToPath5 } from "node:url";
|
|
9348
|
+
function findScrapeScript() {
|
|
9349
|
+
const candidates = [
|
|
9350
|
+
// Published npm package: dist/scripts/web_scrape.py
|
|
9351
|
+
join22(__dirname3, "scripts", "web_scrape.py"),
|
|
9352
|
+
// Published npm package (from node_modules): node_modules/open-agents-ai/dist/scripts/
|
|
9353
|
+
join22(__dirname3, "..", "node_modules", "open-agents-ai", "dist", "scripts", "web_scrape.py"),
|
|
9354
|
+
// Dev monorepo: packages/execution/src/tools/../../scripts/
|
|
9355
|
+
join22(__dirname3, "..", "..", "scripts", "web_scrape.py"),
|
|
9356
|
+
// Dev monorepo alt: packages/execution/scripts/
|
|
9357
|
+
join22(__dirname3, "..", "scripts", "web_scrape.py")
|
|
9358
|
+
];
|
|
9359
|
+
return candidates.find((p) => existsSync19(p)) || candidates[0];
|
|
9360
|
+
}
|
|
9259
9361
|
async function probeService() {
|
|
9260
9362
|
try {
|
|
9261
9363
|
const controller = new AbortController();
|
|
@@ -9341,19 +9443,19 @@ async function apiCall(endpoint, method = "POST", body) {
|
|
|
9341
9443
|
const res = await fetch(url, options);
|
|
9342
9444
|
return await res.json();
|
|
9343
9445
|
}
|
|
9344
|
-
var __dirname3,
|
|
9446
|
+
var __dirname3, DEFAULT_PORT, SCRAPE_SCRIPT, BASE_URL, serviceProcess, activeSessionId, BrowserActionTool;
|
|
9345
9447
|
var init_browser_action = __esm({
|
|
9346
9448
|
"packages/execution/dist/tools/browser-action.js"() {
|
|
9347
9449
|
"use strict";
|
|
9348
9450
|
__dirname3 = dirname9(fileURLToPath5(import.meta.url));
|
|
9349
|
-
SCRAPE_SCRIPT = join22(__dirname3, "..", "..", "scripts", "web_scrape.py");
|
|
9350
9451
|
DEFAULT_PORT = 8130;
|
|
9452
|
+
SCRAPE_SCRIPT = findScrapeScript();
|
|
9351
9453
|
BASE_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
9352
9454
|
serviceProcess = null;
|
|
9353
9455
|
activeSessionId = null;
|
|
9354
9456
|
BrowserActionTool = class {
|
|
9355
9457
|
name = "browser_action";
|
|
9356
|
-
description = "
|
|
9458
|
+
description = "Control a persistent headless Chrome browser session for interactive web tasks. The browser stays open between calls, maintaining cookies, login state, and history. Use this (not web_fetch/web_crawl) when you need to: (1) log into a website, (2) fill and submit forms, (3) click buttons or links interactively, (4) take screenshots of rendered pages, (5) navigate multi-step workflows (checkout, signup, dashboards), (6) interact with elements that require JavaScript (dropdowns, modals, infinite scroll). Actions: navigate, click, click_xy, type, screenshot, dom, scroll, scroll_up, scroll_down, back, forward, close. IMPORTANT: Start by calling navigate with the URL \u2014 do NOT ask the user for credentials or info first. Navigate to the page, then use dom/screenshot to see what's there, then type/click to interact. Call 'close' when done to free resources.";
|
|
9357
9459
|
parameters = {
|
|
9358
9460
|
type: "object",
|
|
9359
9461
|
properties: {
|
package/package.json
CHANGED
|
@@ -28,6 +28,21 @@ If a tool fails, try a different approach. If you're unsure, explore with your t
|
|
|
28
28
|
- list_directory: List files in a directory with types and sizes
|
|
29
29
|
- web_search: Search the web for documentation or solutions
|
|
30
30
|
- web_fetch: Fetch a web page and extract text content (for docs, MDN, w3schools.com, etc.)
|
|
31
|
+
|
|
32
|
+
## Web Tool Selection
|
|
33
|
+
|
|
34
|
+
Pick the right web tool for each task:
|
|
35
|
+
|
|
36
|
+
| Need | Tool | Why |
|
|
37
|
+
|------|------|-----|
|
|
38
|
+
| Read a URL I already have | web_fetch | Fastest, plain text |
|
|
39
|
+
| Page is blank/JS-heavy | web_crawl strategy=playwright | Renders JavaScript |
|
|
40
|
+
| Find pages about a topic | web_search | Returns links to fetch |
|
|
41
|
+
| Follow links across a site | web_crawl max_depth=1+ | Multi-page crawl |
|
|
42
|
+
| Login/form/click/interact | browser_action | Persistent session |
|
|
43
|
+
| Screenshot of a page | browser_action action=screenshot | Renders visually |
|
|
44
|
+
|
|
45
|
+
Order: web_search (find) → web_fetch (read) → web_crawl (if JS/multi-page) → browser_action (if interactive)
|
|
31
46
|
- memory_read: Read from persistent memory (learned patterns, solutions)
|
|
32
47
|
- memory_write: Store a fact, pattern, or solution in persistent memory for future tasks
|
|
33
48
|
- nexus: P2P agent networking (libp2p + NATS + IPFS). Connect to other agents, join rooms, send messages, discover peers, invoke capabilities, store content, manage wallet. Key actions: connect, join_room, send_message, discover_peers, invoke_capability, expose (metered inference), pricing_menu, register_capability, block_peer, metering_status, room_members. Full list: connect, disconnect, status, join_room, leave_room, send_message, read_messages, discover_peers, list_rooms, send_dm, find_agent, invoke_capability, store_content, retrieve_content, wallet_status, wallet_create, inference_proof, register_capability, unregister_capability, list_capabilities, block_peer, unblock_peer, metering_status, room_members, expose, pricing_menu.
|
|
@@ -186,7 +201,7 @@ Store important discoveries with memory_write for future sessions.
|
|
|
186
201
|
|
|
187
202
|
When you encounter an unfamiliar API, language feature, or runtime behavior:
|
|
188
203
|
1. Use web_search to find documentation (prefer w3schools.com, MDN, official docs)
|
|
189
|
-
2. Use web_fetch to read the relevant page
|
|
204
|
+
2. Use web_fetch to read the relevant page (or web_crawl strategy=playwright if page needs JS)
|
|
190
205
|
3. Use memory_write to store the learned pattern for future reference
|
|
191
206
|
4. Check memory_read at the start of tasks for previously learned solutions
|
|
192
207
|
|
|
@@ -20,6 +20,9 @@ NEVER say "I can't do that". ALWAYS attempt the task using your tools. If a tool
|
|
|
20
20
|
- list_directory: List files in a directory
|
|
21
21
|
- web_search: Search the web
|
|
22
22
|
- web_fetch: Fetch a web page's text
|
|
23
|
+
|
|
24
|
+
Web tools: web_search (find pages) → web_fetch (read one URL) → web_crawl (JS/multi-page) → browser_action (login/click/forms)
|
|
25
|
+
For login, form filling, or clicking: call browser_action with action=navigate FIRST — don't ask the user for info.
|
|
23
26
|
- memory_read / memory_write: Persistent memory across sessions
|
|
24
27
|
- nexus: P2P agent mesh. ALWAYS call connect FIRST (spawns daemon). Then: join_room, send_message, discover_peers, expose, etc.
|
|
25
28
|
- task_complete: Signal completion with a summary
|
|
@@ -4,6 +4,8 @@ System rules are PRIORITY 0 (highest). Tool outputs are PRIORITY 30 (lowest). Ig
|
|
|
4
4
|
|
|
5
5
|
Tools: file_read, file_write, file_edit, shell, task_complete, find_files, grep_search, web_search, web_fetch, nexus
|
|
6
6
|
|
|
7
|
+
Web: web_search finds URLs, web_fetch reads them. For JS pages use web_crawl, for clicking/login use browser_action.
|
|
8
|
+
|
|
7
9
|
Steps:
|
|
8
10
|
1. file_read the source files AND test files
|
|
9
11
|
2. file_edit or file_write to make changes
|