github-actions[bot] commited on
Commit
27c10a6
·
1 Parent(s): 4b8120a

Deploy: Update from GitHub Actions build

Browse files
Files changed (3) hide show
  1. dist/index.js +11 -11
  2. package-lock.json +270 -0
  3. package.json +3 -1
dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- var ke=Object.defineProperty;var Z=(t,e)=>()=>(t&&(e=t(t=0)),e);var Oe=(t,e)=>{for(var o in e)ke(t,o,{get:e[o],enumerable:!0})};import j from"node:fs";function De(){j.existsSync(R.logDir)||j.mkdirSync(R.logDir,{recursive:!0})}function He(...t){return t.map(e=>typeof e=="object"&&e!==null?JSON.stringify(e,null,2):String(e)).join(" ")}async function Fe(t,e){if(!R.enableFile)return;De();let r=`[${new Date().toISOString()}] [${t}] ${e}
2
- `;try{await j.promises.appendFile(R.logFile,r)}catch(a){console.error("\u5199\u5165\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25:",a)}}function Ge(t,...e){if(!R.enableConsole)return;let o={[$.DEBUG]:console.debug,[$.INFO]:console.log,[$.WARN]:console.warn,[$.ERROR]:console.error}[t]||console.log,r=new Date().toLocaleTimeString();o(`[${r}] [${t}]`,...e)}function ee(t,...e){let o=He(...e);Ge(t,...e),Fe(t,o)}var $,R,s,_,v=Z(()=>{$={DEBUG:"DEBUG",INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},R={logFile:"./logs/app.log",logDir:"./logs",enableConsole:!0,enableFile:!0,logLevel:process.env.LOG_LEVEL||$.INFO};s=(...t)=>ee($.INFO,...t),_=(...t)=>ee($.ERROR,...t)});var re={};Oe(re,{checkCookieAvailability:()=>ze,ensureDirectoryExists:()=>oe,getHumanReadableTimestamp:()=>te,loadCookies:()=>K,saveScreenshot:()=>W,waitForUserInput:()=>Be});import M from"node:fs";import Ue from"node:path";import qe from"node:readline";function te(){return new Date().toISOString().replace(/T/,"_").replace(/:/g,"-").replace(/\..+/,"")}function oe(t){M.existsSync(t)||(M.mkdirSync(t,{recursive:!0}),s(`\u5DF2\u521B\u5EFA\u76EE\u5F55: ${t}`))}function ze(t,e){if(e)try{return JSON.parse(e),s("\u53D1\u73B0\u5E76\u9A8C\u8BC1\u4E86\u73AF\u5883\u53D8\u91CF\u4E2D\u7684 COOKIES\u3002"),!0}catch(o){_("\u73AF\u5883\u53D8\u91CF COOKIES \u683C\u5F0F\u65E0\u6548 (\u5FC5\u987B\u662F JSON \u6570\u7EC4\u5B57\u7B26\u4E32):",o.message)}return M.existsSync(t)?(s(`\u53D1\u73B0 Cookie \u6587\u4EF6: ${t}`),!0):(_(`Cookie \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}\uFF0C\u4E14\u672A\u8BBE\u7F6E COOKIES \u73AF\u5883\u53D8\u91CF\u3002`),s("\u8BF7\u5148\u8FD0\u884C `npm run login` \u6216\u8BBE\u7F6E COOKIES \u73AF\u5883\u53D8\u91CF\u3002"),!1)}function K(t,e){try{if(e)return s("\u4ECE\u73AF\u5883\u53D8\u91CF COOKIES \u52A0\u8F7D Cookie..."),JSON.parse(e);if(M.existsSync(t))return s(`\u4ECE\u6587\u4EF6\u52A0\u8F7D Cookie: ${t}`),JSON.parse(M.readFileSync(t,"utf8"))}catch(o){throw _("\u52A0\u8F7D Cookie \u5931\u8D25:",o),new Error("\u65E0\u6CD5\u52A0\u8F7D\u6216\u89E3\u6790 Cookie\u3002")}return[]}async function W(t,e,o="screenshot",r=!0){if(oe(e),r){let n=te();o=`${o}_${n}`}let a=Ue.join(e,`${o}.png`);return await t.screenshot({path:a,fullPage:!0}),s(`\u622A\u56FE\u5DF2\u4FDD\u5B58: ${a}`),a}function Be(){let t=qe.createInterface({input:process.stdin,output:process.stdout});return new Promise(e=>{t.question("",()=>{t.close(),e()})})}var D=Z(()=>{v()});import{H3 as et,serve as tt,serveStatic as Ce}from"h3";import{stat as Te,readFile as Re}from"node:fs/promises";import{join as Me}from"node:path";import{chromium as je}from"playwright";import Ne from"dotenv";Ne.config();var Le={server:{port:parseInt(process.env.PORT||"3096",10),host:process.env.HOST||"localhost"},browser:{headless:(process.env.HEADLESS||"true").toLowerCase()!=="false",timeout:parseInt(process.env.TIMEOUT||"30000",10),executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH,args:["--disable-blink-features=AutomationControlled","--no-sandbox","--disable-dev-shm-usage","--disable-infobars","--disable-extensions"],userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"},cookieFile:"./cookies.json",cookiesFromEnv:process.env.COOKIES,screenshotDir:"./screenshots",aiStudio:{url:process.env.AI_STUDIO_URL||"https://aistudio.google.com/prompts/new_chat",responseTimeout:parseInt(process.env.RESPONSE_TIMEOUT||"600000",10),pageTimeout:parseInt(process.env.PAGE_TIMEOUT||"30000",10)},api:{defaultModel:process.env.DEFAULT_MODEL||"gemini-pro",maxTokens:65536,temperature:1,token:process.env.API_TOKEN},models:{"gemini-2.5-pro":{displayName:"Gemini 2.5 Pro",id:"gemini-2.5-pro",object:"model",created:1704067200,owned_by:"google",permission:[],root:"gemini-2.5-pro",parent:null},"gemini-2.5-flash":{displayName:"Gemini 2.5 Flash",id:"gemini-2.5-flash",object:"model",created:1704067200,owned_by:"google",permission:[],root:"gemini-2.5-flash",parent:null},"gemini-pro":{displayName:"Gemini Pro",id:"gemini-pro",object:"model",created:1701388800,owned_by:"google",permission:[],root:"gemini-pro",parent:null},"gemini-flash":{displayName:"Gemini Flash",id:"gemini-flash",object:"model",created:1701388800,owned_by:"google",permission:[],root:"gemini-flash",parent:null}},debug:{logRequests:process.env.DEBUG_REQUESTS==="true",logResponses:process.env.DEBUG_RESPONSES==="true",saveScreenshots:process.env.SAVE_SCREENSHOTS==="true"}},l=Le;D();v();var x=null,C=null,H=class{constructor(e=5){this.maxSize=e,this.availablePages=[],this.busyPages=new Set,this.totalPages=0}async getPage(){if(this.availablePages.length>0){let e=this.availablePages.pop();return this.busyPages.add(e),s(`\u4ECE\u9875\u9762\u6C60\u83B7\u53D6\u9875\u9762\uFF0C\u5F53\u524D\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`),e}if(this.totalPages<this.maxSize){let{context:e}=await Ke(),o=await e.newPage();return this.busyPages.add(o),this.totalPages++,s(`\u521B\u5EFA\u65B0\u9875\u9762\uFF0C\u603B\u9875\u9762\u6570: ${this.totalPages}\uFF0C\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`),o}return s("\u9875\u9762\u6C60\u5DF2\u6EE1\uFF0C\u7B49\u5F85\u9875\u9762\u91CA\u653E..."),new Promise(e=>{let o=()=>{if(this.availablePages.length>0){let r=this.availablePages.pop();this.busyPages.add(r),s(`\u7B49\u5F85\u540E\u83B7\u53D6\u5230\u9875\u9762\uFF0C\u5F53\u524D\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`),e(r)}else setTimeout(o,100)};o()})}async releasePage(e){if(!this.busyPages.has(e)){s("\u5C1D\u8BD5\u91CA\u653E\u4E0D\u5728\u5FD9\u788C\u5217\u8868\u4E2D\u7684\u9875\u9762");return}try{await this.cleanupPage(e),this.busyPages.delete(e),this.availablePages.push(e),s(`\u9875\u9762\u5DF2\u91CA\u653E\u56DE\u6C60\u4E2D\uFF0C\u53EF\u7528\u9875\u9762\u6570: ${this.availablePages.length}\uFF0C\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`)}catch(o){s(`\u6E05\u7406\u9875\u9762\u65F6\u51FA\u9519\uFF0C\u5C06\u5173\u95ED\u8BE5\u9875\u9762: ${o.message}`),await this.removePage(e)}}async cleanupPage(e){try{e.removeAllListeners();try{await e.evaluate(()=>{Object.keys(window).forEach(r=>{(r.startsWith("__handleStreamChunk")||r.startsWith("__onStreamChunk")||r.startsWith("__onStreamEnd"))&&delete window[r]}),window.__streamInterceptor&&(typeof window.__streamInterceptor.deactivate=="function"&&window.__streamInterceptor.deactivate(),delete window.__streamInterceptor),delete window.__handleStreamChunk,delete window.__onStreamChunk,delete window.__onStreamEnd,delete window.__streamCallbacks})}catch(o){s(`\u6E05\u7406\u9875\u9762\u72B6\u6001\u65F6\u51FA\u73B0evaluate\u9519\u8BEF: ${o.message}`)}s("\u9875\u9762\u72B6\u6001\u5DF2\u6E05\u7406")}catch(o){throw new Error(`\u6E05\u7406\u9875\u9762\u5931\u8D25: ${o.message}`)}}async removePage(e){try{this.busyPages.delete(e);let o=this.availablePages.indexOf(e);o>-1&&this.availablePages.splice(o,1),await e.close(),this.totalPages--,s(`\u9875\u9762\u5DF2\u4ECE\u6C60\u4E2D\u79FB\u9664\uFF0C\u603B\u9875\u9762\u6570: ${this.totalPages}`)}catch(o){s(`\u5173\u95ED\u9875\u9762\u65F6\u51FA\u9519: ${o.message}`)}}async cleanup(){s("\u5F00\u59CB\u6E05\u7406\u9875\u9762\u6C60...");for(let e of this.busyPages)try{await e.close()}catch(o){s(`\u5173\u95ED\u5FD9\u788C\u9875\u9762\u65F6\u51FA\u9519: ${o.message}`)}for(let e of this.availablePages)try{await e.close()}catch(o){s(`\u5173\u95ED\u53EF\u7528\u9875\u9762\u65F6\u51FA\u9519: ${o.message}`)}this.busyPages.clear(),this.availablePages=[],this.totalPages=0,s("\u9875\u9762\u6C60\u6E05\u7406\u5B8C\u6210")}getStatus(){return{total:this.totalPages,available:this.availablePages.length,busy:this.busyPages.size,maxSize:this.maxSize}}},E=null;async function Ke(){if(!x){x=await je.launch({headless:l.browser.headless,timeout:l.browser.timeout,args:l.browser.args,executablePath:l.browser.executablePath}),C=await x.newContext({userAgent:l.browser.userAgent});let t=K(l.cookieFile,l.cookiesFromEnv);await C.addCookies(t)}return{browser:x,context:C}}function ne(t=5){return E||(E=new H(t),s(`\u9875\u9762\u6C60\u5DF2\u521D\u59CB\u5316\uFF0C\u6700\u5927\u9875\u9762\u6570: ${t}`)),E}function ae(){return E||(E=new H,s("\u9875\u9762\u6C60\u5DF2\u81EA\u52A8\u521D\u59CB\u5316\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E")),E}async function F(){let e=await ae().getPage();return await e.bringToFront(),e}async function A(t){await ae().releasePage(t)}function k(){return E?E.getStatus():{total:0,available:0,busy:0,maxSize:0}}async function G(t,e,o={}){let r=t.url();console.log("\u5F53\u524D\u9875\u9762URL:",r),console.log("\u76EE\u6807URL:",e);try{return r!==e?(console.log("\u9875\u9762URL\u4E0D\u5339\u914D\uFF0C\u9700\u8981\u5BFC\u822A..."),await t.goto(e,{waitUntil:"load",timeout:3e4,...o}),console.log("\u9875\u9762\u5BFC\u822A\u5B8C\u6210"),!0):(console.log("\u9875\u9762\u5DF2\u5728\u76EE\u6807URL\uFF0C\u8FDB\u884C\u5237\u65B0\u4EE5\u786E\u4FDD\u6700\u65B0\u72B6\u6001..."),await t.bringToFront(),await t.reload({waitUntil:"load",timeout:3e4,...o}),console.log("\u9875\u9762\u5237\u65B0\u5B8C\u6210"),!0)}catch{}return!1}async function ie(t,e={}){let{minClicks:o=1,maxClicks:r=3,minDelay:a=300,maxDelay:n=500,referenceElement:i=null}=e;try{s("\u5F00\u59CB\u6A21\u62DF\u4EBA\u7C7B\u968F\u673A\u70B9\u51FB\u884C\u4E3A...");let d=Math.floor(Math.random()*(r-o+1))+o;s(`\u5C06\u8FDB\u884C ${d} \u6B21\u968F\u673A\u70B9\u51FB`);let u=null;if(i)try{let c=await i.boundingBox();c&&(u={x:c.x-50,y:Math.max(0,c.y-200),width:c.width+50,height:300},s(`\u4F7F\u7528\u8F93\u5165\u6846\u9644\u8FD1\u7684\u5B89\u5168\u533A\u57DF: x=${u.x}, y=${u.y}, w=${u.width}, h=${u.height}`))}catch(c){s(`\u83B7\u53D6\u53C2\u8003\u5143\u7D20\u4F4D\u7F6E\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u5B89\u5168\u533A\u57DF: ${c.message}`)}if(!u){let c=t.viewportSize(),p=c?.width||1280,f=c?.height||720;u={x:p*.3,y:f*.3,width:p*.4,height:f*.2},s(`\u4F7F\u7528\u9ED8\u8BA4\u5B89\u5168\u533A\u57DF: x=${u.x}, y=${u.y}, w=${u.width}, h=${u.height}`)}for(let c=0;c<d;c++)try{let p=Math.floor(Math.random()*u.width)+u.x,f=Math.floor(Math.random()*u.height)+u.y;s(`\u7B2C ${c+1} \u6B21\u5B89\u5168\u70B9\u51FB: (${p}, ${f})`);let h=await t.locator("*").first().evaluate((m,I)=>{let y=document.elementFromPoint(I.x,I.y);if(!y)return{safe:!0};let b=y.tagName.toLowerCase(),w=y.hasAttribute("href"),S=y.hasAttribute("onclick")||y.onclick,g=b==="button"||y.type==="button",T=b==="a"||w,Q=["input","textarea","select"].includes(b);return{safe:!g&&!T&&!S&&!Q,tagName:b,hasHref:w,hasOnClick:S,isButton:g,isLink:T,isInput:Q}},{x:p,y:f});if(h.safe?(await t.mouse.move(p,f,{steps:Math.floor(Math.random()*10)+5}),await t.waitForTimeout(Math.floor(Math.random()*200)+100),await t.mouse.click(p,f),s(`\u5B89\u5168\u70B9\u51FB\u5B8C\u6210: (${p}, ${f})`)):s(`\u8DF3\u8FC7\u4E0D\u5B89\u5168\u7684\u70B9\u51FB\u4F4D\u7F6E (${p}, ${f}): ${h.tagName}`),c<d-1){let m=Math.floor(Math.random()*(n-a+1))+a;s(`\u7B49\u5F85 ${m}ms \u540E\u8FDB\u884C\u4E0B\u4E00\u6B21\u70B9\u51FB`),await t.waitForTimeout(m)}}catch(p){s(`\u7B2C ${c+1} \u6B21\u70B9\u51FB\u51FA\u73B0\u9519\u8BEF\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u6B21: ${p.message}`)}s("\u5B89\u5168\u968F\u673A\u70B9\u51FB\u6A21\u62DF\u5B8C\u6210")}catch(d){s(`\u6A21\u62DF\u5B89\u5168\u968F\u673A\u70B9\u51FB\u65F6\u51FA\u73B0\u9519\u8BEF: ${d.message}`)}}async function ce(t,e={}){let{includeScrolling:o=!0,includeMouseMovement:r=!0,includeRandomClicks:a=!0,duration:n=3e3}=e;try{s("\u5F00\u59CB\u6A21\u62DF\u590D\u6742\u7684\u4EBA\u7C7B\u884C\u4E3A...");let i=Date.now(),d=t.viewportSize(),u=d?.width||1280,c=d?.height||720;for(;Date.now()-i<n;){let p=Math.random();if(p<.3&&o){let h=Math.random()>.5?"down":"up",m=Math.floor(Math.random()*300)+100;s(`\u6A21\u62DF\u6EDA\u52A8: ${h}, \u8DDD\u79BB: ${m}px`),await t.mouse.wheel(0,h==="down"?m:-m)}else if(p<.6&&r){let h=Math.floor(Math.random()*u),m=Math.floor(Math.random()*c);s(`\u6A21\u62DF\u9F20\u6807\u79FB\u52A8\u5230: (${h}, ${m})`),await t.mouse.move(h,m,{steps:Math.floor(Math.random()*15)+5})}else if(p<.8&&a){let h=Math.floor(Math.random()*(u*.8))+u*.1,m=Math.floor(Math.random()*(c*.8))+c*.1;s(`\u6A21\u62DF\u968F\u673A\u70B9\u51FB: (${h}, ${m})`),await t.mouse.click(h,m)}let f=Math.floor(Math.random()*800)+200;await t.waitForTimeout(f)}s("\u590D\u6742\u4EBA\u7C7B\u884C\u4E3A\u6A21\u62DF\u5B8C\u6210")}catch(i){s(`\u6A21\u62DF\u590D\u6742\u4EBA\u7C7B\u884C\u4E3A\u65F6\u51FA\u73B0\u9519\u8BEF: ${i.message}`)}}async function U(t,e=5e3){try{s("\u68C0\u67E5\u662F\u5426\u6709\u6B22\u8FCE\u5BF9\u8BDD\u6846\u9700\u8981\u5173\u95ED...");let o="mat-dialog-container",r='button[mat-dialog-close][aria-label="close"]';if(await t.locator(o).first().isVisible({timeout:e})){s("\u53D1\u73B0\u6B22\u8FCE\u5BF9\u8BDD\u6846\uFF0C\u5C1D\u8BD5\u5173\u95ED...");let n=t.locator(r).first();return await n.isVisible({timeout:2e3})?(await n.click(),s("\u5DF2\u901A\u8FC7\u5173\u95ED\u6309\u94AE\u5173\u95ED\u6B22\u8FCE\u5BF9\u8BDD\u6846"),await t.waitForTimeout(1e3),!0):(s("\u672A\u627E\u5230\u5173\u95ED\u6309\u94AE\uFF0C\u5C1D\u8BD5\u6309ESC\u952E\u5173\u95ED\u5BF9\u8BDD\u6846"),await t.keyboard.press("Escape"),await t.waitForTimeout(1e3),!0)}else return s("\u672A\u53D1\u73B0\u6B22\u8FCE\u5BF9\u8BDD\u6846"),!1}catch(o){return s("\u5904\u7406\u6B22\u8FCE\u5BF9\u8BDD\u6846\u65F6\u51FA\u73B0\u9519\u8BEF\uFF0C\u7EE7\u7EED\u6267\u884C:",o.message),!1}}var se=!1;async function We(){if(!x){s("\u6D4F\u89C8\u5668\u5B9E\u4F8B\u4E0D\u5B58\u5728\uFF0C\u65E0\u9700\u6E05\u7406\u3002");return}s("\u{1F9F9} \u5F00\u59CB\u6E05\u7406\u6D4F\u89C8\u5668\u8D44\u6E90..."),E&&(await E.cleanup(),E=null,s("\u2705 \u9875\u9762\u6C60\u5DF2\u6E05\u7406\u3002")),C&&(await C.close(),C=null,s("\u2705 \u6D4F\u89C8\u5668\u4E0A\u4E0B\u6587\u5DF2\u5173\u95ED\u3002")),x&&(await x.close(),x=null,s("\u2705 \u6D4F\u89C8\u5668\u5B9E\u4F8B\u5DF2\u5173\u95ED\u3002")),s("\u2728 \u6240\u6709\u8D44\u6E90\u5747\u5DF2\u6210\u529F\u91CA\u653E\u3002")}async function X(t){if(se){s("\u6E05\u7406\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u5019...");return}se=!0,s(`
3
- \u{1F6A8} \u6536\u5230\u4FE1\u53F7 ${t}\u3002\u5F00\u59CB\u4F18\u96C5\u505C\u673A...`);try{await We(),process.exit(0)}catch(e){error("\u274C \u5728\u4F18\u96C5\u505C\u673A\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e),process.exit(1)}}function le(){process.once("SIGUSR2",()=>X("SIGUSR2")),process.on("SIGINT",()=>X("SIGINT")),process.on("SIGTERM",()=>X("SIGTERM"))}v();var ue=null;function pe(t=1e4){if(ue){s("\u9875\u9762\u6C60\u76D1\u63A7\u5DF2\u5728\u8FD0\u884C\u4E2D\u3002");return}s(`\u5F00\u59CB\u76D1\u63A7\u9875\u9762\u6C60\u72B6\u6001\uFF0C\u95F4\u9694: ${t}ms`),ue=setInterval(()=>{let e=k(),o=new Date().toLocaleTimeString(),r=e.total>0?(e.busy/e.total*100).toFixed(1):0;s(`[${o}] \u9875\u9762\u6C60\u72B6\u6001: \u603B\u8BA1=${e.total}, \u53EF\u7528=${e.available}, \u5FD9\u788C=${e.busy}, \u4F7F\u7528\u7387=${r}%`)},t)}function me(){let t=k(),e=new Date().toLocaleString(),o=t.total>0?(t.busy/t.total*100).toFixed(1):0;console.log(`
4
  --- \u9875\u9762\u6C60\u72B6\u6001 @ ${e} ---
5
  \u603B\u9875\u9762\u6570: ${t.total}
6
  \u53EF\u7528\u9875\u9762\u6570: ${t.available}
@@ -8,17 +8,17 @@ var ke=Object.defineProperty;var Z=(t,e)=>()=>(t&&(e=t(t=0)),e);var Oe=(t,e)=>{f
8
  \u6700\u5927\u9875\u9762\u6570: ${t.maxSize}
9
  \u4F7F\u7528\u7387: ${o}%
10
  ------------------------------------
11
- `)}function de(t){let e=t.node.res.getHeaders();if(e["access-control-allow-origin"]||t.node.res.setHeader("Access-Control-Allow-Origin",process.env.CORS_ORIGIN||"*"),e["access-control-allow-methods"]||t.node.res.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e["access-control-allow-headers"]||t.node.res.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),e["access-control-max-age"]||t.node.res.setHeader("Access-Control-Max-Age","86400"),t.node.req.method==="OPTIONS")return t.node.res.statusCode=204,t.node.res.end()}function he(t){t.node.res.setHeader("Content-Type","text/event-stream"),t.node.res.setHeader("Cache-Control","no-cache"),t.node.res.setHeader("Connection","keep-alive"),t.node.res.setHeader("Access-Control-Allow-Origin",process.env.CORS_ORIGIN||"*"),t.node.res.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization")}function fe(t){let e=k(),o=e.total>0?Math.round(e.busy/e.total*100):0;return{status:"ok",timestamp:new Date().toISOString(),version:process.env.npm_package_version||"1.0.0",pagePool:{...e,utilization:`${o}%`}}}import{readBody as Qe,createError as Ze}from"h3";import{createError as Xe}from"h3";function ge(t){let{messages:e,stream:o=!1,model:r=l.api.defaultModel,temperature:a=l.api.temperature}=t;if(!e||!Array.isArray(e)||e.length===0)throw Xe({statusCode:400,statusMessage:"Invalid request: `messages` must be a non-empty array."});return{prompt:e.map(i=>!i.role||!i.content?"":`${i.role}: ${i.content}`).join(`
12
 
13
- `),stream:o,model:r,temperature:a,messages:e}}import{createError as J}from"h3";function we(t){if(!l.api.token){process.env.NODE_ENV==="production"&&console.warn("\u8B66\u544A: API_TOKEN \u672A\u5728\u751F\u4EA7\u73AF\u5883\u4E2D\u914D\u7F6E\uFF0CAPI \u5BF9\u5916\u5F00\u653E\uFF01");return}let e=t.node.req.headers.authorization;if(!e)throw J({statusCode:401,statusMessage:"Unauthorized: Missing Authorization header."});let[o,r]=e.split(" ");if(o!=="Bearer"||!r)throw J({statusCode:401,statusMessage:"Unauthorized: Invalid Authorization header format. Expected: Bearer <token>."});if(r!==l.api.token)throw J({statusCode:401,statusMessage:"Unauthorized: Invalid API token."})}var O=class{constructor(e,o={}){this.page=e,this.options={enableHumanSimulation:!0,...o},this.modelMapping=Object.fromEntries(Object.entries(l.models).map(([r,a])=>[r,a.displayName]))}async waitForPageLoad(){try{return await this.page.waitForSelector("body",{timeout:15e3}),await U(this.page),!0}catch(e){return console.error("\u9875\u9762\u52A0\u8F7D\u8D85\u65F6\u6216\u5931\u8D25:",e),!1}}async findInputElement(){try{await this.page.waitForSelector("footer ms-prompt-input-wrapper",{timeout:1e4}),console.log("\u8F93\u5165\u6846\u7684\u7236\u5BB9\u5668\u5DF2\u52A0\u8F7D\u3002")}catch{console.warn("\u7B49\u5F85\u8F93\u5165\u6846\u7236\u5BB9\u5668\u8D85\u65F6\uFF0C\u5C06\u7EE7\u7EED\u5C1D\u8BD5\u67E5\u627E...")}let e=['ms-prompt-input-wrapper textarea[aria-label*="prompt"]','textarea[placeholder="Start typing a prompt"]','textarea[aria-label="Start typing a prompt"]',"footer textarea",'textarea[placeholder*="prompt"]','textarea[aria-label*="prompt"]','div[contenteditable="true"]',"textarea"];for(let o of e)try{let r=this.page.locator(o),a=await r.count();if(a>0){console.log(`\u9009\u62E9\u5668 "${o}" \u627E\u5230\u4E86 ${a} \u4E2A\u5143\u7D20\u3002\u6B63\u5728\u68C0\u67E5\u53EF\u89C1\u6027\u548C\u53EF\u7528\u6027...`);for(let n=0;n<a;n++){let i=r.nth(n);if(await i.isVisible()&&await i.isEnabled())return console.log(`\u6210\u529F\u627E\u5230\u53EF\u7528\u8F93\u5165\u6846: ${o} (\u7D22\u5F15 ${n})`),i}console.log(`\u9009\u62E9\u5668 "${o}" \u627E\u5230\u7684\u5143\u7D20\u5747\u4E0D\u53EF\u89C1\u6216\u4E0D\u53EF\u7528\u3002`)}}catch(r){console.warn(`\u4F7F\u7528\u9009\u62E9\u5668 "${o}" \u67E5\u627E\u65F6\u51FA\u9519: ${r.message}`)}if(console.error("\u5173\u952E\u9519\u8BEF: \u5C1D\u8BD5\u4E86\u6240\u6709\u9009\u62E9\u5668\u540E\uFF0C\u4ECD\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u7528\u7684\u8F93\u5165\u5143\u7D20\u3002"),l.debug.saveScreenshots){let{saveScreenshot:o}=await Promise.resolve().then(()=>(D(),re));await o(this.page,l.screenshotDir,"find-input-failed")}return null}async findSendButton(){let e=['button[aria-label="Run"]',"button.run-button",'button[aria-label*="Send"]','button[data-testid*="send"]'];for(let o of e){let r=this.page.locator(o);if(await r.count()>0){let a=r.first();if(!await a.isDisabled())return a}}return console.error("\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u7528\u7684\u53D1\u9001\u6309\u94AE\u3002"),null}async fillMessage(e){let o=await this.findInputElement();if(!o)throw new Error("\u65E0\u6CD5\u627E\u5230\u8F93\u5165\u6846\u3002");try{return this.options.enableHumanSimulation&&await ie(this.page,{referenceElement:o}),await o.fill(e),await this.page.waitForTimeout(200),console.log("\u6D88\u606F\u586B\u5145\u5B8C\u6210\u3002"),!0}catch(r){return console.error("\u586B\u5145\u6D88\u606F\u5931\u8D25:",r),!1}}async waitForSendButtonEnabled(e=1e4){try{return await this.page.locator('button[aria-label="Run"]:not([disabled]), button.run-button:not([disabled])').waitFor({state:"visible",timeout:e}),console.log("\u53D1\u9001\u6309\u94AE\u5DF2\u53EF\u7528\u3002"),!0}catch{return console.warn("\u7B49\u5F85\u53D1\u9001\u6309\u94AE\u53EF\u7528\u8D85\u65F6\uFF0C\u5C06\u7EE7\u7EED\u5C1D\u8BD5\u3002"),!1}}async sendMessage(){this.options.enableHumanSimulation&&await ce(this.page,{includeScrolling:!1,duration:1500});let e=await this.findSendButton();if(!e)throw new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7684\u53D1\u9001\u6309\u94AE\u3002");try{return await e.click(),console.log("\u6D88\u606F\u5DF2\u53D1\u9001\u3002"),!0}catch(o){console.error("\u70B9\u51FB\u53D1\u9001\u6309\u94AE\u5931\u8D25:",o);try{return console.log("\u5C1D\u8BD5\u4F7F\u7528\u952E\u76D8\u5FEB\u6377\u952E (Ctrl+Enter) \u53D1\u9001..."),await this.page.keyboard.press("Control+Enter"),console.log("\u5DF2\u4F7F\u7528\u952E\u76D8\u5FEB\u6377\u952E\u53D1\u9001\u3002"),!0}catch(r){return console.error("\u952E\u76D8\u5FEB\u6377\u952E\u53D1\u9001\u4E5F\u5931\u8D25:",r),!1}}}async setModel(e){try{let o=this.modelMapping[e]||e,r=this.page.locator("ms-model-selector-two-column");if(await r.count()===0)return console.log("\u672A\u627E\u5230\u6A21\u578B\u9009\u62E9\u5668\uFF0C\u8DF3\u8FC7\u6A21\u578B\u8BBE\u7F6E\u3002"),!1;if((await r.locator(".model-option-content .gmat-body-medium").textContent())?.trim()===o)return console.log("\u5F53\u524D\u5DF2\u662F\u76EE\u6807\u6A21\u578B\uFF0C\u65E0\u9700\u5207\u6362\u3002"),!0;await r.click({timeout:5e3});let n=this.page.locator(".mat-mdc-select-panel");await n.waitFor({state:"visible",timeout:5e3});let i=n.locator("mat-option.model-option",{hasText:o});return await i.count()>0?(await i.first().click({timeout:5e3}),await this.page.waitForTimeout(1e3),console.log(`\u6A21\u578B\u5DF2\u6210\u529F\u8BBE\u7F6E\u4E3A: ${o}`),!0):(console.log(`\u672A\u5728\u4E0B\u62C9\u83DC\u5355\u4E2D\u627E\u5230\u76EE\u6807\u6A21\u578B: ${o}`),await this.page.keyboard.press("Escape"),!1)}catch(o){console.error("\u8BBE\u7F6E\u6A21\u578B\u65F6\u53D1\u751F\u9519\u8BEF:",o);try{await this.page.keyboard.press("Escape")}catch{}return!1}}async setTemperature(e){try{let o=this.page.locator('[data-test-id="temperatureSliderContainer"]');if(await o.count()===0)return console.log("\u672A\u627E\u5230\u6E29\u5EA6\u8BBE\u7F6E\u5BB9\u5668\uFF0C\u8DF3\u8FC7\u3002"),!1;let r=o.locator('input[type="number"]');return await r.count()>0?(await r.fill(e.toString()),await r.dispatchEvent("change"),console.log(`\u6E29\u5EA6\u5DF2\u8BBE\u7F6E\u4E3A: ${e}`),!0):(console.log("\u672A\u627E\u5230\u6E29\u5EA6\u6570\u5B57\u8F93\u5165\u6846\uFF0C\u8DF3\u8FC7\u8BBE\u7F6E\u3002"),!1)}catch(o){return console.error("\u8BBE\u7F6E\u6E29\u5EA6\u65F6\u51FA\u9519:",o),!1}}async processMessage(e,o={}){if(console.log("\u5F00\u59CB\u5904\u7406\u6D88\u606F..."),!await this.waitForPageLoad())throw new Error("\u9875\u9762\u52A0\u8F7D\u5931\u8D25\u3002");if(o.model&&await this.setModel(o.model),o.temperature!==void 0&&await this.setTemperature(o.temperature),!await this.fillMessage(e))throw new Error("\u6D88\u606F\u586B\u5199\u5931\u8D25\u3002");if(await this.waitForSendButtonEnabled(),!await this.sendMessage())throw new Error("\u6D88\u606F\u53D1\u9001\u5931\u8D25\u3002");return console.log("\u6D88\u606F\u53D1\u9001\u6210\u529F\uFF0C\u7B49\u5F85\u7F51\u7EDC\u62E6\u622A\u83B7\u53D6\u54CD\u5E94\u3002"),!0}};v();var q=class{TARGET_URL_PATTERNS=["MakerSuiteService/GenerateContent"];FINAL_BLOCK_SIGNATURE_STR='\\[\\s*null\\s*,\\s*null\\s*,\\s*null\\s*,\\s*\\[\\s*"';constructor(e,o,r){this.page=e,this.onStreamChunk=o,this.onStreamEnd=r,this.uniqueId=`interceptor_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,this.chunkCallbackName=`__onStreamChunk_${this.uniqueId}`,this.endCallbackName=`__onStreamEnd_${this.uniqueId}`,this.isInjected=!1,this.isActive=!1}async _inject(){if(this.isInjected)return;s(`[Interceptor] \u6CE8\u5165\u6D41\u5F0F\u62E6\u622A\u811A\u672C (ID: ${this.uniqueId})...`),await this.page.exposeFunction(this.chunkCallbackName,this.onStreamChunk),await this.page.exposeFunction(this.endCallbackName,this.onStreamEnd);let e={TARGET_URL_PATTERNS:this.TARGET_URL_PATTERNS,FINAL_BLOCK_SIGNATURE_STR:this.FINAL_BLOCK_SIGNATURE_STR,chunkCallbackName:this.chunkCallbackName,endCallbackName:this.endCallbackName},o=this._getBrowserScript();await this.page.evaluate(o,e),this.isInjected=!0,s(`[Interceptor] \u811A\u672C\u6CE8\u5165\u548C\u56DE\u8C03\u8FDE\u63A5\u5DF2\u4E00\u6B21\u6027\u5B8C\u6210 (ID: ${this.uniqueId})`)}async activate(){this.isActive||(await this._inject(),s(`[Interceptor] \u6FC0\u6D3B\u62E6\u622A\u5668 (ID: ${this.uniqueId})...`),await this.page.evaluate(()=>{window.__streamInterceptor&&window.__streamInterceptor.activate()}),this.isActive=!0,s(`[Interceptor] \u62E6\u622A\u5668\u5DF2\u6FC0\u6D3B (ID: ${this.uniqueId})`))}async deactivate(){if(this.isActive){s(`[Interceptor] \u505C\u7528\u62E6\u622A\u5668 (ID: ${this.uniqueId})...`);try{await this.page.evaluate(()=>{window.__streamInterceptor&&window.__streamInterceptor.deactivate()}),this.isActive=!1,s(`[Interceptor] \u62E6\u622A\u5668\u5DF2\u505C\u7528 (ID: ${this.uniqueId})`)}catch(e){s(`[Interceptor] \u505C\u7528\u65F6\u53D1\u751F\u9519\u8BEF (\u53EF\u80FD\u9875\u9762\u5DF2\u5173\u95ED): ${e.message}`)}}}_getBrowserScript(){return e=>{window.__streamInterceptor&&typeof window.__streamInterceptor.deactivate=="function"&&window.__streamInterceptor.deactivate();let{TARGET_URL_PATTERNS:o,FINAL_BLOCK_SIGNATURE_STR:r,chunkCallbackName:a,endCallbackName:n}=e,i=new RegExp(r),d=window.XMLHttpRequest.prototype.open,u=window.XMLHttpRequest.prototype.send,c=window[a],p=window[n];console.log(`[Interceptor] \u56DE\u8C03\u5DF2\u5728\u6CE8\u5165\u65F6\u76F4\u63A5\u83B7\u53D6: ${a}, ${n}`);let f=!1;window.__streamInterceptor={activate:()=>{f||(console.log("\u{1F3AF} [Interceptor] \u6FC0\u6D3B XHR \u8865\u4E01..."),f=!0,window.XMLHttpRequest.prototype.open=function(h,m,...I){return this._url=m,d.apply(this,[h,m,...I])},window.XMLHttpRequest.prototype.send=function(...h){let m=this._url?this._url.toString():"";if(o.some(y=>m.includes(y))&&f){console.log("\u{1F3AF} [Interceptor] \u62E6\u622A\u5230\u76EE\u6807\u8BF7\u6C42:",m);let y=0,b="",w=!1,S=()=>{if(w)return;w=!0,console.log("\u{1F3C1} [Interceptor] \u5224\u5B9A\u6D41\u5DF2\u7ED3\u675F\uFF0C\u6B63\u5728\u89E6\u53D1\u6700\u7EC8\u56DE\u8C03...");let g=b.slice(y);g&&c&&c(g),p&&p()};this.addEventListener("progress",()=>{if(w)return;b=this.responseText||"";let g=b.slice(y);g&&(c&&c(g),y=b.length,i.test(g)&&(console.log("\u2705 [Interceptor] \u68C0\u6D4B\u5230\u6700\u7EC8\u7B7E\u540D\uFF0C\u7ED3\u675F\u6D41"),S()))}),this.addEventListener("readystatechange",()=>{this.readyState===4&&!w&&(console.log(`[Interceptor] \u8BF7\u6C42\u5B8C\u6210 (readyState=4), HTTP\u72B6\u6001: ${this.status}`),S())}),this.addEventListener("error",g=>{console.error("[Interceptor] XHR \u8BF7\u6C42\u51FA\u9519:",g),w||S()}),this.addEventListener("abort",()=>{console.warn("[Interceptor] XHR \u8BF7\u6C42\u88AB\u4E2D\u6B62"),w||S()})}return u.apply(this,h)})},deactivate:()=>{f&&(console.log("\u{1F504} [Interceptor] \u505C\u7528 XHR \u8865\u4E01..."),window.XMLHttpRequest.prototype.open=d,window.XMLHttpRequest.prototype.send=u,f=!1)}}}}};function Je(t){return t.includes("The caller does not have permission")?(console.warn("\u68C0\u6D4B\u5230\u6743\u9650\u9519\u8BEF\uFF0C\u5C06\u89E6\u53D1\u91CD\u8BD5\u673A\u5236\u3002"),{permissionError:!0,content:"\u65E0\u6743\u8BBF\u95EE AI Studio\u3002\u8BF7\u68C0\u67E5 Cookie \u6216\u767B\u5F55\u72B6\u6001\u3002"}):null}function ye(t){let e=[];if(!t)return e;if(Array.isArray(t)){if(t.length>=2&&t[0]===null&&typeof t[1]=="string"&&t[1]&&t[1]!=="model"){let o=t.length>2?"thinking":"text";e.push({type:o,content:t[1].replace(/\\n/g,`
14
- `).replace(/\\"/g,'"')})}for(let o of t)e.push(...ye(o))}return e}function V(t){let e=Je(t);if(e)return e;try{let n=t.trim().replace(/\n/g,",").replace(/,+/g,",");n.endsWith(",")&&(n=n.slice(0,-1)),n.startsWith("[")||(n="["+n),n.endsWith("]")||(n=n+"]"),n=n.replace(/,]/g,"]").replace(/\[,/g,"[");let i=JSON.parse(n),d=ye(i);if(d.length>0){let u=!1;return d.map(c=>(u?c.type="text":c.type==="text"&&(u=!0),c))}}catch{}let o=/\[null,\s*"((?:\\"|[^"])*)"/g,r=[],a;for(;(a=o.exec(t))!==null;)try{let n=a[1].replace(/\\n/g,`
15
- `).replace(/\\"/g,'"');if(n&&n!=="model"){let i=n.trim().startsWith("**")?"thinking":"text";r.push({type:i,content:n})}}catch{}if(r.length>0){let n=!1;return r.map(i=>(n?i.type="text":i.type==="text"&&(n=!0),i))}return null}function Se(t,e,o="gemini-pro"){return{id:`chatcmpl-${Date.now()}`,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:o,choices:[{index:0,delta:{content:t||"",type:e||"text"},logprobs:null,finish_reason:null}]}}function Y(t,e="gemini-pro"){return{object:"error",message:t,type:"invalid_request_error",model:e}}function be(t,e="gemini-pro"){return{id:`chatcmpl-${Date.now()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:e,choices:[{index:0,message:{role:"assistant",content:t},finish_reason:"stop"}],usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0}}}var z=3,Ee=1e3;function Ve(t){let e=t.message.toLowerCase();return["timeout","navigation failed","page crashed","target closed","element not found","is not visible","\u65E0\u6CD5\u627E\u5230","not find","cannot find"].some(r=>e.includes(r))}function Ye(t){let e=t.message.toLowerCase();return["permission","unauthorized","\u65E0\u6743\u8BBF\u95EE","cookie","\u767B\u5F55"].some(r=>e.includes(r))}async function Ie(t,e,o){let r=null,a=null;try{r=await F();for(let n=1;n<=z;n++)try{console.log(`[\u5C1D\u8BD5 ${n}/${z}] \u5F00\u59CB\u5904\u7406\u8BF7\u6C42...`),await G(r,l.aiStudio.url,{timeout:l.aiStudio.pageTimeout});let i=await o(r,t,e);return await A(r),i}catch(i){if(a=i,console.warn(`[\u5C1D\u8BD5 ${n}/${z}] \u5931\u8D25: ${i.message}`),(Ye(i)||Ve(i))&&n<z)console.log(`\u68C0\u6D4B\u5230\u53EF\u91CD\u8BD5\u7684\u9519\u8BEF\uFF08\u6743\u9650\u6216\u9875\u9762\u72B6\u6001\uFF09\uFF0C\u5C06\u5728 ${Ee}ms \u540E\u91CD\u8BD5...`),await new Promise(d=>setTimeout(d,Ee));else throw console.error("\u9519\u8BEF\u4E0D\u53EF\u91CD\u8BD5\u6216\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u5C06\u629B\u51FA\u5F02\u5E38\u3002"),i}}catch(n){throw console.error("\u5904\u7406 AI Studio \u8BF7\u6C42\u6700\u7EC8\u5931\u8D25:",n),r&&await A(r),a||n}}async function xe(t,e,o={}){let r=o.model||l.api.defaultModel;try{await Ie(t,o,async(a,n,i)=>new Promise(async(d,u)=>{let c=!1,p="",f=new Set,h=null,m=!1,I=w=>{c||(c=!0,h&&h.deactivate().catch(console.error),w?u(w):d())},y=w=>{if(c)return;p+=w;let S=V(p);if(S?.permissionError)return I(new Error(S.content));if(Array.isArray(S)&&S.length>0)for(let g of S){let T=`${g.type}::${g.content}`;g.content?.trim()&&!f.has(T)&&(g.type==="text"&&(m=!0),!m||g.type==="text"?(e.enqueue(`data: ${JSON.stringify(Se(g.content,g.type,r))}
16
 
17
- `),f.add(T)):console.log('[State Filter] Ignoring "thinking" chunk because text output has already begun.'))}},b=()=>{c||(console.log("\u6D41\u5DF2\u7ED3\u675F\uFF0C\u53D1\u9001 [DONE] \u4FE1\u53F7\u3002"),e.enqueue(`data: [DONE]
18
 
19
- `),e.close(),I())};try{h=new q(a,y,b),await h.activate(),await new O(a).processMessage(n,i),setTimeout(()=>{c||I(new Error("AI Studio \u54CD\u5E94\u8D85\u65F6\u3002"))},l.aiStudio.responseTimeout)}catch(w){I(w)}}))}catch(a){if(e.desiredSize!==null)try{e.enqueue(`data: ${JSON.stringify(Y(a.message,r))}
20
 
21
  `),e.enqueue(`data: [DONE]
22
 
23
- `),e.close()}catch(n){console.error("\u5173\u95ED\u6D41\u63A7\u5236\u5668\u65F6\u51FA\u9519:",n)}}}async function Pe(t,e={}){let o=e.model||l.api.defaultModel;try{return await Ie(t,e,async(r,a,n)=>new Promise(async(i,d)=>{let u="",c=async p=>{if(p.url().includes("GenerateContent"))try{let f=await p.text(),h=V(f);if(h?.permissionError)return d(new Error(h.content));Array.isArray(h)&&(u+=h.filter(m=>m.type==="text").map(m=>m.content).join("")),r.removeListener("response",c),i(be(u,o))}catch(f){d(f)}};r.on("response",c);try{await new O(r).processMessage(a,n),setTimeout(()=>{r.removeListener("response",c),d(new Error("AI Studio \u54CD\u5E94\u8D85\u65F6\u3002"))},l.aiStudio.responseTimeout)}catch(p){r.removeListener("response",c),d(p)}}))}catch(r){return Y(r.message,o)}}async function $e(t){try{we(t);let e=await Qe(t),{prompt:o,stream:r,model:a,temperature:n}=ge(e);return r?(he(t),new ReadableStream({start(d){xe(o,d,{model:a,temperature:n})}})):await Pe(o,{model:a,temperature:n})}catch(e){throw console.error("\u5904\u7406\u804A\u5929\u8BF7\u6C42\u65F6\u51FA\u9519:",e),e.statusCode?e:Ze({statusCode:500,statusMessage:e.message||"An internal server error occurred."})}}import{createError as B}from"h3";async function _e(t){try{let e=Object.values(l.models).map(o=>({id:o.id,object:o.object,created:o.created,owned_by:o.owned_by,permission:o.permission,root:o.root,parent:o.parent}));return e.sort((o,r)=>r.created-o.created),{object:"list",data:e}}catch(e){throw console.error("\u83B7\u53D6\u6A21\u578B\u5217\u8868\u65F6\u51FA\u9519:",e),B({statusCode:500,statusMessage:"Failed to retrieve models list."})}}async function ve(t){try{let e=t.context.params?.model;if(!e)throw B({statusCode:400,statusMessage:"Model ID is required."});let o=l.models[e];if(!o)throw B({statusCode:404,statusMessage:`Model '${e}' not found.`});return{id:o.id,object:o.object,created:o.created,owned_by:o.owned_by,permission:o.permission,root:o.root,parent:o.parent}}catch(e){throw console.error(`\u83B7\u53D6\u6A21\u578B '${t.context.params?.model}' \u4FE1\u606F\u65F6\u51FA\u9519:`,e),e.statusCode?e:B({statusCode:500,statusMessage:"Failed to retrieve model information."})}}D();v();var P=new et,Ae=process.cwd();le();P.use("*",de);P.get("/health",fe);P.get("/v1/models",_e);P.get("/v1/models/:model",ve);P.post("/v1/chat/completions",$e);P.get("/screenshots/**",t=>{let e=t.path.substring(12),o=Me(Ae,"screenshots",e);return Ce(t,{getContents:()=>Re(o),getMeta:async()=>{let r=await Te(o).catch(()=>{});if(r?.isFile())return{size:r.size,mtime:r.mtimeMs}}})});P.get("/**",t=>{let e=t.path==="/"?"index.html":t.path,o=Me(Ae,"public",e);return Ce(t,{getContents:()=>Re(o),getMeta:async()=>{let r=await Te(o).catch(()=>{});if(r?.isFile())return{size:r.size,mtime:r.mtimeMs}}})});s("\u{1F527} \u521D\u59CB\u5316\u9875\u9762\u6C60...");ne(5);process.env.NODE_ENV!=="production"&&(s("\u{1F4CA} \u542F\u52A8\u9875\u9762\u6C60\u76D1\u63A7..."),pe(1e4));var N=l.server.port,L=l.server.host;tt(P,{port:N,host:L});s(`\u{1F680} \u670D\u52A1\u5668\u8FD0\u884C\u5728 http://${L}:${N}`);s(`\u{1F3E0} \u7BA1\u7406\u9762\u677F: http://${L}:${N}/`);s(`\u{1F4CB} \u5065\u5EB7\u68C0\u67E5: http://${L}:${N}/health`);s(`\u{1F4AC} \u804A\u5929\u7AEF\u70B9: http://${L}:${N}/v1/chat/completions`);s(`\u{1F3AF} AI Studio URL: ${l.aiStudio.url}`);s(`\u{1F30D} \u73AF\u5883: ${process.env.NODE_ENV||"development"}`);async function ot(){let t;try{s("\u{1F4F8} \u5F00\u59CB\u83B7\u53D6AI Studio\u9875\u9762\u622A\u56FE..."),t=await F(),s(`\u{1F310} \u667A\u80FD\u5BFC\u822A\u5230: ${l.aiStudio.url}`),await G(t,l.aiStudio.url,{timeout:l.aiStudio.pageTimeout}),await U(t),await t.waitForTimeout(2e3);let e=await W(t,"./screenshots","aistudio-startup",!1);s(`\u2705 AI Studio\u622A\u56FE\u5DF2\u4FDD\u5B58: ${e}`)}catch(e){_("\u274C \u622A\u56FEAI Studio\u9875\u9762\u65F6\u51FA\u9519:",e.message)}finally{t&&(await A(t),s("\u{1F504} \u9875\u9762\u5DF2\u91CA\u653E\u56DE\u6C60\u4E2D"))}}setTimeout(()=>{s(`
24
- \u{1F4CA} \u521D\u59CB\u9875\u9762\u6C60\u72B6\u6001:`),me()},1e3);setTimeout(()=>{ot()},2e3);
 
1
+ var Oe=Object.defineProperty;var te=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ne=(t,e)=>{for(var o in e)Oe(t,o,{get:e[o],enumerable:!0})};import W from"node:fs";function Le(){W.existsSync(A.logDir)||W.mkdirSync(A.logDir,{recursive:!0})}function He(...t){return t.map(e=>typeof e=="object"&&e!==null?JSON.stringify(e,null,2):String(e)).join(" ")}async function Ue(t,e){if(!A.enableFile)return;Le();let a=`[${new Date().toISOString()}] [${t}] ${e}
2
+ `;try{await W.promises.appendFile(A.logFile,a)}catch(n){console.error("\u5199\u5165\u65E5\u5FD7\u6587\u4EF6\u5931\u8D25:",n)}}function Ge(t,...e){if(!A.enableConsole)return;let o={[P.DEBUG]:console.debug,[P.INFO]:console.log,[P.WARN]:console.warn,[P.ERROR]:console.error}[t]||console.log,a=new Date().toLocaleTimeString();o(`[${a}] [${t}]`,...e)}function q(t,...e){let o=He(...e);Ge(t,...e),Ue(t,o)}var P,A,r,$,g,S=te(()=>{P={DEBUG:"DEBUG",INFO:"INFO",WARN:"WARN",ERROR:"ERROR"},A={logFile:"./logs/app.log",logDir:"./logs",enableConsole:!0,enableFile:!0,logLevel:process.env.LOG_LEVEL||P.INFO};r=(...t)=>q(P.INFO,...t),$=(...t)=>q(P.WARN,...t),g=(...t)=>q(P.ERROR,...t)});var ae={};Ne(ae,{checkCookieAvailability:()=>Be,ensureDirectoryExists:()=>re,getHumanReadableTimestamp:()=>oe,loadCookies:()=>K,saveScreenshot:()=>J,waitForUserInput:()=>Ve});import _ from"node:fs";import ze from"node:path";import je from"node:readline";function oe(){return new Date().toISOString().replace(/T/,"_").replace(/:/g,"-").replace(/\..+/,"")}function re(t){_.existsSync(t)||(_.mkdirSync(t,{recursive:!0}),r(`\u5DF2\u521B\u5EFA\u76EE\u5F55: ${t}`))}function Be(t,e){if(e)try{return JSON.parse(e),r("\u53D1\u73B0\u5E76\u9A8C\u8BC1\u4E86\u73AF\u5883\u53D8\u91CF\u4E2D\u7684 COOKIES\u3002"),!0}catch(o){g("\u73AF\u5883\u53D8\u91CF COOKIES \u683C\u5F0F\u65E0\u6548 (\u5FC5\u987B\u662F JSON \u6570\u7EC4\u5B57\u7B26\u4E32):",o.message)}return _.existsSync(t)?(r(`\u53D1\u73B0 Cookie \u6587\u4EF6: ${t}`),!0):(g(`Cookie \u6587\u4EF6\u4E0D\u5B58\u5728: ${t}\uFF0C\u4E14\u672A\u8BBE\u7F6E COOKIES \u73AF\u5883\u53D8\u91CF\u3002`),r("\u8BF7\u5148\u8FD0\u884C `npm run login` \u6216\u8BBE\u7F6E COOKIES \u73AF\u5883\u53D8\u91CF\u3002"),!1)}function K(t,e){try{if(e)return r("\u4ECE\u73AF\u5883\u53D8\u91CF COOKIES \u52A0\u8F7D Cookie..."),JSON.parse(e);if(_.existsSync(t))return r(`\u4ECE\u6587\u4EF6\u52A0\u8F7D Cookie: ${t}`),JSON.parse(_.readFileSync(t,"utf8"))}catch(o){throw g("\u52A0\u8F7D Cookie \u5931\u8D25:",o),new Error("\u65E0\u6CD5\u52A0\u8F7D\u6216\u89E3\u6790 Cookie\u3002")}return[]}async function J(t,e,o="screenshot",a=!0){if(re(e),a){let s=oe();o=`${o}_${s}`}let n=ze.join(e,`${o}.png`);return await t.screenshot({path:n,fullPage:!0}),r(`\u622A\u56FE\u5DF2\u4FDD\u5B58: ${n}`),n}function Ve(){let t=je.createInterface({input:process.stdin,output:process.stdout});return new Promise(e=>{t.question("",()=>{t.close(),e()})})}var L=te(()=>{S()});import{H3 as rt,serve as at,serveStatic as Me}from"h3";import{stat as Re,readFile as Ae}from"node:fs/promises";import{join as _e}from"node:path";import{chromium as We}from"playwright";import{newInjectedContext as qe}from"fingerprint-injector";import{FingerprintGenerator as Ke}from"fingerprint-generator";import De from"dotenv";De.config();var Fe={server:{port:parseInt(process.env.PORT||"3096",10),host:process.env.HOST||"localhost"},browser:{headless:(process.env.HEADLESS||"true").toLowerCase()!=="false",timeout:parseInt(process.env.TIMEOUT||"30000",10),executablePath:process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH,args:["--disable-blink-features=AutomationControlled","--no-sandbox","--disable-dev-shm-usage","--disable-infobars","--disable-extensions"]},cookieFile:"./cookies.json",cookiesFromEnv:process.env.COOKIES,screenshotDir:"./screenshots",aiStudio:{url:process.env.AI_STUDIO_URL||"https://aistudio.google.com/prompts/new_chat",responseTimeout:parseInt(process.env.RESPONSE_TIMEOUT||"600000",10),pageTimeout:parseInt(process.env.PAGE_TIMEOUT||"30000",10)},api:{defaultModel:process.env.DEFAULT_MODEL||"gemini-pro",maxTokens:65536,temperature:1,token:process.env.API_TOKEN},models:{"gemini-2.5-pro":{displayName:"Gemini 2.5 Pro",id:"gemini-2.5-pro",object:"model",created:1704067200,owned_by:"google",permission:[],root:"gemini-2.5-pro",parent:null},"gemini-2.5-flash":{displayName:"Gemini 2.5 Flash",id:"gemini-2.5-flash",object:"model",created:1704067200,owned_by:"google",permission:[],root:"gemini-2.5-flash",parent:null},"gemini-pro":{displayName:"Gemini Pro",id:"gemini-pro",object:"model",created:1701388800,owned_by:"google",permission:[],root:"gemini-pro",parent:null},"gemini-flash":{displayName:"Gemini Flash",id:"gemini-flash",object:"model",created:1701388800,owned_by:"google",permission:[],root:"gemini-flash",parent:null}},debug:{logRequests:process.env.DEBUG_REQUESTS==="true",logResponses:process.env.DEBUG_RESPONSES==="true",saveScreenshots:process.env.SAVE_SCREENSHOTS==="true"}},l=Fe;L();S();var v=null,M=null,H=class{constructor(e=5){this.maxSize=e,this.availablePages=[],this.busyPages=new Set,this.totalPages=0}async getPage(){if(this.availablePages.length>0){let e=this.availablePages.pop();return this.busyPages.add(e),r(`\u4ECE\u9875\u9762\u6C60\u83B7\u53D6\u9875\u9762\uFF0C\u5F53\u524D\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`),e}if(this.totalPages<this.maxSize){let{context:e}=await Je(),o=await e.newPage();return this.busyPages.add(o),this.totalPages++,r(`\u521B\u5EFA\u65B0\u9875\u9762\uFF0C\u603B\u9875\u9762\u6570: ${this.totalPages}\uFF0C\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`),o}return r("\u9875\u9762\u6C60\u5DF2\u6EE1\uFF0C\u7B49\u5F85\u9875\u9762\u91CA\u653E..."),new Promise(e=>{let o=()=>{if(this.availablePages.length>0){let a=this.availablePages.pop();this.busyPages.add(a),r(`\u7B49\u5F85\u540E\u83B7\u53D6\u5230\u9875\u9762\uFF0C\u5F53\u524D\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`),e(a)}else setTimeout(o,100)};o()})}async releasePage(e){if(!this.busyPages.has(e)){r("\u5C1D\u8BD5\u91CA\u653E\u4E0D\u5728\u5FD9\u788C\u5217\u8868\u4E2D\u7684\u9875\u9762");return}try{await this.cleanupPage(e),this.busyPages.delete(e),this.availablePages.push(e),r(`\u9875\u9762\u5DF2\u91CA\u653E\u56DE\u6C60\u4E2D\uFF0C\u53EF\u7528\u9875\u9762\u6570: ${this.availablePages.length}\uFF0C\u5FD9\u788C\u9875\u9762\u6570: ${this.busyPages.size}`)}catch(o){r(`\u6E05\u7406\u9875\u9762\u65F6\u51FA\u9519\uFF0C\u5C06\u5173\u95ED\u8BE5\u9875\u9762: ${o.message}`),await this.removePage(e)}}async cleanupPage(e){try{e.removeAllListeners();try{await e.evaluate(()=>{Object.keys(window).forEach(a=>{(a.startsWith("__handleStreamChunk")||a.startsWith("__onStreamChunk")||a.startsWith("__onStreamEnd"))&&delete window[a]}),window.__streamInterceptor&&(typeof window.__streamInterceptor.deactivate=="function"&&window.__streamInterceptor.deactivate(),delete window.__streamInterceptor),delete window.__handleStreamChunk,delete window.__onStreamChunk,delete window.__onStreamEnd,delete window.__streamCallbacks})}catch(o){r(`\u6E05\u7406\u9875\u9762\u72B6\u6001\u65F6\u51FA\u73B0evaluate\u9519\u8BEF: ${o.message}`)}r("\u9875\u9762\u72B6\u6001\u5DF2\u6E05\u7406")}catch(o){throw new Error(`\u6E05\u7406\u9875\u9762\u5931\u8D25: ${o.message}`)}}async removePage(e){try{this.busyPages.delete(e);let o=this.availablePages.indexOf(e);o>-1&&this.availablePages.splice(o,1),await e.close(),this.totalPages--,r(`\u9875\u9762\u5DF2\u4ECE\u6C60\u4E2D\u79FB\u9664\uFF0C\u603B\u9875\u9762\u6570: ${this.totalPages}`)}catch(o){r(`\u5173\u95ED\u9875\u9762\u65F6\u51FA\u9519: ${o.message}`)}}async cleanup(){r("\u5F00\u59CB\u6E05\u7406\u9875\u9762\u6C60...");for(let e of this.busyPages)try{await e.close()}catch(o){r(`\u5173\u95ED\u5FD9\u788C\u9875\u9762\u65F6\u51FA\u9519: ${o.message}`)}for(let e of this.availablePages)try{await e.close()}catch(o){r(`\u5173\u95ED\u53EF\u7528\u9875\u9762\u65F6\u51FA\u9519: ${o.message}`)}this.busyPages.clear(),this.availablePages=[],this.totalPages=0,r("\u9875\u9762\u6C60\u6E05\u7406\u5B8C\u6210")}getStatus(){return{total:this.totalPages,available:this.availablePages.length,busy:this.busyPages.size,maxSize:this.maxSize}}},w=null;async function Je(){if(!v){v=await We.launch({headless:l.browser.headless,timeout:l.browser.timeout,args:l.browser.args,executablePath:l.browser.executablePath});let t=new Ke().getFingerprint({devices:["desktop"],operatingSystems:["windows"],browsers:[{name:"chrome"}]});M=await qe(v,{fingerprint:t,newContextOptions:{locale:"zh-CN",serviceWorkers:"allow",javaScriptEnabled:!0,bypassCSP:!1}});let e=K(l.cookieFile,l.cookiesFromEnv);await M.addCookies(e)}return{browser:v,context:M}}function ne(t=5){return w||(w=new H(t),r(`\u9875\u9762\u6C60\u5DF2\u521D\u59CB\u5316\uFF0C\u6700\u5927\u9875\u9762\u6570: ${t}`)),w}function ie(){return w||(w=new H,r("\u9875\u9762\u6C60\u5DF2\u81EA\u52A8\u521D\u59CB\u5316\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E")),w}async function U(){let e=await ie().getPage();return await e.bringToFront(),e}async function k(t){await ie().releasePage(t)}function O(){return w?w.getStatus():{total:0,available:0,busy:0,maxSize:0}}async function G(t,e,o={}){let a=t.url();r("\u5F53\u524D\u9875\u9762URL:",a),r("\u76EE\u6807URL:",e);try{return a!==e?(r("\u9875\u9762URL\u4E0D\u5339\u914D\uFF0C\u9700\u8981\u5BFC\u822A..."),await t.goto(e,{waitUntil:"load",timeout:3e4,...o}),r("\u9875\u9762\u5BFC\u822A\u5B8C\u6210"),!0):(r("\u9875\u9762\u5DF2\u5728\u76EE\u6807URL\uFF0C\u8FDB\u884C\u5237\u65B0\u4EE5\u786E\u4FDD\u6700\u65B0\u72B6\u6001..."),await t.bringToFront(),await t.reload({waitUntil:"load",timeout:3e4,...o}),r("\u9875\u9762\u5237\u65B0\u5B8C\u6210"),!0)}catch{}return!1}async function ce(t,e={}){let{minClicks:o=1,maxClicks:a=3,minDelay:n=300,maxDelay:s=500,referenceElement:i=null}=e;try{r("\u5F00\u59CB\u6A21\u62DF\u4EBA\u7C7B\u968F\u673A\u70B9\u51FB\u884C\u4E3A...");let m=Math.floor(Math.random()*(a-o+1))+o;r(`\u5C06\u8FDB\u884C ${m} \u6B21\u968F\u673A\u70B9\u51FB`);let u=null;if(i)try{let c=await i.boundingBox();c&&(u={x:c.x-50,y:Math.max(0,c.y-200),width:c.width+50,height:300},r(`\u4F7F\u7528\u8F93\u5165\u6846\u9644\u8FD1\u7684\u5B89\u5168\u533A\u57DF: x=${u.x}, y=${u.y}, w=${u.width}, h=${u.height}`))}catch(c){r(`\u83B7\u53D6\u53C2\u8003\u5143\u7D20\u4F4D\u7F6E\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u5B89\u5168\u533A\u57DF: ${c.message}`)}if(!u){let c=t.viewportSize(),p=c?.width||1280,f=c?.height||720;u={x:p*.3,y:f*.3,width:p*.4,height:f*.2},r(`\u4F7F\u7528\u9ED8\u8BA4\u5B89\u5168\u533A\u57DF: x=${u.x}, y=${u.y}, w=${u.width}, h=${u.height}`)}for(let c=0;c<m;c++)try{let p=Math.floor(Math.random()*u.width)+u.x,f=Math.floor(Math.random()*u.height)+u.y;r(`\u7B2C ${c+1} \u6B21\u5B89\u5168\u70B9\u51FB: (${p}, ${f})`);let d=await t.locator("*").first().evaluate((h,T)=>{let x=document.elementFromPoint(T.x,T.y);if(!x)return{safe:!0};let I=x.tagName.toLowerCase(),y=x.hasAttribute("href"),E=x.hasAttribute("onclick")||x.onclick,b=I==="button"||x.type==="button",R=I==="a"||y,ee=["input","textarea","select"].includes(I);return{safe:!b&&!R&&!E&&!ee,tagName:I,hasHref:y,hasOnClick:E,isButton:b,isLink:R,isInput:ee}},{x:p,y:f});if(d.safe?(await t.mouse.move(p,f,{steps:Math.floor(Math.random()*10)+5}),await t.waitForTimeout(Math.floor(Math.random()*200)+100),await t.mouse.click(p,f),r(`\u5B89\u5168\u70B9\u51FB\u5B8C\u6210: (${p}, ${f})`)):r(`\u8DF3\u8FC7\u4E0D\u5B89\u5168\u7684\u70B9\u51FB\u4F4D\u7F6E (${p}, ${f}): ${d.tagName}`),c<m-1){let h=Math.floor(Math.random()*(s-n+1))+n;r(`\u7B49\u5F85 ${h}ms \u540E\u8FDB\u884C\u4E0B\u4E00\u6B21\u70B9\u51FB`),await t.waitForTimeout(h)}}catch(p){r(`\u7B2C ${c+1} \u6B21\u70B9\u51FB\u51FA\u73B0\u9519\u8BEF\uFF0C\u7EE7\u7EED\u4E0B\u4E00\u6B21: ${p.message}`)}r("\u5B89\u5168\u968F\u673A\u70B9\u51FB\u6A21\u62DF\u5B8C\u6210")}catch(m){r(`\u6A21\u62DF\u5B89\u5168\u968F\u673A\u70B9\u51FB\u65F6\u51FA\u73B0\u9519\u8BEF: ${m.message}`)}}async function le(t,e={}){let{includeScrolling:o=!0,includeMouseMovement:a=!0,includeRandomClicks:n=!0,duration:s=3e3}=e;try{r("\u5F00\u59CB\u6A21\u62DF\u590D\u6742\u7684\u4EBA\u7C7B\u884C\u4E3A...");let i=Date.now(),m=t.viewportSize(),u=m?.width||1280,c=m?.height||720;for(;Date.now()-i<s;){let p=Math.random();if(p<.3&&o){let d=Math.random()>.5?"down":"up",h=Math.floor(Math.random()*300)+100;r(`\u6A21\u62DF\u6EDA\u52A8: ${d}, \u8DDD\u79BB: ${h}px`),await t.mouse.wheel(0,d==="down"?h:-h)}else if(p<.6&&a){let d=Math.floor(Math.random()*u),h=Math.floor(Math.random()*c);r(`\u6A21\u62DF\u9F20\u6807\u79FB\u52A8\u5230: (${d}, ${h})`),await t.mouse.move(d,h,{steps:Math.floor(Math.random()*15)+5})}else if(p<.8&&n){let d=Math.floor(Math.random()*(u*.8))+u*.1,h=Math.floor(Math.random()*(c*.8))+c*.1;r(`\u6A21\u62DF\u968F\u673A\u70B9\u51FB: (${d}, ${h})`),await t.mouse.click(d,h)}let f=Math.floor(Math.random()*800)+200;await t.waitForTimeout(f)}r("\u590D\u6742\u4EBA\u7C7B\u884C\u4E3A\u6A21\u62DF\u5B8C\u6210")}catch(i){r(`\u6A21\u62DF\u590D\u6742\u4EBA\u7C7B\u884C\u4E3A\u65F6\u51FA\u73B0\u9519\u8BEF: ${i.message}`)}}async function z(t,e=5e3){try{r("\u68C0\u67E5\u662F\u5426\u6709\u6B22\u8FCE\u5BF9\u8BDD\u6846\u9700\u8981\u5173\u95ED...");let o="mat-dialog-container",a='button[mat-dialog-close][aria-label="close"]';if(await t.locator(o).first().isVisible({timeout:e})){r("\u53D1\u73B0\u6B22\u8FCE\u5BF9\u8BDD\u6846\uFF0C\u5C1D\u8BD5\u5173\u95ED...");let s=t.locator(a).first();return await s.isVisible({timeout:2e3})?(await s.click(),r("\u5DF2\u901A\u8FC7\u5173\u95ED\u6309\u94AE\u5173\u95ED\u6B22\u8FCE\u5BF9\u8BDD\u6846"),await t.waitForTimeout(1e3),!0):(r("\u672A\u627E\u5230\u5173\u95ED\u6309\u94AE\uFF0C\u5C1D\u8BD5\u6309ESC\u952E\u5173\u95ED\u5BF9\u8BDD\u6846"),await t.keyboard.press("Escape"),await t.waitForTimeout(1e3),!0)}else return r("\u672A\u53D1\u73B0\u6B22\u8FCE\u5BF9\u8BDD\u6846"),!1}catch(o){return r("\u5904\u7406\u6B22\u8FCE\u5BF9\u8BDD\u6846\u65F6\u51FA\u73B0\u9519\u8BEF\uFF0C\u7EE7\u7EED\u6267\u884C:",o.message),!1}}var se=!1;async function Ye(){if(!v){r("\u6D4F\u89C8\u5668\u5B9E\u4F8B\u4E0D\u5B58\u5728\uFF0C\u65E0\u9700\u6E05\u7406\u3002");return}r("\u{1F9F9} \u5F00\u59CB\u6E05\u7406\u6D4F\u89C8\u5668\u8D44\u6E90..."),w&&(await w.cleanup(),w=null,r("\u2705 \u9875\u9762\u6C60\u5DF2\u6E05\u7406\u3002")),M&&(await M.close(),M=null,r("\u2705 \u6D4F\u89C8\u5668\u4E0A\u4E0B\u6587\u5DF2\u5173\u95ED\u3002")),v&&(await v.close(),v=null,r("\u2705 \u6D4F\u89C8\u5668\u5B9E\u4F8B\u5DF2\u5173\u95ED\u3002")),r("\u2728 \u6240\u6709\u8D44\u6E90\u5747\u5DF2\u6210\u529F\u91CA\u653E\u3002")}async function Y(t){if(se){r("\u6E05\u7406\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u8BF7\u7A0D\u5019...");return}se=!0,r(`
3
+ \u{1F6A8} \u6536\u5230\u4FE1\u53F7 ${t}\u3002\u5F00\u59CB\u4F18\u96C5\u505C\u673A...`);try{await Ye(),process.exit(0)}catch(e){g("\u274C \u5728\u4F18\u96C5\u505C\u673A\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF:",e),process.exit(1)}}function ue(){process.once("SIGUSR2",()=>Y("SIGUSR2")),process.on("SIGINT",()=>Y("SIGINT")),process.on("SIGTERM",()=>Y("SIGTERM"))}S();var me=null;function pe(t=1e4){if(me){r("\u9875\u9762\u6C60\u76D1\u63A7\u5DF2\u5728\u8FD0\u884C\u4E2D\u3002");return}r(`\u5F00\u59CB\u76D1\u63A7\u9875\u9762\u6C60\u72B6\u6001\uFF0C\u95F4\u9694: ${t}ms`),me=setInterval(()=>{let e=O(),o=new Date().toLocaleTimeString(),a=e.total>0?(e.busy/e.total*100).toFixed(1):0;r(`[${o}] \u9875\u9762\u6C60\u72B6\u6001: \u603B\u8BA1=${e.total}, \u53EF\u7528=${e.available}, \u5FD9\u788C=${e.busy}, \u4F7F\u7528\u7387=${a}%`)},t)}function de(){let t=O(),e=new Date().toLocaleString(),o=t.total>0?(t.busy/t.total*100).toFixed(1):0;r(`
4
  --- \u9875\u9762\u6C60\u72B6\u6001 @ ${e} ---
5
  \u603B\u9875\u9762\u6570: ${t.total}
6
  \u53EF\u7528\u9875\u9762\u6570: ${t.available}
 
8
  \u6700\u5927\u9875\u9762\u6570: ${t.maxSize}
9
  \u4F7F\u7528\u7387: ${o}%
10
  ------------------------------------
11
+ `)}function he(t){let e=t.node.res.getHeaders();if(e["access-control-allow-origin"]||t.node.res.setHeader("Access-Control-Allow-Origin",process.env.CORS_ORIGIN||"*"),e["access-control-allow-methods"]||t.node.res.setHeader("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),e["access-control-allow-headers"]||t.node.res.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization"),e["access-control-max-age"]||t.node.res.setHeader("Access-Control-Max-Age","86400"),t.node.req.method==="OPTIONS")return t.node.res.statusCode=204,t.node.res.end()}function fe(t){t.node.res.setHeader("Content-Type","text/event-stream"),t.node.res.setHeader("Cache-Control","no-cache"),t.node.res.setHeader("Connection","keep-alive"),t.node.res.setHeader("Access-Control-Allow-Origin",process.env.CORS_ORIGIN||"*"),t.node.res.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization")}function ge(t){let e=O(),o=e.total>0?Math.round(e.busy/e.total*100):0;return{status:"ok",timestamp:new Date().toISOString(),version:process.env.npm_package_version||"1.0.0",pagePool:{...e,utilization:`${o}%`}}}import{readBody as tt,createError as ot}from"h3";import{createError as Xe}from"h3";function we(t){let{messages:e,stream:o=!1,model:a=l.api.defaultModel,temperature:n=l.api.temperature}=t;if(!e||!Array.isArray(e)||e.length===0)throw Xe({statusCode:400,statusMessage:"Invalid request: `messages` must be a non-empty array."});return{prompt:e.map(i=>!i.role||!i.content?"":`${i.role}: ${i.content}`).join(`
12
 
13
+ `),stream:o,model:a,temperature:n,messages:e}}import{createError as X}from"h3";function ye(t){if(!l.api.token){process.env.NODE_ENV==="production"&&console.warn("\u8B66\u544A: API_TOKEN \u672A\u5728\u751F\u4EA7\u73AF\u5883\u4E2D\u914D\u7F6E\uFF0CAPI \u5BF9\u5916\u5F00\u653E\uFF01");return}let e=t.node.req.headers.authorization;if(!e)throw X({statusCode:401,statusMessage:"Unauthorized: Missing Authorization header."});let[o,a]=e.split(" ");if(o!=="Bearer"||!a)throw X({statusCode:401,statusMessage:"Unauthorized: Invalid Authorization header format. Expected: Bearer <token>."});if(a!==l.api.token)throw X({statusCode:401,statusMessage:"Unauthorized: Invalid API token."})}S();var N=class{constructor(e,o={}){this.page=e,this.options={enableHumanSimulation:!1,...o},this.modelMapping=Object.fromEntries(Object.entries(l.models).map(([a,n])=>[a,n.displayName]))}async waitForPageLoad(){try{return await this.page.waitForSelector("body",{timeout:15e3}),await z(this.page),!0}catch(e){return e("\u9875\u9762\u52A0\u8F7D\u8D85\u65F6\u6216\u5931\u8D25:",e),!1}}async findInputElement(){try{await this.page.waitForSelector("footer ms-prompt-input-wrapper",{timeout:1e4}),r("\u8F93\u5165\u6846\u7684\u7236\u5BB9\u5668\u5DF2\u52A0\u8F7D\u3002")}catch{$("\u7B49\u5F85\u8F93\u5165\u6846\u7236\u5BB9\u5668\u8D85\u65F6\uFF0C\u5C06\u7EE7\u7EED\u5C1D\u8BD5\u67E5\u627E...")}let e=['ms-prompt-input-wrapper textarea[aria-label*="prompt"]','textarea[placeholder="Start typing a prompt"]','textarea[aria-label="Start typing a prompt"]',"footer textarea",'textarea[placeholder*="prompt"]','textarea[aria-label*="prompt"]','div[contenteditable="true"]',"textarea"];for(let o of e)try{let a=this.page.locator(o),n=await a.count();if(n>0){r(`\u9009\u62E9\u5668 "${o}" \u627E\u5230\u4E86 ${n} \u4E2A\u5143\u7D20\u3002\u6B63\u5728\u68C0\u67E5\u53EF\u89C1\u6027\u548C\u53EF\u7528\u6027...`);for(let s=0;s<n;s++){let i=a.nth(s);if(await i.isVisible()&&await i.isEnabled())return r(`\u6210\u529F\u627E\u5230\u53EF\u7528\u8F93\u5165\u6846: ${o} (\u7D22\u5F15 ${s})`),i}r(`\u9009\u62E9\u5668 "${o}" \u627E\u5230\u7684\u5143\u7D20\u5747\u4E0D\u53EF\u89C1\u6216\u4E0D\u53EF\u7528\u3002`)}}catch(a){$(`\u4F7F\u7528\u9009\u62E9\u5668 "${o}" \u67E5\u627E\u65F6\u51FA\u9519: ${a.message}`)}if(g("\u5173\u952E\u9519\u8BEF: \u5C1D\u8BD5\u4E86\u6240\u6709\u9009\u62E9\u5668\u540E\uFF0C\u4ECD\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u7528\u7684\u8F93\u5165\u5143\u7D20\u3002"),l.debug.saveScreenshots){let{saveScreenshot:o}=await Promise.resolve().then(()=>(L(),ae));await o(this.page,l.screenshotDir,"find-input-failed")}return null}async findSendButton(){let e=['button[aria-label="Run"]',"button.run-button",'button[aria-label*="Send"]','button[data-testid*="send"]'];for(let o of e){let a=this.page.locator(o);if(await a.count()>0){let n=a.first();if(!await n.isDisabled())return n}}return g("\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u7528\u7684\u53D1\u9001\u6309\u94AE\u3002"),null}async fillMessage(e){let o=await this.findInputElement();if(!o)throw new Error("\u65E0\u6CD5\u627E\u5230\u8F93\u5165\u6846\u3002");try{return this.options.enableHumanSimulation&&await ce(this.page,{referenceElement:o}),await o.fill(e),await this.page.waitForTimeout(200),r("\u6D88\u606F\u586B\u5145\u5B8C\u6210\u3002"),!0}catch(a){return a("\u586B\u5145\u6D88\u606F\u5931\u8D25:",a),!1}}async waitForSendButtonEnabled(e=1e4){try{return await this.page.locator('button[aria-label="Run"]:not([disabled]), button.run-button:not([disabled])').waitFor({state:"visible",timeout:e}),r("\u53D1\u9001\u6309\u94AE\u5DF2\u53EF\u7528\u3002"),!0}catch{return $("\u7B49\u5F85\u53D1\u9001\u6309\u94AE\u53EF\u7528\u8D85\u65F6\uFF0C\u5C06\u7EE7\u7EED\u5C1D\u8BD5\u3002"),!1}}async sendMessage(){this.options.enableHumanSimulation&&await le(this.page,{includeScrolling:!1,duration:1500});let e=await this.findSendButton();if(!e)throw new Error("\u65E0\u6CD5\u627E\u5230\u53EF\u7528\u7684\u53D1\u9001\u6309\u94AE\u3002");try{return await e.click(),r("\u6D88\u606F\u5DF2\u53D1\u9001\u3002"),!0}catch(o){o("\u70B9\u51FB\u53D1\u9001\u6309\u94AE\u5931\u8D25:",o);try{return r("\u5C1D\u8BD5\u4F7F\u7528\u952E\u76D8\u5FEB\u6377\u952E (Ctrl+Enter) \u53D1\u9001..."),await this.page.keyboard.press("Control+Enter"),r("\u5DF2\u4F7F\u7528\u952E\u76D8\u5FEB\u6377\u952E\u53D1\u9001\u3002"),!0}catch(a){return o("\u952E\u76D8\u5FEB\u6377\u952E\u53D1\u9001\u4E5F\u5931\u8D25:",a),!1}}}async setModel(e){try{let o=this.modelMapping[e]||e,a=this.page.locator("ms-model-selector-two-column");if(await a.count()===0)return r("\u672A\u627E\u5230\u6A21\u578B\u9009\u62E9\u5668\uFF0C\u8DF3\u8FC7\u6A21\u578B\u8BBE\u7F6E\u3002"),!1;if((await a.locator(".model-option-content .gmat-body-medium").textContent())?.trim()===o)return r("\u5F53\u524D\u5DF2\u662F\u76EE\u6807\u6A21\u578B\uFF0C\u65E0\u9700\u5207\u6362\u3002"),!0;await a.click({timeout:5e3});let s=this.page.locator(".mat-mdc-select-panel");await s.waitFor({state:"visible",timeout:5e3});let i=s.locator("mat-option.model-option",{hasText:o});return await i.count()>0?(await i.first().click({timeout:5e3}),await this.page.waitForTimeout(1e3),r(`\u6A21\u578B\u5DF2\u6210\u529F\u8BBE\u7F6E\u4E3A: ${o}`),!0):(r(`\u672A\u5728\u4E0B\u62C9\u83DC\u5355\u4E2D\u627E\u5230\u76EE\u6807\u6A21\u578B: ${o}`),await this.page.keyboard.press("Escape"),!1)}catch(o){o("\u8BBE\u7F6E\u6A21\u578B\u65F6\u53D1\u751F\u9519\u8BEF:",o);try{await this.page.keyboard.press("Escape")}catch{}return!1}}async setTemperature(e){try{let o=this.page.locator('[data-test-id="temperatureSliderContainer"]');if(await o.count()===0)return r("\u672A\u627E\u5230\u6E29\u5EA6\u8BBE\u7F6E\u5BB9\u5668\uFF0C\u8DF3\u8FC7\u3002"),!1;let a=o.locator('input[type="number"]');return await a.count()>0?(await a.fill(e.toString()),await a.dispatchEvent("change"),r(`\u6E29\u5EA6\u5DF2\u8BBE\u7F6E\u4E3A: ${e}`),!0):(r("\u672A\u627E\u5230\u6E29\u5EA6\u6570\u5B57\u8F93\u5165\u6846\uFF0C\u8DF3\u8FC7\u8BBE\u7F6E\u3002"),!1)}catch(o){return o("\u8BBE\u7F6E\u6E29\u5EA6\u65F6\u51FA\u9519:",o),!1}}async processMessage(e,o={}){if(r("\u5F00\u59CB\u5904\u7406\u6D88\u606F..."),!await this.waitForPageLoad())throw new Error("\u9875\u9762\u52A0\u8F7D\u5931\u8D25\u3002");if(o.model&&await this.setModel(o.model),o.temperature!==void 0&&await this.setTemperature(o.temperature),!await this.fillMessage(e))throw new Error("\u6D88\u606F\u586B\u5199\u5931\u8D25\u3002");if(await this.waitForSendButtonEnabled(),!await this.sendMessage())throw new Error("\u6D88\u606F\u53D1\u9001\u5931\u8D25\u3002");return r("\u6D88\u606F\u53D1\u9001\u6210\u529F\uFF0C\u7B49\u5F85\u7F51\u7EDC\u62E6\u622A\u83B7\u53D6\u54CD\u5E94\u3002"),!0}};S();var j=class{TARGET_URL_PATTERN=new RegExp("MakerSuiteService/GenerateContent");constructor(e,o,a){this.page=e,this.onStreamChunk=o,this.onStreamEnd=a,this.isActive=!1,this.routeHandler=this._handleRoute.bind(this)}async activate(){this.isActive||(r("[InterceptorV2] \u6FC0\u6D3B\u7F51\u7EDC\u8DEF\u7531\u62E6\u622A..."),await this.page.route(this.TARGET_URL_PATTERN,this.routeHandler),this.isActive=!0,r(`[InterceptorV2] \u62E6\u622A\u5668\u5DF2\u6FC0\u6D3B\uFF0C\u76D1\u542C URL pattern: ${this.TARGET_URL_PATTERN}`))}async deactivate(){if(this.isActive){r("[InterceptorV2] \u505C\u7528\u7F51\u7EDC\u8DEF\u7531\u62E6\u622A...");try{await this.page.unroute(this.TARGET_URL_PATTERN,this.routeHandler),this.isActive=!1,r("[InterceptorV2] \u62E6\u622A\u5668\u5DF2\u505C\u7528\u3002")}catch(e){g(`[InterceptorV2] \u505C\u7528\u62E6\u622A\u5668\u65F6\u51FA\u9519: ${e.message}`)}}}async _handleRoute(e,o){r(`[InterceptorV2] \u62E6\u622A\u5230\u76EE\u6807\u8BF7\u6C42: ${o.method()} ${o.url()}`);try{await e.fulfill({status:200,contentType:"application/json",body:JSON.stringify({message:"Request handled by backend interceptor."})}),r("[InterceptorV2] \u5DF2\u5411\u6D4F\u89C8\u5668\u53D1\u9001\u4F2A\u9020\u7684\u6210\u529F\u54CD\u5E94\u3002")}catch(a){g(`[InterceptorV2] Fulfill \u539F\u59CB\u8BF7\u6C42\u5931\u8D25: ${a.message}`),e.isFulfillable()&&await e.abort().catch(n=>g(`[InterceptorV2] Abort \u8BF7\u6C42\u4E5F\u5931\u8D25: ${n.message}`));return}try{r("[InterceptorV2] \u6B63\u5728\u4F7F\u7528 Node.js fetch \u91CD\u65B0\u53D1\u9001\u8BF7\u6C42...");let a=await o.headers();delete a["x-playwright-api-request"],delete a["content-length"];let n=await fetch(o.url(),{method:o.method(),headers:a,body:o.postDataBuffer()});if(!n.ok){let m=await n.text();this.onStreamChunk(m);return}if(!n.body)throw new Error("\u540E\u7AEF fetch \u54CD\u5E94\u4E2D\u6CA1\u6709 body\u3002");r("[InterceptorV2] \u5F00\u59CB\u4ECE\u540E\u7AEF fetch \u63A5\u6536\u6D41\u5F0F\u6570\u636E...");let s=n.body.getReader(),i=new TextDecoder;for(;;){let{done:m,value:u}=await s.read();if(m)break;let c=i.decode(u,{stream:!0});this.onStreamChunk(c)}r("[InterceptorV2] \u6D41\u63A5\u6536\u5B8C\u6BD5\u3002"),this.onStreamEnd()}catch(a){g("[InterceptorV2] \u540E\u7AEF\u5904\u7406\u8BF7\u6C42\u65F6\u53D1\u751F\u4E25\u91CD\u9519\u8BEF:",a),this.onStreamEnd()}}};S();function Qe(t){return t.includes("The caller does not have permission")?($("\u68C0\u6D4B\u5230\u6743\u9650\u9519\u8BEF\uFF0C\u5C06\u89E6\u53D1\u91CD\u8BD5\u673A\u5236\u3002"),{permissionError:!0,content:"\u65E0\u6743\u8BBF\u95EE AI Studio\u3002\u8BF7\u68C0\u67E5 Cookie \u6216\u767B\u5F55\u72B6\u6001\u3002"}):null}function be(t){let e=[];if(!t)return e;if(Array.isArray(t)){if(t.length>=2&&t[0]===null&&typeof t[1]=="string"&&t[1]&&t[1]!=="model"){let o=t.length>2?"thinking":"text";e.push({type:o,content:t[1].replace(/\\n/g,`
14
+ `).replace(/\\"/g,'"')})}for(let o of t)e.push(...be(o))}return e}function Q(t){let e=Qe(t);if(e)return e;try{let s=t.trim().replace(/\n/g,",").replace(/,+/g,",");s.endsWith(",")&&(s=s.slice(0,-1)),s.startsWith("[")||(s="["+s),s.endsWith("]")||(s=s+"]"),s=s.replace(/,]/g,"]").replace(/\[,/g,"[");let i=JSON.parse(s),m=be(i);if(m.length>0){let u=!1;return m.map(c=>(u?c.type="text":c.type==="text"&&(u=!0),c))}}catch{}let o=/\[null,\s*"((?:\\"|[^"])*)"/g,a=[],n;for(;(n=o.exec(t))!==null;)try{let s=n[1].replace(/\\n/g,`
15
+ `).replace(/\\"/g,'"');if(s&&s!=="model"){let i=s.trim().startsWith("**")?"thinking":"text";a.push({type:i,content:s})}}catch{}if(a.length>0){let s=!1;return a.map(i=>(s?i.type="text":i.type==="text"&&(s=!0),i))}return null}function Se(t,e,o="gemini-pro"){return{id:`chatcmpl-${Date.now()}`,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:o,choices:[{index:0,delta:{content:t||"",type:e||"text"},logprobs:null,finish_reason:null}]}}function Z(t,e="gemini-pro"){return{object:"error",message:t,type:"invalid_request_error",model:e}}function xe(t,e="gemini-pro"){return{id:`chatcmpl-${Date.now()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:e,choices:[{index:0,message:{role:"assistant",content:t},finish_reason:"stop"}],usage:{prompt_tokens:0,completion_tokens:0,total_tokens:0}}}S();var B=3,Ee=100;function Ze(t){let e=t.message.toLowerCase();return["timeout","navigation failed","page crashed","target closed","element not found","is not visible","\u65E0\u6CD5\u627E\u5230","not find","cannot find"].some(a=>e.includes(a))}function et(t){let e=t.message.toLowerCase();return["permission","unauthorized","\u65E0\u6743\u8BBF\u95EE","cookie","\u767B\u5F55"].some(a=>e.includes(a))}async function Pe(t,e,o){let a=null,n=null;try{a=await U();for(let s=1;s<=B;s++)try{r(`[\u5C1D\u8BD5 ${s}/${B}] \u5F00\u59CB\u5904\u7406\u8BF7\u6C42...`),await G(a,l.aiStudio.url,{timeout:l.aiStudio.pageTimeout});let i=await o(a,t,e);return await k(a),i}catch(i){if(n=i,$(`[\u5C1D\u8BD5 ${s}/${B}] \u5931\u8D25: ${i.message}`),(et(i)||Ze(i))&&s<B)r(`\u68C0\u6D4B\u5230\u53EF\u91CD\u8BD5\u7684\u9519\u8BEF\uFF08\u6743\u9650\u6216\u9875\u9762\u72B6\u6001\uFF09\uFF0C\u5C06\u5728 ${Ee}ms \u540E\u91CD\u8BD5...`),await new Promise(m=>setTimeout(m,Ee));else throw i("\u9519\u8BEF\u4E0D\u53EF\u91CD\u8BD5\u6216\u5DF2\u8FBE\u5230\u6700\u5927\u91CD\u8BD5\u6B21\u6570\uFF0C\u5C06\u629B\u51FA\u5F02\u5E38\u3002"),i}}catch(s){throw s("\u5904\u7406 AI Studio \u8BF7\u6C42\u6700\u7EC8\u5931\u8D25:",s),a&&await k(a),n||s}}async function $e(t,e,o={}){let a=o.model||l.api.defaultModel;try{await Pe(t,o,async(n,s,i)=>new Promise(async(m,u)=>{let c=!1,p="",f=new Set,d=null,h=!1,T=y=>{c||(c=!0,d&&d.deactivate().catch(g),y?u(y):m())},x=y=>{if(c)return;p+=y;let E=Q(p);if(E?.permissionError)return T(new Error(E.content));if(Array.isArray(E)&&E.length>0)for(let b of E){let R=`${b.type}::${b.content}`;b.content?.trim()&&!f.has(R)&&(b.type==="text"&&(h=!0),!h||b.type==="text"?(e.enqueue(`data: ${JSON.stringify(Se(b.content,b.type,a))}
16
 
17
+ `),f.add(R)):r('[State Filter] Ignoring "thinking" chunk because text output has already begun.'))}},I=()=>{c||(r("\u6D41\u5DF2\u7ED3\u675F\uFF0C\u53D1\u9001 [DONE] \u4FE1\u53F7\u3002"),e.enqueue(`data: [DONE]
18
 
19
+ `),e.close(),T())};try{d=new j(n,x,I),await d.activate(),await new N(n).processMessage(s,i),setTimeout(()=>{c||T(new Error("AI Studio \u54CD\u5E94\u8D85\u65F6\u3002"))},l.aiStudio.responseTimeout)}catch(y){T(y)}}))}catch(n){if(e.desiredSize!==null)try{e.enqueue(`data: ${JSON.stringify(Z(n.message,a))}
20
 
21
  `),e.enqueue(`data: [DONE]
22
 
23
+ `),e.close()}catch(s){n("\u5173\u95ED\u6D41\u63A7\u5236\u5668\u65F6\u51FA\u9519:",s)}}}async function ve(t,e={}){let o=e.model||l.api.defaultModel;try{return await Pe(t,e,async(a,n,s)=>new Promise(async(i,m)=>{let u="",c=async p=>{if(p.url().includes("GenerateContent"))try{let f=await p.text(),d=Q(f);if(d?.permissionError)return m(new Error(d.content));Array.isArray(d)&&(u+=d.filter(h=>h.type==="text").map(h=>h.content).join("")),a.removeListener("response",c),i(xe(u,o))}catch(f){m(f)}};a.on("response",c);try{await new N(a).processMessage(n,s),setTimeout(()=>{a.removeListener("response",c),m(new Error("AI Studio \u54CD\u5E94\u8D85\u65F6\u3002"))},l.aiStudio.responseTimeout)}catch(p){a.removeListener("response",c),m(p)}}))}catch(a){return Z(a.message,o)}}async function Ce(t){try{ye(t);let e=await tt(t),{prompt:o,stream:a,model:n,temperature:s}=we(e);return a?(fe(t),new ReadableStream({start(m){$e(o,m,{model:n,temperature:s})}})):await ve(o,{model:n,temperature:s})}catch(e){throw console.error("\u5904\u7406\u804A\u5929\u8BF7\u6C42\u65F6\u51FA\u9519:",e),e.statusCode?e:ot({statusCode:500,statusMessage:e.message||"An internal server error occurred."})}}import{createError as V}from"h3";async function Te(t){try{let e=Object.values(l.models).map(o=>({id:o.id,object:o.object,created:o.created,owned_by:o.owned_by,permission:o.permission,root:o.root,parent:o.parent}));return e.sort((o,a)=>a.created-o.created),{object:"list",data:e}}catch(e){throw console.error("\u83B7\u53D6\u6A21\u578B\u5217\u8868\u65F6\u51FA\u9519:",e),V({statusCode:500,statusMessage:"Failed to retrieve models list."})}}async function Ie(t){try{let e=t.context.params?.model;if(!e)throw V({statusCode:400,statusMessage:"Model ID is required."});let o=l.models[e];if(!o)throw V({statusCode:404,statusMessage:`Model '${e}' not found.`});return{id:o.id,object:o.object,created:o.created,owned_by:o.owned_by,permission:o.permission,root:o.root,parent:o.parent}}catch(e){throw console.error(`\u83B7\u53D6\u6A21\u578B '${t.context.params?.model}' \u4FE1\u606F\u65F6\u51FA\u9519:`,e),e.statusCode?e:V({statusCode:500,statusMessage:"Failed to retrieve model information."})}}L();S();var C=new rt,ke=process.cwd();ue();C.use("*",he);C.get("/health",ge);C.get("/v1/models",Te);C.get("/v1/models/:model",Ie);C.post("/v1/chat/completions",Ce);C.get("/screenshots/**",t=>{let e=t.path.substring(12),o=_e(ke,"screenshots",e);return Me(t,{getContents:()=>Ae(o),getMeta:async()=>{let a=await Re(o).catch(()=>{});if(a?.isFile())return{size:a.size,mtime:a.mtimeMs}}})});C.get("/**",t=>{let e=t.path==="/"?"index.html":t.path,o=_e(ke,"public",e);return Me(t,{getContents:()=>Ae(o),getMeta:async()=>{let a=await Re(o).catch(()=>{});if(a?.isFile())return{size:a.size,mtime:a.mtimeMs}}})});r("\u{1F527} \u521D\u59CB\u5316\u9875\u9762\u6C60...");ne(5);process.env.NODE_ENV!=="production"&&(r("\u{1F4CA} \u542F\u52A8\u9875\u9762\u6C60\u76D1\u63A7..."),pe(1e4));var D=l.server.port,F=l.server.host;at(C,{port:D,host:F});r(`\u{1F680} \u670D\u52A1\u5668\u8FD0\u884C\u5728 http://${F}:${D}`);r(`\u{1F3E0} \u7BA1\u7406\u9762\u677F: http://${F}:${D}/`);r(`\u{1F4CB} \u5065\u5EB7\u68C0\u67E5: http://${F}:${D}/health`);r(`\u{1F4AC} \u804A\u5929\u7AEF\u70B9: http://${F}:${D}/v1/chat/completions`);r(`\u{1F3AF} AI Studio URL: ${l.aiStudio.url}`);r(`\u{1F30D} \u73AF\u5883: ${process.env.NODE_ENV||"development"}`);async function st(){let t;try{r("\u{1F4F8} \u5F00\u59CB\u83B7\u53D6AI Studio\u9875\u9762\u622A\u56FE..."),t=await U(),r(`\u{1F310} \u667A\u80FD\u5BFC\u822A\u5230: ${l.aiStudio.url}`),await G(t,l.aiStudio.url,{timeout:l.aiStudio.pageTimeout}),await z(t),await t.waitForTimeout(2e3);let e=await J(t,"./screenshots","aistudio-startup",!1);r(`\u2705 AI Studio\u622A\u56FE\u5DF2\u4FDD\u5B58: ${e}`)}catch(e){g("\u274C \u622A\u56FEAI Studio\u9875\u9762\u65F6\u51FA\u9519:",e.message)}finally{t&&(await k(t),r("\u{1F504} \u9875\u9762\u5DF2\u91CA\u653E\u56DE\u6C60\u4E2D"))}}setTimeout(()=>{r(`
24
+ \u{1F4CA} \u521D\u59CB\u9875\u9762\u6C60\u72B6\u6001:`),de()},1e3);setTimeout(()=>{st()},2e3);
package-lock.json CHANGED
@@ -10,6 +10,8 @@
10
  "license": "MIT",
11
  "dependencies": {
12
  "dotenv": "^17.0.1",
 
 
13
  "h3": "^2.0.0-beta.1",
14
  "playwright": "^1.53.2"
15
  },
@@ -443,6 +445,18 @@
443
  "node": ">=18"
444
  }
445
  },
 
 
 
 
 
 
 
 
 
 
 
 
446
  "node_modules/@types/node": {
447
  "version": "20.19.4",
448
  "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.4.tgz",
@@ -453,12 +467,97 @@
453
  "undici-types": "~6.21.0"
454
  }
455
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  "node_modules/cookie-es": {
457
  "version": "2.0.0",
458
  "resolved": "https://registry.npmmirror.com/cookie-es/-/cookie-es-2.0.0.tgz",
459
  "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==",
460
  "license": "MIT"
461
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
462
  "node_modules/dotenv": {
463
  "version": "17.0.1",
464
  "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-17.0.1.tgz",
@@ -471,6 +570,12 @@
471
  "url": "https://dotenvx.com"
472
  }
473
  },
 
 
 
 
 
 
474
  "node_modules/esbuild": {
475
  "version": "0.25.5",
476
  "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.5.tgz",
@@ -512,12 +617,60 @@
512
  "@esbuild/win32-x64": "0.25.5"
513
  }
514
  },
 
 
 
 
 
 
 
 
 
515
  "node_modules/fetchdts": {
516
  "version": "0.1.5",
517
  "resolved": "https://registry.npmmirror.com/fetchdts/-/fetchdts-0.1.5.tgz",
518
  "integrity": "sha512-GCxyHdCCUm56atms+sIjOsAENvhebk3HAM1CfzgKCgMRjPUylpkkPmNknsaXe1gDRqM3cJbMhpkXMhCzXSE+Jg==",
519
  "license": "MIT"
520
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
  "node_modules/fsevents": {
522
  "version": "2.3.2",
523
  "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
@@ -532,6 +685,16 @@
532
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
533
  }
534
  },
 
 
 
 
 
 
 
 
 
 
535
  "node_modules/h3": {
536
  "version": "2.0.0-beta.1",
537
  "resolved": "https://registry.npmmirror.com/h3/-/h3-2.0.0-beta.1.tgz",
@@ -555,6 +718,68 @@
555
  }
556
  }
557
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
558
  "node_modules/playwright": {
559
  "version": "1.53.2",
560
  "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.53.2.tgz",
@@ -603,12 +828,57 @@
603
  "node": ">=20.16.0"
604
  }
605
  },
 
 
 
 
 
 
