ms-vite-plugin 1.5.4 → 1.5.5

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.
Files changed (69) hide show
  1. package/dist/build/index.js +1 -0
  2. package/dist/cli.js +1 -1
  3. package/dist/device/project.js +1 -0
  4. package/dist/mcp/device-log.js +1 -1
  5. package/dist/mcp/image-tools.js +1 -1
  6. package/dist/mcp/runtime-tools.js +1 -1
  7. package/dist/mcp-server.js +1 -1
  8. package/dist/packaging/index.js +1 -0
  9. package/package.json +1 -1
  10. package/dist/build.js +0 -1
  11. package/dist/luaObfuscator/addVararg.d.ts +0 -2
  12. package/dist/luaObfuscator/addVararg.js +0 -1
  13. package/dist/luaObfuscator/antiTamper.d.ts +0 -2
  14. package/dist/luaObfuscator/antiTamper.js +0 -26
  15. package/dist/luaObfuscator/ast.d.ts +0 -191
  16. package/dist/luaObfuscator/ast.js +0 -1
  17. package/dist/luaObfuscator/cipher.d.ts +0 -10
  18. package/dist/luaObfuscator/cipher.js +0 -28
  19. package/dist/luaObfuscator/compiler.d.ts +0 -31
  20. package/dist/luaObfuscator/compiler.js +0 -1
  21. package/dist/luaObfuscator/constantArray.d.ts +0 -5
  22. package/dist/luaObfuscator/constantArray.js +0 -1
  23. package/dist/luaObfuscator/flatten.d.ts +0 -2
  24. package/dist/luaObfuscator/flatten.js +0 -1
  25. package/dist/luaObfuscator/index.d.ts +0 -6
  26. package/dist/luaObfuscator/index.js +0 -1
  27. package/dist/luaObfuscator/lexer.d.ts +0 -14
  28. package/dist/luaObfuscator/lexer.js +0 -10
  29. package/dist/luaObfuscator/minify.d.ts +0 -3
  30. package/dist/luaObfuscator/minify.js +0 -1
  31. package/dist/luaObfuscator/numbers.d.ts +0 -2
  32. package/dist/luaObfuscator/numbers.js +0 -1
  33. package/dist/luaObfuscator/opcodes.d.ts +0 -3
  34. package/dist/luaObfuscator/opcodes.js +0 -1
  35. package/dist/luaObfuscator/parser.d.ts +0 -8
  36. package/dist/luaObfuscator/parser.js +0 -1
  37. package/dist/luaObfuscator/rename.d.ts +0 -3
  38. package/dist/luaObfuscator/rename.js +0 -1
  39. package/dist/luaObfuscator/reserved.d.ts +0 -5
  40. package/dist/luaObfuscator/reserved.js +0 -1
  41. package/dist/luaObfuscator/scope.d.ts +0 -11
  42. package/dist/luaObfuscator/scope.js +0 -1
  43. package/dist/luaObfuscator/selftest.d.ts +0 -1
  44. package/dist/luaObfuscator/selftest.js +0 -39
  45. package/dist/luaObfuscator/splitStrings.d.ts +0 -2
  46. package/dist/luaObfuscator/splitStrings.js +0 -1
  47. package/dist/luaObfuscator/strings.d.ts +0 -4
  48. package/dist/luaObfuscator/strings.js +0 -1
  49. package/dist/luaObfuscator/visit.d.ts +0 -5
  50. package/dist/luaObfuscator/visit.js +0 -1
  51. package/dist/luaObfuscator/vmEmit.d.ts +0 -2
  52. package/dist/luaObfuscator/vmEmit.js +0 -281
  53. package/dist/luaObfuscator/wrapInFunction.d.ts +0 -2
  54. package/dist/luaObfuscator/wrapInFunction.js +0 -1
  55. package/dist/packager.js +0 -1
  56. package/dist/project.js +0 -1
  57. /package/dist/{build.d.ts → build/index.d.ts} +0 -0
  58. /package/dist/{luaBundle.d.ts → build/luaBundle.d.ts} +0 -0
  59. /package/dist/{luaBundle.js → build/luaBundle.js} +0 -0
  60. /package/dist/{scriptProtect.d.ts → build/scriptProtect.d.ts} +0 -0
  61. /package/dist/{scriptProtect.js → build/scriptProtect.js} +0 -0
  62. /package/dist/{stopGuardPlugin.d.ts → build/stopGuardPlugin.d.ts} +0 -0
  63. /package/dist/{stopGuardPlugin.js → build/stopGuardPlugin.js} +0 -0
  64. /package/dist/{project.d.ts → device/project.d.ts} +0 -0
  65. /package/dist/{usb-forward.d.ts → device/usb-forward.d.ts} +0 -0
  66. /package/dist/{usb-forward.js → device/usb-forward.js} +0 -0
  67. /package/dist/{ws-manager.d.ts → device/ws-manager.d.ts} +0 -0
  68. /package/dist/{ws-manager.js → device/ws-manager.js} +0 -0
  69. /package/dist/{packager.d.ts → packaging/index.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ "use strict";var x=Object.create;var M=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var C=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of N(e))!z.call(t,r)&&r!==o&&M(t,r,{get:()=>e[r],enumerable:!(i=$(e,r))||i.enumerable});return t};var W=(t,e,o)=>(o=t!=null?x(q(t)):{},C(e||!t||!t.__esModule?M(o,"default",{value:t,enumerable:!0}):o,t));var K=exports&&exports.__createBinding||(Object.create?(function(t,e,o,i){i===void 0&&(i=o);var r=Object.getOwnPropertyDescriptor(e,o);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[o]}}),Object.defineProperty(t,i,r)}):(function(t,e,o,i){i===void 0&&(i=o),t[i]=e[o]})),A=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),O=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(o){var i=[];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(i[i.length]=r);return i},t(e)};return function(e){if(e&&e.__esModule)return e;var o={};if(e!=null)for(var i=t(e),r=0;r<i.length;r++)i[r]!=="default"&&K(o,e,i[r]);return A(o,e),o}})(),D=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildAll=void 0;const T=D(require("archiver")),E=require("child_process"),s=O(require("fs-extra")),F=O(require("os")),n=O(require("path")),B=require("./stopGuardPlugin"),G=require("./luaBundle"),L=require("./scriptProtect"),H=D(require("vite-plugin-bundle-obfuscator"));async function R(t,e){const o=(0,T.default)("zip",{zlib:{level:9}}),i=s.createWriteStream(e);return new Promise((r,c)=>{o.directory(t,!1).on("error",a=>c(a)).pipe(i),i.on("close",()=>r()),o.finalize()})}async function I(t,e){const o=[];async function i(r){const c=await s.readdir(r,{withFileTypes:!0});for(const a of c){const f=n.resolve(r,a.name);a.isDirectory()?await i(f):a.isFile()&&(/^main\.(js|ts)$/.test(a.name)||/_thread\.(js|ts)$/.test(a.name))&&o.push(n.relative(e,f))}}return await i(t),o}function Q(){const t=[{cmd:n.join(F.homedir(),".KuaiJSDevloper","python","python.exe"),args:["--version"]},{cmd:n.join(F.homedir(),".KuaiJSDevloper","python","bin","python"),args:["--version"]},{cmd:"python",args:["--version"]},{cmd:"python3",args:["--version"]},{cmd:"python3.14",args:["--version"]}];for(const e of t)try{const o=(0,E.spawnSync)(e.cmd,e.args,{encoding:"utf8"}),i=(o.stdout||o.stderr||"").trim();if(i&&/Python\s+3\.14(\.\d+)?/i.test(i))return{ok:!0,path:e.cmd,version:i}}catch{}return{ok:!1}}async function U(t){async function e(o){const i=await s.readdir(o,{withFileTypes:!0});for(const r of i){const c=n.join(o,r.name);if(r.isDirectory())if(r.name==="__pycache__"){const a=await s.readdir(c,{withFileTypes:!0});for(const f of a){const P=n.join(c,f.name);if(f.isFile()&&f.name.endsWith(".cpython-314.pyc")){const S=n.dirname(c),b=f.name.replace(/\.cpython-314\.pyc$/,".pyc"),j=n.join(S,b);await s.move(P,j,{overwrite:!0})}}try{await s.remove(c)}catch{}}else await e(c);else if(r.isFile())if(r.name.endsWith(".cpython-314.pyc")){const a=c.replace(".cpython-314.pyc",".pyc");await s.move(c,a,{overwrite:!0})}else r.name.endsWith(".py")&&await s.remove(c)}}await e(t)}const V=["Minify","Weak","Medium","Strong"];async function X(t){const e=n.join(t,"obfuscator.json");if(!await s.pathExists(e))return{enabled:!0,preset:"Medium",bundle:!0};try{const o=await s.readJSON(e),i=o?.enabled!==!1,r=o?.bundle!==!1,c=Y(o?.preset);return{enabled:i,preset:c,bundle:r}}catch(o){return console.error("\u274C \u65E0\u6CD5\u8BFB\u53D6 obfuscator.json"),console.error(o instanceof Error?o.message:String(o)),process.exit(1),{enabled:!0,preset:"Medium",bundle:!0}}}function Y(t){if(typeof t!="string")return"Medium";const e=V.find(o=>o.toLowerCase()===t.trim().toLowerCase());return e||(console.warn(`\u26A0\uFE0F obfuscator.json \u7684 preset \u65E0\u6548: ${t}\uFF0C\u5DF2\u6539\u7528 Medium`),"Medium")}function Z(t){const e=n.resolve(__dirname,"..","..");return[n.join(e,"node_modules/@gamely/prometheus-cli/bin/cli.js"),n.join(e,"..","@gamely/prometheus-cli/bin/cli.js")].find(i=>s.pathExistsSync(i))}const k=async(t=!0,e)=>{const o=n.join(e,"scripts"),i=await s.pathExists(n.join(o,"main.js"))||await s.pathExists(n.join(o,"main.ts")),r=await s.pathExists(n.join(o,"main.py")),c=await s.pathExists(n.join(o,"main.lua"));if(i){console.log("\u{1F680} \u5F00\u59CB\u6784\u5EFAJavaScript\u9879\u76EE...");const{build:l}=await import("vite"),u=n.join(e,"obfuscator.json");await s.pathExists(u)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - obfuscator.json"),process.exit(1));const w=await s.readJSON(u),m=w.scriptProtect===!0,{enabled:_,scriptProtect:y,...p}=w,d=n.join(e,t?"dist":"msbundle"),h=await I(o,o);await s.remove(d);const g=!t&&m?(0,L.createScriptProtectHelpers)():[];!t&&m&&console.log("\u{1F510} \u5DF2\u542F\u7528 JS \u539F\u751F\u4FDD\u62A4\uFF08scriptProtect=true\uFF09");for(const v of h)await l({root:e,build:{lib:{entry:{[n.basename(v,n.extname(v))]:`./scripts/${v}`},fileName:()=>v.replace(/\.ts$/,".js"),formats:["iife"],name:"KuaiJS"},outDir:t?"dist/scripts":"msbundle/scripts",emptyOutDir:!1,sourcemap:t,minify:!t,target:"safari15"},plugins:[(0,B.createStopGuardPlugin)(),...t?[]:[...m?[(0,L.createScriptProtectPlugin)(g)]:[],_?(0,H.default)({autoExcludeNodeModules:!0,threadPool:!0,options:{...p,target:"browser",debugProtection:!1,disableConsoleOutput:!1,domainLock:[],selfDefending:!1,renameGlobals:!1,renameProperties:!1,reservedNames:[...p.reservedNames||[],...g]}}):[],...m?[(0,L.createKjstEmbedPlugin)()]:[]]]})}if(t)return;const a=n.join(e,"msbundle");if(await s.ensureDir(a),(r||c)&&await s.copy(n.join(e,"scripts"),n.join(a,"scripts")),r){const l=Q();if(l.ok){console.log(`\u2705 \u68C0\u6D4B\u5230 ${l.version} (${l.path})`);const u=(0,E.spawnSync)(l.path,["-m","compileall","scripts"],{encoding:"utf8",cwd:a});u.status===0?(console.log("\u2705 \u6210\u529F\u7F16\u8BD1\u6240\u6709 Python \u6587\u4EF6"),await U(n.join(a,"scripts"))):(console.error("\u274C \u7F16\u8BD1 Python \u6587\u4EF6\u5931\u8D25"),console.error(u.stderr),process.exit(1))}else console.warn("\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 Python 3.14\uFF0C\u8BF7\u786E\u4FDD\u5728\u76EE\u6807\u8FD0\u884C\u73AF\u5883\u5B89\u88C5 Python 3.14")}else if(c){const l=await X(e),u=n.join(a,"scripts");if(l.bundle?await(0,G.bundleLuaScripts)(u):console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u5355\u6587\u4EF6\u5408\u5E76\uFF08obfuscator.json bundle=false\uFF09"),!l.enabled)console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u6DF7\u6DC6\uFF08obfuscator.json enabled=false\uFF09");else{const w=[],m=async y=>{const p=await s.readdir(y,{withFileTypes:!0});for(const d of p){const h=n.join(y,d.name);d.isDirectory()?await m(h):d.isFile()&&d.name.endsWith(".lua")&&w.push(h)}};await m(u);const _=Z(e);_||(console.error("\u274C \u672A\u627E\u5230 @gamely/prometheus-cli\uFF0C\u65E0\u6CD5\u6DF7\u6DC6 Lua"),process.exit(1));for(const y of w){const p=n.relative(u,y);console.log(`\u{1F6E0}\uFE0F \u6DF7\u6DC6 Lua: ${p} (preset=${l.preset})`);const d=(0,E.spawnSync)(process.execPath,[_,p,"--preset",l.preset],{cwd:u,encoding:"utf8"});d.status!==0&&(console.error("\u274C \u6DF7\u6DC6 Lua \u5931\u8D25:",p),console.error(d.stderr||d.stdout||""),process.exit(1));const h=p.replace(/\.lua$/,".obfuscated.lua"),g=n.join(u,h);await s.pathExists(g)&&(await s.remove(y),await s.move(g,y,{overwrite:!0}))}console.log("\u2705 Lua \u6DF7\u6DC6\u5B8C\u6210")}}await s.copy(n.join(e,"res"),n.join(a,"res")),await s.copy(n.join(e,"ui"),n.join(a,"ui"));for(const l of["logo.jpg","logo.png"]){const u=n.join(e,l);await s.pathExists(u)&&await s.copy(u,n.join(a,l))}const f=n.join(e,"dist"),P=n.join(e,"package.json"),S=n.join(a,"package.json"),b=await s.readJSON(P);delete b.scripts,delete b.devDependencies,delete b.dependencies,await s.writeJSON(S,b,{spaces:2}),await s.emptyDir(f);const j=n.join(f,"ms.zip"),J=n.join(f,"ms.msbundle");await R(a,j),await s.rename(j,J),await s.remove(a)};exports.buildAll=k;
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var R=exports&&exports.__createBinding||(Object.create?(function(e,t,r,o){o===void 0&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}):(function(e,t,r,o){o===void 0&&(o=r),e[o]=t[r]})),J=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),N=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var o=[];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(o[o.length]=n);return o},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var o=e(t),n=0;n<o.length;n++)o[n]!=="default"&&R(r,t,o[n]);return J(r,t),r}})();Object.defineProperty(exports,"__esModule",{value:!0});const a=require("commander"),M=N(require("os")),m=N(require("path")),G=require("./build"),p=N(require("fs-extra")),h=require("./project"),W=require("./packager"),H=require("./ws-manager"),k=require("kuaijs-forward-service/daemon.js"),B=require("./version"),A=require("./mcp/docs-service"),L=require("./mcp/httpapi-docs-service"),j=require("./mcp/tool-utils"),U=require("./mcp/types"),x=require("./mcp/ocr-tools"),P=require("./mcp/image-tools"),d=m.join(M.tmpdir(),"ms-cli-ws-server.json");async function F(e){try{const t=m.join(e,"package.json"),r=m.join(e,"scripts"),[o,n]=await Promise.all([p.pathExists(t),p.pathExists(r)]);return o&&n}catch{return!1}}async function C(e){await F(e)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - package.json"),console.error(" - scripts/ \u76EE\u5F55"),process.exit(1))}function c(e,t,r,o,n){const i=(e??String(t)).trim(),s=Number.parseInt(i,10);if(!Number.isInteger(s)||s<o||n!==void 0&&s>n)throw new Error(`\u65E0\u6548 ${r}: ${i}\uFF0C\u5141\u8BB8\u8303\u56F4 ${o}${n===void 0?"+":`..${n}`}`);return s}function V(e,t,r,o,n){const i=(e??String(t)).trim(),s=Number.parseFloat(i);if(!Number.isFinite(s)||s<o||s>n)throw new Error(`\u65E0\u6548 ${r}: ${i}\uFF0C\u5141\u8BB8\u8303\u56F4 ${o}..${n}`);return s}function g(e,t,r,o){const n=(e??t).trim();if(!r.includes(n))throw new Error(`\u65E0\u6548 ${o}: ${n}\uFF0C\u53EF\u9009\u503C: ${r.join("|")}`);return n}function z(e){const t=e?.trim().toUpperCase();return g(t,"GET",["GET","POST"],"method")}function E(e){const t=e.ip?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --ip \u6307\u5B9A\u8BBE\u5907 IP \u5730\u5740");const r=c(e.port,9800,"port",1,65535);return{ip:t,port:String(r),label:`${t}:${r}`}}async function $(e,t,r){if(t?.trim()){const o=m.resolve(t.trim());await p.ensureDir(m.dirname(o)),await p.writeFile(o,e,"utf8"),console.log(`\u2705 ${r}: ${o}`);return}console.log(e)}function K(){const e=["js","js_zh","python","lua"];return["KuaiJS \u6587\u6863\u8DEF\u5F84:",`docsRoot: ${(0,A.getDocsRootDir)()}`,...e.map(t=>`${t}: ${(0,A.getDocsDirByLanguage)(t)} (${U.DOC_LANGUAGE_LABELS[t]})`),`httpApi: ${(0,L.getHttpApiDocPath)()}`,"\u8BF4\u660E: \u76F4\u63A5\u8BFB\u53D6\u4E0A\u8FF0 markdown \u8DEF\u5F84\u3002"].join(`
2
+ "use strict";var R=exports&&exports.__createBinding||(Object.create?(function(e,t,r,o){o===void 0&&(o=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,n)}):(function(e,t,r,o){o===void 0&&(o=r),e[o]=t[r]})),J=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),N=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(r){var o=[];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(o[o.length]=n);return o},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null)for(var o=e(t),n=0;n<o.length;n++)o[n]!=="default"&&R(r,t,o[n]);return J(r,t),r}})();Object.defineProperty(exports,"__esModule",{value:!0});const a=require("commander"),M=N(require("os")),m=N(require("path")),G=require("./build"),p=N(require("fs-extra")),h=require("./device/project"),W=require("./packaging"),H=require("./device/ws-manager"),k=require("kuaijs-forward-service/daemon.js"),B=require("./version"),A=require("./mcp/docs-service"),L=require("./mcp/httpapi-docs-service"),j=require("./mcp/tool-utils"),U=require("./mcp/types"),x=require("./mcp/ocr-tools"),P=require("./mcp/image-tools"),d=m.join(M.tmpdir(),"ms-cli-ws-server.json");async function F(e){try{const t=m.join(e,"package.json"),r=m.join(e,"scripts"),[o,n]=await Promise.all([p.pathExists(t),p.pathExists(r)]);return o&&n}catch{return!1}}async function C(e){await F(e)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - package.json"),console.error(" - scripts/ \u76EE\u5F55"),process.exit(1))}function c(e,t,r,o,n){const i=(e??String(t)).trim(),s=Number.parseInt(i,10);if(!Number.isInteger(s)||s<o||n!==void 0&&s>n)throw new Error(`\u65E0\u6548 ${r}: ${i}\uFF0C\u5141\u8BB8\u8303\u56F4 ${o}${n===void 0?"+":`..${n}`}`);return s}function V(e,t,r,o,n){const i=(e??String(t)).trim(),s=Number.parseFloat(i);if(!Number.isFinite(s)||s<o||s>n)throw new Error(`\u65E0\u6548 ${r}: ${i}\uFF0C\u5141\u8BB8\u8303\u56F4 ${o}..${n}`);return s}function g(e,t,r,o){const n=(e??t).trim();if(!r.includes(n))throw new Error(`\u65E0\u6548 ${o}: ${n}\uFF0C\u53EF\u9009\u503C: ${r.join("|")}`);return n}function z(e){const t=e?.trim().toUpperCase();return g(t,"GET",["GET","POST"],"method")}function E(e){const t=e.ip?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --ip \u6307\u5B9A\u8BBE\u5907 IP \u5730\u5740");const r=c(e.port,9800,"port",1,65535);return{ip:t,port:String(r),label:`${t}:${r}`}}async function $(e,t,r){if(t?.trim()){const o=m.resolve(t.trim());await p.ensureDir(m.dirname(o)),await p.writeFile(o,e,"utf8"),console.log(`\u2705 ${r}: ${o}`);return}console.log(e)}function K(){const e=["js","js_zh","python","lua"];return["KuaiJS \u6587\u6863\u8DEF\u5F84:",`docsRoot: ${(0,A.getDocsRootDir)()}`,...e.map(t=>`${t}: ${(0,A.getDocsDirByLanguage)(t)} (${U.DOC_LANGUAGE_LABELS[t]})`),`httpApi: ${(0,L.getHttpApiDocPath)()}`,"\u8BF4\u660E: \u76F4\u63A5\u8BFB\u53D6\u4E0A\u8FF0 markdown \u8DEF\u5F84\u3002"].join(`
3
3
  `)}function X(e,t){return t.push(e),t}function q(e,t){const r=e?.trim();if(!r)return;if(r.startsWith("[")){const n=JSON.parse(r);if(!Array.isArray(n)||!n.every(i=>typeof i=="string"&&i.trim()))throw new Error(`${t} \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4\u3002`);return n.map(i=>i.trim())}const o=r.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(o.length===0)throw new Error(`${t} \u4E0D\u80FD\u4E3A\u7A7A\u3002`);return o}function Q(e){const t=q(e,"languages");if(!t)return;const r=new Set(x.APPLE_OCR_LANGUAGES),o=t.filter(n=>!r.has(n));if(o.length>0)throw new Error(`\u65E0\u6548 languages: ${o.join(", ")}\uFF0C\u53EF\u9009\u503C: ${x.APPLE_OCR_LANGUAGES.join(", ")}`);return t}function Y(e,t){const r=e?.trim();if(!r)return;const o=JSON.parse(r);if(!o||typeof o!="object"||Array.isArray(o)||!Object.values(o).every(n=>typeof n=="string"||typeof n=="number"||typeof n=="boolean"||n===null))throw new Error(`${t} \u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF0C\u4E14\u503C\u53EA\u80FD\u662F string/number/boolean/null\u3002`);return o}function Z(e){const t=e?.trim();if(!(t===void 0||t.length===0))try{return JSON.parse(t)}catch{return e}}function tt(e){const t=e.trim();if(/^https?:\/\//i.test(t))throw new Error("path \u53EA\u80FD\u4F20 HTTP API \u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u80FD\u4F20\u5B8C\u6574 URL\u3002");if(!t.startsWith("/"))throw new Error("path \u5FC5\u987B\u4EE5 / \u5F00\u5934\uFF0C\u4F8B\u5982 /api/status\u3002");if(t.includes("?"))throw new Error("path \u4E0D\u80FD\u5305\u542B query string\uFF0C\u8BF7\u4F7F\u7528 --query \u4F20\u9012\u67E5\u8BE2\u53C2\u6570\u3002");return t}function et(e,t){if(t)for(const[r,o]of Object.entries(t))o!==null&&e.searchParams.set(r,String(o))}function ot(e){return e===void 0?{}:{headers:{"Content-Type":"application/json"},requestBody:JSON.stringify(e)}}async function rt(e,t){const r=await e.text();return t==="text"?r:(0,j.formatRuntimeJsonText)(JSON.parse(r))}async function nt(e){try{const t=process.cwd(),r=e.dev||!1;console.log(`\u{1F50D} \u68C0\u67E5\u9879\u76EE\u76EE\u5F55: ${t}`),await C(t),console.log(`\u{1F680} \u5F00\u59CB\u6784\u5EFA\u9879\u76EE (${r?"\u5F00\u53D1\u6A21\u5F0F":"\u751F\u4EA7\u6A21\u5F0F"})...`),await(0,G.buildAll)(r,t),console.log("\u2705 \u6784\u5EFA\u5B8C\u6210!")}catch(t){console.error("\u274C \u6784\u5EFA\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function it(){try{const e=process.cwd();console.log(`\u{1F50D} \u68C0\u67E5\u9879\u76EE\u76EE\u5F55: ${e}`),await C(e),console.log("\u{1F4E6} \u5F00\u59CB\u6253\u5305\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6 bundle...");const t=await(0,W.packageProject)(e);console.log(`\u2705 \u6253\u5305\u5B8C\u6210: ${t}`)}catch(e){console.error("\u274C \u6253\u5305\u5931\u8D25:",e instanceof Error?e.message:e),process.exit(1)}}async function st(e){try{const t=process.cwd();await C(t),await(0,h.runOnDevice)(e)}catch(t){console.error("\u274C \u8FD0\u884C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function at(e){try{const t=process.cwd();await C(t),await(0,h.runUIOnDevice)(e)}catch(t){console.error("\u274C UI \u9884\u89C8\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ct(e){try{await(0,h.stopOnDevice)(e)}catch(t){console.error("\u274C \u505C\u6B62\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function pt(e){try{if((e.format??"file")==="base64"){const n=await(0,h.getScreenshotBase64OnDevice)(e);console.log(n);return}const r=await(0,h.getScreenshotOnDevice)(e),o=e.output?.trim()?m.resolve(e.output.trim()):m.resolve(process.cwd(),"screenshot.jpg");await p.ensureDir(m.dirname(o)),await p.writeFile(o,r),console.log(`\u2705 \u622A\u56FE\u6210\u529F: ${o} (${r.length} bytes)`)}catch(t){console.error("\u274C \u622A\u56FE\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ut(e){try{const t=(e.maxDepth??"50").trim(),r=(e.timeout??"120").trim(),o=(e.mode??"1").trim(),n=Number.parseInt(t,10),i=Number.parseInt(r,10),s=Number.parseInt(o,10);if(!Number.isInteger(n)||n<1)throw new Error(`\u65E0\u6548 max-depth: ${t}`);if(!Number.isInteger(i)||i<1)throw new Error(`\u65E0\u6548 timeout: ${r}`);if(!Number.isInteger(s)||s!==1&&s!==2&&s!==3)throw new Error(`\u65E0\u6548 mode: ${o}`);const u=await(0,h.getSourceOnDevice)(e,n,i,s);if(e.output?.trim()){const l=m.resolve(e.output.trim());await p.ensureDir(m.dirname(l)),await p.writeFile(l,u,"utf8"),console.log(`\u2705 \u8282\u70B9\u5DF2\u4FDD\u5B58: ${l}`);return}console.log(u)}catch(t){console.error("\u274C \u83B7\u53D6\u8282\u70B9\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function mt(e){try{const t=c(e.limit,200,"limit",1,5e3),r=g(e.format,"text",["text","json"],"format"),o=await(0,h.getCurrentLogLinesOnDevice)(e,t),n=r==="json"?(0,j.formatRuntimeJsonText)(o):o.lines.length>0?o.lines.join(`
4
4
  `):"\u65E0\u65E5\u5FD7";await $(n,e.output,"\u65E5\u5FD7\u5DF2\u4FDD\u5B58"),r==="text"&&o.hasMore&&!e.output?.trim()&&console.error(`\u8FD8\u6709\u66F4\u65E9\u65E5\u5FD7\uFF0C\u53EF\u589E\u5927 --limit\uFF0C\u5F53\u524D\u6700\u591A ${t} \u884C\u3002`)}catch(t){console.error("\u274C \u83B7\u53D6\u65E5\u5FD7\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function dt(e){try{await $(K(),e.output,"\u6587\u6863\u8DEF\u5F84\u5DF2\u4FDD\u5B58")}catch(t){console.error("\u274C \u8F93\u51FA\u6587\u6863\u8DEF\u5F84\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function lt(e){try{const t=E(e),r=z(e.method),o=tt(e.path??""),n=await(0,L.findHttpApiDocEntry)(o,r);if(!n)throw new Error(`HTTP API \u6587\u6863\u4E2D\u4E0D\u5B58\u5728\u8BE5\u63A5\u53E3: ${r} ${o}\u3002\u8BF7\u5148\u8BFB\u53D6 docs paths \u8FD4\u56DE\u7684 HTTP API \u6587\u6863\u8DEF\u5F84\u3002`);const i=Y(e.query,"query"),s=Z(e.body);if(r==="GET"&&s!==void 0)throw new Error("GET \u63A5\u53E3\u4E0D\u80FD\u4F20 body\uFF0C\u8BF7\u4F7F\u7528 --query\u3002");const u=g(e.responseFormat,"json",["json","text"],"response-format"),l=c(e.timeoutMs,3e4,"timeout-ms",1e3,6e5),w=new URL(`http://${t.ip}:${t.port}${o}`);et(w,i);const S=new AbortController,b=setTimeout(()=>S.abort(),l);try{const{headers:I,requestBody:y}=ot(s),f=await fetch(w.toString(),{method:r,signal:S.signal,headers:I,body:y}),T=await rt(f,u),_=[`HTTP API \u8C03\u7528${f.ok?"\u6210\u529F":"\u5931\u8D25"}: ${r} ${o}`,`\u8BBE\u5907: ${t.label}`,`\u6587\u6863: ${n.title} (lines ${n.startLine}-${n.endLine})`,`\u72B6\u6001\u7801: ${f.status}`,"",T].join(`
5
5
  `);await $(_,e.output,"HTTP API \u54CD\u5E94\u5DF2\u4FDD\u5B58"),f.ok||process.exit(1)}finally{clearTimeout(b)}}catch(t){const r=t instanceof Error&&t.name==="AbortError"?"\u8BF7\u6C42\u8D85\u65F6":t instanceof Error?t.message:String(t);console.error("\u274C HTTP API \u8C03\u7528\u5931\u8D25:",r),process.exit(1)}}async function ft(e){try{const t=E(e),r=g(e.engine,"appleocr",["appleocr","paddleocr"],"engine"),o=g(e.mode,"recognize",["recognize","numbers","findText"],"mode"),n=e.input?.trim()||"screen",i=c(e.x,0,"x",0),s=c(e.y,0,"y",0),u=c(e.ex,0,"ex",0),l=c(e.ey,0,"ey",0),w=[...q(e.texts,"texts")??[],...e.text??[]],S=w.length>0?w:void 0,b=Q(e.languages),I=V(e.confidenceThreshold,.6,"confidence-threshold",0,1),y=e.paddleModel===void 0?void 0:g(e.paddleModel,x.PADDLE_OCR_MODELS[0],x.PADDLE_OCR_MODELS,"paddle-model"),f=e.maxSideLen===void 0?void 0:c(e.maxSideLen,0,"max-side-len",0),T=e.useGpu===!0?!0:void 0,_=c(e.timeoutMs,6e4,"timeout-ms",1e3,6e5),v=g(e.format,"summary",["summary","json"],"format"),O=await(0,x.runOcrRecognitionOnDevice)(t,{engine:r,mode:o,input:n,x:i,y:s,ex:u,ey:l,texts:S,languages:b,confidenceThreshold:I,exactMatch:e.exactMatch===!0,paddleModel:y,maxSideLen:f,useGpu:T,outputPath:v==="summary"?e.output:void 0,timeoutMs:_}),D=v==="json"?(0,j.formatRuntimeJsonText)(O.body):O.text;v==="json"?await $(D,e.output,"OCR \u7ED3\u679C\u5DF2\u4FDD\u5B58"):console.log([D,"",`device: ${t.label}`,`engine: ${r}`,`mode: ${o}`,`input: ${n}`,`region: x=${i}, y=${s}, ex=${u}, ey=${l}`,...r==="paddleocr"&&y?[`paddleModel: ${y}`]:[],...r==="paddleocr"&&f!==void 0?[`maxSideLen: ${f}`]:[],`status: ${O.status}`].join(`
@@ -0,0 +1 @@
1
+ "use strict";var D=exports&&exports.__createBinding||(Object.create?(function(t,e,r,n){n===void 0&&(n=r);var s=Object.getOwnPropertyDescriptor(e,r);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,s)}):(function(t,e,r,n){n===void 0&&(n=r),t[n]=e[r]})),F=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),v=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var n=[];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(n[n.length]=s);return n},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var n=t(e),s=0;s<n.length;s++)n[s]!=="default"&&D(r,e,n[s]);return F(r,e),r}})(),I=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getScreenshotOnDevice=C,exports.getScreenshotBase64OnDevice=U,exports.getSourceOnDevice=k,exports.getCurrentLogLinesOnDevice=A,exports.runOnDevice=z,exports.runUIOnDevice=G,exports.stopOnDevice=V;const f=v(require("fs-extra")),w=v(require("path")),T=require("../build"),N=I(require("crc")),h=require("./ws-manager");function g(t){const e=t.ip?.trim(),r=(t.port??"9800").trim(),n=Number.parseInt(r,10);if(!e)throw new Error("\u8BF7\u901A\u8FC7 --ip \u6307\u5B9A\u8BBE\u5907 IP \u5730\u5740");if(!Number.isInteger(n)||n<1||n>65535)throw new Error(`\u65E0\u6548\u7AEF\u53E3: ${r}`);return{ip:e,port:n}}function q(t){const e=(t.wsPort??"31111").trim(),r=(t.wsWaitMs??"30000").trim(),n=Number.parseInt(e,10),s=Number.parseInt(r,10);if(!Number.isInteger(n)||n<1||n>65535)throw new Error(`\u65E0\u6548 ws \u7AEF\u53E3: ${e}`);if(!Number.isInteger(s)||s<1)throw new Error(`\u65E0\u6548 ws \u7B49\u5F85\u65F6\u95F4: ${r}`);return{wsPort:n,wsWaitMs:s}}function d(t){const e=(t.transport??"http").trim().toLowerCase();if(e!=="http"&&e!=="ws")throw new Error(`\u65E0\u6548 transport: ${e}`);return e}async function j(t){const e=await f.readFile(t);return N.default.crc32(e).toString(16).padStart(8,"0")}async function b(t,e){const r=[];async function n(s){const c=await f.readdir(s,{withFileTypes:!0});for(const i of c){const o=w.join(s,i.name);if(i.isDirectory())await n(o);else if(i.isFile()){const a=w.relative(t,o).replace(/\\/g,"/"),l=await f.stat(o);r.push({path:o,bundlePath:`${e}/${a}`,size:l.size,crc32:await j(o)})}}}return await f.pathExists(t)&&await n(t),r}async function E(t){const e=w.join(t,"package.json"),r=await f.readJSON(e),n=r.name,s=r.appVersion;if(!n)throw new Error("\u8BF7\u5728 package.json \u4E2D\u6DFB\u52A0 name \u5B57\u6BB5");if(!s)throw new Error("\u8BF7\u5728 package.json \u4E2D\u6DFB\u52A0 appVersion \u5B57\u6BB5");return{projectName:n,appVersion:s,packageJsonPath:e}}async function _(t){let e=w.join(t,"dist","scripts");const r=await f.pathExists(w.join(t,"scripts","main.py")),n=await f.pathExists(w.join(t,"scripts","main.lua"));(r||n)&&(e=w.join(t,"scripts"));const s=w.join(t,"ui"),c=w.join(t,"res"),i=w.join(t,"package.json"),o=[{path:i,bundlePath:"package.json",size:(await f.stat(i)).size,crc32:await j(i)}],[a,l,u]=await Promise.all([b(e,"scripts"),b(s,"ui"),b(c,"res")]);return o.push(...a,...l,...u),o}async function O(t){await(0,T.buildAll)(!0,t)}async function B(t,e,r){const n=new URL(`http://${t}:${e}/api/files`);n.searchParams.set("projectName",r);const s=await fetch(n.toString(),{method:"GET"});if(!s.ok)throw new Error(`\u6587\u4EF6\u5217\u8868\u8BF7\u6C42\u5931\u8D25: ${s.statusText}`);const c=await s.json();return Array.isArray(c)?c:[]}async function L(t){const e=await h.WSManager.request("files",{projectName:t});if(!e.success)throw new Error(`\u6587\u4EF6\u5217\u8868\u8BF7\u6C42\u5931\u8D25: ${String(e.message??"unknown")}`);const r=e.data;return Array.isArray(r)?r:[]}async function M(t,e,r){const{projectName:n,appVersion:s}=await E(t);console.log("\u{1F50E} \u6B63\u5728\u83B7\u53D6\u8BBE\u5907\u6587\u4EF6\u5217\u8868...");const c=await B(e,r,n),i=new Map(c.map(u=>[u.path,u]));console.log("\u{1F4C2} \u6B63\u5728\u5206\u6790\u9879\u76EE\u6587\u4EF6...");const o=await _(t),a=[];for(const u of o){const p=i.get(u.bundlePath),y=u.bundlePath.includes("main.js")||u.bundlePath.includes("main.py")||u.bundlePath.includes("main.lua");if(!p){a.push(u);continue}const S=p.size!==u.size||p.crc32.toLowerCase()!==u.crc32.toLowerCase();(y||S)&&a.push(u)}if(console.log(`\u{1F4E6} \u53D1\u73B0 ${a.length} \u4E2A\u6587\u4EF6\u9700\u8981\u540C\u6B65`),a.length===0){console.log("\u2705 \u65E0\u9700\u540C\u6B65\u6587\u4EF6");return}let l=0;for(const u of a){l+=1,console.log(`\u2B06\uFE0F [${l}/${a.length}] \u540C\u6B65 ${u.bundlePath}`);const p=await f.readFile(u.path),y=new URL(`http://${e}:${r}/debug/patchSync`);y.searchParams.set("path",u.bundlePath),y.searchParams.set("projectName",n),y.searchParams.set("appVersion",s);const S=await fetch(y.toString(),{method:"POST",headers:{"Content-Type":"application/octet-stream"},body:p});if(!S.ok)throw new Error(`\u540C\u6B65\u5931\u8D25: ${u.bundlePath} (\u72B6\u6001\u7801: ${S.status})`)}console.log(`\u2705 \u540C\u6B65\u5B8C\u6210\uFF0C\u5171 ${a.length} \u4E2A\u6587\u4EF6`)}async function W(t){const{projectName:e,appVersion:r}=await E(t);console.log("\u{1F50E} \u6B63\u5728\u83B7\u53D6\u8BBE\u5907\u6587\u4EF6\u5217\u8868...");const n=await L(e),s=new Map(n.map(a=>[a.path,a]));console.log("\u{1F4C2} \u6B63\u5728\u5206\u6790\u9879\u76EE\u6587\u4EF6...");const c=await _(t),i=[];for(const a of c){const l=s.get(a.bundlePath),u=a.bundlePath.includes("main.js")||a.bundlePath.includes("main.py")||a.bundlePath.includes("main.lua");if(!l){i.push(a);continue}const p=l.size!==a.size||l.crc32.toLowerCase()!==a.crc32.toLowerCase();(u||p)&&i.push(a)}if(console.log(`\u{1F4E6} \u53D1\u73B0 ${i.length} \u4E2A\u6587\u4EF6\u9700\u8981\u540C\u6B65`),i.length===0){console.log("\u2705 \u65E0\u9700\u540C\u6B65\u6587\u4EF6");return}let o=0;for(const a of i){o+=1,console.log(`\u2B06\uFE0F [${o}/${i.length}] \u540C\u6B65 ${a.bundlePath}`);const l=await f.readFile(a.path),u=await h.WSManager.request("patchSync",{path:a.bundlePath,data:l.toString("base64"),projectName:e,appVersion:r});if(!u.success)throw new Error(`\u540C\u6B65\u5931\u8D25: ${a.bundlePath} ${String(u.message??"")}`)}console.log(`\u2705 \u540C\u6B65\u5B8C\u6210\uFF0C\u5171 ${i.length} \u4E2A\u6587\u4EF6`)}async function m(t,e,r){const n=`http://${e}:${r}/api/${t}`,s=await fetch(n,{method:"GET"});if(!s.ok)throw new Error(`${t} \u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${s.status}`)}async function C(t){if(d(t)==="ws"){await $(t);const o=await h.WSManager.request("screenshot");if(!o.success||typeof o.data!="string")throw new Error(`\u622A\u56FE\u5931\u8D25: ${String(o.message??"unknown")}`);return Buffer.from(o.data,"base64")}const{ip:r,port:n}=g(t),s=`http://${r}:${n}/api/screenshot`,c=await fetch(s,{method:"GET"});if(!c.ok)throw new Error(`\u622A\u56FE\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${c.status}`);const i=await c.arrayBuffer();return Buffer.from(i)}async function U(t){if(d(t)==="ws"){await $(t);const o=await h.WSManager.request("screenshot");if(!o.success||typeof o.data!="string")throw new Error(`\u622A\u56FE(base64)\u5931\u8D25: ${String(o.message??"unknown")}`);return o.data}const{ip:r,port:n}=g(t),s=`http://${r}:${n}/api/screenshotBase64`,c=await fetch(s,{method:"GET"});if(!c.ok)throw new Error(`\u622A\u56FE(base64)\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${c.status}`);const i=await c.json();if(!i.success||typeof i.data!="string")throw new Error(`\u622A\u56FE(base64)\u5931\u8D25: ${String(i.message??"unknown")}`);return i.data}async function k(t,e=50,r=120,n=1){const s=d(t);if(!Number.isInteger(e)||e<1)throw new Error(`\u65E0\u6548 maxDepth: ${e}`);if(!Number.isInteger(r)||r<1)throw new Error(`\u65E0\u6548 timeout: ${r}`);if(!Number.isInteger(n)||n!==1&&n!==2&&n!==3)throw new Error(`\u65E0\u6548 mode: ${n}`);if(s==="ws"){await $(t);const l=await h.WSManager.request("source",{max_depth:e,timeout:r,maxDepth:e,mode:n});if(!l.success||typeof l.data!="string")throw new Error(`\u83B7\u53D6\u8282\u70B9\u5931\u8D25: ${String(l.message??"unknown")}`);return l.data}const{ip:c,port:i}=g(t),o=new URL(`http://${c}:${i}/api/source`);o.searchParams.set("max_depth",String(e)),o.searchParams.set("timeout",String(r)),o.searchParams.set("mode",String(n));const a=await fetch(o.toString(),{method:"GET"});if(!a.ok)throw new Error(`\u83B7\u53D6\u8282\u70B9\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${a.status}`);return a.text()}async function A(t,e=200){if(d(t)!=="http")throw new Error("\u83B7\u53D6\u65E5\u5FD7\u5931\u8D25: \u5F53\u524D\u65E5\u5FD7\u884C\u63A5\u53E3\u4EC5\u652F\u6301 http \u4F20\u8F93");if(!Number.isInteger(e)||e<1||e>5e3)throw new Error(`\u83B7\u53D6\u65E5\u5FD7\u5931\u8D25: \u65E0\u6548 count ${e}`);const{ip:n,port:s}=g(t),c=new URL(`http://${n}:${s}/logger/current/lines`);c.searchParams.set("count",String(e));const i=await fetch(c.toString(),{method:"GET"});if(i.status===404)return{lines:[],hasMore:!1};if(!i.ok)throw new Error(`\u83B7\u53D6\u65E5\u5FD7\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${i.status}`);const o=await i.json();return{lines:Array.isArray(o.lines)?o.lines.map(a=>String(a)):[],hasMore:o.hasMore===!0}}async function P(t){const e=await h.WSManager.request(t);if(!e.success)throw new Error(`${t} \u5931\u8D25: ${String(e.message??"unknown")}`)}async function $(t){const{wsPort:e,wsWaitMs:r}=q(t),n=h.WSManager.get();n.isStarted()||await n.start(e),h.WSManager.isConnected()||(console.log("\u231B \u7B49\u5F85\u8BBE\u5907\u901A\u8FC7 WS \u8FDE\u63A5..."),await n.waitForClient(r))}async function z(t){const e=t.workspacePath?w.resolve(t.workspacePath):process.cwd(),r=d(t);if(console.log(`\u{1F527} \u5F00\u59CB\u6784\u5EFA\u9879\u76EE: ${e}`),await O(e),r==="ws"){await $(t),console.log("\u{1F4E6} \u5F00\u59CB\u901A\u8FC7 WS \u540C\u6B65\u9879\u76EE\u5230\u8BBE\u5907"),await W(e),console.log("\u{1F680} \u5F00\u59CB\u901A\u8FC7 WS \u8FD0\u884C\u9879\u76EE"),await P("run"),console.log("\u2705 \u8FD0\u884C\u8BF7\u6C42\u5DF2\u53D1\u9001");return}const{ip:n,port:s}=g(t);console.log(`\u{1F4E6} \u5F00\u59CB\u540C\u6B65\u9879\u76EE\u5230\u8BBE\u5907: ${n}:${s}`),await M(e,n,s),console.log(`\u{1F680} \u5F00\u59CB\u8FD0\u884C\u9879\u76EE: ${n}:${s}`),await m("run",n,s),console.log("\u2705 \u8FD0\u884C\u8BF7\u6C42\u5DF2\u53D1\u9001")}async function G(t){const e=t.workspacePath?w.resolve(t.workspacePath):process.cwd(),r=d(t);if(console.log(`\u{1F527} \u5F00\u59CB\u6784\u5EFA\u9879\u76EE: ${e}`),await O(e),r==="ws"){await $(t),console.log("\u{1F4E6} \u5F00\u59CB\u901A\u8FC7 WS \u540C\u6B65\u9879\u76EE\u5230\u8BBE\u5907"),await W(e),console.log("\u{1F5BC}\uFE0F \u5F00\u59CB\u901A\u8FC7 WS \u9884\u89C8 UI"),await P("runUI"),console.log("\u2705 UI \u9884\u89C8\u8BF7\u6C42\u5DF2\u53D1\u9001");return}const{ip:n,port:s}=g(t);console.log(`\u{1F4E6} \u5F00\u59CB\u540C\u6B65\u9879\u76EE\u5230\u8BBE\u5907: ${n}:${s}`),await M(e,n,s),console.log(`\u{1F5BC}\uFE0F \u5F00\u59CB\u9884\u89C8 UI: ${n}:${s}`),await m("runUI",n,s),console.log("\u2705 UI \u9884\u89C8\u8BF7\u6C42\u5DF2\u53D1\u9001")}async function V(t){if(d(t)==="ws"){await $(t),console.log("\u{1F6D1} \u5F00\u59CB\u901A\u8FC7 WS \u505C\u6B62\u9879\u76EE"),await P("stop"),console.log("\u2705 \u505C\u6B62\u8BF7\u6C42\u5DF2\u53D1\u9001");return}const{ip:r,port:n}=g(t);console.log(`\u{1F6D1} \u5F00\u59CB\u505C\u6B62\u9879\u76EE: ${r}:${n}`),await m("stop",r,n),console.log("\u2705 \u505C\u6B62\u8BF7\u6C42\u5DF2\u53D1\u9001")}
@@ -1,3 +1,3 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildDeviceLogSnapshotText=s;const i=require("../project");async function s(e,t){const n=await(0,i.getCurrentLogLinesOnDevice)({ip:e.ip,port:e.port,transport:"http"},t),o=n.lines.length>0?n.lines.join(`
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildDeviceLogSnapshotText=s;const i=require("../device/project");async function s(e,t){const n=await(0,i.getCurrentLogLinesOnDevice)({ip:e.ip,port:e.port,transport:"http"},t),o=n.lines.length>0?n.lines.join(`
2
2
  `):"\u65E0\u65E5\u5FD7";return[`\u8BBE\u5907: ${e.label}`,`\u8FD8\u6709\u66F4\u65E9\u65E5\u5FD7: ${n.hasMore?"\u662F":"\u5426"}`,"",`\u6700\u65B0\u65E5\u5FD7\uFF08\u6700\u591A ${t} \u884C\uFF09:`,o].join(`
3
3
  `)}
@@ -1,4 +1,4 @@
1
- "use strict";var B=exports&&exports.__createBinding||(Object.create?(function(e,t,n,r){r===void 0&&(r=n);var i=Object.getOwnPropertyDescriptor(t,n);(!i||("get"in i?!t.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,i)}):(function(e,t,n,r){r===void 0&&(r=n),e[r]=t[n]})),D=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),T=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(n){var r=[];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(r[r.length]=i);return r},e(t)};return function(t){if(t&&t.__esModule)return t;var n={};if(t!=null)for(var r=e(t),i=0;i<r.length;i++)r[i]!=="default"&&B(n,t,r[i]);return D(n,t),n}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.cropLocalImage=M,exports.cropDeviceScreen=j,exports.pickLocalImageColor=O,exports.pickDeviceScreenColor=G,exports.makeLocalImageTransparent=L,exports.registerImageTools=H;const E=T(require("fs-extra")),q=T(require("os")),h=T(require("path")),s=T(require("zod/v4")),v=require("../project"),g=require("./image-codec"),l=require("./tool-utils");function I(e,t,n){if(t&&t.trim())return h.resolve(t.trim());const r=h.parse(h.resolve(e));return h.join(r.dir,`${r.name}-${n}.png`)}function z(e,t,n){return e&&e.trim()?h.resolve(e.trim()):h.join(q.tmpdir(),`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${n}`)}async function _(e){const t=h.resolve(e.trim());if(!await E.pathExists(t))throw new Error(`\u56FE\u7247\u4E0D\u5B58\u5728: ${t}`);return t}function N(e){const t=e.trim().replace(/^#/,"");if(!/^[0-9a-fA-F]{6}$/.test(t))throw new Error("transparentColor \u5FC5\u987B\u662F #RRGGBB \u6216 RRGGBB \u683C\u5F0F\u3002");return{r:Number.parseInt(t.slice(0,2),16),g:Number.parseInt(t.slice(2,4),16),b:Number.parseInt(t.slice(4,6),16)}}function C(e){return`#${e.r.toString(16).padStart(2,"0")}${e.g.toString(16).padStart(2,"0")}${e.b.toString(16).padStart(2,"0")}`}function k(e,t,n,r){const i=r==="topRight"||r==="bottomRight"?t-1:0,o=((r==="bottomLeft"||r==="bottomRight"?n-1:0)*t+i)*4;return{r:e[o]??0,g:e[o+1]??0,b:e[o+2]??0}}function F(e,t,n,r){const i=(e[t]??0)-n.r,a=(e[t+1]??0)-n.g,o=(e[t+2]??0)-n.b;return Math.sqrt(i*i+a*a+o*o)<=r}function S(e,t,n,r,i,a){if(r>=t||i>=n)throw new Error(`\u5750\u6807\u8D85\u51FA\u56FE\u7247\u8303\u56F4: image=${t}x${n}, point=${r},${i}`);const o=Math.max(0,r-a),c=Math.min(t-1,r+a),u=Math.max(0,i-a),m=Math.min(n-1,i+a);let p=0,$=0,b=0,P=0,d=0;for(let y=u;y<=m;y+=1)for(let R=o;R<=c;R+=1){const w=(y*t+R)*4;p+=e[w]??0,$+=e[w+1]??0,b+=e[w+2]??0,P+=e[w+3]??0,d+=1}return{color:{r:Math.round(p/d),g:Math.round($/d),b:Math.round(b/d),a:Math.round(P/d)},sampleCount:d}}function x(e,t,n,r,i,a,o,c){return["\u53D6\u8272\u6210\u529F",`source: ${e}`,`image: ${i}x${a}`,`point: x=${t}, y=${n}`,`radius: ${r}`,`samplePixels: ${c}`,`hex: ${C(o)}`,`rgb: ${o.r},${o.g},${o.b}`,`rgba: ${o.r},${o.g},${o.b},${o.a}`].join(`
1
+ "use strict";var B=exports&&exports.__createBinding||(Object.create?(function(e,t,n,r){r===void 0&&(r=n);var i=Object.getOwnPropertyDescriptor(t,n);(!i||("get"in i?!t.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,i)}):(function(e,t,n,r){r===void 0&&(r=n),e[r]=t[n]})),D=exports&&exports.__setModuleDefault||(Object.create?(function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}):function(e,t){e.default=t}),T=exports&&exports.__importStar||(function(){var e=function(t){return e=Object.getOwnPropertyNames||function(n){var r=[];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(r[r.length]=i);return r},e(t)};return function(t){if(t&&t.__esModule)return t;var n={};if(t!=null)for(var r=e(t),i=0;i<r.length;i++)r[i]!=="default"&&B(n,t,r[i]);return D(n,t),n}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.cropLocalImage=M,exports.cropDeviceScreen=j,exports.pickLocalImageColor=O,exports.pickDeviceScreenColor=G,exports.makeLocalImageTransparent=L,exports.registerImageTools=H;const E=T(require("fs-extra")),q=T(require("os")),h=T(require("path")),s=T(require("zod/v4")),v=require("../device/project"),g=require("./image-codec"),l=require("./tool-utils");function I(e,t,n){if(t&&t.trim())return h.resolve(t.trim());const r=h.parse(h.resolve(e));return h.join(r.dir,`${r.name}-${n}.png`)}function z(e,t,n){return e&&e.trim()?h.resolve(e.trim()):h.join(q.tmpdir(),`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${n}`)}async function _(e){const t=h.resolve(e.trim());if(!await E.pathExists(t))throw new Error(`\u56FE\u7247\u4E0D\u5B58\u5728: ${t}`);return t}function N(e){const t=e.trim().replace(/^#/,"");if(!/^[0-9a-fA-F]{6}$/.test(t))throw new Error("transparentColor \u5FC5\u987B\u662F #RRGGBB \u6216 RRGGBB \u683C\u5F0F\u3002");return{r:Number.parseInt(t.slice(0,2),16),g:Number.parseInt(t.slice(2,4),16),b:Number.parseInt(t.slice(4,6),16)}}function C(e){return`#${e.r.toString(16).padStart(2,"0")}${e.g.toString(16).padStart(2,"0")}${e.b.toString(16).padStart(2,"0")}`}function k(e,t,n,r){const i=r==="topRight"||r==="bottomRight"?t-1:0,o=((r==="bottomLeft"||r==="bottomRight"?n-1:0)*t+i)*4;return{r:e[o]??0,g:e[o+1]??0,b:e[o+2]??0}}function F(e,t,n,r){const i=(e[t]??0)-n.r,a=(e[t+1]??0)-n.g,o=(e[t+2]??0)-n.b;return Math.sqrt(i*i+a*a+o*o)<=r}function S(e,t,n,r,i,a){if(r>=t||i>=n)throw new Error(`\u5750\u6807\u8D85\u51FA\u56FE\u7247\u8303\u56F4: image=${t}x${n}, point=${r},${i}`);const o=Math.max(0,r-a),c=Math.min(t-1,r+a),u=Math.max(0,i-a),m=Math.min(n-1,i+a);let p=0,$=0,b=0,P=0,d=0;for(let y=u;y<=m;y+=1)for(let R=o;R<=c;R+=1){const w=(y*t+R)*4;p+=e[w]??0,$+=e[w+1]??0,b+=e[w+2]??0,P+=e[w+3]??0,d+=1}return{color:{r:Math.round(p/d),g:Math.round($/d),b:Math.round(b/d),a:Math.round(P/d)},sampleCount:d}}function x(e,t,n,r,i,a,o,c){return["\u53D6\u8272\u6210\u529F",`source: ${e}`,`image: ${i}x${a}`,`point: x=${t}, y=${n}`,`radius: ${r}`,`samplePixels: ${c}`,`hex: ${C(o)}`,`rgb: ${o.r},${o.g},${o.b}`,`rgba: ${o.r},${o.g},${o.b},${o.a}`].join(`
2
2
  `)}function f(e){return(0,l.createTextToolResult)(e instanceof Error?e.message:String(e),!0)}async function M(e,t,n,r,i,a){const o=await _(e),c=I(o,a,"crop"),u=await(0,g.decodeImageToRgba)(o),m=(0,g.cropRgbaImage)(u,t,n,r,i),p=await(0,g.encodeRgbaToPngFile)(m,c);return["\u56FE\u7247\u88C1\u5207\u6210\u529F",`input: ${o}`,`output: ${c}`,`crop: x=${t}, y=${n}, width=${r}, height=${i}`,`size: ${p.size} bytes`].join(`
3
3
  `)}async function j(e,t,n,r,i,a){const o=await(0,v.getScreenshotOnDevice)({ip:e.ip,port:e.port,transport:"http"}),c=await(0,g.decodeImageToRgba)(o);if(t+r>c.width||n+i>c.height)throw new Error(`\u88C1\u5207\u8303\u56F4\u8D85\u51FA\u622A\u56FE\u5C3A\u5BF8: image=${c.width}x${c.height}, crop=${t},${n},${r},${i}`);const u=(0,g.cropRgbaImage)(c,t,n,r,i),m=z(a,"ms-mcp-screen-crop","png"),p=await(0,g.encodeRgbaToPngFile)(u,m);return["\u5C4F\u5E55\u88C1\u56FE\u6210\u529F",`device: ${e.label}`,`output: ${m}`,`screen: ${c.width}x${c.height}`,`crop: x=${t}, y=${n}, width=${r}, height=${i}`,`size: ${p.size} bytes`].join(`
4
4
  `)}async function O(e,t,n,r){const i=await _(e),a=await(0,g.decodeImageToRgba)(i),o=S(a.data,a.width,a.height,t,n,r);return x(i,t,n,r,a.width,a.height,o.color,o.sampleCount)}async function G(e,t,n,r){const i=await(0,v.getScreenshotOnDevice)({ip:e.ip,port:e.port,transport:"http"}),a=await(0,g.decodeImageToRgba)(i),o=S(a.data,a.width,a.height,t,n,r);return x(e.label,t,n,r,a.width,a.height,o.color,o.sampleCount)}async function L(e,t,n,r,i){const a=await _(e),o=I(a,t,"transparent"),c=await(0,g.decodeImageToRgba)(a),u=Buffer.from(c.data),m=n?N(n):k(u,c.width,c.height,r);let p=0;for(let b=0;b<u.length;b+=4)F(u,b,m,i)&&(u[b+3]=0,p+=1);const $=await(0,g.encodeRgbaToPngFile)({data:u,width:c.width,height:c.height},o);return["\u900F\u660E\u56FE\u5236\u4F5C\u6210\u529F",`input: ${a}`,`output: ${o}`,`image: ${c.width}x${c.height}`,`transparentColor: ${C(m)}`,`tolerance: ${i}`,`transparentPixels: ${p}`,`size: ${$.size} bytes`].join(`
@@ -1,4 +1,4 @@
1
- "use strict";var $=exports&&exports.__createBinding||(Object.create?(function(t,r,s,o){o===void 0&&(o=s);var c=Object.getOwnPropertyDescriptor(r,s);(!c||("get"in c?!r.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return r[s]}}),Object.defineProperty(t,o,c)}):(function(t,r,s,o){o===void 0&&(o=s),t[o]=r[s]})),R=exports&&exports.__setModuleDefault||(Object.create?(function(t,r){Object.defineProperty(t,"default",{enumerable:!0,value:r})}):function(t,r){t.default=r}),w=exports&&exports.__importStar||(function(){var t=function(r){return t=Object.getOwnPropertyNames||function(s){var o=[];for(var c in s)Object.prototype.hasOwnProperty.call(s,c)&&(o[o.length]=c);return o},t(r)};return function(r){if(r&&r.__esModule)return r;var s={};if(r!=null)for(var o=t(r),c=0;c<o.length;c++)o[c]!=="default"&&$(s,r,o[c]);return R(s,r),s}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerRuntimeTools=O;const b=w(require("fs-extra")),v=w(require("os")),T=w(require("path")),u=w(require("zod/v4")),P=require("../packager"),m=require("../project"),h=require("./device-config"),D=require("./device-log"),y=require("./project"),i=require("./tool-utils"),_=require("../usb-forward");function S(t,r,s){return t&&t.trim()?T.resolve(t.trim()):T.join(v.tmpdir(),`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${s}`)}function O(t){let r;function s(e){if(e&&e.trim())return r=T.resolve(e.trim()),r;if(r)return r;throw new Error("\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u8BF7\u5148\u8C03\u7528 set_workspace\uFF0C\u6216\u5728\u672C\u6B21\u5DE5\u5177\u8C03\u7528\u65F6\u4F20 workspacePath\u3002")}async function o(e){const n=s(e);return await(0,y.ensureValidKuaiJSProject)(n),n}t.registerTool("set_workspace",{title:"Set Workspace",description:"\u8BBE\u7F6E\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u7684\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u3002\u540E\u7EED build/run/package \u4F18\u5148\u4F7F\u7528\u8BE5\u76EE\u5F55\u3002",inputSchema:{workspacePath:u.string().min(1).describe("\u5FEB\u70B9JS \u9879\u76EE\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u9700\u5305\u542B package.json \u4E0E scripts\uFF09")}},async({workspacePath:e})=>{const n=await o(e);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u8BBE\u7F6E\u4E3A: ${n}`)}),t.registerTool("get_workspace",{title:"Get Workspace",description:"\u67E5\u770B\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u8BB0\u5FC6\u7684\u5DE5\u4F5C\u76EE\u5F55\u3002",inputSchema:{}},async()=>r?(0,i.createTextToolResult)(`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55: ${r}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u8BF7\u5148\u8C03\u7528 set_workspace\u3002"));function c(e){return e.length===0?"\u5F53\u524D\u65E0 USB \u8BBE\u5907":e.map((n,a)=>`[${a+1}] ${n.name} udid=${n.udid} ${n.ip}:${n.port}`).join(`
1
+ "use strict";var $=exports&&exports.__createBinding||(Object.create?(function(t,r,s,o){o===void 0&&(o=s);var c=Object.getOwnPropertyDescriptor(r,s);(!c||("get"in c?!r.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return r[s]}}),Object.defineProperty(t,o,c)}):(function(t,r,s,o){o===void 0&&(o=s),t[o]=r[s]})),R=exports&&exports.__setModuleDefault||(Object.create?(function(t,r){Object.defineProperty(t,"default",{enumerable:!0,value:r})}):function(t,r){t.default=r}),w=exports&&exports.__importStar||(function(){var t=function(r){return t=Object.getOwnPropertyNames||function(s){var o=[];for(var c in s)Object.prototype.hasOwnProperty.call(s,c)&&(o[o.length]=c);return o},t(r)};return function(r){if(r&&r.__esModule)return r;var s={};if(r!=null)for(var o=t(r),c=0;c<o.length;c++)o[c]!=="default"&&$(s,r,o[c]);return R(s,r),s}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.registerRuntimeTools=O;const b=w(require("fs-extra")),v=w(require("os")),T=w(require("path")),u=w(require("zod/v4")),P=require("../packaging"),m=require("../device/project"),h=require("./device-config"),D=require("./device-log"),y=require("./project"),i=require("./tool-utils"),_=require("../device/usb-forward");function S(t,r,s){return t&&t.trim()?T.resolve(t.trim()):T.join(v.tmpdir(),`${r}-${Date.now()}-${Math.random().toString(36).slice(2,8)}.${s}`)}function O(t){let r;function s(e){if(e&&e.trim())return r=T.resolve(e.trim()),r;if(r)return r;throw new Error("\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u8BF7\u5148\u8C03\u7528 set_workspace\uFF0C\u6216\u5728\u672C\u6B21\u5DE5\u5177\u8C03\u7528\u65F6\u4F20 workspacePath\u3002")}async function o(e){const n=s(e);return await(0,y.ensureValidKuaiJSProject)(n),n}t.registerTool("set_workspace",{title:"Set Workspace",description:"\u8BBE\u7F6E\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u7684\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u3002\u540E\u7EED build/run/package \u4F18\u5148\u4F7F\u7528\u8BE5\u76EE\u5F55\u3002",inputSchema:{workspacePath:u.string().min(1).describe("\u5FEB\u70B9JS \u9879\u76EE\u76EE\u5F55\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u9700\u5305\u542B package.json \u4E0E scripts\uFF09")}},async({workspacePath:e})=>{const n=await o(e);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u5DE5\u4F5C\u76EE\u5F55\u5DF2\u8BBE\u7F6E\u4E3A: ${n}`)}),t.registerTool("get_workspace",{title:"Get Workspace",description:"\u67E5\u770B\u5F53\u524D MCP \u8FDB\u7A0B\u5185\u8BB0\u5FC6\u7684\u5DE5\u4F5C\u76EE\u5F55\u3002",inputSchema:{}},async()=>r?(0,i.createTextToolResult)(`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55: ${r}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u8BF7\u5148\u8C03\u7528 set_workspace\u3002"));function c(e){return e.length===0?"\u5F53\u524D\u65E0 USB \u8BBE\u5907":e.map((n,a)=>`[${a+1}] ${n.name} udid=${n.udid} ${n.ip}:${n.port}`).join(`
2
2
  `)}t.registerTool("list_usb_devices",{title:"List USB Devices",description:"\u5217\u51FA\u5F53\u524D USB \u8F6C\u53D1\u8BBE\u5907\u3002",inputSchema:{}},async()=>{const e=(0,_.getSharedUsbDevices)();return(0,i.createTextToolResult)(`USB \u8BBE\u5907 (${e.length}):
3
3
  ${c(e)}`)}),t.registerTool("set_device",{title:"Set Device",description:"\u8BBE\u7F6E\u9ED8\u8BA4\u8BBE\u5907\u3002\u7F51\u7EDC\u8BBE\u5907\u4F20 ip/port\uFF0CUSB \u8BBE\u5907\u4F20 udid\u3002",inputSchema:{ip:u.string().min(1).optional().describe("\u8BBE\u5907 IP\uFF0C\u4F8B\u5982 192.168.1.100"),port:u.number().int().min(1).max(65535).optional().describe("\u8BBE\u5907\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 9800"),udid:u.string().min(1).optional().describe("USB \u8BBE\u5907 UDID")}},async({ip:e,port:n,udid:a})=>{if(a?.trim()){const p=a.trim(),l=(0,_.getSharedUsbDevices)().find(f=>f.udid===p);if(!l)throw new Error(`\u672A\u627E\u5230 USB \u8BBE\u5907 udid=${p}
4
4
  ${c((0,_.getSharedUsbDevices)())}`);const d=await(0,h.setDeviceConfig)(l.ip,l.port);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u8BBE\u5907\u5DF2\u8BBE\u7F6E\u4E3A USB ${l.name} (${d.ip}:${d.port})`)}if(!e?.trim())throw new Error("\u8BF7\u63D0\u4F9B ip\uFF0C\u6216\u63D0\u4F9B USB udid\u3002");const g=await(0,h.setDeviceConfig)(e,n);return(0,i.createTextToolResult)(`\u9ED8\u8BA4\u8BBE\u5907\u5DF2\u8BBE\u7F6E\u4E3A ${g.ip}:${g.port}`)}),t.registerTool("get_device",{title:"Get Device",description:"\u67E5\u770B\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u914D\u7F6E\u3002",inputSchema:{}},async()=>{const e=await(0,h.readDeviceConfig)();return e?(0,i.createTextToolResult)(`\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907: ${e.ip}:${e.port}`):(0,i.createTextToolResult)("\u5F53\u524D\u672A\u8BBE\u7F6E\u9ED8\u8BA4\u8BBE\u5907\uFF0C\u8BF7\u5148\u8C03\u7528 set_device\u3002")}),t.registerTool("take_screenshot",{title:"Take Screenshot",description:"\u83B7\u53D6\u5F53\u524D\u9ED8\u8BA4\u8BBE\u5907\u622A\u56FE\u3002\u53EF\u8FD4\u56DE base64\uFF0C\u6216\u843D\u5730\u5230\u6587\u4EF6\u540E\u8FD4\u56DE\u6587\u4EF6\u8DEF\u5F84\uFF08\u9ED8\u8BA4\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF09\u3002",inputSchema:{format:u.enum(["file","base64"]).optional().default("file").describe("\u622A\u56FE\u8FD4\u56DE\u683C\u5F0F\uFF1Afile=\u6587\u4EF6\u8DEF\u5F84\uFF0Cbase64=\u56FE\u7247 base64"),outputPath:u.string().min(1).optional().describe("\u5F53 format=file \u65F6\u53EF\u6307\u5B9A\u8F93\u51FA\u8DEF\u5F84\uFF0C\u4E0D\u4F20\u5219\u5199\u5165\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55")}},async({format:e,outputPath:n})=>{const a=await(0,i.resolveRuntimeHttpTarget)(),g=(0,i.createRuntimeHttpRequestOptions)(a);if(e==="base64"){const d=await(0,m.getScreenshotBase64OnDevice)(g);return(0,i.createTextToolResult)(`\u622A\u56FE\u6210\u529F: ${a.label}
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var o=exports&&exports.__createBinding||(Object.create?(function(r,e,n,t){t===void 0&&(t=n);var c=Object.getOwnPropertyDescriptor(e,n);(!c||("get"in c?!e.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,c)}):(function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]})),s=exports&&exports.__setModuleDefault||(Object.create?(function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}):function(r,e){r.default=e}),u=exports&&exports.__importStar||(function(){var r=function(e){return r=Object.getOwnPropertyNames||function(n){var t=[];for(var c in n)Object.prototype.hasOwnProperty.call(n,c)&&(t[t.length]=c);return t},r(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t=r(e),c=0;c<t.length;c++)t[c]!=="default"&&o(n,e,t[c]);return s(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});const i=u(require("fs-extra")),f=require("@modelcontextprotocol/sdk/server/stdio.js"),l=require("./mcp/tools"),a=require("./mcp/device-config"),_=require("./usb-forward");async function d(){const r=(0,l.createMcpServer)(),e=new f.StdioServerTransport,n=async()=>{try{await i.remove(a.DEVICE_CONFIG_FILE)}catch{}};process.once("SIGINT",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("SIGTERM",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("exit",()=>{try{i.removeSync(a.DEVICE_CONFIG_FILE)}catch{}});try{await(0,_.attachUsbForward)()}catch(t){const c=t instanceof Error?t.message:String(t);console.error(`USB \u8F6C\u53D1\u63A5\u5165\u5931\u8D25: ${c}`)}await r.connect(e)}d().catch(r=>{const e=r instanceof Error?r.message:String(r);console.error(`MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25: ${e}`),process.exit(1)});
2
+ "use strict";var o=exports&&exports.__createBinding||(Object.create?(function(r,e,n,t){t===void 0&&(t=n);var c=Object.getOwnPropertyDescriptor(e,n);(!c||("get"in c?!e.__esModule:c.writable||c.configurable))&&(c={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(r,t,c)}):(function(r,e,n,t){t===void 0&&(t=n),r[t]=e[n]})),s=exports&&exports.__setModuleDefault||(Object.create?(function(r,e){Object.defineProperty(r,"default",{enumerable:!0,value:e})}):function(r,e){r.default=e}),u=exports&&exports.__importStar||(function(){var r=function(e){return r=Object.getOwnPropertyNames||function(n){var t=[];for(var c in n)Object.prototype.hasOwnProperty.call(n,c)&&(t[t.length]=c);return t},r(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t=r(e),c=0;c<t.length;c++)t[c]!=="default"&&o(n,e,t[c]);return s(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0});const i=u(require("fs-extra")),f=require("@modelcontextprotocol/sdk/server/stdio.js"),l=require("./mcp/tools"),a=require("./mcp/device-config"),_=require("./device/usb-forward");async function d(){const r=(0,l.createMcpServer)(),e=new f.StdioServerTransport,n=async()=>{try{await i.remove(a.DEVICE_CONFIG_FILE)}catch{}};process.once("SIGINT",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("SIGTERM",()=>{n().catch(()=>{}).finally(()=>process.exit(0))}),process.once("exit",()=>{try{i.removeSync(a.DEVICE_CONFIG_FILE)}catch{}});try{await(0,_.attachUsbForward)()}catch(t){const c=t instanceof Error?t.message:String(t);console.error(`USB \u8F6C\u53D1\u63A5\u5165\u5931\u8D25: ${c}`)}await r.connect(e)}d().catch(r=>{const e=r instanceof Error?r.message:String(r);console.error(`MCP \u670D\u52A1\u542F\u52A8\u5931\u8D25: ${e}`),process.exit(1)});
@@ -0,0 +1 @@
1
+ "use strict";var s=exports&&exports.__createBinding||(Object.create?(function(t,e,n,r){r===void 0&&(r=n);var i=Object.getOwnPropertyDescriptor(e,n);(!i||("get"in i?!e.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return e[n]}}),Object.defineProperty(t,r,i)}):(function(t,e,n,r){r===void 0&&(r=n),t[r]=e[n]})),f=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),u=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(n){var r=[];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(r[r.length]=i);return r},t(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var r=t(e),i=0;i<r.length;i++)r[i]!=="default"&&s(n,e,r[i]);return f(n,e),n}})();Object.defineProperty(exports,"__esModule",{value:!0}),exports.packageProject=b;const l=require("child_process"),a=u(require("fs-extra")),c=u(require("path")),_=require("util"),d=require("../build"),E=(0,_.promisify)(l.execFile),o={ENCRYPT_TIMEOUT:3e4,BUNDLE_NAME:"ms.msbundle",ENCRYPTED_BUNDLE_NAME:"enc.msbundle"};function w(){return c.resolve(__dirname,"..","..")}function h(){const t=process.platform,e=process.arch;let n;if(t==="darwin")n=c.join("bin","mac","ms-bundle-enc");else if(t==="win32"&&e==="x64")n=c.join("bin","win","ms-bundle-enc.exe");else throw new Error(`\u4E0D\u652F\u6301\u7684\u7CFB\u7EDF\u5E73\u53F0: ${t}-${e}`);return c.join(w(),n)}async function p(t){const e=h();if(!await a.pathExists(e))throw new Error(`\u672A\u627E\u5230\u52A0\u5BC6\u5DE5\u5177: ${e}`);process.platform==="win32"||await a.chmod(e,493),await E(e,[t],{cwd:c.dirname(t),timeout:o.ENCRYPT_TIMEOUT});const r=c.join(c.dirname(t),o.ENCRYPTED_BUNDLE_NAME);if(!await a.pathExists(r))throw new Error("\u52A0\u5BC6\u5DE5\u5177\u672A\u751F\u6210 enc.msbundle \u6587\u4EF6");return await a.remove(t),r}async function b(t){await(0,d.buildAll)(!1,t);const e=c.join(t,"dist",o.BUNDLE_NAME);if(!await a.pathExists(e))throw new Error(`\u6784\u5EFA\u5931\u8D25\uFF0C\u672A\u627E\u5230 ${o.BUNDLE_NAME} \u6587\u4EF6`);return p(e)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-vite-plugin",
3
- "version": "1.5.4",
3
+ "version": "1.5.5",
4
4
  "type": "commonjs",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
package/dist/build.js DELETED
@@ -1 +0,0 @@
1
- "use strict";var x=Object.create;var M=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var C=(t,e,o,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of N(e))!z.call(t,r)&&r!==o&&M(t,r,{get:()=>e[r],enumerable:!(i=$(e,r))||i.enumerable});return t};var W=(t,e,o)=>(o=t!=null?x(q(t)):{},C(e||!t||!t.__esModule?M(o,"default",{value:t,enumerable:!0}):o,t));var K=exports&&exports.__createBinding||(Object.create?(function(t,e,o,i){i===void 0&&(i=o);var r=Object.getOwnPropertyDescriptor(e,o);(!r||("get"in r?!e.__esModule:r.writable||r.configurable))&&(r={enumerable:!0,get:function(){return e[o]}}),Object.defineProperty(t,i,r)}):(function(t,e,o,i){i===void 0&&(i=o),t[i]=e[o]})),A=exports&&exports.__setModuleDefault||(Object.create?(function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}):function(t,e){t.default=e}),O=exports&&exports.__importStar||(function(){var t=function(e){return t=Object.getOwnPropertyNames||function(o){var i=[];for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(i[i.length]=r);return i},t(e)};return function(e){if(e&&e.__esModule)return e;var o={};if(e!=null)for(var i=t(e),r=0;r<i.length;r++)i[r]!=="default"&&K(o,e,i[r]);return A(o,e),o}})(),D=exports&&exports.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildAll=void 0;const T=D(require("archiver")),E=require("child_process"),s=O(require("fs-extra")),F=O(require("os")),n=O(require("path")),B=require("./stopGuardPlugin"),G=require("./luaBundle"),L=require("./scriptProtect"),H=D(require("vite-plugin-bundle-obfuscator"));async function R(t,e){const o=(0,T.default)("zip",{zlib:{level:9}}),i=s.createWriteStream(e);return new Promise((r,c)=>{o.directory(t,!1).on("error",a=>c(a)).pipe(i),i.on("close",()=>r()),o.finalize()})}async function I(t,e){const o=[];async function i(r){const c=await s.readdir(r,{withFileTypes:!0});for(const a of c){const f=n.resolve(r,a.name);a.isDirectory()?await i(f):a.isFile()&&(/^main\.(js|ts)$/.test(a.name)||/_thread\.(js|ts)$/.test(a.name))&&o.push(n.relative(e,f))}}return await i(t),o}function Q(){const t=[{cmd:n.join(F.homedir(),".KuaiJSDevloper","python","python.exe"),args:["--version"]},{cmd:n.join(F.homedir(),".KuaiJSDevloper","python","bin","python"),args:["--version"]},{cmd:"python",args:["--version"]},{cmd:"python3",args:["--version"]},{cmd:"python3.14",args:["--version"]}];for(const e of t)try{const o=(0,E.spawnSync)(e.cmd,e.args,{encoding:"utf8"}),i=(o.stdout||o.stderr||"").trim();if(i&&/Python\s+3\.14(\.\d+)?/i.test(i))return{ok:!0,path:e.cmd,version:i}}catch{}return{ok:!1}}async function U(t){async function e(o){const i=await s.readdir(o,{withFileTypes:!0});for(const r of i){const c=n.join(o,r.name);if(r.isDirectory())if(r.name==="__pycache__"){const a=await s.readdir(c,{withFileTypes:!0});for(const f of a){const P=n.join(c,f.name);if(f.isFile()&&f.name.endsWith(".cpython-314.pyc")){const S=n.dirname(c),b=f.name.replace(/\.cpython-314\.pyc$/,".pyc"),j=n.join(S,b);await s.move(P,j,{overwrite:!0})}}try{await s.remove(c)}catch{}}else await e(c);else if(r.isFile())if(r.name.endsWith(".cpython-314.pyc")){const a=c.replace(".cpython-314.pyc",".pyc");await s.move(c,a,{overwrite:!0})}else r.name.endsWith(".py")&&await s.remove(c)}}await e(t)}const V=["Minify","Weak","Medium","Strong"];async function X(t){const e=n.join(t,"obfuscator.json");if(!await s.pathExists(e))return{enabled:!0,preset:"Medium",bundle:!0};try{const o=await s.readJSON(e),i=o?.enabled!==!1,r=o?.bundle!==!1,c=Y(o?.preset);return{enabled:i,preset:c,bundle:r}}catch(o){return console.error("\u274C \u65E0\u6CD5\u8BFB\u53D6 obfuscator.json"),console.error(o instanceof Error?o.message:String(o)),process.exit(1),{enabled:!0,preset:"Medium",bundle:!0}}}function Y(t){if(typeof t!="string")return"Medium";const e=V.find(o=>o.toLowerCase()===t.trim().toLowerCase());return e||(console.warn(`\u26A0\uFE0F obfuscator.json \u7684 preset \u65E0\u6548: ${t}\uFF0C\u5DF2\u6539\u7528 Medium`),"Medium")}function Z(t){const e=n.resolve(__dirname,"..");return[n.join(e,"node_modules/@gamely/prometheus-cli/bin/cli.js"),n.join(e,"..","@gamely/prometheus-cli/bin/cli.js")].find(i=>s.pathExistsSync(i))}const k=async(t=!0,e)=>{const o=n.join(e,"scripts"),i=await s.pathExists(n.join(o,"main.js"))||await s.pathExists(n.join(o,"main.ts")),r=await s.pathExists(n.join(o,"main.py")),c=await s.pathExists(n.join(o,"main.lua"));if(i){console.log("\u{1F680} \u5F00\u59CB\u6784\u5EFAJavaScript\u9879\u76EE...");const{build:l}=await import("vite"),u=n.join(e,"obfuscator.json");await s.pathExists(u)||(console.error("\u274C \u9519\u8BEF: \u5F53\u524D\u76EE\u5F55\u4E0D\u662F\u6709\u6548\u7684 \u5FEB\u70B9JS \u9879\u76EE"),console.error("\u8BF7\u786E\u4FDD\u76EE\u5F55\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6:"),console.error(" - obfuscator.json"),process.exit(1));const w=await s.readJSON(u),m=w.scriptProtect===!0,{enabled:_,scriptProtect:y,...p}=w,d=n.join(e,t?"dist":"msbundle"),h=await I(o,o);await s.remove(d);const g=!t&&m?(0,L.createScriptProtectHelpers)():[];!t&&m&&console.log("\u{1F510} \u5DF2\u542F\u7528 JS \u539F\u751F\u4FDD\u62A4\uFF08scriptProtect=true\uFF09");for(const v of h)await l({root:e,build:{lib:{entry:{[n.basename(v,n.extname(v))]:`./scripts/${v}`},fileName:()=>v.replace(/\.ts$/,".js"),formats:["iife"],name:"KuaiJS"},outDir:t?"dist/scripts":"msbundle/scripts",emptyOutDir:!1,sourcemap:t,minify:!t,target:"safari15"},plugins:[(0,B.createStopGuardPlugin)(),...t?[]:[...m?[(0,L.createScriptProtectPlugin)(g)]:[],_?(0,H.default)({autoExcludeNodeModules:!0,threadPool:!0,options:{...p,target:"browser",debugProtection:!1,disableConsoleOutput:!1,domainLock:[],selfDefending:!1,renameGlobals:!1,renameProperties:!1,reservedNames:[...p.reservedNames||[],...g]}}):[],...m?[(0,L.createKjstEmbedPlugin)()]:[]]]})}if(t)return;const a=n.join(e,"msbundle");if(await s.ensureDir(a),(r||c)&&await s.copy(n.join(e,"scripts"),n.join(a,"scripts")),r){const l=Q();if(l.ok){console.log(`\u2705 \u68C0\u6D4B\u5230 ${l.version} (${l.path})`);const u=(0,E.spawnSync)(l.path,["-m","compileall","scripts"],{encoding:"utf8",cwd:a});u.status===0?(console.log("\u2705 \u6210\u529F\u7F16\u8BD1\u6240\u6709 Python \u6587\u4EF6"),await U(n.join(a,"scripts"))):(console.error("\u274C \u7F16\u8BD1 Python \u6587\u4EF6\u5931\u8D25"),console.error(u.stderr),process.exit(1))}else console.warn("\u26A0\uFE0F \u672A\u68C0\u6D4B\u5230 Python 3.14\uFF0C\u8BF7\u786E\u4FDD\u5728\u76EE\u6807\u8FD0\u884C\u73AF\u5883\u5B89\u88C5 Python 3.14")}else if(c){const l=await X(e),u=n.join(a,"scripts");if(l.bundle?await(0,G.bundleLuaScripts)(u):console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u5355\u6587\u4EF6\u5408\u5E76\uFF08obfuscator.json bundle=false\uFF09"),!l.enabled)console.log("\u2139\uFE0F \u5DF2\u5173\u95ED Lua \u6DF7\u6DC6\uFF08obfuscator.json enabled=false\uFF09");else{const w=[],m=async y=>{const p=await s.readdir(y,{withFileTypes:!0});for(const d of p){const h=n.join(y,d.name);d.isDirectory()?await m(h):d.isFile()&&d.name.endsWith(".lua")&&w.push(h)}};await m(u);const _=Z(e);_||(console.error("\u274C \u672A\u627E\u5230 @gamely/prometheus-cli\uFF0C\u65E0\u6CD5\u6DF7\u6DC6 Lua"),process.exit(1));for(const y of w){const p=n.relative(u,y);console.log(`\u{1F6E0}\uFE0F \u6DF7\u6DC6 Lua: ${p} (preset=${l.preset})`);const d=(0,E.spawnSync)(process.execPath,[_,p,"--preset",l.preset],{cwd:u,encoding:"utf8"});d.status!==0&&(console.error("\u274C \u6DF7\u6DC6 Lua \u5931\u8D25:",p),console.error(d.stderr||d.stdout||""),process.exit(1));const h=p.replace(/\.lua$/,".obfuscated.lua"),g=n.join(u,h);await s.pathExists(g)&&(await s.remove(y),await s.move(g,y,{overwrite:!0}))}console.log("\u2705 Lua \u6DF7\u6DC6\u5B8C\u6210")}}await s.copy(n.join(e,"res"),n.join(a,"res")),await s.copy(n.join(e,"ui"),n.join(a,"ui"));for(const l of["logo.jpg","logo.png"]){const u=n.join(e,l);await s.pathExists(u)&&await s.copy(u,n.join(a,l))}const f=n.join(e,"dist"),P=n.join(e,"package.json"),S=n.join(a,"package.json"),b=await s.readJSON(P);delete b.scripts,delete b.devDependencies,delete b.dependencies,await s.writeJSON(S,b,{spaces:2}),await s.emptyDir(f);const j=n.join(f,"ms.zip"),J=n.join(f,"ms.msbundle");await R(a,j),await s.rename(j,J),await s.remove(a)};exports.buildAll=k;
@@ -1,2 +0,0 @@
1
- import type { Chunk } from "./ast";
2
- export declare function addVararg(chunk: Chunk): void;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.addVararg=c;function s(r){r.vararg=!0,t(r.body.body)}function a(r){switch(r.type){case"FuncExpr":s(r);break;case"UnaryExpr":a(r.arg);break;case"BinaryExpr":a(r.left),a(r.right);break;case"TableExpr":for(const e of r.fields)e.kind==="index"&&a(e.key),a(e.value);break;case"IndexExpr":a(r.object),a(r.index);break;case"MemberExpr":a(r.object);break;case"CallExpr":a(r.callee);for(const e of r.args)a(e);break;case"MethodCallExpr":a(r.object);for(const e of r.args)a(e);break;case"ParenExpr":a(r.exp);break;default:break}}function t(r){for(const e of r)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if(e.type==="WhileStat"&&a(e.cond),e.type==="RepeatStat"&&a(e.cond),e.type==="ForNumStat"&&(a(e.start),a(e.end),e.step&&a(e.step)),e.type==="ForInStat")for(const o of e.exps)a(o);t(e.body.body);break;case"IfStat":for(const o of e.clauses)a(o.cond),t(o.body.body);e.elseBody&&t(e.elseBody.body);break;case"FuncStat":case"LocalFuncStat":s(e.func);break;case"LocalStat":if(e.exps)for(const o of e.exps)a(o);break;case"AssignStat":for(const o of e.vars)a(o);for(const o of e.exps)a(o);break;case"CallStat":a(e.exp);break;case"ReturnStat":for(const o of e.exps)a(o);break;default:break}}function c(r){t(r.body)}
@@ -1,2 +0,0 @@
1
- import type { Chunk } from "./ast";
2
- export declare function applyAntiTamper(chunk: Chunk, seed: number): void;
@@ -1,26 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.applyAntiTamper=s;const o=require("./parser");function r(n){return(n>>>0)%9e3+100}function s(n,c){const a=c>>>0,l=r(a),e=a%17+3,t=l*e,d=`
2
- do
3
- local valid = true
4
- local acc = ${l}
5
- if acc * ${e} ~= ${t} then
6
- valid = false
7
- end
8
- local ok = pcall(function()
9
- return acc * ${e} == ${t}
10
- end)
11
- if not ok then
12
- valid = false
13
- end
14
- local s = 0
15
- for i = 1, 7 do
16
- s = (s + i * ${e}) % 256
17
- end
18
- if s ~= ${(1*e+2*e+3*e+4*e+5*e+6*e+7*e)%256} then
19
- valid = false
20
- end
21
- if valid then
22
- else
23
- error("Tamper Detected!")
24
- end
25
- end
26
- `,i=(0,o.parseLua)(d);n.body.unshift(...i.body)}
@@ -1,191 +0,0 @@
1
- export interface SourceLoc {
2
- line: number;
3
- column: number;
4
- }
5
- export interface Block {
6
- type: "Block";
7
- body: Statement[];
8
- }
9
- export interface Chunk {
10
- type: "Chunk";
11
- body: Statement[];
12
- }
13
- export type Statement = EmptyStat | AssignStat | CallStat | LabelStat | BreakStat | GotoStat | DoStat | WhileStat | RepeatStat | IfStat | ForNumStat | ForInStat | FuncStat | LocalFuncStat | LocalStat | ReturnStat;
14
- export interface EmptyStat {
15
- type: "EmptyStat";
16
- }
17
- export interface AssignStat {
18
- type: "AssignStat";
19
- vars: Expression[];
20
- exps: Expression[];
21
- }
22
- export interface CallStat {
23
- type: "CallStat";
24
- exp: CallExpr | MethodCallExpr;
25
- }
26
- export interface LabelStat {
27
- type: "LabelStat";
28
- name: string;
29
- }
30
- export interface BreakStat {
31
- type: "BreakStat";
32
- }
33
- export interface GotoStat {
34
- type: "GotoStat";
35
- name: string;
36
- }
37
- export interface DoStat {
38
- type: "DoStat";
39
- body: Block;
40
- }
41
- export interface WhileStat {
42
- type: "WhileStat";
43
- cond: Expression;
44
- body: Block;
45
- }
46
- export interface RepeatStat {
47
- type: "RepeatStat";
48
- body: Block;
49
- cond: Expression;
50
- }
51
- export interface IfClause {
52
- cond: Expression;
53
- body: Block;
54
- }
55
- export interface IfStat {
56
- type: "IfStat";
57
- clauses: IfClause[];
58
- elseBody?: Block;
59
- }
60
- export interface ForNumStat {
61
- type: "ForNumStat";
62
- name: string;
63
- start: Expression;
64
- end: Expression;
65
- step?: Expression;
66
- body: Block;
67
- }
68
- export interface ForInStat {
69
- type: "ForInStat";
70
- names: string[];
71
- exps: Expression[];
72
- body: Block;
73
- }
74
- export interface FuncName {
75
- base: string;
76
- fields: string[];
77
- method?: string;
78
- }
79
- export interface FuncStat {
80
- type: "FuncStat";
81
- name: FuncName;
82
- func: FuncExpr;
83
- }
84
- export interface LocalFuncStat {
85
- type: "LocalFuncStat";
86
- name: string;
87
- func: FuncExpr;
88
- }
89
- export type LocalAttr = "const" | "close";
90
- export interface LocalName {
91
- name: string;
92
- attr?: LocalAttr;
93
- }
94
- export interface LocalStat {
95
- type: "LocalStat";
96
- names: LocalName[];
97
- exps?: Expression[];
98
- }
99
- export interface ReturnStat {
100
- type: "ReturnStat";
101
- exps: Expression[];
102
- }
103
- export type Expression = NilLiteral | BoolLiteral | NumberLiteral | StringLiteral | VarargExpr | NameExpr | UnaryExpr | BinaryExpr | FuncExpr | TableExpr | IndexExpr | MemberExpr | CallExpr | MethodCallExpr | ParenExpr;
104
- export interface NilLiteral {
105
- type: "NilLiteral";
106
- }
107
- export interface BoolLiteral {
108
- type: "BoolLiteral";
109
- value: boolean;
110
- }
111
- export interface NumberLiteral {
112
- type: "NumberLiteral";
113
- raw: string;
114
- value: number;
115
- }
116
- export interface StringLiteral {
117
- type: "StringLiteral";
118
- value: string;
119
- encoded?: boolean;
120
- }
121
- export interface VarargExpr {
122
- type: "VarargExpr";
123
- }
124
- export interface NameExpr {
125
- type: "NameExpr";
126
- name: string;
127
- }
128
- export type UnaryOp = "not" | "#" | "-" | "~";
129
- export interface UnaryExpr {
130
- type: "UnaryExpr";
131
- op: UnaryOp;
132
- arg: Expression;
133
- }
134
- export type BinaryOp = "or" | "and" | "<" | ">" | "<=" | ">=" | "~=" | "==" | "|" | "~" | "&" | "<<" | ">>" | ".." | "+" | "-" | "*" | "/" | "//" | "%" | "^";
135
- export interface BinaryExpr {
136
- type: "BinaryExpr";
137
- op: BinaryOp;
138
- left: Expression;
139
- right: Expression;
140
- }
141
- export interface FuncExpr {
142
- type: "FuncExpr";
143
- params: string[];
144
- vararg: boolean;
145
- body: Block;
146
- }
147
- export type TableField = TableIndexField | TableNameField | TableListField;
148
- export interface TableIndexField {
149
- kind: "index";
150
- key: Expression;
151
- value: Expression;
152
- }
153
- export interface TableNameField {
154
- kind: "name";
155
- key: string;
156
- value: Expression;
157
- }
158
- export interface TableListField {
159
- kind: "list";
160
- value: Expression;
161
- }
162
- export interface TableExpr {
163
- type: "TableExpr";
164
- fields: TableField[];
165
- }
166
- export interface IndexExpr {
167
- type: "IndexExpr";
168
- object: Expression;
169
- index: Expression;
170
- }
171
- export interface MemberExpr {
172
- type: "MemberExpr";
173
- object: Expression;
174
- field: string;
175
- }
176
- export interface CallExpr {
177
- type: "CallExpr";
178
- callee: Expression;
179
- args: Expression[];
180
- }
181
- export interface MethodCallExpr {
182
- type: "MethodCallExpr";
183
- object: Expression;
184
- method: string;
185
- args: Expression[];
186
- }
187
- export interface ParenExpr {
188
- type: "ParenExpr";
189
- exp: Expression;
190
- }
191
- export declare function isCallExpression(exp: Expression): exp is CallExpr | MethodCallExpr;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isCallExpression=l;function l(e){return e.type==="CallExpr"||e.type==="MethodCallExpr"}
@@ -1,10 +0,0 @@
1
- export interface FoldMixParams {
2
- mul45: number;
3
- add45: number;
4
- mul8: number;
5
- secret8: number;
6
- }
7
- export declare function createFoldMixParams(seed: number): FoldMixParams;
8
- export declare function foldEncrypt(plain: string, params: FoldMixParams, itemSeed: number): string;
9
- export declare function foldDecrypt(payload: string, params: FoldMixParams, itemSeed: number): string;
10
- export declare function emitFoldDecoderLua(params: FoldMixParams, fnName: string): string;
@@ -1,28 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createFoldMixParams=m,exports.foldEncrypt=q,exports.foldDecrypt=g,exports.emitFoldDecoderLua=b;const d=35184372088832n,i=[3,5,6,7,10,12,14,19,20,24];function m(e){const n=e>>>0||1;return{mul45:n%15*4+1,add45:n%99991*2+1,mul8:i[n%i.length],secret8:n%256}}function f(e,n){e.p=(e.p*BigInt(n.mul45)+BigInt(n.add45))%d;do e.q=e.q*n.mul8%257;while(e.q===1);const l=Number(e.p%256n),o=Number(e.p/256n%256n),t=Number(e.p/65536n%256n);return(l+o*(e.q%13)+t+e.q)%256}function p(e,n){return{p:BigInt(n>>>0)%d,q:(n>>>0)%255+2}}function h(e){const n=[];for(let l=0;l<e.length;l+=1){const o=e.charCodeAt(l);if(o<=255)n.push(o);else{const t=Buffer.from(e[l],"utf8");for(const c of t)n.push(c)}}return Buffer.from(n)}function q(e,n,l){const o=h(e),t=p(n,l);let c=n.secret8,r="";for(let u=0;u<o.length;u+=1){const a=f(t,n),s=o[u];r+=String.fromCharCode((s-a-c+512)%256),c=s}return r}function g(e,n,l){const o=p(n,l);let t=n.secret8;const c=Buffer.alloc(e.length);for(let r=0;r<e.length;r+=1){const u=f(o,n),a=(e.charCodeAt(r)+u+t)%256;c[r]=a,t=a}return c.toString("latin1")}function b(e,n){return`local ${n}
2
- do
3
- local mul45=${e.mul45}
4
- local add45=${e.add45}
5
- local mul8=${e.mul8}
6
- local secret8=${e.secret8}
7
- local cache={}
8
- ${n}=function(s,seed)
9
- local hit=cache[seed]
10
- if hit then return hit end
11
- local p=seed%35184372088832
12
- local q=seed%255+2
13
- local prev=secret8
14
- local n=#s
15
- local t={}
16
- for i=1,n do
17
- p=(p*mul45+add45)%35184372088832
18
- repeat q=q*mul8%257 until q~=1
19
- local mix=(p%256+((p//256)%256)*(q%13)+((p//65536)%256)+q)%256
20
- local b=(s:byte(i)+mix+prev)%256
21
- t[i]=string.char(b)
22
- prev=b
23
- end
24
- local out=table.concat(t)
25
- cache[seed]=out
26
- return out
27
- end
28
- end`}
@@ -1,31 +0,0 @@
1
- import type { Chunk } from "./ast";
2
- import { type OpcodeName } from "./opcodes";
3
- export type ConstVal = {
4
- t: "nil";
5
- } | {
6
- t: "bool";
7
- v: boolean;
8
- } | {
9
- t: "num";
10
- v: number;
11
- raw: string;
12
- } | {
13
- t: "str";
14
- v: string;
15
- };
16
- export interface UpvalSpec {
17
- name: string;
18
- inStack: boolean;
19
- index: number;
20
- }
21
- export interface Proto {
22
- code: number[][];
23
- ops: OpcodeName[];
24
- consts: ConstVal[];
25
- protos: Proto[];
26
- upvals: UpvalSpec[];
27
- numparams: number;
28
- isVararg: boolean;
29
- maxStack: number;
30
- }
31
- export declare function compileChunk(chunk: Chunk): Proto;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.compileChunk=P;class O{constructor(){Object.defineProperty(this,"code",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"ops",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"consts",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"protos",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"upvals",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"numparams",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"isVararg",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"maxStack",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"top",{enumerable:!0,configurable:!0,writable:!0,value:1}),Object.defineProperty(this,"frames",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"parent",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"labels",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"gotos",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"breaks",{enumerable:!0,configurable:!0,writable:!0,value:[]})}emit(r,e=0,o=0,s=0){return this.ops.push(r),this.code.push([0,e,o,s]),this.code.length-1}patch(r,e,o,s){const a=this.code[r];e!==void 0&&(a[1]=e),o!==void 0&&(a[2]=o),s!==void 0&&(a[3]=s)}kNil(){return this.intern({t:"nil"})}kBool(r){return this.intern({t:"bool",v:r})}kNum(r,e){return this.intern({t:"num",v:r,raw:e})}kStr(r){return this.intern({t:"str",v:r})}intern(r){for(let e=0;e<this.consts.length;e+=1){const o=this.consts[e];if(o.t===r.t&&(o.t==="nil"||o.t==="bool"&&r.t==="bool"&&o.v===r.v||o.t==="num"&&r.t==="num"&&o.v===r.v||o.t==="str"&&r.t==="str"&&o.v===r.v))return e+1}return this.consts.push(r),this.consts.length}alloc(r=1){const e=this.top;return this.top+=r,this.top-1>this.maxStack&&(this.maxStack=this.top-1),e}freeTo(r){this.top=r}pushFrame(){this.frames.push({locals:[],savedTop:this.top})}currentLocals(){return this.frames[this.frames.length-1]?.locals??[]}bind(r,e=!1){const o=this.alloc(1);return this.currentLocals().push({name:r,reg:o,close:e}),o}findLocal(r){for(let e=this.frames.length-1;e>=0;e-=1){const o=this.frames[e].locals;for(let s=o.length-1;s>=0;s-=1)if(o[s].name===r)return o[s].reg}}findUpval(r){for(let s=0;s<this.upvals.length;s+=1)if(this.upvals[s].name===r)return s+1;if(!this.parent)return;const e=this.parent.findLocal(r);if(e!==void 0)return this.upvals.push({name:r,inStack:!0,index:e}),this.upvals.length;const o=this.parent.findUpval(r);if(o!==void 0)return this.upvals.push({name:r,inStack:!1,index:o}),this.upvals.length}finish(){for(const r of this.gotos){const e=this.labels.get(r.name);if(e===void 0)throw new Error(`goto \u672A\u5B9A\u4E49\u6807\u7B7E ::${r.name}::`);this.patch(r.pc,0,e-(r.pc+1))}return{code:this.code,ops:this.ops,consts:this.consts,protos:this.protos,upvals:this.upvals,numparams:this.numparams,isVararg:this.isVararg,maxStack:Math.max(this.maxStack,this.numparams,1)}}}const k={"+":"ADD","-":"SUB","*":"MUL","/":"DIV","//":"IDIV","%":"MOD","^":"POW","&":"BAND","|":"BOR","~":"BXOR","<<":"SHL",">>":"SHR","..":"CONCAT"},A={"-":"UNM","~":"BNOT",not:"NOT","#":"LEN"};function P(t){const r=new O;return r.isVararg=!0,r.pushFrame(),u(r,t.body),r.emit("RETURN",1,0),r.finish()}function d(t,r){const e=new O;e.parent=t,e.numparams=r.params.length,e.isVararg=r.vararg,e.pushFrame();for(const o of r.params)e.bind(o);return u(e,r.body.body),e.emit("RETURN",1,0),t.protos.push(e.finish()),t.protos.length}function u(t,r){for(const e of r)B(t,e)}function p(t,r){for(const e of r.locals)t.emit("CLOSE",e.reg);t.freeTo(r.savedTop)}function B(t,r){switch(r.type){case"EmptyStat":return;case"BreakStat":{if(t.breaks.length===0)throw new Error("break \u51FA\u73B0\u5728\u5FAA\u73AF\u5916");const e=t.emit("JMP",0,0);t.breaks[t.breaks.length-1].push(e);return}case"GotoStat":{const e=t.emit("JMP",0,0);t.gotos.push({name:r.name,pc:e});return}case"LabelStat":t.labels.set(r.name,t.code.length);return;case"DoStat":{t.pushFrame(),u(t,r.body.body),p(t,t.frames.pop());return}case"WhileStat":{const e=t.code.length,o=n(t,r.cond);t.emit("TEST",o,0,0);const s=t.emit("JMP",0,0);t.freeTo(o),t.breaks.push([]),t.pushFrame(),u(t,r.body.body),p(t,t.frames.pop()),t.emit("JMP",0,e-(t.code.length+1)),t.patch(s,0,t.code.length-(s+1)),f(t,t.breaks.pop(),t.code.length);return}case"RepeatStat":{const e=t.code.length;t.breaks.push([]),t.pushFrame(),u(t,r.body.body);const o=n(t,r.cond);t.emit("TEST",o,0,0),t.emit("JMP",0,e-(t.code.length+1)),p(t,t.frames.pop()),f(t,t.breaks.pop(),t.code.length);return}case"IfStat":{const e=[];for(let o=0;o<r.clauses.length;o+=1){const s=n(t,r.clauses[o].cond);t.emit("TEST",s,0,0);const a=t.emit("JMP",0,0);t.freeTo(s),t.pushFrame(),u(t,r.clauses[o].body.body),p(t,t.frames.pop()),(o<r.clauses.length-1||r.elseBody)&&e.push(t.emit("JMP",0,0)),t.patch(a,0,t.code.length-(a+1))}r.elseBody&&(t.pushFrame(),u(t,r.elseBody.body),p(t,t.frames.pop()));for(const o of e)t.patch(o,0,t.code.length-(o+1));return}case"ForNumStat":{const e=t.alloc(4);n(t,r.start,e),n(t,r.end,e+1),r.step?n(t,r.step,e+2):t.emit("LOADK",e+2,t.kNum(1,"1"));const o=t.emit("FORPREP",e,0);t.breaks.push([]),t.pushFrame();const s=t.bind(r.name);t.emit("MOVE",s,e+3),u(t,r.body.body),p(t,t.frames.pop());const a=t.emit("FORLOOP",e,0);t.patch(o,e,a-(o+1)),t.patch(a,e,o+1-(a+1)),f(t,t.breaks.pop(),t.code.length),t.freeTo(e);return}case"ForInStat":{const e=t.alloc(3);h(t,r.exps,e,3);const o=t.emit("TFORCALL",e,r.names.length),s=t.emit("TFORLOOP",e,0);t.breaks.push([]),t.pushFrame();for(let a=0;a<r.names.length;a+=1){const i=t.bind(r.names[a]);t.emit("MOVE",i,e+3+a)}u(t,r.body.body),p(t,t.frames.pop()),t.emit("JMP",0,o-(t.code.length+1)),t.patch(s,e,t.code.length-(s+1)),f(t,t.breaks.pop(),t.code.length),t.freeTo(e);return}case"FuncStat":{const e=d(t,r.func),o=t.alloc(1);t.emit("CLOSURE",o,e),w(t,r.name.base,r.name.fields,r.name.method,o),t.freeTo(o);return}case"LocalFuncStat":{const e=t.bind(r.name),o=d(t,r.func);t.emit("CLOSURE",e,o);return}case"LocalStat":{const e=r.names.length,o=[];if(r.exps&&r.exps.length>0){const s=t.top;h(t,r.exps,s,e);for(let a=0;a<e;a+=1){const i=t.bind(r.names[a].name,r.names[a].attr==="close");t.emit("MOVE",i,s+a),o.push(i)}t.freeTo(o[0]),t.top=o[e-1]+1}else for(const s of r.names){const a=t.bind(s.name,s.attr==="close");t.emit("LOADNIL",a),o.push(a)}return}case"AssignStat":{const e=t.top;h(t,r.exps,e,r.vars.length);for(let o=0;o<r.vars.length;o+=1)F(t,r.vars[o],e+o);t.freeTo(e);return}case"CallStat":{const e=t.top;n(t,r.exp,void 0,0),t.freeTo(e);return}case"ReturnStat":{if(r.exps.length===0){t.emit("RETURN",1,0);return}const e=t.top;h(t,r.exps,e,-1);const o=r.exps[r.exps.length-1],s=o.type==="CallExpr"||o.type==="MethodCallExpr"||o.type==="VarargExpr";t.emit("RETURN",e,s?-1:r.exps.length);return}}}function f(t,r,e){for(const o of r)t.patch(o,0,e-(o+1))}function w(t,r,e,o,s){if(e.length===0&&!o){S(t,r,s);return}let a=T(t,r);const i=o?[...e,o]:e;for(let c=0;c<i.length-1;c+=1){const l=t.alloc(1);t.emit("GETTABLE",l,a,-t.kStr(i[c])),a=l}t.emit("SETTABLE",a,-t.kStr(i[i.length-1]),s)}function S(t,r,e){const o=t.findLocal(r);if(o!==void 0){t.emit("MOVE",o,e);return}const s=t.findUpval(r);if(s!==void 0){t.emit("SETUPVAL",e,s);return}t.emit("SETGLOBAL",e,t.kStr(r))}function T(t,r,e){const o=e??t.alloc(1),s=t.findLocal(r);if(s!==void 0)return o!==s&&t.emit("MOVE",o,s),o;const a=t.findUpval(r);return a!==void 0?(t.emit("GETUPVAL",o,a),o):(t.emit("GETGLOBAL",o,t.kStr(r)),o)}function F(t,r,e){if(r.type==="NameExpr"){S(t,r.name,e);return}if(r.type==="MemberExpr"){const o=n(t,r.object);t.emit("SETTABLE",o,-t.kStr(r.field),e);return}if(r.type==="IndexExpr"){const o=n(t,r.object),s=n(t,r.index);t.emit("SETTABLE",o,s,e);return}throw new Error("\u975E\u6CD5\u8D4B\u503C\u5DE6\u503C")}function n(t,r,e,o=1){const s=e??t.alloc(1);switch(r.type){case"NilLiteral":return t.emit("LOADNIL",s),s;case"BoolLiteral":return t.emit("LOADBOOL",s,r.value?1:0),s;case"NumberLiteral":return t.emit("LOADK",s,t.kNum(r.value,r.raw)),s;case"StringLiteral":return t.emit("LOADK",s,t.kStr(r.value)),s;case"VarargExpr":return t.emit("VARARG",s,o),s;case"NameExpr":return T(t,r.name,s);case"ParenExpr":return n(t,r.exp,s,1);case"UnaryExpr":{const a=n(t,r.arg);return t.emit(A[r.op],s,a),s}case"BinaryExpr":return M(t,r.op,r.left,r.right,s);case"FuncExpr":{const a=d(t,r);return t.emit("CLOSURE",s,a),s}case"TableExpr":return R(t,r.fields,s);case"IndexExpr":{const a=n(t,r.object),i=n(t,r.index);return t.emit("GETTABLE",s,a,i),s}case"MemberExpr":{const a=n(t,r.object);return t.emit("GETTABLE",s,a,-t.kStr(r.field)),s}case"CallExpr":return y(t,r.callee,r.args,s,o,!1);case"MethodCallExpr":return y(t,r.object,r.args,s,o,r.method);default:throw new Error(`\u4E0D\u652F\u6301\u7684\u8868\u8FBE\u5F0F ${r.type}`)}}function M(t,r,e,o,s){if(r==="and"||r==="or"){n(t,e,s),t.emit("TEST",s,0,r==="and"?0:1);const l=t.emit("JMP",0,0);return n(t,o,s),t.patch(l,0,t.code.length-(l+1)),s}if(r==="=="||r==="~="||r==="<"||r===">"||r==="<="||r===">="){const l=n(t,e),b=n(t,o);let m="EQ",g=l,E=b;r==="<"||r===">="?m="LT":r==="<="||r===">"?m="LE":m="EQ",(r===">"||r===">=")&&(g=b,E=l);const x=r==="~=";t.emit(m,g,E,x?1:0);const L=t.emit("JMP",0,0);t.emit("LOADBOOL",s,1);const v=t.emit("JMP",0,0);return t.patch(L,0,t.code.length-(L+1)),t.emit("LOADBOOL",s,0),t.patch(v,0,t.code.length-(v+1)),s}const a=k[r];if(!a)throw new Error(`\u4E0D\u652F\u6301\u7684\u8FD0\u7B97\u7B26 ${r}`);const i=n(t,e),c=n(t,o);return t.emit(a,s,i,c),s}function N(t){return t.type==="CallExpr"||t.type==="MethodCallExpr"||t.type==="VarargExpr"}function y(t,r,e,o,s,a){const i=o,c=e.length>0&&N(e[e.length-1]);if(a){const l=n(t,r,i);return t.emit("SELF",i,l,-t.kStr(a)),h(t,e,i+2,-1),t.emit("CALL",i,c?-1:e.length+1,s),i}return n(t,r,i),h(t,e,i+1,-1),t.emit("CALL",i,c?-1:e.length,s),i}function h(t,r,e,o){const s=o>0?o:Math.max(r.length,1);if(t.top<e+s&&(t.top=e+s,t.top-1>t.maxStack&&(t.maxStack=t.top-1)),r.length===0){if(o>0)for(let a=0;a<o;a+=1)t.emit("LOADNIL",e+a);return}for(let a=0;a<r.length;a+=1){const i=a===r.length-1,c=i&&(o<0||o>r.length)?o===-1?-1:o-a:1;n(t,r[a],e+a,i?c:1)}if(o>r.length)for(let a=r.length;a<o;a+=1)t.emit("LOADNIL",e+a)}function R(t,r,e){t.emit("NEWTABLE",e);const o=[];for(const s of r)if(s.kind==="list")o.push(s.value);else if(s.kind==="name"){const a=n(t,s.value);t.emit("SETTABLE",e,-t.kStr(s.key),a)}else{const a=n(t,s.key),i=n(t,s.value);t.emit("SETTABLE",e,a,i)}if(o.length>0){const s=t.top;h(t,o,s,-1),t.emit("SETLIST",e,s,o.length),t.freeTo(s)}return e}
@@ -1,5 +0,0 @@
1
- import type { Chunk } from "./ast";
2
- export declare function applyConstantArray(chunk: Chunk, seed: number, options: {
3
- shuffle: boolean;
4
- rotate: boolean;
5
- }): void;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.applyConstantArray=h;const i=require("./visit"),o="__C",y="__G";function g(l,s){const a=l.slice();let n=s>>>0||1;for(let r=a.length-1;r>0;r-=1){n=Math.imul(n,1664525)+1013904223>>>0;const t=n%(r+1),p=a[r];a[r]=a[t],a[t]=p}return a}function h(l,s,a){const n=[],r=new Set;if((0,i.mapChunk)(l,e=>(e.type==="StringLiteral"&&!r.has(e.value)&&(r.add(e.value),n.push(e.value)),e)),n.length===0)return;let t=a.shuffle?g(n,s):n.slice();const p=a.rotate?s%t.length:0;p>0&&(t=t.slice(p).concat(t.slice(0,p)));const c=new Map;for(let e=0;e<t.length;e+=1)c.set(t[e],e+1);(0,i.mapChunk)(l,e=>{if(e.type!=="StringLiteral")return e;const u=c.get(e.value);return u===void 0?e:{type:"CallExpr",callee:{type:"NameExpr",name:y},args:[{type:"NumberLiteral",raw:String(u),value:u}]}});const m=t.map(e=>({kind:"list",value:{type:"StringLiteral",value:e,encoded:!0}})),d={type:"LocalStat",names:[{name:o}],exps:[{type:"TableExpr",fields:m}]},f={type:"LocalFuncStat",name:y,func:{type:"FuncExpr",params:["i"],vararg:!1,body:{type:"Block",body:[{type:"ReturnStat",exps:[{type:"IndexExpr",object:{type:"NameExpr",name:o},index:{type:"NameExpr",name:"i"}}]}]}}};l.body.unshift(d,f)}
@@ -1,2 +0,0 @@
1
- import type { Chunk } from "./ast";
2
- export declare function flattenControlFlow(chunk: Chunk, seed: number): void;
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.flattenControlFlow=C;function m(t){return{type:"NumberLiteral",raw:String(t),value:t}}function p(t){return{type:"NameExpr",name:t}}function f(t,n){return{type:"AssignStat",vars:t.map(e=>p(e)),exps:n}}function u(t,n){return f([t.stateName],[typeof n=="number"?m(n):n])}function k(t,n,e){return{type:"BinaryExpr",op:"or",left:{type:"BinaryExpr",op:"and",left:p(t),right:m(n)},right:m(e)}}function E(t,n,e){return{type:"BinaryExpr",op:t,left:n,right:e}}function S(t){const n=`__t${t.nextTemp}`;return t.nextTemp+=1,t.temps.push(n),n}function x(t){const n=t.nextState;return t.nextState+=1,t.states.set(n,[]),n}function o(t,n,e){t.states.get(n).push(e)}function F(t,n){for(const e of t)if(e.type==="LocalStat")for(const a of e.names)n.push(a.name);else if(e.type==="LocalFuncStat")n.push(e.name);else if(e.type==="ForNumStat")n.push(e.name),F(e.body.body,n);else if(e.type==="ForInStat")n.push(...e.names),F(e.body.body,n);else if(e.type==="DoStat"||e.type==="WhileStat"||e.type==="RepeatStat")F(e.body.body,n);else if(e.type==="IfStat"){for(const a of e.clauses)F(a.body.body,n);e.elseBody&&F(e.elseBody.body,n)}}function h(t,n,e,a){if(t.length===0)return n;const y=t.map(()=>x(e));for(let s=0;s<t.length;s+=1){const r=t[s];r.type==="LabelStat"&&e.userLabels.set(r.name,y[s])}for(let s=0;s<t.length;s+=1){const r=s+1<t.length?y[s+1]:n;I(e,y[s],t[s],r,a)}return y[0]}function I(t,n,e,a,y){switch(e.type){case"EmptyStat":case"LabelStat":o(t,n,u(t,a));return;case"AssignStat":case"CallStat":case"FuncStat":o(t,n,e),o(t,n,u(t,a));return;case"LocalStat":e.exps&&e.exps.length>0&&o(t,n,f(e.names.map(s=>s.name),e.exps)),o(t,n,u(t,a));return;case"LocalFuncStat":o(t,n,f([e.name],[e.func])),o(t,n,u(t,a));return;case"ReturnStat":o(t,n,e);return;case"BreakStat":o(t,n,u(t,y));return;case"GotoStat":{const s=t.userLabels.get(e.name);if(s===void 0)throw new Error(`goto \u672A\u5B9A\u4E49\u6807\u7B7E ::${e.name}::`);o(t,n,u(t,s));return}case"DoStat":o(t,n,u(t,h(e.body.body,a,t,y)));return;case"IfStat":{const s=S(t);let r=n;for(let l=0;l<e.clauses.length;l+=1){const b=l===e.clauses.length-1,d=h(e.clauses[l].body.body,a,t,y);let i=a;b?e.elseBody&&(i=h(e.elseBody.body,a,t,y)):i=x(t),o(t,r,f([s],[e.clauses[l].cond])),o(t,r,u(t,k(s,d,i))),b||(r=i)}e.clauses.length===0&&o(t,n,u(t,a));return}case"WhileStat":{const s=S(t),r=h(e.body.body,n,t,a);o(t,n,f([s],[e.cond])),o(t,n,u(t,k(s,r,a)));return}case"RepeatStat":{const s=S(t),r=x(t),l=h(e.body.body,r,t,a);o(t,n,u(t,l)),o(t,r,f([s],[e.cond])),o(t,r,u(t,k(s,a,l)));return}case"ForNumStat":{const s=e.name,r=S(t),l=S(t),b=S(t),d=x(t),i=x(t),L=x(t),g=x(t),N=h(e.body.body,g,t,a);o(t,n,f([s],[e.start])),o(t,n,f([r],[e.end])),o(t,n,f([l],[e.step??m(1)])),o(t,n,u(t,d)),o(t,d,f([b],[E(">=",p(l),m(0))])),o(t,d,u(t,k(b,i,L))),o(t,i,f([b],[E("<=",p(s),p(r))])),o(t,i,u(t,k(b,N,a))),o(t,L,f([b],[E(">=",p(s),p(r))])),o(t,L,u(t,k(b,N,a))),o(t,g,f([s],[E("+",p(s),p(l))])),o(t,g,u(t,d));return}case"ForInStat":{const s=S(t),r=S(t),l=S(t),b=S(t),d=x(t),i=[f([l],[p(e.names[0])]),...e.body.body],L=h(i,d,t,a),g=e.exps.slice();for(;g.length<3;)g.push({type:"NilLiteral"});o(t,n,f([s,r,l],g.slice(0,3))),o(t,n,u(t,d)),o(t,d,{type:"AssignStat",vars:e.names.map(N=>p(N)),exps:[{type:"CallExpr",callee:p(s),args:[p(r),p(l)]}]}),o(t,d,f([b],[E("~=",p(e.names[0]),{type:"NilLiteral"})])),o(t,d,u(t,k(b,L,a)));return}default:o(t,n,u(t,a))}}function v(t,n){const e=t.slice();let a=n>>>0||1;for(let y=e.length-1;y>0;y-=1){a=Math.imul(a,1664525)+1013904223>>>0;const s=a%(y+1),r=e[y];e[y]=e[s],e[s]=r}return e}function w(t,n){if(t.length===0)return t;const e={states:new Map,temps:[],nextState:1,nextTemp:1,stateName:"__s",userLabels:new Map},a=[];F(t,a);const y=h(t,0,e,0),s=[...new Set([...a,...e.temps,e.stateName])],r=v([...e.states.keys()],n).map(l=>({cond:E("==",p(e.stateName),m(l)),body:{type:"Block",body:e.states.get(l)}}));return[{type:"LocalStat",names:s.map(l=>({name:l}))},f([e.stateName],[m(y)]),{type:"WhileStat",cond:E("~=",p(e.stateName),m(0)),body:{type:"Block",body:[{type:"IfStat",clauses:r}]}}]}function c(t,n){switch(t.type){case"FuncExpr":B(t.body.body,n),t.body.body=w(t.body.body,n);break;case"UnaryExpr":c(t.arg,n);break;case"BinaryExpr":c(t.left,n),c(t.right,n);break;case"TableExpr":for(const e of t.fields)e.kind==="index"&&c(e.key,n),c(e.value,n);break;case"IndexExpr":c(t.object,n),c(t.index,n);break;case"MemberExpr":c(t.object,n);break;case"CallExpr":c(t.callee,n);for(const e of t.args)c(e,n);break;case"MethodCallExpr":c(t.object,n);for(const e of t.args)c(e,n);break;case"ParenExpr":c(t.exp,n);break;default:break}}function B(t,n){for(const e of t)switch(e.type){case"DoStat":case"WhileStat":case"RepeatStat":case"ForNumStat":case"ForInStat":if((e.type==="WhileStat"||e.type==="RepeatStat")&&c(e.cond,n),e.type==="ForNumStat"&&(c(e.start,n),c(e.end,n),e.step&&c(e.step,n)),e.type==="ForInStat")for(const a of e.exps)c(a,n);B(e.body.body,n);break;case"IfStat":for(const a of e.clauses)c(a.cond,n),B(a.body.body,n);e.elseBody&&B(e.elseBody.body,n);break;case"FuncStat":case"LocalFuncStat":B(e.func.body.body,n),e.func.body.body=w(e.func.body.body,n);break;case"LocalStat":if(e.exps)for(const a of e.exps)c(a,n);break;case"AssignStat":for(const a of e.vars)c(a,n);for(const a of e.exps)c(a,n);break;case"CallStat":c(e.exp,n);break;case"ReturnStat":for(const a of e.exps)c(a,n);break;default:break}}function C(t,n){B(t.body,n),t.body=w(t.body,n)}
@@ -1,6 +0,0 @@
1
- export declare const luaObfuscatorPresets: readonly ["Minify", "Weak", "Medium", "Strong"];
2
- export type LuaObfuscatorPreset = (typeof luaObfuscatorPresets)[number];
3
- export declare function obfuscateLua(source: string, preset: LuaObfuscatorPreset): string;
4
- export { LuaLexError } from "./lexer";
5
- export { LuaParseError } from "./parser";
6
- export { foldDecrypt, foldEncrypt, createFoldMixParams } from "./strings";
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.createFoldMixParams=exports.foldEncrypt=exports.foldDecrypt=exports.LuaParseError=exports.LuaLexError=exports.luaObfuscatorPresets=void 0,exports.obfuscateLua=E;const l=require("./addVararg"),f=require("./antiTamper"),b=require("./compiler"),y=require("./constantArray"),u=require("./flatten"),c=require("./minify"),a=require("./numbers"),p=require("./parser"),m=require("./rename"),d=require("./splitStrings"),L=require("./vmEmit"),q=require("./wrapInFunction");exports.luaObfuscatorPresets=["Minify","Weak","Medium","Strong"];function P(n){let t=2166136261;for(let r=0;r<n.length;r+=1)t=Math.imul(t^n.charCodeAt(r),16777619);return t>>>0||1}function o(n){return(0,p.parseLua)((0,L.emitVm)((0,b.compileChunk)(n)))}function i(n,t,r){(0,y.applyConstantArray)(n,t,{shuffle:r.shuffle,rotate:r.shuffle}),r.numbersOnVm&&(0,a.numbersToExpressions)(n,(t^2654435769)>>>0);for(let e=0;e<r.wraps;e+=1)(0,q.wrapInFunction)(n);return(0,m.renameLocals)(n),(0,c.minifyLua)(n)}function E(n,t){const r=P(n);let e=(0,p.parseLua)(n);return(0,m.renameLocals)(e),t==="Minify"?(0,c.minifyLua)(e):t==="Weak"?((0,u.flattenControlFlow)(e,r),e=o(e),i(e,r,{shuffle:!1,wraps:1,numbersOnVm:!1})):t==="Medium"?((0,l.addVararg)(e),(0,d.splitStrings)(e,r),(0,a.numbersToExpressions)(e,r),(0,f.applyAntiTamper)(e,r),(0,u.flattenControlFlow)(e,r),e=o(e),i(e,r,{shuffle:!0,wraps:1,numbersOnVm:!0})):((0,l.addVararg)(e),(0,d.splitStrings)(e,(r^2135587861)>>>0),(0,a.numbersToExpressions)(e,r),(0,f.applyAntiTamper)(e,(r^2246822507)>>>0),(0,u.flattenControlFlow)(e,(r^2246822507)>>>0),e=o(e),i(e,r,{shuffle:!0,wraps:2,numbersOnVm:!0}))}var O=require("./lexer");Object.defineProperty(exports,"LuaLexError",{enumerable:!0,get:function(){return O.LuaLexError}});var g=require("./parser");Object.defineProperty(exports,"LuaParseError",{enumerable:!0,get:function(){return g.LuaParseError}});var s=require("./strings");Object.defineProperty(exports,"foldDecrypt",{enumerable:!0,get:function(){return s.foldDecrypt}}),Object.defineProperty(exports,"foldEncrypt",{enumerable:!0,get:function(){return s.foldEncrypt}}),Object.defineProperty(exports,"createFoldMixParams",{enumerable:!0,get:function(){return s.createFoldMixParams}});
@@ -1,14 +0,0 @@
1
- export type TokenKind = "eof" | "name" | "string" | "number" | "vararg" | "keyword" | "+" | "-" | "*" | "/" | "//" | "%" | "^" | "#" | "&" | "|" | "~" | "<<" | ">>" | "==" | "~=" | "<=" | ">=" | "<" | ">" | "=" | "(" | ")" | "{" | "}" | "[" | "]" | "::" | ";" | ":" | "," | "." | "..";
2
- export interface Token {
3
- kind: TokenKind;
4
- value: string;
5
- line: number;
6
- column: number;
7
- parsed?: number | string;
8
- }
9
- export declare class LuaLexError extends Error {
10
- readonly line: number;
11
- readonly column: number;
12
- constructor(message: string, line: number, column: number);
13
- }
14
- export declare function lexLua(source: string): Token[];