@doubao-dev/cli 0.0.34 → 0.0.35

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/dev.js CHANGED
@@ -11,7 +11,7 @@ import"node:module";import{__webpack_require__ as e}from"./rslib-runtime.js";imp
11
11
  `),e}catch(e){if(I(e)&&"EEXIST"===e.code)return this.readMasterKey();throw new p(`Failed to write encrypted token master key: ${A(e)}`)}}}class g{async get(e){try{let{stdout:t}=await d("security",["find-generic-password","-a",e,"-s",l,"-w"]);return String(t).replace(/\n$/,"")}catch(e){if(y(e))return;throw new p(`Failed to read token from macOS Keychain: ${A(e)}`)}}async set(e,t){try{await d("security",["add-generic-password","-a",e,"-s",l,"-w",t,"-U"])}catch(e){throw new p(`Failed to write token to macOS Keychain: ${A(e)}`)}}async delete(e){try{await d("security",["delete-generic-password","-a",e,"-s",l])}catch(e){if(y(e))return;throw new p(`Failed to delete token from macOS Keychain: ${A(e)}`)}}}class _{async get(e){try{let{stdout:t}=await d("secret-tool",["lookup","service",l,"account",e]);return String(t).replace(/\n$/,"")}catch(e){if(b(e))return;throw new p(`Failed to read token from Secret Service: ${A(e)}`)}}async set(e,t){try{var n,o,i;await (n="secret-tool",o=["store","--label","Doubao Open CLI token","service",l,"account",e],i=t,new Promise((e,t)=>{let s=(0,r.spawn)(n,o,{stdio:["pipe","ignore","pipe"]}),a="";s.stderr.setEncoding("utf8"),s.stderr.on("data",e=>{a+=String(e)}),s.on("error",t),s.on("close",r=>{0===r?e():t(Error(a.trim()||`${n} exited with code ${r}`))}),s.stdin.end(i)}))}catch(e){throw new p(`Failed to write token to Secret Service: ${A(e)}`)}}async delete(e){try{await d("secret-tool",["clear","service",l,"account",e])}catch(e){if(b(e))return;throw new p(`Failed to delete token from Secret Service: ${A(e)}`)}}}async function w(e,t){let n=a.dirname(e);await i.promises.mkdir(n,{recursive:!0,mode:448}),"win32"!==process.platform&&await i.promises.chmod(n,448);let r=a.join(n,`.${a.basename(e)}.${process.pid}.${Date.now()}.tmp`);try{await i.promises.writeFile(r,t,{mode:384,flag:"wx"}),"win32"!==process.platform&&await i.promises.chmod(r,384),await i.promises.rename(r,e),"win32"!==process.platform&&await i.promises.chmod(e,384)}finally{try{await i.promises.unlink(r)}catch{}}}function y(e){let t=v(e),n=E(e);return(1===t||44===t)&&(n.includes("could not be found")||n.includes("The specified item could not be found"))}function b(e){let t=v(e),n=E(e);return 1===t&&(n.includes("could not be found")||n.includes("No matching items")||""===n.trim())}function v(e){return"object"==typeof e&&null!==e&&"code"in e?e.code:void 0}function E(e){return"object"==typeof e&&null!==e&&"stderr"in e?String(e.stderr??""):""}function I(e){return e instanceof Error&&"code"in e}function A(e){if("object"==typeof e&&null!==e&&"stderr"in e){let t=String(e.stderr??"").trim();if(t)return t}return e instanceof Error&&e.message?e.message:String(e)}n.d(t,{Mj:()=>h,RI:()=>p})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/device-flow.js"(e,t,n){var r=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/config.js"),o=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/errors.js"),i=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/jwt.js"),s=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/store.js"),a=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/types.js");async function d(e={}){let t=(0,r.$i)(e),n=t.fetch??fetch,l=t.sleep??w,c=await u(n,t.baseUrl,t.requestHeaders),h=y(t.baseUrl,c.user_code);t.onVerification?.({userCode:c.user_code,verificationUrl:h,expiresIn:c.expires_in,interval:c.interval});let f=Math.max(1,c.interval),m=Date.now()+1e3*c.expires_in;for(;Date.now()<m;){await l(1e3*f);let e=await p(n,t.baseUrl,c.device_code,t.requestHeaders);if(t.onPoll?.({status:e.status,interval:f}),e.status!==a.A.Pending){if(e.status===a.A.SlowDown){f+=Math.max(1,c.interval);continue}if(e.status===a.A.Expired)throw new o.JC("Device authorization expired","DEVICE_AUTH_EXPIRED");if(e.status===a.A.Invalid)throw new o.JC("Device authorization is invalid","DEVICE_AUTH_INVALID");if(e.status===a.A.Authorized){if(!e.access_token)throw new o.JC("Authorization response did not include an access token");let n=_(e,t.baseUrl);return await (0,s.tK)(t.tokenPath,n,{credentialStore:t.credentialStore}),{accessToken:n.accessToken,tokenType:n.tokenType,expiresAt:n.expiresAt,baseUrl:n.baseUrl,uid:(0,i.m)(n.accessToken),tokenPath:t.tokenPath}}throw new o.JC(`Unexpected authorization status: ${String(e.status)}`)}}throw new o.JC("Device authorization timed out","DEVICE_AUTH_EXPIRED")}async function l(e={}){let t=(0,r.$i)(e),n=t.fetch??fetch,o=await u(n,t.baseUrl,t.requestHeaders),i=y(t.baseUrl,o.user_code);return t.onVerification?.({userCode:o.user_code,verificationUrl:i,expiresIn:o.expires_in,interval:o.interval}),{userCode:o.user_code,deviceCode:o.device_code,verificationUrl:i,expiresIn:o.expires_in,interval:o.interval}}async function c(e,t={}){let n=(0,r.$i)(t),d=n.fetch??fetch,l=n.sleep??w,u=n.baseUrl,h=n.requestHeaders,f=5,m=Date.now()+6e5;for(;Date.now()<m;){await l(1e3*f);let t=await p(d,u,e,h);if(n.onPoll?.({status:t.status,interval:f}),t.status!==a.A.Pending){if(t.status===a.A.SlowDown){f+=5;continue}if(t.status===a.A.Expired)throw new o.JC("Device authorization expired","DEVICE_AUTH_EXPIRED");if(t.status===a.A.Invalid)throw new o.JC("Device authorization is invalid","DEVICE_AUTH_INVALID");if(t.status===a.A.Authorized){if(!t.access_token)throw new o.JC("Authorization response did not include an access token");let e=_(t,u);return await (0,s.tK)(n.tokenPath,e,{credentialStore:n.credentialStore}),{accessToken:e.accessToken,tokenType:e.tokenType,expiresAt:e.expiresAt,baseUrl:e.baseUrl,uid:(0,i.m)(e.accessToken),tokenPath:n.tokenPath}}throw new o.JC(`Unexpected authorization status: ${String(t.status)}`)}}throw new o.JC("Device authorization timed out","DEVICE_AUTH_EXPIRED")}async function u(e,t,n){let i=await e(`${t}/app_developer/oauth/device/code`,{method:"POST",headers:g(n),body:JSON.stringify({client_name:r.E})}),s=await h(i),a=m(s);if(!a||!a.device_code||!a.user_code||"number"!=typeof a.expires_in||"number"!=typeof a.interval)throw new o.JC(`Device code response is malformed (HTTP ${i.status}): ${JSON.stringify(s)}`);return a}async function p(e,t,n,r){let i=await e(`${t}/app_developer/oauth/token`,{method:"POST",headers:g(r),body:JSON.stringify({device_code:n})}),s=await h(i),d=m(s);if(d?.access_token)return{status:a.A.Authorized,access_token:d.access_token,token_type:d.token_type,expires_in:d.expires_in,expires_at:d.expires_at};if(!d||"number"!=typeof d.status)throw new o.JC(`Token response is malformed (HTTP ${i.status}): ${JSON.stringify(s)}`);return d}async function h(e){var t;let n,r=e.headers.get("x-tt-logid")??void 0;try{n=await e.json()}catch{throw new o.JC(`Auth server returned non-JSON response with status ${e.status}${f(r)}`,"DEVICE_AUTH_FAILED",{logId:r})}let i=function(e){if(e&&"object"==typeof e)return"string"==typeof e.log_id&&e.log_id?e.log_id:void 0}(n)??r;if(!e.ok)throw new o.JC(`Auth server returned HTTP ${e.status}: ${JSON.stringify(n)}${f(i)}`,"DEVICE_AUTH_FAILED",{logId:i});let s=(t=n)&&"object"==typeof t&&"number"==typeof t.code&&0!==t.code?{code:t.code,message:"string"==typeof t.message?t.message:"Unknown error",logId:"string"==typeof t.log_id?t.log_id:void 0}:null;if(s)throw new o.JC(`Auth server error (code ${s.code}): ${s.message}${f(s.logId??i)}`,"DEVICE_AUTH_FAILED",{logId:s.logId??i});return n}function f(e){return e?` [log_id: ${e}]`:""}function m(e){return e&&"object"==typeof e&&"data"in e?e.data:e}function g(e){let t=new Headers(e);return t.set("Content-Type","application/json"),t}function _(e,t){let n=Math.floor(Date.now()/1e3);return{accessToken:e.access_token??"",tokenType:e.token_type??"Bearer",expiresAt:"number"==typeof e.expires_at?e.expires_at:n+(e.expires_in??0),baseUrl:t}}function w(e){return new Promise(t=>{setTimeout(t,e)})}function y(e,t){let n=new URL(e).host,r=new URL(`https://${n}/oauth/device`);return r.searchParams.set("user_code",t),r.toString()}n.d(t,{R$:()=>c,c$:()=>l,iD:()=>d})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/errors.js"(e,t,n){class r extends Error{constructor(e,t){super(e),this.code=t,this.name="AuthError"}}class o extends r{constructor(e="Not logged in"){super(e,"NOT_LOGGED_IN"),this.name="NotLoggedInError"}}class i extends r{constructor(e="Login token has expired"){super(e,"TOKEN_EXPIRED"),this.name="TokenExpiredError"}}class s extends r{constructor(e,t="DEVICE_AUTH_FAILED",n={}){super(e,t),this.name="DeviceAuthError",this.logId=n.logId}}n.d(t,{BX:()=>i,JC:()=>s,bG:()=>o,lR:()=>r})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/http.js"(e,t,n){var r=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/errors.js"),o=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/config.js"),i=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/store.js");function s(e=fetch,t={}){return async(n,s={})=>{let a=(0,o.$i)(t);var d=n,l=a.allowedOrigins;let c=function(e){try{if("string"==typeof e)return new URL(e);if(e instanceof URL)return e;return new URL(e.url)}catch{throw Error("Authenticated requests must use an absolute HTTPS URL")}}(d);if("https:"!==c.protocol)throw Error(`Authenticated requests must use https: ${c.toString()}`);if(!l.includes(c.origin))throw Error(`Refusing to attach Authorization header to untrusted origin: ${c.origin}`);let u=await (0,i.AI)(a.tokenPath,{allowExpired:!0,envTokenBaseUrl:a.baseUrl,credentialStore:a.credentialStore,legacyTokenPath:a.legacyTokenPath});if(!u)throw new r.bG;if((0,i._d)(u))throw new r.BX;let p=new Headers(s.headers);return a.requestHeaders.forEach((e,t)=>{p.set(t,e)}),p.set("Authorization",`${u.tokenType||"Bearer"} ${u.accessToken}`),e(n,{...s,headers:p})}}n.d(t,{r:()=>s})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/index.js"(e,t,n){n.r(t);var r=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/config.js"),o=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/credential-store.js"),i=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/device-flow.js"),s=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/store.js"),a=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/http.js"),d=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/errors.js"),l=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/types.js");async function c(e={}){let t=(0,r.$i)(e);await (0,s.ni)(t.tokenPath,{credentialStore:t.credentialStore}),t.legacyTokenPath&&await (0,s.ni)(t.legacyTokenPath,{credentialStore:t.credentialStore})}async function u(e={}){let t,n=(0,r.$i)(e);try{t=await (0,s.AI)(n.tokenPath,{envTokenBaseUrl:n.baseUrl,credentialStore:n.credentialStore,legacyTokenPath:n.legacyTokenPath})}catch(e){if(e instanceof o.RI)return{loggedIn:!1,tokenPath:n.tokenPath,baseUrl:n.baseUrl,credentialError:{code:"CREDENTIAL_STORE_UNAVAILABLE",message:e.message}};throw e}if(!t)return{loggedIn:!1,tokenPath:n.tokenPath};let i=await p(e.fetch??fetch,n.baseUrl,t,n.requestHeaders);return i?{loggedIn:!0,uid:i.userId,name:i.name,avatar:i.avatar,expiresAt:t.expiresAt,tokenPath:n.tokenPath,baseUrl:n.baseUrl}:{loggedIn:!1,expiresAt:t.expiresAt,tokenPath:n.tokenPath,baseUrl:n.baseUrl}}async function p(e,t,n,r){let o=new Headers(r);o.set("Authorization",`${n.tokenType||"Bearer"} ${n.accessToken}`);let i=await e(`${t.replace(/\/+$/,"")}/app_developer/api/user/basic`,{method:"GET",headers:o});if(!i.ok)return;let s=await i.json();if(0===s.code){var a;return{userId:"string"==typeof(a=s.data?.user_id)&&a.length>0?a:"number"==typeof a&&Number.isFinite(a)?String(a):void 0,name:s.data?.name,avatar:s.data?.avatar}}}n.d(t,{AuthError:()=>d.lR,CredentialStoreError:()=>o.RI,DeviceAuthError:()=>d.JC,NotLoggedInError:()=>d.bG,TokenExpiredError:()=>d.BX,TokenStatus:()=>l.A,completeLogin:()=>i.R$,configureAuth:()=>r.ZI,login:()=>i.iD,logout:()=>c,startLogin:()=>i.c$,whoami:()=>u,withAuth:()=>a.r})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/jwt.js"(e,t,n){function r(e){let t=function(e){let t=e.split(".")[1];if(t)try{let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(e.length+(4-e.length%4)%4,"="),r=Buffer.from(n,"base64").toString("utf8"),o=JSON.parse(r);return o&&"object"==typeof o?o:void 0}catch{return}}(e),n=t?.uid??t?.sub;return"string"==typeof n&&n.length>0?n:"number"==typeof n&&Number.isFinite(n)?String(n):void 0}n.d(t,{m:()=>r})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/store.js"(e,t,n){var r=n("node:fs"),o=n("node:crypto"),i=n("node:path"),s=n("../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/credential-store.js");async function a(e,t={}){let n,r=process.env.DBX_ACCESS_TOKEN?.trim()||void 0;if(r)return{accessToken:r,tokenType:"Bearer",expiresAt:0xf4865700,baseUrl:t.envTokenBaseUrl??""};let o=await h(e);if(void 0===o)return f(e,t);try{n=JSON.parse(o)}catch(e){return}if(p(n)){if(!t.allowExpired&&c(n))return void await l(e,t);let r=await m(t).get(n.credentialAccount);if(!r)throw new s.RI("Stored login metadata exists, but the token credential is missing or inaccessible. Run dbx auth login again from a terminal that can access the credential store.");return{accessToken:r,tokenType:n.tokenType,expiresAt:n.expiresAt,baseUrl:n.baseUrl}}if(u(n))return!t.allowExpired&&c(n)?void await l(e,t):(await d(e,n,t),n)}async function d(e,t,n={}){let o={version:2,storage:"keychain",credentialAccount:g(e),tokenType:t.tokenType,expiresAt:t.expiresAt,baseUrl:t.baseUrl};await m(n).set(o.credentialAccount,t.accessToken),await r.promises.mkdir(i.dirname(e),{recursive:!0,mode:448}),"win32"!==process.platform&&await r.promises.chmod(i.dirname(e),448);let s=`${e}.${process.pid}.${Date.now()}.tmp`;await r.promises.writeFile(s,`${JSON.stringify(o,null,2)}