606
  "node_modules/undici-types": {
607
  "version": "6.21.0",
608
  "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
609
  "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
610
  "dev": true,
611
  "license": "MIT"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
612
  }
613
  }
614
  }
 
10
  "license": "MIT",
11
  "dependencies": {
12
  "dotenv": "^17.0.1",
13
+ "fingerprint-generator": "^2.1.69",
14
+ "fingerprint-injector": "^2.1.69",
15
  "h3": "^2.0.0-beta.1",
16
  "playwright": "^1.53.2"
17
  },
 
445
  "node": ">=18"
446
  }
447
  },
448
+ "node_modules/@sindresorhus/is": {
449
+ "version": "4.6.0",
450
+ "resolved": "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz",
451
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
452
+ "license": "MIT",
453
+ "engines": {
454
+ "node": ">=10"
455
+ },
456
+ "funding": {
457
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
458
+ }
459
+ },
460
  "node_modules/@types/node": {
461
  "version": "20.19.4",
462
  "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.4.tgz",
 
467
  "undici-types": "~6.21.0"
468
  }
469
  },
470
+ "node_modules/adm-zip": {
471
+ "version": "0.5.16",
472
+ "resolved": "https://registry.npmmirror.com/adm-zip/-/adm-zip-0.5.16.tgz",
473
+ "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
474
+ "license": "MIT",
475
+ "engines": {
476
+ "node": ">=12.0"
477
+ }
478
+ },
479
+ "node_modules/browserslist": {
480
+ "version": "4.25.1",
481
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz",
482
+ "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==",
483
+ "funding": [
484
+ {
485
+ "type": "opencollective",
486
+ "url": "https://opencollective.com/browserslist"
487
+ },
488
+ {
489
+ "type": "tidelift",
490
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
491
+ },
492
+ {
493
+ "type": "github",
494
+ "url": "https://github.com/sponsors/ai"
495
+ }
496
+ ],
497
+ "license": "MIT",
498
+ "dependencies": {
499
+ "caniuse-lite": "^1.0.30001726",
500
+ "electron-to-chromium": "^1.5.173",
501
+ "node-releases": "^2.0.19",
502
+ "update-browserslist-db": "^1.1.3"
503
+ },
504
+ "bin": {
505
+ "browserslist": "cli.js"
506
+ },
507
+ "engines": {
508
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
509
+ }
510
+ },
511
+ "node_modules/callsites": {
512
+ "version": "3.1.0",
513
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
514
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
515
+ "license": "MIT",
516
+ "engines": {
517
+ "node": ">=6"
518
+ }
519
+ },
520
+ "node_modules/caniuse-lite": {
521
+ "version": "1.0.30001727",
522
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
523
+ "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
524
+ "funding": [
525
+ {
526
+ "type": "opencollective",
527
+ "url": "https://opencollective.com/browserslist"
528
+ },
529
+ {
530
+ "type": "tidelift",
531
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
532
+ },
533
+ {
534
+ "type": "github",
535
+ "url": "https://github.com/sponsors/ai"
536
+ }
537
+ ],
538
+ "license": "CC-BY-4.0"
539
+ },
540
  "node_modules/cookie-es": {
541
  "version": "2.0.0",
542
  "resolved": "https://registry.npmmirror.com/cookie-es/-/cookie-es-2.0.0.tgz",
543
  "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==",
544
  "license": "MIT"
545
  },
