[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6J4P8XKB8RJ7PCYMZPZ0F6S":3,"skill-same:01M6J4P8XKB8RJ7PCYMZPZ0F6S":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":60,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":65,"ownerHtmlUrl":66,"ownerBlogUrl":67,"ownerDescription":68,"updatedAt":69,"install":70,"resources":83},"01M6J4P8XKB8RJ7PCYMZPZ0F6S","you-web-search",null,"Web search using You.com Search API with high-quality, cited results — runs keyless out of the box; YDC_API_KEY unlocks higher limits and real-time web crawling","MiroShark\u002Fmiroshark-aeon","MiroShark","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F304594232?v=4","01M6J466B8NNAZ4H6NNK3N3TT5","01M6J466FXNNWH622S3B9PC496",20,"MIT","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fyou-web-search\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"web","search","you web search","web search","you","limits","research","high","read-only","with","web crawling","time","basics","only","results","read","quality","api","box","keyless","real-time","2026-11-10 10:12:30",false,"---\nname: you-web-search\ndescription: Web search using You.com Search API with high-quality, cited results — runs keyless out of the box; YDC_API_KEY unlocks higher limits and real-time web crawling\nmetadata:\n  title: You.com Web Search\n  mode: read-only\n  category: basics\n  var: \"\"\n  tags:\n    - web\n    - search\n    - research\n  requires:\n    - YDC_API_KEY?\n---\n\n> **${var}** — Search query or topic. When empty, uses a general search for current notable developments across tracked areas.\n\nToday is ${today}. Perform web search using You.com's Search API to find current, high-quality information on **${var}**.\n\n## Overview\n\nThis skill provides web search functionality via You.com's Search API, offering several advantages over basic WebSearch:\n\n- **Higher quality results** with relevance ranking and citation extraction\n- **Works with zero configuration** — no key, wallet, or sign-up needed for the keyless tier\n- **Real-time web crawling** for fresh content when `livecrawl=web` is enabled (keyed tier)\n- **Structured result format** with titles, URLs, snippets, and publication dates\n- **Optional livecrawl control** through `YOUCOM_LIVECRAWL` when a full page fetch is useful\n\n### Auth modes\n\n| Mode | When | Endpoint | Limits |\n| --- | --- | --- | --- |\n| `keyless` | `YDC_API_KEY` unset | `https:\u002F\u002Fapi.you.com\u002Fv1\u002Fagents\u002Fsearch` | 100 searches\u002Fday per IP, no livecrawl |\n| `keyed` | `YDC_API_KEY` set | `https:\u002F\u002Fapi.you.com\u002Fv1\u002Fsearch` | Your plan's limits, livecrawl available |\n\n## Phase 1 — Execute Search\n\n### Auth Mode\n\nKey check: read the \"Keys set for this run\" line in your run notes, never a shell test (those are refused and cost a turn). `YDC_API_KEY` on that line = AUTH_MODE `keyed`, not on it = `keyless`. Read the two optional settings with one call:\n```bash\nnode -e 'console.log(\"freshness=\" + (process.env.YOUCOM_FRESHNESS || \"week\") + \" livecrawl=\" + (process.env.YOUCOM_LIVECRAWL || \"\"))'\n```\nIt prints FRESHNESS (default `week`) and LIVECRAWL (empty when unset).\n\nA missing key is **not** an error — the skill runs on the keyless tier.\n\n### API Call\n\nBoth modes call the same REST contract through `.\u002Fsecretcurl`. In `keyed` mode the `{YDC_API_KEY}` placeholder is substituted inside the helper; in `keyless` mode no key header is sent at all.\n\n`QUERY` = `${var}`, or `current notable developments in AI, crypto, and technology` when it is empty. `COUNT` = `10`. Make exactly one call for the AUTH_MODE you got, with QUERY, FRESHNESS and LIVECRAWL written in literally (`--data-urlencode` does the URL encoding).\n\n**`keyed`** (livecrawl is a keyed-tier feature; the keyless endpoint answers it with 402). Add the `livecrawl` line only when LIVECRAWL is non-empty:\n```bash\n.\u002Fsecretcurl -s -o \u002Ftmp\u002Fyoucom-search.json -w 'youcom http=%{http_code} auth_mode=keyed bytes=%{size_download}\\n' \\\n  --max-time 30 -G \"https:\u002F\u002Fapi.you.com\u002Fv1\u002Fsearch\" \\\n  --data-urlencode \"query=\u003CQUERY>\" --data-urlencode \"count=10\" --data-urlencode \"safesearch=strict\" --data-urlencode \"freshness=\u003CFRESHNESS>\" \\\n  --data-urlencode \"livecrawl=\u003CLIVECRAWL>\" \\\n  -H \"X-API-Key: {YDC_API_KEY}\" \\\n  -H \"User-Agent: youdotcom-integration\u002Faeonfun-aeon\"\n```\n\n**`keyless`**. If LIVECRAWL is non-empty, first record that it is skipped:\n```bash\necho \"youcom livecrawl=skipped reason=keyless (set YDC_API_KEY to enable)\"\n```\nThen:\n```bash\n.\u002Fsecretcurl -s -o \u002Ftmp\u002Fyoucom-search.json -w 'youcom http=%{http_code} auth_mode=keyless bytes=%{size_download}\\n' \\\n  --max-time 30 -G \"https:\u002F\u002Fapi.you.com\u002Fv1\u002Fagents\u002Fsearch\" \\\n  --data-urlencode \"query=\u003CQUERY>\" --data-urlencode \"count=10\" --data-urlencode \"safesearch=strict\" --data-urlencode \"freshness=\u003CFRESHNESS>\" \\\n  -H \"User-Agent: youdotcom-integration\u002Faeonfun-aeon\"\n```\n\nThe `-w` label prints HTTP (`000` on a network failure) and the body size.\n\nNever send the key to the keyless endpoint, and never call the keyed endpoint without a key (it answers with a `402` payment challenge rather than results).\n\n### Response Processing\n\nOn `HTTP=200` with a non-empty body (`bytes` above 0), extract web and news results using the documented Search API shape, one call:\n\n```bash\njq -r '\n  [\n    (.results.web[]?  | [\"web\",  (.title \u002F\u002F \"\"), (.url \u002F\u002F \"\"), ((.snippets \u002F\u002F []) | join(\" \")), (.page_age \u002F\u002F \"recent\")]),\n    (.results.news[]? | [\"news\", (.title \u002F\u002F \"\"), (.url \u002F\u002F \"\"), ((.snippets \u002F\u002F []) | join(\" \")), (.page_age \u002F\u002F \"recent\")])\n  ] | .[] | @tsv\n' \u002Ftmp\u002Fyoucom-search.json\n```\n\n`RESULT_COUNT` = the number of rows it printed (state `Extracted \u003CN> search results`). If `jq` failed, the parse failed and `RESULT_COUNT` = 0. On any other HTTP, `RESULT_COUNT` = 0.\n\nThen decide (in prose, no `if`\u002F`case` block). Any non-200, or a 200 with nothing usable, hands the run to the built-in WebSearch:\n- `RESULT_COUNT` above 0: `SOURCE_PATH=youcom`.\n- `RESULT_COUNT` = 0: `SOURCE_PATH=websearch`, with `REASON` = `EMPTY` (HTTP 200, parse OK), `PARSE` (HTTP 200, `jq` failed), `NETWORK` (HTTP `000`), else `HTTP_\u003Ccode>`. Record it with one call, values written in literally:\n  ```bash\n  echo \"youcom fallback=websearch reason=\u003CREASON> auth_mode=\u003CAUTH_MODE>\"\n  ```\n\n### WebSearch Fallback\n\nWhen `SOURCE_PATH=websearch`, don't end the run empty. Run the same query (`QUERY`) through the built-in **WebSearch** tool and continue to Phase 2 with those results. The log line above is the record of why:\n\n```\nyoucom fallback=websearch reason=HTTP_401 auth_mode=keyless\n```\n\nTypical triggers are a keyless `401` (see [Error Handling](#error-handling)), the keyless `429` daily cap (shared GitHub Actions runner IPs can hit it even on light usage), `5xx`, a network timeout (`reason=NETWORK`), an unparseable body (`reason=PARSE`), or zero results (`reason=EMPTY`). Only fall back once per run. If WebSearch also returns nothing, report that neither source returned results.\n\n## Phase 2 — Format Results  \n\nProcess the results into a readable format:\n\n### Result Structure\n\nFor each result from You.com API:\n- **Title** — article\u002Fpage title\n- **URL** — direct link to source  \n- **Snippet** — join `snippets[]` into one excerpt highlighting query match\n- **Date** — `page_age` or `recent` when unavailable\n\n### Quality Filtering\n\nApply basic quality filters:\n- Exclude results with missing or placeholder titles\n- Skip results without accessible URLs\n- Filter out low-quality content (spam, thin content)\n- Deduplicate near-identical results from the same domain\n\n### Formatting\n\nStructure the output for easy consumption:\n\n```\n*You.com Web Search Results — ${today}*\n\nQuery: \"${var}\"\nSource: ${source}\nResults: ${result_count} found\n\n1. **[Title](URL)**  \n   Snippet with relevant context...\n   Published: Date\n\n2. **[Title](URL)**\n   Snippet...  \n   Published: Date\n\n---\nAPI Status: ${http_status} | Auth: ${auth_mode} | Quality: ${quality_score}\u002F5\n```\n\n`${source}` is exactly one of `You.com Search API (${auth_mode})` or `WebSearch (fallback: ${reason})`, matching `SOURCE_PATH`. Never print both.\n\n## Phase 3 — Delivery and Logging\n\n### Notification\n\nSend formatted results via `.\u002Fnotify`:\n- Include query, result count, and source attribution\n- Highlight most relevant results (top 5-7)  \n- Note the auth mode actually used (`keyless` or `keyed`)\n- When the fallback ran, say so and give the reason (e.g. \"via WebSearch — You.com returned HTTP 401\")\n- Include livecrawl info when enabled (or that it was skipped on the keyless tier)\n\n### Memory Integration  \n\nLog the search for future reference:\n\n1. **Log record** - this skill is `read-only`, so the workflow's read-only guard writes its `### you-web-search` log entry from your captured output; a self-written entry would be a duplicate. Don't append to `memory\u002Flogs\u002F` yourself - put this record in your **final output**:\n   ```\n   ### you-web-search\n   - Query: \"${var}\"\n   - Source: ${source}\n   - Results: N found, M delivered  \n   - Status: HTTP ${code}\n   - Quality score: X\u002F5 (relevance, freshness, diversity)\n   ```\n\n2. **Update search memory** - Add successful searches to `memory\u002Fsearches.md` for pattern tracking (append with a one-line `node -e` writer, e.g. `node -e 'require(\"fs\").appendFileSync(\"memory\u002Fsearches.md\", process.argv[1] + \"\\n\")' \"\u003Cline>\"`)\n\n## Error Handling\n\n### API Failure Recovery\n\nEvery failure below ends in the [WebSearch fallback](#websearch-fallback), so a run always has results. The notes say what to tell the operator:\n\n- **Keyless 401**: In `keyless` mode no key is sent, so a `401` is **not** a credential problem. Some locations currently get `401` from the keyless endpoint with a body like `{\"detail\":\"'ascii' codec can't encode characters ...\"}`. This is a known server-side issue with non-ASCII region names (e.g. `Île-de-France`), and `country`\u002F`language` parameters don't avoid it. Fall back and log `reason=HTTP_401`. Setting `YDC_API_KEY` uses the keyed endpoint, which is unaffected\n- **Rate limits (429)**: Log rate limit hit. In `keyless` mode this is usually the 100\u002Fday per-IP cap — suggest setting `YDC_API_KEY` (get one at https:\u002F\u002Fyou.com\u002Fplatform?utm_source=aeonfun-aeon&utm_medium=oss_integration&utm_campaign=2026-09-oss-integrations&utm_content=error-message). In `keyed` mode, suggest checking the plan quota\n- **Payment required (402)**: The request needs the keyed tier (e.g. livecrawl without a key) — suggest setting `YDC_API_KEY`\n- **Invalid key (401\u002F403, keyed mode)**: Clear error about checking `YDC_API_KEY`\n- **Server errors (5xx)**: Transient. Fall back and log `reason=HTTP_\u003Ccode>` (e.g. `HTTP_503`)\n- **Network failures**: Fall back and log `reason=NETWORK`\n- **Malformed responses**: A `200` whose body `jq` can't parse. Fall back and log `reason=PARSE`\n- **Empty results**: A `200` with zero results. Fall back and log `reason=EMPTY`. If WebSearch is also empty, suggest query refinement or broader terms\n\n### Logging Failures  \n\nRecord failure reasons for debugging:\n- `youcom-api-unavailable` — API endpoint unreachable\n- `youcom-rate-limited` — Hit plan limits or the keyless daily cap\n- `youcom-payment-required` — Keyed-tier feature requested without a key\n- `youcom-auth-invalid` — API key rejected (keyed mode)\n- `youcom-keyless-401` — Keyless endpoint returned 401 with no key sent\n- `youcom-parse-error` — Response format unexpected\n\n## Network\n\nBoth modes go through `.\u002Fsecretcurl` so one code path covers them: keyed calls carry the `{YDC_API_KEY}` placeholder (never a bare `$YDC_API_KEY` on the line); keyless calls carry no placeholder and are passed through unchanged. Every request sends `User-Agent: youdotcom-integration\u002Faeonfun-aeon`.\n\n**Shell shape.** Each Bash call is one allowed command (pipes are fine). The run refuses a call that sets a variable (`X=$(...)`), uses `if` \u002F `case` \u002F `[ ... ] &&` tests, contains `$(...)`, or joins commands with `;`, `&&` or `||`, and each refusal costs a model turn. So the key check reads the run notes' \"Keys set for this run\" line instead of a shell test, the settings check is a `node -e` one-liner, the search is one `.\u002Fsecretcurl` call per auth mode with every value written in literally (`--data-urlencode` instead of `jq @uri`), the `-w` label replaces the `echo ... $(wc -c ...)` line, and the fallback decision is a prose step. This skill is read-only: any file it keeps (such as `memory\u002Fsearches.md`) is written with a one-line `node -e` writer, never `>` or `>>`.\n\n## Environment Variables\n\n- **`YDC_API_KEY`** (optional) — You.com API key. Unset: the skill runs on the free keyless tier (100 searches\u002Fday per IP, no livecrawl). Set: keyed Search API with your plan's limits and livecrawl. Get a key at https:\u002F\u002Fyou.com\u002Fplatform?utm_source=aeonfun-aeon&utm_medium=oss_integration&utm_campaign=2026-09-oss-integrations&utm_content=docs.\n- **`YOUCOM_FRESHNESS`** (optional) — Freshness filter (`day`, `week`, `month`, `year`, or a date range).\n- **`YOUCOM_LIVECRAWL`** (optional, keyed only) — Pass through to `livecrawl` when you want full page content (`web`, `news`, or `all`). Ignored on the keyless tier.\n\n## Constraints\n\n- **Never expose credentials** in logs or notifications\n- **Always attribute source** — clearly indicate You.com API\n- **Respect rate limits** — handle 429 responses gracefully\n- **Validate all URLs** — ensure results contain real, accessible links\n- **Keep results relevant** — filter low-quality or off-topic results\n- **Never end a run empty** — on any You.com failure, fall back to WebSearch and log `youcom fallback=websearch reason=\u003CREASON>`\n- **Report the path honestly** — say whether results came from You.com or the WebSearch fallback, never present fallback results as You.com results\n\n## Integration Notes  \n\n### Relationship to Built-in WebSearch\n\nThis skill **complements** Aeon's built-in WebSearch, but it is a separate Search API path (keyless by default, keyed when `YDC_API_KEY` is set):\n\n- **You.com advantages**: Higher quality results, real-time crawling, better relevance ranking\n- **WebSearch advantages**: No API dependency, always available, deeply integrated. It is also this skill's fallback whenever the You.com call fails\n- **Use You.com for**: Research tasks, fact-checking, current events, specific queries\n- **Use WebSearch for**: Built-in search flows elsewhere in Aeon\n\n### Scheduling Recommendations\n\n- **On-demand**: Manual execution for specific research needs\n- **Low frequency**: Daily or less frequent automatic searches to respect quotas  \n- **Research workflows**: Chain with other skills that need web context\n- **Avoid high-frequency**: Don't schedule more than hourly to preserve API quotas — the keyless tier is capped at 100 searches\u002Fday per IP\n\n### Skills Integration\n\nThis skill works well with:\n- **digest** — Enhanced web signal for daily digests\n- **article** — Research support for article generation  \n- **github-trending** — Context for trending repo evaluation\n- **token-pick** — Market research and catalyst discovery\n- **mention-radar** — Broader web mention detection beyond X\u002FTwitter\n\nThe You.com search results can inform other skills' web research needs while providing a higher-quality alternative to basic web search.\n","> **${var}** — Search query or topic. When empty, uses a general search for current notable developments across tracked areas.\n\nToday is ${today}. Perform web search using You.com's Search API to find current, high-quality information on **${var}**.\n\n## Overview\n\nThis skill provides web search functionality via You.com's Search API, offering several advantages over basic WebSearch:\n\n- **Higher quality results** with relevance ranking and citation extraction\n- **Works with zero configuration** — no key, wallet, or sign-up needed for the keyless tier\n- **Real-time web crawling** for fresh content when `livecrawl=web` is enabled (keyed tier)\n- **Structured result format** with titles, URLs, snippets, and publication dates\n- **Optional livecrawl control** through `YOUCOM_LIVECRAWL` when a full page fetch is useful\n\n### Auth modes\n\n| Mode | When | Endpoint | Limits |\n| --- | --- | --- | --- |\n| `keyless` | `YDC_API_KEY` unset | `https:\u002F\u002Fapi.you.com\u002Fv1\u002Fagents\u002Fsearch` | 100 searches\u002Fday per IP, no livecrawl |\n| `keyed` | `YDC_API_KEY` set | `https:\u002F\u002Fapi.you.com\u002Fv1\u002Fsearch` | Your plan's limits, livecrawl available |\n\n## Phase 1 — Execute Search\n\n### Auth Mode\n\nKey check: read the \"Keys set for this run\" line in your run notes, never a shell test (those are refused and cost a turn). `YDC_API_KEY` on that line = AUTH_MODE `keyed`, not on it = `keyless`. Read the two optional settings with one call:\n```bash\nnode -e 'console.log(\"freshness=\" + (process.env.YOUCOM_FRESHNESS || \"week\") + \" livecrawl=\" + (process.env.YOUCOM_LIVECRAWL || \"\"))'\n```\nIt prints FRESHNESS (default `week`) and LIVECRAWL (empty when unset).\n\nA missing key is **not** an error — the skill runs on the keyless tier.\n\n### API Call\n\nBoth modes call the same REST contract through `.\u002Fsecretcurl`. In `keyed` mode the `{YDC_API_KEY}` placeholder is substituted inside the helper; in `keyless` mode no key header is sent at all.\n\n`QUERY` = `${var}`, or `current notable developments in AI, crypto, and technology` when it is empty. `COUNT` = `10`. Make exactly one call for the AUTH_MODE you got, with QUERY, FRESHNESS and LIVECRAWL written in literally (`--data-urlencode` does the URL encoding).\n\n**`keyed`** (livecrawl is a keyed-tier feature; the keyless endpoint answers it with 402). Add the `livecrawl` line only when LIVECRAWL is non-empty:\n```bash\n.\u002Fsecretcurl -s -o \u002Ftmp\u002Fyoucom-search.json -w 'youcom http=%{http_code} auth_mode=keyed bytes=%{size_download}\\n' \\\n  --max-time 30 -G \"https:\u002F\u002Fapi.you.com\u002Fv1\u002Fsearch\" \\\n  --data-urlencode \"query=\u003CQUERY>\" --data-urlencode \"count=10\" --data-urlencode \"safesearch=strict\" --data-urlencode \"freshness=\u003CFRESHNESS>\" \\\n  --data-urlencode \"livecrawl=\u003CLIVECRAWL>\" \\\n  -H \"X-API-Key: {YDC_API_KEY}\" \\\n  -H \"User-Agent: youdotcom-integration\u002Faeonfun-aeon\"\n```\n\n**`keyless`**. If LIVECRAWL is non-empty, first record that it is skipped:\n```bash\necho \"youcom livecrawl=skipped reason=keyless (set YDC_API_KEY to enable)\"\n```\nThen:\n```bash\n.\u002Fsecretcurl -s -o \u002Ftmp\u002Fyoucom-search.json -w 'youcom http=%{http_code} auth_mode=keyless bytes=%{size_download}\\n' \\\n  --max-time 30 -G \"https:\u002F\u002Fapi.you.com\u002Fv1\u002Fagents\u002Fsearch\" \\\n  --data-urlencode \"query=\u003CQUERY>\" --data-urlencode \"count=10\" --data-urlencode \"safesearch=strict\" --data-urlencode \"freshness=\u003CFRESHNESS>\" \\\n  -H \"User-Agent: youdotcom-integration\u002Faeonfun-aeon\"\n```\n\nThe `-w` label prints HTTP (`000` on a network failure) and the body size.\n\nNever send the key to the keyless endpoint, and never call the keyed endpoint without a key (it answers with a `402` payment challenge rather than results).\n\n### Response Processing\n\nOn `HTTP=200` with a non-empty body (`bytes` above 0), extract web and news results using the documented Search API shape, one call:\n\n```bash\njq -r '\n  [\n    (.results.web[]?  | [\"web\",  (.title \u002F\u002F \"\"), (.url \u002F\u002F \"\"), ((.snippets \u002F\u002F []) | join(\" \")), (.page_age \u002F\u002F \"recent\")]),\n    (.results.news[]? | [\"news\", (.title \u002F\u002F \"\"), (.url \u002F\u002F \"\"), ((.snippets \u002F\u002F []) | join(\" \")), (.page_age \u002F\u002F \"recent\")])\n  ] | .[] | @tsv\n' \u002Ftmp\u002Fyoucom-search.json\n```\n\n`RESULT_COUNT` = the number of rows it printed (state `Extracted \u003CN> search results`). If `jq` failed, the parse failed and `RESULT_COUNT` = 0. On any other HTTP, `RESULT_COUNT` = 0.\n\nThen decide (in prose, no `if`\u002F`case` block). Any non-200, or a 200 with nothing usable, hands the run to the built-in WebSearch:\n- `RESULT_COUNT` above 0: `SOURCE_PATH=youcom`.\n- `RESULT_COUNT` = 0: `SOURCE_PATH=websearch`, with `REASON` = `EMPTY` (HTTP 200, parse OK), `PARSE` (HTTP 200, `jq` failed), `NETWORK` (HTTP `000`), else `HTTP_\u003Ccode>`. Record it with one call, values written in literally:\n  ```bash\n  echo \"youcom fallback=websearch reason=\u003CREASON> auth_mode=\u003CAUTH_MODE>\"\n  ```\n\n### WebSearch Fallback\n\nWhen `SOURCE_PATH=websearch`, don't end the run empty. Run the same query (`QUERY`) through the built-in **WebSearch** tool and continue to Phase 2 with those results. The log line above is the record of why:\n\n```\nyoucom fallback=websearch reason=HTTP_401 auth_mode=keyless\n```\n\nTypical triggers are a keyless `401` (see [Error Handling](#error-handling)), the keyless `429` daily cap (shared GitHub Actions runner IPs can hit it even on light usage), `5xx`, a network timeout (`reason=NETWORK`), an unparseable body (`reason=PARSE`), or zero results (`reason=EMPTY`). Only fall back once per run. If WebSearch also returns nothing, report that neither source returned results.\n\n## Phase 2 — Format Results  \n\nProcess the results into a readable format:\n\n### Result Structure\n\nFor each result from You.com API:\n- **Title** — article\u002Fpage title\n- **URL** — direct link to source  \n- **Snippet** — join `snippets[]` into one excerpt highlighting query match\n- **Date** — `page_age` or `recent` when unavailable\n\n### Quality Filtering\n\nApply basic quality filters:\n- Exclude results with missing or placeholder titles\n- Skip results without accessible URLs\n- Filter out low-quality content (spam, thin content)\n- Deduplicate near-identical results from the same domain\n\n### Formatting\n\nStructure the output for easy consumption:\n\n```\n*You.com Web Search Results — ${today}*\n\nQuery: \"${var}\"\nSource: ${source}\nResults: ${result_count} found\n\n1. **[Title](URL)**  \n   Snippet with relevant context...\n   Published: Date\n\n2. **[Title](URL)**\n   Snippet...  \n   Published: Date\n\n---\nAPI Status: ${http_status} | Auth: ${auth_mode} | Quality: ${quality_score}\u002F5\n```\n\n`${source}` is exactly one of `You.com Search API (${auth_mode})` or `WebSearch (fallback: ${reason})`, matching `SOURCE_PATH`. Never print both.\n\n## Phase 3 — Delivery and Logging\n\n### Notification\n\nSend formatted results via `.\u002Fnotify`:\n- Include query, result count, and source attribution\n- Highlight most relevant results (top 5-7)  \n- Note the auth mode actually used (`keyless` or `keyed`)\n- When the fallback ran, say so and give the reason (e.g. \"via WebSearch — You.com returned HTTP 401\")\n- Include livecrawl info when enabled (or that it was skipped on the keyless tier)\n\n### Memory Integration  \n\nLog the search for future reference:\n\n1. **Log record** - this skill is `read-only`, so the workflow's read-only guard writes its `### you-web-search` log entry from your captured output; a self-written entry would be a duplicate. Don't append to `memory\u002Flogs\u002F` yourself - put this record in your **final output**:\n   ```\n   ### you-web-search\n   - Query: \"${var}\"\n   - Source: ${source}\n   - Results: N found, M delivered  \n   - Status: HTTP ${code}\n   - Quality score: X\u002F5 (relevance, freshness, diversity)\n   ```\n\n2. **Update search memory** - Add successful searches to `memory\u002Fsearches.md` for pattern tracking (append with a one-line `node -e` writer, e.g. `node -e 'require(\"fs\").appendFileSync(\"memory\u002Fsearches.md\", process.argv[1] + \"\\n\")' \"\u003Cline>\"`)\n\n## Error Handling\n\n### API Failure Recovery\n\nEvery failure below ends in the [WebSearch fallback](#websearch-fallback), so a run always has results. The notes say what to tell the operator:\n\n- **Keyless 401**: In `keyless` mode no key is sent, so a `401` is **not** a credential problem. Some locations currently get `401` from the keyless endpoint with a body like `{\"detail\":\"'ascii' codec can't encode characters ...\"}`. This is a known server-side issue with non-ASCII region names (e.g. `Île-de-France`), and `country`\u002F`language` parameters don't avoid it. Fall back and log `reason=HTTP_401`. Setting `YDC_API_KEY` uses the keyed endpoint, which is unaffected\n- **Rate limits (429)**: Log rate limit hit. In `keyless` mode this is usually the 100\u002Fday per-IP cap — suggest setting `YDC_API_KEY` (get one at https:\u002F\u002Fyou.com\u002Fplatform?utm_source=aeonfun-aeon&utm_medium=oss_integration&utm_campaign=2026-09-oss-integrations&utm_content=error-message). In `keyed` mode, suggest checking the plan quota\n- **Payment required (402)**: The request needs the keyed tier (e.g. livecrawl without a key) — suggest setting `YDC_API_KEY`\n- **Invalid key (401\u002F403, keyed mode)**: Clear error about checking `YDC_API_KEY`\n- **Server errors (5xx)**: Transient. Fall back and log `reason=HTTP_\u003Ccode>` (e.g. `HTTP_503`)\n- **Network failures**: Fall back and log `reason=NETWORK`\n- **Malformed responses**: A `200` whose body `jq` can't parse. Fall back and log `reason=PARSE`\n- **Empty results**: A `200` with zero results. Fall back and log `reason=EMPTY`. If WebSearch is also empty, suggest query refinement or broader terms\n\n### Logging Failures  \n\nRecord failure reasons for debugging:\n- `youcom-api-unavailable` — API endpoint unreachable\n- `youcom-rate-limited` — Hit plan limits or the keyless daily cap\n- `youcom-payment-required` — Keyed-tier feature requested without a key\n- `youcom-auth-invalid` — API key rejected (keyed mode)\n- `youcom-keyless-401` — Keyless endpoint returned 401 with no key sent\n- `youcom-parse-error` — Response format unexpected\n\n## Network\n\nBoth modes go through `.\u002Fsecretcurl` so one code path covers them: keyed calls carry the `{YDC_API_KEY}` placeholder (never a bare `$YDC_API_KEY` on the line); keyless calls carry no placeholder and are passed through unchanged. Every request sends `User-Agent: youdotcom-integration\u002Faeonfun-aeon`.\n\n**Shell shape.** Each Bash call is one allowed command (pipes are fine). The run refuses a call that sets a variable (`X=$(...)`), uses `if` \u002F `case` \u002F `[ ... ] &&` tests, contains `$(...)`, or joins commands with `;`, `&&` or `||`, and each refusal costs a model turn. So the key check reads the run notes' \"Keys set for this run\" line instead of a shell test, the settings check is a `node -e` one-liner, the search is one `.\u002Fsecretcurl` call per auth mode with every value written in literally (`--data-urlencode` instead of `jq @uri`), the `-w` label replaces the `echo ... $(wc -c ...)` line, and the fallback decision is a prose step. This skill is read-only: any file it keeps (such as `memory\u002Fsearches.md`) is written with a one-line `node -e` writer, never `>` or `>>`.\n\n## Environment Variables\n\n- **`YDC_API_KEY`** (optional) — You.com API key. Unset: the skill runs on the free keyless tier (100 searches\u002Fday per IP, no livecrawl). Set: keyed Search API with your plan's limits and livecrawl. Get a key at https:\u002F\u002Fyou.com\u002Fplatform?utm_source=aeonfun-aeon&utm_medium=oss_integration&utm_campaign=2026-09-oss-integrations&utm_content=docs.\n- **`YOUCOM_FRESHNESS`** (optional) — Freshness filter (`day`, `week`, `month`, `year`, or a date range).\n- **`YOUCOM_LIVECRAWL`** (optional, keyed only) — Pass through to `livecrawl` when you want full page content (`web`, `news`, or `all`). Ignored on the keyless tier.\n\n## Constraints\n\n- **Never expose credentials** in logs or notifications\n- **Always attribute source** — clearly indicate You.com API\n- **Respect rate limits** — handle 429 responses gracefully\n- **Validate all URLs** — ensure results contain real, accessible links\n- **Keep results relevant** — filter low-quality or off-topic results\n- **Never end a run empty** — on any You.com failure, fall back to WebSearch and log `youcom fallback=websearch reason=\u003CREASON>`\n- **Report the path honestly** — say whether results came from You.com or the WebSearch fallback, never present fallback results as You.com results\n\n## Integration Notes  \n\n### Relationship to Built-in WebSearch\n\nThis skill **complements** Aeon's built-in WebSearch, but it is a separate Search API path (keyless by default, keyed when `YDC_API_KEY` is set):\n\n- **You.com advantages**: Higher quality results, real-time crawling, better relevance ranking\n- **WebSearch advantages**: No API dependency, always available, deeply integrated. It is also this skill's fallback whenever the You.com call fails\n- **Use You.com for**: Research tasks, fact-checking, current events, specific queries\n- **Use WebSearch for**: Built-in search flows elsewhere in Aeon\n\n### Scheduling Recommendations\n\n- **On-demand**: Manual execution for specific research needs\n- **Low frequency**: Daily or less frequent automatic searches to respect quotas  \n- **Research workflows**: Chain with other skills that need web context\n- **Avoid high-frequency**: Don't schedule more than hourly to preserve API quotas — the keyless tier is capped at 100 searches\u002Fday per IP\n\n### Skills Integration\n\nThis skill works well with:\n- **digest** — Enhanced web signal for daily digests\n- **article** — Research support for article generation  \n- **github-trending** — Context for trending repo evaluation\n- **token-pick** — Market research and catalyst discovery\n- **mention-radar** — Broader web mention detection beyond X\u002FTwitter\n\nThe You.com search results can inform other skills' web research needs while providing a higher-quality alternative to basic web search.\n",{"name":5,"metadata":54,"description":7},{"var":55,"mode":36,"tags":56,"title":57,"category":40,"requires":58},"",[28,29,34],"You.com Web Search",[59],"YDC_API_KEY?","main","b582c38fd13a043dca7ed24605354715d7a6e3f2","skills\u002Fyou-web-search",2,"https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon","https:\u002F\u002Ft.me\u002Fmiroshark_aeon","https:\u002F\u002Fgithub.com\u002FMiroShark","https:\u002F\u002Fwww.miroshark.xyz\u002F","Simulate anything, for $1 & less than 10 min.","2026-11-11 07:47:39",{"source":8,"skillName":5,"commands":71,"prompt":81,"zipAvailable":82},[72,75,78],{"tool":73,"command":74},"npx","npx skills add MiroShark\u002Fmiroshark-aeon --skill you-web-search",{"tool":76,"command":77},"bunx","bunx skills add MiroShark\u002Fmiroshark-aeon --skill you-web-search",{"tool":79,"command":80},"pnpm","pnpm dlx skills add MiroShark\u002Fmiroshark-aeon --skill you-web-search","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fyou-web-search\u002FSKILL.md",true,[],[85,108,136,161,184,212],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":49},"01M6J4P4H35WQG6RHGTTACSMVW","write-tweet","Multi-format tweet studio - standalone drafts (10 across 5 size tiers), a 5-10 tweet thread, or 10 remixes of past tweets, selected via ${var}","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-tweet\u002FSKILL.md",[],[92,93,94,95,96,45,97,98,99,100,40,101,102,103,104,105,106,107],"write","write tweet","standalone","social","studio","across","xai","past","drafts","twitter","thread","multi","size","via","format","content",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":117,"publishedAt":49},"01M6J4P11K7ZJ2PJDHDTTFZ1HY","weekly-aeoncard","Build a weekly token-consumption recap image from memory\u002Ftoken-usage.csv - this week + all-time totals, top skills, rendered as a shareable SVG card.","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fweekly-aeoncard\u002FSKILL.md",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[118,119,120,121,122,123,124,39,125,126,127,128,129,130,131,132,133,92,134,135],"weekly","weekly aeoncard","as","usage","SVG","memory","card","Meta","image","recap","csv","monitoring","notifications","productivity","top","build","token","aeon",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":49},"01M6J4NVJYQP5DNKSGXAXQW06B","vuln-tracker","One lifecycle poll over everything vuln-scanner produces - PR and advisory status, PVR triage transitions, and pending-disclosure aging, with a stars-secured impact headline and one action queue.","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fvuln-tracker\u002FSKILL.md",[],[143,144,125,145,146,92,134,147,148,149,150,151,152,153,154,155,156,37,157,158,159,160],"tracker","vuln tracker","impact","scanner","status","action","security","pr","stars","lifecycle","dev","gh","aging","advisory","github","transitions","triage","global",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":170,"publishedAt":49},"01M6J4NNQCHTKNGENAPJQ8KYHR","vuln-scanner","Audit trending repos for real security vulnerabilities and disclose responsibly - scan and route findings (PVR \u002F dependency PR), re-submit queued advisories, and send armed email disclosures","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fvuln-scanner\u002FSKILL.md",[167],{"categoryNo":168,"categoryName":169,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000005","邮件与沟通",[146,171,172,173,174,125,175,149,176,177,178,153,157,179,160,180,45,181,182,183],"vuln scanner","resend","re","trending","repos","email","for","scan","vulnerabilities","submit","route","audit","send",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":191,"publishedAt":49},"01M6J4NFBXTGG0R4M484T0KNYW","video-script","Turn a repo, product page, or update into a recording-ready video script in a receipts-first format - verifies every claim against live sources, then writes timestamped VO + on-screen direction with a plain-language glossary, assets checklist, anti-tells, and a verify-before-recording list","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Fvideo-script\u002FSKILL.md",[190],{"categoryNo":115,"categoryName":116,"taxonomyType":20,"taxonomyTypeDesc":21},[192,193,194,195,196,197,198,199,200,40,201,202,203,37,204,205,206,207,208,106,209,210,211],"Video","video script","script","recording","sources","ready","direction","page","repo","claim","plain-language","glossary","first","verify","product","screen","update","list","live","receipts",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":218,"publishedAt":49},"01M6J4NAFNHVTAVBKK843SYVQX","unlock-monitor","Token unlock and vesting tracker - quantify supply pressure via absorption ratio, classify cliff vs linear, and deliver one-line market reads","https:\u002F\u002Fgithub.com\u002FMiroShark\u002Fmiroshark-aeon\u002Fblob\u002Fmain\u002Fskills\u002Funlock-monitor\u002FSKILL.md",[],[219,220,221,222,223,224,105,225,143,226,92,134,227,228,229,230],"monitor","unlock monitor","supply","true","Market","crypto","classify","line","vesting","absorption","linear","deliver"]