@midscene/ios 1.9.8 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/cli.mjs +7 -7
- package/dist/es/index.mjs +6 -6
- package/dist/lib/cli.js +7 -7
- package/dist/lib/index.js +6 -6
- package/dist/types/index.d.ts +4 -4
- package/package.json +5 -10
- package/static/index.html +1 -1
- package/static/static/js/index.9c67d55f.js +951 -0
- package/static/static/js/index.9c67d55f.js.map +1 -0
- package/dist/es/mcp-server.mjs +0 -1485
- package/dist/lib/mcp-server.js +0 -1535
- package/dist/types/mcp-server.d.ts +0 -251
- package/static/static/js/index.44b83907.js +0 -948
- package/static/static/js/index.44b83907.js.map +0 -1
- /package/static/static/js/{index.44b83907.js.LICENSE.txt → index.9c67d55f.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,951 @@
|
|
|
1
|
+
/*! For license information please see index.9c67d55f.js.LICENSE.txt */
|
|
2
|
+
(()=>{var e,t,r,n,i,o,a,s={5902(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=5902,e.exports=t},5845(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=5845,e.exports=t},5737(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=5737,e.exports=t},8541(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=8541,e.exports=t},9998(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=9998,e.exports=t},3348(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=3348,e.exports=t},8817(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=8817,e.exports=t},1560(e){function t(e){return Promise.resolve().then(function(){var t=Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t})}t.keys=()=>[],t.resolve=t,t.id=1560,e.exports=t},1665(e,t,r){"use strict";let n;var i,o=r(5723),a=r(2155),s=r(8997);let A=e=>{let{hideLogo:t=!1}=e,{isDarkMode:r}=function(){let[e,t]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{let e=()=>{var e;t("dark"===(null==(e=document.querySelector("[data-theme]"))?void 0:e.getAttribute("data-theme")))};e();let r=new MutationObserver(e),n=document.querySelector("[data-theme]")||document.documentElement;return r.observe(n,{attributes:!0,attributeFilter:["data-theme"]}),()=>r.disconnect()},[]),{isDarkMode:e}}();return t?null:(0,o.jsx)("div",{className:"logo",children:(0,o.jsx)("a",{href:"https://midscenejs.com/",target:"_blank",rel:"noreferrer",children:(0,o.jsx)("img",{alt:"Midscene_logo",src:r?"https://lf3-static.bytednsdoc.com/obj/eden-cn/nupipfups/Midscene/midscene_with_text_dark.png":"https://lf3-static.bytednsdoc.com/obj/eden-cn/nupipfups/Midscene/midscene_with_text_light.png"})})})};var l=r(4177),c=r(6766),u=r(6419),d=r(8594),p=r(2651),h=r(9488),f=r(8928),g=r(5584),m=r(4174),y=r(6620),v=r(8926),b={};b.d=(e,t)=>{for(var r in t)b.o(t,r)&&!b.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},b.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var w={};b.r(w),b.d(w,{create:()=>v.vt});let{create:E}=w,k="midscene-auto-zoom",x="midscene-background-visible",S="midscene-elements-visible",C="midscene-model-call-details",I="midscene-dark-mode",j="midscene-playback-speed",O="midscene-subtitle-enabled",P=e=>{if("undefined"==typeof window)return;var t=new URLSearchParams(window.location.search).get(e);if(null===t)return;let r=t.trim().toLowerCase();return!!["1","true","yes","on"].includes(r)||!["0","false","no","off"].includes(r)&&void 0},R=E(e=>{let t="false"!==localStorage.getItem(k),r="false"!==localStorage.getItem(x),n="false"!==localStorage.getItem(S),i="true"===localStorage.getItem(C),o="true"===localStorage.getItem(I),a=Number.parseFloat(localStorage.getItem(j)||"1"),s=Number.isNaN(a)?1:a,A="false"!==localStorage.getItem(O),l=P("focusOnCursor"),c=P("showElementMarkers"),u=P("darkMode"),d=void 0===u?o:u;return void 0!==u&&localStorage.setItem(I,d.toString()),{backgroundVisible:r,elementsVisible:void 0===c?n:c,autoZoom:void 0===l?t:l,modelCallDetailsEnabled:i,darkModeEnabled:d,playbackSpeed:[.5,1,1.5,2].includes(s)?s:1,setBackgroundVisible:t=>{e({backgroundVisible:t}),localStorage.setItem(x,t.toString())},setElementsVisible:t=>{e({elementsVisible:t}),localStorage.setItem(S,t.toString())},setAutoZoom:t=>{e({autoZoom:t}),localStorage.setItem(k,t.toString())},setModelCallDetailsEnabled:t=>{e({modelCallDetailsEnabled:t}),localStorage.setItem(C,t.toString())},setDarkModeEnabled:t=>{e({darkModeEnabled:t}),localStorage.setItem(I,t.toString())},setPlaybackSpeed:t=>{e({playbackSpeed:t}),localStorage.setItem(j,t.toString())},subtitleEnabled:A,setSubtitleEnabled:t=>{e({subtitleEnabled:t}),localStorage.setItem(O,t.toString())}}}),T="midscene-env-config",N="midscene-service-mode",M="midscene-tracking-active-tab",D="midscene-deep-locate",z="midscene-deep-think",B="midscene-screenshot-included",L="midscene-dom-included",U="midscene-ime-strategy",K="midscene-auto-dismiss-keyboard",F="midscene-keyboard-dismiss-strategy",Z="midscene-always-refresh-screen-info",Q=()=>localStorage.getItem(T)||"",J=e=>{let t=e.split("\n"),r={};return t.forEach(e=>{let t=e.trim();if(t.startsWith("#"))return;let n=t.replace(/^export\s+/i,"").replace(/;$/,"").trim().match(/^(\w+)\s*=\s*(.*)$/);if(n){let[,e,t]=n,i=t.trim();(i.startsWith("'")&&i.endsWith("'")||i.startsWith('"')&&i.endsWith('"'))&&(i=i.slice(1,-1)),r[e]=i}}),r},X=E((e,t)=>{let r=Q(),n=J(r),i=window.location.href.startsWith("chrome-extension"),o=localStorage.getItem(N),a="false"!==localStorage.getItem(M),s="true"===localStorage.getItem(D),A=localStorage.getItem(z),l="false"!==localStorage.getItem(B),c=localStorage.getItem(L)||"false";return{serviceMode:i?"In-Browser-Extension":o||"Server",setServiceMode:t=>{if(i)throw Error("serviceMode cannot be set in extension");e({serviceMode:t}),localStorage.setItem(N,t)},config:n,configString:r,setConfig:t=>e({config:t}),loadConfig:t=>{e({config:J(t),configString:t}),localStorage.setItem(T,t)},syncFromStorage:()=>{let t=Q();e({config:J(t),configString:t})},forceSameTabNavigation:a,setForceSameTabNavigation:t=>{e({forceSameTabNavigation:t}),localStorage.setItem(M,t.toString())},deepLocate:s,setDeepLocate:t=>{e({deepLocate:t}),localStorage.setItem(D,t.toString())},deepThink:"true"===A||"false"!==A&&"unset",setDeepThink:t=>{e({deepThink:t}),localStorage.setItem(z,t.toString())},screenshotIncluded:l,setScreenshotIncluded:t=>{e({screenshotIncluded:t}),localStorage.setItem(B,t.toString())},domIncluded:"visible-only"===c?"visible-only":"true"===c,setDomIncluded:t=>{e({domIncluded:t}),localStorage.setItem(L,t.toString())},popupTab:"playground",setPopupTab:t=>{e({popupTab:t})},imeStrategy:localStorage.getItem(U)||"yadb-for-non-ascii",setImeStrategy:t=>{e({imeStrategy:t}),localStorage.setItem(U,t)},autoDismissKeyboard:"false"!==localStorage.getItem(K),setAutoDismissKeyboard:t=>{e({autoDismissKeyboard:t}),localStorage.setItem(K,t.toString())},keyboardDismissStrategy:localStorage.getItem(F)||"esc-first",setKeyboardDismissStrategy:t=>{e({keyboardDismissStrategy:t}),localStorage.setItem(F,t)},alwaysRefreshScreenInfo:"true"===localStorage.getItem(Z),setAlwaysRefreshScreenInfo:t=>{e({alwaysRefreshScreenInfo:t}),localStorage.setItem(Z,t.toString())}}});var H=r(3819);function G(e){var t,r,n;let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};H.Ay.error({message:null!=(t=i.title)?t:"Something went wrong",description:null!=(r=i.description)?r:function(e){if("string"==typeof e)return e;if(e instanceof Error)return e.message||e.toString();if(e&&"object"==typeof e&&"message"in e){let t=e.message;if("string"==typeof t)return t}try{return JSON.stringify(e)}catch(t){return String(e)}}(e),placement:"bottomRight",duration:null!=(n=i.duration)?n:5})}function q(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function W(e){let{showTooltipWhenEmpty:t=!0,showModelName:r=!0,tooltipPlacement:n="bottom",mode:i="icon",playgroundSDK:s}=e,{message:A}=p.A.useApp(),{config:l,configString:c,loadConfig:u,syncFromStorage:v}=X(),[b,w]=(0,a.useState)(!1),[E,k]=(0,a.useState)(c),[x,S]=(0,a.useState)(null),[C,I]=(0,a.useState)(!1),j=l.MIDSCENE_MODEL_NAME,O=!!(null==s?void 0:s.runConnectivityTest)&&!!(null==s?void 0:s.overrideConfig),P=(0,a.useRef)(null),R=(0,a.useRef)(null),T=()=>{null!==R.current&&(window.clearTimeout(R.current),R.current=null)},N=e=>{v(),T(),w(!0),e.preventDefault(),e.stopPropagation()},M=()=>{T(),w(!1),u(E)};return(0,a.useEffect)(()=>{b&&(k(c),S(null))},[b,c]),(0,a.useEffect)(()=>()=>{T()},[]),(0,o.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",gap:"10px",alignItems:"center",height:"100%",minHeight:"32px"},ref:P,children:[r?j:null,(0,o.jsx)(h.A,{title:"Please set up your environment variables before using.",placement:n,align:{offset:[-10,5]},getPopupContainer:()=>P.current,open:!b&&(t?0===Object.keys(l).length:void 0),children:"icon"===i?(0,o.jsx)(d.A,{onClick:N}):(0,o.jsx)("span",{onClick:N,style:{color:"#006AFF",cursor:"pointer"},children:"set up"})}),(0,o.jsxs)(f.A,{title:"Model Env Config",open:b,onOk:M,onCancel:()=>{T(),w(!1)},footer:(0,o.jsxs)("div",{style:{display:"flex",justifyContent:"flex-end",alignItems:"center",gap:8},children:[O?(0,o.jsx)(g.Ay,{type:"primary",ghost:!0,loading:C,onClick:()=>{var e;return(e=function*(){if((null==s?void 0:s.overrideConfig)&&(null==s?void 0:s.runConnectivityTest))try{I(!0),S(null),u(E);let e=X.getState().config;yield s.overrideConfig(e);let t=yield s.runConnectivityTest();S(t),t.passed?(A.success("Model verification passed"),T(),R.current=window.setTimeout(()=>{w(!1),R.current=null},2e3)):A.warning("Model verification found issues")}catch(t){let e=t instanceof Error?t.message:String(t);G(t,{title:"Model verification failed"}),S({passed:!1,checks:[{name:"text",intent:"default",modelName:X.getState().config.MIDSCENE_MODEL_NAME||"",modelFamily:void 0,passed:!1,durationMs:0,message:e}]})}finally{I(!1)}},function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){q(o,n,i,a,s,"next",e)}function s(e){q(o,n,i,a,s,"throw",e)}a(void 0)})})()},children:"Save and Verify Model"},"save-and-run"):null,(0,o.jsx)(g.Ay,{type:"primary",onClick:M,children:"Save"},"save")]}),style:{width:"800px",height:"100%",marginTop:"10%"},destroyOnClose:!0,maskClosable:!0,centered:!0,children:[(0,o.jsx)(m.A.TextArea,{rows:7,placeholder:"MIDSCENE_MODEL_API_KEY=sk-...\nMIDSCENE_MODEL_NAME=gpt-4o-2024-08-06\n...",value:E,onChange:e=>k(e.target.value),style:{whiteSpace:"nowrap",wordWrap:"break-word"}}),(0,o.jsxs)("div",{children:[(0,o.jsx)("p",{children:"The format is KEY=VALUE and separated by new lines."}),(0,o.jsxs)("p",{children:["These data will be saved ",(0,o.jsx)("strong",{children:"locally in your browser"}),"."]})]}),x?(0,o.jsx)(y.A,{type:x.passed?"success":"warning",showIcon:!0,message:x.passed?"Model verification passed":"Model verification failed",description:(0,o.jsx)("div",{children:x.checks.map(e=>(0,o.jsxs)("div",{children:[e.modelName," (",e.intent,"):"," ",e.passed?"OK.":`Failed.${e.message?` ${e.message}`:""}`]},e.name))}),style:{marginTop:16}}):null]})]})}function V(e){let{showEnvConfig:t=!0,showTooltipWhenEmpty:r=!1,showModelName:n=!1,githubUrl:i="https://github.com/web-infra-dev/midscene",helpUrl:a="https://midscenejs.com/quick-experience.html",className:s="",playgroundSDK:A}=e;return(0,o.jsxs)("div",{className:`nav-actions ${s}`,children:[(0,o.jsx)(u.A.Link,{href:i,target:"_blank",children:(0,o.jsx)(l.A,{className:"nav-icon"})}),(0,o.jsx)(u.A.Link,{href:a,target:"_blank",children:(0,o.jsx)(c.A,{className:"nav-icon"})}),t&&(0,o.jsx)(W,{showTooltipWhenEmpty:r,showModelName:n,playgroundSDK:A})]})}var Y=r(6453),_=r(4458);let $=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:24,height:24,fill:"none",viewBox:"0 0 24 24"},e),r=r={children:[(0,o.jsx)("path",{stroke:"#6D6D6D",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M22 9.483A14.53 14.53 0 0 0 9.75 5.674M19 12.9a9.85 9.85 0 0 0-4.75-2.642M5 12.9a10 10 0 0 1 2.18-1.65M8 16.157a5.63 5.63 0 0 1 2.5-1.455"}),(0,o.jsx)("path",{fill:"#6D6D6D",fillRule:"evenodd",d:"M12 20a1.25 1.25 0 1 0 0-2.5 1.25 1.25 0 0 0 0 2.5",clipRule:"evenodd"}),(0,o.jsx)("path",{stroke:"#6D6D6D",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M20 20 4 4M2 9.483a15 15 0 0 1 1.75-1.42"})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))};function ee(e){let{title:t="Connect to a device"}=e;return(0,o.jsx)("div",{style:{display:"flex",height:"100%",width:"100%",alignItems:"center",justifyContent:"center"},children:(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",gap:4},children:[(0,o.jsx)($,{"aria-hidden":"true",style:{width:24,height:24,objectFit:"contain"}}),(0,o.jsx)("h2",{style:{margin:0,whiteSpace:"nowrap",textAlign:"center",fontSize:13,lineHeight:"24px",fontWeight:400,color:"rgba(0, 0, 0, 0.85)"},children:t})]})})}var et=r(1352),er=r(955),en=r(6921);function ei(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function eo(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){ei(o,n,i,a,s,"next",e)}function s(e){ei(o,n,i,a,s,"throw",e)}a(void 0)})}}function ea(e){let{getScreenshot:t,getInterfaceInfo:r,serverOnline:n,isUserOperating:i=!1,mjpegUrl:s,mode:A="default",contentRef:l}=e,[c,u]=(0,a.useState)(null),[d,p]=(0,a.useState)(!1),[f,m]=(0,a.useState)(null),[y,v]=(0,a.useState)(0),[b,w]=(0,a.useState)(null),[E,k]=(0,a.useState)(()=>String(Date.now())),x=(0,a.useRef)(null),S=!!(s&&n),C=["screenshot-viewer","screen-only"===A&&"screen-only"].filter(Boolean).join(" "),I=(0,a.useRef)(null),j=(0,a.useRef)(!1);(0,a.useEffect)(()=>{if(!S)return;let e=window.setTimeout(()=>{let e=x.current;!e||e.naturalWidth>0||e.naturalHeight>0||k(String(Date.now()))},2500);return()=>window.clearTimeout(e)},[S,E,s]);let O=(0,a.useCallback)(function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return eo(function*(){if(n){p(!0),e&&m(null);try{let e=yield t();if(console.log("Screenshot API response:",e),null==e?void 0:e.screenshot){let t=e.screenshot.toString().trim();t?(u(t),m(null),v(Date.now())):m("Empty screenshot data received")}else m("No screenshot data in response")}catch(e){console.error("Screenshot fetch error:",e),m(e instanceof Error?e.message:"Failed to fetch screenshot")}finally{p(!1)}}})()},[t,n]),P=(0,a.useCallback)(()=>eo(function*(){if(n&&r)try{let e=yield r();e&&w(e)}catch(e){console.error("Interface info fetch error:",e)}})(),[r,n]),R=(0,a.useCallback)(()=>{I.current&&clearInterval(I.current),console.log("Starting screenshot polling (5s interval)"),I.current=setInterval(()=>{!j.current&&n&&O(!1)},5e3)},[O,n]),T=(0,a.useCallback)(()=>{I.current&&(console.log("Stopping screenshot polling"),clearInterval(I.current),I.current=null)},[]),N=(0,a.useCallback)(()=>{console.log("Pausing screenshot polling"),j.current=!0},[]),M=(0,a.useCallback)(()=>{console.log("Resuming screenshot polling"),j.current=!1},[]),D=(0,a.useCallback)(()=>{O(!0)},[O]);if((0,a.useEffect)(()=>{if(!n){u(null),m(null),w(null),T();return}return(P(),S)?void T():(O(!1),R(),()=>{T()})},[n,S,R,T,O,P]),(0,a.useEffect)(()=>{n&&!S&&(i?N():(M(),O(!1)))},[i,N,M,O,n,S]),(0,a.useEffect)(()=>()=>{T()},[T]),!n)return(0,o.jsx)("div",{className:`${C} offline`,children:(0,o.jsxs)("div",{className:"screenshot-placeholder",children:[(0,o.jsx)("h3",{children:"\uD83D\uDCF1 Screen Preview"}),(0,o.jsx)("p",{children:"Start the playground server to see real-time screenshots"})]})});if(!S&&d&&!c)return(0,o.jsxs)("div",{className:`${C} loading`,children:[(0,o.jsx)(en.A,{size:"large"}),(0,o.jsx)("p",{children:"Loading screenshot..."})]});if(!S&&f&&!c)return(0,o.jsx)("div",{className:`${C} error`,children:(0,o.jsxs)("div",{className:"screenshot-placeholder",children:[(0,o.jsx)("h3",{children:"\uD83D\uDCF1 Screen Preview"}),(0,o.jsx)("p",{className:"error-message",children:f})]})});let z=(0,o.jsx)("div",{className:"screenshot-content",ref:l,children:S?(0,o.jsx)("img",{ref:x,src:E?`${s}${(null==s?void 0:s.includes("?"))?"&":"?"}_mjpegRetry=${encodeURIComponent(E)}`:s,alt:"Device Live Stream",className:"screenshot-image",onError:()=>{window.setTimeout(()=>k(String(Date.now())),500)}},E||"initial"):c?(0,o.jsx)("img",{src:c.startsWith("data:image/")?c:`data:image/png;base64,${c}`,alt:"Device Screenshot",className:"screenshot-image",onLoad:()=>console.log("Screenshot image loaded successfully"),onError:e=>{console.error("Screenshot image load error:",e),console.error("Screenshot data preview:",c.substring(0,100)),m("Failed to load screenshot image")}}):(0,o.jsx)("div",{className:"screenshot-placeholder",children:(0,o.jsx)("p",{children:"No screenshot available"})})});return"screen-only"===A?(0,o.jsx)("div",{className:C,children:z}):(0,o.jsxs)("div",{className:C,children:[(0,o.jsx)("div",{className:"screenshot-header",children:(0,o.jsx)("div",{className:"screenshot-title",children:(0,o.jsx)("h3",{children:(null==b?void 0:b.type)?b.type:"Device Name"})})}),(0,o.jsxs)("div",{className:"screenshot-container",children:[(0,o.jsxs)("div",{className:"screenshot-overlay",children:[(0,o.jsxs)("div",{className:"device-name-overlay",children:["Device Name",(0,o.jsx)(h.A,{title:null==b?void 0:b.description,children:(0,o.jsx)(et.A,{size:16,className:"info-icon"})})]}),!S&&(0,o.jsxs)("div",{className:"screenshot-controls",children:[y>0&&(0,o.jsxs)("span",{className:"last-update-time",children:["Last updated ",(e=>{if(!e)return"";let t=Math.floor((Date.now()-e)/1e3);return t<60?`${t}s ago`:t<3600?`${Math.floor(t/60)}m ago`:new Date(e).toLocaleTimeString()})(y)]}),(0,o.jsx)(h.A,{title:"Refresh screenshot",children:(0,o.jsx)(g.Ay,{icon:(0,o.jsx)(er.A,{}),onClick:D,loading:d,size:"small"})}),i&&(0,o.jsxs)("span",{className:"operation-indicator",children:[(0,o.jsx)(en.A,{size:"small"})," Operating..."]})]})]}),z]})]})}var es=r(3393),eA=r(2397);let el=new Set(["Backspace","Delete","Enter","Tab","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End","PageUp","PageDown"]),ec=new Set(["Alt","Control","Meta","Shift"]);function eu(e,t){let r=t.width/t.height;if(e.height<=0||e.width<=0)return e;if(e.width/e.height>r){let t=e.height*r;return{left:e.left+(e.width-t)/2,top:e.top,width:t,height:e.height}}let n=e.width/r;return{left:e.left,top:e.top+(e.height-n)/2,width:e.width,height:n}}function ed(e){let{enabled:t,deviceSize:r,onTap:n,onSwipe:i,scrollEnabled:s=!1,onWheelScroll:A,keyboardEnabled:l=!1,onTextInput:c,onKeyboardPress:u,contentRef:d,tapMaxDistance:p=8,tapMaxDurationMs:h=250,style:f}=e,g=(0,a.useRef)(null),m=(0,a.useRef)(null),y=(0,a.useRef)(null),v=(0,a.useRef)(!1),b=(0,a.useRef)(!1),w=(0,a.useRef)(0),E=(0,a.useRef)(null),k=(0,a.useRef)(null),x=(0,a.useRef)(null),S=(0,a.useCallback)(()=>{if(l){b.current=!0;let e=m.current;e&&document.activeElement!==e&&e.focus({preventScroll:!0})}},[l]),C=(0,a.useCallback)((e,t)=>{l&&Promise.resolve(t).catch(()=>void 0).then(()=>{window.setTimeout(()=>{b.current&&w.current===e&&S()},0)})},[S,l]),I=(0,a.useCallback)((e,t)=>{let r=g.current,n=m.current;if(!r||!n)return;let i=r.getBoundingClientRect();n.style.left=`${Math.max(0,e-i.left)}px`,n.style.top=`${Math.max(0,t-i.top)}px`},[]),j=(0,a.useCallback)((e,t,n)=>{if(!r)return null;let i=(e-n.left)/n.width,o=(t-n.top)/n.height;return{x:Math.max(0,Math.min(r.width-1,Math.round(i*r.width))),y:Math.max(0,Math.min(r.height-1,Math.round(o*r.height)))}},[r]),O=(0,a.useCallback)(e=>{var n;if(!t||!r||!g.current||0!==e.button&&"mouse"===e.pointerType)return;let i=eu((null!=(n=null==d?void 0:d.current)?n:g.current).getBoundingClientRect(),r);if(e.clientX<i.left||e.clientX>i.left+i.width||e.clientY<i.top||e.clientY>i.top+i.height){b.current=!1;return}I(e.clientX,e.clientY);let o=w.current+1;w.current=o,S();try{g.current.setPointerCapture(e.pointerId)}catch(e){}y.current={startX:e.clientX,startY:e.clientY,startTime:performance.now(),contentRect:i,keyboardFocusRequestId:o},e.preventDefault()},[d,t,r,S,I]),P=(0,a.useCallback)((e,t)=>{let r=y.current;if(y.current=null,!r)return;try{var o;null==(o=g.current)||o.releasePointerCapture(e.pointerId)}catch(e){}if(t)return;let a=e.clientX-r.startX,s=e.clientY-r.startY,A=Math.sqrt(a*a+s*s),l=Math.max(0,performance.now()-r.startTime),c=j(r.startX,r.startY,r.contentRect),u=j(e.clientX,e.clientY,r.contentRect);c&&u&&(E.current=u,A<=p&&l<=h?C(r.keyboardFocusRequestId,null==n?void 0:n(c)):null==i||i(c,u,Math.round(l)))},[n,i,j,C,p,h]),R=(0,a.useCallback)(e=>P(e,!1),[P]),T=(0,a.useCallback)(e=>P(e,!0),[P]),N=(0,a.useCallback)(()=>{let e=k.current;k.current=null,x.current&&(clearTimeout(x.current),x.current=null),e&&(null==A||A(e.point,{deltaX:e.deltaX,deltaY:e.deltaY}))},[A]),M=(0,a.useCallback)(e=>{var n;if(!t||!s||!r||!g.current)return;let i=eu((null!=(n=null==d?void 0:d.current)?n:g.current).getBoundingClientRect(),r);if(e.clientX<i.left||e.clientX>i.left+i.width||e.clientY<i.top||e.clientY>i.top+i.height)return;let o=j(e.clientX,e.clientY,i);if(!o)return;e.preventDefault(),e.stopPropagation();let a=k.current;k.current={point:o,deltaX:((null==a?void 0:a.deltaX)||0)+e.deltaX,deltaY:((null==a?void 0:a.deltaY)||0)+e.deltaY},x.current&&clearTimeout(x.current),x.current=setTimeout(N,80)},[d,r,t,N,j,s]),D=(0,a.useCallback)(()=>{var e;(null==(e=m.current)?void 0:e.value)&&(m.current.value="")},[]),z=(0,a.useCallback)(e=>{var t;if(l&&b.current){if(!e.altKey&&(e.metaKey||e.ctrlKey)&&"c"===e.key.toLowerCase()&&function(e){let t=window.getSelection();if(!t||t.isCollapsed||!e)return!1;let{anchorNode:r,focusNode:n}=t;return!!r&&!!n&&!e.contains(r)&&!e.contains(n)}(g.current)){b.current=!1;return}if(!v.current&&!e.isComposing&&!function(e){if("F5"===e.key||"F11"===e.key||"F12"===e.key)return!0;if(!(e.metaKey||e.ctrlKey))return!1;let t=e.key.toLowerCase();return!!e.altKey&&"i"===t||!!e.shiftKey&&("i"===t||"j"===t)||new Set(["r","q","w","m","h","n","t","+","=","-","_","0"]).has(t)}(e)&&(el.has(e.key)||e.altKey||e.ctrlKey||e.metaKey)){let r=function(e){if(ec.has(e.key))return null;let t=[];return e.ctrlKey&&t.push("Control"),e.metaKey&&t.push("Meta"),e.altKey&&t.push("Alt"),e.shiftKey&&"Shift"!==e.key&&t.push("Shift"),t.push(" "===e.key?"Space":e.key),t.join("+")}(e);if(!r)return;e.preventDefault(),e.stopPropagation(),null==u||u(r,null!=(t=E.current)?t:void 0)}}},[l,u]),B=(0,a.useCallback)(e=>{var t;if(!l||!b.current)return;let r=e.clipboardData.getData("text");r&&(e.preventDefault(),e.stopPropagation(),null==c||c(r,null!=(t=E.current)?t:void 0))},[l,c]),L=(0,a.useCallback)(e=>{var t,r,n,i,o;if(!l||!b.current){v.current||D();return}if(v.current)return;let a=e.nativeEvent;if("insertLineBreak"===a.inputType){D(),e.preventDefault(),e.stopPropagation(),null==u||u("Enter",null!=(r=E.current)?r:void 0);return}if("deleteContentBackward"===a.inputType){D(),e.preventDefault(),e.stopPropagation(),null==u||u("Backspace",null!=(n=E.current)?n:void 0);return}if("deleteContentForward"===a.inputType){D(),e.preventDefault(),e.stopPropagation(),null==u||u("Delete",null!=(i=E.current)?i:void 0);return}let s=a.data||(null==(t=m.current)?void 0:t.value)||"";D(),s&&(e.preventDefault(),e.stopPropagation(),null==c||c(s,null!=(o=E.current)?o:void 0))},[D,l,u,c]);return((0,a.useEffect)(()=>{t||(y.current=null,k.current=null,x.current&&(clearTimeout(x.current),x.current=null),v.current=!1,b.current=!1,E.current=null)},[t]),(0,a.useEffect)(()=>{if(!t||!l){b.current=!1;return}let e=e=>{let t=g.current;t&&e.target instanceof Node&&t.contains(e.target)||(b.current=!1)};return window.addEventListener("keydown",z,!0),window.addEventListener("pointerdown",e,!0),()=>{window.removeEventListener("keydown",z,!0),window.removeEventListener("pointerdown",e,!0)}},[t,z,l]),(0,a.useEffect)(()=>()=>{x.current&&(clearTimeout(x.current),x.current=null)},[]),t&&r)?(0,o.jsx)("div",{ref:g,onPointerDown:O,onPointerUp:R,onPointerCancel:T,onWheel:M,onContextMenu:e=>e.preventDefault(),"data-midscene-device-interaction-layer":"true",style:function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({position:"absolute",inset:0,zIndex:5,cursor:l?"default":"crosshair",outline:"none",color:"transparent",caretColor:"transparent",touchAction:"none",userSelect:"none"},f),children:l?(0,o.jsx)("textarea",{ref:m,"data-midscene-keyboard-sink":"true",tabIndex:-1,onPaste:B,onCompositionStart:()=>{b.current=!0,v.current=!0},onCompositionEnd:e=>{var t,r;if(!l||!b.current)return;v.current=!1;let n=e.data||(null==(t=m.current)?void 0:t.value)||"";D(),n&&(null==c||c(n,null!=(r=E.current)?r:void 0))},onInput:L,style:{position:"absolute",left:0,top:0,width:32,height:24,opacity:0,pointerEvents:"none",appearance:"none",boxShadow:"none",overflow:"hidden",resize:"none",border:0,padding:0,margin:0,outline:"none",background:"transparent",color:"transparent",caretColor:"transparent",fontSize:16,lineHeight:"20px",transform:"translate(-50%, -50%)"}}):null}):null}var ep=r(4093),eh=r(6418),ef=r(4452),eg=r(2644);function em(){return"Preparing Android device connection…"}function ey(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function ev(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){ey(o,n,i,a,s,"next",e)}function s(e){ey(o,n,i,a,s,"throw",e)}a(void 0)})}}function eb(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}let{Text:ew}=u.A;function eE(e){let{connectingOverlay:t,deviceId:r,onIntrinsicSize:n,onStatusChange:i,renderErrorOverlay:s,serverUrl:A,metadataTimeoutMs:l=55e3,reconnectInterval:c=3e3,viewportStyle:u,contentRef:d}=e,p=(0,a.useRef)(null),h=(0,a.useRef)(null),f=(0,a.useRef)(null),g=(0,a.useRef)(null),m=(0,a.useRef)(null),v=(0,a.useRef)(!1),[b,w]=(0,a.useState)("connecting"),[E,k]=(0,a.useState)(null),[x,S]=(0,a.useState)(()=>em()),[C,I]=(0,a.useState)(!0),[j,O]=(0,a.useState)(0),P=(0,a.useMemo)(()=>(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:em();switch(e){case"connected":return"Live scrcpy preview connected";case"waiting-for-stream":return t;case"error":return"Unable to start scrcpy preview";case"disconnected":return"scrcpy preview disconnected, retrying…";default:return"Connecting to scrcpy preview server…"}})(b,x),[b,x]),R=("error"===b||"disconnected"===b)&&!!s,T=(0,a.useCallback)(()=>{w("connecting"),k(null),S(em()),O(e=>e+1)},[]);(0,a.useEffect)(()=>{null==i||i(b,P)},[i,b,P]);let N=()=>{let e=p.current;e&&e.replaceChildren()},M=()=>{f.current&&(f.current.dispose(),f.current=null)},D=()=>{g.current&&(clearTimeout(g.current),g.current=null)};return(0,a.useEffect)(()=>{if(!A){w("error"),k("scrcpy preview metadata is missing a server URL.");return}if(!es.p.isSupported){I(!1),w("error"),k("Current browser does not support WebCodecs, so live scrcpy preview is unavailable.");return}let e=!1,t=null,i=()=>{t&&(clearTimeout(t),t=null),D(),m.current&&(clearTimeout(m.current),m.current=null),h.current&&(h.current.disconnect(),h.current=null),M(),N(),null==n||n(null)},o=()=>{e||m.current||(m.current=setTimeout(()=>{m.current=null,i(),a()},c))},a=()=>{let t,i,a,s;if(e)return;v.current=!1,w("connecting"),k(null),S(em());let c=(0,eg.io)(A,{withCredentials:!0,reconnection:!1,timeout:1e4,transports:["websocket"]});h.current=c;let u=(i=!1,a=[],s=new TransformStream({transform(e,t){if("configuration"===e.type){i=!0,t.enqueue(e),a.forEach(e=>t.enqueue(e)),a=[];return}"data"!==e.type||i?t.enqueue(e):a.push(e)}}),new ReadableStream({start(e){let r=t=>{try{var r;let n=(r=t.data)instanceof Uint8Array?r:r instanceof ArrayBuffer?new Uint8Array(r):new Uint8Array(r.buffer,r.byteOffset,r.byteLength);if("configuration"===t.type)return void e.enqueue({type:"configuration",data:n});e.enqueue({type:"data",data:n,keyframe:t.keyFrame})}catch(t){e.error(t)}},n=()=>e.close(),i=t=>e.error(t);t=()=>{c.off("video-data",r),c.off("disconnect",n),c.off("error",i)},c.on("video-data",r),c.on("disconnect",n),c.on("error",i)},cancel(){null==t||t()}}).pipeThrough(s));c.on("connect",()=>{var t,n;w("waiting-for-stream"),S(em()),D(),g.current=setTimeout(()=>{e||(v.current=!0,w("error"),k(function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:55e3,t=Math.max(1,Math.round(e/1e3));return`Timed out waiting ${t}s for scrcpy video stream metadata.`}(l)),S(em()),c.disconnect(),h.current=null,o())},l),c.emit("connect-device",(t=eb({},"string"==typeof r&&r.trim()?{deviceId:r.trim()}:{}),n=n={maxSize:1024},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}),t))}),c.on("preview-status",t=>{var r;!e&&"object"==typeof(r=t)&&null!==r&&"message"in r&&"string"==typeof r.message&&(w("waiting-for-stream"),S(t.message))}),c.on("video-metadata",t=>ev(function*(){try{D(),M(),S("Starting video decoder…"),"number"==typeof t.width&&t.width>0&&"number"==typeof t.height&&t.height>0&&(null==n||n({width:t.width,height:t.height}));let r=t.codec?t.codec:ep.n.H264,i=yield ev(function*(){var e;let t=eh.p.isSupported?new eh.p:new ef.x,n=t.canvas;return n.style.width="100%",n.style.height="100%",n.style.objectFit="contain",N(),null==(e=p.current)||e.appendChild(n),new es.p({codec:r,renderer:t})})();f.current=i,u.pipeTo(i.writable).catch(t=>{e||(w("error"),k(t.message),o())}),S(em()),w("connected")}catch(t){if(e)return;w("error"),k(t instanceof Error?t.message:"Failed to start decoder."),S(em()),o()}})()),c.on("disconnect",()=>{if(D(),!e){if(v.current){v.current=!1;return}w("disconnected"),k(null),S(em()),o()}}),c.on("connect_error",t=>{D(),e||(w("error"),k(t.message),S(em()),o())}),c.on("error",t=>{D(),e||(w("error"),k(t.message),S(em()),o())})};return t=setTimeout(()=>{t=null,a()},0),()=>{e=!0,i()}},[r,l,c,j,A]),(0,o.jsxs)("div",{style:{height:"100%",display:"flex",flexDirection:"column"},children:[E&&!R?(0,o.jsx)(y.A,{type:"warning",showIcon:!0,style:{marginBottom:12},message:P,description:E}):null,(0,o.jsxs)("div",{ref:d,style:eb({position:"relative",flex:1,minHeight:0,display:"flex",alignItems:"center",justifyContent:"center",background:"#111827",borderRadius:8,overflow:"hidden"},u),children:[(0,o.jsx)("div",{ref:p,style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center"}}),"connected"!==b?R&&s?(0,o.jsx)("div",{style:{position:"absolute",inset:0,zIndex:1},children:s({errorMessage:E,retry:T,status:b,statusText:P})}):"error"!==b&&"disconnected"!==b&&t?(0,o.jsx)("div",{style:{position:"absolute",inset:0,zIndex:1},children:t}):(0,o.jsxs)("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:12,color:"#fff",background:"rgba(17, 24, 39, 0.78)",textAlign:"center",padding:24,zIndex:1},children:["error"===b?null:(0,o.jsx)(en.A,{spinning:!0}),(0,o.jsx)(ew,{style:{color:"#fff"},children:P}),"error"===b?(0,o.jsx)(ew,{style:{color:"#d1d5db"},children:"Scrcpy preview will retry automatically."}):null,!C&&(0,o.jsx)(ew,{style:{color:"#d1d5db"},children:"Please use a modern Chromium browser to view the stream."})]}):null]})]})}let ek=["android","ios","web","harmony","computer"],ex=["countdown-before-run"];function eS(e,t){var r;for(let t of[null==e?void 0:e.platformId,null==e||null==(r=e.interface)?void 0:r.type].filter(e=>!!e)){let e=t.toLowerCase();if(ek.includes(e))return e}return t}function eC(e){return((null==e?void 0:e.executionUxHints)||[]).filter(e=>ex.includes(e))}function eI(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function ej(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){eI(o,n,i,a,s,"next",e)}function s(e){eI(o,n,i,a,s,"throw",e)}a(void 0)})}}function eO(e){var t,r;let{connectingOverlay:n,onDeviceSizeChange:i,onScrcpyStatusChange:s,renderErrorOverlay:A,scrcpyViewportStyle:l,screenshotViewerMode:c,playgroundSDK:u,runtimeInfo:d,serverUrl:h,serverOnline:f,isUserOperating:g}=e,{message:m}=p.A.useApp(),v=function(e,t){let r=null==e?void 0:e.preview;if(!r||"none"===r.kind||"custom"===r.kind)return{type:"none"};let n=t||"undefined"!=typeof window&&window.location.origin||"";if("mjpeg"===r.kind){let e=r.mjpegPath||"/mjpeg";return n?{type:"mjpeg",mjpegUrl:new URL(e,`${n}/`).toString()}:{type:"screenshot"}}if("scrcpy"===r.kind){var i,o;let t,a="string"==typeof(null==e||null==(i=e.metadata)?void 0:i.deviceId)?e.metadata.deviceId.trim():void 0;if("string"==typeof a&&/^\d+\.\d+\.\d+\.\d+:\d+$/.test(a))return{type:"screenshot"};let s=Number(null==(o=r.custom)?void 0:o.scrcpyPort),A=Number.isFinite(s)?s:void 0,l=A&&n?((t=new URL(n)).port=String(A),t.pathname="/",t.search="",t.hash="",t.toString()):void 0;return{deviceId:a,type:"scrcpy",scrcpyPort:A,scrcpyUrl:l}}return{type:"screenshot"}}(d,h),[b,w]=(0,a.useState)(null),[E,k]=(0,a.useState)(null),[x,S]=(0,a.useState)(null),[C,I]=(0,a.useState)("connecting"),j=(0,a.useRef)(Promise.resolve()),O=(0,a.useRef)(""),P=(0,a.useRef)(null),R=(0,a.useRef)(null),T=(0,a.useRef)(null),N=(0,a.useRef)(null),M=null!=(t=null==x?void 0:x.includes("Tap"))&&t,D=(null==x?void 0:x.includes("Swipe"))?"Swipe":"DragAndDrop",z=(null==x?void 0:x.includes("KeyboardPress"))||(null==x?void 0:x.includes("Input"))||!1,B=null!=(r=null==x?void 0:x.includes("Scroll"))&&r,L=(0,a.useCallback)(e=>{let t=j.current.then(e,e);return j.current=t.catch(()=>void 0),t},[m]);(0,a.useEffect)(()=>{if(!f){w(null),S(null);return}let e=!1,t=()=>ej(function*(){var t;let r;try{r=yield u.getInterfaceInfo()}catch(e){return}if(e)return;if((null==r||null==(t=r.size)?void 0:t.width)&&r.size.height){let{size:e}=r;w(t=>t&&t.width===e.width&&t.height===e.height?t:{width:e.width,height:e.height})}let n=Array.isArray(null==r?void 0:r.actionTypes)?r.actionTypes:null;S(e=>null===e&&null===n||e&&n&&e.length===n.length&&e.every((e,t)=>e===n[t])?e:n)})();t();let r=setInterval(t,5e3);return()=>{e=!0,clearInterval(r)}},[u,f]),(0,a.useEffect)(()=>{null==i||i(null!=E?E:b)},[b,i,E]);let U="scrcpy"===v.type&&es.p.isSupported,K="screenshot"===v.type||"scrcpy"===v.type&&!U,F="scrcpy"===v.type&&!es.p.isSupported&&function(){try{let{protocol:e,hostname:t}=window.location;if("http:"!==e)return!1;return"localhost"!==t&&"127.0.0.1"!==t&&"::1"!==t}catch(e){return!1}}(),Z="none"!==v.type&&(!U||"connected"===C),Q=(0,a.useCallback)((e,t)=>{m.open({type:"error",content:t||e,key:"manual-control-error"})},[]),J=(0,a.useCallback)(()=>{R.current&&(clearTimeout(R.current),R.current=null)},[]),X=(0,a.useCallback)(()=>{var e,t;J();let r=O.current,n=P.current;if(!r)return null!=(e=T.current)?e:Promise.resolve();O.current="",P.current=null;let i=(null!=(t=T.current)?t:Promise.resolve()).catch(()=>void 0).then(()=>ej(function*(){let e=yield L(()=>u.interact(function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({actionType:"Input",value:r,mode:"typeOnly"},n?{x:n.x,y:n.y}:{})));e.ok||Q("Input failed",e.error)})()).finally(()=>{T.current===i&&(T.current=null)});return T.current=i,T.current},[J,L,u,Q]),H=(0,a.useCallback)(e=>ej(function*(){yield X();let t=yield L(()=>u.interact({actionType:"Tap",x:e.x,y:e.y}));t.ok||Q("Tap failed",t.error)})(),[L,X,u,Q]),G=(0,a.useCallback)((e,t,r)=>ej(function*(){yield X();let n=yield L(()=>{var n,i,o,a,s,A;let l;return u.interact((n=D,i=e,o=t,a=r,l={actionType:n,x:i.x,y:i.y,endX:o.x,endY:o.y},"DragAndDrop"===n?l:(s=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({},l),A=A={duration:a},Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(A)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(A)).forEach(function(e){Object.defineProperty(s,e,Object.getOwnPropertyDescriptor(A,e))}),s)))});n.ok||Q(`${D} failed`,n.error)})(),[L,X,D,u,Q]),q=(0,a.useCallback)((e,t)=>{e&&(O.current+=e,t&&(P.current=t),J(),R.current=setTimeout(()=>{X()},120))},[J,X]);(0,a.useEffect)(()=>{f&&Z&&z||(J(),O.current="",P.current=null)},[J,z,Z,f]),(0,a.useEffect)(()=>()=>{f&&Z&&z&&O.current?X():(J(),P.current=null)},[J,X,z,v.type,Z,d,f,h]);let W=(0,a.useCallback)(e=>ej(function*(){if(!e)return;yield X();let t=yield L(()=>u.interact({actionType:"KeyboardPress",keyName:e}));t.ok||Q("Keyboard press failed",t.error)})(),[L,X,u,Q]),V=(0,a.useCallback)((e,t)=>ej(function*(){yield X();let r=yield L(()=>{let r,n,i;return u.interact((n=(r=Math.abs(t.deltaY)>=Math.abs(t.deltaX))?Math.abs(t.deltaY):Math.abs(t.deltaX),i=r?t.deltaY>=0?"down":"up":t.deltaX>=0?"right":"left",{actionType:"Scroll",x:e.x,y:e.y,scrollType:"singleAction",direction:i,distance:Math.max(1,Math.round(n))}))});r.ok||Q("Scroll failed",r.error)})(),[L,X,u,Q]),Y=(0,a.useCallback)((e,t)=>{I(e),null==s||s(e,t)},[s]);return(0,o.jsxs)("div",{style:{flex:1,minHeight:0,height:"100%",position:"relative"},children:[F&&(0,o.jsx)(eA.A,{content:(0,o.jsxs)("div",{style:{maxWidth:360},children:[(0,o.jsx)("p",{style:{margin:"0 0 8px"},children:"Live scrcpy streaming is unavailable because WebCodecs API is disabled in non-secure (HTTP) contexts with non-localhost addresses."}),(0,o.jsx)("p",{style:{margin:"0 0 8px"},children:"Currently using screenshot polling as fallback. To enable scrcpy streaming:"}),(0,o.jsxs)("ol",{style:{margin:0,paddingLeft:18},children:[(0,o.jsxs)("li",{children:["Open"," ",(0,o.jsx)("code",{children:"chrome://flags/#unsafely-treat-insecure-origin-as-secure"})]}),(0,o.jsxs)("li",{children:["Add ",(0,o.jsx)("code",{children:window.location.origin})]}),(0,o.jsxs)("li",{children:["Set to ",(0,o.jsx)("b",{children:"Enabled"})," and relaunch Chrome"]})]})]}),title:"Screenshot polling mode",trigger:"click",placement:"bottomRight",children:(0,o.jsx)("button",{type:"button",style:{position:"absolute",top:8,right:8,zIndex:10,background:"#faad14",border:"none",borderRadius:"50%",width:28,height:28,display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",boxShadow:"0 2px 6px rgba(0,0,0,0.2)"},children:(0,o.jsx)("span",{style:{color:"#fff",fontSize:14,fontWeight:"bold",lineHeight:1},children:"!"})})}),"none"===v.type?(0,o.jsx)(y.A,{type:"warning",showIcon:!0,message:"Preview unavailable",description:"This session did not expose a preview capability in runtime metadata."}):U?(0,o.jsx)(eE,{connectingOverlay:n,deviceId:v.deviceId,onIntrinsicSize:k,onStatusChange:Y,renderErrorOverlay:A,serverUrl:v.scrcpyUrl,viewportStyle:l,contentRef:N}):(0,o.jsx)(ea,{getScreenshot:()=>K?u.getScreenshot():Promise.resolve(null),getInterfaceInfo:()=>u.getInterfaceInfo(),serverOnline:f,isUserOperating:g,mjpegUrl:v.mjpegUrl,mode:null!=c?c:"screen-only",contentRef:N}),(0,o.jsx)(ed,{enabled:M&&f&&Z,deviceSize:b,contentRef:N,onTap:H,onSwipe:G,scrollEnabled:B,onWheelScroll:V,keyboardEnabled:z,onTextInput:q,onKeyboardPress:W})]})}function eP(e){return(0,o.jsx)(eO,function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({},e))}var eR=r(2770);function eT(e){let{children:t}=e;return(0,o.jsx)(eR.Ay,{theme:{token:{colorPrimary:"#2B83FF"},components:{Layout:{headerHeight:60,headerPadding:"0 30px",headerBg:"#FFF",bodyBg:"#FFF"}}},children:(0,o.jsx)(p.A,{component:!1,children:t})})}var eN=r(4565),eM=r(217),eD=r(6987);let ez=()=>{let e=(0,eM.j)(eD.v4),t="";e&&(console.warn("MIDSCENE_DEBUG_MODEL_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead"),t="ai:profile"),(0,eM.j)(eD.$l)&&(console.warn("MIDSCENE_DEBUG_MODEL_RESPONSE is deprecated, use DEBUG=midscene:ai:response instead"),t=t?"ai:*":"ai:call"),t&&(0,eN.N)(t)};var eB=r(5409);function eL(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let eU={modelName:eD._q,socksProxy:eD.T4,httpProxy:eD.Yf,openaiBaseURL:eD.kX,openaiApiKey:eD.Lh,openaiExtraConfig:eD.Z7,extraBody:eD.Pm,modelFamily:eD.v,timeout:eD.Yg,temperature:eD.V7,retryCount:eD.vC,retryInterval:eD.xg,reasoningEffort:eD.y2,reasoningEnabled:eD.nc,reasoningBudget:eD.fS},eK={modelName:eD.xP,socksProxy:eD.mZ,httpProxy:eD.zQ,openaiBaseURL:eD.zG,openaiApiKey:eD.OK,openaiExtraConfig:eD.ag,extraBody:eD.WH,modelFamily:eD.OY,timeout:eD.Z$,temperature:eD.Cn,retryCount:eD.sg,retryInterval:eD.wu,reasoningEffort:eD.Vb,reasoningEnabled:eD.u1,reasoningBudget:eD.aO},eF={modelName:eD.HR,socksProxy:eD.iw,httpProxy:eD.FU,openaiBaseURL:eD.$H,openaiApiKey:eD.IQ,openaiExtraConfig:eD.I2,extraBody:eD.G0,modelFamily:eD.yR,timeout:eD.zD,temperature:eD.W4,retryCount:eD.Km,retryInterval:eD.aK,reasoningEffort:eD.VM,reasoningEnabled:eD.M1,reasoningBudget:eD.AU};var eZ=r(9152);let eQ=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"*";if("string"!=typeof e||0===e.length)return e;if(e.length<=6)return e;let r=e.substring(0,3),n=e.substring(e.length-3),i=e.length-6,o=t.repeat(i);return`${r}${o}${n}`},eJ=e=>Object.fromEntries(Object.entries(e).map(e=>{let[t,r]=e;if(!r)return[t,r];if("string"==typeof r&&/key/i.test(t))return[t,eQ(r)];if("object"==typeof r){let e=JSON.stringify(r);if(/key/i.test(e))return[t,eQ(e)]}return[t,r]})),eX=(e,t)=>{if(t)try{return JSON.parse(t)}catch(t){throw Error(`Failed to parse ${e} as a JSON. ${t.message}`,{cause:t})}},eH={insight:eU,planning:eK,default:eF},eG=(e,t)=>{let r=(0,eN.a)("ai:config");r("will decideModelConfig base on agent.modelConfig()",e,eJ(t));let n=eH[e];if(!t[n.modelName])return void r("no modelName found for intent",e);let i=(e=>{var t,r,n;let i,{keys:o,provider:a,useLegacyLogic:s=!1}=e;ez(),(0,eN.a)("ai:config")("enter parseOpenaiSdkConfig with keys:",o);let A=s?a[eD.Jq]:void 0,l=s?a[eD.jG]:void 0,c=s?a[eD.$]:void 0,u=s?a[eD.CA]:void 0,d=s?a[eD.b6]:void 0,p=s?(e=>{let t=e[eD.pp],r=e[eD.yb],n=e[eD.NF],i=e[eD.JM],o=e[eD.j_],a=[t&&eD.pp,r&&eD.yb,n&&eD.NF,i&&eD.JM,o&&eD.j_].filter(Boolean);if(a.length>1)throw Error(`Only one vision mode can be enabled at a time. Currently enabled modes: ${a.join(", ")}. Please disable all but one mode.`);if(n)return"qwen3-vl";if(r)return"qwen2.5-vl";if(t)return"doubao-vision";if(o)return"gemini";if(i)if("1"===i)return"vlm-ui-tars";else if("DOUBAO"===i||"DOUBAO-1.5"===i)return"vlm-ui-tars-doubao-1.5";else return"vlm-ui-tars-doubao"})(a):void 0,h=a[o.modelFamily]||p,f=a[o.openaiApiKey]||A,g=a[o.openaiBaseURL]||l,m=a[o.socksProxy]||c,y=a[o.httpProxy]||u,v=a[o.modelName],b=a[o.openaiExtraConfig],w=eX(o.openaiExtraConfig,b||d),E=a[o.extraBody],k=eX(o.extraBody,E),x=(e=>{if(void 0===e||""===e)return;let t=Number(e);return Number.isFinite(t)?t:void 0})(a[o.temperature]);if(h&&!eD._j.includes(h))throw Error(`Invalid MIDSCENE_MODEL_FAMILY value: ${h}. Current version v1.10.0 accepts the following model families: ${eD._j.join(", ")}. You can also visit https://midscenejs.com/model-common-config.html for the latest configuration information.`);let S="vlm-ui-tars"===h?eD.UH.V1_0:"vlm-ui-tars-doubao"===h||"vlm-ui-tars-doubao-1.5"===h?eD.UH.DOUBAO_1_5_20B:void 0,C=S?`UI-TARS=${S}`:h?`${h} mode`:"";return{socksProxy:m,httpProxy:y,openaiBaseURL:g,openaiApiKey:f,openaiExtraConfig:(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return;let{defaultHeaders:t,extra_headers:r,extraHeaders:n,...i}=e,o=t??r??n;return void 0!==o?{...i,defaultHeaders:o}:i})(w),extraBody:k,modelFamily:h,uiTarsModelVersion:S,modelName:v,modelDescription:C,intent:"-",slot:"-",timeout:a[o.timeout]?Number(a[o.timeout]):void 0,temperature:x,retryCount:(()=>{if(!a[o.retryCount])return 1;let e=Number(a[o.retryCount]);if(!Number.isFinite(e))return 1;if(e<0)throw Error(`${o.retryCount} must be non-negative, got ${e}`);return e})(),retryInterval:(()=>{if(!a[o.retryInterval])return 2e3;let e=Number(a[o.retryInterval]);if(!Number.isFinite(e))return 2e3;if(e<0)throw Error(`${o.retryInterval} must be non-negative, got ${e}`);return e})(),reasoningEffort:(null==(t=a[o.reasoningEffort])?void 0:t.trim())||void 0,reasoningEnabled:"true"===(i=null==(n=a[o.reasoningEnabled])||null==(r=n.trim())?void 0:r.toLowerCase())||"1"===i||"false"!==i&&"0"!==i&&("default"===i?"default":void 0),reasoningBudget:(()=>{var e;let t=null==(e=a[o.reasoningBudget])?void 0:e.trim();if(!t)return;let r=Number(t);return Number.isFinite(r)?r:void 0})()}})({keys:n,provider:t,useLegacyLogic:"default"===e});return i.intent=e,i.slot=e,r("decideModelConfig result by agent.modelConfig() with intent",e,eJ({...i})),(0,eZ.vA)(i.openaiBaseURL,`failed to get base URL of model (intent=${e}). See https://midscenejs.com/model-strategy`),i.modelName||console.warn(`modelName is not set for intent ${e}, this may cause unexpected behavior. See https://midscenejs.com/model-strategy`),i};function eq(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class eW{initialize(){var e;let t;if(this.isInitialized)return;this.modelConfig?(this.isolatedMode=!0,t=this.normalizeModelConfig(this.modelConfig)):t=(null==(e=this.globalConfigManager)?void 0:e.getAllEnvConfig())||{};let r=eG("default",t);if(!r)throw Error("Model configuration is incomplete: model name (MIDSCENE_MODEL_NAME) is required. See https://midscenejs.com/model-strategy.html");let n=eG("insight",t),i=eG("planning",t);this.modelConfigMap={default:{...r,intent:"default",slot:"default",createOpenAIClient:this.createOpenAIClientFn},insight:{...n||r,intent:"insight",slot:n?"insight":"default",createOpenAIClient:this.createOpenAIClientFn},planning:{...i||r,intent:"planning",slot:i?"planning":"default",createOpenAIClient:this.createOpenAIClientFn}},this.isInitialized=!0}normalizeModelConfig(e){return Object.entries(e).reduce((e,t)=>{let[r,n]=t;return null==n||(e[r]=String(n)),e},Object.create(null))}clearModelConfigMap(){if(this.isolatedMode)throw Error("ModelConfigManager work in isolated mode, so clearModelConfigMap should not be called");this.isInitialized=!1}getModelConfig(e){if(this.isInitialized||this.initialize(),!this.modelConfigMap)throw Error("modelConfigMap is not initialized, which should not happen");return this.modelConfigMap[e]}getUploadTestServerUrl(){let{openaiExtraConfig:e}=this.getModelConfig("default");return null==e?void 0:e.REPORT_SERVER_URL}registerGlobalConfigManager(e){this.globalConfigManager=e}throwErrorIfNonVLModel(){if(!this.getModelConfig("default").modelFamily)throw Error("MIDSCENE_MODEL_FAMILY is not set to a multimodal model with UI localization, so element localization cannot be achieved. Check your model configuration. See https://midscenejs.com/model-strategy.html")}constructor(e,t){eq(this,"modelConfigMap",void 0),eq(this,"isInitialized",!1),eq(this,"isolatedMode",!1),eq(this,"globalConfigManager",void 0),eq(this,"modelConfig",void 0),eq(this,"createOpenAIClientFn",void 0),this.modelConfig=e,this.createOpenAIClientFn=t}}let eV=new eW,eY=new class{getAllEnvConfig(){let e=eD.tk.reduce((e,t)=>(e[t]=eB.env[t],e),Object.create(null));if(!this.override)return e;{let{newConfig:t,extendMode:r}=this.override;return r?{...e,...t}:{...t}}}getEnvConfigValue(e){let t=this.getAllEnvConfig();if(e===eD.Sk)throw Error("MATCH_BY_POSITION is discarded, use MIDSCENE_MODEL_FAMILY instead");if(!eD.rd.includes(e))throw Error(`getEnvConfigValue with key ${e} is not supported.`);let r=t[e];return(this.keysHaveBeenRead[e]=!0,"string"==typeof r)?r.trim():r}getEnvConfigInBoolean(e){let t=this.getAllEnvConfig();if(!eD.c$.includes(e))throw Error(`getEnvConfigInBoolean with key ${e} is not supported`);let r=t[e];return this.keysHaveBeenRead[e]=!0,!!r&&(!!/^(true|1)$/i.test(r)||!/^(false|0)$/i.test(r)&&!!r.trim())}getEnvConfigValueAsNumber(e){if(!eD.rd.includes(e)&&!eD.DL.includes(e))throw Error(`getEnvConfigValueAsNumber with key ${e} is not supported.`);let t=this.getAllEnvConfig()[e];if(this.keysHaveBeenRead[e]=!0,"string"!=typeof t)return;let r=t.trim();if(!r)return;let n=Number(r);return Number.isNaN(n)?void 0:n}registerModelConfigManager(e){this.globalModelConfigManager=e}overrideAIConfig(e){var t;let r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];for(let t in e){if(![...eD.Lg,...eD.XE].includes(t))throw Error(`Failed to override AI config, invalid key: ${t}`);let r=e[t];if("string"!=typeof r)throw Error(`Failed to override AI config, value for key ${t} must be a string, but got with type ${typeof r}`);this.keysHaveBeenRead[t]&&console.warn(`Warning: try to override AI config with key ${t} ,but it has been read.`)}let n=r?{...null==(t=this.override)?void 0:t.newConfig,...e}:e;if(this.override={newConfig:{...n},extendMode:r},!this.globalModelConfigManager)throw Error("globalModelConfigManager is not registered, which should not happen");this.globalModelConfigManager.clearModelConfigMap()}constructor(){eL(this,"override",void 0),eL(this,"keysHaveBeenRead",{}),eL(this,"globalModelConfigManager",void 0),ez()}};eY.registerModelConfigManager(eV),eV.registerGlobalConfigManager(eY);let e_=()=>{let e=eY.getEnvConfigValue(eD.El);return e?e:"Asia/Shanghai"===Intl.DateTimeFormat().resolvedOptions().timeZone?"Chinese":"English"},e$=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];eY.overrideAIConfig(e,t)};var e0=r(3585),e1=r(6990);function e2(e){try{let t=e.match(/^\s*(\{[\s\S]*\})\s*$/);if(t)return t[1];let r=e.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/);if(r)return r[1];let n=e.match(/\{[\s\S]*\}/);if(n)return n[0]}catch{}return e}function e3(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==e)return e;if(Array.isArray(e))return e.map(e=>e3(e,t));if("object"==typeof e){let n={};for(let[i,o]of Object.entries(e)){var r;let e=i.trim(),a=(null==(r=t.preserveStringValueKeys)?void 0:r.includes(e))??!1,s="string"==typeof o?a?o:o.trim():e3(o,t);n[e]=s}return n}return"string"==typeof e?e.trim():e}function e5(e,t){let r=((e,t,r)=>{var n;let i,o;if(null==e?void 0:e.match(/\((\d+),(\d+)\)/))return null==(n=e.match(/\((\d+),(\d+)\)/))?void 0:n.slice(1).map(Number);try{return i=JSON.parse(e),e3(i,r)}catch(e){o=e}try{return i=JSON.parse((0,e1.m)(e)),e3(i,r)}catch(e){o=e}return{parsed:void 0,lastError:o,rawResponse:t}})(e2(e),e,t);if(r&&"object"==typeof r&&"parsed"in r&&void 0===r.parsed)throw Error(`failed to parse LLM response into JSON. Error - ${String(r.lastError??"unknown error")}. Response -
|
|
3
|
+
${e}`);return r}let e7=e=>void 0,e4=e=>{let{midsceneDefaults:t,userConfig:r}=e;return{config:{temperature:r.temperature??t.temperature}}},e8={temperature:0};function e6(e){if(!e)return{content:"",reasoning_content:""};let t="string"==typeof e.reasoning_content?e.reasoning_content:"";return{content:"string"==typeof e.content?e.content:"",reasoning_content:t}}let e9=[[100,100,200,200],[345,442,458,483],[120,180,380,210],[120,240,380,270],[50,100,200,200],[300,400,500,500],[600,100,800,250],[50,600,250,750]];function te(e){let{shape:t}=e,{plural:r=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"bbox"===t?r?"bounding boxes":"bounding box":r?"points":"point"}function tt(e){return Math.max(e-1,0)}function tr(e,t,r){return Math.round(e*tt(r)/t)}function tn(e,t,r){return Math.min(Math.max(e,t),r)}function ti(e,t,r){let{preparedSize:n,contentSize:i}=r,{width:o,height:a}=n;if(4!==e.length||!e.every(e=>"number"==typeof e&&Number.isFinite(e)))throw Error(`invalid locate bbox data: ${JSON.stringify(t)} `);!function(e,t){let[r,n,i,o]=e;if(!(i>=r)||!(o>=n))throw Error(`locate pixel bbox has invalid coordinate order: bbox=${JSON.stringify(t)} pixelBbox=${JSON.stringify(e)}`)}(e,t),function(e,t,r,n){let[i,o,a,s]=e,A=tt(r),l=tt(n);if(i<0||o<0||a>A||s>l)throw Error(`locate pixel bbox is outside the image size: bbox=${JSON.stringify(t)} imageSize=${r}x${n}`)}(e,t,o,a);let s=tt((null==i?void 0:i.width)??o),A=tt((null==i?void 0:i.height)??a),[l,c,u,d]=e;return[tn(l,0,s),tn(c,0,A),tn(u,0,s),tn(d,0,A)]}function to(e){return Array.isArray(e)&&Array.isArray(e[0])?e[0]:e}function ta(e,t){let r=to(e),n="string"==typeof r?r.trim().split(/[\s,]+/).filter(Boolean):r;if(!Array.isArray(n))throw Error(`invalid ${t} data: ${JSON.stringify(e)} `);let i=n.map(e=>"number"==typeof e?e:Number(e));if(!i.every(e=>Number.isFinite(e)))throw Error(`invalid ${t} data: ${JSON.stringify(e)} `);return i}let ts={primary:{bbox:["bbox","bbox_2d"],point:["point"]},references:{bbox:["references_bbox","references_bbox_2d"],point:["references_point"]}};function tA(e){let t=e.order??"xy";if(void 0!==e.normalizedBy&&e.normalizedBy<=0)throw Error(`locate result coordinates normalizedBy must be positive: ${e.normalizedBy}`);return{shape:e.shape,order:t,normalizedBy:e.normalizedBy}}function tl(e,t,r){let n=ts[r][t.shape];if(!e||"object"!=typeof e)return;let i=n.find(t=>void 0!==e[t]);return i?e[i]:void 0}function tc(e){let t,r,n,i,o,a="custom"===e.kind?e:(t=tA(e.coordinates),r=e.parseRawLocateValue??(e=>(function(e,t){if("point"===e.shape){let e=ta(t,"point");if(e.length<2)throw Error(`invalid point data: ${JSON.stringify(t)} `);return{type:"point",coordinates:[e[0],e[1]]}}let r=ta(t,"bbox");if(4!==r.length)throw Error(`invalid bbox data: ${JSON.stringify(t)} `);return{type:"bbox",coordinates:[r[0],r[1],r[2],r[3]]}})(t,e)),n=e.mapLocateResultToPixelBbox??((e,r)=>(function(e,t,r){var n,i,o,a,s;let{preparedSize:A}=t,{width:l,height:c}=A,u=r.normalizedBy;!function(e,t,r,n){let i,o=t.normalizedBy,a=void 0!==(i=t.normalizedBy)?e.coordinates.map(()=>i):"bbox"===e.type?"yx"===t.order?[n,r,n,r]:[r,n,r,n]:"yx"===t.order?[n,r]:[r,n];if(!e.coordinates.some((e,t)=>{let r=a[t];return"number"!=typeof e||!Number.isFinite(e)||e<0||e>r}))return;let s=void 0!==o?`normalized range [0, ${o}]`:`image size [0, ${r}]x[0, ${n}]`,A=void 0!==o?` normalizedBy=${o}`:"";throw Error(`locate result coordinates ${JSON.stringify(e.coordinates)} exceed ${s}. shape=${t.shape} order=${t.order}${A} limits=${JSON.stringify(a)}`)}(e,r,l,c);let d=function(e,t){if("yx"!==t)return e;if(4===e.length){let[t,r,n,i]=e;return[r,t,i,n]}let[r,n]=e;return[n,r]}(e.coordinates,r.order),p=4===d.length?d:(n=d[0],i=d[1],o=u??tt(l),a=u??tt(c),[Math.max(0,n-(s=void 0===u?10:u/100)),Math.max(0,i-s),Math.min(o,n+s),Math.min(a,i+s)]);return void 0===u?p:function(e,t,r,n){let[i,o,a,s]=e;return[tr(i,t,r),tr(o,t,n),tr(a,t,r),tr(s,t,n)]}(p,u,l,c)})(e,r,t)),i=(e,t)=>{let i=r(e);if(!i||"object"!=typeof i)throw Error(`invalid parsed locate result: expected object, got ${JSON.stringify(i)}`);let o="bbox"===i.type?4:2*("point"===i.type);if(!o)throw Error(`invalid parsed locate result: unsupported type ${JSON.stringify(i.type)}`);let a=i.coordinates;if(!Array.isArray(a)||a.length!==o||!a.every(e=>"number"==typeof e&&Number.isFinite(e)))throw Error(`invalid parsed locate result: ${i.type} coordinates must be ${o} finite numbers, got ${JSON.stringify(a)}`);return n(i,t)},o=(e,r)=>i(function(e,t){let r=tl(e,t,"primary");if(void 0===r&&null!==e&&"object"==typeof e&&!Array.isArray(e))throw Error("locate response does not contain a recognizable locate result field");return void 0===r?e:r}(e,t),r),{promptSpec:{resultKey:function(e){let{shape:t}=e;return"point"===t?"point":"bbox"}(t),resultValueSchema:function(e){let{shape:t}=e;return"point"===t?"[number, number]":"[number, number, number, number]"}(t),resultValueDescription:function(e){let{shape:t,order:r,normalizedBy:n}=e,i="point"===t?"point":"2d bounding box",o=void 0!==n?`normalized to 0-${n} relative to the screenshot. Do NOT use pixel coordinates or screenshot width/height`:"in actual pixel coordinates relative to the screenshot";return"point"===t?`${i}, should be ${"yx"===r?"[y, x]":"[x, y]"} ${o}.`:`${i}, should be ${"yx"===r?"[ymin, xmin, ymax, xmax]":"[xmin, ymin, xmax, ymax]"} ${o}.`}(t),resultNoun:te(t),resultNounPlural:te(t,{plural:!0}),exampleValues:e9.map(e=>(function(e,t){let[r,n,i,o]=t;if("point"===e.shape){let t=Math.round((r+i)/2),a=Math.round((n+o)/2);return"yx"===e.order?[a,t]:[t,a]}return"yx"===e.order?[n,r,o,i]:t})(t,e))},adaptElementLocateResultToPixelBbox:(e,t)=>o(e,t),adaptSectionLocateResultToPixelBboxGroup:(e,r)=>{var n;let a=o(e,r),s=(null==(n=tl(e,t,"references"))?[]:Array.isArray(n)?n:[n]).map(e=>i(e,r));return{target:a,...s.length>0?{references:s}:{}}},adaptPlanningParamToPixelBbox:(e,t)=>o(e,t)});return{promptSpec:a.promptSpec,adaptElementLocateResultToPixelBbox:(e,t)=>ti(a.adaptElementLocateResultToPixelBbox(e,t),e,t),adaptSectionLocateResultToPixelBboxGroup:(e,t)=>{var r;return r=a.adaptSectionLocateResultToPixelBboxGroup(e,t),{target:ti(r.target,e,t),...r.references?{references:r.references.map(r=>ti(r,e,t))}:{}}},adaptPlanningParamToPixelBbox:(e,t)=>ti(a.adaptPlanningParamToPixelBbox(e,t),e,t)}}var tu=r(6448),td=r(6732),tp=r.n(td),th=r(4201),tf=r(5592),tg=r(3078),tm=r.n(tg);let ty=(0,eN.a)("img"),tv=null,tb=!1;async function tw(){if(tv&&tb)return tv;let e=eZ.ht?"browser":eZ.rS?"worker":eZ.$9?"node":"unknown";ty(`Loading photon module in ${e} environment`);try{if(eZ.ht||eZ.rS){let e=await r.e("195").then(r.bind(r,3238));"function"==typeof e.default&&await e.default(),ty("Photon loaded: @silvia-odwyer/photon (browser/worker)"),tv=e}else eZ.$9&&(tv=await Promise.all([r.e("271"),r.e("467")]).then(r.t.bind(r,9570,23)),ty("Photon loaded: @silvia-odwyer/photon-node (node)"));if(!(null==tv?void 0:tv.PhotonImage))throw Error("PhotonImage is not available");if(!tv.PhotonImage.new_from_byteslice&&!tv.PhotonImage.new_from_base64)throw Error("PhotonImage.new_from_byteslice or new_from_base64 is not available");return tb=!0,tv}catch(e){if(ty(`Photon load failed: ${e instanceof Error?e.message:String(e)}`),eZ.ht){console.warn(`[midscene:img] Photon WASM failed to load, falling back to Canvas API. Error: ${e instanceof Error?e.message:String(e)}`);try{let{createCanvasFallbackModule:e}=await r.e("985").then(r.bind(r,4168));return tv=e(),tb=!0,tv}catch(e){ty(`Canvas fallback also failed: ${e instanceof Error?e.message:String(e)}`)}}throw Error(`Failed to load photon module: ${e instanceof Error?e.message:String(e)}`)}}async function tE(){if(!eZ.$9)throw Error("Sharp is only available in Node.js environment");try{return(await Promise.resolve().then(r.t.bind(r,4678,23))).default}catch(e){throw Error(`Failed to load sharp module: ${e instanceof Error?e.message:String(e)}`)}}let tk=(0,eN.a)("img");async function tx(e,t,r){if("string"==typeof t)throw Error("inputData is base64, use resizeImgBase64 instead");tp()(r&&r.width>0&&r.height>0,"newSize must be positive");let n=Date.now();if(tk(`resizeImg start, target size: ${r.width}x${r.height}`),eZ.$9)try{let i=await tE(),{width:o,height:a}=await i(t).metadata();if(!o||!a)throw Error("Undefined width or height from the input image.");if(r.width===o&&r.height===a)return{buffer:t,format:e};let s=await i(t).resize(r.width,r.height).jpeg({quality:90}).toBuffer(),A=Date.now();return tk(`resizeImg done (Sharp), target size: ${r.width}x${r.height}, cost: ${A-n}ms`),{buffer:s,format:"jpeg"}}catch(e){tk("Sharp failed, falling back to Photon:",e)}let{PhotonImage:i,SamplingFilter:o,resize:a}=await tw(),s=new Uint8Array(t),A=i.new_from_byteslice(s),l=A instanceof Promise?await A:A,c=l.get_width(),u=l.get_height();if(!c||!u)throw l.free(),Error("Undefined width or height from the input image.");if(r.width===c&&r.height===u)return l.free(),{buffer:t,format:e};let d=a(l,r.width,r.height,o.CatmullRom),p=d.get_bytes_jpeg(90),h=th.Buffer.from(p);l.free(),d.free();let f=Date.now();return tk(`resizeImg done (Photon), target size: ${r.width}x${r.height}, cost: ${f-n}ms`),{buffer:h,format:"jpeg"}}let tS=/^data:image\/(png|jpe?g);base64,([\s\S]*)$/i,tC=/^[A-Za-z0-9+/=\s]+$/,tI=(e,t)=>`data:image/${e};base64,${t.replace(/\s/g,"")}`;async function tj(e,t){let{body:r,mimeType:n}=tB(e),i=th.Buffer.from(r,"base64"),{buffer:o,format:a}=await tx(n.split("/")[1],i,t);return tI(a,o.toString("base64"))}async function tO(e){let{PhotonImage:t}=await tw(),{body:r}=tB(e),n=t.new_from_base64(r);return n instanceof Promise?await n:n}async function tP(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:28,r=e.get_width(),n=e.get_height(),i=Math.ceil(r/t)*t,o=Math.ceil(n/t)*t;if(i===r&&o===n)return{width:r,height:n,image:e};let{padding_right:a,padding_bottom:s,Rgba:A}=await tw(),l=i-r,c=o-n,u=e;if(l>0&&(u=a(u,l,new A(255,255,255,255))),c>0){let t=new A(255,255,255,255),r=u;u=s(r,c,t),r!==e&&r.free()}return{width:i,height:o,image:u}}async function tR(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:28,r=await tO(e);try{let e=await tP(r,t),n={width:e.width,height:e.height,imageBase64:await tN(e.image)};return e.image!==r&&e.image.free(),n}finally{r.free()}}async function tT(e,t){let{crop:r}=await tw(),n=await tO(e),{left:i,top:o,width:a,height:s}=t,A=r(n,i,o,i+a,o+s);n.free();try{return{width:A.get_width(),height:A.get_height(),imageBase64:await tN(A)}}finally{A.free()}}async function tN(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:90,r=e.get_bytes_jpeg(t),n=th.Buffer.from(r).toString("base64");return`data:image/jpeg;base64,${n}`}let tM=async e=>{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch image: ${e}`);let r=t.headers.get("content-type");if(!r)throw Error(`Failed to fetch image: ${e}`);tp()(r.startsWith("image/"),`The url ${e} is not a image, because of content-type in header is ${r}.`);let n=th.Buffer.from(await t.arrayBuffer());return`data:${r};base64,${n.toString("base64")}`},tD=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=(0,tf.readFileSync)(e).toString("base64");if(t)return r;let n=tm().extname(e).slice(1);return`data:image/${"svg"===n?"svg+xml":n||"jpg"};base64,${r}`},tz=async(e,t)=>{if("string"!=typeof e)throw Error(`url must be a string, but got ${e} with type ${typeof e}`);if(e.startsWith("data:")){let{mimeType:t,body:r}=tB(e);return`data:${t};base64,${r}`}return e.startsWith("http://")||e.startsWith("https://")?t?await tM(e):e:await tD(e)},tB=e=>{try{let r=";base64,",n=e.indexOf(r);if(-1===n){var t;let r=e.replace(/\s/g,""),n=(t=th.Buffer.from(r,"base64")).length>=8&&137===t[0]&&80===t[1]&&78===t[2]&&71===t[3]&&13===t[4]&&10===t[5]&&26===t[6]&&10===t[7]?"image/png":t.length>=3&&255===t[0]&&216===t[1]&&255===t[2]?"image/jpeg":t.length>=6&&"GIF"===t.subarray(0,3).toString("ascii")?"image/gif":t.length>=12&&"RIFF"===t.subarray(0,4).toString("ascii")&&"WEBP"===t.subarray(8,12).toString("ascii")?"image/webp":t.length>=2&&66===t[0]&&77===t[1]?"image/bmp":void 0;if(!n)throw Error("Invalid base64 string");return{mimeType:n,body:r}}return{mimeType:e.slice(5,n),body:e.slice(n+r.length).replace(/\s/g,"")}}catch(t){throw Error(`parseBase64 fail because intput is not a valid base64 string: ${e}`,{cause:t})}};async function tL(e,t){if(t<=0)throw Error("Scale factor must be positive");let{body:r}=tB(e),n=th.Buffer.from(r,"base64"),i=Date.now();if(tk(`scaleImage start, scale factor: ${t}`),eZ.$9)try{let e=await tE(),r=await e(n).metadata(),o=r.width||0,a=r.height||0;if(0===o||0===a)throw Error("Failed to get image dimensions");let s=Math.round(o*t),A=Math.round(a*t),l=await e(n).resize(s,A,{kernel:"lanczos3",fit:"fill"}).jpeg({quality:90}).toBuffer(),c=Date.now();tk(`scaleImage done (Sharp): ${o}x${a} -> ${s}x${A} (scale=${t}), cost: ${c-i}ms`);let u=`data:image/jpeg;base64,${l.toString("base64")}`;return{width:s,height:A,imageBase64:u}}catch(e){tk("Sharp failed, falling back to Photon:",e)}let{PhotonImage:o,SamplingFilter:a,resize:s}=await tw(),A=new Uint8Array(n),l=o.new_from_byteslice(A),c=l instanceof Promise?await l:l,u=c.get_width(),d=c.get_height();if(!u||!d)throw c.free(),Error("Failed to get image dimensions");let p=Math.round(u*t),h=Math.round(d*t),f=s(c,p,h,a.CatmullRom),g=f.get_bytes_jpeg(90),m=th.Buffer.from(g);c.free(),f.free();let y=Date.now();return tk(`scaleImage done (Photon): ${u}x${d} -> ${p}x${h} (scale=${t}), cost: ${y-i}ms`),{width:p,height:h,imageBase64:`data:image/jpeg;base64,${m.toString("base64")}`}}function tU(e,t){let r=Math.max(e.left-100,0),n=Math.max(e.top-100,0),i={left:r,top:n,width:Math.min(e.left-r+e.width+100,t.width-r),height:Math.min(e.top-n+e.height+100,t.height-n)},o=i.width*i.height;if(o>=16e4)return i;let a=i.left+i.width/2,s=i.top+i.height/2,A=Math.sqrt(16e4/o),l=Math.round(i.width*A),c=Math.round(i.height*A),u=Math.max(Math.round(a-l/2),0),d=Math.max(Math.round(s-c/2),0);return{left:u,top:d,width:Math.min(l,t.width-u),height:Math.min(c,t.height-d)}}function tK(e,t){let r=t.find(t=>t.name===e);if(!r){let r=t.map(e=>e.name).join(", ");throw Error(`Action type '${e}' is not in the current action space. Available actions: ${r||"(none)"}`)}return r}let tF=tu.Ik({left:tu.ai(),top:tu.ai()}),tZ=tu.Ik({width:tu.ai(),height:tu.ai()});tF.and(tZ).and(tu.Ik({zoom:tu.ai().optional()}));let tQ=tu.Ik({images:tu.YO(tu.Ik({name:tu.Yj(),url:tu.Yj()})).optional(),convertHttpImage2Base64:tu.zM().optional()}),tJ=tu.KC([tu.Yj(),tu.Ik({prompt:tu.Yj()}).and(tQ.partial())]),tX=e=>"string"==typeof e?e:e.prompt,tH=e=>{if("string"!=typeof e&&e.images)return{images:e.images,convertHttpImage2Base64:!!e.convertHttpImage2Base64}},tG=async e=>{var t;let r=[];if(null==e||null==(t=e.images)?void 0:t.length)for(let t of(r.push({role:"user",content:[{type:"text",text:"Next, I will provide all the reference images. These reference images are supporting context only, not the current screenshot being evaluated, unless the task explicitly asks for comparison or matching."}]}),e.images)){let n=await tz(t.url,!!e.convertHttpImage2Base64);r.push({role:"user",content:[{type:"text",text:`this is the reference image named '${t.name}'. It is a reference image, not the current screenshot:`}]}),r.push({role:"user",content:[{type:"image_url",image_url:{url:n,detail:"high"}}]})}return r},tq=tu.Ik({prompt:tJ,deepLocate:tu.zM().optional(),deepThink:tu.zM().optional().describe("@deprecated Use `deepLocate` instead."),cacheable:tu.zM().optional(),xpath:tu.KC([tu.Yj(),tu.zM()]).optional()}).passthrough(),tW=e=>{let t=e.prompt;if(Array.isArray(e.images)&&e.images.length>0){let r=e.images.length;t+=` (with ${r} image${r>1?"s":""})`}return t},tV=(e,t)=>{var r;return e&&(null==(r=e._def)?void 0:r.typeName)==="ZodObject"&&e.shape?Object.keys(e.shape).filter(r=>{var n;let i=e.shape[r];return!!(e=>{var t,r;let n=e;if((null==(t=n._def)?void 0:t.typeName)==="ZodOptional"&&(n=n._def.innerType),(null==(r=n._def)?void 0:r.typeName)==="ZodObject"){let e=n._def.shape();if("midscene_location_field_flag"in e||"prompt"in e&&e.prompt)return!0}return!1})(i)&&(!t||(null==(n=i._def)?void 0:n.typeName)!=="ZodOptional")}):[]},tY=(e,t)=>{if(!(0,eZ.Qd)(e))return{};let r=tV(t),n={...e};for(let e of r){let t=n[e];t&&("string"==typeof t?n[e]=t:"object"==typeof t&&t.prompt&&("string"==typeof t.prompt?n[e]=t.prompt:"object"==typeof t.prompt&&t.prompt.prompt&&(n[e]=tW(t.prompt))))}return n},t_=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"YYYY-MM-DD HH:mm:ss",t=arguments.length>1?arguments[1]:void 0,r=void 0!==t?new Date(t):new Date,n=r.getFullYear(),i=String(r.getMonth()+1).padStart(2,"0"),o=String(r.getDate()).padStart(2,"0"),a=String(r.getHours()).padStart(2,"0"),s=String(r.getMinutes()).padStart(2,"0"),A=String(r.getSeconds()).padStart(2,"0"),l=e.replace("YYYY",String(n)).replace("MM",i).replace("DD",o).replace("HH",a).replace("mm",s).replace("ss",A);return`${l} (${e})`};var t$=r(6970),t0=r(2801),t1=r(4201).Buffer,t2={"node:fs"(e){e.exports=t0}},t3={};function t5(e){var t=t3[e];if(void 0!==t)return t.exports;var r=t3[e]={exports:{}};return t2[e](r,r.exports,t5),r.exports}var t7=t5("node:fs");let t4=eZ.NB,t8=eZ.x3;function t6(){return"<\/script>"}function t9(e,t,r,n){let i=(0,t7.openSync)(e,"r"),o=(0,t7.statSync)(e).size,a=t1.alloc(65536),s=0,A="",l=!1,c="";try{for(;s<o;){let e=(0,t7.readSync)(i,a,0,65536,s),o=A+a.toString("utf-8",0,e);s+=e;let u=0;for(;u<o.length;)if(l){let e=o.indexOf(r,u);if(-1!==e){if(c+=o.slice(u,e),n(c))return;l=!1,c="",u=e+r.length}else{c+=o.slice(u,-r.length),A=o.slice(-r.length);break}}else{let e=o.indexOf(t,u);if(-1!==e){l=!0;let i=(c=o.slice(e+t.length)).indexOf(r);if(-1!==i){if(n(c.slice(0,i)))return;l=!1,c="",u=e+t.length+i+r.length}else{A=c.slice(-r.length),c=c.slice(0,-r.length);break}}else{A=o.slice(-t.length);break}}}}finally{(0,t7.closeSync)(i)}}function re(e,t){let r=`<script type="midscene-image" data-id="${t}">`,n=t6(),i=null;return t9(e,r,n,e=>(i=t8(e),!0)),i}function rt(){return n||(n='\n<script>(function(){var p=window.location.pathname;if(p.endsWith("/")||/\\.\\w+$/.test(p))return;var b=document.createElement("base");b.href=p+"/";document.head.insertBefore(b,document.head.firstChild)})()'+t6()+"\n"),n}function rr(e,t){let r=t6(),n="";return t&&Object.keys(t).length>0&&(n=" "+Object.entries(t).map(e=>{let[t,r]=e;return t+'="'+encodeURIComponent(r)+'"'}).join(" ")),'<script type="midscene_web_dump"'+n+">"+t4(e)+r}var rn=r(6390),ri=r(4201).Buffer;function ro(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ra(e){return"object"!=typeof e||null===e?null:"midscene_screenshot_ref"===e.type&&"string"==typeof e.id&&"number"==typeof e.capturedAt&&("inline"===e.storage||"file"===e.storage)&&("image/png"===e.mimeType||"image/jpeg"===e.mimeType)?"file"===e.storage&&"string"!=typeof e.path?null:e:null}function rs(e,t){let r=ra(e),n=(null==r?void 0:r.id)??t.fallbackId,i=(null==r?void 0:r.mimeType)??t.fallbackMimeType;if(!n||!i)throw Error("ScreenshotStore: screenshot id and mimeType are required to resolve screenshot");if((null==r?void 0:r.storage)==="file"){let e;if(!r.path)throw Error(`ScreenshotStore: screenshot ref "${r.id}" missing file path`);let o=(e=r.path,(0,tg.isAbsolute)(e)?e:(0,tg.join)((0,tg.dirname)(t.reportPath),e));if((0,t0.existsSync)(o))return{type:"file",id:n,mimeType:i,filePath:o}}let o=re(t.reportPath,n);if(o)return{type:"data-uri",id:n,mimeType:i,dataUri:o};let a=(0,tg.join)((0,tg.dirname)(t.reportPath),"screenshots",`${n}.${"image/jpeg"===i?"jpeg":"png"}`);if((0,t0.existsSync)(a))return{type:"file",id:n,mimeType:i,filePath:a};throw Error(`ScreenshotStore: cannot resolve screenshot "${n}" from ${t.reportPath}`)}class rA{async persist(e){let t="directory"===this.mode||this.alsoWriteFileCopy?await this.persistToSharedFileIfNeeded(e,{markAsPersisted:"directory"===this.mode}):null;if("inline"===this.mode){if(!this.writeInlineImage)throw Error("ScreenshotStore: writeInlineImage is required in inline mode");return this.writtenInlineIds.has(e.id)||(await this.writeInlineImage(e.id,e.base64),this.writtenInlineIds.add(e.id)),e.markPersistedInline(this.reportPath)}if(!t)throw Error("ScreenshotStore: file persistence is required in directory mode");return t}async persistToSharedFileIfNeeded(e,t){let r=this.screenshotsDir;if(!r)throw Error("ScreenshotStore: screenshotsDir is required when file persistence is enabled");(0,t0.existsSync)(r)||(0,t0.mkdirSync)(r,{recursive:!0});let n=`./screenshots/${e.id}.${e.extension}`,i=(0,tg.join)(r,`${e.id}.${e.extension}`);if(!this.writtenFileIds.has(e.id)){let t=ri.from(e.rawBase64,"base64");await (0,rn.writeFile)(i,t),this.writtenFileIds.add(e.id)}return t.markAsPersisted?e.markPersistedToPath(n,i):e.registerPersistedFileCopy(n,i)}loadBase64(e){let t=ra(e);if(!t)throw Error("ScreenshotStore: invalid screenshot reference");let r=rs(t,{reportPath:this.reportPath});if("data-uri"===r.type)return r.dataUri;let n=(0,t0.readFileSync)(r.filePath);return`data:${r.mimeType};base64,${n.toString("base64")}`}cleanup(){"directory"===this.mode&&this.screenshotsDir&&(0,t0.existsSync)(this.screenshotsDir)&&(0,t0.rmSync)(this.screenshotsDir,{recursive:!0,force:!0}),this.writtenInlineIds.clear(),this.writtenFileIds.clear()}constructor(e){ro(this,"mode",void 0),ro(this,"reportPath",void 0),ro(this,"screenshotsDir",void 0),ro(this,"writeInlineImage",void 0),ro(this,"alsoWriteFileCopy",void 0),ro(this,"writtenInlineIds",new Set),ro(this,"writtenFileIds",new Set),this.mode=e.mode,this.reportPath=e.reportPath,this.screenshotsDir=e.screenshotsDir,this.writeInlineImage=e.writeInlineImage,this.alsoWriteFileCopy=e.alsoWriteFileCopy??e.ensureFileCopy??!1}}function rl(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class rc{static create(e,t){return new rc((0,eZ.uR)(),e,t)}get id(){return this._id}get format(){return this._format}get extension(){return"jpeg"===this._format?"jpeg":"png"}get capturedAt(){return this._capturedAt}get base64(){var e,t;if(null!==this._base64)return this._base64;let r=()=>{if(null===this._persistedPath)throw Error(`Screenshot ${this._id}: file recovery path missing`);let e=(0,t$.readFileSync)(this._persistedPath);return`data:image/${this._format};base64,${e.toString("base64")}`},n=()=>{if(null===this._persistedHtmlPath)throw Error(`Screenshot ${this._id}: HTML recovery path missing`);let e=re(this._persistedHtmlPath,this._id);if(e)return e;throw Error(`Screenshot ${this._id}: cannot recover from HTML (id not found in ${this._persistedHtmlPath})`)};if((null==(e=this._serializedRef)?void 0:e.storage)==="file")return r();if((null==(t=this._serializedRef)?void 0:t.storage)==="inline")return n();if(null!==this._persistedPath)return r();if(null!==this._persistedHtmlPath)return n();throw Error(`Screenshot ${this._id}: base64 data released without recovery path`)}hasBase64(){return null!==this._base64}markPersistedInline(e){let t=this.createRef("inline");return this._serializedRef=t,this._persistedHtmlPath=e,this._base64=null,t}registerPersistedFileCopy(e,t){let r=this.createRef("file",e);return this._persistedPath=t,this._base64=null,r}markPersistedToPath(e,t){let r=this.registerPersistedFileCopy(e,t);return this._serializedRef=r,r}toSerializable(){return this._serializedRef??{type:"midscene_screenshot_ref",id:this._id,capturedAt:this._capturedAt,mimeType:"jpeg"===this._format?"image/jpeg":"image/png",storage:"inline"}}static isSerialized(e){return null!==ra(e)}createRef(e,t){let r={type:"midscene_screenshot_ref",id:this._id,capturedAt:this._capturedAt,mimeType:"jpeg"===this._format?"image/jpeg":"image/png",storage:e};return"file"===e?{...r,storage:e,path:t}:r}get rawBase64(){return this.base64.replace(/^data:image\/(png|jpeg|jpg);base64,/,"")}constructor(e,t,r){rl(this,"_id",void 0),rl(this,"_base64",void 0),rl(this,"_format",void 0),rl(this,"_capturedAt",void 0),rl(this,"_serializedRef",null),rl(this,"_persistedPath",null),rl(this,"_persistedHtmlPath",null),this._id=e,this._base64=t,this._format=function(e){return e.startsWith("data:image/jpeg")||e.startsWith("data:image/jpg")?"jpeg":"png"}(t),this._capturedAt=r}}function ru(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}i=Symbol.iterator;class rd{resetPendingFeedbackMessageIfExists(){this.pendingFeedbackMessage&&(this.pendingFeedbackMessage="")}append(e){this.messages.push(e)}seed(e){this.reset(),e.forEach(e=>{this.append(e)})}reset(){this.messages.length=0,this.memories.length=0,this.subGoals.length=0,this.historicalLogs.length=0,this.pendingFeedbackMessage=""}snapshot(e){if(void 0===e)return[...this.messages];let t=structuredClone(this.messages),r=0;for(let n=t.length-1;n>=0;n--){let i=t[n].content;if(Array.isArray(i))for(let t=0;t<i.length;t++)"image_url"===i[t].type&&++r>e&&(i[t]={type:"text",text:"(image ignored due to size optimization)"})}return t}get length(){return this.messages.length}[i](){return this.messages[Symbol.iterator]()}toJSON(){return this.snapshot()}setSubGoals(e){this.subGoals=e.map(e=>({...e})),this.markFirstPendingAsRunning()}mergeSubGoals(e){if(0===this.subGoals.length)return void this.setSubGoals(e);let t=new Map(this.subGoals.map(e=>[e.index,e])),r=e.map(e=>{let r=t.get(e.index),n=e.description.trim().length>0;return r||n?{...e,description:n||!r?e.description:r.description}:null}).filter(e=>null!==e);0!==r.length&&this.setSubGoals(r)}updateSubGoal(e,t){let r=this.subGoals.find(t=>t.index===e);if(!r)return!1;let n=!1;return void 0!==t.status&&t.status!==r.status&&(r.status=t.status,n=!0),void 0!==t.description&&t.description!==r.description&&(r.description=t.description,n=!0),n&&(r.logs=[]),!0}markFirstPendingAsRunning(){let e=this.subGoals.find(e=>"pending"===e.status);e&&(e.status="running",e.logs=[])}markSubGoalFinished(e){let t=this.updateSubGoal(e,{status:"finished"});return t&&this.markFirstPendingAsRunning(),t}markAllSubGoalsFinished(){for(let e of this.subGoals)"finished"!==e.status&&(e.logs=[]),e.status="finished"}appendSubGoalLog(e){if(!e)return;let t=this.subGoals.find(e=>"running"===e.status);t&&(t.logs||(t.logs=[]),t.logs.push(e))}subGoalsToText(){if(0===this.subGoals.length)return"";let e=this.subGoals.map(e=>`${e.index}. ${e.description} (${e.status})`),t=this.subGoals.find(e=>"running"===e.status)||this.subGoals.find(e=>"pending"===e.status),r="";if(t&&(r=`
|
|
4
|
+
Current sub-goal is: ${t.description}`,t.logs&&t.logs.length>0)){let e=t.logs.map(e=>`- ${e}`).join("\n");r+=`
|
|
5
|
+
Actions performed for current sub-goal:
|
|
6
|
+
${e}`}return`Sub-goals:
|
|
7
|
+
${e.join("\n")}${r}`}appendHistoricalLog(e){e&&this.historicalLogs.push(e)}historicalLogsToText(){if(0===this.historicalLogs.length)return"";let e=this.historicalLogs.map(e=>`- ${e}`).join("\n");return`Here are the steps that have been executed:
|
|
8
|
+
${e}`}appendMemory(e){e&&this.memories.push(e)}getMemories(){return[...this.memories]}memoriesToText(){return 0===this.memories.length?"":`Memories from previous steps:
|
|
9
|
+
---
|
|
10
|
+
${this.memories.join("\n---\n")}
|
|
11
|
+
`}clearMemories(){this.memories.length=0}compressHistory(e,t){if(this.messages.length<=e)return!1;let r=this.messages.length-t,n={role:"user",content:`(${r} previous conversation messages have been omitted)`},i=this.messages.slice(-t);for(let e of(this.messages.length=0,this.messages.push(n),i))this.messages.push(e);return!0}constructor(e){var t;ru(this,"messages",[]),ru(this,"subGoals",[]),ru(this,"memories",[]),ru(this,"historicalLogs",[]),ru(this,"pendingFeedbackMessage",void 0),(null==e||null==(t=e.initialMessages)?void 0:t.length)&&this.seed(e.initialMessages),this.pendingFeedbackMessage=""}}async function rp(e){let{imageBase64:t,width:r,height:n,policy:i}=e,o=t,a=r,s=n;if(void 0!==i.padBlockSize){let e=await tR(t,i.padBlockSize);o=e.imageBase64,a=e.width,s=e.height}return{imageBase64:o,preparedSize:{width:a,height:s},contentSize:{width:r,height:n}}}let rh=(0,eN.a)("planning");function rf(e,t){let{actionSpace:r,includeLocateInPlanning:n,locateResultAdapter:i,locateResultContext:o}=t;e.forEach(e=>{let t=r.find(t=>t.name===e.type);if(!t)return void rh("skip locate normalization for action outside actionSpace",e);rh("actionInActionSpace matched",t);let a=t?tV(t.paramSchema):[];rh("locateFields",a),a.forEach(t=>{var r;let a=null==(r=e.param)?void 0:r[t];if(a){if(!n){"object"==typeof a&&(e.param[t]={prompt:a.prompt});return}(0,eZ.vA)(i,"planning locate normalization requires a locate result adapter"),e.param[t]={...a,locatedPixelBbox:i.adaptPlanningParamToPixelBbox(a,o)}}})})}async function rg(e,t,r){var n,i;let o,a,s,{context:A}=t,l=await rp({imageBase64:A.screenshot.base64,width:A.shotSize.width,height:A.shotSize.height,policy:t.modelRuntime.adapter.imagePreprocess}),c={...t,context:{...A,screenshot:rc.create(l.imageBase64,A.screenshot.capturedAt),shotSize:l.preparedSize}},u={userInstruction:e,userInstructionText:tX(e),options:c,coordinateSystem:r.coordinateSystem},d=function(e,t){let{options:r,userInstructionText:n}=e,{conversationHistory:i,context:o,actionContext:a}=r,s=t.buildSystemPrompt()+(a?`<high_priority_knowledge>${a}</high_priority_knowledge>
|
|
12
|
+
`:""),A=t.buildUserInstruction?t.buildUserInstruction(n):n;return(i.pendingFeedbackMessage&&(i.append({role:"user",content:[{type:"text",text:`${i.pendingFeedbackMessage}. The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.`}]}),i.resetPendingFeedbackMessageIfExists()),i.append({role:"user",content:[{type:"image_url",image_url:{url:o.screenshot.base64}}]}),"system-message"===t.systemPromptPlacement)?[{role:"system",content:s},{role:"user",content:[{type:"text",text:A}]},...r.referenceImageMessages??[],...i.snapshot(t.historyImageLimit)]:[{role:"user",content:`${s}${A}`},...r.referenceImageMessages??[],...i.snapshot(t.historyImageLimit)]}(u,r.messages),{content:p,usage:h,rawChoiceMessage:f}=await nm(d,c.modelRuntime,{abortSignal:c.abortSignal,requiresOriginalImageDetail:c.includeLocateInPlanning});try{o=r.parseResponse(p,u),a=r.transformActions(o,u),rf(a,{actionSpace:c.actionSpace,includeLocateInPlanning:c.includeLocateInPlanning,locateResultAdapter:r.coordinateNormalizer,locateResultContext:{preparedSize:l.preparedSize,contentSize:l.contentSize}}),s=r.shouldContinuePlanning(o,a)}catch(e){throw new np(`Parse error: ${e instanceof Error?e.message:String(e)}`,JSON.stringify(p,void 0,2),h,f)}let g=null==(n=(i=r.messages).buildAssistantContent)?void 0:n.call(i,o,p,u);return g&&t.conversationHistory.append({role:"assistant",content:g}),{actions:a,log:r.buildResponseLog(o,p),usage:h,shouldContinuePlanning:s,rawResponse:JSON.stringify(p,void 0,2),rawChoiceMessage:f}}let rm=(0,eN.a)("ai:inspect"),ry=[{name:"Tap",description:"Tap the element",paramSchema:tu.Ik({locate:tq}),call:async()=>void 0}];async function rv(e){let{options:t,locateImage:r}=e,{context:n}=t;return{...t,context:{...n,screenshot:rc.create(r.imageBase64,n.screenshot.capturedAt),shotSize:{width:r.width,height:r.height}},actionSpace:ry,conversationHistory:new rd,includeLocateInPlanning:!0,referenceImageMessages:e.referenceImageMessages}}let rb={coordinates:{shape:"bbox",order:"xy",normalizedBy:1e3}};function rw(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class rE{constructor(e,t){var r;rw(this,"jsonParser",void 0),rw(this,"chatCompletion",void 0),rw(this,"imagePreprocess",void 0),rw(this,"planning",void 0),rw(this,"locate",void 0),this.jsonParser=function(e){if(!e||"lenient-json"===e)return e5;if("function"==typeof e)return e;throw Error(`Unknown json parser preset: ${e}`)}(e.jsonParser),this.chatCompletion=function(e){let t=(null==e?void 0:e.buildChatCompletionParams)??e4,r=(null==e?void 0:e.resolveImageDetail)??e7;return{unsupportedUserConfig:(null==e?void 0:e.unsupportedUserConfig)??[],buildChatCompletionParams:e=>t({...e,userConfig:e.userConfig??{},midsceneDefaults:e8}),resolveImageDetail:e=>r({...e,userConfig:e.userConfig??{},midsceneDefaults:e8}),extractContentAndReasoning:(null==e?void 0:e.extractContentAndReasoning)??e6}}(e.chatCompletion),this.imagePreprocess=function(e){return{padBlockSize:null==e?void 0:e.padBlockSize}}(e.imagePreprocess);const n=(null==(r=e.planning)?void 0:r.kind)==="custom"?e.planning.planner:void 0,i=n?function(e){let{coordinates:t,...r}=e,n=tA(t),i=tc({coordinates:t});return{...r,coordinateSystem:n,coordinateNormalizer:i}}(n):void 0;this.planning=function(e,t){if((null==e?void 0:e.kind)==="custom"){if("function"==typeof e.planFn)return{kind:"custom",cacheEnabled:e.cacheEnabled??!1,defaultReplanningCycleLimit:e.defaultReplanningCycleLimit??20,supportsActionDeepLocate:e.supportsActionDeepLocate??!1,planFn:e.planFn};if(!t)throw Error("Custom planning planner definition is not resolved");return{kind:"custom",cacheEnabled:e.cacheEnabled??!1,defaultReplanningCycleLimit:e.defaultReplanningCycleLimit??20,supportsActionDeepLocate:e.supportsActionDeepLocate??!1,coordinateSystem:t.coordinateSystem,planFn:(e,r)=>rg(e,r,t)}}return{kind:"standard",cacheEnabled:(null==e?void 0:e.cacheEnabled)??!0,defaultReplanningCycleLimit:(null==e?void 0:e.defaultReplanningCycleLimit)??20,supportsActionDeepLocate:(null==e?void 0:e.supportsActionDeepLocate)??!0}}(e.planning,i),this.locate=function(e,t){if((null==e?void 0:e.kind)==="custom"){let r=e.locateFn;if(!r){let n,i=e.planningTapLocator;if(!i)throw Error("Custom locate definition requires either locateFn or planningTapLocator");if(!t)throw Error("Custom planning tap locator requires a custom planning planner definition");n={...t,messages:{...t.messages,buildSystemPrompt:i.buildSystemPrompt,buildUserInstruction:e=>`Tap: ${e}`}},r=async(e,t,r)=>{let o,a;(0,eZ.vA)(e,"cannot find the target element description");let s=[],A="",l="";try{let t=await rv(r),s=await rg(e,t,n);l=s.rawResponse??"",o=s.rawChoiceMessage,a=s.usage,A=s.log,rm("planning-tap-locator rawResponse:",l);let c=i.getLocatedPixelBbox(s.actions??[]);if(!c)throw Error("No locatedPixelBbox found in planner response");return{locatedPixelBbox:c,rawResponse:l,rawChoiceMessage:o,usage:a,reasoningContent:A}}catch(t){let e=t instanceof Error?t.message:String(t);t instanceof np&&(l=t.rawResponse,o=t.rawChoiceMessage,a=t.usage),rm("planning-tap-locator parse error:",(s=[e||"Failed to parse planning tap locator response"])[0])}return{rawResponse:l,rawChoiceMessage:o,usage:a,reasoningContent:A,errors:s}}}return{kind:"custom",supportsSearchArea:e.supportsSearchArea??!1,locateFn:r}}return{kind:"standard",supportsSearchArea:(null==e?void 0:e.supportsSearchArea)??!0,resultAdapter:tc((null==e?void 0:e.resultAdapter)??rb)}}(e.locate,i)}}function rk(e){for(let t of e)if("Tap"===t.type)return t.param.locate.locatedPixelBbox}function rx(){let e=new Date,t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][e.getDay()];return`${t}-${r}-${n}, ${i}`}function rS(){let e=new Date,t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),i=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"][e.getDay()];return`${t}年${r}月${n}日 ${i}`}let rC=(0,eN.a)("auto-glm-actions"),rI=["AndroidBackButton","HarmonyBackButton"],rj=["AndroidHomeButton","HarmonyHomeButton"];function rO(e,t,r){if(!e)return r;let n=e.find(e=>t.includes(e.name));return n?n.name:r}let rP=(0,eN.a)("auto-glm-parser"),rR=(e,t)=>{let r=e.indexOf(t);if(-1===r)throw Error(`Missing key ${t} in action payload ${e}`);let n=e.slice(r+t.length).trim();return n.endsWith('")')&&(n=n.slice(0,-2)),n};function rT(e){return{chatCompletion:{unsupportedUserConfig:["reasoningEnabled","reasoningEffort","reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,n={};return void 0!==r.temperature&&(n.temperature=r.temperature),{config:{...t,...n,top_p:.85,frequency_penalty:.2}}}},planning:{kind:"custom",cacheEnabled:!1,defaultReplanningCycleLimit:100,planner:{messages:{systemPromptPlacement:"system-message",buildSystemPrompt:()=>e?`
|
|
13
|
+
The current date: ${rx()}
|
|
14
|
+
|
|
15
|
+
# Setup
|
|
16
|
+
You are a professional Android operation agent assistant that can fulfill the user's high-level instructions. Given a screenshot of the Android interface at each step, you first analyze the situation, then plan the best course of action using Python-style pseudo-code.
|
|
17
|
+
|
|
18
|
+
# More details about the code
|
|
19
|
+
Your response format must be structured as follows:
|
|
20
|
+
|
|
21
|
+
Think first: Use <think>...</think> to analyze the current screen, identify key elements, and determine the most efficient action.
|
|
22
|
+
Provide the action: Use <answer>...</answer> to return a single line of pseudo-code representing the operation.
|
|
23
|
+
|
|
24
|
+
Your output should STRICTLY follow the format:
|
|
25
|
+
<think>
|
|
26
|
+
[Your thought]
|
|
27
|
+
</think>
|
|
28
|
+
<answer>
|
|
29
|
+
[Your operation code]
|
|
30
|
+
</answer>
|
|
31
|
+
|
|
32
|
+
- **Tap**
|
|
33
|
+
Perform a tap action on a specified screen area. The element is a list of 2 integers, representing the coordinates of the tap point.
|
|
34
|
+
**Example**:
|
|
35
|
+
<answer>
|
|
36
|
+
do(action="Tap", element=[x,y])
|
|
37
|
+
</answer>
|
|
38
|
+
- **Type**
|
|
39
|
+
Enter text into the currently focused input field.
|
|
40
|
+
**Example**:
|
|
41
|
+
<answer>
|
|
42
|
+
do(action="Type", text="Hello World")
|
|
43
|
+
</answer>
|
|
44
|
+
- **Swipe**
|
|
45
|
+
Perform a swipe action with start point and end point.
|
|
46
|
+
**Examples**:
|
|
47
|
+
<answer>
|
|
48
|
+
do(action="Swipe", start=[x1,y1], end=[x2,y2])
|
|
49
|
+
</answer>
|
|
50
|
+
- **Long Press**
|
|
51
|
+
Perform a long press action on a specified screen area.
|
|
52
|
+
You can add the element to the action to specify the long press area. The element is a list of 2 integers, representing the coordinates of the long press point.
|
|
53
|
+
**Example**:
|
|
54
|
+
<answer>
|
|
55
|
+
do(action="Long Press", element=[x,y])
|
|
56
|
+
</answer>
|
|
57
|
+
- **Launch**
|
|
58
|
+
Launch an app. Try to use launch action when you need to launch an app. Check the instruction to choose the right app before you use this action.
|
|
59
|
+
**Example**:
|
|
60
|
+
<answer>
|
|
61
|
+
do(action="Launch", app="Settings")
|
|
62
|
+
</answer>
|
|
63
|
+
- **Back**
|
|
64
|
+
Press the Back button to navigate to the previous screen.
|
|
65
|
+
**Example**:
|
|
66
|
+
<answer>
|
|
67
|
+
do(action="Back")
|
|
68
|
+
</answer>
|
|
69
|
+
- **Finish**
|
|
70
|
+
Terminate the program and optionally print a message.
|
|
71
|
+
**Example**:
|
|
72
|
+
<answer>
|
|
73
|
+
finish(message="Task completed.")
|
|
74
|
+
</answer>
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
REMEMBER:
|
|
78
|
+
- Think before you act: Always analyze the current UI and the best course of action before executing any step, and output in <think> part.
|
|
79
|
+
- Only ONE LINE of action in <answer> part per response: Each step must contain exactly one line of executable code.
|
|
80
|
+
- Generate execution code strictly according to format requirements.
|
|
81
|
+
`:`
|
|
82
|
+
今天的日期是: ${rS()}
|
|
83
|
+
|
|
84
|
+
你是一个智能体分析专家,可以根据操作历史和当前状态图执行一系列操作来完成任务。
|
|
85
|
+
你必须严格按照要求输出以下格式:
|
|
86
|
+
<think>{think}</think>
|
|
87
|
+
<answer>{action}</answer>
|
|
88
|
+
|
|
89
|
+
其中:
|
|
90
|
+
- {think} 是对你为什么选择这个操作的简短推理说明。
|
|
91
|
+
- {action} 是本次执行的具体操作指令,必须严格遵循下方定义的指令格式。
|
|
92
|
+
|
|
93
|
+
操作指令及其作用如下:
|
|
94
|
+
- do(action="Launch", app="xxx")
|
|
95
|
+
Launch是启动目标app的操作,这比通过主屏幕导航更快。此操作完成后,您将自动收到结果状态的截图。
|
|
96
|
+
- do(action="Tap", element=[x,y])
|
|
97
|
+
Tap是点击操作,点击屏幕上的特定点。可用此操作点击按钮、选择项目、从主屏幕打开应用程序,或与任何可点击的用户界面元素进行交互。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的截图。
|
|
98
|
+
- do(action="Tap", element=[x,y], message="重要操作")
|
|
99
|
+
基本功能同Tap,点击涉及财产、支付、隐私等敏感按钮时触发。
|
|
100
|
+
- do(action="Type", text="xxx")
|
|
101
|
+
Type是输入操作,在当前聚焦的输入框中输入文本。使用此操作前,请确保输入框已被聚焦(先点击它)。输入的文本将像使用键盘输入一样输入。重要提示:手机可能正在使用 ADB 键盘,该键盘不会像普通键盘那样占用屏幕空间。要确认键盘已激活,请查看屏幕底部是否显示 'ADB Keyboard {ON}' 类似的文本,或者检查输入框是否处于激活/高亮状态。不要仅仅依赖视觉上的键盘显示。自动清除文本:当你使用输入操作时,输入框中现有的任何文本(包括占位符文本和实际输入)都会在输入新文本前自动清除。你无需在输入前手动清除文本——直接使用输入操作输入所需文本即可。操作完成后,你将自动收到结果状态的截图。
|
|
102
|
+
- do(action="Type_Name", text="xxx")
|
|
103
|
+
Type_Name是输入人名的操作,基本功能同Type。
|
|
104
|
+
- do(action="Swipe", start=[x1,y1], end=[x2,y2])
|
|
105
|
+
Swipe是滑动操作,通过从起始坐标拖动到结束坐标来执行滑动手势。可用于滚动内容、在屏幕之间导航、下拉通知栏以及项目栏或进行基于手势的导航。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。滑动持续时间会自动调整以实现自然的移动。此操作完成后,您将自动收到结果状态的截图。
|
|
106
|
+
- do(action="Long Press", element=[x,y])
|
|
107
|
+
Long Pres是长按操作,在屏幕上的特定点长按指定时间。可用于触发上下文菜单、选择文本或激活长按交互。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的屏幕截图。
|
|
108
|
+
- do(action="Double Tap", element=[x,y])
|
|
109
|
+
Double Tap在屏幕上的特定点快速连续点按两次。使用此操作可以激活双击交互,如缩放、选择文本或打开项目。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的截图。
|
|
110
|
+
- do(action="Back")
|
|
111
|
+
导航返回到上一个屏幕或关闭当前对话框。相当于按下 Android 的返回按钮。使用此操作可以从更深的屏幕返回、关闭弹出窗口或退出当前上下文。此操作完成后,您将自动收到结果状态的截图。
|
|
112
|
+
- do(action="Home")
|
|
113
|
+
Home是回到系统桌面的操作,相当于按下 Android 主屏幕按钮。使用此操作可退出当前应用并返回启动器,或从已知状态启动新任务。此操作完成后,您将自动收到结果状态的截图。
|
|
114
|
+
- do(action="Wait", duration="x seconds")
|
|
115
|
+
等待页面加载,x为需要等待多少秒。
|
|
116
|
+
- finish(message="xxx")
|
|
117
|
+
finish是结束任务的操作,表示准确完整完成任务,message是终止信息。
|
|
118
|
+
|
|
119
|
+
必须遵循的规则:
|
|
120
|
+
0. 严禁调用 Interact、Take_over、Note、Call_API 这四个操作,这些操作暂不支持。
|
|
121
|
+
1. 在执行任何操作前,先检查当前app是否是目标app,如果不是,先执行 Launch。
|
|
122
|
+
2. 如果进入到了无关页面,先执行 Back。如果执行Back后页面没有变化,请点击页面左上角的返回键进行返回,或者右上角的X号关闭。
|
|
123
|
+
3. 如果页面未加载出内容,最多连续 Wait 三次,否则执行 Back重新进入。
|
|
124
|
+
4. 如果页面显示网络问题,需要重新加载,请点击重新加载。
|
|
125
|
+
5. 如果当前页面找不到目标联系人、商品、店铺等信息,可以尝试 Swipe 滑动查找。
|
|
126
|
+
6. 遇到价格区间、时间区间等筛选条件,如果没有完全符合的,可以放宽要求。
|
|
127
|
+
7. 在做小红书总结类任务时一定要筛选图文笔记。
|
|
128
|
+
8. 购物车全选后再点击全选可以把状态设为全不选,在做购物车任务时,如果购物车里已经有商品被选中时,你需要点击全选后再点击取消全选,再去找需要购买或者删除的商品。
|
|
129
|
+
9. 在做外卖任务时,如果相应店铺购物车里已经有其他商品你需要先把购物车清空再去购买用户指定的外卖。
|
|
130
|
+
10. 在做点外卖任务时,如果用户需要点多个外卖,请尽量在同一店铺进行购买,如果无法找到可以下单,并说明某个商品未找到。
|
|
131
|
+
11. 请严格遵循用户意图执行任务,用户的特殊要求可以执行多次搜索,滑动查找。比如(i)用户要求点一杯咖啡,要咸的,你可以直接搜索咸咖啡,或者搜索咖啡后滑动查找咸的咖啡,比如海盐咖啡。(ii)用户要找到XX群,发一条消息,你可以先搜索XX群,找不到结果后,将"群"字去掉,搜索XX重试。(iii)用户要找到宠物友好的餐厅,你可以搜索餐厅,找到筛选,找到设施,选择可带宠物,或者直接搜索可带宠物,必要时可以使用AI搜索。
|
|
132
|
+
12. 在选择日期时,如果原滑动方向与预期日期越来越远,请向反方向滑动查找。
|
|
133
|
+
13. 执行任务过程中如果有多个可选择的项目栏,请逐个查找每个项目栏,直到完成任务,一定不要在同一项目栏多次查找,从而陷入死循环。
|
|
134
|
+
14. 在执行下一步操作前请一定要检查上一步的操作是否生效,如果点击没生效,可能因为app反应较慢,请先稍微等待一下,如果还是不生效请调整一下点击位置重试,如果仍然不生效请跳过这一步继续任务,并在finish message说明点击不生效。
|
|
135
|
+
15. 在执行任务中如果遇到滑动不生效的情况,请调整一下起始点位置,增大滑动距离重试,如果还是不生效,有可能是已经滑到底了,请继续向反方向滑动,直到顶部或底部,如果仍然没有符合要求的结果,请跳过这一步继续任务,并在finish message说明但没找到要求的项目。
|
|
136
|
+
16. 在做游戏任务时如果在战斗页面如果有自动战斗一定要开启自动战斗,如果多轮历史状态相似要检查自动战斗是否开启。
|
|
137
|
+
17. 如果没有合适的搜索结果,可能是因为搜索页面不对,请返回到搜索页面的上一级尝试重新搜索,如果尝试三次返回上一级搜索后仍然没有符合要求的结果,执行 finish(message="原因")。
|
|
138
|
+
18. 在结束任务前请一定要仔细检查任务是否完整准确的完成,如果出现错选、漏选、多选的情况,请返回之前的步骤进行纠正。
|
|
139
|
+
`,historyImageLimit:1,buildAssistantContent:e=>`<think>${e.response.think}</think><answer>${e.response.content}</answer>`},coordinates:{shape:"point",order:"xy",normalizedBy:1e3},parseResponse:e=>{let t,r;return r=function(e){rP("Parsing action:",e);let t="";try{if((t=e.content.trim()).startsWith('do(action="Type"')||t.startsWith('do(action="Type_Name"')){let r=rR(t,'text="');return{_metadata:"do",action:"Type",text:r,think:e.think}}if(t.startsWith("finish(message=")){let r=rR(t,'finish(message="');return r.endsWith(")")&&(r=r.slice(0,-1)),{_metadata:"finish",message:r,think:e.think}}if(t.startsWith("do(")){let r=t.match(/do\(action="([^"]+)"/);if(!r)throw Error(`Failed to extract action type from do() call; raw="${t}"`);let n=r[1],i={_metadata:"do",think:e.think};switch(n){case"Tap":{let e=t.match(/element=\[(\d+),(\d+)\]/);if(!e)throw Error(`Failed to extract element coordinates for Tap; raw="${t}"`);return{...i,action:"Tap",element:[Number(e[1]),Number(e[2])]}}case"Double Tap":{let e=t.match(/element=\[(\d+),(\d+)\]/);if(!e)throw Error(`Failed to extract element coordinates for Double Tap; raw="${t}"`);return{...i,action:"Double Tap",element:[Number(e[1]),Number(e[2])]}}case"Swipe":{let e=t.match(/start=\[(\d+),(\d+)\]/),r=t.match(/end=\[(\d+),(\d+)\]/);if(!e||!r)throw Error(`Failed to extract start/end coordinates for Swipe; raw="${t}"`);return{...i,action:"Swipe",start:[Number(e[1]),Number(e[2])],end:[Number(r[1]),Number(r[2])]}}case"Long Press":{let e=t.match(/element=\[(\d+),(\d+)\]/);if(!e)throw Error(`Failed to extract element coordinates for Long Press; raw="${t}"`);return{...i,action:"Long Press",element:[Number(e[1]),Number(e[2])]}}case"Launch":{let e=rR(t,'app="');return{...i,action:"Launch",app:e}}case"Back":return{...i,action:"Back"};case"Home":return{...i,action:"Home"};case"Wait":{let e=t.match(/duration=(?:["\[])?(\d+)/);if(!e)throw Error(`Failed to extract duration for Wait; raw="${t}"`);let r=Number.parseInt(e[1],10);return{...i,action:"Wait",durationMs:1e3*r}}case"Interact":return{...i,action:"Interact"};case"Call_API":{let e=rR(t,'instruction="');return{...i,action:"Call_API",instruction:e}}case"Take_over":{let e=rR(t,'message="');return{...i,action:"Take_over",message:e}}case"Note":{let e=rR(t,'message="');return{...i,action:"Note",message:e}}default:throw Error(`Unknown action type: ${n}; raw="${t}"`)}}throw Error(`Failed to parse action: ${t}`)}catch(r){let e=r instanceof Error?r.message:String(r);throw Error(`Failed to parse action: ${e}; raw="${t}"`)}}(t=function(e){let t;if(e.includes("finish(message=")){let r=e.split("finish(message=");t={think:r[0].trim(),content:`finish(message=${r[1]}`}}else if(e.includes("do(action=")){let r=e.split("do(action=");t={think:r[0].trim(),content:`do(action=${r[1]}`}}else if(e.includes("<answer>")){let r=e.split("<answer>");t={think:r[0].replace(/<think>/g,"").replace(/<\/think>/g,"").trim(),content:r[1].replace(/<\/answer>/g,"").trim()}}else t={think:"",content:e};return rP("autoGLM rawResponse:",e),rP("thinking in response:",t.think),rP("action in response:",t.content),t}(e)),{response:t,action:r}},transformActions:(e,t)=>{var r;let{options:n,coordinateSystem:i}=t;return(0,eZ.vA)(i,"Auto-GLM planning requires coordinate system"),function(e,t){let{actionSpace:r,coordinateDistanceToPixels:n}=t;try{switch(e._metadata){case"finish":return rC("Transform finish action:",e),[{type:"Finished",param:{},thought:e.message}];case"do":switch(e.action){case"Tap":return rC("Transform Tap action:",e),[{type:"Tap",param:{locate:{point:e.element,prompt:""}}}];case"Double Tap":return rC("Transform Double Tap action:",e),[{type:"DoubleClick",param:{locate:{point:e.element,prompt:""}}}];case"Type":return rC("Transform Type action:",e),[{type:"Input",param:{value:e.text}}];case"Swipe":{let t,r;rC("Transform Swipe action:",e);let i=e.end[0]-e.start[0],o=e.end[1]-e.start[1],a=Math.abs(i);return Math.abs(o)>a?(r=n(o,"y"),t=o>0?"up":"down"):(r=n(i,"x"),t=i>0?"left":"right"),rC(`Calculate swipe direction: ${t}, distance: ${r}`),[{type:"Scroll",param:{locate:{point:e.start,prompt:""},distance:r,direction:t},thought:e.think||""}]}case"Long Press":return rC("Transform Long Press action:",e),[{type:"LongPress",param:{locate:{point:e.element,prompt:""}},thought:e.think||""}];case"Back":return rC("Transform Back action:",e),[{type:rO(r,rI,"AndroidBackButton"),param:{},thought:e.think||""}];case"Home":return rC("Transform Home action:",e),[{type:rO(r,rj,"AndroidHomeButton"),param:{},thought:e.think||""}];case"Wait":return rC("Transform Wait action:",e),[{type:"Sleep",param:{timeMs:e.durationMs},thought:e.think||""}];case"Launch":return rC("Transform Launch action:",e),[{type:"Launch",param:{uri:e.app},thought:e.think||""}];case"Interact":throw Error('Action "Interact" from auto-glm is not supported in the current implementation.');case"Call_API":throw Error('Action "Call_API" from auto-glm is not supported in the current implementation.');case"Take_over":throw Error('Action "Take_over" from auto-glm is not supported in the current implementation.');case"Note":throw Error('Action "Note" from auto-glm is not supported in the current implementation.');default:throw Error(`Unknown do() action type: ${e.action}`)}default:throw Error(`Unknown action metadata: ${e._metadata}`)}}catch(t){let e=t instanceof Error?t.message:String(t);throw rC("Transform error:",e),Error(`Failed to transform action: ${e}`)}}(e.action,{actionSpace:n.actionSpace,coordinateDistanceToPixels:(r=n.context.shotSize,(e,t)=>void 0===i.normalizedBy?Math.round(Math.abs(e)):Math.round(Math.abs(e)*("x"===t?r.width:r.height)/i.normalizedBy))})},shouldContinuePlanning:e=>"finish"!==e.action._metadata,buildResponseLog:(e,t)=>t}},locate:{kind:"custom",planningTapLocator:{buildSystemPrompt:()=>e?`
|
|
140
|
+
The current date: ${rx()}
|
|
141
|
+
|
|
142
|
+
# Setup
|
|
143
|
+
You are a professional Android operation agent assistant that can fulfill the user's high-level instructions. Given a screenshot of the Android interface at each step, you first analyze the situation, then plan the best course of action using Python-style pseudo-code.
|
|
144
|
+
|
|
145
|
+
# More details about the code
|
|
146
|
+
Your response format must be structured as follows:
|
|
147
|
+
|
|
148
|
+
Think first: Use <think>...</think> to analyze the current screen, identify key elements, and determine the most efficient action.
|
|
149
|
+
Provide the action: Use <answer>...</answer> to return a single line of pseudo-code representing the operation.
|
|
150
|
+
|
|
151
|
+
Your output should STRICTLY follow the format:
|
|
152
|
+
<think>
|
|
153
|
+
[Your thought]
|
|
154
|
+
</think>
|
|
155
|
+
<answer>
|
|
156
|
+
[Your operation code]
|
|
157
|
+
</answer>
|
|
158
|
+
|
|
159
|
+
- **Tap**
|
|
160
|
+
Perform a tap action on a specified screen area. The element is a list of 2 integers, representing the coordinates of the tap point.
|
|
161
|
+
**Example**:
|
|
162
|
+
<answer>
|
|
163
|
+
do(action="Tap", element=[x,y])
|
|
164
|
+
</answer>
|
|
165
|
+
|
|
166
|
+
REMEMBER:
|
|
167
|
+
- Your goal is to locate and tap the UI element specified by the user (e.g., button, icon, link, etc.). Do not attempt any other actions.
|
|
168
|
+
`:`
|
|
169
|
+
今天的日期是: ${rS()}
|
|
170
|
+
|
|
171
|
+
你是一个智能体分析专家,可以根据操作历史和当前状态图执行一系列操作来完成任务。
|
|
172
|
+
你必须严格按照要求输出以下格式:
|
|
173
|
+
<think>{think}</think>
|
|
174
|
+
<answer>{action}</answer>
|
|
175
|
+
|
|
176
|
+
其中:
|
|
177
|
+
- {think} 是对你为什么选择这个操作的简短推理说明。
|
|
178
|
+
- {action} 是本次执行的具体操作指令,必须严格遵循下方定义的指令格式。
|
|
179
|
+
|
|
180
|
+
操作指令及其作用如下:
|
|
181
|
+
- do(action="Tap", element=[x,y])
|
|
182
|
+
Tap是点击操作,点击屏幕上的特定点。可用此操作点击按钮、选择项目、从主屏幕打开应用程序,或与任何可点击的用户界面元素进行交互。坐标系统从左上角 (0,0) 开始到右下角(999,999)结束。此操作完成后,您将自动收到结果状态的截图。
|
|
183
|
+
|
|
184
|
+
必须遵循的规则:
|
|
185
|
+
- 你的目标是定位并点击用户指定的UI元素(例如按钮、图标、链接等),请不要尝试任何其他的操作。
|
|
186
|
+
`,getLocatedPixelBbox:rk}}}}let rN={"auto-glm":rT(!1),"auto-glm-multilingual":rT(!0)},rM={chatCompletion:{unsupportedUserConfig:["reasoningEnabled","reasoningEffort","reasoningBudget"]}},rD={jsonParser:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{source:"generic-object"},{source:r}=t;try{return e5(e,t)}catch(i){if("locate"!==r&&"section-locator"!==r&&"planning-action-param"!==r)throw i;let n=function(e){if(e.includes("bbox"))for(;/\d+\s+\d+/.test(e);)e=e.replace(/(\d+)\s+(\d+)/g,"$1,$2");return e}(e2(e));try{return function e(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==t)return t;if(Array.isArray(t))return t.map(t=>e(t,r));if("object"==typeof t){let i={};for(let[o,a]of Object.entries(t)){var n;let t=o.trim(),s=(null==(n=r.preserveStringValueKeys)?void 0:n.includes(t))??!1,A="string"==typeof a?s?a:a.trim():e(a,r);i[t]=A}return i}return"string"==typeof t?t.trim():t}(JSON.parse((0,e1.m)(n)),t)}catch(t){throw Error(`failed to parse LLM response into JSON. Error - ${String(t??i??"unknown error")}. Response -
|
|
187
|
+
${e}`)}}},chatCompletion:{unsupportedUserConfig:["reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,{reasoningEnabled:n,reasoningEffort:i}=r,o={};void 0!==r.temperature&&(o.temperature=r.temperature);let a={};return"default"!==n&&(a.thinking={type:n?"enabled":"disabled"},i&&(a.reasoning_effort=i)),{config:{...t,...o,...a}}}},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"xy",normalizedBy:1e3},parseRawLocateValue:function(e){let t=to(e);if("string"==typeof t){(0,eZ.vA)(/^(\d+)\s(\d+)\s(\d+)\s(\d+)$/.test(t.trim()),`invalid bbox data string for doubao-vision mode: ${t}`);let e=t.split(" ");if(4===e.length)return{type:"bbox",coordinates:[Number(e[0]),Number(e[1]),Number(e[2]),Number(e[3])]};throw Error(`invalid bbox data string for doubao-vision mode: ${t}`)}let r=[];if(Array.isArray(t)&&"string"==typeof t[0]?t.forEach(e=>{if("string"==typeof e&&e.includes(",")){let[t,n]=e.split(",");r.push(Number(t.trim()),Number(n.trim()))}else if("string"==typeof e&&e.includes(" ")){let[t,n]=e.split(" ");r.push(Number(t.trim()),Number(n.trim()))}else r.push(Number(e))}):r=t,4===r.length||5===r.length)return{type:"bbox",coordinates:[r[0],r[1],r[2],r[3]]};if(6===r.length||2===r.length||3===r.length||7===r.length)return{type:"point",coordinates:[r[0],r[1]]};if(8===t.length)return{type:"bbox",coordinates:[r[0],r[1],r[4],r[5]]};throw Error(`invalid bbox data for doubao-vision mode: ${JSON.stringify(t)} `)}}}},rz=e=>{let{geminiReasoningContent:t,providerReasoningContent:r}=e;return t&&r?`thoughtParts:${t}; reasoning_content:${r}`:t||r||""},rB={chatCompletion:{unsupportedUserConfig:["reasoningEffort"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,{reasoningEnabled:n,reasoningBudget:i}=r,o={};void 0!==r.temperature&&(o.temperature=r.temperature);let a={};return"default"!==n&&(a.enable_thinking=n??!1,void 0!==i&&(a.thinking_budget=i)),{config:{...t,...o,...a}}}},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"xy",normalizedBy:1e3}}}};var rL=r(5409);let rU={0:{keyCode:48,key:"0",code:"Digit0"},1:{keyCode:49,key:"1",code:"Digit1"},2:{keyCode:50,key:"2",code:"Digit2"},3:{keyCode:51,key:"3",code:"Digit3"},4:{keyCode:52,key:"4",code:"Digit4"},5:{keyCode:53,key:"5",code:"Digit5"},6:{keyCode:54,key:"6",code:"Digit6"},7:{keyCode:55,key:"7",code:"Digit7"},8:{keyCode:56,key:"8",code:"Digit8"},9:{keyCode:57,key:"9",code:"Digit9"},Power:{key:"Power",code:"Power"},Eject:{key:"Eject",code:"Eject"},Abort:{keyCode:3,code:"Abort",key:"Cancel"},Help:{keyCode:6,code:"Help",key:"Help"},Backspace:{keyCode:8,code:"Backspace",key:"Backspace"},Tab:{keyCode:9,code:"Tab",key:"Tab"},Numpad5:{keyCode:12,shiftKeyCode:101,key:"Clear",code:"Numpad5",shiftKey:"5",location:3},NumpadEnter:{keyCode:13,code:"NumpadEnter",key:"Enter",text:"\r",location:3},Enter:{keyCode:13,code:"Enter",key:"Enter",text:"\r"},"\r":{keyCode:13,code:"Enter",key:"Enter",text:"\r"},"\n":{keyCode:13,code:"Enter",key:"Enter",text:"\r"},ShiftLeft:{keyCode:16,code:"ShiftLeft",key:"Shift",location:1},ShiftRight:{keyCode:16,code:"ShiftRight",key:"Shift",location:2},ControlLeft:{keyCode:17,code:"ControlLeft",key:"Control",location:1},ControlRight:{keyCode:17,code:"ControlRight",key:"Control",location:2},AltLeft:{keyCode:18,code:"AltLeft",key:"Alt",location:1},AltRight:{keyCode:18,code:"AltRight",key:"Alt",location:2},Pause:{keyCode:19,code:"Pause",key:"Pause"},CapsLock:{keyCode:20,code:"CapsLock",key:"CapsLock"},Escape:{keyCode:27,code:"Escape",key:"Escape"},Convert:{keyCode:28,code:"Convert",key:"Convert"},NonConvert:{keyCode:29,code:"NonConvert",key:"NonConvert"},Space:{keyCode:32,code:"Space",key:" "},Numpad9:{keyCode:33,shiftKeyCode:105,key:"PageUp",code:"Numpad9",shiftKey:"9",location:3},PageUp:{keyCode:33,code:"PageUp",key:"PageUp"},Numpad3:{keyCode:34,shiftKeyCode:99,key:"PageDown",code:"Numpad3",shiftKey:"3",location:3},PageDown:{keyCode:34,code:"PageDown",key:"PageDown"},End:{keyCode:35,code:"End",key:"End"},Numpad1:{keyCode:35,shiftKeyCode:97,key:"End",code:"Numpad1",shiftKey:"1",location:3},Home:{keyCode:36,code:"Home",key:"Home"},Numpad7:{keyCode:36,shiftKeyCode:103,key:"Home",code:"Numpad7",shiftKey:"7",location:3},ArrowLeft:{keyCode:37,code:"ArrowLeft",key:"ArrowLeft"},Numpad4:{keyCode:37,shiftKeyCode:100,key:"ArrowLeft",code:"Numpad4",shiftKey:"4",location:3},Numpad8:{keyCode:38,shiftKeyCode:104,key:"ArrowUp",code:"Numpad8",shiftKey:"8",location:3},ArrowUp:{keyCode:38,code:"ArrowUp",key:"ArrowUp"},ArrowRight:{keyCode:39,code:"ArrowRight",key:"ArrowRight"},Numpad6:{keyCode:39,shiftKeyCode:102,key:"ArrowRight",code:"Numpad6",shiftKey:"6",location:3},Numpad2:{keyCode:40,shiftKeyCode:98,key:"ArrowDown",code:"Numpad2",shiftKey:"2",location:3},ArrowDown:{keyCode:40,code:"ArrowDown",key:"ArrowDown"},Select:{keyCode:41,code:"Select",key:"Select"},Open:{keyCode:43,code:"Open",key:"Execute"},PrintScreen:{keyCode:44,code:"PrintScreen",key:"PrintScreen"},Insert:{keyCode:45,code:"Insert",key:"Insert"},Numpad0:{keyCode:45,shiftKeyCode:96,key:"Insert",code:"Numpad0",shiftKey:"0",location:3},Delete:{keyCode:46,code:"Delete",key:"Delete"},NumpadDecimal:{keyCode:46,shiftKeyCode:110,code:"NumpadDecimal",key:"\0",shiftKey:".",location:3},Digit0:{keyCode:48,code:"Digit0",shiftKey:")",key:"0"},Digit1:{keyCode:49,code:"Digit1",shiftKey:"!",key:"1"},Digit2:{keyCode:50,code:"Digit2",shiftKey:"@",key:"2"},Digit3:{keyCode:51,code:"Digit3",shiftKey:"#",key:"3"},Digit4:{keyCode:52,code:"Digit4",shiftKey:"$",key:"4"},Digit5:{keyCode:53,code:"Digit5",shiftKey:"%",key:"5"},Digit6:{keyCode:54,code:"Digit6",shiftKey:"^",key:"6"},Digit7:{keyCode:55,code:"Digit7",shiftKey:"&",key:"7"},Digit8:{keyCode:56,code:"Digit8",shiftKey:"*",key:"8"},Digit9:{keyCode:57,code:"Digit9",shiftKey:"(",key:"9"},KeyA:{keyCode:65,code:"KeyA",shiftKey:"A",key:"a"},KeyB:{keyCode:66,code:"KeyB",shiftKey:"B",key:"b"},KeyC:{keyCode:67,code:"KeyC",shiftKey:"C",key:"c"},KeyD:{keyCode:68,code:"KeyD",shiftKey:"D",key:"d"},KeyE:{keyCode:69,code:"KeyE",shiftKey:"E",key:"e"},KeyF:{keyCode:70,code:"KeyF",shiftKey:"F",key:"f"},KeyG:{keyCode:71,code:"KeyG",shiftKey:"G",key:"g"},KeyH:{keyCode:72,code:"KeyH",shiftKey:"H",key:"h"},KeyI:{keyCode:73,code:"KeyI",shiftKey:"I",key:"i"},KeyJ:{keyCode:74,code:"KeyJ",shiftKey:"J",key:"j"},KeyK:{keyCode:75,code:"KeyK",shiftKey:"K",key:"k"},KeyL:{keyCode:76,code:"KeyL",shiftKey:"L",key:"l"},KeyM:{keyCode:77,code:"KeyM",shiftKey:"M",key:"m"},KeyN:{keyCode:78,code:"KeyN",shiftKey:"N",key:"n"},KeyO:{keyCode:79,code:"KeyO",shiftKey:"O",key:"o"},KeyP:{keyCode:80,code:"KeyP",shiftKey:"P",key:"p"},KeyQ:{keyCode:81,code:"KeyQ",shiftKey:"Q",key:"q"},KeyR:{keyCode:82,code:"KeyR",shiftKey:"R",key:"r"},KeyS:{keyCode:83,code:"KeyS",shiftKey:"S",key:"s"},KeyT:{keyCode:84,code:"KeyT",shiftKey:"T",key:"t"},KeyU:{keyCode:85,code:"KeyU",shiftKey:"U",key:"u"},KeyV:{keyCode:86,code:"KeyV",shiftKey:"V",key:"v"},KeyW:{keyCode:87,code:"KeyW",shiftKey:"W",key:"w"},KeyX:{keyCode:88,code:"KeyX",shiftKey:"X",key:"x"},KeyY:{keyCode:89,code:"KeyY",shiftKey:"Y",key:"y"},KeyZ:{keyCode:90,code:"KeyZ",shiftKey:"Z",key:"z"},MetaLeft:{keyCode:91,code:"MetaLeft",key:"Meta",location:1},MetaRight:{keyCode:92,code:"MetaRight",key:"Meta",location:2},ContextMenu:{keyCode:93,code:"ContextMenu",key:"ContextMenu"},NumpadMultiply:{keyCode:106,code:"NumpadMultiply",key:"*",location:3},NumpadAdd:{keyCode:107,code:"NumpadAdd",key:"+",location:3},NumpadSubtract:{keyCode:109,code:"NumpadSubtract",key:"-",location:3},NumpadDivide:{keyCode:111,code:"NumpadDivide",key:"/",location:3},F1:{keyCode:112,code:"F1",key:"F1"},F2:{keyCode:113,code:"F2",key:"F2"},F3:{keyCode:114,code:"F3",key:"F3"},F4:{keyCode:115,code:"F4",key:"F4"},F5:{keyCode:116,code:"F5",key:"F5"},F6:{keyCode:117,code:"F6",key:"F6"},F7:{keyCode:118,code:"F7",key:"F7"},F8:{keyCode:119,code:"F8",key:"F8"},F9:{keyCode:120,code:"F9",key:"F9"},F10:{keyCode:121,code:"F10",key:"F10"},F11:{keyCode:122,code:"F11",key:"F11"},F12:{keyCode:123,code:"F12",key:"F12"},F13:{keyCode:124,code:"F13",key:"F13"},F14:{keyCode:125,code:"F14",key:"F14"},F15:{keyCode:126,code:"F15",key:"F15"},F16:{keyCode:127,code:"F16",key:"F16"},F17:{keyCode:128,code:"F17",key:"F17"},F18:{keyCode:129,code:"F18",key:"F18"},F19:{keyCode:130,code:"F19",key:"F19"},F20:{keyCode:131,code:"F20",key:"F20"},F21:{keyCode:132,code:"F21",key:"F21"},F22:{keyCode:133,code:"F22",key:"F22"},F23:{keyCode:134,code:"F23",key:"F23"},F24:{keyCode:135,code:"F24",key:"F24"},NumLock:{keyCode:144,code:"NumLock",key:"NumLock"},ScrollLock:{keyCode:145,code:"ScrollLock",key:"ScrollLock"},AudioVolumeMute:{keyCode:173,code:"AudioVolumeMute",key:"AudioVolumeMute"},AudioVolumeDown:{keyCode:174,code:"AudioVolumeDown",key:"AudioVolumeDown"},AudioVolumeUp:{keyCode:175,code:"AudioVolumeUp",key:"AudioVolumeUp"},MediaTrackNext:{keyCode:176,code:"MediaTrackNext",key:"MediaTrackNext"},MediaTrackPrevious:{keyCode:177,code:"MediaTrackPrevious",key:"MediaTrackPrevious"},MediaStop:{keyCode:178,code:"MediaStop",key:"MediaStop"},MediaPlayPause:{keyCode:179,code:"MediaPlayPause",key:"MediaPlayPause"},Semicolon:{keyCode:186,code:"Semicolon",shiftKey:":",key:";"},Equal:{keyCode:187,code:"Equal",shiftKey:"+",key:"="},NumpadEqual:{keyCode:187,code:"NumpadEqual",key:"=",location:3},Comma:{keyCode:188,code:"Comma",shiftKey:"<",key:","},Minus:{keyCode:189,code:"Minus",shiftKey:"_",key:"-"},Period:{keyCode:190,code:"Period",shiftKey:">",key:"."},Slash:{keyCode:191,code:"Slash",shiftKey:"?",key:"/"},Backquote:{keyCode:192,code:"Backquote",shiftKey:"~",key:"`"},BracketLeft:{keyCode:219,code:"BracketLeft",shiftKey:"{",key:"["},Backslash:{keyCode:220,code:"Backslash",shiftKey:"|",key:"\\"},BracketRight:{keyCode:221,code:"BracketRight",shiftKey:"}",key:"]"},Quote:{keyCode:222,code:"Quote",shiftKey:'"',key:"'"},AltGraph:{keyCode:225,code:"AltGraph",key:"AltGraph"},Props:{keyCode:247,code:"Props",key:"CrSel"},Cancel:{keyCode:3,key:"Cancel",code:"Abort"},Clear:{keyCode:12,key:"Clear",code:"Numpad5",location:3},Shift:{keyCode:16,key:"Shift",code:"ShiftLeft",location:1},Control:{keyCode:17,key:"Control",code:"ControlLeft",location:1},Alt:{keyCode:18,key:"Alt",code:"AltLeft",location:1},Accept:{keyCode:30,key:"Accept"},ModeChange:{keyCode:31,key:"ModeChange"}," ":{keyCode:32,key:" ",code:"Space"},Print:{keyCode:42,key:"Print"},Execute:{keyCode:43,key:"Execute",code:"Open"},"\0":{keyCode:46,key:"\0",code:"NumpadDecimal",location:3},a:{keyCode:65,key:"a",code:"KeyA"},b:{keyCode:66,key:"b",code:"KeyB"},c:{keyCode:67,key:"c",code:"KeyC"},d:{keyCode:68,key:"d",code:"KeyD"},e:{keyCode:69,key:"e",code:"KeyE"},f:{keyCode:70,key:"f",code:"KeyF"},g:{keyCode:71,key:"g",code:"KeyG"},h:{keyCode:72,key:"h",code:"KeyH"},i:{keyCode:73,key:"i",code:"KeyI"},j:{keyCode:74,key:"j",code:"KeyJ"},k:{keyCode:75,key:"k",code:"KeyK"},l:{keyCode:76,key:"l",code:"KeyL"},m:{keyCode:77,key:"m",code:"KeyM"},n:{keyCode:78,key:"n",code:"KeyN"},o:{keyCode:79,key:"o",code:"KeyO"},p:{keyCode:80,key:"p",code:"KeyP"},q:{keyCode:81,key:"q",code:"KeyQ"},r:{keyCode:82,key:"r",code:"KeyR"},s:{keyCode:83,key:"s",code:"KeyS"},t:{keyCode:84,key:"t",code:"KeyT"},u:{keyCode:85,key:"u",code:"KeyU"},v:{keyCode:86,key:"v",code:"KeyV"},w:{keyCode:87,key:"w",code:"KeyW"},x:{keyCode:88,key:"x",code:"KeyX"},y:{keyCode:89,key:"y",code:"KeyY"},z:{keyCode:90,key:"z",code:"KeyZ"},Meta:{keyCode:91,key:"Meta",code:"MetaLeft",location:1},"*":{keyCode:106,key:"*",code:"NumpadMultiply",location:3},"+":{keyCode:107,key:"+",code:"NumpadAdd",location:3},"-":{keyCode:109,key:"-",code:"NumpadSubtract",location:3},"/":{keyCode:111,key:"/",code:"NumpadDivide",location:3},";":{keyCode:186,key:";",code:"Semicolon"},"=":{keyCode:187,key:"=",code:"Equal"},",":{keyCode:188,key:",",code:"Comma"},".":{keyCode:190,key:".",code:"Period"},"`":{keyCode:192,key:"`",code:"Backquote"},"[":{keyCode:219,key:"[",code:"BracketLeft"},"\\":{keyCode:220,key:"\\",code:"Backslash"},"]":{keyCode:221,key:"]",code:"BracketRight"},"'":{keyCode:222,key:"'",code:"Quote"},Attn:{keyCode:246,key:"Attn"},CrSel:{keyCode:247,key:"CrSel",code:"Props"},ExSel:{keyCode:248,key:"ExSel"},EraseEof:{keyCode:249,key:"EraseEof"},Play:{keyCode:250,key:"Play"},ZoomOut:{keyCode:251,key:"ZoomOut"},")":{keyCode:48,key:")",code:"Digit0"},"!":{keyCode:49,key:"!",code:"Digit1"},"@":{keyCode:50,key:"@",code:"Digit2"},"#":{keyCode:51,key:"#",code:"Digit3"},$:{keyCode:52,key:"$",code:"Digit4"},"%":{keyCode:53,key:"%",code:"Digit5"},"^":{keyCode:54,key:"^",code:"Digit6"},"&":{keyCode:55,key:"&",code:"Digit7"},"(":{keyCode:57,key:"(",code:"Digit9"},A:{keyCode:65,key:"A",code:"KeyA"},B:{keyCode:66,key:"B",code:"KeyB"},C:{keyCode:67,key:"C",code:"KeyC"},D:{keyCode:68,key:"D",code:"KeyD"},E:{keyCode:69,key:"E",code:"KeyE"},F:{keyCode:70,key:"F",code:"KeyF"},G:{keyCode:71,key:"G",code:"KeyG"},H:{keyCode:72,key:"H",code:"KeyH"},I:{keyCode:73,key:"I",code:"KeyI"},J:{keyCode:74,key:"J",code:"KeyJ"},K:{keyCode:75,key:"K",code:"KeyK"},L:{keyCode:76,key:"L",code:"KeyL"},M:{keyCode:77,key:"M",code:"KeyM"},N:{keyCode:78,key:"N",code:"KeyN"},O:{keyCode:79,key:"O",code:"KeyO"},P:{keyCode:80,key:"P",code:"KeyP"},Q:{keyCode:81,key:"Q",code:"KeyQ"},R:{keyCode:82,key:"R",code:"KeyR"},S:{keyCode:83,key:"S",code:"KeyS"},T:{keyCode:84,key:"T",code:"KeyT"},U:{keyCode:85,key:"U",code:"KeyU"},V:{keyCode:86,key:"V",code:"KeyV"},W:{keyCode:87,key:"W",code:"KeyW"},X:{keyCode:88,key:"X",code:"KeyX"},Y:{keyCode:89,key:"Y",code:"KeyY"},Z:{keyCode:90,key:"Z",code:"KeyZ"},":":{keyCode:186,key:":",code:"Semicolon"},"<":{keyCode:188,key:"<",code:"Comma"},_:{keyCode:189,key:"_",code:"Minus"},">":{keyCode:190,key:">",code:"Period"},"?":{keyCode:191,key:"?",code:"Slash"},"~":{keyCode:192,key:"~",code:"Backquote"},"{":{keyCode:219,key:"{",code:"BracketLeft"},"|":{keyCode:220,key:"|",code:"Backslash"},"}":{keyCode:221,key:"}",code:"BracketRight"},'"':{keyCode:222,key:'"',code:"Quote"},SoftLeft:{key:"SoftLeft",code:"SoftLeft",location:4},SoftRight:{key:"SoftRight",code:"SoftRight",location:4},Camera:{keyCode:44,key:"Camera",code:"Camera",location:4},Call:{key:"Call",code:"Call",location:4},EndCall:{keyCode:95,key:"EndCall",code:"EndCall",location:4},VolumeDown:{keyCode:182,key:"VolumeDown",code:"VolumeDown",location:4},VolumeUp:{keyCode:183,key:"VolumeUp",code:"VolumeUp",location:4}},rK=Object.entries(rU).reduce((e,t)=>{let[r,n]=t,i=r.toLowerCase();return i!==r&&(e[i]=n),e},{}),rF=e=>{let t=e.toLowerCase();return rK[t]?rK[t].key:e},rZ="undefined"!=typeof window?/Mac|iPod|iPhone|iPad/.test(window.navigator.platform):"darwin"===rL.platform,rQ={return:rU.Enter.key,enter:rU.Enter.key,ctrl:rZ?rU.Meta.key:rU.Control.key,shift:rU.Shift.key,alt:rU.Alt.key,space:rU.Space.key,"page down":rU.PageDown.key,pagedown:rU.PageDown.key,"page up":rU.PageUp.key,pageup:rU.PageUp.key},rJ=(0,eN.a)("ui-tars-planning"),rX=(0,eN.a)("ui-tars-planning",{console:!0});function rH(e){let[t,r]=JSON.parse(e);return(0,eZ.vA)("number"==typeof t&&Number.isFinite(t)&&"number"==typeof r&&Number.isFinite(r),`invalid point data for ui-tars planning: ${e}`),[t,r]}var rG=r(2788);let rq=(0,eN.a)("ui-tars-planning");function rW(){let e=e_();return`
|
|
188
|
+
You are a GUI agent. You are given a task and your action history, with screenshots. You need to perform the next action to complete the task.
|
|
189
|
+
|
|
190
|
+
## Output Format
|
|
191
|
+
\`\`\`
|
|
192
|
+
Thought: ...
|
|
193
|
+
Action: ...
|
|
194
|
+
\`\`\`
|
|
195
|
+
|
|
196
|
+
## Action Space
|
|
197
|
+
|
|
198
|
+
click(start_box='[x1, y1, x2, y2]')
|
|
199
|
+
left_double(start_box='[x1, y1, x2, y2]')
|
|
200
|
+
right_single(start_box='[x1, y1, x2, y2]')
|
|
201
|
+
drag(start_box='[x1, y1, x2, y2]', end_box='[x3, y3, x4, y4]')
|
|
202
|
+
hotkey(key='')
|
|
203
|
+
type(content='xxx') # Use escape characters \\', \\", and \\n in content part to ensure we can parse the content in normal python string format. If you want to submit your input, use \\n at the end of content.
|
|
204
|
+
scroll(start_box='[x1, y1, x2, y2]', direction='down or up or right or left')
|
|
205
|
+
wait() #Sleep for 5s and take a screenshot to check for any changes.
|
|
206
|
+
finished(content='xxx') # Use escape characters \\', \\", and \\n in content part to ensure we can parse the content in normal python string format.
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
## Note
|
|
210
|
+
- Use ${e} in \`Thought\` part.
|
|
211
|
+
- Write a small plan and finally summarize your next action (with its target element) in one sentence in \`Thought\` part.
|
|
212
|
+
|
|
213
|
+
## User Instruction
|
|
214
|
+
`}let rV=e=>e.replace(/Reflection:[\s\S]*?(?=Action_Summary:|Action:|$)/g,"").trim(),rY=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{source:"generic-object"},{source:r}=t;try{return e5(e,t)}catch(i){if("locate"!==r&&"section-locator"!==r&&"planning-action-param"!==r)throw i;let n=function(e){if(e.includes("bbox"))for(;/\d+\s+\d+/.test(e);)e=e.replace(/(\d+)\s+(\d+)/g,"$1,$2");return e}(e2(e));try{return function e(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==t)return t;if(Array.isArray(t))return t.map(t=>e(t,r));if("object"==typeof t){let i={};for(let[o,a]of Object.entries(t)){var n;let t=o.trim(),s=(null==(n=r.preserveStringValueKeys)?void 0:n.includes(t))??!1,A="string"==typeof a?s?a:a.trim():e(a,r);i[t]=A}return i}return"string"==typeof t?t.trim():t}(JSON.parse((0,e1.m)(n)),t)}catch(t){throw Error(`failed to parse LLM response into JSON. Error - ${String(t??i??"unknown error")}. Response -
|
|
215
|
+
${e}`)}}};function r_(e){let t=to(e);if("string"==typeof t){(0,eZ.vA)(/^(\d+)\s(\d+)\s(\d+)\s(\d+)$/.test(t.trim()),`invalid bbox data string for ui-tars mode: ${t}`);let e=t.split(" ");if(4===e.length)return{type:"bbox",coordinates:[Number(e[0]),Number(e[1]),Number(e[2]),Number(e[3])]};throw Error(`invalid bbox data string for ui-tars mode: ${t}`)}let r=[];if(Array.isArray(t)&&"string"==typeof t[0]?t.forEach(e=>{if("string"==typeof e&&e.includes(",")){let[t,n]=e.split(",");r.push(Number(t.trim()),Number(n.trim()))}else if("string"==typeof e&&e.includes(" ")){let[t,n]=e.split(" ");r.push(Number(t.trim()),Number(n.trim()))}else r.push(Number(e))}):r=t,4===r.length||5===r.length)return{type:"bbox",coordinates:[r[0],r[1],r[2],r[3]]};if(6===r.length||2===r.length||3===r.length||7===r.length)return{type:"point",coordinates:[r[0],r[1]]};if(8===t.length)return{type:"bbox",coordinates:[r[0],r[1],r[4],r[5]]};throw Error(`invalid bbox data for ui-tars mode: ${JSON.stringify(t)} `)}function r$(e){return{jsonParser:rY,chatCompletion:{unsupportedUserConfig:["reasoningEnabled","reasoningEffort","reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,n={};return void 0!==r.temperature&&(n.temperature=r.temperature),{config:{...t,...n}}}},planning:{kind:"custom",cacheEnabled:!1,defaultReplanningCycleLimit:40,planner:{messages:{systemPromptPlacement:"user-message",buildSystemPrompt:rW,buildUserInstruction:e=>`<user_instruction>${e}</user_instruction>`,buildAssistantContent:(e,t)=>rV(t)},coordinates:{shape:"point",order:"xy",normalizedBy:1},parseResponse:(t,r)=>{var n;let i,o,{options:a}=r;return n=a.context.shotSize,i=t.replace(/\[EOS\]/g,"").replace(/```(?:[a-zA-Z0-9_-]+)?/g,"").replace(/<bbox>(\d+)\s+(\d+)\s+(\d+)\s+(\d+)<\/bbox>/g,function(e,t,r,n,i){let o=Number.parseInt(t,10),a=Number.parseInt(r,10),s=Number.parseInt(n,10),A=Number.parseInt(i,10),l=Math.floor((o+s)/2),c=Math.floor((a+A)/2);return`(${l},${c})`}).trim(),o=(0,rG.q)({prediction:i,factor:[1e3,1e3],screenContext:{width:n.width,height:n.height},modelVer:e}),rq("ui-tars modelVer",e,", parsed",JSON.stringify(o.parsed)),{rawResponse:t,actions:o.parsed}},transformActions:e=>(function(e){let t=[],r=[];if(e.actions.forEach(e=>{let n=(e.action_type||"").toLowerCase();if("click"===n){(0,eZ.vA)(e.action_inputs.start_box,"start_box is required");let r={point:rH(e.action_inputs.start_box),prompt:e.thought||""};t.push({type:"Tap",param:{locate:r}})}else if("left_double"===n){(0,eZ.vA)(e.action_inputs.start_box,"start_box is required");let r={point:rH(e.action_inputs.start_box),prompt:e.thought||""};t.push({type:"DoubleClick",param:{locate:r},thought:e.thought||""})}else if("right_single"===n){(0,eZ.vA)(e.action_inputs.start_box,"start_box is required");let r={point:rH(e.action_inputs.start_box),prompt:e.thought||""};t.push({type:"RightClick",param:{locate:r},thought:e.thought||""})}else if("drag"===n){(0,eZ.vA)(e.action_inputs.start_box,"start_box is required"),(0,eZ.vA)(e.action_inputs.end_box,"end_box is required");let r=rH(e.action_inputs.start_box),n=rH(e.action_inputs.end_box);t.push({type:"DragAndDrop",param:{from:{point:r,prompt:e.thought||""},to:{point:n,prompt:e.thought||""}},thought:e.thought||""})}else if("type"===n)t.push({type:"Input",param:{value:e.action_inputs.content},thought:e.thought||""});else if("scroll"===n)t.push({type:"Scroll",param:{direction:e.action_inputs.direction},thought:e.thought||""});else if("finished"===n)t.push({type:"Finished",param:{},thought:e.action_inputs.content||e.thought||""});else if("hotkey"===n)if(e.action_inputs.key){var i;let r=rQ[(i=e.action_inputs.key).toLowerCase()]?[rF(rQ[i.toLowerCase()])]:i.split(" ").map(e=>rF(rQ[e.toLowerCase()]||e));t.push({type:"KeyboardPress",param:{keyName:r.join("+")},thought:e.thought||""})}else rX("No key found in action: hotkey. Will not perform action.");else"wait"===n?t.push({type:"Sleep",param:{timeMs:1e3},thought:e.thought||""}):n&&(r.push({type:n,thought:e.thought||""}),rJ("Unhandled action type:",n,"thought:",e.thought))}),0===t.length)throw Error(function(e,t,r){let n=[];if(0===t.length&&(n.push("Action parser returned no actions"),e.includes("Thought:")&&!e.includes("Action:")?n.push('Response contains "Thought:" but missing "Action:" line'):n.push("Response may be malformed or empty")),r.length>0){let e=r.map(e=>e.type).join(", ");n.push(`Unhandled action types: ${e}`)}return["No actions found in UI-TARS response.",...n].join("\n")}(e.rawResponse,e.actions,r));return rJ("transformActions",JSON.stringify(t,null,2)),t})(e),shouldContinuePlanning:(e,t)=>t.every(e=>"Finished"!==e.type),buildResponseLog:(e,t)=>rV(t)}},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"xy",normalizedBy:1e3},parseRawLocateValue:r_}}}}let r0=r$(eD.UH.DOUBAO_1_5_20B),r1={"qwen2.5-vl":{chatCompletion:{unsupportedUserConfig:["reasoningEnabled","reasoningEffort","reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,n={};return void 0!==r.temperature&&(n.temperature=r.temperature),{config:{...t,...n,vl_high_resolution_images:!0}}}},imagePreprocess:{padBlockSize:28},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"xy"},parseRawLocateValue:function(e){let t=to(e);if(t.length<2)throw Error(`invalid bbox data for qwen-vl mode: ${JSON.stringify(t)} `);return"number"==typeof t[2]&&"number"==typeof t[3]?{type:"bbox",coordinates:[t[0],t[1],t[2],t[3]]}:{type:"point",coordinates:[t[0],t[1]]}},mapLocateResultToPixelBbox:function(e){var t,r;return"bbox"===e.type?[Math.round(e.coordinates[0]),Math.round(e.coordinates[1]),Math.round(e.coordinates[2]),Math.round(e.coordinates[3])]:[Math.round(t=e.coordinates[0]),Math.round(r=e.coordinates[1]),Math.round(t+20),Math.round(r+20)]}}}},"qwen3-vl":rB,qwen3:rB,"qwen3.5":rB,"qwen3.6":rB,"doubao-vision":rD,"doubao-seed":rD,gemini:{chatCompletion:{unsupportedUserConfig:["reasoningEnabled","reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r,intent:n}=e,{reasoningEnabled:i,reasoningEffort:o}=r,a={};void 0!==r.temperature&&(a.temperature=r.temperature);let s={};return"default"!==i&&(o?s.extra_body={google:{thinking_config:{thinking_level:o,include_thoughts:!0}}}:("insight"===n&&(s.extra_body={google:{thinking_config:{include_thoughts:!0}}}),s.reasoning_effort="minimal")),{config:{...t,...a,...s}}},extractContentAndReasoning:e=>{var t;let r;if(!e)return{content:"",reasoning_content:""};if(Array.isArray(e.content)){let t=(e=>{let t=[],r=[];for(let n of e){if(!(n&&"object"==typeof n&&!Array.isArray(n)))continue;let e="string"==typeof n.text?n.text:void 0;e&&(!0===n.thought?r.push(e):t.push(e))}return{content:t.join(""),geminiReasoningContent:r.join("")}})(e.content);return{content:t.content,reasoning_content:rz({geminiReasoningContent:t.geminiReasoningContent,providerReasoningContent:"string"==typeof e.reasoning_content?e.reasoning_content:""})}}let n=e6(e),i=(null==(r=n.content.match(/<thought>([\s\S]*?)<\/thought>/i))||null==(t=r[1])?void 0:t.trim())||"";return{content:n.content,reasoning_content:rz({geminiReasoningContent:i,providerReasoningContent:n.reasoning_content})}}},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"yx",normalizedBy:1e3}}}},...{"vlm-ui-tars":r$(eD.UH.V1_0),"vlm-ui-tars-doubao":r0,"vlm-ui-tars-doubao-1.5":r0},"glm-v":{chatCompletion:{unsupportedUserConfig:["reasoningEffort","reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,{reasoningEnabled:n}=r,i={};void 0!==r.temperature&&(i.temperature=r.temperature);let o={};return"default"!==n&&(o.thinking={type:n?"enabled":"disabled"}),{config:{...t,...i,...o}}}},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"xy",normalizedBy:1e3}}}},...rN,"gpt-5":{chatCompletion:{unsupportedUserConfig:["reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,{reasoningEnabled:n,reasoningEffort:i}=r,o={};return void 0!==r.temperature&&(o.temperature=r.temperature),{config:{...t,...o,reasoning_effort:!0===n?i??"medium":"none"}}},resolveImageDetail:e=>"default"===e.intent||e.requiresOriginalImageDetail?"original":void 0},locate:{resultAdapter:{coordinates:{shape:"bbox",order:"xy"}}}},kimi:{chatCompletion:{unsupportedUserConfig:["reasoningEffort","reasoningBudget"],buildChatCompletionParams:e=>{let{midsceneDefaults:t,userConfig:r}=e,{reasoningEnabled:n}=r,i={};return i.temperature=void 0,{config:{...t,...i,thinking:{type:n?"enabled":"disabled"}}}}},locate:{resultAdapter:{coordinates:{shape:"point",order:"xy",normalizedBy:1}}}},"xiaomi-mimo":{chatCompletion:{unsupportedUserConfig:["reasoningEffort","reasoningBudget"],buildChatCompletionParams:e=>{let{intent:t,midsceneDefaults:r,userConfig:n}=e,{reasoningEnabled:i}=n,o={};return o.response_format={type:"default"===t?"json_object":"text"},void 0!==n.temperature&&(o.temperature=n.temperature),{config:{...r,...o,thinking:{type:i?"enabled":"disabled"}}}}}}},r2=new Map,r3=(0,eN.a)("ai:model-adapter");function r5(e){return{config:e,adapter:function(e){var t;let r=e??"default",n=r2.get(r);if(n)return n;let i=e?r1[e]:rM;if(!i)throw Error(`No model adapter registered for modelFamily: ${e}`);return n=new rE(i,r),r2.set(r,n),0!==(t=n).chatCompletion.unsupportedUserConfig.length&&r3(`model adapter "${r}" unsupportedUserConfig: ${JSON.stringify(t.chatCompletion.unsupportedUserConfig)}`),n}(e.modelFamily)}}var r7=r(5409),r4=r(4201).Buffer;function r8(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let r6=(0,eN.a)("ai:call:codex"),r9=(0,eN.a)("ai:call:codex",{console:!0});class ne{async run(e){let t,r=this.tail;this.tail=new Promise(e=>{t=e}),await r;try{return await e()}finally{t()}}constructor(){r8(this,"tail",Promise.resolve())}}let nt=e=>{if(!e)return!1;if(e instanceof Error&&"AbortError"===e.name)return!0;let t=e instanceof Error?e.message:String(e??"unknown error");return/aborted|abort/i.test(t)},nr=e=>{if("string"==typeof e)return e.trim()||void 0},nn=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r7.platform;if(!e.startsWith("file://"))return e;try{let r=new URL(e),n=decodeURIComponent(r.pathname),i=r.hostname.toLowerCase();if("win32"===t){let e=n.replace(/\//g,"\\").replace(/^\\([A-Za-z]:)/,"$1");if(i&&"localhost"!==i)return`\\\\${r.hostname}${e}`;return e}if(i&&"localhost"!==i)return`//${r.hostname}${n}`;return n}catch{return decodeURIComponent(e.slice(7))}},ni=e=>{let t=e.content;return"string"==typeof t?t:Array.isArray(t)?t.map(e=>e&&"object"==typeof e&&("text"===e.type&&"string"==typeof e.text||"input_text"===e.type&&"string"==typeof e.text)?e.text:"").filter(Boolean).join("\n"):""},no=e=>{let t=e.content;if(!Array.isArray(t))return[];let r=[];for(let e of t){var n;if(!e||"object"!=typeof e)continue;let t=String(e.type||""),i="image_url"===t?nr(null==(n=e.image_url)?void 0:n.url):"input_image"===t?nr(e.image_url||e.url):void 0;if(i){if(i.startsWith("/")||i.startsWith("./")||i.startsWith("../")||i.startsWith("file://")){let e=i.startsWith("file://")?nn(i):i;r.push({type:"localImage",path:e});continue}r.push({type:"image",url:i})}}return r};class na{static async create(){if(eZ.ht)throw Error("codex app-server provider is not supported in browser runtime");let{spawn:e}=await r(8817)("node:child_process"),t=await r(8541)("node:readline"),n=e("codex",["app-server"],{stdio:["pipe","pipe","pipe"]});if(!n.stdin||!n.stdout||!n.stderr)throw Error("failed to start codex app-server: stdio unavailable");let i=t.createInterface({input:n.stdout,crlfDelay:1/0}),o=new na(n,i);return o.detachFromEventLoop(),o.attachProcessListeners(),await o.initializeHandshake(),o}isClosed(){return this.closed}async runTurn(e){let t,r,n,i,{messages:o,modelConfig:a,stream:s,onChunk:A,reasoningEnabled:l,abortSignal:c}=e,u=Date.now(),d=a.timeout||6e5,p=Date.now()+d,h=!!(s&&A),{developerInstructions:f,input:g}=(e=>{let t=[],r=[],n=[];for(let i of e){let e=String(i.role||"user"),o=ni(i);if("system"===e){o.trim()&&t.push(o.trim());continue}let a=e.toUpperCase();o.trim()?r.push(`[${a}]
|
|
216
|
+
${o.trim()}`):r.push(`[${a}]
|
|
217
|
+
(no text content)`),"user"===e&&n.push(...no(i))}let i=r.join("\n\n"),o=[{type:"text",text:(i.length>262144?i.slice(-262144):i)||"Please answer the latest user request.",text_elements:[]},...n];return{developerInstructions:t.length?t.join("\n\n"):void 0,input:o}})(o),m=(e=>{var t;let{reasoningEnabled:r,modelConfig:n}=e;if(!0===r)return"high";if(!1===r)return"none";if("default"===r)return;let i=null==(t=n.reasoningEffort)?void 0:t.trim().toLowerCase();return"none"===i||"minimal"===i||"low"===i||"medium"===i||"high"===i||"xhigh"===i?i:"none"})({reasoningEnabled:l,modelConfig:a}),y="",v="",b=e=>{let{content:t,reasoning:r,isComplete:n,usage:i}=e;h&&A&&A({content:t,reasoning_content:r,accumulated:y,isComplete:n,usage:i})};try{var w,E,k,x,S,C,I,j;let e,o=await this.request({method:"thread/start",params:{model:a.modelName,cwd:r7.cwd(),approvalPolicy:"never",sandbox:"read-only",ephemeral:!0,experimentalRawEvents:!1,persistExtendedHistory:!1,developerInstructions:f||null},deadlineAt:p,abortSignal:c});if(!(t=null==o||null==(w=o.thread)?void 0:w.id))throw Error("thread/start did not return a thread id");let s=await this.request({method:"turn/start",params:{threadId:t,input:g,effort:m},deadlineAt:p,abortSignal:c});if(!(r=null==s||null==(E=s.turn)?void 0:E.id))throw Error("turn/start did not return a turn id");for(;!e;){let o=await this.nextMessage({deadlineAt:p,abortSignal:c});if(this.isResponseMessage(o))continue;if(this.isRequestMessage(o)){await this.respondToServerRequest(o);continue}let s=o.method,A=o.params||{};if("error"===s){let e=(null==(C=A.error)?void 0:C.message)||A.message||"codex app-server reported turn error";n=String(e);continue}if("item/agentMessage/delta"===s&&A.threadId===t&&A.turnId===r){let e=String(A.delta||"");e&&(y+=e,b({content:e,reasoning:"",isComplete:!1}));continue}if(("item/reasoning/summaryTextDelta"===s||"item/reasoning/textDelta"===s)&&A.threadId===t&&A.turnId===r){let e=String(A.delta||"");e&&(v+=e,b({content:"",reasoning:e,isComplete:!1}));continue}if("item/completed"===s&&A.threadId===t&&A.turnId===r&&(null==(k=A.item)?void 0:k.type)==="agentMessage"&&"string"==typeof(null==(x=A.item)?void 0:x.text)&&!y){y=A.item.text;continue}if("thread/tokenUsage/updated"===s&&A.threadId===t&&A.turnId===r){i=this.mapUsage({usage:A,modelConfig:a,turnId:r,startTime:u});continue}if("turn/completed"===s&&A.threadId===t&&(null==(S=A.turn)?void 0:S.id)===r){e=String(A.turn.status||""),n=(null==(j=A.turn)||null==(I=j.error)?void 0:I.message)||n||void 0;break}}if("completed"!==e)throw Error(n||`codex turn finished with status "${e||"unknown"}"`);return h&&b({content:"",reasoning:"",isComplete:!0,usage:i}),{content:y,reasoning_content:v||void 0,usage:i,isStreamed:h}}catch(e){throw nt(e)&&t&&r&&await this.request({method:"turn/interrupt",params:{threadId:t,turnId:r},deadlineAt:Date.now()+5e3}).catch(()=>{}),e}finally{t&&await this.request({method:"thread/unsubscribe",params:{threadId:t},deadlineAt:Date.now()+8e3}).catch(e=>{r9(`failed to unsubscribe codex thread ${t}: ${String(e)}`)})}}async dispose(){var e,t,r,n,i,o,a;if(!this.closed){this.closed=!0;try{null==(t=this.lineReader)||null==(e=t.close)||e.call(t)}catch{}try{null==(i=this.child)||null==(n=i.stdin)||null==(r=n.end)||r.call(n)}catch{}try{null==(a=this.child)||null==(o=a.kill)||o.call(a)}catch{}}}attachProcessListeners(){this.lineReader.on("line",e=>{this.lineBuffer.push(e)}),this.child.stderr.on("data",e=>{let t=r4.isBuffer(e)?e.toString("utf8"):String(e);this.stderrBuffer+=t,this.stderrBuffer.length>8192&&(this.stderrBuffer=this.stderrBuffer.slice(-8192))}),this.child.on("exit",e=>{this.closed=!0,this.lastExitCode=e}),this.child.on("error",e=>{this.closed=!0,this.processErrorMessage=e.message})}detachFromEventLoop(){var e,t,r,n,i,o,a,s;null==(e=(t=this.child).unref)||e.call(t),null==(n=this.child.stdin)||null==(r=n.unref)||r.call(n),null==(o=this.child.stdout)||null==(i=o.unref)||i.call(o),null==(s=this.child.stderr)||null==(a=s.unref)||a.call(s)}async initializeHandshake(){let e=Date.now()+15e3;await this.request({method:"initialize",params:{clientInfo:{name:"midscene_codex_provider",title:"Midscene Codex Provider",version:"1.0.0"},capabilities:{experimentalApi:!1}},deadlineAt:e}),await this.sendMessage({method:"initialized"})}mapUsage(e){let{usage:t,modelConfig:r,turnId:n,startTime:i}=e,o=t.tokenUsage,a=(null==o?void 0:o.last)||(null==o?void 0:o.total);if(a)return{...a,prompt_tokens:a.inputTokens??0,completion_tokens:a.outputTokens??0,total_tokens:a.totalTokens??0,cached_input:a.cachedInputTokens??0,time_cost:Date.now()-i,model_name:r.modelName,model_description:r.modelDescription,response_model_name:void 0,slot:r.slot,intent:void 0,request_id:n}}isRequestMessage(e){return"string"==typeof(null==e?void 0:e.method)&&(null==e?void 0:e.id)!==void 0}isResponseMessage(e){return(null==e?void 0:e.id)!==void 0&&((null==e?void 0:e.result)!==void 0||(null==e?void 0:e.error)!==void 0)&&"string"!=typeof(null==e?void 0:e.method)}async request(e){let{method:t,params:r,deadlineAt:n,abortSignal:i}=e,o=this.nextRequestId++;for(await this.sendMessage({id:o,method:t,params:r});;){let e=await this.nextMessage({deadlineAt:n,abortSignal:i,includePending:!1});if(this.isResponseMessage(e)&&e.id===o){if(e.error)throw Error(`codex app-server ${t} failed: ${e.error.message||"unknown error"}`);return e.result||{}}if(this.isRequestMessage(e)){await this.respondToServerRequest(e);continue}this.pendingMessages.push(e)}}async respondToServerRequest(e){let t=e.id,r=e.method,n={};if("item/commandExecution/requestApproval"===r)n={decision:"decline"};else if("item/fileChange/requestApproval"===r)n={decision:"decline"};else if("mcpServer/elicitation/request"===r)n={action:"cancel",content:null};else{if("item/tool/requestUserInput"!==r)return void await this.sendMessage({id:t,error:{code:-32601,message:`unsupported server request: ${r}`}});n={answers:[]}}await this.sendMessage({id:t,result:n})}async nextMessage(e){let{deadlineAt:t,abortSignal:r,includePending:n=!0}=e;if(n&&this.pendingMessages.length)return this.pendingMessages.shift();for(;;){if(null==r?void 0:r.aborted)throw Error("codex app-server request aborted");if(t&&Date.now()>t)throw Error("codex app-server request timed out");if(this.lineBuffer.length){let e,t=this.lineBuffer.shift().trim();if(!t)continue;try{e=JSON.parse(t)}catch(e){r9(`ignored non-JSON message from codex app-server: ${t}`);continue}return e}if(this.closed)throw this.createClosedConnectionError();await new Promise(e=>setTimeout(e,20))}}async sendMessage(e){if(this.closed)throw this.createClosedConnectionError();let t=JSON.stringify(e);await new Promise((e,r)=>{this.child.stdin.write(`${t}
|
|
218
|
+
`,t=>{t?r(Error(`failed writing to codex app-server stdin: ${t.message}`)):e()})})}createClosedConnectionError(){let e=this.stderrBuffer.trim();return this.processErrorMessage?Error(e?`codex app-server process error: ${this.processErrorMessage}. stderr=${e}`:`codex app-server process error: ${this.processErrorMessage}`):Error(e?`codex app-server connection closed (exitCode=${this.lastExitCode}). stderr=${e}`:`codex app-server connection closed (exitCode=${this.lastExitCode})`)}constructor(e,t){r8(this,"child",void 0),r8(this,"lineReader",void 0),r8(this,"pendingMessages",[]),r8(this,"lineBuffer",[]),r8(this,"nextRequestId",1),r8(this,"closed",!1),r8(this,"lastExitCode",null),r8(this,"processErrorMessage",null),r8(this,"stderrBuffer",""),this.child=e,this.lineReader=t}}let ns=new class{async runTurn(e){let{messages:t,modelConfig:r,stream:n,onChunk:i,reasoningEnabled:o,abortSignal:a}=e;return this.runner.run(async()=>{let e=await this.getConnection();try{return await e.runTurn({messages:t,modelConfig:r,stream:n,onChunk:i,reasoningEnabled:o,abortSignal:a})}catch(t){throw(e.isClosed()||!nt(t))&&await this.resetConnection(),t}})}async shutdownForTests(){await this.resetConnection()}async getConnection(){return(!this.connection||this.connection.isClosed())&&(this.connection=await na.create(),r6("started long-lived codex app-server connection")),this.connection}async resetConnection(){if(!this.connection)return;let e=this.connection;this.connection=null,await e.dispose(),r6("reset codex app-server connection")}constructor(){r8(this,"connection",null),r8(this,"runner",new ne)}};async function nA(e,t,r){if(eZ.ht)throw Error("codex app-server provider is not supported in browser runtime");return ns.runTurn({messages:e,modelConfig:t,stream:null==r?void 0:r.stream,onChunk:null==r?void 0:r.onChunk,reasoningEnabled:null==r?void 0:r.reasoningEnabled,abortSignal:null==r?void 0:r.abortSignal})}let nl="AI_CALL_HARD_TIMEOUT";function nc(e){let{timeout:t}=e;return"number"!=typeof t?18e4:t<=0?null:t}function nu(e,t){let r,n=new AbortController;if(null==t?void 0:t.aborted)return n.abort(t.reason),{signal:n.signal,cleanup:()=>{}};null!==e&&"function"==typeof(r=setTimeout(()=>{let t=Error(`AI call hard timeout after ${e}ms (full request time exceeded)`);t.code=nl,n.abort(t)},e)).unref&&r.unref();let i=t?()=>n.abort(t.reason):void 0;return t&&i&&t.addEventListener("abort",i,{once:!0}),{signal:n.signal,cleanup:()=>{r&&clearTimeout(r),t&&i&&t.removeEventListener("abort",i)}}}function nd(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class np extends Error{constructor(e,t,r,n){super(e),nd(this,"usage",void 0),nd(this,"rawResponse",void 0),nd(this,"rawChoiceMessage",void 0),this.name="AIResponseParseError",this.rawResponse=t,this.usage=r,this.rawChoiceMessage=n}}async function nh(e){let t,{modelConfig:n}=e,{socksProxy:i,httpProxy:o,modelName:a,openaiBaseURL:s,openaiApiKey:A,openaiExtraConfig:l,modelDescription:c,modelFamily:u,createOpenAIClient:d,timeout:p}=n,h=(0,eN.a)("ai:call",{console:!0}),f=(0,eN.a)("ai:call:proxy"),g=(0,eN.a)("ai:call:proxy",{console:!0}),m=e=>{try{let t=new URL(e);if(t.username)return t.password="****",t.href;return e}catch{return e}};if(o)if(f("using http proxy",m(o)),eZ.ht)g("HTTP proxy is configured but not supported in browser environment");else{let{ProxyAgent:e}=await r(5737)("undici");t=new e({uri:o})}else if(i)if(f("using socks proxy",m(i)),eZ.ht)g("SOCKS proxy is configured but not supported in browser environment");else try{let{socksDispatcher:e}=await r(3348)("fetch-socks"),n=new URL(i);if(!n.hostname)throw Error("SOCKS proxy URL must include a valid hostname");let o=Number.parseInt(n.port,10);if(!n.port||Number.isNaN(o))throw Error("SOCKS proxy URL must include a valid port");let a=n.protocol.replace(":",""),s="socks4"===a?4:5;t=e({type:s,host:n.hostname,port:o,...n.username?{userId:decodeURIComponent(n.username),password:decodeURIComponent(n.password||"")}:{}}),f("socks proxy configured successfully",{type:s,host:n.hostname,port:o})}catch(e){throw g("Failed to configure SOCKS proxy:",e),Error(`Invalid SOCKS proxy URL: ${i}. Expected format: socks4://host:port, socks5://host:port, or with authentication: socks5://user:pass@host:port`)}let y=nc({timeout:p}),v={baseURL:s,apiKey:A,...t?{fetchOptions:{dispatcher:t}}:{},...l,maxRetries:0,...null!==y?{timeout:y}:{},dangerouslyAllowBrowser:!0},b=new e0.Ay(v),w=b;if(w&&eY.getEnvConfigInBoolean(eD.ZX)){if(eZ.ht)throw Error("langsmith is not supported in browser");h("DEBUGGING MODE: langsmith wrapper enabled");let{wrapOpenAI:e}=await r(1560)("langsmith/wrappers");w=e(w)}if(w&&eY.getEnvConfigInBoolean(eD.$L)){if(eZ.ht)throw Error("langfuse is not supported in browser");h("DEBUGGING MODE: langfuse wrapper enabled");let{observeOpenAI:e}=await r(9998)("@langfuse/openai");w=e(w)}if(d){let e=await d(b,v);e&&(w=e)}return{completion:w.chat.completions,modelName:a,modelDescription:c,modelFamily:u}}async function nf(e,t,r){var n,i,o,a,s,A,l,c,u,d;let p,h,f,g,m,y,{config:v,adapter:b}=t;if((n=v.openaiBaseURL)&&n.trim().toLowerCase().startsWith("codex://"))return nA(e,v,{stream:null==r?void 0:r.stream,onChunk:null==r?void 0:r.onChunk,reasoningEnabled:v.reasoningEnabled,abortSignal:null==r?void 0:r.abortSignal});let{completion:w,modelName:E,modelDescription:k,modelFamily:x}=await nh({modelConfig:v}),S=nc(v),C=v.extraBody,I=(0,eN.a)("ai:call"),j=(0,eN.a)("ai:call",{console:!0}),O=(0,eN.a)("ai:profile:stats"),P=(0,eN.a)("ai:profile:detail"),R=Date.now(),T=(null==r?void 0:r.stream)&&(null==r?void 0:r.onChunk),N={intent:v.intent,userConfig:{temperature:v.temperature,reasoningEnabled:v.reasoningEnabled,reasoningEffort:v.reasoningEffort,reasoningBudget:v.reasoningBudget},requiresOriginalImageDetail:null==r?void 0:r.requiresOriginalImageDetail},{config:M}=b.chatCompletion.buildChatCompletionParams(N);I(`adapter chat completion params: ${function(e){try{return JSON.stringify(e)}catch(t){return String(e)}}({config:M})}`);let D="",z="",B=e=>"string"==typeof e&&e.trim().length>0,L=(e,t)=>{var r;if(!e)return;let n=null==e||null==(r=e.prompt_tokens_details)?void 0:r.cached_tokens;return{...e,prompt_tokens:e.prompt_tokens??0,completion_tokens:e.completion_tokens??0,total_tokens:e.total_tokens??0,cached_input:n??0,time_cost:g??0,model_name:E,model_description:k,response_model_name:y,slot:v.slot,intent:void 0,request_id:t??void 0}},U={...M,...C??{}},K=U.temperature,F=b.chatCompletion.resolveImageDetail(N),Z=F?e.map(e=>{if(!Array.isArray(e.content))return e;let t=e.content.map(e=>{var t;return e&&"image_url"===e.type&&(null==(t=e.image_url)?void 0:t.url)?{...e,image_url:{...e.image_url,detail:F}}:e});return{...e,content:t}}):e;try{if(I(`sending ${T?"streaming ":""}request to ${E}`),T){let{signal:e,cleanup:t}=nu(S,null==r?void 0:r.abortSignal);try{let t=await w.create({model:E,messages:Z,...U,stream:!0},{stream:!0,signal:e});for await(let e of(m=t._request_id,t)){let t=b.chatCompletion.extractContentAndReasoning(null==(o=e.choices)||null==(i=o[0])?void 0:i.delta),n=t.content||"",A=t.reasoning_content||"";if(e.usage&&(f=e.usage),e.model&&(y=e.model),n||A){D+=n,z+=A;let e={content:n,reasoning_content:A,accumulated:D,isComplete:!1,usage:void 0};r.onChunk(e)}if(null==(s=e.choices)||null==(a=s[0])?void 0:a.finish_reason){if(g=Date.now()-R,!f){let e=Math.max(1,Math.floor(D.length/4));f={prompt_tokens:e,completion_tokens:e,total_tokens:2*e}}let e={content:"",accumulated:D,reasoning_content:"",isComplete:!0,usage:L(f,m)};r.onChunk(e);break}}}finally{t()}p=D,O(`streaming model, ${E}, mode, ${x||"default"}, cost-ms, ${g}, temperature, ${K??""}`)}else{let e,t=(d=v.retryCount,"number"==typeof d&&Number.isFinite(d)?Math.max(0,Math.floor(d)):1),n=v.retryInterval??2e3,i=t+1,o=[];for(let t=1;t<=i;t++){let{signal:a,cleanup:s}=nu(S,null==r?void 0:r.abortSignal);try{let e=await w.create({model:E,messages:Z,...U,stream:!1},{signal:a});if(g=Date.now()-R,O(`model, ${E}, mode, ${x||"default"}, prompt-tokens, ${(null==(A=e.usage)?void 0:A.prompt_tokens)||""}, completion-tokens, ${(null==(l=e.usage)?void 0:l.completion_tokens)||""}, total-tokens, ${(null==(c=e.usage)?void 0:c.total_tokens)||""}, cost-ms, ${g}, requestId, ${e._request_id||""}, temperature, ${K??""}`),P(`model usage detail: ${JSON.stringify(e.usage)}`),!e.choices)throw Error(`invalid response from LLM service: ${JSON.stringify(e)}`);h=e.choices[0].message;let t=b.chatCompletion.extractContentAndReasoning(e.choices[0].message);if(p=t.content,z=t.reasoning_content,f=e.usage,m=e._request_id,y=e.model,!B(p)&&B(z)&&(j("empty content from AI model, using reasoning content"),p=z),!B(p))throw new np("empty content from AI model",JSON.stringify(e),L(f,m),h);break}catch(a){if(e=a instanceof Error?a:Error(String(a)),o.push({attempt:t,error:a}),function(e){if(!e||"object"!=typeof e)return!1;if(e.code===nl)return!0;let t=e.cause;return!!t&&"object"==typeof t&&t.code===nl}(e)&&j(`AI call hit hard timeout (${S}ms, attempt ${t}/${i}, model ${E}, slot ${v.slot})`),null==r||null==(u=r.abortSignal)?void 0:u.aborted)break;t<i&&(j(`AI call failed (attempt ${t}/${i}), retrying in ${n}ms... Error: ${e.message}`),await new Promise(e=>setTimeout(e,n)))}finally{s()}}if(!p)throw(0,eZ.vA)(e,"AI model request failed without recording an attempt error"),function(e,t,r){let n=t.length,i=Math.max(0,n-1),o=e.message,a=t.slice(0,-1);if(e.message=`AI model request failed after ${i} ${1===i?"retry":"retries"} (${n}/${r} attempts). Last error: ${o}`,0===a.length)return e;let s=a.map(e=>{let{attempt:t,error:r}=e;return`Attempt ${t}: ${r instanceof Error?r.message:String(r)}`}).join("\n");return e.message=`${e.message}
|
|
219
|
+
Previous AI call attempt errors:
|
|
220
|
+
${s}`,e}(e,o,i)}if(I(`response reasoning content: ${z}`),I(`response content: ${p}`),T&&!f){let e=Math.max(1,Math.floor((p||"").length/4));f={prompt_tokens:e,completion_tokens:e,total_tokens:2*e}}return{content:p||"",reasoning_content:z||void 0,rawChoiceMessage:h,usage:L(f,m),isStreamed:!!T}}catch(e){if(j("call AI error",e),e instanceof np)throw e;throw Error(`failed to call ${T?"streaming ":""}AI model service (${E}): ${e.message}
|
|
221
|
+
Trouble shooting: https://midscenejs.com/model-provider.html`,{cause:e})}}async function ng(e,t,r){var n;let i,o="config"in(n=t)&&"adapter"in n?n:r5(n),{config:a,adapter:s}=o,A=await nf(e,o,{abortSignal:null==r?void 0:r.abortSignal});(0,eZ.vA)(A,"empty response");try{i=s.jsonParser(A.content,{source:(null==r?void 0:r.jsonParserSource)??"generic-object"})}catch(e){throw new np(e instanceof Error?e.message:String(e),A.content,A.usage)}if("object"!=typeof i)throw new np(`failed to parse json response from model (${a.modelName}): ${A.content}`,A.content,A.usage,A.rawChoiceMessage);return{content:i,contentString:A.content,usage:A.usage,reasoning_content:A.reasoning_content,rawChoiceMessage:A.rawChoiceMessage}}async function nm(e,t,r){let{content:n,usage:i,rawChoiceMessage:o}=await nf(e,t,r);return{content:n,usage:i,rawChoiceMessage:o}}let ny="https://midscenejs.com/model-config",nv=`Default model family is required for locate. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse locate coordinates correctly. ${ny}`;function nb(e){return"planning"===e?`Planning model family is required because aiAct is asking the planning model to return locate coordinates. Configure MIDSCENE_PLANNING_MODEL_FAMILY for the planning model, or remove the separate planning model config and configure MIDSCENE_MODEL_FAMILY on the default model. ${ny}`:`Default model family is required because aiAct is asking the default model to return locate coordinates during planning. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse planning locate coordinates correctly. ${ny}`}function nw(e,t){arguments.length>2&&void 0!==arguments[2]&&arguments[2];let r=e.left+Math.floor((e.width-1)/2),n=e.top+Math.floor((e.height-1)/2);return{rect:e,center:[r,n],description:t||""}}function nE(e,t){let r=e.toLowerCase(),n=t.toLowerCase(),i=`</${n}>`,o=`<${n}>`,a=r.lastIndexOf(i);if(-1===a){let t=r.lastIndexOf(o);if(-1===t)return;let n=t+o.length,i=e.substring(n),a=i.indexOf("<");return(-1===a?i:i.substring(0,a)).trim()}let s=r.substring(0,a).lastIndexOf(o);if(-1===s)return;let A=s+o.length;return e.substring(A,a).trim()}function nk(e,t){let r="based on the current screenshot and its contents if provided, unless the user explicitly asks to compare with reference images";return"Assert"===e?`Boolean, ${r}, whether the following statement is true: ${t}`:"WaitFor"===e?`Boolean, the user wants to do some 'wait for' operation. ${r}, please check whether the following statement is true: ${t}`:`${e}, ${r}, ${t}`}function nx(){return`## Important Notes for Locating Elements:
|
|
222
|
+
- When the user describes an element that contains text (such as buttons, input fields, dropdown options, radio buttons, etc.), you should locate ONLY the text region of that element, not the entire element boundary.
|
|
223
|
+
- For example: If an input field is large (both wide and tall) with a placeholder text "Please enter your comment", you should locate only the area where the placeholder text appears, not the entire input field.
|
|
224
|
+
- This principle applies to all text-containing elements: focus on the visible text region rather than the full element container.`}function nS(e){return Array.isArray(e)?`[${e.join(", ")}]`:JSON.stringify(e)}function nC(e){let[t,r,n,i]=e;return{left:t,top:r,width:n-t+1,height:i-r+1}}let nI=(0,eN.a)("ai:inspect"),nj=(0,eN.a)("ai:section");function nO(e,t){if(!e||"object"!=typeof e)return!1;let r=e[t];return Array.isArray(r)?r.length>0:void 0!==r}async function nP(e){let{context:t,baseRect:r}=e,n=tU(r,t.shotSize),i=await tT(t.screenshot.base64,n),o=await tL(i.imageBase64,2);return{sourceRect:n,image:{imageBase64:o.imageBase64,width:o.width,height:o.height},mapping:{offset:{x:n.left,y:n.top},scale:2}}}async function nR(e){var t,r;let{targetElementDescription:n,...i}=e;(0,eZ.vA)(n,"cannot find the target element description");let{context:o}=i,a=(null==(t=i.searchConfig)?void 0:t.image)??{imageBase64:o.screenshot.base64,width:o.shotSize.width,height:o.shotSize.height},s="string"==typeof n?void 0:await tG(tH(n)),A={elementDescriptionText:tX(n),locateImage:a,referenceImageMessages:s,options:i},l=e.modelRuntime.adapter.locate,c="custom"===l.kind?l.locateFn:nT,{locatedPixelBbox:u,rawResponse:d,rawChoiceMessage:p,usage:h,reasoningContent:f,errors:g=[]}=await c(n,i,A),m={rawResponse:d,rawChoiceMessage:p,usage:h,reasoning_content:f};if(!u)return{rect:void 0,parseResult:{element:void 0,errors:g},...m};try{let e=nC(function(e,t){let[r,n,i,o]=e,a=(null==t?void 0:t.offset)??{x:0,y:0},s=(null==t?void 0:t.scale)??1,A=e=>(1!==s?Math.round(e/s):e)+a.x,l=e=>(1!==s?Math.round(e/s):e)+a.y;return[A(r),l(n),A(i),l(o)]}(u,null==(r=i.searchConfig)?void 0:r.mapping));return nI("resRect",e),{rect:e,parseResult:{element:nw(e,A.elementDescriptionText),errors:[]},...m}}catch(t){let e=t instanceof Error?`Failed to parse locate result: ${t.message}`:"unknown error in locate";return{rect:void 0,parseResult:{element:void 0,errors:g.length>0?[...g,`(${e})`]:[e]},...m}}}async function nT(e,t,r){var n;let i,o,a,s,A,l,c,u=t.modelRuntime,{adapter:d}=u;(0,eZ.vA)("standard"===d.locate.kind,"generic locate requires a standard locate adapter");let p=(a=r.elementDescriptionText,`Find: ${a}`),h=(n=d.locate.resultAdapter.promptSpec,s=e_(),A=n.resultKey,l=nS(n.exampleValues[0]),c=`the ${n.resultNoun} of the element that matches the user's description`,`
|
|
225
|
+
## Role:
|
|
226
|
+
You are an AI assistant that helps identify UI elements.
|
|
227
|
+
|
|
228
|
+
## Objective:
|
|
229
|
+
- Identify elements in screenshots that match the user's description.
|
|
230
|
+
- Provide the coordinates of the element that matches the user's description.
|
|
231
|
+
|
|
232
|
+
${nx()}
|
|
233
|
+
|
|
234
|
+
## Output Format:
|
|
235
|
+
\`\`\`json
|
|
236
|
+
{
|
|
237
|
+
"${A}": ${n.resultValueSchema}, // ${n.resultValueDescription}
|
|
238
|
+
"errors"?: string[]
|
|
239
|
+
}
|
|
240
|
+
\`\`\`
|
|
241
|
+
|
|
242
|
+
Fields:
|
|
243
|
+
* \`${A}\` is ${c}
|
|
244
|
+
* \`errors\` is an optional array of error messages (if any)
|
|
245
|
+
|
|
246
|
+
For example, when an element is found:
|
|
247
|
+
\`\`\`json
|
|
248
|
+
{
|
|
249
|
+
"${A}": ${l},
|
|
250
|
+
"errors": []
|
|
251
|
+
}
|
|
252
|
+
\`\`\`
|
|
253
|
+
|
|
254
|
+
When no element is found:
|
|
255
|
+
\`\`\`json
|
|
256
|
+
{
|
|
257
|
+
"${A}": [],
|
|
258
|
+
"errors": ["I can see ..., but {some element} is not found. Use ${s}."]
|
|
259
|
+
}
|
|
260
|
+
\`\`\`
|
|
261
|
+
`),f=await rp({imageBase64:r.locateImage.imageBase64,width:r.locateImage.width,height:r.locateImage.height,policy:d.imagePreprocess}),g=[{role:"system",content:h},{role:"user",content:[{type:"image_url",image_url:{url:f.imageBase64,detail:"high"}},{type:"text",text:p}]}];r.referenceImageMessages&&g.push(...r.referenceImageMessages);try{i=await ng(g,u,{abortSignal:t.abortSignal,jsonParserSource:"locate"})}catch(n){let e=n instanceof Error?n.message:String(n),t=n instanceof np?n.rawResponse:e,r=n instanceof np?n.usage:void 0;return{rawResponse:t,rawChoiceMessage:n instanceof np?n.rawChoiceMessage:void 0,usage:r,errors:[`AI call error: ${e}`]}}let m=JSON.stringify(i.content),y="errors"in i.content?i.content.errors:[],v=d.locate.resultAdapter;if(!nO(i.content,v.promptSpec.resultKey))return{rawResponse:m,rawChoiceMessage:i.rawChoiceMessage,usage:i.usage,reasoningContent:i.reasoning_content,errors:y};try{o=v.adaptElementLocateResultToPixelBbox(i.content,{preparedSize:f.preparedSize,contentSize:f.contentSize})}catch(t){let e=t instanceof Error?`Failed to parse locate result: ${t.message}`:"unknown error in locate";y&&(null==y?void 0:y.length)!==0?y.push(`(${e})`):y=[e]}return{locatedPixelBbox:o,rawResponse:m,rawChoiceMessage:i.rawChoiceMessage,usage:i.usage,reasoningContent:i.reasoning_content,errors:y}}async function nN(e){var t,r;let n,i,o,a,s,A,l,c,u,d,{context:p,sectionDescription:h}=e,f=e.modelRuntime,{adapter:g}=f;(0,eZ.vA)("standard"===g.locate.kind,"section locate requires a standard locate adapter");let m=p.screenshot.base64,y=await rp({imageBase64:m,width:p.shotSize.width,height:p.shotSize.height,policy:g.imagePreprocess}),v=(t=g.locate.resultAdapter.promptSpec,o=e_(),a=t.resultKey,s=nS(t.exampleValues[0]),A=`"${a}": ${t.resultValueSchema}, // ${t.resultValueDescription}`,l=t.resultValueSchema,c=`${t.resultNoun} of the section containing the target element`,u=`Optional array of ${t.resultNounPlural} of reference elements`,`
|
|
262
|
+
## Role:
|
|
263
|
+
You are an AI assistant that helps identify UI elements.
|
|
264
|
+
|
|
265
|
+
## Objective:
|
|
266
|
+
- Find a section containing the target element
|
|
267
|
+
- If the description mentions reference elements, also locate sections containing those references
|
|
268
|
+
|
|
269
|
+
## Output Format:
|
|
270
|
+
\`\`\`json
|
|
271
|
+
{
|
|
272
|
+
${A}
|
|
273
|
+
"references_${a}"?: [
|
|
274
|
+
${l},
|
|
275
|
+
...
|
|
276
|
+
],
|
|
277
|
+
"error"?: string
|
|
278
|
+
}
|
|
279
|
+
\`\`\`
|
|
280
|
+
|
|
281
|
+
Fields:
|
|
282
|
+
* \`${a}\` - ${c}
|
|
283
|
+
* \`references_${a}\` - ${u}
|
|
284
|
+
* \`error\` - Optional error message if the section cannot be found. Use ${o}.
|
|
285
|
+
|
|
286
|
+
Example:
|
|
287
|
+
If the description is "delete button on the second row with title 'Peter'", return:
|
|
288
|
+
\`\`\`json
|
|
289
|
+
{
|
|
290
|
+
"${a}": ${s},
|
|
291
|
+
"references_${a}": [${s}]
|
|
292
|
+
}
|
|
293
|
+
\`\`\`
|
|
294
|
+
`),b=(d=tX(h),`Find section containing: ${d}`),w=[{role:"system",content:v},{role:"user",content:[{type:"image_url",image_url:{url:y.imageBase64,detail:"high"}},{type:"text",text:b}]}];if("string"!=typeof h){let e=await tG(tH(h));w.push(...e)}try{n=await ng(w,f,{abortSignal:e.abortSignal,jsonParserSource:"section-locator"})}catch(n){let e=n instanceof Error?n.message:String(n),t=n instanceof np?n.rawResponse:e,r=n instanceof np?n.usage:void 0;return{searchAreaConfig:void 0,error:`AI call error: ${e}`,rawResponse:t,rawChoiceMessage:n instanceof np?n.rawChoiceMessage:void 0,usage:r}}let E=n.content.error,k=g.locate.resultAdapter;if(!nO(n.content,k.promptSpec.resultKey))return{searchAreaConfig:void 0,error:E,rawResponse:JSON.stringify(n.content),rawChoiceMessage:n.rawChoiceMessage,usage:n.usage};try{let e,t,o,a=k.adaptSectionLocateResultToPixelBboxGroup(n.content,{preparedSize:y.preparedSize,contentSize:y.contentSize}),s=(r=[a.target,...a.references??[]],e=Math.min(...r.map(e=>{let[t]=e;return t})),t=Math.min(...r.map(e=>{let[,t]=e;return t})),o=Math.max(...r.map(e=>{let[,,t]=e;return t})),nC([e,t,o,Math.max(...r.map(e=>{let[,,,t]=e;return t}))]));nj("mergedRect %j",s);let A=tU(s,p.shotSize),l=A.width,c=A.height;nj("expanded sectionRect %j",A),i=await nP({context:p,baseRect:s}),nj("scaled section image from %dx%d to %dx%d (scale=%d)",l,c,i.image.width,i.image.height,i.mapping.scale)}catch(t){let e=t instanceof Error?`Failed to parse section locate result: ${t.message}`:"unknown error in section locate";E=E?`${E} (${e})`:e}return{searchAreaConfig:i,error:E,rawResponse:JSON.stringify(n.content),rawChoiceMessage:n.rawChoiceMessage,usage:n.usage}}async function nM(e){var t,r;let n,i,{dataQuery:o,context:a,extractOption:s,multimodalPrompt:A,modelRuntime:l}=e,c=function(e){let t=e_(),r=(null==e?void 0:e.screenshotIncluded)??!0,n=(null==e?void 0:e.referenceImagesIncluded)??!1,i=["The user will give you data requirements in <DATA_DEMAND>. You need to understand the user's requirements and extract the data satisfying the <DATA_DEMAND>."];if(r?i.push("The user will provide a current screenshot to evaluate, and may provide its contents. Base your answer on the current screenshot and its contents when provided. Treat them as the primary source of truth for what is currently visible or true."):i.push("The user will not provide a current screenshot. Use only the supplied page contents and other inputs, and do not infer unsupported visual details."),n){let e="Reference images are supporting context only unless <DATA_DEMAND> explicitly asks for comparison, matching, or reasoning about them.";i.push(r?`${e} Do not conclude that something exists in the current screenshot solely because it appears in a reference image; when they conflict, trust the current screenshot and its contents.`:`${e} Do not treat reference images as direct evidence of the current state unless the demand explicitly asks you to use them that way.`)}let o=i.join("\n\n");return`
|
|
295
|
+
You are a versatile professional in software UI design and testing. Your outstanding contributions will impact the user experience of billions of users.
|
|
296
|
+
|
|
297
|
+
${o}
|
|
298
|
+
|
|
299
|
+
If a key specifies a JSON data type (such as Number, String, Boolean, Object, Array), ensure the returned value strictly matches that data type.
|
|
300
|
+
|
|
301
|
+
When DATA_DEMAND is a JSON object, the keys in your response must exactly match the keys in DATA_DEMAND. Do not rename, translate, or substitute any key.
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
Return in the following XML format:
|
|
305
|
+
<thought>the thinking process of the extraction, less than 300 words. Use ${t} in this field.</thought>
|
|
306
|
+
<data-json>the extracted data as JSON. Make sure both the value and scheme meet the DATA_DEMAND. If you want to write some description in this field, use the same language as the DATA_DEMAND.</data-json>
|
|
307
|
+
<errors>optional error messages as JSON array, e.g., ["error1", "error2"]</errors>
|
|
308
|
+
|
|
309
|
+
# Example 1
|
|
310
|
+
For example, if the DATA_DEMAND is:
|
|
311
|
+
|
|
312
|
+
<DATA_DEMAND>
|
|
313
|
+
{
|
|
314
|
+
"name": "name shows on the left panel, string",
|
|
315
|
+
"age": "age shows on the right panel, number",
|
|
316
|
+
"isAdmin": "if the user is admin, boolean"
|
|
317
|
+
}
|
|
318
|
+
</DATA_DEMAND>
|
|
319
|
+
|
|
320
|
+
By viewing the screenshot and page contents, you can extract the following data:
|
|
321
|
+
|
|
322
|
+
<thought>According to the screenshot, i can see ...</thought>
|
|
323
|
+
<data-json>
|
|
324
|
+
{
|
|
325
|
+
"name": "John",
|
|
326
|
+
"age": 30,
|
|
327
|
+
"isAdmin": true
|
|
328
|
+
}
|
|
329
|
+
</data-json>
|
|
330
|
+
|
|
331
|
+
# Example 2
|
|
332
|
+
If the DATA_DEMAND is:
|
|
333
|
+
|
|
334
|
+
<DATA_DEMAND>
|
|
335
|
+
the todo items list, string[]
|
|
336
|
+
</DATA_DEMAND>
|
|
337
|
+
|
|
338
|
+
By viewing the screenshot and page contents, you can extract the following data:
|
|
339
|
+
|
|
340
|
+
<thought>According to the screenshot, i can see ...</thought>
|
|
341
|
+
<data-json>
|
|
342
|
+
["todo 1", "todo 2", "todo 3"]
|
|
343
|
+
</data-json>
|
|
344
|
+
|
|
345
|
+
# Example 3
|
|
346
|
+
If the DATA_DEMAND is:
|
|
347
|
+
|
|
348
|
+
<DATA_DEMAND>
|
|
349
|
+
the page title, string
|
|
350
|
+
</DATA_DEMAND>
|
|
351
|
+
|
|
352
|
+
By viewing the screenshot and page contents, you can extract the following data:
|
|
353
|
+
|
|
354
|
+
<thought>According to the screenshot, i can see ...</thought>
|
|
355
|
+
<data-json>
|
|
356
|
+
"todo list"
|
|
357
|
+
</data-json>
|
|
358
|
+
|
|
359
|
+
# Example 4
|
|
360
|
+
If the DATA_DEMAND is:
|
|
361
|
+
|
|
362
|
+
<DATA_DEMAND>
|
|
363
|
+
{
|
|
364
|
+
"StatementIsTruthy": "Boolean, is it currently the SMS page?"
|
|
365
|
+
}
|
|
366
|
+
</DATA_DEMAND>
|
|
367
|
+
|
|
368
|
+
By viewing the screenshot and page contents, you can extract the following data:
|
|
369
|
+
|
|
370
|
+
<thought>According to the screenshot, i can see ...</thought>
|
|
371
|
+
<data-json>
|
|
372
|
+
{ "StatementIsTruthy": true }
|
|
373
|
+
</data-json>
|
|
374
|
+
`}({screenshotIncluded:(null==s?void 0:s.screenshotIncluded)!==!1,referenceImagesIncluded:!!(null==A||null==(t=A.images)?void 0:t.length)}),u=a.screenshot.base64,d=(r=e.pageDescription||"",i="",i="string"==typeof o?o:JSON.stringify(o,null,2),`
|
|
375
|
+
<PageDescription>
|
|
376
|
+
${r}
|
|
377
|
+
</PageDescription>
|
|
378
|
+
|
|
379
|
+
<DATA_DEMAND>
|
|
380
|
+
${i}
|
|
381
|
+
</DATA_DEMAND>
|
|
382
|
+
`),p=[];(null==s?void 0:s.screenshotIncluded)!==!1&&(p.push({type:"text",text:"This is the current screenshot to evaluate. Unless <DATA_DEMAND> explicitly asks for comparison or matching against reference images, base your answer on this screenshot and its contents when provided."}),p.push({type:"image_url",image_url:{url:u,detail:"high"}})),p.push({type:"text",text:d});let h=[{role:"system",content:c},{role:"user",content:p}];if(A){let e=await tG(A);h.push(...e)}let{content:f,usage:g,reasoning_content:m,rawChoiceMessage:y}=await nf(h,l,{abortSignal:e.abortSignal});try{n=function(e){let t,r,n=nE(e,"thought"),i=nE(e,"data-json"),o=nE(e,"errors");if(!i)throw Error("Missing required field: data-json");try{t=e5(i)}catch(e){throw Error(`Failed to parse data-json: ${e}`)}if(o)try{let e=e5(o);Array.isArray(e)&&(r=e)}catch(e){}return{...n?{thought:n}:{},data:t,...r&&r.length>0?{errors:r}:{}}}(f)}catch(t){let e=t instanceof Error?t.message:String(t);throw new np(`XML parse error: ${e}`,f,g,y)}return{parseResult:n,rawResponse:f,rawChoiceMessage:y,usage:g,reasoning_content:m}}let nD={Chinese:['"登录表单中的"登录"按钮"','"搜索输入框,placeholder 为"请输入关键词""','"顶部导航栏中文字为"首页"的链接"','"联系表单中的提交按钮"','"aria-label 为"打开菜单"的菜单图标"','"左侧导航栏中当前分组标题右侧的折叠图标"'],English:["\"Login button with text 'Sign In'\"","\"Search input with placeholder 'Enter keywords'\"","\"Navigation link with text 'Home' in header\"",'"Submit button in contact form"',"\"Menu icon with aria-label 'Open menu'\"",'"Collapse icon to the right of the current section title in the left sidebar"']};class nz extends Error{constructor(e,t){super(e),function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(this,"dump",void 0),this.name="ServiceError",this.dump=t}}var nB=r(4201).Buffer;function nL(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function nU(e,t){var r,n;return t&&(null==(r=t.constructor)?void 0:r.name)==="Page"?"[Page object]":t&&(null==(n=t.constructor)?void 0:n.name)==="Browser"?"[Browser object]":t&&"function"==typeof t.toSerializable?t.toSerializable():t}function nK(e,t){return"screenshot"!==e||"object"!=typeof t||null===t||rc.isSerialized(t),t}class nF{serialize(e){return JSON.stringify(this.toJSON(),nU,e)}toJSON(){return{id:this.id,logTime:this.logTime,name:this.name,description:this.description,tasks:this.tasks.map(e=>({...e,recorder:e.recorder||[]})),aiActContext:this.aiActContext}}static fromSerializedString(e){return new nF(JSON.parse(e,nK))}static fromJSON(e){return new nF(e)}collectScreenshots(){let e=[];for(let r of this.tasks){var t;if((null==(t=r.uiContext)?void 0:t.screenshot)instanceof rc&&e.push(r.uiContext.screenshot),r.recorder)for(let t of r.recorder)t.screenshot instanceof rc&&e.push(t.screenshot)}return e}constructor(e){nL(this,"id",void 0),nL(this,"logTime",void 0),nL(this,"name",void 0),nL(this,"description",void 0),nL(this,"tasks",void 0),nL(this,"aiActContext",void 0),this.id=e.id,this.logTime=e.logTime,this.name=e.name,this.description=e.description,this.tasks=e.tasks,this.aiActContext=e.aiActContext}}class nZ{serialize(e){return JSON.stringify(this.toJSON(),nU,e)}serializeWithInlineScreenshots(e){let t=e=>e instanceof rc?{base64:e.base64,capturedAt:e.capturedAt}:Array.isArray(e)?e.map(t):e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(e=>{let[r,n]=e;return[r,t(n)]})):e;return JSON.stringify(t(this.toJSON()),null,e)}toJSON(){return{sdkVersion:this.sdkVersion,groupName:this.groupName,groupDescription:this.groupDescription,modelBriefs:this.modelBriefs,executions:this.executions.map(e=>e.toJSON()),deviceType:this.deviceType}}static fromSerializedString(e){return new nZ(JSON.parse(e,nK))}static fromJSON(e){return new nZ(e)}collectAllScreenshots(){let e=[];for(let t of this.executions)e.push(...t.collectScreenshots());return e}serializeToFiles(e){let t=`${e}.screenshots`;for(let e of((0,t0.existsSync)(t)||(0,t0.mkdirSync)(t,{recursive:!0}),this.collectAllScreenshots())){let r=(0,tg.join)(t,`${e.id}.${e.extension}`);if((0,t0.existsSync)(r))continue;let n=e.rawBase64;(0,t0.writeFileSync)(r,nB.from(n,"base64"))}(0,t0.writeFileSync)(e,this.serialize(),"utf-8")}static fromFilesAsInlineJson(e){let t=(0,t0.readFileSync)(e,"utf-8"),r=`${e}.screenshots`,n=JSON.parse(t),i=new rA({mode:"directory",reportPath:e});return JSON.stringify(function e(t,r){if("string"==typeof t)return t;if(Array.isArray(t))return t.map(t=>e(t,r));if("object"==typeof t&&null!==t){let n=ra(t);if(n){let e=null;return Object.defineProperties({},{base64:{get:()=>(null===e&&(e=r(n)),e),enumerable:!0},capturedAt:{value:n.capturedAt,enumerable:!0}})}let i={};for(let[n,o]of Object.entries(t))i[n]=e(o,r);return i}return t}(n,e=>{let t=((e,t)=>{let n="image/jpeg"===t?"jpeg":"png",i=(0,tg.join)(r,`${e}.${n}`);if(!(0,t0.existsSync)(i))return"";let o=(0,t0.readFileSync)(i);return`data:image/${n};base64,${o.toString("base64")}`})(e.id,e.mimeType);return t||("inline"===e.storage?"":i.loadBase64(e))}))}static cleanupFiles(e){for(let t of[e,`${e}.screenshots`])try{(0,t0.rmSync)(t,{force:!0,recursive:!0})}catch{}}static getFilePaths(e){return[e,`${e}.screenshots`]}constructor(e){nL(this,"sdkVersion",void 0),nL(this,"groupName",void 0),nL(this,"groupDescription",void 0),nL(this,"modelBriefs",void 0),nL(this,"executions",void 0),nL(this,"deviceType",void 0),this.sdkVersion=e.sdkVersion,this.groupName=e.groupName,this.groupDescription=e.groupDescription,this.modelBriefs=e.modelBriefs,this.executions=e.executions.map(e=>e instanceof nF?e:nF.fromJSON(e)),this.deviceType=e.deviceType}}let nQ={0:[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],1:[[0,0,1,0,0],[0,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,1,1,1,0]],2:[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,1,0,0,0],[1,0,0,0,0],[1,1,1,1,1]],3:[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],4:[[0,0,0,1,0],[0,0,1,1,0],[0,1,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0]],5:[[1,1,1,1,1],[1,0,0,0,0],[1,1,1,1,0],[0,0,0,0,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],6:[[0,1,1,1,0],[1,0,0,0,0],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],7:[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0]],8:[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],9:[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,1,1,1,0]]};function nJ(e,t,r,n,i){let o=Math.floor(n.x),a=Math.floor(n.y),s=Math.floor(n.w),A=Math.floor(n.h);for(let n=a;n<a+A&&n<r;n++)for(let r=o;r<o+s&&r<t;r++){if(r<0||n<0)continue;let o=(n*t+r)*4;e[o+0]=i.r,e[o+1]=i.g,e[o+2]=i.b,e[o+3]=i.a}}let nX=async function(e,t,r){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:2,o=arguments.length>5?arguments[5]:void 0,a=new Uint8Array(t*r*4),s=[{rect:{r:198,g:35,b:0,a:255},text:{r:255,g:255,b:255,a:255}},{rect:{r:0,g:0,b:255,a:255},text:{r:255,g:255,b:255,a:255}},{rect:{r:139,g:69,b:19,a:255},text:{r:255,g:255,b:255,a:255}},{rect:{r:62,g:123,b:39,a:255},text:{r:255,g:255,b:255,a:255}},{rect:{r:80,g:0,b:115,a:255},text:{r:255,g:255,b:255,a:255}}];if(o){let e=r-30-20;nJ(a,t,r,{x:0,y:e,w:t,h:30},{r:0,g:0,b:0,a:204})}for(let o=0;o<e.length;o++){let A=e[o],l=s[o%s.length],c=Math.max(0,A.rect.left-n),u=Math.max(0,A.rect.top-n),d=Math.min(t-c,A.rect.width+2*n),p=Math.min(r-u,A.rect.height+2*n);!function(e,t,r,n,i,o){let a=Math.floor(n.x),s=Math.floor(n.y),A=Math.floor(n.w),l=Math.floor(n.h);for(let n=s;n<s+l&&n<r;n++)for(let r=a;r<a+A&&r<t;r++){if(r<0||n<0)continue;let c=r>=a&&r<a+o,u=r<=a+A-1&&r>a+A-o-1,d=n>=s&&n<s+o,p=n<=s+l-1&&n>s+l-o-1;if(c||u||d||p){let o=(n*t+r)*4;e[o+0]=i.r,e[o+1]=i.g,e[o+2]=i.b,e[o+3]=i.a}}}(a,t,r,{x:c,y:u,w:d,h:p},l.rect,i);let h=A.indexId;if("number"!=typeof h)continue;let f=11*h.toString().length-1,g=f+5,m=c-g,y=u+Math.floor(p/2)-Math.floor(7)-2,v=(t,r)=>e.slice(0,o).some(e=>t<e.rect.left+e.rect.width&&t+g>e.rect.left&&r<e.rect.top+e.rect.height&&r+18>e.rect.top),b=(e,n)=>e>=0&&e+g<=t&&n>=0&&n+18<=r;(v(m,y)||!b(m,y))&&(!v(c,u-18-2)&&b(c,u-18-2)?(m=c,y=u-18-2):!v(c,u+p+2)&&b(c,u+p+2)?(m=c,y=u+p+2):!v(c+d+2,u)&&b(c+d+2,u)?(m=c+d+2,y=u):(m=c,y=u+2)),nJ(a,t,r,{x:m,y:y,w:g,h:18},l.rect),function(e,t,r,n,i,o,a){let s=n.toString(),A=i;for(let n of s)!function(e,t,r,n,i,o,a){let s=nQ[n];if(s){for(let n=0;n<7;n++)for(let A=0;A<5;A++)if(1===s[n][A])for(let s=0;s<2;s++)for(let l=0;l<2;l++){let c=i+2*A+l,u=o+2*n+s;if(c>=0&&c<t&&u>=0&&u<r){let r=(u*t+c)*4;e[r+0]=a.r,e[r+1]=a.g,e[r+2]=a.b,e[r+3]=a.a}}}}(e,t,r,n,A,o,a),A+=11}(a,t,r,h,m+Math.floor((g-f)/2),y+Math.floor(2),l.text)}return a},nH=async e=>{tp()(e.inputImgBase64,"inputImgBase64 is required");let{PhotonImage:t,SamplingFilter:r,resize:n}=await tw(),i=0,o=0;e.size&&(i=e.size.width,o=e.size.height);let a=await tO(e.inputImgBase64);if(i&&o){let e=a.get_width(),t=a.get_height();if(e!==i||t!==o){let e=n(a,i,o,r.Nearest);a.free(),a=e}}else i=a.get_width(),o=a.get_height();if(!i||!o)throw a.free(),Error("Image processing failed because width or height is undefined");let{elementsPositionInfo:s,prompt:A}=e;try{let r=a.get_raw_pixels(),n=await nX(s,i,o,e.annotationPadding,e.borderThickness,A),l=function(e,t,r,n){let i=new Uint8Array(e.length);for(let r=0;r<e.length;r+=4){let n=t[r+3]/255,o=e[r+3]/255;if(0===n)i[r+0]=e[r+0],i[r+1]=e[r+1],i[r+2]=e[r+2],i[r+3]=e[r+3];else{let a=n+o*(1-n);0===a?(i[r+0]=t[r+0],i[r+1]=t[r+1],i[r+2]=t[r+2],i[r+3]=t[r+3]):(i[r+0]=Math.round((t[r+0]*n+e[r+0]*o*(1-n))/a),i[r+1]=Math.round((t[r+1]*n+e[r+1]*o*(1-n))/a),i[r+2]=Math.round((t[r+2]*n+e[r+2]*o*(1-n))/a),i[r+3]=Math.round(255*a))}}return i}(r,n,0,0),c=new t(l,i,o),u=await tN(c,90);return c.free(),u}finally{a.free()}};function nG(e){let t={logTime:Date.now()};return{logId:(0,eZ.uR)(),...t,...e}}function nq(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let nW=(0,eN.a)("ai:service");class nV{async locate(e,t,r,n){var i;let o,{config:a}=r,s="string"==typeof e?e:e.prompt;if((0,eZ.vA)(s,"query is required for locate"),(0,eZ.vA)("object"==typeof e,"query should be an object for locate"),!a.modelFamily)throw Error(nv);let A=(null==t?void 0:t.context)||await this.contextRetrieverFn(),l=await this.resolveLocateSearchArea({query:e,queryPrompt:s,opt:t,context:A,modelRuntime:r,abortSignal:n}),c=Date.now(),{parseResult:u,rect:d,rawResponse:p,rawChoiceMessage:h,usage:f,reasoning_content:g}=await nR({context:A,targetElementDescription:s,searchConfig:l.config,modelRuntime:r,abortSignal:n}),m=Date.now()-c,y={...this.taskInfo?this.taskInfo:{},durationMs:m,rawResponse:JSON.stringify(p),rawChoiceMessage:h,formatResponse:JSON.stringify(u),usage:f,searchArea:l.trace.sourceRect,searchAreaRawResponse:l.trace.rawResponse,searchAreaRawChoiceMessage:l.trace.rawChoiceMessage,searchAreaUsage:l.trace.usage,reasoning_content:g};(null==(i=u.errors)?void 0:i.length)&&(o=`failed to locate element:
|
|
383
|
+
${u.errors.join("\n")}`);let v={type:"locate",userQuery:{element:s},matchedRect:d,data:null,taskInfo:y,deepLocate:!!l.trace.sourceRect,error:o},b=u.element,w=nG({...v,matchedElement:b?[b]:[]});if(o)throw new nz(o,w);return b?{element:{center:b.center,rect:b.rect,description:b.description},rect:d,dump:w}:{element:null,rect:d,dump:w}}async resolveLocateSearchArea(e){var t,r;let{query:n,queryPrompt:i,opt:o,context:a,modelRuntime:s,abortSignal:A}=e,{adapter:l}=s,c=!!(null==o||null==(t=o.planLocatedElement)?void 0:t.rect);if(!n.deepLocate)return{trace:{}};if(c){let e=await nP({context:a,baseRect:o.planLocatedElement.rect});return{config:e,trace:{sourceRect:e.sourceRect,rawResponse:JSON.stringify({source:"plan-located-element",rect:o.planLocatedElement.rect})}}}if(l.locate.supportsSearchArea){let e=await nN({context:a,sectionDescription:i,modelRuntime:s,abortSignal:A}),{searchAreaConfig:t}=e;return(0,eZ.vA)(t,`cannot find search area for "${i}"${e.error?`: ${e.error}`:""}`),{config:t,trace:{sourceRect:t.sourceRect,rawResponse:e.rawResponse,rawChoiceMessage:e.rawChoiceMessage,usage:e.usage}}}let u=await nR({context:a,targetElementDescription:i,modelRuntime:s,abortSignal:A});(0,eZ.vA)(u.rect,`cannot find search area for "${i}"${(null==(r=u.parseResult.errors)?void 0:r.length)?`: ${u.parseResult.errors.join("\n")}`:""}`);let d=await nP({context:a,baseRect:u.rect});return{config:d,trace:{sourceRect:d.sourceRect,rawResponse:JSON.stringify({source:"deep-locate-first-pass",rect:u.rect,rawResponse:u.rawResponse}),rawChoiceMessage:u.rawChoiceMessage,usage:u.usage}}}async extract(e,t,r,n,i,o,a){var s;let A,l,c,u,d,p;(0,eZ.vA)(o,"context is required for extract"),(0,eZ.vA)("object"==typeof e||"string"==typeof e,`dataDemand should be object or string, but get ${typeof e}`);let h=Date.now();try{let s=await nM({context:o,dataQuery:e,multimodalPrompt:i,extractOption:r,modelRuntime:t,pageDescription:n,abortSignal:null==a?void 0:a.abortSignal});A=s.parseResult,l=s.rawResponse,c=s.rawChoiceMessage,u=s.usage,d=s.reasoning_content}catch(t){if(t instanceof np){let r=Date.now()-h,n=nG({type:"extract",userQuery:{dataDemand:e},data:null,taskInfo:{...this.taskInfo?this.taskInfo:{},durationMs:r,rawResponse:t.rawResponse,rawChoiceMessage:t.rawChoiceMessage,usage:t.usage},error:t.message});throw new nz(t.message,n)}throw t}let f=Date.now()-h,g={...this.taskInfo?this.taskInfo:{},durationMs:f,rawResponse:l,rawChoiceMessage:c,formatResponse:JSON.stringify(A),usage:u,reasoning_content:d};(null==(s=A.errors)?void 0:s.length)&&(p=`AI response error:
|
|
384
|
+
${A.errors.join("\n")}`);let{data:m,thought:y}=A||{},v=nG({type:"extract",userQuery:{dataDemand:e},data:null,taskInfo:g,error:p,data:m});if(p&&!m)throw new nz(p,v);return{data:m,thought:y,usage:u,reasoning_content:d,dump:v}}async describe(e,t,r){let n,i;(0,eZ.vA)(e,"target is required for service.describe");let o=(null==r?void 0:r.context)||await this.contextRetrieverFn(),{shotSize:a}=o,s=o.screenshot.base64;(0,eZ.vA)(s,"screenshot is required for service.describe");let A=(i=e_(),`
|
|
385
|
+
Describe the element in the red rectangle for precise identification.
|
|
386
|
+
|
|
387
|
+
IMPORTANT: You MUST write the description in ${i}.
|
|
388
|
+
|
|
389
|
+
CRITICAL REQUIREMENTS:
|
|
390
|
+
1. UNIQUENESS: The description must uniquely identify this element on the current page
|
|
391
|
+
2. UNIVERSALITY: Use generic, reusable selectors that work across different contexts
|
|
392
|
+
3. PRECISION: Be specific enough to distinguish from similar elements
|
|
393
|
+
|
|
394
|
+
DESCRIPTION STRUCTURE:
|
|
395
|
+
1. Element type (button, input, link, div, etc.)
|
|
396
|
+
2. Primary identifier (in order of preference):
|
|
397
|
+
- Unique text content: "with text 'Login'"
|
|
398
|
+
- Unique attribute: "with aria-label 'Search'"
|
|
399
|
+
- Unique class/ID: "with class 'primary-button'"
|
|
400
|
+
- Unique position: "in header navigation"
|
|
401
|
+
3. Secondary identifiers (if needed for uniqueness):
|
|
402
|
+
- Visual features: "blue background", "with icon"
|
|
403
|
+
- Relative position: "below search bar", "in sidebar"
|
|
404
|
+
- Parent context: "in login form", "in main menu"
|
|
405
|
+
- Neighboring stable text: "to the right of the 'Settings' section title"
|
|
406
|
+
|
|
407
|
+
GUIDELINES:
|
|
408
|
+
- Keep description under 25 words
|
|
409
|
+
- Prioritize semantic identifiers over visual ones
|
|
410
|
+
- Use consistent terminology across similar elements
|
|
411
|
+
- Avoid page-specific or temporary content
|
|
412
|
+
- Don't mention the red rectangle or selection box
|
|
413
|
+
- Focus on stable, reusable characteristics
|
|
414
|
+
- If the selected point/box is inside a text input, textarea, search box, or form field, describe the whole field/control, not the individual placeholder character, typed character, caret, or inner text fragment.
|
|
415
|
+
- For icon-only buttons or unlabeled controls, include the nearest stable label, section title, menu item text, row text, or parent region that owns the control.
|
|
416
|
+
- When multiple similar icons or controls appear in a list/sidebar/menu, the description MUST distinguish the selected one by its owning stable text or section, not by generic position such as "bottom", "nearby", or "sidebar button".
|
|
417
|
+
- For expand/collapse, disclosure, chevron, close, menu, and settings icons, describe both the icon purpose and the stable text/section it controls.
|
|
418
|
+
- Use the actual visible neighboring text from the current screenshot when available; do not copy labels from the examples.
|
|
419
|
+
- **Write the description in ${i}**
|
|
420
|
+
|
|
421
|
+
EXAMPLES:
|
|
422
|
+
${(nD[i]||nD.English).map(e=>`- ${e}`).join("\n")}
|
|
423
|
+
|
|
424
|
+
Return JSON:
|
|
425
|
+
{
|
|
426
|
+
"description": "unique element identifier",
|
|
427
|
+
"error"?: "error message if any"
|
|
428
|
+
}`),l=Array.isArray(e)?{left:Math.floor(e[0]-15),top:Math.floor(e[1]-15),width:30,height:30}:e,c=await nH({inputImgBase64:s,size:a,elementsPositionInfo:[{rect:l}],borderThickness:3});if(null==r?void 0:r.deepLocate){let e=tU(l,a);nW("describe: cropping to searchArea",e),c=(await tT(c,e)).imageBase64}let u=[{role:"system",content:A},{role:"user",content:[{type:"image_url",image_url:{url:c,detail:"high"}}]}];try{n=await ng(u,t)}catch(t){let e=function(e){var t,r;let n=e instanceof Error?e.message:String(e),i=e instanceof np?e.rawResponse:null==(t=n.match(/Response -\s*\n\s*([\s\S]*)$/))?void 0:t[1];if(!i||!n.includes("failed to parse LLM response into JSON")&&!(e instanceof np))return;let o=null==(r=function(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=RegExp(`"${r}"\\s*:\\s*"`).exec(e);if(!n)return;let i=n.index+n[0].length,o=!1,a="";for(;i<e.length;i+=1){let t=e[i];if(o){a+=t,o=!1;continue}if("\\"===t){a+=t,o=!0;continue}if('"'!==t){a+=t;continue}let r=function(e,t){let r=t;for(;r<e.length&&/\s/.test(e[r]);)r+=1;return e[r]}(e,i+1);if(","===r||"}"===r||"]"===r||void 0===r)try{return JSON.parse(`"${a}"`)}catch{return a}a+='\\"'}}(e2(i),"description"))?void 0:r.trim();if(o)return{description:o}}(t);if(!e)throw t;return nW("describe: recovered malformed description JSON response"),e}let{content:d}=n;return(0,eZ.vA)(!d.error,`describe failed: ${d.error}`),(0,eZ.vA)(d.description,"failed to describe the element"),d}constructor(e,t){nq(this,"contextRetrieverFn",void 0),nq(this,"taskInfo",void 0),(0,eZ.vA)(e,"context is required for Service"),"function"==typeof e?this.contextRetrieverFn=e:this.contextRetrieverFn=()=>Promise.resolve(e),void 0!==(null==t?void 0:t.taskInfo)&&(this.taskInfo=t.taskInfo)}}async function nY(e){let t,{PhotonImage:r}=await tw(),n=e.replace(/^data:image\/\w+;base64,/,"").replace(/\s/g,"");tp()(n,"Invalid image: empty base64 data"),tp()(/^[A-Za-z0-9+/]+={0,2}$/.test(n)&&n.length%4!=1,"Invalid image: malformed base64 data");let i=th.Buffer.from(n,"base64");tp()(function(e){return!!e&&!(e.length<8)&&137===e[0]&&80===e[1]&&78===e[2]&&71===e[3]&&13===e[4]&&10===e[5]&&26===e[6]&&10===e[7]||!!e&&!(e.length<3)&&255===e[0]&&216===e[1]&&255===e[2]}(i),"Invalid image: unsupported format");try{t=r.new_from_base64(n)}catch(e){throw Error(`Invalid image: failed to decode base64 data (${e instanceof Error?e.message:String(e)})`,{cause:e})}let o=t instanceof Promise?await t:t,a=o.get_width(),s=o.get_height();return o.free(),tp()(a&&s,"Invalid image: cannot get width or height"),{width:a,height:s}}let n_="data:image/png;base64,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",n$="CONNECTIVITY_OK";function n0(e){return"number"==typeof e&&Number.isFinite(e)}async function n1(){let e=await nY(n_);return{screenshot:rc.create(n_,Date.now()),shotSize:e,shrunkShotToLogicalRatio:1}}function n2(e,t,r){return{name:e,intent:t.intent,modelName:t.modelName,modelFamily:t.modelFamily,...r}}async function n3(e){let t=[],r=r5(e.planningModelConfig),n=r5(e.insightModelConfig),i=r5(e.defaultModelConfig);{let n=Date.now();try{let i=(await nf([{role:"system",content:"Reply with the exact token the user asks for."},{role:"user",content:`Return exactly ${n$}`}],r)).content.trim(),o=i.includes(n$);t.push(n2("text",e.planningModelConfig,{passed:o,durationMs:Date.now()-n,message:o?"":`Unexpected response: ${i}`}))}catch(r){t.push(n2("text",e.planningModelConfig,{passed:!1,durationMs:Date.now()-n,message:r instanceof Error?r.message:String(r)}))}}{let r=Date.now();try{(await nf([{role:"user",content:[{type:"text",text:"What is the main content of this image ? It is a photo or a form ?"},{type:"image_url",image_url:{url:n_,detail:"high"}}]}],n)).content.trim().replace(/^['"`]+|['"`]+$/g,"").toLowerCase(),t.push(n2("vision",e.insightModelConfig,{passed:!0,durationMs:Date.now()-r,message:""}))}catch(n){t.push(n2("vision",e.insightModelConfig,{passed:!1,durationMs:Date.now()-r,message:n instanceof Error?n.message:String(n)}))}}{let r=Date.now();try{var o,a;let n=await n1(),s=new nV(n),A=await s.locate({prompt:"the main todo input box"},{},i),l=A.rect||(null==(o=A.element)?void 0:o.rect),c=null==(a=A.element)?void 0:a.center,u=!!l&&"object"==typeof l&&n0(l.left)&&n0(l.top)&&n0(l.width)&&n0(l.height)&&Array.isArray(c)&&2===c.length&&n0(c[0])&&n0(c[1]);t.push(n2("aiLocate",e.defaultModelConfig,{passed:u,durationMs:Date.now()-r,message:u?"":`Invalid locate result: ${JSON.stringify({rect:l,center:c})}`}))}catch(n){t.push(n2("aiLocate",e.defaultModelConfig,{passed:!1,durationMs:Date.now()-r,message:n instanceof Error?n.message:String(n)}))}}return{passed:t.every(e=>e.passed),checks:t}}function n5(e){if(!e._def)return e;let t=e._def.typeName;return"ZodOptional"===t||"ZodNullable"===t||"ZodDefault"===t?n5(e._def.innerType):"ZodEffects"===t&&e._def.schema?n5(e._def.schema):e}function n7(e){var t,r,n;let i=n5(e);if((null==(t=i._def)?void 0:t.typeName)==="ZodObject"){let e=null==(r=(n=i._def).shape)?void 0:r.call(n);if(e&&("midscene_location_field_flag"in e||"prompt"in e&&e.prompt))return!0}return!1}function n4(e,t){var r,n,i,o;let a=n5(e),s=null==(r=a._def)?void 0:r.typeName;if("ZodString"===s)return"string";if("ZodNumber"===s)return"number";if("ZodBoolean"===s)return"boolean";if("ZodArray"===s)return"array";if("ZodObject"===s)return n7(a)&&t||"object";if("ZodEnum"===s){let e=(null==(i=a._def)||null==(n=i.values)?void 0:n.map(e=>String(`'${e}'`)).join(", "))??"enum";return`enum(${e})`}if("ZodUnion"===s){let e=null==(o=a._def)?void 0:o.options;return e&&e.length>0?e.map(e=>n4(e,t)).join(" | "):"union"}return"unknown"}function n8(e){if("description"in e)return e.description||null;let t=n5(e);return"description"in t?t.description||null:n7(t)?"Location information for the target element":null}(0,eN.a)("ai:recorder-markdown",{console:!0});let n6=e=>{let t=e,r=new Set;for(;t&&!r.has(t);){var n,i,o;r.add(t);let e=t;if(!(null==(n=e._def)?void 0:n.typeName))break;if("ZodDefault"===e._def.typeName)return null==(i=(o=e._def).defaultValue)?void 0:i.call(o);if("ZodOptional"===e._def.typeName||"ZodNullable"===e._def.typeName)t=e._def.innerType;else break}},n9=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3?arguments[3]:void 0,i=[];if(i.push(`- type: "${e.name}"`),e.paramSchema){var o;let r=[],n=e.paramSchema;if((null==(o=n._def)?void 0:o.typeName)==="ZodObject"&&n.shape){for(let[e,i]of Object.entries(n.shape))if(i&&"object"==typeof i){let n="function"==typeof i.isOptional&&i.isOptional()?`${e}?`:e,o=n4(i,t),a=n8(i),s=n6(i),A=void 0!==s,l=`${n}: ${o}`,c=[];if(a&&c.push(a),A){let e="string"==typeof s?`"${s}"`:JSON.stringify(s);c.push(`default: ${e}`)}c.length>0&&(l+=` // ${c.join(", ")}`),r.push(l)}r.length>0&&(i.push("- param:"),r.forEach(e=>{i.push(` - ${e}`)}))}else{let e=n4(n),t=n8(n),r=`- param: ${e}`;t&&(r+=` // ${t}`),r+=" (pass the value directly, not as an object)",i.push(r)}}if(e.sample&&"object"==typeof e.sample){let t=tV(e.paramSchema),o=r&&n?((e,t,r)=>{let n=r.resultKey,i=r.exampleValues,o={...e},a=0;for(let e of t)o[e]&&"object"==typeof o[e]&&o[e].prompt&&(o[e]={...o[e],[n]:i[a%i.length]},a++);return o})(e.sample,t,n):e.sample,a=`- sample:
|
|
429
|
+
<action-type>${e.name}</action-type>
|
|
430
|
+
<action-param-json>
|
|
431
|
+
${JSON.stringify(o,null,2).replace(/\n/g,`
|
|
432
|
+
`)}
|
|
433
|
+
</action-param-json>`;i.push(a)}return`- ${e.name}, ${e.description||"No description provided"}
|
|
434
|
+
${i.join(`
|
|
435
|
+
`)}
|
|
436
|
+
`.trim()};async function ie(e){let{actionSpace:t,locatePromptSpec:r,includeLocateInPlanning:n,includeThought:i,includeSubGoals:o}=e,a=e_();if(n&&!r)throw Error(nb());let s=t.map(e=>{var t;return n9(e,(t=n?r:void 0)?`{${t.resultKey}: ${t.resultValueSchema}, prompt: string } // ${t.resultValueDescription}`:"{ prompt: string /* description of the target element */ }",n,r)}).join("\n"),A=["### Action Guidelines","",...s.includes("RunAdbShell")?["- If the user's task can be completed with the RunAdbShell action, prefer using the RunAdbShell action."]:[],"- For touch continuous controls that set a value along a track, such as a slider, prefer Swipe from the current handle or filled position to the requested track endpoint instead of tapping the endpoint.","- When editing existing text in a UI field, preserve all existing text by moving the cursor and typing/deleting the minimal necessary characters.",'- For insert/prepend/append edits, use CursorMove when the caret must be adjusted precisely, then use Input with mode "typeOnly" for inserted characters and KeyboardPress for newlines or deletion. If the caret lands in the wrong position, recover with CursorMove, KeyboardPress, or undo and retry cursor placement; do not switch to replace as a fallback for cursor placement failures.'].join("\n"),l=o??!1,c=(e,t)=>{var i,o;return i=n?r:void 0,o=(null==r?void 0:r.exampleValues[t])??(null==r?void 0:r.exampleValues[0]),i?`{
|
|
437
|
+
"prompt": ${JSON.stringify(e)},
|
|
438
|
+
"${i.resultKey}": ${nS(o??i.exampleValues[0])}
|
|
439
|
+
}`:`{
|
|
440
|
+
"prompt": ${JSON.stringify(e)}
|
|
441
|
+
}`},u=c("Add to cart button for Sauce Labs Backpack",1),d=c("Name input field in the registration form",2),p=c("Email input field in the registration form",3),h='CRITICAL - Following Explicit Instructions: When the user gives you specific operation steps (not high-level goals), you MUST execute ONLY those exact steps - nothing more, nothing less. Do NOT add extra actions even if they seem logical. For example: "fill out the form" means only fill fields, do NOT submit; "click the button" means only click, do NOT wait for page load or verify results; "type \'hello\'" means only type, do NOT press Enter.',f=l?`REQUIRED: You MUST always output the <thought> tag. Never skip it.
|
|
442
|
+
|
|
443
|
+
Include your thought process in the <thought> tag. It should answer: What is the user's requirement? What is the current state based on the screenshot? Are all sub-goals completed? If not, what should be the next action? Write your thoughts naturally without numbering or section headers.
|
|
444
|
+
|
|
445
|
+
${h}`:`REQUIRED: You MUST always output the <thought> tag. Never skip it.
|
|
446
|
+
|
|
447
|
+
Include your thought process in the <thought> tag. It should answer: What is the current state based on the screenshot? What should be the next action? Write your thoughts naturally without numbering or section headers.
|
|
448
|
+
|
|
449
|
+
${h}`,g=l?`
|
|
450
|
+
|
|
451
|
+
* <update-plan-content> tag
|
|
452
|
+
|
|
453
|
+
Use this structure to give or update your plan:
|
|
454
|
+
|
|
455
|
+
<update-plan-content>
|
|
456
|
+
<sub-goal index="1" status="finished|pending">sub goal description</sub-goal>
|
|
457
|
+
<sub-goal index="2" status="finished|pending">sub goal description</sub-goal>
|
|
458
|
+
...
|
|
459
|
+
</update-plan-content>
|
|
460
|
+
|
|
461
|
+
* <mark-sub-goal-done> tag
|
|
462
|
+
|
|
463
|
+
Use this structure to mark a sub-goal as done:
|
|
464
|
+
|
|
465
|
+
<mark-sub-goal-done>
|
|
466
|
+
<sub-goal index="1" status="finished" />
|
|
467
|
+
</mark-sub-goal-done>
|
|
468
|
+
|
|
469
|
+
IMPORTANT: You MUST only mark a sub-goal as "finished" AFTER you have confirmed the task is actually completed by observing the result in the screenshot. Do NOT mark a sub-goal as done just because you expect the next action will complete it. Wait until you see visual confirmation in the screenshot that the sub-goal has been achieved.
|
|
470
|
+
|
|
471
|
+
* Note
|
|
472
|
+
|
|
473
|
+
During execution, you can call <update-plan-content> at any time to update the plan based on the latest screenshot and completed sub-goals.
|
|
474
|
+
|
|
475
|
+
### Example
|
|
476
|
+
|
|
477
|
+
If the user wants to "log in to a system using username and password, complete all to-do items, and submit a registration form", you can break it down into the following sub-goals:
|
|
478
|
+
|
|
479
|
+
<thought>...</thought>
|
|
480
|
+
<update-plan-content>
|
|
481
|
+
<sub-goal index="1" status="pending">Log in to the system</sub-goal>
|
|
482
|
+
<sub-goal index="2" status="pending">Complete all to-do items</sub-goal>
|
|
483
|
+
<sub-goal index="3" status="pending">Submit the registration form</sub-goal>
|
|
484
|
+
</update-plan-content>
|
|
485
|
+
|
|
486
|
+
After logging in and seeing the to-do items, you can mark the sub-goal as done:
|
|
487
|
+
|
|
488
|
+
<mark-sub-goal-done>
|
|
489
|
+
<sub-goal index="1" status="finished" />
|
|
490
|
+
</mark-sub-goal-done>
|
|
491
|
+
|
|
492
|
+
At this point, the status of all sub-goals is:
|
|
493
|
+
|
|
494
|
+
<update-plan-content>
|
|
495
|
+
<sub-goal index="1" status="finished" />
|
|
496
|
+
<sub-goal index="2" status="pending" />
|
|
497
|
+
<sub-goal index="3" status="pending" />
|
|
498
|
+
</update-plan-content>
|
|
499
|
+
|
|
500
|
+
After some time, when the last sub-goal is also completed, you can mark it as done as well:
|
|
501
|
+
|
|
502
|
+
<mark-sub-goal-done>
|
|
503
|
+
<sub-goal index="3" status="finished" />
|
|
504
|
+
</mark-sub-goal-done>`:"",m=l?3:2,y=l?4:3;return`
|
|
505
|
+
Target: You are an expert to manipulate the UI to accomplish the user's instruction. User will give you an instruction, some screenshots, background knowledge and previous logs indicating what have been done. Your task is to accomplish the instruction by thinking through the path to complete the task and give the next action to execute.
|
|
506
|
+
|
|
507
|
+
${l?"## Step 1: Observe and Plan (related tags: <thought>, <update-plan-content>, <mark-sub-goal-done>)":"## Step 1: Observe (related tags: <thought>)"}
|
|
508
|
+
|
|
509
|
+
${l?"First, observe the current screenshot and previous logs, then break down the user's instruction into multiple high-level sub-goals. Update the status of sub-goals based on what you see in the current screenshot.":"First, observe the current screenshot and previous logs to understand the current state."}
|
|
510
|
+
${l?`
|
|
511
|
+
### Observation Guidelines
|
|
512
|
+
|
|
513
|
+
- Treat visible summaries, thumbnails, cropped content, and partially visible lists as potentially incomplete when the task depends on precise details.
|
|
514
|
+
- If the current view does not provide enough information to decide safely, use available UI affordances such as opening details, expanding content, previewing, enlarging, zooming, or scrolling before acting.
|
|
515
|
+
`:""}
|
|
516
|
+
* <thought> tag (REQUIRED)
|
|
517
|
+
|
|
518
|
+
${f}
|
|
519
|
+
${g}
|
|
520
|
+
${l?`
|
|
521
|
+
## Step 2: Memory Data from Current Screenshot (related tags: <memory>)
|
|
522
|
+
|
|
523
|
+
Use \`<memory>\` to record clear, task-relevant information from the current screenshot that may be needed in later steps. The current screenshot will not be available later, so memory should preserve enough detail for future reasoning, verification, or action.
|
|
524
|
+
|
|
525
|
+
- Record information completely and exactly as shown. Do not summarize, translate, normalize, or merge values that may matter later.
|
|
526
|
+
- When recording an item, include the item itself, its exact task-relevant details, and the visible cue or UI context that identifies where it came from when relevant.
|
|
527
|
+
- Keep similar or repeated items as separate memory entries unless their task-relevant details are confirmed to be the same.
|
|
528
|
+
- After navigation, scrolling, editing, deletion, saving, or other screen changes, treat remembered positions, order, indexes, and UI bindings as references only. Re-check the current screen before acting on them.
|
|
529
|
+
|
|
530
|
+
Examples:
|
|
531
|
+
- If you need to find an item and later assert its details, record the item name and the exact details needed for the assertion, such as status, price, date, owner, description, or other visible fields.
|
|
532
|
+
- If you need to compare multiple similar results, record each candidate separately with its exact distinguishing details and visible context.
|
|
533
|
+
- If you need to copy information from one place to another, record the exact source value and the target field or UI cue it should be mapped to.
|
|
534
|
+
|
|
535
|
+
Don't use this tag if no information needs to be preserved.
|
|
536
|
+
`:""}
|
|
537
|
+
## Step ${m}: ${l?"Check if Goal is Accomplished":"Check if the Instruction is Fulfilled"} (related tags: <complete>)
|
|
538
|
+
|
|
539
|
+
${l?"Based on the current screenshot and the status of all sub-goals, determine":"Determine"} if the entire task is completed.
|
|
540
|
+
|
|
541
|
+
### CRITICAL: The User's Instruction is the Supreme Authority
|
|
542
|
+
|
|
543
|
+
The user's instruction defines the EXACT scope of what you must accomplish. You MUST follow it precisely - nothing more, nothing less. Violating this rule may cause severe consequences such as data loss, unintended operations, or system failures.
|
|
544
|
+
|
|
545
|
+
**Explicit instructions vs. High-level goals:**
|
|
546
|
+
- If the user gives you **explicit operation steps** (e.g., "click X", "type Y", "fill out the form"), treat them as exact commands. Execute ONLY those steps, nothing more.
|
|
547
|
+
- If the user gives you a **high-level goal** (e.g., "log in to the system", "complete the purchase"), you may determine the necessary steps to achieve it.
|
|
548
|
+
|
|
549
|
+
**What "${l?"goal accomplished":"instruction fulfilled"}" means:**
|
|
550
|
+
- The ${l?"goal is accomplished":"instruction is fulfilled"} when you have done EXACTLY what the user asked - no extra steps, no assumptions.
|
|
551
|
+
- Do NOT perform any action beyond the explicit instruction, even if it seems logical or helpful.
|
|
552
|
+
|
|
553
|
+
**Examples - Explicit instructions (execute exactly, no extra steps):**
|
|
554
|
+
- "fill out the form" → ${l?"Goal accomplished":"Instruction fulfilled"} when all fields are filled. Do NOT submit the form.
|
|
555
|
+
- "click the login button" → ${l?"Goal accomplished":"Instruction fulfilled"} once clicked. Do NOT wait for page load or verify login success.
|
|
556
|
+
- "type 'hello' in the search box" → ${l?"Goal accomplished":"Instruction fulfilled"} when 'hello' is typed. Do NOT press Enter or trigger search.
|
|
557
|
+
- "select the first item" → ${l?"Goal accomplished":"Instruction fulfilled"} when selected. Do NOT proceed to checkout.
|
|
558
|
+
|
|
559
|
+
**Change completion:**
|
|
560
|
+
- If the requested outcome is a durable change, such as create, edit, update, delete, save, send, submit, apply, or publish, do not stop at an unsaved draft, open editor, temporary input, transient selection, or staged value. Continue through the app/page's normal completion control such as Save, Done, Confirm, OK, Submit, Apply, Send, or Publish before completing, so the result remains after leaving the screen.
|
|
561
|
+
- If the user only asks for an intermediate UI state, such as typing text, selecting an option, filling fields, or opening a screen without saving/submitting/applying, stop once that exact state is reached.
|
|
562
|
+
|
|
563
|
+
**Special case - Scrollable option lists and dropdowns:**
|
|
564
|
+
- When choosing an item from a scrollable select, dropdown, listbox, menu, or similar option list, first open the control if it is closed. Once the list is open, interact with the list itself, not the page.
|
|
565
|
+
- If the target option is visible in the open list, Tap that exact option immediately.
|
|
566
|
+
- If the list is open but the target option is not visible, try to find it by scrolling the open list/dropdown before giving up or interacting with other elements.
|
|
567
|
+
- For an open dropdown/list, prefer small incremental Scroll actions with an explicit distance (typically 50-120 pixels) and a locate target describing the open list/dropdown. Do NOT omit distance while searching within a list, because the default scroll distance can skip over relevant options and cause oscillation.
|
|
568
|
+
- While searching within an open dropdown/list, use short scrolls so intermediate options are not skipped.
|
|
569
|
+
- After selecting the target, if the trigger text or result text shows the requested option, treat the current selection step as fulfilled and continue evaluating the remaining user instruction.
|
|
570
|
+
|
|
571
|
+
**Special case - Text hidden by a narrow input field:**
|
|
572
|
+
- CRITICAL PRIORITY OVERRIDE - Input verification after an input action:
|
|
573
|
+
- This rule overrides the general requirement to verify the exact target text from the screenshot.
|
|
574
|
+
- If the previous step already executed an input action, and the current input field is not empty, you MUST directly treat that input as successful.
|
|
575
|
+
- In this situation, do NOT use the visible text in the screenshot to decide that the input is incomplete, incorrect, missing characters, out of order, or needs correction.
|
|
576
|
+
- Do NOT perform ClearInput, another Input, KeyboardPress, or any other action intended to "fix the input content" just because the visible text looks different from the target text, has abnormal character order, missing characters, abnormal spacing, suspicious visual recognition results, or appears to have selected/highlighted text.
|
|
577
|
+
- The general rule "do EXACTLY what the user asked" still applies to the intended input value you execute, but it MUST NOT be enforced by re-validating the visible text in the screenshot after the input action.
|
|
578
|
+
- Differences in visible text must be assumed to be caused by clipping, horizontal scrolling, narrow input fields, text selection, caret position, or visual recognition errors rather than input failure.
|
|
579
|
+
- Retry input only when the input field is clearly still empty, or when the page shows an explicit error message.
|
|
580
|
+
|
|
581
|
+
**Special case - Assertion instructions:**
|
|
582
|
+
- If the user's instruction includes an assertion (e.g., "verify that...", "check that...", "assert..."), and you observe from the screenshot that the assertion condition is NOT satisfied and cannot be satisfied, mark ${l?"the goal":"it"} as failed (success="false").
|
|
583
|
+
- If the page is still loading (e.g., you see a loading spinner, skeleton screen, or progress bar), do NOT assert yet. Wait for the page to finish loading before evaluating the assertion.
|
|
584
|
+
|
|
585
|
+
### Completion Criteria for Process-required Instructions
|
|
586
|
+
|
|
587
|
+
If the user's instruction includes explicit operation steps, ordering requirements, or action requirements, it is a process-required instruction.
|
|
588
|
+
|
|
589
|
+
For process-required instructions, do NOT treat the task as complete only because the current screenshot already shows the final expected state. Do NOT infer that earlier steps were executed from the final UI state.
|
|
590
|
+
|
|
591
|
+
You may output <complete success="true"> only when the current execution history, previous logs, or the screenshot after the most recent action proves that every explicit step required by the user has been completed, and the final check condition is also satisfied.
|
|
592
|
+
|
|
593
|
+
If any explicit step lacks completion evidence in the current execution history, continue with the next missing step instead of outputting <complete>, even if the current screenshot appears to satisfy the final condition.
|
|
594
|
+
${!l?`
|
|
595
|
+
**Page navigation restriction:**
|
|
596
|
+
- Unless the user's instruction explicitly asks you to click a link, jump to another page, or navigate to a URL, you MUST complete the task on the current page only.
|
|
597
|
+
- Do NOT navigate away from the current page on your own initiative (e.g., do not click links that lead to other pages, do not use browser back/forward, do not open new URLs).
|
|
598
|
+
- If the task cannot be accomplished on the current page and the user has not instructed you to navigate, report it as a failure (success="false") instead of attempting to navigate to other pages.
|
|
599
|
+
`:""}
|
|
600
|
+
### Output Rules
|
|
601
|
+
|
|
602
|
+
- If the task is NOT complete, skip this section and continue to Step ${y}.
|
|
603
|
+
- Use the <complete success="true|false">message</complete> tag to output the result if the goal is accomplished or failed.
|
|
604
|
+
- the 'success' attribute is required. ${l?"It means whether the expected goal is accomplished based on what you observe in the current screenshot and the current execution history. ":""}No matter what errors occurred during execution, set success="true" only when the current execution history shows that all steps required by the user have been completed and the final state satisfies the requirement. If the user asks for explicit operation steps or an ordered workflow, do not treat those steps as completed only because the current screenshot already shows the final expected state. If the ${l?"expected goal is not accomplished and cannot be accomplished":"instruction is not fulfilled and cannot be fulfilled"}, set success="false".
|
|
605
|
+
- the 'message' is the information that will be provided to the user. If the user asks for a specific format, strictly follow that.
|
|
606
|
+
- If you output <complete>, do NOT output <action-type> or <action-param-json>. The task ends here.
|
|
607
|
+
|
|
608
|
+
## Step ${y}: Determine Next Action (related tags: <log>, <action-type>, <action-param-json>, <error>)
|
|
609
|
+
|
|
610
|
+
ONLY if the task is not complete: Think what the next action is according to the current screenshot${l?" and the plan":""}.
|
|
611
|
+
|
|
612
|
+
- Don't give extra actions or plans beyond the instruction or the plan. For example, don't try to submit the form if the instruction is only to fill something.
|
|
613
|
+
- Consider the current screenshot and give the action that is most likely to accomplish the instruction. For example, if the next step is to click a button but it's not visible in the screenshot, you should try to find it first instead of give a click action.
|
|
614
|
+
- Make sure the previous actions are completed successfully. Otherwise, retry or do something else to recover.
|
|
615
|
+
- Give just the next ONE action you should do (if any)
|
|
616
|
+
- If there are some error messages reported by the previous actions, don't give up, try parse a new action to recover. If the error persists for more than 3 times, you should think this is an error and set the "error" field to the error message.
|
|
617
|
+
|
|
618
|
+
${A}
|
|
619
|
+
|
|
620
|
+
${n?`${nx()}
|
|
621
|
+
|
|
622
|
+
`:""}### Supporting actions list
|
|
623
|
+
|
|
624
|
+
${s}
|
|
625
|
+
|
|
626
|
+
### Log to give user feedback (preamble message)
|
|
627
|
+
|
|
628
|
+
The <log> tag is a brief preamble message to the user explaining what you're about to do. It should follow these principles and examples:
|
|
629
|
+
|
|
630
|
+
- **Use ${a}**
|
|
631
|
+
- **Keep it concise**: be no more than 1-2 sentences, focused on immediate, tangible next steps. (8–12 words or Chinese characters for quick updates).
|
|
632
|
+
- **Build on prior context**: if this is not the first action to be done, use the preamble message to connect the dots with what's been done so far and create a sense of momentum and clarity for the user to understand your next actions.
|
|
633
|
+
- **Keep your tone light, friendly and curious**: add small touches of personality in preambles feel collaborative and engaging.
|
|
634
|
+
|
|
635
|
+
**Examples:**
|
|
636
|
+
- <log>Click the login button</log>
|
|
637
|
+
- <log>Scroll to find the 'Yes' button in popup</log>
|
|
638
|
+
- <log>Previous actions failed to find the 'Yes' button, i will try again</log>
|
|
639
|
+
- <log>Go back to find the login button</log>
|
|
640
|
+
|
|
641
|
+
### If there is some action to do ...
|
|
642
|
+
|
|
643
|
+
- Use the <action-type> and <action-param-json> tags to output the action to be executed.
|
|
644
|
+
- The <action-type> MUST be one of the supporting actions. 'complete' is NOT a valid action-type.
|
|
645
|
+
- Parameter names are strict. Use EXACTLY the field names listed for the selected action. Do NOT invent alias fields. If an action has a "sample" in its description, follow that structure.
|
|
646
|
+
For example:
|
|
647
|
+
<action-type>Tap</action-type>
|
|
648
|
+
<action-param-json>
|
|
649
|
+
{
|
|
650
|
+
"locate": ${u}
|
|
651
|
+
}
|
|
652
|
+
</action-param-json>
|
|
653
|
+
|
|
654
|
+
### If you think there is an error ...
|
|
655
|
+
|
|
656
|
+
- Use the <error> tag to output the error message.
|
|
657
|
+
|
|
658
|
+
For example:
|
|
659
|
+
<error>Unable to find the required element on the page</error>
|
|
660
|
+
|
|
661
|
+
### If there is no action to do ...
|
|
662
|
+
|
|
663
|
+
- Don't output <action-type> or <action-param-json> if there is no action to do.
|
|
664
|
+
|
|
665
|
+
## Return Format
|
|
666
|
+
|
|
667
|
+
Return in XML format following this decision flow:
|
|
668
|
+
|
|
669
|
+
**Always include (REQUIRED):**
|
|
670
|
+
<!-- Step 1: Observe${l?" and Plan":""} -->
|
|
671
|
+
<thought>Your thought process here. NEVER skip this tag.</thought>
|
|
672
|
+
${l?`
|
|
673
|
+
<!-- required when no update-plan-content is provided in the previous response -->
|
|
674
|
+
<update-plan-content>...</update-plan-content>
|
|
675
|
+
|
|
676
|
+
<!-- required when any sub-goal is completed -->
|
|
677
|
+
<mark-sub-goal-done>
|
|
678
|
+
<sub-goal index="1" status="finished" />
|
|
679
|
+
</mark-sub-goal-done>
|
|
680
|
+
`:""}${l?`
|
|
681
|
+
<!-- Step 2: Memory data from current screenshot if needed -->
|
|
682
|
+
<memory>...</memory>
|
|
683
|
+
`:""}
|
|
684
|
+
**Then choose ONE of the following paths:**
|
|
685
|
+
|
|
686
|
+
**Path A: If the ${l?"goal is accomplished":"instruction is fulfilled"} or failed (Step ${m})**
|
|
687
|
+
<complete success="true|false">...</complete>
|
|
688
|
+
|
|
689
|
+
**Path B: If the ${l?"goal is NOT complete":"instruction is NOT fulfilled"} yet (Step ${y})**
|
|
690
|
+
<!-- Determine next action -->
|
|
691
|
+
<log>...</log>
|
|
692
|
+
<action-type>...</action-type>
|
|
693
|
+
<action-param-json>...</action-param-json>
|
|
694
|
+
|
|
695
|
+
<!-- OR if there's an error -->
|
|
696
|
+
<error>...</error>
|
|
697
|
+
${l?`
|
|
698
|
+
## Multi-turn Conversation Example
|
|
699
|
+
|
|
700
|
+
Below is an example of a multi-turn conversation for "fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address":
|
|
701
|
+
|
|
702
|
+
### Turn 1 - Initial instruction
|
|
703
|
+
|
|
704
|
+
**User message:**
|
|
705
|
+
<user_instruction>fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address</user_instruction>
|
|
706
|
+
|
|
707
|
+
**Screenshot:** [Shows a registration form with empty Name and Email fields]
|
|
708
|
+
|
|
709
|
+
**Your response:**
|
|
710
|
+
<thought>The user wants me to fill out the registration form with specific values and return the email address. I can see the form has two fields: Name and Email. Both are currently empty. I'll break this down into sub-goals and start with the Name field. Note: The instruction is to fill the form only (not submit), and return the email at the end.</thought>
|
|
711
|
+
<update-plan-content>
|
|
712
|
+
<sub-goal index="1" status="pending">Fill in the Name field with 'John'</sub-goal>
|
|
713
|
+
<sub-goal index="2" status="pending">Fill in the Email field with 'john@example.com'</sub-goal>
|
|
714
|
+
<sub-goal index="3" status="pending">Return the filled email address</sub-goal>
|
|
715
|
+
</update-plan-content>
|
|
716
|
+
<log>Click on the Name field to start filling the form</log>
|
|
717
|
+
<action-type>Tap</action-type>
|
|
718
|
+
<action-param-json>
|
|
719
|
+
{
|
|
720
|
+
"locate": ${d}
|
|
721
|
+
}
|
|
722
|
+
</action-param-json>
|
|
723
|
+
|
|
724
|
+
### Turn 2 - After clicking Name field
|
|
725
|
+
|
|
726
|
+
**User message:**
|
|
727
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
728
|
+
|
|
729
|
+
Sub-goals:
|
|
730
|
+
1. Fill in the Name field with 'John' (running)
|
|
731
|
+
2. Fill in the Email field with 'john@example.com' (pending)
|
|
732
|
+
3. Return the filled email address (pending)
|
|
733
|
+
Current sub-goal is: Fill in the Name field with 'John'
|
|
734
|
+
Actions performed for current sub-goal:
|
|
735
|
+
- Click on the Name field to start filling the form
|
|
736
|
+
|
|
737
|
+
**Screenshot:** [Shows the form with Name field now focused/active]
|
|
738
|
+
|
|
739
|
+
**Your response:**
|
|
740
|
+
<thought>The Name field is now focused. I need to type 'John' into this field. Current sub-goal is running, will be completed after input.</thought>
|
|
741
|
+
<log>Typing 'John' into the Name field</log>
|
|
742
|
+
<action-type>Input</action-type>
|
|
743
|
+
<action-param-json>
|
|
744
|
+
{
|
|
745
|
+
"value": "John"
|
|
746
|
+
}
|
|
747
|
+
</action-param-json>
|
|
748
|
+
|
|
749
|
+
### Turn 3 - After entering name
|
|
750
|
+
|
|
751
|
+
**User message:**
|
|
752
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
753
|
+
|
|
754
|
+
Sub-goals:
|
|
755
|
+
1. Fill in the Name field with 'John' (running)
|
|
756
|
+
2. Fill in the Email field with 'john@example.com' (pending)
|
|
757
|
+
3. Return the filled email address (pending)
|
|
758
|
+
Current sub-goal is: Fill in the Name field with 'John'
|
|
759
|
+
Actions performed for current sub-goal:
|
|
760
|
+
- Click on the Name field to start filling the form
|
|
761
|
+
- Typing 'John' into the Name field
|
|
762
|
+
|
|
763
|
+
**Screenshot:** [Shows the form with Name field containing 'John']
|
|
764
|
+
|
|
765
|
+
**Your response:**
|
|
766
|
+
<thought>The Name field now shows 'John'. Sub-goal 1 is complete. Next, I need to fill the Email field for sub-goal 2.</thought>
|
|
767
|
+
<mark-sub-goal-done>
|
|
768
|
+
<sub-goal index="1" status="finished" />
|
|
769
|
+
</mark-sub-goal-done>
|
|
770
|
+
<memory>Name field has been filled with 'John'</memory>
|
|
771
|
+
<log>Moving to the Email field</log>
|
|
772
|
+
<action-type>Tap</action-type>
|
|
773
|
+
<action-param-json>
|
|
774
|
+
{
|
|
775
|
+
"locate": ${p}
|
|
776
|
+
}
|
|
777
|
+
</action-param-json>
|
|
778
|
+
|
|
779
|
+
### Turn 4 - After clicking Email field
|
|
780
|
+
|
|
781
|
+
**User message:**
|
|
782
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
783
|
+
|
|
784
|
+
Sub-goals:
|
|
785
|
+
1. Fill in the Name field with 'John' (finished)
|
|
786
|
+
2. Fill in the Email field with 'john@example.com' (running)
|
|
787
|
+
3. Return the filled email address (pending)
|
|
788
|
+
Current sub-goal is: Fill in the Email field with 'john@example.com'
|
|
789
|
+
Actions performed for current sub-goal:
|
|
790
|
+
- Moving to the Email field
|
|
791
|
+
|
|
792
|
+
**Screenshot:** [Shows the form with Name='John' and Email field focused]
|
|
793
|
+
|
|
794
|
+
**Your response:**
|
|
795
|
+
<thought>The Email field is now focused. I'll enter 'john@example.com'. After this, sub-goal 2 will be complete and my task will be done.</thought>
|
|
796
|
+
<log>Typing email address into the Email field</log>
|
|
797
|
+
<action-type>Input</action-type>
|
|
798
|
+
<action-param-json>
|
|
799
|
+
{
|
|
800
|
+
"value": "john@example.com"
|
|
801
|
+
}
|
|
802
|
+
</action-param-json>
|
|
803
|
+
|
|
804
|
+
### Turn 5 - After entering email (Goal accomplished)
|
|
805
|
+
|
|
806
|
+
**User message:**
|
|
807
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
808
|
+
|
|
809
|
+
Sub-goals:
|
|
810
|
+
1. Fill in the Name field with 'John' (finished)
|
|
811
|
+
2. Fill in the Email field with 'john@example.com' (running)
|
|
812
|
+
3. Return the filled email address (pending)
|
|
813
|
+
Current sub-goal is: Fill in the Email field with 'john@example.com'
|
|
814
|
+
Actions performed for current sub-goal:
|
|
815
|
+
- Moving to the Email field
|
|
816
|
+
- Typing email address into the Email field
|
|
817
|
+
|
|
818
|
+
**Screenshot:** [Shows the form with Name='John' and Email='john@example.com']
|
|
819
|
+
|
|
820
|
+
**Your response:**
|
|
821
|
+
<thought>Both fields are now filled: Name shows 'John' and Email shows 'john@example.com'. Sub-goal 2 is complete. The user asked me to return the filled email address, so I need to include 'john@example.com' in my response. All sub-goals are now finished.</thought>
|
|
822
|
+
<mark-sub-goal-done>
|
|
823
|
+
<sub-goal index="2" status="finished" />
|
|
824
|
+
<sub-goal index="3" status="finished" />
|
|
825
|
+
</mark-sub-goal-done>
|
|
826
|
+
<complete success="true">john@example.com</complete>
|
|
827
|
+
`:`
|
|
828
|
+
## Multi-turn Conversation Example
|
|
829
|
+
|
|
830
|
+
Below is an example of a multi-turn conversation for "fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address":
|
|
831
|
+
|
|
832
|
+
### Turn 1 - Initial instruction
|
|
833
|
+
|
|
834
|
+
**User message:**
|
|
835
|
+
<user_instruction>fill out the registration form with name 'John' and email 'john@example.com', then return the filled email address</user_instruction>
|
|
836
|
+
|
|
837
|
+
**Screenshot:** [Shows a registration form with empty Name and Email fields]
|
|
838
|
+
|
|
839
|
+
**Your response:**
|
|
840
|
+
<thought>The user wants me to fill out the registration form with specific values and return the email address. I can see the form has two fields: Name and Email. Both are currently empty. I should start by clicking on the Name field. Note: The instruction is to fill the form only (not submit), and return the email at the end.</thought>
|
|
841
|
+
<log>Click on the Name field to start filling the form</log>
|
|
842
|
+
<action-type>Tap</action-type>
|
|
843
|
+
<action-param-json>
|
|
844
|
+
{
|
|
845
|
+
"locate": ${d}
|
|
846
|
+
}
|
|
847
|
+
</action-param-json>
|
|
848
|
+
|
|
849
|
+
### Turn 2 - After clicking Name field
|
|
850
|
+
|
|
851
|
+
**User message:**
|
|
852
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
853
|
+
|
|
854
|
+
**Screenshot:** [Shows the form with Name field now focused/active]
|
|
855
|
+
|
|
856
|
+
**Your response:**
|
|
857
|
+
<thought>The Name field is now focused. I need to type 'John' into this field. After this, I'll need to fill the Email field as well.</thought>
|
|
858
|
+
<log>Typing 'John' into the Name field</log>
|
|
859
|
+
<action-type>Input</action-type>
|
|
860
|
+
<action-param-json>
|
|
861
|
+
{
|
|
862
|
+
"value": "John"
|
|
863
|
+
}
|
|
864
|
+
</action-param-json>
|
|
865
|
+
|
|
866
|
+
### Turn 3 - After entering name
|
|
867
|
+
|
|
868
|
+
**User message:**
|
|
869
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
870
|
+
|
|
871
|
+
**Screenshot:** [Shows the form with Name field containing 'John']
|
|
872
|
+
|
|
873
|
+
**Your response:**
|
|
874
|
+
<thought>The Name field now shows 'John'. Next, I need to fill the Email field with 'john@example.com'. I'll click on the Email field first.</thought>
|
|
875
|
+
<log>Moving to the Email field</log>
|
|
876
|
+
<action-type>Tap</action-type>
|
|
877
|
+
<action-param-json>
|
|
878
|
+
{
|
|
879
|
+
"locate": ${p}
|
|
880
|
+
}
|
|
881
|
+
</action-param-json>
|
|
882
|
+
|
|
883
|
+
### Turn 4 - After clicking Email field
|
|
884
|
+
|
|
885
|
+
**User message:**
|
|
886
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
887
|
+
|
|
888
|
+
**Screenshot:** [Shows the form with Name='John' and Email field focused]
|
|
889
|
+
|
|
890
|
+
**Your response:**
|
|
891
|
+
<thought>The Email field is now focused. I'll enter 'john@example.com'. After this, both required fields will be filled and my task will be complete.</thought>
|
|
892
|
+
<log>Typing email address into the Email field</log>
|
|
893
|
+
<action-type>Input</action-type>
|
|
894
|
+
<action-param-json>
|
|
895
|
+
{
|
|
896
|
+
"value": "john@example.com"
|
|
897
|
+
}
|
|
898
|
+
</action-param-json>
|
|
899
|
+
|
|
900
|
+
### Turn 5 - After entering email (Instruction fulfilled)
|
|
901
|
+
|
|
902
|
+
**User message:**
|
|
903
|
+
The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.
|
|
904
|
+
|
|
905
|
+
**Screenshot:** [Shows the form with Name='John' and Email='john@example.com']
|
|
906
|
+
|
|
907
|
+
**Your response:**
|
|
908
|
+
<thought>Both fields are now filled: Name shows 'John' and Email shows 'john@example.com'. The user asked me to return the filled email address, so I should include 'john@example.com' in my response. The instruction has been fulfilled.</thought>
|
|
909
|
+
<complete success="true">john@example.com</complete>
|
|
910
|
+
`}`}let it=(0,eN.a)("planning"),ir=(0,eN.a)("planning",{console:!0});function ii(e,t){let r,n,i=nE(e,"thought"),o=nE(e,"memory"),a=nE(e,"log")||"",s=nE(e,"error"),A=nE(e,"action-type"),l=nE(e,"action-param-json"),c=e.match(/<complete\s+success="(true|false)">([\s\S]*?)<\/complete>/i);if(c){var u;n="true"===c[1],r=(null==(u=c[2])?void 0:u.trim())||void 0}let d=nE(e,"update-plan-content"),p=nE(e,"mark-sub-goal-done"),h=d?function(e){let t,r=[],n=/<sub-goal\s+index="(\d+)"\s+status="(pending|finished)"(?:\s*\/>|>([\s\S]*?)<\/sub-goal>)/gi;for(t=n.exec(e);null!==t;){var i;let o=Number.parseInt(t[1],10),a=t[2],s=(null==(i=t[3])?void 0:i.trim())||"";r.push({index:o,status:a,description:s}),t=n.exec(e)}return r}(d):void 0,f=p?function(e){let t,r=[],n=/<sub-goal\s+index="(\d+)"\s+status="finished"\s*\/>/gi;for(t=n.exec(e);null!==t;)r.push(Number.parseInt(t[1],10)),t=n.exec(e);return r}(p):void 0,g=null;if(A&&"null"!==A.toLowerCase()){let e,r=A.split("<")[0].trim();if(l)try{e=t(l,{source:"planning-action-param",preserveStringValueKeys:"input"===r.toLowerCase()?["value"]:void 0})}catch(e){throw Error(`Failed to parse action-param-json: ${e}`)}g={type:r,...void 0!==e?{param:e}:{}}}return{...i?{thought:i}:{},...o?{memory:o}:{},log:a,...s?{error:s}:{},action:g,...void 0!==r?{finalizeMessage:r}:{},...void 0!==n?{finalizeSuccess:n}:{},...(null==h?void 0:h.length)?{updateSubGoals:h}:{},...(null==f?void 0:f.length)?{markFinishedIndexes:f}:{}}}async function io(e,t){let r,n,{context:i,conversationHistory:o}=t,a=t.modelRuntime,{adapter:s}=a,{shotSize:A}=i,l=i.screenshot.base64;if(t.includeLocateInPlanning&&!a.config.modelFamily)throw Error(nb(a.config.slot));let c=a.config.modelFamily&&"standard"===s.locate.kind?s.locate.resultAdapter:void 0,u=!0===t.deepThink,d=await ie({actionSpace:t.actionSpace,locatePromptSpec:null==c?void 0:c.promptSpec,includeLocateInPlanning:t.includeLocateInPlanning,includeThought:!0,includeSubGoals:u}),p=await rp({imageBase64:l,width:A.width,height:A.height,policy:s.imagePreprocess}),h=p.imageBase64,f=tX(e),g=t.actionContext?`<high_priority_knowledge>${t.actionContext}</high_priority_knowledge>
|
|
911
|
+
`:"",m=[{role:"user",content:[{type:"text",text:`${g}<user_instruction>${f}</user_instruction>`}]},...t.referenceImageMessages??[]],y=u?o.subGoalsToText():o.historicalLogsToText(),v=y?`
|
|
912
|
+
|
|
913
|
+
${y}`:o.pendingFeedbackMessage?"":`
|
|
914
|
+
|
|
915
|
+
No previous actions have been executed in this aiAct execution yet. If the instruction asks for actions, choose the first action to execute.`,b=o.memoriesToText(),w=b?`
|
|
916
|
+
|
|
917
|
+
${b}`:"";o.pendingFeedbackMessage?(r={role:"user",content:[{type:"text",text:`${o.pendingFeedbackMessage}. The previous action has been executed, here is the latest screenshot. Please continue according to the instruction.${w}${v}`},{type:"image_url",image_url:{url:h,detail:"high"}}]},o.resetPendingFeedbackMessageIfExists()):r={role:"user",content:[{type:"text",text:`This is the current screenshot.${w}${v}`},{type:"image_url",image_url:{url:h,detail:"high"}}]},o.append(r),o.compressHistory(50,20);let E=[{role:"system",content:d},...m,...o.snapshot(t.imagesIncludeCount)],{content:k,usage:x,reasoning_content:S,rawChoiceMessage:C}=await nf(E,a,{abortSignal:t.abortSignal,requiresOriginalImageDetail:t.includeLocateInPlanning});try{try{n=ii(k,s.jsonParser)}catch{let e=await nf(E,a,{abortSignal:t.abortSignal,requiresOriginalImageDetail:t.includeLocateInPlanning});k=e.content,x=e.usage,S=e.reasoning_content,C=e.rawChoiceMessage,n=ii(k,s.jsonParser)}n.action&&void 0!==n.finalizeSuccess&&(ir("Planning response included both an action and <complete>; ignoring <complete> output."),n.finalizeMessage=void 0,n.finalizeSuccess=void 0);let e=n.action?[n.action]:[],r=!0;void 0!==n.finalizeSuccess&&(it("task completed via <complete> tag, stop planning"),r=!1,u&&o.markAllSubGoalsFinished());let i={...n,actions:e,rawResponse:k,rawChoiceMessage:C,usage:x,reasoning_content:S,yamlFlow:function(e,t){let r=[];for(let n of e){let e=n.type,i=tK(e,t),o=i.interfaceAlias||e,a=i.paramSchema?tY(n.param||{},i.paramSchema):{},s="Launch"===i.name||"launch"===i.interfaceAlias||"Terminate"===i.name||"terminate"===i.interfaceAlias?"uri":"RunAdbShell"===i.name||"runAdbShell"===i.interfaceAlias||"RunHdcShell"===i.name||"runHdcShell"===i.interfaceAlias?"command":void 0,A=s?Object.keys(a):[],l=s&&1===A.length&&A[0]===s&&"string"==typeof a[s]?{[o]:a[s]}:{[o]:"",...a};r.push(l)}return r}(e,t.actionSpace),shouldContinuePlanning:r};if((0,eZ.vA)(n,"can't get plans from AI"),rf(e,{actionSpace:t.actionSpace,includeLocateInPlanning:t.includeLocateInPlanning,locateResultAdapter:c,locateResultContext:{preparedSize:p.preparedSize,contentSize:p.contentSize}}),u){var I,j;if((null==(I=n.updateSubGoals)?void 0:I.length)&&o.mergeSubGoals(n.updateSubGoals),null==(j=n.markFinishedIndexes)?void 0:j.length)for(let e of n.markFinishedIndexes)o.markSubGoalFinished(e);n.log&&o.appendSubGoalLog(n.log)}else n.log&&o.appendHistoricalLog(n.log);return n.memory&&o.appendMemory(n.memory),o.append({role:"assistant",content:[{type:"text",text:k}]}),i}catch(t){let e=t instanceof Error?t.message:String(t);throw new np(`XML parse error: ${e}`,k,x,C)}}r(1182);var ia=r(3612),is=r(3198),iA=r(9383),il=r(5409);let ic=(0,eN.a)("yaml:utils"),iu=/^tasks\s*:/,id=/^[^\s#][^:]*:/,ip=["images","convertHttpImage2Base64"];function ih(e){if("object"!=typeof e||null===e)return;let t=ip.map(t=>[t,e[t]]).filter(e=>{let[,t]=e;return void 0!==t});return t.length?Object.fromEntries(t):void 0}function ig(e,t){let r;ic("will call buildDetailedLocateParam",e,t);let n=e;if("object"==typeof e&&null!==e&&"prompt"in e){let{prompt:t,...r}=e;n=Object.keys(r).length>0?e:t}let i=n||(null==t?void 0:t.prompt)||(null==t?void 0:t.locate),o=!1,a=!0;if("object"==typeof t&&null!==t&&(o=t.deepLocate??t.deepThink??!1,a=t.cacheable??!0,r=t.xpath,e&&t.prompt&&e!==t.prompt&&console.warn("conflict prompt for item",e,t,"maybe you put the prompt in the wrong place"),i=i||t.prompt),!i)return void ic("no prompt, will return undefined in buildDetailedLocateParam",t);let s=ih(t);return s&&(i="string"==typeof i?{prompt:i,...s}:{...i,...s}),{prompt:i,deepLocate:o,cacheable:a,xpath:r}}var im=r(5409);function iy(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let iv=(0,eN.a)("yaml-player"),ib={aiQuery:"aiQuery",aiNumber:"aiNumber",aiString:"aiString",aiBoolean:"aiBoolean",aiAsk:"aiAsk",aiLocate:"aiLocate"},iw=e=>{if(!e)return!1;let t=null==e?void 0:e._def;if(!(null==t?void 0:t.typeName))return!1;switch(t.typeName){case tu.kY.ZodString:case tu.kY.ZodEnum:case tu.kY.ZodNativeEnum:return!0;case tu.kY.ZodLiteral:return"string"==typeof t.value;case tu.kY.ZodOptional:case tu.kY.ZodNullable:case tu.kY.ZodDefault:return iw(t.innerType);case tu.kY.ZodEffects:return iw(t.schema);case tu.kY.ZodPipeline:return iw(t.out);case tu.kY.ZodUnion:{let e=t.options;return!!Array.isArray(e)&&e.every(e=>iw(e))}default:return!1}};class iE{setResult(e,t){let r=e||this.unnamedResultIndex++;return this.result[r]&&console.warn(`result key ${r} already exists, will overwrite`),this.result[r]=t,this.flushResult()}setPlayerStatus(e,t){this.status=e,this.errorInSetup=t}notifyCurrentTaskStatusChange(e){let t="number"==typeof e?e:this.currentTaskIndex;if("number"!=typeof t)return;let r=this.taskStatusList[t];this.onTaskStatusChange&&this.onTaskStatusChange(r)}async setTaskStatus(e,t,r){this.taskStatusList[e].status=t,r&&(this.taskStatusList[e].error=r),this.notifyCurrentTaskStatusChange(e)}setTaskIndex(e){this.currentTaskIndex=e}flushResult(){if(this.output){let e=(0,tg.resolve)(im.cwd(),this.output),t=(0,tg.dirname)(e);(0,ia.existsSync)(t)||(0,ia.mkdirSync)(t,{recursive:!0}),(0,ia.writeFileSync)(e,JSON.stringify(this.result||{},void 0,2))}}flushUnstableLogContent(){if(this.unstableLogContent){var e;let t=null==(e=this.interfaceAgent)?void 0:e._unstableLogContent(),r=(0,tg.resolve)(im.cwd(),this.unstableLogContent),n=(0,tg.dirname)(r);(0,ia.existsSync)(n)||(0,ia.mkdirSync)(n,{recursive:!0}),(0,ia.writeFileSync)(r,JSON.stringify(t,null,2))}}async playTask(e,t){let{flow:r}=e;for(let o in(0,eZ.vA)(r,"missing flow in task"),r){var n,i;e.currentStep=Number.parseInt(o,10);let a=r[o],s=(null==(i=t.dump)||null==(n=i.executions)?void 0:n.length)??0;this.failedReportExecutionInCurrentStep=!1;try{await this.playFlowItem(t,a,a,o)}catch(e){throw this.failedReportExecutionInCurrentStep=this.hasFailedReportExecutionSince(t,s),e}}this.reportFile=t.reportFile,await this.flushUnstableLogContent()}hasFailedReportExecutionSince(e,t){var r;return((null==(r=e.dump)?void 0:r.executions)??[]).slice(t).some(e=>e.tasks.some(e=>"failed"===e.status||!!(e.error||e.errorMessage)))}async playFlowItem(e,t,r,n){if("Finalize"in r)return;iv(`playing step ${n}, flowItem=${JSON.stringify(t)}`);let i=Object.keys(ib).find(e=>Object.prototype.hasOwnProperty.call(r,e));if("aiAct"in t||"aiAction"in t||"ai"in t){let r,{aiAct:n,aiAction:i,ai:o,instruction:a,...s}=t,A=n??i??o;"string"==typeof a&&a||a&&"object"==typeof a&&"string"==typeof a.prompt&&a.prompt?r=a:A&&"object"==typeof A&&"string"==typeof A.prompt&&A.prompt?r=A:"string"==typeof A&&A&&(r=A),(0,eZ.vA)(r,"missing prompt for ai (aiAct)"),await e.aiAct(r,s)}else if("runGherkinScenario"in t){let{runGherkinScenario:r}=t;(0,eZ.vA)(r,"missing scenario for runGherkinScenario"),await e.runGherkinScenario(r,{cacheable:!1})}else if("aiAssert"in t){let{aiAssert:r,errorMessage:n,name:i,...o}=t;(0,eZ.vA)(r,"missing prompt for aiAssert");let{pass:a,thought:s,message:A}=await e.aiAssert(r,n,{...o,keepRawResponse:!0})||{};if(this.setResult(i,{pass:a,thought:s,message:A}),!a)throw Error(A)}else if(i){let{[i]:r,name:n,...o}=t;(0,eZ.vA)(r,`missing prompt for ${i}`);let a=e[ib[i]];(0,eZ.vA)("function"==typeof a,`missing agent method for ${i}`);let s=await a.call(e,r,o);this.setResult(n,s)}else if("aiWaitFor"in t){let{aiWaitFor:r,timeout:n,...i}=t;(0,eZ.vA)(r,"missing prompt for aiWaitFor");let o={...i,...void 0!==n?{timeout:n,timeoutMs:n}:{}};await e.aiWaitFor(r,o)}else if("sleep"in t){let e=t.sleep,r=e;"string"==typeof e&&(r=Number.parseInt(e,10)),(0,eZ.vA)(r&&r>0,`ms for sleep must be greater than 0, but got ${e}`),await new Promise(e=>setTimeout(e,r))}else if("javascript"in t){let r=await e.evaluateJavaScript(t.javascript);this.setResult(t.name,r)}else if("logScreenshot"in t||"recordToReport"in t){let r=t.recordToReport??t.logScreenshot??"untitled",n=t.content||"";await e.recordToReport(r,{content:n})}else if("aiInput"in t){let r,n,{aiInput:i,value:o,...a}=t;a.locate?(n=i||o,r=a.locate):(r=i||"",n=o),await e.callActionInActionSpace("Input",{...a,...void 0!==n?{value:String(n)}:{},...r?{locate:ig(r,a)}:{}})}else if("aiKeyboardPress"in t){let r,n,{aiKeyboardPress:i,...o}=t;o.locate?(n=i,r=o.locate):o.keyName?(n=o.keyName,r=i):n=i,await e.callActionInActionSpace("KeyboardPress",{...o,...n?{keyName:n}:{},...r?{locate:ig(r,o)}:{}})}else if("aiScroll"in t){let{aiScroll:r,...n}=t,{locate:i,...o}=n;await e.aiScroll(i??r??void 0,o)}else if("aiTap"in t){let r,{aiTap:n,prompt:i,locate:o,...a}=t,s=a,A=o??("object"==typeof n&&null!==n?n.locate:void 0);if("string"==typeof n&&n)r=n;else if("object"==typeof A&&(null==A?void 0:A.prompt)){let{prompt:e,...t}=A;r=e,s={...t,...a}}else r=(null==n?void 0:n.prompt)||i||A;(0,eZ.vA)(r,"missing prompt for aiTap"),await e.aiTap(r,s)}else{var o,a,s;let r,n,i,A=this.actionSpace.find(e=>{let i=e.interfaceAlias;if(i&&Object.prototype.hasOwnProperty.call(t,i))return"string"==typeof(n=t[i])&&(r=n),!0;let o=e.name;return!!Object.prototype.hasOwnProperty.call(t,o)&&("string"==typeof(n=t[o])&&(r=n),!0)});(0,eZ.vA)(A,`unknown flowItem in yaml: ${JSON.stringify(t)}`);let l=iw(A.paramSchema),c=t.name,u=t.timeout;if(Object.prototype.hasOwnProperty.call(t,"runAdbShell")&&"string"==typeof n&&"number"==typeof u&&"function"==typeof e.runAdbShell){let t=await e.runAdbShell(n,{timeout:u});void 0!==t&&this.setResult(c,t);return}let d="string"==typeof n?(o=A.name,a=A.interfaceAlias,s=n,"Launch"===o||"launch"===a||"Terminate"===o||"terminate"===a?{uri:s}:"RunAdbShell"===o||"runAdbShell"===a||"RunHdcShell"===o||"runHdcShell"===a?{command:s}:void 0):void 0;if(d){iv(`matchedAction: ${A.name}`,`flowParams: ${JSON.stringify(d)}`);let t=await e.callActionInActionSpace(A.name,d);void 0!==t&&this.setResult(c,t)}else if("string"==typeof n&&l){if(A.paramSchema){let e=A.paramSchema.safeParse(n);e.success&&"string"==typeof e.data?i=e.data:e.success||(iv(`parse failed for action ${A.name} with string param`,e.error),i=n)}else i=n;if(void 0!==i){iv(`matchedAction: ${A.name}`,`flowParams: ${JSON.stringify(i)}`);let r=await e.callActionInActionSpace(A.name,i),n=t.name;void 0!==r&&this.setResult(n,r)}}else{let i=r&&"string"==typeof n?{...t,prompt:r}:"object"==typeof n&&null!==n?n:t,{locateParam:o,restParams:a}=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],n=ih(t),i=ig(e,t),o={};if("object"==typeof t&&null!==t){let e=Object.keys(t),a=Object.keys(i||{}),s="object"==typeof(null==i?void 0:i.prompt)&&(null==i?void 0:i.prompt)!==null?Object.keys(n||{}):[];for(let n of e)a.includes(n)||s.includes(n)||r.includes(n)||"locate"===n||(o[n]=t[n])}return{locateParam:i,restParams:o}}(r||"",i,[A.name,A.interfaceAlias||"_never_mind_"]),s={...a,locate:o};iv(`matchedAction: ${A.name}`,`flowParams: ${JSON.stringify(s,null,2)}`);let l=await e.callActionInActionSpace(A.name,s),c=t.name;void 0!==l&&this.setResult(c,l)}}}async run(){let{target:e,web:t,android:r,ios:n,harmony:i,computer:o,tasks:a}=this.script;this.setPlayerStatus("running");let s=null,A=[];try{let{agent:a,freeFn:l}=await this.setupAgent(t||e||r||n||i||o);this.actionSpace=await a.getActionSpace();let c=(s=a).onTaskStartTip;s.onTaskStartTip=e=>{"running"===this.status&&(this.agentStatusTip=e),null==c||c(e)},A=[...l||[],{name:"restore-agent-onTaskStartTip",fn:()=>{s&&(s.onTaskStartTip=c)}}]}catch(e){this.setPlayerStatus("error",e);return}this.interfaceAgent=s;let l=0;this.setPlayerStatus("running");let c=!1;for(;l<a.length;){let e=this.taskStatusList[l];this.setTaskStatus(l,"running"),this.setTaskIndex(l),this.failedReportExecutionInCurrentStep=!1;try{await this.playTask(e,this.interfaceAgent),this.setTaskStatus(l,"done")}catch(r){this.setTaskStatus(l,"error",r);let t=s.recordErrorToReport;if(!this.failedReportExecutionInCurrentStep&&"function"==typeof t)try{await t.call(s,`YAML task failed - ${e.name}`,{error:r,content:`Step ${e.currentStep??0} failed while running YAML task "${e.name}".`})}catch(e){iv("failed to record yaml error to report",e)}if(e.continueOnError);else{this.reportFile=s.reportFile,c=!0;break}}this.reportFile=null==s?void 0:s.reportFile,l++}for(let e of(c?this.setPlayerStatus("error"):this.setPlayerStatus("done"),this.agentStatusTip="",A))try{await e.fn()}catch(e){}}constructor(e,t,r,n){var i,o,a,s,A;iy(this,"script",void 0),iy(this,"setupAgent",void 0),iy(this,"onTaskStatusChange",void 0),iy(this,"currentTaskIndex",void 0),iy(this,"taskStatusList",void 0),iy(this,"status",void 0),iy(this,"reportFile",void 0),iy(this,"result",void 0),iy(this,"unnamedResultIndex",void 0),iy(this,"output",void 0),iy(this,"unstableLogContent",void 0),iy(this,"errorInSetup",void 0),iy(this,"interfaceAgent",void 0),iy(this,"agentStatusTip",void 0),iy(this,"target",void 0),iy(this,"actionSpace",void 0),iy(this,"scriptPath",void 0),iy(this,"failedReportExecutionInCurrentStep",void 0),this.script=e,this.setupAgent=t,this.onTaskStatusChange=r,this.taskStatusList=[],this.status="init",this.unnamedResultIndex=0,this.interfaceAgent=null,this.actionSpace=[],this.failedReportExecutionInCurrentStep=!1,this.scriptPath=n,this.result={};const l=(null==(i=e.agent)?void 0:i.aiActContext)??(null==(o=e.agent)?void 0:o.aiActionContext);if(void 0!==l&&e.agent&&(void 0===e.agent.aiActContext&&void 0!==e.agent.aiActionContext&&console.warn("agent.aiActionContext is deprecated, please use agent.aiActContext instead. The legacy name is still accepted for backward compatibility."),e.agent.aiActContext=l),this.target=e.target||e.web||e.android||e.ios||e.computer||e.config,eZ.ht||eZ.rS)this.output=void 0,iv("output is undefined in browser or worker");else if(null==(a=this.target)?void 0:a.output)this.output=(0,tg.resolve)(im.cwd(),this.target.output),iv("setting output by config.output",this.output);else{const e=this.scriptPath?(0,tg.basename)(this.scriptPath,".yaml").replace(/\.(ya?ml)$/i,""):"script";this.output=(0,tg.join)((0,is.ZH)("output"),`${e}-${Date.now()}.json`),iv("setting output by script path",this.output)}eZ.ht||eZ.rS?this.unstableLogContent=void 0:"string"==typeof(null==(s=this.target)?void 0:s.unstableLogContent)?this.unstableLogContent=(0,tg.resolve)(im.cwd(),this.target.unstableLogContent):(null==(A=this.target)?void 0:A.unstableLogContent)===!0&&(this.unstableLogContent=(0,tg.join)((0,is.ZH)("output"),"unstableLogContent.json")),this.taskStatusList=(e.tasks||[]).map((e,t)=>{var r;return{...e,index:t,status:"init",totalSteps:(null==(r=e.flow)?void 0:r.length)||0}})}}let ik=["aiQuery","aiBoolean","aiNumber","aiString","aiAsk","aiAssert","aiWaitFor"],ix=new Set(["aiAct","runMarkdown","aiQuery","aiBoolean","aiNumber","aiString","aiAsk","aiWaitFor"]);async function iS(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!(null==e?void 0:e.paramSchema)||!("shape"in e.paramSchema))return[t.prompt||"",r];let n=e.paramSchema,i=n&&"shape"in n?Object.keys(n.shape):[],{deviceOptions:o,...a}=r,s={...a,...r.deviceOptions||{}};return i.forEach(e=>{void 0!==t[e]&&null!==t[e]&&""!==t[e]&&(s[e]=t[e])}),n&&tV(n).forEach(e=>{let n=t[e];if(n&&"string"==typeof n){let t=ig(n,{deepLocate:r.deepLocate,cacheable:!0});t&&(s[e]=t)}}),[s]}async function iC(e,t,r,n,i){"aiAct"!==t&&"runMarkdown"!==t&&void 0!==i.deepThink&&console.warn("[Playground] Received deepThink in non-aiAct action options. deepThink is expected to be used with aiAct/runMarkdown during migration.",{actionType:t,requestId:i.requestId,options:i});let o=null==r?void 0:r.find(e=>e.interfaceAlias===t||e.name===t);if(o&&"function"==typeof e.callActionInActionSpace)if(n.params){let t=await iS(o,n.params,i);return await e.callActionInActionSpace(o.name,t[0])}else{let t=n.prompt?ig(n.prompt,{deepLocate:i.deepLocate,cacheable:!0}):void 0,{deviceOptions:r,reportDisplay:a,...s}=i,A={locate:t,...s,...i.deviceOptions||{}};return await e.callActionInActionSpace(o.name,A)}{let r=n.prompt;if("aiAssert"===t){var a;let{reportDisplay:t,...n}=i,{pass:o,thought:s}=await (null==e||null==(a=e.aiAssert)?void 0:a.call(e,r||"",void 0,{keepRawResponse:!0,...n}))||{};return{pass:o||!1,thought:s||""}}let o=function(e,t){if(!ix.has(t))return;let r=e[t];if("function"==typeof r)return async(t,n)=>r.call(e,t||"",n)}(e,t);if(o){let{reportDisplay:e,...t}=i,n=e?{...t,_internalReportDisplay:e}:t;return await o(r,n)}throw Error(`Unknown action type: ${t}`)}}let iI=(0,eN.a)("task-timing");function ij(e,t){if(!e)return void iI(`[warning] timing object missing, skip set. field=${t}`);let r=Date.now(),n=e[t];void 0!==n?iI(`[warning] duplicate timing field set ignored. field=${t}, existing=${n}, incoming=${r}`):e[t]=r}function iO(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let iP=(0,eN.a)("task-runner");class iR{async emitOnTaskUpdate(e){this.onTaskUpdate&&await this.onTaskUpdate(this,e)}async getUiContext(e){var t,r;let n=Date.now();if(!(null==e?void 0:e.forceRefresh)&&this.lastUiContext&&n-this.lastUiContext.capturedAt<=300&&(null==(t=this.lastUiContext)?void 0:t.context))return iP(`reuse cached uiContext captured ${n-this.lastUiContext.capturedAt}ms ago`),null==(r=this.lastUiContext)?void 0:r.context;try{let e=await this.uiContextBuilder();return e?this.lastUiContext={context:e,capturedAt:Date.now()}:this.lastUiContext=void 0,e}catch(e){throw this.lastUiContext=void 0,e}}async captureScreenshot(){try{let e=await this.getUiContext({forceRefresh:!0});return null==e?void 0:e.screenshot}catch(e){console.error("error while capturing screenshot",e)}}attachRecorderItem(e,t,r){if(!r||!t)return;let n={type:"screenshot",ts:Date.now(),screenshot:t,timing:r};if(!e.recorder){e.recorder=[n];return}e.recorder.push(n)}markTaskAsPending(e){return{taskId:(0,eZ.uR)(),status:"pending",...e}}normalizeStatusFromError(e,t){var r,n;"error"===this.status&&((0,eZ.vA)(null==e?void 0:e.allowWhenError,t||`task runner is in error state, cannot proceed
|
|
918
|
+
error=${null==(r=this.latestErrorTask())?void 0:r.error}
|
|
919
|
+
${null==(n=this.latestErrorTask())?void 0:n.errorStack}`),this.status=this.tasks.length>0?"pending":"init")}async append(e,t){var r,n;this.normalizeStatusFromError(t,`task runner is in error state, cannot append task
|
|
920
|
+
error=${null==(r=this.latestErrorTask())?void 0:r.error}
|
|
921
|
+
${null==(n=this.latestErrorTask())?void 0:n.errorStack}`),Array.isArray(e)?this.tasks.push(...e.map(e=>this.markTaskAsPending(e))):this.tasks.push(this.markTaskAsPending(e)),"running"!==this.status&&(this.status="pending"),await this.emitOnTaskUpdate()}async appendAndFlush(e,t){return await this.append(e,t),this.flush(t)}async flush(e){let t,r;"init"===this.status&&this.tasks.length>0&&console.warn("illegal state for task runner, status is init but tasks are not empty"),this.normalizeStatusFromError(e,"task runner is in error state"),(0,eZ.vA)("running"!==this.status,"task runner is already running"),(0,eZ.vA)("completed"!==this.status,"task runner is already completed");let n=this.tasks.findIndex(e=>"pending"===e.status);if(n<0)return;this.status="running",await this.emitOnTaskUpdate();let i=n,o=!0;for(;i<this.tasks.length;){let e=this.tasks[i];(0,eZ.vA)("pending"===e.status,`task status should be pending, but got: ${e.status}`),e.timing={start:Date.now()};try{let r;e.status="running",await this.emitOnTaskUpdate();try{this.onTaskStart&&await this.onTaskStart(e)}catch(e){console.error("error in onTaskStart",e)}(0,eZ.vA)(["Insight","Action Space","Planning"].indexOf(e.type)>=0,`unsupported task type: ${e.type}`);let{executor:n,param:o}=e;(0,eZ.vA)(n,`executor is required for task type: ${e.type}`);let a="Insight"===e.type;ij(e.timing,"getUiContextStart");let s=await this.getUiContext({forceRefresh:a});ij(e.timing,"getUiContextEnd"),e.uiContext=s;let A={task:e,element:null==t?void 0:t.element,uiContext:s};if("Insight"===e.type?((0,eZ.vA)("Query"===e.subType||"Assert"===e.subType||"WaitFor"===e.subType||"Boolean"===e.subType||"Number"===e.subType||"String"===e.subType,`unsupported service subType: ${e.subType}`),r=await e.executor(o,A)):"Planning"===e.type?(r=await e.executor(o,A),"Locate"===e.subType&&(t=null==r?void 0:r.output)):("Action Space"===e.type||console.warn(`unsupported task type: ${e.type}, will try to execute it directly`),r=await e.executor(o,A)),i===this.tasks.length-1){ij(e.timing,"captureAfterCallingSnapshotStart");let t=await this.captureScreenshot();this.attachRecorderItem(e,t,"after-calling"),ij(e.timing,"captureAfterCallingSnapshotEnd")}Object.assign(e,r),e.status="finished",e.timing.end=Date.now(),e.timing.cost=e.timing.end-e.timing.start,await this.emitOnTaskUpdate(),i++}catch(t){o=!1,e.error=t,e.errorMessage=(null==t?void 0:t.message)||("string"==typeof t?t:"error-without-message"),e.errorStack=t.stack,e.status="failed",e.timing.end=Date.now(),e.timing.cost=e.timing.end-e.timing.start,await this.emitOnTaskUpdate();break}}for(let e=i+1;e<this.tasks.length;e++)this.tasks[e].status="cancelled";if(i+1<this.tasks.length&&await this.emitOnTaskUpdate(),o)this.status="completed",await this.emitOnTaskUpdate();else{this.status="error";let e=this.latestErrorTask(),t=(null==e?void 0:e.errorMessage)||((null==e?void 0:e.error)?String(e.error):"Task execution failed"),n=null==e?void 0:e.errorStack;r=new iT(n?`${t}
|
|
922
|
+
${n}`:t,this,e,{cause:null==e?void 0:e.error}),await this.emitOnTaskUpdate(r)}if(r)throw r;if(this.tasks.length){let e=Math.min(i,this.tasks.length-1),{thought:t,output:r}=this.tasks[e];return{thought:t,output:r}}}isInErrorState(){return"error"===this.status}latestErrorTask(){if("error"!==this.status)return null;for(let e=this.tasks.length-1;e>=0;e--)if("failed"===this.tasks[e].status)return this.tasks[e];return null}dump(){return new nF({id:this.id,logTime:this.executionLogTime,name:this.name,tasks:this.tasks})}async appendErrorPlan(e){return await this.appendAndFlush({type:"Action Space",subType:"Error",param:{thought:e},thought:e,executor:async()=>{throw Error(e||"error without thought")}}),{output:void 0,runner:this}}constructor(e,t,r){iO(this,"id",void 0),iO(this,"name",void 0),iO(this,"tasks",void 0),iO(this,"status",void 0),iO(this,"onTaskStart",void 0),iO(this,"uiContextBuilder",void 0),iO(this,"onTaskUpdate",void 0),iO(this,"executionLogTime",void 0),iO(this,"lastUiContext",void 0),this.id=(0,eZ.uR)(),this.status=(null==r?void 0:r.tasks)&&r.tasks.length>0?"pending":"init",this.name=e,this.tasks=((null==r?void 0:r.tasks)||[]).map(e=>this.markTaskAsPending(e)),this.onTaskStart=null==r?void 0:r.onTaskStart,this.uiContextBuilder=t,this.onTaskUpdate=null==r?void 0:r.onTaskUpdate,this.executionLogTime=Date.now()}}class iT extends Error{constructor(e,t,r,n){super(e,n),iO(this,"runner",void 0),iO(this,"errorTask",void 0),this.runner=t,this.errorTask=r}}var iN=r(3009);r(5207);var iM=r(1344),iD=r(4201).Buffer,iz=r(5409);let iB=new Map,iL=new Map;function iU(){return"REPLACE_ME_WITH_REPORT_HTML"}function iK(e,t){let r=e.lastIndexOf("</html>");return -1===r?e+t:`${e.slice(0,r)}${t}
|
|
923
|
+
${e.slice(r)}`}function iF(e,t,r){let n=!(arguments.length>3)||void 0===arguments[3]||arguments[3],i="";if(n&&!(i=iU()))return console.warn("reportTpl is not set, will not write report"),"";let o=t&&!eZ.ht,a="",s="<\/script>";if("string"==typeof e)a='<script type="midscene_web_dump" type="application/json" data-group-id="'+encodeURIComponent((()=>{if(!t||!r)return(0,eZ.uR)();let e=iL.get(t);if(e)return e;let n=(0,eZ.uR)();return iL.set(t,n),n})())+'">\n'+(0,eZ.NB)(e)+"\n"+s;else{let{dumpString:t,attributes:r}=e;a='<script type="midscene_web_dump" type="application/json" '+Object.entries(r||{}).filter(e=>void 0!==e[1]&&null!==e[1]).map(e=>{let[t,r]=e;return`${t}="${encodeURIComponent(r)}"`}).join(" ")+">\n"+(0,eZ.NB)(t)+"\n"+s}return o?(r?(iB.get(t)||((0,t$.writeFileSync)(t,i,{flag:"w"}),iB.set(t,!0)),!function(e,t){let r="</html>",n=(0,t$.statSync)(e),i=Math.min(n.size,4096),o=Math.max(0,n.size-i),a=iD.alloc(n.size-o),s=(0,t$.openSync)(e,"r");(0,t$.readSync)(s,a,0,a.length,o),(0,t$.closeSync)(s);let A=a.toString("utf8"),l=A.lastIndexOf(r);if(-1===l)throw Error(`No </html> found in file:${e}`);let c=A.slice(0,l),u=o+iD.byteLength(c,"utf8");(0,t$.truncateSync)(e,u),(0,t$.appendFileSync)(e,`${t}
|
|
924
|
+
${r}
|
|
925
|
+
`)}(t,a)):(0,t$.writeFileSync)(t,iK(i,a),{flag:"w"}),t):iK(i,a)}async function iZ(e){return new Promise(t=>setTimeout(t,e))}function iQ(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];iz.env[eD.n0]&&console.log("[Midscene]",...t)}let iJ=null,iX="";async function iH(e){let{testUrl:t,serverUrl:r}=e;if(!r)return;let{repoUrl:n,userEmail:i}=await function(){if(iJ)return iJ;let e=(0,iM.promisify)(iN.execFile);return iJ=Promise.all([e("git",["config","--get","remote.origin.url"]).then(e=>{let{stdout:t}=e;return t.trim()},()=>""),e("git",["config","--get","user.email"]).then(e=>{let{stdout:t}=e;return t.trim()},()=>"")]).then(e=>{let[t,r]=e;return{repoUrl:t,userEmail:r}})}();(n?n!==iX:t)&&(iQ("Uploading test info to server",{serverUrl:r,repoUrl:n,testUrl:t,userEmail:i}),fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo_url:n,test_url:t,user_email:i})}).then(e=>e.json()).then(e=>{iQ("Successfully uploaded test info to server:",e)}).catch(e=>iQ("Failed to upload test info to server:",e)),iX=n)}var iG=r(3147);function iq(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let iW={onExecutionUpdate:()=>{},flush:async()=>{},finalize:async()=>void 0,getReportPath:()=>void 0};function iV(e){if(!1===e.generateReport&&!0===e.persistExecutionDump)throw Error("persistExecutionDump cannot be true when generateReport is false")}class iY{static create(e,t){var r;if(iV(t),function(e){if(!(null==e?void 0:e.trim()))throw Error("reportFileName must be a non-empty string");if(/[\\/]/.test(e))throw Error("reportFileName must not contain path separators (`/` or `\\\\`)");if(/[:*?"<>|]/.test(e))throw Error('reportFileName contains illegal filename characters: : * ? " < > |')}(e),!1===t.generateReport||eZ.ht)return iW;let n=(0,is.ZH)("report"),i=(0,tg.join)(n,e);return new iY({reportPath:"html-and-external-assets"===t.outputFormat?(0,tg.join)(i,"index.html"):(0,tg.join)(n,(r=e).endsWith(".html")?r:`${r}.html`),screenshotMode:"html-and-external-assets"===t.outputFormat?"directory":"inline",persistExecutionDump:t.persistExecutionDump,autoPrint:t.autoPrintReportMsg,reuseExistingReport:t.reuseExistingReport})}onExecutionUpdate(e,t,r){this.lastExecution=e,this.lastReportMeta=t,this.mergeReportAttributes(r),this.writeQueue=this.writeQueue.then(async()=>{this.destroyed||await this.doWriteExecution(e,t)})}async flush(){await this.writeQueue}async finalize(){if(this.lastExecution&&this.lastReportMeta&&this.onExecutionUpdate(this.lastExecution,this.lastReportMeta),await this.flush(),this.destroyed=!0,this.initialized)return this.reportPath}getReportPath(){return this.reportPath}printReportPath(){this.autoPrint&&this.reportPath&&(eY.getEnvConfigInBoolean(eD.d8)||("directory"===this.screenshotMode?(0,eZ.gQ)(`Midscene - report file updated: npx serve ${(0,tg.dirname)(this.reportPath)}`):(0,eZ.gQ)(`Midscene - report file updated: ${this.reportPath}`)))}async doWriteExecution(e,t){let r=this.wrapAsReportDump(e,t);"inline"===this.screenshotMode?await this.writeInlineExecution(e,r):await this.writeDirectoryExecution(e,r),this.shouldPersistExecutionDump&&await this.persistExecutionDumpToFile(e,r),this.firstWriteDone||(this.firstWriteDone=!0,this.printReportPath())}mergeReportAttributes(e){if(e)for(let[t,r]of Object.entries(e))null!=r&&(this.reportAttributes[t]=String(r))}hydrateStateFromExistingReport(){if(!(0,t$.existsSync)(this.reportPath)||(this.initialized=!0,!this.shouldPersistExecutionDump))return;let e=(0,tg.dirname)(this.reportPath),t=(0,t$.readdirSync)(e).map(e=>{var t;return null==(t=/^(\d+)\.execution\.json$/.exec(e))?void 0:t[1]}).filter(e=>!!e).map(e=>Number.parseInt(e,10)).filter(e=>Number.isFinite(e));t.length>0&&(this.executionLogIndex=Math.max(...t))}getDumpScriptAttributes(){return{"data-group-id":this.reportStreamId,...this.reportAttributes}}wrapAsReportDump(e,t){return new nZ({sdkVersion:t.sdkVersion,groupName:t.groupName,groupDescription:t.groupDescription,modelBriefs:t.modelBriefs,deviceType:t.deviceType,executions:[e]})}async writeInlineExecution(e,t){let r=(0,tg.dirname)(this.reportPath);for(let t of((0,t$.existsSync)(r)||(0,t$.mkdirSync)(r,{recursive:!0}),this.initialized||(await (0,iG.writeFile)(this.reportPath,iU()),this.initialized=!0),e.collectScreenshots()))await this.screenshotStore.persist(t);let n=t.serialize();await (0,iG.appendFile)(this.reportPath,`
|
|
926
|
+
${rr(n,this.getDumpScriptAttributes())}`)}async writeDirectoryExecution(e,t){let r=(0,tg.dirname)(this.reportPath);for(let t of((0,t$.existsSync)(r)||(0,t$.mkdirSync)(r,{recursive:!0}),e.collectScreenshots()))await this.screenshotStore.persist(t);let n=t.serialize();this.initialized||(await (0,iG.writeFile)(this.reportPath,`${iU()}${rt()}`),this.initialized=!0),await (0,iG.appendFile)(this.reportPath,`
|
|
927
|
+
${rr(n,this.getDumpScriptAttributes())}`)}getExecutionLogKey(e){if(!e.id)throw Error("ReportGenerator: execution.id is required for persisting execution dumps");return`id:${e.id}`}async persistExecutionDumpToFile(e,t){let r=(0,tg.dirname)(this.reportPath);(0,t$.existsSync)(r)||(0,t$.mkdirSync)(r,{recursive:!0});let n=this.getExecutionLogKey(e),i=this.executionLogFileIndexByExecutionKey.get(n);i||(this.executionLogIndex+=1,i=this.executionLogIndex,this.executionLogFileIndexByExecutionKey.set(n,i));let o=`${i}.execution.json`,a=(0,tg.join)((0,tg.dirname)(this.reportPath),o);await (0,iG.writeFile)(a,t.serialize(2),"utf-8")}constructor(e){iq(this,"reportPath",void 0),iq(this,"screenshotMode",void 0),iq(this,"shouldPersistExecutionDump",void 0),iq(this,"autoPrint",void 0),iq(this,"firstWriteDone",!1),iq(this,"executionLogIndex",0),iq(this,"executionLogFileIndexByExecutionKey",new Map),iq(this,"reportStreamId",void 0),iq(this,"screenshotStore",void 0),iq(this,"initialized",!1),iq(this,"lastExecution",void 0),iq(this,"lastReportMeta",void 0),iq(this,"reportAttributes",{}),iq(this,"writeQueue",Promise.resolve()),iq(this,"destroyed",!1),this.reportPath=e.reportPath,this.screenshotMode=e.screenshotMode,this.shouldPersistExecutionDump=e.persistExecutionDump??!1,this.autoPrint=e.autoPrint??!0,this.reportStreamId=(0,eZ.uR)(),this.screenshotStore=new rA({mode:"inline"===this.screenshotMode?"inline":"directory",reportPath:this.reportPath,screenshotsDir:(0,tg.join)((0,tg.dirname)(this.reportPath),"screenshots"),writeInlineImage:async(e,t)=>{let r;await (0,iG.appendFile)(this.reportPath,`
|
|
928
|
+
${(r=t6(),'<script type="midscene-image" data-id="'+e+'">'+t4(t)+r)}`)},alsoWriteFileCopy:this.shouldPersistExecutionDump}),e.reuseExistingReport&&this.hydrateStateFromExistingReport()}}var i_=r(8973);tu.Ik({locate:tq.describe("The element to be tapped")}),tu.Ik({locate:tq.describe("The element to be right clicked")}),tu.Ik({locate:tq.describe("The element to be double clicked")}),tu.Ik({locate:tq.describe("The element to be hovered")}),tu.Ik({value:tu.KC([tu.Yj(),tu.ai()]).transform(e=>String(e)).describe("The text to input. Provide the final content for replace mode, only the inserted characters for typeOnly mode, or an empty string when using clear mode to remove existing text."),locate:tq.describe("the position of the placeholder or text content in the target input field. If there is no content, locate the center of the input field.").optional(),mode:tu.k5(["replace","clear","typeOnly"]).default("replace").describe('Input mode: "replace" (default) - clear the field and input the value; "typeOnly" - type the value directly without clearing the field first, and should be set explicitly for incremental edits after moving the cursor; "clear" - clear the field without inputting new text.'),autoDismissKeyboard:tu.zM().optional().describe("If true, the keyboard will be dismissed after the input is completed. Do not set it unless the user asks you to do so.")}),tu.Ik({locate:tq.describe("The element to be clicked before pressing the key").optional(),keyName:tu.Yj().describe("The key to be pressed. Use '+' for key combinations, e.g., 'Control+A', 'Shift+Enter'")}),tu.Ik({scrollType:tu.k5(["singleAction","scrollToBottom","scrollToTop","scrollToRight","scrollToLeft"]).default("singleAction").describe('The scroll behavior: "singleAction" for a single scroll action, "scrollToBottom" for scrolling all the way to the bottom by rapidly scrolling 5-10 times (skipping intermediate content until reaching the bottom), "scrollToTop" for scrolling all the way to the top by rapidly scrolling 5-10 times (skipping intermediate content until reaching the top), "scrollToRight" for scrolling all the way to the right by rapidly scrolling multiple times, "scrollToLeft" for scrolling all the way to the left by rapidly scrolling multiple times'),direction:tu.k5(["down","up","right","left"]).default("down").describe('The direction to scroll. Only effective when scrollType is "singleAction".'),distance:tu.ai().nullable().optional().describe("The distance in pixels to scroll"),locate:tq.optional().describe('Describe the target element to be scrolled on, like "the table" or "the list" or "the content area" or "the scrollable area". Do NOT provide a general intent like "scroll to find some element"')}),tu.Ik({from:tq.describe("The position to be dragged"),to:tq.describe("The position to be dropped")}),tu.Ik({locate:tq.describe("The element to be long pressed"),duration:tu.ai().optional().describe("Long press duration in milliseconds")}),tu.Ik({start:tq.optional().describe("Starting point of the swipe gesture, if not specified, the center of the page will be used"),direction:tu.k5(["up","down","left","right"]).optional().describe("The direction to swipe (required when using distance). The direction means the direction of the finger swipe."),distance:tu.ai().optional().describe("The distance in pixels to swipe (mutually exclusive with end)"),end:tq.optional().describe("Ending point of the swipe gesture (mutually exclusive with distance)"),duration:tu.ai().default(300).describe("Duration of the swipe gesture in milliseconds"),repeat:tu.ai().optional().describe("The number of times to repeat the swipe gesture. 1 for default, 0 for infinite (e.g. endless swipe until the end of the page)")}),tu.Ik({locate:tq.describe("The input field to be cleared").optional()}),tu.Ik({direction:tu.k5(["left","right"]).describe("The direction to move the cursor"),times:tu.ai().int().min(1).default(1).describe("The number of times to move the cursor in the specified direction")}),tu.Ik({locate:tq.optional().describe("The element to pinch on. If not specified, the center of the screen will be used"),direction:tu.k5(["in","out"]).describe('Pinch direction. "in" = pinch fingers together (zoom out / shrink), "out" = spread fingers apart (zoom in / enlarge).'),distance:tu.ai().positive().optional().describe("How far each finger moves in pixels. Defaults to a quarter of the shorter screen dimension."),duration:tu.ai().default(500).optional().describe("Duration of the pinch gesture in milliseconds")});let i$=tu.Ik({timeMs:tu.ai().default(1e3).optional().describe("Sleep duration in milliseconds, defaults to 1000ms (1 second)")}),i0=["read-only","read-write","write-only"],i1=i0.map(e=>`"${e}"`).join(", "),i2=(e,t)=>{let r=null==t?void 0:t.trim();if(!r)return e;let n="string"==typeof e?e:e.prompt,i=`Context for this request:
|
|
929
|
+
${r}
|
|
930
|
+
|
|
931
|
+
${n}`;return"string"==typeof e?i:{...e,prompt:i}},i3=/^(Given|When|Then|And|But)\s+(.+)$/i,i5=/^(Scenario):\s*(.*)$/i,i7=/^(Feature|Background|Scenario Outline|Scenario Template|Examples|Rule):/i,i4=e=>{let t=e.toLowerCase();return"given"===t?"Given":"when"===t?"When":"then"===t?"Then":"and"===t?"And":"But"},i8=e=>{if(null==e?void 0:e.aborted)throw"function"==typeof e.throwIfAborted&&e.throwIfAborted(),Error(`runGherkinScenario aborted: ${e.reason||"signal already aborted"}`)},i6=e=>"Given"===e.effectiveKeyword?`Set up this precondition: ${e.text}`:"When"===e.effectiveKeyword?`Perform this user action: ${e.text}`:`Verify that ${e.text}`,i9=(e,t)=>{let r=e.keyword===e.effectiveKeyword?e.keyword:`${e.keyword} as ${e.effectiveKeyword}`;return"Given"===e.effectiveKeyword?`setting up the precondition (${r} -> ${t})`:"When"===e.effectiveKeyword?`performing the user action (${r} -> ${t})`:`verifying the expected result (${r} -> ${t})`},oe=e=>e instanceof Error&&e.message?` Original error: ${e.message}`:"",ot=async(e,t,r)=>{let n=(e=>{let t,r,n=e.split(/\r?\n/),i=[],o=[],a=0,s="prelude";for(let[e,r]of n.entries()){let n=e+1,A=r.trim();if(!A||A.startsWith("#")||A.startsWith("@"))continue;if('"""'===A||"'''"===A)throw Error(`runGherkinScenario does not support doc strings; found one at line ${n}.`);if(A.startsWith("|"))throw Error(`runGherkinScenario does not support data tables; found one at line ${n}.`);if(i7.test(A))throw Error(`runGherkinScenario does not support "${A}" at line ${n}.`);let l=A.match(i5);if(l){a+=1,t=l[2].trim()||void 0,s="scenario";continue}let c=A.match(i3);if(c){let e={keyword:i4(c[1]),text:c[2].trim(),lineNumber:n};"scenario"===s?i.push(e):o.push(e);continue}throw Error(`runGherkinScenario does not support content at line ${n}: ${A}`)}if(a>1)throw Error(`runGherkinScenario expects exactly one Scenario, but found ${a}.`);if(1===a&&o.length>0)throw Error("runGherkinScenario cannot mix anonymous steps with a Scenario block.");let A=1===a?i:o;if(0===A.length)throw Error("runGherkinScenario requires at least one Gherkin step.");return{scenario:t,steps:A.map(e=>{let t,n="Given"===(t=e.keyword)||"When"===t||"Then"===t?e.keyword:r;if(!n)throw Error(`runGherkinScenario cannot resolve "${e.keyword}" at line ${e.lineNumber}; use Given, When, or Then before ${e.keyword}.`);return r=n,{...e,effectiveKeyword:n}})}})(t),i={...r,cacheable:!1};for(let t of n.steps){i8(null==r?void 0:r.abortSignal);let n="Then"===t.effectiveKeyword?"aiAssert":"aiAct",o=i6(t);try{"aiAct"===n?await e.aiAct(o,i):(null==r?void 0:r.context)||(null==r?void 0:r.abortSignal)?await e.aiAssert(o,void 0,{context:r.context,abortSignal:r.abortSignal}):await e.aiAssert(o)}catch(e){throw Error(`runGherkinScenario failed while ${i9(t,n)} at line ${t.lineNumber}: ${t.keyword} ${t.text}.${oe(e)}`,{cause:e})}}},or=e=>e?` in ${e}`:"",on=async(e,t)=>{let n,i,{fromMarkdown:o}=await r(5902)("mdast-util-from-markdown"),{toMarkdown:a}=await r(5845)("mdast-util-to-markdown"),s=o(e),A=(n=[],(i=e=>{Array.isArray(e.children)&&(e.children=e.children.map(e=>{if("imageReference"===e.type){let r=e.identifier||e.label||"unknown";throw Error(`runMarkdown does not support reference-style image "${r}"${or(t)}. Use direct image syntax instead.`)}if("image"===e.type){var r;let i,o=(i=n.length,`参考图片-${String(i+1).padStart(3,"0")}`);if(!e.url)throw Error(`Markdown image ${o}${or(t)} is missing a URL.`);if(n.push({name:o,url:(r=e.url,!t||/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(r)||(0,tg.isAbsolute)(r)?r:(0,tg.resolve)((0,tg.dirname)(t),r))}),n.length>20)throw Error(`runMarkdown supports at most 20 images, but found ${n.length} images${or(t)}.`);return{type:"text",value:o}}return i(e),e}))})(s),n);return 0===A.length?{prompt:e,imageCount:0}:{prompt:{prompt:a(s),images:A,convertHttpImage2Base64:!0},imageCount:A.length}};var oi=r(9140),oo=r(8586),oa=r.n(oo),os=r(9300),oA=r.n(os),ol=r(5409);(0,eN.a)("agent");let oc={once:"singleAction",untilBottom:"scrollToBottom",untilTop:"scrollToTop",untilRight:"scrollToRight",untilLeft:"scrollToLeft"};async function ou(e,t){var r;let n=(0,eN.a)("commonContextParser");(0,eZ.vA)(e,"interfaceInstance is required"),n("Getting interface description");let i=(null==(r=e.describe)?void 0:r.call(e))||"";n("Interface description end"),n("Uploading test info to server"),iH({testUrl:i,serverUrl:t.uploadServerUrl}),n("UploadTestInfoToServer end"),n("will get size");let o=await e.size(),{width:a,height:s}=o;if(o.dpr&&console.warn("Warning: return value of interface.size() include a dpr property, which is not expected and ignored. "),!Number.isFinite(a)||!Number.isFinite(s))throw Error(`Invalid interface size: width and height must be finite numbers. Received width: ${a}, height: ${s}`);if(a<=0||s<=0)throw Error(`Invalid interface size: width and height must be positive numbers. Received width: ${a}, height: ${s}`);n(`size: ${a}x${s}`);let A=await e.screenshotBase64(),l=Date.now();(0,eZ.vA)(A,"screenshotBase64 is required"),n("will get screenshot dimensions");let{width:c,height:u}=await nY(A);if(!Number.isFinite(c)||!Number.isFinite(u))throw Error(`Invalid screenshot dimensions: width and height must be finite numbers. Received width: ${c}, height: ${u}`);if(c<=0||u<=0)throw Error(`Invalid screenshot dimensions: width and height must be positive numbers. Received width: ${c}, height: ${u}`);n("screenshot dimensions",c,"x",u);let d=a<s,p=c<u,h=a;d!==p&&(n(`Orientation mismatch detected: logical size ${a}x${s} (${d?"portrait":"landscape"}) vs screenshot ${c}x${u} (${p?"portrait":"landscape"}). Swapping logical dimensions.`),h=s);let f=t.screenshotShrinkFactor??1;if(!Number.isFinite(f)||f<1)throw Error(`Invalid screenshotShrinkFactor: must be a finite number >= 1. Received: ${f}`);let g=c/h;n("calculated dpr:",g);let m=g/f;if(n("shrunkShotToLogicalRatio",m),1!==f){let e=Math.round(c/f),t=Math.round(u/f);n(`Applying screenshot shrink factor: ${f} (physical: ${c}x${u} -> target: ${e}x${t})`);let r=await tj(A,{width:e,height:t});return{shotSize:{width:e,height:t},deprecatedDpr:g,screenshot:rc.create(r,l),shrunkShotToLogicalRatio:m}}return{shotSize:{width:c,height:u},deprecatedDpr:g,screenshot:rc.create(A,l),shrunkShotToLogicalRatio:m}}function od(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"web",t=eY.getEnvConfigValue(eD.ho),r=oA()().format("YYYY-MM-DD_HH-mm-ss"),n=(0,eZ.uR)().substring(0,8);return`${t||e}-${r}-${n}`}function op(e){var t;return Array.isArray(t=e.locatedPixelBbox)&&4===t.length&&t.every(e=>"number"==typeof e&&Number.isFinite(e))}async function oh(e,t,r,n){var i;if(t){if(!1===n)return void oy("cache disabled for prompt: %s",r);if(null==(i=e.taskCache)?void 0:i.isCacheResultUsed){if(!e.interfaceInstance.rectMatchesCacheFeature)return void oy("interface does not implement rectMatchesCacheFeature, skip cache");try{let n=await e.interfaceInstance.rectMatchesCacheFeature(t),i={center:[Math.round(n.left+n.width/2),Math.round(n.top+n.height/2)],rect:n,description:"string"==typeof r?r:r.prompt||""};return oy("cache hit, prompt: %s",r),i}catch(e){oy("rectMatchesCacheFeature error: %s",e);return}}}}let of=e=>"string"==typeof e?{textPrompt:e,multimodalPrompt:void 0}:{textPrompt:e.prompt,multimodalPrompt:e.images?{images:e.images,convertHttpImage2Base64:!!e.convertHttpImage2Base64}:void 0};var og=r(4201).Buffer;function om(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let oy=(0,eN.a)("cache"),ov=(0,eN.a)("cache",{console:!0}),ob=".cache.yaml";class ow{matchCache(e,t){if(!this.isCacheResultUsed)return;let r=this.promptKey(e);for(let n=0;n<this.cacheOriginalLength;n++){let i=this.cache.caches[n],o=`${t}:${r}:${n}`;if(i.type===t&&(0,iM.isDeepStrictEqual)(i.prompt,e)&&!this.matchedCacheIndices.has(o)){"locate"===i.type&&(!i.cache&&Array.isArray(i.xpaths)&&(i.cache={xpaths:i.xpaths}),"xpaths"in i&&(i.xpaths=void 0)),this.matchedCacheIndices.add(o);let a=`${t}:${r}`,s=this.consumedCacheIndices.get(a)??[];return s.push(n),this.consumedCacheIndices.set(a,s),oy("cache found and marked as used, type: %s, prompt: %s, index: %d",t,e,n),{cacheContent:i,cacheUsable:!0,updateFn:r=>{(oy("will call updateFn to update cache, type: %s, prompt: %s, index: %d",t,e,n),r(i),this.readOnlyMode)?oy("read-only mode, cache updated in memory but not flushed to file"):(oy("cache updated, will flush to file, type: %s, prompt: %s, index: %d",t,e,n),this.flushCacheToFile())}}}}oy("no unused cache found, type: %s, prompt: %s",t,e)}matchPlanCache(e){let t=this.matchCache(e,"plan");if(!t)return;let r=t.cacheContent.yamlWorkflow;if(!(null==r?void 0:r.trim()))return oy("plan cache matched but yamlWorkflow is empty, treat as cache miss"),{...t,cacheUsable:!1};try{var n;let e=iA.Ay.load(r);if(!(null==e||null==(n=e.tasks)?void 0:n.some(e=>Array.isArray(e.flow)&&e.flow.length>0)))return oy("plan cache matched but flow is empty, treat as cache miss"),{...t,cacheUsable:!1}}catch{return oy("plan cache matched but yamlWorkflow is invalid, treat as cache miss"),{...t,cacheUsable:!1}}return t}matchLocateCache(e){return this.matchCache(e,"locate")}appendCache(e){(oy("will append cache",e),this.cache.caches.push(e),this.readOnlyMode)?oy("read-only mode, cache appended to memory but not flushed to file"):this.flushCacheToFile()}loadCacheFromFile(){let e=this.cacheFilePath;if(tp()(e,"cache file path is required"),!(0,oi.existsSync)(e))return void oy("no cache file found, path: %s",e);let t=e.replace(ob,".json");if((0,oi.existsSync)(t)&&this.isCacheResultUsed)return void console.warn(`An outdated cache file from an earlier version of Midscene has been detected. Since version 0.17, we have implemented an improved caching strategy. Please delete the old file located at: ${t}.`);try{let t=(0,oi.readFileSync)(e,"utf8"),r=iA.Ay.load(t);if(oa().lt(r.midsceneVersion,"0.16.10")&&!r.midsceneVersion.includes("beta"))return void console.warn(`You are using an old version of Midscene cache file, and we cannot match any info from it. Starting from Midscene v0.17, we changed our strategy to use xpath for cache info, providing better performance.
|
|
932
|
+
Please delete the existing cache and rebuild it. Sorry for the inconvenience.
|
|
933
|
+
cache file: ${e}`);return oy("cache loaded from file, path: %s, cache version: %s, record length: %s",e,r.midsceneVersion,r.caches.length),r.midsceneVersion="1.10.0",r}catch(t){oy("cache file exists but load failed, path: %s, error: %s",e,t);return}}flushCacheToFile(e){if(!this.cacheFilePath)return void oy("no cache file path, will not write cache to file");if(null==e?void 0:e.cleanUnused)if(this.isCacheResultUsed){let e=this.cache.caches.length,t=new Set;for(let e of this.matchedCacheIndices){let r=e.split(":"),n=Number.parseInt(r[r.length-1],10);Number.isNaN(n)||t.add(n)}this.cache.caches=this.cache.caches.filter((e,r)=>{let n=t.has(r),i=r>=this.cacheOriginalLength;return n||i});let r=e-this.cache.caches.length;r>0?oy("cleaned %d unused cache record(s)",r):oy("no unused cache to clean")}else oy("skip cleaning: cache is not used for reading");try{let e=(0,tg.dirname)(this.cacheFilePath);(0,oi.existsSync)(e)||((0,oi.mkdirSync)(e,{recursive:!0}),oy("created cache directory: %s",e));let t=[...this.cache.caches].sort((e,t)=>"plan"===e.type&&"locate"===t.type?-1:+("locate"===e.type&&"plan"===t.type)),r={...this.cache,caches:t},n=iA.Ay.dump(r,{lineWidth:-1});(0,oi.writeFileSync)(this.cacheFilePath,n),oy("cache flushed to file: %s",this.cacheFilePath)}catch(e){ov(`write cache to file failed, path: ${this.cacheFilePath}, error: ${e}`)}}promptKey(e){return"string"==typeof e?e:JSON.stringify(e)}applyRecordInto(e,t){"plan"===t.type?e.yamlWorkflow=t.yamlWorkflow:(e.cache=t.cache,"xpaths"in e&&(e.xpaths=void 0))}updateOrAppendCacheRecord(e,t){if(t)t.updateFn(t=>{this.applyRecordInto(t,e)});else{var r;let t=`${e.type}:${this.promptKey(e.prompt)}`,n=null==(r=this.staleCacheIndices.get(t))?void 0:r.pop();void 0!==n&&this.cache.caches[n]?(oy("replacing stale cache entry in place, type: %s, prompt: %s, index: %d",e.type,e.prompt,n),this.replaceCacheRecord(n,e)):this.appendCache(e)}}markLocateCacheStale(e){var t;let r=`locate:${this.promptKey(e)}`,n=null==(t=this.consumedCacheIndices.get(r))?void 0:t.pop();if(void 0===n)return;let i=this.staleCacheIndices.get(r)??[];i.push(n),this.staleCacheIndices.set(r,i),oy("marked locate cache entry as stale, prompt: %s, index: %d",e,n)}replaceCacheRecord(e,t){let r=this.cache.caches[e];(tp()(r.type===t.type,`cache record type mismatch on replace: expected ${t.type}, got ${r.type}`),this.applyRecordInto(r,t),this.readOnlyMode)?oy("read-only mode, cache replaced in memory but not flushed to file"):this.flushCacheToFile()}constructor(e,t,r,n={}){var i;let o;if(om(this,"cacheId",void 0),om(this,"cacheFilePath",void 0),om(this,"cache",void 0),om(this,"isCacheResultUsed",void 0),om(this,"cacheOriginalLength",void 0),om(this,"readOnlyMode",void 0),om(this,"writeOnlyMode",void 0),om(this,"matchedCacheIndices",new Set),om(this,"consumedCacheIndices",new Map),om(this,"staleCacheIndices",new Map),tp()(e,"cacheId is required"),void 0!==n.cacheDir&&("string"!=typeof n.cacheDir||!n.cacheDir.trim()))throw Error("cacheDir must be a non-empty string when provided");const a=null==(i=n.cacheDir)?void 0:i.trim();let s=(0,eZ.gV)(e);const A=eY.getEnvConfigValueAsNumber(eD.YK)??200;if(og.byteLength(s,"utf8")>A){const e=s.slice(0,32),t=(0,eZ.tD)(void 0,s);s=`${e}-${t}`}this.cacheId=s,this.cacheFilePath=eZ.ht||eZ.rS?void 0:r||(0,tg.join)(a||(0,is.ZH)("cache"),`${this.cacheId}${ob}`);const l=!!(null==n?void 0:n.readOnly),c=!!(null==n?void 0:n.writeOnly);if(l&&c)throw Error("TaskCache cannot be both read-only and write-only");this.isCacheResultUsed=!c&&t,this.readOnlyMode=l,this.writeOnlyMode=c,this.cacheFilePath&&!this.writeOnlyMode&&(o=this.loadCacheFromFile()),o||(o={midsceneVersion:"1.10.0",cacheId:this.cacheId,caches:[]}),this.cache=o,this.cacheOriginalLength=this.isCacheResultUsed?this.cache.caches.length:0}}class oE{async append(e,t){await this.runner.append(e,t)}async appendAndRun(e,t){return this.runner.appendAndFlush(e,t)}async run(e){return this.runner.flush(e)}isInErrorState(){return this.runner.isInErrorState()}latestErrorTask(){return this.runner.latestErrorTask()}appendErrorPlan(e){return this.runner.appendErrorPlan(e)}getRunner(){return this.runner}constructor(e,t,r){!function(e,t,r){t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r}(this,"runner",void 0),this.runner=new iR(e,t,r)}}let ok=(0,eN.a)("agent:usage-intent",{console:!0});function ox(e,t){if(e)return e.intent?(ok(`intent is already set to "${e.intent}", skipping overwrite to "${t}"`),e):{...e,intent:t}}function oS(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let oC=(0,eN.a)("agent:task-builder");function oI(e){return null!=e&&"object"==typeof e&&Object.keys(e).length>0}function oj(e){if("string"==typeof e)return{prompt:e};let{deepThink:t,...r}=e,n=r.deepLocate??t;return void 0===n?r:{...r,deepLocate:n}}function oO(e){return{type:"Locate",param:oj(e),thought:""}}class oP{async build(e,t,r,n){let i=[],o={tasks:i,planningModel:t,defaultModel:r,cacheable:null==n?void 0:n.cacheable,deepLocate:null==n?void 0:n.deepLocate,abortSignal:null==n?void 0:n.abortSignal},a=new Map([["Locate",e=>this.handleLocatePlan(e,o)],["Finished",e=>this.handleFinishedPlan(e,o)]]),s=e=>this.handleActionPlan(e,o);for(let t of e){let e=a.get(t.type)??s;await e(t)}return{tasks:i}}handleFinishedPlan(e,t){let r={type:"Action Space",subType:"Finished",param:null,thought:e.thought,executor:async()=>{}};t.tasks.push(r)}async handleLocatePlan(e,t){let r=this.createLocateTask(e,e.param,t);t.tasks.push(r)}async handleActionPlan(e,t){let r=e.type,n=tK(r,this.actionSpace),i=e.param,o=tV(n.paramSchema),a=tV(n.paramSchema,!0);o.forEach(e=>{if(i[e]){let n=oO(i[e]);oC("will prepend locate param for field",`action.type=${r}`,`param=${JSON.stringify(i[e])}`,`locatePlan=${JSON.stringify(n)}`,`hasLocatedPixelBbox=${op(i[e])}`);let o=this.createLocateTask(n,i[e],t,t=>{i[e]=t});t.tasks.push(o)}else(0,eZ.vA)(!a.includes(e),`Required locate field '${e}' is not provided for action ${r}`),oC(`field '${e}' is not provided for action ${r}`)});let s={type:"Action Space",subType:r,thought:e.thought,param:e.param,executor:async(e,t)=>{var i;let o=t.task.timing;oC("executing action",r,e,`taskContext.element.center: ${null==(i=t.element)?void 0:i.center}`);let s=t.uiContext;(0,eZ.vA)(s,"uiContext is required for Action task"),a.forEach(t=>{(0,eZ.vA)(e[t],`field '${t}' is required for action ${r} but not provided. Cannot execute action ${r}.`)}),ij(o,"beforeInvokeActionHookStart");let A=n.delayBeforeRunner??200;try{await Promise.all([(async()=>{this.interface.beforeInvokeAction&&(oC(`will call "beforeInvokeAction" for interface with action name ${n.name}`),await this.interface.beforeInvokeAction(n.name,e),oC(`called "beforeInvokeAction" for interface with action name ${n.name}`))})(),A>0?iZ(A):Promise.resolve()])}catch(t){let e=(null==t?void 0:t.message)||String(t);throw Error(`error in running beforeInvokeAction for ${n.name}: ${e}`,{cause:t})}ij(o,"beforeInvokeActionHookEnd");let{shrunkShotToLogicalRatio:l}=s;if(void 0===l)throw Error("shrunkShotToLogicalRatio is not defined in Action task");if(n.paramSchema)try{e=((e,t,r)=>{if(!t)return;let n=e??{},i=tV(t);if(0===i.length)return t.parse(n);let o={};for(let e of i)e in n&&(o[e]=n[e]);let a={};for(let e in n)i.includes(e)?a[e]={prompt:"_dummy_"}:a[e]=n[e];let s=t.parse(a),A=null==r?void 0:r.shrunkShotToLogicalRatio;for(let e in o){let t=o[e];void 0!==A&&1!==A&&t&&"object"==typeof t&&t.center&&t.rect&&(t={...t,center:[Math.round(t.center[0]/A),Math.round(t.center[1]/A)],rect:{...t.rect,left:Math.round(t.rect.left/A),top:Math.round(t.rect.top/A),width:Math.round(t.rect.width/A),height:Math.round(t.rect.height/A)}}),s[e]=t}return s})(e,n.paramSchema,{shrunkShotToLogicalRatio:l})}catch(t){throw Error(`Invalid parameters for action ${n.name}: ${t.message}
|
|
934
|
+
Parameters: ${JSON.stringify(e)}`,{cause:t})}ij(o,"callActionStart"),oC("calling action",n.name);let c=n.call.bind(this.interface),u=await c(e,t);ij(o,"callActionEnd"),oC("called action",n.name,"result:",u),ij(o,"afterInvokeActionHookStart");let d=n.delayAfterRunner??this.waitAfterAction??300;d>0&&await iZ(d);try{this.interface.afterInvokeAction&&(oC(`will call "afterInvokeAction" for interface with action name ${n.name}`),await this.interface.afterInvokeAction(n.name,e),oC(`called "afterInvokeAction" for interface with action name ${n.name}`))}catch(t){let e=(null==t?void 0:t.message)||String(t);throw Error(`error in running afterInvokeAction for ${n.name}: ${e}`,{cause:t})}return ij(o,"afterInvokeActionHookEnd"),{output:u}}};t.tasks.push(s)}createLocateTask(e,t,r,n){let{cacheable:i,defaultModel:o,deepLocate:a,abortSignal:s}=r,A=oj(t);return void 0!==i&&(A={...A,cacheable:i}),a&&!A.deepLocate&&(A={...A,deepLocate:!0}),{type:"Planning",subType:"Locate",param:A,thought:e.thought,executor:async(e,t)=>{var r,i,a,A,l,c,u,d,p,h,f,g;let m,y,v,b,w,E,{task:k}=t,{uiContext:x}=t,S=op(e)?e:void 0;(0,eZ.vA)((null==e?void 0:e.prompt)||S,`No prompt or id or position or locatedPixelBbox to locate, param=${JSON.stringify(e)}`),x||(x=await this.service.contextRetrieverFn()),(0,eZ.vA)(x,"uiContext is required for Service task");let{shrunkShotToLogicalRatio:C}=x;if(void 0===C)throw Error("shrunkShotToLogicalRatio is not defined in locate task");let I=e=>{var t,r,n,i,o,a,s;e&&(m=e,k.log={dump:e,rawResponse:null==(t=e.taskInfo)?void 0:t.rawResponse,rawChoiceMessage:null==(r=e.taskInfo)?void 0:r.rawChoiceMessage,searchAreaRawChoiceMessage:null==(n=e.taskInfo)?void 0:n.searchAreaRawChoiceMessage},k.usage=ox(null==(i=e.taskInfo)?void 0:i.usage,"default"),k.searchArea=null==(o=e.taskInfo)?void 0:o.searchArea,(null==(a=e.taskInfo)?void 0:a.searchAreaUsage)&&(k.searchAreaUsage=e.taskInfo.searchAreaUsage),(null==(s=e.taskInfo)?void 0:s.reasoning_content)&&(k.reasoning_content=e.taskInfo.reasoning_content))},j=S?function(e){var t;if(e)return nw(nC(e.locatedPixelBbox),"string"==typeof e.prompt?e.prompt:(null==(t=e.prompt)?void 0:t.prompt)||"")}(S):void 0,O=e.deepLocate?void 0:j,P=!!O;if(!P&&e.xpath&&this.interface.rectMatchesCacheFeature)try{v=await this.interface.rectMatchesCacheFeature({xpaths:[e.xpath]})}catch{}let R=v?nw((c=v,1===C?c:{...c,left:Math.round(c.left*C),top:Math.round(c.top*C),width:Math.round(c.width*C),height:Math.round(c.height*C)}),"string"==typeof e.prompt?e.prompt:(null==(r=e.prompt)?void 0:r.prompt)||""):void 0,T=!!R,N=e.prompt,M=null==(i=this.taskCache)?void 0:i.matchLocateCache(N),D=null==M||null==(a=M.cacheContent)?void 0:a.cache,z=P||T?null:await oh({taskCache:this.taskCache,interfaceInstance:this.interface},D,N,e.cacheable),B=z?1===C?z:{...z,center:[Math.round(z.center[0]*C),Math.round(z.center[1]*C)],rect:{...z.rect,left:Math.round(z.rect.left*C),top:Math.round(z.rect.top*C),width:Math.round(z.rect.width*C),height:Math.round(z.rect.height*C)}}:void 0,L=!!B,U=t.task.timing;if(!T&&!L&&!P)try{ij(U,"callAiStart"),y=await this.service.locate(e,{context:x,planLocatedElement:j},o,s),I(y.dump),b=y.element}catch(e){throw e instanceof nz&&I(e.dump),e}finally{ij(U,"callAiEnd")}let K=O||R||B||b;if(K){let e=[null==(u=K.center)?void 0:u[0],null==(d=K.center)?void 0:d[1],null==(p=K.rect)?void 0:p.left,null==(h=K.rect)?void 0:h.top,null==(f=K.rect)?void 0:f.width,null==(g=K.rect)?void 0:g.height].some(e=>"number"!=typeof e||!Number.isFinite(e))?`Invalid locate result coordinates: ${JSON.stringify(K)}`:K.rect.width<=0||K.rect.height<=0?`Invalid locate result rect size: ${JSON.stringify(K)}`:void 0;if(e){if(m)throw new nz(e,m);throw Error(e)}}let F=oI(null==M||null==(A=M.cacheContent)?void 0:A.cache);if(K&&this.taskCache&&!L&&(!P||!F)&&(null==e?void 0:e.cacheable)!==!1)if(this.interface.cacheFeatureForPoint)try{let t=K.center;1!==C&&(t=[Math.round(K.center[0]/C),Math.round(K.center[1]/C)],oC("Transformed coordinates for cacheFeatureForPoint: %o -> %o",K.center,t));let r=await this.interface.cacheFeatureForPoint(t,{targetDescription:"string"==typeof e.prompt?e.prompt:null==(l=e.prompt)?void 0:l.prompt,modelRuntime:o});oI(r)?(oC("update cache, prompt: %s, cache: %o",N,r),w=r,this.taskCache.updateOrAppendCacheRecord({type:"locate",prompt:N,cache:r},M)):oC("no cache data returned, skip cache update, prompt: %s",N)}catch(e){oC("cacheFeatureForPoint failed: %s",e)}else oC("cacheFeatureForPoint is not supported, skip cache update");if(!K){if(m)throw new nz(`Element not found : ${e.prompt}`,m);throw Error(`Element not found: ${e.prompt}`)}return P&&S?E={from:"Plan",context:{locatedPixelBbox:S.locatedPixelBbox}}:T?E={from:"User expected path",context:{xpath:e.xpath}}:L&&(E={from:"Cache",context:{cacheEntry:D,cacheToSave:w}}),null==n||n(K),{output:{element:{...K,dpr:x.deprecatedDpr}},hitBy:E}}}}constructor({interfaceInstance:e,service:t,taskCache:r,actionSpace:n,waitAfterAction:i}){oS(this,"interface",void 0),oS(this,"service",void 0),oS(this,"taskCache",void 0),oS(this,"actionSpace",void 0),oS(this,"waitAfterAction",void 0),this.interface=e,this.service=t,this.taskCache=r,this.actionSpace=n,this.waitAfterAction=i}}function oR(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:150;return void 0===e?"":("object"==typeof e&&(e=JSON.stringify(e)),"number"==typeof e)?e.toString():"string"==typeof e&&e.length>t?`${e.slice(0,t)}...`:"string"==typeof e?e.trim():""}function oT(e){return e.subType||e.type}function oN(e){if(!e)return"";if("string"==typeof e)return e;if("object"==typeof e){if("object"==typeof e.prompt&&null!==e.prompt&&e.prompt.prompt)return e.prompt.prompt;if("string"==typeof e.prompt)return e.prompt;if("string"==typeof e.description)return e.description}return""}function oM(e){if(!e)return{content:""};let t=e=>{var t;return(null==e||null==(t=e.multimodalPrompt)?void 0:t.images)&&Array.isArray(e.multimodalPrompt.images)?e.multimodalPrompt.images:void 0},r=e=>"string"==typeof e?e:JSON.stringify(e);if(e.demand)return{content:r(e.demand),images:t(e)};if(e.assertion)return{content:r(e.assertion),images:t(e)};if(e.dataDemand){let{dataDemand:n}=e;if("string"==typeof n)return{content:n};if("object"==typeof n)return{content:r(n.demand||n),images:t(n)}}return{content:""}}function oD(e,t){return t?`${e} - ${t}`:e}function oz(e){var t,r,n,i,o,a,s,A,l,c,u;let d;if("Planning"===e.type&&(d="Locate"===e.subType?oN(null==e?void 0:e.param):(null==(t=e.output)?void 0:t.log)||(null==(r=e.param)?void 0:r.userInstructionDisplay)||((null==(n=e.param)?void 0:n.userInstruction)?tX(e.param.userInstruction):void 0)),"Insight"===e.type&&(d=oM(null==e?void 0:e.param).content),"Action Space"===e.type){let t=null==e||null==(i=e.param)?void 0:i.locate,r=t?oN(t):"";(d=e.thought||"","number"==typeof(null==e||null==(o=e.param)?void 0:o.timeMs))?d=`${null==e||null==(a=e.param)?void 0:a.timeMs}ms`:"string"==typeof(null==e||null==(s=e.param)?void 0:s.scrollType)?d=(u=null==e?void 0:e.param)?`${u.direction||"down"}, ${u.scrollType||"singleAction"}, ${u.distance||"distance-not-set"}`:"":"string"==typeof(null==e||null==(A=e.param)?void 0:A.direction)&&(null==e?void 0:e.subType)==="PullGesture"?d=function(e){if(!e)return"";let t=[];return t.push(`direction: ${e.direction||"down"}`),e.distance&&t.push(`distance: ${e.distance}`),e.duration&&t.push(`duration: ${e.duration}ms`),t.join(", ")}(null==e?void 0:e.param):void 0!==(null==e||null==(l=e.param)?void 0:l.value)?d=null==e||null==(c=e.param)?void 0:c.value:(null==e?void 0:e.param)&&"object"==typeof(null==e?void 0:e.param)&&Object.keys((null==e?void 0:e.param)||{}).length>0&&(d=null==e?void 0:e.param),r&&(d=d&&"object"!=typeof d?`${r} - ${d}`:r)}if(void 0===d)return"";if("string"==typeof d)return d;if("object"==typeof d){let e=oN(d);if(e)return e;let t=Object.entries(d);if(0===t.length)return"";let r=e=>"string"==typeof e?e:null==e?String(e):"object"==typeof e?JSON.stringify(e):String(e);if(1===t.length){let[e,n]=t[0];return`${e}: ${r(n)}`}return t.map(e=>{let[t,n]=e;return`${t}: ${r(n)}`}).join(", ")}return String(d)}function oB(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let oL=(0,eN.a)("device-task-executor"),oU=(0,eN.a)("device-task-executor",{console:!0});class oK{get page(){return this.interface}createExecutionSession(e,t){var r;return new oE(e,()=>(null==t?void 0:t.uiContext)?Promise.resolve(t.uiContext):Promise.resolve(this.service.contextRetrieverFn()),{onTaskStart:this.onTaskStartCallback,tasks:null==t?void 0:t.tasks,onTaskUpdate:null==(r=this.hooks)?void 0:r.onTaskUpdate})}getActionSpace(){return this.providedActionSpace}setPendingFeedbackMessage(e,t,r){e.pendingFeedbackMessage=r?`Time: ${t}, ${r}`:`Current time: ${t}`}collectPlanningFeedback(e){let t=e.flatMap(e=>{let{planningFeedback:t}=e;return t?[t.length<=500?t:`${t.slice(0,500)}
|
|
935
|
+
...[truncated, ${t.length-500} more characters]`]:[]});return t.length>0?t.join("\n\n"):void 0}async getTimeString(e){if(this.useDeviceTime)if(this.interface.getDeviceLocalTimeString)try{return await this.interface.getDeviceLocalTimeString(e)}catch(e){oU(`Failed to get device time string, falling back to runtime time: ${e}`)}else oU("useDeviceTime is enabled but getDeviceLocalTimeString is not implemented, falling back to runtime time.");return t_(e)}async convertPlanToExecutable(e,t,r,n){return this.taskBuilder.build(e,t,r,n)}async loadYamlFlowAsPlanning(e,t,r){let n=this.createExecutionSession(oD((null==r?void 0:r.type)||"Act",(null==r?void 0:r.prompt)||tX(e))),i={type:"Planning",subType:"LoadYaml",param:{userInstruction:e,...(null==r?void 0:r.prompt)?{userInstructionDisplay:r.prompt}:{}},executor:async(e,r)=>{let{uiContext:n}=r;return(0,eZ.vA)(n,"uiContext is required for Planning task"),{output:{actions:[],shouldContinuePlanning:!1,log:"",yamlString:t},cache:{hit:!0},hitBy:{from:"Cache",context:{yamlString:t}}}}},o=n.getRunner();return await n.appendAndRun(i),{runner:o}}async runPlans(e,t,r,n,i){let o=this.createExecutionSession(e,i),{tasks:a}=await this.convertPlanToExecutable(t,r,n),s=o.getRunner(),{output:A}=await o.appendAndRun(a)??{};return{output:A,runner:s}}async action(e,t,r,n,i,o,a,s,A,l,c,u,d){return oF(this.interface,l,async()=>this.runAction(e,t,r,n,i,o,a,s,A,c,u,d))}invalidateFailedCacheHitLocates(e,t){if(this.taskCache)for(let i=t;i<e.tasks.length;i++){var r,n;let t=e.tasks[i];if("Planning"===t.type&&"Locate"===t.subType&&(null==(r=t.hitBy)?void 0:r.from)==="Cache"){let e=null==(n=t.param)?void 0:n.prompt;e&&this.taskCache.markLocateCacheStale(e)}}}async runAction(e,t,r,n,i,o,a,s,A,l,c,u){let d,p=new rd,h=this.createExecutionSession(oD((null==u?void 0:u.type)||"Act",(null==u?void 0:u.prompt)||tX(e))),f=h.getRunner(),g=0,m=[],y=a??this.replanningCycleLimit;(0,eZ.vA)(void 0!==y,"replanningCycleLimit is required for TaskExecutor.action");let v=0;if(null==c?void 0:c.aborted)return h.appendErrorPlan(`Task aborted: ${c.reason||"abort signal received"}`);let b=await tG(tH(e));for(;;){let a;if(null==c?void 0:c.aborted)return h.appendErrorPlan(`Task aborted: ${c.reason||"abort signal received"}`);let w=p.subGoalsToText()||void 0,E=p.memoriesToText()||void 0,k=await h.appendAndRun({type:"Planning",subType:"Plan",param:{userInstruction:e,...(null==u?void 0:u.prompt)?{userInstructionDisplay:u.prompt}:{},aiActContext:i,imagesIncludeCount:s,deepThink:A,...w?{subGoalStatus:w}:{},...E?{memoriesStatus:E}:{}},executor:async(e,r)=>{let i,{uiContext:o}=r;(0,eZ.vA)(o,"uiContext is required for Planning task");let a=r.task.timing,l=this.getActionSpace();oL("actionSpace for this interface is:",l.map(e=>e.name).join(", ")),(0,eZ.vA)(Array.isArray(l),"actionSpace must be an array"),0===l.length&&console.warn(`ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`);let u="custom"===t.adapter.planning.kind?t.adapter.planning.planFn:io;try{ij(a,"callAiStart"),i=await u(e.userInstruction,{context:o,actionContext:e.aiActContext,actionSpace:l,modelRuntime:t,conversationHistory:p,includeLocateInPlanning:n,imagesIncludeCount:s,deepThink:A,referenceImageMessages:b,abortSignal:c})}catch(e){throw e instanceof np&&(r.task.usage=ox(e.usage,"planning"),r.task.log={...r.task.log||{},rawResponse:e.rawResponse,rawChoiceMessage:e.rawChoiceMessage}),e}finally{ij(a,"callAiEnd")}oL("planResult",JSON.stringify(i,null,2));let{actions:h,thought:f,log:g,memory:m,error:y,usage:v,rawResponse:w,rawChoiceMessage:E,reasoning_content:k,finalizeSuccess:x,finalizeMessage:S,updateSubGoals:C,markFinishedIndexes:I}=i;return d=S,r.task.log={...r.task.log||{},rawResponse:w,rawChoiceMessage:E},r.task.usage=ox(v,"planning"),r.task.reasoning_content=k,r.task.output={actions:h||[],log:g,thought:f,memory:m,yamlFlow:i.yamlFlow,output:S,shouldContinuePlanning:i.shouldContinuePlanning,updateSubGoals:C,markFinishedIndexes:I},r.uiContext=o,(0,eZ.vA)(!y,`Failed to continue: ${y}
|
|
936
|
+
${g||""}`),!1===x&&(0,eZ.vA)(!1,`Task failed: ${S||"No error message provided"}
|
|
937
|
+
${g||""}`),{cache:{hit:!1}}}},{allowWhenError:!0}),x=null==k?void 0:k.output,S=(null==x?void 0:x.actions)||[];m.push(...(null==x?void 0:x.yamlFlow)||[]);try{a=await this.convertPlanToExecutable(S,t,r,{cacheable:o,deepLocate:l,abortSignal:c})}catch(e){return h.appendErrorPlan(`Error converting plans to executable tasks: ${e}, plans: ${JSON.stringify(S)}`)}p.pendingFeedbackMessage&&console.warn("unconsumed pending feedback message detected, this may lead to unexpected planning result:",p.pendingFeedbackMessage);let C=await this.getTimeString(),I=f.tasks.length;try{await h.appendAndRun(a.tasks),this.setPendingFeedbackMessage(p,C,this.collectPlanningFeedback(f.tasks.slice(I)))}catch(t){v++;let e=await this.getTimeString();this.setPendingFeedbackMessage(p,e,`Error executing running tasks: ${(null==t?void 0:t.message)||String(t)}`),oL("error when executing running tasks, but continue to run if it is not too many errors:",t instanceof Error?t.message:String(t),"current error count in one planning loop:",v)}if(v>5)return h.appendErrorPlan("Too many errors in one planning loop");if(null==c?void 0:c.aborted)return h.appendErrorPlan(`Task aborted: ${c.reason||"abort signal received"}`);if(!(null==x?void 0:x.shouldContinuePlanning))break;if(this.invalidateFailedCacheHitLocates(f,I),++g>y){let e=`Replanned ${y} times, exceeding the limit. Please configure a larger value for replanningCycleLimit (or use MIDSCENE_REPLANNING_CYCLE_LIMIT) to handle more complex tasks.`;return h.appendErrorPlan(e)}if(!p.pendingFeedbackMessage){let e=await this.getTimeString();p.pendingFeedbackMessage=`Time: ${e}, I have finished the action previously planned.`}}return{output:{yamlFlow:m,output:d},runner:f}}createTypeQueryTask(e,t,r,n,i,o){return{type:"Insight",subType:e,param:{domIncluded:null==n?void 0:n.domIncluded,dataDemand:i?{demand:t,multimodalPrompt:i}:t},executor:async(a,s)=>{let A,l,{task:c}=s,u=e=>{var t,r,n,i,o;A=e,c.log={dump:e,rawResponse:null==(t=e.taskInfo)?void 0:t.rawResponse,rawChoiceMessage:null==(r=e.taskInfo)?void 0:r.rawChoiceMessage,searchAreaRawChoiceMessage:null==(n=e.taskInfo)?void 0:n.searchAreaRawChoiceMessage},c.usage=ox(null==(i=e.taskInfo)?void 0:i.usage,"insight"),(null==(o=e.taskInfo)?void 0:o.reasoning_content)&&(c.reasoning_content=e.taskInfo.reasoning_content)},d=s.uiContext;(0,eZ.vA)(d,"uiContext is required for Query task");let p="Query"!==e,h=t,f="result";p&&("Assert"===e||"WaitFor"===e)?h={[f="StatementIsTruthy"]:nk(e,t)}:p&&(h={[f=e]:nk(e,t)});let g="";if((null==n?void 0:n.domIncluded)&&this.interface.getElementsNodeTree){oL("appending tree info for page");let e=await this.interface.getElementsNodeTree();g=await function(e,t){let r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=!(arguments.length>3)||void 0===arguments[3]||arguments[3],i=e=>Object.entries(e).map(e=>{let[r,n]=e;return`${r}="${oR(n,t)}"`}).join(" ");return(function e(n){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=!(arguments.length>2)||void 0===arguments[2]||arguments[2],s="",A="",l="",c=!0,u=" ".repeat(o),d="";for(let t=0;t<(n.children||[]).length;t++){let r=e(n.children[t],o+1,a);r&&(d+=`
|
|
938
|
+
${r}`)}if(n.node&&n.node.rect.width>4&&n.node.rect.height>4&&(!r||r&&n.node.content)&&(!a||a&&n.node.isVisible)){var p,h;let e;c=!1,e=(null==(p=n.node.attributes)?void 0:p.htmlTagName)?n.node.attributes.htmlTagName.replace(/[<>]/g,""):n.node.attributes.nodeType.replace(/\sNode$/,"").toLowerCase();let r=n.node.rect?{left:n.node.rect.left,top:n.node.rect.top,width:n.node.rect.width,height:n.node.rect.height}:{};s=`<${e} id="${n.node.id}" ${i((h=n.node.attributes||{},Object.keys(h).reduce((e,r)=>{let n=h[r];return"style"===r||"htmlTagName"===r||"nodeType"===r||(e[r]=oR(n,t)),e},{})))} ${i(r)}>`;let o=oR(n.node.content,t);A=o?`
|
|
939
|
+
${u} ${o}`:"",l=`</${e}>`}else r||d.trim().startsWith("<>")||(s="<>",A="",l="</>");if(c&&!d.trim())return"";let f=`${u}${s}${A}${d}
|
|
940
|
+
${u}${l}`;return f.trim()?f:""})(e,0,n).replace(/^\s*\n/gm,"")}(e,200,!1,(null==n?void 0:n.domIncluded)==="visible-only")}try{l=await this.service.extract(h,r,n,g,i,d,o)}catch(e){throw e instanceof nz&&u(e.dump),e}let{data:m,thought:y,dump:v}=l;u(v);let b=m;if(p&&("string"==typeof m?b=m:"WaitFor"===e?b=null!=m&&m[f]:null==m?b=null:(null==m?void 0:m[f])!==void 0?b=m[f]:(null==m?void 0:m.result)!==void 0?b=m.result:(0,eZ.vA)(!1,"No result in query data")),"Assert"===e&&!b)throw c.thought=y,Error(`Assertion failed: ${y}`);return{output:b,log:A,thought:y}}}}async createTypeQueryExecution(e,t,r,n,i,o){let a=this.createExecutionSession(oD(e,"string"==typeof t?t:JSON.stringify(t))),s=await this.createTypeQueryTask(e,t,r,n,i,o),A=a.getRunner(),l=await a.appendAndRun(s);if(!l)throw Error("result of taskExecutor.flush() is undefined in function createTypeQueryTask");let{output:c,thought:u}=l;return{output:c,thought:u,runner:A}}async waitFor(e,t,r){let{textPrompt:n,multimodalPrompt:i}=of(e),o=`waitFor: ${n}`,a=this.createExecutionSession(oD("WaitFor",o)),s=a.getRunner(),{timeoutMs:A,checkIntervalMs:l,domIncluded:c,screenshotIncluded:u,...d}=t,p={domIncluded:c,screenshotIncluded:u,...d};(0,eZ.vA)(e,"No assertion for waitFor"),(0,eZ.vA)(A,"No timeoutMs for waitFor"),(0,eZ.vA)(l,"No checkIntervalMs for waitFor"),(0,eZ.vA)(l<=A,`wrong config for waitFor: checkIntervalMs must be less than timeoutMs, config: {checkIntervalMs: ${l}, timeoutMs: ${A}}`);let h=Date.now(),f=h,g="";for(;f-h<=A;){let e=Date.now();f=e;let t=await this.createTypeQueryTask("WaitFor",n,r,p,i),o=await a.appendAndRun(t);if(null==o?void 0:o.output)return{output:void 0,runner:s};g=(null==o?void 0:o.thought)||!o&&`No result from assertion: ${n}`||`unknown error when waiting for assertion: ${n}`;let A=Date.now();if(A-e<l){let t=A-e,n=l-t,i=`Check interval is ${l}ms, ${t}ms elapsed since last check, sleeping for ${n}ms`,{tasks:o}=await this.convertPlanToExecutable([{type:"Sleep",param:{timeMs:n},thought:i}],r,r);o[0]&&await a.appendAndRun(o[0])}}return a.appendErrorPlan(`waitFor timeout: ${g}`)}constructor(e,t,r){oB(this,"interface",void 0),oB(this,"service",void 0),oB(this,"taskCache",void 0),oB(this,"providedActionSpace",void 0),oB(this,"taskBuilder",void 0),oB(this,"onTaskStartCallback",void 0),oB(this,"hooks",void 0),oB(this,"replanningCycleLimit",void 0),oB(this,"waitAfterAction",void 0),oB(this,"useDeviceTime",void 0),this.interface=e,this.service=t,this.taskCache=r.taskCache,this.onTaskStartCallback=null==r?void 0:r.onTaskStart,this.replanningCycleLimit=r.replanningCycleLimit,this.waitAfterAction=r.waitAfterAction,this.useDeviceTime=r.useDeviceTime,this.hooks=r.hooks,this.providedActionSpace=r.actionSpace,this.taskBuilder=new oP({interfaceInstance:e,service:t,taskCache:r.taskCache,actionSpace:this.getActionSpace(),waitAfterAction:r.waitAfterAction})}}async function oF(e,t,r){if(!(null==t?void 0:t.length))return r();if(!e.registerFileChooserListener)throw Error(`File upload is not supported on ${e.interfaceType}`);let n=async e=>{await e.accept(t)},{dispose:i,getError:o}=await e.registerFileChooserListener(n);try{let e=await r(),t=await o();if(t)throw t;return e}finally{i()}}function oZ(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}let oQ=(0,eN.a)("agent"),oJ=(0,eN.a)("agent",{console:!0}),oX={domIncluded:!1,screenshotIncluded:!0};class oH{get onDumpUpdate(){return this.dumpUpdateListeners[0]}set onDumpUpdate(e){this.dumpUpdateListeners=[],e&&this.dumpUpdateListeners.push(e)}get aiActContext(){return this.opts.aiActContext??this.opts.aiActionContext}get page(){return this.interface}assertModelFamilyForNonWebContext(){"puppeteer"!==this.interface.interfaceType&&"playwright"!==this.interface.interfaceType&&"static"!==this.interface.interfaceType&&"chrome-extension-proxy"!==this.interface.interfaceType&&"page-over-chrome-extension-bridge"!==this.interface.interfaceType&&this.modelConfigManager.throwErrorIfNonVLModel()}resolveReplanningCycleLimit(e){return this.opts.replanningCycleLimit??eY.getEnvConfigValueAsNumber(eD.TN)??e.adapter.planning.defaultReplanningCycleLimit}resolveModelRuntime(e){return r5(this.modelConfigManager.getModelConfig(e))}async getActionSpace(){return this.fullActionSpace}isRetryableContextError(e){return!1}async getUIContext(e){if(this.assertModelFamilyForNonWebContext(),this.frozenUIContext)return oQ("Using frozen page context for action:",e),this.frozenUIContext;let t=oH.CONTEXT_RETRY_MAX;for(let e=0;;e++)try{return await ou(this.interface,{uploadServerUrl:this.modelConfigManager.getUploadTestServerUrl(),screenshotShrinkFactor:this.opts.screenshotShrinkFactor})}catch(r){if(e<t&&this.isRetryableContextError(r)){oQ(`retryable context error (attempt ${e+1}/${t}), retrying in ${oH.CONTEXT_RETRY_DELAY_MS}ms: ${r}`),await new Promise(e=>setTimeout(e,oH.CONTEXT_RETRY_DELAY_MS));continue}throw r}}async _snapshotContext(){return await this.getUIContext("locate")}async setAIActionContext(e){await this.setAIActContext(e)}async setAIActContext(e){this.aiActContext&&console.warn("aiActContext is already set, and it is called again, will override the previous setting"),this.opts.aiActContext=e,this.opts.aiActionContext=e}resetDump(){return this.dump=new nZ({sdkVersion:"1.10.0",groupName:this.opts.groupName,groupDescription:this.opts.groupDescription,executions:[],modelBriefs:[],deviceType:this.interface.interfaceType}),this.executionDumpIndexByRunner=new WeakMap,this.dump}appendExecutionDump(e,t){let r=this.dump;if(t){let n=this.executionDumpIndexByRunner.get(t);if(void 0!==n){r.executions[n]=e;return}r.executions.push(e),this.executionDumpIndexByRunner.set(t,r.executions.length-1);return}r.executions.push(e)}dumpDataString(e){return(this.dump.groupName=this.opts.groupName,this.dump.groupDescription=this.opts.groupDescription,eZ.ht||(null==e?void 0:e.inlineScreenshots))?this.dump.serializeWithInlineScreenshots():this.dump.serialize()}reportHTMLString(e){return iF(this.dumpDataString(e))}writeOutActionDumps(e){let t=e||this.lastExecutionDump;t&&(this.lastExecutionDump=t,this.reportGenerator.onExecutionUpdate(t,this.getReportMeta(),this.opts.reportAttributes)),this.reportFile=this.reportGenerator.getReportPath()}getReportMeta(){return{groupName:this.dump.groupName,groupDescription:this.dump.groupDescription,sdkVersion:this.dump.sdkVersion,modelBriefs:this.dump.modelBriefs,deviceType:this.dump.deviceType}}async callbackOnTaskStartTip(e){let t=oz(e),r=t?`${oT(e)} - ${t}`:oT(e);this.onTaskStartTip&&await this.onTaskStartTip(r)}wrapActionInActionSpace(e){return async t=>await this.callActionInActionSpace(e,t)}async callActionInActionSpace(e,t){oQ("callActionInActionSpace",e,",",t);let r={type:e,param:t||{},thought:""};oQ("actionPlan",r);let n=[r].filter(Boolean),i=oD(e,oN((null==t?void 0:t.locate)||{})),o=this.resolveModelRuntime("default"),a=this.resolveModelRuntime("planning"),{output:s}=await this.taskExecutor.runPlans(i,n,a,o);return s}async aiTap(e,t){(0,eZ.vA)(e,"missing locate prompt for tap");let r=ig(e,t),n=(null==t?void 0:t.fileChooserAccept)?this.normalizeFileInput(t.fileChooserAccept):void 0;await oF(this.interface,n,async()=>{await this.callActionInActionSpace("Tap",{locate:r})})}async aiRightClick(e,t){(0,eZ.vA)(e,"missing locate prompt for right click");let r=ig(e,t);await this.callActionInActionSpace("RightClick",{locate:r})}async aiDoubleClick(e,t){(0,eZ.vA)(e,"missing locate prompt for double click");let r=ig(e,t);await this.callActionInActionSpace("DoubleClick",{locate:r})}async aiHover(e,t){(0,eZ.vA)(e,"missing locate prompt for hover");let r=ig(e,t);await this.callActionInActionSpace("Hover",{locate:r})}async aiInput(e,t,r){let n,i,o;"object"==typeof t&&null!==t&&"value"in t?(i=e,n=t.value,o=t):(n=e,i=t,o={...r,value:n}),(0,eZ.vA)("string"==typeof n||"number"==typeof n,"input value must be a string or number, use empty string if you want to clear the input"),(0,eZ.vA)(i,"missing locate prompt for input");let a=ig(i,o),s="number"==typeof n?String(n):n,A=(null==o?void 0:o.mode)==="append"?"typeOnly":null==o?void 0:o.mode;await this.callActionInActionSpace("Input",{...o||{},value:s,locate:a,mode:A})}async aiKeyboardPress(e,t,r){let n,i;"object"==typeof t&&null!==t&&"keyName"in t?(n=e,i=t):(n=t,i={...r||{},keyName:e}),(0,eZ.vA)(null==i?void 0:i.keyName,"missing keyName for keyboard press");let o=n?ig(n,i):void 0;await this.callActionInActionSpace("KeyboardPress",{...i||{},locate:o})}async aiScroll(e,t,r){let n,i;if(("string"==typeof e||null==e||"object"==typeof e&&null!==e&&"prompt"in e)&&"object"==typeof t&&null!==t?(n=e,i=t):(n=t,i={...r||{},...e||{}}),i){let e=(e=>{if(e)return e in oc?oc[e]:e})(i.scrollType);e!==i.scrollType&&(i={...i||{},scrollType:e})}let o=ig(n||"",i);await this.callActionInActionSpace("Scroll",{...i||{},locate:o})}async aiPinch(e,t){let r=ig(e||"",t);await this.callActionInActionSpace("Pinch",{...t,locate:r})}async aiLongPress(e,t){(0,eZ.vA)(e,"missing locate prompt for long press");let r=ig(e,t);await this.callActionInActionSpace("LongPress",{...t||{},locate:r})}async aiClearInput(e,t){(0,eZ.vA)(e,"missing locate prompt for clear input");let r=ig(e,t);await this.callActionInActionSpace("ClearInput",{locate:r})}async aiAct(e,t){let r=null==t?void 0:t._internalReportDisplay,n="string"==typeof e?e:e.prompt,i=(null==r?void 0:r.prompt)||n,o=(null==t?void 0:t.fileChooserAccept)?this.normalizeFileInput(t.fileChooserAccept):void 0,a=null==t?void 0:t.abortSignal;if(null==a?void 0:a.aborted)throw Error(`aiAct aborted: ${a.reason||"signal already aborted"}`);let s=async()=>{var n,s,A,l;let c=this.resolveModelRuntime("planning"),u=this.resolveModelRuntime("default"),d=(null==t?void 0:t.context)!==void 0?t.context:this.aiActContext,p=i2(e,d),h=(null==t?void 0:t.deepThink)===!0;h&&"custom"===c.adapter.planning.kind&&(oJ(`The "deepThink" option is not supported for aiAct with custom planning adapters (modelFamily: ${c.config.modelFamily??"unknown"}). It will be ignored.`),h=!1);let f=null==t?void 0:t.deepLocate;f&&!c.adapter.planning.supportsActionDeepLocate&&(oJ(`The "deepLocate" option is not supported for aiAct with the current planning adapter (modelFamily: ${c.config.modelFamily??"unknown"}). It will be ignored.`),f=!1);let g="default"===c.config.slot,m=!h&&g;oQ("setting includeLocateInPlanning to",m,{deepThink:h,noIndividualLocateModel:g});let y=null==t?void 0:t.cacheable,v=this.resolveReplanningCycleLimit(c),b=c.adapter.planning.cacheEnabled&&!1!==y?null==(n=this.taskCache)?void 0:n.matchPlanCache(p):void 0,w=!1;if((null==b?void 0:b.cacheUsable)&&(null==(s=this.taskCache)?void 0:s.isCacheResultUsed)&&(null==(l=b.cacheContent)||null==(A=l.yamlWorkflow)?void 0:A.trim())){let t=b.cacheContent.yamlWorkflow;try{await this.taskExecutor.loadYamlFlowAsPlanning(e,t,r),oQ("matched cache, will call .runYaml to run the action"),await this.runYaml(t);return}catch(e){w=!0,oJ(`cached aiAct plan failed, will replan and disable the stale cache: ${e instanceof Error?e.message:String(e)}`)}}let E=h?2:1,{output:k}=await this.taskExecutor.action(e,c,u,m,d,y,v,E,h,o,f,a,r);if(this.taskCache&&!1!==y){let e=w?[]:null==k?void 0:k.yamlFlow;if(!w&&!(null==e?void 0:e.length))return null==k?void 0:k.output;let t=e??[],r=iA.Ay.dump({tasks:[{name:i,flow:t}]});this.taskCache.updateOrAppendCacheRecord({type:"plan",prompt:p,yamlWorkflow:r},b)}return null==k?void 0:k.output};return await s()}async runMarkdown(e,t){let r=await (0,i_.readFile)(e,"utf-8"),{prompt:n}=await on(r,e);return this.aiAct(n,{...t,_internalReportDisplay:{type:"Markdown",prompt:(0,tg.basename)(e)}})}async runGherkinScenario(e,t){return ot(this,e,t)}async aiAction(e,t){return this.aiAct(e,t)}async aiQuery(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oX,r=this.resolveModelRuntime("insight"),{output:n}=await this.taskExecutor.createTypeQueryExecution("Query",e,r,t);return n}async aiBoolean(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oX,r=this.resolveModelRuntime("insight"),{textPrompt:n,multimodalPrompt:i}=of(e),{output:o}=await this.taskExecutor.createTypeQueryExecution("Boolean",n,r,t,i);return o}async aiNumber(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oX,r=this.resolveModelRuntime("insight"),{textPrompt:n,multimodalPrompt:i}=of(e),{output:o}=await this.taskExecutor.createTypeQueryExecution("Number",n,r,t,i);return o}async aiString(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oX,r=this.resolveModelRuntime("insight"),{textPrompt:n,multimodalPrompt:i}=of(e),{output:o}=await this.taskExecutor.createTypeQueryExecution("String",n,r,t,i);return o}async aiAsk(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:oX;return this.aiString(e,t)}async aiLocate(e,t){let r=ig(e,t);(0,eZ.vA)(r,"cannot get locate param for aiLocate");let n=oO(r),i=this.resolveModelRuntime("default"),o=this.resolveModelRuntime("planning"),{output:a}=await this.taskExecutor.runPlans(oD("Locate",oN(r)),[n],o,i,(null==t?void 0:t.uiContext)?{uiContext:t.uiContext}:void 0),{element:s}=a;return{rect:null==s?void 0:s.rect,center:null==s?void 0:s.center,dpr:null==s?void 0:s.dpr}}async aiAssert(e,t,r){let n=this.resolveModelRuntime("insight"),i={domIncluded:(null==r?void 0:r.domIncluded)??oX.domIncluded,screenshotIncluded:(null==r?void 0:r.screenshotIncluded)??oX.screenshotIncluded},{textPrompt:o,multimodalPrompt:a}=of(i2(e,null==r?void 0:r.context)),s="string"==typeof e?e:e.prompt;try{let{output:e,thought:A}=await this.taskExecutor.createTypeQueryExecution("Assert",o,n,i,a,{abortSignal:null==r?void 0:r.abortSignal}),l=!!e,c=l?void 0:`Assertion failed: ${t||s}
|
|
941
|
+
Reason: ${A||"(no_reason)"}`;if(null==r?void 0:r.keepRawResponse)return{pass:l,thought:A,message:c};if(!l)throw Error(c)}catch(e){if(e instanceof iT){let n=e.errorTask,i=null==n?void 0:n.thought,o=null==n?void 0:n.error,a=(null==n?void 0:n.errorMessage)||(o instanceof Error?o.message:o?String(o):void 0),A=`Assertion failed: ${t||s}
|
|
942
|
+
Reason: ${i||a||"(no_reason)"}`;if(null==r?void 0:r.keepRawResponse)return{pass:!1,thought:i,message:A};throw Error(A,{cause:o??e})}throw e}}async aiWaitFor(e,t){let r=this.resolveModelRuntime("insight");await this.taskExecutor.waitFor(e,{...t,timeoutMs:(null==t?void 0:t.timeoutMs)||15e3,checkIntervalMs:(null==t?void 0:t.checkIntervalMs)||3e3},r)}async ai(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return this.aiAct(...t)}async runYaml(e){let t=new iE(function(e,t){let r,n=e;if(-1!==e.indexOf("android")&&e.match(/deviceId:\s*(\d+)/)){let t;n=e.replace(/deviceId:\s*(\d+)/g,(e,r)=>(t=r,`deviceId: '${r}'`)),console.warn(`please use string-style deviceId in yaml script, for example: deviceId: "${t}"`)}let i=(r=!1,n.split("\n").map(e=>{let t=e.trimStart();if(!t||t.startsWith("#"))return e;if(0==e.length-t.length){if(iu.test(t))return r=!0,e;id.test(t)&&(r=!1)}return function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r="",n=0,i=0;for(;i<e.length;){let o=e.indexOf("${",i);if(-1===o)break;let a=e.indexOf("}",o+2);if(-1===a)break;let s=e.slice(o+2,a);if(!s){i=a+1;continue}r+=e.slice(n,o);let A=s.trim(),l=il.env[A];if(void 0===l)if(t)r+=e.slice(o,a+1);else throw Error(`Environment variable "${A}" is not defined`);else r+=l;n=a+1,i=a+1}return r+e.slice(n)}(e,r)}).join("\n")),o=iA.Ay.load(i,{schema:iA.Ay.JSON_SCHEMA}),a=t?`, failed to load ${t}`:"";return(0,eZ.vA)(o.tasks,`property "tasks" is required in yaml script ${a}`),(0,eZ.vA)(Array.isArray(o.tasks),`property "tasks" must be an array in yaml script, but got ${o.tasks}`),o}(e,"yaml"),async()=>({agent:this,freeFn:[]}));if(await t.run(),"error"===t.status){let e=t.taskStatusList.filter(e=>"error"===e.status).map(e=>{var t;return`task - ${e.name}: ${null==(t=e.error)?void 0:t.message}`}).join("\n");throw Error(`Error(s) occurred in running yaml script:
|
|
943
|
+
${e}`)}return{result:t.result}}async evaluateJavaScript(e){return(0,eZ.vA)(this.interface.evaluateJavaScript,"evaluateJavaScript is not supported in current agent"),this.interface.evaluateJavaScript(e)}addDumpUpdateListener(e){return this.dumpUpdateListeners.push(e),()=>{this.removeDumpUpdateListener(e)}}removeDumpUpdateListener(e){let t=this.dumpUpdateListeners.indexOf(e);t>-1&&this.dumpUpdateListeners.splice(t,1)}clearDumpUpdateListeners(){this.dumpUpdateListeners=[]}notifyDumpUpdateListeners(e){let t=this.dumpDataString();for(let r of this.dumpUpdateListeners)try{r(t,e)}catch(e){console.error("Error in onDumpUpdate listener",e)}}async destroy(){let e;if(this.destroyed)return;this.destroyed=!0;try{var t,r;await (null==(t=(r=this.interface).destroy)?void 0:t.call(r))}catch(t){e=t}await this.reportGenerator.flush();let n=await this.reportGenerator.finalize();if(this.reportFile=n,this.resetDump(),e)throw e}async recordToReport(e,t){let r=Date.now(),n=null==t?void 0:t.screenshots,i=null==t?void 0:t.screenshotBase64,o=void 0!==n,a=void 0!==i;if(o&&!Array.isArray(n))throw Error("recordToReport: screenshots must be an array");if(a&&"string"!=typeof i)throw Error("recordToReport: screenshotBase64 must be a string");if(o&&a)throw Error("recordToReport: provide only one of screenshots or screenshotBase64");if(t&&"subType"in t)throw Error("recordToReport: subType is not supported");let s=o?n:void 0;if(s&&0===s.length)throw Error("recordToReport: screenshots cannot be empty");let A=(s??(a?[{base64:i}]:[{base64:await this.interface.screenshotBase64()}])).map((e,t)=>{let n=function(e,t){if(!e||"string"!=typeof e.base64)throw Error(`recordToReport: screenshot #${t+1} must include a base64 string`);if(void 0!==e.description&&"string"!=typeof e.description)throw Error(`recordToReport: screenshot #${t+1} description must be a string`);return{base64:((e,t)=>{let r=(null==t?void 0:t.label)??"screenshot base64",n=e.trim();if(!n)throw Error(`${r} cannot be empty`);let i=n.match(tS);if(i){let e="jpg"===i[1].toLowerCase()?"jpeg":i[1].toLowerCase(),t=i[2];if(!t.replace(/\s/g,""))throw Error(`${r} cannot be empty`);return tI(e,t)}if(n.startsWith("data:")||!tC.test(n))throw Error(`${r} must be a PNG/JPEG data URI or raw PNG base64 string`);return tI("png",n)})(e.base64,{label:`recordToReport: screenshot #${t+1} base64`}),description:e.description}}(e,t),i=r+t;return{type:"screenshot",ts:i,screenshot:rc.create(n.base64,i),description:n.description}}),l={taskId:(0,eZ.uR)(),type:"Log",subType:"Screenshot",status:"finished",recorder:A,timing:{start:r,end:r,cost:0},param:{content:(null==t?void 0:t.content)||""},executor:async()=>{}},c=new nF({id:(0,eZ.uR)(),logTime:r,name:`Log - ${e||"untitled"}`,description:(null==t?void 0:t.content)||"",tasks:[l]});this.appendExecutionDump(c),this.writeOutActionDumps(c),await this.reportGenerator.flush(),this.notifyDumpUpdateListeners(c)}async recordErrorToReport(e,t){let r=Date.now(),n=[],i=t.screenshotBase64??await this.interface.screenshotBase64();i&&n.push({type:"screenshot",ts:r,screenshot:rc.create(i,r)});let o={taskId:(0,eZ.uR)(),type:"Log",subType:"Error",status:"failed",recorder:n,timing:{start:r,end:r,cost:0},param:{content:t.content||""},error:t.error,errorMessage:t.error.message,errorStack:t.error.stack,executor:async()=>{}},a=new nF({id:(0,eZ.uR)(),logTime:r,name:e,description:t.content||t.error.message,tasks:[o]});this.appendExecutionDump(a),this.writeOutActionDumps(a),await this.reportGenerator.flush(),this.notifyDumpUpdateListeners(a)}async logScreenshot(e,t){await this.recordToReport(e,t)}_unstableLogContent(){let{groupName:e,groupDescription:t,executions:r}=this.dump;return{groupName:e,groupDescription:t,executions:r||[]}}async freezePageContext(){oQ("Freezing page context");let e=await this._snapshotContext();e._isFrozen=!0,this.frozenUIContext=e,oQ("Page context frozen successfully")}async unfreezePageContext(){oQ("Unfreezing page context"),this.frozenUIContext=void 0,oQ("Page context unfrozen successfully")}processCacheConfig(e){!function(e){if(!0===e)throw Error('cache: true requires an explicit cache ID. Please provide:\nExample: cache: { id: "my-cache-id" }');if(!e||"object"!=typeof e)return;if(!e.id)throw Error('cache configuration requires an explicit id.\nExample: cache: { id: "my-cache-id" }');if(void 0!==e.cacheDir&&("string"!=typeof e.cacheDir||!e.cacheDir.trim()))throw Error('cache.cacheDir must be a non-empty string when provided.\nExample: cache: { id: "my-cache-id", cacheDir: "./my-cache-dir" }');let t=e.strategy;if(void 0!==t&&"string"!=typeof t)throw Error(`cache.strategy must be a string when provided, but received type ${typeof t}`);if(void 0!==t&&!i0.some(e=>e===t))throw Error(`cache.strategy must be one of ${i1}, but received "${t}"`)}(e.cache);let t=function(e,t){if(void 0!==e){if(!1===e)return!1;if(!0===e)return{id:t};if("object"==typeof e&&null!==e)return e.id?e:{...e,id:t}}if(eY.getEnvConfigInBoolean(eD.Od)&&t)return{id:t}}(e.cache,e.cacheId||"default");if(!t)return null;if("object"==typeof t&&null!==t){var r;let e=t.id,n=t.strategy??"read-write",i="write-only"===n;return{id:e,enabled:!i,readOnly:"read-only"===n,writeOnly:i,cacheDir:null==(r=t.cacheDir)?void 0:r.trim()}}return null}normalizeFileInput(e){return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},{fileExists:r=oi.existsSync,isInBrowser:n=eZ.ht,resolvePath:i=tg.resolve,wslDistroName:o=ol.env.WSL_DISTRO_NAME,cwd:a=ol.cwd()}=t;if(n)throw Error("File chooser is not supported in browser environment");return e.map(e=>{let t=i(e);if(!r(t))throw Error(`File not found: ${e}. Resolved to: ${t}. Current working directory: ${a}`);if(!o)return t;let n=t.match(/^\/mnt\/([a-z])\//);return n?`${n[1].toUpperCase()}:\\${t.slice(7).replace(/\//g,"\\")}`:`\\\\wsl$\\${o}${t.replace(/\//g,"\\")}`})}(Array.isArray(e)?e:[e])}async flushCache(e){if(!this.taskCache)throw Error("Cache is not configured");this.taskCache.flushCacheToFile(e)}constructor(e,t){var r,n;oZ(this,"interface",void 0),oZ(this,"service",void 0),oZ(this,"dump",void 0),oZ(this,"reportFile",void 0),oZ(this,"reportFileName",void 0),oZ(this,"taskExecutor",void 0),oZ(this,"opts",void 0),oZ(this,"dryMode",!1),oZ(this,"onTaskStartTip",void 0),oZ(this,"taskCache",void 0),oZ(this,"dumpUpdateListeners",[]),oZ(this,"destroyed",!1),oZ(this,"modelConfigManager",void 0),oZ(this,"frozenUIContext",void 0),oZ(this,"executionDumpIndexByRunner",new WeakMap),oZ(this,"fullActionSpace",void 0),oZ(this,"reportGenerator",void 0),oZ(this,"lastExecutionDump",void 0),this.interface=e,this.opts=Object.assign({generateReport:!0,persistExecutionDump:!1,autoPrintReportMsg:!0,groupName:"Midscene Report",groupDescription:""},t||{}),iV(this.opts);const i=this.opts.aiActContext??this.opts.aiActionContext;if(void 0!==i&&(this.opts.aiActContext=i,(n=this.opts).aiActionContext??(n.aiActionContext=i)),(null==t?void 0:t.modelConfig)&&("object"!=typeof(null==t?void 0:t.modelConfig)||Array.isArray(t.modelConfig)))throw Error(`opts.modelConfig must be a plain object map of env keys to values, but got ${typeof(null==t?void 0:t.modelConfig)}`);const o=(null==t?void 0:t.modelConfig)||(null==t?void 0:t.createOpenAIClient);this.modelConfigManager=o?new eW(null==t?void 0:t.modelConfig,null==t?void 0:t.createOpenAIClient):eV,this.onTaskStartTip=this.opts.onTaskStartTip,this.service=new nV(async()=>this.getUIContext());const a=this.processCacheConfig(t||{});a&&(this.taskCache=new ow(a.id,a.enabled,void 0,{readOnly:a.readOnly,writeOnly:a.writeOnly,cacheDir:a.cacheDir}));const s=this.interface.actionSpace();this.fullActionSpace=[...s,{name:"Sleep",description:"Wait for a specified duration before continuing. Defaults to 1 second (1000ms) if not specified.",paramSchema:i$,sample:{timeMs:2e3},call:async e=>{let t=(null==e?void 0:e.timeMs)??1e3;(0,eN.a)("device:common-action")(`Sleeping for ${t}ms`),await new Promise(e=>setTimeout(e,t))}}],this.taskExecutor=new oK(this.interface,this.service,{taskCache:this.taskCache,onTaskStart:this.callbackOnTaskStartTip.bind(this),replanningCycleLimit:this.opts.replanningCycleLimit,waitAfterAction:this.opts.waitAfterAction,useDeviceTime:this.opts.useDeviceTime,actionSpace:this.fullActionSpace,hooks:{onTaskUpdate:async e=>{let t=e.dump();this.appendExecutionDump(t,e),this.writeOutActionDumps(t),await this.reportGenerator.flush();let r=this.dumpDataString();for(let e of this.dumpUpdateListeners)try{e(r,t)}catch(e){console.error("Error in onDumpUpdate listener",e)}}}}),this.dump=this.resetDump(),this.reportFileName=(null==t?void 0:t.reportFileName)??od((null==t?void 0:t.testId)||this.interface.interfaceType||"web"),this.reportGenerator=iY.create(this.reportFileName,{generateReport:this.opts.generateReport,persistExecutionDump:this.opts.persistExecutionDump,outputFormat:this.opts.outputFormat,autoPrintReportMsg:this.opts.autoPrintReportMsg,reuseExistingReport:(null==(r=this.opts.reportAttributes)?void 0:r["data-group-id"])===this.reportFileName})}}oZ(oH,"CONTEXT_RETRY_MAX",3),oZ(oH,"CONTEXT_RETRY_DELAY_MS",1500),r(4201).Buffer;r(4201).Buffer;tu.k5(["split","to-markdown","merge-html"]).optional().describe("Report action to run. Supports: split, to-markdown, merge-html. Defaults to split."),tu.Yj().optional().describe("Input report HTML path (e.g. ./report/index.html). Used by split and to-markdown."),tu.KC([tu.Yj(),tu.YO(tu.Yj())]).optional().describe("Input report HTML path for the merge action. Repeat the flag to merge multiple reports (e.g. --htmlReport ./a/index.html --htmlReport ./b.html)."),tu.Yj().optional().describe("Output directory for generated report artifacts. For merge, defaults to the Midscene report directory."),tu.Yj().optional().describe("Output report file/directory name (without .html) for the merge action. Defaults to an auto-generated name."),tu.KC([tu.zM(),tu.Yj()]).optional().describe("Overwrite the existing merged report file if present (merge action only).");class oG{async getActionSpace(e){return[]}validateParams(e,t){if(!(null==t?void 0:t.paramSchema)||!this.actionNeedsStructuredParams(t))return{valid:!0};if(!e.params)return{valid:!1,errorMessage:"Parameters are required"};try{let r=this.prepareParamsForValidation(e.params,t);return t.paramSchema.parse(r),{valid:!0}}catch(e){return this.handleValidationError(e)}}createDisplayContent(e,t,r){return t&&e.params&&(null==r?void 0:r.paramSchema)?this.buildParamsDisplayList(e.params,r).join("\n")||e.prompt||"":e.prompt||""}formatBasicErrorMessage(e){return(null==e?void 0:e.message)||"Unknown error"}getSchemaKeys(e){if(!(null==e?void 0:e.paramSchema)||!("shape"in e.paramSchema))return[];let t=e.paramSchema;return t&&"shape"in t?Object.keys(t.shape):[]}filterValidParams(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r={};return Object.keys(e).forEach(n=>{t.includes(n)||void 0===e[n]||null===e[n]||""===e[n]||(r[n]=e[n])}),r}actionNeedsStructuredParams(e){return"object"!=typeof e.paramSchema||!("shape"in e.paramSchema)||Object.keys(e.paramSchema.shape||{}).length>0}prepareParamsForValidation(e,t){let r={...e};return t.paramSchema&&tV(t.paramSchema).forEach(e=>{"string"==typeof r[e]&&(r[e]={midscene_location_field_flag:!0,prompt:r[e],center:[0,0],rect:{left:0,top:0,width:0,height:0}})}),r}handleValidationError(e){if(e.errors&&e.errors.length>0){let t=e.errors.filter(e=>{let t=e.path.join(".");return!t.includes("center")&&!t.includes("rect")&&!t.includes("midscene_location_field_flag")}).map(e=>{let t=e.path.join(".");return`${t}: ${e.message}`});if(t.length>0)return{valid:!1,errorMessage:`Validation error: ${t.join(", ")}`}}let t=e instanceof Error?e.message:"Unknown validation error";return{valid:!1,errorMessage:`Parameter validation failed: ${t}`}}buildParamsDisplayList(e,t){let r=[],n=t.paramSchema;if(!(n&&"shape"in n))return r;let i=tV(n);return Object.keys(n.shape).forEach(t=>{let n=e[t];if(this.isValidParamValue(n)){let e=this.capitalizeFirstLetter(t),o=this.formatParamValue(t,n,i.includes(t));r.push(`${e}: ${o}`)}}),r}isValidParamValue(e){return null!=e&&""!==e}capitalizeFirstLetter(e){return e.charAt(0).toUpperCase()+e.slice(1)}formatParamValue(e,t,r){return r||"string"==typeof t?`"${t}"`:"number"==typeof t&&"distance"===e?`${t}px`:`${t}`}}function oq(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class oW extends oG{get id(){return this._id}onDumpUpdate(e){this.dumpUpdateCallback=void 0,this.dumpUpdateCallback=e}setProgressCallback(e){this.progressCallback=void 0,this.progressCallback=e}async parseStructuredParams(e,t,r){return await iS(e,t,r)}formatErrorMessage(e){return((null==e?void 0:e.message)||"").includes("of different extension")?"Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq":this.formatBasicErrorMessage(e)}async getActionSpace(e){var t;if(!this.agent&&this.agentFactory)try{this.agent=await this.agentFactory()}catch(e){return console.warn("Failed to create agent for actionSpace:",e),[]}if(null==(t=this.agent)?void 0:t.getActionSpace)return await this.agent.getActionSpace();if(this.agent&&"interface"in this.agent&&"object"==typeof this.agent.interface){let e=this.agent.interface;if(null==e?void 0:e.actionSpace)return e.actionSpace()}return e&&"object"==typeof e&&"actionSpace"in e?e.actionSpace():[]}async checkStatus(){return!0}async overrideConfig(e){e$(e),console.log("Config updated. Agent will be recreated on next execution.")}async runConnectivityTest(){return n3({defaultModelConfig:eV.getModelConfig("default"),planningModelConfig:eV.getModelConfig("planning"),insightModelConfig:eV.getModelConfig("insight")})}async detachDebuggerSafely(){try{var e,t;let r=null==(e=this.agent)?void 0:e.interface;await (null==r||null==(t=r.detachDebugger)?void 0:t.call(r))}catch(e){console.warn("Failed to detach debugger:",e)}}async executeAction(e,t,r){var n,i,o;let a;if(this.agentFactory){if(this.agent){console.log("Destroying old agent before execution...");try{await (null==(n=(i=this.agent).destroy)?void 0:n.call(i))}catch(e){console.warn("Failed to destroy old agent:",e)}this.agent=null}await this.recreateAgent()}if(!this.agent)throw Error("No agent available. Please provide either an agent instance or agentFactory.");let s=this.agent,A=await this.getActionSpace();try{null==(o=s.resetDump)||o.call(s)}catch(e){console.warn("Failed to reset dump before execution:",e)}r.requestId&&(this.currentRequestId=r.requestId,a=s.addDumpUpdateListener((e,t)=>{this.currentRequestId===r.requestId&&this.dumpUpdateCallback&&this.dumpUpdateCallback(e,t)}));try{let n=null,i=null;try{n=await iC(s,e,A,t,r)}catch(e){i=e}let o={result:n,dump:null,reportHTML:null,error:i?i instanceof Error?i.message:String(i):null};try{if(s.dumpDataString){let e=s.dumpDataString();e&&(o.dump=nZ.fromSerializedString(e))}}catch(e){console.warn("Failed to get dump from agent:",e)}try{s.reportHTMLString&&(o.reportHTML=s.reportHTMLString()||null)}catch(e){}try{s.writeOutActionDumps&&s.writeOutActionDumps()}catch(e){}return o}finally{a&&a()}}async recreateAgent(){if(!this.agentFactory)throw Error("Cannot recreate agent: factory function not provided. Please provide agentFactory in PlaygroundConfig to enable agent recreation.");console.log("Creating new agent with latest config...");try{this.agent=await this.agentFactory(),console.log("Agent created successfully")}catch(e){throw console.error("Failed to create agent:",e),e}}async cancelTask(e){if(!this.agent)return{error:"No active agent found for this requestId"};let t=null,r=null;try{if("function"==typeof this.agent.dumpDataString){let e=this.agent.dumpDataString();e&&(t=nZ.fromSerializedString(e))}}catch(e){console.warn("[LocalExecutionAdapter] Failed to get dump data before cancel:",e)}try{if("function"==typeof this.agent.reportHTMLString){let e=this.agent.reportHTMLString();e&&"string"==typeof e&&!e.includes("REPLACE_ME_WITH_REPORT_HTML")&&(r=e)}}catch(e){console.warn("[LocalExecutionAdapter] reportHTMLString not available in this environment")}try{var n,i;return await (null==(n=(i=this.agent).destroy)?void 0:n.call(i)),this.agent=null,{success:!0,dump:t,reportHTML:r}}catch(n){let e=n instanceof Error?n.message:"Unknown error";return console.error(`[LocalExecutionAdapter] Failed to cancel agent: ${e}`),{error:`Failed to cancel: ${e}`,dump:t,reportHTML:r}}}async getCurrentExecutionData(){let e={dump:null,reportHTML:null};try{var t,r;if(null==(t=this.agent)?void 0:t.dumpDataString){let t=this.agent.dumpDataString();t&&(e.dump=nZ.fromSerializedString(t))}(null==(r=this.agent)?void 0:r.reportHTMLString)&&(e.reportHTML=this.agent.reportHTMLString()||null)}catch(e){console.error("Failed to get current execution data:",e)}return e}async getInterfaceInfo(){var e,t,r;if(!(null==(e=this.agent)?void 0:e.interface))return null;try{let e=this.agent.interface.interfaceType||"Unknown",n=(null==(t=(r=this.agent.interface).describe)?void 0:t.call(r))||void 0,i="function"==typeof this.agent.interface.size?await this.agent.interface.size():void 0,o="function"==typeof this.agent.interface.actionSpace?this.agent.interface.actionSpace().map(e=>null==e?void 0:e.name).filter(e=>"string"==typeof e):void 0;return{type:e,description:n,...i?{size:i}:{},...o?{actionTypes:o}:{}}}catch(e){return console.error("Failed to get interface info:",e),null}}async getRuntimeInfo(){var e,t,r,n;if(!(null==(e=this.agent)?void 0:e.interface))return null;try{let e;return e=(n={interfaceType:this.agent.interface.interfaceType||"Unknown",interfaceDescription:(null==(t=(r=this.agent.interface).describe)?void 0:t.call(r))||void 0,supportsScreenshot:"function"==typeof this.agent.interface.screenshotBase64,mjpegStreamUrl:this.agent.interface.mjpegStreamUrl}).interfaceType||"Unknown",{platformId:n.platformId,title:n.title,platformDescription:n.platformDescription,interface:{type:e,description:n.interfaceDescription},preview:n.preview?n.preview:"number"==typeof n.scrcpyPort?function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return{kind:"scrcpy",screenshotPath:"/screenshot",capabilities:[{kind:"scrcpy",label:"scrcpy streaming",live:!0},{kind:"screenshot",label:"Screenshot fallback",live:!1}],custom:e,...t}}({scrcpyPort:n.scrcpyPort}):n.mjpegStreamUrl?function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{kind:"mjpeg",screenshotPath:"/screenshot",mjpegPath:"/mjpeg",capabilities:[{kind:"mjpeg",label:"MJPEG streaming",live:!0},{kind:"screenshot",label:"Screenshot fallback",live:!1}],...e}}():n.supportsScreenshot?function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{kind:"screenshot",screenshotPath:"/screenshot",capabilities:[{kind:"screenshot",label:"Screenshot polling",live:!1}],...e}}():{kind:"none",capabilities:[]},executionUxHints:function(e){if(!e)return[];let t=e.executionUxHints;if(Array.isArray(t))return t.filter(e=>"string"==typeof e&&e.length>0);let r=e.executionUx;return"string"==typeof r&&r.length>0?[r]:[]}(n.metadata),metadata:{...n.metadata||{}}}}catch(e){return console.error("Failed to get runtime info:",e),null}}constructor(e,t){super(),oq(this,"agent",void 0),oq(this,"agentFactory",void 0),oq(this,"dumpUpdateCallback",void 0),oq(this,"progressCallback",void 0),oq(this,"_id",void 0),oq(this,"currentRequestId",void 0),this.agent=e??null,this.agentFactory=t,this._id=(0,eZ.uR)()}}function oV(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class oY extends oG{onDumpUpdate(e){this.dumpUpdateCallback=void 0,this.dumpUpdateCallback=e}get id(){return this._id}validateParams(e,t){if(!(null==t?void 0:t.paramSchema)||!this.actionNeedsStructuredParams(t))return{valid:!0};if(!e.params)return{valid:!1,errorMessage:"Parameters are required"};if(t.paramSchema&&"object"==typeof t.paramSchema){let r=t.paramSchema;if(r.shape||"ZodObject"===r.type){let t=r.shape||{},n=Object.keys(t).filter(r=>{var n,i;let o=t[r];return!((null==o?void 0:o.isOptional)||(null==o||null==(n=o._def)?void 0:n.innerType)||(null==o||null==(i=o._def)?void 0:i.typeName)==="ZodOptional")&&(void 0===e.params[r]||""===e.params[r])});if(n.length>0)return{valid:!1,errorMessage:`Missing required parameters: ${n.join(", ")}`}}}return{valid:!0}}async parseStructuredParams(e,t,r){return await iS(e,t,r)}formatErrorMessage(e){let t=(null==e?void 0:e.message)||"",r=[{keyword:"adb",message:"ADB connection error. Please ensure device is connected and USB debugging is enabled."},{keyword:"UIAutomator",message:"UIAutomator error. Please ensure the UIAutomator server is running on the device."}].find(e=>{let{keyword:r}=e;return t.includes(r)});return r?r.message:this.formatBasicErrorMessage(e)}async executeAction(e,t,r){if(this.serverUrl&&"undefined"!=typeof window)return this.executeViaServer(e,t,r);throw Error("Remote execution adapter requires server URL for execution")}async executeViaServer(e,t,r){let n={type:e,prompt:t.prompt,...this.buildOptionalPayloadParams(r,t)};r.context&&(n.context=r.context),r.requestId&&this.dumpUpdateCallback&&this.startProgressPolling(r.requestId);try{let e=await fetch(`${this.serverUrl}/execute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!e.ok){let t=await e.text().catch(()=>"Unknown error");throw Error(`Server request failed (${e.status}): ${t}`)}return await e.json()}catch(e){throw console.error("Execute via server failed:",e),e}finally{this.stopProgressPolling()}}buildOptionalPayloadParams(e,t){let r={};return[{key:"requestId",value:e.requestId},{key:"deepLocate",value:e.deepLocate},{key:"deepThink",value:e.deepThink},{key:"screenshotIncluded",value:e.screenshotIncluded},{key:"domIncluded",value:e.domIncluded},{key:"deviceOptions",value:e.deviceOptions},{key:"reportDisplay",value:e.reportDisplay},{key:"params",value:t.params}].forEach(e=>{let{key:t,value:n}=e;null!=n&&""!==n&&(r[t]=n)}),r}async getActionSpace(e){if(this.serverUrl&&"undefined"!=typeof window)try{let t=await fetch(`${this.serverUrl}/action-space`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({context:e})});if(!t.ok)throw Error(`Failed to get action space: ${t.statusText}`);let r=await t.json();return Array.isArray(r)?r:[]}catch(e){console.error("Failed to get action space from server:",e)}if(e&&"object"==typeof e&&"actionSpace"in e)try{let t=e.actionSpace,r=await t();return Array.isArray(r)?r:[]}catch(e){console.error("Failed to get action space from context:",e)}return[]}async checkStatus(){if(!this.serverUrl)return!1;try{let e=await fetch(`${this.serverUrl}/status`);if(200===e.status){try{let t=await e.json();t.id&&"string"==typeof t.id&&(this._id=t.id)}catch(e){console.debug("Failed to parse status response:",e)}return!0}return!1}catch(e){return console.warn("Server status check failed:",e),!1}}async overrideConfig(e){if(!this.serverUrl)throw Error("Server URL not configured");try{let t=await fetch(`${this.serverUrl}/config`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({aiConfig:e})});if(!t.ok){let e=await t.json().catch(()=>null),r=(null==e?void 0:e.error)||t.statusText;throw Error(r)}}catch(e){throw console.error("Failed to override server config:",e),e}}async runConnectivityTest(){if(!this.serverUrl)throw Error("Server URL not configured");let e=await fetch(`${this.serverUrl}/connectivity-test`,{method:"POST"});if(!e.ok){let t=await e.json().catch(()=>null);throw Error((null==t?void 0:t.error)||e.statusText)}return e.json()}async getTaskProgress(e){if(!this.serverUrl)return{};if(!(null==e?void 0:e.trim()))return console.warn("Invalid requestId provided for task progress"),{};try{let t=await fetch(`${this.serverUrl}/task-progress/${encodeURIComponent(e)}`);if(!t.ok)return console.warn(`Task progress request failed: ${t.statusText}`),{};return await t.json()}catch(e){return console.error("Failed to poll task progress:",e),{}}}startProgressPolling(e){this.stopProgressPolling(),this.pollingIntervalId=setInterval(async()=>{try{let t=await this.getTaskProgress(e);t.executionDump&&this.dumpUpdateCallback&&this.dumpUpdateCallback("",t.executionDump)}catch(e){console.error("Error polling task progress:",e)}},500)}stopProgressPolling(){this.pollingIntervalId&&(clearInterval(this.pollingIntervalId),this.pollingIntervalId=void 0)}async cancelTask(e){if(!this.serverUrl)return{error:"No server URL configured"};if(!(null==e?void 0:e.trim()))return{error:"Invalid request ID"};try{let t=await fetch(`${this.serverUrl}/cancel/${encodeURIComponent(e)}`,{method:"POST"});if(!t.ok)return{error:`Cancel request failed: ${t.statusText}`};let r=await t.json();return{success:!0,...r}}catch(e){return console.error("Failed to cancel task:",e),{error:"Failed to cancel task"}}}async getScreenshot(){if(!this.serverUrl)return null;try{let e=await fetch(`${this.serverUrl}/screenshot`);if(!e.ok)return 409!==e.status&&console.warn(`Screenshot request failed: ${e.statusText}`),null;return await e.json()}catch(e){return console.error("Failed to get screenshot:",e),null}}async interact(e){if(!this.serverUrl)return{ok:!1,error:"No server URL configured"};try{let t=await fetch(`${this.serverUrl}/interact`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),r=await t.json().catch(()=>null);if(!t.ok)return{ok:!1,error:(null==r?void 0:r.error)||`Interact request failed (${t.status})`};return{ok:!0}}catch(e){return{ok:!1,error:e instanceof Error?e.message:"Unknown error"}}}async startRecorderSession(e){if(!this.serverUrl)return{ok:!1,supported:!1,error:"No server URL configured"};try{let t=await fetch(`${this.serverUrl}/recorder/start`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:e})}),r=await t.json().catch(()=>null);if(!t.ok)return{ok:!1,supported:(null==r?void 0:r.supported)??!1,source:null==r?void 0:r.source,platformId:null==r?void 0:r.platformId,error:(null==r?void 0:r.error)||`Recorder start request failed (${t.status})`};return{ok:(null==r?void 0:r.ok)??!0,supported:(null==r?void 0:r.supported)??!0,source:null==r?void 0:r.source,platformId:null==r?void 0:r.platformId,error:null==r?void 0:r.error}}catch(e){return{ok:!1,supported:!1,error:e instanceof Error?e.message:"Unknown error"}}}async getRecorderCapabilities(){if(!this.serverUrl)return{supported:!1,source:"unsupported",error:"No server URL configured"};try{let e=await fetch(`${this.serverUrl}/recorder/capabilities`),t=await e.json().catch(()=>null);if(!e.ok)return{supported:!1,source:"unsupported",error:(null==t?void 0:t.error)||`Recorder capabilities request failed (${e.status})`};return{supported:(null==t?void 0:t.supported)===!0,source:(null==t?void 0:t.source)||"unsupported",platformId:null==t?void 0:t.platformId,error:null==t?void 0:t.error}}catch(e){return{supported:!1,source:"unsupported",error:e instanceof Error?e.message:"Unknown error"}}}async stopRecorderSession(){if(!this.serverUrl)return{ok:!1,error:"No server URL configured"};try{let e=await fetch(`${this.serverUrl}/recorder/stop`,{method:"POST"});if(!e.ok)return{ok:!1,error:`Recorder stop request failed (${e.status})`};return{ok:!0}}catch(e){return{ok:!1,error:e instanceof Error?e.message:"Unknown error"}}}async getRecorderEvents(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;if(!this.serverUrl)return{events:[],nextIndex:e};try{let t=await fetch(`${this.serverUrl}/recorder/events?since=${encodeURIComponent(String(e))}`);if(!t.ok)return{events:[],nextIndex:e};let r=await t.json().catch(()=>null);return{events:Array.isArray(null==r?void 0:r.events)?r.events:[],nextIndex:"number"==typeof(null==r?void 0:r.nextIndex)&&Number.isFinite(r.nextIndex)?r.nextIndex:e}}catch(t){return console.error("Failed to poll recorder events:",t),{events:[],nextIndex:e}}}async describeRecorderEventAtPoint(e){if(!this.serverUrl)return{ok:!1,error:"No server URL configured"};try{let t=await fetch(`${this.serverUrl}/recorder/describe-event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({event:e})}),r=await t.json().catch(()=>null);if(!t.ok)return{ok:!1,error:(null==r?void 0:r.error)||`Recorder describe request failed (${t.status})`};return r||{ok:!1,error:"Empty recorder describe response"}}catch(e){return{ok:!1,error:e instanceof Error?e.message:"Failed to describe recorder event"}}}async getInterfaceInfo(){if(!this.serverUrl)return null;try{let e=await fetch(`${this.serverUrl}/interface-info`);if(!e.ok)return console.warn(`Interface info request failed: ${e.statusText}`),null;return await e.json()}catch(e){return console.error("Failed to get interface info:",e),null}}async getRuntimeInfo(){if(!this.serverUrl)return null;try{let e=await fetch(`${this.serverUrl}/runtime-info`);if(!e.ok)return console.warn(`Runtime info request failed: ${e.statusText}`),null;return await e.json()}catch(e){return console.error("Failed to get runtime info:",e),null}}async getSessionInfo(){if(!this.serverUrl)return null;try{let e=await fetch(`${this.serverUrl}/session`);if(!e.ok)return console.warn(`Session info request failed: ${e.statusText}`),null;return await e.json()}catch(e){return console.error("Failed to get session info:",e),null}}async getSessionSetup(e){if(!this.serverUrl)return null;try{let t=new URLSearchParams;Object.entries(e||{}).forEach(e=>{let[r,n]=e;("string"==typeof n||"number"==typeof n||"boolean"==typeof n)&&t.set(r,String(n))});let r=t.size>0?`?${t.toString()}`:"",n=await fetch(`${this.serverUrl}/session/setup${r}`);if(!n.ok){let e=await n.json().catch(()=>null);throw Error((null==e?void 0:e.error)||n.statusText||"Failed to load session setup")}return await n.json()}catch(e){throw console.error("Failed to get session setup:",e),e}}async listSessionTargets(){if(!this.serverUrl)return[];try{let e=await fetch(`${this.serverUrl}/session/targets`);if(!e.ok){let t=await e.json().catch(()=>null);throw Error((null==t?void 0:t.error)||e.statusText||"Failed to load session targets")}let t=await e.json();return Array.isArray(t)?t:[]}catch(e){throw console.error("Failed to get session targets:",e),e}}async createSession(e){if(!this.serverUrl)throw Error("Server URL not configured");let t=await fetch(`${this.serverUrl}/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e||{})});if(!t.ok){let e=await t.json().catch(()=>null);throw Error((null==e?void 0:e.error)||t.statusText)}return await t.json()}async destroySession(){if(!this.serverUrl)throw Error("Server URL not configured");let e=await fetch(`${this.serverUrl}/session`,{method:"DELETE"});if(!e.ok){let t=await e.json().catch(()=>null);throw Error((null==t?void 0:t.error)||e.statusText)}return await e.json()}constructor(e){super(),oV(this,"serverUrl",void 0),oV(this,"_id",void 0),oV(this,"dumpUpdateCallback",void 0),oV(this,"pollingIntervalId",void 0),this.serverUrl=e}}function o_(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class o${createAdapter(e,t,r,n){switch(e){case"local-execution":if(!r&&!n)throw Error("Agent or agentFactory is required for local execution");return new oW(r,n);case"remote-execution":return new oY(t||("undefined"!=typeof window&&window.location.protocol.includes("http")?window.location.origin:"http://localhost:5800"));default:throw Error(`Unsupported execution type: ${e}`)}}runtimeMetadataAdapter(){return this.adapter instanceof oW||this.adapter instanceof oY?this.adapter:null}async executeAction(e,t,r){var n;return await (null==(n=this.beforeActionHook)?void 0:n.call(this,e,t,r)),await this.adapter.executeAction(e,t,r)}setBeforeActionHook(e){this.beforeActionHook=e}async getActionSpace(e){return this.adapter.getActionSpace(e)}validateStructuredParams(e,t){return this.adapter.validateParams(e,t)}formatErrorMessage(e){return this.adapter.formatErrorMessage(e)}createDisplayContent(e,t,r){return this.adapter.createDisplayContent(e,t,r)}get id(){if(this.adapter instanceof oY||this.adapter instanceof oW)return this.adapter.id}async checkStatus(){return!(this.adapter instanceof oY)||this.adapter.checkStatus()}async overrideConfig(e){return this.adapter.overrideConfig(e)}async runConnectivityTest(){return this.adapter.runConnectivityTest()}async getTaskProgress(e){return this.adapter instanceof oY?this.adapter.getTaskProgress(e):{}}async cancelTask(e){return this.adapter instanceof oY?this.adapter.cancelTask(e):{error:"Cancel task not supported in local execution mode"}}onDumpUpdate(e){this.adapter instanceof oW?this.adapter.onDumpUpdate(e):this.adapter instanceof oY&&this.adapter.onDumpUpdate(e)}onProgressUpdate(e){this.adapter instanceof oW&&this.adapter.setProgressCallback(e)}async cancelExecution(e){if(this.adapter instanceof oY){let t=await this.adapter.cancelTask(e);if(t.success)return{dump:t.dump||null,reportHTML:t.reportHTML||null}}else if(this.adapter instanceof oW){let t=await this.adapter.cancelTask(e);if(t.success)return{dump:t.dump||null,reportHTML:t.reportHTML||null}}return null}async getCurrentExecutionData(){return this.adapter instanceof oW&&this.adapter.getCurrentExecutionData?await this.adapter.getCurrentExecutionData():{dump:null,reportHTML:null}}async getScreenshot(){return this.adapter instanceof oY?this.adapter.getScreenshot():null}async interact(e){return this.adapter instanceof oY?this.adapter.interact(e):{ok:!1,error:"Direct interaction requires remote execution"}}async startRecorderSession(e){return this.adapter instanceof oY?this.adapter.startRecorderSession(e):{ok:!1,supported:!1,error:"Recorder requires remote execution"}}async getRecorderCapabilities(){return this.adapter instanceof oY?this.adapter.getRecorderCapabilities():{supported:!1,source:"unsupported",error:"Recorder requires remote execution"}}async stopRecorderSession(){return this.adapter instanceof oY?this.adapter.stopRecorderSession():{ok:!0}}async getRecorderEvents(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return this.adapter instanceof oY?this.adapter.getRecorderEvents(e):{events:[],nextIndex:e}}async describeRecorderEventAtPoint(e){return this.adapter instanceof oY?this.adapter.describeRecorderEventAtPoint(e):{ok:!1,error:"Recorder aiDescribe requires remote execution"}}async getInterfaceInfo(){let e=this.runtimeMetadataAdapter();return e?e.getInterfaceInfo():null}async getRuntimeInfo(){let e=this.runtimeMetadataAdapter();return e?e.getRuntimeInfo():null}async getSessionInfo(){return this.adapter instanceof oY?this.adapter.getSessionInfo():null}async getSessionSetup(e){return this.adapter instanceof oY?this.adapter.getSessionSetup(e):null}async listSessionTargets(){return this.adapter instanceof oY?this.adapter.listSessionTargets():[]}async createSession(e){if(this.adapter instanceof oY)return this.adapter.createSession(e);throw Error("Session creation is only supported in server mode")}async destroySession(){if(this.adapter instanceof oY)return this.adapter.destroySession();throw Error("Session destruction is only supported in server mode")}getServiceMode(){return this.adapter instanceof oW?"In-Browser-Extension":"Server"}constructor(e){o_(this,"adapter",void 0),o_(this,"beforeActionHook",void 0),this.adapter=this.createAdapter(e.type,e.serverUrl,e.agent,e.agentFactory)}}var o0=r(5810);function o1(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e?Object.fromEntries(e.fields.map(e=>[e.key,function(e,t){var r,n,i,o,a;return null!=t&&""!==t?t:"select"===e.type?null!=(o=null!=(i=e.defaultValue)?i:null==(n=e.options)||null==(r=n[0])?void 0:r.value)?o:"":null!=(a=null!=t?t:e.defaultValue)?a:""}(e,t[e.key])])):{}}function o2(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(null==e?void 0:e.autoSubmitWhenReady))return null;let r=o1(e,t);for(let t of e.fields){var n;if(t.required&&(null==(n=r[t.key])||""===n))return null}return r}function o3(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function o5(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function o7(e){return Object.keys(e).length>0}function o4(e){return e?JSON.stringify(e):null}function o8(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function o6(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){o8(o,n,i,a,s,"next",e)}function s(e){o8(o,n,i,a,s,"throw",e)}a(void 0)})}}function o9(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function ae(e){var t;return null==e||null==(t=e.platformSelector)?void 0:t.fieldKey}let at=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:400,height:283,fill:"none",viewBox:"0 0 400 283"},e),r=r={children:[(0,o.jsx)("path",{fill:"url(#server-offline-background_svg__a)",fillOpacity:.7,d:"M0 283h283v400H0z",transform:"rotate(-90 0 283)"}),(0,o.jsx)("path",{fill:"url(#server-offline-background_svg__b)",d:"M0 0h400v283H0z"}),(0,o.jsxs)("defs",{children:[(0,o.jsxs)("radialGradient",{id:"server-offline-background_svg__b",cx:0,cy:0,r:1,gradientTransform:"matrix(0 115.5 -163.251 0 200 141.5)",gradientUnits:"userSpaceOnUse",children:[(0,o.jsx)("stop",{stopColor:"#F2F4F7",stopOpacity:0}),(0,o.jsx)("stop",{offset:1,stopColor:"#F2F4F7"})]}),(0,o.jsx)("pattern",{id:"server-offline-background_svg__a",width:1,height:1,patternTransform:"matrix(18 0 0 18 0 283)",patternUnits:"userSpaceOnUse",preserveAspectRatio:"none",viewBox:"0 0 12 12",children:(0,o.jsx)("path",{stroke:"#A1A1A1",strokeWidth:.2,d:"M.1.1h11.8v11.8H.1z"})})]})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},ar=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:178,height:135,fill:"none",viewBox:"0 0 178 135"},e),r=r={children:[(0,o.jsx)("g",{filter:"url(#server-offline-foreground_svg__a)",children:(0,o.jsx)("rect",{width:74,height:97.5,fill:"url(#server-offline-foreground_svg__b)",rx:12,transform:"matrix(.86603 .5 -.86603 .5 99.136 28.5)"})}),(0,o.jsx)("rect",{width:78,height:101.5,y:-2,fill:"url(#server-offline-foreground_svg__c)",stroke:"url(#server-offline-foreground_svg__d)",strokeWidth:4,rx:14,transform:"matrix(.86603 .5 -.86603 .5 97.404 4)"}),(0,o.jsx)("path",{fill:"url(#server-offline-foreground_svg__e)",d:"M78.147 31.404a.9.9 0 0 1 .156-.559c.117-.178.295-.34.524-.478.228-.138.503-.248.806-.322a4 4 0 0 1 .961-.114c.33 0 .657.038.961.113s.578.184.807.322c.23.137.407.3.525.478.117.178.17.368.157.559v3c.014.19-.04.38-.156.559a1.6 1.6 0 0 1-.524.478 3 3 0 0 1-.806.322c-.304.075-.631.114-.961.114s-.657-.038-.961-.113a3 3 0 0 1-.807-.321 1.6 1.6 0 0 1-.525-.479.9.9 0 0 1-.157-.559zm-9.678 8.414c-.632-.015-1.23-.17-1.668-.434s-.682-.615-.682-.98c0-.366.246-.717.684-.98.438-.264 1.036-.42 1.669-.434h5.196c.33-.007.659.024.968.091.308.068.59.17.828.303s.428.29.557.466a.93.93 0 0 1 .196.555.93.93 0 0 1-.197.554c-.13.176-.32.334-.558.466s-.52.235-.829.303a4 4 0 0 1-.968.09zm38.106 11a4 4 0 0 1-.956-.098 3 3 0 0 1-.815-.305 1.7 1.7 0 0 1-.547-.463.93.93 0 0 1-.193-.55c0-.188.066-.375.193-.549s.313-.331.547-.463c.233-.132.511-.235.815-.304.304-.07.629-.102.956-.098h5.196c.327-.004.652.029.956.098s.582.172.815.304c.234.132.42.29.547.463s.193.361.193.55a.93.93 0 0 1-.193.55 1.7 1.7 0 0 1-.547.462 3 3 0 0 1-.815.305 4 4 0 0 1-.956.097zm-9.38 2.585c.017-.369.281-.72.74-.978.457-.258 1.071-.402 1.71-.402.64 0 1.255.144 1.713.402.457.258.722.61.738.978v3a.9.9 0 0 1-.169.552c-.12.176-.299.336-.527.471a3 3 0 0 1-.803.316 4 4 0 0 1-.951.11c-.327 0-.65-.037-.952-.11a3 3 0 0 1-.802-.316 1.6 1.6 0 0 1-.527-.47.9.9 0 0 1-.17-.553zm8.515-18.5c-1.838-1.06-4.33-1.656-6.93-1.656-2.598 0-5.09.596-6.928 1.657l-5.196 3c-.225.14-.495.252-.796.33s-.626.12-.956.123a4 4 0 0 1-.963-.102 3 3 0 0 1-.817-.312 1.7 1.7 0 0 1-.54-.471.9.9 0 0 1-.178-.557.95.95 0 0 1 .215-.551c.135-.174.33-.33.571-.46l5.196-3c2.757-1.591 6.495-2.485 10.393-2.485s7.636.894 10.392 2.485c2.756 1.592 4.305 3.75 4.305 6s-1.549 4.409-4.305 6l-5.196 3a2.9 2.9 0 0 1-.796.33 4.087 4.087 0 0 1-1.919.021 3 3 0 0 1-.817-.311 1.7 1.7 0 0 1-.54-.472.9.9 0 0 1-.177-.556.95.95 0 0 1 .214-.552c.135-.174.33-.33.572-.46l5.196-3c1.837-1.06 2.87-2.5 2.87-4s-1.033-2.94-2.87-4m-29.444 5c.224-.14.494-.252.795-.33s.626-.12.956-.123.657.03.963.102c.306.071.584.177.817.312.234.135.417.295.54.472a.9.9 0 0 1 .178.556.95.95 0 0 1-.215.551c-.135.174-.329.33-.571.46l-5.196 3c-1.838 1.06-2.87 2.5-2.87 4s1.032 2.94 2.87 4c1.838 1.062 4.33 1.658 6.929 1.658s5.091-.596 6.929-1.657l5.196-3c.465-.249 1.079-.384 1.712-.376.633.007 1.238.155 1.686.414.448.258.705.607.717.973s-.221.72-.652.988l-5.196 3c-2.756 1.592-6.494 2.486-10.392 2.486s-7.636-.894-10.392-2.486c-2.757-1.591-4.305-3.75-4.305-6s1.548-4.408 4.305-6z"}),(0,o.jsx)("path",{fill:"#000",d:"m108.005 6.698 3.211-1.854c.954-.55 2.247-.86 3.596-.86s2.642.31 3.596.86c.953.55 1.489 1.297 1.489 2.076 0 .778-.536 1.525-1.489 2.076l-9.589 5.535c-.317.184-.749.287-1.198.287-.45 0-.881-.103-1.199-.287-.317-.183-.496-.432-.496-.692s.179-.508.496-.692l9.589-5.535-2.398-1.384-9.588 5.535c-.953.551-1.489 1.298-1.489 2.076 0 .779.536 1.526 1.489 2.076s2.247.86 3.596.86c1.348 0 2.642-.31 3.595-.86l9.589-5.535c1.589-.918 2.482-2.163 2.482-3.46s-.893-2.543-2.482-3.46c-1.59-.918-3.745-1.433-5.993-1.433s-4.403.515-5.993 1.433l-4.394 2.537z"}),(0,o.jsxs)("defs",{children:[(0,o.jsxs)("linearGradient",{id:"server-offline-foreground_svg__b",x1:37,x2:37,y1:0,y2:97.5,gradientUnits:"userSpaceOnUse",children:[(0,o.jsx)("stop",{stopColor:"#D9D9D9"}),(0,o.jsx)("stop",{offset:1,stopColor:"#E9E9EB"})]}),(0,o.jsxs)("linearGradient",{id:"server-offline-foreground_svg__c",x1:37,x2:37,y1:0,y2:97.5,gradientUnits:"userSpaceOnUse",children:[(0,o.jsx)("stop",{stopColor:"#7D7E80"}),(0,o.jsx)("stop",{offset:1,stopColor:"#C7C9CC"})]}),(0,o.jsxs)("linearGradient",{id:"server-offline-foreground_svg__d",x1:37,x2:37,y1:0,y2:97.5,gradientUnits:"userSpaceOnUse",children:[(0,o.jsx)("stop",{stopColor:"#fff"}),(0,o.jsx)("stop",{offset:1,stopColor:"#fff",stopOpacity:.2})]}),(0,o.jsxs)("linearGradient",{id:"server-offline-foreground_svg__e",x1:72.75,x2:90.111,y1:33.874,y2:63.944,gradientUnits:"userSpaceOnUse",children:[(0,o.jsx)("stop",{stopColor:"#fff"}),(0,o.jsx)("stop",{offset:1,stopColor:"#fff",stopOpacity:.5})]}),(0,o.jsxs)("filter",{id:"server-offline-foreground_svg__a",width:176.348,height:118.721,x:.786,y:16.015,colorInterpolationFilters:"sRGB",filterUnits:"userSpaceOnUse",children:[(0,o.jsx)("feFlood",{floodOpacity:0,result:"BackgroundImageFix"}),(0,o.jsx)("feColorMatrix",{in:"SourceAlpha",result:"hardAlpha",values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"}),(0,o.jsx)("feOffset",{dy:4}),(0,o.jsx)("feGaussianBlur",{stdDeviation:10}),(0,o.jsx)("feComposite",{in2:"hardAlpha",operator:"out"}),(0,o.jsx)("feColorMatrix",{values:"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0"}),(0,o.jsx)("feBlend",{in2:"BackgroundImageFix",result:"effect1_dropShadow_4624_2901"}),(0,o.jsx)("feBlend",{in:"SourceGraphic",in2:"effect1_dropShadow_4624_2901",result:"shape"})]})]})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))};var an=r(4707),ai=r(6820),ao=r(9870),aa=r(9877),as=r(5528),aA=r(638);let al="Auto dismiss keyboard",ac={aiAct:{group:"interaction",title:"Auto Planning: plan the steps and execute"},aiTap:{group:"interaction",title:"Click an element"},aiDoubleClick:{group:"interaction",title:"Double-click an element"},aiHover:{group:"interaction",title:"Hover over an element"},aiInput:{group:"interaction",title:"Input text into an element"},aiRightClick:{group:"interaction",title:"Right-click an element"},aiKeyboardPress:{group:"interaction",title:"Press keyboard keys"},aiScroll:{group:"interaction",title:"Scroll the page or element"},aiLocate:{group:"interaction",title:"Locate an element on the page"},aiQuery:{group:"extraction",title:"Extract data directly from the UI"},aiBoolean:{group:"extraction",title:"Get true/false answer"},aiNumber:{group:"extraction",title:"Extract numeric value"},aiString:{group:"extraction",title:"Extract text value"},aiAsk:{group:"extraction",title:"Ask a question about the UI"},aiAssert:{group:"validation",title:"Assert a condition is true"},aiWaitFor:{group:"validation",title:"Wait for a condition to be met"}},au=["aiAct","aiTap","aiQuery","aiAssert"],ad=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"web page";return{type:"system",content:`
|
|
944
|
+
Welcome to Midscene.js Playground!
|
|
945
|
+
|
|
946
|
+
This is a panel for experimenting and testing Midscene.js features. You can use natural language instructions to operate the ${e}, such as clicking buttons, filling in forms, querying information, etc.
|
|
947
|
+
|
|
948
|
+
Please enter your instructions in the input box below to start experiencing.
|
|
949
|
+
`,loading:!1,result:void 0,replayScriptsInfo:null,replayCounter:0,loadingProgressText:"",verticalMode:!1}};ad();let ap={result:void 0,dump:null,reportHTML:null,error:null},ah="data:image/png;base64,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",af="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFARIAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAAABaAAAAAAAAAEgAAAABAAAASAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAYKADAAQAAAABAAAAYAAAAABaCTJNAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNi4wLjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoZXuEHAAAZfUlEQVR4Ae1da5Ac1XXue7tnHzMrYSMMEqyMYB/CCOyEhTjxH9YYk0p4GEsBJxTgFNjalYDEruCHMAkjEsd2gsu4AD1DUrYpUoZgy4iEAhNbqiRQDpIxGAGSdnmYt4wgknZmd2em++b7TnfPzvZ0z660u3rNXGmnu2/f53fOPffccx9tWQ3XQKCBwEFAwFiWOgjZNLKIQ8BkLR3nf7j6mcss+0grcxWW5HipSMD5ZumpxxyJlWIdqio3jR4zwpksNOSNUfdbLq/5ZZ2/n9fq+jffOLFlGss+I0mRcYb7O1fl+zuu5z3rYLK9zkwxz7TLZRZUZS2Phc8v6zhLGbXC0WpJCT6uZX1m1pqB+4RAqNiMIHiAiYblHlreeUGLUo/YWln5krfBuN7ftK178ddMdibKPW0twBiInAD8kWULF4KDbkqn7C2tjlpS9IxhhZDZZXuXdh9Hrsoepv2C8qwbUVRruOgV0yl9qdL66Vx/11/nb+hs91uDpVnXA6RzVbRpIYBwhoLIAefn+zr/xDXuf6MBrEQlyEXkdDQI/LesT2lV+ghvbtk2fZVgelNxFDEsO4C+COmcP1IyLK2TL7gUoSrdpG41RevxfF/XYoZTqCvrPJU8w7hTJkDYLFmJXF9Xv6esu1tsdRwy0MZjPRQLqiGC3CZbpbSyV5ilPamQm8KCHKorC6iymwA5GcL0pZu0wn0J5SH2Nu5NvuCVUPb5tm09kO/v+jLLKuWfBiJMqSmF4O9Z3tFpe2p9Jm335vMi2j2/AuO43HM0CWG9Aw5anl49cL9UPmgarNShcKHYHOrr+mSTbT0KccmyxzGmC9FkQ/yQqx6ybe+vWu56cUeIwYGWPS6jSaUlzRayfN/nOxfZrvr3TJPuzefcQhCZ6UaJK60AHHYcuoTFUvFDDD7LSpEiV+V9AQxSy9nQI4i/l27WF3muepB191tyr1MrYq13tbNMiLmFIgTNdmRZ9/kQME8026qbzRSQNyVECbyVGkW/0Kz1n+be7ryCniRE7Tgz9zbMO7es68J0k/3HwyUDCVrT8bXKj3rFlK0Xatt6XDAAFsSkZsyEl/tdeXL+2eu2FpkxWutPIDJnFfxmW4sLwDiWm3aUhrDdPeqZzZC0m6VMWb93TijfzHrfEuSt3F35orcRHZSGrCcmbBXSMmIKQCKkCq7xEH42MSAWxITYxISv6TUBwcfHlc4TGQ2R8433IPT7VnSuSTIzjFxEJilUzBpxzbvo4a5Jv9v8sLp/WyiuwnCH5EqVUrQatMShtzp6taXWQv3sHEVn5RohQi0mRb8GpvLMsFH6krbVOx4LMZpsZSZNAJH5aGq55aeeozy9GXo9wKeKKVpOfH7KKkHmO6MFzwLnr8jMbb+NoouB0SRQ70PI/RUlruxI74Nmc+Gcjq8qS33Nr6OhVlFD5TSuo7XtkgjaOzez6sUnQ6wqski8nRQBWKjL0eFygAVtcgNk/mng5loFo8gxUEf1qGv+x1M6S+5gKchxK1ei7ws6v8SSHeQXZAjrMozigxH60NJTz8Qg7F4w0BkQTyWwComQhJeLutqo6wtQsy9tWb19e6hdTVSNpATL8ULuGLnu1O6SpzdmHN2NAiWDzzEMBioouEa4DWn3mMtVIB9D7i8nfpjehHUe+twpJyjHXoe6XAIlg6KWeCVh5kJ02bmCt8PT7iWzV7+0PUynVjVryTfh1pAjXFd/G6omwafsTmqS5HwLBdEYBd+TzqSvJPjbLlvUdKSAz/KLagmtpu2fXno7nUtfIXVBnQKBKXVkuIiz2VIyKdWtjb1x73WnzfFV1NpaXk0CWBAVzISjP9xcBPWLXJCkbonYSbdolSu6/4CB1lXqtmdybIqLDpMONwJYzUdptRC96gfP5FgXqRPqhkhSz4TITr5kCplWu8v2ikskzAQml6TmVLb80f7BITgGTzRxMvPqOPBHj+q1NqMJjnjfals78FVmHmoYUpAj9KeyDkN9nd/MtOiv5EeAhI9CNRZBPfFin1Hm6szqwQ21RFFsCwgjDC1fMBeJ3E66+9bkGPDJEZD5BH+44IMPKvmWUfgfobiXix2qqKwTGSs3itaNwQ8CsG5J9fNgBZ4Fs90dxFBEUYLdqIoAzGjlIj9hbVI3YfA0v+DW6HRRCJH5AB9NVTjfytLAlTiQKVfuSLmRuqBOLG/bmsGvDJfQv0HJwGMSATREUSmdUu3EUOp5vz9HIvcVP5JoxXNZ9OT6Tj0bw/Mn8wU2QglRFRa+yERD7nkbMqsHPs1QJCACJhVMEjpSf0JxZG78cCa/L39PS0pdOiLm9tixkAhsmLIVzNrnZNa+uCWULJX1r2oBbC7U+wHjTQIjZDsiJINfdF/2RqylTJTxjlbwWb9QHFG5wGj+M6MlsxlMyjoX+T7iMJYLpYBawXfENhJmvIpECjEARoLXpB39aTQjgl+tcvqdrjPqeszh2ln/MvBbDsE5WItmcLQ9UxztvKGzWUwpRq1l/dDciVFcq4dqaizHVosL/Z2/K2EjxsdyCxDRAQDNF9tbQavr0OkmO3Su7IdgLlkxa83gz2ToDX0/OcLR9abrjoFRqtfptTv/FQO0LLBI7A/QOlxihcHT1ytQKEuU8k1ov8j1d3y+2dbrMKwORU85TJCAR6tmrmgehVbwhxWJ1tWtMCy4nlIjP6dzFzA5NpAYZaYWQCAtbFj4YNjLK22uSa8a/GEYl+8lsHQuMJLtuXbRseD+Pgo1po2fKPjSLmDS56vb+BuKLd7XkwMwhq1A5DosvLmS2c0ZP2Ag6JSxQE8A8KmspD1PrTBfWPA+xoUtTLD3qXW5/5BqGu3GbE8PVSgAXC37adOH+oVpu4cya3eKcc2CelXOrM5uVgb1Tc9rfhhM/iub+p/PuFEkaKbgZM+H86N2B1+eHoyQfQLc54MI9j7P70oMU4o6emKlAHsHtRb34ACsJsA1GrBenmnRFdUyuw2ouN+A2C7SNI36R5lS4JIBnLGuJz6hwqKJJtWrfH/3SZgs+QtOGcLLJwxDjjnTmkI6lvVYZs3Oh6T5Bbb9sSD1dxcOWj3jPA10NtBkAydAjUdD6QK0Frz6RKW/5qiVHp5yz8cExAmQV3RVCcAD5mVDxVRkv4Rq/FhhK5i9bsc7rjEP+GKoGj9iSvwxgzYfxk0x1JGJtRXIImX0xylP4KLNh34GEXndljlxQGT/0WRqYMWm4sIBVlvR+Q/0j7t8JSZWNHNtFCyX5kuSH7CXXnxvX+cfQFtazNVJCc5L+dL+lw3g4xESkfzP2/eBV29ubhIJHjcoVZi6ZK95ItdSkXASMqXUQkypzQom2KPih52vjUmJnNHu7cyemcUXo459A0li22YzzNWctHIIVQQRhY6aXvNTRsnIWID0lOm2U2WqRQlQam2xofKY+9tWv/SMgJ+tSjiSTx0+Bup4c1PhVXAsbERlPCvBoKJaSLfaXHHxO3whoaD9tFN9jSIvMcWkBKp5agufn9u2qK5VT8Ek5gfYYVSMqdfvvDYMPDfEBBEvEEdziQi61LNp9tH55R3zgfxHS/AEzNHBFz0dTEVSDO1iCqcv+kBcJ52UX535bxO5j0HZsxgv7UF/6wC/8WIIfA5pQuF0rJVLZ7CgBTM3xjoFK70IVrQRcGkJfQc9p/RfPpqbGgSYgK1c29oLNEc1BU50VhDMjyU9NG1/aNQuztEFS50GGZ9CmjA/VBNA++pnrm3Vy28hUYVxg1BqgjLU52vOegHbtlU7fwXo30z5+uh4vCDSEabU2mxnisY5A/h6FxgZocVqNqAf45unBNFsL5Mcn2B9Qh1ba8FmZa8vxpW1xceuiqkZVxNzrHP5BDrhWKObnwGoSckEou0Wj22bGuD7yNT4DUS0Mb+gqIETRSc+gkqTACcmTb5ATikmAjpskgSCyfr4xBq+4xAwyrecjfMc/4ANRAW0AnOyT6iYpsI+BBNfReW9KVFvaYif8RBWP60MvLRtngeu8fsNwNGU+uD+0zmZNgSc4yU7WxB6bW3Z6SDdxmUCBG4JmNS4akTQE3AjkQI/XFrYAj4IKx4FfZWjFgVXShn9qtzFhBH/xs8YAgFGBdd+C57cZRnriDn+nahtrecliaAgstsyd+5rTAXPjU44Fs4xzxCjY3QbMUsigGK/C9P1PO7uiJdTFWm+Pfh889hj4246EUALqKUmSVbmhNZ2WvcabhIIhMJ8ROdOQnDuM45zhuNbjNre1J5ntoMIdFVhA5tD6j373Q8FAQKpJOEbP3EIBChCc5yP146MY6PhEMafOVOvYk5YjdDgmewMtoun/FNOqkiUHKve32CLXx6werHQhh0F9lqQ99/wTRbVLcD3UbajvLkC6MrY5Ood6/H1DzCC5jgP3E9raKLDK9kb/rpvb6sOx7gkDvbFtFe/bfjEIhDOsSvrXFqSRdusDog5dmqV5llcMGSoDhD6eJxEBoF6xCNIPHzZuCYjAB3/eJEsUXO0RDFGrMxK/a/GDMIjwuaxqyEM9h9LD7FQ4r2/x++uk/NtvAkxMlYHORcMHiOEMGeGV8D+dYyE1Vs0+OA5LqByxRhntQ9/buEp/nbTCdXWuiUCAFTE6LfXLOQk1/uMWDkDe0IMKrbRr+gmY+3Kj7hvYFEWJ2Wis11KViJa1jzPds9gGps29TZaQQyY9Nq6tIcrIazZTd4FgH0RDv/g43gJD9mEd5jmdfOYms9jRkzvQaA3/EURVa2AEmw0nXGakMxZTK39zNei88b0bjgg0PPeVmFgbKs/A5v0iAnniMcTAKopO2f8e67JTr2puaQODecJnGXFCNEWAHJhoh5nPSBGj/nzBS2yOSGaKGPWuRPxM7ZD6MzkfhUmamANXDequ17YHYgT8xhOumJ7oRiSdlPGE+boIl8Zc2bOUceIfzZC1XLgOr4JMMkv7foo0PoktuwSSRFJFagQW9v134mBUwjgKvMO3uyRUQGDjHfcD1BKtzgLQLlPjX/VeIoi4GpzVqbFng3dhwdYjRc/IAk3cYy43nvQg55nXFypA1km19+5Bbs4erCRgHKrSs5To0KnvmskZXXNuWNgbzTjxrOPQK6v88EWR12MqVyK84jCYnCgh81lnk+k1wx8jPsrNI9oYVQopnfiBW+rwKcnNSqcEHV8U8H8EZ/rdWsS6x514VrZERz6CsMmwWeQCPjgdPK6PzT+uaSBRQ463GKktfef9Iy2GQno/0Ct5ZI6tWRff8fxXNmLxxrBK2LWyS127d6Is5RYW+HkSLW5WY876H+DyfjvyjusI6JkEXJh996rwPPHrb42RDEUddRf4cxiR9vd8jJcAxMNWUfP/u7SsUNfY3V/Hw9DEzSawCvY2ivLPIm9NBPZGY9AOAPrVvQBDE6ohTB8CBzP/Cymm20cz+VdKH51vk4IAPmHvmYpbqKHvoawhVf/+GYYd75Hn1BsCQGeC9b7ZJzRV/DuKR6+gWt1K4BaxfPf4Jbv4zG+FEOSOb3q0AX9Jw/7Q/94UXCqVkwfis4XYgPMvTVftO+rRIqcLk6oCcIM9XVcjV17d0M2OTBDU8qXwwRBeRQL94u9m3l3wO8LyAnVLSYIfnRfgo3aL0D246RF6RWjeFGSGLzH+Xne0syawfXhpngiIy1AIAqoaTveZoT314JGk5KAluYBp0jwWOwQv1m8slVE8kMexb8EkdUbmdP5JUiMTjlZoJpZGcSQYfH+6XTr6D30sLKbytKlTABfnPQ6rXe99AqCrJdl6clcTSOdh10gWZyo9WfcN8YDLCTxOviRjRjYogtt8Dw0/W9U9JvVtYcM8bVScxc3b8i+4gpcywRgzPBgPdPsPQh16Sc8EwLecSoVRY5PRWX6WKDwAIvqEhxdPgIgzsAz+A4CwLm7WcwHsUv7WXGv2VGqUDLbcHjT9+lBRuc1dOMIQE9m0Pbdl962jPd3AeWi2pDEhWeK5+sjg3Pzx47+kIcYsSUczWMD1k0kxVU4sEl7d2NUuwDcz30VUZuPQAmMBF+sQfl7FZywIuBV/FQRgAMzEoEnPGHXzL3pVoe9esK6IGXjYwc8TfzS4Vx+DdNF05BDLCryOCpuqe2xbqzMcFt+DcTvJfmiS26OAx/exsvAJA3Zf2fb6p33ImLs5pYqAkC0GGtRr3S/yHAdrKQFaERN8JXMWYCIw5FcHjQjfeVQf8e35F326CKCqNqoE+vGOrKuvsoZe6QDg8HmD7WzZF41uvR1esipvMQ24gToiJ88+rIO3wfAtnpHmX9LUEnDqEIeOTO0cWwlYYawwpJPoy/HoU4/CrEMwaq8VrWA8GU4yJq1ZucD6IVvxd5WEqsYvo9cRQHjwa48VzNsCSKOgmPQIuGPiMdKscM6yZmhPLzWZ9sk5i36WKnvCfhBv5FU4UQCVEZIO9a3h0fcndCKOGHDTifOsUCKh5pmUvaX8e2wHxh0VkJIaElxEQ5nPzkXjkoFT0hEXaROPLCVstz/iyt+Cf1hKjfs/hxm+y9KgCQyBbFrEkC0GnAwevC9JeVejGPKdmDQwU5nnCpVURLJDpqBB6PelflM/l6qazzgLhy4VIQ9LG+BsBw6K2o1GIfHU0pdUKcJON/D2XAOTg7e4dpmKedMRPTEyP3Kik9AHz+oNEVww/4dXw/tCJMP0BRehgi7lof7MTUWipoWMq7qkCoLdijuw3oybw4wQYo+qtnU9OBFrJLwIvgag9O9mM762Kz1A9tqyX2mH7qkBMP35Wtovygs7z4HH274GeR7GxokW0KM8akcTQ525dcooEOvaNk98I/hQCRMrxzyEN3IuIVmdVh2fXEph/DdzFE+i8SxDnCvVUcXvSM/8LMP5wksaVu786eTBZ/pT5oADBx+niO3rONSTOvjcCJLY7BG7qglymSgAtFlQTQNgBR9bXMHN4l4g27NdHnP68F2UaB4UDnKt552LppaUB7+Jej5Ulr5tBXAh3gyS+Sgbn7gaD+O8Nw/AgArRPCPajyu42J8J/L7MMOGH/GpRQSKG7EIshvjoX9Iai2PPpNq8GVADCvLFRszI54o35G+1DkkOmf3OMHEOQ68WAbD2TE0NqJIDCdhwzJGruFXM4ZwANNV6XcGN0oLQhxEmrR4rZVBJL/qR378TGGMAPk3GxyTNCQfiyj6cfB1DUTAi8cwTXdby6qBR8cCofToJ7ZijWXPuq2l/alMZRrhPQnL1XxcUMaONfTffUPnbM5vc4oVOS7mRBPnOibRopmEiFbMob+AVbZXZ1bteDJMd3+vB0QA4SQsw2NTk4+ZaetH0JG7+X0tFCBVqxBEHZkSWIerxzBUtzCXuhG98sP4Gt8v0+t2/qIyPsWeFaw4szhxdEvAXUgA/8ucJmXi08qAa7mSG0SsFAdcWMa1TbK8xqi/5SIDMV6xQJjtQ2oOYuGppitSHadGiJZziXwvhmU8QGaZKLOaJQllqHzK0FXr8OWIj+eHgahvM6klkpgu4eKfpulbo4/Ijbh7UaCfwu/XQOLZvQX96AfkGDD4HKDjomJZ18qllVxmjwVmXOM0MurKSg8kWy5HzSz81mulUViOiaiWy3dieHTnFE6PnBIBWOCQCGzSLUXrO/D5LO0gWHxE7YFEmEwe0uFBeDqtPGkKNOTkNjQU8vH/4W8QjLkLz5u5a58bx7l3mdtnuYOTmwi5j41bqbibBxp7O+xXPch4IdBtRxnmyfpWiBiu8uNCM7zjBrrJlI3V9O1huEFBb+XAlGMjirewL2GgA3GTLUDNtEMiMBA1CX51A810Po7zZQ0J7kStwU/f5zL2JQxvIw3cMQWIKaBFcYUE+Ukpvmc4qsGsA15Q9LH/VnKePDeWcG8Dl9dLd4NFxghEdZJxJ1ceKbsxtAjTKInv2F5B0wzilxmP91NxLPy0OIGGPxA/8tkOz/ka1Dk5JTaYKyVIzG+yeTI8/sD3kip+KJ+D2NGEgsB+DL9GIHwQd//zZQoGDKCpKoDw9yLvda2rBzaT6/lyqpzPNOgmC4YfehK/la1haFnXFdgSflOToxaBISlWQlBqDWwmkYsfhKBPYwXYXHHYFbaWIl32S5wV5MQU50aYY2Xd+DwdbhrLP1YcFjQ0NxjMFWMFxdWA6jq0iI+QEPzKNlhZ1qUi1oyUYaw0k7pzKdYw+lX+DJcsSljPqVnODkp9MEcylc42qRQzVnlwkQx6wqbKEwLzw81XwrsPo+IeHmDKtY38CId0t9iNFpBixsoUgMCehqVj30R+sLgaEMDz9VM4UO92rgwJFicI14fMxADT7Wa6slLeyqbL/VPplHs5+P+zaPMnQ85+kCIeX2qiLk4U2LFiBwP+yhJ/ytVmuoSd1xTn0ZswAsTXkMQX5fgxVwVyYZpa/Zv3mNvBslUdFAJIhaRF9NqVzZhmAKD8l3h/HtgSp/fq99tQQw24UU7q4hp7caLdsKzR8lY+E2C68Mp7Ao7d0MoBk1sKyHOcggB7QPNBAH8nFyVzXSzD0eHduI96+r4z91tZgZnLpSLlJC0iz/OrcZQjqt+OzuFiEOR0mAf8g6KACs60YAsRx0ITRsou3EodwNC4gVkST9RcfU/eoDPFJkSEewP3TwDix9ySeWf2+sHHJbHgh+tjuUQzm/WJVvluJu+lnDOZQa20Q27jIoDKlmHwIcyCW5znYijgKu9kaCYnQaP8PXDsGSgwW0URQM7nWUc8bgegQ1002/Gep1QR7NfxnnbkRzA0eIs7QbkZUfbDBQUq532I5yb+H8lGaZooTb2GAAAAAElFTkSuQmCC";function ag(e){return"object"==typeof e&&null!==e}let am=e=>{let t=Math.round(e.center[0]),r=Math.round(e.center[1]),n=Math.ceil(4)-1;return{left:Math.max(t-n,0),top:Math.max(r-n,0),width:8,height:8}};function ay(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}let av=(e,t,r)=>{let n,i=(n=e.width/e.height>=t/r?e.width:e.height/r*t)>400?.1:n>50?.2:.3,o=Math.min(t,n+t*i*2),a=Math.min(e.left-t*i,t-o);a=Math.max(a,0);let s=Math.min(e.top-r*i,r-r/t*o);return{left:Math.round(a),top:Math.round(s=Math.max(s,0)),width:Math.round(o)}},ab=(e,t)=>av({left:0,top:0,width:e,height:t},e,t),aw=(e,t,r)=>{var n;let i=null==e||null==(n=e.uiContext)?void 0:n.shotSize;return{width:(null==i?void 0:i.width)||t,height:(null==i?void 0:i.height)||r}},aE=e=>e.map((e,t)=>({execution:e,index:t})).sort((e,t)=>(Number.isFinite(e.execution.logTime)?e.execution.logTime:1/0)-(Number.isFinite(t.execution.logTime)?t.execution.logTime:1/0)||e.index-t.index).map(e=>{let{execution:t}=e;return t}),ak=e=>{var t,r;let n,i,o,a,s=e?Array.isArray(e.executions)?e:{sdkVersion:"",groupName:"Execution",modelBriefs:[],executions:[e]}:null;if(!s)return console.warn("[allScriptsFromDump] dump is empty"),{scripts:[],modelBriefs:[]};let A=(o=s.sdkVersion,a=[],(aE((null==(r=s.executions)?void 0:r.filter(Boolean))||[]).forEach(e=>{e.tasks.forEach(e=>{var t,r;let o=null==(t=e.uiContext)?void 0:t.shotSize;if(o){let e=o.width,t=o.height;n||(n=e,i=t)}if(e.usage){let{model_name:t,model_description:n,intent:i}=e.usage;r={intent:i,name:t,modelDescription:n},a.some(e=>e.intent===r.intent&&e.name===r.name&&e.modelDescription===r.modelDescription)||a.push(r)}})}),n&&i)?{width:n,height:i,sdkVersion:o,modelBriefs:a,deviceType:s.deviceType}:(console.warn("width or height is missing in dump file"),null));if(!A)return{scripts:[],sdkVersion:s.sdkVersion,modelBriefs:[]};let{width:l,height:c}=A,u=[],d=aE((null==(t=s.executions)?void 0:t.filter(Boolean))||[]);for(let e=0;e<d.length;e++){let t=ax(d[e],-1,l,c,e);t&&u.push(...t)}return{scripts:u.filter((e,t)=>t===u.length-1||"Done"!==e.title),width:l,height:c,sdkVersion:A.sdkVersion,modelBriefs:A.modelBriefs,deviceType:A.deviceType}},ax=function(e,t,r,n){let i,o;if(arguments.length>4&&void 0!==arguments[4]&&arguments[4],!e||!e.tasks.length||0===r||0===n)return null;let a=[];if(-1===t)a=e.tasks;else{let r=e.tasks.findIndex(e=>e===t);if(-1===r)return console.error("task not found, cannot generate animation scripts"),null;if(r===e.tasks.length-1)return null;for(let t=r;t<e.tasks.length&&(!(t>r)||"Planning"!==e.tasks[t].type||"Plan"!==e.tasks[t].subType);t++)a.push(e.tasks[t])}if(0===a.length)return null;let s=(e,t)=>{if(!t)return e;let r=ay({},e),n=null;return Object.defineProperty(r,"img",{get:()=>(null===n&&(n=t.base64),n),enumerable:!0}),r},A=[],l=!1,c="";a.forEach((e,t)=>{var u,d,p,h,f,g,m,y,v,b;let w=null==(b=a[t])?void 0:b.taskId;if(o=w,0===t&&(c=oz(e)),"Planning"===e.type){let t=[];if("Plan"===e.subType){let r=(null==(d=e.output)?void 0:d.actions)||[];if(r.length>0){let e=r[0],n=["locate","start","end"];if(e.param)for(let r in n.forEach(r=>{e.param[r]&&"object"==typeof e.param[r]&&"center"in(e.param[r]||{})&&t.push(e.param[r])}),e.param)!n.includes(r)&&"object"==typeof e.param[r]&&"center"in(e.param[r]||{})&&t.push(e.param[r])}}else"Locate"===e.subType&&(null==(u=e.output)?void 0:u.element)&&(t=[e.output.element]);let o=oT(e),a=oz(e),c=e.uiContext,h=null==c?void 0:c.screenshot;if(c&&h){let{width:u,height:d}=aw(e,r,n);A.push(s({type:"img",duration:300,title:o,subTitle:a,imageWidth:u,imageHeight:d,taskId:w},h)),t.forEach(t=>{var r,n,p,f,g,m,y;let v,b=(r=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({},t),n=n={center:[Math.round(t.center[0]),Math.round(t.center[1])],rect:am(t)},Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(n)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(n,e))}),r);p=ay({},av(am(b),u,d)),f=f={pointerLeft:b.center[0],pointerTop:b.center[1]},Object.getOwnPropertyDescriptors?Object.defineProperties(p,Object.getOwnPropertyDescriptors(f)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(f)).forEach(function(e){Object.defineProperty(p,e,Object.getOwnPropertyDescriptor(f,e))}),i=p,A.push(s({type:"insight",context:c,camera:i,highlightElement:b,searchArea:(null==e?void 0:e.searchArea)??(null==(m=ag(v=null==e?void 0:e.log)&&ag(y=v.dump)&&"string"==typeof y.type&&ag(y.taskInfo)?v.dump:null)||null==(g=m.taskInfo)?void 0:g.searchArea),duration:400,insightCameraDuration:800,title:o,subTitle:b.description||a,imageWidth:u,imageHeight:d,taskId:w},h)),l=!0})}if(e.recorder&&e.recorder.length>0){let t=null==(p=e.recorder[0])?void 0:p.screenshot,{width:i,height:o}=aw(e,r,n);A.push(s({type:"img",duration:900,title:oT(e),subTitle:oz(e),imageWidth:i,imageHeight:o,taskId:w},t))}}else if("Action Space"===e.type){let t=oT(e),i=oz(e);A.push({type:"spinning-pointer",duration:300,title:t,subTitle:i,taskId:w}),l&&(A.push({type:"clear-insight",duration:200,title:t,subTitle:i,taskId:w}),l=!1),A.push({type:"pointer",img:ah,duration:0,title:t,subTitle:i,taskId:w});let o=null==(f=e.recorder)||null==(h=f[0])?void 0:h.screenshot,{width:a,height:c}=aw(e,r,n);A.push(s({type:"img",duration:500,camera:"Sleep"===e.subType?ab(a,c):void 0,title:t,subTitle:i,imageWidth:a,imageHeight:c,taskId:w},o))}else{let t=oT(e),i=oz(e),o=null==(m=e.recorder)||null==(g=m[e.recorder.length-1])?void 0:g.screenshot;if(o){let{width:a,height:l}=aw(e,r,n);A.push(s({type:"img",duration:900,camera:ab(a,l),title:t,subTitle:i,imageWidth:a,imageHeight:l,taskId:w},o))}}if("finished"!==e.status){let t=oT(e),i=e.errorMessage||"unknown error",o=i.indexOf("NOT_IMPLEMENTED_AS_DESIGNED")>0?"Further actions cannot be performed in the current environment":i,a=null==(v=e.recorder)||null==(y=v[e.recorder.length-1])?void 0:y.screenshot,{width:l,height:c}=aw(e,r,n);A.push(s({type:"img",camera:ab(l,c),duration:900,title:t,subTitle:o,imageWidth:l,imageHeight:c,taskId:w},a))}}),l&&(A.push({type:"clear-insight",duration:200,title:"",subTitle:"",taskId:o}),l=!1);let u=a.length>0?aw(a[a.length-1],r,n):{width:r,height:n};return A.push({title:"End",subTitle:c,type:"img",duration:200,camera:ab(u.width,u.height),taskId:void 0}),A};function aS(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function aC(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){aS(o,n,i,a,s,"next",e)}function s(e){aS(o,n,i,a,s,"throw",e)}a(void 0)})}}function aI(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function aj(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function aO(e){var t;if(!e)return"";if("string"==typeof e)return e;if(null==e||null==(t=e.dump)?void 0:t.error)return e.dump.error;if(e.message)return String(e.message);try{return JSON.stringify(e)}catch(t){return String(e)}}function aP(e,t){return e?Array.isArray(null==e?void 0:e.executions)?ak(e):e.tasks&&Array.isArray(e.tasks)?ak({sdkVersion:"",groupName:"Playground Execution",modelBriefs:[],executions:[e],deviceType:t}):null:null}function aR(e){return"aiAct"===e||"runMarkdown"===e}function aT(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}class aN{initDB(){return new Promise((e,t)=>{let r=indexedDB.open(this.dbName,this.version);r.onerror=()=>t(r.error),r.onsuccess=()=>e(r.result),r.onupgradeneeded=e=>{let t=e.target.result;this.storeConfigs.forEach(e=>{let{name:r,keyPath:n}=e;t.objectStoreNames.contains(r)||t.createObjectStore(r,{keyPath:n}).createIndex("timestamp","timestamp",{unique:!1})})}})}async withTransaction(e,t,r){let n=(await this.dbPromise).transaction(e,t);return r(Array.isArray(e)?e.map(e=>n.objectStore(e)):n.objectStore(e))}promisifyRequest(e){return new Promise((t,r)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>r(e.error)})}async put(e,t){await this.withTransaction(e,"readwrite",async e=>{await this.promisifyRequest(e.put(t))})}async get(e,t){return this.withTransaction(e,"readonly",async e=>this.promisifyRequest(e.get(t)))}async getAll(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];return this.withTransaction(e,"readonly",async e=>{let r=t?await this.promisifyRequest(e.index("timestamp").getAll()):await this.promisifyRequest(e.getAll());return t?r.sort((e,t)=>e.timestamp-t.timestamp):r})}async clear(e){await this.withTransaction(e,"readwrite",async e=>{await this.promisifyRequest(e.clear())})}async delete(e,t){await this.withTransaction(e,"readwrite",async e=>{await this.promisifyRequest(e.delete(t))})}async count(e){return this.withTransaction(e,"readonly",async e=>this.promisifyRequest(e.count()))}getDBPromise(){return this.dbPromise}constructor(e,t,r){aT(this,"dbPromise",void 0),aT(this,"dbName",void 0),aT(this,"version",void 0),aT(this,"storeConfigs",void 0),this.dbName=e,this.version=t,this.storeConfigs=r,this.dbPromise=this.initDB()}}let aM=async(e,t,r,n)=>{try{return await e()}catch(e){return console.error(t,e),e instanceof Error&&"QuotaExceededError"===e.name&&n&&(console.log("Storage quota exceeded, running cleanup..."),await n()),r}},aD=(e,t,r)=>async()=>{try{let n=await e.getAll(t);if(n.length>r){let i=n.sort((e,t)=>e.timestamp-t.timestamp).slice(0,n.length-r);await Promise.all(i.map(r=>e.delete(t,r.id)))}}catch(e){console.error(`Failed to cleanup ${t}:`,e)}};function az(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function aB(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){az(o,n,i,a,s,"next",e)}function s(e){az(o,n,i,a,s,"throw",e)}a(void 0)})}}function aL(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function aU(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){aL(e,t,r[t])})}return e}function aK(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}let aF="playground_messages",aZ="playground_results";class aQ{saveMessages(e){return aB(function*(){yield aM(()=>aB(function*(){yield this.dbManager.clear(aF);let t=e.slice(-100);yield Promise.all(t.map((e,t)=>{let r=aK(aU({},e),{result:"result"===e.type?void 0:e.result}),n={id:e.id||`msg-${t}`,data:r,timestamp:e.timestamp?e.timestamp.getTime():Date.now()+t};return this.dbManager.put(aF,n)}))}).call(this),"Failed to save messages to IndexedDB",void 0,this.messagesCleanup)}).call(this)}loadMessages(){return aB(function*(){return(yield aM(()=>aB(function*(){let e=yield this.dbManager.getAll(aF,!0);return 0===e.length?[]:Promise.all(e.map(e=>aB(function*(){let t=e.data,r=aK(aU({},t),{timestamp:new Date(t.timestamp)});if("result"===t.type&&t.id){let e=yield this.loadResult(t.id);e&&(r.result=e.result,r.replayScriptsInfo=e.replayScriptsInfo,r.replayCounter=e.replayCounter,r.verticalMode=e.verticalMode)}return r}).call(this)))}).call(this),"Failed to load messages from IndexedDB",[],this.messagesCleanup))||[]}).call(this)}clearMessages(){return aB(function*(){yield aM(()=>aB(function*(){yield Promise.all([this.dbManager.clear(aF),this.dbManager.clear(aZ)])}).call(this),"Failed to clear messages from IndexedDB")}).call(this)}saveResult(e,t){return aB(function*(){yield aM(()=>aB(function*(){let r=this.compressResultForStorage(t),n={id:e,data:r,timestamp:Date.now(),size:JSON.stringify(r).length};yield this.dbManager.put(aZ,n)}).call(this),"Failed to save result to IndexedDB",void 0,this.resultsCleanup)}).call(this)}loadResult(e){return aB(function*(){return(yield aM(()=>aB(function*(){let t=yield this.dbManager.get(aZ,e);return(null==t?void 0:t.data)||null}).call(this),"Failed to load result from IndexedDB",null))||null}).call(this)}compressResultForStorage(e){let t=e.result,r=null==t?void 0:t.dump;return t&&r?Array.isArray(null==r?void 0:r.executions)?aK(aU({},e),{result:aK(aU({},t),{dump:aK(aU({},r),{executions:r.executions.map(e=>aK(aU({},e),{tasks:this.compressExecutionTasks(e.tasks)}))})})}):r.tasks?aK(aU({},e),{result:aK(aU({},t),{dump:aK(aU({},r),{tasks:this.compressExecutionTasks(r.tasks)})})}):e:e}compressExecutionTasks(e){return e.map(e=>{var t;return aK(aU({},e),{uiContext:e.uiContext?aK(aU({},e.uiContext),{screenshot:e.uiContext.screenshot}):e.uiContext,recorder:null==(t=e.recorder)?void 0:t.map(e=>aK(aU({},e),{screenshot:e.screenshot}))})})}compressScreenshotIfNeeded(e){if(!e)return e;if(e.length>1048576){let t=Math.round(e.length/1024);return`[COMPRESSED: ${t}KB screenshot removed for storage]`}return e}getStorageStats(){return aB(function*(){return(yield aM(()=>aB(function*(){let[e,t]=yield Promise.all([this.dbManager.count(aF),this.dbManager.count(aZ)]);return{messageCount:e,resultCount:t}}).call(this),"Failed to get storage statistics",{messageCount:0,resultCount:0}))||{messageCount:0,resultCount:0}}).call(this)}cleanup(){return aB(function*(){yield Promise.all([this.messagesCleanup(),this.resultsCleanup()])}).call(this)}constructor(e="playground"){aL(this,"dbManager",void 0),aL(this,"namespace",void 0),aL(this,"messagesCleanup",void 0),aL(this,"resultsCleanup",void 0),this.namespace=e,this.dbManager=new aN(`midscene_playground_${e}`,1,[{name:aF,keyPath:"id"},{name:aZ,keyPath:"id"}]),this.messagesCleanup=aD(this.dbManager,aF,100),this.resultsCleanup=aD(this.dbManager,aZ,50)}}function aJ(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function aX(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){aJ(o,n,i,a,s,"next",e)}function s(e){aJ(o,n,i,a,s,"throw",e)}a(void 0)})}}function aH(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function aG(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){aH(e,t,r[t])})}return e}function aq(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}class aW{checkStorageSpace(){try{let e="storage-test",t="x".repeat(102400);return localStorage.setItem(e,t),localStorage.removeItem(e),!0}catch(e){return!1}}saveMessages(e){return aX(function*(){try{this.checkStorageSpace()||(console.warn("Low storage space detected, clearing old data..."),yield this.handleQuotaExceeded());let t=e.slice(-this.maxStorageItems).map(e=>aq(aG({},e),{result:"result"===e.type?void 0:e.result})),r=JSON.stringify(t);localStorage.setItem(this.messagesKey,r)}catch(t){if(t instanceof DOMException&&"QuotaExceededError"===t.name){console.warn("LocalStorage quota exceeded, attempting to clear old data and retry..."),yield this.handleQuotaExceeded();try{let t=e.slice(-10).map(e=>aq(aG({},e),{result:"result"===e.type?void 0:e.result})),r=JSON.stringify(t);localStorage.setItem(this.messagesKey,r),console.info("Successfully saved recent messages after clearing storage")}catch(e){console.error("Failed to save even after clearing storage:",e),yield this.clearMessages()}}else console.error("Failed to save messages to localStorage:",t)}}).call(this)}loadMessages(){return aX(function*(){try{let e=localStorage.getItem(this.messagesKey);if(!e)return[];let t=JSON.parse(e);return yield Promise.all(t.map(e=>aX(function*(){if("result"===e.type&&e.id){let t=`${this.resultsKey}-${e.id}`,r=localStorage.getItem(t);if(r)try{let t=JSON.parse(r);return aG({},e,t)}catch(e){console.warn("Failed to parse stored result:",e)}}return e}).call(this)))}catch(e){return console.error("Failed to load messages from localStorage:",e),[]}}).call(this)}clearMessages(){return aX(function*(){try{localStorage.removeItem(this.messagesKey),Object.keys(localStorage).forEach(e=>{e.startsWith(this.resultsKey)&&localStorage.removeItem(e)})}catch(e){console.error("Failed to clear messages from localStorage:",e)}}).call(this)}saveResult(e,t){return aX(function*(){try{let r=`${this.resultsKey}-${e}`;localStorage.setItem(r,JSON.stringify(t))}catch(r){if(r instanceof DOMException&&"QuotaExceededError"===r.name){console.warn("LocalStorage quota exceeded when saving result, clearing old results..."),yield this.handleQuotaExceeded();try{let r=`${this.resultsKey}-${e}`;localStorage.setItem(r,JSON.stringify(t))}catch(e){console.error("Failed to save result even after clearing storage:",e)}}else console.error("Failed to save result to localStorage:",r)}}).call(this)}handleQuotaExceeded(){return aX(function*(){try{let e=Object.keys(localStorage),t=e.filter(e=>e.startsWith(this.resultsKey)),r=t.slice(0,Math.max(1,Math.floor(t.length/2)));r.forEach(e=>{localStorage.removeItem(e)}),console.info(`Cleared ${r.length} old result entries to free up storage space`);let n=e.filter(e=>e.includes("playground")||e.includes("agent")||e.startsWith("midscene"));if(n.length>10){let e=n.slice(0,Math.floor(n.length/3));e.forEach(e=>{e!==this.messagesKey&&localStorage.removeItem(e)}),console.info(`Cleared ${e.length} additional playground-related entries`)}}catch(e){console.error("Failed to handle quota exceeded:",e)}}).call(this)}constructor(e="playground"){aH(this,"messagesKey",void 0),aH(this,"resultsKey",void 0),aH(this,"maxStorageItems",50),this.messagesKey=`${e}-messages`,this.resultsKey=`${e}-results`}}class aV{saveMessages(e){return aX(function*(){this.messages=[...e]}).call(this)}loadMessages(){return aX(function*(){return[...this.messages]}).call(this)}clearMessages(){return aX(function*(){this.messages=[],this.results.clear()}).call(this)}saveResult(e,t){return aX(function*(){this.results.set(e,t)}).call(this)}constructor(){aH(this,"messages",[]),aH(this,"results",new Map)}}class aY{saveMessages(e){return aX(function*(){})()}loadMessages(){return aX(function*(){return[]})()}clearMessages(){return aX(function*(){})()}saveResult(e,t){return aX(function*(){})()}}function a_(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"indexeddb",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"playground";switch(e){case"indexeddb":if("undefined"!=typeof indexedDB)return new aQ(t);return console.warn("IndexedDB not available, falling back to localStorage"),a_("localStorage",t);case"localStorage":if("undefined"!=typeof localStorage)return new aW(t);return console.warn("localStorage not available, falling back to memory storage"),a_("memory",t);case"memory":return new aV;case"none":return new aY;default:throw Error(`Unknown storage type: ${e}`)}}function a$(){if("undefined"!=typeof indexedDB)try{return indexedDB.open("test",1).onerror=()=>{},"indexeddb"}catch(e){}if("undefined"!=typeof localStorage)try{return localStorage.setItem("test","test"),localStorage.removeItem("test"),"localStorage"}catch(e){}return"memory"}function a0(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function a1(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){a0(o,n,i,a,s,"next",e)}function s(e){a0(o,n,i,a,s,"throw",e)}a(void 0)})}}function a2(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function a3(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}let a5=e=>{var t;let r=e.highlightElements||[],n=e.highlightRect,i=null==(t=e.uiContext)?void 0:t.shotSize;if(!i)return(0,o.jsx)("div",{className:"blackboard",children:(0,o.jsx)("div",{className:"blackboard-main-content",style:{padding:"20px"},children:"No UI context available"})});let s=e.uiContext,A=i.width,l=i.height,c=a.useMemo(()=>(function(e){if(!(null==e?void 0:e.length))return[];let t=new Map;return e.forEach((e,r)=>{var n,i;if(!(null==e?void 0:e.rect)||!(null==e?void 0:e.center))return;let o="content"in e&&e.content?e.content:"description"in e&&e.description?e.description:void 0,a=["id"in e?e.id:"",o||"",(n=e.center,`${n[0]}:${n[1]}`),(i=e.rect,`${i.left}:${i.top}:${i.width}:${i.height}`)].join("|");t.has(a)||t.set(a,{key:"id"in e&&e.id||`${a||"highlight"}-${r}`,label:o,center:e.center,rect:e.rect})}),Array.from(t.values())})(r),[r]),u=a.useMemo(()=>{var e;return(null==s||null==(e=s.screenshot)?void 0:e.base64)||""},[s]),d=c.map(e=>am(e)),p=null;return 1===d.length?p=(0,o.jsx)("div",{className:"bottom-tip",children:(0,o.jsxs)("div",{className:"bottom-tip-item",children:["Element: ",JSON.stringify(d[0])]})}):d.length>1&&(p=(0,o.jsx)("div",{className:"bottom-tip",children:(0,o.jsxs)("div",{className:"bottom-tip-item",children:["Element: ",JSON.stringify(d)]})})),(0,o.jsxs)("div",{className:"blackboard",children:[(0,o.jsxs)("div",{className:"blackboard-main-content",style:{width:"fit-content",maxWidth:"100%",position:"relative"},children:[u&&(0,o.jsx)("img",{src:u,alt:"screenshot",className:"blackboard-screenshot",draggable:!1}),(0,o.jsxs)("div",{className:"blackboard-overlay",style:{aspectRatio:`${A}/${l}`,"--ui-scale":Math.max(1,Math.sqrt(A/1920))},children:[n&&(0,o.jsx)("div",{className:"blackboard-rect blackboard-rect-search",style:{left:`${n.left/A*100}%`,top:`${n.top/l*100}%`,width:`${n.width/A*100}%`,height:`${n.height/l*100}%`},children:(0,o.jsx)("span",{className:"blackboard-rect-label",children:"Search Area"})}),c.map(e=>{let t=am(e);return(0,o.jsx)("div",{className:"blackboard-rect blackboard-rect-highlight",style:{left:`${t.left/A*100}%`,top:`${t.top/l*100}%`,width:`${t.width/A*100}%`,height:`${t.height/l*100}%`}},`${e.key}-rect`)})]})]}),(0,o.jsx)("div",{className:"bottom-tip",style:{display:e.hideController?"none":"block"},children:p})]})};var a7=r(9783),a4=r(7294),a8=r(4985),a6=r(1090),a9=r(2946),se=r(90),st=r(3776);let sr=e=>{let{text:t,disabled:r=!1,speed:n=5,className:i="",colorTheme:a="blue"}=e,s={"--animation-duration":`${n}s`},A=`theme-${a}`;return(0,o.jsx)("div",{className:`shiny-text ${A} ${r?"disabled":""} ${i}`,style:s,children:t})},sn=(0,o.jsxs)("span",{children:["Don't worry, just one more step to launch the playground server.",(0,o.jsx)("br",{}),"Please run one of the commands under the midscene project directory:",(0,o.jsx)("br",{}),"a. ",(0,o.jsx)("strong",{children:"npx midscene-playground"}),(0,o.jsx)("br",{}),"b. ",(0,o.jsx)("strong",{children:"npx --yes @midscene/web"})]}),si=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:sn;return(0,o.jsx)("div",{className:"server-tip",children:(0,o.jsx)(y.A,{message:"Playground Server Not Ready",description:e,type:"warning"})})},so=(0,o.jsx)("div",{className:"result-empty-tip",style:{textAlign:"center"},children:(0,o.jsx)(sr,{disabled:!0,text:"The result will be shown here"})});var sa=JSON.parse('{"content":[{"content":"Swag Labs","rect":{"left":895,"top":38,"width":130,"height":32,"zoom":1},"center":[960,54],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"d6c5e2f100","attributes":{"nodeType":"TEXT Node"},"indexId":0},{"content":"Username","rect":{"left":814,"top":154,"width":292,"height":40,"zoom":1},"center":[960,174],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"[_midscene_retrieve_task_id=\'a9021f480e\']","id":"a9021f480e","attributes":{"class":".input_error.form_input","placeholder":"Username","type":"text","data-test":"username","id":"user-name","name":"user-name","autocorrect":"off","autocapitalize":"none","htmlTagName":"<input>","nodeType":"FORM_ITEM Node"},"indexId":1},{"content":"Password","rect":{"left":814,"top":209,"width":292,"height":40,"zoom":1},"center":[960,229],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"[_midscene_retrieve_task_id=\'580f3b761d\']","id":"580f3b761d","attributes":{"class":".input_error.form_input","placeholder":"Password","type":"password","data-test":"password","id":"password","name":"password","autocorrect":"off","autocapitalize":"none","htmlTagName":"<input>","nodeType":"FORM_ITEM Node"},"indexId":2},{"content":"","rect":{"left":814,"top":253,"width":292,"height":45,"zoom":1},"center":[960,275],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"[_midscene_retrieve_task_id=\'3e1faf0fd6\']","id":"3e1faf0fd6","attributes":{"class":".error-message-container","nodeType":"CONTAINER Node"},"indexId":3},{"content":"Login","rect":{"left":814,"top":303,"width":292,"height":49,"zoom":1},"center":[960,327],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"[_midscene_retrieve_task_id=\'6db0b64062\']","id":"6db0b64062","attributes":{"type":"submit","class":".submit-button.btn_action","data-test":"login-button","id":"login-button","name":"login-button","value":"Login","htmlTagName":"<input>","nodeType":"FORM_ITEM Node"},"indexId":4},{"content":"Accepted usernames are:","rect":{"left":570,"top":435,"width":221,"height":21,"zoom":1},"center":[680,445],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"5ca36a5942","attributes":{"nodeType":"TEXT Node"},"indexId":5},{"content":"standard_user","rect":{"left":570,"top":479,"width":109,"height":19,"zoom":1},"center":[624,488],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"fd2fe54174","attributes":{"nodeType":"TEXT Node"},"indexId":6},{"content":"locked_out_user","rect":{"left":570,"top":503,"width":126,"height":19,"zoom":1},"center":[633,512],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"403daee75b","attributes":{"nodeType":"TEXT Node"},"indexId":7},{"content":"problem_user","rect":{"left":570,"top":527,"width":101,"height":19,"zoom":1},"center":[620,536],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"2b34f1e161","attributes":{"nodeType":"TEXT Node"},"indexId":8},{"content":"performance_glitch_user","rect":{"left":570,"top":551,"width":193,"height":19,"zoom":1},"center":[666,560],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"6ae63a4d9e","attributes":{"nodeType":"TEXT Node"},"indexId":9},{"content":"error_user","rect":{"left":570,"top":575,"width":84,"height":19,"zoom":1},"center":[612,584],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"76030282f1","attributes":{"nodeType":"TEXT Node"},"indexId":10},{"content":"visual_user","rect":{"left":570,"top":599,"width":92,"height":19,"zoom":1},"center":[616,608],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"f34b057726","attributes":{"nodeType":"TEXT Node"},"indexId":11},{"content":"Password for all users:","rect":{"left":960,"top":435,"width":221,"height":21,"zoom":1},"center":[1070,445],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"e693f608cd","attributes":{"nodeType":"TEXT Node"},"indexId":12},{"content":"secret_sauce","rect":{"left":960,"top":477,"width":101,"height":19,"zoom":1},"center":[1010,486],"page":{"page":{"_isDragging":false,"_timeoutSettings":{}},"pageType":"puppeteer"},"locator":"","id":"cde9de9828","attributes":{"nodeType":"TEXT Node"},"indexId":13}],"size":{"width":1920,"height":1080},"screenshotBase64":"data:image/png;base64,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8xecP25c2/qkSycuun/hzOuuG3nIiEcWLlz56xfbBgYAAIBPMwEagO3AQ4sW9evb9/h3q2tdXd2EsWN/8eCDlbeXfPOKsy+84OBhww4YMmTrb108YUJ9fd3Io46ccMklZ5xy6ueHD6+s9+nd1Kd3U9thu/bdpbFHQ1EUpVJp3uzZzzz/3NAv/uV5Ey+dMHbsgP79t23gqqqqAf37V1VVVd7W19f1/9znKq//dKedpl151Xev/96Bo7647De/mTJpUmW9saHhntvn/tfLr3xp9PGTp0z5m+OOG3/m2MpHN98255Irrjjh6GMuu+jCmbfOOXz06AcffnjbBgMAAIBPki04ANgObNq0afYP5559+uk/vvvuoihOPOaYt9ata9vxefkrLxdFsf7tt2u6dNn6W2vWvrnnwD0+22/Xp5Y8PeywUa2trR9+leqqqjETxv/n88/X1NQseeaZR375y6OOOOKaG25o359lwzvvbNmyZff+/ZcuW3b131+3Q8+epVKptbX1C8MPbm1tnXvXneVyefkrL9/xk5+cfPzxN82eVRTFaytWvPXWuqIofnD77Xf/9KftOw8AAADkCNAAbB9u/dGPLvzyOQcNPeDRxY+PGzPmlttu27Jly4d/ZcYPbimXSzdMndqvb99Fjz9+2ZWTX1q+/EOO39zcvN/gwdOnTOnevfuGDe/s1NT06muvtffPUbyxZs3Y888//eSTr7rs8tdXrZo1d26lMg8a+Bc79Oz5DzfNbDtyS3Pze767+Mkn230eAAAAyBGgAdg+rFq9+q5/vHfcmDFda2t3auoz9647P/IrfZqarp0x4+rrruvT1HTjtGu+dtFXzrrwgqIoVq5evc+gQZVjamtrBw0ceO+CBZXjr7zssr867rjnli6tbC29zdO+tW7dpk2b+u6888pVqyp7QBel3z29cIfGxueWvnD6+HO6VFePOvTQ22fe/PN/+edfL1u29MVlL7z44hEnjK4cVl9XX1fX9b3n/Yh7uAEAAODTxR7QAGw3Zt465/BRo75+8cVz75y3bv36tvVyuVwul4uiKJXL5XK59G7qnTxx4pRJk+rr6tesXbvmzbUtLS2V9V88+OCIgw46eNiwno2NE8+/4E+6daus79q3b9farpUzHHX4EYcceFDbJUqlUrlcLhWl37149xK/z8aNGx9+7LFxY8bs0Nh44P77/+2JJ7Z9tEvfvo/+/IG9Bw3a3Nz82xUrWlpaKoM99Mii3T7zmTNOPbVLdfXOffrcd8cdRx/x11tdvVQURalcqvykAAAAsF0orW5+u6NnAKAzaF27YfcDhqavMm/W7ENHjNjv0C/896uvVlb6NDU988ijWx8zbfr3p02fXhRF/912m3LFpP333be6quq5pUvPPO+8ym7RpVJp6uTJJxx9TG1NzT3z51dVlZ/41VOzfzi3XC5f/53vnnTssevWr1/y7LOPPfFE0447fuUbXy+KYvnTS7rV17ddYsOGDf322vPDRx1+wLDJEycO3muv115/ffLUKd/55hUDhu5f+eiic8b/3UknNTY01HTpMnX692+45ZbK+r577z1j2jWf7ddv3fr19y6Y/7VvfavSpv91wc/2GDCg7cynnfPlnz3wQPv9owIAvNcLjy8uNdR19BQAdAYCNADt45MJ0Nugvq6+a23N6jVr3rNeV1dXLpXWv/3e/we71dfX1NS88b7jP9D4M8dedfnlW6+8+NJLww4b1fZ2x169KrtwvN/OffqsWLny/TtZ99phhzVr137kDtcAADkCNADtRYAGoH18agN0VG1tbbe6//O72ZaWlrVvvtlxEwEAtAMBGoD24iGEALDtNm7cuHHjxo6eAgAAAD6lPMgIAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARoAAAAAgAgBGgAAAACACAEaAAAAAIAIARqA9rG5ublH9+4dPQUAAB9Xj+7dNzc3d/QUAHQSAjQA7eOdTRv322efjp4CAICPa799Br+zaWNHTwFAJyFAA9A+evRqPGX06I6eAgCAj+uU0cf36NXY0VMA0EkI0AC0k5rqoUOGjDxkREfPAQDAtht5yIihQ4YUNdUdPQgAnURpdfPbHT0DAJ1F85b1K9eOOXfCU0uWdPQoAAD80QbvtddtM27stmNDUV3V0bMA0Em4AxqA9lNd1a1Xw7xZs8445dSOHgUAgD/OGaecOm/WrG691GcA2pM7oAFob1ta3lq5ptxaLP7Vk88+/3yzR6gDAHyKVVdX7zFgwNB9h7SUiu47NhZV7lQDoD0J0ABktLQWW1qKltbWorWjRwEA4PcqFaWiXCqqykW51NGzANAJeaoAABnlUlGuKorC7zEAAADw/5a/rAEAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoCE6ZwSAAAInUlEQVQGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIEKABgAAAAAgQoAGAAAAACBCgAYAAAAAIOJ/AFTldxexlFiCAAAAAElFTkSuQmCC","screenshotBase64WithElementMarker":"data:image/png;base64,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vn9Zpk27K62tozJ7ztxMn/5g9t9vdGruvufebGqvPQen5nOf/1K+9e2L06mpqTE77NAv+++3X0495eTstNNOebVd8J9fy/cvuSwvpl+/fvnhD76fTgfsv1923nmnPPXUghz+pqNyyCFvSEPXrrlj6rQ899zz+dAH359vf+fivJj9998v69evz2lnvCvDhg5J//79M/ePf8xTTy1IfX19vvPtr6d//x2yse2375NzPvyhfO0b38qnJ3w2l1z2g4wZ84YsXbI00+68MytWrMzee++V17/+oAAAALDtqA8AAADbjPr6+vznBV/Orrvskttu+02m3XlX7pg6LTU77NAvJ580Pp/8xL+nqakxmxq178jMn/9kRreOysZGj25NTV1dkZEjhmdTp/3TKVm3bl2+9/3LMvPhWZn58Kz06NEjb37TEfnSFz+bL37pq7n7nnuzqeOPPy5fvfCirF69JnvvtWcqlUqq1WqWr1iRRx+dlwcffCg/nXh1fnLl5Rk6dEheTU8//UyefvqZvJiVq1ZnY926dcvEn/w4Hz7n3Myc+XBuvPGm1AwevEc+8R8fT+uoUfn2dy7Oixm8x+4596Mfzoc/8i+597778/Cs2amrKzJy5Ii8591n5vUHH5QX8oEPvDfb990+3734kjz11IL87Gc/T0337t0zfvwJ+cynPpGGhoYAAACw7ags3rC6GgAAALZJq1atyh//9EgG7rxT+vXrl83tySf/kuUrVmTI3nunrq7I/+RTn/lsfvazn+ezEz6dU045ORtbt25dzj3v47nttt/kiMP/IRd/95vZWqxZsyZ//OMj2WWXgenTp3derjVr1uZPf/pTXve616W5uWdeio6Ojvz1r4uyYMGC9OnTJ7vuukuKoggAAADbnvoAAACwzerevXtGt47KlrLLLgPzUt1yy22pOfbYo7OphoaGfOB9Z+W2236TeY89lq1JU1NTRo0amVeqqakx++47Mi9HURQZMKB/BgzoHwAAALZtRQAAAGArtF2vXqmZPWduXsjDD89KzfB99gkAAADwX+oDAAAAW6Gjj/7HfOe738v73n92xh1zVIYP3yev221Q5sz9Y+6774Hc/pvfpq6uLm95y7EBAAAA/kt9AAAAYCv0kQ9/MGvWrMlPJ/4sP7v6mvzs6muysZ49e+Rb3/ha3vCGgwMAAAD8l/oAAADAVqhSqeTf/+1f84EPvDd3/GFqnn7mmSxduiyDBu2avffeK4P32CONjQ0BAAAA/j/1AQAAgK1YS3Nzxo07OgAAAMD/rggAAAAAAAAApVAEAAAAAAAAgFIoAgAAAAAAAEApFAEAAAAAAACgFIoAAAAAAAAAUApFAAAAAAAAACiFIgAAAAAAAACUQhEAAAAAAAAASqEIAAAAAAAAAKVQBAAAAAAAAIBSKAIAAAAAAABAKRQBAAAAAAAAoBSKAAAAAAAAAFAKRQAAAAAAAAAohSIAAAAAAAAAlEIRAAAAAAAAAEqhCAAAAAAAAAClUAQAAAAAAACAUigCAAAAAAAAQCkUAQAAAAAAAKAUigAAAAAAAABQCkUAAAAAAAAAKIUiAAAAAAAAAJRCEQAAAAAAAABKoQgAAAAAAAAApVAEAAAAAAAAgFIoAgAAAAAAAEApFAEAAAAAAACgFIoAAAAAAAAAUApFAAAAAAAAACiFIgAAAAAAAACUQhEAAAAAAAAASqEIAAAAAAAAAKVQBAAAAAAAAIBSKAIAAAAAAABAKRQBAAAAAAAAoBSKAAAAAAAAAFAKRQAAAAAAAAAohSIAAAAAAAAAlEJ9AAC2pPaOpK092dCRakdHAAAAyqhSFEl9kXStS+qKAABsKfUBANhS1qxPZUNHGhsb06WpS+rq6gIAAFBG7e3tWb9+fdauXptqfZE0dQkAwJZQHwCALWFVW7rU1adHr+YAAACUXV1dXerq6tLY2JiVq1Zl/aq2pHvXAABsbkUAADa3NevTpa4+Pbp3DwAAwLamR/fu6VJXn6xZHwCAza0IAMDm1N6RyoaO9OjePQAAANuqHt27p7KhI2nvCADA5lQEAGBzamtPY2NjAAAAtnWNjY1JW3sAADanIgAAm9OGjnTp0iUAAADbui5duiQbOgIAsDkVAQDYjKodHamrqwsAAMC2rq6uLtWOjgAAbE5FAAAAAAAAACiFIgAAAAAAAACUQhEAAAAAAAAASqEIAAAAAAAAAKVQBAAAAAAAAIBSKAIAAAAAAABAKRQBAAAAAAAAoBSKAAAAAAAAAFAKRQAAAAAAAAAohSIAAAAAAAAAlEIRAAAAAAAAAEqhCAAAAAAAAAClUAQAAAAAAACAUigCAAAAAAAAQCkUAQAAAAAAAKAUigAAAAAAAABQCkUAAAAAAAAAKIUiAAAAAAAAAJRCEQAAAAAAAABKoQgAAAAAAAAApVAEAAAAAAAAgFIoAgAAAAAAAEApFAEAAAAAAACgFIoAAAAAAAAAUApFAAAAAAAAACiFIgAAAAAAAACUQhEAAAAAAAAASqEIAAAAAAAAAKVQBAAAAAAAAIBSKAIAAAAAAABAKRQBAAAAAAAAoBSKAAAAAAAAAFAKRQAAAAAAAAAohfoAAABsTSqVALymVKsBAADYWtQHAABga1OtBuA1oVIJAADA1qQIAAAAAAAAAKVQBAAAAAAAAIBSKAIAAAAAAABAKRQBAAAAAAAAoBSKAAAAAAAAAFAKRQAAAAAAAAAohSIAAAAAAAAAlEIRAAAAAAAAAEqhCAAAAAAAAAClUAQAAAAAAACAUigCAAAAAAAAQCkUAQAAAAAAAKAUigAAAAAAAABQCkUAAAAAAAAAKIUiAAAAAAAAAJRCfQAAADaXSiUAAAAAbDlFAAAAAAAAACiFIgAAAFtaS0uqjz2WjB2bl2L9+vX55je/meXLl2dT3/ve9/L0008HAAAAgKQIAADAltTSkup116Wy2255qarVap566qm0t7dnUwsXLsy6desCAAAAQFIfAACALWXs2GTSpFQCAAAAwOZQHwAAgC1l8uTk619PJk1KJk/Oq23x4sW59tprs2DBguywww45+OCDM2rUqHS66667cv/99+f555/PLrvskje96U0ZOHBgaiZOnJgRI0Zk7ty5mT17ds4777zccMMNGTFiRB566KE88sgj6dmzZ4444oiMHDkyne6+++5MnTo1K1asyIABA3LMMcdk4MCB6ejoyEUXXZSjjjoqt912W55//vnsvvvuOfnkk3PHHXdk+vTpqVQq2X///XPEEUek07x58/L73/8+Tz31VPr27ZuDDjooo0ePDgAAAMBLUR8AAIAtZdCgZP78ZOzYbA7XX399+vXrl3e+851ZsGBBLr/88uy+++5pbm7OnXfemXvuuSennnpqWlpaMmPGjFx22WX5yEc+kt69e2fx4sWZNGlSxowZk3e9611pamrK4sWLc91112X8+PF561vfmvvvvz8TJ07MwIED07t378yePTu//vWv8573vCc77rhj7r777lx22WX59Kc/nZpFixbl9ttvzzve8Y5s2LAhEydOzIUXXpghQ4bknHPOycKFC/PjH/84AwYMyLBhw/KXv/wlEydOzIknnpg99tgj8+bNyzXXXJOuXbtm+PDhAQAAAPjfFAEAANhS5s/P5lStVvPss89m8eLFGTRoUD75yU+mR48eqbnrrrtyxBFHpLm5OdVqNSNHjswOO+yQWbNmpdOQIUMyduzYDBw4MEVRpGafffbJkCFD0tjYmDe84Q3p0aNHnnzyydQMGDAgZ599dnbcccesWLEiQ4YMSVtbWxYuXJhORxxxRHr37p1+/fpl9OjRWb16dY477rh069Yte+yxRwYPHpzHH388NdOnT88+++yTXXfdNevXr88uu+yS1tbWPPDAAwEAAAB4KeoDAACwlSuKIkVRZMOGDdlYtVrNhg0b0qVLl9ScfPLJue222/KDH/wgGzZsSGtra4488sjU/PWvf80vf/nLtLS0ZGNtbW3p1L9//2xqhx12SKdKpZK+fftm5cqVqalUKvnFL36RZcuWpaWlJZVKJTVr1qxJp759+6bT9ttvn549e6axsTGdtt9++yxbtiw1Tz/9dB577LE88cQT2VivXr0CAAAA8FLUBwAAYCtXX1+fAQMGZOHChenbt286Pffcc6lUKunfv386OjqyZs2avOUtb0lRFHnuuedy2WWXpW/fvjnwwAPTt2/fHH/88dlzzz3Tqb29PZVKJZ2KosimKpVKXsztt9+eXr165X3ve19q1q5dmwkTJmRjRVFkY5VKJS+mX79+2XXXXXPUUUelU0dHRwAAAABeqiIAAACvASNGjMgtt9ySRYsWpWbVqlWZNGlShg4dmrq6ulQqlVx66aWZOnVqarbbbrt069Yt7e3tqRk1alRuueWWrFq1KjWPP/54JkyYkOeffz6v1Pr167N+/fpUq9V0dHTkxhtvTKVSySs1YsSI3HfffXnqqadSs3z58lxwwQWZPn16AAAAAF6K+gAAALwGvPGNb8yGDRvy3e9+Nx0dHeno6Mjw4cNz4oknpqZSqeS0007LxIkTM3ny5HR0dGTXXXdNa2trag4//PCsXbs2F1xwQerr69PR0ZG3ve1t6du3b16pN7/5zbn88svzuc99Lh0dHdl///3Tv3//vFJ77LFHxo0blx//+MepVqtZvXp1Dj300IwePToAAAAAL0V9AAAAXiPe9KY35U1velOWLVuWnj17piiKbGyXXXbJxz/+8axcuTL19fVpbGxMp0qlknHjxuXoo4/OihUr0tLSko198IMfzKY++MEPZlPvfe97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3LuXoyeO4xZcsSKB5ctzN0d+/pl8m437VbFCBZ576mkSkhLZtW8fQYGB+JYqxelz50jPyKBW9er4+fpyN7du3ebnX07g5elFo/r1+D0XL18m6eZN7kdxb2/atmlDGb/S7D6wn8tXr9KkUSNu3brNz7+cwM3L04snW7agauXKnDl3ngOHD5GXn8+dqlSqROcXXsBms3PyzBl27d+H0+nExTAMmjdpwt3cSEgg5upVCioXEMATjzfH38+Pn45GceLUKZxOJ3fzWMNGWCxmjhw7hsPhQET+2MUjUZisnoiIiIg8LKYUW44TERERkYfEmZ5LjaZNkP+vj5a8T6cOHVj+yUpCQkMRERH5b1azWjVK+/nR65VX6PbSy1y4dImW7doiIiL/08UjUZisnoiIiIg8LBZERERERERERP4N40aMpFOHDrjt3r8fERERERER+c+wICIiIiJ/uQvRFzlwuDRXrsYiIiLy3+7ipWgOHjmMS0xsLPOXLEZERERERET+MyyIiIiIyF9uwdKlLFi6FBERkcLg3Q8+4N0PPkBERERERET+8wxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERET+cmX8/WncoAEPk4eHB61btMBsNiMiIv+ddm/Z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QdGiRek/YgRff/sNNrudkLlzCZ0ylZBx40lNS2PuwoWMGjyEe3X5yhWGjBnD/BkzCBk3nhsJCcyYN4/+vXvj9s6iRaz+cAWXjh3n1u3bTJkzm0cbNsDthbZt+fSfy3Dr3qkTZ86d48mOL+DidDrp3r8fq5Yv59juPeTk5jJ+2jQWzpnDvcq32ZgZNp9Rg4cwa/LbnDh9irkL36NhvXq4ha9ZTYO6dTnw7XYsFgs5OTkMnzAep9OJS2JSEj0G9Gdp2LvMeXsKWdnZfLltK59Gfo5LKR8foo/+jFvixWhcqjZuRHpGBiIifxW73U58YgJ/JDklhT+Sk5vDvys5JYU/I3x1BGs3buBOdoeDO+Xk5pCTm8PvuZmczB9xOBwkp6byR+x2O8kpKfyR5JQURERERERE5OEzpdhynIiIiIg8JM70XGo0bcJ/mtlsxt+vNPGJCfwZFrOZ0n6liU9M4N9RtkwA8YkJ/J5yAQEkJCXhcDj4s/xLlyY1NRWb3U5Bn//rI557+mnutGrtWsZMnYKbYRiUslpJTk3l95jNZvz9ShOfmMDv8fP1JS09HbvdjoiIiIiI/P9dPBKFyeqJiIiIyMNiQURERORvwG63E5+YwJ9ls9uJT0zg3xWfmMAfuZGQwL8r6eZN7mbQW6MpWqQId7p1O4+CHA4Hyamp/BG73U58YgJ/JDklBREREREREREREflrWRARERGRv4Ws7GxERERERERERESkcDMQEREREREREREREREREZFCwUBERERERERERERERERERAoFAxERERERERERERERERERKRQMRERERERERERERERERESkUDAQEREREREREREREREREZFCwUBERERERERERERERERERAoFAxERERERERERERERERERKRQMRERERERERERERERERESkUDAQEREREREREREREREREZFCwUBERERERERERERERERERAoFAxEREZFCrE7t2rRu0YJ6jzzCw1Lc25tWzZvzoDVt3Bi/UqUQERERERERERERuVcGIiIiIoVYx7btGDloMJs/j2Rgnz48DFUqVWL9J5/yoC1fuJAmjR9FRERERERERERE5F5ZEBERESnE5i1ehMu7M2dRs1p15H/XuWNHalWvztyFCxEREREREREREZH/LhZERERE/gacODFhQv53zR9rwu28PEREREREREREROS/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2Wxw9PgJwldH4Fbaz4+lYe/SunlzihYtSv8RI/j622+4V6+/9hqjBg+hfNmynDh9im3ffUfDevXo9+abuFSrUoV506bzWKNGWMxmzkdH03/ECGKvxeHW+5XuTBw9ilJWH+KuX2f5Jyv5LDISlxfatuXTfy6joDPnzvFkxxcQEREREfm/7uKRKExWT0REREQeFlOKLceJiIiIyEPiTM+lRtMm/DfwL12a1NRUbHY7d+Pl6YVhmMjKzubP8vP1JS09Hbvdzt2ULFECu91Odk4OBQ3rP4BZkydzp8tXrtDs2WcoqGSJEthsdnJyc7gbT09PDJOJ7Jwc7lfsyVN4e3lxp0FvjWbTli24GYZBKauV5NRUfo+XpxfFPIqSkpbG7ynj709iUhIiIiIiIoXFxSNRmKyeiIiIiDwsFkRERETk/yfp5k3+SE5uDv+u5JQU/khGZiZ3E746grUbN3Anu8PBnTIyM/kjubm5/FkNW7fCxP+UlZ1NQQ6Hg+TUVP5ITm4OObk5/JHEpCRERERERERERETk3lkQERERkf/zbt++ze3bt/lPS01LQ0RERERERERERP7vMhARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgUDEREREREREREREREREREpFAxERERERERERERERERERKRQMBARERERERERERERERERkULBQERERERERERERERERERECgULIiIiIvJvqV2jBrm3bnH111+5m+Le3jRu0ACn08mps2dJS09HRERERERERERE5GGwICIiIiL/ljHD3+RK7FXmLlzI3fiXLs3IQYMp7edL2TIB1GnRHLvdjoiIiIiIiIiIiMiDZiAiIiIiD9WV2Fi6vt6Xrq+/Tmk/P3xLlUJERERERERERETkYTAQERERkb+E0+lERERERERERERE5GGyICIiIlKIbY1cy+TZs5g2YQKN6tXnl9OnmTJnNuejo3EJLF+edSs/4fbt28yYP4+eXbvR/tlnuBGfQLNnn8GluLc3oVND+McTT5Cfn893u3YxY9475OXn41aieAn+tWgxT7VqxZXYWN7/1wq27tjB/RjUty/dO3WmYmAgh48eZWbYfC7F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RERERERERAoFAxERERERERERERERERERKRQMRERERERERERERERERESkUDAQEREREREREREREREREZFCwUBERERERERERERERERERAoFAxERERERERERERERERERKRQMREREROSBKVq0KI8/9hitW7TAw8MDuX+B5cvTukULHn/sMYoWKcIfqVmtGkUsFh60IhYLrVu0oIjFgoiIiIiIiIiIyH8TAxERERF5IOo98ggXo47y7qzZTBk7FmvJksj9a1S/PiMHDWb5ewv51+Il/J4WTZtxYPsO3hw4iAfNarWyaVUEVqsVERERERERERGR/yYWREREROSB6NiuHTt27mTwmLeQP2/L9u1s2b6dl5/vwMRRo/g9p86e4cNPPmHLju38nt1bttDx1VfJzMpCRERERERERETk78CCiIiIiDwQ5cuWIyEpEXkwnE4nfyQzK4upoXP4PWX8/alTqzYmkwkREREREREREZG/CwsiIiIihdjWyLVMnj2LaRMm0KhefX45fZopc2ZzPjoat6DAQGZMmkTLps2IT0xk45bNvL9iBW5frV5DaT8/ItatxWIpwvD+/Snj70+dFs1JSEzkmX/8g5mTJlMuIACb3U6bJ/+BS5c+fYhPTMClVvXqhIwfT9PGj/LrtWt8vmED4asjcJs+YSLPPf00J8+cZv2XXxEaMpUaVasx6K3RbNqyhT1bt7Fh89e8OXAQu/ft45fTpxk5eDA79+5l+PhxuFhLliR0aghtWrfGYrGwa98+xk0LISMzE5dBfftiMpkoWyaALi++yG/xNwiPWM0XX3+Fm5+vL/OmTeeJxx8n7vp1tn3/He+vWIHT6cRtUN++dO/UmYqBgRw+epSZYfO5FBPDvSru7c17s+fwj1atyMvLIyMzE5fl4eGs/mI992L9J59QoVx5Ll+5wqC3RnPr1i0K2rQqggZ162Iymfhu4ybsDgdXYq/Sa/Bg3Px8fZk3bTpPPP44cdevs+3773h/xQqcTiduzR59lBGDBlE5KJivvtnG0o8+Iu76de5Fm9at6d+rN68NGojbgN59CA6qSEhoKC4mk4mpY8fRtk0bShQvzo979zBj/nzSMzJwCwoMZMakSbRs2oz4xEQ2btnM+ytW4PbV6jWU9vMjYt1aLJYiDO/fnzL+/tRp0ZyExEREREREREREROTvxTxx2pQZiIiIiDwst218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AFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAIAqlAAAAAAAAABQhRIAAAAAAAAAqlACAAAAAAAAQBVKAAAAAAAAAKhCCQAAAAAAAABVKAEAAAAAAACgCiUAAAAAAAAAVKEEAAAAAAAAgCqUAAAAAAAAAFCFEgAAAAAAAACqUAIAAAAAAABAFUoAAAAAAAAAqEIJAAAAAAAAAFUoAQAAAAAAAKAKJQAAAAAAAABUoQQAAAAAAACAKpQAAAAAAAAAUIUSAAAAAAAAAKpQAgAAAAAAAEAVSgAAAAAAAACoQgkAAAAAAAAAVSgBAAAAAAAAoAolAAAAAAAAAFShBAAAAAAAAP5ve3BAAgAAgAAo+j+6H6ECFxoAAAAAAAAALjQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAAAcKEBAAAAAAAA4EIDAAAAAAAAwIUGAAAAAAAAgAsNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAHChAQAAAAAAAOBCAwAAAAAAAMCFBgAAAAAAAIALDQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAABwoQEAAAAAAADgQgMAAAAAAADAhQYAAAAAAACACw0AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAAAcKEBAAAAAAAA4EIDAAAAAAAAwIUGAAAAAAAAgAsNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAHChAQAAAAAAAOBCAwAAAAAAAMCFBgAAAAAAAIALDQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAABwoQEAAAAAAADgQgMAAAAAAADAhQYAAAAAAACACw0AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAAAcKEBAAAAAAAA4EIDAAAAAAAAwIUGAAAAAAAAgAsNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAHChAQAAAAAAAOBCAwAAAAAAAMCFBgAAAAAAAIALDQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAABwoQEAAAAAAADgQgMAAAAAAADAhQYAAAAAAACACw0AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAAAcKEBAAAAAAAA4EIDAAAAAAAAwIUGAAAAAAAAgAsNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAHChAQAAAAAAAOBCAwAAAAAAAMCFBgAAAAAAAIALDQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAABwoQEAAAAAAADgQgMAAAAAAADAhQYAAAAAAACACw0AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAAAcKEBAAAAAAAA4EIDAAAAAAAAwIUGAAAAAAAAgAsNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAHChAQAAAAAAAOBCAwAAAAAAAMCFBgAAAAAAAIALDQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAABwoQEAAAAAAADgQgMAAAAAAADAhQYAAAAAAACACw0AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAAAcKEBAAAAAAAA4EIDAAAAAAAAwIUGAAAAAAAAgAsNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAAFxoAAAAAAAAALjQAAAAAAAAAHChAQAAAAAAAOBCAwAAAAAAAMCFBgAAAAAAAIALDQAAAAAAAAAXGgAAAAAAAAAuNAAAAAAAAABcaAAAAAAAAAC40AAAAAAAAABwYYkQHKd0AqxtAAAAAElFTkSuQmCC","url":"https://www.saucedemo.com/"}');let ss=e=>{let{uiContextPreview:t,setUiContextPreview:r,showContextPreview:n}=e;return n?(0,o.jsxs)("div",{className:"form-part context-panel",children:[(0,o.jsx)("h3",{children:"UI Context"}),t?(0,o.jsx)(a5,{uiContext:t,hideController:!0}):(0,o.jsxs)("div",{children:[(e=>{switch(e){case"finished":case"passed":case"success":case"connected":return(0,o.jsx)("span",{style:{color:"#00AD4B"},children:(0,o.jsx)(a7.A,{})});case"finishedWithWarning":return(0,o.jsx)("span",{style:{color:"#f7bb05"},children:(0,o.jsx)(a4.A,{})});case"failed":case"closed":case"timedOut":case"interrupted":return(0,o.jsx)("span",{style:{color:"#FF0A0A"},children:(0,o.jsx)(a8.A,{})});case"pending":return(0,o.jsx)(a6.A,{});case"cancelled":case"skipped":return(0,o.jsx)("span",{style:{color:"#8c8c8c"},children:(0,o.jsx)(a9.A,{})});case"running":return(0,o.jsx)(se.A,{});default:return(0,o.jsx)(st.A,{})}})("failed")," No UI context",(0,o.jsx)(g.Ay,{type:"link",onClick:e=>{e.preventDefault(),r(sa)},children:"Load Demo"}),(0,o.jsx)("div",{children:"To load the UI context, you can either use the demo data above, or click the 'Send to Playground' in the report page."})]})]}):null};var sA=r(4291);let sl=e=>{let{className:t=""}=e,{config:r}=X();return Object.keys(r||{}).length>=1?null:(0,o.jsxs)("div",{className:`env-config-reminder ${t}`,children:[(0,o.jsx)(sA.A,{className:"reminder-icon"}),(0,o.jsx)("span",{className:"reminder-text",children:"Please set up your environment variables before using."}),(0,o.jsx)(W,{mode:"text",showTooltipWhenEmpty:!1})]})};var sc=r(7062),su=r(6130),sd=r(2297),sp=r(5862),sh=r(7615),sf=r(2107),sg=r(4544),sm=r(3616),sy=r(1879),sv=r(9876),sb=r(1269);let sw=e=>{var t,r;return(0,o.jsx)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",viewBox:"0 0 16 16"},e),r=r={children:(0,o.jsx)("path",{fill:"currentColor",d:"M1.333 13v-2.5a.667.667 0 0 1 1.334 0V13c0 .184.149.333.333.333h2.5a.667.667 0 0 1 0 1.334H3c-.92 0-1.667-.746-1.667-1.667m12 0v-2.5a.667.667 0 0 1 1.334 0V13c0 .92-.746 1.667-1.667 1.667h-2.5a.667.667 0 0 1 0-1.334H13a.333.333 0 0 0 .333-.333m-12-7.5V3c0-.92.747-1.667 1.667-1.667h2.5a.667.667 0 0 1 0 1.334H3A.333.333 0 0 0 2.667 3v2.5a.667.667 0 0 1-1.334 0m12 0V3A.333.333 0 0 0 13 2.667h-2.5a.667.667 0 0 1 0-1.334H13c.92 0 1.667.747 1.667 1.667v2.5a.667.667 0 0 1-1.334 0M5.667 10.333h4.666V5.667H5.667zm6 .167c0 .644-.523 1.167-1.167 1.167h-5A1.167 1.167 0 0 1 4.333 10.5v-5c0-.644.523-1.167 1.167-1.167h5c.644 0 1.167.523 1.167 1.167z"})},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},sE=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",viewBox:"0 0 16 16"},e),r=r={children:[(0,o.jsx)("path",{stroke:"currentColor",strokeLinejoin:"round",strokeWidth:1.333,d:"M11.333 13.667 14.667 8l-3.334-5.667H4.667L1.333 8l3.334 5.667z"}),(0,o.jsx)("path",{stroke:"currentColor",strokeLinejoin:"round",strokeWidth:1.333,d:"M8 9.667a1.667 1.667 0 1 0 0-3.334 1.667 1.667 0 0 0 0 3.334Z"})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))};function sk(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function sx(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function sS(e,t){return{left:0,top:0,width:e,pointerLeft:Math.round(e/2),pointerTop:Math.round(t/2)}}function sC(e,t,r,n){if(!t.img)return;e.img&&t.img!==e.img&&(e.prevImg=e.img,e.imageChanged=!0);let i=t.imageWidth||r,o=t.imageHeight||n,a=e.imgW!==i||e.imgH!==o;if(e.img=t.img,e.imgW=i,e.imgH=o,a){let t=sS(i,o);e.camera=sx({},t),e.prevCamera=sx({},t),e.pointerMoved=!1}}function sI(e,t){return Math.abs(e.pointerLeft-t.pointerLeft)>1||Math.abs(e.pointerTop-t.pointerTop)>1}function sj(e,t,r,n,i){let o=Math.round(n/2),a=Math.round(i/2);return e||Math.abs(t.pointerLeft-o)>1||Math.abs(t.pointerTop-a)>1||Math.abs(r.pointerLeft-o)>1||Math.abs(r.pointerTop-a)>1}function sO(e,t,r,n,i){let o=sS(r,n),a={img:"",imgW:r,imgH:n,camera:sx({},o),prevCamera:sx({},o),prevImg:null,insights:[],spinning:!1,spinningElapsedMs:0,pointerImg:ah,pointerVisible:!1,title:"",subTitle:"",taskId:void 0,frameInScript:0,scriptIndex:0,imageChanged:!1,pointerMoved:!1,rawProgress:0};for(let o=0;o<e.length;o++){var s,A;let l=e[o],c=l.startFrame+l.durationInFrames;if(0===l.durationInFrames){l.startFrame<=t&&("pointer"===l.type&&l.pointerImg&&(a.pointerImg=l.pointerImg,a.pointerVisible=!0),a.title=l.title||a.title,a.subTitle=l.subTitle||a.subTitle,a.taskId=null!=(s=l.taskId)?s:a.taskId,a.scriptIndex=o);continue}if(t<l.startFrame)break;switch(a.title=l.title||a.title,a.subTitle=l.subTitle||a.subTitle,a.taskId=null!=(A=l.taskId)?A:a.taskId,a.scriptIndex=o,a.frameInScript=t-l.startFrame,a.rawProgress=Math.min(a.frameInScript/l.durationInFrames,1),l.type){case"img":!function(e,t,r,n,i){sC(e,t,n,i);let o=t.startFrame+t.durationInFrames;t.cameraTarget?(e.prevCamera=sx({},e.camera),e.camera=sx({},t.cameraTarget),e.pointerMoved=sI(e.prevCamera,e.camera)):r>=o&&(e.pointerMoved=!1,e.imageChanged=!1),e.spinning=!1}(a,l,t,r,n);break;case"insight":!function(e,t,r,n,i){if(sC(e,t,n,i),e.insights.some(e=>e.highlightElement===t.highlightElement&&e.searchArea===t.searchArea)||e.insights.push({highlightElement:t.highlightElement,searchArea:t.searchArea,alpha:1}),t.cameraTarget&&void 0!==t.insightPhaseFrames){let n=t.startFrame+t.insightPhaseFrames;r>=n&&(e.prevCamera=sx({},e.camera),e.camera=sx({},t.cameraTarget),e.rawProgress=Math.min((r-n)/(t.cameraPhaseFrames||1),1),e.pointerMoved=sI(e.prevCamera,e.camera))}e.spinning=!1}(a,l,t,r,n);break;case"clear-insight":!function(e,t,r){let n=t.startFrame+t.durationInFrames,i=1-e.rawProgress;e.insights=e.insights.map(e=>{var t,r;return t=sx({},e),r=r={alpha:i},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t}),r>=n&&(e.insights=[]),e.spinning=!1}(a,l,t);break;case"spinning-pointer":a.spinning=!0,a.spinningElapsedMs=a.frameInScript/i*1e3;break;case"sleep":a.spinning=!1}t>=c&&("clear-insight"!==l.type&&(a.imageChanged=!1),a.pointerMoved=!1,a.rawProgress=1,l.cameraTarget&&(a.prevCamera=sx({},a.camera)))}if(!a.img){let t=e.find(e=>"img"===e.type&&e.img);t&&(a.img=t.img,a.imgW=t.imageWidth||r,a.imgH=t.imageHeight||n)}return{img:a.img,imageWidth:a.imgW,imageHeight:a.imgH,prevImg:a.imageChanged?a.prevImg:null,camera:a.camera,prevCamera:a.prevCamera,insights:a.insights,spinning:a.spinning,spinningElapsedMs:a.spinningElapsedMs,currentPointerImg:a.pointerImg,pointerVisible:a.pointerVisible,title:a.title,subTitle:a.subTitle,taskId:a.taskId,frameInScript:a.frameInScript,scriptIndex:a.scriptIndex,imageChanged:a.imageChanged,pointerMoved:a.pointerMoved,rawProgress:a.rawProgress}}function sP(e,t,r,n){let i=Math.min(e/r,t/n),o=r*i,a=n*i;return{offsetX:(e-o)/2,offsetY:(t-a)/2,contentWidth:o,contentHeight:a}}function sR(e,t){if(!Number.isFinite(e)||e<=0)throw Error(`${t} must be a positive finite number`)}function sT(e){return{scale:e,width:44*e,height:56*e,hotspotX:6*e,hotspotY:4*e,centerOffsetX:44*e/2,centerOffsetY:56*e/2}}function sN(e){return sR(e,"imageWidth"),sT(Math.max(1,Math.sqrt(e/1920)))}function sM(e){let t=e.height;return{size:t,centerOffset:t/2}}let sD=e=>{let{frameMap:t,autoZoom:r,frame:n,width:i,height:s,fps:A}=e,{scriptFrames:l,imageWidth:c,imageHeight:u}=t,d=(0,a.useMemo)(()=>sO(l,n,c,u,A),[l,n,c,u,A]);if(!d.img)return null;let{img:p,imageWidth:h,imageHeight:f,prevImg:g,camera:m,prevCamera:y,insights:v,spinning:b,spinningElapsedMs:w,currentPointerImg:E,pointerVisible:k,title:x,subTitle:S,frameInScript:C,imageChanged:I,pointerMoved:j,rawProgress:O}=d,P=r?j?Math.min(O/.375,1):O:1,R=j?O<=.375?0:Math.min((O-.375)/.625,1):O,T=y.pointerLeft+(m.pointerLeft-y.pointerLeft)*P,N=y.pointerTop+(m.pointerTop-y.pointerTop)*P,M=r?y.left+(m.left-y.left)*R:0,D=r?y.top+(m.top-y.top)*R:0,z=r?y.width+(m.width-y.width)*R:h,{offsetX:B,offsetY:L,contentWidth:U,contentHeight:K}=sP(i,s,h,f),F=h/z,Z=-(U/h*M),Q=-(K/f*D),J=`scale(${F}) translate(${Z}px, ${Q}px)`,X=f/h*z,H=(T-M)/z*U,G=(N-D)/X*K,q=sj(k,m,y,h,f),W=sN(h),V=sM(W),Y=W.scale,_=I?Math.min(C/10,1):1,$=b?(Math.sin(w/500-Math.PI/2)+1)/2*Math.PI*2:0;return(0,o.jsx)("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:"#000"},children:(0,o.jsx)("div",{style:{position:"absolute",left:B,top:L,width:U,height:K,overflow:"hidden"},children:(0,o.jsxs)("div",{style:{width:U,height:K,position:"relative",overflow:"hidden"},children:[I&&g&&_<1&&(0,o.jsx)("div",{style:{position:"absolute",width:U,height:K,overflow:"hidden",opacity:1-_},children:(0,o.jsx)("img",{alt:"",src:g,style:{width:U,height:K,transformOrigin:"0 0",transform:J}})}),(0,o.jsxs)("div",{style:{position:"absolute",width:U,height:K,overflow:"hidden",opacity:I?_:1},children:[(0,o.jsx)("img",{alt:"",src:p,style:{width:U,height:K,transformOrigin:"0 0",transform:J}}),(0,o.jsx)("div",{style:{position:"absolute",top:0,left:0,width:U,height:K,transformOrigin:"0 0",transform:J,pointerEvents:"none"},children:0===v.length?null:v.map((e,t)=>{let r=[];if(e.highlightElement){let n=am(e.highlightElement);r.push((0,o.jsx)("div",{style:{position:"absolute",left:n.left,top:n.top,width:n.width,height:n.height,background:"rgba(253, 89, 7, 0.4)",border:`${2*Y}px solid #fd5907`,boxShadow:`${2*Y}px ${2*Y}px ${+Y}px rgba(51, 51, 51, 0.3)`,opacity:e.alpha,pointerEvents:"none"}},`highlight-${t}`))}if(e.searchArea){let n=e.searchArea;r.push((0,o.jsx)("div",{style:{position:"absolute",left:n.left,top:n.top,width:n.width,height:n.height,background:"rgba(2, 131, 145, 0.4)",border:`${2*Y}px solid #028391`,boxShadow:`${2*Y}px ${2*Y}px ${+Y}px rgba(51, 51, 51, 0.3)`,opacity:e.alpha,pointerEvents:"none"}},`search-${t}`))}return r})})]}),b&&(0,o.jsx)("img",{alt:"",src:af,style:{position:"absolute",left:H-V.centerOffset,top:G-V.centerOffset,width:V.size,height:V.size,transform:`rotate(${$}rad)`,transformOrigin:"center center",filter:"drop-shadow(0 1px 2px rgba(0,0,0,0.3))"}}),q&&!b&&(0,o.jsx)("img",{alt:"",src:E,style:{position:"absolute",left:H-W.hotspotX,top:G-W.hotspotY,width:W.width,height:W.height,filter:"drop-shadow(0 1px 2px rgba(0,0,0,0.3))"}})]})})})};function sz(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function sB(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){sz(o,n,i,a,s,"next",e)}function s(e){sz(o,n,i,a,s,"throw",e)}a(void 0)})}}let sL=!1;function sU(e){return new Promise((t,r)=>{let n=new Image;n.crossOrigin="anonymous",n.onload=()=>t(n),n.onerror=r,n.src=e})}function sK(e,t,r){let n=r.contentWidth/r.imageWidth,i=r.contentHeight/r.imageHeight;return{left:r.offsetX+(e.left*n+t.tx)*t.zoom,top:r.offsetY+(e.top*i+t.ty)*t.zoom,width:e.width*n*t.zoom,height:e.height*i*t.zoom}}function sF(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function sZ(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){sF(o,n,i,a,s,"next",e)}function s(e){sF(o,n,i,a,s,"throw",e)}a(void 0)})}}function sQ(e,t){let r=Math.floor(e/t),n=Math.floor(r/60);return`${String(n).padStart(2,"0")}:${String(r%60).padStart(2,"0")}`}function sJ(e){var t,r,n;let i,{message:s}=p.A.useApp(),{autoZoom:A,setAutoZoom:l,playbackSpeed:c,setPlaybackSpeed:u,subtitleEnabled:d,setSubtitleEnabled:f}=R();(0,a.useEffect)(()=>{(null==e?void 0:e.autoZoom)!==void 0&&l(e.autoZoom)},[null==e?void 0:e.autoZoom,l]);let m=null==e?void 0:e.replayScripts,y=(0,a.useMemo)(()=>m&&0!==m.length?function(e,t){let r=(null==t?void 0:t.imageWidth)||1920,n=(null==t?void 0:t.imageHeight)||1080;for(let t of e)if(("img"===t.type||"insight"===t.type)&&t.img){r=t.imageWidth||r,n=t.imageHeight||n;break}let i=[],o=0;for(let t of e){var a,s,A,l;let e=t.duration;switch(t.type){case"sleep":{let r=Math.ceil(e/1e3*30);i.push({type:"sleep",startFrame:o,durationInFrames:r,title:t.title,subTitle:t.subTitle,taskId:t.taskId}),o+=r;break}case"img":{let A=Math.max(Math.ceil(e/1e3*30),1),l=t.camera,c=t.imageWidth||r,u=t.imageHeight||n,d={type:"img",startFrame:o,durationInFrames:A,img:t.img,imageWidth:c,imageHeight:u,title:t.title,subTitle:t.subTitle,taskId:t.taskId};l&&(d.cameraTarget={left:l.left,top:l.top,width:l.width,pointerLeft:null!=(a=l.pointerLeft)?a:Math.round(c/2),pointerTop:null!=(s=l.pointerTop)?s:Math.round(u/2)}),i.push(d),o+=A;break}case"insight":{let a=Math.max(Math.ceil(e/1e3*30),1),s=Math.ceil((t.insightCameraDuration||0)/1e3*30),c=a+s,u=t.imageWidth||r,d=t.imageHeight||n,p=t.camera,h={type:"insight",startFrame:o,durationInFrames:c,img:t.img,imageWidth:u,imageHeight:d,insightPhaseFrames:a,cameraPhaseFrames:s,highlightElement:t.highlightElement,searchArea:t.searchArea,title:t.title,subTitle:t.subTitle,taskId:t.taskId};p&&(h.cameraTarget={left:p.left,top:p.top,width:p.width,pointerLeft:null!=(A=p.pointerLeft)?A:Math.round(u/2),pointerTop:null!=(l=p.pointerTop)?l:Math.round(d/2)}),i.push(h),o+=c;break}case"clear-insight":{let r=Math.max(Math.ceil(e/1e3*30),1);i.push({type:"clear-insight",startFrame:o,durationInFrames:r,title:t.title,subTitle:t.subTitle,taskId:t.taskId}),o+=r;break}case"spinning-pointer":{let r=Math.max(Math.ceil(e/1e3*30),1);i.push({type:"spinning-pointer",startFrame:o,durationInFrames:r,title:t.title,subTitle:t.subTitle,taskId:t.taskId}),o+=r;break}case"pointer":i.push({type:"pointer",startFrame:o,durationInFrames:0,pointerImg:t.img,title:t.title,subTitle:t.subTitle,taskId:t.taskId})}}let c=Math.max(o,1);return{scriptFrames:i,totalDurationInFrames:c,fps:30,stepsDurationInFrames:c,imageWidth:r,imageHeight:n}}(m,{imageWidth:null==e?void 0:e.imageWidth,imageHeight:null==e?void 0:e.imageHeight}):null,[null==e?void 0:e.imageHeight,null==e?void 0:e.imageWidth,m]),v=(0,a.useRef)(null),b=(0,a.useRef)(null),w=(0,a.useRef)(null),[E,k]=(0,a.useState)({width:0,height:0});(0,a.useEffect)(()=>{let e=b.current;if(!e)return;let t=new ResizeObserver(e=>{for(let t of e){let{width:e,height:r}=t.contentRect;k(t=>t.width===e&&t.height===r?t:{width:e,height:r})}});return t.observe(e),()=>t.disconnect()},[]);let x=function(e){var t,r;let{durationInFrames:n,fps:i,autoPlay:o=!1,loop:s=!1}=e,[A,l]=(0,a.useState)(0),[c,u]=(0,a.useState)(o),d=(0,a.useRef)(c),p=(0,a.useRef)(A),h=(0,a.useRef)(null!=(t=e.playbackRate)?t:1),f=(0,a.useRef)(n),g=(0,a.useRef)(i),m=(0,a.useRef)(s);d.current=c,p.current=A,h.current=null!=(r=e.playbackRate)?r:1,f.current=n,g.current=i,m.current=s,(0,a.useEffect)(()=>{let e;if(!c)return;let t=null,r=0,n=i=>{if(null!==t){let e=(i-t)*h.current;r+=e;let n=1e3/g.current;for(;r>=n;){r-=n;let e=p.current+1;if(e>=f.current)if(m.current)p.current=0,l(0);else{p.current=f.current-1,l(f.current-1),u(!1);return}else p.current=e,l(e)}}t=i,e=requestAnimationFrame(n)};return e=requestAnimationFrame(n),()=>cancelAnimationFrame(e)},[c]);let y=()=>{p.current>=f.current-1&&(p.current=0,l(0))},v=(0,a.useCallback)(()=>{y(),u(!0)},[]),b=(0,a.useCallback)(()=>u(!1),[]);return{currentFrame:A,playing:c,play:v,pause:b,toggle:(0,a.useCallback)(()=>{d.current?u(!1):(y(),u(!0))},[]),seekTo:(0,a.useCallback)(e=>{let t=Math.max(0,Math.min(e,f.current-1));p.current=t,l(t)},[])}}({durationInFrames:Math.max(null!=(t=null==y?void 0:y.totalDurationInFrames)?t:1,1),fps:null!=(r=null==y?void 0:y.fps)?r:30,autoPlay:!0,loop:!1,playbackRate:c}),S=(0,a.useMemo)(()=>{if(!y)return 0;for(let e=y.scriptFrames.length-1;e>=0;e--){let t=y.scriptFrames[e];if(t.taskId)return t.startFrame+t.durationInFrames-1}return Math.max(0,y.totalDurationInFrames-1)},[y]),C=(0,a.useCallback)(()=>{var e;x.playing?x.pause():(e=x.currentFrame,S>0&&e>=S&&x.seekTo(0),x.play())},[S,x.currentFrame,x.pause,x.play,x.playing,x.seekTo]);(0,a.useEffect)(()=>{!y||x.playing||!(x.currentFrame<y.totalDurationInFrames-1)&&S>0&&x.seekTo(S)},[S,y,x.currentFrame,x.playing,x.seekTo]),(0,a.useEffect)(()=>{if(!y||!(null==e?void 0:e.onTaskChange))return;if(!x.playing){null!==w.current&&(w.current=null,e.onTaskChange(null));return}let t=function(e,t){let r=null;for(let o of e){var n,i;if(0===o.durationInFrames){o.startFrame<=t&&(r=null!=(n=o.taskId)?n:r);continue}if(t<o.startFrame)break;r=null!=(i=o.taskId)?i:r}return r}(y.scriptFrames,x.currentFrame);t!==w.current&&(w.current=t,e.onTaskChange(t))},[y,null==e?void 0:e.onTaskChange,x.currentFrame,x.playing]);let I=(0,a.useMemo)(()=>{var e;let t;return y?(e=x.currentFrame,(t=sO(y.scriptFrames,e,y.imageWidth,y.imageHeight,y.fps)).img?t:null):null},[y,x.currentFrame]),j=(0,a.useCallback)(()=>sZ(function*(){if(null==e?void 0:e.reportFileContent)try{var t,r;yield(t={content:e.reportFileContent,onDownloadReport:e.onDownloadReport},(r=function*(){let{content:e,defaultFileName:r="midscene_report.html",onDownloadReport:n,documentRef:i,urlRef:o,blobFactory:a,scheduleRevoke:s}=t;if(n)return void(yield n({content:e,defaultFileName:r}));let A=null!=i?i:globalThis.document;if(!A)throw Error("Report download requires a document context.");let l=null!=o?o:globalThis.URL;if(!(null==l?void 0:l.createObjectURL)||!(null==l?void 0:l.revokeObjectURL))throw Error("Report download requires URL.createObjectURL support.");let c=(null!=a?a:(e,t)=>new Blob(e,t))([e],{type:"text/html"}),u=l.createObjectURL(c),d=A.createElement("a");d.href=u,d.download=r,d.style.display="none",A.body.appendChild(d);try{d.click()}finally{A.body.removeChild(d),(null!=s?s:e=>setTimeout(e,0))(()=>{l.revokeObjectURL(u)})}},function(){var e=this,t=arguments;return new Promise(function(n,i){var o=r.apply(e,t);function a(e){sk(o,n,i,a,s,"next",e)}function s(e){sk(o,n,i,a,s,"throw",e)}a(void 0)})})())}catch(e){G(e,{title:"Failed to download report"})}})(),[null==e?void 0:e.onDownloadReport,null==e?void 0:e.reportFileContent]),O=(0,a.useMemo)(()=>I&&(I.title||I.subTitle)?{title:I.title,subTitle:I.subTitle}:null,[I]),[P,T]=(0,a.useState)(!1),[N,M]=(0,a.useState)(0),D=(0,a.useRef)(!1),[z,B]=(0,a.useState)(!0),L=(0,a.useRef)(null),U=(0,a.useCallback)(()=>{B(!0),L.current&&clearTimeout(L.current),P||(L.current=setTimeout(()=>B(!1),3e3))},[P]),K=(0,a.useCallback)(()=>{B(!0),L.current&&clearTimeout(L.current)},[]),F=(0,a.useCallback)(()=>{L.current&&clearTimeout(L.current),P||(L.current=setTimeout(()=>B(!1),1e3))},[P]);(0,a.useEffect)(()=>{P&&(B(!0),L.current&&(clearTimeout(L.current),L.current=null))},[P]),(0,a.useEffect)(()=>{let e=e=>{var t;let r=null==(t=e.target)?void 0:t.tagName;"INPUT"!==r&&"TEXTAREA"!==r&&"SELECT"!==r&&"Space"===e.code&&(e.preventDefault(),C())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[C]);let Z=(0,a.useRef)(null),Q=(0,a.useCallback)(e=>{if(!y||!Z.current)return;let t=Z.current;t.setPointerCapture(e.pointerId);let r=e=>{let r=t.getBoundingClientRect(),n=Math.max(0,Math.min(1,(e-r.left)/r.width));x.seekTo(Math.round(n*S))};r(e.clientX);let n=e=>r(e.clientX),i=()=>{t.removeEventListener("pointermove",n),t.removeEventListener("pointerup",i)};t.addEventListener("pointermove",n),t.addEventListener("pointerup",i)},[y,x,S]),[J,X]=(0,a.useState)(!1),H=(0,a.useCallback)(()=>{let e=v.current;e&&(document.fullscreenElement?document.exitFullscreen().then(()=>X(!1)):e.requestFullscreen().then(()=>X(!0)))},[]);(0,a.useEffect)(()=>{let e=()=>X(!!document.fullscreenElement);return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[]);let q=(0,a.useCallback)(()=>sZ(function*(){if(y&&!D.current){D.current=!0,T(!0),M(0);try{var e,t;yield(e={autoZoom:A},t=e=>M(Math.round(100*e)),sB(function*(){if(sL)throw Error("Video export is already in progress");sL=!0;try{var r,n,i;yield(r=y,n=e,i=t,sB(function*(){var e;let{totalDurationInFrames:t,fps:o}=r,a=null==(e=null==n?void 0:n.autoZoom)||e,s=new Set;for(let e of r.scriptFrames)e.img&&s.add(e.img);let A=new Map;yield Promise.all([...s].map(e=>sB(function*(){try{A.set(e,(yield sU(e)))}catch(e){}})()));let l=new Set([ah]);for(let e of r.scriptFrames)e.pointerImg&&l.add(e.pointerImg);let c=new Map;yield Promise.all([...l].map(e=>sB(function*(){try{c.set(e,(yield sU(e)))}catch(e){}})()));let u=null;try{u=yield sU(af)}catch(e){}let d=document.createElement("canvas");d.width=960,d.height=540;let p=d.getContext("2d"),h=d.captureStream(o),f=new MediaRecorder(h,{mimeType:"video/webm"}),g=[];return f.ondataavailable=e=>{e.data.size>0&&g.push(e.data)},new Promise((e,n)=>{let s=null,l=!1,d=0,m=performance.now(),y=m,v=null,b=null,w=1e3/o,E=()=>{v&&clearTimeout(v),b&&clearTimeout(b),document.removeEventListener("visibilitychange",x),h.getTracks().forEach(e=>e.stop())},k=e=>{l||s||(s=e,"inactive"!==f.state?f.stop():(E(),l=!0,n(e)))},x=()=>{document.hidden&&k(Error("Video export was interrupted because the report tab was hidden"))};f.onerror=()=>{k(Error("MediaRecorder error"))},f.onstop=()=>{if(E(),l)return;if(l=!0,s)return void n(s);if(0===g.length)return void n(Error("No video data"));let t=new Blob(g,{type:"video/webm"}),r=URL.createObjectURL(t),i=document.createElement("a");i.href=r,i.download="midscene_replay.webm",i.click(),setTimeout(()=>URL.revokeObjectURL(r),1e3),e()},document.addEventListener("visibilitychange",x),f.start();let S=e=>{if(!l&&"inactive"!==f.state){if(d>0&&e-y>Math.max(2e3,10*w))return void k(Error("Video export was interrupted because rendering stalled"));y=e,p.clearRect(0,0,960,540),function(e,t,r,n,i,o,a){var s,A,l,c,u,d,p,h,f,g,m,y,v,b,w,E,k;let x,{scriptFrames:S,imageWidth:C,imageHeight:I,fps:j}=r,O=sO(S,t,C,I,j);if(!O.img)return;let{img:P,prevImg:R,imageWidth:T,imageHeight:N,camera:M,prevCamera:D,pointerMoved:z,imageChanged:B,rawProgress:L,frameInScript:U,spinning:K,spinningElapsedMs:F,currentPointerImg:Z,pointerVisible:Q,insights:J}=O,X=a?z?Math.min(L/.375,1):L:1,{camLeft:H,camTop:G,camWidth:q}=(h=D,f=M,g=T,m=z?L<=.375?0:Math.min((L-.375)/.625,1):L,a?{camLeft:(y=h.left,v=f.left,y+(v-y)*m),camTop:(b=h.top,w=f.top,b+(w-b)*m),camWidth:(E=h.width,k=f.width,E+(k-E)*m)}:{camLeft:0,camTop:0,camWidth:g}),W=(A=D.pointerLeft,l=M.pointerLeft,A+(l-A)*X),V=(c=D.pointerTop,u=M.pointerTop,c+(u-c)*X),Y=T/q,{offsetX:_,offsetY:$,contentWidth:ee,contentHeight:et}=sP(960,540,T,N),er=-(ee/T*H),en=-(et/N*G),ei=B?Math.min(Math.max(U/10,0),1):1;e.fillStyle="#000",e.fillRect(0,0,960,540);let eo=(t,r)=>{let i=n.get(t);i&&!(r<=0)&&(e.save(),e.globalAlpha=r,e.beginPath(),e.rect(0,0,960,540),e.clip(),e.translate(_+er*Y,$+en*Y),e.scale(Y,Y),e.drawImage(i,0,0,ee,et),e.restore())};B&&R&&ei<1&&eo(R,1-ei),eo(P,B?ei:1),J.length>0&&function(e,t,r,n){for(let i of(e.save(),e.beginPath(),e.rect(n.offsetX,n.offsetY,n.contentWidth,n.contentHeight),e.clip(),t))if(!(i.alpha<=0)){if(e.save(),e.globalAlpha*=i.alpha,i.highlightElement){let t=sK(am(i.highlightElement),r,n);e.fillStyle="rgba(253, 89, 7, 0.4)",e.fillRect(t.left,t.top,t.width,t.height),e.strokeStyle="#fd5907",e.lineWidth=1,e.strokeRect(t.left,t.top,t.width,t.height),e.shadowColor="rgba(51, 51, 51, 0.4)",e.shadowBlur=2,e.shadowOffsetX=4,e.shadowOffsetY=4,e.strokeRect(t.left,t.top,t.width,t.height),e.shadowBlur=0,e.shadowOffsetX=0,e.shadowOffsetY=0}if(i.searchArea){let t=sK(i.searchArea,r,n);e.fillStyle="rgba(2, 131, 145, 0.4)",e.fillRect(t.left,t.top,t.width,t.height),e.strokeStyle="#028391",e.lineWidth=1,e.strokeRect(t.left,t.top,t.width,t.height)}e.restore()}e.restore()}(e,J,{zoom:Y,tx:er,ty:en},{offsetX:_,offsetY:$,contentWidth:ee,contentHeight:et,imageWidth:T,imageHeight:N});let ea=N/T*q,es=_+(W-H)/q*ee,eA=$+(V-G)/ea*et,el=(sR(ee,"contentWidth"),sT(sN(T).scale*(ee/T))),ec=sM(el),eu=null!=(s=i.get(Z))?s:i.get(ah),ed=sj(Q,M,D,T,N);K&&o&&(d=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({},el),p=p={width:ec.size,height:ec.size,centerOffsetX:ec.centerOffset,centerOffsetY:ec.centerOffset},Object.getOwnPropertyDescriptors?Object.defineProperties(d,Object.getOwnPropertyDescriptors(p)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(p)).forEach(function(e){Object.defineProperty(d,e,Object.getOwnPropertyDescriptor(p,e))}),x=(Math.sin(F/500-Math.PI/2)+1)/2*Math.PI*2,e.save(),e.translate(es,eA),e.rotate(x),e.drawImage(o,-d.centerOffsetX,-d.centerOffsetY,d.width,d.height),e.restore()),!K&&ed&&eu&&e.drawImage(eu,es-el.hotspotX,eA-el.hotspotY,el.width,el.height)}(p,d,r,A,c,u,a),null==i||i((d+1)/t),(d+=1)<t?(m+=w,b=setTimeout(()=>{requestAnimationFrame(S)},Math.max(0,m-performance.now()))):v=setTimeout(()=>{"inactive"!==f.state&&f.stop()},2*w)}};requestAnimationFrame(e=>{y=e,m=e,S(e)})})})())}finally{sL=!1}})()),s.success("Video exported")}catch(e){console.error("Export failed:",e),G(e,{title:"Video export failed"})}finally{D.current=!1,T(!1),M(0)}}})(),[A,y]),W=(0,a.useMemo)(()=>{if(!y||S<=0)return[];let e=[];for(let t of y.scriptFrames){if("img"!==t.type&&"insight"!==t.type||0===t.durationInFrames)continue;let r=t.startFrame,n=r/S*100;if(n>1&&n<99){let i=[t.title,t.subTitle].filter(Boolean);e.push({percent:n,title:i.length>0?i.join(": "):`Chapter ${e.length+1}`,frame:r})}}return e},[y,S]),V=null!=(n=null==e?void 0:e.reportFileContent)?n:null,Y=(null==e?void 0:e.canDownloadReport)!==!1;if(!m||0===m.length||!y)return V&&Y?(0,o.jsx)("div",{className:"player-container player-container-empty",children:(0,o.jsxs)("div",{className:"player-empty-state",children:[(0,o.jsx)("span",{className:"player-empty-text",children:"No replay available"}),(0,o.jsx)(g.Ay,{icon:(0,o.jsx)(sc.A,{}),onClick:()=>{j()},children:"Download report"})]})}):null;let _=(null==I?void 0:I.imageWidth)||y.imageWidth,$=(null==I?void 0:I.imageHeight)||y.imageHeight,ee=$>_,et=S>0?Math.min(100,x.currentFrame/S*100):0;return(0,o.jsx)("div",{className:"player-container","data-fit-mode":null==e?void 0:e.fitMode,children:(0,o.jsxs)("div",{className:"canvas-container",ref:v,onMouseMove:U,onMouseEnter:K,onMouseLeave:F,children:[(0,o.jsx)("div",{className:"player-wrapper","data-portrait":ee?"":void 0,style:{aspectRatio:`${_}/${$}`},children:(0,o.jsx)("div",{ref:b,style:{display:"flex",justifyContent:"center",alignItems:"center",width:"100%",height:"100%",overflow:"hidden"},onClick:C,children:(i=E.width>0&&E.height>0?Math.min(E.width/_,E.height/$):1,(0,o.jsx)("div",{style:{width:_*i,height:$*i,flexShrink:0,position:"relative",overflow:"hidden"},children:(0,o.jsx)("div",{style:{width:_,height:$,transformOrigin:"0 0",transform:`scale(${i})`},children:(0,o.jsx)(sD,{frameMap:y,autoZoom:A&&x.playing,frame:x.currentFrame,width:_,height:$,fps:y.fps})})}))})}),d&&O&&(0,o.jsxs)("div",{className:"player-subtitle",children:[O.title&&(0,o.jsx)("span",{className:"player-subtitle-badge",children:O.title}),O.subTitle&&(0,o.jsx)("span",{className:"player-subtitle-text",children:O.subTitle})]}),(0,o.jsxs)("div",{className:`control-bar ${z?"":"hidden"}`,onClick:e=>e.stopPropagation(),children:[(0,o.jsx)("div",{className:"status-icon",onClick:C,children:x.playing?(0,o.jsx)(su.A,{}):(0,o.jsx)(sd.A,{})}),(0,o.jsxs)("span",{className:"time-display",children:[sQ(Math.min(x.currentFrame,S),y.fps)," ","/ ",sQ(S+1,y.fps)]}),(0,o.jsxs)("div",{className:"seek-bar-track",ref:Z,onPointerDown:Q,children:[(0,o.jsx)("div",{className:"seek-bar-fill",style:{width:`${et}%`}}),(0,o.jsx)("div",{className:"seek-bar-knob",style:{left:`${et}%`}}),W.map(e=>(0,o.jsx)(h.A,{title:e.title,overlayClassName:"chapter-tooltip",children:(0,o.jsx)("div",{className:"chapter-marker",style:{left:`${e.percent}%`},onClick:t=>{t.stopPropagation(),x.seekTo(e.frame)}})},e.percent))]}),(0,o.jsxs)("div",{className:"player-custom-controls",children:[V&&Y?(0,o.jsx)(h.A,{title:"Download Report",children:(0,o.jsx)("div",{className:"status-icon",onClick:()=>{j()},children:(0,o.jsx)(sc.A,{})})}):null,(0,o.jsx)(sy.A,{trigger:["hover","click"],placement:"topRight",overlayStyle:{minWidth:"148px"},dropdownRender:()=>(0,o.jsxs)("div",{className:"player-settings-dropdown",children:[(0,o.jsxs)("div",{className:"player-settings-item",style:{display:"flex",alignItems:"center",gap:"4px",height:"32px",padding:"0 8px",borderRadius:"4px",cursor:P?"not-allowed":"pointer",opacity:P?.5:1},onClick:P?void 0:q,children:[(0,o.jsx)("span",{style:{width:16,height:16,display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:P?(0,o.jsx)(sv.A,{type:"circle",percent:N,size:16,strokeWidth:14,showInfo:!1,strokeColor:"#1677ff",trailColor:"rgba(0, 0, 0, 0.12)"}):(0,o.jsx)(sp.A,{style:{width:"16px",height:"16px"}})}),(0,o.jsx)("span",{className:"player-export-label",children:P?`Exporting ${N}%`:"Export video"})]}),(0,o.jsx)("div",{className:"player-settings-divider"}),(0,o.jsxs)("div",{className:"player-settings-item",style:{display:"flex",alignItems:"center",justifyContent:"space-between",height:"32px",padding:"0 8px",borderRadius:"4px"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"4px"},children:[(0,o.jsx)(sw,{style:{width:"16px",height:"16px"}}),(0,o.jsx)("span",{style:{fontSize:"14px",marginRight:"16px"},children:"Focus on cursor"})]}),(0,o.jsx)(sb.A,{size:"small",checked:A,onChange:e=>l(e)})]}),(0,o.jsxs)("div",{className:"player-settings-item",style:{display:"flex",alignItems:"center",justifyContent:"space-between",height:"32px",padding:"0 8px",borderRadius:"4px"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"4px"},children:[(0,o.jsx)(sh.A,{style:{width:"16px",height:"16px"}}),(0,o.jsx)("span",{style:{fontSize:"14px",marginRight:"16px"},children:"Subtitle"})]}),(0,o.jsx)(sb.A,{size:"small",checked:d,onChange:e=>f(e)})]}),(0,o.jsx)("div",{className:"player-settings-divider"}),(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"4px",height:"32px",padding:"0 8px"},children:[(0,o.jsx)(sf.A,{style:{width:"16px",height:"16px"}}),(0,o.jsx)("span",{style:{fontSize:"14px"},children:"Playback speed"})]}),[.5,1,1.5,2].map(e=>(0,o.jsxs)("div",{onClick:()=>u(e),style:{height:"32px",lineHeight:"32px",padding:"0 8px 0 28px",fontSize:"14px",cursor:"pointer",borderRadius:"4px"},className:`player-speed-option${c===e?" active":""}`,children:[e,"x"]},e))]}),menu:{items:[]},children:(0,o.jsx)("div",{className:"status-icon",children:(0,o.jsx)(sE,{style:{width:"16px",height:"16px"}})})}),(0,o.jsx)("div",{className:"status-icon",onClick:H,children:J?(0,o.jsx)(sg.A,{}):(0,o.jsx)(sm.A,{})})]})]})]})})}let sX=e=>{let{result:t,loading:r,serverValid:n,serviceMode:i,replayScriptsInfo:a,replayCounter:s,loadingProgressText:A,verticalMode:l=!1,notReadyMessage:c,fitMode:u,autoZoom:d,actionType:p,canDownloadReport:h,onDownloadReport:f}=e,g="result-wrapper";l&&(g+=" vertical-mode-result"),a&&l&&(g+=" result-wrapper-compact");let m=so,y=p&&ik.includes(p);if(n||"Server"!==i)if(r)m=(0,o.jsxs)("div",{className:"loading-container",children:[(0,o.jsx)(en.A,{spinning:r,indicator:(0,o.jsx)(ao.A,{spin:!0})}),(0,o.jsx)("div",{className:"loading-progress-text loading-progress-text-progress",children:(0,o.jsx)(sr,{text:A,speed:3})})]});else if(null==t?void 0:t.error){let e=(0,o.jsx)("pre",{style:{color:"#ff4d4f",whiteSpace:"pre-wrap"},children:null==t?void 0:t.error});m=t.reportHTML||a?(0,o.jsxs)("div",{className:"combined-result-layout",children:[(0,o.jsxs)("div",{style:{flex:"0 0 auto",maxHeight:"40%",overflow:"auto"},children:[(0,o.jsx)("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"Error:"}),e]}),(0,o.jsxs)("div",{className:"combined-result-section",children:[(0,o.jsx)("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"Report:"}),(0,o.jsx)("div",{className:"combined-result-player",children:(0,o.jsx)(sJ,{replayScripts:null==a?void 0:a.scripts,imageWidth:null==a?void 0:a.width,imageHeight:null==a?void 0:a.height,reportFileContent:t.reportHTML||null,fitMode:u,autoZoom:d,canDownloadReport:null!=h?h:"In-Browser"!==i,onDownloadReport:f},s)})]})]}):e}else if(y&&(null==t?void 0:t.result)!==void 0&&a){let e="string"==typeof(null==t?void 0:t.result)?(0,o.jsx)("pre",{children:null==t?void 0:t.result}):(0,o.jsx)("pre",{children:JSON.stringify(null==t?void 0:t.result,null,2)}),r=(null==t?void 0:t.reportHTML)||null;m=(0,o.jsxs)("div",{className:"combined-result-layout",children:[(0,o.jsxs)("div",{style:{flex:"0 0 auto"},children:[(0,o.jsx)("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"Output:"}),e]}),(0,o.jsxs)("div",{className:"combined-result-section",children:[(0,o.jsx)("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"Report:"}),(0,o.jsx)("div",{className:"combined-result-player",children:(0,o.jsx)(sJ,{replayScripts:a.scripts,imageWidth:a.width,imageHeight:a.height,reportFileContent:r,fitMode:u,autoZoom:d,canDownloadReport:null!=h?h:"In-Browser"!==i,onDownloadReport:f},s)})]})]})}else if(a){let e=(null==t?void 0:t.reportHTML)||null;m=(0,o.jsx)(sJ,{replayScripts:a.scripts,imageWidth:a.width,imageHeight:a.height,reportFileContent:e,fitMode:u,autoZoom:d,canDownloadReport:null!=h?h:"In-Browser"!==i,onDownloadReport:f},s)}else if(y&&(null==t?void 0:t.result)!==void 0&&(null==t?void 0:t.reportHTML)){let e="string"==typeof(null==t?void 0:t.result)?(0,o.jsx)("pre",{children:null==t?void 0:t.result}):(0,o.jsx)("pre",{children:JSON.stringify(null==t?void 0:t.result,null,2)});m=(0,o.jsxs)("div",{className:"combined-result-layout",children:[(0,o.jsxs)("div",{style:{flex:"0 0 auto"},children:[(0,o.jsx)("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"Output:"}),e]}),(0,o.jsxs)("div",{className:"combined-result-section",children:[(0,o.jsx)("div",{style:{fontWeight:"bold",marginBottom:"8px"},children:"Report:"}),(0,o.jsx)("div",{className:"combined-result-player",children:(0,o.jsx)(sJ,{reportFileContent:t.reportHTML,fitMode:u,autoZoom:d,canDownloadReport:null!=h?h:"In-Browser"!==i,onDownloadReport:f},s)})]})]})}else y&&(null==t?void 0:t.result)!==void 0?m="string"==typeof(null==t?void 0:t.result)?(0,o.jsx)("pre",{children:null==t?void 0:t.result}):(0,o.jsx)("pre",{children:JSON.stringify(null==t?void 0:t.result,null,2)}):(null==t?void 0:t.reportHTML)?m=(0,o.jsx)(sJ,{reportFileContent:t.reportHTML,fitMode:u,autoZoom:d,canDownloadReport:null!=h?h:"In-Browser"!==i,onDownloadReport:f},s):(null==t?void 0:t.result)!==void 0&&(m="string"==typeof(null==t?void 0:t.result)?(0,o.jsx)("pre",{children:null==t?void 0:t.result}):(0,o.jsx)("pre",{children:JSON.stringify(null==t?void 0:t.result,null,2)}));else m=si(c);return(0,o.jsx)("div",{className:g,style:{height:"100%",display:"flex",flexDirection:"column",flex:"1 1 auto",justifyContent:"center"},children:m})},sH=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:20,height:20,fill:"none","aria-label":"Playground",viewBox:"0 0 20 20"},e),r=r={children:[(0,o.jsx)("rect",{width:20,height:20,fill:"#2B83FF",rx:10}),(0,o.jsx)("path",{fill:"#2B83FF",stroke:"#fff",strokeLinejoin:"round",strokeWidth:1.125,d:"M6.866 5.882a.56.56 0 0 1 .667-.078l3.248 1.875 3.247 1.875a.563.563 0 0 1 0 .974l-3.247 1.875-3.248 1.875a.563.563 0 0 1-.784-.74l1.749-3.497-1.75-3.498a.56.56 0 0 1 .118-.661Z"})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))};function sG(){return(0,a.createElement)("svg",{width:16,height:16,viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":!0,focusable:!1},(0,a.createElement)("path",{d:"M3 7.99984L6.33333 11.3332L13 4.6665",stroke:"#188F4D",strokeWidth:"1.2",strokeLinecap:"round",strokeLinejoin:"round"}))}let sq="ZodOptional",sW="ZodDefault",sV="ZodNullable",sY="ZodObject",s_="midscene_location_field_flag",s$=e=>"object"==typeof e&&null!==e&&("shape"in e||"ZodObject"===e.type),s0=e=>{var t,r,n;if((null==(t=e._def)?void 0:t.typeName)===sY){let t;if(e._def.shape&&(t="function"==typeof e._def.shape?e._def.shape():e._def.shape),!t&&e.shape&&(t=e.shape),t&&s_ in t)return!0;let n=(null==(r=e._def)?void 0:r.description)||e.description||"";if("string"==typeof n&&n.toLowerCase().includes("input field"))return!0}if("object"==typeof e&&null!==e){let t=e.description||(null==(n=e._def)?void 0:n.description)||"";if("string"==typeof t){let e=t.toLowerCase();if(e.includes("input field")||e.includes("element")||e.includes("locate"))return!0}if("ZodObject"===e.typeName||"ZodObject"===e.type)return"string"==typeof t&&t.toLowerCase().includes("input field")}return!1},s1=e=>{var t,r,n,i,o;let a=e,s=!1,A=!1;for(;(null==(t=a._def)?void 0:t.typeName)===sq||(null==(r=a._def)?void 0:r.typeName)===sW||(null==(n=a._def)?void 0:n.typeName)===sV;)(null==(i=a._def)?void 0:i.typeName)===sq&&(s=!0),(null==(o=a._def)?void 0:o.typeName)===sW&&(A=!0),a=a._def.innerType||a;return{actualField:a,isOptional:s,hasDefault:A}},s2=(e,t)=>{var r,n;if(!(null==e?void 0:e.length)||!t)return null;let i=e.find(e=>e.interfaceAlias===t||e.name===t);if(!(null==i?void 0:i.paramSchema)||!s$(i.paramSchema))return null;let o=i.paramSchema.shape||{},a=Object.keys(o);if(1!==a.length)return null;let[s]=a,{actualField:A}=s1(o[s]),l=s0(A);if(!("ZodString"===(null==(r=A._def)?void 0:r.typeName)||l))return null;let c=(null==(n=A._def)?void 0:n.description)||A.description||(l?"Describe the element you want to interact with":`Enter ${s}`);return{name:s,placeholder:c}};var s3=r(8460),s5=r(3896),s7=r(3246),s4=r(1631),s8=r(4665);let s6=e=>{var t,r;return(0,o.jsx)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:6,height:10,fill:"none",viewBox:"0 0 6 10"},e),r=r={children:(0,o.jsx)("path",{fill:"#000",fillOpacity:.25,fillRule:"evenodd",d:"M.195 9.138a.667.667 0 0 1 0-.943l3.529-3.528L.195 1.138a.667.667 0 0 1 .943-.943l4 4c.26.26.26.683 0 .943l-4 4a.667.667 0 0 1-.943 0",clipRule:"evenodd"})},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},s9=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",viewBox:"0 0 16 16"},e),r=r={children:[(0,o.jsx)("path",{stroke:"#878787",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.33,d:"M1.505 4.164c-2.862 6.126 2.197 10.501 6.063 10.501a7 7 0 1 0-6.063-10.5"}),(0,o.jsx)("path",{stroke:"#878787",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.33,d:"M7.57 3.465v4.203l2.967 2.968"})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))};var Ae={};Ae.d=(e,t)=>{for(var r in t)Ae.o(t,r)&&!Ae.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},Ae.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),Ae.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var At={};function Ar(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}Ae.r(At),Ae.d(At,{create:()=>v.vt});let{create:An}=At,Ai="midscene-prompt-history-v2",Ao="midscene-last-selected-type",Aa=An((e,t)=>{let r;return{history:(r=localStorage.getItem(Ai))?JSON.parse(r):{},lastSelectedType:localStorage.getItem(Ao)||"aiAct",clearHistory:r=>{let n=Ar({},t().history);delete n[r],e({history:n}),localStorage.setItem(Ai,JSON.stringify(n))},addHistory:r=>{var n,i;let{type:o}=r,a=t().history,s=a[o]||[],A=JSON.stringify({prompt:r.prompt,params:r.params}),l=[r,...s.filter(e=>JSON.stringify({prompt:e.prompt,params:e.params})!==A)];l.length>10&&(l.length=10);let c=(n=Ar({},a),i=i={[o]:l},Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(i)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(i)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(i,e))}),n);e({history:c}),localStorage.setItem(Ai,JSON.stringify(c))},getHistoryForType:e=>t().history[e]||[],setLastSelectedType:t=>{e({lastSelectedType:t}),localStorage.setItem(Ao,t)}}}),As=e=>{if(!e)return"";if("aiAct"===e)return"Action";let t=e.startsWith("ai")?e.slice(2):e;if(t.startsWith("IOS"))return t.substring(3).replace(/([A-Z])/g," $1").replace(/^/,"IOS").trim();let r=t.replace(/([A-Z])/g," $1").trim(),n=r.split(" ");return(n.length>3?n.slice(-3).join(" "):r).replace(/\b\w/g,e=>e.toUpperCase())};function AA(e){return{supportsImeStrategy:"android"===e,supportsKeyboardDismissStrategy:"android"===e||"harmony"===e,supportsAutoDismissKeyboard:"android"===e||"ios"===e||"harmony"===e,supportsAlwaysRefreshScreenInfo:"android"===e}}function Al(e){return Object.values(AA(e)).some(Boolean)}var Ac=r(6356);let Au=e=>{var t,r;return(0,o.jsx)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:27,height:27,fill:"none",viewBox:"0 0 27 27"},e),r=r={children:(0,o.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeOpacity:.85,strokeWidth:1.333,d:"M19.527 8.855h-2M14.86 7.522v2.667M14.86 8.855H7.527M10.194 13.522H7.527M12.86 12.189v2.666M20.193 13.522H12.86M19.527 18.189h-2M14.86 16.855v2.667M14.86 18.189H7.527"})},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},Ad=e=>{let t,{showDeepLocateOption:r=!1,showDeepThinkOption:n=!1,enableTracking:i=!1,showDataExtractionOptions:a=!1,hideDomAndScreenshotOptions:s=!1,deviceType:A,trigger:l,popupPlacement:c="bottomRight"}=e,u=X(e=>e.forceSameTabNavigation),d=X(e=>e.setForceSameTabNavigation),p=X(e=>e.deepLocate),f=X(e=>e.setDeepLocate),g=X(e=>e.deepThink),m=X(e=>e.setDeepThink),y=X(e=>e.screenshotIncluded),v=X(e=>e.setScreenshotIncluded),b=X(e=>e.domIncluded),w=X(e=>e.setDomIncluded),E=X(e=>e.imeStrategy),k=X(e=>e.setImeStrategy),x=X(e=>e.autoDismissKeyboard),S=X(e=>e.setAutoDismissKeyboard),C=X(e=>e.keyboardDismissStrategy),I=X(e=>e.setKeyboardDismissStrategy),j=X(e=>e.alwaysRefreshScreenInfo),O=X(e=>e.setAlwaysRefreshScreenInfo),P=AA(A),R=Al(A);if(!i&&!r&&!n&&!a&&!R)return null;let T=(t=[],i&&t.push({label:(0,o.jsx)(Ac.A,{onChange:e=>d(e.target.checked),checked:u,children:"Limit popup to current tab"}),key:"track-config"}),r&&t.push({label:(0,o.jsx)(Ac.A,{onChange:e=>{f(e.target.checked)},checked:p,children:"Deep Locate"}),key:"deep-locate-config"}),n&&t.push({label:(0,o.jsxs)("div",{style:{padding:"4px 0"},children:[(0,o.jsx)("div",{style:{marginBottom:"4px",fontSize:"14px"},children:"Deep Think"}),(0,o.jsxs)(s8.A.Group,{size:"small",value:g,onChange:e=>m(e.target.value),children:[(0,o.jsx)(h.A,{title:"Controlled by MIDSCENE_MODEL_REASONING_ENABLED env variable",children:(0,o.jsx)(s8.A,{value:"unset",children:"Auto"})}),(0,o.jsx)(s8.A,{value:!0,children:"On"}),(0,o.jsx)(s8.A,{value:!1,children:"Off"})]})]}),key:"deep-think-config"}),a&&!s&&(t.push({label:(0,o.jsx)(Ac.A,{onChange:e=>{v(e.target.checked)},checked:y,children:"Include screenshot in request"}),key:"screenshot-included-config"}),t.push({label:(0,o.jsxs)("div",{style:{padding:"4px 0"},children:[(0,o.jsx)("div",{style:{marginBottom:"4px",fontSize:"14px"},children:"Include DOM info in request"}),(0,o.jsxs)(s8.A.Group,{size:"small",value:b,onChange:e=>w(e.target.value),children:[(0,o.jsx)(s8.A,{value:!1,children:"Off"}),(0,o.jsx)(s8.A,{value:!0,children:"All"}),(0,o.jsx)(s8.A,{value:"visible-only",children:"Visible only"})]})]}),key:"dom-included-config"})),P.supportsImeStrategy&&(t.push({label:(0,o.jsxs)("div",{style:{padding:"4px 0"},children:[(0,o.jsx)("div",{style:{marginBottom:"4px",fontSize:"14px"},children:"IME strategy"}),(0,o.jsxs)(s8.A.Group,{size:"small",value:E,onChange:e=>k(e.target.value),children:[(0,o.jsx)(s8.A,{value:"always-yadb",children:"Always YADB"}),(0,o.jsx)(s8.A,{value:"yadb-for-non-ascii",children:"YADB for non-ASCII"})]})]}),key:"ime-strategy-config"}),P.supportsAutoDismissKeyboard&&t.push({label:(0,o.jsx)(Ac.A,{onChange:e=>S(e.target.checked),checked:x,children:al}),key:"auto-dismiss-keyboard-config"}),P.supportsKeyboardDismissStrategy&&t.push({label:(0,o.jsxs)("div",{style:{padding:"4px 0"},children:[(0,o.jsx)("div",{style:{marginBottom:"4px",fontSize:"14px"},children:"Keyboard dismiss strategy"}),(0,o.jsxs)(s8.A.Group,{size:"small",value:C,onChange:e=>I(e.target.value),children:[(0,o.jsx)(s8.A,{value:"esc-first",children:"ESC first"}),(0,o.jsx)(s8.A,{value:"back-first",children:"Back first"})]})]}),key:"keyboard-dismiss-strategy-config"}),P.supportsAlwaysRefreshScreenInfo&&t.push({label:(0,o.jsx)(Ac.A,{onChange:e=>O(e.target.checked),checked:j,children:"Always refresh screen info"}),key:"always-refresh-screen-info-config"})),!P.supportsImeStrategy&&P.supportsAutoDismissKeyboard&&t.push({label:(0,o.jsx)(Ac.A,{onChange:e=>S(e.target.checked),checked:x,children:al}),key:"auto-dismiss-keyboard-config"}),t),N=null!=l?l:(0,o.jsx)("button",{"aria-label":"Open run configuration",className:"selector-trigger-button",type:"button",children:(0,o.jsx)(Au,{width:24,height:24})});return(0,o.jsx)("div",{className:"selector-trigger",children:(0,o.jsx)(sy.A,{getPopupContainer:e=>e.ownerDocument.body,menu:{items:T},overlayClassName:"config-selector-dropdown",overlayStyle:{zIndex:10010},placement:c,trigger:["click"],children:N})})};var Ap=r(7991),Ah=r(2752);let{TextArea:Af}=m.A,Ag=(e,t)=>`${e}${t?" (Optional)":""}`,Am=e=>{let{name:t,label:r,isRequired:n,marginBottom:i,placeholder:a}=e,s=a||`Enter ${t}`;return(0,o.jsx)(o0.A.Item,{name:["params",t],label:Ag(r,!n),rules:n?[{required:!0,message:`Please input ${t}`}]:[],style:{marginBottom:i},colon:!1,children:(0,o.jsx)(m.A,{placeholder:s})},t)},Ay=e=>{let{name:t,label:r,isRequired:n,marginBottom:i,placeholder:a}=e,s=a||`Describe the ${t}, use natural language`;return(0,o.jsx)(o0.A.Item,{name:["params",t],label:Ag(r,!n),rules:n?[{required:!0,message:`The ${t} is required`}]:[],style:{marginBottom:i},colon:!1,children:(0,o.jsx)(Af,{rows:2,placeholder:s})},t)},Av=e=>{var t;let{name:r,label:n,fieldSchema:i,isRequired:a,marginBottom:s,placeholder:A}=e,l=((null==(t=i._def)?void 0:t.values)||[]).map(e=>({value:e,label:e.charAt(0).toUpperCase()+e.slice(1)}));return(0,o.jsx)(o0.A.Item,{name:["params",r],label:n,rules:a?[{required:!0,message:`Please select ${r}`}]:[],style:{marginBottom:s},colon:!1,children:(0,o.jsx)(Ap.A,{placeholder:A||`Select ${r}`,options:l})},r)},Ab=e=>{let{name:t,label:r,isRequired:n,marginBottom:i,placeholder:a}=e,s=500*("distance"===t),A=a&&Number(a)||s,l="distance"===t?1e4:void 0;return(0,o.jsx)(o0.A.Item,{name:["params",t],label:`${r}${"distance"===t?" (px)":""}`,rules:n?[{required:!0,message:`Please input ${t}`},{type:"number",min:0,message:`${r} must be at least 0`}]:[{type:"number",min:0,message:`${r} must be at least 0`}],style:{flex:"distance"===t?1:void 0,marginBottom:i},colon:!1,children:(0,o.jsx)(Ah.A,{placeholder:A.toString(),min:0,max:l,step:"distance"===t?10:1,style:{width:"100%"}})},t)},Aw=e=>{let{name:t,label:r,isRequired:n,marginBottom:i,placeholder:a}=e;return(0,o.jsx)(o0.A.Item,{name:["params",t],label:Ag(r,!n),rules:n?[{required:!0,message:`Please select ${t}`}]:[],style:{marginBottom:i},colon:!1,children:(0,o.jsx)(Ap.A,{placeholder:a||`Select ${t}`,options:[{value:!0,label:"True"},{value:!1,label:"False"}]})},t)};var AE=r(316);let Ak=e=>{var t,r;return(0,o.jsx)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:18,height:16,fill:"none",viewBox:"0 0 18 16"},e),r=r={children:(0,o.jsx)("path",{stroke:"#333",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.333,d:"m3.124 2.667 11.162 10.666M3.124 13.333 14.286 2.667"})},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},Ax=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:25,height:25,fill:"none",viewBox:"0 0 25 25"},e),r=r={children:[(0,o.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeOpacity:.85,strokeWidth:1.33,d:"M6.63 9.021c-2.862 6.126 2.197 10.501 6.063 10.501a7 7 0 1 0-6.063-10.5"}),(0,o.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeOpacity:.85,strokeWidth:1.33,d:"M12.695 8.322v4.203l2.967 2.968"})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},AS=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:19,height:19,fill:"none",viewBox:"0 0 19 19"},e),r=r={children:[(0,o.jsxs)("g",{stroke:"currentColor",strokeLinejoin:"round",strokeOpacity:.65,strokeWidth:1.5,clipPath:"url(#magnifying-glass_svg__a)",children:[(0,o.jsx)("path",{d:"M8.397 14.29a6.375 6.375 0 1 0 0-12.75 6.375 6.375 0 0 0 0 12.75Z"}),(0,o.jsx)("path",{strokeLinecap:"round",d:"M10.519 5.42a3 3 0 0 0-2.122-.88 3 3 0 0 0-2.121.88M12.98 12.499l3.182 3.182"})]}),(0,o.jsx)("defs",{children:(0,o.jsx)("clipPath",{id:"magnifying-glass_svg__a",children:(0,o.jsx)("path",{fill:"#fff",d:"M.522.04h18v18h-18z"})})})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},{Text:AC}=u.A,AI=e=>{let{onSelect:t,history:r,currentType:n,trigger:i,popupPlacement:s="bottom",title:A="History",showClear:l=!0,onClear:c,searchPlaceholder:u="Search",emptyText:d="No history record",noMatchText:p="No matching history record",renderItemActions:h,renderItemLabel:f,overlayClassName:y,popupWidth:v=320,popupHeight:b=400,portalContainerSelector:w}=e,[E,k]=(0,a.useState)(!1),[x,S]=(0,a.useState)(""),[C,I]=(0,a.useState)(0),j=Aa(e=>e.clearHistory),O=(0,a.useRef)(null),P=(0,a.useRef)(null),[R,T]=(0,a.useState)(null),[N,M]=(0,a.useState)(null),[D,z]=(0,a.useState)(!1),B=(0,a.useMemo)(()=>{let e=Date.now(),t=e-6048e5,n=e-31536e6,i=r.filter(e=>e.prompt.toLowerCase().includes(x.toLowerCase()));return{recent7Days:i.filter(e=>e.timestamp>=t),recent1Year:i.filter(e=>e.timestamp<t&&e.timestamp>=n),older:i.filter(e=>e.timestamp<n)}},[r,x]),L=()=>{k(!1)};(0,a.useEffect)(()=>{if(!E)return;let e=()=>{var e,t;if(!P.current)return;let r=P.current.getBoundingClientRect(),n=w?P.current.closest(w):null,i=null==n?void 0:n.getBoundingClientRect(),o=null!=(e=null==i?void 0:i.width)?e:window.innerWidth,a=null!=(t=null==i?void 0:i.height)?t:window.innerHeight,A=i?r.right-i.left:r.right,l=i?r.top-i.top:r.top,c=i?r.bottom-i.top:r.bottom,u=Math.max(16,o-v-16),d=Math.max(16,a-b-16);T({left:Math.min(Math.max(16,A-v),u),top:Math.min(Math.max(16,"top"===s?l-b-8:c+8),d)}),M(null!=n?n:document.body),z(!!n)},t=e=>{O.current&&!O.current.contains(e.target)&&P.current&&!P.current.contains(e.target)&&k(!1)};e();let r=setTimeout(()=>{document.addEventListener("click",t)},100);return window.addEventListener("resize",e),window.addEventListener("scroll",e,!0),()=>{clearTimeout(r),document.removeEventListener("click",t),window.removeEventListener("resize",e),window.removeEventListener("scroll",e,!0)}},[E,b,s,v,w]);let U=(e,r)=>0===r.length?null:(0,o.jsxs)("div",{className:"history-group",children:[(0,o.jsx)("div",{className:"history-group-title",children:e}),r.map((e,r)=>(0,o.jsxs)("div",{className:"history-item",onClick:()=>{t(e),k(!1)},children:[(0,o.jsx)("span",{className:"history-item-label",children:f?f(e,{close:L}):e.prompt}),h?(0,o.jsx)("span",{className:"history-item-actions",onClick:e=>e.stopPropagation(),children:h(e,{close:L,scrollVersion:C})}):null]},`${e.timestamp}-${r}`))]},e);return(0,o.jsxs)("div",{className:"history-selector-wrapper",children:[(0,o.jsx)("div",{className:"selector-trigger",onClick:()=>k(e=>!e),ref:P,children:null!=i?i:(0,o.jsx)(Ax,{width:24,height:24})}),E&&R&&N&&(0,AE.createPortal)((0,o.jsx)("div",{className:y?`history-modal-overlay ${y}${D?" history-modal-overlay-in-container":""}`:`history-modal-overlay${D?" history-modal-overlay-in-container":""}`,ref:O,style:R,children:(0,o.jsxs)("div",{className:"history-modal-container",children:[(0,o.jsxs)("div",{className:"history-modal-header",children:[(0,o.jsxs)(AC,{strong:!0,style:{fontSize:"16px"},children:[A," (",r.length,")"]}),(0,o.jsx)(g.Ay,{size:"small",type:"text",icon:(0,o.jsx)(Ak,{width:16,height:16}),onClick:()=>k(!1),className:"close-button"})]}),(0,o.jsx)("div",{className:"history-search-section",children:(0,o.jsxs)("div",{className:"search-input-wrapper",children:[(0,o.jsx)(m.A,{placeholder:u,value:x,onChange:e=>S(e.target.value),prefix:(0,o.jsx)(AS,{width:18,height:18}),className:"search-input",allowClear:!0}),l?(0,o.jsx)(g.Ay,{type:"link",onClick:()=>{c?c():j(n),S(""),k(!1)},className:"clear-button",disabled:0===r.length,children:"Clear"}):null]})}),(0,o.jsx)("div",{className:"history-content",onScroll:()=>{I(e=>e+1)},children:0===r.length?(0,o.jsx)("div",{className:"no-results",children:(0,o.jsx)(AC,{type:"secondary",children:d})}):(0,o.jsxs)(o.Fragment,{children:[U("Last 7 days",B.recent7Days),U("Last 1 year",B.recent1Year),U("Earlier",B.older),x&&0===B.recent7Days.length&&0===B.recent1Year.length&&0===B.older.length&&(0,o.jsx)("div",{className:"no-results",children:(0,o.jsx)(AC,{type:"secondary",children:p})})]})})]})}),N)]})};function Aj(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}let{TextArea:AO}=m.A,AP=e=>{var t,r,n,i,s,A,l;let{runButtonEnabled:c,form:u,serviceMode:d,selectedType:p,dryMode:f,stoppable:y,loading:v,onRun:b,onStop:w,clearPromptAfterRun:E=!0,actionSpace:k,hideDomAndScreenshotOptions:x=!1,deviceType:S,chrome:C}=e,[I,j]=(0,a.useState)(!1),[O,P]=(0,a.useState)(""),R="aiQuery"===p?"What do you want to query?":"aiAssert"===p?"What do you want to assert?":"aiTap"===p?"What element do you want to tap?":"aiDoubleClick"===p?"What element do you want to double-click?":"aiHover"===p?"What element do you want to hover over?":"aiInput"===p?"Format: <value> | <element>\nExample: hello world | search box":"aiRightClick"===p?"What element do you want to right-click?":"aiKeyboardPress"===p?"Format: <key> | <element (optional)>\nExample: Enter | text field":"aiScroll"===p?"Format: <direction> <amount> | <element (optional)>\nExample: down 500 | main content":"aiLocate"===p?"What element do you want to locate?":"aiBoolean"===p?"What do you want to check (returns true/false)?":"aiNumber"===p?"What number do you want to extract?":"aiString"===p?"What text do you want to extract?":"aiAsk"===p?"What do you want to ask?":"aiWaitFor"===p?"What condition do you want to wait for?":"What do you want to do?",T=(null==C?void 0:C.variant)==="minimal",N=(null==C?void 0:C.placeholder)||R,M=(l=null==C?void 0:C.primaryActionLabel)?l:As(p)||"Action",D=(0,a.useRef)(null),z=(0,a.useRef)(null),B=o0.A.useWatch("params",u),L=(0,a.useRef)(null),U=Aa(e=>e.history),K=Aa(e=>e.lastSelectedType),F=Aa(e=>e.addHistory),Z=Aa(e=>e.setLastSelectedType),Q=(0,a.useMemo)(()=>U[p]||[],[U,p]),{markExplicitSelection:J,skipNextRestore:X,shouldSkipRestoreOnce:H}=function(e){let{enabled:t,form:r,selectedType:n,onAfterReset:i,defaultType:o="aiAct"}=e,[s,A]=(0,a.useState)(!1),l=(0,a.useRef)(!1);(0,a.useEffect)(()=>{t&&!s&&n&&n!==o&&(l.current=!1,r.setFieldsValue({type:o,prompt:"",params:{}}),null==i||i())},[t,s,n,o,r,i]);let c=(0,a.useCallback)(()=>{t&&A(!0)},[t]),u=(0,a.useCallback)(()=>{l.current=!0},[]),d=(0,a.useCallback)(()=>!!l.current&&(l.current=!1,!0),[]);return(0,a.useMemo)(()=>({markExplicitSelection:c,skipNextRestore:u,shouldSkipRestoreOnce:d}),[c,u,d])}({enabled:T,form:u,selectedType:p,onAfterReset:(0,a.useCallback)(()=>{L.current=null,P("")},[])}),G=(0,a.useMemo)(()=>{if(k){let e=k.find(e=>e.interfaceAlias===p||e.name===p);return!!(null==e?void 0:e.paramSchema)&&(!s$(e.paramSchema)||Object.keys(e.paramSchema.shape||{}).length>0)}return!1},[p,k]),q=(0,a.useMemo)(()=>{if(k&&k.length>0){let e=k.find(e=>e.interfaceAlias===p||e.name===p);if(e){if(e.paramSchema&&s$(e.paramSchema)){let t=e.paramSchema.shape||{};return Object.keys(t).some(e=>{let{isOptional:r}=s1(t[e]);return!r})}return!!e.paramSchema}}return!0},[p,k]),W=(0,a.useMemo)(()=>["aiQuery","aiBoolean","aiNumber","aiString","aiAsk","aiAssert"].includes(p),[p]),V=(0,a.useMemo)(()=>{if("aiAct"===p||"aiLocate"===p)return!0;if(k){let e=k.find(e=>e.interfaceAlias===p||e.name===p);if((null==e?void 0:e.paramSchema)&&s$(e.paramSchema)){let t=e.paramSchema.shape||{};return Object.keys(t).some(e=>{let{actualField:r}=s1(t[e]);return s0(r)})}}return!1},[p,k]),Y=(0,a.useMemo)(()=>"aiAct"===p,[p]),_=(0,a.useMemo)(()=>{let e="In-Browser-Extension"===d,t=W&&!x,r=Al(S);return e||V||Y||t||r},[d,V,Y,W,x,S]),$=(0,a.useMemo)(()=>(e=>{let t=Object.keys(ac);if(!(null==e?void 0:e.length))return t;let r=e.map(e=>e.interfaceAlias||e.name),n=new Set;return t.forEach(e=>{let t=ac[e];"aiAct"===e||(null==t?void 0:t.group)==="extraction"||(null==t?void 0:t.group)==="validation"?n.add(e):r.includes(e)&&n.add(e)}),r.forEach(e=>{n.add(e)}),Array.from(n)})(k),[k]),ee=(0,a.useMemo)(()=>$.filter(e=>!au.includes(e)),[$]),et=(0,a.useCallback)(e=>{J(),u.setFieldValue("type",e)},[u,J]),er=(0,a.useMemo)(()=>[{key:"interaction-group",label:"Interaction APIs",match:e=>{var t;return(null==(t=ac[e])?void 0:t.group)==="interaction"}},{key:"extraction-group",label:"Data Extraction APIs",match:e=>{var t;return(null==(t=ac[e])?void 0:t.group)==="extraction"}},{key:"validation-group",label:"Validation APIs",match:e=>{var t;return(null==(t=ac[e])?void 0:t.group)==="validation"}},{key:"device-specific-group",label:"Device-Specific APIs",match:e=>!ac[e]}],[]),en=(0,a.useCallback)(e=>{var t;return{key:e,label:As(e),title:(null==(t=ac[e])?void 0:t.title)||"",onClick:()=>et(e)}},[et]),ei=(0,a.useMemo)(()=>{let e=[];for(let t of er){let r=ee.filter(t.match);0!==r.length&&e.push({key:t.key,type:"group",label:t.label,children:r.map(en)})}return e},[er,ee,en]),eo=(0,a.useMemo)(()=>{let e=au.filter(e=>$.includes(e)),t=[];return e.length>0&&t.push({key:"primary-group",type:"group",label:"Primary APIs",children:e.map(en)}),t.push(...ei),{items:t}},[$,en,ei]),ea=(0,a.useMemo)(()=>({items:ei}),[ei]),es=(0,a.useCallback)(()=>{if(!G||!k)return{};let e=k.find(e=>e.interfaceAlias===p||e.name===p);if((null==e?void 0:e.paramSchema)&&s$(e.paramSchema)){let t={},r=e.paramSchema.shape||{};return Object.keys(r).forEach(e=>{let n=(e=>{var t;let r=e;for(;null==(t=r._def)?void 0:t.innerType;){if(r._def.typeName===sW){if("function"==typeof r._def.defaultValue)return r._def.defaultValue();if(void 0!==r._def._serializedDefaultValue)return r._def._serializedDefaultValue}r=r._def.innerType}})(r[e]);void 0!==n&&(t[e]=n)}),t}return{}},[p,G,k]);(0,a.useEffect)(()=>{T||u.getFieldValue("type")||!K||u.setFieldValue("type",K)},[u,T,K]),(0,a.useEffect)(()=>{!T&&p&&p!==K&&Z(p)},[p,T,K,Z]);let eA=(0,a.useCallback)(()=>{let e=z.current;if(!e)return;let t=null,r=e.querySelector(".ant-radio-button-wrapper-checked"),n=e.querySelector(".more-apis-button.selected-from-dropdown");if(r?t=r:n&&(t=n),t){let r=e.getBoundingClientRect(),n=t.getBoundingClientRect(),i=n.left-r.left+e.scrollLeft,o=n.width,a=r.width;e.scrollTo({left:Math.max(0,i-(a-o)/2),behavior:"smooth"})}},[]);(0,a.useEffect)(()=>{if(H())return;if(T){let e=es();u.setFieldsValue({prompt:"",params:e}),P(""),L.current=null;return}let e=Q[0];if(!e||!L.current||e.timestamp!==L.current.timestamp)if(e)u.setFieldsValue({type:e.type,prompt:e.prompt||"",params:e.params}),P(e.prompt||""),L.current=e;else{let e=es();u.setFieldsValue({prompt:"",params:e}),P(""),L.current=null}},[p,Q,u,es,T,H]),(0,a.useEffect)(()=>{let e=setTimeout(()=>{eA()},100);return()=>clearTimeout(e)},[p,eA]);let el=o0.A.useWatch("prompt",u);(0,a.useEffect)(()=>{el!==O&&P(el||"")},[el,O]);let ec=(0,a.useCallback)(e=>{J(),e.type!==p&&X(),u.setFieldsValue({prompt:e.prompt,type:e.type,params:e.params}),P(e.prompt)},[u,J,p,X]),eu=(0,a.useCallback)(e=>{P(e.target.value)},[]),ed=(0,a.useMemo)(()=>{if(!G||!k)return!1;let e=k.find(e=>e.interfaceAlias===p||e.name===p);return!!((null==e?void 0:e.paramSchema)&&s$(e.paramSchema))&&1===Object.keys(e.paramSchema.shape||{}).length},[p,G,k]),ep=(0,a.useMemo)(()=>T?s2(k,p):null,[k,T,p]),eh=(0,a.useMemo)(()=>((e,t,r,n,i,o)=>{if(!e)return!1;if(!(()=>{if(n){let e=n.find(e=>e.interfaceAlias===i||e.name===i);if(e){if(!e.paramSchema)return!1;if("object"==typeof e.paramSchema&&"shape"in e.paramSchema)return Object.keys(e.paramSchema.shape||{}).length>0}}return!0})())return!0;if(t){let e=r||{},t=null==n?void 0:n.find(e=>e.interfaceAlias===i||e.name===i);if((null==t?void 0:t.paramSchema)&&s$(t.paramSchema)){let r=t.paramSchema.shape||{};return Object.keys(r).every(t=>{let{isOptional:n}=s1(r[t]),i=e[t];return n||void 0!==i&&""!==i&&null!==i})}return!0}return o.trim().length>0})(c,!!G,B,k,p,O),[c,G,p,k,O,B]),ef=(0,a.useCallback)(()=>{let e=u.getFieldsValue(),t="";if(G&&e.params&&k){let r=k.find(e=>e.interfaceAlias===p||e.name===p);if((null==r?void 0:r.paramSchema)&&s$(r.paramSchema)){let n="",i=[],o=r.paramSchema.shape||{};Object.keys(o).forEach(t=>{var r;let a=null==(r=e.params)?void 0:r[t];if(null!=a&&""!==a){let{actualField:e}=s1(o[t]);s0(e)?n=String(a):"distance"===t?i.push(`${a}`):i.push(String(a))}});let a=i.join(" ");t=n?`${n} - ${a}`:a}else t=e.prompt||""}else t=e.prompt||"";let r={type:e.type,prompt:t,params:e.params,timestamp:Date.now()};if(F(r),b(),E)if(L.current=r,P(""),G){let e=es();u.setFieldValue("params",e)}else u.setFieldValue("prompt","")},[u,F,b,G,p,E,k,es]),eg=(0,a.useCallback)(e=>{"Enter"===e.key&&e.metaKey&&eh?(ef(),e.preventDefault(),e.stopPropagation()):"Enter"===e.key&&setTimeout(()=>{if(D.current){var e;let t=null==(e=D.current.resizableTextArea)?void 0:e.textArea;if(t){let e=t.selectionStart,r=t.value.lastIndexOf("\n");(-1===r||e>r)&&(t.scrollTop=t.scrollHeight)}}},0)},[ef,eh]),em=(0,a.useCallback)(e=>{"Enter"===e.key&&e.metaKey&&eh&&(ef(),e.preventDefault(),e.stopPropagation())},[ef,eh]),ey=(0,a.useCallback)(()=>{if(!G)return null;if(k){let e=k.find(e=>e.interfaceAlias===p||e.name===p);if((null==e?void 0:e.paramSchema)&&s$(e.paramSchema)){let t=e.paramSchema.shape||{},r=Object.keys(t);if(1===r.length){let e=r[0],{actualField:n}=s1(t[e]),i=s0(n),a=(()=>{var t,r;if(null==(t=n._def)?void 0:t.description)return n._def.description;if(n.description)return n.description;if(k){let t=k.find(e=>e.interfaceAlias===p||e.name===p);if((null==t?void 0:t.paramSchema)&&"object"==typeof t.paramSchema&&"shape"in t.paramSchema){let n=(t.paramSchema.shape||{})[e];if(null==n||null==(r=n._def)?void 0:r.description)return n._def.description;if(null==n?void 0:n.description)return n.description}}return i?"Describe the element you want to interact with":"keyName"===e?"Enter key name or text to type":"value"===e?"Enter text to input":`Enter ${e}`})();return(0,o.jsx)(o0.A.Item,{name:["params",e],style:{margin:0},children:(0,o.jsx)(m.A.TextArea,{className:"main-side-console-input-textarea",rows:3,placeholder:a,autoFocus:!0,onKeyDown:em})})}let n=[],i=r.sort((e,r)=>{let n=t[e],i=t[r],{isOptional:o}=s1(n),{isOptional:a}=s1(i);return!o&&a?-1:o&&!a?1:0});if(i.forEach((e,r)=>{var a,s,A;let{actualField:l,isOptional:c}=s1(t[e]),u=s0(l),d=e.charAt(0).toUpperCase()+e.slice(1),h=12*(r!==i.length-1),f=(()=>{var t,r;if(null==(t=l._def)?void 0:t.description)return l._def.description;if(l.description)return l.description;if(k){let t=k.find(e=>e.interfaceAlias===p||e.name===p);if((null==t?void 0:t.paramSchema)&&"object"==typeof t.paramSchema&&"shape"in t.paramSchema){let n=(t.paramSchema.shape||{})[e];if(null==n||null==(r=n._def)?void 0:r.description)return n._def.description;if(null==n?void 0:n.description)return n.description}}if(u)return"Describe the element you want to interact with"})(),g={name:e,label:d,fieldSchema:l,isRequired:!c,marginBottom:h,placeholder:f};u?n.push((0,o.jsx)(Ay,Aj({},g),e)):(null==(a=l._def)?void 0:a.typeName)==="ZodEnum"?n.push((0,o.jsx)(Av,Aj({},g),e)):(null==(s=l._def)?void 0:s.typeName)==="ZodNumber"?n.push((0,o.jsx)(Ab,Aj({},g),e)):(null==(A=l._def)?void 0:A.typeName)==="ZodBoolean"?n.push((0,o.jsx)(Aw,Aj({},g),e)):n.push((0,o.jsx)(Am,Aj({},g),e))}),"aiScroll"===p){let e=n.find(e=>a.isValidElement(e)&&"direction"===e.props.name),t=n.find(e=>a.isValidElement(e)&&"distance"===e.props.name),r=n.filter(e=>a.isValidElement(e)&&"direction"!==e.props.name&&"distance"!==e.props.name);if(e&&t)return(0,o.jsxs)("div",{className:"structured-params",children:[(0,o.jsxs)("div",{style:{display:"flex",gap:12,marginBottom:12},children:[e,t]}),r]})}return(0,o.jsx)("div",{className:"structured-params",children:n})}}return null},[p,G,k,em]),ev=(0,a.useCallback)(()=>{j(!0)},[]),eb=(0,a.useCallback)(()=>{j(!1)},[]),ew=(0,a.useCallback)(()=>{let e=e=>(0,o.jsx)(g.Ay,{type:"primary",icon:(0,o.jsx)(s3.A,{}),style:{borderRadius:20,zIndex:999},onClick:ef,disabled:!eh,loading:v,children:e});return f?"aiAct"===p?(0,o.jsx)(h.A,{title:"Start executing until some interaction actions need to be performed. You can see the process of planning and locating.",children:e("Dry Run")}):e("Run"):y?(0,o.jsx)(g.Ay,{icon:(0,o.jsx)(s5.A,{}),onClick:w,style:{borderRadius:20,zIndex:999},children:"Stop"}):e("Run")},[f,v,ef,w,eh,p,y]),eE=(0,a.useCallback)(()=>{let e=e=>(0,o.jsx)(g.Ay,{"aria-label":e,className:"minimal-run-trigger",type:"primary",icon:(0,o.jsx)(s7.A,{}),onClick:ef,disabled:!eh,loading:v});return f?"aiAct"===p?(0,o.jsx)(h.A,{title:"Start executing until some interaction actions need to be performed. You can see the process of planning and locating.",children:e("Dry run")}):e("Run"):y?(0,o.jsx)(g.Ay,{"aria-label":"Stop running",className:"minimal-run-trigger minimal-run-trigger-stop",icon:(0,o.jsx)(s5.A,{}),onClick:w}):e("Run")},[f,v,ef,eh,w,p,y]),ek=q?G?ep?(0,o.jsx)(o0.A.Item,{name:["params",ep.name],style:{margin:0},children:(0,o.jsx)(AO,{className:"main-side-console-input-textarea",disabled:!c,rows:3,placeholder:"prompt"===ep.name?N:ep.placeholder,autoFocus:!0,onKeyDown:em})}):ed?ey():(0,o.jsx)("div",{className:"structured-params-container",children:ey()}):(0,o.jsx)(o0.A.Item,{name:"prompt",style:{margin:0},children:(0,o.jsx)(AO,{className:"main-side-console-input-textarea",disabled:!c,rows:3,placeholder:N,autoFocus:!0,onKeyDown:eg,onChange:eu,ref:D})}):(0,o.jsxs)("div",{className:"no-input-method",children:['Click "Run" to execute ',As(p)]}),ex=null!=(s=null==C||null==(t=C.icons)?void 0:t.action)?s:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAAASdJREFUeAHtlt3NgjAUhg8/CVx+G8gGX5xAnUDdQMcgkIgJBLbQEXQD3MAR6gZewgXgOUn9iRp6vAC96JM07YG36Zv+nBZAwySO4ymWgUoXRdEfaYGJyRElSbKyLGuHJVdpHcc5khb7RMCAZcA0TU82PYZ8IPsoZ4ttoEu0ga8bMB6DNE1X8H6jTUBuLmQL7SxkLbDkzz/ruhZBEKxfDGRZNm2aZgc9UFXVLAzDPbVvS1AUxQGrE3SPwHK8BganBy7NBuTU+r5vKLSNbG5RuwQF+hRoA9rA76RifMl4+JjI4Z5yu0KUZTnE8c4U3GbAdd3/HgYnPNu2R9eg98uIvmOGfL2M2tCpWBv4BQPiqW7j9IGWZ4CODT7X5pRAVFrUjEn7eNQ0bVwAyWpjMDlJKpAAAAAASUVORK5CYII=",eS=null==C||null==(r=C.icons)?void 0:r.actionChevron,eC=null!=(A=null==C||null==(n=C.icons)?void 0:n.settings)?A:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAOdEVYdFNvZnR3YXJlAEZpZ21hnrGWYwAAAaFJREFUeAHtlt9tgzAQxi8EJa/pBMkIHYENygalG7RvSQQKlfjz2I5ANkg3oBukG6QbtI9IIPq5ihHQOBXmFImqPwnZBvtsf9ydTfQPA77vz4IguCENDGJgOp3ux+PxLgxDnzrCsgAw/zZmGPOO48iUFci4wE42xITKXlEUO9d1X34s4NjZISZU9qCSjeKqastKWZYpMaKyNxqNto02MRDHcXmsJqvV6q7LWBYnxK4+SBOTeHDw2HAwn4aGlg9EUfQE2e+xYwchtaUeaPmAmFyUyH4W9aThA9jZ7alOiN39crl8O/FpoRpzjrq96hcgj2/wwVcNQlxb6/X6VdRrYaeNtGfUVvXbgE9iRNprOCHktPF/Z+3OeZ4fPM9LZbumgHjX2Qnr9rSioE/ma6MVBZDvWWQ/cbLR0GE5jEQoQhFLpGIkpvcuY1nOAkyeiBKJSRSXPw37UCkgbrWmaSZwsBkxoLInHBgJ6EG2KwUgn801+Tl78hyRVApkWfaIexxp4rRfqOzBUdN6+29cyYAMvQN1hCUMIbc1mUyu4VzDz4wX5wvRfah9kIOcwwAAAABJRU5ErkJggg==",eI=null==C||null==(i=C.icons)?void 0:i.history;return T?(0,o.jsxs)("div",{className:"prompt-input-wrapper prompt-input-wrapper-minimal",children:[(0,o.jsx)(o0.A.Item,{hidden:!0,name:"type",style:{margin:0},children:(0,o.jsx)(m.A,{})}),(0,o.jsxs)("div",{className:`main-side-console-input minimal-main-side-console-input ${!c?"disabled":""} ${v?"loading":""}`,children:[ek,(0,o.jsxs)("div",{className:"minimal-toolbar-row",children:[(0,o.jsxs)("div",{className:"minimal-toolbar-left",children:[(0,o.jsx)(sy.A,{menu:eo,placement:"topLeft",trigger:["click"],disabled:!c,overlayClassName:"more-apis-dropdown",children:(0,o.jsxs)("button",{"aria-label":`Select action type (current: ${M})`,className:"minimal-action-trigger",disabled:!c,type:"button",children:[(0,o.jsx)("img",{alt:"",className:"minimal-action-icon",src:ex}),(0,o.jsx)("span",{className:"minimal-action-label",children:M}),eS?(0,o.jsx)("img",{alt:"",className:"minimal-action-chevron",src:eS}):(0,o.jsx)(s6,{"aria-hidden":"true",className:"minimal-action-chevron",focusable:"false"})]})}),(0,o.jsx)(AI,{onSelect:ec,history:Q,currentType:p,popupPlacement:"top",trigger:(0,o.jsx)("button",{"aria-label":"Open prompt history",className:"minimal-icon-trigger",type:"button",children:eI?(0,o.jsx)("img",{alt:"",className:"minimal-toolbar-icon minimal-toolbar-icon-history",src:eI}):(0,o.jsx)(s9,{"aria-hidden":"true",className:"minimal-toolbar-icon minimal-toolbar-icon-history",focusable:"false"})})}),_?(0,o.jsx)("div",{className:I?"settings-wrapper settings-wrapper-hover":"settings-wrapper",onMouseEnter:ev,onMouseLeave:eb,children:(0,o.jsx)(Ad,{enableTracking:"In-Browser-Extension"===d,showDeepLocateOption:V,showDeepThinkOption:Y,showDataExtractionOptions:W,hideDomAndScreenshotOptions:x,deviceType:S,popupPlacement:"topRight",trigger:(0,o.jsx)("button",{"aria-label":"Open run configuration",className:"minimal-icon-trigger",type:"button",children:(0,o.jsx)("img",{alt:"",className:"minimal-toolbar-icon",src:eC})})})}):null]}),(0,o.jsxs)("div",{className:"form-controller-wrapper",children:[null==C?void 0:C.inputActions,eE()]})]})]})]}):(0,o.jsxs)("div",{className:"prompt-input-wrapper",children:[(0,o.jsxs)("div",{className:"mode-radio-group-wrapper",children:[(0,o.jsxs)("div",{className:"mode-radio-group",ref:z,children:[(0,o.jsx)(o0.A.Item,{name:"type",style:{margin:0},children:(0,o.jsx)(s8.A.Group,{buttonStyle:"solid",disabled:!c,children:au.map(e=>{var t;return(0,o.jsx)(h.A,{title:(null==(t=ac[e])?void 0:t.title)||"",children:(0,o.jsx)(s8.A.Button,{value:e,children:As(e)})},e)})})}),(0,o.jsx)(sy.A,{menu:ea,placement:"bottomLeft",trigger:["click"],disabled:!c,overlayClassName:"more-apis-dropdown",children:(0,o.jsxs)(g.Ay,{className:`more-apis-button ${!au.includes(p)?"selected-from-dropdown":""}`,children:[p&&!au.includes(p)?As(p):"more",(0,o.jsx)(s4.A,{style:{fontSize:"10px",marginLeft:"2px"}})]})})]}),(0,o.jsxs)("div",{className:"action-icons",children:[(0,o.jsx)(AI,{onSelect:ec,history:Q,currentType:p}),_&&(0,o.jsx)("div",{className:I?"settings-wrapper settings-wrapper-hover":"settings-wrapper",onMouseEnter:ev,onMouseLeave:eb,children:(0,o.jsx)(Ad,{enableTracking:"In-Browser-Extension"===d,showDeepLocateOption:V,showDeepThinkOption:Y,showDataExtractionOptions:W,hideDomAndScreenshotOptions:x,deviceType:S})})]})]}),(0,o.jsxs)("div",{className:`main-side-console-input ${!c?"disabled":""} ${v?"loading":""}`,children:[ek,(0,o.jsxs)("div",{className:"form-controller-wrapper",children:[null==C?void 0:C.inputActions,ew()]})]})]})};function AR(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function AT(e){return function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){AR(o,n,i,a,s,"next",e)}function s(e){AR(o,n,i,a,s,"throw",e)}a(void 0)})}}let{Text:AN}=u.A,AM=new Set;function AD(e){let{error:t}=e;if(!t)return null;let r=t.replace(/^(Error:\s*)+/,"Error: ");return(0,o.jsx)(y.A,{message:(0,o.jsx)("span",{style:{color:"#ff4d4f"},children:r}),type:"error",showIcon:!0})}function Az(e){var t,r,n;let{playgroundSDK:i,storage:s,contextProvider:A,config:l={},branding:c={},className:u="",dryMode:d=!1,showContextPreview:p=!0}=e,[h]=o0.A.useForm(),{config:f}=X(),[m,y]=(0,a.useState)(!1),v=(0,a.useRef)(null);(0,a.useEffect)(()=>{AT(function*(){if(i&&"function"==typeof i.checkStatus)try{yield i.checkStatus(),y(!0)}catch(e){console.warn("Failed to initialize SDK, using default namespace:",e),y(!0)}else y(!0)})()},[i]);let b=(0,a.useMemo)(()=>{if(!1===l.persistMessages)return null;if(s)return s;if(!m)return null;let e=l.storageNamespace||(i&&i.id&&"string"==typeof i.id?`agent-${i.id}`:"playground-default"),t=a$();return console.log(`Using ${t} storage for namespace: ${e}`),a_(t,e)},[s,m,l.storageNamespace,l.persistMessages,i]),{loading:w,setLoading:E,infoList:k,setInfoList:x,actionSpace:S,actionSpaceLoading:C,uiContextPreview:I,setUiContextPreview:j,showScrollToBottomButton:O,verticalMode:P,replayCounter:R,setReplayCounter:T,messagesInitialized:N,infoListRef:M,currentRunningIdRef:D,interruptedFlagRef:z,clearInfoList:B,handleScrollToBottom:L}=function(e,t,r,n){let i=!(arguments.length>4)||void 0===arguments[4]||arguments[4],[o,s]=(0,a.useState)(!1),[A,l]=(0,a.useState)([]),[c,u]=(0,a.useState)([]),[d,p]=(0,a.useState)(!0),[h,f]=(0,a.useState)(),[g,m]=(0,a.useState)(!1),[y,v]=(0,a.useState)(!0),b=(0,a.useRef)(0),[w,E]=(0,a.useState)(!1),[k,x]=(0,a.useState)(0),S=(0,a.useRef)(null),C=(0,a.useRef)(null),I=(0,a.useRef)({}),j=(0,a.useRef)(),[,O]=(0,a.useState)(0);(0,a.useEffect)(()=>{let e=!1,r=null!=t?t:null,o=t=>{e||l(t)};return j.current!==r&&(t||0===A.length)&&a1(function*(){let a=a3(a2({},ad(n)),{id:"welcome",timestamp:new Date});if(null==t?void 0:t.loadMessages)try{let e=yield t.loadMessages();0===e.length&&(e=yield a1(function*(){if(!i)return[];let e=a_(a$(),"playground-default");try{if(null==e?void 0:e.loadMessages){let r=yield e.loadMessages();if(r.length>1)return console.log("Found data in old namespace, migrating..."),(null==t?void 0:t.saveMessages)&&(yield t.saveMessages(r)),e.clearMessages&&(yield e.clearMessages()),r}}catch(e){console.debug("No data found in old namespace:",e)}return[]})()),e.some(e=>"welcome"===e.id)?o(e):o([a,...e])}catch(e){console.error("Failed to load messages:",e),o([a])}else o([a]);e||(j.current=r,O(e=>e+1))})(),()=>{e=!0}},[i,t]),(0,a.useEffect)(()=>{(null==t?void 0:t.saveMessages)&&A.length>1&&t.saveMessages(A).catch(e=>{e instanceof DOMException&&"QuotaExceededError"===e.name?console.warn("Storage quota exceeded - some messages may not be saved persistently"):console.error("Failed to save messages:",e)})},[A,t]),(0,a.useEffect)(()=>{(null==r?void 0:r.getUIContext)&&!h&&r.getUIContext().then(e=>f(e)).catch(e=>{console.error("Failed to get UI context:",e)})},[r,h]),(0,a.useEffect)(()=>{a1(function*(){p(!0);try{var t;if(!e)return void u([]);let n=h||(yield null==r||null==(t=r.getUIContext)?void 0:t.call(r)),i=yield e.getActionSpace(n);u(i||[])}catch(e){console.error("Failed to load action space:",e),u([])}finally{p(!1)}})()},[e,h,r]),(0,a.useEffect)(()=>{E(window.innerWidth<750);let e=()=>{E(window.innerWidth<750)};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]);let P=(0,a.useCallback)(()=>{setTimeout(()=>{S.current&&(S.current.scrollTop=S.current.scrollHeight)},100)},[]),R=(0,a.useCallback)(()=>{if(S.current){let{scrollTop:e,scrollHeight:t,clientHeight:r}=S.current,n=e+r>=t-10;m(!n);let i=e<b.current;b.current=e,n?v(!0):i&&v(!1)}},[]),T=(0,a.useCallback)(()=>{S.current&&(S.current.scrollTo({top:S.current.scrollHeight,behavior:"smooth"}),m(!1),v(!0))},[]);(0,a.useEffect)(()=>{A.length>0&&y&&P()},[A,P,y]),(0,a.useEffect)(()=>{let e=S.current;if(e)return e.addEventListener("scroll",R),R(),()=>{e.removeEventListener("scroll",R)}},[R]);let N=(0,a.useCallback)(()=>a1(function*(){if(l([a3(a2({},ad(n)),{id:"welcome",timestamp:new Date})]),null==t?void 0:t.clearMessages)try{yield t.clearMessages()}catch(e){console.error("Failed to clear stored messages:",e)}})(),[t,n]),M=(0,a.useCallback)(()=>a1(function*(){if(null==r?void 0:r.refreshContext)try{let e=yield r.refreshContext();f(e)}catch(e){console.error("Failed to refresh context:",e)}})(),[r]);return{loading:o,setLoading:s,infoList:A,setInfoList:l,messagesInitialized:j.current===(null!=t?t:null),actionSpace:c,actionSpaceLoading:d,uiContextPreview:h,setUiContextPreview:f,showScrollToBottomButton:g,verticalMode:w,replayCounter:k,setReplayCounter:x,infoListRef:S,currentRunningIdRef:C,interruptedFlagRef:I,clearInfoList:N,refreshContext:M,handleScrollToBottom:T,scrollToBottom:P}}(i,b,A,c.targetName,!1!==l.persistMessages&&!l.storageNamespace),{handleRun:U,handleStop:K,canStop:F}=function(e){let{playgroundSDK:t,storage:r,actionSpace:n,loading:i,setLoading:o,setInfoList:s,replayCounter:A,setReplayCounter:l,verticalMode:c,currentRunningIdRef:u,interruptedFlagRef:d,deviceType:p}=e,{deepLocate:h,deepThink:f,screenshotIncluded:g,domIncluded:m,imeStrategy:y,autoDismissKeyboard:v,keyboardDismissStrategy:b,alwaysRefreshScreenInfo:w}=X(),E=(0,a.useCallback)(function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return aC(function*(){if(!t)return void console.warn("PlaygroundSDK is not available");let i=Date.now(),a=e.type,E=n.displayContent||`${e.type}: ${e.prompt||JSON.stringify(e.params)}`,k={id:`user-${Date.now()}`,type:"user",content:E,timestamp:new Date};s(e=>[...e,k]),o(!0);let x=aI({},ap),S={id:`system-${i}`,type:"system",content:"",timestamp:new Date,loading:!0,loadingProgressText:""};s(e=>[...e,S]);try{u.current=i,d.current[i]=!1,t.onDumpUpdate&&t.onDumpUpdate((e,t)=>{var r;if(d.current[i]||!(null==t||null==(r=t.tasks)?void 0:r.length))return;let n=t.tasks.map((e,t)=>{var r;let n,o;return{id:`progress-${i}-task-${t}`,type:"progress",content:(n=oT(e),(o=oz(e))?`${n} - ${o}`:n),actionKind:oT(e),timestamp:new Date((null==(r=e.timing)?void 0:r.start)||Date.now()),result:e.error?{error:aO(e.error),result:null}:void 0}});s(e=>{let t=e.findIndex(e=>e.id===`system-${i}`);if(-1===t)return e;let r=e.filter(e=>!("progress"===e.type&&e.id.startsWith(`progress-${i}-`)));return[...r.slice(0,t+1),...n,...r.slice(t+1)]})}),aR(a)||!0!==f||console.warn("[Playground] Non-aiAct action will be executed without deepThink. deepThink is only forwarded for aiAct and runMarkdown.",{actionType:a,requestId:i.toString()});let r="unset"===f?void 0:f,o=aI(aj(aI({requestId:i.toString(),deepLocate:h},aR(a)&&void 0!==r?{deepThink:r}:{}),{screenshotIncluded:g,domIncluded:m,deviceOptions:{imeStrategy:y,autoDismissKeyboard:v,keyboardDismissStrategy:b,alwaysRefreshScreenInfo:w}}),n.reportDisplay?{reportDisplay:n.reportDisplay}:{});if(x.result=yield t.executeAction(a,e,o),"object"==typeof x.result&&null!==x.result){let e=x.result;e.dump&&(x.dump=e.dump),e.reportHTML&&(x.reportHTML=e.reportHTML),e.error&&(x.error=aO(e.error)),"result"in e&&(x.result=e.result)}}catch(e){x.error=aO(e),console.error("Playground execution error:",e),"object"==typeof e&&null!==e&&(e.dump&&(x.dump=e.dump),e.reportHTML&&(x.reportHTML=e.reportHTML))}if(d.current[i])return;o(!1),u.current=null;let C=null,I=A;if(null==x?void 0:x.dump){let e=aP(x.dump,p);e&&(l(e=>e+1),C=e,I=A+1)}s(e=>e.map(e=>e.id===`system-${i}`?aj(aI({},e),{content:"",loading:!1,loadingProgressText:""}):e));let j={id:`result-${i}`,type:"result",content:"Execution result",timestamp:new Date,result:x,loading:!1,replayScriptsInfo:C,replayCounter:I,loadingProgressText:"",verticalMode:c,actionType:a};if(s(e=>[...e,j]),null==r?void 0:r.saveResult)try{yield r.saveResult(j.id,j)}catch(e){console.error("Failed to save result:",e)}let O={id:`separator-${i}`,type:"separator",content:"New Session",timestamp:new Date};s(e=>[...e,O])})()},[t,r,n,o,s,A,l,c,u,d,h,f,g,m,p,y,v,b,w]),k=(0,a.useCallback)(()=>aC(function*(){let e=u.current;if(e&&t&&t.cancelExecution)try{let r=yield t.cancelExecution(e.toString()),n=null;if(r)n=r;else if(t.getCurrentExecutionData)try{n=yield t.getCurrentExecutionData()}catch(e){console.error("Failed to get execution data before stop:",e)}if(d.current[e]=!0,o(!1),t.onProgressUpdate&&t.onProgressUpdate(()=>{}),t.onDumpUpdate&&t.onDumpUpdate(()=>{}),s(t=>t.map(t=>t.id===`system-${e}`?aj(aI({},t),{content:"",loading:!1,loadingProgressText:""}):t)),n&&(n.dump||n.reportHTML)){let t=null,r=A;(t=aP(n.dump,p))&&(l(e=>e+1),r=A+1);let i={id:`stop-result-${e}`,type:"result",content:"Execution stopped by user",timestamp:new Date,result:{result:null,dump:n.dump,reportHTML:n.reportHTML,error:null},loading:!1,verticalMode:c,replayScriptsInfo:t,replayCounter:r};s(e=>[...e,i])}else{let t={id:`stop-${e}`,type:"system",content:"Operation stopped",timestamp:new Date,loading:!1};s(e=>[...e,t])}let i={id:`separator-${e}`,type:"separator",content:"New Session",timestamp:new Date};s(e=>[...e,i])}catch(e){console.error("Failed to stop execution:",e)}})(),[t,u,d,o,s,c,A,p]);return{handleRun:E,handleStop:k,canStop:i&&!!u.current&&!!t&&!!t.cancelExecution}}({playgroundSDK:i,storage:b,actionSpace:S,loading:w,setLoading:E,setInfoList:x,replayCounter:R,setReplayCounter:T,verticalMode:P,currentRunningIdRef:D,interruptedFlagRef:z,deviceType:l.deviceType});(0,a.useEffect)(()=>{(null==i?void 0:i.overrideConfig)&&f&&i.overrideConfig(f).catch(e=>{console.error("Failed to override SDK config:",e),G(e,{title:"Failed to apply AI configuration"})})},[i,f]);let Z=(0,a.useCallback)(()=>AT(function*(){try{let e=h.getFieldsValue();yield U(e)}catch(e){G(e,{title:"Execution failed"})}})(),[h,U]);(0,a.useEffect)(()=>{let e=l.externalRunRequest;if(e&&function(e){let{request:t,handledRequestIds:r,lastRequestId:n,sdkReady:i,messagesInitialized:o}=e;return!!(t&&t.id!==n&&!(null==r?void 0:r.has(t.id))&&i&&o)}({request:e,handledRequestIds:AM,lastRequestId:v.current,sdkReady:m,messagesInitialized:N})){if(v.current=e.id,AM.add(e.id),AM.size>100){let e=AM.values().next().value;e&&AM.delete(e)}U(e.value,function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({displayContent:e.displayContent},e.reportDisplay?{reportDisplay:e.reportDisplay}:{})).catch(e=>{G(e,{title:"Execution failed"})})}},[l.externalRunRequest,U,N,m]);let Q=Object.keys(f||{}).length>=1,J=l.serverMode||!d&&!C&&Q,H=o0.A.useWatch("type",h)||au["0"],q=(0,a.useMemo)(()=>i&&"function"==typeof i.getServiceMode?i.getServiceMode():"Server",[i]),W=p&&!1!==l.showContextPreview,V=l.layout||"vertical",Y=!1!==l.showVersionInfo,_=l.deviceType,$=null!=(t=l.executionFlow)?t:{},ee=!0===$.collapsible,et=null!=(r=$.label)?r:"Execution Flow",[er,en]=(0,a.useState)(()=>new Set),ei=(0,a.useCallback)(e=>{en(t=>{let r=new Set(t);return r.has(e)?r.delete(e):r.add(e),r})},[]),{firstInProgressGroup:eo,visibleInfoList:ea}=(0,a.useMemo)(()=>{let e=new Set,t=[],r=null,n=k.length>1;for(let i of k)if(!n||"welcome"!==i.id)if("progress"===i.type){if(null===r){r=i.id,e.add(i.id),t.push(i);continue}ee&&er.has(r)||t.push(i)}else r=null,t.push(i);return{firstInProgressGroup:e,visibleInfoList:t}},[er,ee,k]),es=(0,a.useMemo)(()=>{for(let e=k.length-1;e>=0;e--)if("progress"===k[e].type)return k[e].id;return null},[k]),eA=void 0!==l.emptyState&&1===ea.length&&(null==(n=ea[0])?void 0:n.id)==="welcome",el=(0,a.useMemo)(()=>eA&&((e,t)=>{if(!(null==e?void 0:e.length)||!t||s2(e,t))return!1;let r=e.find(e=>e.interfaceAlias===t||e.name===t);return!!(null==r?void 0:r.paramSchema)&&!!s$(r.paramSchema)&&Object.keys(r.paramSchema.shape||{}).length>1})(S,H),[S,eA,H]);(0,a.useEffect)(()=>{if(!el)return;let e=()=>{let e=M.current;if(!e)return;let t=e.querySelector(".playground-empty-state-wrapper"),r=null==t?void 0:t.querySelector("[data-playground-empty-state-content-start]"),n=null==t?void 0:t.querySelector("[data-playground-empty-state-content-end]");if(!(r instanceof HTMLElement)||!(n instanceof HTMLElement))return;let i=e.getBoundingClientRect(),o=r.getBoundingClientRect(),a=n.getBoundingClientRect(),s=function(e){let{currentScrollTop:t,maxScrollTop:r,containerTop:n,containerBottom:i,contentStartTop:o,contentEndBottom:a,topSafeMargin:s=24,bottomSafeMargin:A=24}=e;return Math.max(0,Math.round(Math.min(t+a-(i-A),t+o-(n+s),r)))}({currentScrollTop:e.scrollTop,maxScrollTop:Math.max(0,e.scrollHeight-e.clientHeight),containerTop:i.top,containerBottom:i.bottom,contentStartTop:o.top,contentEndBottom:a.bottom});e.scrollTo({top:s,behavior:"auto"})},t=window.requestAnimationFrame(e),r=window.setTimeout(e,160);return()=>{window.cancelAnimationFrame(t),window.clearTimeout(r)}},[M,H,el]);let ec=["playground-empty-state-wrapper",el?"playground-empty-state-wrapper-offset-for-prompt":""].filter(Boolean).join(" ");return(0,o.jsx)("div",{className:`playground-container ${V}-mode ${u}`.trim(),children:(0,o.jsxs)(o0.A,{form:h,onFinish:Z,className:"command-form",initialValues:{type:au["0"]},children:[W&&(0,o.jsx)("div",{className:"context-preview-section",children:(0,o.jsx)(ss,{uiContextPreview:I,setUiContextPreview:j,showContextPreview:W})}),(0,o.jsxs)("div",{className:"middle-dialog-area",children:[!1!==l.showClearButton&&k.length>1&&(0,o.jsx)("div",{className:"clear-button-container",children:(0,o.jsx)(g.Ay,{size:"small",icon:(0,o.jsx)(an.A,{}),onClick:B,type:"text",className:"clear-button"})}),(0,o.jsx)("div",{ref:M,className:"info-list-container",children:eA?(0,o.jsx)("div",{className:ec,children:l.emptyState}):(0,o.jsx)(aA.A,{itemLayout:"vertical",dataSource:ea,renderItem:e=>{var t,r,n;let i,s,A,u,d,p,h,f=ee&&eo.has(e.id),g=f&&er.has(e.id);return(0,o.jsxs)(aA.A.Item,{className:"list-item",children:[f?(0,o.jsxs)("button",{type:"button",className:`progress-group-toggle ${er.has(e.id)?"is-collapsed":"is-expanded"}`,"aria-expanded":!er.has(e.id),onClick:()=>ei(e.id),children:[(0,o.jsx)("span",{className:"progress-group-toggle-label",children:et}),(0,o.jsx)(ai.A,{className:"progress-group-toggle-chevron"})]}):null,g?null:"user"===e.type?(0,o.jsx)("div",{className:"user-message-container",children:(0,o.jsx)("div",{className:"user-message-bubble",children:e.content})}):"progress"===e.type?(0,o.jsx)("div",{children:(s=null==(t=(i=e.content.split(" - "))[0])?void 0:t.trim(),A=i.slice(1).join(" - ").trim(),u=e.id===es,h="completed"==(p=(d=w&&u)?"loading":(null==(r=e.result)?void 0:r.error)?"error":"completed")?function(e,t){if(!e)return null;if(t){let r=t(e);if(void 0!==r)return r}return(0,a.createElement)(sG)}(e.actionKind,$.resolveActionIcon):null,(0,o.jsxs)("div",{className:"progress-row",children:[s?(0,o.jsx)("span",{className:`progress-status-icon ${p}`,children:"loading"===p?(0,o.jsx)(ao.A,{spin:!0}):"error"===p?"✗":null!==h?h:"✓"}):null,(0,o.jsxs)("div",{className:"progress-row-content",children:[s?(0,o.jsx)("span",{className:"progress-action-item",children:s}):null,A?(0,o.jsx)("div",{className:"progress-description-wrap",children:(0,o.jsx)(sr,{text:A,className:"progress-description",disabled:!d})}):null,(null==(n=e.result)?void 0:n.error)&&(0,o.jsx)(AD,{error:e.result.error})]})]}))}):"separator"===e.type?(0,o.jsxs)("div",{className:"new-conversation-separator",children:[(0,o.jsx)("div",{className:"separator-line"}),(0,o.jsx)("div",{className:"separator-text-container",children:(0,o.jsx)(AN,{type:"secondary",className:"separator-text",children:e.content})})]}):(0,o.jsxs)("div",{className:"system-message-container",children:[!1!==l.showSystemMessageHeader&&(0,o.jsxs)("div",{className:"system-message-header",children:[(0,o.jsx)(aa.A,{component:c.icon||sH,style:{fontSize:20}}),(0,o.jsx)("span",{className:"system-message-title",children:c.title||"Playground"})]}),(e.content||e.result)&&(0,o.jsx)("div",{className:"system-message-content",children:"result"===e.type?(0,o.jsx)(sX,{result:e.result||null,loading:e.loading||!1,serverValid:!0,serviceMode:q,replayScriptsInfo:e.replayScriptsInfo||null,replayCounter:e.replayCounter||0,loadingProgressText:e.loadingProgressText||"",verticalMode:e.verticalMode||!1,fitMode:"width",actionType:e.actionType,onDownloadReport:l.onDownloadReport}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("div",{className:"system-message-text",children:e.content}),e.loading&&e.loadingProgressText&&(0,o.jsx)("div",{className:"loading-progress-text",children:(0,o.jsx)("span",{children:e.loadingProgressText})})]})})]})]},e.id)}})}),O&&!1!==l.enableScrollToBottom&&(0,o.jsx)(g.Ay,{className:"scroll-to-bottom-button",type:"primary",shape:"circle",icon:(0,o.jsx)(as.A,{}),onClick:L,size:"large"})]}),(0,o.jsxs)("div",{className:"bottom-input-section",children:[l.showEnvConfigReminder?(0,o.jsx)(sl,{}):null,(0,o.jsx)(AP,{runButtonEnabled:J,form:h,serviceMode:q,selectedType:H,dryMode:d,stoppable:F,loading:w,onRun:Z,onStop:K,actionSpace:S,chrome:l.promptInputChrome,deviceType:_})]}),Y&&c.version&&(0,o.jsx)("div",{className:"version-info-section",children:(0,o.jsxs)("span",{className:"version-text",children:["Midscene.js version: ",c.version]})})]})})}let AB=e=>{var t,r;return(0,o.jsx)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",viewBox:"0 0 16 16"},e),r=r={children:(0,o.jsx)("path",{stroke:"#333",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.333,d:"m12 6-4 4-4-4"})},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))},AL=e=>{var t,r;return(0,o.jsxs)("svg",(t=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",width:55,height:52,fill:"none",viewBox:"0 0 55 52"},e),r=r={children:[(0,o.jsxs)("mask",{id:"midscene-logo_svg__a",width:55.371,height:52.35,x:-.202,y:-.201,fill:"#000",maskUnits:"userSpaceOnUse",children:[(0,o.jsx)("path",{fill:"#fff",d:"M-.202-.201h55.371v52.35H-.202z"}),(0,o.jsx)("path",{fillRule:"evenodd",d:"M35.38 1.812c1.168 0 1.762 1.405.948 2.244l-.83.853a23.38 23.38 0 0 1 13.968 14.069c2.56 2.523 3.834 6.176 3.714 13.116-.083 4.799-1.883 7.946-4.24 9.99-2.23 1.933-4.832 2.754-6.322 3.224l-.069.022-.088.029q-.675.212-1.328.378a23.22 23.22 0 0 1-13.634 4.399 23.22 23.22 0 0 1-13.632-4.399q-.653-.165-1.328-.379l-.09-.028-.067-.022c-1.49-.47-4.092-1.29-6.323-3.224-2.357-2.044-4.157-5.191-4.24-9.99C1.7 25.154 2.975 21.5 5.535 18.978a23.39 23.39 0 0 1 14.02-14.089l-.81-.833c-.814-.839-.22-2.244.948-2.244zM20.254 6.747A21.4 21.4 0 0 0 7.25 20.086C5.046 22.067 3.68 25.032 3.803 32.06c.146 8.506 6.254 10.434 9.244 11.378l.09.029q.811.256 1.586.437A21.24 21.24 0 0 0 27.5 48.152l.001-.001a21.24 21.24 0 0 1-12.776-4.247 22 22 0 0 1-1.586-.437l-.09-.029c-2.99-.944-9.097-2.872-9.243-11.379-.122-7.027 1.243-9.992 3.447-11.973a21.4 21.4 0 0 1 13.003-13.34m11.359 41.007q.128-.023.255-.05h.002zm.88-.191.215-.051.002-.001zM21.084 6.465h.001",clipRule:"evenodd"})]}),(0,o.jsx)("path",{fill:"#3A4953",fillRule:"evenodd",d:"M35.38 1.812c1.168 0 1.762 1.405.948 2.244l-.83.853a23.38 23.38 0 0 1 13.968 14.069c2.56 2.523 3.834 6.176 3.714 13.116-.083 4.799-1.883 7.946-4.24 9.99-2.23 1.933-4.832 2.754-6.322 3.224l-.069.022-.088.029q-.675.212-1.328.378a23.22 23.22 0 0 1-13.634 4.399 23.22 23.22 0 0 1-13.632-4.399q-.653-.165-1.328-.379l-.09-.028-.067-.022c-1.49-.47-4.092-1.29-6.323-3.224-2.357-2.044-4.157-5.191-4.24-9.99C1.7 25.154 2.975 21.5 5.535 18.978a23.39 23.39 0 0 1 14.02-14.089l-.81-.833c-.814-.839-.22-2.244.948-2.244zM20.254 6.747A21.4 21.4 0 0 0 7.25 20.086C5.046 22.067 3.68 25.032 3.803 32.06c.146 8.506 6.254 10.434 9.244 11.378l.09.029q.811.256 1.586.437A21.24 21.24 0 0 0 27.5 48.152l.001-.001a21.24 21.24 0 0 1-12.776-4.247 22 22 0 0 1-1.586-.437l-.09-.029c-2.99-.944-9.097-2.872-9.243-11.379-.122-7.027 1.243-9.992 3.447-11.973a21.4 21.4 0 0 1 13.003-13.34m11.359 41.007q.128-.023.255-.05h.002zm.88-.191.215-.051.002-.001zM21.084 6.465h.001",clipRule:"evenodd"}),(0,o.jsx)("path",{fill:"#3A4953",d:"m36.328 4.056 1.3 1.263zm-.83.853L34.2 3.646l-1.95 2.006 2.628.96zm13.968 14.069-1.707.609.14.39.295.291zm3.714 13.116 1.812.031zm-4.24 9.99 1.187 1.369zm-6.322 3.224.543 1.73.002-.002zm-.069.022-.543-1.729-.012.004zm-.088.029.546 1.727.01-.003zm-1.328.378-.446-1.757-.335.086-.28.202zm-13.634 4.399v1.812zm-13.632-4.399 1.06-1.47-.28-.202-.334-.084zm-1.328-.379-.55 1.727.004.001zm-.09-.028-.55 1.727zm-.067-.022.55-1.726-.005-.002zm-6.323-3.224-1.187 1.369zm-4.24-9.99-1.811.031zm3.715-13.116 1.272 1.29.295-.29.14-.391zm14.02-14.089.618 1.704 2.636-.955-1.954-2.011zm-.81-.833-1.3 1.262zm.948-2.244V0zm.563 4.935.615 1.704-1.23-3.409zM7.25 20.086l1.211 1.347.357-.32.151-.456zM3.803 32.06l-1.812.03zm9.244 11.378.55-1.726-.004-.002zm.09.029-.55 1.727h.004zm1.586.437 1.087-1.45-.304-.227-.369-.087zM27.5 48.152v1.812h.75l.532-.531zm.001-.001 1.282 1.281 3.093-3.093H27.5zm-12.776-4.247 1.087-1.45-.304-.227-.369-.087zm-1.586-.437-.55 1.727h.004zm-.09-.029.55-1.726-.004-.002zM3.805 32.06l-1.812.032zm3.447-11.973 1.211 1.347.357-.32.151-.456zm24.043 27.727.32 1.784-.64-3.567zm-.573.096-.271-1.792.542 3.584zm.892-.155-.348-1.778.695 3.557zm.255-.05.37 1.774.23-.048.21-.105zm.002 0 .81 1.62-1.179-3.395zm.623-.141L32.07 45.8l.845 3.524zm.215-.051.441 1.757.192-.048.177-.089zm.002-.001.81 1.62-1.251-3.378zM21.084 6.465V4.653h-.278l-.266.084zm-.572.191-.593-1.712 1.186 3.424zm.573-.19.545 1.728-.545-3.54zM35.38 1.811v1.812a.49.49 0 0 1-.351-.83l1.3 1.262 1.3 1.262C39.558 3.33 38.15 0 35.379 0zm.949 2.244-1.3-1.264-.829.854 1.3 1.263 1.298 1.263.83-.853zm-.83.853-.621 1.702a21.57 21.57 0 0 1 12.882 12.976l1.707-.61 1.706-.608A25.2 25.2 0 0 0 36.12 3.207zm13.968 14.069-1.272 1.29c2.043 2.015 3.29 5.063 3.174 11.795l1.812.03 1.812.032c.123-7.147-1.178-11.405-4.254-14.438zm3.714 13.116-1.812-.031c-.074 4.3-1.658 6.955-3.615 8.651l1.187 1.37 1.187 1.369c2.758-2.391 4.773-6.03 4.865-11.328zm-4.24 9.99-1.187-1.37c-1.919 1.663-4.188 2.395-5.68 2.866l.545 1.728.545 1.728c1.488-.469 4.421-1.379 6.964-3.583zm-6.322 3.224-.543-1.728-.069.021.543 1.729.544 1.729.068-.022zm-.069.022-.555-1.725-.089.029.556 1.724.556 1.725.088-.028zm-.088.029-.546-1.728q-.626.197-1.228.35l.446 1.756.445 1.756q.704-.178 1.429-.407zm-1.328.378-1.06-1.47a21.4 21.4 0 0 1-12.574 4.057v3.624c5.48 0 10.562-1.759 14.694-4.742zm-13.634 4.399v-1.812a21.4 21.4 0 0 1-12.571-4.056l-1.06 1.469-1.061 1.47a25.03 25.03 0 0 0 14.692 4.74zm-13.632-4.399.446-1.757q-.602-.151-1.228-.35l-.546 1.728-.546 1.728q.723.229 1.429.407zm-1.328-.379.55-1.726-.09-.029-.55 1.727-.55 1.727.09.028zm-.09-.028.55-1.727-.067-.021-.55 1.726-.55 1.727.067.022zm-.067-.022.545-1.728c-1.492-.47-3.762-1.202-5.681-2.866l-1.187 1.37-1.187 1.369c2.543 2.204 5.477 3.114 6.964 3.583zm-6.323-3.224 1.187-1.37c-1.957-1.696-3.54-4.35-3.615-8.651l-1.811.03-1.812.032c.091 5.297 2.106 8.937 4.864 11.328zm-4.24-9.99 1.812-.031c-.116-6.733 1.13-9.78 3.175-11.795l-1.272-1.29-1.272-1.29C1.185 20.72-.115 24.977.008 32.124zm3.715-13.116 1.707.609A21.57 21.57 0 0 1 20.172 6.593l-.617-1.704-.618-1.703a25.2 25.2 0 0 0-15.11 15.183zm14.02-14.089 1.3-1.262-.81-.834-1.3 1.263-1.3 1.262.811.834zm-.81-.833 1.3-1.263a.49.49 0 0 1-.351.831V1.812L19.691 0c-2.771 0-4.177 3.332-2.247 5.318zm.948-2.244v1.812H35.38V0H19.692zm.563 4.935-.616-1.705A23.2 23.2 0 0 0 5.53 19.514l1.72.572 1.72.571a19.58 19.58 0 0 1 11.9-12.206zM7.25 20.086l-1.212-1.348C3.27 21.228 1.866 24.83 1.99 32.091l1.812-.032 1.811-.03c-.117-6.794 1.208-9.122 2.847-10.596zM3.803 32.06l-1.812.03c.082 4.753 1.861 7.854 4.18 9.864 2.236 1.938 4.852 2.746 6.33 3.212l.546-1.728.546-1.728c-1.511-.477-3.445-1.105-5.047-2.494-1.519-1.316-2.867-3.433-2.932-7.188zm9.244 11.378-.55 1.727.09.029.55-1.727.55-1.727-.09-.028zm.09.029-.546 1.728q.875.276 1.718.474l.414-1.765.414-1.764q-.706-.164-1.454-.401zm1.586.437-1.086 1.45a23.05 23.05 0 0 0 13.862 4.61V46.34a19.43 19.43 0 0 1-11.69-3.886zM27.5 48.152l1.282 1.281v-.001l-1.28-1.281-1.282-1.282-.001.001zm.001-.001v-1.812a19.43 19.43 0 0 1-11.69-3.885l-1.086 1.45-1.086 1.45A23.05 23.05 0 0 0 27.5 49.964zm-12.776-4.247.414-1.764c-.472-.11-.954-.243-1.454-.401l-.546 1.728-.546 1.728q.875.276 1.718.474zm-1.586-.437.55-1.727-.09-.028-.55 1.726-.55 1.727.09.029zm-.09-.029.546-1.728c-1.511-.477-3.444-1.105-5.047-2.494-1.518-1.316-2.866-3.433-2.93-7.188l-1.812.032-1.812.03c.082 4.752 1.86 7.853 4.18 9.864 2.235 1.938 4.85 2.745 6.33 3.212zM3.805 32.06l1.811-.03c-.117-6.794 1.208-9.122 2.847-10.596l-1.211-1.347-1.212-1.348c-2.767 2.49-4.172 6.092-4.047 13.353zm3.447-11.973 1.72.571A19.58 19.58 0 0 1 20.87 8.451l-.615-1.704-.616-1.705A23.2 23.2 0 0 0 5.532 19.514zm24.043 27.727-.32-1.783q-.266.048-.524.087l.271 1.792.271 1.791q.319-.048.622-.103zm-.573.096.272 1.791q.316-.048.622-.103l-.32-1.784-.321-1.783a20 20 0 0 1-.524.087zm.892-.155.347 1.779c.061-.012.179-.034.278-.055l-.37-1.774-.369-1.774c-.071.015-.124.025-.234.046zm.255-.05.81 1.621h.003l-.81-1.622-.811-1.62h-.002zm.002 0-.369-1.775-.235.047.347 1.778.347 1.779.28-.056zm.623-.141.422 1.762c.023-.006.159-.037.234-.056l-.441-1.757-.441-1.758-.197.047zm.215-.051.81 1.62h.002l-.81-1.621-.81-1.621h-.002zm.002-.001-.441-1.758-.199.047.423 1.763.422 1.762.236-.057zM21.084 6.465l-.544-1.728q-.325.104-.621.207l.593 1.712.593 1.712q.273-.095.524-.174zm-.572.191.594 1.712q.27-.093.524-.174l-.545-1.729-.544-1.728q-.323.103-.622.207zm.573-.19V4.652zv1.812z",mask:"url(#midscene-logo_svg__a)"}),(0,o.jsx)("mask",{id:"midscene-logo_svg__b",width:53,height:50,x:1,y:1,maskUnits:"userSpaceOnUse",style:{maskType:"alpha"},children:(0,o.jsx)("path",{fill:"#F0F0F0",fillRule:"evenodd",d:"M24.214 12.537a4.63 4.63 0 0 0 6.64 0l6.608-6.805a23.4 23.4 0 0 1 12 13.247c2.56 2.524 3.833 6.176 3.714 13.114-.083 4.8-1.883 7.947-4.24 9.991-2.231 1.934-4.833 2.755-6.322 3.225l-.158.05q-.675.213-1.328.378a23.22 23.22 0 0 1-13.632 4.399 23.22 23.22 0 0 1-13.632-4.399q-.654-.165-1.33-.378l-.157-.05c-1.49-.47-4.092-1.291-6.322-3.225-2.358-2.044-4.157-5.192-4.24-9.99-.12-6.941 1.155-10.593 3.716-13.117a23.4 23.4 0 0 1 12.05-13.27zM35.38 1.812c1.168 0 1.763 1.406.949 2.244l-6.895 7.1c-.52.534-1.21.8-1.899.8h-.012a2.65 2.65 0 0 1-1.536-.503 2.7 2.7 0 0 1-.35-.299L19.552 4.89l.001-.001-.808-.833c-.814-.838-.22-2.244.949-2.244z",clipRule:"evenodd"})}),(0,o.jsxs)("g",{mask:"url(#midscene-logo_svg__b)",children:[(0,o.jsx)("path",{fill:"#fff",d:"M-4.044-9.086h63.087V65.49H-4.044z"}),(0,o.jsx)("g",{filter:"url(#midscene-logo_svg__c)",opacity:.8,children:(0,o.jsx)("path",{fill:"#005EEC",fillOpacity:.01,d:"M41.85 43.36c-.378-.748-3.453.67-7.362 2.242s-7.175 2.702-6.798 3.45c.378.746 3.853.078 7.763-1.494s6.773-3.452 6.396-4.199"})})]}),(0,o.jsx)("path",{fill:"url(#midscene-logo_svg__d)",d:"M5.773 18.412h43.601v24.223H5.773z"}),(0,o.jsx)("path",{fill:"url(#midscene-logo_svg__e)",d:"M5.773 18.473h43.086v24.454H5.773z"}),(0,o.jsx)("path",{fill:"url(#midscene-logo_svg__f)",d:"M5.926 18.075h43.092v24.457H5.926z"}),(0,o.jsx)("foreignObject",{width:27.157,height:19.138,x:21.193,y:36.687,children:(0,o.jsx)("div",{xmlns:"http://www.w3.org/1999/xhtml",style:{backdropFilter:"blur(2.96px)",clipPath:"url(#midscene-logo_svg__g)",height:"100%",width:"100%"}})}),(0,o.jsx)("path",{fill:"#3A4953",fillRule:"evenodd",stroke:"#3A4953",strokeWidth:.514,d:"m14.619 40.412.082.025c2.186.657 4.053.825 6.578.932.365.016.704-.127.932-.363l3.08-5.674c.94-1.735 3.484-1.735 4.426 0l3.08 5.674c.227.236.566.379.931.363 2.525-.107 4.392-.275 6.578-.932l.082-.025c1.384-.416 3.235-.984 4.774-2.253 1.475-1.216 2.74-3.144 2.8-6.483.066-3.66-.372-5.858-1.066-7.316-.672-1.411-1.641-2.254-2.965-3.093-1.305-.828-2.922-1.54-4.435-1.54H37.44c-1.566 0-3.128.159-4.66.473l-.265.055a24.45 24.45 0 0 1-10.02-.043 22 22 0 0 0-4.582-.484h-2.402c-1.895 0-3.3.818-4.435 1.539-1.359.862-2.325 1.704-2.988 3.106-.686 1.45-1.11 3.637-1.043 7.303.06 3.339 1.325 5.267 2.8 6.483 1.539 1.269 3.39 1.837 4.774 2.253Zm17.133 1.319-3.146-5.796c-.463-.854-1.742-.854-2.205 0l-3.146 5.796a2.48 2.48 0 0 1-2.03.901c-2.556-.11-4.549-.282-6.888-.985l-.082-.024c-2.74-.824-8.339-2.505-8.473-9.924-.136-7.494 1.7-9.65 4.617-11.5 1.164-.738 2.832-1.735 5.112-1.735h2.402c1.63 0 3.256.172 4.847.512 3.127.67 6.368.683 9.5.04l.266-.054a24.5 24.5 0 0 1 4.914-.498h2.056c1.865 0 3.727.857 5.112 1.736 2.852 1.808 4.753 4.005 4.618 11.499-.135 7.419-5.733 9.1-8.474 9.924l-.082.024c-2.339.703-4.332.876-6.888.985a2.48 2.48 0 0 1-2.03-.901Z",clipRule:"evenodd","data-figma-bg-blur-radius":5.911}),(0,o.jsxs)("defs",{children:[(0,o.jsx)("pattern",{id:"midscene-logo_svg__d",width:1,height:1,patternContentUnits:"objectBoundingBox",children:(0,o.jsx)("use",{xlinkHref:"#midscene-logo_svg__h",transform:"scale(.00483 .0087)"})}),(0,o.jsx)("pattern",{id:"midscene-logo_svg__e",width:1,height:1,patternContentUnits:"objectBoundingBox",children:(0,o.jsx)("use",{xlinkHref:"#midscene-logo_svg__i",transform:"scale(.009 .01587)"})}),(0,o.jsx)("pattern",{id:"midscene-logo_svg__f",width:1,height:1,patternContentUnits:"objectBoundingBox",children:(0,o.jsx)("use",{xlinkHref:"#midscene-logo_svg__j",transform:"scale(.009 .01587)"})}),(0,o.jsx)("image",{xlinkHref:"data:image/png;base64,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",id:"midscene-logo_svg__h",width:207,height:115,preserveAspectRatio:"none"}),(0,o.jsx)("image",{xlinkHref:"data:image/png;base64,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",id:"midscene-logo_svg__i",width:111,height:63,preserveAspectRatio:"none"}),(0,o.jsx)("image",{xlinkHref:"data:image/png;base64,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",id:"midscene-logo_svg__j",width:111,height:63,preserveAspectRatio:"none"}),(0,o.jsx)("clipPath",{id:"midscene-logo_svg__g",transform:"translate(-21.193 -36.687)",children:(0,o.jsx)("path",{fillRule:"evenodd",d:"m14.619 40.412.082.025c2.186.657 4.053.825 6.578.932.365.016.704-.127.932-.363l3.08-5.674c.94-1.735 3.484-1.735 4.426 0l3.08 5.674c.227.236.566.379.931.363 2.525-.107 4.392-.275 6.578-.932l.082-.025c1.384-.416 3.235-.984 4.774-2.253 1.475-1.216 2.74-3.144 2.8-6.483.066-3.66-.372-5.858-1.066-7.316-.672-1.411-1.641-2.254-2.965-3.093-1.305-.828-2.922-1.54-4.435-1.54H37.44c-1.566 0-3.128.159-4.66.473l-.265.055a24.45 24.45 0 0 1-10.02-.043 22 22 0 0 0-4.582-.484h-2.402c-1.895 0-3.3.818-4.435 1.539-1.359.862-2.325 1.704-2.988 3.106-.686 1.45-1.11 3.637-1.043 7.303.06 3.339 1.325 5.267 2.8 6.483 1.539 1.269 3.39 1.837 4.774 2.253m17.133 1.319-3.146-5.796c-.463-.854-1.742-.854-2.205 0l-3.146 5.796a2.48 2.48 0 0 1-2.03.901c-2.556-.11-4.549-.282-6.888-.985l-.082-.024c-2.74-.824-8.339-2.505-8.473-9.924-.136-7.494 1.7-9.65 4.617-11.5 1.164-.738 2.832-1.735 5.112-1.735h2.402c1.63 0 3.256.172 4.847.512 3.127.67 6.368.683 9.5.04l.266-.054a24.5 24.5 0 0 1 4.914-.498h2.056c1.865 0 3.727.857 5.112 1.736 2.852 1.808 4.753 4.005 4.618 11.499-.135 7.419-5.733 9.1-8.474 9.924l-.082.024c-2.339.703-4.332.876-6.888.985a2.48 2.48 0 0 1-2.03-.901",clipRule:"evenodd"})}),(0,o.jsxs)("filter",{id:"midscene-logo_svg__c",width:27.157,height:19.138,x:21.193,y:36.687,colorInterpolationFilters:"sRGB",filterUnits:"userSpaceOnUse",children:[(0,o.jsx)("feFlood",{floodOpacity:0,result:"BackgroundImageFix"}),(0,o.jsx)("feBlend",{in:"SourceGraphic",in2:"BackgroundImageFix",result:"shape"}),(0,o.jsx)("feGaussianBlur",{result:"effect1_foregroundBlur_8049_134028",stdDeviation:3.212})]})]})]},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))};function AU(e){var t;return null==e||null==(t=e.platformSelector)?void 0:t.fieldKey}function AK(){return(0,o.jsx)(AB,{"aria-hidden":"true",className:"session-setup-select-icon"})}let AF="Create Agent";function AZ(e){var t,r,n,i;let{form:a,sessionSetup:s,sessionSetupError:A,sessionViewState:l,sessionLoading:c,sessionMutating:u,onCreateSession:d}=e,p=u||c||"blocked"===l.setupState,h=null!=(t=null==s?void 0:s.primaryActionLabel)?t:AF,f=null!=(r=null==s?void 0:s.title)?r:AF,g=null!=(n=null==s?void 0:s.description)?n:"Create a platform session before running actions.";return(0,o.jsx)("div",{className:"session-setup-panel",children:(0,o.jsxs)("div",{className:"session-setup-card",children:[(0,o.jsx)(AL,{"aria-hidden":"true",className:"session-setup-logo"}),(0,o.jsx)("h1",{className:"session-setup-title",children:f}),(0,o.jsx)("p",{className:"session-setup-description",children:g}),"blocked"===l.setupState&&l.setupBlockingReason&&(0,o.jsx)(y.A,{type:"error",showIcon:!0,message:"Setup blocked",description:l.setupBlockingReason,className:"session-setup-alert"}),A?(0,o.jsx)(y.A,{type:"error",showIcon:!0,message:"Failed to load setup",description:A,className:"session-setup-alert"}):null,(null==s?void 0:s.notice)?(0,o.jsx)(y.A,{type:s.notice.type,showIcon:!0,message:s.notice.message,description:s.notice.description,className:"session-setup-alert"}):null,(0,o.jsxs)(o0.A,{form:a,layout:"vertical",className:"session-setup-form",onFinish:()=>{p||d()},children:[(null!=(i=null==s?void 0:s.fields)?i:[]).map(e=>(0,o.jsx)(o0.A.Item,{label:e.label,name:e.key,tooltip:e.description,rules:e.required?[{required:!0,message:`${e.label} is required`}]:void 0,children:function(e,t){if("number"===e.type)return(0,o.jsx)(Ah.A,{style:{width:"100%"},placeholder:e.placeholder});if("select"===e.type){var r,n;let i=AU(t),a=function(e,t){var r;if(AU(t)!==e.key||!(null==t||null==(r=t.platformRegistry)?void 0:r.length))return e.options;let n=t.platformRegistry.map(e=>({label:e.label,value:e.id,description:[e.description,e.unavailableReason].filter(Boolean).join(" \xb7 ")||void 0}));return n.length>0?n:e.options}(e,t);return i===e.key&&(null==t||null==(r=t.platformSelector)?void 0:r.variant)==="cards"?(0,o.jsx)(s8.A.Group,{className:"platform-selector-group",children:(a||[]).map(e=>(0,o.jsxs)(s8.A.Button,{value:e.value,className:"platform-selector-card",children:[(0,o.jsx)("div",{className:"platform-selector-title",children:e.label}),e.description?(0,o.jsx)("div",{className:"platform-selector-description",children:e.description}):null]},String(e.value)))}):(0,o.jsx)(Ap.A,{placeholder:e.placeholder,suffixIcon:(0,o.jsx)(AK,{}),options:(null!=(n=null!=a?a:e.options)?n:[]).map(e=>({label:e.label,value:e.value,description:e.description})),optionRender:e=>{let t=e.data.description;return t?(0,o.jsxs)("div",{className:"session-select-option",children:[(0,o.jsx)("div",{className:"session-select-option-label",children:e.data.label}),(0,o.jsx)("div",{className:"session-select-option-description",children:t})]}):e.data.label}})}return(0,o.jsx)(m.A,{placeholder:e.placeholder})}(e,s)},e.key)),(0,o.jsx)("button",{type:"submit",className:"session-setup-submit",disabled:p,children:u?"Creating...":h})]})]})})}function AQ(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function AJ(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function AX(e,t,r,n,i,o,a){try{var s=e[o](a),A=s.value}catch(e){r(e);return}s.done?t(A):Promise.resolve(A).then(n,i)}function AH(e){var t,r,n,i,a,s;let A,{controller:l,appVersion:c,title:u="Playground",branding:d,playgroundConfig:p,header:h,className:m,playgroundClassName:v,notConnectedFallback:b}=e,{state:w,actions:E}=l,k=AJ(AQ({},A={showContextPreview:!1,layout:"vertical",showVersionInfo:!1,enableScrollToBottom:!1,serverMode:!0,showEnvConfigReminder:!1,showClearButton:!1,showSystemMessageHeader:!1,promptInputChrome:{variant:"minimal"},executionFlow:{collapsible:!0},deviceType:w.deviceType,executionUx:{hints:w.executionUxHints,countdownSeconds:w.countdownSeconds}},p),{executionFlow:AQ({},A.executionFlow,null==p?void 0:p.executionFlow),executionUx:AQ({},A.executionUx,null==p?void 0:p.executionUx)}),x=(t=w.runtimeInfo,r=w.deviceType,AJ(AQ({},d),{title:null!=(n=null==t?void 0:t.title)?n:u,version:c,targetName:null!=(s=null!=(a=null!=(i=null==t?void 0:t.platformId)?i:null==d?void 0:d.targetName)?a:r)?s:"screen"}));return(0,o.jsxs)("div",{className:["playground-conversation-panel",m].filter(Boolean).join(" "),children:[(0,o.jsx)(f.A,{open:null!==w.countdown,footer:(0,o.jsx)(g.Ay,{onClick:E.finishCountdown,type:"default",children:"Skip countdown"}),closable:!0,maskClosable:!0,onCancel:E.finishCountdown,centered:!0,width:400,styles:{mask:{backgroundColor:"rgba(0, 0, 0, 0.75)"}},children:(0,o.jsxs)("div",{style:{textAlign:"center",padding:"40px 20px"},children:[(0,o.jsx)("div",{style:{fontSize:"120px",fontWeight:"bold",color:"GO!"===w.countdown?"#52c41a":"#1890ff",marginBottom:"24px",lineHeight:1},children:w.countdown}),(0,o.jsx)("div",{style:{fontSize:"18px",fontWeight:500,marginBottom:"12px"},children:"Automation Starting Soon"}),(0,o.jsxs)("div",{style:{fontSize:"14px",color:"var(--midscene-text-secondary)"},children:["The selected session requested a countdown before execution.",(0,o.jsx)("br",{}),"Please wait until the run starts."]})]})}),h,(0,o.jsx)("div",{className:"playground-conversation-body",children:w.serverOnline?w.sessionViewState.connected?(0,o.jsx)(Az,{playgroundSDK:w.playgroundSDK,config:k,branding:x,className:["playground-container","playground-conversation-skin",v].filter(Boolean).join(" ")}):void 0!==b?(0,o.jsx)(o.Fragment,{children:b}):(0,o.jsx)(AZ,{form:w.form,sessionSetup:w.sessionSetup,sessionSetupError:w.sessionSetupError,sessionViewState:w.sessionViewState,sessionLoading:w.sessionLoading,sessionMutating:w.sessionMutating,onCreateSession:()=>{var e;return(e=function*(){yield E.createSession()},function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){AX(o,n,i,a,s,"next",e)}function s(e){AX(o,n,i,a,s,"throw",e)}a(void 0)})})()}}):(0,o.jsx)("div",{className:"playground-conversation-offline",children:(0,o.jsx)(y.A,{type:"warning",showIcon:!0,message:"Playground server offline",description:"Reconnect the runtime to continue using the Android playground."})})})]})}let{Content:AG}=Y.A;function Aq(e){var t;let{serverUrl:r,appVersion:n,title:i="Playground",defaultDeviceType:s="web",branding:l,playgroundConfig:c,offlineTitle:u="Midscene Playground",offlineStatusText:d="Server offline...",pollIntervalMs:h=5e3}=e,[f,g]=(0,a.useState)(!1),m=function(e){var t;let{serverUrl:r,defaultDeviceType:n="web",pollIntervalMs:i=5e3,countdownSeconds:o=3,initialFormValues:s,onCountdownFinish:A}=e,{message:l}=p.A.useApp(),[c]=o0.A.useForm(),u=(0,a.useRef)(s);(0,a.useLayoutEffect)(()=>{let e=u.current;if(e)for(let[t,r]of Object.entries(e))void 0===c.getFieldValue(t)&&c.setFieldsValue({[t]:r})},[c]);let d=null!=(t=o0.A.useWatch([],c))?t:{},[h,f]=(0,a.useState)(null),[g,m]=(0,a.useState)(null),[y,v]=(0,a.useState)(null),[b,w]=(0,a.useState)(!1),[E,k]=(0,a.useState)(!1),x=X(e=>e.config),S=(0,a.useMemo)(()=>JSON.stringify(Object.entries(x).sort((e,t)=>{let[r]=e,[n]=t;return r.localeCompare(n)})),[x]),C=ae(g),I="string"==typeof C?d[C]:void 0,j=(0,a.useMemo)(()=>new o$({type:"remote-execution",serverUrl:r}),[r]),{serverOnline:O,isUserOperating:P,deviceType:R,runtimeInfo:T,executionUxHints:N,refreshServerState:M}=function(e,t,r){let[n,i]=(0,a.useState)(!1),[o,s]=(0,a.useState)(!1),[A,l]=(0,a.useState)(t),[c,u]=(0,a.useState)(null),[d,p]=(0,a.useState)([]),h=(0,a.useRef)(null),f=(0,a.useRef)(!0);(0,a.useEffect)(()=>(f.current=!0,()=>{f.current=!1}),[]),(0,a.useEffect)(()=>{h.current=c},[c]),(0,a.useEffect)(()=>{e.onProgressUpdate(e=>{s(!!e)})},[e]);let g=(0,a.useCallback)(()=>{var r;return(r=function*(){try{let a=yield e.checkStatus();if(!f.current)return;if(i(a),!a){h.current=null,u(null),p([]);return}try{let r=yield e.getRuntimeInfo();if(!f.current)return;if(r){h.current=r,u(r),l(eS(r,t)),p(eC(r));return}}catch(e){console.warn("Failed to get runtime info:",e)}try{var r,n,o;let i=yield e.getInterfaceInfo();if(!f.current||!(null==i?void 0:i.type))return;let a=(r=h.current,n=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}({},r),o=o={interface:i,preview:(null==r?void 0:r.preview)||{kind:"none",capabilities:[]},executionUxHints:(null==r?void 0:r.executionUxHints)||[],metadata:(null==r?void 0:r.metadata)||{}},Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(o)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(o)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(o,e))}),n);h.current=a,u(a),l(eS(a,t)),p(eC(a))}catch(e){console.warn("Failed to get interface info:",e)}}catch(e){if(!f.current)return;console.error("Failed to check server status:",e),i(!1)}},function(){var e=this,t=arguments;return new Promise(function(n,i){var o=r.apply(e,t);function a(e){o3(o,n,i,a,s,"next",e)}function s(e){o3(o,n,i,a,s,"throw",e)}a(void 0)})})()},[t,e]);return(0,a.useEffect)(()=>{g();let e=window.setInterval(()=>{g()},r);return()=>{window.clearInterval(e)}},[r,g]),{serverOnline:n,isUserOperating:o,deviceType:A,runtimeInfo:c,executionUxHints:d,refreshServerState:g}}(j,n,i),D=(0,a.useMemo)(()=>{let e,t;return t=(e=(null==T?void 0:T.metadata)||{}).setupState,{connected:!!e.sessionConnected,displayName:"string"==typeof e.sessionDisplayName?e.sessionDisplayName:void 0,setupState:"blocked"===t||"ready"===t||"required"===t?t:"ready",setupBlockingReason:"string"==typeof e.setupBlockingReason?e.setupBlockingReason:void 0}},[T]),z=(0,a.useRef)(null),B=(0,a.useRef)(null),L=(0,a.useRef)(!0),U=(0,a.useRef)(void 0),K=(0,a.useRef)(null),F=(0,a.useRef)(null),Z=(0,a.useRef)(!1),Q=(0,a.useRef)(null),J=(0,a.useRef)(null),H=(0,a.useRef)(null),q=(0,a.useCallback)(()=>o6(function*(){if(!o7(x))return Q.current=null,H.current=null,!0;if(Q.current===S)return!0;let e=H.current;if((null==e?void 0:e.signature)===S)return e.promise;let t={promise:Promise.resolve(!0),signature:S},r=o6(function*(){try{var e;return yield(e=function*(){return!!o7(x)&&(yield j.overrideConfig(x),!0)},function(){var t=this,r=arguments;return new Promise(function(n,i){var o=e.apply(t,r);function a(e){o5(o,n,i,a,s,"next",e)}function s(e){o5(o,n,i,a,s,"throw",e)}a(void 0)})})(),Q.current=S,!0}catch(e){return G(e,{title:"Failed to apply AI configuration"}),!1}finally{H.current===t&&(H.current=null)}})();return t.promise=r,H.current=t,r})(),[x,S,j]),W=(0,a.useCallback)(()=>{let e=null!==z.current;null!==z.current&&(window.clearInterval(z.current),z.current=null);let t=B.current;B.current=null,L.current&&f(null),null==t||t(),e&&L.current&&(null==A||A())},[A]),V=(0,a.useCallback)(()=>o6(function*(){if(!(o<=0))return W(),new Promise(e=>{B.current=e;let t=o;L.current&&f(t),z.current=window.setInterval(()=>{if((t-=1)>0){L.current&&f(t);return}if(0===t){L.current&&f("GO!");return}W()},1e3)})})(),[o,W]);(0,a.useEffect)(()=>(L.current=!0,()=>{L.current=!1,W()}),[W]),(0,a.useEffect)(()=>N.includes("countdown-before-run")?(j.setBeforeActionHook(()=>o6(function*(){yield V()})()),()=>{j.setBeforeActionHook(void 0)}):void j.setBeforeActionHook(void 0),[N,j,V]);let Y=(0,a.useCallback)(e=>o6(function*(){let t=o9({},c.getFieldsValue(!0),e||{});w(!0);try{let r=yield j.getSessionSetup(e);m(r),v(null);let n=ae(r);U.current=n&&"string"==typeof t[n]?t[n]:void 0,c.setFieldsValue(o1(r,t))}catch(e){console.error("Failed to load session setup:",e),v(e instanceof Error?e.message:"Failed to load session setup")}finally{w(!1)}})(),[c,j]),_=(0,a.useCallback)((e,t)=>o6(function*(){if(J.current)return J.current;let r=o6(function*(){try{if(Z.current=!0,k(!0),!(yield q()))return!1;let r=null!=e?e:yield c.validateFields();return yield j.createSession(r),(null==t?void 0:t.silent)||(F.current=null),(null==t?void 0:t.silent)||l.success("Agent created"),yield M(),!0}catch(e){if(e.errorFields)return!1;return G(e,{title:"Failed to create Agent"}),!1}finally{Z.current=!1,k(!1)}})(),n={promise:null};return n.promise=r.finally(()=>{J.current===n.promise&&(J.current=null)}),J.current=n.promise,n.promise})(),[q,c,l,j,M]),$=(0,a.useCallback)(()=>o6(function*(){try{F.current=o4(o2(g,c.getFieldsValue(!0))),Z.current=!0,k(!0),yield j.destroySession(),l.success("Session disconnected"),yield M(),yield Y()}catch(e){G(e,{title:"Failed to disconnect session"})}finally{Z.current=!1,k(!1)}})(),[c,l,j,M,Y,g]);return(0,a.useEffect)(()=>{O&&q()},[q,O]),(0,a.useEffect)(()=>{if(!O||D.connected)return;let e=!1,t=!1,r=()=>o6(function*(){if(!e&&!t){t=!0;try{yield Y(c.getFieldsValue(!0))}finally{t=!1}}})();r();let n=window.setInterval(()=>{r()},i);return()=>{e=!0,window.clearInterval(n)}},[c,i,Y,O,D.connected]),(0,a.useEffect)(()=>{if(!O||D.connected||!I)return;let e=ae(g);if(e&&U.current!==I){var t,r;Y((t=o9({},c.getFieldsValue(!0)),r=r={[e]:I},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}),t))}},[c,Y,I,O,g,D.connected]),(0,a.useEffect)(()=>{if(D.connected){K.current=null;return}if(!O||b||E||Z.current||y)return;let e=o2(g,c.getFieldsValue(!0)),{signature:t,shouldCreate:r}=function(e){let{autoCreateInput:t,lastAttemptedSignature:r,blockedSignature:n}=e,i=o4(t);return i?{signature:i,shouldCreate:i!==r&&i!==n}:{signature:null,shouldCreate:!1}}({autoCreateInput:e,lastAttemptedSignature:K.current,blockedSignature:F.current});if(!r||!t){t||(K.current=null);return}K.current=t,o6(function*(){(yield _(null!=e?e:void 0,{silent:!0}))||(K.current=null)})()},[_,c,O,b,E,g,y,D.connected]),{state:{playgroundSDK:j,form:c,formValues:d,serverOnline:O,isUserOperating:P,deviceType:R,runtimeInfo:T,executionUxHints:N,sessionViewState:D,sessionSetup:g,sessionSetupError:y,sessionLoading:b,sessionMutating:E,countdown:h,countdownSeconds:o},actions:{refreshServerState:M,refreshSessionSetup:Y,createSession:_,destroySession:$,finishCountdown:W}}}({serverUrl:r,defaultDeviceType:s,countdownSeconds:null==c||null==(t=c.executionUx)?void 0:t.countdownSeconds,pollIntervalMs:h});return((0,a.useEffect)(()=>{let e=()=>{g(window.innerWidth<=1024)};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]),m.state.serverOnline)?(0,o.jsx)(eT,{children:(0,o.jsx)(Y.A,{className:"app-container playground-container",children:(0,o.jsx)(AG,{className:"app-content",children:(0,o.jsxs)(_.YZ,{autoSaveId:"playground-layout",direction:f?"vertical":"horizontal",children:[(0,o.jsx)(_.Zk,{defaultSize:f?67:32,maxSize:f?85:60,minSize:f?67:25,className:"app-panel left-panel",children:(0,o.jsxs)("div",{className:"panel-content left-panel-content",children:[(0,o.jsx)("div",{className:"playground-panel-header",children:(0,o.jsxs)("div",{className:"header-row",children:[(0,o.jsx)(A,{}),(0,o.jsx)(V,{showTooltipWhenEmpty:!1,showModelName:!1,playgroundSDK:m.state.playgroundSDK})]})}),(0,o.jsx)("div",{className:"playground-panel-playground",children:(0,o.jsx)(AH,{controller:m,appVersion:n,branding:l,playgroundConfig:c,title:i})})]})}),(0,o.jsx)(_.TW,{className:"panel-resize-handle"}),(0,o.jsx)(_.Zk,{defaultSize:f?33:68,minSize:f?15:40,className:"app-panel right-panel",children:(0,o.jsx)("div",{className:"panel-content right-panel-content",children:m.state.sessionViewState.connected?(0,o.jsx)(eP,{playgroundSDK:m.state.playgroundSDK,runtimeInfo:m.state.runtimeInfo,serverUrl:r,serverOnline:m.state.serverOnline,isUserOperating:m.state.isUserOperating}):(0,o.jsx)(ee,{})})})]})})})}):(0,o.jsx)(eT,{children:(0,o.jsx)("div",{className:"server-offline-container",children:(0,o.jsxs)("div",{className:"server-offline-message",children:[(0,o.jsx)(A,{}),(0,o.jsxs)("div",{className:"server-offline-content",children:[(0,o.jsxs)("div",{className:"server-offline-icon",children:[(0,o.jsx)(at,{className:"icon-background"}),(0,o.jsx)(ar,{className:"icon-foreground"})]}),(0,o.jsx)("h1",{children:u}),(0,o.jsx)("p",{className:"connection-status",children:d})]})]})})})}let AW=document.getElementById("root");if(!AW)throw Error("Root element not found");(0,s.createRoot)(AW).render((0,o.jsx)(a.StrictMode,{children:(0,o.jsx)(function(){return(0,o.jsx)(Aq,{serverUrl:"",appVersion:"1.10.0",title:"Playground",offlineTitle:"Midscene Playground"})},{})}))},1182(){},3198(e,t,r){"use strict";r.d(t,{ZH:()=>d});var n=r(3244),i=r(5207),o=r(3078),a=r.n(o),s=r(217),A=r(6987),l=r(9152),c=r(5409);let u="midscene_run",d=e=>{if(!l.$9)return"";let t=(()=>{if(!l.$9)return"";let e=a().resolve(c.cwd(),l.$9?(0,s.j)(A.Tr)||u:"");if(!(0,n.existsSync)(e))try{(0,n.mkdirSync)(e,{recursive:!0})}catch(t){e=a().join((0,i.tmpdir)(),u),(0,n.mkdirSync)(e,{recursive:!0})}return e})(),r=a().join(t,e);return(0,n.existsSync)(r)||(0,n.mkdirSync)(r,{recursive:!0}),r}},217(e,t,r){"use strict";r.d(t,{j:()=>o});var n=r(6987),i=r(5409);let o=e=>{if(!n.Wh.includes(e))throw Error(`getBasicEnvValue with key ${e} is not supported.`);return i.env[e]}},6987(e,t,r){"use strict";r.d(t,{$:()=>C,$H:()=>h,$L:()=>c,$l:()=>s,AU:()=>w,CA:()=>S,Cn:()=>el,DL:()=>ev,El:()=>z,FU:()=>d,G0:()=>i,HR:()=>o,I2:()=>n,IQ:()=>p,JM:()=>j,Jq:()=>E,Km:()=>m,Lg:()=>ew,Lh:()=>J,M1:()=>b,NF:()=>P,OK:()=>eo,OY:()=>ed,Od:()=>I,Pm:()=>H,Sk:()=>N,T4:()=>F,TN:()=>L,Tr:()=>U,UH:()=>eC,V7:()=>q,VM:()=>v,Vb:()=>ep,W4:()=>g,WH:()=>es,Wh:()=>em,XE:()=>eE,YK:()=>B,Yf:()=>Z,Yg:()=>G,Z$:()=>eA,Z7:()=>X,ZX:()=>l,_j:()=>ex,_q:()=>K,aK:()=>y,aO:()=>ef,ag:()=>ea,b6:()=>x,c$:()=>ey,d8:()=>D,fS:()=>ee,ho:()=>M,iw:()=>u,jG:()=>k,j_:()=>T,kX:()=>Q,mZ:()=>er,n0:()=>A,nc:()=>$,pp:()=>R,rd:()=>eb,sg:()=>ec,tk:()=>ek,u1:()=>eh,v:()=>Y,v4:()=>a,vC:()=>W,wu:()=>eu,xP:()=>et,xg:()=>V,y2:()=>_,yR:()=>eg,yb:()=>O,zD:()=>f,zG:()=>ei,zQ:()=>en});let n="MIDSCENE_MODEL_INIT_CONFIG_JSON",i="MIDSCENE_MODEL_EXTRA_BODY_JSON",o="MIDSCENE_MODEL_NAME",a="MIDSCENE_DEBUG_MODEL_PROFILE",s="MIDSCENE_DEBUG_MODEL_RESPONSE",A="MIDSCENE_DEBUG_MODE",l="MIDSCENE_LANGSMITH_DEBUG",c="MIDSCENE_LANGFUSE_DEBUG",u="MIDSCENE_MODEL_SOCKS_PROXY",d="MIDSCENE_MODEL_HTTP_PROXY",p="MIDSCENE_MODEL_API_KEY",h="MIDSCENE_MODEL_BASE_URL",f="MIDSCENE_MODEL_TIMEOUT",g="MIDSCENE_MODEL_TEMPERATURE",m="MIDSCENE_MODEL_RETRY_COUNT",y="MIDSCENE_MODEL_RETRY_INTERVAL",v="MIDSCENE_MODEL_REASONING_EFFORT",b="MIDSCENE_MODEL_REASONING_ENABLED",w="MIDSCENE_MODEL_REASONING_BUDGET",E="OPENAI_API_KEY",k="OPENAI_BASE_URL",x="MIDSCENE_OPENAI_INIT_CONFIG_JSON",S="MIDSCENE_OPENAI_HTTP_PROXY",C="MIDSCENE_OPENAI_SOCKS_PROXY",I="MIDSCENE_CACHE",j="MIDSCENE_USE_VLM_UI_TARS",O="MIDSCENE_USE_QWEN_VL",P="MIDSCENE_USE_QWEN3_VL",R="MIDSCENE_USE_DOUBAO_VISION",T="MIDSCENE_USE_GEMINI",N="MATCH_BY_POSITION",M="MIDSCENE_REPORT_TAG_NAME",D="MIDSCENE_REPORT_QUIET",z="MIDSCENE_PREFERRED_LANGUAGE",B="MIDSCENE_CACHE_MAX_FILENAME_LENGTH",L="MIDSCENE_REPLANNING_CYCLE_LIMIT",U="MIDSCENE_RUN_DIR",K="MIDSCENE_INSIGHT_MODEL_NAME",F="MIDSCENE_INSIGHT_MODEL_SOCKS_PROXY",Z="MIDSCENE_INSIGHT_MODEL_HTTP_PROXY",Q="MIDSCENE_INSIGHT_MODEL_BASE_URL",J="MIDSCENE_INSIGHT_MODEL_API_KEY",X="MIDSCENE_INSIGHT_MODEL_INIT_CONFIG_JSON",H="MIDSCENE_INSIGHT_MODEL_EXTRA_BODY_JSON",G="MIDSCENE_INSIGHT_MODEL_TIMEOUT",q="MIDSCENE_INSIGHT_MODEL_TEMPERATURE",W="MIDSCENE_INSIGHT_MODEL_RETRY_COUNT",V="MIDSCENE_INSIGHT_MODEL_RETRY_INTERVAL",Y="MIDSCENE_INSIGHT_MODEL_FAMILY",_="MIDSCENE_INSIGHT_MODEL_REASONING_EFFORT",$="MIDSCENE_INSIGHT_MODEL_REASONING_ENABLED",ee="MIDSCENE_INSIGHT_MODEL_REASONING_BUDGET",et="MIDSCENE_PLANNING_MODEL_NAME",er="MIDSCENE_PLANNING_MODEL_SOCKS_PROXY",en="MIDSCENE_PLANNING_MODEL_HTTP_PROXY",ei="MIDSCENE_PLANNING_MODEL_BASE_URL",eo="MIDSCENE_PLANNING_MODEL_API_KEY",ea="MIDSCENE_PLANNING_MODEL_INIT_CONFIG_JSON",es="MIDSCENE_PLANNING_MODEL_EXTRA_BODY_JSON",eA="MIDSCENE_PLANNING_MODEL_TIMEOUT",el="MIDSCENE_PLANNING_MODEL_TEMPERATURE",ec="MIDSCENE_PLANNING_MODEL_RETRY_COUNT",eu="MIDSCENE_PLANNING_MODEL_RETRY_INTERVAL",ed="MIDSCENE_PLANNING_MODEL_FAMILY",ep="MIDSCENE_PLANNING_MODEL_REASONING_EFFORT",eh="MIDSCENE_PLANNING_MODEL_REASONING_ENABLED",ef="MIDSCENE_PLANNING_MODEL_REASONING_BUDGET",eg="MIDSCENE_MODEL_FAMILY",em=[A,a,s,U],ey=[I,l,c,D],ev=[B,L],eb=["MIDSCENE_ADB_PATH","MIDSCENE_ADB_REMOTE_HOST","MIDSCENE_ADB_REMOTE_PORT","MIDSCENE_ANDROID_IME_STRATEGY","MIDSCENE_IOS_DEVICE_UDID","MIDSCENE_IOS_SIMULATOR_UDID",M,z,N,"MIDSCENE_CHROME_PATH","MIDSCENE_MCP_CHROME_PATH","DOCKER_CONTAINER"],ew=[...ey,...ev,...eb],eE=[o,n,i,p,h,u,d,f,g,m,y,v,b,w,j,O,P,R,T,"MIDSCENE_USE_VL_MODEL",E,k,x,S,C,K,F,Z,Q,J,X,H,G,q,W,V,Y,_,$,ee,et,er,en,ei,eo,ea,es,eA,el,ec,eu,ed,ep,eh,ef,eg],ek=["MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG",...em,...ew,...eE],ex=["doubao-vision","doubao-seed","gemini","qwen2.5-vl","qwen3-vl","qwen3","qwen3.5","qwen3.6","vlm-ui-tars","vlm-ui-tars-doubao","vlm-ui-tars-doubao-1.5","glm-v","auto-glm","auto-glm-multilingual","gpt-5","kimi","xiaomi-mimo"];var eS,eC=((eS={}).V1_0="1.0",eS.V1_5="1.5",eS.DOUBAO_1_5_15B="doubao-1.5-15B",eS.DOUBAO_1_5_20B="doubao-1.5-20B",eS)},4565(e,t,r){"use strict";r.d(t,{N:()=>g,a:()=>function e(t,r){let n=`${p}:${t}`,o=(null==r?void 0:r.console)??!1,s=o?`${n}:withConsole`:n;if(!f.has(s))if(o){let r=e(t);f.set(s,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];r(...t),console.warn("[Midscene]",...t)})}else{let e=c()(n);f.set(s,function(){for(var r=arguments.length,n=Array(r),o=0;o<r;o++)n[o]=arguments[o];d.$9&&function(e,t){if(!d.$9)return;let r=function(e){let t=e.replace(/:/g,"-");if(!h.has(t)){let e=a().join((0,u.ZH)("log"),`${t}.log`),r=i().createWriteStream(e,{flags:"a"});h.set(t,r)}return h.get(t)}(e),n=new Date,o=n.toLocaleDateString("sv-SE"),s=n.toLocaleTimeString("sv-SE"),A=n.getMilliseconds().toString().padStart(3,"0"),l=n.getTimezoneOffset(),c=Math.floor(Math.abs(l)/60).toString().padStart(2,"0"),p=(Math.abs(l)%60).toString().padStart(2,"0"),f=`${l<=0?"+":"-"}${c}:${p}`,g=`${o}T${s}.${A}${f}`;r.write(`[${g}] ${t}
|
|
950
|
+
`)}(t,A().format(...n)),e(...n)})}return f.get(s)}});var n=r(3244),i=r.n(n),o=r(3078),a=r.n(o),s=r(1344),A=r.n(s),l=r(7617),c=r.n(l),u=r(3198),d=r(9152);let p="midscene",h=new Map,f=new Map;function g(e){d.$9||c().enable(`${p}:${e}`)}},9152(e,t,r){"use strict";r.d(t,{$9:()=>l,NB:()=>v,Qd:()=>E,gQ:()=>h,gV:()=>w,ht:()=>s,rS:()=>A,tD:()=>d,uR:()=>c,vA:()=>p,x3:()=>b});var n,i=r(7086),o=r(3961),a=r(5409);let s="undefined"!=typeof window,A="undefined"!=typeof WorkerGlobalScope,l=void 0!==a&&(null==(n=a.versions)?void 0:n.node);function c(){return(0,o.A)()}let u={};function d(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=JSON.stringify({content:t,rect:e}),n=5,o="",a=i.sha256.create().update(r).hex().split("").map(e=>String.fromCharCode(97+Number.parseInt(e,16)%26)).join("");for(;n<a.length-1;){if(u[o=a.slice(0,n)]&&u[o]!==r){n++;continue}u[o]=r;break}return o}function p(e,t){if(!e)throw Error(t||"Assertion failed")}function h(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];console.log(...t)}let f=/</g,g=/>/g,m="__midscene_lt__",y="__midscene_gt__",v=e=>e.replace(f,m).replace(g,y),b=e=>{let t=RegExp(m,"g"),r=RegExp(y,"g");return e.replace(t,"<").replace(r,">")};function w(e){return e.replace(/[:*?"<>|# ]/g,"-")}function E(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}},4678(e){"use strict";if("undefined"==typeof sharp){var t=Error("Cannot find module 'sharp'");throw t.code="MODULE_NOT_FOUND",t}e.exports=sharp},6122(){},7407(){},9140(){},8973(){},3009(){},2801(){},6390(){},6970(){},3147(){},3612(){},3244(){},5592(){}},A={};function l(e){var t=A[e];if(void 0!==t)return t.exports;var r=A[e]={exports:{}};return s[e].call(r.exports,r,r.exports,l),r.exports}l.m=s,l.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(r,n){if(1&n&&(r=this(r)),8&n||"object"==typeof r&&r&&(4&n&&r.__esModule||16&n&&"function"==typeof r.then))return r;var i=Object.create(null);l.r(i);var o={};e=e||[null,t({}),t([]),t(t)];for(var a=2&n&&r;("object"==typeof a||"function"==typeof a)&&!~e.indexOf(a);a=t(a))Object.getOwnPropertyNames(a).forEach(e=>{o[e]=()=>r[e]});return o.default=()=>r,l.d(i,o),i},l.d=(e,t)=>{for(var r in t)l.o(t,r)&&!l.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,r)=>(l.f[r](e,t),t),[])),l.u=e=>"static/js/async/"+e+"."+({195:"0366f6e8",236:"a5d2c1b1",271:"72510be8",467:"710fa05a",985:"c09263d7"})[e]+".js",l.miniCssF=e=>""+e+".css",l.g=(()=>{if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}})(),l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r={},l.l=function(e,t,n,i){if(r[e])return void r[e].push(t);if(void 0!==n)for(var o,a,s=document.getElementsByTagName("script"),A=0;A<s.length;A++){var c=s[A];if(c.getAttribute("src")==e||c.getAttribute("data-rspack")=="playground:"+n){o=c;break}}o||(a=!0,(o=document.createElement("script")).timeout=120,l.nc&&o.setAttribute("nonce",l.nc),o.setAttribute("data-rspack","playground:"+n),o.src=e),r[e]=[t];var u=function(t,n){o.onerror=o.onload=null,clearTimeout(d);var i=r[e];if(delete r[e],o.parentNode&&o.parentNode.removeChild(o),i&&i.forEach(function(e){return e(n)}),t)return t(n)},d=setTimeout(u.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=u.bind(null,o.onerror),o.onload=u.bind(null,o.onload),a&&document.head.appendChild(o)},l.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n=[],l.O=(e,t,r,i)=>{if(t){i=i||0;for(var o=n.length;o>0&&n[o-1][2]>i;o--)n[o]=n[o-1];n[o]=[t,r,i];return}for(var a=1/0,o=0;o<n.length;o++){for(var[t,r,i]=n[o],s=!0,A=0;A<t.length;A++)(!1&i||a>=i)&&Object.keys(l.O).every(e=>l.O[e](t[A]))?t.splice(A--,1):(s=!1,i<a&&(a=i));if(s){n.splice(o--,1);var c=r();void 0!==c&&(e=c)}}return e},l.p="/",l.b=document.baseURI||self.location.href,i={410:0},l.f.j=function(e,t){var r=l.o(i,e)?i[e]:void 0;if(0!==r)if(r)t.push(r[2]);else{var n=new Promise((t,n)=>r=i[e]=[t,n]);t.push(r[2]=n);var o=l.p+l.u(e),a=Error();l.l(o,function(t){if(l.o(i,e)&&(0!==(r=i[e])&&(i[e]=void 0),r)){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;a.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",a.name="ChunkLoadError",a.type=n,a.request=o,r[1](a)}},"chunk-"+e,e)}},l.O.j=e=>0===i[e],o=(e,t)=>{var r,n,[o,a,s]=t,A=0;if(o.some(e=>0!==i[e])){for(r in a)l.o(a,r)&&(l.m[r]=a[r]);if(s)var c=s(l)}for(e&&e(t);A<o.length;A++)n=o[A],l.o(i,n)&&i[n]&&i[n][0](),i[n]=0;return l.O(c)},(a=self.webpackChunkplayground=self.webpackChunkplayground||[]).forEach(o.bind(null,0)),a.push=o.bind(null,a.push.bind(a));var c=l.O(void 0,["783","905"],()=>l(1665));c=l.O(c)})();
|
|
951
|
+
//# sourceMappingURL=index.9c67d55f.js.map
|