devicely 2.2.20 โ 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -84
- package/bin/devicely.js +1 -1
- package/config/devices.conf +1 -6
- package/lib/aiProviders.js +592 -1
- package/lib/aiProvidersConfig.js +171 -1
- package/lib/aiProviders_new.js +70 -0
- package/lib/androidDeviceDetection.js +1 -1
- package/lib/appMappings.js +1 -1
- package/lib/cognitiveLocator.js +1 -0
- package/lib/commanderService.js +1 -1
- package/lib/deviceDetection.js +1 -1
- package/lib/devices.js +1 -1
- package/lib/doctor.js +1 -1
- package/lib/encryption.js +1 -1
- package/lib/executor.js +1 -1
- package/lib/frontend/asset-manifest.json +3 -5
- package/lib/frontend/index.html +1 -1
- package/lib/frontend/static/css/main.ed39ba12.css +2 -0
- package/lib/frontend/static/js/main.310a0af8.js +3 -0
- package/lib/frontend/static/js/main.310a0af8.js.LICENSE.txt +59 -0
- package/lib/locatorStrategy.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/package.json +6 -7
- package/lib/public/asset-manifest.json +3 -3
- package/lib/public/index.html +1 -1
- package/lib/scriptLoader.js +1 -1
- package/lib/server.js +1 -1
- package/package.json +3 -4
- package/scripts/shell/android_device_control.enc +1 -1
- package/scripts/shell/connect_ios_usb_multi_final.enc +1 -1
- package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -1
- package/lib/advanced-logger.js +0 -1
- package/lib/aiProviders.js.strategic-backup +0 -657
- package/lib/aiProvidersConfig.js.backup +0 -218
- package/lib/commanderService.js.backup +0 -5552
- package/lib/devices.js.strategic-backup +0 -57
- package/lib/encryption.js.strategic-backup +0 -61
- package/lib/executor.js.strategic-backup +0 -107
- package/lib/hybridAI.js +0 -1
- package/lib/intelligentLocatorService.js +0 -1
- package/lib/lightweightAI.js +0 -1
- package/lib/localBuiltInAI.js +0 -1
- package/lib/localBuiltInAI_backup.js +0 -1
- package/lib/localBuiltInAI_simple.js +0 -1
- package/lib/logger-demo.js +0 -2
- package/lib/logger-integration-examples.js +0 -102
- package/lib/public/static/css/main.ed39ba12.css.map +0 -1
- package/lib/quick-start-logger.js +0 -2
- package/lib/server.js.strategic-backup +0 -6298
- package/lib/tensorflowAI.js +0 -1
- package/lib/tensorflowAI.js.strategic-backup +0 -717
- package/lib/tinyAI.js +0 -1
- package/lib/universalSessionManager.js +0 -1
package/lib/aiProviders.js
CHANGED
|
@@ -1 +1,592 @@
|
|
|
1
|
-
const _0x857294=_0x1dbe;(function(_0x2d907c,_0x9a1d35){const _0x538ef9=_0x1dbe,_0x5ba4ce=_0x2d907c();while(!![]){try{const _0x25f2b7=parseInt(_0x538ef9(0x285))/0x1*(parseInt(_0x538ef9(0x220))/0x2)+parseInt(_0x538ef9(0x243))/0x3+-parseInt(_0x538ef9(0x235))/0x4*(parseInt(_0x538ef9(0x298))/0x5)+parseInt(_0x538ef9(0x24a))/0x6*(-parseInt(_0x538ef9(0x2df))/0x7)+-parseInt(_0x538ef9(0x208))/0x8*(-parseInt(_0x538ef9(0x2f1))/0x9)+parseInt(_0x538ef9(0x25e))/0xa+-parseInt(_0x538ef9(0x207))/0xb;if(_0x25f2b7===_0x9a1d35)break;else _0x5ba4ce['push'](_0x5ba4ce['shift']());}catch(_0x4760e0){_0x5ba4ce['push'](_0x5ba4ce['shift']());}}}(_0x4d7a,0xe924f));const {OpenAI}=require('openai'),{GoogleGenerativeAI}=require(_0x857294(0x292)),{Anthropic}=require(_0x857294(0x2ce)),{getPackageId,APP_MAPPINGS}=require(_0x857294(0x300)),Logger=require(_0x857294(0x2b7)),logger=new Logger(_0x857294(0x224)),LocalBuiltInAI=require(_0x857294(0x28b));class AIProviderManager{constructor(){const _0x34e9b9=_0x857294,_0x133efb={};_0x133efb[_0x34e9b9(0x252)]='local';const _0x21f385=_0x133efb;this[_0x34e9b9(0x293)]=process.env.AI_PROVIDER||_0x21f385[_0x34e9b9(0x252)],this['model']=process.env.AI_MODEL||null,this[_0x34e9b9(0x26e)]=new LocalBuiltInAI(),this[_0x34e9b9(0x23d)]();}[_0x857294(0x23d)](){const _0x74f5ca=_0x857294,_0x5b05b2={};_0x5b05b2[_0x74f5ca(0x1eb)]='4|3|0|1|2|6|5',_0x5b05b2[_0x74f5ca(0x211)]=_0x74f5ca(0x24c),_0x5b05b2[_0x74f5ca(0x2b1)]=_0x74f5ca(0x1ff),_0x5b05b2[_0x74f5ca(0x299)]=_0x74f5ca(0x29c),_0x5b05b2['EnMMb']=_0x74f5ca(0x289);const _0x3584f6=_0x5b05b2,_0x306cc4=_0x3584f6[_0x74f5ca(0x1eb)][_0x74f5ca(0x2e2)]('|');let _0x19f018=0x0;while(!![]){switch(_0x306cc4[_0x19f018++]){case'0':if(process.env.CLAUDE_API_KEY){const _0x2402d2={};_0x2402d2['apiKey']=process.env.CLAUDE_API_KEY,this[_0x74f5ca(0x218)]=new Anthropic(_0x2402d2);}continue;case'1':if(process.env.GITHUB_TOKEN){const _0x46a626={};_0x46a626['apiKey']=process.env.GITHUB_TOKEN,_0x46a626['baseURL']=_0x3584f6[_0x74f5ca(0x211)],this[_0x74f5ca(0x1f4)]=new OpenAI(_0x46a626);}continue;case'2':if(process.env.GROQ_API_KEY){const _0x507f08={};_0x507f08[_0x74f5ca(0x253)]=process.env.GROQ_API_KEY,_0x507f08[_0x74f5ca(0x1fa)]=_0x3584f6['MtPVx'],this[_0x74f5ca(0x1ee)]=new OpenAI(_0x507f08);}continue;case'3':process.env.GEMINI_API_KEY&&(this['gemini']=new GoogleGenerativeAI(process.env.GEMINI_API_KEY));continue;case'4':if(process.env.OPENAI_API_KEY){const _0xa69fe4={};_0xa69fe4[_0x74f5ca(0x253)]=process.env.OPENAI_API_KEY,this[_0x74f5ca(0x263)]=new OpenAI(_0xa69fe4);}continue;case'5':if(process.env.MISTRAL_API_KEY){const _0x3424b9={};_0x3424b9[_0x74f5ca(0x253)]=process.env.MISTRAL_API_KEY,_0x3424b9[_0x74f5ca(0x1fa)]=_0x3584f6[_0x74f5ca(0x299)],this[_0x74f5ca(0x250)]=new OpenAI(_0x3424b9);}continue;case'6':if(process.env.COHERE_API_KEY){const _0x1936c0={};_0x1936c0[_0x74f5ca(0x253)]=process.env.COHERE_API_KEY,_0x1936c0[_0x74f5ca(0x1fa)]=_0x3584f6[_0x74f5ca(0x1fe)],this[_0x74f5ca(0x230)]=new OpenAI(_0x1936c0);}continue;}break;}}['getSystemPrompt'](_0x22e141=null){const _0xe0072a=_0x857294,_0x1f7316={};_0x1f7316[_0xe0072a(0x2d6)]=function(_0x18008a,_0x5eaf5a){return _0x18008a===_0x5eaf5a;},_0x1f7316[_0xe0072a(0x23c)]=function(_0x34f5f1,_0x2eab5b){return _0x34f5f1!==_0x2eab5b;},_0x1f7316['CnUlX']=_0xe0072a(0x21a);const _0x226c23=_0x1f7316;let _0x29017e='';if(_0x226c23[_0xe0072a(0x2d6)](_0x22e141,'both')){if(_0x226c23[_0xe0072a(0x23c)](_0xe0072a(0x27c),_0x226c23[_0xe0072a(0x2d9)])){const _0x5ab81b=Object['keys'](APP_MAPPINGS)[_0xe0072a(0x203)](_0x2d8084=>APP_MAPPINGS[_0x2d8084][_0xe0072a(0x2d8)]&&APP_MAPPINGS[_0x2d8084]['android'])[_0xe0072a(0x241)](0x0,0x1e);_0x29017e=_0xe0072a(0x22e)+_0x5ab81b[_0xe0072a(0x306)](',\x20')+_0xe0072a(0x2c0)+_0x5ab81b[_0xe0072a(0x241)](0x0,0xf)[_0xe0072a(0x246)](_0x1e67c2=>'-\x20'+_0x1e67c2+'\x20->\x20iOS:\x20'+APP_MAPPINGS[_0x1e67c2][_0xe0072a(0x2d8)]+_0xe0072a(0x2b4)+APP_MAPPINGS[_0x1e67c2][_0xe0072a(0x1f0)])['join']('\x0a')+_0xe0072a(0x2e3);}else{const _0x5c3c19=_0x118254[_0xe0072a(0x27a)](_0x1cd3fe)[_0xe0072a(0x203)](_0x539446=>_0x3bfa36[_0x539446][_0xe0072a(0x2d8)]&&_0x3d0807[_0x539446][_0xe0072a(0x1f0)])[_0xe0072a(0x241)](0x0,0x1e);_0x22897b=_0xe0072a(0x22e)+_0x5c3c19[_0xe0072a(0x306)](',\x20')+_0xe0072a(0x2c0)+_0x5c3c19[_0xe0072a(0x241)](0x0,0xf)[_0xe0072a(0x246)](_0x579be8=>'-\x20'+_0x579be8+_0xe0072a(0x242)+_0xd906e1[_0x579be8][_0xe0072a(0x2d8)]+_0xe0072a(0x2b4)+_0x322c79[_0x579be8][_0xe0072a(0x1f0)])[_0xe0072a(0x306)]('\x0a')+_0xe0072a(0x2e3);}}else{if(_0x22e141){const _0x2b743f=Object['keys'](APP_MAPPINGS)[_0xe0072a(0x203)](_0x54972f=>APP_MAPPINGS[_0x54972f][_0x22e141])['slice'](0x0,0x32);_0x29017e='\x0a\x0aPLATFORM:\x20'+_0x22e141['toUpperCase']()+_0xe0072a(0x273)+_0x22e141+':\x20'+_0x2b743f[_0xe0072a(0x306)](',\x20')+_0xe0072a(0x2fd)+_0x2b743f[_0xe0072a(0x241)](0x0,0x14)['map'](_0x18ae29=>'-\x20'+_0x18ae29+_0xe0072a(0x248)+APP_MAPPINGS[_0x18ae29][_0x22e141])[_0xe0072a(0x306)]('\x0a')+'\x0a';}}return'You\x20are\x20a\x20COMPLETE\x20mobile\x20automation\x20AI.\x20Convert\x20ENTIRE\x20natural\x20language\x20requests\x20to\x20executable\x20commands.\x0a\x0a๐จ\x20CRITICAL:\x20PROCESS\x20THE\x20COMPLETE\x20INPUT\x20-\x20DON\x27T\x20STOP\x20EARLY!\x20๐จ\x0a\x0aAvailable\x20commands\x20(work\x20on\x20both\x20iOS\x20&\x20Android):\x0a-\x20launch\x20<app_name>:\x20Launch\x20an\x20app\x20using\x20generic\x20name\x20(e.g.,\x20\x22launch\x20settings\x22,\x20\x22launch\x20chrome\x22)\x0a-\x20kill\x20<app_name>:\x20Close/force\x20stop\x20an\x20app\x0a-\x20home:\x20Go\x20to\x20home\x20screen\x20(press\x20home\x20button)\x0a-\x20back:\x20Navigate\x20back\x20(Android/iOS)\x0a-\x20url\x20<url>:\x20Open\x20URL\x20in\x20browser\x0a-\x20click\x20<text>:\x20Click\x20on\x20a\x20button\x20or\x20element\x20by\x20visible\x20text\x0a-\x20click\x20<x,y>:\x20Click\x20at\x20specific\x20coordinates\x20(e.g.,\x20click\x20500,1000)\x0a-\x20tap\x20<text/coords>:\x20Same\x20as\x20click\x0a-\x20longpress\x20<text/coords>:\x20Long\x20press\x20on\x20element\x20or\x20coordinates\x0a-\x20swipe\x20<direction>:\x20Swipe\x20up/down/left/right\x20(use\x20for\x20scrolling)\x0a-\x20type\x20<text>:\x20Type\x20text\x20into\x20focused\x20field\x20(just\x20the\x20text,\x20no\x20\x22type\x22\x20prefix)\x0a-\x20screenshot:\x20Take\x20screenshot\x0a-\x20restart:\x20Restart\x20device\x0a-\x20rotate\x20<left/right/portrait/landscape>:\x20Rotate\x20screen\x0a\x0aiOS-specific\x20commands:\x0a-\x20darkmode/lightmode:\x20Change\x20appearance\x0a-\x20airplane\x20<on/off>:\x20Toggle\x20airplane\x20mode\x0a-\x20wifi\x20<on/off>:\x20Toggle\x20WiFi\x0a-\x20volume\x20<up/down/mute>:\x20Control\x20volume\x0a\x0aAndroid-specific\x20commands:\x0a-\x20getLocators:\x20Get\x20all\x20interactive\x20elements\x20on\x20current\x20screen\x0a-\x20recent:\x20Open\x20recent\x20apps\x0a-\x20notifications:\x20Open\x20notification\x20panel\x0a-\x20quicksettings:\x20Open\x20quick\x20settings\x0a'+_0x29017e+'\x0a\x0a//\x20๐ฏ\x20ENHANCED\x20PHRASE\x20MAPPINGS\x20FOR\x20COMPLEX\x20SENTENCES:\x0a-\x20\x22launch\x20X\x20and\x20do\x20Y\x22\x20->\x20launch\x20X,\x20WAIT,\x20then\x20Y\x20commands\x0a-\x20\x22open\x20X\x20then\x20scroll\x20up\x22\x20->\x20launch\x20X,\x20WAIT,\x20swipe\x20up\x0a-\x20\x22go\x20to\x20X\x20and\x20search\x20Y\x22\x20->\x20url\x20X,\x20WAIT,\x20click\x20search,\x20WAIT,\x20type\x20Y\x0a-\x20\x22take\x20photo\x22\x20->\x20launch\x20camera,\x20WAIT,\x20tap\x20\x22capture\x20button\x22\x0a-\x20\x22go\x20back\x20and\x20open\x20Y\x22\x20->\x20back,\x20WAIT,\x20launch\x20Y\x0a-\x20\x22scroll\x20up\x20and\x20tap\x20X\x22\x20->\x20swipe\x20up,\x20WAIT,\x20click\x20X\x0a\x0a//\x20๐ฏ\x20COMPLEX\x20SENTENCE\x20EXAMPLES:\x0a\x22launch\x20camera\x20and\x20take\x20photo\x22\x20->\x0alaunch\x20camera\x0aWAIT\x203000\x0ascreenshot\x0a\x0a\x22open\x20settings\x20then\x20scroll\x20up\x20and\x20go\x20back\x22\x20->\x0alaunch\x20settings\x0aWAIT\x202000\x0aswipe\x20up\x0aWAIT\x201000\x0aback\x0a\x0a\x22go\x20to\x20youtube.com\x20search\x20for\x20cats\x20and\x20take\x20screenshot\x22\x20->\x0aurl\x20https://www.youtube.com\x0aWAIT\x203000\x0aclick\x20\x22search\x22\x0aWAIT\x201000\x0atype\x20\x22cats\x22\x0aWAIT\x201000\x0ascreenshot\x0a\x0a\x22launch\x20chrome\x20go\x20to\x20google.com\x20type\x20hello\x20press\x20home\x22\x20->\x0alaunch\x20chrome\x0aWAIT\x203000\x0aurl\x20https://www.google.com\x0aWAIT\x202000\x0aclick\x20\x22search\x22\x0aWAIT\x201000\x0atype\x20\x22hello\x22\x0aWAIT\x201000\x0ahome\x0a\x0aConvert\x20this\x20COMPLETE\x20request\x20to\x20commands:\x0a\x0a//\x20๐\x20๐\x20COMMON\x20PHRASE\x20MAPPINGS:\x0a-\x20\x22scroll\x20up\x22\x20OR\x20\x22scroll\x20down\x22\x20->\x20swipe\x20up\x20OR\x20swipe\x20down\x0a-\x20\x22go\x20to\x20<url>\x22\x20OR\x20\x22open\x20<url>\x22\x20OR\x20\x22visit\x20<url>\x22\x20->\x20url\x20https://<url>\x0a-\x20\x22press\x20home\x22\x20OR\x20\x22go\x20home\x22\x20OR\x20\x22home\x20button\x22\x20->\x20home\x0a-\x20\x22open\x20settings\x22\x20OR\x20\x22launch\x20settings\x22\x20->\x20launch\x20settings\x0a-\x20\x22open\x20camera\x22\x20OR\x20\x22launch\x20camera\x22\x20->\x20launch\x20camera\x0a\x0aExamples:\x0a-\x20\x22open\x20chrome\x22\x20->\x20launch\x20chrome\x0a-\x20\x22launch\x20settings\x22\x20->\x20launch\x20settings\x0a-\x20\x22open\x20camera\x22\x20->\x20launch\x20camera\x0a-\x20\x22scroll\x20up\x22\x20->\x20swipe\x20up\x0a-\x20\x22scroll\x20down\x22\x20->\x20swipe\x20down\x0a-\x20\x22click\x20on\x20the\x20login\x20button\x22\x20->\x20click\x20Login\x0a-\x20\x22tap\x20at\x20center\x20of\x20screen\x22\x20->\x20click\x20540,1000\x0a-\x20\x22swipe\x20down\x22\x20->\x20swipe\x20down\x0a-\x20\x22type\x20hello\x20world\x22\x20->\x20hello\x20world\x0a-\x20\x22take\x20a\x20screenshot\x22\x20->\x20screenshot\x0a-\x20\x22go\x20back\x22\x20->\x20back\x0a-\x20\x22press\x20home\x22\x20->\x20home\x0a-\x20\x22go\x20to\x20google.com\x22\x20->\x20url\x20https://www.google.com\x0a-\x20\x22visit\x20youtube.com\x22\x20->\x20url\x20https://www.youtube.com\x0a-\x20\x22launch\x20Chrome\x20and\x20search\x20google.com\x22\x20->\x20launch\x20chrome\x0aWAIT\x203000\x0aurl\x20https://www.google.com\x0a-\x20\x22launch\x20settings\x20scroll\x20up\x20launch\x20camera\x20go\x20to\x20google.com\x20press\x20home\x22\x20->\x0alaunch\x20settings\x0aWAIT\x203000\x0aswipe\x20up\x0aWAIT\x201000\x0ahome\x0aWAIT\x20500\x0alaunch\x20camera\x0aWAIT\x203000\x0ahome\x0aWAIT\x20500\x0aurl\x20https://www.google.com\x0aWAIT\x202000\x0ahome\x0a\x0aConvert\x20this\x20request\x20to\x20commands:\x20\x22{INPUT}\x22\x0a\x0aCRITICAL\x20RULES\x20-\x20YOU\x20MUST\x20FOLLOW\x20THESE\x20EXACTLY:\x0a1.\x20Output\x20ONLY\x20executable\x20commands,\x20one\x20per\x20line\x0a2.\x20NO\x20explanations,\x20NO\x20markdown\x20code\x20blocks,\x20NO\x20comments,\x20NO\x20extra\x20text\x0a3.\x20For\x20multi-step\x20actions,\x20insert\x20WAIT\x20<milliseconds>\x20between\x20commands\x0a4.\x20Use\x20GENERIC\x20app\x20names\x20(e.g.,\x20\x22launch\x20settings\x22,\x20\x22launch\x20chrome\x22,\x20\x22launch\x20camera\x22)\x0a5.\x20Do\x20NOT\x20use\x20platform-specific\x20package\x20IDs\x20-\x20use\x20simple\x20app\x20names\x0a6.\x20The\x20system\x20will\x20automatically\x20convert\x20to\x20correct\x20package\x20IDs\x20for\x20each\x20platform\x0a5.\x20For\x20URLs,\x20always\x20use:\x20url\x20https://example.com\x0a6.\x20For\x20scrolling,\x20use:\x20swipe\x20up\x20OR\x20swipe\x20down\x20(never\x20\x22scroll\x22)\x0a7.\x20For\x20text\x20input,\x20output\x20ONLY\x20the\x20text\x20(never\x20include\x20\x22type\x22\x20prefix)\x0a8.\x20For\x20home\x20button,\x20output:\x20home\x20(never\x20\x22press\x20home\x22\x20or\x20\x22go\x20home\x22)\x0a9.\x20WAIT\x20timings:\x20apps=3000ms,\x20pages=2000ms,\x20UI=1000ms,\x20quick=500ms\x0a10.\x20Parse\x20compound\x20requests\x20into\x20individual\x20steps\x20with\x20WAIT\x20between\x20each\x0a\x0aOUTPUT\x20FORMAT\x20EXAMPLE:\x0alaunch\x20com.apple.Preferences\x0aWAIT\x203000\x0aswipe\x20up\x0aWAIT\x201000\x0ahome\x0a\x0aDO\x20NOT\x20include\x20any\x20other\x20text.\x20Start\x20your\x20response\x20with\x20the\x20first\x20command.';}async[_0x857294(0x301)](_0x5d1c47,_0x2f63f2=null,_0x55548a=null){const _0x1d8ff1=_0x857294,_0x5ab07f={};_0x5ab07f[_0x1d8ff1(0x275)]=_0x1d8ff1(0x215),_0x5ab07f[_0x1d8ff1(0x262)]='openai',_0x5ab07f['kZMsW']=_0x1d8ff1(0x238),_0x5ab07f[_0x1d8ff1(0x1ea)]=_0x1d8ff1(0x218),_0x5ab07f[_0x1d8ff1(0x287)]='copilot',_0x5ab07f[_0x1d8ff1(0x284)]=_0x1d8ff1(0x1ee),_0x5ab07f[_0x1d8ff1(0x2cc)]=_0x1d8ff1(0x230),_0x5ab07f[_0x1d8ff1(0x271)]=function(_0x50b4c3,_0x175521){return _0x50b4c3!==_0x175521;},_0x5ab07f['MmTta']=function(_0x4db308,_0x2b9b90){return _0x4db308===_0x2b9b90;},_0x5ab07f[_0x1d8ff1(0x2cd)]='wJxSd',_0x5ab07f[_0x1d8ff1(0x21b)]=_0x1d8ff1(0x278);const _0x388939=_0x5ab07f,_0x14acfa=_0x55548a||this[_0x1d8ff1(0x293)];try{switch(_0x14acfa){case _0x388939[_0x1d8ff1(0x275)]:case _0x1d8ff1(0x24e):case'builtin':return await this[_0x1d8ff1(0x26b)](_0x5d1c47,_0x2f63f2);case _0x388939['gfbmS']:return await this[_0x1d8ff1(0x279)](_0x5d1c47,_0x2f63f2);case _0x388939[_0x1d8ff1(0x1f5)]:return await this[_0x1d8ff1(0x274)](_0x5d1c47,_0x2f63f2);case _0x388939[_0x1d8ff1(0x1ea)]:return await this['convertWithClaude'](_0x5d1c47,_0x2f63f2);case _0x388939[_0x1d8ff1(0x287)]:return await this[_0x1d8ff1(0x2c7)](_0x5d1c47,_0x2f63f2);case _0x388939[_0x1d8ff1(0x284)]:return await this['convertWithGroq'](_0x5d1c47,_0x2f63f2);case _0x388939['BknVx']:return await this['convertWithCohere'](_0x5d1c47,_0x2f63f2);case _0x1d8ff1(0x250):return await this[_0x1d8ff1(0x2b9)](_0x5d1c47,_0x2f63f2);default:throw new Error(_0x1d8ff1(0x29d)+_0x14acfa);}}catch(_0x29d46f){logger[_0x1d8ff1(0x256)]('Error\x20with\x20'+_0x14acfa+':',_0x29d46f[_0x1d8ff1(0x20d)]);;if(_0x388939['iTeTr'](_0x14acfa,_0x1d8ff1(0x215))&&this[_0x1d8ff1(0x26e)]){if(_0x388939[_0x1d8ff1(0x20e)](_0x388939[_0x1d8ff1(0x2cd)],_0x388939[_0x1d8ff1(0x2cd)])){logger[_0x1d8ff1(0x2e9)](_0x1d8ff1(0x2a2));;try{return await this[_0x1d8ff1(0x26b)](_0x5d1c47,_0x2f63f2);}catch(_0x2400a5){logger[_0x1d8ff1(0x256)](_0x388939[_0x1d8ff1(0x21b)],_0x2400a5[_0x1d8ff1(0x20d)]);;}}else return this[_0x1d8ff1(0x293)]=_0x22fdbb,_0x2097ef&&(this[_0x1d8ff1(0x2ba)]=_0x35eb69),!![];}throw new Error(_0x1d8ff1(0x296)+_0x14acfa+_0x1d8ff1(0x21e)+_0x29d46f[_0x1d8ff1(0x20d)]);}}[_0x857294(0x2b0)](_0x2bb7d0){const _0x303f21=_0x857294,_0x22d906={};_0x22d906[_0x303f21(0x2d4)]=_0x303f21(0x23f),_0x22d906[_0x303f21(0x2bd)]=_0x303f21(0x2a7),_0x22d906[_0x303f21(0x20c)]=_0x303f21(0x1e9),_0x22d906['rczYm']=_0x303f21(0x305),_0x22d906['LdkDB']=_0x303f21(0x2ef),_0x22d906[_0x303f21(0x2fc)]=_0x303f21(0x2dd),_0x22d906[_0x303f21(0x2ed)]=_0x303f21(0x283);const _0x3d7776=_0x22d906;if(this[_0x303f21(0x2ba)])return this['model'];const _0x8e6db7={};_0x8e6db7[_0x303f21(0x263)]='gpt-4o-mini',_0x8e6db7[_0x303f21(0x238)]=_0x3d7776[_0x303f21(0x2d4)],_0x8e6db7[_0x303f21(0x218)]=_0x3d7776[_0x303f21(0x2bd)],_0x8e6db7['copilot']=_0x3d7776['UFTjj'],_0x8e6db7[_0x303f21(0x1ee)]=_0x3d7776['rczYm'],_0x8e6db7['cohere']=_0x3d7776[_0x303f21(0x2bc)],_0x8e6db7['mistral']=_0x3d7776[_0x303f21(0x2fc)];const _0x4f465b=_0x8e6db7;return _0x4f465b[_0x2bb7d0]||_0x3d7776['kXnes'];}async[_0x857294(0x279)](_0x7c4d63,_0x2affc7=null){const _0xdac1ee=_0x857294,_0x172795={};_0x172795[_0xdac1ee(0x272)]=_0xdac1ee(0x232),_0x172795['HxhVM']=_0xdac1ee(0x263),_0x172795[_0xdac1ee(0x25d)]=_0xdac1ee(0x22b),_0x172795[_0xdac1ee(0x2aa)]=_0xdac1ee(0x2e4),_0x172795[_0xdac1ee(0x297)]=_0xdac1ee(0x2a3),_0x172795[_0xdac1ee(0x257)]=_0xdac1ee(0x209);const _0x198188=_0x172795;if(!this[_0xdac1ee(0x263)])throw new Error(_0x198188['vDmpZ']);const _0x1c63d4=this['getModelForProvider'](_0x198188[_0xdac1ee(0x213)]),_0x5d5263=await this[_0xdac1ee(0x263)][_0xdac1ee(0x239)][_0xdac1ee(0x1f9)]['create']({'model':_0x1c63d4,'messages':[{'role':_0x198188[_0xdac1ee(0x25d)],'content':this[_0xdac1ee(0x1ed)](_0x2affc7)},{'role':_0x198188['yhkhe'],'content':_0x7c4d63}],'temperature':0.3,'max_tokens':0x1f4});let _0x1604ff=_0x5d5263[_0xdac1ee(0x26c)][0x0][_0xdac1ee(0x20d)][_0xdac1ee(0x304)][_0xdac1ee(0x244)]();const _0x52a307=this[_0xdac1ee(0x2c2)](_0x1604ff),_0x134f47={};return _0x134f47[_0xdac1ee(0x2f7)]=!![],_0x134f47[_0xdac1ee(0x2fb)]=_0x52a307,_0x134f47[_0xdac1ee(0x293)]=_0x198188[_0xdac1ee(0x297)],_0x134f47['model']=_0x1c63d4,_0x134f47[_0xdac1ee(0x2fa)]=0.95,_0x134f47['processingTime']=_0x198188[_0xdac1ee(0x257)],_0x134f47;}async['convertWithGemini'](_0x5c774c,_0x55aa60=null){const _0x13526d=_0x857294,_0x7c0549={};_0x7c0549['MraWP']=_0x13526d(0x1ff),_0x7c0549[_0x13526d(0x267)]=_0x13526d(0x233),_0x7c0549['afsdY']=_0x13526d(0x2d2),_0x7c0549[_0x13526d(0x1f8)]=_0x13526d(0x2f5),_0x7c0549['ndAdz']=_0x13526d(0x2d0),_0x7c0549[_0x13526d(0x2da)]=_0x13526d(0x209),_0x7c0549[_0x13526d(0x259)]=function(_0x4e4dd4,_0x80a2c){return _0x4e4dd4===_0x80a2c;},_0x7c0549[_0x13526d(0x251)]='mgnlv',_0x7c0549[_0x13526d(0x217)]=function(_0x580f57,_0x3d506c){return _0x580f57!==_0x3d506c;},_0x7c0549[_0x13526d(0x1f1)]=function(_0x20ab84,_0x5c665e){return _0x20ab84===_0x5c665e;},_0x7c0549[_0x13526d(0x2f9)]='wuglY',_0x7c0549['VKeHS']=_0x13526d(0x23f);const _0x5889db=_0x7c0549;if(!this[_0x13526d(0x238)])throw new Error(_0x5889db[_0x13526d(0x302)]);let _0x3a1187=this[_0x13526d(0x2b0)](_0x13526d(0x238));try{const _0xa3e39a={};_0xa3e39a[_0x13526d(0x2ba)]=_0x3a1187;const _0x1fd63a=this[_0x13526d(0x238)]['getGenerativeModel'](_0xa3e39a),_0x3c7c5d=this[_0x13526d(0x1ed)](_0x55aa60)[_0x13526d(0x2e1)](_0x5889db[_0x13526d(0x1f8)],_0x5c774c),_0x55d042=_0x3c7c5d[_0x13526d(0x2e1)](/[^\x00-\x7F]/g,'\x20')['replace'](/\s+/g,'\x20')[_0x13526d(0x244)](),_0x25ecc8=await _0x1fd63a[_0x13526d(0x25f)](_0x55d042),_0x1c58a7=await _0x25ecc8['response'];let _0x4e9ddc=_0x1c58a7['text']()['trim']();const _0x20ccd8=this[_0x13526d(0x2c2)](_0x4e9ddc),_0x1f4833={};return _0x1f4833[_0x13526d(0x2f7)]=!![],_0x1f4833[_0x13526d(0x2fb)]=_0x20ccd8,_0x1f4833[_0x13526d(0x293)]=_0x5889db[_0x13526d(0x200)],_0x1f4833[_0x13526d(0x2ba)]=_0x3a1187,_0x1f4833['confidence']=0.9,_0x1f4833['processingTime']=_0x5889db[_0x13526d(0x2da)],_0x1f4833;}catch(_0x3ae9fe){if(_0x5889db[_0x13526d(0x259)](_0x5889db[_0x13526d(0x251)],_0x5889db[_0x13526d(0x251)])){if(_0x5889db['pmohS'](_0x3a1187,_0x13526d(0x23f))){if(_0x5889db[_0x13526d(0x1f1)](_0x5889db[_0x13526d(0x2f9)],_0x5889db[_0x13526d(0x2f9)])){logger[_0x13526d(0x29e)]('Gemini\x20model\x20'+_0x3a1187+_0x13526d(0x216));;const _0x913704={};_0x913704[_0x13526d(0x2ba)]=_0x13526d(0x23f);const _0x5f4f39=this[_0x13526d(0x238)][_0x13526d(0x22d)](_0x913704),_0x4a4d9b=this[_0x13526d(0x1ed)](_0x55aa60)[_0x13526d(0x2e1)](_0x5889db[_0x13526d(0x1f8)],_0x5c774c),_0x44b7bc=_0x4a4d9b['replace'](/[^\x00-\x7F]/g,'\x20')[_0x13526d(0x2e1)](/\s+/g,'\x20')[_0x13526d(0x244)](),_0x3365a5=await _0x5f4f39[_0x13526d(0x25f)](_0x44b7bc),_0x344ca1=await _0x3365a5[_0x13526d(0x2dc)],_0x103dad=this['cleanAIResponse'](_0x344ca1[_0x13526d(0x2f0)]()[_0x13526d(0x244)]()),_0xb3e53d={};return _0xb3e53d['success']=!![],_0xb3e53d['converted']=_0x103dad,_0xb3e53d[_0x13526d(0x293)]=_0x13526d(0x2d0),_0xb3e53d[_0x13526d(0x2ba)]=_0x5889db[_0x13526d(0x2a1)],_0xb3e53d['confidence']=0.85,_0xb3e53d[_0x13526d(0x2ca)]=_0x5889db[_0x13526d(0x2da)],_0xb3e53d;}else{const _0x3dfc64={};_0x3dfc64['apiKey']=_0x15ace5.env.GROQ_API_KEY,_0x3dfc64[_0x13526d(0x1fa)]=ARSueK[_0x13526d(0x2b5)],this[_0x13526d(0x1ee)]=new _0x1196e9(_0x3dfc64);}}throw _0x3ae9fe;}else throw new _0x5a8d29(_0x5889db[_0x13526d(0x267)]);}}async[_0x857294(0x2c7)](_0x3c2928,_0x9e4a47=null){const _0x2bb719=_0x857294,_0x3391d9={};_0x3391d9[_0x2bb719(0x2e8)]=_0x2bb719(0x1f4),_0x3391d9['VTXda']=_0x2bb719(0x22b);const _0x2eb0e0=_0x3391d9;if(!this[_0x2bb719(0x1f4)])throw new Error(_0x2bb719(0x1fd));const _0x49094a=this[_0x2bb719(0x2b0)](_0x2eb0e0[_0x2bb719(0x2e8)]),_0x5d3e4e={};_0x5d3e4e[_0x2bb719(0x1f2)]='user',_0x5d3e4e[_0x2bb719(0x304)]=_0x3c2928;const _0x23e892=await this[_0x2bb719(0x1f4)][_0x2bb719(0x239)]['completions'][_0x2bb719(0x2a0)]({'model':_0x49094a,'messages':[{'role':_0x2eb0e0[_0x2bb719(0x2d3)],'content':this['getSystemPrompt'](_0x9e4a47)},_0x5d3e4e],'temperature':0.3,'max_tokens':0x1f4});let _0x48836c=_0x23e892[_0x2bb719(0x26c)][0x0][_0x2bb719(0x20d)][_0x2bb719(0x304)][_0x2bb719(0x244)]();return _0x48836c=this['cleanAIResponse'](_0x48836c),_0x48836c;}async['convertWithClaude'](_0x3e3d6c,_0x1bc7ed=null){const _0x8edcac=_0x857294,_0x2300c4={};_0x2300c4['Hgvmc']=function(_0x4762fc,_0x3a9e64){return _0x4762fc===_0x3a9e64;},_0x2300c4[_0x8edcac(0x260)]=_0x8edcac(0x26f),_0x2300c4[_0x8edcac(0x2af)]=_0x8edcac(0x254),_0x2300c4[_0x8edcac(0x206)]=_0x8edcac(0x218),_0x2300c4['ptBKK']=_0x8edcac(0x209);const _0x1475d5=_0x2300c4;if(!this[_0x8edcac(0x218)]){if(_0x1475d5[_0x8edcac(0x2f2)](_0x1475d5[_0x8edcac(0x260)],_0x1475d5[_0x8edcac(0x260)]))throw new Error(_0x1475d5[_0x8edcac(0x2af)]);else{const _0x14248b={};_0x14248b[_0x8edcac(0x253)]=_0x98ce1e.env.OPENAI_API_KEY,this[_0x8edcac(0x263)]=new _0x104bba(_0x14248b);}}const _0x1bbdd3=this[_0x8edcac(0x2b0)](_0x1475d5['rjfzp']),_0x717051=this[_0x8edcac(0x1ed)](_0x1bc7ed),_0x28d8bd={};_0x28d8bd[_0x8edcac(0x1f2)]=_0x8edcac(0x2e4),_0x28d8bd[_0x8edcac(0x304)]=_0x3e3d6c;const _0x9d508={};_0x9d508[_0x8edcac(0x2ba)]=_0x1bbdd3,_0x9d508[_0x8edcac(0x2d7)]=0x1f4,_0x9d508['system']=_0x717051,_0x9d508[_0x8edcac(0x2a8)]=[_0x28d8bd],_0x9d508[_0x8edcac(0x2ae)]=0.3;const _0x3affd0=await this[_0x8edcac(0x218)][_0x8edcac(0x2a8)]['create'](_0x9d508);let _0x303c4a=_0x3affd0['content'][0x0]['text']['trim']();const _0x5980e1=this[_0x8edcac(0x2c2)](_0x303c4a),_0x289572={};return _0x289572[_0x8edcac(0x2f7)]=!![],_0x289572['converted']=_0x5980e1,_0x289572[_0x8edcac(0x293)]=_0x8edcac(0x2bf),_0x289572['model']=_0x1bbdd3,_0x289572[_0x8edcac(0x2fa)]=0.93,_0x289572[_0x8edcac(0x2ca)]=_0x1475d5['ptBKK'],_0x289572;}async[_0x857294(0x27f)](_0x31ade8,_0x545d43=null){const _0x52f872=_0x857294,_0x84a71a={};_0x84a71a[_0x52f872(0x2e0)]='OpenAI\x20not\x20configured',_0x84a71a[_0x52f872(0x2b3)]=function(_0x19aef5,_0xa8a995){return _0x19aef5===_0xa8a995;},_0x84a71a['uSxot']='DgQrm',_0x84a71a[_0x52f872(0x2ac)]='system',_0x84a71a[_0x52f872(0x29b)]=_0x52f872(0x2e4),_0x84a71a['htDCH']='Groq';const _0x337cbe=_0x84a71a;if(!this[_0x52f872(0x1ee)]){if(_0x337cbe[_0x52f872(0x2b3)](_0x52f872(0x270),_0x337cbe[_0x52f872(0x212)]))throw new _0x439b92(gkEjzU[_0x52f872(0x2e0)]);else throw new Error('Groq\x20not\x20configured');}const _0x1c656b=this[_0x52f872(0x2b0)]('groq'),_0x422bdf=await this['groq'][_0x52f872(0x239)][_0x52f872(0x1f9)][_0x52f872(0x2a0)]({'model':_0x1c656b,'messages':[{'role':_0x337cbe[_0x52f872(0x2ac)],'content':this['getSystemPrompt'](_0x545d43)},{'role':_0x337cbe[_0x52f872(0x29b)],'content':_0x31ade8}],'temperature':0.3,'max_tokens':0x1f4});let _0x2bd082=_0x422bdf[_0x52f872(0x26c)][0x0][_0x52f872(0x20d)][_0x52f872(0x304)]['trim']();const _0x172b66=this[_0x52f872(0x2c2)](_0x2bd082),_0x2ac274={};return _0x2ac274[_0x52f872(0x2f7)]=!![],_0x2ac274[_0x52f872(0x2fb)]=_0x172b66,_0x2ac274[_0x52f872(0x293)]=_0x337cbe[_0x52f872(0x2ab)],_0x2ac274[_0x52f872(0x2ba)]=_0x1c656b,_0x2ac274['confidence']=0.92,_0x2ac274[_0x52f872(0x2ca)]=_0x52f872(0x209),_0x2ac274;}async[_0x857294(0x255)](_0x92f9c,_0x507e08=null){const _0x3246ff=_0x857294,_0x28f50c={};_0x28f50c[_0x3246ff(0x23a)]=_0x3246ff(0x295),_0x28f50c[_0x3246ff(0x268)]=_0x3246ff(0x230),_0x28f50c['MbvUX']='system';const _0xbe6e81=_0x28f50c;if(!this[_0x3246ff(0x230)])throw new Error(_0xbe6e81[_0x3246ff(0x23a)]);const _0x29abdf=this[_0x3246ff(0x2b0)](_0xbe6e81[_0x3246ff(0x268)]),_0x15226c={};_0x15226c[_0x3246ff(0x1f2)]=_0x3246ff(0x2e4),_0x15226c['content']=_0x92f9c;const _0x5cbd03=await this[_0x3246ff(0x230)][_0x3246ff(0x239)]['completions'][_0x3246ff(0x2a0)]({'model':_0x29abdf,'messages':[{'role':_0xbe6e81[_0x3246ff(0x1e8)],'content':this['getSystemPrompt'](_0x507e08)},_0x15226c],'temperature':0.3,'max_tokens':0x1f4});let _0x401a2f=_0x5cbd03[_0x3246ff(0x26c)][0x0][_0x3246ff(0x20d)]['content'][_0x3246ff(0x244)]();return _0x401a2f=this['cleanAIResponse'](_0x401a2f),_0x401a2f;}async[_0x857294(0x2b9)](_0x13a221,_0x24b142=null){const _0x5959bc=_0x857294,_0x5756e1={};_0x5756e1[_0x5959bc(0x288)]=_0x5959bc(0x2ea),_0x5756e1[_0x5959bc(0x214)]=function(_0x3d4a47,_0x38c2bc){return _0x3d4a47===_0x38c2bc;},_0x5756e1['RWqju']=_0x5959bc(0x226),_0x5756e1[_0x5959bc(0x28c)]='url\x20',_0x5756e1['TSGqN']=_0x5959bc(0x27d),_0x5756e1[_0x5959bc(0x28f)]='tap\x20',_0x5756e1[_0x5959bc(0x237)]=_0x5959bc(0x2f3),_0x5756e1[_0x5959bc(0x2c4)]=_0x5959bc(0x286),_0x5756e1['JkUea']='WAIT\x20',_0x5756e1[_0x5959bc(0x21d)]='screenshot',_0x5756e1[_0x5959bc(0x21f)]=_0x5959bc(0x269),_0x5756e1['BWDwm']=_0x5959bc(0x26d),_0x5756e1['bmTds']='darkmode',_0x5756e1[_0x5959bc(0x24b)]='lightmode',_0x5756e1[_0x5959bc(0x2f8)]='airplane\x20',_0x5756e1[_0x5959bc(0x294)]=_0x5959bc(0x291),_0x5756e1[_0x5959bc(0x28a)]='volume\x20',_0x5756e1[_0x5959bc(0x282)]='getLocators',_0x5756e1[_0x5959bc(0x229)]=function(_0x149f5b,_0x9e9c97){return _0x149f5b===_0x9e9c97;},_0x5756e1[_0x5959bc(0x307)]=_0x5959bc(0x2c8),_0x5756e1[_0x5959bc(0x23e)]=_0x5959bc(0x20b),_0x5756e1[_0x5959bc(0x280)]=function(_0x7d17,_0x5d4bb4){return _0x7d17!==_0x5d4bb4;},_0x5756e1['IRmvO']=_0x5959bc(0x2ec),_0x5756e1[_0x5959bc(0x2c3)]='user';const _0x4495b9=_0x5756e1;if(!this['mistral']){if(_0x4495b9[_0x5959bc(0x280)]('PKDji',_0x4495b9[_0x5959bc(0x26a)])){_0x4cd6e9=_0x459f8e[_0x5959bc(0x2e1)](/```[\s\S]*?```/g,'')[_0x5959bc(0x244)](),_0x25761c=_0x342b23[_0x5959bc(0x2e1)](/```/g,'')[_0x5959bc(0x244)]();const _0x56eef1=_0x3fc143['split']('\x0a'),_0x2f2363=_0x56eef1['filter'](_0x5e0f76=>{const _0x470855=_0x5959bc,_0x17a00c=_0x5e0f76[_0x470855(0x244)]();if(!_0x17a00c)return![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x288)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x470855(0x29a)))return!![];if(_0x4495b9[_0x470855(0x214)](_0x17a00c,'home'))return!![];if(_0x17a00c===_0x4495b9['RWqju'])return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x28c)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x258)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x28f)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x237)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9['RJcwe']))return!![];if(_0x17a00c['startsWith'](_0x4495b9[_0x470855(0x2a9)]))return!![];if(_0x17a00c['startsWith'](_0x4495b9['nCowg']))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x21f)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x2ff)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x222)]))return!![];if(_0x17a00c['startsWith'](_0x4495b9[_0x470855(0x24b)]))return!![];if(_0x17a00c['startsWith'](_0x4495b9[_0x470855(0x2f8)]))return!![];if(_0x17a00c[_0x470855(0x234)](_0x4495b9[_0x470855(0x294)]))return!![];if(_0x17a00c['startsWith'](_0x4495b9[_0x470855(0x28a)]))return!![];if(_0x4495b9[_0x470855(0x214)](_0x17a00c,_0x4495b9[_0x470855(0x282)]))return!![];if(_0x4495b9['prgKP'](_0x17a00c,_0x470855(0x23b)))return!![];if(_0x4495b9[_0x470855(0x229)](_0x17a00c,_0x4495b9[_0x470855(0x307)]))return!![];if(_0x4495b9[_0x470855(0x229)](_0x17a00c,_0x4495b9[_0x470855(0x23e)]))return!![];return!![];});return _0x2f2363['join']('\x0a')[_0x5959bc(0x244)]();}else throw new Error(_0x5959bc(0x204));}const _0x37dd1d=this[_0x5959bc(0x2b0)](_0x5959bc(0x250)),_0xeb8e8a={};_0xeb8e8a[_0x5959bc(0x1f2)]=_0x4495b9[_0x5959bc(0x2c3)],_0xeb8e8a['content']=_0x13a221;const _0x1d08da=await this[_0x5959bc(0x250)]['chat']['completions'][_0x5959bc(0x2a0)]({'model':_0x37dd1d,'messages':[{'role':_0x5959bc(0x22b),'content':this[_0x5959bc(0x1ed)](_0x24b142)},_0xeb8e8a],'temperature':0.3,'max_tokens':0x1f4});let _0x24af41=_0x1d08da[_0x5959bc(0x26c)][0x0]['message'][_0x5959bc(0x304)][_0x5959bc(0x244)]();return _0x24af41=this['cleanAIResponse'](_0x24af41),_0x24af41;}['cleanAIResponse'](_0x11d595){const _0x33cb9c=_0x857294,_0x405a64={};_0x405a64['khoGo']=function(_0x30b9db,_0x6ee4b4){return _0x30b9db!==_0x6ee4b4;},_0x405a64['uBTez']=_0x33cb9c(0x2c9),_0x405a64[_0x33cb9c(0x281)]=_0x33cb9c(0x24d),_0x405a64[_0x33cb9c(0x2b8)]='launch\x20',_0x405a64[_0x33cb9c(0x2d5)]=_0x33cb9c(0x29a),_0x405a64[_0x33cb9c(0x219)]=_0x33cb9c(0x236),_0x405a64[_0x33cb9c(0x2eb)]=function(_0x5b46cc,_0x9cc90b){return _0x5b46cc===_0x9cc90b;},_0x405a64[_0x33cb9c(0x25a)]='back',_0x405a64[_0x33cb9c(0x303)]=_0x33cb9c(0x2e5),_0x405a64[_0x33cb9c(0x2b2)]=_0x33cb9c(0x27d),_0x405a64[_0x33cb9c(0x2ee)]=_0x33cb9c(0x1fb),_0x405a64[_0x33cb9c(0x225)]=_0x33cb9c(0x2f3),_0x405a64[_0x33cb9c(0x2ad)]=_0x33cb9c(0x286),_0x405a64[_0x33cb9c(0x205)]='screenshot',_0x405a64[_0x33cb9c(0x28d)]=_0x33cb9c(0x269),_0x405a64[_0x33cb9c(0x2fe)]=_0x33cb9c(0x26d),_0x405a64[_0x33cb9c(0x1ec)]=_0x33cb9c(0x223),_0x405a64[_0x33cb9c(0x2a6)]=_0x33cb9c(0x2c6),_0x405a64['sqDdb']=_0x33cb9c(0x25c),_0x405a64[_0x33cb9c(0x2a5)]='wifi\x20',_0x405a64[_0x33cb9c(0x231)]=_0x33cb9c(0x2b6),_0x405a64[_0x33cb9c(0x276)]=function(_0x64407f,_0x539886){return _0x64407f===_0x539886;},_0x405a64['doHVC']=function(_0x203afd,_0x492910){return _0x203afd===_0x492910;},_0x405a64[_0x33cb9c(0x21c)]='notifications';const _0x594fd3=_0x405a64;_0x11d595=_0x11d595[_0x33cb9c(0x2e1)](/```[\s\S]*?```/g,'')['trim'](),_0x11d595=_0x11d595[_0x33cb9c(0x2e1)](/```/g,'')[_0x33cb9c(0x244)]();const _0x5dc5f5=_0x11d595[_0x33cb9c(0x2e2)]('\x0a'),_0x581b25=_0x5dc5f5[_0x33cb9c(0x203)](_0x2b3396=>{const _0x499d8d=_0x33cb9c;if(_0x594fd3[_0x499d8d(0x27e)](_0x594fd3[_0x499d8d(0x245)],_0x594fd3[_0x499d8d(0x281)])){const _0x5ddda8=_0x2b3396[_0x499d8d(0x244)]();if(!_0x5ddda8)return![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x2b8)]))return!![];if(_0x5ddda8['startsWith'](_0x594fd3[_0x499d8d(0x2d5)]))return!![];if(_0x5ddda8===_0x594fd3[_0x499d8d(0x219)])return!![];if(_0x594fd3[_0x499d8d(0x2eb)](_0x5ddda8,_0x594fd3['cZDVf']))return!![];if(_0x5ddda8['startsWith'](_0x594fd3['rIdQj']))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x2b2)]))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x2ee)]))return!![];if(_0x5ddda8['startsWith'](_0x594fd3[_0x499d8d(0x225)]))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3['lCbTP']))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x499d8d(0x22a)))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3['xlAaf']))return!![];if(_0x5ddda8['startsWith'](_0x594fd3[_0x499d8d(0x28d)]))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x2fe)]))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x1ec)]))return!![];if(_0x5ddda8['startsWith'](_0x594fd3[_0x499d8d(0x2a6)]))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x240)]))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3['FQcSO']))return!![];if(_0x5ddda8[_0x499d8d(0x234)](_0x594fd3[_0x499d8d(0x231)]))return!![];if(_0x5ddda8===_0x499d8d(0x29f))return!![];if(_0x594fd3[_0x499d8d(0x276)](_0x5ddda8,'recent'))return!![];if(_0x594fd3[_0x499d8d(0x227)](_0x5ddda8,_0x594fd3[_0x499d8d(0x21c)]))return!![];if(_0x594fd3[_0x499d8d(0x2eb)](_0x5ddda8,_0x499d8d(0x20b)))return!![];return!![];}else{const _0x537655=_0x57fbdf[_0x499d8d(0x27a)](_0x13a24b)[_0x499d8d(0x203)](_0x4654f2=>_0x3d8a48[_0x4654f2][_0x4768f6])[_0x499d8d(0x241)](0x0,0x32);_0x3d62a0='\x0a\x0aPLATFORM:\x20'+_0x57447e['toUpperCase']()+_0x499d8d(0x273)+_0x1a5270+':\x20'+_0x537655['join'](',\x20')+_0x499d8d(0x2fd)+_0x537655['slice'](0x0,0x14)['map'](_0x373aa2=>'-\x20'+_0x373aa2+'\x20->\x20launch\x20'+_0x9b3cc8[_0x373aa2][_0x305a27])['join']('\x0a')+'\x0a';}});return _0x581b25[_0x33cb9c(0x306)]('\x0a')[_0x33cb9c(0x244)]();}['getAvailableProviders'](){const _0x4403ee=_0x857294,_0x59ba83={};_0x59ba83['cWRXw']=_0x4403ee(0x263),_0x59ba83['nmTkD']='gemini',_0x59ba83[_0x4403ee(0x2d1)]='Google\x20Gemini',_0x59ba83[_0x4403ee(0x2c1)]='GitHub\x20Copilot',_0x59ba83[_0x4403ee(0x1ef)]=_0x4403ee(0x1ee),_0x59ba83[_0x4403ee(0x22c)]=_0x4403ee(0x202);const _0x2b0efe=_0x59ba83,_0x122147=[],_0x2f867f={};_0x2f867f['id']=_0x2b0efe[_0x4403ee(0x22f)],_0x2f867f[_0x4403ee(0x247)]=_0x4403ee(0x2a3),_0x2f867f[_0x4403ee(0x2cf)]='๐ค';if(this[_0x4403ee(0x263)])_0x122147['push'](_0x2f867f);const _0x1bcd75={};_0x1bcd75['id']=_0x2b0efe[_0x4403ee(0x24f)],_0x1bcd75[_0x4403ee(0x247)]=_0x2b0efe[_0x4403ee(0x2d1)],_0x1bcd75['icon']='โจ';if(this[_0x4403ee(0x238)])_0x122147[_0x4403ee(0x2de)](_0x1bcd75);const _0x68d71a={};_0x68d71a['id']='claude',_0x68d71a[_0x4403ee(0x247)]=_0x4403ee(0x2bf),_0x68d71a[_0x4403ee(0x2cf)]='๐ง ';if(this[_0x4403ee(0x218)])_0x122147[_0x4403ee(0x2de)](_0x68d71a);const _0x1d11e2={};_0x1d11e2['id']='copilot',_0x1d11e2[_0x4403ee(0x247)]=_0x2b0efe[_0x4403ee(0x2c1)],_0x1d11e2[_0x4403ee(0x2cf)]='๐';if(this[_0x4403ee(0x1f4)])_0x122147[_0x4403ee(0x2de)](_0x1d11e2);const _0x57bbe6={};_0x57bbe6['id']=_0x2b0efe['xTMGG'],_0x57bbe6[_0x4403ee(0x247)]='Groq',_0x57bbe6[_0x4403ee(0x2cf)]='โก';if(this[_0x4403ee(0x1ee)])_0x122147['push'](_0x57bbe6);const _0x6701ef={};_0x6701ef['id']=_0x4403ee(0x230),_0x6701ef['name']=_0x2b0efe[_0x4403ee(0x22c)],_0x6701ef['icon']='๐';if(this['cohere'])_0x122147[_0x4403ee(0x2de)](_0x6701ef);const _0x414200={};_0x414200['id']=_0x4403ee(0x250),_0x414200[_0x4403ee(0x247)]=_0x4403ee(0x20f),_0x414200[_0x4403ee(0x2cf)]=_0x4403ee(0x27b);if(this[_0x4403ee(0x250)])_0x122147[_0x4403ee(0x2de)](_0x414200);return _0x122147;}['setProvider'](_0x50e34b,_0x198846=null){const _0xd0ef6c=_0x857294,_0x4ba3c8={};_0x4ba3c8['cBjLL']=_0xd0ef6c(0x295),_0x4ba3c8[_0xd0ef6c(0x2c5)]=function(_0x57495b,_0x2eceaa){return _0x57495b!==_0x2eceaa;};const _0x392692=_0x4ba3c8,_0x148751=this[_0xd0ef6c(0x277)]()['map'](_0x4c81d7=>_0x4c81d7['id']);if(_0x148751[_0xd0ef6c(0x2be)](_0x50e34b)){if(_0x392692[_0xd0ef6c(0x2c5)](_0xd0ef6c(0x265),_0xd0ef6c(0x290)))return this[_0xd0ef6c(0x293)]=_0x50e34b,_0x198846&&(this[_0xd0ef6c(0x2ba)]=_0x198846),!![];else throw new _0x4080c7(OitcfJ[_0xd0ef6c(0x2cb)]);}return![];}[_0x857294(0x1f6)](){const _0x59bb6b=_0x857294;return{'id':this[_0x59bb6b(0x293)],'name':this['getProviderName'](this[_0x59bb6b(0x293)]),'model':this[_0x59bb6b(0x2ba)]||this[_0x59bb6b(0x2b0)](this['provider']),'available':this['getAvailableProviders']()};}[_0x857294(0x2a4)](_0x2c9755){const _0x468a6f=_0x857294,_0x12a1ad={};_0x12a1ad[_0x468a6f(0x2f4)]=_0x468a6f(0x28e),_0x12a1ad['BYJXN']=_0x468a6f(0x2a3),_0x12a1ad['CbGhY']=_0x468a6f(0x2d0),_0x12a1ad[_0x468a6f(0x261)]=_0x468a6f(0x2bf),_0x12a1ad[_0x468a6f(0x20a)]=_0x468a6f(0x221),_0x12a1ad[_0x468a6f(0x201)]=_0x468a6f(0x202),_0x12a1ad['UfMIn']=_0x468a6f(0x2e6);const _0x107426=_0x12a1ad,_0xe2b6bb={};_0xe2b6bb[_0x468a6f(0x215)]=_0x107426['hjinF'],_0xe2b6bb[_0x468a6f(0x24e)]=_0x107426['hjinF'],_0xe2b6bb[_0x468a6f(0x2db)]=_0x468a6f(0x28e),_0xe2b6bb[_0x468a6f(0x263)]=_0x107426[_0x468a6f(0x249)],_0xe2b6bb[_0x468a6f(0x238)]=_0x107426[_0x468a6f(0x266)],_0xe2b6bb['claude']=_0x107426[_0x468a6f(0x261)],_0xe2b6bb[_0x468a6f(0x1f4)]=_0x468a6f(0x1fc),_0xe2b6bb[_0x468a6f(0x1ee)]=_0x107426[_0x468a6f(0x20a)],_0xe2b6bb['cohere']=_0x107426[_0x468a6f(0x201)],_0xe2b6bb['mistral']=_0x468a6f(0x20f);const _0x4a71f3=_0xe2b6bb;return _0x4a71f3[_0x2c9755]||_0x107426[_0x468a6f(0x2f6)];}async[_0x857294(0x26b)](_0x2d91f6,_0x32975c=null){const _0x15d424=_0x857294,_0x44c91a={};_0x44c91a[_0x15d424(0x1f3)]=_0x15d424(0x28e),_0x44c91a[_0x15d424(0x264)]='AMesT',_0x44c91a[_0x15d424(0x2e7)]=_0x15d424(0x210);const _0x164307=_0x44c91a;logger['info']('๐ค\x20Converting\x20with\x20Local\x20Built-In\x20AI:\x20\x22'+_0x2d91f6+'\x22');;try{const _0xe3587b=_0x32975c?[{'platform':_0x32975c}]:[],_0x479b5a=await this['localAI']['convertCommand'](_0x2d91f6,_0xe3587b);if(_0x479b5a['success']){const _0x326c9e={};return _0x326c9e[_0x15d424(0x2fb)]=_0x479b5a[_0x15d424(0x2fb)],_0x326c9e[_0x15d424(0x293)]=_0x164307[_0x15d424(0x1f3)],_0x326c9e[_0x15d424(0x2fa)]=_0x479b5a['confidence'],_0x326c9e[_0x15d424(0x2ca)]=_0x479b5a['processingTime'],_0x326c9e[_0x15d424(0x2ba)]=_0x15d424(0x2bb),_0x326c9e['cost']=0x0,_0x326c9e;}else throw new Error(_0x479b5a[_0x15d424(0x256)]||_0x15d424(0x228));}catch(_0x3fffdb){if(_0x164307['KnvuW']===_0x15d424(0x25b)){logger[_0x15d424(0x256)](_0x164307['pWgKI'],_0x3fffdb[_0x15d424(0x20d)]);;throw _0x3fffdb;}else{const _0x15cebd=this[_0x15d424(0x277)]()[_0x15d424(0x246)](_0x4bf15e=>_0x4bf15e['id']);if(_0x15cebd[_0x15d424(0x2be)](_0x508b25))return this[_0x15d424(0x293)]=_0x18d5fa,_0x33ae16&&(this['model']=_0x54a80f),!![];return![];}}}}function _0x1dbe(_0x1e824f,_0x5f0ee2){_0x1e824f=_0x1e824f-0x1e8;const _0x4d7a87=_0x4d7a();let _0x1dbe01=_0x4d7a87[_0x1e824f];if(_0x1dbe['yMMvWu']===undefined){var _0x328786=function(_0x5a840c){const _0x1055d0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x335707='',_0x5c3fae='';for(let _0xc85297=0x0,_0xdcb767,_0x3678d9,_0x395cca=0x0;_0x3678d9=_0x5a840c['charAt'](_0x395cca++);~_0x3678d9&&(_0xdcb767=_0xc85297%0x4?_0xdcb767*0x40+_0x3678d9:_0x3678d9,_0xc85297++%0x4)?_0x335707+=String['fromCharCode'](0xff&_0xdcb767>>(-0x2*_0xc85297&0x6)):0x0){_0x3678d9=_0x1055d0['indexOf'](_0x3678d9);}for(let _0x63103f=0x0,_0x1c1a2a=_0x335707['length'];_0x63103f<_0x1c1a2a;_0x63103f++){_0x5c3fae+='%'+('00'+_0x335707['charCodeAt'](_0x63103f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5c3fae);};_0x1dbe['czrowA']=_0x328786,_0x1dbe['BqWPYW']={},_0x1dbe['yMMvWu']=!![];}const _0x39887b=_0x4d7a87[0x0],_0xb6da7f=_0x1e824f+_0x39887b,_0x468bbd=_0x1dbe['BqWPYW'][_0xb6da7f];return!_0x468bbd?(_0x1dbe01=_0x1dbe['czrowA'](_0x1dbe01),_0x1dbe['BqWPYW'][_0xb6da7f]=_0x1dbe01):_0x1dbe01=_0x468bbd,_0x1dbe01;}module[_0x857294(0x1f7)]=AIProviderManager;function _0x4d7a(){const _0x523437=['t3bLBKfj','z2v0uhjVDMLKzxjoyw1L','rLfJu08','sNngvuy','y2XHDwrLltmTns1ZB25UzxqTmJaYndeWmJi','BwvZC2fNzxm','sMTvzwe','EwHRAgu','Ahreq0G','u3vKC1a','BenIvfa','DgvTCgvYyxr1CMu','ru9LwNm','z2v0tw9KzwXgB3jqCM92AwrLCG','txrqvNG','yxLbru8','y0DyExm','ic8Gqw5KCM9PzdOG','txjHv1a','DM9SDw1Lia','lI9SB2DNzxi','wgLIquy','y29UDMvYDfDPDgHnAxn0CMfS','Bw9KzwW','yNvPBhqTAw4TCgf0DgvYBNm','tgrRrei','Cen4vLq','Aw5JBhvKzxm','qw50AhjVCgLJienSyxvKzq','cGPjtvbpuLrbtLq6ifvZzsbNzw5LCMLJigfWCcbUyw1LCYaOzs5NlIWGiMXHDw5JAcbZzxr0Aw5NCYiSicjSyxvUy2GGy2HYB21LiIKkvgHLihn5C3rLBsb3AwXSigf1Dg9TyxrPy2fSBhKGy29UDMvYDcb0BYbWBgf0zM9YBs1ZCgvJAwzPyYbWywnRywDLieLeCZOk','CuzeqLi','y2XLyw5bsvjLC3bVBNnL','CuDWwNK','uKPJD2u','t09TDg8','BgLNAhrTB2rL','y29UDMvYDfDPDgHdB3bPBg90','BM90AwzPy2f0Aw9UCW','zuzQBxi','ChjVy2vZC2LUz1rPBwu','y0jQteW','qMTUvNG','uejQDgO','qgfUDgHYB3bPyY1HAs9ZzgS','AwnVBG','r29Vz2XLieDLBwLUAq','v2Tbruq','r2vTAw5Pig5VDcbJB25MAwD1CMvK','vLryzge','BhHOCxm','EMDlEvu','EM50t1m','Bwf4x3rVA2vUCW','Aw9Z','q25vBfG','uMj3EMG','yNvPBhrPBG','CMvZCg9UC2u','BwLZDhjHBc1SyxjNzs1SyxrLC3q','ChvZAa','n0HVwfPWvW','tLj5q2y','CMvWBgfJzq','C3bSAxq','cGPdB21Tyw5KCYb3AwXSigv4zwn1DguGu0LnvuXuqu5ft1vttfKGB24GywXSigrLDMLJzxmGD2L0AcbJB3jYzwn0ihbHy2THz2uGsurZlGO','DxnLCG','DxjSia','vw5RBM93BG','CfDNs0K','qunVDw4','Aw5MBW','Bgf1BMnOia','ExftCg8','ueTeAMK','A1HUzxm','vNLzreK','y29TBwfUzc1YlxbSDxm','Dgv4Da','ouffCvHABa','sgD2Bwm','Bg9Uz3bYzxnZia','AgPPBKy','E0LoufvuFq','vwznsw4','C3vJy2vZCW','wgXJzhO','q25Psei','y29UzMLKzw5Jzq','y29UDMvYDgvK','wgHZqLC','cGPbufaGuefds0fhrsbnqvbqsu5huZOkv2HLBIb1C2vYihnHExmGiMXHDw5JAcbJAhjVBwuIlcaIB3bLBIbJAhjVBwuIlcbLDgmUlcb1C2uGDgHLignVCNjLy3qGCgfJA2fNzsbjrdOk','BMvbrKC','qLDeD20','lI9HChbnyxbWAw5NCW','y29UDMvYDenVBw1HBMq','ywzZzfK','CKLKuwO','y29UDgvUDa','BgXHBweTmY4ZltCWyI12zxjZyxrPBgu','AM9PBG','sNDksfK','twj2vvG','z3b0ltrV','wNHADfa','DK5Juvi','D0D6sum','z2v0u3LZDgvTuhjVBxb0','z3jVCq','Efrnr0C','yw5KCM9Pza','C0XkBgW','CM9Szq','DfbHuNq','y29WAwXVDa','A1PnC1C','z2v0q3vYCMvUDfbYB3zPzgvY','zxHWB3j0CW','sK1ADKm','y29TCgXLDgLVBNm','yMfZzvvsta','DgfWia','r2L0shvIienVCgLSB3q','r2L0shvIienVCgLSB3qGBM90ignVBMzPz3vYzwq','rw5ntwi','Ahr0Chm6lY9HCgKUz3jVCs5JB20VB3bLBMfPl3yX','BMrbzhO','qwLYs1i','q29OzxjL','zMLSDgvY','twLZDhjHBcbbssbUB3qGy29UzMLNDxjLza','EgXbywy','CMPMENa','mZe2otm2mJL0EwvZv1K','mtmZnJm2nJrsEuXUrey','tI9b','DKvkyvm','CxvPy2TZzxr0Aw5NCW','vuzuAMO','BwvZC2fNzq','tw1uDge','twLZDhjHBcbbsq','tg9JywWGquKGy29UDMvYC2LVBIbLCNjVCJO','rhHqBhq','Dvn4B3q','shHOvK0','tgnnwuu','Bg9JywW','igzHAwXLzcWGzMfSBgLUzYbIywnRihrVigDLBwLUAs0YlJuTzMXHC2G','Cg1VAfm','y2XHDwrL','EwrHyLC','sfnfBgK','uwzyCvy','zergzwO','BKnVD2C','ktOG','CvHqsMe','mM5luKv5Eq','r3jVCq','yM1uzhm','zgfYA21Vzgu','qwLqCM92AwrLCNm','BLDAtvi','yMfJAW','zg9ivKm','tg9JywWGquKGy29UDMvYC2LVBIbMywLSzwq','ChjNs1a','v0fjvca','C3LZDgvT','uujNBvq','z2v0r2vUzxjHDgL2zu1VzgvS','cGPnvuXuss1qtefurK9stsbnt0rficHPt1mGkYbbBMrYB2LKigrLDMLJzxmPcKf2ywLSywjSzsbHChbZoIa','y1DswhC','y29OzxjL','sw5sD1q','t3bLBKfjig5VDcbJB25MAwD1CMvK','r3jVCsbUB3qGy29UzMLNDxjLza','C3rHCNrZv2L0Aa','nhr0zLvbzG','Ag9Tzq','A0rKu2W','z2vTAw5P','y2HHDa','CLnds1K','CMvJzw50','rNfpr3C','Aw5PDgLHBgL6zvbYB3zPzgvYCW','zNbNBue','z2vTAw5PltiUns1MBgfZAa','C3fezgi','C2XPy2u','ic0+igLpuZOG','ndu4nJqZm1fwAufcvq','DhjPBq','DujuzxO','BwfW','BMfTzq','ic0+igXHDw5JAca','qLLkwe4','mZG0nta3mfjXvhHICq','qMXrD0C','Ahr0Chm6lY9HCgKUz2L0AhvIy29WAwXVDc5JB20','wfH2AKq','yNvPBhqTAw4','BM1uA0q','BwLZDhjHBa','AMLdsgu','q0PPu2G','yxbPs2v5','q2XHDwrLig5VDcbJB25MAwD1CMvK','y29UDMvYDfDPDgHdB2HLCMu','zxjYB3i','AvbIALq','vfnhCu4','s2fkwMi','y1PevMy','qu1LC1q','ywLYCgXHBMuG','tfnAyLu','mtq1nZa1mJbjC1nMEeW','z2vUzxjHDgvdB250zw50','CM9ewfG','vwzyANO','z2zIBvm','B3bLBMfP','s252DvC','Ag13CNy','q2jhAfK','BujNCfu','C09esxe','CMvZDgfYDa','svjTDK8','y29UDMvYDfDPDgHmB2nHBefj','y2HVAwnLCW','CM90yxrLia','Bg9JywXbsq','AgXRtLO','r1rvru0','AvrLvhi','DKrTCfO','cKf2ywLSywjSzsbHChbZigzVCIa','y29UDMvYDfDPDgHhzw1PBMK','ruvNC1i','uxPgvvC','z2v0qxzHAwXHyMXLuhjVDMLKzxjZ','tg9JywWGquKGzMfSBgjHy2SGywXZBYbMywLSzwq6','y29UDMvYDfDPDgHpCgvUquK','A2v5CW','8j+mRo+4JW','CKzfwfK','y2XPy2SG','A2HVr28','y29UDMvYDfDPDgHhCM9X','uunuyKG','CuDNsMS','uvjlrfO','z3b0ltq','tvLdDxa','mty1nZe5mwf0wvjHEG','C3DPCguG','r1rbsNq','DMDMvKu','Ahr0Chm6lY9HCgKUy29OzxjLlMfPl3yX','DgfJyvO','lI9SB2nHBej1AwX0sw5bsq','Aw96qNq','BfP0u2G','tg9JywWGqNvPBhqTsw4GquK','sMrMv1K','wMrTwKi','D2LMAsa','qgDVB2DSzs9Nzw5LCMf0AxzLlwfP','ChjVDMLKzxi','y3DoqLa','q29OzxjLig5VDcbJB25MAwD1CMvK','quKGy29UDMvYC2LVBIbMywLSzwqGka','q1vVq24','ote4mJm0nvL2D2fsvG','u2Hotfm','A2LSBca','zxnxCLG','Ahr0Chm6lY9HCgKUBwLZDhjHBc5HAs92mq','vw5RBM93BIbbssbWCM92AwrLCJOG','D2fYBG','z2v0tg9JyxrVCNm','y3jLyxrL','vKTLsfm','8j+uHcbgywXSAw5NigjHy2SGDg8Gtg9JywWGqNvPBhqTsw4GquKUlI4'];_0x4d7a=function(){return _0x523437;};return _0x4d7a();}
|
|
1
|
+
// AI Provider Abstraction Layer - API-Only Multi-Provider Support
|
|
2
|
+
// Pure API-based AI providers - No local models, no storage
|
|
3
|
+
// Supports: OpenAI, Google Gemini, Anthropic Claude, GitHub Copilot, Groq, Cohere, Mistral AI
|
|
4
|
+
|
|
5
|
+
const { OpenAI } = require('openai');
|
|
6
|
+
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
|
7
|
+
const { Anthropic } = require('@anthropic-ai/sdk');
|
|
8
|
+
const { getPackageId, APP_MAPPINGS } = require('./appMappings');
|
|
9
|
+
|
|
10
|
+
// Configuration: API-only mode (no caching, no local storage)
|
|
11
|
+
const AI_CONFIG = {
|
|
12
|
+
cache: false, // Disable any response caching
|
|
13
|
+
localStorage: false, // No local storage of models or data
|
|
14
|
+
streamingOnly: false, // Use standard requests for better compatibility
|
|
15
|
+
timeout: 30000, // 30 second timeout for API calls
|
|
16
|
+
retries: 2, // Retry failed requests twice
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
class AIProviderManager {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.provider = process.env.AI_PROVIDER || 'gemini';
|
|
22
|
+
this.model = process.env.AI_MODEL || null; // Auto-select default if null
|
|
23
|
+
this.requestCache = new Map(); // In-memory only, cleared on restart
|
|
24
|
+
this.cacheExpiry = 300000; // 5 minutes (for identical requests only)
|
|
25
|
+
this.initializeProviders();
|
|
26
|
+
|
|
27
|
+
// Log API-only mode
|
|
28
|
+
console.log('๐ AI Provider: API-Only Mode (No Local Models)');
|
|
29
|
+
console.log(` Active Provider: ${this.provider}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
initializeProviders() {
|
|
33
|
+
// OpenAI - Direct API connection
|
|
34
|
+
if (process.env.OPENAI_API_KEY) {
|
|
35
|
+
this.openai = new OpenAI({
|
|
36
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
37
|
+
timeout: AI_CONFIG.timeout,
|
|
38
|
+
maxRetries: AI_CONFIG.retries,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Google Gemini - Direct API connection
|
|
43
|
+
if (process.env.GEMINI_API_KEY) {
|
|
44
|
+
this.gemini = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Anthropic Claude - Direct API connection
|
|
48
|
+
if (process.env.CLAUDE_API_KEY) {
|
|
49
|
+
this.claude = new Anthropic({
|
|
50
|
+
apiKey: process.env.CLAUDE_API_KEY,
|
|
51
|
+
timeout: AI_CONFIG.timeout,
|
|
52
|
+
maxRetries: AI_CONFIG.retries,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// GitHub Copilot - Direct API connection
|
|
57
|
+
if (process.env.GITHUB_TOKEN) {
|
|
58
|
+
this.copilot = new OpenAI({
|
|
59
|
+
apiKey: process.env.GITHUB_TOKEN,
|
|
60
|
+
baseURL: 'https://api.githubcopilot.com',
|
|
61
|
+
timeout: AI_CONFIG.timeout,
|
|
62
|
+
maxRetries: AI_CONFIG.retries,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Groq - Ultra-fast API inference (no local processing)
|
|
67
|
+
if (process.env.GROQ_API_KEY) {
|
|
68
|
+
this.groq = new OpenAI({
|
|
69
|
+
apiKey: process.env.GROQ_API_KEY,
|
|
70
|
+
baseURL: 'https://api.groq.com/openai/v1',
|
|
71
|
+
timeout: AI_CONFIG.timeout,
|
|
72
|
+
maxRetries: AI_CONFIG.retries,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Cohere - Direct API connection
|
|
77
|
+
if (process.env.COHERE_API_KEY) {
|
|
78
|
+
this.cohere = new OpenAI({
|
|
79
|
+
apiKey: process.env.COHERE_API_KEY,
|
|
80
|
+
baseURL: 'https://api.cohere.ai/v1',
|
|
81
|
+
timeout: AI_CONFIG.timeout,
|
|
82
|
+
maxRetries: AI_CONFIG.retries,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Mistral AI - Direct API connection
|
|
87
|
+
if (process.env.MISTRAL_API_KEY) {
|
|
88
|
+
this.mistral = new OpenAI({
|
|
89
|
+
apiKey: process.env.MISTRAL_API_KEY,
|
|
90
|
+
baseURL: 'https://api.mistral.ai/v1',
|
|
91
|
+
timeout: AI_CONFIG.timeout,
|
|
92
|
+
maxRetries: AI_CONFIG.retries,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
getSystemPrompt(platform = null) {
|
|
98
|
+
// Generate app list based on platform
|
|
99
|
+
let appListSection = '';
|
|
100
|
+
|
|
101
|
+
if (platform === 'both') {
|
|
102
|
+
// Multi-platform mode - use generic app names
|
|
103
|
+
const commonApps = Object.keys(APP_MAPPINGS)
|
|
104
|
+
.filter(app => APP_MAPPINGS[app].ios && APP_MAPPINGS[app].android)
|
|
105
|
+
.slice(0, 30);
|
|
106
|
+
|
|
107
|
+
appListSection = `\n\nMULTI-PLATFORM MODE (iOS + Android devices)
|
|
108
|
+
Available apps: ${commonApps.join(', ')}
|
|
109
|
+
|
|
110
|
+
IMPORTANT: Use generic app names (e.g., "launch settings", "launch chrome")
|
|
111
|
+
The system will automatically convert to platform-specific package IDs:
|
|
112
|
+
${commonApps.slice(0, 15).map(app => `- ${app} -> iOS: ${APP_MAPPINGS[app].ios} / Android: ${APP_MAPPINGS[app].android}`).join('\n')}
|
|
113
|
+
|
|
114
|
+
Commands will execute SIMULTANEOUSLY on all devices with correct package IDs.
|
|
115
|
+
`;
|
|
116
|
+
} else if (platform) {
|
|
117
|
+
const availableApps = Object.keys(APP_MAPPINGS)
|
|
118
|
+
.filter(app => APP_MAPPINGS[app][platform])
|
|
119
|
+
.slice(0, 50);
|
|
120
|
+
|
|
121
|
+
appListSection = `\n\nPLATFORM: ${platform.toUpperCase()}
|
|
122
|
+
Available apps for ${platform}: ${availableApps.join(', ')}
|
|
123
|
+
|
|
124
|
+
APP PACKAGE MAPPINGS:
|
|
125
|
+
When user says "launch chrome", "open chrome", etc., use the correct package ID:
|
|
126
|
+
${availableApps.slice(0, 20).map(app => `- ${app} -> launch ${APP_MAPPINGS[app][platform]}`).join('\n')}
|
|
127
|
+
`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return `You are a mobile device automation command converter. Convert natural language requests into executable commands for iOS and Android devices.
|
|
131
|
+
|
|
132
|
+
Available commands (work on both iOS & Android):
|
|
133
|
+
- launch <app_name>: Launch an app using generic name (e.g., "launch settings", "launch chrome")
|
|
134
|
+
- kill <app_name>: Close/force stop an app
|
|
135
|
+
- home: Go to home screen (press home button)
|
|
136
|
+
- back: Navigate back (Android/iOS)
|
|
137
|
+
- url <url>: Open URL in browser
|
|
138
|
+
- click <text>: Click on a button or element by visible text
|
|
139
|
+
- click <x,y>: Click at specific coordinates (e.g., click 500,1000)
|
|
140
|
+
- tap <text/coords>: Same as click
|
|
141
|
+
- longpress <text/coords>: Long press on element or coordinates
|
|
142
|
+
- swipe <direction>: Swipe up/down/left/right (use for scrolling)
|
|
143
|
+
- type <text>: Type text into focused field (just the text, no "type" prefix)
|
|
144
|
+
- screenshot: Take screenshot
|
|
145
|
+
- restart: Restart device
|
|
146
|
+
- rotate <left/right/portrait/landscape>: Rotate screen
|
|
147
|
+
|
|
148
|
+
iOS-specific commands:
|
|
149
|
+
- darkmode/lightmode: Change appearance
|
|
150
|
+
- airplane <on/off>: Toggle airplane mode
|
|
151
|
+
- wifi <on/off>: Toggle WiFi
|
|
152
|
+
- volume <up/down/mute>: Control volume
|
|
153
|
+
|
|
154
|
+
Android-specific commands:
|
|
155
|
+
- getLocators: Get all interactive elements on current screen
|
|
156
|
+
- recent: Open recent apps
|
|
157
|
+
- notifications: Open notification panel
|
|
158
|
+
- quicksettings: Open quick settings
|
|
159
|
+
${appListSection}
|
|
160
|
+
|
|
161
|
+
COMMON PHRASE MAPPINGS:
|
|
162
|
+
- "scroll up" OR "scroll down" -> swipe up OR swipe down
|
|
163
|
+
- "go to <url>" OR "open <url>" OR "visit <url>" -> url https://<url>
|
|
164
|
+
- "press home" OR "go home" OR "home button" -> home
|
|
165
|
+
- "open settings" OR "launch settings" -> launch settings
|
|
166
|
+
- "open camera" OR "launch camera" -> launch camera
|
|
167
|
+
|
|
168
|
+
Examples:
|
|
169
|
+
- "open chrome" -> launch chrome
|
|
170
|
+
- "launch settings" -> launch settings
|
|
171
|
+
- "open camera" -> launch camera
|
|
172
|
+
- "scroll up" -> swipe up
|
|
173
|
+
- "scroll down" -> swipe down
|
|
174
|
+
- "click on the login button" -> click Login
|
|
175
|
+
- "tap at center of screen" -> click 540,1000
|
|
176
|
+
- "swipe down" -> swipe down
|
|
177
|
+
- "type hello world" -> hello world
|
|
178
|
+
- "take a screenshot" -> screenshot
|
|
179
|
+
- "go back" -> back
|
|
180
|
+
- "press home" -> home
|
|
181
|
+
- "go to google.com" -> url https://www.google.com
|
|
182
|
+
- "visit youtube.com" -> url https://www.youtube.com
|
|
183
|
+
- "launch Chrome and search google.com" -> launch chrome
|
|
184
|
+
WAIT 3000
|
|
185
|
+
url https://www.google.com
|
|
186
|
+
- "launch settings scroll up launch camera go to google.com press home" ->
|
|
187
|
+
launch settings
|
|
188
|
+
WAIT 3000
|
|
189
|
+
swipe up
|
|
190
|
+
WAIT 1000
|
|
191
|
+
home
|
|
192
|
+
WAIT 500
|
|
193
|
+
launch camera
|
|
194
|
+
WAIT 3000
|
|
195
|
+
home
|
|
196
|
+
WAIT 500
|
|
197
|
+
url https://www.google.com
|
|
198
|
+
WAIT 2000
|
|
199
|
+
home
|
|
200
|
+
|
|
201
|
+
Convert this request to commands: "{INPUT}"
|
|
202
|
+
|
|
203
|
+
CRITICAL RULES - YOU MUST FOLLOW THESE EXACTLY:
|
|
204
|
+
1. Output ONLY executable commands, one per line
|
|
205
|
+
2. NO explanations, NO markdown code blocks, NO comments, NO extra text
|
|
206
|
+
3. For multi-step actions, insert WAIT <milliseconds> between commands
|
|
207
|
+
4. Use GENERIC app names (e.g., "launch settings", "launch chrome", "launch camera")
|
|
208
|
+
5. Do NOT use platform-specific package IDs - use simple app names
|
|
209
|
+
6. The system will automatically convert to correct package IDs for each platform
|
|
210
|
+
5. For URLs, always use: url https://example.com
|
|
211
|
+
6. For scrolling, use: swipe up OR swipe down (never "scroll")
|
|
212
|
+
7. For text input, output ONLY the text (never include "type" prefix)
|
|
213
|
+
8. For home button, output: home (never "press home" or "go home")
|
|
214
|
+
9. WAIT timings: apps=3000ms, pages=2000ms, UI=1000ms, quick=500ms
|
|
215
|
+
10. Parse compound requests into individual steps with WAIT between each
|
|
216
|
+
|
|
217
|
+
OUTPUT FORMAT EXAMPLE:
|
|
218
|
+
launch com.apple.Preferences
|
|
219
|
+
WAIT 3000
|
|
220
|
+
swipe up
|
|
221
|
+
WAIT 1000
|
|
222
|
+
home
|
|
223
|
+
|
|
224
|
+
DO NOT include any other text. Start your response with the first command.`;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async convertCommand(text, platform = null, providerOverride = null) {
|
|
228
|
+
const provider = providerOverride || this.provider;
|
|
229
|
+
|
|
230
|
+
// Check in-memory cache for identical requests (5 min expiry)
|
|
231
|
+
const cacheKey = `${provider}-${platform}-${text}`;
|
|
232
|
+
const cached = this.requestCache.get(cacheKey);
|
|
233
|
+
if (cached && Date.now() - cached.timestamp < this.cacheExpiry) {
|
|
234
|
+
console.log('๐ฏ Using cached response (in-memory)');
|
|
235
|
+
return cached.response;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
try {
|
|
239
|
+
let result;
|
|
240
|
+
switch (provider) {
|
|
241
|
+
case 'openai':
|
|
242
|
+
result = await this.convertWithOpenAI(text, platform);
|
|
243
|
+
break;
|
|
244
|
+
case 'gemini':
|
|
245
|
+
result = await this.convertWithGemini(text, platform);
|
|
246
|
+
break;
|
|
247
|
+
case 'claude':
|
|
248
|
+
result = await this.convertWithClaude(text, platform);
|
|
249
|
+
break;
|
|
250
|
+
case 'copilot':
|
|
251
|
+
result = await this.convertWithCopilot(text, platform);
|
|
252
|
+
break;
|
|
253
|
+
case 'groq':
|
|
254
|
+
result = await this.convertWithGroq(text, platform);
|
|
255
|
+
break;
|
|
256
|
+
case 'cohere':
|
|
257
|
+
result = await this.convertWithCohere(text, platform);
|
|
258
|
+
break;
|
|
259
|
+
case 'mistral':
|
|
260
|
+
result = await this.convertWithMistral(text, platform);
|
|
261
|
+
break;
|
|
262
|
+
default:
|
|
263
|
+
throw new Error(`Unknown AI provider: ${provider}`);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Cache in memory only (cleared on restart)
|
|
267
|
+
this.requestCache.set(cacheKey, { response: result, timestamp: Date.now() });
|
|
268
|
+
|
|
269
|
+
// Clear old cache entries (keep last 50)
|
|
270
|
+
if (this.requestCache.size > 50) {
|
|
271
|
+
const firstKey = this.requestCache.keys().next().value;
|
|
272
|
+
this.requestCache.delete(firstKey);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return result;
|
|
276
|
+
} catch (error) {
|
|
277
|
+
console.error(`โ API Error with ${provider}:`, error.message);
|
|
278
|
+
throw new Error(`AI conversion failed (${provider}): ${error.message}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Get model to use (from env or default)
|
|
283
|
+
getModelForProvider(provider) {
|
|
284
|
+
// If specific model is set, use it
|
|
285
|
+
if (this.model) return this.model;
|
|
286
|
+
|
|
287
|
+
// Otherwise use defaults (latest models as of August 24, 2026 - which are Aug 2024 models)
|
|
288
|
+
const defaults = {
|
|
289
|
+
openai: 'gpt-4o-2024-08-06', // Latest GPT-4o
|
|
290
|
+
gemini: 'gemini-1.5-pro-002', // Latest Gemini 1.5 Pro
|
|
291
|
+
claude: 'claude-3-5-sonnet-20241022', // Latest Claude 3.5 Sonnet
|
|
292
|
+
copilot: 'gpt-4o', // Latest multimodal
|
|
293
|
+
groq: 'llama-3.3-70b-versatile', // Latest Llama 3.3
|
|
294
|
+
cohere: 'command-r-plus-08-2024', // Latest Command R+
|
|
295
|
+
mistral: 'mistral-large-2411', // Latest Mistral Large 2
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
return defaults[provider] || 'gpt-4o-2024-08-06';
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async convertWithOpenAI(text, platform = null) {
|
|
302
|
+
if (!this.openai) {
|
|
303
|
+
throw new Error('OpenAI not configured');
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const model = this.getModelForProvider('openai');
|
|
307
|
+
|
|
308
|
+
const response = await this.openai.chat.completions.create({
|
|
309
|
+
model: model,
|
|
310
|
+
messages: [
|
|
311
|
+
{ role: 'system', content: this.getSystemPrompt(platform) },
|
|
312
|
+
{ role: 'user', content: text }
|
|
313
|
+
],
|
|
314
|
+
temperature: 0.3,
|
|
315
|
+
max_tokens: 500,
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
let convertedText = response.choices[0].message.content.trim();
|
|
319
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
320
|
+
|
|
321
|
+
return convertedText;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
async convertWithGemini(text, platform = null) {
|
|
325
|
+
if (!this.gemini) {
|
|
326
|
+
throw new Error('Gemini not configured');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
let modelName = this.getModelForProvider('gemini');
|
|
330
|
+
|
|
331
|
+
try {
|
|
332
|
+
// Use default Gemini config for best accuracy
|
|
333
|
+
const model = this.gemini.getGenerativeModel({ model: modelName });
|
|
334
|
+
|
|
335
|
+
// Build prompt and sanitize for Gemini API (requires ASCII-safe ByteString)
|
|
336
|
+
const rawPrompt = this.getSystemPrompt(platform).replace('{INPUT}', text);
|
|
337
|
+
|
|
338
|
+
// Remove ALL non-ASCII characters that could cause ByteString errors
|
|
339
|
+
const sanitizedPrompt = rawPrompt
|
|
340
|
+
.replace(/[^\x00-\x7F]/g, ' ') // Replace non-ASCII with spaces
|
|
341
|
+
.replace(/\s+/g, ' ') // Normalize multiple spaces
|
|
342
|
+
.trim();
|
|
343
|
+
|
|
344
|
+
const result = await model.generateContent(sanitizedPrompt);
|
|
345
|
+
const response = await result.response;
|
|
346
|
+
let convertedText = response.text().trim();
|
|
347
|
+
|
|
348
|
+
return this.cleanAIResponse(convertedText);
|
|
349
|
+
} catch (error) {
|
|
350
|
+
// If the model fails, try with a faster fallback
|
|
351
|
+
if (modelName !== 'gemini-2.5-flash') {
|
|
352
|
+
console.warn(`Gemini model ${modelName} failed, falling back to gemini-2.5-flash`);
|
|
353
|
+
const fallbackModel = this.gemini.getGenerativeModel({ model: 'gemini-2.5-flash' });
|
|
354
|
+
const prompt = this.getSystemPrompt(platform).replace('{INPUT}', text);
|
|
355
|
+
const sanitizedPrompt = prompt.replace(/[^\x00-\x7F]/g, " ").replace(/\s+/g, ' ').trim();
|
|
356
|
+
const result = await fallbackModel.generateContent(sanitizedPrompt);
|
|
357
|
+
const response = await result.response;
|
|
358
|
+
return this.cleanAIResponse(response.text().trim());
|
|
359
|
+
}
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
async convertWithCopilot(text, platform = null) {
|
|
365
|
+
if (!this.copilot) {
|
|
366
|
+
throw new Error('GitHub Copilot not configured');
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const model = this.getModelForProvider('copilot');
|
|
370
|
+
|
|
371
|
+
const response = await this.copilot.chat.completions.create({
|
|
372
|
+
model: model,
|
|
373
|
+
messages: [
|
|
374
|
+
{ role: 'system', content: this.getSystemPrompt(platform) },
|
|
375
|
+
{ role: 'user', content: text }
|
|
376
|
+
],
|
|
377
|
+
temperature: 0.3,
|
|
378
|
+
max_tokens: 500,
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
let convertedText = response.choices[0].message.content.trim();
|
|
382
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
383
|
+
|
|
384
|
+
return convertedText;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
async convertWithClaude(text, platform = null) {
|
|
388
|
+
if (!this.claude) {
|
|
389
|
+
throw new Error('Claude not configured');
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const model = this.getModelForProvider('claude');
|
|
393
|
+
const systemPrompt = this.getSystemPrompt(platform);
|
|
394
|
+
|
|
395
|
+
const response = await this.claude.messages.create({
|
|
396
|
+
model: model,
|
|
397
|
+
max_tokens: 500,
|
|
398
|
+
system: systemPrompt,
|
|
399
|
+
messages: [
|
|
400
|
+
{ role: 'user', content: text }
|
|
401
|
+
],
|
|
402
|
+
temperature: 0.3,
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
let convertedText = response.content[0].text.trim();
|
|
406
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
407
|
+
|
|
408
|
+
return convertedText;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
async convertWithGroq(text, platform = null) {
|
|
412
|
+
if (!this.groq) {
|
|
413
|
+
throw new Error('Groq not configured');
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
const model = this.getModelForProvider('groq');
|
|
417
|
+
|
|
418
|
+
const response = await this.groq.chat.completions.create({
|
|
419
|
+
model: model,
|
|
420
|
+
messages: [
|
|
421
|
+
{ role: 'system', content: this.getSystemPrompt(platform) },
|
|
422
|
+
{ role: 'user', content: text }
|
|
423
|
+
],
|
|
424
|
+
temperature: 0.3,
|
|
425
|
+
max_tokens: 500,
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
let convertedText = response.choices[0].message.content.trim();
|
|
429
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
430
|
+
|
|
431
|
+
return convertedText;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
async convertWithCohere(text, platform = null) {
|
|
435
|
+
if (!this.cohere) {
|
|
436
|
+
throw new Error('Cohere not configured');
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const model = this.getModelForProvider('cohere');
|
|
440
|
+
|
|
441
|
+
const response = await this.cohere.chat.completions.create({
|
|
442
|
+
model: model,
|
|
443
|
+
messages: [
|
|
444
|
+
{ role: 'system', content: this.getSystemPrompt(platform) },
|
|
445
|
+
{ role: 'user', content: text }
|
|
446
|
+
],
|
|
447
|
+
temperature: 0.3,
|
|
448
|
+
max_tokens: 500,
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
let convertedText = response.choices[0].message.content.trim();
|
|
452
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
453
|
+
|
|
454
|
+
return convertedText;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
async convertWithMistral(text, platform = null) {
|
|
458
|
+
if (!this.mistral) {
|
|
459
|
+
throw new Error('Mistral AI not configured');
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const model = this.getModelForProvider('mistral');
|
|
463
|
+
|
|
464
|
+
const response = await this.mistral.chat.completions.create({
|
|
465
|
+
model: model,
|
|
466
|
+
messages: [
|
|
467
|
+
{ role: 'system', content: this.getSystemPrompt(platform) },
|
|
468
|
+
{ role: 'user', content: text }
|
|
469
|
+
],
|
|
470
|
+
temperature: 0.3,
|
|
471
|
+
max_tokens: 500,
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
let convertedText = response.choices[0].message.content.trim();
|
|
475
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
476
|
+
|
|
477
|
+
return convertedText;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// Clean up AI responses - remove markdown, explanations, etc.
|
|
481
|
+
cleanAIResponse(text) {
|
|
482
|
+
// Remove markdown code blocks
|
|
483
|
+
text = text.replace(/```[\s\S]*?```/g, '').trim();
|
|
484
|
+
text = text.replace(/```/g, '').trim();
|
|
485
|
+
|
|
486
|
+
// Remove any lines that look like explanations (starting with explanatory text)
|
|
487
|
+
const lines = text.split('\n');
|
|
488
|
+
const cleanedLines = lines.filter(line => {
|
|
489
|
+
const trimmed = line.trim();
|
|
490
|
+
if (!trimmed) return false;
|
|
491
|
+
|
|
492
|
+
// Keep lines that are commands or WAIT
|
|
493
|
+
if (trimmed.startsWith('launch ')) return true;
|
|
494
|
+
if (trimmed.startsWith('kill ')) return true;
|
|
495
|
+
if (trimmed === 'home') return true;
|
|
496
|
+
if (trimmed === 'back') return true;
|
|
497
|
+
if (trimmed.startsWith('url ')) return true;
|
|
498
|
+
if (trimmed.startsWith('click ')) return true;
|
|
499
|
+
if (trimmed.startsWith('tap ')) return true;
|
|
500
|
+
if (trimmed.startsWith('longpress ')) return true;
|
|
501
|
+
if (trimmed.startsWith('swipe ')) return true;
|
|
502
|
+
if (trimmed.startsWith('WAIT ')) return true;
|
|
503
|
+
if (trimmed.startsWith('screenshot')) return true;
|
|
504
|
+
if (trimmed.startsWith('restart')) return true;
|
|
505
|
+
if (trimmed.startsWith('rotate ')) return true;
|
|
506
|
+
if (trimmed.startsWith('darkmode')) return true;
|
|
507
|
+
if (trimmed.startsWith('lightmode')) return true;
|
|
508
|
+
if (trimmed.startsWith('airplane ')) return true;
|
|
509
|
+
if (trimmed.startsWith('wifi ')) return true;
|
|
510
|
+
if (trimmed.startsWith('volume ')) return true;
|
|
511
|
+
if (trimmed === 'getLocators') return true;
|
|
512
|
+
if (trimmed === 'recent') return true;
|
|
513
|
+
if (trimmed === 'notifications') return true;
|
|
514
|
+
if (trimmed === 'quicksettings') return true;
|
|
515
|
+
|
|
516
|
+
// If it doesn't start with a known command, it might be text to type
|
|
517
|
+
// Check if previous line was a command that expects text input
|
|
518
|
+
return true; // For now, include it (could be text to type)
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
return cleanedLines.join('\n').trim();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
getAvailableProviders() {
|
|
525
|
+
const available = [];
|
|
526
|
+
|
|
527
|
+
if (this.openai) available.push({ id: 'openai', name: 'OpenAI', icon: '๐ค' });
|
|
528
|
+
if (this.gemini) available.push({ id: 'gemini', name: 'Google Gemini', icon: 'โจ' });
|
|
529
|
+
if (this.claude) available.push({ id: 'claude', name: 'Anthropic Claude', icon: '๐ง ' });
|
|
530
|
+
if (this.copilot) available.push({ id: 'copilot', name: 'GitHub Copilot', icon: '๐' });
|
|
531
|
+
if (this.groq) available.push({ id: 'groq', name: 'Groq', icon: 'โก' });
|
|
532
|
+
if (this.cohere) available.push({ id: 'cohere', name: 'Cohere', icon: '๐' });
|
|
533
|
+
if (this.mistral) available.push({ id: 'mistral', name: 'Mistral AI', icon: '๐ฌ๏ธ' });
|
|
534
|
+
|
|
535
|
+
return available;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
setProvider(provider, model = null) {
|
|
539
|
+
const available = this.getAvailableProviders().map(p => p.id);
|
|
540
|
+
if (available.includes(provider)) {
|
|
541
|
+
this.provider = provider;
|
|
542
|
+
if (model) {
|
|
543
|
+
this.model = model;
|
|
544
|
+
}
|
|
545
|
+
return true;
|
|
546
|
+
}
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
getCurrentProvider() {
|
|
551
|
+
return {
|
|
552
|
+
id: this.provider,
|
|
553
|
+
name: this.getProviderName(this.provider),
|
|
554
|
+
model: this.model || this.getModelForProvider(this.provider),
|
|
555
|
+
available: this.getAvailableProviders(),
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
getProviderName(providerId) {
|
|
560
|
+
const names = {
|
|
561
|
+
openai: 'OpenAI',
|
|
562
|
+
gemini: 'Google Gemini',
|
|
563
|
+
claude: 'Anthropic Claude',
|
|
564
|
+
copilot: 'GitHub Copilot',
|
|
565
|
+
groq: 'Groq',
|
|
566
|
+
cohere: 'Cohere',
|
|
567
|
+
mistral: 'Mistral AI',
|
|
568
|
+
};
|
|
569
|
+
return names[providerId] || 'Unknown';
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// Clear in-memory cache (no persistent storage)
|
|
573
|
+
clearCache() {
|
|
574
|
+
const size = this.requestCache.size;
|
|
575
|
+
this.requestCache.clear();
|
|
576
|
+
console.log(`๐งน Cleared ${size} cached responses from memory`);
|
|
577
|
+
return size;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Get cache statistics
|
|
581
|
+
getCacheStats() {
|
|
582
|
+
return {
|
|
583
|
+
size: this.requestCache.size,
|
|
584
|
+
maxSize: 50,
|
|
585
|
+
expiryMs: this.cacheExpiry,
|
|
586
|
+
storageType: 'memory-only',
|
|
587
|
+
persistentStorage: false,
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
module.exports = AIProviderManager;
|