function main(config, profileName) { config["ipv6"] = false; if (config["dns"]) { config["dns"]["ipv6"] = false; config["dns"]["respect-rules"] = true; }
const UNLOCK_SUB_URL = "https://sub-b.com/link"; const AI_GROUP_NAME = "AI-Services"; const NODE_FILTER = "新加坡|🇸🇬|SG";
config["proxy-providers"] = config["proxy-providers"] || {}; config["proxy-providers"]["ai-provider"] = { type: "http", url: UNLOCK_SUB_URL, interval: 86400, path: "./proxy_providers/ai_nodes.yaml", filter: NODE_FILTER, "health-check": { enable: true, interval: 300, url: "http://www.gstatic.com/generate_204" } };
config["proxy-groups"] = config["proxy-groups"] || []; config["proxy-groups"] = config["proxy-groups"].filter(g => g.name !== AI_GROUP_NAME);
let mainProxyGroupName = "PROXY"; const detectedGroup = config["proxy-groups"].find( g => g.type === "select" && g.name !== "GLOBAL" && g.name !== AI_GROUP_NAME ); if (detectedGroup) { mainProxyGroupName = detectedGroup.name; }
config["proxy-groups"].unshift({ name: AI_GROUP_NAME, type: "url-test", url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 50, use: ["ai-provider"] });
config["rule-providers"] = config["rule-providers"] || {}; const loyalProviders = { reject: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt", path: "./ruleset/loyalsoldier/reject.yaml", interval: 86400 }, icloud: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt", path: "./ruleset/loyalsoldier/icloud.yaml", interval: 86400 }, apple: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt", path: "./ruleset/loyalsoldier/apple.yaml", interval: 86400 }, proxy: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt", path: "./ruleset/loyalsoldier/proxy.yaml", interval: 86400 }, direct: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt", path: "./ruleset/loyalsoldier/direct.yaml", interval: 86400 }, private: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt", path: "./ruleset/loyalsoldier/private.yaml", interval: 86400 }, gfw: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt", path: "./ruleset/loyalsoldier/gfw.yaml", interval: 86400 }, greatfire: { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt", path: "./ruleset/loyalsoldier/greatfire.yaml", interval: 86400 }, "tld-not-cn": { type: "http", behavior: "domain", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt", path: "./ruleset/loyalsoldier/tld-not-cn.yaml", interval: 86400 }, telegramcidr: { type: "http", behavior: "ipcidr", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt", path: "./ruleset/loyalsoldier/telegramcidr.yaml", interval: 86400 }, cncidr: { type: "http", behavior: "ipcidr", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt", path: "./ruleset/loyalsoldier/cncidr.yaml", interval: 86400 }, lancidr: { type: "http", behavior: "ipcidr", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt", path: "./ruleset/loyalsoldier/lancidr.yaml", interval: 86400 }, applications: { type: "http", behavior: "classical", url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt", path: "./ruleset/loyalsoldier/applications.yaml", interval: 86400 } }; Object.assign(config["rule-providers"], loyalProviders);
const quicBlockRules = [ "AND,((DST-PORT,443),(NETWORK,UDP),(DOMAIN-SUFFIX,google.com)),REJECT", "AND,((DST-PORT,443),(NETWORK,UDP),(DOMAIN-SUFFIX,googleapis.com)),REJECT", "AND,((DST-PORT,443),(NETWORK,UDP),(DOMAIN-SUFFIX,gstatic.com)),REJECT", "AND,((DST-PORT,443),(NETWORK,UDP),(DOMAIN-SUFFIX,googleusercontent.com)),REJECT", "AND,((DST-PORT,443),(NETWORK,UDP),(DOMAIN-SUFFIX,googlevideo.com)),REJECT" ];
const youtubeRules = [ `DOMAIN-SUFFIX,googlevideo.com,${mainProxyGroupName}`, `DOMAIN-SUFFIX,youtube.com,${mainProxyGroupName}`, `DOMAIN-SUFFIX,youtu.be,${mainProxyGroupName}`, `DOMAIN-SUFFIX,ytimg.com,${mainProxyGroupName}`, `DOMAIN-SUFFIX,youtubei.googleapis.com,${mainProxyGroupName}`, `DOMAIN-SUFFIX,yt3.ggpht.com,${mainProxyGroupName}` ];
const aiRules = [ `DOMAIN-KEYWORD,antigravity,${AI_GROUP_NAME}`, `DOMAIN-KEYWORD,gemini,${AI_GROUP_NAME}`, `DOMAIN-KEYWORD,colab,${AI_GROUP_NAME}`, `DOMAIN-KEYWORD,deepmind,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,gemini.google.com,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,bard.google.com,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,ai.google.dev,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,aistudio.google.com,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,makersuite.google.com,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,deepmind.google,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,deepmind.com,${AI_GROUP_NAME}`, `GEOSITE,google-gemini,${AI_GROUP_NAME}`, `GEOSITE,google-deepmind,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,clients6.google.com,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,googleusercontent.com,${AI_GROUP_NAME}`, `DOMAIN-SUFFIX,googleapis.com,${AI_GROUP_NAME}` ];
const loyalRules = [ "RULE-SET,applications,DIRECT", "RULE-SET,private,DIRECT", "RULE-SET,reject,REJECT", "RULE-SET,icloud,DIRECT", `RULE-SET,apple,${mainProxyGroupName}`, `RULE-SET,proxy,${mainProxyGroupName}`, `RULE-SET,gfw,${mainProxyGroupName}`, `RULE-SET,greatfire,${mainProxyGroupName}`, `RULE-SET,telegramcidr,${mainProxyGroupName},no-resolve`, "RULE-SET,direct,DIRECT", "RULE-SET,lancidr,DIRECT,no-resolve", "RULE-SET,cncidr,DIRECT,no-resolve", "GEOIP,LAN,DIRECT,no-resolve", "GEOIP,CN,DIRECT", `RULE-SET,tld-not-cn,${mainProxyGroupName}`, `MATCH,${mainProxyGroupName}` ];
config.rules = [...quicBlockRules, ...youtubeRules, ...aiRules, ...loyalRules]; return config; }
|