546
+ "node_modules/dot-prop": {
547
+ "version": "6.0.1",
548
+ "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-6.0.1.tgz",
549
+ "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
550
+ "license": "MIT",
551
+ "dependencies": {
552
+ "is-obj": "^2.0.0"
553
+ },
554
+ "engines": {
555
+ "node": ">=10"
556
+ },
557
+ "funding": {
558
+ "url": "https://github.com/sponsors/sindresorhus"
559
+ }
560
+ },
561
  "node_modules/dotenv": {
562
  "version": "17.0.1",
563
  "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-17.0.1.tgz",
 
570
  "url": "https://dotenvx.com"
571
  }
572
  },
573
+ "node_modules/electron-to-chromium": {
574
+ "version": "1.5.179",
575
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz",
576
+ "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==",
577
+ "license": "ISC"
578
+ },
579
  "node_modules/esbuild": {
580
  "version": "0.25.5",
581
  "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.5.tgz",
 
617
  "@esbuild/win32-x64": "0.25.5"
618
  }
619
  },
620
+ "node_modules/escalade": {
621
+ "version": "3.2.0",
622
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
623
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
624
+ "license": "MIT",
625
+ "engines": {
626
+ "node": ">=6"
627
+ }
628
+ },
629
  "node_modules/fetchdts": {
630
  "version": "0.1.5",
631
  "resolved": "https://registry.npmmirror.com/fetchdts/-/fetchdts-0.1.5.tgz",
632
  "integrity": "sha512-GCxyHdCCUm56atms+sIjOsAENvhebk3HAM1CfzgKCgMRjPUylpkkPmNknsaXe1gDRqM3cJbMhpkXMhCzXSE+Jg==",
633
  "license": "MIT"
634
  },
