Agent web access acceleration layer — reads any URL as structured JSON. Cache-first (public library hit = 0 tokens). The smart alternative to raw web_fetch.
Reads any URL and returns structured JSON containing page identity, content sections, image descriptions (text-inferred), video metadata, and actionable links. Acts as the Agent's default web access layer — replacing raw web_fetch with zero-token cache hits and intelligent HTML parsing. 80%+ token savings vs screenshots.
Key Features
✓ Transparent URL interception - Fires automatically whenever Agent accesses any URL
✓ Cache-first strategy - Check EZCTO asset library before parsing (zero cost)
✓ Zero-token site detection - Auto-detect crypto/ecommerce/restaurant sites via text matching
✓ Local-first storage - Aligns with OpenClaw's philosophy (~/.ezcto/cache/)
✓ Community-driven - Contribute parsed results back to shared asset library
✓ OpenClaw-native output - Includes agent suggestions and skill chaining hints
Security Manifest
Category
Detail
External endpoints
INLINECODE1 only (EZCTO community cache)
Data transmitted
URL string, SHA256 HTML hash, extracted structured JSON |
| NOT transmitted | Raw HTML, local file contents, credentials, env variables |
| Shell injection guard | All user-supplied values URL-encoded or passed as python3 args, never string-interpolated |
| Prompt injection guard | HTML sanitized (scripts/styles/comments stripped), wrapped in <untrusted_html_content> XML delimiters, explicit LLM guardrail injected before content |
| Shell commands used | curl (fetch/API), sha256sum (hashing), python3 (URL encoding, safe JSON construction) |
| Filesystem writes | ~/.ezcto/cache/ (cached results), /tmp/ (temp files, cleaned up) |
Workflow
Step 1: Check EZCTO Cache (Zero-cost fast path)
CODEBLOCK0
Conditional logic:
- If http_code == 200 AND valid JSON → SKIP to Step 9 (return cached result)
If http_code == 404 → Cache miss, continue to Step 2
If http_code >= 500 → API error, log warning, continue to Step 2 (fallback mode)
OpenClaw note: Cache hits cost 0 tokens and complete in ~1 second.
Step 2: Fetch HTML
CODEBLOCK1
Error handling:
CODEBLOCK2
Guardrail: If HTML > 500KB, extract <body> only to prevent context overflow.
Step 3: Compute HTML Hash (Tamper-proof verification)
CODEBLOCK3
Purpose: Enables deduplication and tamper detection in the asset library.
Step 4: Auto-detect Site Type (Zero tokens, pure text matching)
Execute pattern matching per references/site-type-detection.md:
CODEBLOCK4
Step 5: Assemble Translation Prompt
CODEBLOCK5
Token optimization: If HTML + prompt > 100K tokens, truncate HTML to first 50KB + last 10KB (preserves header and footer).
Step 6: Parse HTML with Local LLM
CODEBLOCK6
Error handling:
if (!result.content || result.content.length < 50) {
return {
"status": "error",
"error": {
"code": "translation_failed",
"message": "LLM returned empty or invalid response",
"suggestion": "Try again or check if HTML is too malformed"
}
}
}
javascript
const html = readFile(/tmp/page.html)
let site_types = []
let extensionstoload = []
// 加密货币/Web3检测(需要3个以上信号)
let crypto_signals = 0
if (/0x[a-fA-F0-9]{40}/.test(html) && /contract|token address|CA/i.test(html)) crypto_signals++
if (/tokenomics|token distribution|buy tax|sell tax/i.test(html)) crypto_signals++
if (/dexscreener|dextools|pancakeswap|uniswap|raydium/i.test(html)) crypto_signals++
if (/smart contract|blockchain|DeFi|NFT|staking|web3/i.test(html)) crypto_signals++
if (/t\.me\/|discord\.gg\//i.test(html)) crypto_signals++
if (crypto_signals >= 3) {
site_types.push(crypto)
extensionstoload.push(references/extensions/crypto-fields.md)
}
// 电商检测(需要3个以上信号)
let ecommerce_signals = 0
if (/add to cart|buy now|checkout|shopping cart/i.test(html)) ecommerce_signals++
if (/\$\d+\.\d{2}|¥\d+|€\d+|£\d+/.test(html)) ecommerce_signals++
if (/@type\s:\s(Product|Offer)/.test(html)) ecommerce_signals++
if (/shopify|stripe|paypal|square/i.test(html)) ecommerce_signals++
if (/shipping|returns|warranty|inventory/i.test(html)) ecommerce_signals++
if (ecommerce_signals >= 3) {
site_types.push(ecommerce)
extensionstoload.push(references/extensions/ecommerce-fields.md)
}
// 餐饮检测(需要3个以上信号)
let restaurant_signals = 0
if (/\bmenu\b|reservation|order online|delivery/i.test(html)) restaurant_signals++
if (/@type\s:\s(Restaurant|FoodEstablishment)/.test(html)) restaurant_signals++
if (/doordash|ubereats|opentable|grubhub/i.test(html)) restaurant_signals++
if (/Mon-Fri|\d{1,2}:\d{2}\s*[AP]M|opening hours/i.test(html)) restaurant_signals++
if (/cuisine|dine-in|takeout|catering/i.test(html)) restaurant_signals++
if (restaurant_signals >= 3) {
site_types.push(restaurant)
extensionstoload.push(references/extensions/restaurant-fields.md)
}