{"id":"de23e251-4a0a-4857-9ed6-36a88140de4e","entityType":"agent","slug":"clawhub-cotghw-pricewin-hotel-deal-finder","name":"pricewin-hotel-deal-finder","canonicalUrl":"https://www.xpersona.co/agent/clawhub-cotghw-pricewin-hotel-deal-finder","canonicalPath":"/agent/clawhub-cotghw-pricewin-hotel-deal-finder","generatedAt":"2026-10-10T21:58:22.200Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:20:49.873Z","emptyReason":null},"description":"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s172fjj2a78x4zgds5wc81z66188qh8e:pricewin-hotel-deal-finder","sourceUrl":"https://clawhub.ai/cotghw/pricewin-hotel-deal-finder","homepage":"https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/cotghw/pricewin-hotel-deal-finder","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"pricewin-hotel-deal-finder technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:20:49.873Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:20:49.873Z","emptyReason":null},"stars":null,"forks":null,"downloads":1341,"packageName":null,"latestVersion":"1.1.3","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:20:49.495Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T16:20:49.873Z","lastCrawledAt":"2026-10-10T16:20:49.495Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T16:20:49.495Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.3","createdAt":"2026-08-02T14:27:26.480Z","changelog":"pricewin-hotel-deal-finder v1.1.3 - Updated documentation in SKILL.md for clearer operation rules and usage instructions. - Removed redundant skill-card.md file. - Minor security and metadata improvements in SECURITY.md and package.json. - Internal code and script improvements for reliability (bin/browse.js, bin/daemon.js, lib/browser-state.js).","fileCount":14,"zipByteSize":44092},{"version":"1.1.2","createdAt":"2026-07-14T05:20:02.633Z","changelog":"Version 1.1.2 of pricewin-hotel-deal-finder - Added SECURITY.md to improve documentation of security practices. - Updated SKILL.md to clarify operation rules and usage instructions, with a more concise and user-friendly presentation. - Refined guidance on inferring parameters and handling ambiguous cases before running the main command. - Simplified technical rules, emphasizing the exclusive use of search.js for all scraping actions. - Removed outdated documentation file (skill-card.md). - General code and documentation cleanups for better reliability and clarity.","fileCount":14,"zipByteSize":41195},{"version":"1.1.1","createdAt":"2026-07-11T06:18:43.461Z","changelog":"## pricewin-hotel-deal-finder v1.1.1 - Updated metadata to version 1.1.1 (no functional code or behavior changes) - No other changes; documentation and dependencies bumped only","fileCount":13,"zipByteSize":38245},{"version":"1.1.0","createdAt":"2026-07-11T06:16:15.947Z","changelog":"**Skill renamed and key documentation updated.** - Renamed skill from `pricewin-deal-finder` to `pricewin-hotel-deal-finder` for clarity. - Updated documentation, including `SKILL.md`, to reflect the new skill name throughout all instructions, install commands, and usage references. - Removed obsolete `skill-card.md` file. - No core functionality changes; all command usage and critical rules remain the same.","fileCount":13,"zipByteSize":38268},{"version":"1.0.1","createdAt":"2026-07-10T04:00:57.879Z","changelog":"- Bumped version to 1.0.1. - Updated SKILL.md to reflect new version and maintainers; no functional or behavioral changes to the skill's usage or the user workflow. - No code changes impacting user interaction or API behavior.","fileCount":12,"zipByteSize":36996},{"version":"1.0.0","createdAt":"2026-07-10T03:34:37.103Z","changelog":"PriceWin Hotel Deal Finder v1.0.0 - Initial release for hotel price comparison. - Instantly compares live hotel prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city and travel dates. - One command returns ranked best-value, cheapest, and quality hotel picks with direct booking links in USD. - Handles bot-protected cities via built-in Patchright daemon for reliable results. - Requires only Node.js; no API keys or external configuration needed. - Strict instructions for single-command use and output formatting to ensure consistent, high-quality responses.","fileCount":12,"zipByteSize":36998}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s172fjj2a78x4zgds5wc81z66188qh8e:pricewin-hotel-deal-finder","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s172fjj2a78x4zgds5wc81z66188qh8e:pricewin-hotel-deal-finder` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/cotghw/pricewin-hotel-deal-finder before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T21:58:22.197Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cotghw-pricewin-hotel-deal-finder/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T16:20:49.873Z","emptyReason":null},"readme":"Skill: pricewin-hotel-deal-finder\n\nOwner: cotghw\n\nSummary: Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\n\nTags: latest:1.1.3\n\nVersion history:\n\nv1.1.3 | 2026-08-02T14:27:26.480Z | auto\n\npricewin-hotel-deal-finder v1.1.3\n\n- Updated documentation in SKILL.md for clearer operation rules and usage instructions.\n- Removed redundant skill-card.md file.\n- Minor security and metadata improvements in SECURITY.md and package.json.\n- Internal code and script improvements for reliability (bin/browse.js, bin/daemon.js, lib/browser-state.js).\n\nv1.1.2 | 2026-07-14T05:20:02.633Z | auto\n\nVersion 1.1.2 of pricewin-hotel-deal-finder\n\n- Added SECURITY.md to improve documentation of security practices.\n- Updated SKILL.md to clarify operation rules and usage instructions, with a more concise and user-friendly presentation.\n- Refined guidance on inferring parameters and handling ambiguous cases before running the main command.\n- Simplified technical rules, emphasizing the exclusive use of search.js for all scraping actions.\n- Removed outdated documentation file (skill-card.md).\n- General code and documentation cleanups for better reliability and clarity.\n\nv1.1.1 | 2026-07-11T06:18:43.461Z | auto\n\n## pricewin-hotel-deal-finder v1.1.1\n\n- Updated metadata to version 1.1.1 (no functional code or behavior changes)\n- No other changes; documentation and dependencies bumped only\n\nv1.1.0 | 2026-07-11T06:16:15.947Z | auto\n\n**Skill renamed and key documentation updated.**\n\n- Renamed skill from `pricewin-deal-finder` to `pricewin-hotel-deal-finder` for clarity.\n- Updated documentation, including `SKILL.md`, to reflect the new skill name throughout all instructions, install commands, and usage references.\n- Removed obsolete `skill-card.md` file.\n- No core functionality changes; all command usage and critical rules remain the same.\n\nv1.0.1 | 2026-07-10T04:00:57.879Z | auto\n\n- Bumped version to 1.0.1.\n- Updated SKILL.md to reflect new version and maintainers; no functional or behavioral changes to the skill's usage or the user workflow.\n- No code changes impacting user interaction or API behavior.\n\nv1.0.0 | 2026-07-10T03:34:37.103Z | auto\n\nPriceWin Hotel Deal Finder v1.0.0\n\n- Initial release for hotel price comparison.\n- Instantly compares live hotel prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city and travel dates.\n- One command returns ranked best-value, cheapest, and quality hotel picks with direct booking links in USD.\n- Handles bot-protected cities via built-in Patchright daemon for reliable results.\n- Requires only Node.js; no API keys or external configuration needed.\n- Strict instructions for single-command use and output formatting to ensure consistent, high-quality responses.\n\nArchive index:\n\nArchive v1.1.3: 14 files, 44092 bytes\n\nFiles: bin/browse.js (19324b), bin/daemon.js (24656b), bin/search.js (22783b), install.sh (963b), lib/browser-state.js (2436b), lib/dom-extract.js (4890b), lib/selector-cache.js (5295b), lib/snapshot.js (8147b), package-lock.json (1844b), package.json (920b), SECURITY.md (5887b), skill-card.md (2453b), SKILL.md (11435b), _meta.json (145b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 1.1.3\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder\n```\n\n---\n\n## How to use this skill\n\n**One command does the whole job — you normally won't need to ask clarifying questions first. Infer the parameters (below) and run it:**\n\n```bash\ncd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us\n```\n\n`{baseDir}` is this skill's install directory (auto-resolved by the runtime). If your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Avoid hardcoding a `~/.hermes/...` or `~/.openclaw/...` path — it differs per platform.\n\nExample:\n```bash\ncd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us\n```\n\nThe script handles everything automatically: daemon launch, Agoda cache lookup, Google + Booking inline search, OpenTravel API lookup (all cities), discovery for new cities, and formatted tier-card output. Run it and send the output to the user.\n\n**Infer the parameters instead of asking** (ask only if the city or dates are genuinely ambiguous):\n- **Year:** use the current year from today's date unless the user states otherwise. If the requested day/month has already passed this year, assume next year. (Get today's date with `date +%Y-%m-%d` if unsure.)\n- **\"10-13/6\"** → `<year>-06-10 <year>-06-13` — fill `<year>` from the rule above\n- **\"2 guests\" / \"2 people\"** → `2` adults\n- **Locale:** language/region code passed to the OTAs (controls site language + region). Default `en-us`. Prices are in USD (Google Hotels is requested with `gl=us&curr=USD`); other sources follow the locale you pass.\n\nOne `search.js` run is the whole workflow — no Python, curl, or ad-hoc scraping is needed on top of it.\n\n---\n\n## Operating rules — how to get reliable results\n\n**RULE 0 — Drive the browser only through `search.js` (via your terminal/shell tool). The native browser tools don't work here.** This skill relies on a stealth Patchright daemon. The runtime's native tools — `browser_navigate` / `browser_open`, `browser_click`, `browser_type` / `browser_fill`, `browser_snapshot`, `browser_close`, any other `browser_*`, and subagent delegation (`delegate_task` / `spawn_agent`) — will fail on this task, so don't reach for them:\n\n- Those native tools spawn a vanilla Chromium with no stealth, so Booking.com and Agoda detect the bot within seconds; the requests hang until the runtime kills them (\"Command timed out after 30/60 seconds\"). That burns 5+ minutes and returns nothing. The Patchright daemon that `search.js` launches survives bot-detection.\n- Delegated subagents start with empty history and no skill context, so they fall back to Python/curl scraping that gets bot-blocked immediately. Run the skill in the current agent.\n\nThe one path that works:\n```\ncd {baseDir} && node bin/search.js ...\n```\n\n**RULE 1 — Let `search.js` do the scraping; don't scrape an OTA yourself.** Avoid calling `browse.js` directly, doing `goto`/`click`/`type` in the browser, building Agoda/Booking/Google URLs by hand, calling the OpenTravel API separately, or launching the daemon yourself. `search.js` already drives the stealth daemon through a careful flow that survives bot-detection — it handles Agoda discovery internally for EVERY city (including Chinese cities like Shanghai, Hangzhou, etc.). Manually navigating an OTA is the #1 cause of failure: it trips Agoda/Booking anti-bot (\"detect automation\", \"redirect to homepage\", \"problem completing your search\") and gets the IP blocked. Run `search.js` once and send its output. If a source looks \"missing\", see RULE 4 rather than fetching it by hand.\n\n**RULE 2 — First-time city discovery takes 2–4 minutes.** If `search.js` output contains `\"discovering\"` or `\"launching\"` messages, tell the user: \"First time searching this city — discovering selectors, this takes about 2–4 minutes...\" and wait for the result rather than retrying or aborting.\n\n**RULE 3 — Send the output exactly.** `search.js` outputs formatted tier cards ready to send. Copy the output directly into your response. Do not reformat, summarize, or abbreviate it.\n\n**RULE 3a — Preserve the markdown hyperlinks.** Every hotel name in the output is already wrapped as `[Hotel Name](https://booking-url...)` — a clickable hyperlink. Keep it intact: don't split the URL onto a separate `🔗 https://...` line, don't replace `[Hotel Name](url)` with plain text, keep OTA names lowercase (\"google\", not \"Google\"), and keep section titles as-is (\"📋 More good deals\"). The output is Telegram-MarkdownV2-ready; sending it verbatim gives the user clickable hotel names with hidden URLs (clean UI).\n\n**RULE 3b — Hyperlink hotel names in your own commentary too.** If you add a suggestion or commentary section after the output, wrap every hotel name you mention as `[Hotel Name](url)` using the same URL the script printed for that hotel, rather than plain text.\n\n**RULE 4 — Partial results are normal — send them as-is rather than fixing by hand.** A source can be absent from a run (e.g. Agoda blocked this run, or OpenTravel has no inventory for the city). That's fine — send the tier cards with whatever sources are present; the footer (`📊 N hotels | <sources> • prices in USD`) lists exactly what was found. Fetching the missing source via the browser or a direct URL tends to trip anti-bot and make things worse, so avoid it. If `search.js` errors out entirely, tell the user what failed in one line and show any partial output it printed above the error. For more coverage, the one reliable retry is running the same `search.js` command again (anti-bot is often transient).\n\n---\n\n## Output Format Reference\n\n`search.js` prints tier cards in this format — you send this directly to the user:\n\nThe hotel name is a Markdown link to its cheapest OTA. Price rows carry NO\nlinks and the OTA key is shown lowercase (`agoda`/`booking`/`google`/`opentravel`).\nThere are no star ratings or area lines — the script does not have that data.\n\n```\n🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD\n```\n\nAll prices are shown in USD. Agoda, Google and OpenTravel geo-lock to VND by IP and are converted via a live FX rate; Booking returns USD natively. Only sources that actually returned data are listed in the footer.\n\n---\n\n## Limitations\n\n- First search per city pays the Agoda discovery cost (2–4 minutes). Google and Booking are inline (no discovery); OpenTravel is a direct API call.\n- Subsequent searches reuse the Agoda cache and complete in ~30–60 seconds.\n\n## Security & data handling\n\nRuns locally, needs no API keys, and collects no personal data — the only data\nsent out is the search query (city, dates, guests). Scraped hotel text is treated\nas untrusted: `sanitizeText()` in `bin/search.js` strips control/zero-width/bidi\nand markdown-control characters before any of it reaches model output, and booking\nlinks are restricted to `http(s)`.\n\nThe local browser daemon is **loopback-only, token-authenticated** (a per-run\ntoken in a `0600` state file), rejects non-loopback `Host` headers against DNS\nrebinding, and keeps the **Chromium sandbox enabled** — `--no-sandbox` is used\nonly where it cannot work (root on Linux, or explicit `PRICEWIN_NO_SANDBOX=1`).\n\nFull disclosure of commands run, downloads, and network egress is in\n[`SECURITY.md`](./SECURITY.md).\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1785680846480\n}\n\nFile v1.1.3:SECURITY.md\n\n# Security & Data Handling — PriceWin Hotel Deal Finder\n\nThis skill drives a stealth browser (Patchright/Chromium) to read **public** hotel\nlistings and compare prices. It runs entirely on the user's machine, needs no API\nkeys, and collects no personal data. This document discloses exactly what it\nexecutes, what it downloads, what leaves the machine, and how untrusted web\ncontent is contained — so an auditing agent (or a human) can verify the behavior\ninstead of inferring it.\n\n## What runs (command execution)\n\nThe skill's only entry point is one command:\n\n```bash\nnode bin/search.js \"<city>\" <checkIn> <checkOut> <adults> [locale]\n```\n\n`search.js` spawns `bin/browse.js` / `bin/daemon.js` (both shipped in this repo)\nto control a local browser. It runs **no** shell strings built from scraped\ncontent, executes **no** downloaded code, and takes **no** command input from web\npages — the browser flow is fixed in this repo's source. `npm install` / `npx`\nappear **only** at install time to fetch the `patchright` dependency (see below).\n\nThe skill's whole source is three files in `bin/` and four in `lib/`: no minified\nblobs, no obfuscation, no `eval`, no post-install script that fetches code (the\n`postinstall` hook only prints a reminder). Every source file is auditable in the\npublic repo\n<https://github.com/Price-Win/pricewin-skills-hub>.\n\n## Why a \"stealth\" browser\n\nThe word is doing narrow work here. Patchright masks the CDP-level automation\nfingerprint so a **normal, logged-out page view** of a public listing is not\nmistaken for a scraping bot and served an empty or blocked page. It exists to\nread public prices reliably from bot-hardened cities, not to evade security\ncontrols: the skill does not bypass authentication, solve CAPTCHAs, defeat\nrate limits with proxy rotation, hide from the user, or persist beyond the\nsession (`browse close`, `SIGTERM`, or the state file disappearing all stop it).\nNothing about it is aimed at endpoint security software, and it makes no attempt\nto conceal what it is doing on the user's own machine — the daemon logs to\nstderr and its state file is in plain sight under `~/.cache/`.\n\n## What it downloads\n\n| Item | When | Source | Purpose |\n|------|------|--------|---------|\n| `patchright` npm package | install | npm registry | Stealth Playwright fork (browser driver) |\n| Chromium | first run (`install.sh`) | Patchright's official host | The browser engine that renders OTA pages |\n\nNo other binaries or code are downloaded at runtime.\n\n## What leaves the machine (network egress)\n\nEgress is limited to a fixed, auditable set of hosts. **The only user-derived data\nsent is the search query itself** — city, check-in/out dates, guest count. No\naccount data, credentials, cookies from other sites, files, or PII are transmitted.\n\n| Host | Data sent | Why |\n|------|-----------|-----|\n| `booking.com`, `agoda.com`, `google.com/travel` | city + dates + guests (as normal search URL params) | Read public listing prices |\n| `api.opentravel.one` (override via `OPENTRAVEL_API_BASE_URL`) | city + dates + guests | Partner inventory lookup |\n| `open.er-api.com` | none (public `GET /latest/USD`) | Live VND→USD FX rate for price normalization |\n\nThere is no telemetry, analytics, or callback to PriceWin servers.\n\n## The local daemon (`bin/daemon.js`)\n\n`search.js` drives one long-running local process that owns the Chromium\ninstance and answers commands over HTTP. It is privileged — it can navigate and\nread any page — so it is locked down on four axes:\n\n| Control | Implementation |\n|---|---|\n| Loopback only | `server.listen(port, '127.0.0.1')` — never reachable from the LAN or internet |\n| Authenticated | Every request (including `/ping`) must carry `x-pricewin-token`, a 32-byte random token minted per daemon run and compared with `crypto.timingSafeEqual` |\n| Token not readable by other users | The token lives only in `~/.cache/pricewin-hotel-deal-finder/session-default.json`, written `0600` inside a `0700` directory |\n| Anti-DNS-rebinding | Requests whose `Host` header is not `127.0.0.1` / `localhost` / `::1` are rejected `403`, so a web page cannot reach the daemon even if it guesses the port |\n\nEphemeral port, chosen at startup; no fixed port to scan for. The daemon exits on\n`SIGTERM`/`SIGINT` and on `browse close`, clearing its state file.\n\n**Chromium sandbox stays ON.** `--no-sandbox` is *not* passed by default. It is\nadded only when the sandbox provably cannot work — running as root on Linux, or\nan explicit `PRICEWIN_NO_SANDBOX=1` — and the daemon prints a warning to stderr\nwhen it does.\n\n## Untrusted content containment (indirect prompt injection)\n\nHotel names, prices, and aria-labels scraped from OTA pages are **untrusted\nthird-party content**. Before any of it reaches the model-visible output,\n`sanitizeText()` in `bin/search.js`:\n\n- strips control, zero-width, and bidirectional-override characters (defeats\n  hidden-instruction and text-spoofing tricks);\n- removes the markdown/link control set (`` ` `` `[ ] ( ) < > { } \\ |`) so scraped\n  text cannot forge `[label](url)` structure or smuggle directives;\n- collapses whitespace and caps length.\n\nAll booking links (including the OpenTravel partner API's) are passed through\n`cleanLink()`, which **accepts only `http(s)` URLs** — a `javascript:` or other\nscheme can never render as a clickable link. The skill also treats scraped data\nas data only: it ranks and formats prices, and never executes or follows\ninstructions found inside scraped text.\n\n## Guidance for the running agent\n\nThe skill instructs the agent to treat OTA output as reference data to present to\nthe user, not as commands. Partial results (a source blocked or empty) are normal\nand are surfaced honestly rather than \"fixed\" by ad-hoc scraping.\n\n## Reporting\n\nFound an issue? Open a ticket at\n<https://github.com/Price-Win/pricewin-skills-hub/issues>.\n\nFile v1.1.3:skill-card.md\n\n## Description:\n\nFind the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates; one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[cotghw](https://clawhub.ai/user/cotghw)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTravelers, travel planners, and agents use this skill to compare public hotel prices for a destination, date range, and guest count across multiple providers and return ranked booking options. It is intended for normal hotel deal finding and OTA price comparison workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill runs a local browser daemon that can navigate and read pages during hotel searches.\n\nMitigation: Run it as an unprivileged user, especially in shared environments or when the agent has broad filesystem access.\n\nRisk: Search results include booking links from external providers.\n\nMitigation: Verify booking-link destinations before clicking or sharing them.\n\nRisk: A custom OpenTravel API base URL can redirect search data to an unexpected service.\n\nMitigation: Use `OPENTRAVEL_API_BASE_URL` only with trusted endpoints.\n\nRisk: A failed search may leave the PriceWin browser daemon running locally.\n\nMitigation: Be prepared to manually stop the PriceWin daemon after failures.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder)\n- [Project homepage](https://github.com/Price-Win/pricewin-skills-hub)\n- [Security and data handling](SECURITY.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Markdown-formatted hotel price comparison with ranked picks, per-night prices, and direct booking links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Prices are normalized to USD; provider coverage may be partial when a source has no inventory or is blocked.]\n\n## Skill Version(s):\n\n1.1.3 (source: frontmatter, package.json, release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.1.3:package-lock.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.1\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"1.1.1\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.3:package.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.3\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"description\": \"Agent-driven browser primitives + OpenTravel API client. The agent reasons over text DOM snapshots and drives the browser action-by-action — no pre-coded selectors.\",\n  \"author\": \"PriceWin\",\n  \"license\": \"MIT-0\",\n  \"homepage\": \"https://github.com/Price-Win/pricewin-skills-hub/tree/main/skills/pricewin-hotel-deal-finder#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Price-Win/pricewin-skills-hub.git\",\n    \"directory\": \"skills/pricewin-hotel-deal-finder\"\n  },\n  \"bugs\": \"https://github.com/Price-Win/pricewin-skills-hub/issues\",\n  \"bin\": {\n    \"browse\": \"bin/browse.js\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"echo 'Run install.sh next to download Chromium' >&2\"\n  },\n  \"dependencies\": {\n    \"patchright\": \"^1.55.2\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  }\n}\n\nArchive v1.1.2: 14 files, 41195 bytes\n\nFiles: bin/browse.js (18933b), bin/daemon.js (21916b), bin/search.js (22783b), install.sh (963b), lib/browser-state.js (1895b), lib/dom-extract.js (4890b), lib/selector-cache.js (5295b), lib/snapshot.js (8147b), package-lock.json (1844b), package.json (920b), SECURITY.md (3472b), skill-card.md (2628b), SKILL.md (11115b), _meta.json (145b)\n\nFile v1.1.2:SKILL.md\n\n---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 1.1.2\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder\n```\n\n---\n\n## How to use this skill\n\n**One command does the whole job — you normally won't need to ask clarifying questions first. Infer the parameters (below) and run it:**\n\n```bash\ncd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us\n```\n\n`{baseDir}` is this skill's install directory (auto-resolved by the runtime). If your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Avoid hardcoding a `~/.hermes/...` or `~/.openclaw/...` path — it differs per platform.\n\nExample:\n```bash\ncd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us\n```\n\nThe script handles everything automatically: daemon launch, Agoda cache lookup, Google + Booking inline search, OpenTravel API lookup (all cities), discovery for new cities, and formatted tier-card output. Run it and send the output to the user.\n\n**Infer the parameters instead of asking** (ask only if the city or dates are genuinely ambiguous):\n- **Year:** use the current year from today's date unless the user states otherwise. If the requested day/month has already passed this year, assume next year. (Get today's date with `date +%Y-%m-%d` if unsure.)\n- **\"10-13/6\"** → `<year>-06-10 <year>-06-13` — fill `<year>` from the rule above\n- **\"2 guests\" / \"2 people\"** → `2` adults\n- **Locale:** language/region code passed to the OTAs (controls site language + region). Default `en-us`. Prices are in USD (Google Hotels is requested with `gl=us&curr=USD`); other sources follow the locale you pass.\n\nOne `search.js` run is the whole workflow — no Python, curl, or ad-hoc scraping is needed on top of it.\n\n---\n\n## Operating rules — how to get reliable results\n\n**RULE 0 — Drive the browser only through `search.js` (via your terminal/shell tool). The native browser tools don't work here.** This skill relies on a stealth Patchright daemon. The runtime's native tools — `browser_navigate` / `browser_open`, `browser_click`, `browser_type` / `browser_fill`, `browser_snapshot`, `browser_close`, any other `browser_*`, and subagent delegation (`delegate_task` / `spawn_agent`) — will fail on this task, so don't reach for them:\n\n- Those native tools spawn a vanilla Chromium with no stealth, so Booking.com and Agoda detect the bot within seconds; the requests hang until the runtime kills them (\"Command timed out after 30/60 seconds\"). That burns 5+ minutes and returns nothing. The Patchright daemon that `search.js` launches survives bot-detection.\n- Delegated subagents start with empty history and no skill context, so they fall back to Python/curl scraping that gets bot-blocked immediately. Run the skill in the current agent.\n\nThe one path that works:\n```\ncd {baseDir} && node bin/search.js ...\n```\n\n**RULE 1 — Let `search.js` do the scraping; don't scrape an OTA yourself.** Avoid calling `browse.js` directly, doing `goto`/`click`/`type` in the browser, building Agoda/Booking/Google URLs by hand, calling the OpenTravel API separately, or launching the daemon yourself. `search.js` already drives the stealth daemon through a careful flow that survives bot-detection — it handles Agoda discovery internally for EVERY city (including Chinese cities like Shanghai, Hangzhou, etc.). Manually navigating an OTA is the #1 cause of failure: it trips Agoda/Booking anti-bot (\"detect automation\", \"redirect to homepage\", \"problem completing your search\") and gets the IP blocked. Run `search.js` once and send its output. If a source looks \"missing\", see RULE 4 rather than fetching it by hand.\n\n**RULE 2 — First-time city discovery takes 2–4 minutes.** If `search.js` output contains `\"discovering\"` or `\"launching\"` messages, tell the user: \"First time searching this city — discovering selectors, this takes about 2–4 minutes...\" and wait for the result rather than retrying or aborting.\n\n**RULE 3 — Send the output exactly.** `search.js` outputs formatted tier cards ready to send. Copy the output directly into your response. Do not reformat, summarize, or abbreviate it.\n\n**RULE 3a — Preserve the markdown hyperlinks.** Every hotel name in the output is already wrapped as `[Hotel Name](https://booking-url...)` — a clickable hyperlink. Keep it intact: don't split the URL onto a separate `🔗 https://...` line, don't replace `[Hotel Name](url)` with plain text, keep OTA names lowercase (\"google\", not \"Google\"), and keep section titles as-is (\"📋 More good deals\"). The output is Telegram-MarkdownV2-ready; sending it verbatim gives the user clickable hotel names with hidden URLs (clean UI).\n\n**RULE 3b — Hyperlink hotel names in your own commentary too.** If you add a suggestion or commentary section after the output, wrap every hotel name you mention as `[Hotel Name](url)` using the same URL the script printed for that hotel, rather than plain text.\n\n**RULE 4 — Partial results are normal — send them as-is rather than fixing by hand.** A source can be absent from a run (e.g. Agoda blocked this run, or OpenTravel has no inventory for the city). That's fine — send the tier cards with whatever sources are present; the footer (`📊 N hotels | <sources> • prices in USD`) lists exactly what was found. Fetching the missing source via the browser or a direct URL tends to trip anti-bot and make things worse, so avoid it. If `search.js` errors out entirely, tell the user what failed in one line and show any partial output it printed above the error. For more coverage, the one reliable retry is running the same `search.js` command again (anti-bot is often transient).\n\n---\n\n## Output Format Reference\n\n`search.js` prints tier cards in this format — you send this directly to the user:\n\nThe hotel name is a Markdown link to its cheapest OTA. Price rows carry NO\nlinks and the OTA key is shown lowercase (`agoda`/`booking`/`google`/`opentravel`).\nThere are no star ratings or area lines — the script does not have that data.\n\n```\n🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD\n```\n\nAll prices are shown in USD. Agoda, Google and OpenTravel geo-lock to VND by IP and are converted via a live FX rate; Booking returns USD natively. Only sources that actually returned data are listed in the footer.\n\n---\n\n## Limitations\n\n- First search per city pays the Agoda discovery cost (2–4 minutes). Google and Booking are inline (no discovery); OpenTravel is a direct API call.\n- Subsequent searches reuse the Agoda cache and complete in ~30–60 seconds.\n\n## Security & data handling\n\nRuns locally, needs no API keys, and collects no personal data — the only data\nsent out is the search query (city, dates, guests). Scraped hotel text is treated\nas untrusted: `sanitizeText()` in `bin/search.js` strips control/zero-width/bidi\nand markdown-control characters before any of it reaches model output, and booking\nlinks are restricted to `http(s)`. Full disclosure of commands run, downloads, and\nnetwork egress is in [`SECURITY.md`](./SECURITY.md).\n\nFile v1.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.2\",\n  \"publishedAt\": 1784006402633\n}\n\nFile v1.1.2:SECURITY.md\n\n# Security & Data Handling — PriceWin Hotel Deal Finder\n\nThis skill drives a stealth browser (Patchright/Chromium) to read **public** hotel\nlistings and compare prices. It runs entirely on the user's machine, needs no API\nkeys, and collects no personal data. This document discloses exactly what it\nexecutes, what it downloads, what leaves the machine, and how untrusted web\ncontent is contained — so an auditing agent (or a human) can verify the behavior\ninstead of inferring it.\n\n## What runs (command execution)\n\nThe skill's only entry point is one command:\n\n```bash\nnode bin/search.js \"<city>\" <checkIn> <checkOut> <adults> [locale]\n```\n\n`search.js` spawns `bin/browse.js` / `bin/daemon.js` (both shipped in this repo)\nto control a local browser. It runs **no** shell strings built from scraped\ncontent, executes **no** downloaded code, and takes **no** command input from web\npages — the browser flow is fixed in this repo's source. `npm install` / `npx`\nappear **only** at install time to fetch the `patchright` dependency (see below).\n\n## What it downloads\n\n| Item | When | Source | Purpose |\n|------|------|--------|---------|\n| `patchright` npm package | install | npm registry | Stealth Playwright fork (browser driver) |\n| Chromium | first run (`install.sh`) | Patchright's official host | The browser engine that renders OTA pages |\n\nNo other binaries or code are downloaded at runtime.\n\n## What leaves the machine (network egress)\n\nEgress is limited to a fixed, auditable set of hosts. **The only user-derived data\nsent is the search query itself** — city, check-in/out dates, guest count. No\naccount data, credentials, cookies from other sites, files, or PII are transmitted.\n\n| Host | Data sent | Why |\n|------|-----------|-----|\n| `booking.com`, `agoda.com`, `google.com/travel` | city + dates + guests (as normal search URL params) | Read public listing prices |\n| `api.opentravel.one` (override via `OPENTRAVEL_API_BASE_URL`) | city + dates + guests | Partner inventory lookup |\n| `open.er-api.com` | none (public `GET /latest/USD`) | Live VND→USD FX rate for price normalization |\n\nThere is no telemetry, analytics, or callback to PriceWin servers.\n\n## Untrusted content containment (indirect prompt injection)\n\nHotel names, prices, and aria-labels scraped from OTA pages are **untrusted\nthird-party content**. Before any of it reaches the model-visible output,\n`sanitizeText()` in `bin/search.js`:\n\n- strips control, zero-width, and bidirectional-override characters (defeats\n  hidden-instruction and text-spoofing tricks);\n- removes the markdown/link control set (`` ` `` `[ ] ( ) < > { } \\ |`) so scraped\n  text cannot forge `[label](url)` structure or smuggle directives;\n- collapses whitespace and caps length.\n\nAll booking links (including the OpenTravel partner API's) are passed through\n`cleanLink()`, which **accepts only `http(s)` URLs** — a `javascript:` or other\nscheme can never render as a clickable link. The skill also treats scraped data\nas data only: it ranks and formats prices, and never executes or follows\ninstructions found inside scraped text.\n\n## Guidance for the running agent\n\nThe skill instructs the agent to treat OTA output as reference data to present to\nthe user, not as commands. Partial results (a source blocked or empty) are normal\nand are surfaced honestly rather than \"fixed\" by ad-hoc scraping.\n\n## Reporting\n\nFound an issue? Open a ticket at\n<https://github.com/Price-Win/pricewin-skills-hub/issues>.\n\nFile v1.1.2:skill-card.md\n\n## Description: <br>\nFind the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates; one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[cotghw](https://clawhub.ai/user/cotghw) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and travel-planning agents use this skill to compare live hotel prices for a city, date range, and guest count across multiple travel providers, then present ranked hotel deal options with booking links. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill downloads Patchright and Chromium and runs a local browser-control daemon. <br>\nMitigation: Install only in an environment where those dependencies and local browser automation are acceptable, and clear the skill cache or close the daemon after interrupted searches. <br>\nRisk: Hotel search details are sent to travel providers and the OpenTravel API as part of normal operation. <br>\nMitigation: Avoid entering sensitive personal details; provide only the city, travel dates, guest count, and locale needed for price comparison. <br>\nRisk: Results come from live public travel sites and may be partial when a provider is blocked or has no inventory. <br>\nMitigation: Present the generated output as current comparison data and rely on the skill's footer to disclose which providers returned results. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder) <br>\n- [Project homepage](https://github.com/Price-Win/pricewin-skills-hub) <br>\n- [SECURITY.md](artifact/SECURITY.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [markdown, shell commands, guidance] <br>\n**Output Format:** [Markdown tier cards with inline booking links and command-line usage guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Hotel results are normalized to USD and may include partial provider coverage when a source is blocked or empty.] <br>\n\n## Skill Version(s): <br>\n1.1.2 (source: SKILL.md frontmatter, package.json, and server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.2:package-lock.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.1\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"1.1.1\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.2:package.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.2\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"description\": \"Agent-driven browser primitives + OpenTravel API client. The agent reasons over text DOM snapshots and drives the browser action-by-action — no pre-coded selectors.\",\n  \"author\": \"PriceWin\",\n  \"license\": \"MIT-0\",\n  \"homepage\": \"https://github.com/Price-Win/pricewin-skills-hub/tree/main/skills/pricewin-hotel-deal-finder#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Price-Win/pricewin-skills-hub.git\",\n    \"directory\": \"skills/pricewin-hotel-deal-finder\"\n  },\n  \"bugs\": \"https://github.com/Price-Win/pricewin-skills-hub/issues\",\n  \"bin\": {\n    \"browse\": \"bin/browse.js\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"echo 'Run install.sh next to download Chromium' >&2\"\n  },\n  \"dependencies\": {\n    \"patchright\": \"^1.55.2\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  }\n}\n\nArchive v1.1.1: 13 files, 38245 bytes\n\nFiles: bin/browse.js (18933b), bin/daemon.js (21916b), bin/search.js (21210b), install.sh (963b), lib/browser-state.js (1895b), lib/dom-extract.js (4890b), lib/selector-cache.js (5295b), lib/snapshot.js (8147b), package-lock.json (1844b), package.json (920b), skill-card.md (2307b), SKILL.md (10984b), _meta.json (145b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 1.1.1\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder\n```\n\n---\n\n## 🚨 IMPORTANT — HOW TO USE THIS SKILL\n\n**ONE command does everything. Run this as your FIRST action — no clarifying questions first:**\n\n```bash\ncd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us\n```\n\n`{baseDir}` is this skill's install directory (auto-resolved by the runtime). If your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Do NOT hardcode a `~/.hermes/...` or `~/.openclaw/...` path — it differs per platform.\n\nExample:\n```bash\ncd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us\n```\n\nThe script handles everything automatically: daemon launch, Agoda cache lookup, Google + Booking inline search, OpenTravel API lookup (all cities), discovery for new cities, and formatted tier-card output. Just run it and send the output to the user.\n\n**DO NOT ask clarifying questions first.** Just run the command. Infer all parameters:\n- **Year:** use the current year from today's date unless the user states otherwise. If the requested day/month has already passed this year, assume next year. (Get today's date with `date +%Y-%m-%d` if unsure.)\n- **\"10-13/6\"** → `<year>-06-10 <year>-06-13` — fill `<year>` from the rule above\n- **\"2 guests\" / \"2 people\"** → `2` adults\n- **Locale:** language/region code passed to the OTAs (controls site language + region). Default `en-us`. Prices are in USD (Google Hotels is requested with `gl=us&curr=USD`); other sources follow the locale you pass.\n\n**DO NOT use any other approach.** No Python scripts, no curl, no browser tools, no subagents. This one command is all you need.\n\n---\n\n## 🚨 CRITICAL RULES — FOLLOW EVERY TIME\n\n**RULE 0 — FORBIDDEN TOOLS. Read this twice.** This skill drives a long-running Patchright daemon via the `terminal` tool ONLY. Your runtime exposes several other tools that LOOK convenient but are STRICTLY FORBIDDEN inside this skill:\n\n❌ `browser_navigate` / `browser_open` — FORBIDDEN\n❌ `browser_click` — FORBIDDEN\n❌ `browser_type` / `browser_fill` — FORBIDDEN\n❌ `browser_snapshot` — FORBIDDEN\n❌ `browser_close` — FORBIDDEN\n❌ Any other `browser_*` native tool — FORBIDDEN\n❌ `delegate_task` / `spawn_agent` / sub-agent delegation — FORBIDDEN\n\nWhy: those native tools spawn a vanilla Chromium without stealth, so Booking.com and Agoda detect the bot within seconds and the requests just hang until the runtime kills them with \"Command timed out after 30/60 seconds\". You will burn 5+ minutes on timeouts and the user will get nothing. The Patchright daemon launched via `terminal` survives bot-detection.\n\nDelegated subagents start with empty history and no skill context — they will always fall back to Python/curl scraping, which gets bot-blocked immediately. **This skill must run entirely in the current agent, using only the `terminal` tool.**\n\n✅ The ONLY allowed way to drive a browser in this skill is via `terminal`:\n```\nterminal: cd {baseDir} && node bin/search.js ...\n```\n\n**RULE 1 — `search.js` handles everything. NEVER scrape an OTA yourself.** Do not manually call `browse.js` commands, do not `goto`/`click`/`type` in the browser, do not build Agoda/Booking/Google URLs by hand, do not call the OpenTravel API separately, do not try to launch the daemon yourself. `search.js` already drives the stealth daemon through a careful flow that survives bot-detection — it handles Agoda discovery internally for EVERY city (including Chinese cities like Shanghai, Hangzhou, etc.). **Manually navigating an OTA is the #1 cause of failure: it trips Agoda/Booking anti-bot (\"detect automation\", \"redirect to homepage\", \"problem completing your search\") and gets the IP blocked.** Your ONLY job is to run `search.js` once and send its output. If you think a source is \"missing\", re-read RULE 4 — do NOT go fetch it by hand.\n\n**RULE 2 — First-time city discovery takes 2–4 minutes.** If `search.js` output contains `\"discovering\"` or `\"launching\"` messages, tell the user: \"First time searching this city — discovering selectors, this takes about 2–4 minutes...\" and wait for the result. Do NOT retry or abort.\n\n**RULE 3 — Send the output exactly.** `search.js` outputs formatted tier cards ready to send. Copy the output directly into your response. Do not reformat, summarize, or abbreviate it.\n\n**RULE 3a — PRESERVE MARKDOWN HYPERLINKS.** Every hotel name in the output is already wrapped as `[Hotel Name](https://booking-url...)`. This is a clickable hyperlink — DO NOT:\n- Strip the markdown and show the URL on a separate `🔗 https://...` line\n- Replace `[Hotel Name](url)` with plain text\n- Capitalize OTA names (\"google\" stays \"google\", not \"Google\")\n- Rename sections — \"📋 More good deals\" stays exactly\n\nThe output is Telegram-MarkdownV2-ready. Sending it as-is gives the user clickable hotel names with hidden URLs (clean UI).\n\n**RULE 3b — If you DO add a suggestion / commentary section after the output, every hotel name you mention MUST also be a markdown hyperlink `[Hotel Name](url)` using the SAME URL the script printed for that hotel.** Never write a hotel name as plain text in your own commentary.\n\n**RULE 4 — Partial results are NORMAL and acceptable. Never \"fix\" them by hand.** A source can be absent from the output (e.g. Agoda blocked this run, or OpenTravel has no inventory for the city). That is FINE — send the tier cards with whatever sources are present. The footer (`📊 N hotels | <sources> • prices in USD`) lists exactly what was found. **Do NOT** try to fetch the missing source via the browser, a direct URL, or any other tool — that triggers anti-bot and makes things worse. If `search.js` errors out entirely, tell the user what failed in 1 line and show any partial output it printed above the error. If you want more coverage, the only valid retry is running the SAME `search.js` command again (anti-bot is often transient).\n\n---\n\n## Output Format Reference\n\n`search.js` prints tier cards in this format — you send this directly to the user:\n\nThe hotel name is a Markdown link to its cheapest OTA. Price rows carry NO\nlinks and the OTA key is shown lowercase (`agoda`/`booking`/`google`/`opentravel`).\nThere are no star ratings or area lines — the script does not have that data.\n\n```\n🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD\n```\n\nAll prices are shown in USD. Agoda, Google and OpenTravel geo-lock to VND by IP and are converted via a live FX rate; Booking returns USD natively. Only sources that actually returned data are listed in the footer.\n\n---\n\n## Limitations\n\n- First search per city pays the Agoda discovery cost (2–4 minutes). Google and Booking are inline (no discovery); OpenTravel is a direct API call.\n- Subsequent searches reuse the Agoda cache and complete in ~30–60 seconds.\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1783750723461\n}\n\nFile v1.1.1:skill-card.md\n\n## Description: <br>\nFinds hotel deals by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel, returning ranked best-value, cheapest, and quality picks with direct booking links normalized to USD. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[cotghw](https://clawhub.ai/user/cotghw) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and travel-planning agents use this skill to compare current hotel rates for a city and date range, then choose the cheapest or best-value booking option. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Hotel search details are sent to travel providers and may reveal sensitive travel plans. <br>\nMitigation: Use the skill only for searches you are comfortable sharing with those providers. <br>\nRisk: The skill launches a local browser automation daemon and stores selector or session state under the user's home cache directory. <br>\nMitigation: Install and run it only in environments where local browser automation and cache persistence are acceptable. <br>\nRisk: The skill downloads a browser dependency during setup or execution. <br>\nMitigation: Review installation behavior and network access requirements before deployment. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder) <br>\n- [Project homepage](https://github.com/Price-Win/pricewin-skills-hub) <br>\n- [OpenTravel API host](https://api.opentravel.one) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Markdown, Text, Shell commands, Guidance] <br>\n**Output Format:** [Markdown tier cards with ranked hotel options, USD prices, and direct booking links] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Results depend on live provider availability and may include partial source coverage.] <br>\n\n## Skill Version(s): <br>\n1.1.1 (source: frontmatter, package.json, release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.1:package-lock.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.1\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"1.1.1\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.1:package.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.1\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"description\": \"Agent-driven browser primitives + OpenTravel API client. The agent reasons over text DOM snapshots and drives the browser action-by-action — no pre-coded selectors.\",\n  \"author\": \"PriceWin\",\n  \"license\": \"MIT-0\",\n  \"homepage\": \"https://github.com/Price-Win/pricewin-skills-hub/tree/main/skills/pricewin-hotel-deal-finder#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Price-Win/pricewin-skills-hub.git\",\n    \"directory\": \"skills/pricewin-hotel-deal-finder\"\n  },\n  \"bugs\": \"https://github.com/Price-Win/pricewin-skills-hub/issues\",\n  \"bin\": {\n    \"browse\": \"bin/browse.js\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"echo 'Run install.sh next to download Chromium' >&2\"\n  },\n  \"dependencies\": {\n    \"patchright\": \"^1.55.2\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  }\n}\n\nArchive v1.1.0: 13 files, 38268 bytes\n\nFiles: bin/browse.js (18933b), bin/daemon.js (21916b), bin/search.js (21210b), install.sh (963b), lib/browser-state.js (1895b), lib/dom-extract.js (4890b), lib/selector-cache.js (5295b), lib/snapshot.js (8147b), package-lock.json (1844b), package.json (920b), skill-card.md (2331b), SKILL.md (10984b), _meta.json (145b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 1.1.0\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder\n```\n\n---\n\n## 🚨 IMPORTANT — HOW TO USE THIS SKILL\n\n**ONE command does everything. Run this as your FIRST action — no clarifying questions first:**\n\n```bash\ncd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us\n```\n\n`{baseDir}` is this skill's install directory (auto-resolved by the runtime). If your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Do NOT hardcode a `~/.hermes/...` or `~/.openclaw/...` path — it differs per platform.\n\nExample:\n```bash\ncd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us\n```\n\nThe script handles everything automatically: daemon launch, Agoda cache lookup, Google + Booking inline search, OpenTravel API lookup (all cities), discovery for new cities, and formatted tier-card output. Just run it and send the output to the user.\n\n**DO NOT ask clarifying questions first.** Just run the command. Infer all parameters:\n- **Year:** use the current year from today's date unless the user states otherwise. If the requested day/month has already passed this year, assume next year. (Get today's date with `date +%Y-%m-%d` if unsure.)\n- **\"10-13/6\"** → `<year>-06-10 <year>-06-13` — fill `<year>` from the rule above\n- **\"2 guests\" / \"2 people\"** → `2` adults\n- **Locale:** language/region code passed to the OTAs (controls site language + region). Default `en-us`. Prices are in USD (Google Hotels is requested with `gl=us&curr=USD`); other sources follow the locale you pass.\n\n**DO NOT use any other approach.** No Python scripts, no curl, no browser tools, no subagents. This one command is all you need.\n\n---\n\n## 🚨 CRITICAL RULES — FOLLOW EVERY TIME\n\n**RULE 0 — FORBIDDEN TOOLS. Read this twice.** This skill drives a long-running Patchright daemon via the `terminal` tool ONLY. Your runtime exposes several other tools that LOOK convenient but are STRICTLY FORBIDDEN inside this skill:\n\n❌ `browser_navigate` / `browser_open` — FORBIDDEN\n❌ `browser_click` — FORBIDDEN\n❌ `browser_type` / `browser_fill` — FORBIDDEN\n❌ `browser_snapshot` — FORBIDDEN\n❌ `browser_close` — FORBIDDEN\n❌ Any other `browser_*` native tool — FORBIDDEN\n❌ `delegate_task` / `spawn_agent` / sub-agent delegation — FORBIDDEN\n\nWhy: those native tools spawn a vanilla Chromium without stealth, so Booking.com and Agoda detect the bot within seconds and the requests just hang until the runtime kills them with \"Command timed out after 30/60 seconds\". You will burn 5+ minutes on timeouts and the user will get nothing. The Patchright daemon launched via `terminal` survives bot-detection.\n\nDelegated subagents start with empty history and no skill context — they will always fall back to Python/curl scraping, which gets bot-blocked immediately. **This skill must run entirely in the current agent, using only the `terminal` tool.**\n\n✅ The ONLY allowed way to drive a browser in this skill is via `terminal`:\n```\nterminal: cd {baseDir} && node bin/search.js ...\n```\n\n**RULE 1 — `search.js` handles everything. NEVER scrape an OTA yourself.** Do not manually call `browse.js` commands, do not `goto`/`click`/`type` in the browser, do not build Agoda/Booking/Google URLs by hand, do not call the OpenTravel API separately, do not try to launch the daemon yourself. `search.js` already drives the stealth daemon through a careful flow that survives bot-detection — it handles Agoda discovery internally for EVERY city (including Chinese cities like Shanghai, Hangzhou, etc.). **Manually navigating an OTA is the #1 cause of failure: it trips Agoda/Booking anti-bot (\"detect automation\", \"redirect to homepage\", \"problem completing your search\") and gets the IP blocked.** Your ONLY job is to run `search.js` once and send its output. If you think a source is \"missing\", re-read RULE 4 — do NOT go fetch it by hand.\n\n**RULE 2 — First-time city discovery takes 2–4 minutes.** If `search.js` output contains `\"discovering\"` or `\"launching\"` messages, tell the user: \"First time searching this city — discovering selectors, this takes about 2–4 minutes...\" and wait for the result. Do NOT retry or abort.\n\n**RULE 3 — Send the output exactly.** `search.js` outputs formatted tier cards ready to send. Copy the output directly into your response. Do not reformat, summarize, or abbreviate it.\n\n**RULE 3a — PRESERVE MARKDOWN HYPERLINKS.** Every hotel name in the output is already wrapped as `[Hotel Name](https://booking-url...)`. This is a clickable hyperlink — DO NOT:\n- Strip the markdown and show the URL on a separate `🔗 https://...` line\n- Replace `[Hotel Name](url)` with plain text\n- Capitalize OTA names (\"google\" stays \"google\", not \"Google\")\n- Rename sections — \"📋 More good deals\" stays exactly\n\nThe output is Telegram-MarkdownV2-ready. Sending it as-is gives the user clickable hotel names with hidden URLs (clean UI).\n\n**RULE 3b — If you DO add a suggestion / commentary section after the output, every hotel name you mention MUST also be a markdown hyperlink `[Hotel Name](url)` using the SAME URL the script printed for that hotel.** Never write a hotel name as plain text in your own commentary.\n\n**RULE 4 — Partial results are NORMAL and acceptable. Never \"fix\" them by hand.** A source can be absent from the output (e.g. Agoda blocked this run, or OpenTravel has no inventory for the city). That is FINE — send the tier cards with whatever sources are present. The footer (`📊 N hotels | <sources> • prices in USD`) lists exactly what was found. **Do NOT** try to fetch the missing source via the browser, a direct URL, or any other tool — that triggers anti-bot and makes things worse. If `search.js` errors out entirely, tell the user what failed in 1 line and show any partial output it printed above the error. If you want more coverage, the only valid retry is running the SAME `search.js` command again (anti-bot is often transient).\n\n---\n\n## Output Format Reference\n\n`search.js` prints tier cards in this format — you send this directly to the user:\n\nThe hotel name is a Markdown link to its cheapest OTA. Price rows carry NO\nlinks and the OTA key is shown lowercase (`agoda`/`booking`/`google`/`opentravel`).\nThere are no star ratings or area lines — the script does not have that data.\n\n```\n🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD\n```\n\nAll prices are shown in USD. Agoda, Google and OpenTravel geo-lock to VND by IP and are converted via a live FX rate; Booking returns USD natively. Only sources that actually returned data are listed in the footer.\n\n---\n\n## Limitations\n\n- First search per city pays the Agoda discovery cost (2–4 minutes). Google and Booking are inline (no discovery); OpenTravel is a direct API call.\n- Subsequent searches reuse the Agoda cache and complete in ~30–60 seconds.\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1783750575947\n}\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nFinds low-cost hotel options by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel, then returns ranked best-value, cheapest, and quality picks with booking links and USD-normalized prices. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[cotghw](https://clawhub.ai/user/cotghw) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nTravelers, travel planners, and support agents use this skill to compare hotel prices for a city, date range, and guest count, then share ready-to-use hotel deal cards with direct booking links. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill downloads and runs a browser automation stack and briefly exposes a local browser-control daemon during searches. <br>\nMitigation: Install only in an environment where local browser automation is acceptable, and close or inspect the daemon if a search fails. <br>\nRisk: The skill makes live requests to hotel and pricing services, so results can be incomplete or vary by source availability. <br>\nMitigation: Treat the generated hotel cards as current search results, review direct booking links before acting, and rerun the same search when broader coverage is needed. <br>\n\n\n## Reference(s): <br>\n- [ClawHub listing](https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder) <br>\n- [PriceWin skills hub](https://github.com/Price-Win/pricewin-skills-hub) <br>\n- [OpenTravel API](https://api.opentravel.one) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Markdown, Shell commands, Guidance] <br>\n**Output Format:** [Markdown hotel deal cards with inline booking links, price rows, and source coverage summary.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Prices are normalized to USD; results may be partial when a hotel source returns no data or is blocked.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: SKILL.md frontmatter, package.json, ClawHub release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.0:package-lock.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.0\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"1.1.0\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.1.0:package.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.0\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"description\": \"Agent-driven browser primitives + OpenTravel API client. The agent reasons over text DOM snapshots and drives the browser action-by-action — no pre-coded selectors.\",\n  \"author\": \"PriceWin\",\n  \"license\": \"MIT-0\",\n  \"homepage\": \"https://github.com/Price-Win/pricewin-skills-hub/tree/main/skills/pricewin-hotel-deal-finder#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Price-Win/pricewin-skills-hub.git\",\n    \"directory\": \"skills/pricewin-hotel-deal-finder\"\n  },\n  \"bugs\": \"https://github.com/Price-Win/pricewin-skills-hub/issues\",\n  \"bin\": {\n    \"browse\": \"bin/browse.js\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"echo 'Run install.sh next to download Chromium' >&2\"\n  },\n  \"dependencies\": {\n    \"patchright\": \"^1.55.2\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  }\n}\n\nArchive v1.0.1: 12 files, 36996 bytes\n\nFiles: bin/browse.js (18933b), bin/daemon.js (21916b), bin/search.js (21210b), install.sh (963b), lib/browser-state.js (1895b), lib/dom-extract.js (4890b), lib/selector-cache.js (5295b), lib/snapshot.js (8147b), package-lock.json (1844b), package.json (920b), SKILL.md (10984b), _meta.json (145b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 1.0.1\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder\n```\n\n---\n\n## 🚨 IMPORTANT — HOW TO USE THIS SKILL\n\n**ONE command does everything. Run this as your FIRST action — no clarifying questions first:**\n\n```bash\ncd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us\n```\n\n`{baseDir}` is this skill's install directory (auto-resolved by the runtime). If your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Do NOT hardcode a `~/.hermes/...` or `~/.openclaw/...` path — it differs per platform.\n\nExample:\n```bash\ncd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us\n```\n\nThe script handles everything automatically: daemon launch, Agoda cache lookup, Google + Booking inline search, OpenTravel API lookup (all cities), discovery for new cities, and formatted tier-card output. Just run it and send the output to the user.\n\n**DO NOT ask clarifying questions first.** Just run the command. Infer all parameters:\n- **Year:** use the current year from today's date unless the user states otherwise. If the requested day/month has already passed this year, assume next year. (Get today's date with `date +%Y-%m-%d` if unsure.)\n- **\"10-13/6\"** → `<year>-06-10 <year>-06-13` — fill `<year>` from the rule above\n- **\"2 guests\" / \"2 people\"** → `2` adults\n- **Locale:** language/region code passed to the OTAs (controls site language + region). Default `en-us`. Prices are in USD (Google Hotels is requested with `gl=us&curr=USD`); other sources follow the locale you pass.\n\n**DO NOT use any other approach.** No Python scripts, no curl, no browser tools, no subagents. This one command is all you need.\n\n---\n\n## 🚨 CRITICAL RULES — FOLLOW EVERY TIME\n\n**RULE 0 — FORBIDDEN TOOLS. Read this twice.** This skill drives a long-running Patchright daemon via the `terminal` tool ONLY. Your runtime exposes several other tools that LOOK convenient but are STRICTLY FORBIDDEN inside this skill:\n\n❌ `browser_navigate` / `browser_open` — FORBIDDEN\n❌ `browser_click` — FORBIDDEN\n❌ `browser_type` / `browser_fill` — FORBIDDEN\n❌ `browser_snapshot` — FORBIDDEN\n❌ `browser_close` — FORBIDDEN\n❌ Any other `browser_*` native tool — FORBIDDEN\n❌ `delegate_task` / `spawn_agent` / sub-agent delegation — FORBIDDEN\n\nWhy: those native tools spawn a vanilla Chromium without stealth, so Booking.com and Agoda detect the bot within seconds and the requests just hang until the runtime kills them with \"Command timed out after 30/60 seconds\". You will burn 5+ minutes on timeouts and the user will get nothing. The Patchright daemon launched via `terminal` survives bot-detection.\n\nDelegated subagents start with empty history and no skill context — they will always fall back to Python/curl scraping, which gets bot-blocked immediately. **This skill must run entirely in the current agent, using only the `terminal` tool.**\n\n✅ The ONLY allowed way to drive a browser in this skill is via `terminal`:\n```\nterminal: cd {baseDir} && node bin/search.js ...\n```\n\n**RULE 1 — `search.js` handles everything. NEVER scrape an OTA yourself.** Do not manually call `browse.js` commands, do not `goto`/`click`/`type` in the browser, do not build Agoda/Booking/Google URLs by hand, do not call the OpenTravel API separately, do not try to launch the daemon yourself. `search.js` already drives the stealth daemon through a careful flow that survives bot-detection — it handles Agoda discovery internally for EVERY city (including Chinese cities like Shanghai, Hangzhou, etc.). **Manually navigating an OTA is the #1 cause of failure: it trips Agoda/Booking anti-bot (\"detect automation\", \"redirect to homepage\", \"problem completing your search\") and gets the IP blocked.** Your ONLY job is to run `search.js` once and send its output. If you think a source is \"missing\", re-read RULE 4 — do NOT go fetch it by hand.\n\n**RULE 2 — First-time city discovery takes 2–4 minutes.** If `search.js` output contains `\"discovering\"` or `\"launching\"` messages, tell the user: \"First time searching this city — discovering selectors, this takes about 2–4 minutes...\" and wait for the result. Do NOT retry or abort.\n\n**RULE 3 — Send the output exactly.** `search.js` outputs formatted tier cards ready to send. Copy the output directly into your response. Do not reformat, summarize, or abbreviate it.\n\n**RULE 3a — PRESERVE MARKDOWN HYPERLINKS.** Every hotel name in the output is already wrapped as `[Hotel Name](https://booking-url...)`. This is a clickable hyperlink — DO NOT:\n- Strip the markdown and show the URL on a separate `🔗 https://...` line\n- Replace `[Hotel Name](url)` with plain text\n- Capitalize OTA names (\"google\" stays \"google\", not \"Google\")\n- Rename sections — \"📋 More good deals\" stays exactly\n\nThe output is Telegram-MarkdownV2-ready. Sending it as-is gives the user clickable hotel names with hidden URLs (clean UI).\n\n**RULE 3b — If you DO add a suggestion / commentary section after the output, every hotel name you mention MUST also be a markdown hyperlink `[Hotel Name](url)` using the SAME URL the script printed for that hotel.** Never write a hotel name as plain text in your own commentary.\n\n**RULE 4 — Partial results are NORMAL and acceptable. Never \"fix\" them by hand.** A source can be absent from the output (e.g. Agoda blocked this run, or OpenTravel has no inventory for the city). That is FINE — send the tier cards with whatever sources are present. The footer (`📊 N hotels | <sources> • prices in USD`) lists exactly what was found. **Do NOT** try to fetch the missing source via the browser, a direct URL, or any other tool — that triggers anti-bot and makes things worse. If `search.js` errors out entirely, tell the user what failed in 1 line and show any partial output it printed above the error. If you want more coverage, the only valid retry is running the SAME `search.js` command again (anti-bot is often transient).\n\n---\n\n## Output Format Reference\n\n`search.js` prints tier cards in this format — you send this directly to the user:\n\nThe hotel name is a Markdown link to its cheapest OTA. Price rows carry NO\nlinks and the OTA key is shown lowercase (`agoda`/`booking`/`google`/`opentravel`).\nThere are no star ratings or area lines — the script does not have that data.\n\n```\n🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD\n```\n\nAll prices are shown in USD. Agoda, Google and OpenTravel geo-lock to VND by IP and are converted via a live FX rate; Booking returns USD natively. Only sources that actually returned data are listed in the footer.\n\n---\n\n## Limitations\n\n- First search per city pays the Agoda discovery cost (2–4 minutes). Google and Booking are inline (no discovery); OpenTravel is a direct API call.\n- Subsequent searches reuse the Agoda cache and complete in ~30–60 seconds.\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1783656057879\n}\n\nFile v1.0.1:package-lock.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.0.1\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"1.0.1\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.0.1:package.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.0.1\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"description\": \"Agent-driven browser primitives + OpenTravel API client. The agent reasons over text DOM snapshots and drives the browser action-by-action — no pre-coded selectors.\",\n  \"author\": \"PriceWin\",\n  \"license\": \"MIT-0\",\n  \"homepage\": \"https://github.com/Price-Win/pricewin-skills-hub/tree/main/skills/pricewin-hotel-deal-finder#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Price-Win/pricewin-skills-hub.git\",\n    \"directory\": \"skills/pricewin-hotel-deal-finder\"\n  },\n  \"bugs\": \"https://github.com/Price-Win/pricewin-skills-hub/issues\",\n  \"bin\": {\n    \"browse\": \"bin/browse.js\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"echo 'Run install.sh next to download Chromium' >&2\"\n  },\n  \"dependencies\": {\n    \"patchright\": \"^1.55.2\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  }\n}\n\nArchive v1.0.0: 12 files, 36998 bytes\n\nFiles: bin/browse.js (18933b), bin/daemon.js (21916b), bin/search.js (21210b), install.sh (963b), lib/browser-state.js (1895b), lib/dom-extract.js (4890b), lib/selector-cache.js (5295b), lib/snapshot.js (8147b), package-lock.json (1844b), package.json (920b), SKILL.md (10984b), _meta.json (145b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 0.8.4\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder\n```\n\n---\n\n## 🚨 IMPORTANT — HOW TO USE THIS SKILL\n\n**ONE command does everything. Run this as your FIRST action — no clarifying questions first:**\n\n```bash\ncd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us\n```\n\n`{baseDir}` is this skill's install directory (auto-resolved by the runtime). If your runtime does not substitute it, `cd` into the folder that contains this `SKILL.md` (the one with `bin/search.js`). Do NOT hardcode a `~/.hermes/...` or `~/.openclaw/...` path — it differs per platform.\n\nExample:\n```bash\ncd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us\n```\n\nThe script handles everything automatically: daemon launch, Agoda cache lookup, Google + Booking inline search, OpenTravel API lookup (all cities), discovery for new cities, and formatted tier-card output. Just run it and send the output to the user.\n\n**DO NOT ask clarifying questions first.** Just run the command. Infer all parameters:\n- **Year:** use the current year from today's date unless the user states otherwise. If the requested day/month has already passed this year, assume next year. (Get today's date with `date +%Y-%m-%d` if unsure.)\n- **\"10-13/6\"** → `<year>-06-10 <year>-06-13` — fill `<year>` from the rule above\n- **\"2 guests\" / \"2 people\"** → `2` adults\n- **Locale:** language/region code passed to the OTAs (controls site language + region). Default `en-us`. Prices are in USD (Google Hotels is requested with `gl=us&curr=USD`); other sources follow the locale you pass.\n\n**DO NOT use any other approach.** No Python scripts, no curl, no browser tools, no subagents. This one command is all you need.\n\n---\n\n## 🚨 CRITICAL RULES — FOLLOW EVERY TIME\n\n**RULE 0 — FORBIDDEN TOOLS. Read this twice.** This skill drives a long-running Patchright daemon via the `terminal` tool ONLY. Your runtime exposes several other tools that LOOK convenient but are STRICTLY FORBIDDEN inside this skill:\n\n❌ `browser_navigate` / `browser_open` — FORBIDDEN\n❌ `browser_click` — FORBIDDEN\n❌ `browser_type` / `browser_fill` — FORBIDDEN\n❌ `browser_snapshot` — FORBIDDEN\n❌ `browser_close` — FORBIDDEN\n❌ Any other `browser_*` native tool — FORBIDDEN\n❌ `delegate_task` / `spawn_agent` / sub-agent delegation — FORBIDDEN\n\nWhy: those native tools spawn a vanilla Chromium without stealth, so Booking.com and Agoda detect the bot within seconds and the requests just hang until the runtime kills them with \"Command timed out after 30/60 seconds\". You will burn 5+ minutes on timeouts and the user will get nothing. The Patchright daemon launched via `terminal` survives bot-detection.\n\nDelegated subagents start with empty history and no skill context — they will always fall back to Python/curl scraping, which gets bot-blocked immediately. **This skill must run entirely in the current agent, using only the `terminal` tool.**\n\n✅ The ONLY allowed way to drive a browser in this skill is via `terminal`:\n```\nterminal: cd {baseDir} && node bin/search.js ...\n```\n\n**RULE 1 — `search.js` handles everything. NEVER scrape an OTA yourself.** Do not manually call `browse.js` commands, do not `goto`/`click`/`type` in the browser, do not build Agoda/Booking/Google URLs by hand, do not call the OpenTravel API separately, do not try to launch the daemon yourself. `search.js` already drives the stealth daemon through a careful flow that survives bot-detection — it handles Agoda discovery internally for EVERY city (including Chinese cities like Shanghai, Hangzhou, etc.). **Manually navigating an OTA is the #1 cause of failure: it trips Agoda/Booking anti-bot (\"detect automation\", \"redirect to homepage\", \"problem completing your search\") and gets the IP blocked.** Your ONLY job is to run `search.js` once and send its output. If you think a source is \"missing\", re-read RULE 4 — do NOT go fetch it by hand.\n\n**RULE 2 — First-time city discovery takes 2–4 minutes.** If `search.js` output contains `\"discovering\"` or `\"launching\"` messages, tell the user: \"First time searching this city — discovering selectors, this takes about 2–4 minutes...\" and wait for the result. Do NOT retry or abort.\n\n**RULE 3 — Send the output exactly.** `search.js` outputs formatted tier cards ready to send. Copy the output directly into your response. Do not reformat, summarize, or abbreviate it.\n\n**RULE 3a — PRESERVE MARKDOWN HYPERLINKS.** Every hotel name in the output is already wrapped as `[Hotel Name](https://booking-url...)`. This is a clickable hyperlink — DO NOT:\n- Strip the markdown and show the URL on a separate `🔗 https://...` line\n- Replace `[Hotel Name](url)` with plain text\n- Capitalize OTA names (\"google\" stays \"google\", not \"Google\")\n- Rename sections — \"📋 More good deals\" stays exactly\n\nThe output is Telegram-MarkdownV2-ready. Sending it as-is gives the user clickable hotel names with hidden URLs (clean UI).\n\n**RULE 3b — If you DO add a suggestion / commentary section after the output, every hotel name you mention MUST also be a markdown hyperlink `[Hotel Name](url)` using the SAME URL the script printed for that hotel.** Never write a hotel name as plain text in your own commentary.\n\n**RULE 4 — Partial results are NORMAL and acceptable. Never \"fix\" them by hand.** A source can be absent from the output (e.g. Agoda blocked this run, or OpenTravel has no inventory for the city). That is FINE — send the tier cards with whatever sources are present. The footer (`📊 N hotels | <sources> • prices in USD`) lists exactly what was found. **Do NOT** try to fetch the missing source via the browser, a direct URL, or any other tool — that triggers anti-bot and makes things worse. If `search.js` errors out entirely, tell the user what failed in 1 line and show any partial output it printed above the error. If you want more coverage, the only valid retry is running the SAME `search.js` command again (anti-bot is often transient).\n\n---\n\n## Output Format Reference\n\n`search.js` prints tier cards in this format — you send this directly to the user:\n\nThe hotel name is a Markdown link to its cheapest OTA. Price rows carry NO\nlinks and the OTA key is shown lowercase (`agoda`/`booking`/`google`/`opentravel`).\nThere are no star ratings or area lines — the script does not have that data.\n\n```\n🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD\n```\n\nAll prices are shown in USD. Agoda, Google and OpenTravel geo-lock to VND by IP and are converted via a live FX rate; Booking returns USD natively. Only sources that actually returned data are listed in the footer.\n\n---\n\n## Limitations\n\n- First search per city pays the Agoda discovery cost (2–4 minutes). Google and Booking are inline (no discovery); OpenTravel is a direct API call.\n- Subsequent searches reuse the Agoda cache and complete in ~30–60 seconds.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1783654477103\n}\n\nFile v1.0.0:package-lock.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"0.8.3\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"0.8.3\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}\n\nFile v1.0.0:package.json\n\n{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"0.8.4\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"description\": \"Agent-driven browser primitives + OpenTravel API client. The agent reasons over text DOM snapshots and drives the browser action-by-action — no pre-coded selectors.\",\n  \"author\": \"PriceWin\",\n  \"license\": \"MIT-0\",\n  \"homepage\": \"https://github.com/Price-Win/pricewin-skills-hub/tree/main/skills/pricewin-hotel-deal-finder#readme\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Price-Win/pricewin-skills-hub.git\",\n    \"directory\": \"skills/pricewin-hotel-deal-finder\"\n  },\n  \"bugs\": \"https://github.com/Price-Win/pricewin-skills-hub/issues\",\n  \"bin\": {\n    \"browse\": \"bin/browse.js\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"echo 'Run install.sh next to download Chromium' >&2\"\n  },\n  \"dependencies\": {\n    \"patchright\": \"^1.55.2\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  }\n}","readmeExcerpt":"Skill: pricewin-hotel-deal-finder Owner: cotghw Summary: Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best ","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD"},{"language":"bash","snippet":"npx skills add https://github.com/Price-Win/pricewin-skills-hub --skill pricewin-hotel-deal-finder"},{"language":"bash","snippet":"cd {baseDir} && node bin/search.js \"<city>\" <checkInYYYY-MM-DD> <checkOutYYYY-MM-DD> <adults> en-us"},{"language":"bash","snippet":"cd {baseDir} && node bin/search.js \"Hangzhou\" 2026-06-10 2026-06-13 2 en-us"},{"language":"text","snippet":"cd {baseDir} && node bin/search.js ..."},{"language":"text","snippet":"🏨 <city> • <d1>–<d2> • <N> nights • <adults> guests\n━━━━━━━━━━━━━━━━━━━━\n\n🥇 BEST VALUE\n[<Hotel Name>](<cheapest_link>)\n  ✅ agoda      💰 <price>/night\n     booking    💰 <price>/night\n     opentravel 💰 <price>/night\n     → Save <diff> vs Booking\n\n🥈 CHEAPEST\n[<Hotel Name>](<cheapest_link>)\n  ✅ google     💰 <price>/night\n     agoda      💰 <price>/night\n\n🥉 QUALITY\n[<Hotel Name>](<cheapest_link>)\n  ✅ booking    💰 <price>/night\n     agoda      💰 <price>/night\n\n📋 More good deals\n  — Agoda —\n  • [<Hotel>](<agoda_link>) — agoda: <price> | booking: <price>\n  — Booking —\n  • [<Hotel>](<booking_link>) — booking: <price>\n  — Google —\n  • [<Hotel>](<google_link>) — google: <price>\n  — OpenTravel —\n  • [<Hotel>](<opentravel_link>) — opentravel: <price>\n\n💡 Tip: <best Hotel Name>\n   [Book on <OTA>](<link>) — <price>/night\n\n📊 <N> hotels | <sources with data> • prices in USD"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: pricewin-hotel-deal-finder\ndescription: \"Find the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates — one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD. Use whenever someone asks for hotel prices, hotel deals, the cheapest room or rate, best hotel rates, a hotel price comparison, or which OTA is cheaper — e.g. 'is Booking or Agoda cheaper for Tokyo', 'find me a hotel in Bangkok under $100', 'compare hotel prices for 12–15 Aug', 'cheapest hotel near Shinjuku'.\"\nversion: 1.1.3\nauthor: PriceWin\nplatforms: [linux, macos, windows]\ntags: [hotel-price-comparison, compare-hotel-prices, cheapest-hotel, cheapest-hotels, hotel-deals, booking-vs-agoda, best-hotel-rates, best-rates, hotel-search, hotel-booking, price-comparison, booking-com, agoda, google-hotels, opentravel, ota, hotel, hotels, travel, travel-deals, trip-planning, accommodation, deals]\nmetadata:\n  openclaw:\n    requires:\n      bins: [node, npx]\n    envVars:\n      - name: OPENTRAVEL_API_BASE_URL\n        required: false\n        description: Override the OpenTravel API host (default https://api.opentravel.one).\n    emoji: \"🏨\"\n    homepage: https://github.com/Price-Win/pricewin-skills-hub\n---\n\n# PriceWin Hotel Deal Finder\n\n> **Compare live hotel prices across Booking.com, Agoda, Google Hotels & OpenTravel in one command** — and get back ranked best-value, cheapest, and quality picks with direct booking links.\n\nStop opening five OTA tabs to find the real cheapest rate. Ask your agent *\"find me a hotel in Tokyo for 12–15 Aug, 2 guests\"* and this skill returns a clean, ranked comparison in ~30–60 seconds (cached cities).\n\n**Invoke this skill for questions like:**\n- \"What's the cheapest hotel in `<city>` for `<dates>`?\"\n- \"Is Booking.com or Agoda cheaper for this hotel?\"\n- \"Compare hotel prices for `<city>`, `<N>` guests.\"\n- \"Find me a hotel under $`<X>`/night in `<city>`.\"\n- \"Best-value place to stay near `<landmark>` on `<dates>`?\"\n\nEach returns the same one-command answer below — no clarifying round-trip needed.\n\n**What you get from one command:**\n- 🥇 Best value · 🥈 Cheapest · 🥉 Quality — picked side-by-side\n- Real per-night prices from up to **4 sources**, normalized to **USD**\n- **Clickable booking links** straight to the cheapest OTA for each hotel\n- Works for **any city worldwide** — including bot-hardened ones (Shanghai, Hangzhou, Bangkok…) via a stealth Patchright daemon\n- No API keys, no MCP server — `node`/`npx` is all you need\n\n**Sample result:**\n\n```\n🏨 Tokyo • Aug 12–15 • 3 nights • 2 guests\n━━━━━━━━━━━━━━━━━━━━\n🥇 BEST VALUE\nShinjuku Granbell Hotel\n  ✅ agoda      💰 $118/night\n     booking    💰 $131/night\n     → Save $13 vs Booking\n🥈 CHEAPEST\nAPA Hotel Shinjuku\n  ✅ google     💰 $94/night\n📊 18 hotels | agoda, booking, google, opentravel • prices in USD\n```\n\n**Install:**\n```bash\nnpx skills add https://github.co"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn78zmb7mvmy4x18hbyv4hs76s88pxsw\",\n  \"slug\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1785680846480\n}"},{"path":"SECURITY.md","content":"# Security & Data Handling — PriceWin Hotel Deal Finder\n\nThis skill drives a stealth browser (Patchright/Chromium) to read **public** hotel\nlistings and compare prices. It runs entirely on the user's machine, needs no API\nkeys, and collects no personal data. This document discloses exactly what it\nexecutes, what it downloads, what leaves the machine, and how untrusted web\ncontent is contained — so an auditing agent (or a human) can verify the behavior\ninstead of inferring it.\n\n## What runs (command execution)\n\nThe skill's only entry point is one command:\n\n```bash\nnode bin/search.js \"<city>\" <checkIn> <checkOut> <adults> [locale]\n```\n\n`search.js` spawns `bin/browse.js` / `bin/daemon.js` (both shipped in this repo)\nto control a local browser. It runs **no** shell strings built from scraped\ncontent, executes **no** downloaded code, and takes **no** command input from web\npages — the browser flow is fixed in this repo's source. `npm install` / `npx`\nappear **only** at install time to fetch the `patchright` dependency (see below).\n\nThe skill's whole source is three files in `bin/` and four in `lib/`: no minified\nblobs, no obfuscation, no `eval`, no post-install script that fetches code (the\n`postinstall` hook only prints a reminder). Every source file is auditable in the\npublic repo\n<https://github.com/Price-Win/pricewin-skills-hub>.\n\n## Why a \"stealth\" browser\n\nThe word is doing narrow work here. Patchright masks the CDP-level automation\nfingerprint so a **normal, logged-out page view** of a public listing is not\nmistaken for a scraping bot and served an empty or blocked page. It exists to\nread public prices reliably from bot-hardened cities, not to evade security\ncontrols: the skill does not bypass authentication, solve CAPTCHAs, defeat\nrate limits with proxy rotation, hide from the user, or persist beyond the\nsession (`browse close`, `SIGTERM`, or the state file disappearing all stop it).\nNothing about it is aimed at endpoint security software, and it makes no attempt\nto conceal what it is doing on the user's own machine — the daemon logs to\nstderr and its state file is in plain sight under `~/.cache/`.\n\n## What it downloads\n\n| Item | When | Source | Purpose |\n|------|------|--------|---------|\n| `patchright` npm package | install | npm registry | Stealth Playwright fork (browser driver) |\n| Chromium | first run (`install.sh`) | Patchright's official host | The browser engine that renders OTA pages |\n\nNo other binaries or code are downloaded at runtime.\n\n## What leaves the machine (network egress)\n\nEgress is limited to a fixed, auditable set of hosts. **The only user-derived data\nsent is the search query itself** — city, check-in/out dates, guest count. No\naccount data, credentials, cookies from other sites, files, or PII are transmitted.\n\n| Host | Data sent | Why |\n|------|-----------|-----|\n| `booking.com`, `agoda.com`, `google.com/travel` | city + dates + guests (as normal search URL params) | Read public listing prices |\n| `api.opentravel.one` "},{"path":"skill-card.md","content":"## Description:\n\nFind the cheapest hotel deal by comparing live prices across Booking.com, Agoda, Google Hotels, and OpenTravel for any city worldwide and any travel dates; one command returns ranked best-value, cheapest, and quality picks with direct booking links, all normalized to USD.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[cotghw](https://clawhub.ai/user/cotghw)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTravelers, travel planners, and agents use this skill to compare public hotel prices for a destination, date range, and guest count across multiple providers and return ranked booking options. It is intended for normal hotel deal finding and OTA price comparison workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill runs a local browser daemon that can navigate and read pages during hotel searches.\n\nMitigation: Run it as an unprivileged user, especially in shared environments or when the agent has broad filesystem access.\n\nRisk: Search results include booking links from external providers.\n\nMitigation: Verify booking-link destinations before clicking or sharing them.\n\nRisk: A custom OpenTravel API base URL can redirect search data to an unexpected service.\n\nMitigation: Use `OPENTRAVEL_API_BASE_URL` only with trusted endpoints.\n\nRisk: A failed search may leave the PriceWin browser daemon running locally.\n\nMitigation: Be prepared to manually stop the PriceWin daemon after failures.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/cotghw/skills/pricewin-hotel-deal-finder)\n- [Project homepage](https://github.com/Price-Win/pricewin-skills-hub)\n- [Security and data handling](SECURITY.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Markdown-formatted hotel price comparison with ranked picks, per-night prices, and direct booking links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Prices are normalized to USD; provider coverage may be partial when a source has no inventory or is blocked.]\n\n## Skill Version(s):\n\n1.1.3 (source: frontmatter, package.json, release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"package-lock.json","content":"{\n  \"name\": \"pricewin-hotel-deal-finder\",\n  \"version\": \"1.1.1\",\n  \"lockfileVersion\": 3,\n  \"requires\": true,\n  \"packages\": {\n    \"\": {\n      \"name\": \"pricewin-hotel-deal-finder\",\n      \"version\": \"1.1.1\",\n      \"hasInstallScript\": true,\n      \"dependencies\": {\n        \"patchright\": \"^1.55.2\"\n      },\n      \"bin\": {\n        \"browse\": \"bin/browse.js\"\n      },\n      \"engines\": {\n        \"node\": \">=20\"\n      }\n    },\n    \"node_modules/fsevents\": {\n      \"version\": \"2.3.2\",\n      \"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n      \"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n      \"hasInstallScript\": true,\n      \"license\": \"MIT\",\n      \"optional\": true,\n      \"os\": [\n        \"darwin\"\n      ],\n      \"engines\": {\n        \"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n      }\n    },\n    \"node_modules/patchright\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright/-/patchright-1.59.4.tgz\",\n      \"integrity\": \"sha512-RDZ40tBZHZtTAMoUoct/IpMA1wrozPZGU2RFk8NIDEndOEBbLxS0dH2fRLiwsNrgXgjZGA/3krrTlzK+uFGgoQ==\",\n      \"license\": \"Apache-2.0\",\n      \"dependencies\": {\n        \"patchright-core\": \"v1.59.4\"\n      },\n      \"bin\": {\n        \"patchright\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      },\n      \"optionalDependencies\": {\n        \"fsevents\": \"2.3.2\"\n      }\n    },\n    \"node_modules/patchright-core\": {\n      \"version\": \"1.59.4\",\n      \"resolved\": \"https://registry.npmjs.org/patchright-core/-/patchright-core-1.59.4.tgz\",\n      \"integrity\": \"sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==\",\n      \"license\": \"Apache-2.0\",\n      \"bin\": {\n        \"patchright-core\": \"cli.js\"\n      },\n      \"engines\": {\n        \"node\": \">=18\"\n      }\n    }\n  }\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":2011,"uniquenessScore":40,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:20:49.873Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T16:20:49.873Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:58:22.200Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}