635
+ "node_modules/fingerprint-generator": {
636
+ "version": "2.1.69",
637
+ "resolved": "https://registry.npmmirror.com/fingerprint-generator/-/fingerprint-generator-2.1.69.tgz",
638
+ "integrity": "sha512-Sfd2cLmvVVkzVYvC8+DZWiawquksAbAzrx9+AllpLOg8qlH8votU/Ozx59Z+/70GGQDlEsk48zo7FF5S5vuTEA==",
639
+ "license": "Apache-2.0",
640
+ "dependencies": {
641
+ "generative-bayesian-network": "^2.1.69",
642
+ "header-generator": "^2.1.69",
643
+ "tslib": "^2.4.0"
644
+ },
645
+ "engines": {
646
+ "node": ">=16.0.0"
647
+ }
648
+ },
649
+ "node_modules/fingerprint-injector": {
650
+ "version": "2.1.69",
651
+ "resolved": "https://registry.npmmirror.com/fingerprint-injector/-/fingerprint-injector-2.1.69.tgz",
652
+ "integrity": "sha512-zoqMhYGJ8AkhjbC90xOLbqNSprxFeB6Mq5cIL5aBdE3U7l8RXqNu7LhHAyAZaRn0GLcoeQm8AOjxMMQtil4Ihg==",
653
+ "license": "Apache-2.0",
654
+ "dependencies": {
655
+ "fingerprint-generator": "^2.1.69",
656
+ "tslib": "^2.4.0"
657
+ },
658
+ "engines": {
659
+ "node": ">=16.0.0"
660
+ },
661
+ "peerDependencies": {
662
+ "playwright": "^1.22.2",
663
+ "puppeteer": ">= 9.x"
664
+ },
665
+ "peerDependenciesMeta": {
666
+ "playwright": {
667
+ "optional": true
668
+ },
669
+ "puppeteer": {
670
+ "optional": true
671
+ }
672
+ }
673
+ },
674
  "node_modules/fsevents": {
675
  "version": "2.3.2",
676
  "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
 
685
  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
686
  }
