/**
 * ============================================================
 *  src/tools/webfetch-preapproved.ts —— WebFetch 预批准域名白名单
 * ------------------------------------------------------------
 *  维护一份可信任域名列表，用于过滤潜在风险 URL
 * ============================================================
 */
const PREAPPROVED_HOSTS = new Set([
    // GitHub
    'github.com',
    'gist.github.com',
    // 开发文档
    'docs.github.com',
    'developer.github.com',
    'help.github.com',
    // NPM
    'npmjs.com',
    'www.npmjs.com',
    // 包注册表
    'pypi.org',
    'www.pypi.org',
    'crates.io',
    'pub.dev',
    'packagist.org',
    'rubygems.org',
    // 开发平台
    'stackoverflow.com',
    'www.stackoverflow.com',
    'serverfault.com',
    'superuser.com',
    'askubuntu.com',
    // 文档与 wiki
    'readthedocs.io',
    'www.readthedocs.io',
    'readthedocs.org',
    'wiki.python.org',
    'en.wikipedia.org',
    'zh.wikipedia.org',
    // 官方文档
    'nodejs.org',
    'www.nodejs.org',
    'deno.land',
    'www.deno.land',
    'bun.sh',
    'www.bun.sh',
    // Rust
    'doc.rust-lang.org',
    'www.rust-lang.org',
    'rust-lang.org',
    // 云平台
    'aws.amazon.com',
    'docs.aws.amazon.com',
    'cloud.google.com',
    'docs.microsoft.com',
    'azure.microsoft.com',
    'developer.microsoft.com',
    // AI/LLM
    'openai.com',
    'platform.openai.com',
    'docs.anthropic.com',
    'anthropic.com',
    'claude.ai',
    'docs.cohere.com',
    'cohere.com',
    // AI 模型文档
    'ai.google.dev',
    'ai.google.com',
    'developers.google.com',
    'learn.deepmind.com',
    // AI 开发框架
    'python.langchain.com',
    'js.langchain.com',
    'docs.litellm.ai',
    'litellm.ai',
    // 前端框架
    'react.dev',
    'reactjs.org',
    'www.reactjs.org',
    'nextjs.org',
    'www.nextjs.org',
    'vuejs.org',
    'www.vuejs.org',
    'svelte.dev',
    'svelte.org',
    'angular.io',
    'www.angular.io',
    // 构建工具
    'vitejs.dev',
    'vite.dev',
    'webpack.js.org',
    'esbuild.github.io',
    'rollupjs.org',
    'esbuild.github.io',
    // CSS
    'tailwindcss.com',
    'www.tailwindcss.com',
    'postcss.org',
    // 数据库
    'redis.io',
    'www.redis.io',
    'postgresql.org',
    'www.postgresql.org',
    'www.mysql.com',
    'dev.mysql.com',
    'docs.mongodb.com',
    'www.mongodb.com',
    'sqlite.org',
    'www.sqlite.org',
    // 工具类
    'regex101.com',
    'ihateregex.io',
    'explainshell.com',
    'tldr.sh',
    // 代码分享
    'replit.com',
    'www.replit.com',
    'codesandbox.io',
    'www.codesandbox.io',
    'codepen.io',
    'www.codepen.io',
    'jsfiddle.net',
    'www.jsfiddle.net',
    // CI/CD
    'docs.github.com/en/actions',
    'circleci.com',
    'docs.circleci.com',
    'travis-ci.org',
    'www.travis-ci.com',
    'jenkins.io',
    'www.jenkins.io',
    // 容器/云原生
    'kubernetes.io',
    'www.kubernetes.io',
    'docker.com',
    'www.docker.com',
    'docs.docker.com',
    // 测试
    'jestjs.io',
    'www.jestjs.io',
    'vitest.dev',
    'testing-library.com',
    'www.testing-library.com',
    'playwright.dev',
    'www.playwright.dev',
    'webdriver.io',
    'webdriver.io',
    // API 文档
    'httpbin.org',
    'restfulapi.net',
    'swagger.io',
    'www.swagger.io',
    'openapi.net',
    // 安全
    'owasp.org',
    'www.owasp.org',
    'cve.mitre.org',
    // 证书
    'letsencrypt.org',
    'www.letsencrypt.org',
    'acmev2.pki.duckdns.org',
    // 博客与技术文章
    'medium.com',
    'www.medium.com',
    'dev.to',
    'www.dev.to',
    'hashnode.com',
    'www.hashnode.com',
    'devblogs.microsoft.com',
    // 浏览器
    'caniuse.com',
    'developer.mozilla.org',
    'web.dev',
    'www.w3.org',
    // 开源项目
    'apache.org',
    'www.apache.org',
    'gnu.org',
    'www.gnu.org',
    'fsf.org',
    'www.fsf.org',
    'opensource.org',
    'www.opensource.org',
    // 技术社区
    'reddit.com',
    'www.reddit.com',
    'news.ycombinator.com',
    'lobste.rs',
    // 文件格式
    'json.org',
    'yaml.org',
    'www.yaml.org',
    'toml.io',
    'www.toml.io',
    // 版本控制
    'git-scm.com',
    'www.git-scm.com',
    'github.blog',
    'githubstatus.com',
    // AI 搜索
    'tavily.com',
    'www.tavily.com',
    'perplexity.ai',
    'www.perplexity.ai',
    // AI 图片
    'midjourney.com',
    'www.midjourney.com',
    'stability.ai',
    'www.stability.ai',
    // Embeddings / 向量
    'qdrant.tech',
    'www.qdrant.tech',
    'weaviate.io',
    'www.weaviate.io',
    'pinecone.io',
    'www.pinecone.io',
    // API 平台
    'ngrok.com',
    'www.ngrok.com',
    'requestly.io',
    'www.requestly.io',
    // MCP
    'modelcontextprotocol.io',
    'www.modelcontextprotocol.io',
    'github.com/modelcontextprotocol',
]);
const PREAPPROVED_SUFFIXES = [
    '.github.io',
    '.readthedocs.io',
    '.vercel.app',
    '.vercel.dev',
    '.netlify.app',
    '.netlify.com',
    '.cloudflare-pages.com',
    '.pages.dev',
    '.surge.sh',
    '.herokuapp.com',
    '.railway.app',
    '.fly.dev',
    '.repl.co',
    '.workers.dev',
    '.pages.plus',
    '.coded.app',
    '.preview.app',
    '.staging.app',
];
export function isPreapprovedUrl(url) {
    try {
        const parsed = new URL(url);
        return isPreapprovedHost(parsed.hostname);
    }
    catch {
        return false;
    }
}
export function isPreapprovedHost(hostname) {
    const normalized = hostname.toLowerCase();
    if (PREAPPROVED_HOSTS.has(normalized)) {
        return true;
    }
    for (const suffix of PREAPPROVED_SUFFIXES) {
        if (normalized.endsWith(suffix)) {
            return true;
        }
    }
    return false;
}
export const isPreapprovedDomain = isPreapprovedHost;
