ms-vite-plugin 1.5.2 → 1.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
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 c=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("./version"),A=require("./mcp/docs-service"),L=require("./mcp/httpapi-docs-service"),j=require("./mcp/tool-utils"),B=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 U(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 U(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 a(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 F(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 V(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=a(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 z(){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)} (${B.DOC_LANGUAGE_LABELS[t]})`),`httpApi: ${(0,L.getHttpApiDocPath)()}`,"\u8BF4\u660E: \u76F4\u63A5\u8BFB\u53D6\u4E0A\u8FF0 markdown \u8DEF\u5F84\u3002"].join(`
3
- `)}function K(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 X(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 Q(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 Y(e){const t=e?.trim();if(!(t===void 0||t.length===0))try{return JSON.parse(t)}catch{return e}}function Z(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 tt(e,t){if(t)for(const[r,o]of Object.entries(t))o!==null&&e.searchParams.set(r,String(o))}function et(e){return e===void 0?{}:{headers:{"Content-Type":"application/json"},requestBody:JSON.stringify(e)}}async function ot(e,t){const r=await e.text();return t==="text"?r:(0,j.formatRuntimeJsonText)(JSON.parse(r))}async function rt(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 nt(){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 it(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 st(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 at(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 ct(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 pt(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 ut(e){try{const t=a(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
- `):"\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 mt(e){try{await $(z(),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 dt(e){try{const t=E(e),r=V(e.method),o=Z(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=Q(e.query,"query"),s=Y(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=a(e.timeoutMs,3e4,"timeout-ms",1e3,6e5),w=new URL(`http://${t.ip}:${t.port}${o}`);tt(w,i);const S=new AbortController,I=setTimeout(()=>S.abort(),l);try{const{headers:b,requestBody:y}=et(s),f=await fetch(w.toString(),{method:r,signal:S.signal,headers:b,body:y}),T=await ot(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
- `);await $(_,e.output,"HTTP API \u54CD\u5E94\u5DF2\u4FDD\u5B58"),f.ok||process.exit(1)}finally{clearTimeout(I)}}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 lt(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=a(e.x,0,"x",0),s=a(e.y,0,"y",0),u=a(e.ex,0,"ex",0),l=a(e.ey,0,"ey",0),w=[...q(e.texts,"texts")??[],...e.text??[]],S=w.length>0?w:void 0,I=X(e.languages),b=F(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:a(e.maxSideLen,0,"max-side-len",0),T=e.useGpu===!0?!0:void 0,_=a(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:I,confidenceThreshold:b,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(`
6
- `)),O.body.success===!1&&process.exit(1)}catch(t){console.error("\u274C OCR \u6267\u884C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ft(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const r=a(e.x,0,"x",0),o=a(e.y,0,"y",0),n=a(e.width,1,"width",1),i=a(e.height,1,"height",1),s=await(0,P.cropLocalImage)(t,r,o,n,i,e.output);console.log(s)}catch(t){console.error("\u274C \u56FE\u7247\u88C1\u5207\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function gt(e){try{const t=E(e),r=a(e.x,0,"x",0),o=a(e.y,0,"y",0),n=a(e.width,1,"width",1),i=a(e.height,1,"height",1),s=await(0,P.cropDeviceScreen)(t,r,o,n,i,e.output);console.log(s)}catch(t){console.error("\u274C \u5C4F\u5E55\u88C1\u56FE\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ht(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const r=a(e.x,0,"x",0),o=a(e.y,0,"y",0),n=a(e.radius,0,"radius",0,20),i=await(0,P.pickLocalImageColor)(t,r,o,n);console.log(i)}catch(t){console.error("\u274C \u56FE\u7247\u53D6\u8272\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function wt(e){try{const t=E(e),r=a(e.x,0,"x",0),o=a(e.y,0,"y",0),n=a(e.radius,0,"radius",0,20),i=await(0,P.pickDeviceScreenColor)(t,r,o,n);console.log(i)}catch(t){console.error("\u274C \u5C4F\u5E55\u53D6\u8272\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function yt(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const r=g(e.sampleCorner,"topLeft",["topLeft","topRight","bottomLeft","bottomRight"],"sample-corner"),o=a(e.tolerance,24,"tolerance",0,441),n=await(0,P.makeLocalImageTransparent)(t,e.output,e.transparentColor,r,o);console.log(n)}catch(t){console.error("\u274C \u900F\u660E\u56FE\u5236\u4F5C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function xt(e){try{const t=(e.wsPort??"31111").trim(),r=Number.parseInt(t,10);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`\u65E0\u6548 ws \u7AEF\u53E3: ${t}`);const o=H.WSManager.get();await o.start(r);const n=async()=>{const s={pid:process.pid,port:r,address:o.getAddress(),startedAt:Date.now(),connected:o.isClientConnected(),clientIp:o.getConnectedClientIp()};await p.writeJSON(d,s)};await n();const i=setInterval(()=>{n().catch(()=>{})},1e3);await p.writeJSON(d,{pid:process.pid,port:r,address:o.getAddress(),startedAt:Date.now(),connected:o.isClientConnected(),clientIp:o.getConnectedClientIp()}),await new Promise(s=>{const u=async()=>{process.off("SIGINT",u),process.off("SIGTERM",u),clearInterval(i),await o.stop(),await p.remove(d),s()};process.on("SIGINT",u),process.on("SIGTERM",u)})}catch(t){console.error("\u274C WS \u670D\u52A1\u542F\u52A8\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function Pt(){try{if(!await p.pathExists(d)){console.log("WS \u670D\u52A1\u672A\u8FD0\u884C");return}const e=await p.readJSON(d),t=Number(e.pid);if(!Number.isInteger(t)||t<=0)throw await p.remove(d),new Error("WS PID \u6587\u4EF6\u635F\u574F");try{process.kill(t,"SIGTERM"),console.log(`\u2705 \u5DF2\u53D1\u9001\u505C\u6B62\u4FE1\u53F7\u5230 WS \u8FDB\u7A0B: ${t}`)}catch{console.log("WS \u8FDB\u7A0B\u4E0D\u5B58\u5728\uFF0C\u6E05\u7406 PID \u6587\u4EF6")}await p.remove(d)}catch(e){console.error("\u274C WS \u670D\u52A1\u505C\u6B62\u5931\u8D25:",e instanceof Error?e.message:e),process.exit(1)}}async function St(){if(!await p.pathExists(d)){console.log(JSON.stringify({status:"stopped",running:!1,pid:null,address:null,connected:!1,clientIp:null}));return}const e=await p.readJSON(d),t=Number(e.pid),r=String(e.address||"unknown"),o=!!e.connected,n=e.clientIp===null||e.clientIp===void 0?null:String(e.clientIp);let i=!1;try{process.kill(t,0),i=!0}catch{i=!1}if(!i){await p.remove(d),console.log(JSON.stringify({status:"stopped",running:!1,pid:null,address:null,connected:!1,clientIp:null}));return}console.log(JSON.stringify({status:"running",running:!0,pid:t,address:r,connected:o,clientIp:o?n||"unknown":null}))}function Ot(){const e=[];e.push(""),e.push("\u8BE6\u7EC6\u547D\u4EE4\u53C2\u6570:");const t=c.program.commands.filter(r=>r.name()!=="help");for(const r of t){if(e.push(` ${r.name()}:`),r.options.length===0){e.push(" (\u65E0\u989D\u5916\u53C2\u6570)");continue}for(const o of r.options){const n=o.defaultValue!==void 0&&o.defaultValue!==null?` (\u9ED8\u8BA4: ${String(o.defaultValue)})`:"",i=o.description?` ${o.description}${n}`:n;e.push(` ${o.flags}${i}`)}}return e.push(""),e.join(`
7
- `)}c.program.name("ms-cli").description("\u5FEB\u70B9JS \u6784\u5EFA\u5DE5\u5177").version(k.PACKAGE_VERSION),c.program.addHelpText("after",Ot),c.program.command("build").description("\u6784\u5EFA \u5FEB\u70B9JS \u9879\u76EE").option("-d, --dev","\u5F00\u53D1\u6A21\u5F0F\u6784\u5EFA (\u5305\u542B source map)").action(rt),c.program.command("package").description("\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6 ms.msbundle").action(nt),c.program.command("run").description("\u5728\u8BBE\u5907\u4E0A\u8FD0\u884C\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(it),c.program.command("run-ui").description("\u5728\u8BBE\u5907\u4E0A\u9884\u89C8 UI").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(st),c.program.command("stop").description("\u505C\u6B62\u8BBE\u5907\u4E0A\u7684\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(at),c.program.command("screenshot").description("\u83B7\u53D6\u8BBE\u5907\u622A\u56FE\uFF08JPG\uFF09").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: file|base64","file").option("--output <output>","\u622A\u56FE\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08format=file \u65F6\u751F\u6548\uFF09").action(ct),c.program.command("source").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u9875\u9762\u8282\u70B9 XML").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--max-depth <maxDepth>","\u8282\u70B9\u6700\u5927\u6DF1\u5EA6","50").option("--timeout <timeout>","\u8282\u70B9\u6293\u53D6\u8D85\u65F6\u79D2\u6570","120").option("--mode <mode>","\u8282\u70B9\u6293\u53D6\u6A21\u5F0F: 1=\u6A21\u5F0F1, 2=\u6A21\u5F0F2, 3=\u6A21\u5F0F3","1").option("--output <output>","\u8282\u70B9 XML \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(pt),c.program.command("logs").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u65E5\u5FD7\u6700\u65B0\u884C").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--limit <limit>","\u8BFB\u53D6\u6700\u65B0\u65E5\u5FD7\u884C\u6570\uFF0C\u8303\u56F4 1..5000","200").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: text|json","text").option("--output <output>","\u65E5\u5FD7\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ut),c.program.command("ocr").description("\u5728\u8BBE\u5907\u4E0A\u6267\u884C OCR \u8BC6\u522B").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--engine <engine>","OCR \u5F15\u64CE: appleocr|paddleocr","appleocr").option("--mode <mode>","OCR \u6A21\u5F0F: recognize|numbers|findText","recognize").option("--input <input>",'\u8F93\u5165\u6E90\uFF0C\u9ED8\u8BA4 "screen"',"screen").option("--x <x>","\u533A\u57DF\u5DE6\u4E0A\u89D2 x","0").option("--y <y>","\u533A\u57DF\u5DE6\u4E0A\u89D2 y","0").option("--ex <ex>","\u533A\u57DF\u53F3\u4E0B\u89D2 x\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--ey <ey>","\u533A\u57DF\u53F3\u4E0B\u89D2 y\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--text <text>","findText \u6587\u672C\uFF0C\u53EF\u91CD\u590D",K,[]).option("--texts <texts>","findText \u6587\u672C\u6570\u7EC4\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--languages <languages>","Apple OCR \u8BED\u8A00\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--exact-match","findText \u8981\u6C42\u5B8C\u6574\u5339\u914D\u6587\u672C").option("--confidence-threshold <confidenceThreshold>","PaddleOCR \u7F6E\u4FE1\u5EA6\u9608\u503C","0.6").option("--paddle-model <paddleModel>","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B ppocr-v6-tiny|ppocr-v6-small|ppocr-v5").option("--max-side-len <maxSideLen>","\u4EC5 paddleocr\uFF1A\u68C0\u6D4B\u6700\u5927\u8FB9\u957F\uFF0C0 \u56DE\u843D\u9ED8\u8BA4 768").option("--use-gpu","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B\u65F6\u542F\u7528 GPU").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","60000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: summary|json","summary").option("--output <output>","OCR \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(lt),c.program.command("image-crop").description("\u88C1\u5207\u672C\u5730\u56FE\u7247\u5E76\u8F93\u51FA PNG").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ft),c.program.command("screen-crop").description("\u4ECE\u8BBE\u5907\u622A\u56FE\u4E2D\u88C1\u5207 PNG").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(gt),c.program.command("image-pick-color").description("\u8BFB\u53D6\u672C\u5730\u56FE\u7247\u6307\u5B9A\u5750\u6807\u989C\u8272").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(ht),c.program.command("screen-pick-color").description("\u8BFB\u53D6\u8BBE\u5907\u622A\u56FE\u6307\u5B9A\u5750\u6807\u989C\u8272").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(wt),c.program.command("image-transparent").description("\u5C06\u56FE\u7247\u4E2D\u63A5\u8FD1\u6307\u5B9A\u989C\u8272\u6216\u89D2\u843D\u80CC\u666F\u8272\u7684\u50CF\u7D20\u8BBE\u4E3A\u900F\u660E").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").option("--transparent-color <transparentColor>","\u900F\u660E\u5316\u989C\u8272\uFF0C\u683C\u5F0F #RRGGBB").option("--sample-corner <sampleCorner>","\u672A\u4F20 transparent-color \u65F6\u91C7\u6837\u89D2\u843D: topLeft|topRight|bottomLeft|bottomRight","topLeft").option("--tolerance <tolerance>","RGB \u6B27\u6C0F\u8DDD\u79BB\u5BB9\u5DEE\uFF0C\u8303\u56F4 0..441","24").action(yt);const Ct=c.program.command("docs").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84");Ct.command("paths").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(mt),c.program.command("http-call").description("\u6309 HTTP API \u6587\u6863\u58F0\u660E\u8C03\u7528\u8BBE\u5907\u63A5\u53E3").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").requiredOption("--method <method>","HTTP \u65B9\u6CD5: GET|POST").requiredOption("--path <path>","HTTP API \u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4F8B\u5982 /api/status").option("--query <query>","JSON \u5BF9\u8C61 query \u53C2\u6570").option("--body <body>","JSON \u8BF7\u6C42\u4F53\uFF1B\u666E\u901A\u5B57\u7B26\u4E32\u4F1A\u4F5C\u4E3A JSON \u5B57\u7B26\u4E32\u63D0\u4EA4").option("--response-format <responseFormat>","\u54CD\u5E94\u683C\u5F0F: json|text","json").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--output <output>","\u54CD\u5E94\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(dt),c.program.command("ws-start").description("\u542F\u52A8 CLI \u5185\u7F6E WS \u670D\u52A1").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").action(xt),c.program.command("ws-stop").description("\u505C\u6B62 CLI \u5185\u7F6E WS \u670D\u52A1").action(Pt),c.program.command("ws-status").description("\u67E5\u770B CLI \u5185\u7F6E WS \u670D\u52A1\u72B6\u6001").action(St),c.program.parse();
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(`
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
+ `):"\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
+ `);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(`
6
+ `)),O.body.success===!1&&process.exit(1)}catch(t){console.error("\u274C OCR \u6267\u884C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function gt(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const r=c(e.x,0,"x",0),o=c(e.y,0,"y",0),n=c(e.width,1,"width",1),i=c(e.height,1,"height",1),s=await(0,P.cropLocalImage)(t,r,o,n,i,e.output);console.log(s)}catch(t){console.error("\u274C \u56FE\u7247\u88C1\u5207\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function ht(e){try{const t=E(e),r=c(e.x,0,"x",0),o=c(e.y,0,"y",0),n=c(e.width,1,"width",1),i=c(e.height,1,"height",1),s=await(0,P.cropDeviceScreen)(t,r,o,n,i,e.output);console.log(s)}catch(t){console.error("\u274C \u5C4F\u5E55\u88C1\u56FE\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function wt(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const r=c(e.x,0,"x",0),o=c(e.y,0,"y",0),n=c(e.radius,0,"radius",0,20),i=await(0,P.pickLocalImageColor)(t,r,o,n);console.log(i)}catch(t){console.error("\u274C \u56FE\u7247\u53D6\u8272\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function yt(e){try{const t=E(e),r=c(e.x,0,"x",0),o=c(e.y,0,"y",0),n=c(e.radius,0,"radius",0,20),i=await(0,P.pickDeviceScreenColor)(t,r,o,n);console.log(i)}catch(t){console.error("\u274C \u5C4F\u5E55\u53D6\u8272\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function xt(e){try{const t=e.image?.trim();if(!t)throw new Error("\u8BF7\u901A\u8FC7 --image \u6307\u5B9A\u8F93\u5165\u56FE\u7247\u8DEF\u5F84\u3002");const r=g(e.sampleCorner,"topLeft",["topLeft","topRight","bottomLeft","bottomRight"],"sample-corner"),o=c(e.tolerance,24,"tolerance",0,441),n=await(0,P.makeLocalImageTransparent)(t,e.output,e.transparentColor,r,o);console.log(n)}catch(t){console.error("\u274C \u900F\u660E\u56FE\u5236\u4F5C\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function Pt(){try{await(0,k.ensureDaemon)()}catch(e){console.error("\u274C USB \u8F6C\u53D1\u542F\u52A8\u5931\u8D25:",e instanceof Error?e.message:e),process.exit(1)}}async function St(e){try{const t=(e.wsPort??"31111").trim(),r=Number.parseInt(t,10);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`\u65E0\u6548 ws \u7AEF\u53E3: ${t}`);const o=H.WSManager.get();await o.start(r);const n=async()=>{const s={pid:process.pid,port:r,address:o.getAddress(),startedAt:Date.now(),connected:o.isClientConnected(),clientIp:o.getConnectedClientIp()};await p.writeJSON(d,s)};await n();const i=setInterval(()=>{n().catch(()=>{})},1e3);await p.writeJSON(d,{pid:process.pid,port:r,address:o.getAddress(),startedAt:Date.now(),connected:o.isClientConnected(),clientIp:o.getConnectedClientIp()}),await new Promise(s=>{const u=async()=>{process.off("SIGINT",u),process.off("SIGTERM",u),clearInterval(i),await o.stop(),await p.remove(d),s()};process.on("SIGINT",u),process.on("SIGTERM",u)})}catch(t){console.error("\u274C WS \u670D\u52A1\u542F\u52A8\u5931\u8D25:",t instanceof Error?t.message:t),process.exit(1)}}async function Ot(){try{if(!await p.pathExists(d)){console.log("WS \u670D\u52A1\u672A\u8FD0\u884C");return}const e=await p.readJSON(d),t=Number(e.pid);if(!Number.isInteger(t)||t<=0)throw await p.remove(d),new Error("WS PID \u6587\u4EF6\u635F\u574F");try{process.kill(t,"SIGTERM"),console.log(`\u2705 \u5DF2\u53D1\u9001\u505C\u6B62\u4FE1\u53F7\u5230 WS \u8FDB\u7A0B: ${t}`)}catch{console.log("WS \u8FDB\u7A0B\u4E0D\u5B58\u5728\uFF0C\u6E05\u7406 PID \u6587\u4EF6")}await p.remove(d)}catch(e){console.error("\u274C WS \u670D\u52A1\u505C\u6B62\u5931\u8D25:",e instanceof Error?e.message:e),process.exit(1)}}async function Ct(){if(!await p.pathExists(d)){console.log(JSON.stringify({status:"stopped",running:!1,pid:null,address:null,connected:!1,clientIp:null}));return}const e=await p.readJSON(d),t=Number(e.pid),r=String(e.address||"unknown"),o=!!e.connected,n=e.clientIp===null||e.clientIp===void 0?null:String(e.clientIp);let i=!1;try{process.kill(t,0),i=!0}catch{i=!1}if(!i){await p.remove(d),console.log(JSON.stringify({status:"stopped",running:!1,pid:null,address:null,connected:!1,clientIp:null}));return}console.log(JSON.stringify({status:"running",running:!0,pid:t,address:r,connected:o,clientIp:o?n||"unknown":null}))}function Et(){const e=[];e.push(""),e.push("\u8BE6\u7EC6\u547D\u4EE4\u53C2\u6570:");const t=a.program.commands.filter(r=>r.name()!=="help");for(const r of t){if(e.push(` ${r.name()}:`),r.options.length===0){e.push(" (\u65E0\u989D\u5916\u53C2\u6570)");continue}for(const o of r.options){const n=o.defaultValue!==void 0&&o.defaultValue!==null?` (\u9ED8\u8BA4: ${String(o.defaultValue)})`:"",i=o.description?` ${o.description}${n}`:n;e.push(` ${o.flags}${i}`)}}return e.push(""),e.join(`
7
+ `)}a.program.name("ms-cli").description("\u5FEB\u70B9JS \u6784\u5EFA\u5DE5\u5177").version(B.PACKAGE_VERSION),a.program.addHelpText("after",Et),a.program.command("build").description("\u6784\u5EFA \u5FEB\u70B9JS \u9879\u76EE").option("-d, --dev","\u5F00\u53D1\u6A21\u5F0F\u6784\u5EFA (\u5305\u542B source map)").action(nt),a.program.command("package").description("\u751F\u4EA7\u6784\u5EFA\u5E76\u52A0\u5BC6 ms.msbundle").action(it),a.program.command("run").description("\u5728\u8BBE\u5907\u4E0A\u8FD0\u884C\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(st),a.program.command("run-ui").description("\u5728\u8BBE\u5907\u4E0A\u9884\u89C8 UI").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(at),a.program.command("stop").description("\u505C\u6B62\u8BBE\u5907\u4E0A\u7684\u9879\u76EE").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").action(ct),a.program.command("screenshot").description("\u83B7\u53D6\u8BBE\u5907\u622A\u56FE\uFF08JPG\uFF09").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: file|base64","file").option("--output <output>","\u622A\u56FE\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08format=file \u65F6\u751F\u6548\uFF09").action(pt),a.program.command("source").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u9875\u9762\u8282\u70B9 XML").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740\uFF08transport=http \u65F6\u5FC5\u586B\uFF09").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("-t, --transport <transport>","\u4F20\u8F93\u65B9\u5F0F: http|ws","http").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").option("--ws-wait-ms <wsWaitMs>","WS \u7B49\u5F85\u8BBE\u5907\u8FDE\u63A5\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--max-depth <maxDepth>","\u8282\u70B9\u6700\u5927\u6DF1\u5EA6","50").option("--timeout <timeout>","\u8282\u70B9\u6293\u53D6\u8D85\u65F6\u79D2\u6570","120").option("--mode <mode>","\u8282\u70B9\u6293\u53D6\u6A21\u5F0F: 1=\u6A21\u5F0F1, 2=\u6A21\u5F0F2, 3=\u6A21\u5F0F3","1").option("--output <output>","\u8282\u70B9 XML \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ut),a.program.command("logs").description("\u83B7\u53D6\u8BBE\u5907\u5F53\u524D\u65E5\u5FD7\u6700\u65B0\u884C").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--limit <limit>","\u8BFB\u53D6\u6700\u65B0\u65E5\u5FD7\u884C\u6570\uFF0C\u8303\u56F4 1..5000","200").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: text|json","text").option("--output <output>","\u65E5\u5FD7\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(mt),a.program.command("ocr").description("\u5728\u8BBE\u5907\u4E0A\u6267\u884C OCR \u8BC6\u522B").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--engine <engine>","OCR \u5F15\u64CE: appleocr|paddleocr","appleocr").option("--mode <mode>","OCR \u6A21\u5F0F: recognize|numbers|findText","recognize").option("--input <input>",'\u8F93\u5165\u6E90\uFF0C\u9ED8\u8BA4 "screen"',"screen").option("--x <x>","\u533A\u57DF\u5DE6\u4E0A\u89D2 x","0").option("--y <y>","\u533A\u57DF\u5DE6\u4E0A\u89D2 y","0").option("--ex <ex>","\u533A\u57DF\u53F3\u4E0B\u89D2 x\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--ey <ey>","\u533A\u57DF\u53F3\u4E0B\u89D2 y\uFF1B\u5168\u5C4F\u53EF\u4F20 0","0").option("--text <text>","findText \u6587\u672C\uFF0C\u53EF\u91CD\u590D",X,[]).option("--texts <texts>","findText \u6587\u672C\u6570\u7EC4\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--languages <languages>","Apple OCR \u8BED\u8A00\uFF0C\u652F\u6301 JSON \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694").option("--exact-match","findText \u8981\u6C42\u5B8C\u6574\u5339\u914D\u6587\u672C").option("--confidence-threshold <confidenceThreshold>","PaddleOCR \u7F6E\u4FE1\u5EA6\u9608\u503C","0.6").option("--paddle-model <paddleModel>","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B ppocr-v6-tiny|ppocr-v6-small|ppocr-v5").option("--max-side-len <maxSideLen>","\u4EC5 paddleocr\uFF1A\u68C0\u6D4B\u6700\u5927\u8FB9\u957F\uFF0C0 \u56DE\u843D\u9ED8\u8BA4 768").option("--use-gpu","\u4EC5 paddleocr\uFF1A\u5207\u6362\u6A21\u578B\u65F6\u542F\u7528 GPU").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","60000").option("--format <format>","\u8FD4\u56DE\u683C\u5F0F: summary|json","summary").option("--output <output>","OCR \u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ft),a.program.command("image-crop").description("\u88C1\u5207\u672C\u5730\u56FE\u7247\u5E76\u8F93\u51FA PNG").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(gt),a.program.command("screen-crop").description("\u4ECE\u8BBE\u5907\u622A\u56FE\u4E2D\u88C1\u5207 PNG").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u88C1\u5207\u8D77\u70B9 x","0").option("--y <y>","\u88C1\u5207\u8D77\u70B9 y","0").requiredOption("--width <width>","\u88C1\u5207\u5BBD\u5EA6").requiredOption("--height <height>","\u88C1\u5207\u9AD8\u5EA6").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(ht),a.program.command("image-pick-color").description("\u8BFB\u53D6\u672C\u5730\u56FE\u7247\u6307\u5B9A\u5750\u6807\u989C\u8272").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(wt),a.program.command("screen-pick-color").description("\u8BFB\u53D6\u8BBE\u5907\u622A\u56FE\u6307\u5B9A\u5750\u6807\u989C\u8272").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").option("--x <x>","\u76EE\u6807\u5750\u6807 x","0").option("--y <y>","\u76EE\u6807\u5750\u6807 y","0").option("--radius <radius>","\u91C7\u6837\u534A\u5F84\uFF0C\u8303\u56F4 0..20","0").action(yt),a.program.command("image-transparent").description("\u5C06\u56FE\u7247\u4E2D\u63A5\u8FD1\u6307\u5B9A\u989C\u8272\u6216\u89D2\u843D\u80CC\u666F\u8272\u7684\u50CF\u7D20\u8BBE\u4E3A\u900F\u660E").requiredOption("--image <image>","\u8F93\u5165\u56FE\u7247\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA PNG \u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").option("--transparent-color <transparentColor>","\u900F\u660E\u5316\u989C\u8272\uFF0C\u683C\u5F0F #RRGGBB").option("--sample-corner <sampleCorner>","\u672A\u4F20 transparent-color \u65F6\u91C7\u6837\u89D2\u843D: topLeft|topRight|bottomLeft|bottomRight","topLeft").option("--tolerance <tolerance>","RGB \u6B27\u6C0F\u8DDD\u79BB\u5BB9\u5DEE\uFF0C\u8303\u56F4 0..441","24").action(xt);const $t=a.program.command("docs").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84");$t.command("paths").description("\u663E\u793A KuaiJS \u672C\u5730\u6587\u6863\u8DEF\u5F84").option("--output <output>","\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(dt),a.program.command("http-call").description("\u6309 HTTP API \u6587\u6863\u58F0\u660E\u8C03\u7528\u8BBE\u5907\u63A5\u53E3").option("-i, --ip <ip>","\u8BBE\u5907 IP \u5730\u5740").option("--port <port>","\u8BBE\u5907\u7AEF\u53E3","9800").requiredOption("--method <method>","HTTP \u65B9\u6CD5: GET|POST").requiredOption("--path <path>","HTTP API \u76F8\u5BF9\u8DEF\u5F84\uFF0C\u4F8B\u5982 /api/status").option("--query <query>","JSON \u5BF9\u8C61 query \u53C2\u6570").option("--body <body>","JSON \u8BF7\u6C42\u4F53\uFF1B\u666E\u901A\u5B57\u7B26\u4E32\u4F1A\u4F5C\u4E3A JSON \u5B57\u7B26\u4E32\u63D0\u4EA4").option("--response-format <responseFormat>","\u54CD\u5E94\u683C\u5F0F: json|text","json").option("--timeout-ms <timeoutMs>","\u8BF7\u6C42\u8D85\u65F6\u65F6\u95F4(\u6BEB\u79D2)","30000").option("--output <output>","\u54CD\u5E94\u8F93\u51FA\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09").action(lt),a.program.command("ws-start").description("\u542F\u52A8 CLI \u5185\u7F6E WS \u670D\u52A1").option("--ws-port <wsPort>","WS \u670D\u52A1\u7AEF\u53E3","31111").action(St),a.program.command("ws-stop").description("\u505C\u6B62 CLI \u5185\u7F6E WS \u670D\u52A1").action(Ot),a.program.command("ws-status").description("\u67E5\u770B CLI \u5185\u7F6E WS \u670D\u52A1\u72B6\u6001").action(Ct),a.program.command("usb-forward").description("\u542F\u52A8\u5168\u5C40 USB \u7AEF\u53E3\u8F6C\u53D1").action(Pt),a.program.parse();
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.addVararg=c;function s(o){o.vararg=!0,t(o.body.body)}function a(o){switch(o.type){case"FuncExpr":s(o);break;case"UnaryExpr":a(o.arg);break;case"BinaryExpr":a(o.left),a(o.right);break;case"TableExpr":for(const e of o.fields)e.kind==="index"&&a(e.key),a(e.value);break;case"IndexExpr":a(o.object),a(o.index);break;case"MemberExpr":a(o.object);break;case"CallExpr":a(o.callee);for(const e of o.args)a(e);break;case"MethodCallExpr":a(o.object);for(const e of o.args)a(e);break;case"ParenExpr":a(o.exp);break;default:break}}function t(o){for(const e of o)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 r of e.exps)a(r);t(e.body.body);break;case"IfStat":for(const r of e.clauses)a(r.cond),t(r.body.body);e.elseBody&&t(e.elseBody.body);break;case"FuncStat":case"LocalFuncStat":s(e.func);break;case"LocalStat":if(e.exps)for(const r of e.exps)a(r);break;case"AssignStat":for(const r of e.vars)a(r);for(const r of e.exps)a(r);break;case"CallStat":a(e.exp);break;case"ReturnStat":for(const r of e.exps)a(r);break;default:break}}function c(o){t(o.body)}
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 +1 @@
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,s){return{type:"AssignStat",vars:t.map(e=>p(e)),exps:s}}function u(t,s){return f([t.stateName],[typeof s=="number"?m(s):s])}function k(t,s,e){return{type:"BinaryExpr",op:"or",left:{type:"BinaryExpr",op:"and",left:p(t),right:m(s)},right:m(e)}}function E(t,s,e){return{type:"BinaryExpr",op:t,left:s,right:e}}function S(t){const s=`__t${t.nextTemp}`;return t.nextTemp+=1,t.temps.push(s),s}function x(t){const s=t.nextState;return t.nextState+=1,t.states.set(s,[]),s}function n(t,s,e){t.states.get(s).push(e)}function F(t,s){for(const e of t)if(e.type==="LocalStat")for(const a of e.names)s.push(a.name);else if(e.type==="LocalFuncStat")s.push(e.name);else if(e.type==="ForNumStat")s.push(e.name),F(e.body.body,s);else if(e.type==="ForInStat")s.push(...e.names),F(e.body.body,s);else if(e.type==="DoStat"||e.type==="WhileStat"||e.type==="RepeatStat")F(e.body.body,s);else if(e.type==="IfStat"){for(const a of e.clauses)F(a.body.body,s);e.elseBody&&F(e.elseBody.body,s)}}function h(t,s,e,a){if(t.length===0)return s;const y=t.map(()=>x(e));for(let o=0;o<t.length;o+=1){const r=t[o];r.type==="LabelStat"&&e.userLabels.set(r.name,y[o])}for(let o=0;o<t.length;o+=1){const r=o+1<t.length?y[o+1]:s;I(e,y[o],t[o],r,a)}return y[0]}function I(t,s,e,a,y){switch(e.type){case"EmptyStat":case"LabelStat":n(t,s,u(t,a));return;case"AssignStat":case"CallStat":case"FuncStat":n(t,s,e),n(t,s,u(t,a));return;case"LocalStat":e.exps&&e.exps.length>0&&n(t,s,f(e.names.map(o=>o.name),e.exps)),n(t,s,u(t,a));return;case"LocalFuncStat":n(t,s,f([e.name],[e.func])),n(t,s,u(t,a));return;case"ReturnStat":n(t,s,e);return;case"BreakStat":n(t,s,u(t,y));return;case"GotoStat":{const o=t.userLabels.get(e.name);if(o===void 0)throw new Error(`goto \u672A\u5B9A\u4E49\u6807\u7B7E ::${e.name}::`);n(t,s,u(t,o));return}case"DoStat":n(t,s,u(t,h(e.body.body,a,t,y)));return;case"IfStat":{const o=S(t);let r=s;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),n(t,r,f([o],[e.clauses[l].cond])),n(t,r,u(t,k(o,d,i))),b||(r=i)}e.clauses.length===0&&n(t,s,u(t,a));return}case"WhileStat":{const o=S(t),r=h(e.body.body,s,t,a);n(t,s,f([o],[e.cond])),n(t,s,u(t,k(o,r,a)));return}case"RepeatStat":{const o=S(t),r=x(t),l=h(e.body.body,r,t,a);n(t,s,u(t,l)),n(t,r,f([o],[e.cond])),n(t,r,u(t,k(o,a,l)));return}case"ForNumStat":{const o=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);n(t,s,f([o],[e.start])),n(t,s,f([r],[e.end])),n(t,s,f([l],[e.step??m(1)])),n(t,s,u(t,d)),n(t,d,f([b],[E(">=",p(l),m(0))])),n(t,d,u(t,k(b,i,L))),n(t,i,f([b],[E("<=",p(o),p(r))])),n(t,i,u(t,k(b,N,a))),n(t,L,f([b],[E(">=",p(o),p(r))])),n(t,L,u(t,k(b,N,a))),n(t,g,f([o],[E("+",p(o),p(l))])),n(t,g,u(t,d));return}case"ForInStat":{const o=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"});n(t,s,f([o,r,l],g.slice(0,3))),n(t,s,u(t,d)),n(t,d,{type:"AssignStat",vars:e.names.map(N=>p(N)),exps:[{type:"CallExpr",callee:p(o),args:[p(r),p(l)]}]}),n(t,d,f([b],[E("~=",p(e.names[0]),{type:"NilLiteral"})])),n(t,d,u(t,k(b,L,a)));return}default:n(t,s,u(t,a))}}function v(t,s){const e=t.slice();let a=s>>>0||1;for(let y=e.length-1;y>0;y-=1){a=Math.imul(a,1664525)+1013904223>>>0;const o=a%(y+1),r=e[y];e[y]=e[o],e[o]=r}return e}function w(t,s){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),o=[...new Set([...a,...e.temps,e.stateName])],r=v([...e.states.keys()],s).map(l=>({cond:E("==",p(e.stateName),m(l)),body:{type:"Block",body:e.states.get(l)}}));return[{type:"LocalStat",names:o.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,s){switch(t.type){case"FuncExpr":B(t.body.body,s),t.body.body=w(t.body.body,s);break;case"UnaryExpr":c(t.arg,s);break;case"BinaryExpr":c(t.left,s),c(t.right,s);break;case"TableExpr":for(const e of t.fields)e.kind==="index"&&c(e.key,s),c(e.value,s);break;case"IndexExpr":c(t.object,s),c(t.index,s);break;case"MemberExpr":c(t.object,s);break;case"CallExpr":c(t.callee,s);for(const e of t.args)c(e,s);break;case"MethodCallExpr":c(t.object,s);for(const e of t.args)c(e,s);break;case"ParenExpr":c(t.exp,s);break;default:break}}function B(t,s){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,s),e.type==="ForNumStat"&&(c(e.start,s),c(e.end,s),e.step&&c(e.step,s)),e.type==="ForInStat")for(const a of e.exps)c(a,s);B(e.body.body,s);break;case"IfStat":for(const a of e.clauses)c(a.cond,s),B(a.body.body,s);e.elseBody&&B(e.elseBody.body,s);break;case"FuncStat":case"LocalFuncStat":B(e.func.body.body,s),e.func.body.body=w(e.func.body.body,s);break;case"LocalStat":if(e.exps)for(const a of e.exps)c(a,s);break;case"AssignStat":for(const a of e.vars)c(a,s);for(const a of e.exps)c(a,s);break;case"CallStat":c(e.exp,s);break;case"ReturnStat":for(const a of e.exps)c(a,s);break;default:break}}function C(t,s){B(t.body,s),t.body=w(t.body,s)}
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 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shortName=r,exports.renameLocals=c;const u=require("./reserved"),d=require("./scope"),l="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function r(a){let e=a,t="";do t=l[e%l.length]+t,e=Math.floor(e/l.length)-1;while(e>=0);return u.luaKeywords.has(t)?`_${t}`:t}function c(a){let e=0;const t=new Set;(0,d.collectAndRename)(a,(o,s)=>{if(o.newName!==o.original)return;let n=r(e);for(e+=1;s.has(n)||t.has(n)||u.luaKeywords.has(n);)n=r(e),e+=1;o.newName=n,t.add(n),s.add(n)})}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shortName=a,exports.renameLocals=c;const u=require("./reserved"),d=require("./scope"),l="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";function a(r){let e=r,t="";do t=l[e%l.length]+t,e=Math.floor(e/l.length)-1;while(e>=0);return u.luaKeywords.has(t)?`_${t}`:t}function c(r){let e=0;const t=new Set;(0,d.collectAndRename)(r,(o,s)=>{if(o.newName!==o.original)return;let n=a(e);for(e+=1;s.has(n)||t.has(n)||u.luaKeywords.has(n);)n=a(e),e+=1;o.newName=n,t.add(n),s.add(n)})}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveLocal=i,exports.collectAndRename=x;function i(t,s){let r=t;for(;r;){const e=r.locals.get(s);if(e)return e;r=r.parent}}function c(t){return{parent:t,locals:new Map}}function f(t,s){const r=t.locals.get(s);if(r)return r;const e={original:s,newName:s};return t.locals.set(s,e),e}function x(t,s){const r=new Set,e={locals:new Map};d(t.body,e,r,s)}function l(t,s,r,e){d(t.body,s,r,e)}function d(t,s,r,e){for(const o of t)b(o,s,r,e)}function m(t,s,r,e){const o=c(s),a=t.params.slice();for(let u=0;u<a.length;u+=1){const p=f(o,a[u]);e(p,r),t.params[u]=p.newName}l(t.body,o,r,e)}function b(t,s,r,e){switch(t.type){case"EmptyStat":case"BreakStat":case"GotoStat":case"LabelStat":return;case"DoStat":l(t.body,c(s),r,e);return;case"WhileStat":n(t.cond,s,r,e),l(t.body,c(s),r,e);return;case"RepeatStat":{const o=c(s);l(t.body,o,r,e),n(t.cond,o,r,e);return}case"IfStat":for(const o of t.clauses)n(o.cond,s,r,e),l(o.body,c(s),r,e);t.elseBody&&l(t.elseBody,c(s),r,e);return;case"ForNumStat":{n(t.start,s,r,e),n(t.end,s,r,e),t.step&&n(t.step,s,r,e);const o=c(s),a=f(o,t.name);e(a,r),t.name=a.newName,l(t.body,o,r,e);return}case"ForInStat":{for(const a of t.exps)n(a,s,r,e);const o=c(s);for(let a=0;a<t.names.length;a+=1){const u=f(o,t.names[a]);e(u,r),t.names[a]=u.newName}l(t.body,o,r,e);return}case"FuncStat":{const o=i(s,t.name.base);o&&(t.name.base=o.newName),m(t.func,s,r,e);return}case"LocalFuncStat":{const o=f(s,t.name);e(o,r),t.name=o.newName,m(t.func,s,r,e);return}case"LocalStat":if(t.exps)for(const o of t.exps)n(o,s,r,e);for(let o=0;o<t.names.length;o+=1){const a=f(s,t.names[o].name);e(a,r),t.names[o].name=a.newName}return;case"AssignStat":for(const o of t.vars)n(o,s,r,e);for(const o of t.exps)n(o,s,r,e);return;case"CallStat":n(t.exp,s,r,e);return;case"ReturnStat":for(const o of t.exps)n(o,s,r,e);return}}function n(t,s,r,e){switch(t.type){case"NilLiteral":case"BoolLiteral":case"NumberLiteral":case"StringLiteral":case"VarargExpr":return;case"NameExpr":{const o=i(s,t.name);o&&(t.name=o.newName);return}case"UnaryExpr":n(t.arg,s,r,e);return;case"BinaryExpr":n(t.left,s,r,e),n(t.right,s,r,e);return;case"FuncExpr":m(t,s,r,e);return;case"TableExpr":for(const o of t.fields)o.kind==="index"&&n(o.key,s,r,e),n(o.value,s,r,e);return;case"IndexExpr":n(t.object,s,r,e),n(t.index,s,r,e);return;case"MemberExpr":n(t.object,s,r,e);return;case"CallExpr":n(t.callee,s,r,e);for(const o of t.args)n(o,s,r,e);return;case"MethodCallExpr":n(t.object,s,r,e);for(const o of t.args)n(o,s,r,e);return;case"ParenExpr":n(t.exp,s,r,e);return}}
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.resolveLocal=i,exports.collectAndRename=x;function i(t,c){let r=t;for(;r;){const e=r.locals.get(c);if(e)return e;r=r.parent}}function o(t){return{parent:t,locals:new Map}}function f(t,c){const r=t.locals.get(c);if(r)return r;const e={original:c,newName:c};return t.locals.set(c,e),e}function x(t,c){const r=new Set,e={locals:new Map};d(t.body,e,r,c)}function l(t,c,r,e){d(t.body,c,r,e)}function d(t,c,r,e){for(const s of t)b(s,c,r,e)}function m(t,c,r,e){const s=o(c),a=t.params.slice();for(let u=0;u<a.length;u+=1){const p=f(s,a[u]);e(p,r),t.params[u]=p.newName}l(t.body,s,r,e)}function b(t,c,r,e){switch(t.type){case"EmptyStat":case"BreakStat":case"GotoStat":case"LabelStat":return;case"DoStat":l(t.body,o(c),r,e);return;case"WhileStat":n(t.cond,c,r,e),l(t.body,o(c),r,e);return;case"RepeatStat":{const s=o(c);l(t.body,s,r,e),n(t.cond,s,r,e);return}case"IfStat":for(const s of t.clauses)n(s.cond,c,r,e),l(s.body,o(c),r,e);t.elseBody&&l(t.elseBody,o(c),r,e);return;case"ForNumStat":{n(t.start,c,r,e),n(t.end,c,r,e),t.step&&n(t.step,c,r,e);const s=o(c),a=f(s,t.name);e(a,r),t.name=a.newName,l(t.body,s,r,e);return}case"ForInStat":{for(const a of t.exps)n(a,c,r,e);const s=o(c);for(let a=0;a<t.names.length;a+=1){const u=f(s,t.names[a]);e(u,r),t.names[a]=u.newName}l(t.body,s,r,e);return}case"FuncStat":{const s=i(c,t.name.base);s&&(t.name.base=s.newName),m(t.func,c,r,e);return}case"LocalFuncStat":{const s=f(c,t.name);e(s,r),t.name=s.newName,m(t.func,c,r,e);return}case"LocalStat":if(t.exps)for(const s of t.exps)n(s,c,r,e);for(let s=0;s<t.names.length;s+=1){const a=f(c,t.names[s].name);e(a,r),t.names[s].name=a.newName}return;case"AssignStat":for(const s of t.vars)n(s,c,r,e);for(const s of t.exps)n(s,c,r,e);return;case"CallStat":n(t.exp,c,r,e);return;case"ReturnStat":for(const s of t.exps)n(s,c,r,e);return}}function n(t,c,r,e){switch(t.type){case"NilLiteral":case"BoolLiteral":case"NumberLiteral":case"StringLiteral":case"VarargExpr":return;case"NameExpr":{const s=i(c,t.name);s&&(t.name=s.newName);return}case"UnaryExpr":n(t.arg,c,r,e);return;case"BinaryExpr":n(t.left,c,r,e),n(t.right,c,r,e);return;case"FuncExpr":m(t,c,r,e);return;case"TableExpr":for(const s of t.fields)s.kind==="index"&&n(s.key,c,r,e),n(s.value,c,r,e);return;case"IndexExpr":n(t.object,c,r,e),n(t.index,c,r,e);return;case"MemberExpr":n(t.object,c,r,e);return;case"CallExpr":n(t.callee,c,r,e);for(const s of t.args)n(s,c,r,e);return;case"MethodCallExpr":n(t.object,c,r,e);for(const s of t.args)n(s,c,r,e);return;case"ParenExpr":n(t.exp,c,r,e);return}}
package/docs/api/hid.md CHANGED
@@ -189,7 +189,7 @@ logi(version);
189
189
 
190
190
  ### resetPosition - 复位坐标
191
191
 
192
- 将鼠标坐标复位到左上角(仅相对鼠标模式需要)。
192
+ 将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
193
193
 
194
194
  ```typescript
195
195
  function resetPosition(): boolean;
@@ -203,7 +203,7 @@ function resetPosition(): boolean;
203
203
  **示例:**
204
204
 
205
205
  ```javascript
206
- // 复位坐标到左上角
206
+ // 复位坐标到左下角
207
207
  const ok = hid.resetPosition();
208
208
  logi(ok); // 输出: true 或 false
209
209
  ```
package/docs/apicn/hid.md CHANGED
@@ -189,7 +189,7 @@ $打印信息日志(version);
189
189
 
190
190
  ### 复位坐标
191
191
 
192
- 将鼠标坐标复位到左上角(仅相对鼠标模式需要)。
192
+ 将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
193
193
 
194
194
  ```typescript
195
195
  function 复位坐标(): 布尔值;
@@ -203,7 +203,7 @@ function 复位坐标(): 布尔值;
203
203
  **示例:**
204
204
 
205
205
  ```javascript
206
- // 复位坐标到左上角
206
+ // 复位坐标到左下角
207
207
  const 是否成功 = $HID.复位坐标();
208
208
  $打印信息日志(是否成功); // 输出: true 或 false
209
209
  ```
@@ -160,7 +160,7 @@ print(hid.getDeviceVersion())
160
160
 
161
161
  ### resetPosition - 复位坐标
162
162
 
163
- 将鼠标坐标复位到左上角(仅相对鼠标模式需要)。
163
+ 将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
164
164
 
165
165
  ```lua
166
166
  ---@return boolean
@@ -175,7 +175,7 @@ function resetPosition() end
175
175
  **示例:**
176
176
 
177
177
  ```lua
178
- -- 复位坐标到左上角
178
+ -- 复位坐标到左下角
179
179
  local ok = hid.resetPosition()
180
180
  print(ok) -- 输出: true 或 false
181
181
  ```
package/docs/apilua/ui.md CHANGED
@@ -85,18 +85,6 @@ function show() end
85
85
  ui.show()
86
86
  ```
87
87
 
88
- ### hide - 隐藏 WebView。
89
-
90
- ```lua
91
- function hide() end
92
- ```
93
-
94
- **示例:**
95
-
96
- ```lua
97
- ui.hide()
98
- ```
99
-
100
88
  ### eval - 在 WebView 中执行 JavaScript 代码。
101
89
 
102
90
  ```lua
@@ -193,7 +193,7 @@ print(version)
193
193
 
194
194
  ### resetPosition - 复位坐标
195
195
 
196
- 将鼠标坐标复位到左上角(仅相对鼠标模式需要)。
196
+ 将鼠标坐标复位到左下角(仅相对鼠标模式需要)。
197
197
 
198
198
  ```python
199
199
  def resetPosition() -> bool:
@@ -208,7 +208,7 @@ def resetPosition() -> bool:
208
208
 
209
209
  ```python
210
210
  from kuaijs import hid
211
- # 复位坐标到左上角
211
+ # 复位坐标到左下角
212
212
  ok = hid.resetPosition()
213
213
  print(ok) # 输出: True 或 False
214
214
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ms-vite-plugin",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "type": "commonjs",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -17,7 +17,10 @@
17
17
  "ms-mcp": "dist/mcp-server.js"
18
18
  },
19
19
  "scripts": {
20
+ "sync-docs": "node scripts/sync-docs.js",
20
21
  "build": "tsc && node scripts/minify-dist.js",
22
+ "prepack": "npm run sync-docs",
23
+ "postpack": "node scripts/sync-docs.js --clean",
21
24
  "prepublishOnly": "npm run build"
22
25
  },
23
26
  "dependencies": {
@@ -1,77 +0,0 @@
1
- # 创建项目
2
-
3
- **前置条件**
4
-
5
- - 已安装 Visual Studio Code 和 快点 JS 开发工具插件
6
- - 快点 JS 开发工具插件需要登录`快点JS 开发者账号`,才能创建项目,请点击顶部菜单`开发者后台`注册账号
7
- - 快点 JS APP 需要从`快点JS APP` 上<span style="color: red;">注册账号</span>,注册完成后,需要登录`快点JS APP`,才能使用
8
-
9
- ## 创建项目
10
-
11
- - 快点 JS 使用 `javascript`/`python`/`lua` 编写脚本,入口文件为 `main.js` 或 `main.py` 或 `main.lua`
12
-
13
- - 在创建`快点JS`项目之前,请确保你拥有 js 基础,了解 js 的语法,才能正常使用`快点JS`
14
- - 可以查找`快点JS`的文档,了解`快点JS`的语法,如[点此进入 JS 基础教程](../js-tutorial/introduction.md)
15
- - 点击`创建快点JS项目`,如没有安装`快点JS开发工具插件`,是不会有这个按钮的
16
- - 选择一个文件目录,输入项目名称,回车创建项目
17
- - 快点 JS-JS 引擎使用 `ES6` 语法,支持 import 别的 js 文件
18
- - 快点 JS-Python 引擎使用 `Python3.14`, 打包需要安装 `Python3.14`
19
- - 快点 JS-Lua 引擎入口为 `scripts/main.lua`,宿主模块是内置全局表(如 `device`),不要 `require`;全局函数如 `Sleep` 可直接调用
20
- - 项目创建完成后,会自动打开项目,项目结构如下:
21
-
22
- ### 项目结构
23
-
24
- ```
25
- 项目名称/
26
- ├─ scripts/ ← 脚本存放目录
27
- │ └─ main.js ← JS引擎程序入口(文件名不可改变,仅js项目)
28
- | └─ main.py ← Python程序入口(文件名不可改变,仅python项目)
29
- | └─ main.lua ← Lua程序入口(文件名不可改变,仅lua项目)
30
- ├─ res/ ← 资源存放目录
31
- ├─ ui/ ← UI 界面存放目录
32
- │ ├─ fonts/
33
- │ ├─ htmljs/
34
- │ └─ index.html
35
- ├─ .gitignore ← Git 忽略文件
36
- ├─ .npmrc ← npm 配置文件
37
- ├─ .prettierignore ← 代码格式化忽略文件(仅js项目)
38
- ├─ .prettierrc.yaml ← 代码格式化配置(需安装 Prettier 插件,仅js项目)
39
- ├─ obfuscator.json ← 代码混淆配置(JS:javascript-obfuscator;Lua:Prometheus + 单文件合并,可开关和选档位)
40
- ├─ package.json ← 项目依赖配置文件
41
- └─ tsconfig.json ← TypeScript 配置文件(用于js提示和网页提示)
42
- ```
43
-
44
- ### 创建项目
45
-
46
- <img src="/img/Project/createProject.jpg" width="800" alt="创建项目">
47
-
48
- ### 项目类型
49
-
50
- <img src="/img/Project/项目类型.jpg" width="800" alt="创建项目">
51
-
52
- ## 运行项目
53
-
54
- **使用说明**
55
-
56
- - 点击运行项目,会执行编译同步到设备上运行,同时运行会变成停止按钮
57
- - 点击停止项目,会停止设备上运行的项目,如果项目没有写死循环,会自动退出
58
- - 点击运行 UI,设备会打开项目的 UI 界面,打开配置的 html
59
- - 点击图色按钮,会打开图色工具
60
- - 点击节点查找按钮,会打开节点查找工具
61
- - 点击实时画面,会打开手机实时画面
62
- - 点击打包,会打包项目为msbundle脚本包,打包完成后,会在项目目录下生成msbundle文件
63
-
64
- **注意事项**
65
-
66
- - 当你的 VisualStudioCode 安装其他的插件时,编辑器右侧顶部工具栏,可能图标不显示,因为被其他插件占用了
67
- - 你可以通过编辑器右键菜单->`快点JS`->的下级菜单,来使用所有功能
68
-
69
- <img src="/img/Project/devloper.png" width="800" alt="运行项目">
70
-
71
- ## 常见问题
72
-
73
- ### 无法显示`debug`或`warn`级别的日志
74
-
75
- - VisualStudioCode 日志控制台默认是信息也就是 INFO 请设置为跟踪,并点击设置为默认值,否则可能看不到 `debug` 或 `warn` 级别的日志
76
-
77
- <img src="/img/Project/log.png" width="800" alt="日志控制台">
@@ -1,20 +0,0 @@
1
- # 打包脚本包
2
-
3
- **前置条件**
4
-
5
- - 需要在项目配置 `AppId` 字段
6
- - `AppId` 从开发者后台->网络验证管理->软件列表 中获取
7
-
8
- **操作步骤**
9
-
10
- - 打开主脚本 `main.js | main.py | main.lua`,右键编辑器,选择 `快点JS` -> `打包应用`
11
- - 输入在开发者后台->网络验证管理->软件列表 中获取的 `AppId` 字段
12
- - JS / Lua 项目可编辑根目录 `obfuscator.json` 决定打包行为;Python 打包编译为 `.pyc`,没有该配置
13
- - JS:Vite 把入口打成单文件后再按 `enabled` 混淆
14
- - Lua:Release 默认把 `scripts` 下用户模块合并为单个 `scripts/main.lua`(`bundle`,缺省 `true`),再按 `enabled` / `preset` 用 Prometheus 混淆该文件。`enabled: false` 时仍可合并。宿主全局模块(如 `device`)不受影响。不要用 `dofile` / `loadfile` 去读会被删掉的其它 `.lua`
15
- - 注意:上传到快点JS热更新服务后,可通过开发者后台->网络验证管理->软件列表的软件编号进行分发
16
- - 注意:快点JS上可通过软件面板,输入软件编号进行搜索加载应用
17
-
18
- <img src="/img/PackProject/打包菜单.png" width="800" alt="打包菜单">
19
-
20
- <img src="/img/PackProject/packageIPA.png" width="800" alt="打包IPA">