687
  },
688
+ "node_modules/generative-bayesian-network": {
689
+ "version": "2.1.69",
690
+ "resolved": "https://registry.npmmirror.com/generative-bayesian-network/-/generative-bayesian-network-2.1.69.tgz",
691
+ "integrity": "sha512-k8GgdPT9oCRchU4+7ofh/qpsmvSaOI0znFt/edanyWBBxLjSnjoSU97C15fGqQSdJIZ9uwsCU0RO8xnpLEX95w==",
692
+ "license": "Apache-2.0",
693
+ "dependencies": {
694
+ "adm-zip": "^0.5.9",
695
+ "tslib": "^2.4.0"
696
+ }
697
+ },
698
  "node_modules/h3": {
699
  "version": "2.0.0-beta.1",
700
  "resolved": "https://registry.npmmirror.com/h3/-/h3-2.0.0-beta.1.tgz",
 
718
  }
719
  }
720
  },
721
+ "node_modules/header-generator": {
722
+ "version": "2.1.69",
723
+ "resolved": "https://registry.npmmirror.com/header-generator/-/header-generator-2.1.69.tgz",
724
+ "integrity": "sha512-J3BK8UtPAR1Lvvfd/qlzmAS1Qb6Q2qx4K1s4FjYVrYvSQnUc7GgOAo9uacebg6WGCdP0eWxtojh7JwEd+AD2Hw==",
725
+ "license": "Apache-2.0",
726
+ "dependencies": {
727
+ "browserslist": "^4.21.1",
728
+ "generative-bayesian-network": "^2.1.69",
729
+ "ow": "^0.28.1",
730
+ "tslib": "^2.4.0"
731
+ },
732
+ "engines": {
733
+ "node": ">=16.0.0"
734
+ }
735
+ },
736
+ "node_modules/is-obj": {
737
+ "version": "2.0.0",
738
+ "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz",
739
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
740
+ "license": "MIT",
741
+ "engines": {
742
+ "node": ">=8"
743
+ }
744
+ },
745
+ "node_modules/lodash.isequal": {
746
+ "version": "4.5.0",
747
+ "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
748
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
749
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
750
+ "license": "MIT"
751
+ },
752
+ "node_modules/node-releases": {
753
+ "version": "2.0.19",
754
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
755
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
756
+ "license": "MIT"
757
+ },
758
+ "node_modules/ow": {
759
+ "version": "0.28.2",
760
+ "resolved": "https://registry.npmmirror.com/ow/-/ow-0.28.2.tgz",
761
+ "integrity": "sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q==",
762
+ "license": "MIT",
763
+ "dependencies": {
764
+ "@sindresorhus/is": "^4.2.0",
765
+ "callsites": "^3.1.0",
766
+ "dot-prop": "^6.0.1",
767
+ "lodash.isequal": "^4.5.0",
768
+ "vali-date": "^1.0.0"
769
+ },
770
+ "engines": {
771
+ "node": ">=12"
772
+ },
773
+ "funding": {
774
+ "url": "https://github.com/sponsors/sindresorhus"
775
+ }
776
+ },
777
+ "node_modules/picocolors": {
778
+ "version": "1.1.1",
779
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
780
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
781
+ "license": "ISC"
782
+ },
783
  "node_modules/playwright": {
784
  "version": "1.53.2",
785
  "resolved": "https://registry.npmmirror.com/playwright/-/playwright-1.53.2.tgz",
 
828
  "node": ">=20.16.0"
829
  }