12
12
  `,{mode:384}),"win32"!==process.platform&&await r.promises.chmod(s,384),await r.promises.rename(s,e),"win32"!==process.platform&&await r.promises.chmod(e,384)}async function l(e,t={}){let n=await h(e);if(void 0!==n)try{let r=JSON.parse(n);p(r)?await m(t).delete(r.credentialAccount):await m(t).delete(g(e))}catch{}try{await r.promises.unlink(e)}catch(e){if(!_(e)||"ENOENT"!==e.code)throw e}}function c(e,t=Math.floor(Date.now()/1e3)){return e.expiresAt<=t}function u(e){return!!e&&"object"==typeof e&&"string"==typeof e.accessToken&&e.accessToken.length>0&&"string"==typeof e.tokenType&&e.tokenType.length>0&&"number"==typeof e.expiresAt&&Number.isFinite(e.expiresAt)&&"string"==typeof e.baseUrl&&e.baseUrl.length>0}function p(e){return!!e&&"object"==typeof e&&2===e.version&&"keychain"===e.storage&&"string"==typeof e.credentialAccount&&e.credentialAccount.length>0&&"string"==typeof e.tokenType&&e.tokenType.length>0&&"number"==typeof e.expiresAt&&Number.isFinite(e.expiresAt)&&"string"==typeof e.baseUrl&&e.baseUrl.length>0}async function h(e){try{return await r.promises.readFile(e,"utf8")}catch(e){_(e)&&e.code;return}}async function f(e,t){let n;if(!t.legacyTokenPath||i.resolve(t.legacyTokenPath)===i.resolve(e))return;let r=await h(t.legacyTokenPath);if(void 0!==r){try{n=JSON.parse(r)}catch{return}if(u(n))return!t.allowExpired&&c(n)?void await l(t.legacyTokenPath,t):(await d(e,n,t),await l(t.legacyTokenPath,t),n)}}function m(e){return e.credentialStore??(0,s.Mj)()}function g(e){let t=o.createHash("sha256").update(i.resolve(e)).digest("hex").slice(0,32);return`token:${t}`}function _(e){return e instanceof Error&&"code"in e}n.d(t,{AI:()=>a,_d:()=>c,ni:()=>l,tK:()=>d})},"../../../node_modules/.pnpm/@byted-doubao-apps+auth-cli@0.0.33/node_modules/@byted-doubao-apps/auth-cli/dist/types.js"(e,t,n){var r,o;(o=r||(r={}))[o.Pending=1]="Pending",o[o.Authorized=2]="Authorized",o[o.Expired=3]="Expired",o[o.Invalid=4]="Invalid",o[o.SlowDown=5]="SlowDown",n.d(t,{A:()=>r})}});var R={};e.r(R),e.d(R,{createDeferredDevShellSession:()=>nc,default:()=>na,isInteractiveTerminal:()=>np});let O=e("node:zlib"),$=e("../../../node_modules/.pnpm/@byted-doubao-tools+devtool-connection-core@0.1.0-beta.12_debug@4.4.3_react@19.2.7/node_modules/@byted-doubao-tools/devtool-connection-core/dist/lib/ipc/index.js"),N=4*Math.ceil(5614250.666666667),q=new Map;class M extends Error{code;cause;constructor(e,t,n){super(t),this.code=e,this.name="RuntimeInspectionError",n&&"cause"in n&&(this.cause=n.cause)}}async function B(e){let t,r=new d(e.namespace,{nodeId:`${e.nodeIdPrefix}-${process.pid}-${Math.random().toString(36).slice(2,8)}`,requestTimeout:12e3}),o=new Set,i=new Set,a=0,l=!0;r.createService({name:`runtimeInspection${process.pid}${Math.random().toString(36).slice(2,8)}`,events:{[$.DEVTOOL_CONNECTION_IPC_EVENTS.messageReceived](e){let n=e.params,r=function(e){if("Page.screencastFrame"===e.method&&c(e.params)&&"string"==typeof e.params.data&&e.params.data)return{data:e.params.data}}(n);for(let e of(r&&Number.isSafeInteger(n.clientId)&&Number.isSafeInteger(n.sessionId)&&(t={clientId:n.clientId,sessionId:n.sessionId,data:r.data}),o))e(n)},[s.runtimeInspectionTargetChanged](e){let t=function(e){if(c(e)&&"number"==typeof e.clientId&&"number"==typeof e.sessionId&&"string"==typeof e.url)return{clientId:e.clientId,sessionId:e.sessionId,url:e.url}}(e.params);if(t)for(let e of i)e(t)}}});try{await r.start()}catch(e){throw await r.stop().catch(()=>void 0),e}let u=(e,t)=>eh(()=>r.call(`${$.DEFAULT_DEVTOOL_CONNECTION_IPC_SERVICE_NAME}.${e}`,t),5e3);return{eventSubscriptionWarmupMs:e.eventSubscriptionWarmupMs??5e3,getConnectedClients:()=>u($.DEVTOOL_CONNECTION_IPC_ACTIONS.getConnectedClients),getLatestScreencastFrame(e){if(t?.clientId===e.clientId&&t.sessionId===e.sessionId)return{data:t.data}},async getRuntimeInspectionTarget(){if(!l)return null;try{return await r.call(n.getRuntimeInspectionTarget)}catch(e){if(ep(e))return l=!1,null;throw e}},subscribeRuntimeInspectionTarget:e=>(i.add(e),()=>{i.delete(e)}),async sendCdp(e,t,n={},r={}){let o={id:1e9+process.pid%1e5*1e3+a++,clientId:e.clientId,sessionId:e.sessionId,method:t,params:n,messageType:"CDP",timeoutMs:!1===r.expectResponse?100:1e4};try{let e=await u($.DEVTOOL_CONNECTION_IPC_ACTIONS.sendMessageToApp,o);var i,s,d=t,l=e;if(!l.success)throw Error([l.reason,l.apps?.length?`apps=${l.apps.join(",")}`:"",l.clients?.length?`clients=${l.clients.map(e=>`${e.clientId}:${e.info.App}`).join(",")}`:""].filter(Boolean).join("; "));if(c(l.data)&&c(l.data.error)){let e=void 0===l.data.error.code?"unknown":String(l.data.error.code),t=void 0===l.data.error.message?"unknown error":String(l.data.error.message);throw Error(`${d} failed: ${t} (code=${e})`)}return X(l.data)}catch(e){if(!1===r.expectResponse&&(i=e,s=t,(i instanceof Error?i.message:String(i)).includes(`send CDP message timeout, method: ${s}`)))return;throw Error(`${t} failed: ${e instanceof Error?e.message:String(e)}`)}},subscribeMessage:e=>(o.add(e),()=>{o.delete(e)}),async stop(){o.clear(),i.clear(),t=void 0,await r.stop()}}}async function U(e,t={}){let n=Date.now()+(t.timeoutMs??3e3);for(;;){em(t.signal);let r=await e.getConnectedClients(),o=function(e,t={}){let n,r=t.explicitTarget??(t.policy?.kind==="fixed"?t.policy.target:void 0);if(r){let n=e.find(e=>e.device.clientId===r.clientId);if(!n){if(t.activeClientId===r.clientId)throw new M("TARGET_CLIENT_DISCONNECTED",`debug client ${r.clientId} is disconnected`);throw new M("TARGET_STALE",`${F(r)} no longer points to a connected debug client`)}let o=n.sessions.find(e=>e.sessionId===r.sessionId&&W(e));if(!o)throw new M("TARGET_STALE",`${F(r)} no longer points to a live Lynx session`);return{clientId:n.device.clientId,sessionId:o.sessionId,url:o.url}}if(void 0!==t.activeClientId){if(!(n=e.find(e=>e.device.clientId===t.activeClientId)))throw new M("TARGET_CLIENT_DISCONNECTED",`authenticated debug client ${t.activeClientId} is disconnected`)}else if(e.length>1)throw new M("TARGET_AMBIGUOUS",`more than one debug device is connected: ${e.map(e=>`${e.device.clientId}:${e.device.info.App||"unknown"}`).join(", ")}`);else n=e[0];if(!n)return;let o=n.sessions.filter(W).sort((e,t)=>t.sessionId-e.sessionId)[0];if(o)return{clientId:n.device.clientId,sessionId:o.sessionId,url:o.url}}(r,t);if(o)return o;if(Date.now()>=n)throw 0===r.length?new M("DEVICE_NOT_CONNECTED","no debug device is connected"):new M("NO_ACTIVE_LYNX_SESSION","the connected device has no active Lynx session");await eg(100,t.signal)}}function F(e){return`@${e.clientId}:${e.sessionId}`}function V(e){let t=/^@([1-9]\d*):([1-9]\d*)$/.exec(e.trim());if(!t)throw new M("INVALID_TARGET_REF",`invalid target ref "${e}"; expected @<clientId>:<sessionId>`);let n={clientId:Number(t[1]),sessionId:Number(t[2])};if(!Number.isSafeInteger(n.clientId)||!Number.isSafeInteger(n.sessionId))throw new M("INVALID_TARGET_REF",`invalid target ref "${e}"; every id must be a safe integer`);return n}function H(e){return`@${e.clientId}:${e.sessionId}:${e.nodeId}`}async function K(e,t){let n=(await e.getConnectedClients()).find(e=>e.device.clientId===t.clientId),r=n?.sessions.find(e=>e.sessionId===t.sessionId&&W(e));if(!n||!r)throw new M("STALE_NODE_REF",`${H(t)} no longer points to a live Lynx session; run get-page-tree again`);return{clientId:t.clientId,sessionId:t.sessionId,url:r.url}}async function z(e,t,n={}){var r,o,i;let s,a,d,l,u,p=n.depth??-1,h=n.maxNodes??5e3;if(!Number.isInteger(p)||p<-1)throw Error("page tree depth must be -1 or a non-negative integer");if(!Number.isSafeInteger(h)||h<1)throw Error("page tree maxNodes must be a positive integer");await e.sendCdp(t,"DOM.enable",{useCompression:!1});try{u=await e.sendCdp(t,"DOM.getDocument",{depth:p})}catch{u=await e.sendCdp(t,"DOM.getDocument")}let f=function(e){let t=X(e);if(!c(t))throw ei("DOM.getDocument","response is not an object");let n=t.root;if(!0===t.compress&&"string"==typeof n)try{if(n.length>N)throw Error("compressed root exceeds the input limit");n=JSON.parse((0,O.inflateSync)(Buffer.from(n,"base64"),{maxOutputLength:0x1000000}).toString("utf8"))}catch(e){throw ei("DOM.getDocument","failed to decode compressed root",e)}else if("string"==typeof n)try{n=JSON.parse(n)}catch(e){throw ei("DOM.getDocument","root is not valid JSON",e)}if(!c(n))throw ei("DOM.getDocument","missing root node");return n}(u),m=await Q(e,t,f,p,h),g=(r=f,o=t,i=h,s=0,a=!1,d=[],{root:(l=e=>{var t;let n=ee(e.nodeId),r="string"==typeof e.nodeName&&e.nodeName?e.nodeName:"unknown";if(void 0===n)throw ei("DOM.getDocument",`node ${r} has no valid nodeId`);s++;let c=[],u={ref:H({clientId:o.clientId,sessionId:o.sessionId,nodeId:n}),nodeId:n,...void 0===ee(e.backendNodeId)?{}:{backendNodeId:ee(e.backendNodeId)},nodeType:"number"==typeof e.nodeType&&Number.isSafeInteger(e.nodeType)?e.nodeType:0,nodeName:r,..."string"==typeof e.localName?{localName:e.localName}:{},nodeValue:"string"==typeof e.nodeValue?e.nodeValue:"",attributes:function(e){if(!Array.isArray(e))return{};let t={};for(let n=0;n<e.length;n+=2){let r=e[n];if("string"!=typeof r||!r)continue;let o=e[n+1];t[r]="string"==typeof o?o:String(o??"")}return t}(e.attributes),childNodeCount:"number"==typeof e.childNodeCount&&Number.isSafeInteger(e.childNodeCount)?Math.max(0,e.childNodeCount):Z(e).length,children:c};for(let t of(et(u)&&u.nodeValue&&(u.text=u.nodeValue),Z(e))){if(s>=i){a=!0;break}c.push(l(t))}if("text"===((t=u).localName||t.nodeName).toLowerCase()){let e=function e(t){return t.children.flatMap(t=>et(t)?[t.nodeValue]:[e(t)]).join("")}(u);e?u.text=e:d.push(u)}return u})(r),nodeCount:s,truncated:a,textCandidates:d});return await en(e,t,g.textCandidates),{target:t,depth:p,nodeCount:g.nodeCount,truncated:m.truncated||g.truncated,root:g.root}}async function Y(e,t,n,r=[]){let o;await e.sendCdp(t,"DOM.enable",{useCompression:!1});try{o=await e.sendCdp(t,"CSS.getComputedStyleForNode",{nodeId:n.nodeId})}catch(e){var i;if(i=e,/(could not find|cannot find|no such|unknown|invalid|stale).{0,40}node|node.{0,40}(not found|does not exist|invalid|stale)/i.test(i instanceof Error?i.message:String(i)))throw new M("STALE_NODE_REF",`${H(n)} is stale; run get-page-tree again`,{cause:e});throw e}let s=X(o);if(!c(s)||!Array.isArray(s.computedStyle))throw ei("CSS.getComputedStyleForNode","missing computedStyle array");let a=s.computedStyle.filter(c).flatMap(e=>"string"==typeof e.name&&"string"==typeof e.value?[{name:e.name,value:e.value}]:[]),d=0===r.length?a:r.flatMap(e=>{let t=a.find(t=>t.name===e);return t?[t]:[]});return{target:t,nodeRef:H(n),nodeId:n.nodeId,properties:d}}function W(e){return"lynx"===e.type&&Number.isSafeInteger(e.sessionId)&&e.sessionId>0&&!J(e.url)}function G(e){return`${e.clientId}:${e.sessionId}`}function J(e){return/(?:-main\.js|\.main\.lynx\.js)(?:[?#].*)?$/.test(e)}async function Q(e,t,n,r,o){let i=0,s=!1,a=async(n,d)=>{if(i>=o){s=!0;return}if(i++,r>=0&&d>=r)return;let l=Z(n);if(("number"==typeof n.childNodeCount&&Number.isSafeInteger(n.childNodeCount)?Math.max(0,n.childNodeCount):l.length)>l.length&&"number"==typeof n.nodeId&&Number.isSafeInteger(n.nodeId)){let r=X(await e.sendCdp(t,"DOM.requestChildNodes",{nodeId:n.nodeId}));if(!c(r)||!Array.isArray(r.nodes))throw ei("DOM.requestChildNodes",`missing nodes array for node ${n.nodeId}`);n.children=l=r.nodes.filter(c)}for(let e of l)if(await a(e,d+1),i>=o){l.indexOf(e)<l.length-1&&(s=!0);break}};return await a(n,0),{truncated:s}}function X(e){return c(e)&&"id"in e&&"result"in e?e.result:e}function Z(e){return Array.isArray(e.children)?e.children.filter(c):[]}function ee(e){return"number"==typeof e&&Number.isSafeInteger(e)&&e>0?e:void 0}function et(e){return 3===e.nodeType||"#text"===e.nodeName.toLowerCase()}async function en(e,t,n){let r=n[0];if(!r)return;let o=await er(e,t,r);if(o.supported){o.text&&(r.text=o.text);for(let r=1;r<n.length;r+=8){let o=n.slice(r,r+8);await Promise.all(o.map(async n=>{let r=await er(e,t,n);r.text&&(n.text=r.text)}))}}}async function er(e,t,n){try{let r=X(await e.sendCdp(t,"DOM.innerText",{nodeId:n.nodeId}));if(!c(r)||!Array.isArray(r.rawTextValues))return{supported:!1};let o=r.rawTextValues.filter(c).flatMap(e=>"string"==typeof e.text?[e.text]:[]).join("");return{supported:!0,...o?{text:o}:{}}}catch{return{supported:!1}}}function eo(e,t=120){let n=e.replace(/\s+/g," ").trim();return JSON.stringify(n.length>t?`${n.slice(0,Math.max(0,t-1))}…`:n)}function ei(e,t,n){return new M("INVALID_CDP_RESPONSE",`${e} returned an invalid response: ${t}`,void 0===n?void 0:{cause:n})}async function es(e,t,n){let r,o,i,s=0,a=!1,d=G(t),l=new Promise((e,t)=>{o=e,i=t}),u=e=>{a||(a=!0,o({count:s,reason:e}))},p=()=>u("aborted"),h=e.getRuntimeInspectionTarget?.bind(e),f=e=>{if(a||!(Number.isSafeInteger(e.clientId)&&e.clientId>0&&Number.isSafeInteger(e.sessionId)&&e.sessionId>0&&!J(e.url)))return;let r=G(e);if(r!==d&&(d=r,r!==G(t)))try{n.onTargetChange?.(e)}catch{}},m=e.subscribeMessage(e=>{if(a||!ed(e,t))return;let r=function(e){var t;if("Runtime.consoleAPICalled"!==e.method||!c(e.params))return;let n={...t=e.params,...Array.isArray(t.args)?{args:t.args.map(e=>c(e)?{...e}:e)}:{},...c(t.stackTrace)?{stackTrace:{...t.stackTrace,...Array.isArray(t.stackTrace.callFrames)?{callFrames:t.stackTrace.callFrames.map(e=>c(e)?{...e}:e)}:{}}}:{}},r="string"==typeof n.consoleTag?n.consoleTag:void 0;return{type:"string"==typeof n.type?n.type:"log",thread:"Lepus"===r?"main":"background",args:Array.isArray(n.args)?n.args:[],...r?{consoleTag:r}:{},..."number"==typeof n.timestamp?{timestamp:n.timestamp}:{},..."stackTrace"in n?{stackTrace:n.stackTrace}:{},params:n}}(e);if(r){try{n.onMessage(r)}catch(e){a||(a=!0,i(e));return}s++,void 0!==n.limit&&s>=n.limit&&u("limit")}}),g=n.onTargetChange?e.subscribeRuntimeInspectionTarget?.(f):void 0;n.signal?.addEventListener("abort",p,{once:!0}),n.onTargetChange&&h&&h().then(e=>{e&&f(e)}).catch(()=>void 0);try{if(n.signal?.aborted)return u("aborted"),await l;if(await el(e,t,n.subscriptionWarmupMs??e.eventSubscriptionWarmupMs??5e3,n.signal),a)return await l;for(let o of(void 0!==n.timeoutMs&&(r=setTimeout(()=>u("timeout"),n.timeoutMs)),[{method:"Page.getResourceTree",params:{}},{method:"Debugger.enable",params:{}},{method:"Runtime.enable",params:{}}])){if(a)break;await e.sendCdp(t,o.method,o.params,{expectResponse:!1})}return await l}catch(e){if(n.signal?.aborted)return u("aborted"),await l;throw e}finally{r&&clearTimeout(r),n.signal?.removeEventListener("abort",p),g?.(),m()}}async function ea(e,t,n={}){return ef(t,async()=>{let r,o=new Promise(e=>{r=e}),i=e.subscribeMessage(e=>{ed(e,t)&&"Page.screencastFrame"===e.method&&c(e.params)&&"string"==typeof e.params.data&&e.params.data&&r({data:e.params.data})}),s=!1;try{var a,d,l;await el(e,t,e.eventSubscriptionWarmupMs??5e3);let r=n.activeCapture?void 0:e.getLatestScreencastFrame?.(t);!r&&n.activeCapture&&(await e.sendCdp(t,"Page.enable"),s=!0,await e.sendCdp(t,"Page.startScreencast",{format:"jpeg",quality:80},{expectResponse:!1})),r??=await (a=o,d=t,l=n.timeoutMs??1e4,new Promise((e,t)=>{let n=setTimeout(()=>t(new M("SCREENSHOT_TIMEOUT",`no Page.screencastFrame received for ${F(d)} within ${l}ms; make sure the target session is active and can produce screenshot frames`)),l);a.then(t=>{clearTimeout(n),e(t)},e=>{clearTimeout(n),t(e)})})),s&&await e.sendCdp(t,"Page.screencastFrameAck",{},{expectResponse:!1}).catch(()=>void 0);let i=function(e){let t=e.replace(/\s+/g,"");if(!t||t.length%4!=0||!/^[A-Za-z0-9+/]+={0,2}$/.test(t))throw new M("INVALID_SCREENSHOT_DATA","Page.screencastFrame returned invalid base64 data");let n=Buffer.from(t,"base64");if(n.length<4||255!==n[0]||216!==n[1]||255!==n[n.length-2]||217!==n[n.length-1])throw new M("INVALID_SCREENSHOT_DATA","Page.screencastFrame did not return a complete JPEG image");let r=function(e){let t=new Set([192,193,194,195,197,198,199,201,202,203,205,206,207]),n=2;for(;n+3<e.length;){if(255!==e[n]){n++;continue}for(;n<e.length&&255===e[n];)n++;let r=e[n++];if(void 0===r||217===r||218===r)break;if(1===r||r>=208&&r<=215)continue;if(n+1>=e.length)break;let o=e.readUInt16BE(n);if(o<2||n+o>e.length)break;if(t.has(r)){if(o<7)break;let t=e.readUInt16BE(n+3),r=e.readUInt16BE(n+5);if(r>0&&t>0)return{width:r,height:t};break}n+=o}}(n);if(!r)throw new M("INVALID_SCREENSHOT_DATA","Page.screencastFrame JPEG has no readable dimensions");return{buffer:n,data:t,...r}}(r.data);return{data:i.data,format:"jpeg",source:"Page.screencastFrame",width:i.width,height:i.height,byteLength:i.buffer.length}}finally{s&&await e.sendCdp(t,"Page.stopScreencast",{},{expectResponse:!1}).catch(()=>void 0),i()}})}function ed(e,t){return"CDP"===e.messageType&&e.clientId===t.clientId&&e.sessionId===t.sessionId}async function el(e,t,n,r){let o;if(n<=0)return;let i=Date.now()+n,s=new Promise(e=>{o=e}),a=e.subscribeMessage(e=>{ed(e,t)&&o()});try{for(;Date.now()<i;){if(em(r),await e.sendCdp(t,"Page.getResourceTree",{},{expectResponse:!1}).catch(()=>void 0),await function(e,t,n){return new Promise((r,o)=>{let i=new AbortController,s=setTimeout(()=>{i.abort(),r(!1)},t);n?.addEventListener("abort",()=>{clearTimeout(s),i.abort(),o(n?.reason instanceof Error?n.reason:Error("operation aborted"))},{once:!0,signal:i.signal}),e.then(()=>{clearTimeout(s),i.abort(),r(!0)},e=>{clearTimeout(s),i.abort(),o(e)})})}(s,Math.min(250,Math.max(0,i-Date.now())),r))return;await eg(Math.min(50,Math.max(0,i-Date.now())),r)}}finally{a()}}function ec(e){return c(e)?e.objectId?`<${String(e.description||e.className||"Object")} (objectId:${String(e.objectId)})>`:"value"in e?eu(e.value):"string"==typeof e.description?e.description:eu(e):eu(e)}function eu(e){if("string"==typeof e)return e;if(void 0===e)return"undefined";try{let t=JSON.stringify(e);return void 0===t?String(e):t}catch{return String(e)}}function ep(e){return/is not (found|available)/i.test(e instanceof Error?e.message:String(e))}async function eh(e,t){let n=Date.now()+t;for(;;)try{return await e()}catch(e){if(!ep(e)||Date.now()>=n)throw e;await eg(50)}}async function ef(e,t){let n,r=G(e),o=q.get(r)??Promise.resolve(),i=new Promise(e=>{n=e});q.set(r,i),await o.catch(()=>void 0);try{return await t()}finally{n(),q.get(r)===i&&q.delete(r)}}function em(e){if(e?.aborted)throw e.reason instanceof Error?e.reason:Error("operation aborted")}function eg(e,t){return new Promise((n,r)=>{if(t?.aborted)return void r(t.reason instanceof Error?t.reason:Error("operation aborted"));let o=new AbortController,i=setTimeout(()=>{o.abort(),n()},e);t?.addEventListener("abort",()=>{clearTimeout(i),o.abort(),r(t?.reason instanceof Error?t.reason:Error("operation aborted"))},{once:!0,signal:o.signal})})}let e_={schemaVersion:1,cliVersion:h,deviceAppVersion:"1.0.10",packages:{"darwin-arm64":{url:"https://lf3-cdn-tos.bytegoofy.com/obj/tron-demo/7610358476778248474/484109562/1.0.10/darwin-arm64/DoubaoDeveloperTools-v1.0.10-darwin-arm64.zip",sha256:"753dde524302653f7b486382dcd8b76e8aa6eba3290a5cc41d7267c6456a9b79",entry:"豆包开发者工具.app",sizeBytes:0x77ffb5d},"win32-x64":{url:"https://lf3-cdn-tos.bytegoofy.com/obj/tron-demo/7610358476778248474/484109562/1.0.10/win32-x64/DoubaoDeveloperTools-v1.0.10-win32-x64.zip",sha256:"b89faff4d8546a3f15b20fdb653ea5b8c4b3b9bba720b28cb8192d3abc1ec755",entry:"豆包开发者工具.exe",sizeBytes:0x84c6466}}},ew=e("node:child_process"),ey=e("node:crypto");var eb=e.n(ey);let ev=e("node:fs");var eE=e.n(ev);let eI=e("node:http"),eA=e("node:os");var eT=e.n(eA);let eC=e("node:path");var eS=e.n(eC);let ek=e("node:stream"),ej=e("node:url"),eD=e("node:util"),eP=e("../../../node_modules/.pnpm/@byted-doubao-tools+real-device-debug-auth@0.1.3/node_modules/@byted-doubao-tools/real-device-debug-auth/dist/lib/index.js"),ex=e("../../../node_modules/.pnpm/qrcode@1.5.4/node_modules/qrcode/lib/index.js"),eL="DBX_DEVICE_APP_PATH",eR="dbx-device-app.json",eO="state.json",e$="versions",eN=eS().dirname((0,ej.fileURLToPath)(import.meta.url)),eq=[{command:"web",description:"打开 Web 模拟器"},{command:"desktop",description:"进入桌面端工具,可进行真机调试"},{command:"status",description:"查看本地调试服务状态"}],eM=[{command:"qr",description:"重新生成真机调试二维码"},{command:"page [url]",description:"在真机打开页面(省略 url 可选择)"},{command:"pages",description:"列出真机可打开页面"},{command:"widget [id]",description:"向真机推送卡片(省略 id 可选择)"},{command:"widgets",description:"列出真机可推送卡片"},{command:"sessions",description:"列出当前可检查的 Lynx sessions"},{command:"use-session <@client:session|latest>",description:"固定 CLI session 或恢复跟随最新"},{command:"get-console",description:"持续输出当前 Lynx 页面新产生的日志"},{command:"take-screenshot",description:"截取当前 Lynx 页面画面"},{command:"get-page-tree",description:"获取当前 Lynx 页面的 DOM 树"},{command:"get-computed-style [node-ref]",description:"获取 DOM 节点的 computed style"},{command:"back",description:"返回主命令"}];function eB(e){if("complete"===e.phase)return`豆包开发者工具已安装:${e.appPath}`;if("install"===e.phase){let t={verify:"验证",extract:"解压",install:"安装"}[e.stage];return`安装豆包开发者工具:${t}`}let t=[void 0===e.percentage?void 0:`${e.percentage}%`,void 0===e.totalBytes?e.downloadedBytes>0?ts(e.downloadedBytes):void 0:`${ts(e.downloadedBytes)} / ${ts(e.totalBytes)}`,`${Math.max(0,Math.round(e.elapsedMs/1e3))}s`].filter(e=>!!e);return`下载豆包开发者工具:${t.join(" \xb7 ")}`}function eU(e,t){let n,r=!1;return o=>{if(!o)return void t?.(void 0);if("download"===o.phase){n=o,t?.(o);return}if(n&&!r&&(r=!0,ne(e,`✓ ${eB(n)}`)),"complete"===o.phase){t?.(void 0),ne(e,`✓ ${eB(o)}`);return}t?.(o)}}function eF(e,t){if("true"===e)return!0;if("false"===e)return!1;throw Error(`${t} must be "true" or "false"`)}async function eV(e){let t,n,r,o,i=e.output??process.stderr,s=e.client??await a({projectPath:e.projectPath,appDir:e.appDir,nodeIdPrefix:"dev-shell"}),d=e.closeDeviceApp??e3,l=new AbortController,c=e.openBrowser??I,u=new Set,p={runtime:e.runtime,client:s,output:i,manageDeviceApp:!0,runtimeInspectionTargetPolicy:{kind:"latest"},openBrowser:c,openQRCodeViewer:e.openQRCodeViewer??((e,t,n)=>t3(e,c,t,i,n)),signal:l.signal,launchDeviceApp:e.launchDeviceApp??(e=>e2(e,i)),closeDeviceApp:d,prepareDeviceApp:e.prepareDeviceApp??(e=>e4(i,e)),...e.onDeviceAppSetupProgress?{onDeviceAppSetupProgress:e.onDeviceAppSetupProgress}:{},openPreparedDeviceApp:e.openPreparedDeviceApp??e5,runRealDeviceAuth:e.runRealDeviceAuth??tH,...e.realDeviceDebugCoordinator?{realDeviceDebugCoordinator:e.realDeviceDebugCoordinator}:{},...e.createRuntimeInspectionSession?{createRuntimeInspectionSession:e.createRuntimeInspectionSession}:{},listAppVersions:e.listAppVersions??(async e=>{let t=await E(e);return t.data?.version_list??[]}),selectItem:e.selectItem,eventTracking:e.eventTracking},h=(e.createRuntimeInspectionSession??B)({namespace:e.runtime.getState().namespace,nodeIdPrefix:"dev-shell-runtime-inspection"});h.catch(()=>void 0),p.runtimeInspectionSession=h;let f=async()=>r||(r=(async()=>{p.activeDeviceId=void 0,t5(),p.manageDeviceApp&&await eY(p)})().finally(()=>{r=void 0})),m=tX(e.runtime.getState().namespace,async()=>{if(p.activeDeviceId&&!o){ne(i,"检测到真机连接断开,正在返回主命令并清理真机调试资源..."),await f();for(let e of u)try{e("client-disconnected")}catch{}}});return await m.start(),{stopped:e.runtime.stopped,getState:()=>e.runtime.getState(),execute(e){let r=new AbortController,o=AbortSignal.any([l.signal,r.signal]);n=r,p.signal=o;let i=eH(e,p);return t=i,i.finally(()=>{t===i&&(t=void 0),n===r&&(n=void 0),p.signal===o&&(p.signal=l.signal)})},cancelActiveCommand(){if(!n||n.signal.aborted)return!1;let e=Error("command cancelled");return e.name="AbortError",n.abort(e),!0},returnToRoot:()=>eK(p,"back","execute",f),handleClientDisconnected:()=>f(),subscribe:e=>(u.add(e),()=>{u.delete(e)}),close:()=>o??=(async()=>{l.abort(new tQ),await t?.catch(()=>void 0),await m.stop().catch(()=>void 0),await f(),await p.runtimeInspectionSession?.then(e=>e.stop()).catch(()=>void 0),await s.stop().catch(()=>void 0),await e.runtime.stop().catch(()=>void 0)})()}}async function eH(e,t){var n;let r;try{r=function(e){let t,n=[],r="",o=!1,i=()=>{r.length>0&&(n.push(r),r="")};for(let n of e.trim()){if(o){r+=n,o=!1;continue}if("\\"===n&&"'"!==t){o=!0;continue}if("'"===n||'"'===n){if(!t){t=n;continue}if(t===n){t=void 0;continue}}if(!t&&/\s/.test(n)){i();continue}r+=n}if(o&&(r+="\\"),t)throw Error(`unterminated ${t} quote`);return i(),n}(e)}catch(e){return ne(t.output,tG(nn(e))),"continue"}let o=r[0]?.toLowerCase(),i=r.slice(1);if(!o)return"continue";if((n=i).includes("--help")||n.includes("-h")){let e="desktop"===o&&i[0]&&!i[0].startsWith("-")?`desktop ${i[0].toLowerCase()}`:o;if(function(e,t){switch(t){case"desktop widget":return ne(e,"usage: widget [widget-id] [--data <json>] [--bot-id <id>] [--device-id <id>]"),ne(e,"推送卡片到已连接真机;省略 widget-id 时从 `widgets` 列表中选择。"),!0;case"desktop page":return ne(e,"usage: page [url] [--device-id <id>]"),ne(e,"通过完整 URL 打开页面;省略 url 时从 `pages` 列表中选择。页面参数请写入 URL query。"),!0;case"desktop":ne(e,"usage: desktop [--agent] [--mcp] [--timeout <seconds>] [--qr-file <file.png>] [--wifi-connect <true|false>] [--defaultDebugTagState <true|false>]"),ne(e,"进入真机模式并连接调试设备,默认准备并打开豆包开发者工具。"),ne(e,"使用 `desktop --agent` 进入 Agent 模式,不准备、启动或关闭豆包开发者工具。"),ne(e,"使用 --mcp 进入 MCP 端到端调试,并从当前 AppID 的版本列表中选择 versionTag。");for(let t of(ne(e,"真机调试命令"),eM))ne(e,` ${t.command.padEnd(22)}${t.description}`);return ne(e,"进入真机模式后执行 `<命令> --help` 查看参数。"),ne(e,"get-page-tree、get-computed-style、take-screenshot 支持通用的 --json 输出。"),!0;case"desktop qr":return ne(e,"usage: qr [--mcp] [--timeout <seconds>] [--qr-file <file.png>] [--wifi-connect <true|false>] [--defaultDebugTagState <true|false>]"),ne(e,"重新生成真机调试二维码;MCP 端到端调试会沿用已选择的 versionTag,也可用 --mcp 重新选择。"),!0;case"desktop get-console":return ne(e,"usage: get-console [--target <@client:session>] [--limit <count>] [--timeout-seconds <seconds>] [--include-stack-traces]"),ne(e,"持续输出当前 Lynx session 新产生的 console 日志;按 Ctrl+C 停止监听并返回真机命令。"),ne(e,"默认仅 error 日志显示调用栈;使用 --include-stack-traces 展开所有日志的调用栈。"),!0;case"desktop sessions":return ne(e,"usage: sessions"),ne(e,"列出当前可检查的 Lynx sessions,并标记 latest、CLI fixed 和 Electron current。"),!0;case"desktop use-session":return ne(e,"usage: use-session <@client:session|latest>"),ne(e,"固定 CLI 后续检查命令使用的 session,或用 latest 恢复到鉴权 client 内最新活跃 session;不会切换 Electron。"),!0;case"desktop take-screenshot":return ne(e,"usage: take-screenshot [--target <@client:session>] [-o, --output <file.jpeg>] [--json]"),ne(e,"保存 Electron 当前为目标 session 输出的最近一帧 JPEG;截图范围跟随 Electron 当前 mode。"),!0;case"desktop get-page-tree":return ne(e,"usage: get-page-tree [--target <@client:session>] [--depth <-1|n>] [--json]"),ne(e,"获取当前 Lynx session 的 DevTools Elements DOM 树;默认 depth=-1。"),ne(e,"终端输出紧凑树;--json 输出节点文本、完整 attributes 和可复用 node-ref。"),!0;case"desktop get-computed-style":return ne(e,"usage: get-computed-style <node-ref> [--properties <name,...>] [--json]"),ne(e,"获取元素节点的 computed style;node-ref 格式为 @<clientId>:<sessionId>:<nodeId>。"),ne(e,"省略 --properties 返回全部属性,例如 --properties color,font-size。"),!0;case"web":return ne(e,"usage: web"),ne(e,"在默认浏览器打开本地 Web 模拟器。"),!0;case"desktop pages":case"desktop widgets":{let n="desktop pages"===t?"打开的页面":"推送的卡片";return ne(e,`usage: ${t.slice(8)}`),ne(e,`列出真机可${n}。`),!0}case"status":return ne(e,"usage: status"),ne(e,"查看本地调试服务状态。"),!0;default:return!1}}(t.output,e))return"continue"}try{switch(o){case"status":return await eK(t,"status","execute",()=>eW(t)),"continue";case"web":return await eK(t,"web_open","execute",()=>eG(t)),"continue";case"desktop":return await ez(t,i)?"enter-device":"continue";case"device":return ne(t.output,"命令 `device` 已更名为 `desktop`,请改用 `desktop`。"),"continue";default:return ne(t.output,`unknown command: ${o}`),["qr","pages","page","widgets","widget","sessions","use-session","get-console","take-screenshot","get-page-tree","get-computed-style"].includes(o)&&ne(t.output,`\`${o}\` is only available in desktop mode; run \`desktop\` first.`),"continue"}}catch(e){return ne(t.output,tG(nn(e))),"continue"}}async function eK(e,t,n,r){let o=e.eventTracking;return o?f({action:t,actionSequence:++o.actionSequence,appId:o.appId??e.runtime.getState().appId,devSessionId:o.devSessionId,errorStage:n},r):r()}async function ez(e,t){let r=t[0]?.toLowerCase();if(!r||r.startsWith("-"))return await eJ(e,t,{reuseDeviceAppMode:!1,reuseVersionTag:!1}),!0;let o=function(e){let t=!1,n=[];for(let r of e)"--json"===r?t=!0:n.push(r);return{args:n,json:t}}(t.slice(1)),i=["get-page-tree","get-computed-style","take-screenshot"].includes(r);try{if(o.json&&!i)throw Error(`--json is not supported by desktop ${r}; use it with get-page-tree, get-computed-style, or take-screenshot`);switch(r){case"qr":return await e0(e,o.args),!0;case"pages":return await eK(e,"pages_list","execute",()=>tk(e,"page",n.discoverPages)),!0;case"page":return await eK(e,"page_push","page_push",()=>tM(e,o.args)),!0;case"widgets":return await eK(e,"widgets_list","execute",()=>tk(e,"widget",n.discoverWidgets)),!0;case"widget":return await eK(e,"widget_push","widget_push",()=>tB(e,o.args)),!0;case"sessions":return await eK(e,"sessions_list","execute",()=>tj(e,o.args)),!0;case"use-session":return await eK(e,"session_select","execute",()=>tD(e,o.args)),!0;case"get-console":return await eK(e,"console_stream","execute",()=>tP(e,o.args)),!0;case"take-screenshot":return await eK(e,"screenshot","execute",()=>tx(e,o.args,o.json)),!0;case"get-page-tree":return await eK(e,"page_tree","execute",()=>tL(e,o.args,o.json)),!0;case"get-computed-style":return await eK(e,"computed_style","execute",()=>tR(e,o.args,o.json)),!0;default:return ne(e.output,`unknown desktop subcommand: ${r}`),!1}}catch(t){if(!o.json||!i)throw t;return nt(e.output,{ok:!1,error:{code:t instanceof M?t.code:"INSPECTION_FAILED",message:nn(t)}}),!0}}async function eY(e){try{var t,n;let r=await e.closeDeviceApp();t=e.output,n=r,"closed"===n.status?ne(t,`豆包开发者工具已关闭:${n.appPath}`):ne(t,`关闭豆包开发者工具失败${n.reason?`:${tG(n.reason)}`:""}`)}catch(t){ne(e.output,`关闭豆包开发者工具失败:${tG(nn(t))}`)}}async function eW(e){let t=await e.client.call(n.getInfo);ne(e.output,`status: ${t.status}`),ne(e.output,`app_id: ${t.appId??"-"}`),ne(e.output,`dev_server: ${t.host??"-"}`),ne(e.output,`web_debugger: ${t.webDebuggerUrl??"-"}`)}async function eG(e){let t=await e.client.call(n.openWebDebugger);ne(e.output,`Web 模拟器已打开:${t}`)}async function eJ(e,t,n){let r=()=>e.realDeviceDebugCoordinator?e.realDeviceDebugCoordinator.runTerminal(()=>eQ(e,t,n)):eQ(e,t,n),o=e.eventTracking;if(!o)return void await r();let i=++o.actionSequence,s=performance.now(),a=n.reuseDeviceAppMode?"qr_refresh":"device_connect";try{let t=await r(),n=t?.status==="connected"?"success":t?.status==="cancelled"?"cancelled":t?.status==="timeout"?"timeout":t?.error?"failed":"skipped";await g({action:a,actionSequence:i,appId:o.appId??e.runtime.getState().appId,devSessionId:o.devSessionId,durationMs:performance.now()-s,...t?.error?{error:t.error,...t.failureStage?{errorStage:t.failureStage}:{},errorType:"device_connection_error"}:{},status:n})}catch(t){throw await g({action:a,actionSequence:i,appId:o.appId??e.runtime.getState().appId,devSessionId:o.devSessionId,durationMs:performance.now()-s,error:t,errorStage:"prepare_device_tool",errorType:"device_connection_error",status:b(t)}),t}}async function eQ(e,t,n){var r,o,i;let s,a,d,l=(0,eD.parseArgs)({args:t,allowPositionals:!1,options:{agent:{type:"boolean"},timeout:{type:"string"},"qr-file":{type:"string"},mcp:{type:"boolean"},"wifi-connect":{type:"string"},defaultDebugTagState:{type:"string"}}});if(n.reuseDeviceAppMode&&l.values.agent)throw Error("--agent is only supported when entering desktop mode");n.reuseDeviceAppMode||(e.manageDeviceApp=!l.values.agent);let c=function(e){if(void 0===e)return;let t=Number(e);if(!Number.isFinite(t)||t<=0)throw Error("--timeout must be a positive number of seconds");return Math.round(1e3*t)}(l.values.timeout),u=function(e){if(!e)return;let t=eS().resolve(e);if(".png"!==eS().extname(t).toLowerCase())throw Error("--qr-file must point to a .png file");return t}(l.values["qr-file"]),p=tz((r={defaultDebugTagState:l.values.defaultDebugTagState,wifiConnect:l.values["wifi-connect"]},d={},void 0!==r.defaultDebugTagState&&(d.defaultDebugTagState=eF(r.defaultDebugTagState,"--defaultDebugTagState")),void 0!==r.wifiConnect&&(d.usb=!eF(r.wifiConnect,"--wifi-connect")),Object.keys(d).length>0?d:void 0)),h=await e.client.call("dev.setConnectionTransport",{type:p.usb?"usb":"wifi"}),f=e.runtime.getState(),m=l.values.mcp?await eX(e,f.appId):n.reuseVersionTag?e.activeVersionTag:void 0;if(l.values.mcp&&!m)return;e.activeVersionTag=m,m&&!l.values.mcp&&ne(e.output,`沿用 MCP 端到端调试 versionTag:${m}`),e.manageDeviceApp||ne(e.output,"已启用 --agent:不会准备、启动或关闭豆包开发者工具。");let g={namespace:f.namespace,projectPath:f.projectPath,appDir:f.appDir,appKey:f.appId,hostUrl:f.host},_=e.manageDeviceApp?await eZ(e):void 0;if(_?.status==="skipped"){let t=_.reason??"豆包开发者工具准备失败";return ne(e.output,`启动真机调试失败:${tG(t)}`),{ok:!1,status:"skipped",timeoutMs:c??6e4,failureStage:"prepare_device_tool",error:t}}t5();let w=new AbortController,y=e.signal?AbortSignal.any([e.signal,w.signal]):w.signal;try{a=await e.runRealDeviceAuth({hostUrl:h.host||f.host,appKey:h.appId||f.appId,versionTag:m,namespace:f.namespace,timeoutMs:c,settings:p,wifiConnectUrl:h.wifiConnectUrl,output:e.output,signal:y,onQRCodeReady:async(t,n)=>{(s=await e.openQRCodeViewer(t,u,n)).closed.then(()=>{w.abort(new tQ)})}})}finally{await s?.close().catch(()=>void 0),t5()}if(function(e,t){let n;if(t.ok){let n=t.client?.clientId===void 0?"":`:client ${t.client.clientId}`,r=t.qrCodeValue?"扫码鉴权完成":"复用已连接设备,已跳过二维码鉴权";ne(e,`真机调试已连接${n}(${r})。`);return}"cancelled"===t.status?ne(e,"install"===t.waitingFor?"二维码页面已关闭,已取消等待设备安装。":"二维码页面已关闭,已取消等待设备连接。"):(n="timeout"===t.status?"install"===t.waitingFor?`设备已连接,但等待安装完成超时(${Math.max(1,Math.ceil(t.timeoutMs/1e3))} 秒)`:`等待设备连接超时(${Math.max(1,Math.ceil(t.timeoutMs/1e3))} 秒)`:tG(t.error??"未知错误"),ne(e,`启动真机调试失败:${n}`))}(e.output,a),a.ok&&"connected"===a.status){a.client?.clientId!==void 0&&(void 0!==e.activeClientId&&e.activeClientId!==a.client.clientId&&(e.runtimeInspectionTargetPolicy={kind:"latest"}),e.activeClientId=a.client.clientId);let t=a.client?.deviceId??(a.client?.clientId===void 0?void 0:String(a.client.clientId));t&&(e.activeDeviceId=t)}if(e.manageDeviceApp&&a.ok&&"connected"===a.status){let t=_?await e1(e,_,g):await e.launchDeviceApp(g);o=e.output,"opened"===(i=t).status?ne(o,`豆包开发者工具已启动:${i.appPath}`):ne(o,`启动豆包开发者工具失败${i.reason?`:${tG(i.reason)}`:""}`)}return a}async function eX(e,t){if(!t)throw Error("无法查询 versionTag,当前工程缺少 AppID。");let n=(await e.listAppVersions(t)).filter(e=>"string"==typeof e.version_tag&&!!e.version_tag.trim());if(!n.length)throw Error(`当前 AppID(${t})没有可选的 versionTag。`);let r=await e.selectItem("versionTag",n,e.output);return r?(ne(e.output,`MCP 端到端调试 versionTag:${r}`),r):void ne(e.output,"已取消 versionTag 选择,未生成二维码。")}async function eZ(e){if(e.prepareDeviceApp){e.onDeviceAppSetupProgress?.(void 0);try{return await e.prepareDeviceApp({onProgress:eU(e.output,e.onDeviceAppSetupProgress),signal:e.signal})}catch(t){return e.onDeviceAppSetupProgress?.(void 0),{status:"skipped",reason:nn(t)}}}}async function e0(e,t){await eJ(e,t,{reuseDeviceAppMode:!0,reuseVersionTag:!0})}async function e1(e,t,n){return"skipped"!==t.status&&t.appPath?e.openPreparedDeviceApp?e.openPreparedDeviceApp(t.appPath,n):e.launchDeviceApp(n):{status:"skipped",reason:t.reason}}async function e2(e,t=process.stderr){let n=await e4(t);return"skipped"!==n.status&&n.appPath?e5(n.appPath,e):{status:"skipped",reason:n.reason}}async function e4(e=process.stderr,t={}){let n=function(e={}){let t=e.env??process.env,n=e.platform??process.platform,r=e.arch??process.arch,o=e.appDir??te(),i=e.manifest??e_,s=tn(t);if(t[eL]?.trim()||!s&&e7({...t,[eL]:""},n,o))return;tf(i);let a=tt(n,r);if(!a)return;let d=i.packages[a];if(!d)return;tm(d);let l=tg(i,d),c=e9(t,n);if(!(!s&&tr(c,i,a,d,l)))return{platform:a,version:l,...void 0===d.sizeBytes?{}:{sizeBytes:d.sizeBytes}}}();return n&&!t.onProgress&&(ne(e,"真机调试准备:"),ne(e,`首次或版本更新需要下载豆包开发者工具${n.sizeBytes?`(${ts(n.sizeBytes)})`:""}。`),ne(e,"下载完成后才会生成二维码;下载耗时取决于网络,进度和实际耗时将持续显示。")),await e6({runner:{onProgress:t.onProgress??eU(e),signal:t.signal}})}async function e5(e,t){return await function(e,t,n=process.platform){var r,o,i;let s,a=(r=e,o=n,s=(i=t)?[["namespace",i.namespace],["project",i.appDir??i.projectPath],["app-key",i.appKey],["host-url",i.hostUrl]].flatMap(([e,t])=>t?[`--${e}=${t}`]:[]):[],"darwin"===o?{command:"open",args:[r,...s.length?["--args",...s]:[]]}:"win32"===o?{command:"cmd",args:["/c","start","",r,...s],windowsVerbatimArguments:!0}:{command:r,args:s});return new Promise((e,t)=>{let n=(0,ew.spawn)(a.command,a.args,{stdio:"ignore",windowsVerbatimArguments:a.windowsVerbatimArguments});n.once("error",t),n.once("spawn",e)})}(e,t),{status:"opened",appPath:e}}async function e3(){let e=function(e=process.env,t=process.platform,n=process.arch,r=te()){let o=e[eL]?.trim();if(o)return eS().resolve(o);let i=e7({...e,[eL]:""},t,r);if(i)return i;let s=tt(t,n);if(!s)return;let a=e9(e,t),d=tl(a);if(!d||d.platform!==s)return;let l=ty(tp(a,d.activeDeviceAppVersion),d.entry,"device app state entry");return eE().existsSync(l)?l:void 0}();return e?(await function(e,t=process.platform){return"darwin"===t?tI(e):tA(tC(e,t),{rejectOnNonZero:!0}).then(()=>void 0)}(e),{status:"closed",appPath:e}):{status:"skipped",reason:`${eL} is not set and no packaged or cached device app was found`}}async function e6(e={}){let t=e.env??process.env,n=e.platform??process.platform,r=e.arch??process.arch,o=e.appDir??te(),i=tn(t),s=t[eL]?.trim();if(s)return{status:"found",appPath:eS().resolve(s),source:"env"};if(!i){let e=e7({...t,[eL]:""},n,o);if(e)return{status:"found",appPath:e,source:"packaged"}}return e8({env:t,platform:n,arch:r,appDir:o,manifest:e.manifest,runner:e.runner})}async function e8(e={}){let t=e.env??process.env,n=e.platform??process.platform,r=e.arch??process.arch,o=e.manifest??e_;tf(o);let i=tt(n,r);if(!i)return{status:"skipped",reason:`device app download is not supported on ${n}/${r}`};let s=o.packages[i];if(!s)return{status:"skipped",reason:`device app package is not configured for ${i} in CLI ${o.cliVersion}`};let a=e9(t,n),d=tg(o,s);if(!tn(t)){let e=tr(a,o,i,s,d);if(e)return tc(a,d),{status:"found",appPath:e,source:"cache"}}let l=await to(a,o,i,s,n,e.runner);return tc(a,d),{status:"found",appPath:l,source:"downloaded"}}function e7(e=process.env,t=process.platform,n=te()){let r=e[eL]?.trim();if(r)return eS().resolve(r);if(!eE().existsSync(n))return;let o=eE().readdirSync(n,{withFileTypes:!0}).find(e=>{var n,r;return n=e,"darwin"===(r=t)?n.isDirectory()&&n.name.endsWith(".app"):"win32"===r?n.isFile()&&n.name.toLowerCase().endsWith(".exe"):n.isFile()&&/\.(appimage|AppImage)$/.test(n.name)});return o?eS().join(n,o.name):void 0}function e9(e=process.env,t=process.platform){let n=e.DBX_DEVICE_APP_CACHE_DIR?.trim();if(n)return eS().resolve(n);if("darwin"===t)return eS().join(eT().homedir(),"Library","Application Support","dbx","device-app");if("win32"===t){let t=e.LOCALAPPDATA?.trim()||eS().join(eT().homedir(),"AppData","Local");return eS().join(t,"dbx","device-app")}return eS().join(eT().homedir(),".local","share","dbx","device-app")}function te(){return eS().resolve(eN,"../../..","device-app")}function tt(e,t){if(("darwin"===e||"win32"===e)&&("arm64"===t||"x64"===t))return`${e}-${t}`}function tn(e){let t=e.DBX_DEVICE_APP_FORCE_DOWNLOAD?.trim().toLowerCase();return!!(t&&"0"!==t&&"false"!==t)}function tr(e,t,n,r,o){var i,s,a,d,l;let c,u=tl(e);if(!u||u.activeDeviceAppVersion!==o||u.cliVersion!==t.cliVersion||u.platform!==n||!tw(u.sha256,r)||u.entry!==r.entry)return;let p=tp(e,o);if(i=p,s=t,a=n,d=r,l=o,!((c=td(i))&&c.cliVersion===s.cliVersion&&c.deviceAppVersion===l&&c.entry===d.entry&&c.platform===a&&tw(c.sha256,d)))return;let h=ty(p,r.entry,"device app entry");return eE().existsSync(h)?h:void 0}async function to(e,t,n,r,o,i={}){tm(r);let s=tg(t,r),a=i.now?.()??Date.now(),d=eS().join(e,".tmp");eE().mkdirSync(d,{recursive:!0}),eE().mkdirSync(eS().join(e,e$),{recursive:!0});let l=eE().mkdtempSync(eS().join(d,`${s}-`)),c=eS().join(l,"device-app.zip"),u=eS().join(l,"extract"),p=tp(e,s);try{var h,f,m,g,_,w,y,b;let d,l;if(i.onProgress?.({phase:"download",downloadedBytes:0,...void 0===r.sizeBytes?{}:{totalBytes:r.sizeBytes,percentage:0},elapsedMs:0}),await ti(r.url,c,i.fetch,i.onProgress,i.signal),r.sha256&&(i.onProgress?.({phase:"install",stage:"verify"}),i.signal?.throwIfAborted(),d=await tu(c),i.signal?.throwIfAborted(),d!==t_(r.sha256)))throw Error(`device app sha256 mismatch: expected ${r.sha256}, got ${d}`);eE().mkdirSync(u,{recursive:!0}),i.onProgress?.({phase:"install",stage:"extract"}),await ta(c,u,o,i);let v=ty(u,r.entry,"device app package entry");(function(e,t){if(!eE().existsSync(e))throw Error(`device app entry not found after extraction: ${e}`);let n=eE().statSync(e);if("darwin"===t){if(!n.isDirectory()||!e.endsWith(".app"))throw Error(`macOS device app entry must be a .app directory: ${e}`);return}if("win32"===t&&(!n.isFile()||!e.toLowerCase().endsWith(".exe")))throw Error(`Windows device app entry must be an .exe file: ${e}`)})(v,o),function(e,t,n,r,o){let i=td(e);if(i&&(i.cliVersion!==t.cliVersion||i.deviceAppVersion!==o||i.entry!==r.entry||i.platform!==n||!tw(i.sha256,r)))throw Error(`device app metadata does not match CLI manifest in ${eS().join(e,eR)}`)}(u,t,n,r,s),i.onProgress?.({phase:"install",stage:"install"}),eE().rmSync(p,{recursive:!0,force:!0}),eE().renameSync(u,p),h=p,f=t,m=n,g=r,_=s,w=a,l={name:"Doubao App V2",cliVersion:f.cliVersion,deviceAppVersion:_,entry:g.entry,platform:m,...g.sha256?{sha256:t_(g.sha256)}:{},installedAt:w},tE(eS().join(h,eR),l),y=e,b={activeDeviceAppVersion:s,cliVersion:t.cliVersion,entry:r.entry,platform:n,...r.sha256?{sha256:t_(r.sha256)}:{},installedAt:a},tE(eS().join(y,eO),b);let E=ty(p,r.entry,"device app entry");return i.onProgress?.({phase:"complete",appPath:E}),E}finally{eE().rmSync(l,{recursive:!0,force:!0})}}async function ti(e,n,r=fetch,o,i){var s,a;let d,l,c,u,p,h,f=new URL(e);if("https:"!==f.protocol&&"http:"!==f.protocol)throw Error(`device app package URL must be http(s): ${e}`);i?.throwIfAborted();let m=await r(e,{signal:i});if(!m.ok)throw Error(`device app package download failed: HTTP ${m.status} ${m.statusText}`);if(!m.body)throw Error("device app package download failed: empty response body");let g=m.body;await (0,t.pipeline)(ek.Readable.fromWeb(g),(s=m,a=o,d=function(e){if(!e)return;let t=Number(e);return Number.isFinite(t)&&t>0?t:void 0}(s.headers.get("content-length")),l=0,c=-1,u=0,p=Date.now(),(h=e=>{if(!a)return;if(d){let t=Math.min(100,Math.floor(l/d*100));if(!e&&100!==t&&t<c+10||t===c)return;c=t;let n=Date.now()-p;a({phase:"download",downloadedBytes:l,totalBytes:d,percentage:t,elapsedMs:n});return}if(!e&&l-u<0x3200000||l===u)return;u=l;let t=Date.now()-p;a({phase:"download",downloadedBytes:l,elapsedMs:t})})(!1),new ek.Transform({transform(e,t,n){l+=e.length,h(!1),n(null,e)},flush(e){h(!0),e()}})),eE().createWriteStream(n),{signal:i})}function ts(e){let t=["B","KB","MB","GB"],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return 0===r?`${n} ${t[r]}`:`${n.toFixed(1)} ${t[r]}`}async function ta(e,t,n,r){let o=r.runCommand??((e,t)=>tA(e,{rejectOnNonZero:!0,signal:t?.signal}).then(()=>void 0));if("darwin"===n){r.signal?.throwIfAborted(),await o({command:"ditto",args:["-x","-k",e,t]},{signal:r.signal});return}if("win32"===n){r.signal?.throwIfAborted(),await o({command:"powershell.exe",args:["-NoProfile","-ExecutionPolicy","Bypass","-Command",`Expand-Archive -LiteralPath ${tb(e)} -DestinationPath ${tb(t)} -Force`],windowsVerbatimArguments:!0},{signal:r.signal});return}throw Error(`device app zip extraction is not supported on ${n}`)}function td(e){let t=tv(eS().join(e,eR));if(!c(t))return;let n=t.cliVersion,r=t.deviceAppVersion,o=t.entry,i=t.platform,s=t.sha256,a=t.installedAt;if("string"==typeof n&&"string"==typeof r&&"string"==typeof o&&"string"==typeof i&&(void 0===s||"string"==typeof s)&&"number"==typeof a)return{name:"string"==typeof t.name?t.name:void 0,cliVersion:n,deviceAppVersion:r,entry:o,platform:i,..."string"==typeof s?{sha256:s}:{},installedAt:a}}function tl(e){let t=tv(eS().join(e,eO));if(c(t)&&"string"==typeof t.activeDeviceAppVersion&&"string"==typeof t.cliVersion&&"string"==typeof t.entry&&"string"==typeof t.platform&&(void 0===t.sha256||"string"==typeof t.sha256)&&"number"==typeof t.installedAt)return{activeDeviceAppVersion:t.activeDeviceAppVersion,cliVersion:t.cliVersion,entry:t.entry,platform:t.platform,..."string"==typeof t.sha256?{sha256:t.sha256}:{},installedAt:t.installedAt}}function tc(e,t){let n=eS().join(e,e$);if(eE().existsSync(n)){for(let e of eE().readdirSync(n,{withFileTypes:!0}))if(e.isDirectory()&&e.name!==t)try{eE().rmSync(eS().join(n,e.name),{recursive:!0,force:!0})}catch{}}}async function tu(e){let n=eb().createHash("sha256");return await (0,t.pipeline)(eE().createReadStream(e),n),n.digest("hex")}function tp(e,t){return th(t),eS().join(e,e$,t)}function th(e){if(!/^[0-9A-Za-z._+-]+$/.test(e))throw Error(`device app version contains unsupported path characters: ${e}`)}function tf(e){if(1!==e.schemaVersion)throw Error(`unsupported device app manifest schemaVersion: ${e.schemaVersion}`);if(!e.cliVersion.trim())throw Error("device app manifest cliVersion is required");if(!e.deviceAppVersion.trim())throw Error("device app manifest deviceAppVersion is required");th(e.deviceAppVersion)}function tm(e){if(!e.url||!e.entry)throw Error("device app package requires url and entry");if(void 0!==e.version){if(!e.version.trim())throw Error("device app package version must not be empty");th(e.version)}if(e.sha256&&!/^[0-9a-fA-F]{64}$/.test(e.sha256))throw Error(`device app package sha256 must be 64 hex characters: ${e.sha256}`);if(void 0!==e.sizeBytes&&(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<=0))throw Error(`device app package sizeBytes must be a positive integer: ${e.sizeBytes}`);if(eS().isAbsolute(e.entry)||e.entry.split(/[\\/]+/).includes(".."))throw Error(`device app package entry must be a relative path inside the zip: ${e.entry}`)}function tg(e,t){let n=t.version??e.deviceAppVersion;if(!n.trim())throw Error("device app package version must not be empty");return th(n),n}function t_(e){return e.toLowerCase()}function tw(e,t){return!t.sha256||e===t_(t.sha256)}function ty(e,t,n){if(eS().isAbsolute(t))throw Error(`${n} must be relative: ${t}`);let r=eS().resolve(e),o=eS().resolve(e,t);if(o!==r&&!o.startsWith(`${r}${eS().sep}`))throw Error(`${n} escapes target directory: ${t}`);return o}function tb(e){return`'${e.replace(/'/g,"''")}'`}function tv(e){try{return JSON.parse(eE().readFileSync(e,"utf8"))}catch{return}}function tE(e,t){eE().mkdirSync(eS().dirname(e),{recursive:!0}),eE().writeFileSync(e,`${JSON.stringify(t,null,2)}
13
13
  `,"utf8")}async function tI(e){let t=function(e){if(!e.endsWith(".app"))return;let t=function(e){let t=eS().join(e,"Contents","Info.plist");if(!eE().existsSync(t))return;let n=eE().readFileSync(t,"utf8").match(/<key>CFBundleExecutable<\/key>\s*<string>([^<]+)<\/string>/);return n?.[1]}(e)??eS().basename(e,".app");return eS().join(e,"Contents","MacOS",t)}(e);await tA(tC(e,"darwin"),{rejectOnNonZero:!1}),!t||await tT(t)&&await tA({command:"pkill",args:["-f",tS(t)]},{rejectOnNonZero:!1})}function tA(e,t){return new Promise((n,r)=>{let o;t.signal?.throwIfAborted();let i=(0,ew.spawn)(e.command,e.args,{stdio:"ignore",windowsVerbatimArguments:e.windowsVerbatimArguments}),s=!1,a=()=>{i.kill(),(o=setTimeout(()=>i.kill("SIGKILL"),1e3)).unref()},d=e=>{s||(s=!0,clearTimeout(o),t.signal?.removeEventListener("abort",a),e())};t.signal?.addEventListener("abort",a,{once:!0}),i.once("error",e=>d(()=>r(e))),i.once("close",o=>{if(t.signal?.aborted)return void d(()=>r(t.signal?.reason instanceof Error?t.signal.reason:new tQ));let i=o??0;0!==i&&t.rejectOnNonZero?d(()=>r(Error(`${e.command} exited with code ${i}`))):d(()=>n(i))})})}async function tT(e){return 0===await tA({command:"pgrep",args:["-f",tS(e)]},{rejectOnNonZero:!1})}function tC(e,t){return"darwin"===t?{command:"osascript",args:["-e",`tell application (POSIX file "${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}" as alias) to quit`]}:"win32"===t?{command:"cmd",args:["/c","taskkill","/IM",eS().basename(e),"/T"],windowsVerbatimArguments:!0}:{command:"pkill",args:["-f",e]}}function tS(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function tk(e,t,n){let r=await e.client.call(n);if(!r.length)return void ne(e.output,`no ${t}s found`);for(let n of r)ne(e.output,`- ${t7(t,n)}`)}async function tj(e,t){if(t.length>0)throw Error("sessions does not accept arguments");let n=await tq(e,"sessions"),{session:r}=n;try{let t=await r.getConnectedClients();if(0===t.length)throw new M("DEVICE_NOT_CONNECTED","no debug device is connected");let n=t.flatMap(e=>e.sessions.filter(W).map(t=>({clientId:e.device.clientId,sessionId:t.sessionId,url:t.url}))).sort((e,t)=>e.clientId-t.clientId||t.sessionId-e.sessionId);if(0===n.length)throw new M("NO_ACTIVE_LYNX_SESSION","the connected device has no active Lynx session");let o=r.getRuntimeInspectionTarget?await r.getRuntimeInspectionTarget().catch(()=>null):null,i=tO(e),s=e.activeClientId??(1===t.length?t[0]?.device.clientId:void 0),a=void 0===s?void 0:n.find(e=>e.clientId===s);for(let t of n){let n=[t$(t,o)?"electron":void 0,"fixed"===i.kind&&t$(t,i.target)?"cli":void 0,t$(t,a)?"latest":void 0].filter(e=>void 0!==e);ne(e.output,`${F(t)}${n.length?` ${n.map(e=>`[${e}]`).join(" ")}`:""} ${t.url||"unknown"}`)}}finally{n.owned&&await r.stop().catch(()=>void 0)}}async function tD(e,t){if(1!==t.length)throw Error("use-session requires @<clientId>:<sessionId> or latest");if(t[0]?.toLowerCase()==="latest"){e.runtimeInspectionTargetPolicy={kind:"latest"},ne(e.output,A.bold.blueBright(`CLI 调试目标已恢复为 latest${void 0===e.activeClientId?"":`(client ${e.activeClientId} 内最新活跃 Lynx session)`};不会切换 Electron。`));return}let n=V(t[0]??""),r=await tq(e,"use-session"),{session:o}=r;try{let t=await U(o,{activeClientId:e.activeClientId,explicitTarget:n,signal:e.signal});e.runtimeInspectionTargetPolicy={kind:"fixed",target:{clientId:t.clientId,sessionId:t.sessionId}},ne(e.output,A.bold.blueBright(`CLI 调试目标已固定为 ${F(t)}(${t.url||"unknown"});不会切换 Electron。`))}finally{r.owned&&await o.stop().catch(()=>void 0)}}async function tP(e,t){let n=(0,eD.parseArgs)({args:t,allowPositionals:!1,options:{limit:{type:"string"},"timeout-seconds":{type:"string"},"include-stack-traces":{type:"boolean"},target:{type:"string"}}}),r=function(e){if(void 0===e)return;let t=Number(e);if(!Number.isSafeInteger(t)||t<1||t>100)throw Error("--limit must be an integer between 1 and 100");return t}(n.values.limit),o=function(e){if(void 0===e)return;let t=Number(e);if(!Number.isFinite(t)||t<=0)throw Error("--timeout-seconds must be a positive number");return Math.round(1e3*t)}(n.values["timeout-seconds"]),i=await tq(e,"get-console"),{session:s}=i;try{let t=await tN(e,s,n.values.target);ne(e.output,A.bold.blueBright(`正在监听 client ${t.clientId}、session ${t.sessionId}(${t.url||"unknown"})的新日志;按 Ctrl+C 停止监听。`));let i=await es(s,t,{...void 0===r?{}:{limit:r},...void 0===o?{}:{timeoutMs:o},signal:e.signal,onTargetChange(n){ne(e.output,A.bold.blueBright(`提示:Electron 已切换到 client ${n.clientId}、session ${n.sessionId}(${n.url||"unknown"});当前 CLI 仍监听 client ${t.clientId}、session ${t.sessionId},不会自动跟随 Electron。`))},onMessage(t){ne(e.output,function(e,t={}){var n;let r=e.args.map(ec).join(" "),o=t.includeStackTraces||"error"===e.type?(n=e.stackTrace,c(n)&&Array.isArray(n.callFrames)?n.callFrames.filter(c).map(e=>{let t="string"==typeof e.url?e.url:"",n="number"==typeof e.lineNumber?e.lineNumber:"unknown",r="number"==typeof e.columnNumber?e.columnNumber:"unknown";return` at ${t}:${n}:${r}`}).join("\n"):""):"";return`[${e.type}/${e.thread}] ${r}${o?`
14
- ${o}`:""}`}(t,{includeStackTraces:n.values["include-stack-traces"]}))}});ne(e.output,`日志监听已停止,共 ${i.count} 条。`)}finally{i.owned&&await s.stop().catch(()=>void 0)}}async function tx(e,t,n=!1){let r=(0,eD.parseArgs)({args:t,allowPositionals:!1,options:{output:{type:"string",short:"o"},target:{type:"string"}}}),o=await tq(e,"take-screenshot"),{session:i}=o;try{let t=await tN(e,i,r.values.target),o=await ea(i,t,{activeCapture:!e.manageDeviceApp}),s=eS().resolve(r.values.output??`screenshot-${Date.now()}.jpeg`);await eE().promises.writeFile(s,Buffer.from(o.data,"base64")),n?nt(e.output,{ok:!0,command:"take-screenshot",target:t,output:s,format:o.format,source:o.source,width:o.width,height:o.height,byteLength:o.byteLength}):ne(e.output,`截图已保存:${s}(${o.width}\xd7${o.height},client ${t.clientId}、session ${t.sessionId},${t.url||"unknown"};${e.manageDeviceApp?"范围跟随 Electron 当前 mode":"由设备按当前截图 mode 生成"})`)}finally{o.owned&&await i.stop().catch(()=>void 0)}}async function tL(e,t,n=!1){let r=(0,eD.parseArgs)({args:t,allowPositionals:!1,options:{depth:{type:"string"},target:{type:"string"}}}),o=function(e){if(void 0===e)return -1;let t=Number(e);if(!Number.isSafeInteger(t)||t<-1)throw Error("--depth must be -1 or a non-negative integer");return t}(r.values.depth),i=await tq(e,"get-page-tree"),{session:s}=i;try{let t=await tN(e,s,r.values.target),i=await z(s,t,{depth:o});if(n)nt(e.output,{ok:!0,command:"get-page-tree",...i});else{let n,r;ne(e.output,`DOM tree: client ${t.clientId}、session ${t.sessionId}(${t.url||"unknown"})`),ne(e.output,(n=[],(r=(e,t,o)=>{n.push(`${t}${o}${function(e){if(et(e))return`${e.ref} #text ${eo(e.nodeValue)}`;let t=(e.localName||e.nodeName).toLowerCase();if(t.startsWith("#"))return`${e.ref} ${t}`;let n=Object.entries(e.attributes).map(([e,t])=>`${e}=${eo(t,80)}`).join(" "),r=e.text||e.children.filter(et).map(e=>e.nodeValue).join("");return[e.ref,`<${t}${n?` ${n}`:""}>`,r?eo(r,120):""].filter(Boolean).join(" ")}(e)}`);let i=e.children.filter(e=>!et(e));i.forEach((e,n)=>{r(e,`${t}${o?"└─ "===o?" ":"│ ":""}`,n===i.length-1?"└─ ":"├─ ")})})(i.root,"",""),i.truncated&&n.push(`… tree truncated after ${i.nodeCount} nodes`),n.join("\n"))),ne(e.output,`共 ${i.nodeCount} 个节点${i.truncated?"(已截断)":""}。`)}}finally{i.owned&&await s.stop().catch(()=>void 0)}}async function tR(e,t,n=!1){let r=(0,eD.parseArgs)({args:t,allowPositionals:!0,options:{properties:{type:"string"}}}),o=r.positionals[0];if(!o)throw new M("INVALID_NODE_REF","node-ref is required; run get-page-tree and pass @<clientId>:<sessionId>:<nodeId>");if(r.positionals.length>1)throw Error("get-computed-style accepts exactly one node-ref");let i=function(e){let t=/^@([1-9]\d*):([1-9]\d*):([1-9]\d*)$/.exec(e.trim());if(!t)throw new M("INVALID_NODE_REF",`invalid node ref "${e}"; expected @<clientId>:<sessionId>:<nodeId>`);let n={clientId:Number(t[1]),sessionId:Number(t[2]),nodeId:Number(t[3])};if(!Number.isSafeInteger(n.clientId)||!Number.isSafeInteger(n.sessionId)||!Number.isSafeInteger(n.nodeId))throw new M("INVALID_NODE_REF",`invalid node ref "${e}"; every id must be a safe integer`);return n}(o),s=function(e){if(void 0===e)return[];let t=e.split(",").map(e=>e.trim());if(0===t.length||t.some(e=>!/^-{0,2}[a-z][a-z0-9-]*$/i.test(e)))throw Error("--properties must be a comma-separated list of CSS property names");return[...new Set(t.map(e=>e.toLowerCase()))]}(r.values.properties),a=await tq(e,"get-computed-style"),{session:d}=a;try{let t=await K(d,i),r=await Y(d,t,i,s);if(n)nt(e.output,{ok:!0,command:"get-computed-style",...r});else if(ne(e.output,`${r.nodeRef} computed style(client ${t.clientId}、session ${t.sessionId})`),0===r.properties.length)ne(e.output,"没有匹配的 computed style 属性。");else{let t=Math.max(...r.properties.map(e=>e.name.length));for(let n of r.properties)ne(e.output,` ${n.name.padEnd(t)} ${n.value}`)}}finally{a.owned&&await d.stop().catch(()=>void 0)}}function tO(e){return e.runtimeInspectionTargetPolicy??{kind:"latest"}}function t$(e,t){return null!=e&&null!=t&&e.clientId===t.clientId&&e.sessionId===t.sessionId}function tN(e,t,n){return U(t,{activeClientId:e.activeClientId,policy:tO(e),...void 0===n?{}:{explicitTarget:V(n)},signal:e.signal})}async function tq(e,t){if(e.runtimeInspectionSession)return{owned:!1,session:await e.runtimeInspectionSession};let n=e.createRuntimeInspectionSession??B;return{owned:!0,session:await n({namespace:e.runtime.getState().namespace,nodeIdPrefix:`dev-shell-${t}`})}}async function tM(e,t){let o=(0,eD.parseArgs)({args:t,allowPositionals:!0,options:{"device-id":{type:"string"}}}),i=o.positionals[0]??await tF(e,"page",n.discoverPages);if(!i)throw Error("page url is required");let s=o.values["device-id"]??e.activeDeviceId;ne(e.output,`debug: page open request ${t9({url:i,deviceId:s})}`);let a=r("page",await e.client.call(n.openPageUrl,{url:i,deviceId:s}));ne(e.output,`page opened: ${i}`),ne(e.output,`status: ${tU(a)}`)}async function tB(e,t){let o=(0,eD.parseArgs)({args:t,allowPositionals:!0,options:{data:{type:"string"},"bot-id":{type:"string"},"device-id":{type:"string"}}}),s=o.positionals[0]??await tF(e,"widget",n.discoverWidgets);if(!s)throw Error("widget id is required");let a=i(o.values.data,"--data"),d=o.values["device-id"]??e.activeDeviceId;ne(e.output,`debug: widget push request ${t9({widgetId:s,data:a,botId:o.values["bot-id"],deviceId:d})}`);let l=r("widget",await e.client.call(n.pushWidget,{widgetId:s,widgetData:a,botId:o.values["bot-id"],deviceId:d}));ne(e.output,`widget pushed: ${s}`),ne(e.output,`status: ${tU(l)}`)}function tU(e){if(!e.ok)return"failed";let t=function(e){if(!e||"object"!=typeof e)return;let t=e.data;if(!t||"object"!=typeof t)return;let n=t.msg;return"string"==typeof n?n:void 0}(e.result);return"string"==typeof t&&t.trim()?t:"ok"}async function tF(e,t,n){let r=await e.client.call(n);if(r.length)return e.selectItem(t,r,e.output)}function tV(e,t){return t.map(t=>{let n=t8(e,t);return n?{label:t7(e,t),value:n}:void 0}).filter(e=>!!e)}async function tH(e){var t,r;let o,i,s,a,l=e.timeoutMs??6e4;if(!e.hostUrl||!e.appKey)return{ok:!1,status:"skipped",timeoutMs:l,failureStage:"create_qr",error:"无法生成二维码,缺少 hostUrl 或 appKey。"};let c=e.hostUrl,p=e.appKey,h=(t=e.namespace,r=l,i=new d(t,{nodeId:`dev-auth-${process.pid}-${Math.random().toString(36).slice(2,8)}`,requestTimeout:2e3}),s=!1,a=new Promise(e=>{o=e}),i.createService({name:`devAuthListener${process.pid}`,events:{"connection.newclient"(e){var t;s||(s=!0,o((t=e.params)&&"object"==typeof t?{scope:"string"==typeof t.scope?t.scope:void 0,type:"string"==typeof t.type?t.type:void 0,clientId:"number"==typeof t.clientId?t.clientId:void 0,deviceId:t1(t),app:"string"==typeof t.app?t.app:void 0}:{}))}}}),{start:()=>i.start(),stop:()=>i.stop(),wait:(e,t=r)=>{var n,o,i;return n=a,o=t,i=e,new Promise((e,t)=>{let r=()=>{clearTimeout(s),t(i?.reason instanceof Error?i.reason:new tQ)},s=setTimeout(()=>{i?.removeEventListener("abort",r),t(new tJ(o))},o);i?.aborted?r():(i?.addEventListener("abort",r,{once:!0}),n.then(t=>{clearTimeout(s),i?.removeEventListener("abort",r),e(t)},e=>{clearTimeout(s),i?.removeEventListener("abort",r),t(e)}))})},async findExistingClient(){let e=await t0(()=>i.call("devtoolConnection.getConnectedClients"),2e3).catch(()=>[]);return function(e){if(!e||"object"!=typeof e)return;let t=e.device,n=t?.info,r="number"==typeof t?.clientId?t.clientId:void 0;return{scope:"all",type:String(n?.network??"").toLowerCase().includes("wifi")?"wifi":"usb",...void 0===r?{}:{clientId:r},deviceId:t1({client:e}),app:"string"==typeof n?.App?n.App:""}}(Array.isArray(e)?e[0]:void 0)},async awaitDirectDebugReady(e){let t=Math.min(r,2500);try{return await i.call(n.awaitDirectDebugReady,{clientId:e,timeoutMs:t},{timeout:t+1e3})}catch{return!1}},waitForInstallResult:(e,t,r,o)=>{var s,a;return s=i.call(n.awaitDeviceInstallResult,{clientId:e,packageName:t,timeoutMs:r},{timeout:r+1e3}),(a=o)?new Promise((e,t)=>{let n=()=>{t(a.reason instanceof Error?a.reason:new tQ)};if(a.aborted){s.catch(()=>void 0),n();return}a.addEventListener("abort",n,{once:!0}),s.then(t=>{a.removeEventListener("abort",n),e(t)},e=>{a.removeEventListener("abort",n),t(e)})}):s}}),f={},m="connection",g="wait_device_connection";await h.start();try{let t;e.signal?.throwIfAborted();let n=await h.findExistingClient(),r=n?.clientId!==void 0&&await h.awaitDirectDebugReady(n.clientId);if(r)await e.onPhaseChange?.("reusing_client");else{let n,r,o;g="create_qr",t=await tK(f,()=>(0,eP.Ph)(function(e,t,n={}){let r=tz(n.settings);return{hostUrl:e,appKey:t,...void 0===n.versionTag?{}:{versionTag:n.versionTag},isSigned:!1,appletType:0,baseApiUrl:u(),authOptions:v(),...!1===r.defaultDebugTagState?{defaultDebugTagState:!1}:{},...!r.usb&&n.wifiConnectUrl?{wifiConnectUrl:n.wifiConnectUrl}:{}}}(c,p,{versionTag:e.versionTag,settings:e.settings,wifiConnectUrl:e.wifiConnectUrl})),e.signal),await e.onPhaseChange?.("waiting_for_scan"),ne(e.output,""),ne(e.output,"使用豆包 App 扫码连接调试设备."),ne(e.output,`二维码创建成功,请在 ${(n=Math.max(1,Math.round(l/1e3)),r=Math.floor(n/60),o=n%60,r>0?`${r}m ${o}s`:`${o}s`)} 前扫码; 超时可在真机模式执行 \`qr\` 创建新二维码.`),ne(e.output,""),await e.onQRCodeReady?.(t.qrCodeValue,t.debugToken),e.signal?.throwIfAborted()}g="wait_device_connection";let o=Date.now()+l;ne(e.output,`等待设备连接 (${l/1e3}s timeout)...`);let i=r?n:await h.wait(e.signal,tZ(o));if(void 0===i.clientId)throw Error("连接的设备缺少 clientId");m="install",g="install_debug_package",await e.onPhaseChange?.("waiting_for_install");let s=await h.waitForInstallResult(i.clientId,p,tZ(o),e.signal);if(!s)throw new tJ(l);if(!s.success)return{ok:!1,status:"skipped",timeoutMs:l,failureStage:g,waitingFor:m,client:i,error:s.message||"安装 AIPackage 失败,请检查网络环境并关注客户端提示"};return{ok:!0,status:"connected",timeoutMs:l,...t?{qrCodeValue:t.qrCodeValue,debugToken:t.debugToken,encryptedDebugPayload:t.encryptedDebugPayload}:{},client:i}}catch(o){let t=o instanceof tJ,n=o instanceof tQ||!!e.signal?.aborted,r=function(e){if(e&&"object"==typeof e)return tW(e,"logId")??tW(e,"log_id")}(o)??f.logId;return{ok:!1,status:n?"cancelled":t?"timeout":"skipped",timeoutMs:l,failureStage:g,waitingFor:m,...r?{logId:r}:{},error:o instanceof Error?o.message:String(o)}}finally{await h.stop()}}async function tK(e,t,n){let r=globalThis.fetch;globalThis.fetch=async(t,o)=>{var i;let s,a=(s=function(e){try{if("string"==typeof e)return new URL(e);if(e instanceof URL)return new URL(e.toString());return new URL(e.url)}catch{return}}(i=t))&&s.pathname.startsWith("/developer/check_api/apps/")&&s.pathname.endsWith("/debug/ticket")?(s.pathname=s.pathname.replace(/^\/developer\/check_api\//,"/app_developer/check_api/"),"string"==typeof i)?s.toString():i instanceof URL?s:new Request(s,i):i,d=await r(a,n&&a!==t&&!o?.signal?{...o,signal:n}:o);return await tY(e,d),d};try{return await t()}finally{globalThis.fetch=r}}function tz(e){return{defaultDebugTagState:e?.defaultDebugTagState??!0,usb:e?.usb??!0}}async function tY(e,t){let n=t.headers.get("x-tt-logid");if(n){e.logId=n;return}try{let n=await t.clone().text();if(!n)return;let r=JSON.parse(n),o=tW(r,"log_id")??tW(r,"logId");o&&(e.logId=o)}catch{}}function tW(e,t){if(!e||"object"!=typeof e)return;let n=e[t];return"string"==typeof n&&n?n:void 0}function tG(e){return e.replace(/\s*[\[((]log_id:\s*[^\]))]+[\]))]/gi,"").trim()}class tJ extends Error{constructor(e){super(`real-device auth timed out after ${e}ms`),this.name="RealDeviceAuthTimeoutError"}}class tQ extends Error{constructor(){super("real-device auth cancelled"),this.name="RealDeviceAuthCancelledError"}}function tX(e,t){let n=new d(e,{nodeId:`dev-disconnect-${process.pid}-${Math.random().toString(36).slice(2,8)}`,requestTimeout:2e3});return n.createService({name:`devDisconnectListener${process.pid}`,events:{"connection.clientDisconnected":()=>t()}}),{start:()=>n.start(),stop:()=>n.stop()}}function tZ(e){return Math.max(0,e-Date.now())}async function t0(e,t){let n=Date.now()+t;for(;;)try{return await e()}catch(e){if(Date.now()>=n)throw e;await new Promise(e=>{setTimeout(e,100)})}}function t1(e){let t=e.client?.device,n=t?.info;return n?.usbDeviceId||t?.xdbId||n?.did||n?.debugRouterId}async function t2(e,t){let n=eS().resolve(t);if(".png"!==eS().extname(n).toLowerCase())throw Error("QR file must use the .png extension");return eE().mkdirSync(eS().dirname(n),{recursive:!0}),await ex.toFile(n,e,{errorCorrectionLevel:"L",margin:4,type:"png"}),n}async function t4(e,t){let n=await ex.toBuffer(e,{errorCorrectionLevel:"L",margin:0,type:"png",width:320}),r=t?await ex.toBuffer(`doubaoapp://local_debug?short_token=${t}`,{errorCorrectionLevel:"L",margin:0,type:"png",width:320}):void 0;return{legacy:n,...r?{modern:r}:{}}}function t5(e=eT().tmpdir()){let t;try{t=eE().readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of t)if(/^dbx-real-device-qr-.*\.(?:png|svg)$/i.test(n.name)&&(n.isFile()||n.isSymbolicLink()))try{eE().unlinkSync(eS().join(e,n.name))}catch{}}async function t3(e,t,n,r=process.stderr,o){let i,s,a;if(n){let t=await t2(e,n);ne(r,`二维码图片已导出至:${t}`)}let{legacy:d,modern:l}=await t4(e,o),c=eb().randomBytes(18).toString("hex"),u=`/${c}/`,p=new Set,h=!1,f=new Promise(e=>{s=e}),m=()=>{clearTimeout(i),i=void 0,h||s()},g=(0,eI.createServer)((e,t)=>{let n=e.url?.split("?",1)[0];if(t.setHeader("Cache-Control","no-store, no-cache, must-revalidate, max-age=0"),t.setHeader("Expires","0"),t.setHeader("Pragma","no-cache"),"GET"===e.method&&n===u){var r;t.writeHead(200,{"Content-Security-Policy":"default-src 'none'; img-src 'self'; connect-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'","Content-Type":"text/html; charset=utf-8"}),t.end((r=!!l,`<!doctype html>
14
+ ${o}`:""}`}(t,{includeStackTraces:n.values["include-stack-traces"]}))}});ne(e.output,`日志监听已停止,共 ${i.count} 条。`)}finally{i.owned&&await s.stop().catch(()=>void 0)}}async function tx(e,t,n=!1){let r=(0,eD.parseArgs)({args:t,allowPositionals:!1,options:{output:{type:"string",short:"o"},target:{type:"string"}}}),o=await tq(e,"take-screenshot"),{session:i}=o;try{let t=await tN(e,i,r.values.target),o=await ea(i,t,{activeCapture:!e.manageDeviceApp}),s=eS().resolve(r.values.output??`screenshot-${Date.now()}.jpeg`);await eE().promises.writeFile(s,Buffer.from(o.data,"base64")),n?nt(e.output,{ok:!0,command:"take-screenshot",target:t,output:s,format:o.format,source:o.source,width:o.width,height:o.height,byteLength:o.byteLength}):ne(e.output,`截图已保存:${s}(${o.width}\xd7${o.height},client ${t.clientId}、session ${t.sessionId},${t.url||"unknown"};${e.manageDeviceApp?"范围跟随 Electron 当前 mode":"由设备按当前截图 mode 生成"})`)}finally{o.owned&&await i.stop().catch(()=>void 0)}}async function tL(e,t,n=!1){let r=(0,eD.parseArgs)({args:t,allowPositionals:!1,options:{depth:{type:"string"},target:{type:"string"}}}),o=function(e){if(void 0===e)return -1;let t=Number(e);if(!Number.isSafeInteger(t)||t<-1)throw Error("--depth must be -1 or a non-negative integer");return t}(r.values.depth),i=await tq(e,"get-page-tree"),{session:s}=i;try{let t=await tN(e,s,r.values.target),i=await z(s,t,{depth:o});if(n)nt(e.output,{ok:!0,command:"get-page-tree",...i});else{let n,r;ne(e.output,`DOM tree: client ${t.clientId}、session ${t.sessionId}(${t.url||"unknown"})`),ne(e.output,(n=[],(r=(e,t,o)=>{n.push(`${t}${o}${function(e){if(et(e))return`${e.ref} #text ${eo(e.nodeValue)}`;let t=(e.localName||e.nodeName).toLowerCase();if(t.startsWith("#"))return`${e.ref} ${t}`;let n=Object.entries(e.attributes).map(([e,t])=>`${e}=${eo(t,80)}`).join(" "),r=e.text||e.children.filter(et).map(e=>e.nodeValue).join("");return[e.ref,`<${t}${n?` ${n}`:""}>`,r?eo(r,120):""].filter(Boolean).join(" ")}(e)}`);let i=e.children.filter(e=>!et(e));i.forEach((e,n)=>{r(e,`${t}${o?"└─ "===o?" ":"│ ":""}`,n===i.length-1?"└─ ":"├─ ")})})(i.root,"",""),i.truncated&&n.push(`… tree truncated after ${i.nodeCount} nodes`),n.join("\n"))),ne(e.output,`共 ${i.nodeCount} 个节点${i.truncated?"(已截断)":""}。`)}}finally{i.owned&&await s.stop().catch(()=>void 0)}}async function tR(e,t,n=!1){let r=(0,eD.parseArgs)({args:t,allowPositionals:!0,options:{properties:{type:"string"}}}),o=r.positionals[0];if(!o)throw new M("INVALID_NODE_REF","node-ref is required; run get-page-tree and pass @<clientId>:<sessionId>:<nodeId>");if(r.positionals.length>1)throw Error("get-computed-style accepts exactly one node-ref");let i=function(e){let t=/^@([1-9]\d*):([1-9]\d*):([1-9]\d*)$/.exec(e.trim());if(!t)throw new M("INVALID_NODE_REF",`invalid node ref "${e}"; expected @<clientId>:<sessionId>:<nodeId>`);let n={clientId:Number(t[1]),sessionId:Number(t[2]),nodeId:Number(t[3])};if(!Number.isSafeInteger(n.clientId)||!Number.isSafeInteger(n.sessionId)||!Number.isSafeInteger(n.nodeId))throw new M("INVALID_NODE_REF",`invalid node ref "${e}"; every id must be a safe integer`);return n}(o),s=function(e){if(void 0===e)return[];let t=e.split(",").map(e=>e.trim());if(0===t.length||t.some(e=>!/^-{0,2}[a-z][a-z0-9-]*$/i.test(e)))throw Error("--properties must be a comma-separated list of CSS property names");return[...new Set(t.map(e=>e.toLowerCase()))]}(r.values.properties),a=await tq(e,"get-computed-style"),{session:d}=a;try{let t=await K(d,i),r=await Y(d,t,i,s);if(n)nt(e.output,{ok:!0,command:"get-computed-style",...r});else if(ne(e.output,`${r.nodeRef} computed style(client ${t.clientId}、session ${t.sessionId})`),0===r.properties.length)ne(e.output,"没有匹配的 computed style 属性。");else{let t=Math.max(...r.properties.map(e=>e.name.length));for(let n of r.properties)ne(e.output,` ${n.name.padEnd(t)} ${n.value}`)}}finally{a.owned&&await d.stop().catch(()=>void 0)}}function tO(e){return e.runtimeInspectionTargetPolicy??{kind:"latest"}}function t$(e,t){return null!=e&&null!=t&&e.clientId===t.clientId&&e.sessionId===t.sessionId}function tN(e,t,n){return U(t,{activeClientId:e.activeClientId,policy:tO(e),...void 0===n?{}:{explicitTarget:V(n)},signal:e.signal})}async function tq(e,t){if(e.runtimeInspectionSession)return{owned:!1,session:await e.runtimeInspectionSession};let n=e.createRuntimeInspectionSession??B;return{owned:!0,session:await n({namespace:e.runtime.getState().namespace,nodeIdPrefix:`dev-shell-${t}`})}}async function tM(e,t){let o=(0,eD.parseArgs)({args:t,allowPositionals:!0,options:{"device-id":{type:"string"}}}),i=o.positionals[0]??await tF(e,"page",n.discoverPages);if(!i)throw Error("page url is required");let s=o.values["device-id"]??e.activeDeviceId;ne(e.output,`debug: page open request ${t9({url:i,deviceId:s})}`);let a=r("page",await e.client.call(n.openPageUrl,{url:i,deviceId:s}));ne(e.output,`page opened: ${i}`),ne(e.output,`status: ${tU(a)}`)}async function tB(e,t){let o=(0,eD.parseArgs)({args:t,allowPositionals:!0,options:{data:{type:"string"},"bot-id":{type:"string"},"device-id":{type:"string"}}}),s=o.positionals[0]??await tF(e,"widget",n.discoverWidgets);if(!s)throw Error("widget id is required");let a=i(o.values.data,"--data"),d=o.values["device-id"]??e.activeDeviceId;ne(e.output,`debug: widget push request ${t9({widgetId:s,data:a,botId:o.values["bot-id"],deviceId:d})}`);let l=r("widget",await e.client.call(n.pushWidget,{widgetId:s,widgetData:a,botId:o.values["bot-id"],deviceId:d}));ne(e.output,`widget pushed: ${s}`),ne(e.output,`status: ${tU(l)}`)}function tU(e){if(!e.ok)return"failed";let t=function(e){if(!e||"object"!=typeof e)return;let t=e.data;if(!t||"object"!=typeof t)return;let n=t.msg;return"string"==typeof n?n:void 0}(e.result);return"string"==typeof t&&t.trim()?t:"ok"}async function tF(e,t,n){let r=await e.client.call(n);if(r.length)return e.selectItem(t,r,e.output)}function tV(e,t){return t.map(t=>{let n=t8(e,t);return n?{label:t7(e,t),value:n}:void 0}).filter(e=>!!e)}async function tH(e){var t,r;let o,i,s,a,l=e.timeoutMs??6e4;if(!e.hostUrl||!e.appKey)return{ok:!1,status:"skipped",timeoutMs:l,failureStage:"create_qr",error:"无法生成二维码,缺少 hostUrl 或 appKey。"};let c=e.hostUrl,p=e.appKey,h=(t=e.namespace,r=l,i=new d(t,{nodeId:`dev-auth-${process.pid}-${Math.random().toString(36).slice(2,8)}`,requestTimeout:2e3}),s=!1,a=new Promise(e=>{o=e}),i.createService({name:`devAuthListener${process.pid}`,events:{"connection.newclient"(e){var t;s||(s=!0,o((t=e.params)&&"object"==typeof t?{scope:"string"==typeof t.scope?t.scope:void 0,type:"string"==typeof t.type?t.type:void 0,clientId:"number"==typeof t.clientId?t.clientId:void 0,deviceId:t1(t),app:"string"==typeof t.app?t.app:void 0}:{}))}}}),{start:()=>i.start(),stop:()=>i.stop(),wait:(e,t=r)=>{var n,o,i;return n=a,o=t,i=e,new Promise((e,t)=>{let r=()=>{clearTimeout(s),t(i?.reason instanceof Error?i.reason:new tQ)},s=setTimeout(()=>{i?.removeEventListener("abort",r),t(new tJ(o))},o);i?.aborted?r():(i?.addEventListener("abort",r,{once:!0}),n.then(t=>{clearTimeout(s),i?.removeEventListener("abort",r),e(t)},e=>{clearTimeout(s),i?.removeEventListener("abort",r),t(e)}))})},async findExistingClient(){let e=await t0(()=>i.call("devtoolConnection.getConnectedClients"),2e3).catch(()=>[]);return function(e){if(!e||"object"!=typeof e)return;let t=e.device,n=t?.info,r="number"==typeof t?.clientId?t.clientId:void 0;return{scope:"all",type:String(n?.network??"").toLowerCase().includes("wifi")?"wifi":"usb",...void 0===r?{}:{clientId:r},deviceId:t1({client:e}),app:"string"==typeof n?.App?n.App:""}}(Array.isArray(e)?e[0]:void 0)},async awaitDirectDebugReady(e){let t=Math.min(r,2500);try{return await i.call(n.awaitDirectDebugReady,{clientId:e,timeoutMs:t},{timeout:t+1e3})}catch{return!1}},waitForInstallResult:(e,t,r,o)=>{var s,a;return s=i.call(n.awaitDeviceInstallResult,{clientId:e,packageName:t,timeoutMs:r},{timeout:r+1e3}),(a=o)?new Promise((e,t)=>{let n=()=>{t(a.reason instanceof Error?a.reason:new tQ)};if(a.aborted){s.catch(()=>void 0),n();return}a.addEventListener("abort",n,{once:!0}),s.then(t=>{a.removeEventListener("abort",n),e(t)},e=>{a.removeEventListener("abort",n),t(e)})}):s}}),f={},m="connection",g="wait_device_connection";await h.start();try{let t;e.signal?.throwIfAborted();let n=await h.findExistingClient(),r=n?.clientId!==void 0&&await h.awaitDirectDebugReady(n.clientId);if(r)await e.onPhaseChange?.("reusing_client");else{let n,r,o;g="create_qr",t=await tK(f,()=>(0,eP.Ph)(function(e,t,n={}){let r=tz(n.settings);return{hostUrl:e,appKey:t,...void 0===n.versionTag?{}:{versionTag:n.versionTag},isSigned:!1,appletType:0,baseApiUrl:u(),authOptions:v(),...!1===r.defaultDebugTagState?{defaultDebugTagState:!1}:{},...!r.usb&&n.wifiConnectUrl?{wifiConnectUrl:n.wifiConnectUrl}:{}}}(c,p,{versionTag:e.versionTag,settings:e.settings,wifiConnectUrl:e.wifiConnectUrl})),e.signal),await e.onPhaseChange?.("waiting_for_scan"),ne(e.output,""),ne(e.output,"使用豆包 App 扫码连接调试设备."),ne(e.output,`二维码创建成功,请在 ${(n=Math.max(1,Math.round(l/1e3)),r=Math.floor(n/60),o=n%60,r>0?`${r}m ${o}s`:`${o}s`)} 前扫码; 超时可在真机模式执行 \`qr\` 创建新二维码.`),ne(e.output,""),await e.onQRCodeReady?.(t.qrCodeValue,t.debugToken),e.signal?.throwIfAborted()}g="wait_device_connection";let o=Date.now()+l;ne(e.output,`等待设备连接 (${l/1e3}s timeout)...`);let i=(r?n:await h.findExistingClient())??await h.wait(e.signal,tZ(o));if(void 0===i.clientId)throw Error("连接的设备缺少 clientId");m="install",g="install_debug_package",await e.onPhaseChange?.("waiting_for_install");let s=await h.waitForInstallResult(i.clientId,p,tZ(o),e.signal);if(!s)throw new tJ(l);if(!s.success)return{ok:!1,status:"skipped",timeoutMs:l,failureStage:g,waitingFor:m,client:i,error:s.message||"安装 AIPackage 失败,请检查网络环境并关注客户端提示"};return{ok:!0,status:"connected",timeoutMs:l,...t?{qrCodeValue:t.qrCodeValue,debugToken:t.debugToken,encryptedDebugPayload:t.encryptedDebugPayload}:{},client:i}}catch(o){let t=o instanceof tJ,n=o instanceof tQ||!!e.signal?.aborted,r=function(e){if(e&&"object"==typeof e)return tW(e,"logId")??tW(e,"log_id")}(o)??f.logId;return{ok:!1,status:n?"cancelled":t?"timeout":"skipped",timeoutMs:l,failureStage:g,waitingFor:m,...r?{logId:r}:{},error:o instanceof Error?o.message:String(o)}}finally{await h.stop()}}async function tK(e,t,n){let r=globalThis.fetch;globalThis.fetch=async(t,o)=>{var i;let s,a=(s=function(e){try{if("string"==typeof e)return new URL(e);if(e instanceof URL)return new URL(e.toString());return new URL(e.url)}catch{return}}(i=t))&&s.pathname.startsWith("/developer/check_api/apps/")&&s.pathname.endsWith("/debug/ticket")?(s.pathname=s.pathname.replace(/^\/developer\/check_api\//,"/app_developer/check_api/"),"string"==typeof i)?s.toString():i instanceof URL?s:new Request(s,i):i,d=await r(a,n&&a!==t&&!o?.signal?{...o,signal:n}:o);return await tY(e,d),d};try{return await t()}finally{globalThis.fetch=r}}function tz(e){return{defaultDebugTagState:e?.defaultDebugTagState??!0,usb:e?.usb??!0}}async function tY(e,t){let n=t.headers.get("x-tt-logid");if(n){e.logId=n;return}try{let n=await t.clone().text();if(!n)return;let r=JSON.parse(n),o=tW(r,"log_id")??tW(r,"logId");o&&(e.logId=o)}catch{}}function tW(e,t){if(!e||"object"!=typeof e)return;let n=e[t];return"string"==typeof n&&n?n:void 0}function tG(e){return e.replace(/\s*[\[((]log_id:\s*[^\]))]+[\]))]/gi,"").trim()}class tJ extends Error{constructor(e){super(`real-device auth timed out after ${e}ms`),this.name="RealDeviceAuthTimeoutError"}}class tQ extends Error{constructor(){super("real-device auth cancelled"),this.name="RealDeviceAuthCancelledError"}}function tX(e,t){let n=new d(e,{nodeId:`dev-disconnect-${process.pid}-${Math.random().toString(36).slice(2,8)}`,requestTimeout:2e3});return n.createService({name:`devDisconnectListener${process.pid}`,events:{"connection.clientDisconnected":()=>t()}}),{start:()=>n.start(),stop:()=>n.stop()}}function tZ(e){return Math.max(0,e-Date.now())}async function t0(e,t){let n=Date.now()+t;for(;;)try{return await e()}catch(e){if(Date.now()>=n)throw e;await new Promise(e=>{setTimeout(e,100)})}}function t1(e){let t=e.client?.device,n=t?.info;return n?.usbDeviceId||t?.xdbId||n?.did||n?.debugRouterId}async function t2(e,t){let n=eS().resolve(t);if(".png"!==eS().extname(n).toLowerCase())throw Error("QR file must use the .png extension");return eE().mkdirSync(eS().dirname(n),{recursive:!0}),await ex.toFile(n,e,{errorCorrectionLevel:"L",margin:4,type:"png"}),n}async function t4(e,t){let n=await ex.toBuffer(e,{errorCorrectionLevel:"L",margin:0,type:"png",width:320}),r=t?await ex.toBuffer(`doubaoapp://local_debug?short_token=${t}`,{errorCorrectionLevel:"L",margin:0,type:"png",width:320}):void 0;return{legacy:n,...r?{modern:r}:{}}}function t5(e=eT().tmpdir()){let t;try{t=eE().readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of t)if(/^dbx-real-device-qr-.*\.(?:png|svg)$/i.test(n.name)&&(n.isFile()||n.isSymbolicLink()))try{eE().unlinkSync(eS().join(e,n.name))}catch{}}async function t3(e,t,n,r=process.stderr,o){let i,s,a;if(n){let t=await t2(e,n);ne(r,`二维码图片已导出至:${t}`)}let{legacy:d,modern:l}=await t4(e,o),c=eb().randomBytes(18).toString("hex"),u=`/${c}/`,p=new Set,h=!1,f=new Promise(e=>{s=e}),m=()=>{clearTimeout(i),i=void 0,h||s()},g=(0,eI.createServer)((e,t)=>{let n=e.url?.split("?",1)[0];if(t.setHeader("Cache-Control","no-store, no-cache, must-revalidate, max-age=0"),t.setHeader("Expires","0"),t.setHeader("Pragma","no-cache"),"GET"===e.method&&n===u){var r;t.writeHead(200,{"Content-Security-Policy":"default-src 'none'; img-src 'self'; connect-src 'self'; script-src 'unsafe-inline'; style-src 'unsafe-inline'","Content-Type":"text/html; charset=utf-8"}),t.end((r=!!l,`<!doctype html>
15
15
  <html lang="zh-CN">
16
16
  <head>
17
17
  <meta charset="utf-8">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doubao-dev/cli",
3
- "version": "0.0.34",
3
+ "version": "0.0.35",
4
4
  "description": "Doubao Dev CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,7 +29,6 @@
29
29
  "@rspack/resolver": "0.2.8",
30
30
  "better-opn": "3.0.2",
31
31
  "core-js": "3.47.0",
32
- "inquirer-search-list": "^1.2.6",
33
32
  "jest-worker": "27.5.1",
34
33
  "jiti": "^2.7.0",
35
34
  "less": "4.6.7",
@@ -46,7 +45,7 @@
46
45
  "node-loader": "2.1.0",
47
46
  "rimraf": "5.0.10",
48
47
  "typescript": "6.0.3",
49
- "@byted-doubao-apps/cli": "0.0.34"
48
+ "@byted-doubao-apps/cli": "0.0.35"
50
49
  },
51
50
  "optionalDependencies": {
52
51
  "@doubao-dev/security-tasm": "0.0.22",