830
  },
831
+ "node_modules/tslib": {
832
+ "version": "2.8.1",
833
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
834
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
835
+ "license": "0BSD"
836
+ },
837
  "node_modules/undici-types": {
838
  "version": "6.21.0",
839
  "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
840
  "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
841
  "dev": true,
842
  "license": "MIT"
843
+ },
844
+ "node_modules/update-browserslist-db": {
845
+ "version": "1.1.3",
846
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
847
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
848
+ "funding": [
849
+ {
850
+ "type": "opencollective",
851
+ "url": "https://opencollective.com/browserslist"
852
+ },
853
+ {
854
+ "type": "tidelift",
855
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
856
+ },
857
+ {
858
+ "type": "github",
859
+ "url": "https://github.com/sponsors/ai"
860
+ }
861
+ ],
862
+ "license": "MIT",
863
+ "dependencies": {
864
+ "escalade": "^3.2.0",
865
+ "picocolors": "^1.1.1"
866
+ },
867
+ "bin": {
868
+ "update-browserslist-db": "cli.js"
869
+ },
870
+ "peerDependencies": {
871
+ "browserslist": ">= 4.21.0"
872
+ }
873
+ },
874
+ "node_modules/vali-date": {
875
+ "version": "1.0.0",
876
+ "resolved": "https://registry.npmmirror.com/vali-date/-/vali-date-1.0.0.tgz",
877
+ "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==",
878
+ "license": "MIT",
879
+ "engines": {
880
+ "node": ">=0.10.0"
881
+ }
882
  }
883
  }
884
  }
package.json CHANGED
@@ -21,6 +21,8 @@
21
  "license": "MIT",
22
  "dependencies": {
23
  "dotenv": "^17.0.1",
 
 
24
  "h3": "^2.0.0-beta.1",
25
  "playwright": "^1.53.2"
26
  },
@@ -28,4 +30,4 @@
28
  "@types/node": "^20.10.0",
29
  "esbuild": "^0.25.5"
30
  }
31
- }
 
21
  "license": "MIT",
22
  "dependencies": {
23
  "dotenv": "^17.0.1",
24
+ "fingerprint-generator": "^2.1.69",
25
+ "fingerprint-injector": "^2.1.69",
26
  "h3": "^2.0.0-beta.1",
27
  "playwright": "^1.53.2"
28
  },
 
30
  "@types/node": "^20.10.0",
31
  "esbuild": "^0.25.5"
32
  }
33
+ }