remote-webview-debugger 0.0.0-stage → 0.2.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.
Files changed (57) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/CHANGELOG.zh-CN.md +66 -0
  3. package/LICENSE +21 -0
  4. package/NOTICE +17 -0
  5. package/README.ar.md +185 -0
  6. package/README.de.md +169 -0
  7. package/README.es.md +169 -0
  8. package/README.fr.md +169 -0
  9. package/README.ja.md +169 -0
  10. package/README.ko.md +169 -0
  11. package/README.md +167 -2
  12. package/README.pt-BR.md +169 -0
  13. package/README.ru.md +169 -0
  14. package/README.zh-CN.md +169 -0
  15. package/README.zh-TW.md +169 -0
  16. package/dist/index.d.ts +368 -0
  17. package/dist/index.mjs +8319 -0
  18. package/dist/index.mjs.map +1 -0
  19. package/dist/locales/ar.d.ts +4 -0
  20. package/dist/locales/ar.js +2 -0
  21. package/dist/locales/ar.mjs +150 -0
  22. package/dist/locales/ar.mjs.map +1 -0
  23. package/dist/locales/de.d.ts +4 -0
  24. package/dist/locales/de.js +2 -0
  25. package/dist/locales/de.mjs +150 -0
  26. package/dist/locales/de.mjs.map +1 -0
  27. package/dist/locales/es.d.ts +4 -0
  28. package/dist/locales/es.js +2 -0
  29. package/dist/locales/es.mjs +150 -0
  30. package/dist/locales/es.mjs.map +1 -0
  31. package/dist/locales/fr.d.ts +4 -0
  32. package/dist/locales/fr.js +2 -0
  33. package/dist/locales/fr.mjs +150 -0
  34. package/dist/locales/fr.mjs.map +1 -0
  35. package/dist/locales/ja.d.ts +4 -0
  36. package/dist/locales/ja.js +2 -0
  37. package/dist/locales/ja.mjs +150 -0
  38. package/dist/locales/ja.mjs.map +1 -0
  39. package/dist/locales/ko.d.ts +4 -0
  40. package/dist/locales/ko.js +2 -0
  41. package/dist/locales/ko.mjs +156 -0
  42. package/dist/locales/ko.mjs.map +1 -0
  43. package/dist/locales/pt.d.ts +4 -0
  44. package/dist/locales/pt.js +2 -0
  45. package/dist/locales/pt.mjs +150 -0
  46. package/dist/locales/pt.mjs.map +1 -0
  47. package/dist/locales/ru.d.ts +4 -0
  48. package/dist/locales/ru.js +2 -0
  49. package/dist/locales/ru.mjs +150 -0
  50. package/dist/locales/ru.mjs.map +1 -0
  51. package/dist/locales/zh-TW.d.ts +4 -0
  52. package/dist/locales/zh-TW.js +2 -0
  53. package/dist/locales/zh-TW.mjs +150 -0
  54. package/dist/locales/zh-TW.mjs.map +1 -0
  55. package/dist/sdk.js +42 -0
  56. package/dist/sdk.js.map +1 -0
  57. package/package.json +76 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","names":["Emitter","random","uniqId","getType","_type","perfNow","now","getType","getKeys","isMap","isSet","toStr","toSrc","isNull","isArr","isRegExp","isErr","isEl","isEnable","enable","buffered","connector","map","objManager.wrap","Function","now","stackTrace","isStr","trim","trigger","Emitter","isStr","now","isEmpty","toNum","trim","last","Url","startWith","now","connector","isNative","now","isUndef","isStr","isBlob","convertBin","contain","session","pending","emit","select","escapeRegExp","clip","Network.getResponseBody","objManager.getObj","domToCanvas","cachesCounter","css.tokenize","css.WhitespaceToken","css.DelimToken","css.StringToken","css.FunctionToken","css.IdentToken","css.CloseParenToken","roleUtils.isElementHiddenForAria","roleUtils.getCSSContent","roleUtils.getAriaRole","roleUtils.getElementAccessibleName","receivesPointerEvents","roleUtils.receivesPointerEvents","roleUtils.getAriaChecked","roleUtils.getAriaDisabled","roleUtils.getAriaExpanded","roleUtils.getAriaInvalid","roleUtils.getAriaLevel","roleUtils.getAriaPressed","roleUtils.getAriaSelected","aria.hasPointerCursor","elementSymbol","CSS","w","exports","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__commonJSMin","mod","cb","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","isNodeMode","target","w","nativeFetch","nativeWebSocket","proto","ctor","require_isUndef","val","require_objToStr","ObjToStr","require_isNum","objToStr","require_isFn","objStr","require_isArrLike","isNum","isFn","MAX_ARR_IDX","len","require_has","hasOwnProp","obj","require_keys","has","ret","require_optimizeCb","isUndef","ctx","fn","argCount","idx","collection","accumulator","require_each","isArrLike","optimizeCb","iterator","_keys","require_createAssigner","each","keysFn","src","defaults","require_isObj","type","require_getProto","isObj","getPrototypeOf","ObjectCtr","require_isArr","require_extendOwn","require_isMatch","require_matcher","extendOwn","isMatch","attrs","require_identity","require_castPath","isArr","str","regPropName","quote","regEscapeChar","number","match","require_safeGet","castPath","path","prop","require_property","safeGet","shallowProperty","require_safeCb","matcher","identity","property","require_filter","safeCb","predicate","list","require_unique","filter","cmp","isEqual","arr","item","a","b","require_allKeys","getProto","unique","getOwnPropertyNames","getOwnPropertySymbols","_ref","_ref$prototype","prototype","_ref$unenumerable","unenumerable","_ref$symbol","symbol","getKeys","require_extend","require_map","results","curKey","require_isStr","require_toArr","map","isStr","require_create","objCreate","noop","require_inherits","create","SuperClass","require_isMiniProgram","require_Class","extend","toArr","inherits","isMiniProgram","Base","methods","statics","makeClass","className","args","parent","Class","name","require_slice","start","end","require_restArgs","startIdx","rest","require_partial","restArgs","partials","require_before","memo","require_once","require_clone","import_Emitter","slice","once","clone","event","listener","events","_this","connector_default","require_now","require_isNil","require_toSrc","isNil","fnToStr","require_startWith","prefix","require_isBrowser","require_SingleEmitter","require_uncaught","isBrowser","SingleEmitter","isOn","callListeners","e","err","require_stackTrace","orig","stack","require_ltrim","regSpace","chars","charLen","found","require_rtrim","c","require_trim","ltrim","rtrim","require_toStr","require_isNull","require_isEl","require_isErr","require_isMap","require_isSet","require_isRegExp","require_isNative","toSrc","regIsNative","regIsHostCtor","hasOwnProperty","require_uniqId","idCounter","id","require_random","max","min","rand","floating","require_isArgs","require_isEmpty","isArgs","require_query","trim","isEmpty","regIllegalChars","parts","param","arrKey","require_Url","query","toStr","url","slashes","regProto","host","hostEnd","hostEndingChars","pos","atSign","port","regPort","hash","queryMark","require_base64","bytes","remain","numToBase64","tmp","code","j","num","base64ToNum","codeMap","str1","str2","str3","str4","require_isArrBuffer","require_isBuffer","require_isNaN","require_lowerCase","require_type","isNaN","lowerCase","isBuffer","lower","regObj","require_convertBin","base64","isArrBuffer","result","bin","fileReader","resolve","reject","blob","import_keys","import_isArr","import_map","import_now","import_toSrc","import_uncaught","import_stackTrace","import_trim","import_toStr","import_isNull","import_isEl","import_isErr","import_isMap","import_isSet","import_isRegExp","import_uniqId","import_random","require_root","require_perfNow","now","root","performance","process","loadTime","getNanoSeconds","hr","import_type","import_perfNow","createId","getType$1","getTimestamp","objects","objectIds","selfs","getOrCreateObjId","objId","self","wrap","value","basic","subtype","getDescription","generatePreview","getPreview","getObj","objectId","releaseObj","object","MAX_PREVIEW_LEN","overflow","properties","getPropertyPreview","entries","propVal","description","InternalEntry","createEventBuffer","items","dropped","limit","index","isImportant","releaseObjects","method","params","depth","_unused","droppedNotice","import_each","import_isStr","executionContext","isEnable$1","enable$1","buffered$1","trigger$1","monitorConsole","lastTimestamp","origin","arg","timestamp","getCallFrames","callFrames","callSites","error","callSite","require_idxOf","fromIdx","require_values","require_contain","idxOf","values","require_isBlob","require_last","require_toNum","temp","import_isUndef","import_contain","import_isBlob","import_last","import_Url","import_isEmpty","import_startWith","import_toNum","XhrRequest","xhr","fullUrl","data","getFileName","getType","getSize","getHeaders","resType","resTxt","update","readBlobAsText","FetchRequest","isRequest","input","options","fetchResult","res","getFetchSize","getFetchHeaders","size","contentLen","lenToUtf8Bytes","lines","line","getStrSize","headersOnly","isCrossOrig","link","href","contentType","reader","callback","m","BODY_TOTAL_LIMIT","BODY_ENTRY_LIMIT","createBodyCache","bodies","total","remove","body","text","entryLimit","totalLimit","now$1","enableBeacon","nav","origSendBeacon","queued","requestId","request","trigger","enableEventSource","OrigEventSource","EventSource","es","init","opened","import_isNative","import_convertBin","resTxtMap","isEnable","enable","buffered","getResponseBody","enableXhr","winXhrProto","origSend","origOpen","origSetRequestHeader","isValidUrl","bindRequestEvent","req","enableFetch","isFetchSupported","origFetch","response","enableWebSocket","origWebSocket","WebSocket","ws","protocols","payloadData","opcode","frameSent","HIDE_SELECTOR","elementFromPoint","el","x","y","MASK","MASK_SELECTOR","maskSelector","patterns","validSelectors","out","probe","sel","setMaskRules","selectors","regexes","p","source","flags","scrubPatterns","closestComposed","selector","isDebugUi","isMasked","maskedElements","shownText","secretsCache","invalidate","currentSecrets","elements","scrub","secrets","RwdError","message","rwdError","toRpcError","AGENT_EN","level","ref","seq","tag","choices","reason","coverage","area","what","role","USER_EN","agent","user","setAgentText","setUserText","agentText","userText","_typeof","o","toPrimitive","t","r","toPropertyKey","_defineProperty","ownKeys","_objectSpread2","DB_NAME","KEEP_SESSIONS","SESSION_CAP","SMALL_QUOTA","PENDING_LIMIT","FLUSH_MS","HEARTBEAT_MS","state","session$1","pageId","pending$1","flushTimer","heartbeat","dbPromise","openedDb","logRecord","scheduleFlush","startLog","page","db","openDb","candidate","prev","get","newId","put","prune","flush","beat","stopLog","clear","tx","flushLog","currentSession","batch","meta","records","counts","countKey","sessions","store","keep","estimate","others","getAll","s","current","old","deleteSession","sessionRange","cursor","metaReq","pass","range","next","listSessions","needDb","queryLog","resolveSession","q","after","hidden","more","isProblem","publicRecord","overview","sessionId","pages","problems","first","last","recordDetail","latest","fromSeq","stores","mode","visit","TEXT_LIMIT","DEFAULT_LIMIT","Ring","important","it","consoleRing","networkRing","isFailed","byRequestId","consoleSeq","networkSeq","emit$1","started","startObserving","onEvent","msg","raw","onNetwork","onRuntime","release","CONSOLE_TYPES","formatArgs","addConsole","firstLine","formatError","live","at","queryConsole","types","select$1","copy","NETWORK_TYPES","record","plainHeaders","isExcluded","shortUrl","logNetwork","publicEntry","entry","queryNetwork","failedOnly","extra","toMatchers","all","matchesAny","excludeRules","setNetworkExclude","rules","rule","re","escapeRegExp$1","needle","REDACTED_HEADERS","redact","headers","clip$1","failed","networkHidden","networkDetail","sinceId","hasSince","pair","u","ro","f","v","formatValue","head","frames","l","describeElement","seen","cls","import_dist","module","this$1","rr","nr","or","Z","xe","Me","Oe","Le","N","D","M","je","R","C","X","P","W","O","Be","ae","Ve","se","U","ze","ie","Xe","ee","le","G","te","Ge","Ye","Je","Ke","I","H","ce","Qe","V","Ze","et","$","Y","tt","rt","nt","ot","st","lt","ct","ut","ue","J","K","fe","de","ft","dt","ge","gt","mt","_","L","d","h","me","he","we","pe","ht","wt","ye","g","E","be","A","F","B","$e","S","T","pt","yt","bt","Se","St","ne","Et","Ct","Tt","vt","At","Nt","Ee","Ce","Rt","It","kt","Dt","Pt","Te","ve","Ut","Ae","_t","Ft","Ne","Bt","z","Re","Ie","$t","Lt","ke","xt","Mt","Ot","jt","De","qt","Ue","Ht","oe","Wt","Pe","Vt","zt","Xt","Gt","_e","Yt","Q","Jt","Fe","Qt","Zt","er","tr","MAX_SCALE","MAX_CANVAS_PIXELS","captureScreenshot","viewport","doc","region","clip","captureBeyondViewport","canvas","contains","captureNative","renderDom","mimeType","format","quality","inner","outer","getNativeCapture","_w$webkit","handlers","ios","android","capture","image","loadImage","ratio","scale","clipScale","pixels","getBackground","isRendered","stripBackdropFilter","syncFormState","cloned","maskText","node","style","FORM_SELECTOR","originals","clones","masked","toggleAttribute","on","color","hasPointerCursor","ariaNode","normalizedWhitespaceCache","normalizeWhiteSpace","truncateDataUrl","comma","escapeRegExp","longestCommonSubstring","s1","s2","maxLen","endingIndex","dp","yamlEscapeKeyIfNeeded","yamlStringNeedsQuotes","yamlEscapeValueIfNeeded","renderAriaSnapshotAsYaml","includeText","textContributesInfo","renderString","convertToBestGuessRegex","visitText","escaped","indent","createKey","isRegex","_options$lineToNode","_node$children","escapedKey","props","child","snapshot","dynamicContent","pattern","lastIndex","combinedRegex","offset","groups","replacement","substr","filtered","distillAriaSnapshot","runPlugins","aiPlugins","normalizePlugins","_plugin$enter2","_plugin$exit2","traverse","children","visitChild","plugin","plugins","_plugin$enter","_plugin$exit","isLeafGeneric","isClickTargetRoot","ancestor","mergeStringChildren","buffer","unwrapSingleChildGenerics","removeNamelessImages","removeRedundantNames","_ctx$snapshot$info$ge","_ctx$snapshot$info$ge2","nameFromContentRefs","removeNameRepeatingChild","singleTextChild","inlineTextIntoGeneric","globalOptions","setGlobalOptions","parentElementOrShadowHost","element","enclosingShadowRootOrDocument","enclosingShadowHost","closestCrossShadow","closest","css","scope","getElementComputedStyle","cache","pseudo","cacheStyleBefore","cacheStyleAfter","cacheStyle","isElementStyleVisibilityVisible","cached","cacheStyleVisibility","computeElementStyleVisibilityVisible","_style","isWebKitListBoxOptionVisible","isListBoxSelect","select","_getElementComputedSt","computeBox","isElementVisible","isVisibleTextNode","rect","kTextNodeRange","_document$kTextNodeRa","document","elementSafeTagName","tagName","firstCharCode","cachesCounter$1","beginDOMCaches","endDOMCaches","between","digit","hexdigit","uppercaseletter","lowercaseletter","letter","nonascii","namestartchar","namechar","nonprintable","newline","whitespace","maximumallowedcodepoint","InvalidCharacterError","preprocess","codepoints","lead","trail","stringFromCode","tokenize","tokens","column","lastLineLength","incrLineno","codepoint","consume","reconsume","eof","consumeAToken","consumeComments","WhitespaceToken","consumeAStringToken","areAValidEscape","token","HashToken","wouldStartAnIdentifier","consumeAName","DelimToken","SuffixMatchToken","OpenParenToken","CloseParenToken","SubstringMatchToken","startsWithANumber","consumeANumericToken","CommaToken","CDCToken","startsWithAnIdentifier","consumeAnIdentlikeToken","ColonToken","SemicolonToken","CDOToken","AtKeywordToken","OpenSquareToken","startsWithAValidEscape","CloseSquareToken","PrefixMatchToken","OpenCurlyToken","DashMatchToken","ColumnToken","CloseCurlyToken","IncludeMatchToken","EOFToken","consumeANumber","DimensionToken","PercentageToken","NumberToken","FunctionToken","consumeAURLToken","IdentToken","endingCodePoint","string","StringToken","BadStringToken","consumeEscape","URLToken","consumeTheRemnantsOfABadURL","BadURLToken","digits","c1","c2","c3","wouldStartANumber","repr","convertAStringToANumber","iterationCount","CSSParserToken","_args","_args2","_args3","_args4","_args5","_args6","_args7","_args8","GroupingToken","_args9","_args10","_args11","_args12","_args13","_args14","_args15","_args16","json","StringValuedToken","_args17","escapeIdent","escapeHash","escapeString","unit","firstcode","hasExplicitAccessibleName","kAncestorPreventingLandmark","kGlobalAriaAttributes","hasGlobalAriaAttribute","attr","prohibited","forRole","hasTabIndex","isFocusable","isNativelyDisabled","isNativelyFocusable","kImplicitRoleByTagName","\"A\"","\"AREA\"","\"ARTICLE\"","\"ASIDE\"","\"BLOCKQUOTE\"","\"BUTTON\"","\"CAPTION\"","\"CODE\"","\"DATALIST\"","\"DD\"","\"DEL\"","\"DETAILS\"","\"DFN\"","\"DIALOG\"","\"DT\"","\"EM\"","\"FIELDSET\"","\"FIGURE\"","\"FOOTER\"","\"FORM\"","\"H1\"","\"H2\"","\"H3\"","\"H4\"","\"H5\"","\"H6\"","\"HEADER\"","\"HR\"","\"HTML\"","\"IMG\"","\"INPUT\"","getIdRefs","inputTypeToRole","\"INS\"","\"LI\"","\"MAIN\"","\"MARK\"","\"MATH\"","\"MENU\"","\"METER\"","\"NAV\"","\"OL\"","\"OPTGROUP\"","\"OPTION\"","\"OUTPUT\"","\"P\"","\"PROGRESS\"","\"SEARCH\"","\"SECTION\"","\"SELECT\"","\"STRONG\"","\"SUB\"","\"SUP\"","\"SVG\"","\"TABLE\"","\"TBODY\"","\"TD\"","table","getExplicitAriaRole","\"TEXTAREA\"","\"TFOOT\"","\"TH\"","nextSibling","prevSibling","row","isHeaderCell","isNonEmptyDataCell","\"THEAD\"","\"TIME\"","\"TR\"","\"UL\"","_element$textContent","kPresentationInheritanceParents","\"DIV\"","getImplicitAriaRole","_kImplicitRoleByTagNa","implicitRole","parents","parentExplicitRole","hasPresentationConflictResolution","validRoles","getAriaRole","cacheAriaRole","computeAriaRole","explicitRole","getAriaBoolean","isElementIgnoredForAria","isElementHiddenForAria","isSlot","belongsToDisplayNoneOrAriaHiddenOrNonSlotted","cacheIsHidden","ids","firstElement","trimFlatString","asFlatString","chunk","queryInAriaOwned","owned","getCSSContent","cachePseudoContentBefore","cachePseudoContentAfter","cachePseudoContent","content","contentValue","parseCSSContentPropertyAsString","delimIndex","isPseudo","accumulated","attrName","getAriaLabelledByElements","refs","allowsNameFromContent","alwaysAllowsNameFromContent","descendantAllowsNameFromContent","targetDescendant","computeAccessibleNameComposite","emptyCompositeString","outDerivedFromContent","getTextAlternativeInternal","getElementAccessibleName","includeHidden","cacheAccessibleNameHidden","cacheAccessibleName","accessibleName","kAriaInvalidRoles","getAriaInvalid","ariaInvalid","insideTargetElement","childOptions","_options$embeddedInLa","_options$embeddedInDe","_options$embeddedInNa","_options$embeddedInLa2","isEmbeddedInHiddenReferenceTraversal","labelledBy","joinCompositeString","isOwnLabel","isOwnLabelledBy","compositeString","selectedOptions","listbox","option","ariaLabel","labels","getAccessibleNameFromAssociatedLabels","alt","title","usePlaceholder","placeholder","summary","shouldNameFromContentForSummary","innerAccumulatedElementText","_accessibleName$eleme","display","childComposite","contributor","assignedNodes","kAriaSelectedRoles","getAriaSelected","kAriaCheckedRoles","getAriaChecked","getChecked","allowMixed","checked","kAriaPressedRoles","getAriaPressed","pressed","kAriaExpandedRoles","getAriaExpanded","expanded","kAriaLevelRoles","getAriaLevel","native","kAriaDisabledRoles","getAriaDisabled","hasExplicitAriaDisabled","belongsToDisabledOptGroup","belongsToDisabledFieldSet","fieldSetElement","legendElement","hasAriaDisabledInChain","cacheAriaDisabled","attribute","label","receivesPointerEvents","cachePointerEvents","cacheAccessibleNameText","cacheAccessibleNameTextHidden","cacheAccessibleDescription","cacheAccessibleDescriptionHidden","cacheAccessibleErrorMessage","cachesCounter","beginAriaCaches","endAriaCaches","\"button\"","\"checkbox\"","\"image\"","\"number\"","\"radio\"","\"range\"","\"reset\"","\"submit\"","collectElements","part","separator","lastRef","toInternalOptions","renderBoxes","generateAriaTree","publicOptions","visited","nameSourceElements","rootElement","setAriaNodeElement","_element$getAttribute","parentElementVisible","isElementVisibleForAria","visible","ariaChildren","ownedElement","childAriaNode","toAriaNode","elementInfo","processElement","treatAsBlock","\"url\"","\"placeholder\"","computeAriaRef","ariaNodeElement","ariaRef","_options$refPrefix","_roleUtils$getAriaRol","active","defaultRole","receivesPointerEvents$1","box","invalid","renderAriaTreeAsJSON","iframeDepths","renderCursorPointer","isAtDepthLimit","inCursorPointer","nodesToRender","ariaSnapshot","nodeToRender","elementSymbol$1","ua","isWebKit","configured","withDomCompat","checkVisibilityFallback","describeForAgent","isFormField","tagOf","containsComposed","deepActiveElement","sleep","ms","nextFrame","done","finish","SAMPLES","MIN_COVERAGE","FULL_COVERAGE","findOverlays","vw","vh","fx","fy","layerOf","coverageOf","inside","contentRefs","mask","position","OPTIONS","extraRefs","extraSeq","lastTree","takeSnapshot","clean","collectSecrets","applyPatterns","info","overlaySection","refFor","other","overlays","resolveRef","querySnapshot","matches","walk","sub","ok","elementOf","secret","elementSymbol","symbols","ENTRY_LIMIT","VALUE_LIMIT","OWN_SECRETS","readStorage","cookie","LEVELS","METHOD_LEVELS","requiredLevel","toLevel","levelAllows","granted","needed","CONFIRM_SELECTOR","confirmSelector","setConfirmSelectors","confirmTarget","clickConfirmation","enterConfirmation","own","form","CTRL","META","SHIFT","NO_SELECTION","NOT_TEXT","focused","textField","writable","setValue","_Object$getOwnPropert","setter","backward","edit","before","room","caret","charLength","wordBoundary","word","lineStart","lineEnd","verticalMove","up","nextStart","insertText","field","editKey","mods","editContent","backwardAnchor","anchor","multiline","moveTo","home","granularity","SPECIAL","PUNCT","plain","shifted","keyCode","SHIFTED_DIGITS","MOD_BITS","isMac","keyDef","special","shift","upper","ch","punct","fireKey","ev","def","pressDef","printable","enterDefault","moveFocus","submitter","backwards","press","combo","main","modNames","typeText","RETRY_WAITS","waitForActionable","deadline","attempt","checkState","centerInViewport","sameRect","points","visiblePoints","point","hitsTarget","hit","targetAt","SPOTS","left","right","top","bottom","hasTouch","BUTTONS","BUTTON_MASKS","hovered","mouseInit","firePointer","enterLeave","fireMouse","touchId","fireTouch","touch","FOCUSABLE","focusFor","click","button","down","count","clickCount","ended","pointerDown","hover","wheel","dx","dy","drag","p1","draggable","dataTransfer","fireDrag","over","p2","under","INTERACTIVE_METHODS","show","hooks","glide","scroller","x0","y0","set","step","aim","kind","confirm","action","NON_TEXT_INPUTS","setNativeValue","retarget","editable","caretToEnd","scrollableAncestor","scrollY","scrollX","visibleText","later","toJson","selection","inserted","picked","gone","timeout","shot","session","hasMethod","callMethod","DEVICE_KEY","PAGE_KEY","OPENER_KEY","TAP_KEY","TOKEN_KEY","RESUME_KEY","INVITE_KEY","INVITE_PARAM","BASE62","randomBytes","buf","base62","length","uuid","hex","read","write","deviceIdFor","override","openerPageId","opener","resolveIdentity","deviceId","deviceOverride","fromOpener","openerId","noteTap","ensureUniquePage","BC","taken","channel","open","readResume","saved","writeResume","resume","renewPageId","takeInvite","clearInvite","CONFIRM_MS","Approvals","opts","levels","auto","rank","allowed","choice","IDLE_MS","POLL_MS","MAX_FAILURES","QUEUE_LIMIT","REJECTED_RETRY_MS","QUOTA_RETRY_MS","Transport","delayMs","queue","socket","welcomed","base","delay","currentPage","TAP_TARGETS","tapSummary","fieldName","fieldValue","watchPage","timer","check","schedule","scrolls","TIMEOUT_MS","nonce","script","inject","loadLocale","urls","gatewayUrl","chain","en","time","seconds","zh","BUILTIN_LOCALES","RTL","packs","overrides","loading","resolved","listeners","canonical","fallbacks","known","pickLocale","pref","prefs","browserLangs","isObject","merge","changed","messagesOf","pack","dirOf","registerLocale","any","overrideMessages","messages","onLocalesChange","ensureLocale","jobs","htmlLang","agentLang","setAgentLang","setActionLang","BRAND","POS_KEY","CURSOR_KEY","TASK_KEY","AUTO_KEY","LOCK_KEY","EDGE","ARM_MS","VARS","CJK_FONTS","ARROW","COPY_ICON","CHECK","CSS$1","PANEL_CSS","Ui","applyStyle","lang","dir","system","pageTheme","panel","container","scrim","spec","choiceButtons","acts","deny","allow","buttons","paint","ticker","arm","close","since","task","reduced","distance","make","idle","pill","win","codebox","bar","status","clock","lock","note","fill","pct","li","mark","edge","card","copyText","maxTop","side","ww","wh","below","wx","wy","moving","sec","two","copyFallback","rgbTriplet","rgb","ERUDA_SRC","resolveEruda","local","localOn","pick","localDefault","remote","ErudaBridge","ui","tries","eruda","$el","TYPES","createLock","locked","block","COOKIE","HOST_WAIT_MS","resolveLaunch","fromApp","validId","launchId","hostLaunchId","readCookie","writeCookie","rememberLaunch","launch","used","version","CODE_KEY","HELP_KEY","CONTROL_KEY","CONFIG_KEY","AGENT_LANG_KEY","CONTROL_TTL","RUN_WAIT_MS","pending","recentEvents","eventBudget","emit","uiLang","applyLang","lockApi","uiRef","pageWatcher","watch","platform","deviceInfo","endpoints","appKey","linkStatus","resolveWaiters","waiters","storedControl","attached","applyLock","setLevel","agentName","control","applyControl","attachedMs","grantedLevel","readConfig","applyConfig","config","currentToken","linkView","onRpc","reply","logAgentAction","_p$value","onMessage","storeHelp","run","invite","setHelp","stored","onPageHide","onPageShow","getStatus","stop","resolveWaitersOf","setLang","builtinLocales","setUser","userId","help","nativeControl","keyMatches","nativeDecide","expected","diff"],"sources":["../src/native.ts","../node_modules/licia/isUndef.js","../node_modules/licia/objToStr.js","../node_modules/licia/isNum.js","../node_modules/licia/isFn.js","../node_modules/licia/isArrLike.js","../node_modules/licia/has.js","../node_modules/licia/keys.js","../node_modules/licia/optimizeCb.js","../node_modules/licia/each.js","../node_modules/licia/createAssigner.js","../node_modules/licia/isObj.js","../node_modules/licia/getProto.js","../node_modules/licia/isArr.js","../node_modules/licia/extendOwn.js","../node_modules/licia/isMatch.js","../node_modules/licia/matcher.js","../node_modules/licia/identity.js","../node_modules/licia/castPath.js","../node_modules/licia/safeGet.js","../node_modules/licia/property.js","../node_modules/licia/safeCb.js","../node_modules/licia/filter.js","../node_modules/licia/unique.js","../node_modules/licia/allKeys.js","../node_modules/licia/extend.js","../node_modules/licia/map.js","../node_modules/licia/isStr.js","../node_modules/licia/toArr.js","../node_modules/licia/create.js","../node_modules/licia/inherits.js","../node_modules/licia/isMiniProgram.js","../node_modules/licia/Class.js","../node_modules/licia/slice.js","../node_modules/licia/restArgs.js","../node_modules/licia/partial.js","../node_modules/licia/before.js","../node_modules/licia/once.js","../node_modules/licia/clone.js","../node_modules/licia/Emitter.js","../../packages/chobitsu/src/lib/connector.ts","../node_modules/licia/now.js","../node_modules/licia/isNil.js","../node_modules/licia/toSrc.js","../node_modules/licia/startWith.js","../node_modules/licia/isBrowser.js","../node_modules/licia/SingleEmitter.js","../node_modules/licia/uncaught.js","../node_modules/licia/stackTrace.js","../node_modules/licia/ltrim.js","../node_modules/licia/rtrim.js","../node_modules/licia/trim.js","../node_modules/licia/toStr.js","../node_modules/licia/isNull.js","../node_modules/licia/isEl.js","../node_modules/licia/isErr.js","../node_modules/licia/isMap.js","../node_modules/licia/isSet.js","../node_modules/licia/isRegExp.js","../node_modules/licia/isNative.js","../node_modules/licia/uniqId.js","../node_modules/licia/random.js","../node_modules/licia/isArgs.js","../node_modules/licia/isEmpty.js","../node_modules/licia/query.js","../node_modules/licia/Url.js","../node_modules/licia/base64.js","../node_modules/licia/isArrBuffer.js","../node_modules/licia/isBuffer.js","../node_modules/licia/isNaN.js","../node_modules/licia/lowerCase.js","../node_modules/licia/type.js","../node_modules/licia/convertBin.js","../src/stubs/axios.ts","../node_modules/licia/root.js","../node_modules/licia/perfNow.js","../../packages/chobitsu/src/lib/util.ts","../../packages/chobitsu/src/lib/objManager.ts","../../packages/chobitsu/src/engine/eventBuffer.ts","../../packages/chobitsu/src/domains/Runtime.ts","../node_modules/licia/idxOf.js","../node_modules/licia/values.js","../node_modules/licia/contain.js","../node_modules/licia/isBlob.js","../node_modules/licia/last.js","../node_modules/licia/toNum.js","../../packages/chobitsu/src/lib/request.ts","../../packages/chobitsu/src/engine/bodyCache.ts","../../packages/chobitsu/src/engine/networkExtra.ts","../../packages/chobitsu/src/domains/Network.ts","../../packages/chobitsu/src/engine/hitTest.ts","../../packages/chobitsu/src/engine/privacy.ts","../../packages/chobitsu/src/engine/rwd/errors.ts","../../packages/chobitsu/src/engine/rwd/i18n.ts","../../packages/chobitsu/src/engine/rwd/coldlog.ts","../../packages/chobitsu/src/engine/rwd/observe.ts","../node_modules/modern-screenshot/dist/index.js","../../packages/chobitsu/src/engine/screenshot.ts","../../packages/chobitsu/src/engine/vendor/playwright/isomorphic/ariaSnapshot.ts","../../packages/chobitsu/src/engine/vendor/playwright/isomorphic/stringUtils.ts","../../packages/chobitsu/src/engine/vendor/playwright/isomorphic/yaml.ts","../../packages/chobitsu/src/engine/vendor/playwright/isomorphic/ariaSnapshotRenderer.ts","../../packages/chobitsu/src/engine/vendor/playwright/injected/ariaSnapshotDistiller.ts","../../packages/chobitsu/src/engine/vendor/playwright/injected/domUtils.ts","../../packages/chobitsu/src/engine/vendor/playwright/isomorphic/cssTokenizer.ts","../../packages/chobitsu/src/engine/vendor/playwright/injected/roleUtils.ts","../../packages/chobitsu/src/engine/vendor/playwright/injected/ariaSnapshot.ts","../../packages/chobitsu/src/engine/rwd/dom.ts","../../packages/chobitsu/src/engine/rwd/overlays.ts","../../packages/chobitsu/src/engine/rwd/snapshot.ts","../../packages/chobitsu/src/engine/rwd/storage.ts","../../packages/chobitsu/src/engine/rwd/policy.ts","../../packages/chobitsu/src/engine/rwd/editing.ts","../../packages/chobitsu/src/engine/rwd/keyboard.ts","../../packages/chobitsu/src/engine/rwd/pointer.ts","../../packages/chobitsu/src/engine/rwd/actions.ts","../src/ids.ts","../src/approval.ts","../src/transport.ts","../src/pageWatch.ts","../src/localeLoader.ts","../src/locales/en.ts","../src/locales/zh.ts","../src/i18n.ts","../src/ui.ts","../src/eruda.ts","../src/lock.ts","../src/launch.ts","../src/index.ts"],"sourcesContent":["// Imported first by the entry, before the engine installs its console and\n// network hooks: our own traffic must never show up in the page's network log\n// (ours or another tool's), and a broken hook elsewhere must not break us.\n\nconst w = window as any\n\n/** fetch as it was when the SDK loaded (before our hook). */\nexport const nativeFetch: typeof fetch | undefined =\n typeof w.fetch === 'function' ? w.fetch.bind(w) : undefined\n\n/**\n * The browser's own WebSocket constructor. Hooks replace window.WebSocket\n * with wrappers or subclasses (PageSpy: `class extends WebSocket`), but the\n * prototype chain still leads to the native constructor.\n */\nexport function nativeWebSocket(): typeof WebSocket {\n let proto = w.WebSocket && w.WebSocket.prototype\n while (proto) {\n const ctor = proto.constructor\n if (typeof ctor === 'function' && /\\[native code\\]/.test(Function.prototype.toString.call(ctor))) {\n return ctor\n }\n proto = Object.getPrototypeOf(proto)\n }\n return w.WebSocket\n}\n","exports = function(val) {\n return val === void 0;\n};\n\nmodule.exports = exports;\n","var ObjToStr = Object.prototype.toString;\nexports = function(val) {\n return ObjToStr.call(val);\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object Number]';\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n var objStr = objToStr(val);\n return (\n objStr === '[object Function]' ||\n objStr === '[object GeneratorFunction]' ||\n objStr === '[object AsyncFunction]'\n );\n};\n\nmodule.exports = exports;\n","var isNum = require('./isNum');\nvar isFn = require('./isFn');\nvar MAX_ARR_IDX = Math.pow(2, 53) - 1;\nexports = function(val) {\n if (!val) return false;\n var len = val.length;\n return isNum(len) && len >= 0 && len <= MAX_ARR_IDX && !isFn(val);\n};\n\nmodule.exports = exports;\n","var hasOwnProp = Object.prototype.hasOwnProperty;\nexports = function(obj, key) {\n return hasOwnProp.call(obj, key);\n};\n\nmodule.exports = exports;\n","var has = require('./has');\nif (Object.keys && !false) {\n exports = Object.keys;\n} else {\n exports = function(obj) {\n var ret = [];\n for (var key in obj) {\n if (has(obj, key)) ret.push(key);\n }\n return ret;\n };\n}\n\nmodule.exports = exports;\n","var isUndef = require('./isUndef');\nexports = function(fn, ctx, argCount) {\n if (isUndef(ctx)) return fn;\n switch (argCount == null ? 3 : argCount) {\n case 1:\n return function(val) {\n return fn.call(ctx, val);\n };\n case 3:\n return function(val, idx, collection) {\n return fn.call(ctx, val, idx, collection);\n };\n case 4:\n return function(accumulator, val, idx, collection) {\n return fn.call(ctx, accumulator, val, idx, collection);\n };\n }\n return function() {\n return fn.apply(ctx, arguments);\n };\n};\n\nmodule.exports = exports;\n","var isArrLike = require('./isArrLike');\nvar keys = require('./keys');\nvar optimizeCb = require('./optimizeCb');\nexports = function(obj, iterator, ctx) {\n iterator = optimizeCb(iterator, ctx);\n var i, len;\n if (isArrLike(obj)) {\n for (i = 0, len = obj.length; i < len; i++) iterator(obj[i], i, obj);\n } else {\n var _keys = keys(obj);\n for (i = 0, len = _keys.length; i < len; i++) {\n iterator(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n};\n\nmodule.exports = exports;\n","var isUndef = require('./isUndef');\nvar each = require('./each');\nexports = function(keysFn, defaults) {\n return function(obj) {\n each(arguments, function(src, idx) {\n if (idx === 0) return;\n var keys = keysFn(src);\n each(keys, function(key) {\n if (!defaults || isUndef(obj[key])) obj[key] = src[key];\n });\n });\n return obj;\n };\n};\n\nmodule.exports = exports;\n","exports = function(val) {\n var type = typeof val;\n return !!val && (type === 'function' || type === 'object');\n};\n\nmodule.exports = exports;\n","var isObj = require('./isObj');\nvar isFn = require('./isFn');\nvar getPrototypeOf = Object.getPrototypeOf;\nvar ObjectCtr = {}.constructor;\nexports = function(obj) {\n if (!isObj(obj)) return;\n if (getPrototypeOf && !false) return getPrototypeOf(obj);\n var proto = obj.__proto__;\n if (proto || proto === null) return proto;\n if (isFn(obj.constructor)) return obj.constructor.prototype;\n if (obj instanceof ObjectCtr) return ObjectCtr.prototype;\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nif (Array.isArray && !false) {\n exports = Array.isArray;\n} else {\n exports = function(val) {\n return objToStr(val) === '[object Array]';\n };\n}\n\nmodule.exports = exports;\n","var keys = require('./keys');\nvar createAssigner = require('./createAssigner');\nexports = createAssigner(keys);\n\nmodule.exports = exports;\n","var keys = require('./keys');\nexports = function(obj, src) {\n var _keys = keys(src);\n var len = _keys.length;\n if (obj == null) return !len;\n obj = Object(obj);\n for (var i = 0; i < len; i++) {\n var key = _keys[i];\n if (src[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n};\n\nmodule.exports = exports;\n","var extendOwn = require('./extendOwn');\nvar isMatch = require('./isMatch');\nexports = function(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n};\n\nmodule.exports = exports;\n","exports = function(val) {\n return val;\n};\n\nmodule.exports = exports;\n","var has = require('./has');\nvar isArr = require('./isArr');\nexports = function(str, obj) {\n if (isArr(str)) return str;\n if (obj && has(obj, str)) return [str];\n var ret = [];\n str.replace(regPropName, function(match, number, quote, str) {\n ret.push(quote ? str.replace(regEscapeChar, '$1') : number || match);\n });\n return ret;\n};\n\nvar regPropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\nvar regEscapeChar = /\\\\(\\\\)?/g;\n\nmodule.exports = exports;\n","var isUndef = require('./isUndef');\nvar castPath = require('./castPath');\nexports = function(obj, path) {\n path = castPath(path, obj);\n var prop;\n prop = path.shift();\n while (!isUndef(prop)) {\n obj = obj[prop];\n if (obj == null) return;\n prop = path.shift();\n }\n return obj;\n};\n\nmodule.exports = exports;\n","var isArr = require('./isArr');\nvar safeGet = require('./safeGet');\nexports = function(path) {\n if (!isArr(path)) return shallowProperty(path);\n return function(obj) {\n return safeGet(obj, path);\n };\n};\nfunction shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n}\n\nmodule.exports = exports;\n","var isFn = require('./isFn');\nvar isObj = require('./isObj');\nvar isArr = require('./isArr');\nvar optimizeCb = require('./optimizeCb');\nvar matcher = require('./matcher');\nvar identity = require('./identity');\nvar property = require('./property');\nexports = function(val, ctx, argCount) {\n if (val == null) return identity;\n if (isFn(val)) return optimizeCb(val, ctx, argCount);\n if (isObj(val) && !isArr(val)) return matcher(val);\n return property(val);\n};\n\nmodule.exports = exports;\n","var safeCb = require('./safeCb');\nvar each = require('./each');\nexports = function(obj, predicate, ctx) {\n var ret = [];\n predicate = safeCb(predicate, ctx);\n each(obj, function(val, idx, list) {\n if (predicate(val, idx, list)) ret.push(val);\n });\n return ret;\n};\n\nmodule.exports = exports;\n","var filter = require('./filter');\nexports = function(arr, cmp) {\n cmp = cmp || isEqual;\n return filter(arr, function(item, idx, arr) {\n var len = arr.length;\n while (++idx < len) {\n if (cmp(item, arr[idx])) return false;\n }\n return true;\n });\n};\nfunction isEqual(a, b) {\n return a === b;\n}\n\nmodule.exports = exports;\n","var keys = require('./keys');\nvar getProto = require('./getProto');\nvar unique = require('./unique');\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nexports = function(obj) {\n var _ref =\n arguments.length > 1 && arguments[1] !== undefined\n ? arguments[1]\n : {},\n _ref$prototype = _ref.prototype,\n prototype = _ref$prototype === void 0 ? true : _ref$prototype,\n _ref$unenumerable = _ref.unenumerable,\n unenumerable = _ref$unenumerable === void 0 ? false : _ref$unenumerable,\n _ref$symbol = _ref.symbol,\n symbol = _ref$symbol === void 0 ? false : _ref$symbol;\n var ret = [];\n if ((unenumerable || symbol) && getOwnPropertyNames) {\n var getKeys = keys;\n if (unenumerable && getOwnPropertyNames) getKeys = getOwnPropertyNames;\n do {\n ret = ret.concat(getKeys(obj));\n if (symbol && getOwnPropertySymbols) {\n ret = ret.concat(getOwnPropertySymbols(obj));\n }\n } while (\n prototype &&\n (obj = getProto(obj)) &&\n obj !== Object.prototype\n );\n ret = unique(ret);\n } else {\n if (prototype) {\n for (var key in obj) ret.push(key);\n } else {\n ret = keys(obj);\n }\n }\n return ret;\n};\n\nmodule.exports = exports;\n","var createAssigner = require('./createAssigner');\nvar allKeys = require('./allKeys');\nexports = createAssigner(allKeys);\n\nmodule.exports = exports;\n","var safeCb = require('./safeCb');\nvar keys = require('./keys');\nvar isArrLike = require('./isArrLike');\nexports = function(obj, iterator, ctx) {\n iterator = safeCb(iterator, ctx);\n var _keys = !isArrLike(obj) && keys(obj);\n var len = (_keys || obj).length;\n var results = Array(len);\n for (var i = 0; i < len; i++) {\n var curKey = _keys ? _keys[i] : i;\n results[i] = iterator(obj[curKey], curKey, obj);\n }\n return results;\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object String]';\n};\n\nmodule.exports = exports;\n","var isArrLike = require('./isArrLike');\nvar map = require('./map');\nvar isArr = require('./isArr');\nvar isStr = require('./isStr');\nexports = function(val) {\n if (!val) return [];\n if (isArr(val)) return val;\n if (isArrLike(val) && !isStr(val)) return map(val);\n return [val];\n};\n\nmodule.exports = exports;\n","var isObj = require('./isObj');\nexports = function(proto) {\n if (!isObj(proto)) return {};\n if (objCreate && !false) return objCreate(proto);\n function noop() {}\n noop.prototype = proto;\n return new noop();\n};\nvar objCreate = Object.create;\n\nmodule.exports = exports;\n","var create = require('./create');\nexports = function(Class, SuperClass) {\n Class.prototype = create(SuperClass.prototype);\n};\n\nmodule.exports = exports;\n","var isFn = require('./isFn');\n\nexports = typeof wx !== 'undefined' && isFn(wx.openLocation);\n\nmodule.exports = exports;\n","var extend = require('./extend');\nvar toArr = require('./toArr');\nvar inherits = require('./inherits');\nvar safeGet = require('./safeGet');\nvar isMiniProgram = require('./isMiniProgram');\nexports = function(methods, statics) {\n return Base.extend(methods, statics);\n};\nfunction makeClass(parent, methods, statics) {\n statics = statics || {};\n var className =\n methods.className || safeGet(methods, 'initialize.name') || '';\n delete methods.className;\n var ctor = function() {\n var args = toArr(arguments);\n return this.initialize\n ? this.initialize.apply(this, args) || this\n : this;\n };\n if (!isMiniProgram) {\n try {\n ctor = new Function(\n 'toArr',\n 'return function ' +\n className +\n '()' +\n '{' +\n 'var args = toArr(arguments);' +\n 'return this.initialize ? this.initialize.apply(this, args) || this : this;' +\n '};'\n )(toArr);\n } catch (e) {}\n }\n inherits(ctor, parent);\n ctor.prototype.constructor = ctor;\n ctor.extend = function(methods, statics) {\n return makeClass(ctor, methods, statics);\n };\n ctor.inherits = function(Class) {\n inherits(ctor, Class);\n };\n ctor.methods = function(methods) {\n extend(ctor.prototype, methods);\n return ctor;\n };\n ctor.statics = function(statics) {\n extend(ctor, statics);\n return ctor;\n };\n ctor.methods(methods).statics(statics);\n return ctor;\n}\nvar Base = (exports.Base = makeClass(Object, {\n className: 'Base',\n callSuper: function(parent, name, args) {\n var superMethod = parent.prototype[name];\n return superMethod.apply(this, args);\n },\n toString: function() {\n return this.constructor.name;\n }\n}));\n\nmodule.exports = exports;\n","exports = function(arr, start, end) {\n var len = arr.length;\n if (start == null) {\n start = 0;\n } else if (start < 0) {\n start = Math.max(len + start, 0);\n } else {\n start = Math.min(start, len);\n }\n if (end == null) {\n end = len;\n } else if (end < 0) {\n end = Math.max(len + end, 0);\n } else {\n end = Math.min(end, len);\n }\n var ret = [];\n while (start < end) ret.push(arr[start++]);\n return ret;\n};\n\nmodule.exports = exports;\n","exports = function(fn, startIdx) {\n startIdx = startIdx == null ? fn.length - 1 : +startIdx;\n return function() {\n var len = Math.max(arguments.length - startIdx, 0);\n var rest = new Array(len);\n var i;\n for (i = 0; i < len; i++) rest[i] = arguments[i + startIdx];\n\n switch (startIdx) {\n case 0:\n return fn.call(this, rest);\n case 1:\n return fn.call(this, arguments[0], rest);\n case 2:\n return fn.call(this, arguments[0], arguments[1], rest);\n }\n var args = new Array(startIdx + 1);\n for (i = 0; i < startIdx; i++) args[i] = arguments[i];\n args[startIdx] = rest;\n return fn.apply(this, args);\n };\n};\n\nmodule.exports = exports;\n","var restArgs = require('./restArgs');\nvar toArr = require('./toArr');\nexports = restArgs(function(fn, partials) {\n return function() {\n var args = [];\n args = args.concat(partials);\n args = args.concat(toArr(arguments));\n return fn.apply(this, args);\n };\n});\n\nmodule.exports = exports;\n","exports = function(n, fn) {\n var memo;\n return function() {\n if (--n > 0) memo = fn.apply(this, arguments);\n if (n <= 1) fn = null;\n return memo;\n };\n};\n\nmodule.exports = exports;\n","var partial = require('./partial');\nvar before = require('./before');\nexports = partial(before, 2);\n\nmodule.exports = exports;\n","var isObj = require('./isObj');\nvar isArr = require('./isArr');\nvar extend = require('./extend');\nexports = function(obj) {\n if (!isObj(obj)) return obj;\n return isArr(obj) ? obj.slice() : extend({}, obj);\n};\n\nmodule.exports = exports;\n","var Class = require('./Class');\nvar has = require('./has');\nvar each = require('./each');\nvar slice = require('./slice');\nvar once = require('./once');\nvar clone = require('./clone');\nexports = Class(\n {\n initialize: function Emitter() {\n this._events = this._events || {};\n },\n on: function(event, listener) {\n this._events[event] = this._events[event] || [];\n this._events[event].push(listener);\n return this;\n },\n off: function(event, listener) {\n var events = this._events;\n if (!has(events, event)) return;\n var idx = events[event].indexOf(listener);\n if (idx > -1) {\n events[event].splice(idx, 1);\n }\n return this;\n },\n once: function(event, listener) {\n this.on(event, once(listener));\n return this;\n },\n emit: function(event) {\n var _this = this;\n if (!has(this._events, event)) return;\n var args = slice(arguments, 1);\n var events = clone(this._events[event]);\n each(\n events,\n function(val) {\n return val.apply(_this, args);\n },\n this\n );\n return this;\n },\n removeAllListeners: function(event) {\n if (!event) {\n this._events = {};\n } else {\n delete this._events[event];\n }\n return this;\n }\n },\n {\n mixin: function(obj) {\n each(['on', 'off', 'once', 'emit', 'removeAllListeners'], function(\n val\n ) {\n obj[val] = exports.prototype[val];\n });\n obj._events = obj._events || {};\n }\n }\n);\n\nmodule.exports = exports;\n","import Emitter from 'licia/Emitter'\n\nclass Connector extends Emitter {\n trigger(method: string, params: any) {\n this.emit(\n 'message',\n JSON.stringify({\n method,\n params,\n })\n )\n }\n}\n\nexport default new Connector()\n","if (Date.now && !false) {\n exports = Date.now;\n} else {\n exports = function() {\n return new Date().getTime();\n };\n}\n\nmodule.exports = exports;\n","exports = function(val) {\n return val == null;\n};\n\nmodule.exports = exports;\n","var isNil = require('./isNil');\nexports = function(fn) {\n if (isNil(fn)) return '';\n try {\n return fnToStr.call(fn);\n } catch (e) {}\n try {\n return fn + '';\n } catch (e) {}\n return '';\n};\nvar fnToStr = Function.prototype.toString;\n\nmodule.exports = exports;\n","exports = function(str, prefix) {\n return str.indexOf(prefix) === 0;\n};\n\nmodule.exports = exports;\n","exports =\n typeof window === 'object' &&\n typeof document === 'object' &&\n document.nodeType === 9;\n\nmodule.exports = exports;\n","var Class = require('./Class');\nvar clone = require('./clone');\nvar each = require('./each');\nvar toArr = require('./toArr');\nexports = Class(\n {\n initialize: function SingleEmitter() {\n this._listeners = [];\n },\n addListener: function(listener) {\n this._listeners.push(listener);\n },\n rmListener: function(listener) {\n var idx = this._listeners.indexOf(listener);\n if (idx > -1) {\n this._listeners.splice(idx, 1);\n }\n },\n rmAllListeners: function() {\n this._listeners = [];\n },\n emit: function() {\n var _this = this;\n var args = toArr(arguments);\n var listeners = clone(this._listeners);\n each(\n listeners,\n function(listener) {\n return listener.apply(_this, args);\n },\n this\n );\n }\n },\n {\n mixin: function(obj) {\n each(\n ['addListener', 'rmListener', 'emit', 'rmAllListeners'],\n function(val) {\n obj[val] = exports.prototype[val];\n }\n );\n obj._listeners = obj._listeners || [];\n }\n }\n);\n\nmodule.exports = exports;\n","var isBrowser = require('./isBrowser');\nvar SingleEmitter = require('./SingleEmitter');\nvar isOn = false;\nexports = {\n start: function() {\n isOn = true;\n },\n stop: function() {\n isOn = false;\n }\n};\nSingleEmitter.mixin(exports);\nif (isBrowser) {\n window.addEventListener('error', function(event) {\n if (event.error) {\n callListeners(event.error);\n } else if (event.message) {\n var e = new Error(event.message);\n e.stack = 'Error: '\n .concat(event.message, ' \\n at ')\n .concat(event.filename, ':')\n .concat(event.lineno, ':')\n .concat(event.colno);\n callListeners(e);\n }\n });\n window.addEventListener('unhandledrejection', function(e) {\n callListeners(e.reason);\n });\n} else {\n process.on('uncaughtException', callListeners);\n process.on('unhandledRejection', callListeners);\n}\nfunction callListeners(err) {\n if (!isOn) return;\n exports.emit(err);\n}\n\nmodule.exports = exports;\n","exports = function() {\n var orig = Error.prepareStackTrace;\n Error.prepareStackTrace = function(_, stack) {\n return stack;\n };\n var stack = new Error().stack.slice(1);\n Error.prepareStackTrace = orig;\n return stack;\n};\n\nmodule.exports = exports;\n","var regSpace = /^\\s+/;\nexports = function(str, chars) {\n if (chars == null) {\n if (str.trimLeft) {\n return str.trimLeft();\n }\n return str.replace(regSpace, '');\n }\n var start = 0;\n var len = str.length;\n var charLen = chars.length;\n var found = true;\n var i;\n var c;\n while (found && start < len) {\n found = false;\n i = -1;\n c = str.charAt(start);\n while (++i < charLen) {\n if (c === chars[i]) {\n found = true;\n start++;\n break;\n }\n }\n }\n return start >= len ? '' : str.substr(start, len);\n};\n\nmodule.exports = exports;\n","exports = function(str, chars) {\n if (chars == null) {\n if (str.trimRight) {\n return str.trimRight();\n }\n chars = ' \\r\\n\\t\\f\\v';\n }\n var end = str.length - 1;\n var charLen = chars.length;\n var found = true;\n var i;\n var c;\n while (found && end >= 0) {\n found = false;\n i = -1;\n c = str.charAt(end);\n while (++i < charLen) {\n if (c === chars[i]) {\n found = true;\n end--;\n break;\n }\n }\n }\n return end >= 0 ? str.substring(0, end + 1) : '';\n};\n\nmodule.exports = exports;\n","var ltrim = require('./ltrim');\nvar rtrim = require('./rtrim');\nexports = function(str, chars) {\n if (chars == null && str.trim) {\n return str.trim();\n }\n return ltrim(rtrim(str, chars), chars);\n};\n\nmodule.exports = exports;\n","exports = function(val) {\n return val == null ? '' : val.toString();\n};\n\nmodule.exports = exports;\n","exports = function(val) {\n return val === null;\n};\n\nmodule.exports = exports;\n","exports = function(val) {\n return !!(val && val.nodeType === 1);\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n switch (objToStr(val)) {\n case '[object Error]':\n case '[object DOMException]':\n return true;\n default:\n return val instanceof Error;\n }\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object Map]';\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object Set]';\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object RegExp]';\n};\n\nmodule.exports = exports;\n","var isObj = require('./isObj');\nvar isFn = require('./isFn');\nvar toSrc = require('./toSrc');\nexports = function(val) {\n if (!isObj(val)) return false;\n if (isFn(val)) return regIsNative.test(toSrc(val));\n\n return regIsHostCtor.test(toSrc(val));\n};\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar regIsNative = new RegExp(\n '^' +\n toSrc(hasOwnProperty)\n .replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n .replace(\n /hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\n '$1.*?'\n ) +\n '$'\n);\nvar regIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\nmodule.exports = exports;\n","var idCounter = 0;\nexports = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n};\n\nmodule.exports = exports;\n","exports = function(min, max, floating) {\n if (max == null) {\n max = min;\n min = 0;\n }\n var rand = Math.random();\n if (floating || min % 1 || max % 1) {\n return Math.min(\n min +\n rand *\n (max - min + parseFloat('1e-' + ((rand + '').length - 1))),\n max\n );\n }\n return min + Math.floor(rand * (max - min + 1));\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object Arguments]';\n};\n\nmodule.exports = exports;\n","var isArrLike = require('./isArrLike');\nvar isArr = require('./isArr');\nvar isStr = require('./isStr');\nvar isArgs = require('./isArgs');\nvar keys = require('./keys');\nexports = function(val) {\n if (val == null) return true;\n if (isArrLike(val) && (isArr(val) || isStr(val) || isArgs(val))) {\n return val.length === 0;\n }\n return keys(val).length === 0;\n};\n\nmodule.exports = exports;\n","var trim = require('./trim');\nvar each = require('./each');\nvar isUndef = require('./isUndef');\nvar isArr = require('./isArr');\nvar map = require('./map');\nvar isEmpty = require('./isEmpty');\nvar filter = require('./filter');\nvar isObj = require('./isObj');\nexports = {\n parse: function(str) {\n var ret = {};\n str = trim(str).replace(regIllegalChars, '');\n each(str.split('&'), function(param) {\n var parts = param.split('=');\n var key = parts.shift(),\n val = parts.length > 0 ? parts.join('=') : null;\n key = decodeURIComponent(key);\n val = decodeURIComponent(val);\n if (isUndef(ret[key])) {\n ret[key] = val;\n } else if (isArr(ret[key])) {\n ret[key].push(val);\n } else {\n ret[key] = [ret[key], val];\n }\n });\n return ret;\n },\n stringify: function(obj, arrKey) {\n return filter(\n map(obj, function(val, key) {\n if (isObj(val) && isEmpty(val)) return '';\n if (isArr(val)) return exports.stringify(val, key);\n return (\n (arrKey\n ? encodeURIComponent(arrKey)\n : encodeURIComponent(key)) +\n '=' +\n encodeURIComponent(val)\n );\n }),\n function(str) {\n return str.length > 0;\n }\n ).join('&');\n }\n};\nvar regIllegalChars = /^(\\?|#|&)/g;\n\nmodule.exports = exports;\n","var Class = require('./Class');\nvar extend = require('./extend');\nvar trim = require('./trim');\nvar query = require('./query');\nvar isEmpty = require('./isEmpty');\nvar each = require('./each');\nvar isArr = require('./isArr');\nvar toArr = require('./toArr');\nvar isBrowser = require('./isBrowser');\nvar isObj = require('./isObj');\nvar toStr = require('./toStr');\nexports = Class(\n {\n className: 'Url',\n initialize: function(url) {\n if (!url && isBrowser) url = window.location.href;\n extend(this, exports.parse(url || ''));\n },\n setQuery: function(name, val) {\n var query = this.query;\n if (isObj(name)) {\n each(name, function(val, key) {\n query[key] = toStr(val);\n });\n } else {\n query[name] = toStr(val);\n }\n return this;\n },\n rmQuery: function(name) {\n var query = this.query;\n if (!isArr(name)) name = toArr(name);\n each(name, function(key) {\n delete query[key];\n });\n return this;\n },\n toString: function() {\n return exports.stringify(this);\n }\n },\n {\n parse: function(url) {\n var ret = {\n protocol: '',\n auth: '',\n hostname: '',\n hash: '',\n query: {},\n port: '',\n pathname: '',\n slashes: false\n };\n var rest = trim(url);\n var slashes = false;\n var proto = rest.match(regProto);\n if (proto) {\n proto = proto[0];\n ret.protocol = proto.toLowerCase();\n rest = rest.substr(proto.length);\n }\n if (proto) {\n slashes = rest.substr(0, 2) === '//';\n if (slashes) {\n rest = rest.slice(2);\n ret.slashes = true;\n }\n }\n if (slashes) {\n var host = rest;\n var hostEnd = -1;\n for (var i = 0, len = hostEndingChars.length; i < len; i++) {\n var pos = rest.indexOf(hostEndingChars[i]);\n if (pos !== -1 && (hostEnd === -1 || pos < hostEnd))\n hostEnd = pos;\n }\n if (hostEnd > -1) {\n host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n }\n var atSign = host.lastIndexOf('@');\n if (atSign !== -1) {\n ret.auth = decodeURIComponent(host.slice(0, atSign));\n host = host.slice(atSign + 1);\n }\n ret.hostname = host;\n var port = host.match(regPort);\n if (port) {\n port = port[0];\n if (port !== ':') ret.port = port.substr(1);\n ret.hostname = host.substr(0, host.length - port.length);\n }\n }\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n ret.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var queryMark = rest.indexOf('?');\n if (queryMark !== -1) {\n ret.query = query.parse(rest.substr(queryMark + 1));\n rest = rest.slice(0, queryMark);\n }\n ret.pathname = rest || '/';\n return ret;\n },\n stringify: function(obj) {\n var ret =\n obj.protocol +\n (obj.slashes ? '//' : '') +\n (obj.auth ? encodeURIComponent(obj.auth) + '@' : '') +\n obj.hostname +\n (obj.port ? ':' + obj.port : '') +\n obj.pathname;\n if (!isEmpty(obj.query)) ret += '?' + query.stringify(obj.query);\n if (obj.hash) ret += obj.hash;\n return ret;\n }\n }\n);\nvar regProto = /^([a-z0-9.+-]+:)/i;\nvar regPort = /:[0-9]*$/;\nvar hostEndingChars = ['/', '?', '#'];\n\nmodule.exports = exports;\n","exports = {\n encode: function(bytes) {\n var ret = [];\n var len = bytes.length;\n var remain = len % 3;\n len = len - remain;\n for (var i = 0; i < len; i += 3) {\n ret.push(\n numToBase64(\n (bytes[i] << 16) + (bytes[i + 1] << 8) + bytes[i + 2]\n )\n );\n }\n len = bytes.length;\n var tmp;\n if (remain === 1) {\n tmp = bytes[len - 1];\n ret.push(code[tmp >> 2]);\n ret.push(code[(tmp << 4) & 0x3f]);\n ret.push('==');\n } else if (remain === 2) {\n tmp = (bytes[len - 2] << 8) + bytes[len - 1];\n ret.push(code[tmp >> 10]);\n ret.push(code[(tmp >> 4) & 0x3f]);\n ret.push(code[(tmp << 2) & 0x3f]);\n ret.push('=');\n }\n return ret.join('');\n },\n decode: function(str) {\n var len = str.length,\n remain = 0;\n if (str[len - 2] === '=') remain = 2;\n else if (str[len - 1] === '=') remain = 1;\n var ret = new Array((len * 3) / 4 - remain);\n len = remain > 0 ? len - 4 : len;\n var i, j;\n for (i = 0, j = 0; i < len; i += 4) {\n var num = base64ToNum(str[i], str[i + 1], str[i + 2], str[i + 3]);\n ret[j++] = (num >> 16) & 0xff;\n ret[j++] = (num >> 8) & 0xff;\n ret[j++] = num & 0xff;\n }\n var tmp;\n if (remain === 2) {\n tmp =\n (codeMap[str.charCodeAt(i)] << 2) |\n (codeMap[str.charCodeAt(i + 1)] >> 4);\n ret[j++] = tmp & 0xff;\n } else if (remain === 1) {\n tmp =\n (codeMap[str.charCodeAt(i)] << 10) |\n (codeMap[str.charCodeAt(i + 1)] << 4) |\n (codeMap[str.charCodeAt(i + 2)] >> 2);\n ret[j++] = (tmp >> 8) & 0xff;\n ret[j++] = tmp & 0xff;\n }\n return ret;\n }\n};\nvar codeMap = [];\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nfor (var i = 0, len = code.length; i < len; i++) {\n codeMap[code.charCodeAt(i)] = i;\n}\nfunction numToBase64(num) {\n return (\n code[(num >> 18) & 0x3f] +\n code[(num >> 12) & 0x3f] +\n code[(num >> 6) & 0x3f] +\n code[num & 0x3f]\n );\n}\nfunction base64ToNum(str1, str2, str3, str4) {\n return (\n (codeMap[str1.charCodeAt(0)] << 18) |\n (codeMap[str2.charCodeAt(0)] << 12) |\n (codeMap[str3.charCodeAt(0)] << 6) |\n codeMap[str4.charCodeAt(0)]\n );\n}\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object ArrayBuffer]';\n};\n\nmodule.exports = exports;\n","var isFn = require('./isFn');\nexports = function(val) {\n if (val == null) return false;\n if (val._isBuffer) return true;\n return (\n val.constructor &&\n isFn(val.constructor.isBuffer) &&\n val.constructor.isBuffer(val)\n );\n};\n\nmodule.exports = exports;\n","var isNum = require('./isNum');\nexports = function(val) {\n return isNum(val) && val !== +val;\n};\n\nmodule.exports = exports;\n","var toStr = require('./toStr');\nexports = function(str) {\n return toStr(str).toLocaleLowerCase();\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nvar isNaN = require('./isNaN');\nvar lowerCase = require('./lowerCase');\nvar isBuffer = require('./isBuffer');\nexports = function(val) {\n var lower =\n arguments.length > 1 && arguments[1] !== undefined\n ? arguments[1]\n : true;\n var ret;\n if (val === null) ret = 'Null';\n if (val === undefined) ret = 'Undefined';\n if (isNaN(val)) ret = 'NaN';\n if (isBuffer(val)) ret = 'Buffer';\n if (!ret) {\n ret = objToStr(val).match(regObj);\n if (ret) ret = ret[1];\n }\n if (!ret) return '';\n return lower ? lowerCase(ret) : ret;\n};\nvar regObj = /^\\[object\\s+(.*?)]$/;\n\nmodule.exports = exports;\n","var isStr = require('./isStr');\nvar base64 = require('./base64');\nvar isArrBuffer = require('./isArrBuffer');\nvar isArr = require('./isArr');\nvar isBuffer = require('./isBuffer');\nvar type = require('./type');\nvar lowerCase = require('./lowerCase');\nexports = function(bin, t) {\n var result;\n t = lowerCase(t);\n if (isStr(bin)) {\n result = new Uint8Array(base64.decode(bin));\n } else if (isArrBuffer(bin)) {\n bin = bin.slice(0);\n result = new Uint8Array(bin);\n } else if (isArr(bin)) {\n result = new Uint8Array(bin);\n } else if (type(bin) === 'uint8array') {\n result = bin.slice(0);\n } else if (isBuffer(bin)) {\n result = new Uint8Array(bin.length);\n for (var i = 0; i < bin.length; i++) {\n result[i] = bin[i];\n }\n }\n if (result) {\n switch (t) {\n case 'base64':\n result = base64.encode(result);\n break;\n case 'arraybuffer':\n result = result.buffer;\n break;\n case 'array':\n result = [].slice.call(result);\n break;\n case 'buffer':\n result = Buffer.from(result);\n break;\n case 'blob':\n result = new Blob([result.buffer]);\n break;\n }\n }\n return result;\n};\nexports.blobToArrBuffer = function(blob) {\n return new Promise(function(resolve, reject) {\n var fileReader = new FileReader();\n fileReader.onload = function(e) {\n resolve(e.target.result);\n };\n fileReader.onerror = function(err) {\n reject(err);\n };\n fileReader.readAsArrayBuffer(blob);\n });\n};\n\nmodule.exports = exports;\n","// chobitsu's lib/util.ts imports axios to fetch scripts and stylesheets for\n// the DevTools Sources / CSS panels. The SDK never uses those paths; this\n// stub keeps ~15 KB of axios out of the bundle.\nconst unavailable = () => Promise.reject(new Error('axios is not bundled in the RWD SDK'))\n\nexport default { get: unavailable }\n","var isBrowser = require('./isBrowser');\nexports = isBrowser ? window : global;\n\nmodule.exports = exports;\n","var now = require('./now');\nvar root = require('./root');\nvar performance = root.performance;\nvar process = root.process;\nvar loadTime;\nif (performance && performance.now) {\n exports = function() {\n return performance.now();\n };\n} else if (process && process.hrtime) {\n var getNanoSeconds = function() {\n var hr = process.hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n loadTime = getNanoSeconds() - process.uptime() * 1e9;\n exports = function() {\n return (getNanoSeconds() - loadTime) / 1e6;\n };\n} else {\n loadTime = now();\n exports = function() {\n return now() - loadTime;\n };\n}\n\nmodule.exports = exports;\n","import uniqId from 'licia/uniqId'\nimport random from 'licia/random'\nimport startWith from 'licia/startWith'\nimport Url from 'licia/Url'\nimport convertBin from 'licia/convertBin'\nimport axios from 'axios'\nimport _type from 'licia/type'\nimport _has from 'licia/has'\nimport perfNow from 'licia/perfNow'\nimport now from 'licia/now'\n\nconst prefix = random(1000, 9999) + '.'\n\nexport function createId() {\n return uniqId(prefix)\n}\n\nexport function getAbsoluteUrl(url: string) {\n const a = document.createElement('a')\n a.href = url\n return a.href\n}\n\nexport class ErrorWithCode extends Error {\n code: number\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport function createErr(code: number, message: string) {\n return new ErrorWithCode(code, message)\n}\n\nexport function getUrl() {\n const href = location.href\n if (startWith(href, 'about:')) {\n return parent.location.href\n }\n return href\n}\n\nexport function getOrigin() {\n const origin = location.origin\n if (origin === 'null') {\n return parent.location.origin\n }\n return origin\n}\n\nexport async function getTextContent(url: string, proxy = '') {\n return await getContent(url, 'text', proxy)\n}\n\nexport async function getBase64Content(url: string, proxy = '') {\n return convertBin(await getContent(url, 'arraybuffer', proxy), 'base64')\n}\n\nexport function getType(val: any, lowerCase: boolean) {\n try {\n return _type.apply(null, [val, lowerCase])\n } catch (e) {\n return 'Error'\n }\n}\n\nexport function has(obj: any, key: string) {\n try {\n return _has.apply(null, [obj, key])\n } catch (e) {\n return false\n }\n}\n\nexport function getTimestamp() {\n if (window.performance && performance.timeOrigin) {\n return performance.timeOrigin + perfNow()\n }\n\n return now()\n}\n\nasync function getContent(url: string, responseType: any, proxy = '') {\n try {\n const urlObj = new Url(url)\n urlObj.setQuery('__chobitsu-hide__', 'true')\n const result = await axios.get(urlObj.toString(), {\n responseType,\n })\n return result.data\n } catch (e) {\n if (proxy) {\n try {\n const result = await axios.get(proxyUrl(proxy, url), {\n responseType,\n })\n return await result.data\n } catch (e) {\n /* eslint-disable */\n }\n }\n }\n\n return responseType === 'arraybuffer' ? new ArrayBuffer(0) : ''\n}\n\nfunction proxyUrl(proxy: string, url: string) {\n const urlObj = new Url(proxy)\n urlObj.setQuery('url', url)\n urlObj.setQuery('__chobitsu-hide__', 'true')\n return urlObj.toString()\n}\n","import toStr from 'licia/toStr'\nimport isNull from 'licia/isNull'\nimport isArr from 'licia/isArr'\nimport isFn from 'licia/isFn'\nimport isEl from 'licia/isEl'\nimport isErr from 'licia/isErr'\nimport isMap from 'licia/isMap'\nimport isSet from 'licia/isSet'\nimport isRegExp from 'licia/isRegExp'\nimport getKeys from 'licia/keys'\nimport toSrc from 'licia/toSrc'\nimport allKeys from 'licia/allKeys'\nimport isNative from 'licia/isNative'\nimport getProto from 'licia/getProto'\nimport isSymbol from 'licia/isSymbol'\nimport { getType, has } from './util'\n\nconst objects = new Map()\nconst objectIds = new Map()\nconst selfs = new Map()\nconst entries = new Map()\nlet id = 1\n\nfunction getOrCreateObjId(obj: any, self: any) {\n let objId = objectIds.get(obj)\n if (objId) return objId\n\n objId = JSON.stringify({\n injectedScriptId: 0,\n id: id++,\n })\n objectIds.set(obj, objId)\n objects.set(objId, obj)\n selfs.set(objId, self)\n\n return objId\n}\n\nexport function clear() {\n objects.clear()\n objectIds.clear()\n selfs.clear()\n}\n\nexport function wrap(\n value: any,\n { generatePreview = false, self = value } = {}\n): any {\n const ret = basic(value)\n const { type, subtype } = ret\n\n if (type === 'undefined') {\n return ret\n }\n\n if (type === 'string' || type === 'boolean' || subtype === 'null') {\n ret.value = value\n return ret\n }\n\n ret.description = getDescription(value, self)\n if (type === 'number') {\n ret.value = value\n return ret\n }\n\n if (type === 'symbol') {\n ret.objectId = getOrCreateObjId(value, self)\n return ret\n }\n\n if (type === 'function') {\n ret.className = 'Function'\n } else if (subtype === 'array') {\n ret.className = 'Array'\n } else if (subtype === 'map') {\n ret.className = 'Map'\n } else if (subtype === 'set') {\n ret.className = 'Set'\n } else if (subtype === 'regexp') {\n ret.className = 'RegExp'\n } else if (subtype === 'error') {\n ret.className = value.name\n } else {\n ret.className = getType(value, false)\n }\n\n if (generatePreview) {\n ret.preview = getPreview(value, self)\n }\n\n ret.objectId = getOrCreateObjId(value, self)\n\n return ret\n}\n\nexport function getObj(objectId: string) {\n return objects.get(objectId)\n}\n\nexport function releaseObj(objectId: string) {\n const object = getObj(objectId)\n objectIds.delete(object)\n selfs.delete(objectId)\n objects.delete(objectId)\n}\n\nexport function getProperties(params: any) {\n const { accessorPropertiesOnly, objectId, ownProperties, generatePreview } =\n params\n const properties = []\n\n const options = {\n prototype: !ownProperties,\n unenumerable: true,\n symbol: !accessorPropertiesOnly,\n }\n\n const obj = objects.get(objectId)\n const self = selfs.get(objectId)\n const keys = allKeys(obj, options)\n const proto = getProto(obj)\n for (let i = 0, len = keys.length; i < len; i++) {\n const name = keys[i]\n let propVal\n try {\n propVal = self[name]\n } catch (e) {\n /* tslint:disable-next-line */\n }\n\n const property: any = {\n name: toStr(name),\n isOwn: has(self, name),\n }\n\n let descriptor = Object.getOwnPropertyDescriptor(obj, name)\n if (!descriptor && proto) {\n descriptor = Object.getOwnPropertyDescriptor(proto, name)\n }\n if (descriptor) {\n if (accessorPropertiesOnly) {\n if (!descriptor.get && !descriptor.set) {\n continue\n }\n }\n property.configurable = descriptor.configurable\n property.enumerable = descriptor.enumerable\n property.writable = descriptor.writable\n if (descriptor.get) {\n property.get = wrap(descriptor.get)\n }\n if (descriptor.set) {\n property.set = wrap(descriptor.set)\n }\n }\n\n if (proto && has(proto, name) && property.enumerable) {\n property.isOwn = true\n }\n\n let accessValue = true\n if (!property.isOwn && property.get) accessValue = false\n if (accessValue) {\n if (isSymbol(name)) {\n property.symbol = wrap(name)\n property.value = { type: 'undefined' }\n } else {\n property.value = wrap(propVal, {\n generatePreview,\n })\n }\n }\n\n if (accessorPropertiesOnly) {\n if (isFn(propVal) && isNative(propVal)) continue\n }\n\n properties.push(property)\n }\n if (proto && !ownProperties && !noPrototype(obj)) {\n properties.push({\n name: '__proto__',\n configurable: true,\n enumerable: false,\n isOwn: has(obj, '__proto__'),\n value: wrap(proto, {\n self,\n }),\n writable: false,\n })\n }\n\n if (accessorPropertiesOnly) {\n return {\n result: properties,\n }\n }\n\n const internalProperties = []\n if (proto && !noPrototype(obj)) {\n internalProperties.push({\n name: '[[Prototype]]',\n value: wrap(proto, {\n self,\n }),\n })\n }\n if (isMap(obj) || isSet(obj)) {\n const internalEntries = createInternalEntries(obj)\n internalProperties.push({\n name: '[[Entries]]',\n value: wrap(internalEntries),\n })\n }\n\n return {\n internalProperties,\n result: properties,\n }\n}\n\nconst MAX_PREVIEW_LEN = 5\n\nfunction getPreview(obj: any, self: any = obj) {\n const ret = basic(obj)\n ret.description = getDescription(obj, self)\n let overflow = false\n const properties = []\n\n const keys = getKeys(obj)\n let len = keys.length\n if (len > MAX_PREVIEW_LEN) {\n len = MAX_PREVIEW_LEN\n overflow = true\n }\n\n for (let i = 0; i < len; i++) {\n const name = keys[i]\n\n properties.push(getPropertyPreview(name, self[name]))\n }\n ret.properties = properties\n\n if (isMap(obj)) {\n const entries = []\n let i = 0\n const keys = obj.keys()\n let key = keys.next().value\n while (key) {\n if (i > MAX_PREVIEW_LEN) {\n overflow = true\n break\n }\n entries.push({\n key: getPreview(key),\n value: getPreview(obj.get(key)),\n })\n i++\n key = keys.next().value\n }\n\n ret.entries = entries\n } else if (isSet(obj)) {\n const entries = []\n let i = 0\n const keys = obj.keys()\n let key = keys.next().value\n while (key) {\n if (i > MAX_PREVIEW_LEN) {\n overflow = true\n break\n }\n entries.push({\n value: getPreview(key),\n })\n i++\n key = keys.next().value\n }\n\n ret.entries = entries\n }\n\n ret.overflow = overflow\n return ret\n}\n\nfunction getPropertyPreview(name: string, propVal: any) {\n const property: any = basic(propVal)\n property.name = name\n const { subtype, type } = property\n\n let value\n if (type === 'object') {\n if (subtype === 'null') {\n value = 'null'\n } else if (subtype === 'array') {\n value = `Array(${propVal.length})`\n } else if (subtype === 'map') {\n value = `Map(${propVal.size})`\n } else if (subtype === 'set') {\n value = `Set(${propVal.size})`\n } else {\n value = getType(propVal, false)\n }\n } else {\n value = toStr(propVal)\n }\n\n property.value = value\n\n return property\n}\n\nfunction getDescription(obj: any, self: any = obj) {\n let description = ''\n const { type, subtype } = basic(obj)\n\n if (type === 'string') {\n description = obj\n } else if (type === 'number') {\n description = toStr(obj)\n } else if (type === 'symbol') {\n description = toStr(obj)\n } else if (type === 'function') {\n description = toSrc(obj)\n } else if (subtype === 'array') {\n description = `Array(${obj.length})`\n } else if (subtype === 'map') {\n description = `Map(${self.size})`\n } else if (subtype === 'set') {\n description = `Set(${self.size})`\n } else if (subtype === 'regexp') {\n description = toStr(obj)\n } else if (subtype === 'error') {\n description = obj.stack\n } else if (subtype === 'internal#entry') {\n if (obj.name) {\n description = `{\"${toStr(obj.name)}\" => \"${toStr(obj.value)}\"}`\n } else {\n description = `\"${toStr(obj.value)}\"`\n }\n } else {\n description = getType(obj, false)\n }\n\n return description\n}\n\nfunction basic(value: any): any {\n const type = typeof value\n let subtype = 'object'\n\n if (value instanceof InternalEntry) {\n subtype = 'internal#entry'\n } else if (isNull(value)) {\n subtype = 'null'\n } else if (isArr(value)) {\n subtype = 'array'\n } else if (isRegExp(value)) {\n subtype = 'regexp'\n } else if (isErr(value)) {\n subtype = 'error'\n } else if (isMap(value)) {\n subtype = 'map'\n } else if (isSet(value)) {\n subtype = 'set'\n } else {\n try {\n // Accessing nodeType may throw exception\n if (isEl(value)) {\n subtype = 'node'\n }\n } catch (e) {\n /* tslint:disable-next-line */\n }\n }\n\n return {\n type,\n subtype,\n }\n}\n\nclass InternalEntry {\n name: any\n value: any\n constructor(value: any, name?: any) {\n if (name) {\n this.name = name\n }\n this.value = value\n }\n}\n\nfunction noPrototype(obj: any) {\n if (obj instanceof InternalEntry) {\n return true\n }\n\n if (obj[0] && obj[0] instanceof InternalEntry) {\n return true\n }\n\n return false\n}\n\nfunction createInternalEntries(obj: any) {\n const entryId = entries.get(obj)\n const internalEntries: InternalEntry[] = entryId ? getObj(entryId) : []\n const objEntries = obj.entries()\n let entry = objEntries.next().value\n while (entry) {\n if (isMap(obj)) {\n internalEntries.push(new InternalEntry(entry[1], entry[0]))\n } else {\n internalEntries.push(new InternalEntry(entry[1]))\n }\n entry = objEntries.next().value\n }\n return internalEntries\n}\n","import * as objManager from '../lib/objManager'\n\n// Events emitted while no debugger has enabled the domain yet (the page loaded\n// target.js but no agent joined, or the agent left). Upstream queued them\n// without limit, and every console argument stayed pinned in objManager, so a\n// chatty page left open for hours kept growing. Keep only the most recent\n// events and release the objects of the ones we drop. Errors and warnings are\n// what the agent usually needs, so plain logs are dropped first.\n\nexport const BUFFER_LIMIT = 500\n\ninterface Pending {\n method: string\n params: any\n}\n\nexport function createEventBuffer(limit = BUFFER_LIMIT) {\n let items: Pending[] = []\n let dropped = 0\n\n return {\n push(method: string, params: any) {\n items.push({ method, params })\n if (items.length > limit) {\n let index = items.findIndex(item => !isImportant(item))\n if (index < 0) index = 0\n releaseObjects(items.splice(index, 1)[0].params, 0)\n dropped++\n }\n },\n /** Take everything buffered so far, plus how many events were dropped. */\n drain() {\n const result = { items, dropped }\n items = []\n dropped = 0\n return result\n },\n }\n}\n\nfunction isImportant({ method, params }: Pending) {\n return (\n method === 'Runtime.exceptionThrown' ||\n (method === 'Runtime.consoleAPICalled' &&\n (params.type === 'error' || params.type === 'warning'))\n )\n}\n\nfunction releaseObjects(value: any, depth: number) {\n if (!value || typeof value !== 'object' || depth > 4) return\n if (typeof value.objectId === 'string') {\n try {\n objManager.releaseObj(value.objectId)\n } catch {\n // Already released.\n }\n }\n for (const key in value) {\n releaseObjects(value[key], depth + 1)\n }\n}\n\nexport function droppedNotice(dropped: number, executionContextId: number) {\n return {\n type: 'warning',\n args: [\n {\n type: 'string',\n value: `[remote-webview] ${dropped} earlier console message(s) were dropped while no debugger was attached (at most ${BUFFER_LIMIT} are kept, errors and warnings first).`,\n },\n ],\n stackTrace: { callFrames: [] },\n executionContextId,\n timestamp: Date.now(),\n }\n}\n","import connector from '../lib/connector'\nimport each from 'licia/each'\nimport map from 'licia/map'\nimport now from 'licia/now'\nimport isStr from 'licia/isStr'\nimport fnParams from 'licia/fnParams'\nimport uncaught from 'licia/uncaught'\nimport startWith from 'licia/startWith'\nimport stackTrace from 'licia/stackTrace'\nimport trim from 'licia/trim'\nimport * as objManager from '../lib/objManager'\nimport { evalJs, evalJsAsync, setGlobal } from '../lib/evaluate'\nimport Protocol from 'devtools-protocol'\nimport { getTimestamp } from '../lib/util'\nimport { createEventBuffer, droppedNotice } from '../engine/eventBuffer'\nimport Runtime = Protocol.Runtime\n\nconst executionContext = {\n id: 1,\n name: 'top',\n origin: location.origin,\n}\n\nexport async function callFunctionOn(\n params: Runtime.CallFunctionOnRequest\n): Promise<Runtime.CallFunctionOnResponse> {\n const { functionDeclaration, objectId } = params\n let args = params.arguments || []\n\n args = map(args, (arg: any) => {\n const { objectId, value } = arg\n if (objectId) {\n const obj = objManager.getObj(objectId)\n if (obj) return obj\n }\n\n return value\n })\n\n let ctx = null\n if (objectId) {\n ctx = objManager.getObj(objectId)\n }\n\n return {\n result: objManager.wrap(await callFn(functionDeclaration, args, ctx)),\n }\n}\n\nlet isEnable = false\n\nexport function enable() {\n isEnable = true\n const { items, dropped } = buffered.drain()\n if (dropped) {\n connector.trigger(\n 'Runtime.consoleAPICalled',\n droppedNotice(dropped, executionContext.id)\n )\n }\n each(items, ({ method, params }) => connector.trigger(method, params))\n\n trigger('Runtime.executionContextCreated', {\n context: executionContext,\n })\n}\n\nexport function getProperties(\n params: Runtime.GetPropertiesRequest\n): Runtime.GetPropertiesResponse {\n return objManager.getProperties(params)\n}\n\nlet isAsyncSupported = true\n\ntry {\n // Indirect: a direct eval would keep the minifier from renaming anything in the bundle.\n ;(0, eval)('async () => {}')\n} catch (e) {\n isAsyncSupported = false\n}\n\nexport async function evaluate(\n params: Runtime.EvaluateRequest\n): Promise<Runtime.EvaluateResponse> {\n const ret: any = {}\n\n let result: any\n try {\n if (params.throwOnSideEffect && hasSideEffect(params.expression)) {\n throw EvalError('Possible side-effect in debug-evaluate')\n }\n\n if (isAsyncSupported && (params.replMode || params.awaitPromise)) {\n result = await evalJsAsync(params.expression)\n } else {\n result = evalJs(params.expression)\n }\n setGlobal('$_', result)\n ret.result = objManager.wrap(result, {\n generatePreview: true,\n })\n } catch (e) {\n ret.exceptionDetails = {\n exception: objManager.wrap(e),\n text: 'Uncaught',\n }\n ret.result = objManager.wrap(e, {\n generatePreview: true,\n })\n }\n\n return ret\n}\n\nexport function releaseObject(params: Runtime.ReleaseObjectRequest) {\n objManager.releaseObj(params.objectId)\n}\n\nexport function globalLexicalScopeNames() {\n return {\n names: [],\n }\n}\n\ndeclare const console: any\n\nfunction monitorConsole() {\n const methods: any = {\n log: 'log',\n warn: 'warning',\n error: 'error',\n info: 'info',\n dir: 'dir',\n table: 'table',\n group: 'startGroup',\n groupCollapsed: 'startGroupCollapsed',\n groupEnd: 'endGroup',\n debug: 'debug',\n clear: 'clear',\n }\n\n each(methods, (type, name) => {\n if (!console[name]) {\n return\n }\n let lastTimestamp = 0\n const origin = console[name].bind(console)\n console[name] = (...args: any[]) => {\n origin(...args)\n\n args = map(args, arg =>\n objManager.wrap(arg, {\n generatePreview: true,\n })\n )\n\n let timestamp = getTimestamp()\n if (timestamp <= lastTimestamp) {\n timestamp = lastTimestamp + 0.001\n }\n lastTimestamp = timestamp\n\n trigger('Runtime.consoleAPICalled', {\n type,\n args,\n stackTrace: {\n callFrames:\n type === 'error' || type === 'warning' ? getCallFrames() : [],\n },\n executionContextId: executionContext.id,\n timestamp,\n })\n }\n })\n}\n\nconst Function = window.Function\n/* eslint-disable-next-line */\nconst AsyncFunction = Object.getPrototypeOf(async function () {}).constructor\n\nfunction parseFn(fnStr: string) {\n const result = fnParams(fnStr)\n\n if (fnStr[fnStr.length - 1] !== '}') {\n result.push('return ' + fnStr.slice(fnStr.indexOf('=>') + 2))\n } else {\n result.push(fnStr.slice(fnStr.indexOf('{') + 1, fnStr.lastIndexOf('}')))\n }\n\n return result\n}\n\nasync function callFn(\n functionDeclaration: string,\n args: any[],\n ctx: any = null\n) {\n const fnParams = parseFn(functionDeclaration)\n let fn\n\n if (startWith(functionDeclaration, 'async')) {\n fn = AsyncFunction.apply(null, fnParams)\n return await fn.apply(ctx, args)\n }\n\n fn = Function.apply(null, fnParams)\n return fn.apply(ctx, args)\n}\n\nuncaught.addListener(err => {\n trigger('Runtime.exceptionThrown', {\n exceptionDetails: {\n exception: objManager.wrap(err),\n stackTrace: { callFrames: getCallFrames(err) },\n text: 'Uncaught',\n },\n timestamp: now,\n })\n})\n\nfunction hasSideEffect(code: string) {\n return !/^[a-zA-Z0-9]*$/.test(code)\n}\n\nfunction getCallFrames(error?: Error) {\n let callFrames: any[] = []\n const callSites: any = error ? error.stack : stackTrace()\n if (isStr(callSites)) {\n callFrames = callSites.split('\\n')\n if (!error) {\n callFrames.shift()\n }\n callFrames.shift()\n callFrames = map(callFrames, val => ({ functionName: trim(val) }))\n } else if (callSites) {\n callSites.shift()\n callFrames = map(callSites, (callSite: any) => {\n return {\n functionName: callSite.getFunctionName(),\n lineNumber: callSite.getLineNumber(),\n columnNumber: callSite.getColumnNumber(),\n url: callSite.getFileName(),\n }\n })\n }\n return callFrames\n}\n\nconst buffered = createEventBuffer()\n\n// Back to buffering once the agent is gone, and let go of the objects it was\n// handed (console arguments, eval results).\nexport function disable() {\n isEnable = false\n objManager.clear()\n}\n\nfunction trigger(method: string, params: any) {\n if (isEnable) {\n connector.trigger(method, params)\n } else {\n buffered.push(method, params)\n }\n}\n\nuncaught.start()\nmonitorConsole()\n","exports = function(arr, val, fromIdx) {\n return Array.prototype.indexOf.call(arr, val, fromIdx);\n};\n\nmodule.exports = exports;\n","var each = require('./each');\nexports = function(obj) {\n var ret = [];\n each(obj, function(val) {\n ret.push(val);\n });\n return ret;\n};\n\nmodule.exports = exports;\n","var idxOf = require('./idxOf');\nvar isStr = require('./isStr');\nvar isArrLike = require('./isArrLike');\nvar values = require('./values');\nexports = function(arr, val) {\n if (isStr(arr)) return arr.indexOf(val) > -1;\n if (!isArrLike(arr)) arr = values(arr);\n return idxOf(arr, val) >= 0;\n};\n\nmodule.exports = exports;\n","var objToStr = require('./objToStr');\nexports = function(val) {\n return objToStr(val) === '[object Blob]';\n};\n\nmodule.exports = exports;\n","exports = function(arr) {\n var len = arr ? arr.length : 0;\n if (len) return arr[len - 1];\n};\n\nmodule.exports = exports;\n","var isNum = require('./isNum');\nvar isObj = require('./isObj');\nvar isFn = require('./isFn');\nvar isStr = require('./isStr');\nexports = function(val) {\n if (isNum(val)) return val;\n if (isObj(val)) {\n var temp = isFn(val.valueOf) ? val.valueOf() : val;\n val = isObj(temp) ? temp + '' : temp;\n }\n if (!isStr(val)) return val === 0 ? val : +val;\n return +val;\n};\n\nmodule.exports = exports;\n","import Emitter from 'licia/Emitter'\nimport isStr from 'licia/isStr'\nimport last from 'licia/last'\nimport Url from 'licia/Url'\nimport isEmpty from 'licia/isEmpty'\nimport trim from 'licia/trim'\nimport now from 'licia/now'\nimport each from 'licia/each'\nimport startWith from 'licia/startWith'\nimport toNum from 'licia/toNum'\nimport { createId } from './util'\n\nexport class XhrRequest extends Emitter {\n private xhr: XMLHttpRequest\n private method: string\n private url: string\n private id: string\n private reqHeaders: any\n constructor(xhr: XMLHttpRequest, method: string, url: string) {\n super()\n\n this.xhr = xhr\n this.reqHeaders = {}\n this.method = method\n this.url = fullUrl(url)\n this.id = createId()\n\n xhr.addEventListener('readystatechange', () => {\n if (xhr.readyState === 2) {\n this.handleHeadersReceived()\n } else if (xhr.readyState === 4) {\n if (xhr.status === 0) {\n this.handleError()\n } else {\n this.handleDone()\n }\n }\n })\n }\n // #1\n toJSON() {\n return {\n method: this.method,\n url: this.url,\n id: this.id,\n }\n }\n handleSend(data: any) {\n if (!isStr(data)) data = ''\n\n data = {\n name: getFileName(this.url),\n url: this.url,\n data,\n time: now(),\n reqHeaders: this.reqHeaders,\n method: this.method,\n }\n if (!isEmpty(this.reqHeaders)) {\n data.reqHeaders = this.reqHeaders\n }\n this.emit('send', this.id, data)\n }\n handleReqHeadersSet(key: string, val: string) {\n if (key && val) {\n this.reqHeaders[key] = val\n }\n }\n private handleHeadersReceived() {\n const { xhr } = this\n\n const type = getType(xhr.getResponseHeader('Content-Type') || '')\n this.emit('headersReceived', this.id, {\n type: type.type,\n subType: type.subType,\n size: getSize(xhr, true, this.url),\n time: now(),\n resHeaders: getHeaders(xhr),\n })\n }\n private handleDone() {\n const xhr = this.xhr\n const resType = xhr.responseType\n let resTxt = ''\n\n const update = () => {\n this.emit('done', this.id, {\n status: xhr.status,\n size: getSize(xhr, false, this.url),\n time: now(),\n resTxt,\n })\n }\n\n const type = getType(xhr.getResponseHeader('Content-Type') || '')\n if (\n resType === 'blob' &&\n (type.type === 'text' ||\n type.subType === 'javascript' ||\n type.subType === 'json')\n ) {\n readBlobAsText(xhr.response, (err: Error, result: string) => {\n if (result) resTxt = result\n update()\n })\n } else {\n if (resType === '' || resType === 'text') resTxt = xhr.responseText\n if (resType === 'json') resTxt = JSON.stringify(xhr.response)\n\n update()\n }\n }\n private handleError() {\n this.emit('error', this.id, {\n errorText: 'Network error',\n time: now(),\n })\n }\n}\n\nexport class FetchRequest extends Emitter {\n private url: string\n private id: string\n private method: string\n private options: any\n private reqHeaders: any\n constructor(input: any, options: any = {}) {\n super()\n\n const isRequest = input instanceof window.Request\n const url = isRequest ? input.url : input\n\n this.url = fullUrl(url)\n this.id = createId()\n this.options = options\n this.reqHeaders = options.headers || (isRequest ? input.headers : {})\n this.method = options.method || (isRequest ? input.method : 'GET')\n }\n send(fetchResult: any) {\n const options = this.options\n\n const data = isStr(options.body) ? options.body : ''\n\n this.emit('send', this.id, {\n name: getFileName(this.url),\n url: this.url,\n data,\n reqHeaders: this.reqHeaders,\n time: now(),\n method: this.method,\n })\n\n fetchResult\n .then((res: any) => {\n res = res.clone()\n\n const type = getType(res.headers.get('Content-Type'))\n res.text().then((resTxt: string) => {\n const data: any = {\n type: type.type,\n subType: type.subType,\n time: now(),\n size: getFetchSize(res, resTxt),\n resTxt,\n resHeaders: getFetchHeaders(res),\n status: res.status,\n }\n if (!isEmpty(this.reqHeaders)) {\n data.reqHeaders = this.reqHeaders\n }\n this.emit('done', this.id, data)\n })\n\n return res\n })\n .catch((err: any) => {\n this.emit('error', this.id, {\n errorText: err.message,\n time: now(),\n })\n })\n }\n}\n\nfunction getFetchSize(res: any, resTxt: string) {\n let size = 0\n\n const contentLen = res.headers.get('Content-length')\n\n if (contentLen) {\n size = toNum(contentLen)\n } else {\n size = lenToUtf8Bytes(resTxt)\n }\n\n return size\n}\n\nfunction getFetchHeaders(res: any) {\n const ret: any = {}\n\n res.headers.forEach((val: string, key: string) => (ret[key] = val))\n\n return ret\n}\n\nfunction getHeaders(xhr: XMLHttpRequest) {\n const raw = xhr.getAllResponseHeaders()\n const lines = raw.split('\\n')\n\n const ret: any = {}\n\n each(lines, line => {\n line = trim(line)\n\n if (line === '') return\n\n const [key, val] = line.split(':', 2)\n\n ret[key] = trim(val)\n })\n\n return ret\n}\n\nfunction getSize(xhr: XMLHttpRequest, headersOnly: boolean, url: string) {\n let size = 0\n\n function getStrSize() {\n if (!headersOnly) {\n const resType = xhr.responseType\n let resTxt = ''\n\n if (resType === '' || resType === 'text') resTxt = xhr.responseText\n if (resTxt) size = lenToUtf8Bytes(resTxt)\n }\n }\n\n if (isCrossOrig(url)) {\n getStrSize()\n } else {\n try {\n size = toNum(xhr.getResponseHeader('Content-Length'))\n } catch (e) {\n getStrSize()\n }\n }\n\n if (size === 0) getStrSize()\n\n return size\n}\n\nconst link = document.createElement('a')\n\nexport function fullUrl(href: string) {\n link.href = href\n\n return (\n link.protocol + '//' + link.host + link.pathname + link.search + link.hash\n )\n}\n\nfunction getFileName(url: string) {\n let ret = last(url.split('/'))\n\n if (ret.indexOf('?') > -1) ret = trim(ret.split('?')[0])\n\n if (ret === '') {\n const urlObj = new Url(url)\n ret = urlObj.hostname\n }\n\n return ret\n}\n\nfunction getType(contentType: string) {\n if (!contentType)\n return {\n type: 'unknown',\n subType: 'unknown',\n }\n\n const type = contentType.split(';')[0].split('/')\n\n return {\n type: type[0],\n subType: last(type),\n }\n}\n\nfunction readBlobAsText(blob: Blob, callback: any) {\n const reader = new FileReader()\n reader.onload = () => {\n callback(null, reader.result)\n }\n reader.onerror = err => {\n callback(err)\n }\n reader.readAsText(blob)\n}\n\nconst origin = window.location.origin\n\nfunction isCrossOrig(url: string) {\n return !startWith(url, origin)\n}\n\nfunction lenToUtf8Bytes(str: string) {\n const m = encodeURIComponent(str).match(/%[89ABab]/g)\n\n return str.length + (m ? m.length : 0)\n}\n","// Response bodies kept for Network.getResponseBody. Upstream stored every\n// response body forever (`resTxtMap`), so a long-lived page polling an API grew\n// without bound. Keep the most recent bodies only: each truncated to\n// ENTRY_LIMIT characters, at most TOTAL_LIMIT characters in all, oldest evicted\n// first.\n\nexport const BODY_TOTAL_LIMIT = 5 * 1024 * 1024\nexport const BODY_ENTRY_LIMIT = 64 * 1024\n\nexport function createBodyCache(\n totalLimit = BODY_TOTAL_LIMIT,\n entryLimit = BODY_ENTRY_LIMIT\n) {\n const bodies = new Map<string, string>()\n let total = 0\n\n function remove(id: string) {\n const body = bodies.get(id)\n if (body === undefined) return\n total -= body.length\n bodies.delete(id)\n }\n\n return {\n set(id: string, body: unknown) {\n remove(id)\n let text = typeof body === 'string' ? body : ''\n if (text.length > entryLimit) {\n text =\n text.slice(0, entryLimit) +\n `\\n…[truncated, ${text.length} characters in total]`\n }\n bodies.set(id, text)\n total += text.length\n while (total > totalLimit && bodies.size > 1) {\n remove(bodies.keys().next().value as string)\n }\n },\n // Typed loosely like the Map it replaces: undefined for unknown ids.\n get(id: string): any {\n return bodies.get(id)\n },\n has(id: string) {\n return bodies.has(id)\n },\n }\n}\n","import { createId } from '../lib/util'\nimport { fullUrl } from '../lib/request'\n\n// Requests the upstream Network domain does not see: navigator.sendBeacon\n// (analytics, \"page closed\" reports) and EventSource streams. Both hooks keep\n// the original behaviour and stay subclass-safe, like the WebSocket hook.\n\ntype Trigger = (method: string, params: any) => void\n\nconst now = () => Date.now() / 1000\n\nexport function enableBeacon(trigger: Trigger) {\n const nav = navigator as any\n const origSendBeacon = nav.sendBeacon\n if (typeof origSendBeacon !== 'function') return\n\n nav.sendBeacon = function (url: string, data?: any) {\n const queued = origSendBeacon.apply(this, arguments)\n try {\n const requestId = createId()\n const request: any = { method: 'POST', url: fullUrl(String(url)), headers: {} }\n if (typeof data === 'string') request.postData = data\n trigger('Network.requestWillBeSent', {\n requestId,\n type: 'Ping',\n request,\n timestamp: now(),\n })\n if (queued) {\n // The response of a beacon is never exposed to the page.\n trigger('Network.loadingFinished', {\n requestId,\n encodedDataLength: typeof data === 'string' ? data.length : 0,\n timestamp: now(),\n })\n } else {\n trigger('Network.loadingFailed', {\n requestId,\n errorText: 'sendBeacon was refused by the browser',\n timestamp: now(),\n type: 'Ping',\n })\n }\n } catch (e) {\n // Never break the page's beacon because of our bookkeeping.\n }\n return queued\n }\n}\n\nexport function enableEventSource(trigger: Trigger) {\n const OrigEventSource = (window as any).EventSource\n if (typeof OrigEventSource !== 'function') return\n\n function EventSource(this: any, url: string, init?: any) {\n const es = Reflect.construct(\n OrigEventSource,\n init === undefined ? [url] : [url, init],\n new.target || OrigEventSource\n )\n try {\n const requestId = createId()\n trigger('Network.requestWillBeSent', {\n requestId,\n type: 'EventSource',\n request: { method: 'GET', url: fullUrl(String(url)), headers: {} },\n timestamp: now(),\n })\n let opened = false\n es.addEventListener('open', function () {\n if (opened) return\n opened = true\n trigger('Network.responseReceived', {\n requestId,\n type: 'EventSource',\n response: { status: 200, headers: {} },\n timestamp: now(),\n })\n })\n es.addEventListener('error', function () {\n // EventSource reconnects by itself unless the stream is closed for good.\n if (es.readyState !== OrigEventSource.CLOSED) return\n trigger('Network.loadingFailed', {\n requestId,\n errorText: opened ? 'EventSource closed' : 'EventSource failed',\n timestamp: now(),\n type: 'EventSource',\n })\n })\n } catch (e) {\n // Bookkeeping only.\n }\n return es\n }\n EventSource.prototype = OrigEventSource.prototype\n ;(EventSource as any).CONNECTING = OrigEventSource.CONNECTING\n ;(EventSource as any).OPEN = OrigEventSource.OPEN\n ;(EventSource as any).CLOSED = OrigEventSource.CLOSED\n ;(window as any).EventSource = EventSource\n}\n","import trim from 'licia/trim'\nimport each from 'licia/each'\nimport decodeUriComponent from 'licia/decodeUriComponent'\nimport rmCookie from 'licia/rmCookie'\nimport isNative from 'licia/isNative'\nimport contain from 'licia/contain'\nimport now from 'licia/now'\nimport Emitter from 'licia/Emitter'\nimport isStr from 'licia/isStr'\nimport isBlob from 'licia/isBlob'\nimport isUndef from 'licia/isUndef'\nimport convertBin from 'licia/convertBin'\nimport { XhrRequest, FetchRequest } from '../lib/request'\nimport connector from '../lib/connector'\nimport { createId } from '../lib/util'\nimport { createEventBuffer } from '../engine/eventBuffer'\nimport { createBodyCache } from '../engine/bodyCache'\nimport { enableBeacon, enableEventSource } from '../engine/networkExtra'\nimport Protocol from 'devtools-protocol'\nimport Network = Protocol.Network\n\nexport function deleteCookies(params: Network.DeleteCookiesRequest) {\n rmCookie(params.name)\n}\n\nexport function getCookies(): Network.GetCookiesResponse {\n const cookies: any[] = []\n\n const cookie = document.cookie\n if (trim(cookie) !== '') {\n each(cookie.split(';'), function (value: any) {\n value = value.split('=')\n const name = trim(value.shift())\n value = decodeUriComponent(value.join('='))\n cookies.push({\n name,\n value,\n })\n })\n }\n\n return { cookies }\n}\n\nconst resTxtMap = createBodyCache()\n\nlet isEnable = false\n\nexport const enable = function () {\n isEnable = true\n each(buffered.drain().items, ({ method, params }) =>\n connector.trigger(method, params)\n )\n}\n\nexport function disable() {\n isEnable = false\n}\n\nexport function getResponseBody(\n params: Network.GetResponseBodyRequest\n): Network.GetResponseBodyResponse {\n return {\n base64Encoded: false,\n body: resTxtMap.get(params.requestId),\n }\n}\n\nfunction enableXhr() {\n const winXhrProto = window.XMLHttpRequest.prototype\n\n const origSend: any = winXhrProto.send\n const origOpen: any = winXhrProto.open\n const origSetRequestHeader: any = winXhrProto.setRequestHeader\n\n winXhrProto.open = function (method: string, url: string) {\n if (!isValidUrl(url)) {\n return origOpen.apply(this, arguments)\n }\n\n const xhr = this\n\n const req = ((xhr as any).chobitsuRequest = new XhrRequest(\n xhr,\n method,\n url\n ))\n\n bindRequestEvent(req, 'XHR')\n\n origOpen.apply(this, arguments)\n }\n\n winXhrProto.send = function (data) {\n const req = (this as any).chobitsuRequest\n if (req) req.handleSend(data)\n\n origSend.apply(this, arguments)\n }\n\n winXhrProto.setRequestHeader = function (key, val) {\n const req = (this as any).chobitsuRequest\n if (req) {\n req.handleReqHeadersSet(key, val)\n }\n\n origSetRequestHeader.apply(this, arguments)\n }\n}\n\nfunction enableFetch() {\n let isFetchSupported = false\n if (window.fetch) {\n isFetchSupported = isNative(window.fetch)\n // #2 Probably not a fetch polyfill\n if (!isFetchSupported) {\n if (navigator.serviceWorker) {\n isFetchSupported = true\n }\n if (window.Request && isNative(window.Request)) {\n isFetchSupported = true\n }\n }\n }\n if (!isFetchSupported) return\n\n const origFetch = window.fetch\n\n window.fetch = function (...args) {\n const req = new FetchRequest(...args)\n bindRequestEvent(req, 'Fetch')\n const fetchResult = origFetch(...args)\n req.send(fetchResult)\n\n return fetchResult\n }\n}\n\nfunction bindRequestEvent(req: Emitter, type: string) {\n req.on('send', (id: string, data: any) => {\n const request: any = {\n method: data.method,\n url: data.url,\n headers: data.reqHeaders,\n }\n if (data.data) {\n request.postData = data.data\n }\n\n trigger('Network.requestWillBeSent', {\n requestId: id,\n type,\n request,\n timestamp: data.time / 1000,\n })\n })\n req.on('headersReceived', (id: string, data: any) => {\n trigger('Network.responseReceivedExtraInfo', {\n requestId: id,\n blockedCookies: [],\n headers: data.resHeaders,\n })\n })\n req.on('done', (id: string, data: any) => {\n const response: any = {\n status: data.status,\n }\n if (data.resHeaders) {\n response.headers = data.resHeaders\n }\n\n trigger('Network.responseReceived', {\n requestId: id,\n type,\n response,\n timestamp: data.time / 1000,\n })\n resTxtMap.set(id, data.resTxt)\n trigger('Network.loadingFinished', {\n requestId: id,\n encodedDataLength: data.size,\n timestamp: data.time / 1000,\n })\n })\n req.on('error', (id, data) => {\n trigger('Network.loadingFailed', {\n requestId: id,\n errorText: data.errorText,\n timestamp: data.time / 1000,\n type,\n })\n })\n}\n\nfunction enableWebSocket() {\n const origWebSocket = window.WebSocket\n function WebSocket(url: string, protocols?: string | string[]) {\n // Pass new.target through: tools hooking after us (e.g. PageSpy) do\n // `class extends WebSocket`, which breaks if we hand back a plain instance.\n const ws: WebSocket = Reflect.construct(\n origWebSocket,\n [url, protocols],\n new.target || origWebSocket\n )\n\n if (!isValidUrl(url)) {\n return ws\n }\n\n const requestId = createId()\n\n trigger('Network.webSocketCreated', {\n requestId,\n url,\n })\n\n ws.addEventListener('open', function () {\n trigger('Network.webSocketWillSendHandshakeRequest', {\n requestId,\n timestamp: now() / 1000,\n request: {\n headers: {},\n },\n })\n trigger('Network.webSocketHandshakeResponseReceived', {\n requestId,\n timeStamp: now() / 1000,\n response: {\n status: 101,\n statusText: 'Switching Protocols',\n },\n })\n })\n\n ws.addEventListener('message', async function (e) {\n let payloadData = e.data\n if (isUndef(payloadData)) {\n return\n }\n\n let opcode = 1\n if (!isStr(payloadData)) {\n opcode = 2\n if (isBlob(payloadData)) {\n payloadData = await convertBin.blobToArrBuffer(payloadData)\n }\n payloadData = convertBin(payloadData, 'base64')\n }\n\n trigger('Network.webSocketFrameReceived', {\n requestId,\n timestamp: now() / 1000,\n response: {\n opcode,\n payloadData,\n },\n })\n })\n\n const origSend = ws.send\n ws.send = function (data: any) {\n if (!isUndef(data)) {\n frameSent(data)\n }\n\n return origSend.call(this, data)\n }\n\n async function frameSent(data: any) {\n let opcode = 1\n let payloadData = data\n if (!isStr(data)) {\n opcode = 2\n if (isBlob(payloadData)) {\n payloadData = await convertBin.blobToArrBuffer(payloadData)\n }\n payloadData = convertBin(data, 'base64')\n }\n\n trigger('Network.webSocketFrameSent', {\n requestId,\n timestamp: now() / 1000,\n response: {\n opcode,\n payloadData,\n },\n })\n }\n\n ws.addEventListener('close', function () {\n trigger('Network.webSocketClosed', {\n requestId,\n timestamp: now() / 1000,\n })\n })\n\n ws.addEventListener('error', function () {\n trigger('Network.webSocketFrameError', {\n requestId,\n timestamp: now() / 1000,\n errorMessage: 'WebSocket error',\n })\n })\n\n return ws\n }\n WebSocket.prototype = origWebSocket.prototype\n WebSocket.CLOSED = origWebSocket.CLOSED\n WebSocket.CLOSING = origWebSocket.CLOSING\n WebSocket.CONNECTING = origWebSocket.CONNECTING\n WebSocket.OPEN = origWebSocket.OPEN\n window.WebSocket = WebSocket as any\n}\n\nfunction isValidUrl(url: string) {\n return !contain(url, '__chobitsu-hide__=true')\n}\n\nconst buffered = createEventBuffer()\n\nfunction trigger(method: string, params: any) {\n if (isEnable) {\n connector.trigger(method, params)\n } else {\n buffered.push(method, params)\n }\n}\n\nenableXhr()\nenableFetch()\nenableWebSocket()\nenableBeacon(trigger)\nenableEventSource(trigger)\n","// Hit testing for synthesized input. Our own in-page UI (the remote-debugging\n// banner, overlays) is marked `__chobitsu-hide__` and is invisible to the\n// agent's DOM tree and snapshot, so input must pass through it too. Otherwise\n// a click aimed at the page's own bottom bar can land on the banner's \"end\"\n// button and close the session.\n//\n// Other in-page debug tools float their entry buttons over the page too\n// (eruda's gear, PageSpy's logo, vConsole's switch). They are not part of the\n// app, so the agent's clicks go through them as well.\n\nexport const HIDE_SELECTOR = '.__chobitsu-hide__, #eruda, #__pageSpy, #__vconsole'\n\nexport function elementFromPoint(x: number, y: number): Element {\n for (const el of document.elementsFromPoint(x, y)) {\n if (!el.closest(HIDE_SELECTOR)) return el\n }\n return document.documentElement\n}\n","import { HIDE_SELECTOR } from './hitTest'\n\n// Masking of sensitive values in everything the agent can read: snapshot text,\n// screenshots, console text and request bodies. Password fields and anything\n// inside an element marked `data-rwd-mask` are replaced with MASK. A project\n// can add CSS selectors and text patterns (docs/protocol.md §11, welcome.config).\n\nexport const MASK = '••••'\nexport const MASK_SELECTOR = 'input[type=password], [data-rwd-mask]'\n\nlet maskSelector = MASK_SELECTOR\nlet patterns: RegExp[] = []\n\n/** The selectors that parse, so a bad one cannot break every query. */\nexport function validSelectors(list: unknown): string[] {\n const out: string[] = []\n if (!Array.isArray(list)) return out\n const probe = document.createDocumentFragment()\n for (const sel of list) {\n if (typeof sel !== 'string' || !sel.trim()) continue\n try {\n probe.querySelector(sel)\n out.push(sel)\n } catch (e) {\n // Not a valid selector.\n }\n }\n return out\n}\n\n/**\n * Extra masking from the project policy: CSS selectors (on top of password\n * fields and [data-rwd-mask]) and text patterns, `{name, regex}` with regex in\n * JavaScript / RE2 syntax (a leading `(?i)` means case-insensitive).\n */\nexport function setMaskRules(selectors: unknown, regexes: unknown) {\n maskSelector = [MASK_SELECTOR].concat(validSelectors(selectors)).join(', ')\n patterns = []\n if (Array.isArray(regexes)) {\n for (const p of regexes) {\n let source = p && typeof p === 'object' ? p.regex : p\n if (typeof source !== 'string' || !source) continue\n let flags = 'g'\n if (source.indexOf('(?i)') === 0) {\n source = source.slice(4)\n flags += 'i'\n }\n try {\n patterns.push(new RegExp(source, flags))\n } catch (e) {\n // Not a valid pattern.\n }\n }\n }\n secretsCache = undefined\n}\n\n/** Replace text matching the project's mask patterns with MASK. */\nexport function scrubPatterns(text: string) {\n for (let i = 0; i < patterns.length; i++) {\n patterns[i].lastIndex = 0\n text = text.replace(patterns[i], m => (m ? MASK : m))\n }\n return text\n}\n\n/** Like Element.closest(), but continues past shadow roots to their hosts. */\nexport function closestComposed(el: Element | null, selector: string) {\n while (el) {\n const found = el.closest(selector)\n if (found) return found\n const root = el.getRootNode() as ShadowRoot\n el = root && root.host ? root.host : null\n }\n return null\n}\n\n/** Our own UI or another debug tool (eruda, PageSpy, vConsole). */\nexport function isDebugUi(el: Element) {\n return !!closestComposed(el, HIDE_SELECTOR)\n}\n\n/** Whether the element's value / text must not be shown. */\nexport function isMasked(el: Element) {\n return !!closestComposed(el, maskSelector)\n}\n\n/** Masked elements in the document, excluding debug tools' UI. */\nexport function maskedElements(): Element[] {\n return Array.prototype.filter.call(\n document.querySelectorAll(maskSelector),\n (el: Element) => !isDebugUi(el)\n ) as Element[]\n}\n\n/** The text an element shows: the value of form fields, text otherwise. */\nexport function shownText(el: Element) {\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n ) {\n return el.value\n }\n return (el.textContent || '').replace(/\\s+/g, ' ').trim()\n}\n\nlet secretsCache: { at: number; values: string[] } | undefined\n// A field just changed (the user's typing or the agent's fill): its value may\n// be a new secret, so the cache must not outlive it.\nif (typeof document !== 'undefined') {\n const invalidate = () => {\n secretsCache = undefined\n }\n document.addEventListener('input', invalidate, true)\n document.addEventListener('change', invalidate, true)\n}\n\n/**\n * Current values of masked elements, longest first, for scrubbing free text\n * (console messages, request bodies). Cached briefly: consoles can be chatty.\n */\nexport function currentSecrets(): string[] {\n const now = Date.now()\n if (secretsCache && now - secretsCache.at < 1000) return secretsCache.values\n const values: string[] = []\n const elements = maskedElements()\n for (let i = 0; i < elements.length; i++) {\n const text = shownText(elements[i])\n // Very short values would garble unrelated text.\n if (text.length >= 3 && values.indexOf(text) < 0) values.push(text)\n }\n values.sort((a, b) => b.length - a.length)\n secretsCache = { at: now, values }\n return values\n}\n\n/** Replace every occurrence of the given secrets, and the mask patterns, in text with MASK. */\nexport function scrub(text: string, secrets: string[] = currentSecrets()) {\n for (let i = 0; i < secrets.length; i++) {\n if (text.indexOf(secrets[i]) >= 0) text = text.split(secrets[i]).join(MASK)\n }\n return scrubPatterns(text)\n}\n","// RPC error codes of the RWD protocol (docs/protocol.md §5.1).\nexport type RwdErrorCode =\n | 'not_found'\n | 'not_interactable'\n | 'timeout'\n | 'takeover'\n | 'forbidden'\n | 'bad_request'\n | 'internal'\n\nexport class RwdError extends Error {\n code: RwdErrorCode\n constructor(code: RwdErrorCode, message: string) {\n super(message)\n this.code = code\n this.message = message\n Object.setPrototypeOf(this, RwdError.prototype)\n }\n}\n\nexport function rwdError(code: RwdErrorCode, message: string) {\n return new RwdError(code, message)\n}\n\n/** The `error` object of an RPC reply. */\nexport function toRpcError(e: any): { code: RwdErrorCode; message: string } {\n if (e instanceof RwdError) return { code: e.code, message: e.message }\n const message =\n e && typeof e === 'object' && 'message' in e\n ? `${e.name || 'Error'}: ${e.message}`\n : String(e)\n return { code: 'internal', message }\n}\n","// Text the page produces, for two audiences:\n//\n// agent RPC error messages and timeline event summaries: they go back to\n// the AI agent, in the language the gateway asks for\n// (welcome.agentLang).\n// user what the phone user reads about an agent action (the\n// sensitive-action confirmation), in the page SDK's UI language.\n//\n// English lives here and is the default. The page SDK owns the other\n// languages (sdk/src/locales/) and hands the engine the resolved text with\n// setAgentText / setUserText.\n\n/* ------------------------------ agent-facing ------------------------------ */\n\nexport const AGENT_EN = {\n missingParam: (name: string) => `Missing parameter: ${name}`,\n notString: (name: string) => `Parameter ${name} must be a string`,\n unknownMethod: (method: string) => `Unknown method: ${method}`,\n needLevel: (level: string) => `Requires the ${level} level`,\n takenOver: 'The user has taken over; wait until they hand control back',\n userDenied: 'The user denied this action',\n confirmBusy: 'Still waiting for the user to confirm the previous action',\n\n // keyboard\n unknownModifier: (m: string) => `Unknown modifier key: ${m}`,\n unknownKey: (key: string) => `Unknown key: ${key}`,\n\n // refs and queries\n refNotInSnapshot: (ref: string) => `ref=${ref} is not in the latest snapshot; take a new snapshot`,\n refDetached: (ref: string) => `The element of ref=${ref} is no longer on the page; take a new snapshot`,\n queryNeedsCriteria: 'At least one of text, role or name is required',\n noSuchRecord: (seq: string) => `No session log record seq=${seq} (it may have been cleaned up)`,\n noSuchSession: (id: string) => `No session log ${id} on this device (only the last 3 launches are kept)`,\n noSessionLog: 'No session log on this device yet (the project may have turned recording off, or the page passed run({ record: false }))',\n sessionLogUnavailable: 'IndexedDB is not available on this page: no session log',\n\n // editing and select\n readOnly: (tag: string) => `${tag} is read-only`,\n isSelect: (tag: string) => `${tag} is a dropdown; use rwd.select`,\n notFillable: (tag: string) => `${tag} is not a text field and cannot be filled`,\n notSelect: (tag: string) => `${tag} is not a dropdown (select); use click`,\n singleSelect: 'This dropdown allows only one option',\n noSuchOption: (value: string, choices: string[]) => `The dropdown has no option \"${value}\"; available: ${choices.join(', ')}`,\n optionDisabled: (value: string) => `Option \"${value}\" is disabled`,\n\n // navigation, waiting, evaluate\n badUrl: (url: string) => `Invalid URL: ${url}`,\n httpOnly: 'Only http(s) URLs can be opened',\n textAppearTimeout: (text: string) => `Timed out waiting for the text \"${text}\" to appear`,\n textGoneTimeout: (text: string) => `Timed out waiting for the text \"${text}\" to disappear`,\n badFunction: (message: string) => `Cannot parse function: ${message}`,\n notAFunction: 'function must be a function expression, e.g. \"() => document.title\"',\n\n // actionability\n elementDetached: (tag: string) => `Element ${tag} is no longer on the page; take a new snapshot`,\n notActionable: (tag: string, reason: string) => `Element ${tag} cannot be operated: ${reason}`,\n notVisible: (tag: string) => `Element ${tag} is not visible`,\n reasonMoving: 'its position keeps changing (it may be animating)',\n reasonOffscreen: 'it is outside the viewport',\n reasonObscured: (tag: string, ref: string) =>\n `the click point is covered by ${tag} (ref=${ref}; click it directly, e.g. a popup's backdrop to close the popup)`,\n\n // overlays listed after the snapshot\n overlayHeader: '[Overlays] These elements sit on top of the page. When a click is blocked, click them directly (e.g. the backdrop to close a popup):',\n overlayMask: (tag: string, coverage: number, ref: string) => `- backdrop ${tag}, covers ${coverage}% of the viewport [ref=${ref}]`,\n overlayLayer: (tag: string, text: string, coverage: number, ref: string) =>\n `- layer ${tag}${text ? ` \"${text}\"` : ''}, covers ${coverage}% of the viewport [ref=${ref}]`,\n reasonHidden: 'it is not visible',\n reasonDisabled: 'it is disabled',\n\n // storage\n storageUnavailable: (area: string) => `${area}Storage is not available`,\n badStorageArea: \"Parameter area must be 'local', 'session' or 'cookie'\",\n\n // network\n requestFailed: 'Request failed',\n noSuchRequest: (id: string) => `No request with id=${id} (it may have been dropped)`,\n netFailed: (what: string, error: string) => `${what} → failed (${error})`,\n wsFailed: (url: string) => `WebSocket ${url} → failed`,\n\n // timeline\n tapped: (role: string, text: string) => `Tapped ${role} \"${text}\"`,\n tappedTag: (role: string, tag: string) => `Tapped ${role} ${tag}`,\n roles: {\n button: 'button',\n link: 'link',\n textbox: 'text field',\n searchbox: 'search field',\n checkbox: 'checkbox',\n radio: 'radio button',\n switch: 'switch',\n combobox: 'dropdown',\n listbox: 'list',\n option: 'option',\n tab: 'tab',\n menuitem: 'menu item',\n img: 'image',\n heading: 'heading',\n cell: 'cell',\n row: 'row',\n listitem: 'list item',\n } as { [role: string]: string },\n element: 'element',\n}\n\nexport type AgentText = typeof AGENT_EN\n\n/* ------------------------------- user-facing ------------------------------ */\n\n// What the agent is about to do, completing \"AI wants to …\" in the SDK's\n// confirmation dialog (or a native host's, from status().pending.action).\nexport const USER_EN = {\n quote: (name: string) => `\"${name}\"`,\n click: (target: string) => `click ${target}`,\n enterActivate: (target: string) => `press Enter on ${target}`,\n enterSubmit: (target: string) => `press Enter to submit ${target}`,\n}\n\nexport type UserText = typeof USER_EN\n\nlet agent: AgentText = AGENT_EN\nlet user: UserText = USER_EN\n\nexport function setAgentText(text: AgentText) {\n agent = text\n}\n\nexport function setUserText(text: UserText) {\n user = text\n}\n\n/** Agent-facing text in the gateway's language. */\nexport function agentText(): AgentText {\n return agent\n}\n\n/** User-facing text in the SDK's UI language. */\nexport function userText(): UserText {\n return user\n}\n","import { rwdError } from './errors'\nimport { agentText } from './i18n'\n\n// The session log: everything that happened on this origin since the app was\n// launched, kept in IndexedDB so an agent that attaches later can read the\n// whole way to a bug (pages, the user's and the agent's actions, console,\n// network with the bodies of failed requests). It is recorded whether or not\n// a gateway is reachable and never leaves the device unless an attached agent\n// reads it.\n//\n// A session is one launch of the app (see the SDK's launch id). The last\n// KEEP_SESSIONS sessions are kept, each within SESSION_CAP bytes: past that,\n// plain console logs and successful requests go first.\n\nexport type LogKind = 'page' | 'action' | 'agent' | 'control' | 'console' | 'net'\n\nexport interface LogRecord {\n seq?: number\n session: string\n at: number\n kind: LogKind\n /** The SDK page id of the page that wrote it. */\n page: string\n /** 1: errors, failed requests, actions; kept longest. */\n imp: 0 | 1\n size: number\n data: { [key: string]: any }\n}\n\nexport interface SessionMeta {\n id: string\n /** 'app': launch id from the host app; 'cookie': inferred by the SDK. */\n source: string\n startedAt: number\n lastAt: number\n bytes: number\n /** Records dropped to stay within SESSION_CAP. */\n trimmed: number\n counts: { [kind: string]: number }\n}\n\nconst DB_NAME = 'rwd-log'\nconst KEEP_SESSIONS = 3\nexport const SESSION_CAP = 10 * 1024 * 1024\nconst SMALL_QUOTA = 64 * 1024 * 1024 // below this, only the current session is kept\nconst PENDING_LIMIT = 2000 // records waiting for start() or a flush\nconst FLUSH_MS = 1000\nconst HEARTBEAT_MS = 10_000\n/** A cookie session silent this long belongs to an earlier launch. */\nexport const LAUNCH_GAP = 60 * 60 * 1000\n\nlet state: 'waiting' | 'on' | 'off' = 'waiting'\nlet session = ''\nlet pageId = ''\nlet pending: LogRecord[] = []\nlet flushTimer: ReturnType<typeof setTimeout> | undefined\nlet heartbeat: ReturnType<typeof setInterval> | undefined\nlet dbPromise: Promise<IDBDatabase | null> | null = null\n// The open database once known, so a flush on page hide starts its\n// transaction synchronously, before the page goes away.\nlet openedDb: IDBDatabase | null = null\n\n/* --------------------------------- writing -------------------------------- */\n\n/**\n * Note something for the session log. Before start() records wait in memory\n * (load errors, the first requests); after stop() they are dropped.\n */\nexport function logRecord(kind: LogKind, data: LogRecord['data'], important = false) {\n if (state === 'off') return\n let size = 64\n try {\n size += JSON.stringify(data).length\n } catch (e) {\n return\n }\n pending.push({ session, at: Date.now(), kind, page: pageId, imp: important ? 1 : 0, size, data })\n if (pending.length > PENDING_LIMIT) {\n const index = pending.findIndex(r => !r.imp)\n pending.splice(index < 0 ? 0 : index, 1)\n }\n if (state === 'on') scheduleFlush()\n}\n\n/**\n * Start writing for this page. `candidate` is the launch id the SDK found; a\n * 'cookie' id that has been silent for LAUNCH_GAP is replaced (a webview that\n * keeps session cookies across launches). Resolves with the session id used.\n */\nexport async function startLog(candidate: { id: string; source: string }, page: string): Promise<string> {\n if (state !== 'waiting') return session\n pageId = page\n const db = await openDb()\n let id = candidate.id\n if (db) {\n const prev = await get<SessionMeta>(db, 'sessions', id)\n if (prev && candidate.source === 'cookie' && Date.now() - prev.lastAt > LAUNCH_GAP) id = newId()\n const meta: SessionMeta = (id === candidate.id && prev) || {\n id,\n source: candidate.source,\n startedAt: Date.now(),\n lastAt: Date.now(),\n bytes: 0,\n trimmed: 0,\n counts: {},\n }\n await put(db, 'sessions', meta)\n void prune(db, id)\n }\n if (state !== 'waiting') return session // stop() while opening\n session = id\n state = db ? 'on' : 'off'\n for (const r of pending) {\n r.session = id\n r.page = r.page || page\n }\n if (state === 'on') {\n void flush() // the page's first records (open, load errors) right away\n heartbeat = setInterval(() => {\n if (document.visibilityState !== 'hidden') void beat()\n }, HEARTBEAT_MS)\n } else {\n pending = []\n }\n return id\n}\n\n/** Stop recording; `clear` also deletes everything stored on this origin. */\nexport async function stopLog(clear: boolean) {\n state = 'off'\n pending = []\n if (heartbeat) clearInterval(heartbeat)\n if (!clear) return\n const db = await openDb()\n if (!db) return\n await tx(db, ['sessions', 'records'], 'readwrite', t => {\n t.objectStore('sessions').clear()\n t.objectStore('records').clear()\n })\n}\n\n/** Write what is pending now (page hide). */\nexport function flushLog() {\n if (state === 'on') void flush()\n}\n\nexport function currentSession() {\n return state === 'on' ? session : ''\n}\n\nfunction scheduleFlush() {\n if (flushTimer) return\n flushTimer = setTimeout(() => void flush(), pending.length >= 200 ? 0 : FLUSH_MS)\n}\n\nasync function flush() {\n if (flushTimer) clearTimeout(flushTimer)\n flushTimer = undefined\n if (state !== 'on' || !pending.length) return\n const batch = pending\n pending = []\n const db = openedDb || (await openDb())\n if (!db) return\n let meta: SessionMeta | undefined\n await tx(db, ['sessions', 'records'], 'readwrite', t => {\n const records = t.objectStore('records')\n let bytes = 0\n const counts: { [kind: string]: number } = {}\n for (const r of batch) {\n records.add(r)\n bytes += r.size\n const key = countKey(r)\n counts[key] = (counts[key] || 0) + 1\n }\n const sessions = t.objectStore('sessions')\n const req = sessions.get(session)\n req.onsuccess = () => {\n meta = req.result as SessionMeta | undefined\n if (!meta) return\n meta.lastAt = Date.now()\n meta.bytes += bytes\n for (const k in counts) meta.counts[k] = (meta.counts[k] || 0) + counts[k]\n sessions.put(meta)\n }\n })\n if (meta && meta.bytes > SESSION_CAP) await trim(db, meta.id)\n}\n\nfunction countKey(r: LogRecord) {\n if (r.kind === 'console') return r.data.type === 'error' ? 'error' : 'console'\n if (r.kind === 'net') return r.imp ? 'netFail' : 'net'\n return r.kind\n}\n\nasync function beat() {\n const db = await openDb()\n if (!db || state !== 'on') return\n await tx(db, ['sessions'], 'readwrite', t => {\n const store = t.objectStore('sessions')\n const req = store.get(session)\n req.onsuccess = () => {\n const meta = req.result as SessionMeta | undefined\n if (!meta) return\n meta.lastAt = Date.now()\n store.put(meta)\n }\n })\n}\n\n/** Keep the current session and the most recent others; fewer on a small quota. */\nasync function prune(db: IDBDatabase, current: string) {\n let keep = KEEP_SESSIONS\n try {\n const estimate = navigator.storage && navigator.storage.estimate ? await navigator.storage.estimate() : null\n if (estimate && estimate.quota && estimate.quota < SMALL_QUOTA) keep = 1\n } catch (e) {\n // Unknown quota: keep the default.\n }\n const all = (await getAll<SessionMeta>(db, 'sessions')).sort((a, b) => b.startedAt - a.startedAt)\n const others = all.filter(s => s.id !== current)\n for (const old of others.slice(keep - 1)) await deleteSession(db, old.id)\n}\n\nasync function deleteSession(db: IDBDatabase, id: string) {\n await tx(db, ['sessions', 'records'], 'readwrite', t => {\n t.objectStore('sessions').delete(id)\n const index = t.objectStore('records').index('bySession')\n const req = index.openKeyCursor(sessionRange(id))\n req.onsuccess = () => {\n const cursor = req.result\n if (!cursor) return\n t.objectStore('records').delete(cursor.primaryKey)\n cursor.continue()\n }\n })\n}\n\n/** Drop the oldest unimportant records (then the oldest of all) down to 80% of the cap. */\nasync function trim(db: IDBDatabase, id: string) {\n await tx(db, ['sessions', 'records'], 'readwrite', t => {\n const sessions = t.objectStore('sessions')\n const records = t.objectStore('records')\n const metaReq = sessions.get(id)\n metaReq.onsuccess = () => {\n const meta = metaReq.result as SessionMeta | undefined\n if (!meta) return\n const target = SESSION_CAP * 0.8\n const pass = (range: IDBKeyRange, index: string, next?: () => void) => {\n const req = records.index(index).openCursor(range)\n req.onsuccess = () => {\n const cursor = req.result\n if (!cursor || meta.bytes <= target) {\n if (meta.bytes > target && next) next()\n else sessions.put(meta)\n return\n }\n meta.bytes -= (cursor.value as LogRecord).size\n meta.trimmed++\n cursor.delete()\n cursor.continue()\n }\n }\n pass(IDBKeyRange.only([id, 0]), 'byImportance', () => pass(sessionRange(id), 'bySession'))\n }\n })\n}\n\n/* --------------------------------- reading -------------------------------- */\n\nexport interface LogQuery {\n session?: string\n kinds?: string[]\n /** Only console errors and failed requests. */\n problems?: boolean\n /** SDK page id. */\n page?: string\n /** Case-insensitive substring of the record's text. */\n text?: string\n /** Records after this seq (paging forward). */\n after?: number\n from?: number\n to?: number\n limit?: number\n /** Drop a record (network exclude rules) unless includeExcluded. */\n hide?: (r: LogRecord) => boolean\n}\n\nexport async function listSessions(): Promise<(SessionMeta & { current: boolean })[]> {\n const db = await needDb()\n const all = await getAll<SessionMeta>(db, 'sessions')\n return all.sort((a, b) => b.startedAt - a.startedAt).map(s => ({ ...s, current: s.id === session }))\n}\n\n/** Records of a session in order, without bodies and headers. */\nexport async function queryLog(q: LogQuery) {\n await flush()\n const db = await needDb()\n const id = await resolveSession(db, q.session)\n const limit = Math.max(1, Math.min(500, Number(q.limit) || 100))\n const text = typeof q.text === 'string' ? q.text.toLowerCase() : ''\n const after = Number(q.after) || 0\n const out: LogRecord[] = []\n let hidden = 0\n let more = false\n await cursor(db, sessionRange(id, after + 1), r => {\n if (q.kinds && q.kinds.length && q.kinds.indexOf(r.kind) < 0) return true\n if (q.problems && !isProblem(r)) return true\n if (q.page && r.page !== q.page) return true\n if (q.from && r.at < q.from) return true\n if (q.to && r.at > q.to) return false\n if (text && JSON.stringify(r.data).toLowerCase().indexOf(text) < 0) return true\n if (q.hide && q.hide(r)) {\n hidden++\n return true\n }\n if (out.length >= limit) {\n more = true\n return false\n }\n out.push(r)\n return true\n })\n return {\n session: id,\n records: out.map(publicRecord),\n next: more && out.length ? out[out.length - 1].seq : null,\n hidden,\n }\n}\n\n/** One session at a glance: when, which pages, what went wrong. */\nexport async function overview(sessionId?: string) {\n await flush()\n const db = await needDb()\n const id = await resolveSession(db, sessionId)\n const meta = await get<SessionMeta>(db, 'sessions', id)\n const pages: { at: number; page: string; data: LogRecord['data'] }[] = []\n const problems: ReturnType<typeof publicRecord>[] = []\n let first = 0\n let last = 0\n await cursor(db, sessionRange(id), r => {\n if (!first) first = r.at\n last = r.at\n if (r.kind === 'page' && r.data.event !== 'visibility') pages.push({ at: r.at, page: r.page, data: r.data })\n if (isProblem(r)) {\n problems.push(publicRecord(r))\n if (problems.length > 20) problems.shift()\n }\n return true\n })\n return { session: { ...meta, current: id === session }, first, last, pages: pages.slice(-60), problems }\n}\n\n/** A full record, bodies and headers included. */\nexport async function recordDetail(seq: unknown) {\n await flush()\n const db = await needDb()\n const r = await get<LogRecord>(db, 'records', Number(seq))\n if (!r) throw rwdError('not_found', agentText().noSuchRecord(String(seq)))\n return { ...r }\n}\n\nfunction isProblem(r: LogRecord) {\n return (r.kind === 'console' && r.data.type === 'error') || (r.kind === 'net' && r.imp === 1)\n}\n\nfunction publicRecord(r: LogRecord) {\n const data: { [key: string]: any } = {}\n for (const key in r.data) {\n if (key === 'reqHeaders' || key === 'resHeaders' || key === 'reqBody' || key === 'resBody') continue\n data[key] = r.data[key]\n }\n if (r.data.reqBody || r.data.resBody) data.hasBody = true\n return { seq: r.seq, at: r.at, kind: r.kind, page: r.page, data }\n}\n\nasync function resolveSession(db: IDBDatabase, id?: string) {\n if (id && id !== 'current') {\n if (!(await get<SessionMeta>(db, 'sessions', id))) throw rwdError('not_found', agentText().noSuchSession(id))\n return id\n }\n if (session) return session\n const latest = (await getAll<SessionMeta>(db, 'sessions')).sort((a, b) => b.startedAt - a.startedAt)[0]\n if (!latest) throw rwdError('not_found', agentText().noSessionLog)\n return latest.id\n}\n\nasync function needDb() {\n const db = await openDb()\n if (!db) throw rwdError('internal', agentText().sessionLogUnavailable)\n return db\n}\n\n/* -------------------------------- IndexedDB ------------------------------- */\n\nfunction openDb(): Promise<IDBDatabase | null> {\n if (dbPromise) return dbPromise\n dbPromise = new Promise(resolve => {\n let req: IDBOpenDBRequest\n try {\n req = indexedDB.open(DB_NAME, 1)\n } catch (e) {\n resolve(null) // no IndexedDB (or blocked, e.g. some private modes)\n return\n }\n req.onupgradeneeded = () => {\n const db = req.result\n db.createObjectStore('sessions', { keyPath: 'id' })\n const records = db.createObjectStore('records', { keyPath: 'seq', autoIncrement: true })\n records.createIndex('bySession', ['session', 'seq'])\n records.createIndex('byImportance', ['session', 'imp'])\n }\n req.onsuccess = () => {\n const db = req.result\n db.onversionchange = () => db.close()\n openedDb = db\n resolve(db)\n }\n req.onerror = () => resolve(null)\n req.onblocked = () => resolve(null)\n })\n return dbPromise\n}\n\nfunction sessionRange(id: string, fromSeq = 0) {\n return IDBKeyRange.bound([id, fromSeq], [id, Number.MAX_SAFE_INTEGER])\n}\n\nfunction tx(db: IDBDatabase, stores: string[], mode: IDBTransactionMode, fn: (t: IDBTransaction) => void) {\n return new Promise<void>(resolve => {\n let t: IDBTransaction\n try {\n t = db.transaction(stores, mode)\n } catch (e) {\n resolve()\n return\n }\n t.oncomplete = () => resolve()\n t.onerror = () => resolve()\n t.onabort = () => resolve()\n fn(t)\n })\n}\n\nfunction get<T>(db: IDBDatabase, store: string, key: IDBValidKey) {\n return new Promise<T | undefined>(resolve => {\n void tx(db, [store], 'readonly', t => {\n const req = t.objectStore(store).get(key)\n req.onsuccess = () => resolve(req.result as T | undefined)\n req.onerror = () => resolve(undefined)\n })\n })\n}\n\nfunction getAll<T>(db: IDBDatabase, store: string) {\n return new Promise<T[]>(resolve => {\n void tx(db, [store], 'readonly', t => {\n const req = t.objectStore(store).getAll()\n req.onsuccess = () => resolve((req.result as T[]) || [])\n req.onerror = () => resolve([])\n })\n })\n}\n\nfunction put(db: IDBDatabase, store: string, value: unknown) {\n return tx(db, [store], 'readwrite', t => {\n t.objectStore(store).put(value)\n })\n}\n\n/** Walk a session's records in order; `visit` returns false to stop. */\nfunction cursor(db: IDBDatabase, range: IDBKeyRange, visit: (r: LogRecord) => boolean) {\n return tx(db, ['records'], 'readonly', t => {\n const req = t.objectStore('records').index('bySession').openCursor(range)\n req.onsuccess = () => {\n const c = req.result\n if (!c) return\n if (visit(c.value as LogRecord)) c.continue()\n }\n })\n}\n\nexport function newId() {\n const bytes = new Uint8Array(8)\n crypto.getRandomValues(bytes)\n return Array.prototype.map.call(bytes, (b: number) => (b < 16 ? '0' : '') + b.toString(16)).join('')\n}\n","import * as Runtime from '../../domains/Runtime'\nimport * as Network from '../../domains/Network'\nimport connector from '../../lib/connector'\nimport * as objManager from '../../lib/objManager'\nimport { BUFFER_LIMIT } from '../eventBuffer'\nimport { BODY_ENTRY_LIMIT } from '../bodyCache'\nimport { scrub, scrubPatterns } from '../privacy'\nimport { rwdError } from './errors'\nimport { agentText } from './i18n'\nimport { logRecord } from './coldlog'\n\n// Console, errors and network for the agent. chobitsu's Runtime and Network\n// domains do the hooking (console.*, uncaught errors, XHR, fetch, WebSocket,\n// sendBeacon, EventSource) from the moment the SDK loads; we enable them right\n// away, turn their CDP events into compact text entries and let go of the\n// objects they pinned, so the page keeps no extra references. Entries live in\n// bounded ring buffers: when full, plain logs (successful requests) go first,\n// errors and warnings (failed requests) are kept as long as possible.\n\nexport type EventKind = 'error' | 'net_fail' | 'user_tap' | 'console_error'\nexport type EmitEvent = (kind: EventKind, summary: string) => void\n\nexport interface ConsoleEntry {\n id: number\n type: string\n text: string\n at: number\n source?: string\n}\n\nexport interface NetworkEntry {\n id: number\n method: string\n url: string\n status: number\n type: string\n durationMs: number | null\n size: number\n error?: string\n at: number\n}\n\ninterface NetworkRecord extends NetworkEntry {\n requestId: string\n start: number\n reqHeaders: { [name: string]: string }\n resHeaders: { [name: string]: string }\n postData?: string\n /** Written to the session log (once, when it ends). */\n logged?: boolean\n}\n\nconst TEXT_LIMIT = 4000\nconst DEFAULT_LIMIT = 100\n\nclass Ring<T> {\n items: T[] = []\n dropped = 0\n constructor(private important: (item: T) => boolean, private limit = BUFFER_LIMIT) {}\n /** Adds an item; returns the one dropped to make room, if any. */\n push(item: T): T | undefined {\n this.items.push(item)\n if (this.items.length <= this.limit) return undefined\n let index = this.items.findIndex(it => !this.important(it))\n if (index < 0) index = 0\n this.dropped++\n return this.items.splice(index, 1)[0]\n }\n}\n\nconst consoleRing = new Ring<ConsoleEntry>(\n it => it.type === 'error' || it.type === 'warn'\n)\nconst networkRing = new Ring<NetworkRecord>(it => isFailed(it))\nconst byRequestId: { [id: string]: NetworkRecord } = {}\nlet consoleSeq = 0\nlet networkSeq = 0\nlet emit: EmitEvent = () => {}\nlet started = false\n\n/** Start collecting; safe to call more than once. */\nexport function startObserving(onEvent: EmitEvent) {\n emit = onEvent\n if (started) return\n started = true\n connector.on('message', (raw: string) => {\n let msg: { method: string; params: any }\n try {\n msg = JSON.parse(raw)\n } catch (e) {\n return\n }\n try {\n if (msg.method.indexOf('Network.') === 0) onNetwork(msg.method, msg.params)\n else onRuntime(msg.method, msg.params)\n } catch (e) {\n // Never let our bookkeeping break the page's console or requests.\n } finally {\n release(msg.params, 0)\n }\n })\n Runtime.enable()\n Network.enable()\n}\n\n/* --------------------------------- console -------------------------------- */\n\nconst CONSOLE_TYPES: { [cdp: string]: string } = {\n log: 'log',\n info: 'info',\n debug: 'debug',\n error: 'error',\n warning: 'warn',\n dir: 'log',\n table: 'log',\n trace: 'log',\n startGroup: 'log',\n startGroupCollapsed: 'log',\n}\n\nfunction onRuntime(method: string, params: any) {\n if (method === 'Runtime.consoleAPICalled') {\n const type = CONSOLE_TYPES[params.type]\n if (!type) return\n let text = formatArgs(params.args || [])\n if (params.type === 'startGroup' || params.type === 'startGroupCollapsed') {\n text = '▸ ' + text\n }\n addConsole(type, text, 'console', params.timestamp)\n if (type === 'error') emit('console_error', firstLine(text, 200))\n } else if (method === 'Runtime.exceptionThrown') {\n const details = params.exceptionDetails || {}\n const text = formatError(live(details.exception || {}))\n addConsole('error', 'Uncaught ' + text, 'exception', Date.now())\n emit('error', firstLine(text, 300))\n }\n}\n\nfunction addConsole(type: string, text: string, source: string, at?: number) {\n text = scrub(text)\n if (text.length > TEXT_LIMIT) text = text.slice(0, TEXT_LIMIT) + '…'\n logRecord('console', { type, text, source }, type === 'error' || type === 'warn')\n consoleRing.push({\n id: ++consoleSeq,\n type,\n text,\n at: Math.round(typeof at === 'number' ? at : Date.now()),\n source,\n })\n}\n\nexport function queryConsole(params: any = {}) {\n const types: string[] | undefined = Array.isArray(params.types) ? params.types : undefined\n // Patterns again: the project's rules may arrive after the text was captured.\n const messages = select(consoleRing.items, params, it => !types || types.indexOf(it.type) >= 0).map(it => {\n const copy = { ...it }\n copy.text = scrubPatterns(it.text)\n return copy\n })\n return { messages, dropped: consoleRing.dropped }\n}\n\n/* --------------------------------- network -------------------------------- */\n\nconst NETWORK_TYPES: { [cdp: string]: string } = {\n XHR: 'xhr',\n Fetch: 'fetch',\n Ping: 'beacon',\n EventSource: 'eventsource',\n}\n\nfunction isFailed(it: NetworkEntry) {\n return !!it.error || it.status >= 400\n}\n\nfunction onNetwork(method: string, p: any) {\n if (method === 'Network.requestWillBeSent' || method === 'Network.webSocketCreated') {\n const ws = method === 'Network.webSocketCreated'\n const request = p.request || {}\n const start = typeof p.timestamp === 'number' ? p.timestamp * 1000 : Date.now()\n const record: NetworkRecord = {\n id: ++networkSeq,\n method: ws ? 'GET' : String(request.method || 'GET').toUpperCase(),\n url: String(ws ? p.url : request.url),\n status: 0,\n type: ws ? 'websocket' : NETWORK_TYPES[p.type] || String(p.type || 'other').toLowerCase(),\n durationMs: null,\n size: 0,\n at: Math.round(start),\n requestId: p.requestId,\n start,\n reqHeaders: plainHeaders(request.headers),\n resHeaders: {},\n }\n if (typeof request.postData === 'string') record.postData = request.postData\n byRequestId[p.requestId] = record\n const dropped = networkRing.push(record)\n if (dropped) delete byRequestId[dropped.requestId]\n return\n }\n\n const record = byRequestId[p.requestId]\n if (!record) return\n const end = typeof p.timestamp === 'number' ? p.timestamp * 1000 : Date.now()\n switch (method) {\n case 'Network.responseReceivedExtraInfo':\n record.resHeaders = plainHeaders(p.headers)\n break\n case 'Network.responseReceived':\n record.status = (p.response && p.response.status) || 0\n if (p.response && p.response.headers) record.resHeaders = plainHeaders(p.response.headers)\n record.durationMs = Math.max(0, Math.round(end - record.start))\n if (record.status >= 400 && !isExcluded(record.url)) emit('net_fail', `${record.method} ${shortUrl(record.url)} → ${record.status}`)\n break\n case 'Network.loadingFinished':\n record.size = p.encodedDataLength || 0\n record.durationMs = Math.max(0, Math.round(end - record.start))\n logNetwork(record)\n break\n case 'Network.loadingFailed': {\n const error = p.errorText || agentText().requestFailed\n record.error = error\n record.durationMs = Math.max(0, Math.round(end - record.start))\n if (!isExcluded(record.url)) emit('net_fail', agentText().netFailed(`${record.method} ${shortUrl(record.url)}`, error))\n logNetwork(record)\n break\n }\n case 'Network.webSocketHandshakeResponseReceived':\n record.status = 101\n break\n case 'Network.webSocketClosed':\n record.durationMs = Math.max(0, Math.round(end - record.start))\n logNetwork(record)\n break\n case 'Network.webSocketFrameError':\n if (!record.error) {\n record.error = p.errorMessage || 'WebSocket error'\n if (!isExcluded(record.url)) emit('net_fail', agentText().wsFailed(shortUrl(record.url)))\n }\n break\n }\n}\n\nfunction publicEntry(r: NetworkRecord): NetworkEntry {\n const entry: NetworkEntry = {\n id: r.id,\n method: r.method,\n url: scrubPatterns(r.url),\n status: r.status,\n type: r.type,\n durationMs: r.durationMs,\n size: r.size,\n at: r.at,\n }\n if (r.error) entry.error = r.error\n return entry\n}\n\nexport function queryNetwork(params: any = {}) {\n const failedOnly = !!params.failedOnly\n const extra = toMatchers(params.exclude)\n const all = !!params.includeExcluded\n let hidden = 0\n const requests = select(networkRing.items, params, it => {\n if (failedOnly && !isFailed(it)) return false\n if (!all && (isExcluded(it.url) || matchesAny(extra, it.url))) {\n hidden++\n return false\n }\n return true\n }).map(publicEntry)\n return { requests, dropped: networkRing.dropped, hidden }\n}\n\n/* ------------------------------ exclude rules ----------------------------- */\n\n// Requests the agent does not want to wade through (fonts that always 404,\n// analytics beacons): left out of list_network_requests and of the timeline's\n// net_fail events, still recorded. Rules come from the project policy and\n// run({ networkExclude }); each is a case-insensitive substring of the URL, a\n// `*` wildcard pattern, or /regex/.\n\ntype Matcher = (url: string) => boolean\n\nlet excludeRules: Matcher[] = []\n\nexport function setNetworkExclude(rules: unknown) {\n excludeRules = toMatchers(rules)\n}\n\nfunction isExcluded(url: string) {\n return matchesAny(excludeRules, url)\n}\n\nfunction matchesAny(rules: Matcher[], url: string) {\n for (let i = 0; i < rules.length; i++) if (rules[i](url)) return true\n return false\n}\n\nfunction toMatchers(rules: unknown): Matcher[] {\n if (typeof rules === 'string') rules = [rules]\n if (!Array.isArray(rules)) return []\n const out: Matcher[] = []\n for (const raw of rules) {\n if (typeof raw !== 'string' || !raw.trim()) continue\n const rule = raw.trim()\n let re: RegExp | null = null\n try {\n if (rule.length > 2 && rule[0] === '/' && rule.lastIndexOf('/') > 0) {\n const end = rule.lastIndexOf('/')\n re = new RegExp(rule.slice(1, end), rule.slice(end + 1) || 'i')\n } else if (rule.indexOf('*') >= 0) {\n re = new RegExp(rule.split('*').map(escapeRegExp).join('.*'), 'i')\n }\n } catch {\n continue // an invalid regex excludes nothing\n }\n if (re) {\n const r = re\n out.push(url => r.test(url))\n } else {\n const needle = rule.toLowerCase()\n out.push(url => url.toLowerCase().indexOf(needle) >= 0)\n }\n }\n return out\n}\n\nfunction escapeRegExp(s: string) {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nconst REDACTED_HEADERS = /^(cookie|set-cookie|authorization|proxy-authorization)$/i\n\nfunction redact(headers: { [name: string]: string }) {\n const out: { [name: string]: string } = {}\n for (const name in headers) {\n out[name] = REDACTED_HEADERS.test(name) ? '••••' : headers[name]\n }\n return out\n}\n\nfunction clip(body: string) {\n body = scrub(body)\n return body.length > BODY_ENTRY_LIMIT ? body.slice(0, BODY_ENTRY_LIMIT) + '…' : body\n}\n\n/** A finished request for the session log; failed ones with headers and bodies. */\nfunction logNetwork(record: NetworkRecord) {\n if (record.logged) return\n record.logged = true\n const failed = isFailed(record)\n const data: { [key: string]: any } = {\n id: record.id,\n method: record.method,\n url: scrubPatterns(record.url),\n status: record.status,\n type: record.type,\n durationMs: record.durationMs,\n size: record.size,\n }\n if (record.error) data.error = record.error\n if (failed) {\n data.reqHeaders = redact(record.reqHeaders)\n data.resHeaders = redact(record.resHeaders)\n if (record.postData) data.reqBody = clip(record.postData)\n try {\n const body = Network.getResponseBody({ requestId: record.requestId }).body\n if (typeof body === 'string' && body) data.resBody = clip(body)\n } catch (e) {\n // No body cached.\n }\n }\n logRecord('net', data, failed)\n}\n\n/** Whether the exclude rules (plus `extra`) hide a request URL. */\nexport function networkHidden(url: string, extra?: unknown) {\n return isExcluded(url) || (!!extra && matchesAny(toMatchers(extra), url))\n}\n\nexport function networkDetail(params: any = {}) {\n const id = Number(params.id)\n let record: NetworkRecord | undefined\n for (const it of networkRing.items) if (it.id === id) record = it\n if (!record) throw rwdError('not_found', agentText().noSuchRequest(String(params.id)))\n\n const request: { headers: { [name: string]: string }; body?: string } = {\n headers: redact(record.reqHeaders),\n }\n if (record.postData) request.body = clip(record.postData)\n const response: { headers: { [name: string]: string }; body?: string } = {\n headers: redact(record.resHeaders),\n }\n const body = Network.getResponseBody({ requestId: record.requestId }).body\n if (typeof body === 'string' && body) response.body = clip(body)\n return { request, response }\n}\n\n/* --------------------------------- helpers -------------------------------- */\n\nfunction select<T extends { id: number }>(items: T[], params: any, match: (it: T) => boolean): T[] {\n const sinceId = typeof params.sinceId === 'number' ? params.sinceId : Number(params.sinceId)\n const hasSince = params.sinceId !== undefined && params.sinceId !== null && !isNaN(sinceId)\n let limit = Number(params.limit) || DEFAULT_LIMIT\n limit = Math.max(1, Math.min(BUFFER_LIMIT, limit))\n const list = items.filter(it => (!hasSince || it.id > sinceId) && match(it))\n // Paging forward from sinceId returns the oldest first; otherwise the latest.\n return hasSince ? list.slice(0, limit) : list.slice(-limit)\n}\n\nfunction plainHeaders(headers: any): { [name: string]: string } {\n const out: { [name: string]: string } = {}\n if (!headers || typeof headers !== 'object') return out\n if (Array.isArray(headers)) {\n for (const pair of headers) if (pair && pair.length >= 2) out[String(pair[0])] = String(pair[1])\n return out\n }\n for (const name in headers) {\n if (typeof headers[name] !== 'function') out[name] = String(headers[name])\n }\n return out\n}\n\nfunction shortUrl(url: string) {\n try {\n const u = new URL(url, location.href)\n return u.origin === location.origin ? u.pathname : u.host + u.pathname\n } catch (e) {\n return url.split('?')[0]\n }\n}\n\nfunction firstLine(text: string, max: number) {\n const line = text.split('\\n')[0]\n return line.length > max ? line.slice(0, max) + '…' : line\n}\n\n/** Release every objectId the event pinned in objManager. */\nfunction release(value: any, depth: number) {\n if (!value || typeof value !== 'object' || depth > 6) return\n if (typeof value.objectId === 'string') {\n try {\n objManager.releaseObj(value.objectId)\n } catch (e) {\n // Already released.\n }\n }\n for (const key in value) release(value[key], depth + 1)\n}\n\n/** The live value behind a RemoteObject (still pinned while we format it). */\nfunction live(ro: any): any {\n if (!ro || typeof ro !== 'object') return ro\n if (typeof ro.objectId === 'string') {\n const obj = objManager.getObj(ro.objectId)\n if (obj !== undefined) return obj\n }\n if ('value' in ro) return ro.value\n if (ro.unserializableValue) return ro.unserializableValue\n if (ro.type === 'undefined') return undefined\n return ro.description\n}\n\nfunction formatArgs(args: any[]): string {\n const values = args.map(live)\n const parts: string[] = []\n let i = 0\n if (typeof values[0] === 'string' && values[0].indexOf('%') >= 0) {\n i = 1\n parts.push(\n values[0].replace(/%([sdifoOc%])/g, (m: string, f: string) => {\n if (f === '%') return '%'\n if (i >= values.length) return m\n const v = values[i++]\n switch (f) {\n case 's':\n return typeof v === 'string' ? v : formatValue(v, 1)\n case 'd':\n case 'i':\n return String(parseInt(v, 10))\n case 'f':\n return String(parseFloat(v))\n case 'c':\n return ''\n default:\n return formatValue(v, 1)\n }\n })\n )\n }\n for (; i < values.length; i++) {\n parts.push(typeof values[i] === 'string' ? values[i] : formatValue(values[i], 0))\n }\n return parts.join(' ')\n}\n\nfunction formatError(err: any): string {\n if (err && typeof err === 'object' && 'message' in err) {\n const head = `${err.name || 'Error'}: ${err.message}`\n let stack = typeof err.stack === 'string' ? err.stack : ''\n // V8 stacks start with the message; WebKit stacks are frames only.\n if (stack.indexOf(head) === 0) stack = stack.slice(head.length)\n const frames = stack\n .split('\\n')\n .map((l: string) => l.trim())\n .filter((l: string) => !!l)\n .slice(0, 10)\n return frames.length ? head + '\\n ' + frames.join('\\n ') : head\n }\n return '(in promise) ' + formatValue(err, 0)\n}\n\nfunction formatValue(v: any, depth: number, seen: any[] = []): string {\n const type = typeof v\n if (v === null) return 'null'\n if (type === 'undefined') return 'undefined'\n if (type === 'string') return depth ? JSON.stringify(v.length > 200 ? v.slice(0, 200) + '…' : v) : v\n if (type === 'number' || type === 'boolean' || type === 'symbol') return String(v)\n if (type === 'bigint') return String(v) + 'n'\n if (type === 'function') return `ƒ ${v.name || 'anonymous'}()`\n try {\n if (v instanceof Error) return depth ? `${v.name}: ${v.message}` : formatError(v)\n if (typeof Element !== 'undefined' && v instanceof Element) return describeElement(v)\n if (typeof Node !== 'undefined' && v instanceof Node) return `#${v.nodeName.toLowerCase()}`\n if (v instanceof Date) return isNaN(v.getTime()) ? 'Invalid Date' : v.toISOString()\n if (v instanceof RegExp) return String(v)\n if (seen.indexOf(v) >= 0) return '[Circular]'\n if (depth > 2) return Array.isArray(v) ? `Array(${v.length})` : '{…}'\n seen.push(v)\n const items: string[] = []\n const MAX = 20\n if (Array.isArray(v)) {\n for (let i = 0; i < Math.min(v.length, MAX); i++) items.push(formatValue(v[i], depth + 1, seen))\n if (v.length > MAX) items.push(`…${v.length - MAX} more`)\n return `[${items.join(', ')}]`\n }\n if (typeof Map !== 'undefined' && v instanceof Map) {\n v.forEach((val: any, key: any) => {\n if (items.length < MAX) items.push(`${formatValue(key, depth + 1, seen)} => ${formatValue(val, depth + 1, seen)}`)\n })\n return `Map(${v.size}) {${items.join(', ')}}`\n }\n if (typeof Set !== 'undefined' && v instanceof Set) {\n v.forEach((val: any) => {\n if (items.length < MAX) items.push(formatValue(val, depth + 1, seen))\n })\n return `Set(${v.size}) {${items.join(', ')}}`\n }\n const keys = Object.keys(v)\n for (let i = 0; i < Math.min(keys.length, MAX); i++) {\n let val: string\n try {\n val = formatValue(v[keys[i]], depth + 1, seen)\n } catch (e) {\n val = '(…)'\n }\n items.push(`${keys[i]}: ${val}`)\n }\n if (keys.length > MAX) items.push('…')\n const ctor = v.constructor && v.constructor.name\n const prefix = ctor && ctor !== 'Object' ? ctor + ' ' : ''\n return `${prefix}{${items.join(', ')}}`\n } catch (e) {\n return Object.prototype.toString.call(v)\n }\n}\n\nfunction describeElement(el: Element) {\n let s = el.tagName.toLowerCase()\n if (el.id) s += '#' + el.id\n const cls = typeof el.className === 'string' ? el.className.trim() : ''\n if (cls) s += '.' + cls.split(/\\s+/).join('.')\n return `<${s}>`\n}\n","(function(y,v){typeof exports==\"object\"&&typeof module!=\"undefined\"?v(exports):typeof define==\"function\"&&define.amd?define([\"exports\"],v):(y=typeof globalThis!=\"undefined\"?globalThis:y||self,v(y.modernScreenshot={}))})(this,function(y){\"use strict\";var rr=Object.defineProperty,nr=Object.defineProperties;var or=Object.getOwnPropertyDescriptors;var Z=Object.getOwnPropertySymbols;var xe=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var Oe=Math.pow,Le=(y,v,N)=>v in y?rr(y,v,{enumerable:!0,configurable:!0,writable:!0,value:N}):y[v]=N,D=(y,v)=>{for(var N in v||(v={}))xe.call(v,N)&&Le(y,N,v[N]);if(Z)for(var N of Z(v))Me.call(v,N)&&Le(y,N,v[N]);return y},M=(y,v)=>nr(y,or(v));var je=(y,v)=>{var N={};for(var R in y)xe.call(y,R)&&v.indexOf(R)<0&&(N[R]=y[R]);if(y!=null&&Z)for(var R of Z(y))v.indexOf(R)<0&&Me.call(y,R)&&(N[R]=y[R]);return N};var C=(y,v,N)=>new Promise((R,O)=>{var X=P=>{try{q(N.next(P))}catch(W){O(W)}},j=P=>{try{q(N.throw(P))}catch(W){O(W)}},q=P=>P.done?R(P.value):Promise.resolve(P.value).then(X,j);q((N=N.apply(y,v)).next())});var Be;function v(e,t){return e[13]=1,e[14]=t>>8,e[15]=t&255,e[16]=t>>8,e[17]=t&255,e}const N=112,R=72,O=89,X=115;let j;function q(){const e=new Int32Array(256);for(let t=0;t<256;t++){let r=t;for(let n=0;n<8;n++)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r}return e}function P(e){let t=-1;j||(j=q());for(let r=0;r<e.length;r++)t=j[(t^e[r])&255]^t>>>8;return t^-1}function W(e){const t=e.length-1;for(let r=t;r>=4;r--)if(e[r-4]===9&&e[r-3]===N&&e[r-2]===R&&e[r-1]===O&&e[r]===X)return r-3;return 0}function ae(e,t,r=!1){const n=new Uint8Array(13);t*=39.3701,n[0]=N,n[1]=R,n[2]=O,n[3]=X,n[4]=t>>>24,n[5]=t>>>16,n[6]=t>>>8,n[7]=t&255,n[8]=n[4],n[9]=n[5],n[10]=n[6],n[11]=n[7],n[12]=1;const i=P(n),a=new Uint8Array(4);if(a[0]=i>>>24,a[1]=i>>>16,a[2]=i>>>8,a[3]=i&255,r){const s=W(e);return e.set(n,s),e.set(a,s+13),e}else{const s=new Uint8Array(4);s[0]=0,s[1]=0,s[2]=0,s[3]=9;const o=new Uint8Array(54);return o.set(e,0),o.set(s,33),o.set(n,37),o.set(a,50),o}}const qe=\"AAlwSFlz\",We=\"AAAJcEhZ\",He=\"AAAACXBI\";function Ve(e){let t=e.indexOf(qe);return t===-1&&(t=e.indexOf(We)),t===-1&&(t=e.indexOf(He)),t}const se=\"[modern-screenshot]\",U=typeof window!=\"undefined\",ze=U&&\"Worker\"in window,ie=U&&\"atob\"in window,Xe=U&&\"btoa\"in window,ee=U?(Be=window.navigator)==null?void 0:Be.userAgent:\"\",le=ee.includes(\"Chrome\"),G=ee.includes(\"AppleWebKit\")&&!le,te=ee.includes(\"Firefox\"),Ge=e=>e&&\"__CONTEXT__\"in e,Ye=e=>e.constructor.name===\"CSSFontFaceRule\",Je=e=>e.constructor.name===\"CSSImportRule\",Ke=e=>e.constructor.name===\"CSSLayerBlockRule\",I=e=>e.nodeType===1,H=e=>typeof e.className==\"object\",ce=e=>e.tagName===\"image\",Qe=e=>e.tagName===\"use\",V=e=>I(e)&&typeof e.style!=\"undefined\"&&!H(e),Ze=e=>e.nodeType===8,et=e=>e.nodeType===3,$=e=>e.tagName===\"IMG\",Y=e=>e.tagName===\"VIDEO\",tt=e=>e.tagName===\"CANVAS\",rt=e=>e.tagName===\"TEXTAREA\",nt=e=>e.tagName===\"INPUT\",ot=e=>e.tagName===\"STYLE\",at=e=>e.tagName===\"SCRIPT\",st=e=>e.tagName===\"SELECT\",it=e=>e.tagName===\"SLOT\",lt=e=>e.tagName===\"IFRAME\",ct=(...e)=>console.warn(se,...e);function ut(e){var r;const t=(r=e==null?void 0:e.createElement)==null?void 0:r.call(e,\"canvas\");return t&&(t.height=t.width=1),!!t&&\"toDataURL\"in t&&!!t.toDataURL(\"image/webp\").includes(\"image/webp\")}const re=e=>e.startsWith(\"data:\");function ue(e,t){if(e.match(/^[a-z]+:\\/\\//i))return e;if(U&&e.match(/^\\/\\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i)||!U)return e;const r=J().implementation.createHTMLDocument(),n=r.createElement(\"base\"),i=r.createElement(\"a\");return r.head.appendChild(n),r.body.appendChild(i),t&&(n.href=t),i.href=e,i.href}function J(e){var t;return(t=e&&I(e)?e==null?void 0:e.ownerDocument:e)!=null?t:window.document}const K=\"http://www.w3.org/2000/svg\";function fe(e,t,r){const n=J(r).createElementNS(K,\"svg\");return n.setAttributeNS(null,\"width\",e.toString()),n.setAttributeNS(null,\"height\",t.toString()),n.setAttributeNS(null,\"viewBox\",`0 0 ${e} ${t}`),n}function de(e,t){let r=new XMLSerializer().serializeToString(e);return t&&(r=r.replace(/[\\u0000-\\u0008\\v\\f\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu,\"\")),`data:image/svg+xml;charset=utf-8,${encodeURIComponent(r)}`}function ft(e,t=\"image/png\",r=1){return C(this,null,function*(){try{return yield new Promise((n,i)=>{e.toBlob(a=>{a?n(a):i(new Error(\"Blob is null\"))},t,r)})}catch(n){if(ie)return dt(e.toDataURL(t,r));throw n}})}function dt(e){var o,c;const[t,r]=e.split(\",\"),n=(c=(o=t.match(/data:(.+);/))==null?void 0:o[1])!=null?c:void 0,i=window.atob(r),a=i.length,s=new Uint8Array(a);for(let u=0;u<a;u+=1)s[u]=i.charCodeAt(u);return new Blob([s],{type:n})}function ge(e,t){return new Promise((r,n)=>{const i=new FileReader;i.onload=()=>r(i.result),i.onerror=()=>n(i.error),i.onabort=()=>n(new Error(`Failed read blob to ${t}`)),t===\"dataUrl\"?i.readAsDataURL(e):t===\"arrayBuffer\"&&i.readAsArrayBuffer(e)})}const gt=e=>ge(e,\"dataUrl\"),mt=e=>ge(e,\"arrayBuffer\");function _(e,t){const r=J(t).createElement(\"img\");return r.decoding=\"sync\",r.loading=\"eager\",r.src=e,r}function L(e,t){return new Promise(r=>{const{timeout:n,ownerDocument:i,onError:a,onWarn:s}=t!=null?t:{},o=typeof e==\"string\"?_(e,J(i)):e;let c=null,u=null;function l(){r(o),c&&clearTimeout(c),u==null||u()}if(n&&(c=setTimeout(l,n)),Y(o)){const d=o.currentSrc||o.src;if(!d)return o.poster?L(o.poster,t).then(r):l();if(o.readyState>=2)return l();const m=l,f=h=>{s==null||s(\"Failed video load\",d,h),a==null||a(h),l()};u=()=>{o.removeEventListener(\"loadeddata\",m),o.removeEventListener(\"error\",f)},o.addEventListener(\"loadeddata\",m,{once:!0}),o.addEventListener(\"error\",f,{once:!0})}else{const d=ce(o)?o.href.baseVal:o.currentSrc||o.src;if(!d)return l();const m=()=>C(this,null,function*(){if($(o)&&\"decode\"in o)try{yield o.decode()}catch(h){s==null||s(\"Failed to decode image, trying to render anyway\",o.dataset.originalSrc||d,h)}l()}),f=h=>{s==null||s(\"Failed image load\",o.dataset.originalSrc||d,h),l()};if($(o)&&o.complete)return m();u=()=>{o.removeEventListener(\"load\",m),o.removeEventListener(\"error\",f)},o.addEventListener(\"load\",m,{once:!0}),o.addEventListener(\"error\",f,{once:!0})}})}function me(e,t){return C(this,null,function*(){V(e)&&($(e)||Y(e)?yield L(e,t):yield Promise.all([\"img\",\"video\"].flatMap(r=>Array.from(e.querySelectorAll(r)).map(n=>L(n,t)))))})}const he=function(){let t=0;const r=()=>`0000${(Math.random()*Oe(36,4)<<0).toString(36)}`.slice(-4);return()=>(t+=1,`u${r()}${t}`)}();function we(e){return e==null?void 0:e.split(\",\").map(t=>t.trim().replace(/\"|'/g,\"\").toLowerCase()).filter(Boolean)}let pe=0;function ht(e){const t=`${se}[#${pe}]`;return pe++,{time:r=>e&&console.time(`${t} ${r}`),timeEnd:r=>e&&console.timeEnd(`${t} ${r}`),warn:(...r)=>e&&ct(...r)}}function wt(e){return{cache:e?\"no-cache\":\"force-cache\"}}function k(e,t){return C(this,null,function*(){return Ge(e)?e:ye(e,M(D({},t),{autoDestruct:!0}))})}function ye(e,t){return C(this,null,function*(){var f,h,g,p,E;const{scale:r=1,workerUrl:n,workerNumber:i=1}=t||{},a=!!(t!=null&&t.debug),s=(f=t==null?void 0:t.features)!=null?f:!0,o=(h=e.ownerDocument)!=null?h:U?window.document:void 0,c=(p=(g=e.ownerDocument)==null?void 0:g.defaultView)!=null?p:U?window:void 0,u=new Map,l=M(D({width:0,height:0,quality:1,type:\"image/png\",scale:r,backgroundColor:null,style:null,filter:null,maximumCanvasSize:0,timeout:3e4,progress:null,debug:a,fetch:D({requestInit:wt((E=t==null?void 0:t.fetch)==null?void 0:E.bypassingCache),placeholderImage:\"data:image/png;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\",bypassingCache:!1},t==null?void 0:t.fetch),fetchFn:null,font:{},drawImageInterval:100,workerUrl:null,workerNumber:i,onCloneEachNode:null,onCloneNode:null,onEmbedNode:null,onCreateForeignObjectSvg:null,includeStyleProperties:null,autoDestruct:!1},t),{__CONTEXT__:!0,log:ht(a),node:e,ownerDocument:o,ownerWindow:c,dpi:r===1?null:96*r,svgStyleElement:be(o),svgDefsElement:o==null?void 0:o.createElementNS(K,\"defs\"),svgStyles:new Map,defaultComputedStyles:new Map,workers:[...Array.from({length:ze&&n&&i?i:0})].map(()=>{try{const b=new Worker(n);return b.onmessage=w=>C(this,null,function*(){var A,F,B,$e;const{url:S,result:T}=w.data;T?(F=(A=u.get(S))==null?void 0:A.resolve)==null||F.call(A,T):($e=(B=u.get(S))==null?void 0:B.reject)==null||$e.call(B,new Error(`Error receiving message from worker: ${S}`))}),b.onmessageerror=w=>{var T,A;const{url:S}=w.data;(A=(T=u.get(S))==null?void 0:T.reject)==null||A.call(T,new Error(`Error receiving message from worker: ${S}`))},b}catch(b){return l.log.warn(\"Failed to new Worker\",b),null}}).filter(Boolean),fontFamilies:new Map,fontCssTexts:new Map,acceptOfImage:`${[ut(o)&&\"image/webp\",\"image/svg+xml\",\"image/*\",\"*/*\"].filter(Boolean).join(\",\")};q=0.8`,requests:u,drawImageCount:0,tasks:[],features:s,isEnable:b=>{var w,S;return b===\"restoreScrollPosition\"?typeof s==\"boolean\"?!1:(w=s[b])!=null?w:!1:typeof s==\"boolean\"?s:(S=s[b])!=null?S:!0},shadowRoots:[]});l.log.time(\"wait until load\"),yield me(e,{timeout:l.timeout,onWarn:l.log.warn}),l.log.timeEnd(\"wait until load\");const{width:d,height:m}=pt(e,l);return l.width=d,l.height=m,l})}function be(e){if(!e)return;const t=e.createElement(\"style\"),r=t.ownerDocument.createTextNode(`\n.______background-clip--text {\n background-clip: text;\n -webkit-background-clip: text;\n}\n`);return t.appendChild(r),t}function pt(e,t){let{width:r,height:n}=t;if(I(e)&&(!r||!n)){const i=e.getBoundingClientRect();r=r||i.width||Number(e.getAttribute(\"width\"))||0,n=n||i.height||Number(e.getAttribute(\"height\"))||0}return{width:r,height:n}}function yt(e,t){return C(this,null,function*(){const{log:r,timeout:n,drawImageCount:i,drawImageInterval:a}=t;r.time(\"image to canvas\");const s=yield L(e,{timeout:n,onWarn:t.log.warn}),{canvas:o,context2d:c}=bt(e.ownerDocument,t),u=()=>{try{c==null||c.drawImage(s,0,0,o.width,o.height)}catch(l){t.log.warn(\"Failed to drawImage\",l)}};if(u(),t.isEnable(\"fixSvgXmlDecode\"))for(let l=0;l<i;l++)yield new Promise(d=>{setTimeout(()=>{c==null||c.clearRect(0,0,o.width,o.height),u(),d()},l+a)});return t.drawImageCount=0,r.timeEnd(\"image to canvas\"),o})}function bt(e,t){const{width:r,height:n,scale:i,backgroundColor:a,maximumCanvasSize:s}=t,o=e.createElement(\"canvas\");o.width=Math.floor(r*i),o.height=Math.floor(n*i),o.style.width=`${r}px`,o.style.height=`${n}px`,s&&(o.width>s||o.height>s)&&(o.width>s&&o.height>s?o.width>o.height?(o.height*=s/o.width,o.width=s):(o.width*=s/o.height,o.height=s):o.width>s?(o.height*=s/o.width,o.width=s):(o.width*=s/o.height,o.height=s));const c=o.getContext(\"2d\");return c&&a&&(c.fillStyle=a,c.fillRect(0,0,o.width,o.height)),{canvas:o,context2d:c}}function Se(e,t){if(e.ownerDocument)try{const a=e.toDataURL();if(a!==\"data:,\")return _(a,e.ownerDocument)}catch(a){t.log.warn(\"Failed to clone canvas\",a)}const r=e.cloneNode(!1),n=e.getContext(\"2d\"),i=r.getContext(\"2d\");try{return n&&i&&i.putImageData(n.getImageData(0,0,e.width,e.height),0,0),r}catch(a){t.log.warn(\"Failed to clone canvas\",a)}return r}function St(e,t){var r;try{if((r=e==null?void 0:e.contentDocument)!=null&&r.documentElement)return ne(e.contentDocument.documentElement,t)}catch(n){t.log.warn(\"Failed to clone iframe\",n)}return e.cloneNode(!1)}function Et(e){const t=e.cloneNode(!1);return e.currentSrc&&e.currentSrc!==e.src&&(t.src=e.currentSrc,t.srcset=\"\"),t.loading===\"lazy\"&&(t.loading=\"eager\"),t}function Ct(e,t){return C(this,null,function*(){if(e.ownerDocument&&!e.currentSrc&&e.poster)return _(e.poster,e.ownerDocument);const r=e.cloneNode(!1);r.crossOrigin=\"anonymous\",e.currentSrc&&e.currentSrc!==e.src&&(r.src=e.currentSrc);const n=r.ownerDocument;if(n){let i=!0;if(yield L(r,{onError:()=>i=!1,onWarn:t.log.warn}),!i)return e.poster?_(e.poster,e.ownerDocument):r;r.currentTime=e.currentTime,yield new Promise(s=>{r.addEventListener(\"seeked\",s,{once:!0})});const a=n.createElement(\"canvas\");a.width=e.offsetWidth,a.height=e.offsetHeight;try{const s=a.getContext(\"2d\");s&&s.drawImage(r,0,0,a.width,a.height)}catch(s){return t.log.warn(\"Failed to clone video\",s),e.poster?_(e.poster,e.ownerDocument):r}return Se(a,t)}return r})}function Tt(e,t){return tt(e)?Se(e,t):lt(e)?St(e,t):$(e)?Et(e):Y(e)?Ct(e,t):e.cloneNode(!1)}function vt(e){let t=e.sandbox;if(!t){const{ownerDocument:r}=e;try{r&&(t=r.createElement(\"iframe\"),t.id=`__SANDBOX__${he()}`,t.width=\"0\",t.height=\"0\",t.style.visibility=\"hidden\",t.style.position=\"fixed\",r.body.appendChild(t),t.srcdoc='<!DOCTYPE html><meta charset=\"UTF-8\"><title></title><body>',e.sandbox=t)}catch(n){e.log.warn(\"Failed to getSandBox\",n)}}return t}const At=[\"width\",\"height\",\"-webkit-text-fill-color\"],Nt=[\"stroke\",\"fill\"];function Ee(e,t,r){const{defaultComputedStyles:n}=r,i=e.nodeName.toLowerCase(),a=H(e)&&i!==\"svg\",s=a?Nt.map(g=>[g,e.getAttribute(g)]).filter(([,g])=>g!==null):[],o=[a&&\"svg\",i,s.map((g,p)=>`${g}=${p}`).join(\",\"),t].filter(Boolean).join(\":\");if(n.has(o))return n.get(o);const c=vt(r),u=c==null?void 0:c.contentWindow;if(!u)return new Map;const l=u==null?void 0:u.document;let d,m;a?(d=l.createElementNS(K,\"svg\"),m=d.ownerDocument.createElementNS(d.namespaceURI,i),s.forEach(([g,p])=>{m.setAttributeNS(null,g,p)}),d.appendChild(m)):d=m=l.createElement(i),m.textContent=\" \",l.body.appendChild(d);const f=u.getComputedStyle(m,t),h=new Map;for(let g=f.length,p=0;p<g;p++){const E=f.item(p);At.includes(E)||h.set(E,f.getPropertyValue(E))}return l.body.removeChild(d),n.set(o,h),h}function Ce(e,t,r){var o;const n=new Map,i=[],a=new Map;if(r)for(const c of r)s(c);else for(let c=e.length,u=0;u<c;u++){const l=e.item(u);s(l)}for(let c=i.length,u=0;u<c;u++)(o=a.get(i[u]))==null||o.forEach((l,d)=>n.set(d,l));function s(c){const u=e.getPropertyValue(c),l=e.getPropertyPriority(c),d=c.lastIndexOf(\"-\"),m=d>-1?c.substring(0,d):void 0;if(m){let f=a.get(m);f||(f=new Map,a.set(m,f)),f.set(c,[u,l])}t.get(c)===u&&!l||(m?i.push(m):n.set(c,[u,l]))}return n}function Rt(e,t,r,n){var d,m,f,h;const{ownerWindow:i,includeStyleProperties:a,currentParentNodeStyle:s}=n,o=t.style,c=i.getComputedStyle(e),u=Ee(e,null,n);s==null||s.forEach((g,p)=>{u.delete(p)});const l=Ce(c,u,a);l.delete(\"transition-property\"),l.delete(\"all\"),l.delete(\"d\"),l.delete(\"content\"),r&&(l.delete(\"position\"),l.delete(\"margin-top\"),l.delete(\"margin-right\"),l.delete(\"margin-bottom\"),l.delete(\"margin-left\"),l.delete(\"margin-block-start\"),l.delete(\"margin-block-end\"),l.delete(\"margin-inline-start\"),l.delete(\"margin-inline-end\"),l.set(\"box-sizing\",[\"border-box\",\"\"])),((d=l.get(\"background-clip\"))==null?void 0:d[0])===\"text\"&&t.classList.add(\"______background-clip--text\"),le&&(l.has(\"font-kerning\")||l.set(\"font-kerning\",[\"normal\",\"\"]),(((m=l.get(\"overflow-x\"))==null?void 0:m[0])===\"hidden\"||((f=l.get(\"overflow-y\"))==null?void 0:f[0])===\"hidden\")&&((h=l.get(\"text-overflow\"))==null?void 0:h[0])===\"ellipsis\"&&e.scrollWidth===e.clientWidth&&l.set(\"text-overflow\",[\"clip\",\"\"]));for(let g=o.length,p=0;p<g;p++)o.removeProperty(o.item(p));return l.forEach(([g,p],E)=>{o.setProperty(E,g,p)}),l}function It(e,t){(rt(e)||nt(e)||st(e))&&t.setAttribute(\"value\",e.value)}const kt=[\"::before\",\"::after\"],Dt=[\"::-webkit-scrollbar\",\"::-webkit-scrollbar-button\",\"::-webkit-scrollbar-thumb\",\"::-webkit-scrollbar-track\",\"::-webkit-scrollbar-track-piece\",\"::-webkit-scrollbar-corner\",\"::-webkit-resizer\"];function Pt(e,t,r,n,i){const{ownerWindow:a,svgStyleElement:s,svgStyles:o,currentNodeStyle:c}=n;if(!s||!a)return;function u(l){var w;const d=a.getComputedStyle(e,l);let m=d.getPropertyValue(\"content\");if(!m||m===\"none\")return;i==null||i(m),m=m.replace(/(')|(\")|(counter\\(.+\\))/g,\"\");const f=[he()],h=Ee(e,l,n);c==null||c.forEach((S,T)=>{h.delete(T)});const g=Ce(d,h,n.includeStyleProperties);g.delete(\"content\"),g.delete(\"-webkit-locale\"),((w=g.get(\"background-clip\"))==null?void 0:w[0])===\"text\"&&t.classList.add(\"______background-clip--text\");const p=[`content: '${m}';`];if(g.forEach(([S,T],A)=>{p.push(`${A}: ${S}${T?\" !important\":\"\"};`)}),p.length===1)return;try{t.className=[t.className,...f].join(\" \")}catch(S){n.log.warn(\"Failed to copyPseudoClass\",S);return}const E=p.join(`\n `);let b=o.get(E);b||(b=[],o.set(E,b)),b.push(`.${f[0]}${l}`)}kt.forEach(u),r&&Dt.forEach(u)}const Te=new Set([\"symbol\"]);function ve(e,t,r,n,i){return C(this,null,function*(){if(I(r)&&(ot(r)||at(r))||n.filter&&!n.filter(r))return;Te.has(t.nodeName)||Te.has(r.nodeName)?n.currentParentNodeStyle=void 0:n.currentParentNodeStyle=n.currentNodeStyle;const a=yield ne(r,n,!1,i);n.isEnable(\"restoreScrollPosition\")&&Ut(e,a),t.appendChild(a)})}function Ae(e,t,r,n){return C(this,null,function*(){var a;let i=e.firstChild;I(e)&&e.shadowRoot&&(i=(a=e.shadowRoot)==null?void 0:a.firstChild,r.shadowRoots.push(e.shadowRoot));for(let s=i;s;s=s.nextSibling)if(!Ze(s))if(I(s)&&it(s)&&typeof s.assignedNodes==\"function\"){const o=s.assignedNodes();for(let c=0;c<o.length;c++)yield ve(e,t,o[c],r,n)}else yield ve(e,t,s,r,n)})}function Ut(e,t){if(!V(e)||!V(t))return;const{scrollTop:r,scrollLeft:n}=e;if(!r&&!n)return;const{transform:i}=t.style,a=new DOMMatrix(i),{a:s,b:o,c,d:u}=a;a.a=1,a.b=0,a.c=0,a.d=1,a.translateSelf(-n,-r),a.a=s,a.b=o,a.c=c,a.d=u,t.style.transform=a.toString()}function _t(e,t){const{backgroundColor:r,width:n,height:i,style:a}=t,s=e.style;if(r&&s.setProperty(\"background-color\",r,\"important\"),n&&s.setProperty(\"width\",`${n}px`,\"important\"),i&&s.setProperty(\"height\",`${i}px`,\"important\"),a)for(const o in a)s[o]=a[o]}const Ft=/^[\\w-:]+$/;function ne(e,t,r=!1,n){return C(this,null,function*(){var u,l,d,m;const{ownerDocument:i,ownerWindow:a,fontFamilies:s,onCloneEachNode:o}=t;if(i&&et(e))return n&&/\\S/.test(e.data)&&n(e.data),i.createTextNode(e.data);if(i&&a&&I(e)&&(V(e)||H(e))){const f=yield Tt(e,t);if(t.isEnable(\"removeAbnormalAttributes\")){const w=f.getAttributeNames();for(let S=w.length,T=0;T<S;T++){const A=w[T];Ft.test(A)||f.removeAttribute(A)}}const h=t.currentNodeStyle=Rt(e,f,r,t);r&&_t(f,t);let g=!1;if(t.isEnable(\"copyScrollbar\")){const w=[(u=h.get(\"overflow-x\"))==null?void 0:u[0],(l=h.get(\"overflow-y\"))==null?void 0:l[0]];g=w.includes(\"scroll\")||(w.includes(\"auto\")||w.includes(\"overlay\"))&&(e.scrollHeight>e.clientHeight||e.scrollWidth>e.clientWidth)}const p=(d=h.get(\"text-transform\"))==null?void 0:d[0],E=we((m=h.get(\"font-family\"))==null?void 0:m[0]),b=E?w=>{p===\"uppercase\"?w=w.toUpperCase():p===\"lowercase\"?w=w.toLowerCase():p===\"capitalize\"&&(w=w[0].toUpperCase()+w.substring(1)),E.forEach(S=>{let T=s.get(S);T||s.set(S,T=new Set),w.split(\"\").forEach(A=>T.add(A))})}:void 0;return Pt(e,f,g,t,b),It(e,f),Y(e)||(yield Ae(e,f,t,b)),yield o==null?void 0:o(f),f}const c=e.cloneNode(!1);return yield Ae(e,c,t),yield o==null?void 0:o(c),c})}function Ne(e){if(e.ownerDocument=void 0,e.ownerWindow=void 0,e.svgStyleElement=void 0,e.svgDefsElement=void 0,e.svgStyles.clear(),e.defaultComputedStyles.clear(),e.sandbox){try{e.sandbox.remove()}catch(t){e.log.warn(\"Failed to destroyContext\",t)}e.sandbox=void 0}e.workers=[],e.fontFamilies.clear(),e.fontCssTexts.clear(),e.requests.clear(),e.tasks=[],e.shadowRoots=[]}function Bt(e){const o=e,{url:t,timeout:r,responseType:n}=o,i=je(o,[\"url\",\"timeout\",\"responseType\"]),a=new AbortController,s=r?setTimeout(()=>a.abort(),r):void 0;return fetch(t,D({signal:a.signal},i)).then(c=>{if(!c.ok)throw new Error(\"Failed fetch, not 2xx response\",{cause:c});switch(n){case\"arrayBuffer\":return c.arrayBuffer();case\"dataUrl\":return c.blob().then(gt);case\"text\":default:return c.text()}}).finally(()=>clearTimeout(s))}function z(e,t){const{url:r,requestType:n=\"text\",responseType:i=\"text\",imageDom:a}=t;let s=r;const{timeout:o,acceptOfImage:c,requests:u,fetchFn:l,fetch:{requestInit:d,bypassingCache:m,placeholderImage:f},font:h,workers:g,fontFamilies:p}=e;n===\"image\"&&(G||te)&&e.drawImageCount++;let E=u.get(r);if(!E){m&&m instanceof RegExp&&m.test(s)&&(s+=(/\\?/.test(s)?\"&\":\"?\")+new Date().getTime());const b=n.startsWith(\"font\")&&h&&h.minify,w=new Set;b&&n.split(\";\")[1].split(\",\").forEach(F=>{p.has(F)&&p.get(F).forEach(B=>w.add(B))});const S=b&&w.size,T=D({url:s,timeout:o,responseType:S?\"arrayBuffer\":i,headers:n===\"image\"?{accept:c}:void 0},d);E={type:n,resolve:void 0,reject:void 0,response:null},E.response=C(this,null,function*(){if(l&&n===\"image\"){const A=yield l(r);if(A)return A}return!G&&r.startsWith(\"http\")&&g.length?new Promise((A,F)=>{g[u.size&g.length-1].postMessage(D({rawUrl:r},T)),E.resolve=A,E.reject=F}):Bt(T)}).catch(A=>{if(u.delete(r),n===\"image\"&&f)return e.log.warn(\"Failed to fetch image base64, trying to use placeholder image\",s),typeof f==\"string\"?f:f(a);throw A}),u.set(r,E)}return E.response}function Re(e,t,r,n){return C(this,null,function*(){if(!Ie(e))return e;for(const[i,a]of $t(e,t))try{const s=yield z(r,{url:a,requestType:n?\"image\":\"text\",responseType:\"dataUrl\"});e=e.replace(Lt(i),`$1${s}$3`)}catch(s){r.log.warn(\"Failed to fetch css data url\",i,s)}return e})}function Ie(e){return/url\\((['\"]?)([^'\"]+?)\\1\\)/.test(e)}const ke=/url\\((['\"]?)([^'\"]+?)\\1\\)/g;function $t(e,t){const r=[];return e.replace(ke,(n,i,a)=>(r.push([a,ue(a,t)]),n)),r.filter(([n])=>!re(n))}function Lt(e){const t=e.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g,\"\\\\$1\");return new RegExp(`(url\\\\(['\"]?)(${t})(['\"]?\\\\))`,\"g\")}const xt=[\"background-image\",\"border-image-source\",\"-webkit-border-image\",\"-webkit-mask-image\",\"list-style-image\"];function Mt(e,t){return xt.map(r=>{const n=e.getPropertyValue(r);return!n||n===\"none\"?null:((G||te)&&t.drawImageCount++,Re(n,null,t,!0).then(i=>{!i||n===i||e.setProperty(r,i,e.getPropertyPriority(r))}))}).filter(Boolean)}function Ot(e,t){if($(e)){const r=e.currentSrc||e.src;if(!re(r))return[z(t,{url:r,imageDom:e,requestType:\"image\",responseType:\"dataUrl\"}).then(n=>{n&&(e.srcset=\"\",e.dataset.originalSrc=r,e.src=n||\"\")})];(G||te)&&t.drawImageCount++}else if(H(e)&&!re(e.href.baseVal)){const r=e.href.baseVal;return[z(t,{url:r,imageDom:e,requestType:\"image\",responseType:\"dataUrl\"}).then(n=>{n&&(e.dataset.originalSrc=r,e.href.baseVal=n||\"\")})]}return[]}function jt(e,t){var o;const{ownerDocument:r,svgDefsElement:n}=t,i=(o=e.getAttribute(\"href\"))!=null?o:e.getAttribute(\"xlink:href\");if(!i)return[];const[a,s]=i.split(\"#\");if(s){const c=`#${s}`,u=t.shadowRoots.reduce((l,d)=>l!=null?l:d.querySelector(`svg ${c}`),r==null?void 0:r.querySelector(`svg ${c}`));if(a&&e.setAttribute(\"href\",c),n!=null&&n.querySelector(c))return[];if(u)return n==null||n.appendChild(u.cloneNode(!0)),[];if(a)return[z(t,{url:a,responseType:\"text\"}).then(l=>{n==null||n.insertAdjacentHTML(\"beforeend\",l)})]}return[]}function De(e,t){const{tasks:r}=t;I(e)&&(($(e)||ce(e))&&r.push(...Ot(e,t)),Qe(e)&&r.push(...jt(e,t))),V(e)&&r.push(...Mt(e.style,t)),e.childNodes.forEach(n=>{De(n,t)})}function qt(e,t){return C(this,null,function*(){const{ownerDocument:r,svgStyleElement:n,fontFamilies:i,fontCssTexts:a,tasks:s,font:o}=t;if(!(!r||!n||!i.size))if(o&&o.cssText){const c=Ue(o.cssText,t);n.appendChild(r.createTextNode(`${c}\n`))}else{const c=Array.from(r.styleSheets).filter(f=>{try{return\"cssRules\"in f&&!!f.cssRules.length}catch(h){return t.log.warn(`Error while reading CSS rules from ${f.href}`,h),!1}}),u=r.implementation.createHTMLDocument(\"\"),l=u.createElement(\"style\");u.head.appendChild(l);const d=l.sheet;yield Promise.all(c.flatMap(f=>Array.from(f.cssRules).map(h=>C(this,null,function*(){if(Je(h)){const g=h.href;let p=\"\";try{p=yield z(t,{url:g,requestType:\"text\",responseType:\"text\"})}catch(b){t.log.warn(`Error fetch remote css import from ${g}`,b)}const E=p.replace(ke,(b,w,S)=>b.replace(S,ue(S,g)));for(const b of Ht(E))try{d.insertRule(b,d.cssRules.length)}catch(w){t.log.warn(\"Error inserting rule from remote css import\",{rule:b,error:w})}}})))),d.cssRules.length&&c.push(d);const m=[];c.forEach(f=>{oe(f.cssRules,m)}),m.filter(f=>{var h;return Ye(f)&&Ie(f.style.getPropertyValue(\"src\"))&&((h=we(f.style.getPropertyValue(\"font-family\")))==null?void 0:h.some(g=>i.has(g)))}).forEach(f=>{const h=f,g=a.get(h.cssText);g?n.appendChild(r.createTextNode(`${g}\n`)):s.push(Re(h.cssText,h.parentStyleSheet?h.parentStyleSheet.href:null,t).then(p=>{p=Ue(p,t),a.set(h.cssText,p),n.appendChild(r.createTextNode(`${p}\n`))}))})}})}const Wt=/(\\/\\*[\\s\\S]*?\\*\\/)/g,Pe=/((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})/gi;function Ht(e){if(e==null)return[];const t=[];let r=e.replace(Wt,\"\");for(;;){const a=Pe.exec(r);if(!a)break;t.push(a[0])}r=r.replace(Pe,\"\");const n=/@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi,i=new RegExp(\"((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})\",\"gi\");for(;;){let a=n.exec(r);if(a)i.lastIndex=n.lastIndex;else if(a=i.exec(r),a)n.lastIndex=i.lastIndex;else break;t.push(a[0])}return t}const Vt=/url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g,zt=/src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;function Ue(e,t){const{font:r}=t,n=r?r==null?void 0:r.preferredFormat:void 0;return n?e.replace(zt,i=>{for(;;){const[a,,s]=Vt.exec(i)||[];if(!s)return\"\";if(s===n)return`src: ${a};`}}):e}function oe(e,t=[]){for(const r of Array.from(e))Ke(r)?t.push(...oe(r.cssRules)):\"cssRules\"in r?oe(r.cssRules,t):t.push(r);return t}const Xt=/\\bx?link:?href\\s*=\\s*[\"'](?!data:)[^\"']+[\"']/i;function Gt(e){return Xt.test(e.innerHTML)}function _e(e,t){return C(this,null,function*(){const r=yield k(e,t);if(I(r.node)&&H(r.node)&&!Gt(r.node))return r.node;const{ownerDocument:n,log:i,tasks:a,svgStyleElement:s,svgDefsElement:o,svgStyles:c,font:u,progress:l,autoDestruct:d,onCloneNode:m,onEmbedNode:f,onCreateForeignObjectSvg:h}=r;i.time(\"clone node\");const g=yield ne(r.node,r,!0);if(s&&n){let S=\"\";c.forEach((T,A)=>{S+=`${T.join(`,\n`)} {\n ${A}\n}\n`}),s.appendChild(n.createTextNode(S))}i.timeEnd(\"clone node\"),yield m==null?void 0:m(g),u!==!1&&I(g)&&(i.time(\"embed web font\"),yield qt(g,r),i.timeEnd(\"embed web font\")),i.time(\"embed node\"),De(g,r);const p=a.length;let E=0;const b=()=>C(this,null,function*(){for(;;){const S=a.pop();if(!S)break;try{yield S}catch(T){r.log.warn(\"Failed to run task\",T)}l==null||l(++E,p)}});l==null||l(E,p),yield Promise.all([...Array.from({length:4})].map(b)),i.timeEnd(\"embed node\"),yield f==null?void 0:f(g);const w=Yt(g,r);return o&&w.insertBefore(o,w.children[0]),s&&w.insertBefore(s,w.children[0]),d&&Ne(r),yield h==null?void 0:h(w),w})}function Yt(e,t){const{width:r,height:n}=t,i=fe(r,n,e.ownerDocument),a=i.ownerDocument.createElementNS(i.namespaceURI,\"foreignObject\");return a.setAttributeNS(null,\"x\",\"0%\"),a.setAttributeNS(null,\"y\",\"0%\"),a.setAttributeNS(null,\"width\",\"100%\"),a.setAttributeNS(null,\"height\",\"100%\"),a.append(e),i.appendChild(a),i}function Q(e,t){return C(this,null,function*(){var s;const r=yield k(e,t),n=yield _e(r),i=de(n,r.isEnable(\"removeControlCharacter\"));r.autoDestruct||(r.svgStyleElement=be(r.ownerDocument),r.svgDefsElement=(s=r.ownerDocument)==null?void 0:s.createElementNS(K,\"defs\"),r.svgStyles.clear());const a=_(i,n.ownerDocument);return yield yt(a,r)})}function Jt(e,t){return C(this,null,function*(){const r=yield k(e,t),{log:n,type:i,quality:a,dpi:s}=r,o=yield Q(r);n.time(\"canvas to blob\");const c=yield ft(o,i,a);if([\"image/png\",\"image/jpeg\"].includes(i)&&s){const u=yield mt(c.slice(0,33));let l=new Uint8Array(u);return i===\"image/png\"?l=ae(l,s):i===\"image/jpeg\"&&(l=v(l,s)),n.timeEnd(\"canvas to blob\"),new Blob([l,c.slice(33)],{type:i})}return n.timeEnd(\"canvas to blob\"),c})}function x(e,t){return C(this,null,function*(){const r=yield k(e,t),{log:n,quality:i,type:a,dpi:s}=r,o=yield Q(r);n.time(\"canvas to data url\");let c=o.toDataURL(a,i);if([\"image/png\",\"image/jpeg\"].includes(a)&&s&&ie&&Xe){const[u,l]=c.split(\",\");let d=0,m=!1;if(a===\"image/png\"){const w=Ve(l);w>=0?(d=Math.ceil((w+28)/3)*4,m=!0):d=33/3*4}else a===\"image/jpeg\"&&(d=18/3*4);const f=l.substring(0,d),h=l.substring(d),g=window.atob(f),p=new Uint8Array(g.length);for(let w=0;w<p.length;w++)p[w]=g.charCodeAt(w);const E=a===\"image/png\"?ae(p,s,m):v(p,s),b=window.btoa(String.fromCharCode(...E));c=[u,\",\",b,h].join(\"\")}return n.timeEnd(\"canvas to data url\"),c})}function Fe(e,t){return C(this,null,function*(){const r=yield k(e,t),{width:n,height:i,ownerDocument:a}=r,s=yield x(r),o=fe(n,i,a),c=o.ownerDocument.createElementNS(o.namespaceURI,\"image\");return c.setAttributeNS(null,\"href\",s),c.setAttributeNS(null,\"height\",\"100%\"),c.setAttributeNS(null,\"width\",\"100%\"),o.appendChild(c),de(o,r.isEnable(\"removeControlCharacter\"))})}function Kt(e,t){return C(this,null,function*(){const r=yield k(e,t),{ownerDocument:n,width:i,height:a,scale:s,type:o}=r,c=o===\"image/svg+xml\"?yield Fe(r):yield x(r),u=_(c,n);return u.width=Math.floor(i*s),u.height=Math.floor(a*s),u.style.width=`${i}px`,u.style.height=`${a}px`,u})}function Qt(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:\"image/jpeg\"})))})}function Zt(e,t){return C(this,null,function*(){const r=yield k(e,t),n=yield Q(r);return n.getContext(\"2d\").getImageData(0,0,n.width,n.height).data})}function er(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:\"image/png\"})))})}function tr(e,t){return C(this,null,function*(){return x(yield k(e,M(D({},t),{type:\"image/webp\"})))})}y.createContext=ye,y.destroyContext=Ne,y.domToBlob=Jt,y.domToCanvas=Q,y.domToDataUrl=x,y.domToForeignObjectSvg=_e,y.domToImage=Kt,y.domToJpeg=Qt,y.domToPixel=Zt,y.domToPng=er,y.domToSvg=Fe,y.domToWebp=tr,y.loadMedia=L,y.waitUntilLoad=me,Object.defineProperty(y,Symbol.toStringTag,{value:\"Module\"})});\n","import { domToCanvas } from 'modern-screenshot'\nimport Protocol from 'devtools-protocol'\nimport Page = Protocol.Page\nimport { HIDE_SELECTOR } from './hitTest'\nimport { isMasked, maskedElements, MASK } from './privacy'\n\n// Page.captureScreenshot for webviews.\n//\n// JavaScript inside a page cannot read the pixels the webview actually shows.\n// Two sources, best first:\n//\n// 1. A native capture provided by the host app (real pixels: video, canvas,\n// cross-origin images, native overlays on top of the page all included):\n// window.RWDNativeScreenshot() any host, returns\n// string | Promise<string>\n// webkit.messageHandlers.rwdScreenshot iOS WKWebView with a\n// WKScriptMessageHandlerWithReply\n// window.RWDAndroid.screenshot() Android\n// @JavascriptInterface\n// Each returns a PNG/JPEG data URL (or bare base64) of the visible webview.\n//\n// 2. Re-rendering the DOM through SVG foreignObject (modern-screenshot): the\n// browser lays out a styled clone itself, so CSS, fonts, form values and\n// emoji come out right, at device pixel ratio. Not real pixels: canvas,\n// video and cross-origin images without CORS may be blank.\n\nexport type ScreenshotSource = 'native' | 'dom'\n\n/** Source of the most recent capture, for diagnostics. */\nexport let lastSource: ScreenshotSource | undefined\n\nconst MAX_SCALE = 2\n// iOS Safari refuses canvases larger than 16,777,216 pixels.\nconst MAX_CANVAS_PIXELS = 16_000_000\n\ninterface Region {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface ScreenshotResult extends Page.CaptureScreenshotResponse {\n source: ScreenshotSource\n /** Image size in pixels. */\n width: number\n height: number\n}\n\nexport async function captureScreenshot(\n params: Page.CaptureScreenshotRequest\n): Promise<ScreenshotResult> {\n const { format = 'png', quality, clip, captureBeyondViewport } = params\n\n const viewport: Region = {\n x: window.scrollX,\n y: window.scrollY,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n const doc = document.documentElement\n const region: Region = clip\n ? clip\n : captureBeyondViewport\n ? {\n x: 0,\n y: 0,\n width: Math.max(doc.scrollWidth, viewport.width),\n height: Math.max(doc.scrollHeight, viewport.height),\n }\n : viewport\n\n let canvas: HTMLCanvasElement | undefined\n let source: ScreenshotSource = 'native'\n if (contains(viewport, region)) {\n canvas = await captureNative(viewport, region)\n }\n if (!canvas) {\n canvas = await renderDom(region, clip?.scale)\n source = 'dom'\n }\n lastSource = source\n\n const mimeType =\n format === 'jpeg'\n ? 'image/jpeg'\n : format === 'webp'\n ? 'image/webp'\n : 'image/png'\n const data = canvas\n .toDataURL(mimeType, quality === undefined ? undefined : quality / 100)\n .replace(/^data:image\\/\\w+;base64,/, '')\n\n return { data, source, width: canvas.width, height: canvas.height }\n}\n\nfunction contains(outer: Region, inner: Region) {\n return (\n inner.x >= outer.x - 1 &&\n inner.y >= outer.y - 1 &&\n inner.x + inner.width <= outer.x + outer.width + 1 &&\n inner.y + inner.height <= outer.y + outer.height + 1\n )\n}\n\nfunction getNativeCapture(): (() => unknown) | undefined {\n const w = window as any\n // The Wdmcp* / wdmcp* names are what early integrations registered.\n const fn = w.RWDNativeScreenshot || w.WdmcpNativeScreenshot\n if (typeof fn === 'function') {\n return () => fn()\n }\n const handlers = w.webkit?.messageHandlers\n const ios = handlers?.rwdScreenshot || handlers?.wdmcpScreenshot\n if (ios && typeof ios.postMessage === 'function') {\n return () => ios.postMessage({ type: 'screenshot' })\n }\n const android = w.RWDAndroid || w.WdmcpAndroid\n if (android && typeof android.screenshot === 'function') {\n return () => android.screenshot()\n }\n}\n\nasync function captureNative(viewport: Region, region: Region) {\n const capture = getNativeCapture()\n if (!capture) return\n\n let image: HTMLImageElement\n try {\n const result = await capture()\n if (typeof result !== 'string' || !result) return\n image = await loadImage(\n result.startsWith('data:')\n ? result\n : `data:image/${result.startsWith('/9j/') ? 'jpeg' : 'png'};base64,${result}`\n )\n } catch {\n return\n }\n\n // The native image covers the visible webview at device pixels.\n const ratio = image.naturalWidth / viewport.width\n const scale = Math.min(ratio, MAX_SCALE)\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(region.width * scale))\n canvas.height = Math.max(1, Math.round(region.height * scale))\n const ctx = canvas.getContext('2d')!\n ctx.drawImage(\n image,\n (region.x - viewport.x) * ratio,\n (region.y - viewport.y) * ratio,\n region.width * ratio,\n region.height * ratio,\n 0,\n 0,\n canvas.width,\n canvas.height\n )\n // Real pixels cannot be edited like the DOM clone: cover masked elements.\n ctx.fillStyle = '#c7c9cc'\n for (const el of maskedElements()) {\n const r = el.getBoundingClientRect()\n if (!r.width || !r.height) continue\n ctx.fillRect(\n (r.left + viewport.x - region.x) * scale,\n (r.top + viewport.y - region.y) * scale,\n r.width * scale,\n r.height * scale\n )\n }\n return canvas\n}\n\nfunction loadImage(src: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image()\n image.onload = () => resolve(image)\n image.onerror = reject\n image.src = src\n })\n}\n\nasync function renderDom(region: Region, clipScale = 1) {\n let scale = Math.min(window.devicePixelRatio || 1, MAX_SCALE) * clipScale\n const pixels = region.width * region.height * scale * scale\n if (pixels > MAX_CANVAS_PIXELS) {\n scale *= Math.sqrt(MAX_CANVAS_PIXELS / pixels)\n }\n\n // Render a region-sized window onto the document: shift the root by the\n // region offset instead of scrolling. `position: relative` keeps absolutely\n // positioned elements anchored to the shifted root, while fixed elements stay\n // relative to the region, as they do relative to the real viewport.\n return domToCanvas(document.documentElement, {\n width: region.width,\n height: region.height,\n scale,\n backgroundColor: getBackground(),\n style: {\n marginTop: `${-region.y}px`,\n marginLeft: `${-region.x}px`,\n position: 'relative',\n },\n filter: isRendered,\n timeout: 5000,\n onCloneEachNode: stripBackdropFilter,\n onCloneNode: cloned => {\n syncFormState(cloned)\n maskText(cloned)\n },\n })\n}\n\n// Our own UI and other debug tools (eruda, PageSpy, vConsole) stay out.\nfunction isRendered(node: Node) {\n return !(node.nodeType === 1 && (node as Element).matches(HIDE_SELECTOR))\n}\n\n// Chromium (so Android WebView) stops painting later positive z-index\n// elements in a foreignObject once any element has a backdrop-filter: fixed\n// bottom bars and toasts vanish. The blur never renders there anyway.\nfunction stripBackdropFilter(cloned: Node) {\n const style = (cloned as HTMLElement).style\n if (!style) return\n style.removeProperty('backdrop-filter')\n style.removeProperty('-webkit-backdrop-filter')\n}\n\n// The clone carries attributes, not live state: a radio the user picked, a\n// toggled checkbox or a changed <select> would show their initial state.\nconst FORM_SELECTOR = 'input, option, textarea'\n\nfunction syncFormState(root: Node) {\n const originals = Array.from(\n document.documentElement.querySelectorAll(FORM_SELECTOR)\n ).filter(el => !el.closest(HIDE_SELECTOR))\n const clones = (root as Element).querySelectorAll(FORM_SELECTOR)\n if (originals.length !== clones.length) return\n\n originals.forEach((el, i) => {\n const clone = clones[i]\n const masked = isMasked(el)\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox' || el.type === 'radio') {\n toggleAttribute(clone, 'checked', el.checked)\n } else if (el.type !== 'file') {\n clone.setAttribute('value', masked && el.value ? MASK : el.value)\n // Dots of a password field would still tell its length.\n if (masked && el.type === 'password') clone.setAttribute('type', 'text')\n }\n } else if (el instanceof HTMLOptionElement) {\n toggleAttribute(clone, 'selected', el.selected)\n if (masked) clone.textContent = MASK\n } else if (el instanceof HTMLTextAreaElement) {\n clone.textContent = masked && el.value ? MASK : el.value\n }\n })\n}\n\n// Text of elements marked data-rwd-mask (form fields are handled above).\nfunction maskText(root: Node) {\n const selector = '[data-rwd-mask]'\n const originals = Array.from(\n document.documentElement.querySelectorAll(selector)\n ).filter(el => !el.closest(HIDE_SELECTOR))\n const clones = (root as Element).querySelectorAll(selector)\n if (originals.length !== clones.length) return\n originals.forEach((el, i) => {\n if (/^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName)) return\n if ((el.textContent || '').trim()) clones[i].textContent = MASK\n })\n}\n\nfunction toggleAttribute(el: Element, name: string, on: boolean) {\n if (on) el.setAttribute(name, '')\n else el.removeAttribute(name)\n}\n\nfunction getBackground() {\n for (const el of [document.body, document.documentElement]) {\n if (!el) continue\n const color = getComputedStyle(el).backgroundColor\n if (color && color !== 'transparent' && !/rgba\\(.*,\\s*0\\)$/.test(color)) {\n return color\n }\n }\n return '#fff'\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// https://www.w3.org/TR/wai-aria-1.2/#role_definitions\n\nexport type AriaRole = 'alert' | 'alertdialog' | 'application' | 'article' | 'banner' | 'blockquote' | 'button' | 'caption' | 'cell' | 'checkbox' | 'code' | 'columnheader' | 'combobox' |\n 'complementary' | 'contentinfo' | 'definition' | 'deletion' | 'dialog' | 'directory' | 'document' | 'emphasis' | 'feed' | 'figure' | 'form' | 'generic' | 'grid' |\n 'gridcell' | 'group' | 'heading' | 'img' | 'insertion' | 'link' | 'list' | 'listbox' | 'listitem' | 'log' | 'main' | 'mark' | 'marquee' | 'math' | 'meter' | 'menu' |\n 'menubar' | 'menuitem' | 'menuitemcheckbox' | 'menuitemradio' | 'navigation' | 'none' | 'note' | 'option' | 'paragraph' | 'presentation' | 'progressbar' | 'radio' | 'radiogroup' |\n 'region' | 'row' | 'rowgroup' | 'rowheader' | 'scrollbar' | 'search' | 'searchbox' | 'separator' | 'slider' |\n 'spinbutton' | 'status' | 'strong' | 'subscript' | 'superscript' | 'switch' | 'tab' | 'table' | 'tablist' | 'tabpanel' | 'term' | 'textbox' | 'time' | 'timer' |\n 'toolbar' | 'tooltip' | 'tree' | 'treegrid' | 'treeitem';\n\nexport type AriaProps = {\n checked?: boolean | 'mixed';\n disabled?: boolean;\n expanded?: boolean;\n active?: boolean;\n invalid?: boolean | 'grammar' | 'spelling';\n level?: number;\n pressed?: boolean | 'mixed';\n selected?: boolean;\n};\n\nexport type AriaBox = {\n visible: boolean;\n inline: boolean;\n cursor?: string;\n};\n\nexport type AriaNode = AriaProps & {\n role: AriaRole | 'fragment' | 'iframe';\n name: string;\n ref?: string;\n children: (AriaNode | string)[];\n box: AriaBox;\n receivesPointerEvents: boolean;\n props: Record<string, string>;\n};\n\nexport function hasPointerCursor(ariaNode: AriaNode): boolean {\n return ariaNode.box.cursor === 'pointer';\n}\n\nexport type AriaNodeJSON = {\n role: AriaRole | 'iframe' | 'text';\n name?: string;\n checked?: true | 'mixed';\n disabled?: true;\n expanded?: true;\n active?: true;\n invalid?: true | 'grammar' | 'spelling';\n level?: number;\n pressed?: true | 'mixed';\n selected?: true;\n ariaHidden?: true;\n ref?: string;\n cursor?: 'pointer';\n box?: { x: number, y: number, width: number, height: number };\n url?: string;\n placeholder?: string;\n text?: string;\n children?: (AriaNodeJSON | string)[];\n};\n\nexport type AriaSnapshotJSON = AriaNodeJSON[];\n\n// We pass parsed template between worlds using JSON, make it easy.\nexport type AriaRegex = { pattern: string };\n\n// We can't tell apart pattern and text, so we pass both.\nexport type AriaTextValue = {\n raw: string;\n normalized: string;\n};\n\nexport type AriaTemplateTextNode = {\n kind: 'text';\n text: AriaTextValue;\n};\n\nexport type AriaTemplateRoleNode = AriaProps & {\n kind: 'role';\n role: AriaRole | 'fragment';\n name?: AriaRegex | string;\n children?: AriaTemplateNode[];\n props?: Record<string, AriaTextValue>;\n containerMode?: 'contain' | 'equal' | 'deep-equal';\n};\n\nexport type AriaTemplateNode = AriaTemplateRoleNode | AriaTemplateTextNode;\n\nimport type * as yamlTypes from 'yaml';\n\ntype YamlLibrary = {\n parseDocument: typeof yamlTypes.parseDocument;\n Scalar: typeof yamlTypes.Scalar;\n YAMLMap: typeof yamlTypes.YAMLMap;\n YAMLSeq: typeof yamlTypes.YAMLSeq;\n LineCounter: typeof yamlTypes.LineCounter;\n};\n\ntype ParsedYamlPosition = { line: number; col: number; };\ntype ParsingOptions = yamlTypes.ParseOptions;\n\nexport type ParsedYamlError = {\n message: string;\n range: [ParsedYamlPosition, ParsedYamlPosition];\n};\n\nexport function parseAriaSnapshotUnsafe(yaml: YamlLibrary, text: string, options: ParsingOptions = {}): AriaTemplateNode {\n const result = parseAriaSnapshot(yaml, text, options);\n if (result.errors.length)\n throw new Error(result.errors[0].message);\n return result.fragment;\n}\n\nexport function parseAriaSnapshot(yaml: YamlLibrary, text: string, options: ParsingOptions = {}): { fragment: AriaTemplateNode, errors: ParsedYamlError[] } {\n const lineCounter = new yaml.LineCounter();\n const parseOptions: ParsingOptions = {\n keepSourceTokens: true,\n lineCounter,\n ...options,\n };\n const yamlDoc = yaml.parseDocument(text, parseOptions);\n const errors: ParsedYamlError[] = [];\n\n const convertRange = (range: [number, number] | yamlTypes.Range): [ParsedYamlPosition, ParsedYamlPosition] => {\n return [lineCounter.linePos(range[0]), lineCounter.linePos(range[1])];\n };\n\n const addError = (error: yamlTypes.YAMLError) => {\n errors.push({\n message: error.message,\n range: [lineCounter.linePos(error.pos[0]), lineCounter.linePos(error.pos[1])],\n });\n };\n\n const convertSeq = (container: AriaTemplateRoleNode, seq: yamlTypes.YAMLSeq) => {\n for (const item of seq.items) {\n const itemIsString = item instanceof yaml.Scalar && typeof item.value === 'string';\n if (itemIsString) {\n const childNode = KeyParser.parse(item, parseOptions, errors);\n if (childNode) {\n container.children = container.children || [];\n container.children.push(childNode);\n }\n continue;\n }\n const itemIsMap = item instanceof yaml.YAMLMap;\n if (itemIsMap) {\n convertMap(container, item);\n continue;\n }\n errors.push({\n message: 'Sequence items should be strings or maps',\n range: convertRange((item as any).range || seq.range),\n });\n }\n };\n\n const convertMap = (container: AriaTemplateRoleNode, map: yamlTypes.YAMLMap) => {\n for (const entry of map.items) {\n container.children = container.children || [];\n // Key must by a string\n const keyIsString = entry.key instanceof yaml.Scalar && typeof entry.key.value === 'string';\n if (!keyIsString) {\n errors.push({\n message: 'Only string keys are supported',\n range: convertRange((entry.key as any).range || map.range),\n });\n continue;\n }\n\n const key: yamlTypes.Scalar<string> = entry.key as yamlTypes.Scalar<string>;\n const value = entry.value;\n\n // - text: \"text\"\n if (key.value === 'text') {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === 'string';\n if (!valueIsString) {\n errors.push({\n message: 'Text value should be a string',\n range: convertRange(((entry.value as any).range || map.range)),\n });\n continue;\n }\n container.children.push({\n kind: 'text',\n text: textValue(value.value)\n });\n continue;\n }\n\n // - /children: equal\n if (key.value === '/children') {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === 'string';\n if (!valueIsString || (value.value !== 'contain' && value.value !== 'equal' && value.value !== 'deep-equal')) {\n errors.push({\n message: 'Strict value should be \"contain\", \"equal\" or \"deep-equal\"',\n range: convertRange(((entry.value as any).range || map.range)),\n });\n continue;\n }\n container.containerMode = value.value;\n continue;\n }\n\n // - /url: \"about:blank\"\n if (key.value.startsWith('/')) {\n const valueIsString = value instanceof yaml.Scalar && typeof value.value === 'string';\n if (!valueIsString) {\n errors.push({\n message: 'Property value should be a string',\n range: convertRange(((entry.value as any).range || map.range)),\n });\n continue;\n }\n container.props = container.props ?? {};\n container.props[key.value.slice(1)] = textValue(value.value);\n continue;\n }\n\n // role \"name\": ...\n const childNode = KeyParser.parse(key, parseOptions, errors);\n if (!childNode)\n continue;\n\n // - role \"name\": \"text\"\n const valueIsScalar = value instanceof yaml.Scalar;\n if (valueIsScalar) {\n const type = typeof value.value;\n if (type !== 'string' && type !== 'number' && type !== 'boolean') {\n errors.push({\n message: 'Node value should be a string or a sequence',\n range: convertRange(((entry.value as any).range || map.range)),\n });\n continue;\n }\n\n container.children.push({\n ...childNode,\n children: [{\n kind: 'text',\n text: textValue(String(value.value))\n }]\n });\n continue;\n }\n\n // - role \"name\":\n // - child\n const valueIsSequence = value instanceof yaml.YAMLSeq;\n if (valueIsSequence) {\n container.children.push(childNode);\n convertSeq(childNode, value as yamlTypes.YAMLSeq);\n continue;\n }\n\n errors.push({\n message: 'Map values should be strings or sequences',\n range: convertRange((entry.value as any).range || map.range),\n });\n }\n };\n\n const fragment: AriaTemplateNode = { kind: 'role', role: 'fragment' };\n\n yamlDoc.errors.forEach(addError);\n if (errors.length)\n return { errors, fragment };\n\n if (!(yamlDoc.contents instanceof yaml.YAMLSeq)) {\n errors.push({\n message: 'Aria snapshot must be a YAML sequence, elements starting with \" -\"',\n range: yamlDoc.contents ? convertRange(yamlDoc.contents!.range) : [{ line: 0, col: 0 }, { line: 0, col: 0 }],\n });\n }\n if (errors.length)\n return { errors, fragment };\n\n convertSeq(fragment, yamlDoc.contents as yamlTypes.YAMLSeq);\n if (errors.length)\n return { errors, fragment: emptyFragment };\n // `- button` should target the button, not its parent.\n if (fragment.children?.length === 1 && (!fragment.containerMode || fragment.containerMode === 'contain'))\n return { fragment: fragment.children[0], errors: [] };\n return { fragment, errors: [] };\n}\n\nconst emptyFragment: AriaTemplateRoleNode = { kind: 'role', role: 'fragment' };\n\nfunction normalizeWhitespace(text: string) {\n // TODO: why is this different from normalizeWhitespace in stringUtils.ts?\n return text.replace(/[\\u200b\\u00ad]/g, '').replace(/[\\r\\n\\s\\t]+/g, ' ').trim();\n}\n\nexport function textValue(value: string): AriaTextValue {\n return {\n raw: value,\n normalized: normalizeWhitespace(value),\n };\n}\n\nexport class KeyParser {\n private _input: string;\n private _pos: number;\n private _length: number;\n\n static parse(text: yamlTypes.Scalar<string>, options: ParsingOptions, errors: ParsedYamlError[]): AriaTemplateRoleNode | null {\n try {\n return new KeyParser(text.value)._parse();\n } catch (e) {\n if (e instanceof ParserError) {\n const message = options.prettyErrors === false ? e.message : e.message + ':\\n\\n' + text.value + '\\n' + ' '.repeat(e.pos) + '^\\n';\n errors.push({\n message,\n range: [options.lineCounter!.linePos(text.range![0]), options.lineCounter!.linePos(text.range![0] + e.pos)],\n });\n return null;\n }\n throw e;\n }\n }\n\n constructor(input: string) {\n this._input = input;\n this._pos = 0;\n this._length = input.length;\n }\n\n private _peek() {\n return this._input[this._pos] || '';\n }\n\n private _next() {\n if (this._pos < this._length)\n return this._input[this._pos++];\n return null;\n }\n\n private _eof() {\n return this._pos >= this._length;\n }\n\n private _isWhitespace() {\n return !this._eof() && /\\s/.test(this._peek());\n }\n\n private _skipWhitespace() {\n while (this._isWhitespace())\n this._pos++;\n }\n\n private _readIdentifier(type: 'role' | 'attribute'): string {\n if (this._eof())\n this._throwError(`Unexpected end of input when expecting ${type}`);\n const start = this._pos;\n while (!this._eof() && /[a-zA-Z]/.test(this._peek()))\n this._pos++;\n return this._input.slice(start, this._pos);\n }\n\n private _readString(): string {\n let result = '';\n let escaped = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === '\\\\') {\n escaped = true;\n } else if (ch === '\"') {\n return result;\n } else {\n result += ch;\n }\n }\n this._throwError('Unterminated string');\n }\n\n private _throwError(message: string, offset: number = 0): never {\n throw new ParserError(message, offset || this._pos);\n }\n\n private _readRegex(): AriaRegex {\n let result = '';\n let escaped = false;\n let insideClass = false;\n while (!this._eof()) {\n const ch = this._next();\n if (escaped) {\n result += ch;\n escaped = false;\n } else if (ch === '\\\\') {\n escaped = true;\n result += ch;\n } else if (ch === '/' && !insideClass) {\n return { pattern: result };\n } else if (ch === '[') {\n insideClass = true;\n result += ch;\n } else if (ch === ']' && insideClass) {\n result += ch;\n insideClass = false;\n } else {\n result += ch;\n }\n }\n this._throwError('Unterminated regex');\n }\n\n private _readStringOrRegex(): string | AriaRegex | null {\n const ch = this._peek();\n if (ch === '\"') {\n this._next();\n return normalizeWhitespace(this._readString());\n }\n\n if (ch === '/') {\n this._next();\n return this._readRegex();\n }\n\n return null;\n }\n\n private _readAttributes(result: AriaTemplateRoleNode) {\n let errorPos = this._pos;\n while (true) {\n this._skipWhitespace();\n if (this._peek() === '[') {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n const flagName = this._readIdentifier('attribute');\n this._skipWhitespace();\n let flagValue = '';\n if (this._peek() === '=') {\n this._next();\n this._skipWhitespace();\n errorPos = this._pos;\n while (this._peek() !== ']' && !this._isWhitespace() && !this._eof())\n flagValue += this._next();\n }\n this._skipWhitespace();\n if (this._peek() !== ']')\n this._throwError('Expected ]');\n\n this._next(); // Consume ']'\n this._applyAttribute(result, flagName, flagValue || 'true', errorPos);\n } else {\n break;\n }\n }\n }\n\n _parse(): AriaTemplateRoleNode {\n this._skipWhitespace();\n\n const role = this._readIdentifier('role') as AriaTemplateRoleNode['role'];\n this._skipWhitespace();\n const name = this._readStringOrRegex() || '';\n const result: AriaTemplateRoleNode = { kind: 'role', role, name };\n this._readAttributes(result);\n this._skipWhitespace();\n if (!this._eof())\n this._throwError('Unexpected input');\n return result;\n }\n\n private _applyAttribute(node: AriaTemplateRoleNode, key: string, value: string, errorPos: number) {\n if (key === 'checked') {\n this._assert(value === 'true' || value === 'false' || value === 'mixed', 'Value of \"checked\\\" attribute must be a boolean or \"mixed\"', errorPos);\n node.checked = value === 'true' ? true : value === 'false' ? false : 'mixed';\n return;\n }\n if (key === 'disabled') {\n this._assert(value === 'true' || value === 'false', 'Value of \"disabled\" attribute must be a boolean', errorPos);\n node.disabled = value === 'true';\n return;\n }\n if (key === 'expanded') {\n this._assert(value === 'true' || value === 'false', 'Value of \"expanded\" attribute must be a boolean', errorPos);\n node.expanded = value === 'true';\n return;\n }\n if (key === 'active') {\n this._assert(value === 'true' || value === 'false', 'Value of \"active\" attribute must be a boolean', errorPos);\n node.active = value === 'true';\n return;\n }\n if (key === 'invalid') {\n this._assert(value === 'true' || value === 'false' || value === 'grammar' || value === 'spelling', 'Value of \"invalid\" attribute must be a boolean, \"grammar\" or \"spelling\"', errorPos);\n node.invalid = value === 'true' ? true : value === 'false' ? false : value;\n return;\n }\n if (key === 'level') {\n this._assert(!isNaN(Number(value)), 'Value of \"level\" attribute must be a number', errorPos);\n node.level = Number(value);\n return;\n }\n if (key === 'pressed') {\n this._assert(value === 'true' || value === 'false' || value === 'mixed', 'Value of \"pressed\" attribute must be a boolean or \"mixed\"', errorPos);\n node.pressed = value === 'true' ? true : value === 'false' ? false : 'mixed';\n return;\n }\n if (key === 'selected') {\n this._assert(value === 'true' || value === 'false', 'Value of \"selected\" attribute must be a boolean', errorPos);\n node.selected = value === 'true';\n return;\n }\n this._assert(false, `Unsupported attribute [${key}]`, errorPos);\n }\n\n private _assert(value: any, message: string, valuePos: number): asserts value {\n if (!value)\n this._throwError(message || 'Assertion error', valuePos);\n }\n}\n\nexport class ParserError extends Error {\n readonly pos: number;\n\n constructor(message: string, pos: number) {\n super(message);\n this.pos = pos;\n }\n}\n\nexport function findNewNode(from: AriaNode | undefined, to: AriaNode): AriaNode | undefined {\n type ByRoleAndName = Map<string, Map<string, { node: AriaNode, sizeAndPosition: number }>>;\n\n function fillMap(root: AriaNode, map: ByRoleAndName, position: number) {\n let size = 1;\n let childPosition = position + size;\n for (const child of root.children || []) {\n if (typeof child === 'string') {\n size++;\n childPosition++;\n } else {\n size += fillMap(child, map, childPosition);\n childPosition += size;\n }\n }\n if (!['none', 'presentation', 'fragment', 'iframe', 'generic'].includes(root.role) && root.name) {\n let byRole = map.get(root.role);\n if (!byRole) {\n byRole = new Map();\n map.set(root.role, byRole);\n }\n const existing = byRole.get(root.name);\n // This heuristic prioritizes elements at the top of the page, even if somewhat smaller.\n const sizeAndPosition = size * 100 - position;\n if (!existing || existing.sizeAndPosition < sizeAndPosition)\n byRole.set(root.name, { node: root, sizeAndPosition });\n }\n return size;\n }\n\n const fromMap: ByRoleAndName = new Map();\n if (from)\n fillMap(from, fromMap, 0);\n\n const toMap: ByRoleAndName = new Map();\n fillMap(to, toMap, 0);\n\n const result: { node: AriaNode, sizeAndPosition: number }[] = [];\n for (const [role, byRole] of toMap) {\n for (const [name, byName] of byRole) {\n const inFrom = fromMap.get(role)?.get(name);\n if (!inFrom)\n result.push(byName);\n }\n }\n result.sort((a, b) => b.sizeAndPosition - a.sizeAndPosition);\n return result[0]?.node;\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// NOTE: this function should not be used to escape any selectors.\nexport function escapeWithQuotes(text: string, char: string = '\\'') {\n const stringified = JSON.stringify(text);\n const escapedText = stringified.substring(1, stringified.length - 1).replace(/\\\\\"/g, '\"');\n if (char === '\\'')\n return char + escapedText.replace(/[']/g, '\\\\\\'') + char;\n if (char === '\"')\n return char + escapedText.replace(/[\"]/g, '\\\\\"') + char;\n if (char === '`')\n return char + escapedText.replace(/[`]/g, '\\\\`') + char;\n throw new Error('Invalid escape char');\n}\n\nexport function escapeTemplateString(text: string): string {\n return text\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`')\n .replace(/\\$\\{/g, '\\\\${');\n}\n\nexport function isString(obj: any): obj is string {\n return typeof obj === 'string' || obj instanceof String;\n}\n\nexport function toTitleCase(name: string) {\n return name.charAt(0).toUpperCase() + name.substring(1);\n}\n\nexport function toSnakeCase(name: string): string {\n // E.g. ignoreHTTPSErrors => ignore_https_errors.\n return name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toLowerCase();\n}\n\nexport function formatObject(value: any, indent = ' ', mode: 'multiline' | 'oneline' = 'multiline'): string {\n if (value === null)\n return 'null';\n if (typeof value === 'string')\n return escapeWithQuotes(value, '\\'');\n if (Array.isArray(value))\n return `[${value.map(o => formatObject(o)).join(', ')}]`;\n if (typeof value === 'object') {\n const keys = Object.keys(value).filter(key => key !== 'timeout' && value[key] !== undefined).sort();\n if (!keys.length)\n return '{}';\n const tokens: string[] = [];\n for (const key of keys)\n tokens.push(`${key}: ${formatObject(value[key])}`);\n if (mode === 'multiline')\n return `{\\n${tokens.map(t => indent + t).join(`,\\n`)}\\n}`;\n return `{ ${tokens.join(', ')} }`;\n }\n return String(value);\n}\n\nexport function formatObjectOrVoid(value: any, indent = ' '): string {\n const result = formatObject(value, indent);\n return result === '{}' ? '' : result;\n}\n\nexport function quoteCSSAttributeValue(text: string): string {\n return `\"${text.replace(/[\"\\\\]/g, char => '\\\\' + char)}\"`;\n}\n\nlet normalizedWhitespaceCache: Map<string, string> | undefined;\n\nexport function cacheNormalizedWhitespaces() {\n normalizedWhitespaceCache = new Map();\n}\n\nexport function normalizeWhiteSpace(text: string): string {\n let result = normalizedWhitespaceCache?.get(text);\n if (result === undefined) {\n result = text.replace(/[\\u200b\\u00ad]/g, '').trim().replace(/\\s+/g, ' ');\n normalizedWhitespaceCache?.set(text, result);\n }\n return result;\n}\n\nexport function normalizeEscapedRegexQuotes(source: string) {\n // This function reverses the effect of escapeRegexForSelector below.\n // Odd number of backslashes followed by the quote -> remove unneeded backslash.\n return source.replace(/(^|[^\\\\])(\\\\\\\\)*\\\\(['\"`])/g, '$1$2$3');\n}\n\nfunction escapeRegexForSelector(re: RegExp): string {\n // Unicode mode does not allow \"identity character escapes\", so we do not escape and\n // hope that it does not contain quotes and/or >> signs.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Character_escape\n // TODO: rework RE usages in internal selectors away from literal representation to json, e.g. {source,flags}.\n if (re.unicode || (re as any).unicodeSets)\n return String(re);\n // Even number of backslashes followed by the quote -> insert a backslash.\n return String(re).replace(/(^|[^\\\\])(\\\\\\\\)*([\"'`])/g, '$1$2\\\\$3').replace(/>>/g, '\\\\>\\\\>');\n}\n\nexport function escapeForTextSelector(text: string | RegExp, exact: boolean): string {\n if (typeof text !== 'string')\n return escapeRegexForSelector(text);\n return `${JSON.stringify(text)}${exact ? 's' : 'i'}`;\n}\n\nexport function escapeForAttributeSelector(value: string | RegExp, exact: boolean): string {\n if (typeof value !== 'string')\n return escapeRegexForSelector(value);\n // TODO: this should actually be\n // cssEscape(value).replace(/\\\\ /g, ' ')\n // However, our attribute selectors do not conform to CSS parsing spec,\n // so we escape them differently.\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/[\"]/g, '\\\\\"')}\"${exact ? 's' : 'i'}`;\n}\n\nexport function trimString(input: string, cap: number, suffix: string = ''): string {\n if (input.length <= cap)\n return input;\n const chars = [...input];\n if (chars.length > cap)\n return chars.slice(0, cap - suffix.length).join('') + suffix;\n return chars.join('');\n}\n\nexport function trimStringWithEllipsis(input: string, cap: number): string {\n return trimString(input, cap, '\\u2026');\n}\n\nexport function truncateDataUrl(url: string): string {\n // Data URLs can carry megabytes of base64 payload, which is never useful in\n // human/AI-facing output. Keep the media type prefix for context, drop the data.\n if (!url.startsWith('data:'))\n return url;\n const comma = url.indexOf(',');\n if (comma === -1)\n return url;\n return url.slice(0, comma + 1) + '\\u2026';\n}\n\nexport function escapeRegExp(s: string) {\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nconst escaped = { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', '\\'': '&#39;' };\nexport function escapeHTMLAttribute(s: string): string {\n return s.replace(/[&<>\"']/ug, char => (escaped as any)[char]);\n}\nexport function escapeHTML(s: string): string {\n return s.replace(/[&<]/ug, char => (escaped as any)[char]);\n}\n\nexport function longestCommonSubstring(s1: string, s2: string): string {\n const n = s1.length;\n const m = s2.length;\n let maxLen = 0;\n let endingIndex = 0;\n\n // Initialize a 2D array with zeros\n const dp = Array(n + 1)\n .fill(null)\n .map(() => Array(m + 1).fill(0));\n\n // Build the dp table\n for (let i = 1; i <= n; i++) {\n for (let j = 1; j <= m; j++) {\n if (s1[i - 1] === s2[j - 1]) {\n dp[i][j] = dp[i - 1][j - 1] + 1;\n\n if (dp[i][j] > maxLen) {\n maxLen = dp[i][j];\n endingIndex = i;\n }\n }\n }\n }\n\n // Extract the longest common substring\n return s1.slice(endingIndex - maxLen, endingIndex);\n}\n\nexport function parseRegex(regex: string): RegExp {\n if (regex[0] !== '/')\n throw new Error(`Invalid regex, must start with '/': ${regex}`);\n const lastSlash = regex.lastIndexOf('/');\n if (lastSlash <= 0)\n throw new Error(`Invalid regex, must end with '/' followed by optional flags: ${regex}`);\n const source = regex.slice(1, lastSlash);\n const flags = regex.slice(lastSlash + 1);\n return new RegExp(source, flags);\n}\n\nexport function tomlBasicString(value: string): string {\n // JSON.stringify produces a valid TOML basic string: escapes \\\", \\\\, \\n, \\r, \\t and uses \\uXXXX for control chars.\n return JSON.stringify(value);\n}\n\nexport function tomlArray(values: string[]): string {\n return `[${values.map(value => tomlBasicString(value)).join(', ')}]`;\n}\n\nexport function tomlMultilineBasicString(value: string): string {\n // Triple-quoted basic string: escape backslashes first, then any literal \"\"\" sequences.\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"\"\"/g, '\\\\\"\\\\\"\\\\\"');\n return `\"\"\"\\n${escaped}\\n\"\"\"`;\n}\n\n// Semicolons removed from [[\\]()#;?] to avoid polynomial backtracking\n// when both that group and (?:;...)* can match runs of semicolons.\n// \\d{1,4} relaxed to \\d{0,4} so empty params (e.g. ESC[;H) still match.\nexport const ansiRegex = new RegExp('([\\\\u001B\\\\u009B][[\\\\]()#?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)|(?:(?:\\\\d{0,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~])))', 'g');\nexport function stripAnsiEscapes(str: string): string {\n return str.replace(ansiRegex, '');\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport function yamlEscapeKeyIfNeeded(str: string): string {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return `'` + str.replace(/'/g, `''`) + `'`;\n}\n\nexport function yamlEscapeValueIfNeeded(str: string): string {\n if (!yamlStringNeedsQuotes(str))\n return str;\n return '\"' + str.replace(/[\\\\\"\\x00-\\x1f\\x7f-\\x9f]/g, c => {\n switch (c) {\n case '\\\\':\n return '\\\\\\\\';\n case '\"':\n return '\\\\\"';\n case '\\b':\n return '\\\\b';\n case '\\f':\n return '\\\\f';\n case '\\n':\n return '\\\\n';\n case '\\r':\n return '\\\\r';\n case '\\t':\n return '\\\\t';\n default:\n const code = c.charCodeAt(0);\n return '\\\\x' + code.toString(16).padStart(2, '0');\n }\n }) + '\"';\n}\n\nfunction yamlStringNeedsQuotes(str: string): boolean {\n if (str.length === 0)\n return true;\n\n // Strings with leading or trailing whitespace need quotes\n if (/^\\s|\\s$/.test(str))\n return true;\n\n // Strings containing control characters need quotes\n if (/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f-\\x9f]/.test(str))\n return true;\n\n // Strings starting with '-' need quotes\n if (/^-/.test(str))\n return true;\n\n // Strings containing ':' or '\\n' followed by a space or at the end need quotes\n if (/[\\n:](\\s|$)/.test(str))\n return true;\n\n // Strings containing '#' preceded by a space need quotes (comment indicator)\n if (/\\s#/.test(str))\n return true;\n\n // Strings that contain line breaks need quotes\n if (/[\\n\\r]/.test(str))\n return true;\n\n // Strings starting with indicator characters or quotes need quotes\n if (/^[&*\\],?!>|@\"'#%]/.test(str))\n return true;\n\n // Strings containing special characters that could cause ambiguity\n if (/[{}`]/.test(str))\n return true;\n\n // YAML array starts with [\n if (/^\\[/.test(str))\n return true;\n\n // Non-string types recognized by YAML\n if (!isNaN(Number(str)) || ['y', 'n', 'yes', 'no', 'true', 'false', 'on', 'off', 'null'].includes(str.toLowerCase()))\n return true;\n\n return false;\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { escapeRegExp, longestCommonSubstring } from './stringUtils';\nimport { yamlEscapeKeyIfNeeded, yamlEscapeValueIfNeeded } from './yaml';\n\nimport type { AriaNodeJSON, AriaSnapshotJSON } from './ariaSnapshot';\n\nexport type AriaSnapshotYamlOptions = {\n convertStringsToRegex?: boolean;\n lineToNode?: Map<number, AriaNodeJSON>;\n};\n\nexport function renderAriaSnapshotAsYaml(snapshot: AriaSnapshotJSON, options: AriaSnapshotYamlOptions = {}): string {\n const lines: string[] = [];\n const includeText = options.convertStringsToRegex ? textContributesInfo : () => true;\n const renderString = options.convertStringsToRegex ? convertToBestGuessRegex : (str: string) => str;\n\n const visitText = (text: string, depth: number) => {\n const escaped = yamlEscapeValueIfNeeded(renderString(text));\n if (escaped)\n lines.push(indent(depth) + '- text: ' + escaped);\n };\n\n const createKey = (node: AriaNodeJSON): string => {\n let key: string = node.role;\n // Yaml has a limit of 1024 characters per key, and we leave some space for role and attributes.\n if (node.name && node.name.length <= 900) {\n const name = renderString(node.name);\n if (name) {\n // Only a name that was actually converted to a regex may be left unquoted.\n const isRegex = options.convertStringsToRegex && name !== node.name;\n key += ' ' + (isRegex ? name : JSON.stringify(name));\n }\n }\n if (node.checked === 'mixed')\n key += ` [checked=mixed]`;\n if (node.checked === true)\n key += ` [checked]`;\n if (node.disabled)\n key += ` [disabled]`;\n if (node.expanded)\n key += ` [expanded]`;\n if (node.active)\n key += ` [active]`;\n if (node.invalid === 'grammar' || node.invalid === 'spelling')\n key += ` [invalid=${node.invalid}]`;\n if (node.invalid === true)\n key += ` [invalid]`;\n if (node.level)\n key += ` [level=${node.level}]`;\n if (node.pressed === 'mixed')\n key += ` [pressed=mixed]`;\n if (node.pressed === true)\n key += ` [pressed]`;\n if (node.selected === true)\n key += ` [selected]`;\n if (node.ariaHidden)\n key += ` [aria-hidden]`;\n if (node.ref) {\n key += ` [ref=${node.ref}]`;\n if (node.cursor === 'pointer')\n key += ' [cursor=pointer]';\n }\n if (node.box)\n key += ` [box=${node.box.x},${node.box.y},${node.box.width},${node.box.height}]`;\n return key;\n };\n\n const visit = (node: AriaNodeJSON, depth: number) => {\n if (node.role === 'text') {\n visitText(node.text || '', depth);\n return;\n }\n\n options.lineToNode?.set(lines.length, node);\n const escapedKey = indent(depth) + '- ' + yamlEscapeKeyIfNeeded(createKey(node));\n const props: [string, string][] = [];\n if (node.url !== undefined)\n props.push(['url', node.url]);\n if (node.placeholder !== undefined)\n props.push(['placeholder', node.placeholder]);\n\n if (node.text === undefined && !props.length && !node.children?.length) {\n // Leaf node without children.\n lines.push(escapedKey);\n } else if (node.text !== undefined && !props.length) {\n // Leaf node with just some text inside.\n if (includeText(node, node.text))\n lines.push(escapedKey + ': ' + yamlEscapeValueIfNeeded(renderString(node.text)));\n else\n lines.push(escapedKey);\n } else {\n // Node with (optional) props and some children.\n lines.push(escapedKey + ':');\n for (const [name, value] of props)\n lines.push(indent(depth + 1) + '- /' + name + ': ' + yamlEscapeValueIfNeeded(value));\n if (node.text !== undefined) {\n visitText(includeText(node, node.text) ? node.text : '', depth + 1);\n } else {\n for (const child of node.children || []) {\n if (typeof child === 'string')\n visitText(includeText(node, child) ? child : '', depth + 1);\n else\n visit(child, depth + 1);\n }\n }\n }\n };\n\n for (const node of snapshot)\n visit(node, 0);\n return lines.join('\\n');\n}\n\nfunction indent(depth: number): string {\n return ' '.repeat(depth);\n}\n\nfunction convertToBestGuessRegex(text: string): string {\n const dynamicContent = [\n // 550e8400-e29b-41d4-a716-446655440000\n { regex: /\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b/, replacement: '[0-9a-fA-F-]+' },\n // 2mb\n { regex: /\\b[\\d,.]+[bkmBKM]+\\b/, replacement: '[\\\\d,.]+[bkmBKM]+' },\n // 2ms, 20s\n { regex: /\\b\\d+[hmsp]+\\b/, replacement: '\\\\d+[hmsp]+' },\n { regex: /\\b[\\d,.]+[hmsp]+\\b/, replacement: '[\\\\d,.]+[hmsp]+' },\n // Do not replace single digits with regex by default.\n // 2+ digits: [Issue 22, 22.3, 2.33, 2,333]\n { regex: /\\b\\d+,\\d+\\b/, replacement: '\\\\d+,\\\\d+' },\n { regex: /\\b\\d+\\.\\d{2,}\\b/, replacement: '\\\\d+\\\\.\\\\d+' },\n { regex: /\\b\\d{2,}\\.\\d+\\b/, replacement: '\\\\d+\\\\.\\\\d+' },\n { regex: /\\b\\d{2,}\\b/, replacement: '\\\\d+' },\n ];\n\n let pattern = '';\n let lastIndex = 0;\n\n const combinedRegex = new RegExp(dynamicContent.map(r => '(' + r.regex.source + ')').join('|'), 'g');\n text.replace(combinedRegex, (match, ...args) => {\n const offset = args[args.length - 2];\n const groups = args.slice(0, -2);\n pattern += escapeRegExp(text.slice(lastIndex, offset));\n for (let i = 0; i < groups.length; i++) {\n if (groups[i]) {\n const { replacement } = dynamicContent[i];\n pattern += replacement;\n break;\n }\n }\n lastIndex = offset + match.length;\n return match;\n });\n if (!pattern)\n return text;\n\n pattern += escapeRegExp(text.slice(lastIndex));\n return String(new RegExp(pattern));\n}\n\nfunction textContributesInfo(node: AriaNodeJSON, text: string): boolean {\n if (!text.length)\n return false;\n\n if (!node.name)\n return true;\n\n // Figure out if text adds any value. \"longestCommonSubstring\" is expensive, so limit strings length.\n const substr = (text.length <= 200 && node.name.length <= 200) ? longestCommonSubstring(text, node.name) : '';\n let filtered = text;\n while (substr && filtered.includes(substr))\n filtered = filtered.replace(substr, '');\n return filtered.trim().length / text.length > 0.1;\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { hasPointerCursor } from '../isomorphic/ariaSnapshot';\nimport { normalizeWhiteSpace } from '../isomorphic/stringUtils';\n\nimport type * as aria from '../isomorphic/ariaSnapshot';\nimport type { AriaSnapshot, AriaTreeOptions } from './ariaSnapshot';\n\n// Distillation makes the snapshot less verbose without losing information: after the full tree is\n// built, a single traversal applies the chained plugins below, babel-style. Each plugin is a\n// visitor: `enter` runs pre-order, `exit` runs post-order after the children were traversed - and\n// possibly removed, unwrapped or inlined. Either hook can detach the node by returning 'remove'\n// (from `enter`, the subtree is then not traversed and no further hooks run for it), or replace\n// the node with its children by returning 'unwrap' (from `enter`, the hoisted children are\n// re-visited in the node's place; from `exit`, they were already traversed and are spliced in as\n// is). Plugins mutate the tree in place; `snapshot.info` and `snapshot.refs` are left intact, so\n// refs of removed nodes still resolve through the aria-ref selector engine.\ntype DistillerContext = {\n snapshot: AriaSnapshot;\n // Depth of the current node; children of the root fragment are at depth 0.\n depth: number;\n // Render depth limit, plugins should not rely on anything below it being rendered.\n maxDepth: number | undefined;\n // The chain of ancestors of the current node, root first. Maintained by the traversal.\n ancestors: aria.AriaNode[];\n // Content refs of the entered nodes' accessible names that are not yet represented in the\n // output - see `removeRedundantNames`.\n pendingContentRefs: Set<string>;\n};\n\ntype DistillerPlugin = {\n name: string;\n enter?(node: aria.AriaNode, ctx: DistillerContext): 'remove' | 'unwrap' | void;\n exit?(node: aria.AriaNode, ctx: DistillerContext): 'remove' | 'unwrap' | void;\n};\n\nexport function distillAriaSnapshot(snapshot: AriaSnapshot, options: Pick<AriaTreeOptions, 'mode' | 'depth'>) {\n runPlugins(snapshot, options.mode === 'ai' ? aiPlugins : normalizePlugins, options);\n}\n\nfunction runPlugins(snapshot: AriaSnapshot, plugins: DistillerPlugin[], options: Pick<AriaTreeOptions, 'depth'>) {\n const ctx: DistillerContext = { snapshot, depth: -1, maxDepth: options.depth, ancestors: [], pendingContentRefs: new Set() };\n const traverse = (node: aria.AriaNode, depth: number) => {\n const children: (aria.AriaNode | string)[] = [];\n const visitChild = (child: aria.AriaNode | string) => {\n if (typeof child === 'string') {\n children.push(child);\n return;\n }\n ctx.depth = depth + 1;\n for (const plugin of plugins) {\n const result = plugin.enter?.(child, ctx);\n if (result === 'remove')\n return;\n if (result === 'unwrap') {\n child.children.forEach(visitChild);\n return;\n }\n }\n traverse(child, depth + 1);\n ctx.depth = depth + 1;\n for (const plugin of plugins) {\n const result = plugin.exit?.(child, ctx);\n if (result === 'remove')\n return;\n if (result === 'unwrap') {\n children.push(...child.children);\n return;\n }\n }\n children.push(child);\n };\n ctx.ancestors.push(node);\n node.children.forEach(visitChild);\n ctx.ancestors.pop();\n node.children = children;\n };\n // Hooks run on the root as well, but the root cannot be removed or unwrapped.\n for (const plugin of plugins)\n plugin.enter?.(snapshot.root, ctx);\n traverse(snapshot.root, -1);\n ctx.depth = -1;\n for (const plugin of plugins)\n plugin.exit?.(snapshot.root, ctx);\n}\n\n// A generic node whose only content is text - it carries no structure of its own.\nfunction isLeafGeneric(node: aria.AriaNode): boolean {\n return node.role === 'generic' && node.children.every(child => typeof child === 'string');\n}\n\n// Removing the click target root would hide an actionable element from the snapshot.\nfunction isClickTargetRoot(node: aria.AriaNode, ctx: DistillerContext): boolean {\n return !!node.ref && hasPointerCursor(node) && !ctx.ancestors.some(ancestor => !!ancestor.ref && hasPointerCursor(ancestor));\n}\n\n// The tree builder emits raw text tokens - text nodes, CSS content, block spacing markers - as\n// string children. Coalesce the adjacent ones, normalize whitespace and drop the empties, then\n// drop a lone text child that merely repeats the node's accessible name. Runs on `exit`, so the\n// merge sees the children in their final shape.\nconst mergeStringChildren: DistillerPlugin = {\n name: 'mergeStringChildren',\n exit(node: aria.AriaNode) {\n const children: (aria.AriaNode | string)[] = [];\n const buffer: string[] = [];\n const flush = () => {\n if (!buffer.length)\n return;\n const text = normalizeWhiteSpace(buffer.join(''));\n if (text)\n children.push(text);\n buffer.length = 0;\n };\n for (const child of node.children) {\n if (typeof child === 'string') {\n buffer.push(child);\n } else {\n flush();\n children.push(child);\n }\n }\n flush();\n node.children = children;\n if (node.children.length === 1 && node.children[0] === node.name)\n node.children = [];\n },\n};\n\n// Only unwrap a generic that encloses at most one element, logical grouping still makes sense,\n// even if it is not ref-able. The decision is made on `exit` - whether the node encloses a single\n// ref-bearing child is only known after its own descendants were unwrapped - so nested wrappers\n// collapse bottom-up. A generic emptied by the other plugins is dropped, unless it is the\n// click target root, for example an icon-only button.\nconst unwrapSingleChildGenerics: DistillerPlugin = {\n name: 'unwrapSingleChildGenerics',\n exit(node: aria.AriaNode, ctx: DistillerContext): 'unwrap' | void {\n if (node.role !== 'generic' || node.name || node.children.length > 1 || !node.children.every(child => typeof child !== 'string' && !!child.ref))\n return;\n if (!node.children.length && isClickTargetRoot(node, ctx))\n return;\n return 'unwrap';\n },\n};\n\n// A decorative image - role `img` with no accessible name and no content - carries no\n// information. The decision is made on `exit` - whether the node has content is only known after\n// `mergeStringChildren` dropped the empty text tokens. A clickable image outside of any clickable\n// container is not decorative though - e.g. a bare svg icon acting as a button - and is kept.\nconst removeNamelessImages: DistillerPlugin = {\n name: 'removeNamelessImages',\n exit(node: aria.AriaNode, ctx: DistillerContext): 'remove' | void {\n if (node.role === 'img' && !node.name && !node.children.length && !isClickTargetRoot(node, ctx))\n return 'remove';\n },\n};\n\n// The node's accessible name is derived from content; when every node that contributed to it is\n// represented in the output anyway, the name would just repeat that content and is dropped.\n// Single-pass bookkeeping over the shared `pendingContentRefs` set: entering a node clears its\n// own ref - it is now represented - except for leaf generics, which only exist to supply text\n// and are dropped by `removeNameRepeatingChild` once a kept name shows it. On exit, either every\n// contributor was cleared and the name goes, or the kept name now represents its contributors,\n// so they are cleared for the benefit of the ancestors. A node removed on enter never clears its\n// ref, and an unwrapped one does - matching what remains in the tree.\nconst removeRedundantNames: DistillerPlugin = {\n name: 'removeRedundantNames',\n enter(node: aria.AriaNode, ctx: DistillerContext) {\n if (!node.ref)\n return;\n for (const ref of ctx.snapshot.info.get(node.ref)?.nameFromContentRefs || [])\n ctx.pendingContentRefs.add(ref);\n const beyondDepth = !!ctx.maxDepth && ctx.depth > ctx.maxDepth;\n if (!beyondDepth && !isLeafGeneric(node))\n ctx.pendingContentRefs.delete(node.ref);\n },\n exit(node: aria.AriaNode, ctx: DistillerContext) {\n if (!node.ref)\n return;\n const nameFromContentRefs = ctx.snapshot.info.get(node.ref)?.nameFromContentRefs;\n if (!nameFromContentRefs?.length)\n return;\n if (nameFromContentRefs.every(ref => !ctx.pendingContentRefs.has(ref))) {\n node.name = '';\n } else {\n for (const ref of nameFromContentRefs)\n ctx.pendingContentRefs.delete(ref);\n }\n },\n};\n\n// A generic whose whole content is a piece of text - a single text child, or just an accessible\n// name - that repeats the parent's accessible name adds no information, so it removes itself.\n// `inlineTextIntoGeneric` runs first, bubbling text up through nameless wrappers, so by the time\n// a wrapper exits its text faces the real parent - no need to look further up the ancestor chain.\n// The removed text then only survives through the names derived from it, so the node's ref is\n// marked pending again - it may have been cleared on enter, before the node's other children\n// (e.g. a decorative image) were distilled away - and `removeRedundantNames` keeps those names.\nconst removeNameRepeatingChild: DistillerPlugin = {\n name: 'removeNameRepeatingChild',\n exit(node: aria.AriaNode, ctx: DistillerContext): 'remove' | void {\n const parent = ctx.ancestors[ctx.ancestors.length - 1];\n if (!parent?.name || node.role !== 'generic' || node.active || Object.keys(node.props).length)\n return;\n const singleTextChild = node.children.length === 1 && typeof node.children[0] === 'string' ? node.children[0] : undefined;\n const text = node.name ? (node.children.length ? undefined : node.name) : singleTextChild;\n if (text && text === parent.name) {\n if (node.ref)\n ctx.pendingContentRefs.add(node.ref);\n return 'remove';\n }\n },\n};\n\n// A generic whose only child is a nameless leaf generic inlines that child's text:\n// `generic: - generic: \"text\"` becomes `generic: \"text\"`. Runs post-order, so chains collapse\n// bottom-up, and after the other plugins already removed or unwrapped the children.\nconst inlineTextIntoGeneric: DistillerPlugin = {\n name: 'inlineTextIntoGeneric',\n exit(node: aria.AriaNode) {\n if (node.role !== 'generic' || Object.keys(node.props).length || node.children.length !== 1)\n return;\n const child = node.children[0];\n if (typeof child === 'string')\n return;\n if (child.role !== 'generic' || child.name || child.active || Object.keys(child.props).length)\n return;\n if (child.children.length === 1 && typeof child.children[0] === 'string')\n node.children = [child.children[0]];\n },\n};\n\n// Structural normalization applies to all modes - it defines the canonical tree shape.\nconst normalizePlugins: DistillerPlugin[] = [\n mergeStringChildren,\n unwrapSingleChildGenerics,\n];\n\n// The ai preset compresses the snapshot on top of normalization. It runs as one traversal:\n// `removeRedundantNames` bookkeeping must observe every node the tree retains, including the\n// wrappers that `unwrapSingleChildGenerics` is about to unwrap. On exit, text is first inlined\n// into the node, so that `removeNameRepeatingChild` faces the real parent when it compares.\nconst aiPlugins: DistillerPlugin[] = [\n mergeStringChildren,\n removeNamelessImages,\n removeRedundantNames,\n inlineTextIntoGeneric,\n removeNameRepeatingChild,\n unwrapSingleChildGenerics,\n];\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ntype GlobalOptions = {\n browserNameForWorkarounds?: string;\n};\nlet globalOptions: GlobalOptions = {};\nexport function setGlobalOptions(options: GlobalOptions) {\n globalOptions = options;\n}\n\nexport function isInsideScope(scope: Node, element: Element | undefined): boolean {\n while (element) {\n if (scope.contains(element))\n return true;\n element = enclosingShadowHost(element);\n }\n return false;\n}\n\nexport function enclosingElement(node: Node) {\n if (node.nodeType === 1 /* Node.ELEMENT_NODE */)\n return node as Element;\n return node.parentElement ?? undefined;\n}\n\nexport function parentElementOrShadowHost(element: Element): Element | undefined {\n if (element.parentElement)\n return element.parentElement;\n if (!element.parentNode)\n return;\n if (element.parentNode.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */ && (element.parentNode as ShadowRoot).host)\n return (element.parentNode as ShadowRoot).host;\n}\n\nexport function enclosingShadowRootOrDocument(element: Element): Document | ShadowRoot | undefined {\n let node: Node = element;\n while (node.parentNode)\n node = node.parentNode;\n if (node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */ || node.nodeType === 9 /* Node.DOCUMENT_NODE */)\n return node as Document | ShadowRoot;\n}\n\nfunction enclosingShadowHost(element: Element): Element | undefined {\n while (element.parentElement)\n element = element.parentElement;\n return parentElementOrShadowHost(element);\n}\n\n// Assumption: if scope is provided, element must be inside scope's subtree.\nexport function closestCrossShadow(element: Element | undefined, css: string, scope?: Document | Element): Element | undefined {\n while (element) {\n const closest = element.closest(css);\n if (scope && closest !== scope && closest?.contains(scope))\n return;\n if (closest)\n return closest;\n element = enclosingShadowHost(element);\n }\n}\n\nexport function getElementComputedStyle(element: Element, pseudo?: string): CSSStyleDeclaration | undefined {\n const cache = pseudo === '::before' ? cacheStyleBefore : pseudo === '::after' ? cacheStyleAfter : cacheStyle;\n if (cache && cache.has(element))\n return cache.get(element);\n const style = element.ownerDocument && element.ownerDocument.defaultView ? element.ownerDocument.defaultView.getComputedStyle(element, pseudo) : undefined;\n cache?.set(element, style);\n return style;\n}\n\nexport function isElementStyleVisibilityVisible(element: Element, style?: CSSStyleDeclaration): boolean {\n const cached = cacheStyleVisibility?.get(element);\n if (cached !== undefined)\n return cached;\n const result = computeElementStyleVisibilityVisible(element, style);\n cacheStyleVisibility?.set(element, result);\n return result;\n}\n\nfunction computeElementStyleVisibilityVisible(element: Element, style?: CSSStyleDeclaration): boolean {\n style = style ?? getElementComputedStyle(element);\n if (!style)\n return true;\n // Element.checkVisibility checks for content-visibility and also looks at\n // styles up the flat tree including user-agent ShadowRoots, such as the\n // details element for example.\n if (!element.checkVisibility() && !isWebKitListBoxOptionVisible(element, style))\n return false;\n if (style.visibility !== 'visible')\n return false;\n return true;\n}\n\nexport function isListBoxSelect(select: HTMLSelectElement): boolean {\n return select.multiple || select.size > 1;\n}\n\n// WebKit does not create renderers for list box options, so checkVisibility() returns false for them.\nfunction isWebKitListBoxOptionVisible(element: Element, style: CSSStyleDeclaration): boolean {\n if (globalOptions.browserNameForWorkarounds !== 'webkit' || element.nodeName !== 'OPTION' || style.display === 'none')\n return false;\n const select = element.closest('select');\n if (!select || !isListBoxSelect(select))\n return false;\n for (let e = element.parentElement; e && e !== select; e = e.parentElement) {\n if (getElementComputedStyle(e)?.display === 'none')\n return false;\n }\n return isElementStyleVisibilityVisible(select);\n}\n\nexport function computeBox(element: Element) {\n // Note: this logic should be similar to waitForDisplayedAtStablePosition() to avoid surprises.\n const style = getElementComputedStyle(element);\n if (!style)\n return { visible: true, inline: false };\n const cursor = style.cursor;\n if (style.display === 'contents') {\n // display:contents is not rendered itself, but its child nodes are.\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 /* Node.ELEMENT_NODE */ && isElementVisible(child as Element))\n return { visible: true, inline: false, cursor };\n if (child.nodeType === 3 /* Node.TEXT_NODE */ && isVisibleTextNode(child as Text))\n return { visible: true, inline: true, cursor };\n }\n return { visible: false, inline: false, cursor };\n }\n if (!isElementStyleVisibilityVisible(element, style))\n return { cursor, visible: false, inline: false };\n const rect = element.getBoundingClientRect();\n return { cursor, visible: rect.width > 0 && rect.height > 0, inline: style.display === 'inline' };\n}\n\nexport function isElementVisible(element: Element): boolean {\n return computeBox(element).visible;\n}\n\nconst kTextNodeRange = Symbol('playwrightTextNodeRange');\n\nexport function isVisibleTextNode(node: Text) {\n // https://stackoverflow.com/questions/1461059/is-there-an-equivalent-to-getboundingclientrect-for-text-nodes\n // Reuse a single range per document. Browsers update every live range upon each DOM mutation\n // until the range is garbage collected, so creating a range per text node slows the page down.\n const document = node.ownerDocument as Document & { [kTextNodeRange]?: Range };\n const range = (document[kTextNodeRange] ??= document.createRange());\n range.selectNode(node);\n const rect = range.getBoundingClientRect();\n const result = rect.width > 0 && rect.height > 0;\n // Collapse the range back to the document, so that it does not retain the node.\n range.setStart(document, 0);\n range.collapse(true);\n return result;\n}\n\nexport function elementSafeTagName(element: Element) {\n const tagName = element.tagName;\n if (typeof tagName === 'string') { // Fast path.\n // Tag names in html documents are already uppercase. Lowercase names come from\n // svg/mathml elements and from xml/xhtml documents, and they all start with\n // a lowercase letter, so uppercasing can be skipped otherwise.\n const firstCharCode = tagName.charCodeAt(0);\n if (firstCharCode >= 97 && firstCharCode <= 122)\n return tagName.toUpperCase();\n return tagName;\n }\n // Named inputs, e.g. <input name=tagName>, will be exposed as fields on the parent <form>\n // and override its properties.\n if (element instanceof HTMLFormElement)\n return 'FORM';\n // Elements from the svg namespace do not have uppercase tagName right away.\n return element.tagName.toUpperCase();\n}\n\nlet cacheStyle: Map<Element, CSSStyleDeclaration | undefined> | undefined;\nlet cacheStyleBefore: Map<Element, CSSStyleDeclaration | undefined> | undefined;\nlet cacheStyleAfter: Map<Element, CSSStyleDeclaration | undefined> | undefined;\nlet cacheStyleVisibility: Map<Element, boolean> | undefined;\nlet cachesCounter = 0;\n\nexport function beginDOMCaches() {\n ++cachesCounter;\n cacheStyle ??= new Map();\n cacheStyleBefore ??= new Map();\n cacheStyleAfter ??= new Map();\n cacheStyleVisibility ??= new Map();\n}\n\nexport function endDOMCaches() {\n if (!--cachesCounter) {\n cacheStyle = undefined;\n cacheStyleBefore = undefined;\n cacheStyleAfter = undefined;\n cacheStyleVisibility = undefined;\n }\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/* eslint-disable notice/notice */\n\n/*\n * The code in this file is licensed under the CC0 license.\n * http://creativecommons.org/publicdomain/zero/1.0/\n * It is free to use for any purpose. No attribution, permission, or reproduction of this license is required.\n */\n\n// Original at https://github.com/tabatkins/parse-css\n// Changes:\n// - JS is replaced with TS.\n// - Universal Module Definition wrapper is removed.\n// - Everything not related to tokenizing - below the first exports block - is removed.\n\nexport interface CSSTokenInterface {\n toSource(): string;\n value: string | number | undefined;\n}\n\nconst between = function(num: number, first: number, last: number) { return num >= first && num <= last; };\nfunction digit(code: number) { return between(code, 0x30, 0x39); }\nfunction hexdigit(code: number) { return digit(code) || between(code, 0x41, 0x46) || between(code, 0x61, 0x66); }\nfunction uppercaseletter(code: number) { return between(code, 0x41, 0x5a); }\nfunction lowercaseletter(code: number) { return between(code, 0x61, 0x7a); }\nfunction letter(code: number) { return uppercaseletter(code) || lowercaseletter(code); }\nfunction nonascii(code: number) { return code >= 0x80; }\nfunction namestartchar(code: number) { return letter(code) || nonascii(code) || code === 0x5f; }\nfunction namechar(code: number) { return namestartchar(code) || digit(code) || code === 0x2d; }\nfunction nonprintable(code: number) { return between(code, 0, 8) || code === 0xb || between(code, 0xe, 0x1f) || code === 0x7f; }\nfunction newline(code: number) { return code === 0xa; }\nfunction whitespace(code: number) { return newline(code) || code === 9 || code === 0x20; }\n\nconst maximumallowedcodepoint = 0x10ffff;\n\nexport class InvalidCharacterError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidCharacterError';\n }\n}\n\nfunction preprocess(str: string): number[] {\n // Turn a string into an array of code points,\n // following the preprocessing cleanup rules.\n const codepoints = [];\n for (let i = 0; i < str.length; i++) {\n let code = str.charCodeAt(i);\n if (code === 0xd && str.charCodeAt(i + 1) === 0xa) {\n code = 0xa; i++;\n }\n if (code === 0xd || code === 0xc)\n code = 0xa;\n if (code === 0x0)\n code = 0xfffd;\n if (between(code, 0xd800, 0xdbff) && between(str.charCodeAt(i + 1), 0xdc00, 0xdfff)) {\n // Decode a surrogate pair into an astral codepoint.\n const lead = code - 0xd800;\n const trail = str.charCodeAt(i + 1) - 0xdc00;\n code = Math.pow(2, 16) + lead * Math.pow(2, 10) + trail;\n i++;\n }\n codepoints.push(code);\n }\n return codepoints;\n}\n\nfunction stringFromCode(code: number) {\n if (code <= 0xffff)\n return String.fromCharCode(code);\n // Otherwise, encode astral char as surrogate pair.\n code -= Math.pow(2, 16);\n const lead = Math.floor(code / Math.pow(2, 10)) + 0xd800;\n const trail = code % Math.pow(2, 10) + 0xdc00;\n return String.fromCharCode(lead) + String.fromCharCode(trail);\n}\n\nexport function tokenize(str1: string): CSSTokenInterface[] {\n const str = preprocess(str1);\n let i = -1;\n const tokens: CSSTokenInterface[] = [];\n let code: number;\n\n // Line number information.\n let line = 0;\n let column = 0;\n // The only use of lastLineLength is in reconsume().\n let lastLineLength = 0;\n const incrLineno = function() {\n line += 1;\n lastLineLength = column;\n column = 0;\n };\n const locStart = { line: line, column: column };\n\n const codepoint = function(i: number): number {\n if (i >= str.length)\n return -1;\n\n return str[i];\n };\n const next = function(num?: number) {\n if (num === undefined)\n num = 1;\n if (num > 3)\n throw 'Spec Error: no more than three codepoints of lookahead.';\n return codepoint(i + num);\n };\n const consume = function(num?: number): boolean {\n if (num === undefined)\n num = 1;\n i += num;\n code = codepoint(i);\n if (newline(code))\n incrLineno();\n else\n column += num;\n // console.log('Consume '+i+' '+String.fromCharCode(code) + ' 0x' + code.toString(16));\n return true;\n };\n const reconsume = function() {\n i -= 1;\n if (newline(code)) {\n line -= 1;\n column = lastLineLength;\n } else {\n column -= 1;\n }\n locStart.line = line;\n locStart.column = column;\n return true;\n };\n const eof = function(codepoint?: number): boolean {\n if (codepoint === undefined)\n codepoint = code;\n return codepoint === -1;\n };\n const donothing = function() { };\n const parseerror = function() {\n // Language bindings don't like writing to stdout!\n // console.log('Parse error at index ' + i + ', processing codepoint 0x' + code.toString(16) + '.'); return true;\n };\n\n const consumeAToken = function(): CSSTokenInterface {\n consumeComments();\n consume();\n if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n return new WhitespaceToken();\n } else if (code === 0x22) {return consumeAStringToken();} else if (code === 0x23) {\n if (namechar(next()) || areAValidEscape(next(1), next(2))) {\n const token = new HashToken('');\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n token.type = 'id';\n token.value = consumeAName();\n return token;\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x24) {\n if (next() === 0x3d) {\n consume();\n return new SuffixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x27) {return consumeAStringToken();} else if (code === 0x28) {return new OpenParenToken();} else if (code === 0x29) {return new CloseParenToken();} else if (code === 0x2a) {\n if (next() === 0x3d) {\n consume();\n return new SubstringMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x2b) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x2c) {return new CommaToken();} else if (code === 0x2d) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else if (next(1) === 0x2d && next(2) === 0x3e) {\n consume(2);\n return new CDCToken();\n } else if (startsWithAnIdentifier()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x2e) {\n if (startsWithANumber()) {\n reconsume();\n return consumeANumericToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x3a) {return new ColonToken();} else if (code === 0x3b) {return new SemicolonToken();} else if (code === 0x3c) {\n if (next(1) === 0x21 && next(2) === 0x2d && next(3) === 0x2d) {\n consume(3);\n return new CDOToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x40) {\n if (wouldStartAnIdentifier(next(1), next(2), next(3)))\n return new AtKeywordToken(consumeAName());\n else\n return new DelimToken(code);\n\n } else if (code === 0x5b) {return new OpenSquareToken();} else if (code === 0x5c) {\n if (startsWithAValidEscape()) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else {\n parseerror();\n return new DelimToken(code);\n }\n } else if (code === 0x5d) {return new CloseSquareToken();} else if (code === 0x5e) {\n if (next() === 0x3d) {\n consume();\n return new PrefixMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x7b) {return new OpenCurlyToken();} else if (code === 0x7c) {\n if (next() === 0x3d) {\n consume();\n return new DashMatchToken();\n } else if (next() === 0x7c) {\n consume();\n return new ColumnToken();\n } else {\n return new DelimToken(code);\n }\n } else if (code === 0x7d) {return new CloseCurlyToken();} else if (code === 0x7e) {\n if (next() === 0x3d) {\n consume();\n return new IncludeMatchToken();\n } else {\n return new DelimToken(code);\n }\n } else if (digit(code)) {\n reconsume();\n return consumeANumericToken();\n } else if (namestartchar(code)) {\n reconsume();\n return consumeAnIdentlikeToken();\n } else if (eof()) {return new EOFToken();} else {return new DelimToken(code);}\n };\n\n const consumeComments = function() {\n while (next(1) === 0x2f && next(2) === 0x2a) {\n consume(2);\n while (true) {\n consume();\n if (code === 0x2a && next() === 0x2f) {\n consume();\n break;\n } else if (eof()) {\n parseerror();\n return;\n }\n }\n }\n };\n\n const consumeANumericToken = function() {\n const num = consumeANumber();\n if (wouldStartAnIdentifier(next(1), next(2), next(3))) {\n const token = new DimensionToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n token.unit = consumeAName();\n return token;\n } else if (next() === 0x25) {\n consume();\n const token = new PercentageToken();\n token.value = num.value;\n token.repr = num.repr;\n return token;\n } else {\n const token = new NumberToken();\n token.value = num.value;\n token.repr = num.repr;\n token.type = num.type;\n return token;\n }\n };\n\n const consumeAnIdentlikeToken = function(): CSSTokenInterface {\n const str = consumeAName();\n if (str.toLowerCase() === 'url' && next() === 0x28) {\n consume();\n while (whitespace(next(1)) && whitespace(next(2)))\n consume();\n if (next() === 0x22 || next() === 0x27)\n return new FunctionToken(str);\n else if (whitespace(next()) && (next(2) === 0x22 || next(2) === 0x27))\n return new FunctionToken(str);\n else\n return consumeAURLToken();\n\n } else if (next() === 0x28) {\n consume();\n return new FunctionToken(str);\n } else {\n return new IdentToken(str);\n }\n };\n\n const consumeAStringToken = function(endingCodePoint?: number): CSSParserToken {\n if (endingCodePoint === undefined)\n endingCodePoint = code;\n let string = '';\n while (consume()) {\n if (code === endingCodePoint || eof()) {\n return new StringToken(string);\n } else if (newline(code)) {\n parseerror();\n reconsume();\n return new BadStringToken();\n } else if (code === 0x5c) {\n if (eof(next()))\n donothing();\n else if (newline(next()))\n consume();\n else\n string += stringFromCode(consumeEscape());\n\n } else {\n string += stringFromCode(code);\n }\n }\n throw new Error('Internal error');\n };\n\n const consumeAURLToken = function(): CSSTokenInterface {\n const token = new URLToken('');\n while (whitespace(next()))\n consume();\n if (eof(next()))\n return token;\n while (consume()) {\n if (code === 0x29 || eof()) {\n return token;\n } else if (whitespace(code)) {\n while (whitespace(next()))\n consume();\n if (next() === 0x29 || eof(next())) {\n consume();\n return token;\n } else {\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else if (code === 0x22 || code === 0x27 || code === 0x28 || nonprintable(code)) {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n } else if (code === 0x5c) {\n if (startsWithAValidEscape()) {\n token.value += stringFromCode(consumeEscape());\n } else {\n parseerror();\n consumeTheRemnantsOfABadURL();\n return new BadURLToken();\n }\n } else {\n token.value += stringFromCode(code);\n }\n }\n throw new Error('Internal error');\n };\n\n const consumeEscape = function() {\n // Assume the current character is the \\\n // and the next code point is not a newline.\n consume();\n if (hexdigit(code)) {\n // Consume 1-6 hex digits\n const digits = [code];\n for (let total = 0; total < 5; total++) {\n if (hexdigit(next())) {\n consume();\n digits.push(code);\n } else {\n break;\n }\n }\n if (whitespace(next()))\n consume();\n let value = parseInt(digits.map(function(x) { return String.fromCharCode(x); }).join(''), 16);\n if (value > maximumallowedcodepoint)\n value = 0xfffd;\n return value;\n } else if (eof()) {\n return 0xfffd;\n } else {\n return code;\n }\n };\n\n const areAValidEscape = function(c1: number, c2: number) {\n if (c1 !== 0x5c)\n return false;\n if (newline(c2))\n return false;\n return true;\n };\n const startsWithAValidEscape = function() {\n return areAValidEscape(code, next());\n };\n\n const wouldStartAnIdentifier = function(c1: number, c2: number, c3: number) {\n if (c1 === 0x2d)\n return namestartchar(c2) || c2 === 0x2d || areAValidEscape(c2, c3);\n else if (namestartchar(c1))\n return true;\n else if (c1 === 0x5c)\n return areAValidEscape(c1, c2);\n else\n return false;\n\n };\n const startsWithAnIdentifier = function() {\n return wouldStartAnIdentifier(code, next(1), next(2));\n };\n\n const wouldStartANumber = function(c1: number, c2: number, c3: number) {\n if (c1 === 0x2b || c1 === 0x2d) {\n if (digit(c2))\n return true;\n if (c2 === 0x2e && digit(c3))\n return true;\n return false;\n } else if (c1 === 0x2e) {\n if (digit(c2))\n return true;\n return false;\n } else if (digit(c1)) {\n return true;\n } else {\n return false;\n }\n };\n const startsWithANumber = function() {\n return wouldStartANumber(code, next(1), next(2));\n };\n\n const consumeAName = function(): string {\n let result = '';\n while (consume()) {\n if (namechar(code)) {\n result += stringFromCode(code);\n } else if (startsWithAValidEscape()) {\n result += stringFromCode(consumeEscape());\n } else {\n reconsume();\n return result;\n }\n }\n throw new Error('Internal parse error');\n };\n\n const consumeANumber = function() {\n let repr = '';\n let type = 'integer';\n if (next() === 0x2b || next() === 0x2d) {\n consume();\n repr += stringFromCode(code);\n }\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n if (next(1) === 0x2e && digit(next(2))) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = 'number';\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const c1 = next(1);\n const c2 = next(2);\n const c3 = next(3);\n if ((c1 === 0x45 || c1 === 0x65) && digit(c2)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = 'number';\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n } else if ((c1 === 0x45 || c1 === 0x65) && (c2 === 0x2b || c2 === 0x2d) && digit(c3)) {\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n consume();\n repr += stringFromCode(code);\n type = 'number';\n while (digit(next())) {\n consume();\n repr += stringFromCode(code);\n }\n }\n const value = convertAStringToANumber(repr);\n return { type: type, value: value, repr: repr };\n };\n\n const convertAStringToANumber = function(string: string): number {\n // CSS's number rules are identical to JS, afaik.\n return +string;\n };\n\n const consumeTheRemnantsOfABadURL = function() {\n while (consume()) {\n if (code === 0x29 || eof()) {\n return;\n } else if (startsWithAValidEscape()) {\n consumeEscape();\n donothing();\n } else {\n donothing();\n }\n }\n };\n\n let iterationCount = 0;\n while (!eof(next())) {\n tokens.push(consumeAToken());\n iterationCount++;\n if (iterationCount > str.length * 2)\n throw new Error(\"I'm infinite-looping!\");\n }\n return tokens;\n}\n\nexport class CSSParserToken implements CSSTokenInterface {\n tokenType = '';\n value: string | number | undefined;\n toJSON(): any {\n return { token: this.tokenType };\n }\n toString() { return this.tokenType; }\n toSource() { return '' + this; }\n}\n\nexport class BadStringToken extends CSSParserToken {\n override tokenType = 'BADSTRING';\n}\n\nexport class BadURLToken extends CSSParserToken {\n override tokenType = 'BADURL';\n}\n\nexport class WhitespaceToken extends CSSParserToken {\n override tokenType = 'WHITESPACE';\n override toString() { return 'WS'; }\n override toSource() { return ' '; }\n}\n\nexport class CDOToken extends CSSParserToken {\n override tokenType = 'CDO';\n override toSource() { return '<!--'; }\n}\n\nexport class CDCToken extends CSSParserToken {\n override tokenType = 'CDC';\n override toSource() { return '-->'; }\n}\n\nexport class ColonToken extends CSSParserToken {\n override tokenType = ':';\n}\n\nexport class SemicolonToken extends CSSParserToken {\n override tokenType = ';';\n}\n\nexport class CommaToken extends CSSParserToken {\n override tokenType = ',';\n}\n\nexport class GroupingToken extends CSSParserToken {\n override value = '';\n mirror = '';\n}\n\nexport class OpenCurlyToken extends GroupingToken {\n override tokenType = '{';\n constructor() {\n super();\n this.value = '{';\n this.mirror = '}';\n }\n}\n\nexport class CloseCurlyToken extends GroupingToken {\n override tokenType = '}';\n constructor() {\n super();\n this.value = '}';\n this.mirror = '{';\n }\n}\n\nexport class OpenSquareToken extends GroupingToken {\n override tokenType = '[';\n constructor() {\n super();\n this.value = '[';\n this.mirror = ']';\n }\n}\n\nexport class CloseSquareToken extends GroupingToken {\n override tokenType = ']';\n constructor() {\n super();\n this.value = ']';\n this.mirror = '[';\n }\n}\n\nexport class OpenParenToken extends GroupingToken {\n override tokenType = '(';\n constructor() {\n super();\n this.value = '(';\n this.mirror = ')';\n }\n}\n\nexport class CloseParenToken extends GroupingToken {\n override tokenType = ')';\n constructor() {\n super();\n this.value = ')';\n this.mirror = '(';\n }\n}\n\nexport class IncludeMatchToken extends CSSParserToken {\n override tokenType = '~=';\n}\n\nexport class DashMatchToken extends CSSParserToken {\n override tokenType = '|=';\n}\n\nexport class PrefixMatchToken extends CSSParserToken {\n override tokenType = '^=';\n}\n\nexport class SuffixMatchToken extends CSSParserToken {\n override tokenType = '$=';\n}\n\nexport class SubstringMatchToken extends CSSParserToken {\n override tokenType = '*=';\n}\n\nexport class ColumnToken extends CSSParserToken {\n override tokenType = '||';\n}\n\nexport class EOFToken extends CSSParserToken {\n override tokenType = 'EOF';\n override toSource() { return ''; }\n}\n\nexport class DelimToken extends CSSParserToken {\n override tokenType = 'DELIM';\n override value: string = '';\n\n constructor(code: number) {\n super();\n this.value = stringFromCode(code);\n }\n\n override toString() { return 'DELIM(' + this.value + ')'; }\n\n override toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n\n override toSource() {\n if (this.value === '\\\\')\n return '\\\\\\n';\n else\n return this.value;\n }\n}\n\nexport abstract class StringValuedToken extends CSSParserToken {\n override value: string = '';\n ASCIIMatch(str: string) {\n return this.value.toLowerCase() === str.toLowerCase();\n }\n\n override toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n return json;\n }\n}\n\nexport class IdentToken extends StringValuedToken {\n constructor(val: string) {\n super();\n this.value = val;\n }\n\n override tokenType = 'IDENT';\n override toString() { return 'IDENT(' + this.value + ')'; }\n override toSource() {\n return escapeIdent(this.value);\n }\n}\n\nexport class FunctionToken extends StringValuedToken {\n override tokenType = 'FUNCTION';\n mirror: string;\n constructor(val: string) {\n super();\n this.value = val;\n this.mirror = ')';\n }\n\n override toString() { return 'FUNCTION(' + this.value + ')'; }\n\n override toSource() {\n return escapeIdent(this.value) + '(';\n }\n}\n\nexport class AtKeywordToken extends StringValuedToken {\n override tokenType = 'AT-KEYWORD';\n constructor(val: string) {\n super();\n this.value = val;\n }\n override toString() { return 'AT(' + this.value + ')'; }\n override toSource() {\n return '@' + escapeIdent(this.value);\n }\n}\n\nexport class HashToken extends StringValuedToken {\n override tokenType = 'HASH';\n type: string;\n constructor(val: string) {\n super();\n this.value = val;\n this.type = 'unrestricted';\n }\n\n override toString() { return 'HASH(' + this.value + ')'; }\n\n override toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n return json;\n }\n\n override toSource() {\n if (this.type === 'id')\n return '#' + escapeIdent(this.value);\n else\n return '#' + escapeHash(this.value);\n\n }\n}\n\nexport class StringToken extends StringValuedToken {\n override tokenType = 'STRING';\n constructor(val: string) {\n super();\n this.value = val;\n }\n\n override toString() {\n return '\"' + escapeString(this.value) + '\"';\n }\n}\n\nexport class URLToken extends StringValuedToken {\n override tokenType = 'URL';\n constructor(val: string) {\n super();\n this.value = val;\n }\n override toString() { return 'URL(' + this.value + ')'; }\n override toSource() {\n return 'url(\"' + escapeString(this.value) + '\")';\n }\n}\n\nexport class NumberToken extends CSSParserToken {\n override tokenType = 'NUMBER';\n type: string;\n repr: string;\n\n constructor() {\n super();\n this.type = 'integer';\n this.repr = '';\n }\n\n override toString() {\n if (this.type === 'integer')\n return 'INT(' + this.value + ')';\n return 'NUMBER(' + this.value + ')';\n }\n override toJSON() {\n const json = super.toJSON();\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n return json;\n }\n override toSource() { return this.repr; }\n}\n\n\nexport class PercentageToken extends CSSParserToken {\n override tokenType = 'PERCENTAGE';\n repr: string;\n constructor() {\n super();\n this.repr = '';\n }\n override toString() { return 'PERCENTAGE(' + this.value + ')'; }\n override toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.repr = this.repr;\n return json;\n }\n override toSource() { return this.repr + '%'; }\n}\n\nexport class DimensionToken extends CSSParserToken {\n override tokenType = 'DIMENSION';\n type: string;\n repr: string;\n unit: string;\n\n constructor() {\n super();\n this.type = 'integer';\n this.repr = '';\n this.unit = '';\n }\n\n override toString() { return 'DIM(' + this.value + ',' + this.unit + ')'; }\n override toJSON() {\n const json = this.constructor.prototype.constructor.prototype.toJSON.call(this);\n json.value = this.value;\n json.type = this.type;\n json.repr = this.repr;\n json.unit = this.unit;\n return json;\n }\n override toSource() {\n const source = this.repr;\n let unit = escapeIdent(this.unit);\n if (unit[0].toLowerCase() === 'e' && (unit[1] === '-' || between(unit.charCodeAt(1), 0x30, 0x39))) {\n // Unit is ambiguous with scinot\n // Remove the leading \"e\", replace with escape.\n unit = '\\\\65 ' + unit.slice(1, unit.length);\n }\n return source + unit;\n }\n}\n\nfunction escapeIdent(string: string) {\n string = '' + string;\n let result = '';\n const firstcode = string.charCodeAt(0);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0x0)\n throw new InvalidCharacterError('Invalid character: the input contains U+0000.');\n\n if (\n between(code, 0x1, 0x1f) || code === 0x7f ||\n (i === 0 && between(code, 0x30, 0x39)) ||\n (i === 1 && between(code, 0x30, 0x39) && firstcode === 0x2d)\n )\n result += '\\\\' + code.toString(16) + ' ';\n else if (\n code >= 0x80 ||\n code === 0x2d ||\n code === 0x5f ||\n between(code, 0x30, 0x39) ||\n between(code, 0x41, 0x5a) ||\n between(code, 0x61, 0x7a)\n )\n result += string[i];\n else\n result += '\\\\' + string[i];\n\n }\n return result;\n}\n\nfunction escapeHash(string: string) {\n // Escapes the contents of \"unrestricted\"-type hash tokens.\n // Won't preserve the ID-ness of \"id\"-type hash tokens;\n // use escapeIdent() for that.\n string = '' + string;\n let result = '';\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code === 0x0)\n throw new InvalidCharacterError('Invalid character: the input contains U+0000.');\n\n if (\n code >= 0x80 ||\n code === 0x2d ||\n code === 0x5f ||\n between(code, 0x30, 0x39) ||\n between(code, 0x41, 0x5a) ||\n between(code, 0x61, 0x7a)\n )\n result += string[i];\n else\n result += '\\\\' + code.toString(16) + ' ';\n\n }\n return result;\n}\n\nfunction escapeString(string: string) {\n string = '' + string;\n let result = '';\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n\n if (code === 0x0)\n throw new InvalidCharacterError('Invalid character: the input contains U+0000.');\n\n if (between(code, 0x1, 0x1f) || code === 0x7f)\n result += '\\\\' + code.toString(16) + ' ';\n else if (code === 0x22 || code === 0x5c)\n result += '\\\\' + string[i];\n else\n result += string[i];\n\n }\n return result;\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as css from '../isomorphic/cssTokenizer';\n\nimport { beginDOMCaches, closestCrossShadow, elementSafeTagName, enclosingShadowRootOrDocument, endDOMCaches, getElementComputedStyle, isElementStyleVisibilityVisible, isListBoxSelect, isVisibleTextNode, parentElementOrShadowHost } from './domUtils';\n\nimport type { AriaRole } from '../isomorphic/ariaSnapshot';\n\nfunction hasExplicitAccessibleName(e: Element) {\n return e.hasAttribute('aria-label') || e.hasAttribute('aria-labelledby');\n}\n\n// https://www.w3.org/TR/wai-aria-practices/examples/landmarks/HTML5.html\nconst kAncestorPreventingLandmark = 'article:not([role]), aside:not([role]), main:not([role]), nav:not([role]), section:not([role]), [role=article], [role=complementary], [role=main], [role=navigation], [role=region]';\n\n// https://www.w3.org/TR/wai-aria-1.2/#global_states\nconst kGlobalAriaAttributes: [string, string[] | undefined][] = [\n ['aria-atomic', undefined],\n ['aria-busy', undefined],\n ['aria-controls', undefined],\n ['aria-current', undefined],\n ['aria-describedby', undefined],\n ['aria-details', undefined],\n // Global use deprecated in ARIA 1.2\n // ['aria-disabled', undefined],\n ['aria-dropeffect', undefined],\n // Global use deprecated in ARIA 1.2\n // ['aria-errormessage', undefined],\n ['aria-flowto', undefined],\n ['aria-grabbed', undefined],\n // Global use deprecated in ARIA 1.2\n // ['aria-haspopup', undefined],\n ['aria-hidden', undefined],\n // Global use deprecated in ARIA 1.2\n // ['aria-invalid', undefined],\n ['aria-keyshortcuts', undefined],\n ['aria-label', ['caption', 'code', 'deletion', 'emphasis', 'generic', 'insertion', 'paragraph', 'presentation', 'strong', 'subscript', 'superscript']],\n ['aria-labelledby', ['caption', 'code', 'deletion', 'emphasis', 'generic', 'insertion', 'paragraph', 'presentation', 'strong', 'subscript', 'superscript']],\n ['aria-live', undefined],\n ['aria-owns', undefined],\n ['aria-relevant', undefined],\n ['aria-roledescription', ['generic']],\n];\n\nfunction hasGlobalAriaAttribute(element: Element, forRole?: string | null) {\n return kGlobalAriaAttributes.some(([attr, prohibited]) => {\n return !prohibited?.includes(forRole || '') && element.hasAttribute(attr);\n });\n}\n\nfunction hasTabIndex(element: Element) {\n return !Number.isNaN(Number(String(element.getAttribute('tabindex'))));\n}\n\nfunction isFocusable(element: Element) {\n // TODO:\n // - \"inert\" attribute makes the whole substree not focusable\n // - when dialog is open on the page - everything but the dialog is not focusable\n return !isNativelyDisabled(element) && (isNativelyFocusable(element) || hasTabIndex(element));\n}\n\nfunction isNativelyFocusable(element: Element) {\n const tagName = elementSafeTagName(element);\n if (['BUTTON', 'DETAILS', 'SELECT', 'TEXTAREA'].includes(tagName))\n return true;\n if (tagName === 'A' || tagName === 'AREA')\n return element.hasAttribute('href');\n if (tagName === 'INPUT')\n return !(element as HTMLInputElement).hidden;\n return false;\n}\n\n// https://w3c.github.io/html-aam/#html-element-role-mappings\n// https://www.w3.org/TR/html-aria/#docconformance\nconst kImplicitRoleByTagName: { [tagName: string]: (e: Element) => AriaRole | null } = {\n 'A': (e: Element) => {\n return e.hasAttribute('href') ? 'link' : null;\n },\n 'AREA': (e: Element) => {\n return e.hasAttribute('href') ? 'link' : null;\n },\n 'ARTICLE': () => 'article',\n 'ASIDE': () => 'complementary',\n 'BLOCKQUOTE': () => 'blockquote',\n 'BUTTON': () => 'button',\n 'CAPTION': () => 'caption',\n 'CODE': () => 'code',\n 'DATALIST': () => 'listbox',\n 'DD': () => 'definition',\n 'DEL': () => 'deletion',\n 'DETAILS': () => 'group',\n 'DFN': () => 'term',\n 'DIALOG': () => 'dialog',\n 'DT': () => 'term',\n 'EM': () => 'emphasis',\n 'FIELDSET': () => 'group',\n 'FIGURE': () => 'figure',\n 'FOOTER': (e: Element) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : 'contentinfo',\n 'FORM': (e: Element) => hasExplicitAccessibleName(e) ? 'form' : null,\n 'H1': () => 'heading',\n 'H2': () => 'heading',\n 'H3': () => 'heading',\n 'H4': () => 'heading',\n 'H5': () => 'heading',\n 'H6': () => 'heading',\n 'HEADER': (e: Element) => closestCrossShadow(e, kAncestorPreventingLandmark) ? null : 'banner',\n 'HR': () => 'separator',\n 'HTML': () => 'document',\n 'IMG': (e: Element) => (e.getAttribute('alt') === '') && !e.getAttribute('title') && !hasGlobalAriaAttribute(e) && !hasTabIndex(e) ? 'presentation' : 'img',\n 'INPUT': (e: Element) => {\n const type = (e as HTMLInputElement).type.toLowerCase();\n if (['email', 'search', 'tel', 'text', 'url', ''].includes(type)) {\n // https://html.spec.whatwg.org/multipage/input.html#concept-input-list\n const list = getIdRefs(e, e.getAttribute('list'))[0];\n if (list && elementSafeTagName(list) === 'DATALIST')\n return 'combobox';\n return type === 'search' ? 'searchbox' : 'textbox';\n }\n if (type === 'hidden')\n return null;\n // File inputs do not have a role by the spec: https://www.w3.org/TR/html-aam-1.0/#el-input-file.\n // However, there are open issues about fixing it: https://github.com/w3c/aria/issues/1926.\n // All browsers report it as a button, and it is rendered as a button, so we do \"button\".\n if (type === 'file')\n return 'button';\n return inputTypeToRole[type] || 'textbox';\n },\n 'INS': () => 'insertion',\n 'LI': () => 'listitem',\n 'MAIN': () => 'main',\n 'MARK': () => 'mark',\n 'MATH': () => 'math',\n 'MENU': () => 'list',\n 'METER': () => 'meter',\n 'NAV': () => 'navigation',\n 'OL': () => 'list',\n 'OPTGROUP': () => 'group',\n 'OPTION': () => 'option',\n 'OUTPUT': () => 'status',\n 'P': () => 'paragraph',\n 'PROGRESS': () => 'progressbar',\n 'SEARCH': () => 'search',\n 'SECTION': (e: Element) => hasExplicitAccessibleName(e) ? 'region' : null,\n 'SELECT': (e: Element) => isListBoxSelect(e as HTMLSelectElement) ? 'listbox' : 'combobox',\n 'STRONG': () => 'strong',\n 'SUB': () => 'subscript',\n 'SUP': () => 'superscript',\n // For <svg> we default to Chrome behavior:\n // - Chrome reports 'img'.\n // - Firefox reports 'diagram' that is not in official ARIA spec yet.\n // - Safari reports 'no role', but still computes accessible name.\n 'SVG': () => 'img',\n 'TABLE': () => 'table',\n 'TBODY': () => 'rowgroup',\n 'TD': (e: Element) => {\n const table = closestCrossShadow(e, 'table');\n const role = table ? getExplicitAriaRole(table) : '';\n return (role === 'grid' || role === 'treegrid') ? 'gridcell' : 'cell';\n },\n 'TEXTAREA': () => 'textbox',\n 'TFOOT': () => 'rowgroup',\n 'TH': (e: Element) => {\n const scope = e.getAttribute('scope');\n if (scope === 'col' || scope === 'colgroup')\n return 'columnheader';\n if (scope === 'row' || scope === 'rowgroup')\n return 'rowheader';\n\n const nextSibling = e.nextElementSibling;\n const prevSibling = e.previousElementSibling;\n\n const row = !!e.parentElement && elementSafeTagName(e.parentElement) === 'TR' ? e.parentElement : undefined;\n\n // Chromium/Safari: A TH that is the only cell in a table is not labeling any content, thus it's technically not a header. Do not assign a role.\n // Firefox: Follows the spec and assigns `columnheader`. We prioritize Chrome/Safari semantics.\n if (!nextSibling && !prevSibling) {\n if (row) {\n const table = closestCrossShadow(row, 'table') as HTMLTableElement | undefined;\n // If there's only one row in the table, this TH has no column to head\n if (table && table.rows.length <= 1)\n return null;\n }\n return 'columnheader';\n }\n\n // Tables are built up incrementally by iterating over them in a particular pattern. In order to emulate this,\n // we check only immediate siblings and occasionally the parent row\n // This doesn't seem to directly follow the spec, but matches Chromium behavior\n // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/accessibility/ax_node_object.cc;l=1585-1623\n if (isHeaderCell(nextSibling) && isHeaderCell(prevSibling))\n return 'columnheader';\n\n if (isNonEmptyDataCell(nextSibling) || isNonEmptyDataCell(prevSibling))\n return 'rowheader';\n\n // As long as we didn't exclude it above, it's still a TH, so default to columnheader\n return 'columnheader';\n },\n 'THEAD': () => 'rowgroup',\n 'TIME': () => 'time',\n 'TR': () => 'row',\n 'UL': () => 'list',\n};\n\nfunction isHeaderCell(element: Element | null): boolean {\n return !!element && elementSafeTagName(element) === 'TH';\n}\n\nfunction isNonEmptyDataCell(element: Element | null): boolean {\n if (!element || elementSafeTagName(element) !== 'TD')\n return false;\n return !!(element.textContent?.trim() || element.children.length > 0);\n}\n\nconst kPresentationInheritanceParents: { [tagName: string]: string[] } = {\n 'DD': ['DL', 'DIV'],\n 'DIV': ['DL'],\n 'DT': ['DL', 'DIV'],\n 'LI': ['OL', 'UL'],\n 'TBODY': ['TABLE'],\n 'TD': ['TR'],\n 'TFOOT': ['TABLE'],\n 'TH': ['TR'],\n 'THEAD': ['TABLE'],\n 'TR': ['THEAD', 'TBODY', 'TFOOT', 'TABLE'],\n};\n\nfunction getImplicitAriaRole(element: Element): AriaRole | null {\n const implicitRole = kImplicitRoleByTagName[elementSafeTagName(element)]?.(element) || '';\n if (!implicitRole)\n return null;\n // Inherit presentation role when required.\n // https://www.w3.org/TR/wai-aria-1.2/#conflict_resolution_presentation_none\n let ancestor: Element | null = element;\n while (ancestor) {\n const parent = parentElementOrShadowHost(ancestor);\n const parents = kPresentationInheritanceParents[elementSafeTagName(ancestor)];\n if (!parents || !parent || !parents.includes(elementSafeTagName(parent)))\n break;\n const parentExplicitRole = getExplicitAriaRole(parent);\n if ((parentExplicitRole === 'none' || parentExplicitRole === 'presentation') && !hasPresentationConflictResolution(parent, parentExplicitRole))\n return parentExplicitRole;\n ancestor = parent;\n }\n return implicitRole;\n}\n\nconst validRoles: AriaRole[] = ['alert', 'alertdialog', 'application', 'article', 'banner', 'blockquote', 'button', 'caption', 'cell', 'checkbox', 'code', 'columnheader', 'combobox',\n 'complementary', 'contentinfo', 'definition', 'deletion', 'dialog', 'directory', 'document', 'emphasis', 'feed', 'figure', 'form', 'generic', 'grid',\n 'gridcell', 'group', 'heading', 'img', 'insertion', 'link', 'list', 'listbox', 'listitem', 'log', 'main', 'mark', 'marquee', 'math', 'meter', 'menu',\n 'menubar', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'navigation', 'none', 'note', 'option', 'paragraph', 'presentation', 'progressbar', 'radio', 'radiogroup',\n 'region', 'row', 'rowgroup', 'rowheader', 'scrollbar', 'search', 'searchbox', 'separator', 'slider',\n 'spinbutton', 'status', 'strong', 'subscript', 'superscript', 'switch', 'tab', 'table', 'tablist', 'tabpanel', 'term', 'textbox', 'time', 'timer',\n 'toolbar', 'tooltip', 'tree', 'treegrid', 'treeitem'];\n\nfunction getExplicitAriaRole(element: Element): AriaRole | null {\n // https://www.w3.org/TR/wai-aria-1.2/#document-handling_author-errors_roles\n const roles = (element.getAttribute('role') || '').split(' ').map(role => role.trim());\n return roles.find(role => validRoles.includes(role as any)) as AriaRole || null;\n}\n\nfunction hasPresentationConflictResolution(element: Element, role: string | null) {\n // https://www.w3.org/TR/wai-aria-1.2/#conflict_resolution_presentation_none\n return hasGlobalAriaAttribute(element, role) || isFocusable(element);\n}\n\nexport function getAriaRole(element: Element): AriaRole | null {\n const cached = cacheAriaRole?.get(element);\n if (cached !== undefined)\n return cached;\n const role = computeAriaRole(element);\n cacheAriaRole?.set(element, role);\n return role;\n}\n\nfunction computeAriaRole(element: Element): AriaRole | null {\n const explicitRole = getExplicitAriaRole(element);\n if (!explicitRole)\n return getImplicitAriaRole(element);\n if (explicitRole === 'none' || explicitRole === 'presentation') {\n const implicitRole = getImplicitAriaRole(element);\n if (hasPresentationConflictResolution(element, implicitRole))\n return implicitRole;\n }\n return explicitRole;\n}\n\nfunction getAriaBoolean(attr: string | null) {\n return attr === null ? undefined : attr.toLowerCase() === 'true';\n}\n\nexport function isElementIgnoredForAria(element: Element) {\n return ['STYLE', 'SCRIPT', 'NOSCRIPT', 'TEMPLATE'].includes(elementSafeTagName(element));\n}\n\n// https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion, but including \"none\" and \"presentation\" roles\n// Not implemented:\n// `Any descendants of elements that have the characteristic \"Children Presentational: True\"`\n// https://www.w3.org/TR/wai-aria-1.2/#aria-hidden\nexport function isElementHiddenForAria(element: Element): boolean {\n if (isElementIgnoredForAria(element))\n return true;\n const style = getElementComputedStyle(element);\n const isSlot = element.nodeName === 'SLOT';\n if (style?.display === 'contents' && !isSlot) {\n // display:contents is not rendered itself, but its child nodes are.\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (child.nodeType === 1 /* Node.ELEMENT_NODE */ && !isElementHiddenForAria(child as Element))\n return false;\n if (child.nodeType === 3 /* Node.TEXT_NODE */ && isVisibleTextNode(child as Text))\n return false;\n }\n return true;\n }\n // Note: <option> inside <select> are not affected by visibility or content-visibility.\n // Same goes for <slot>.\n const isOptionInsideSelect = element.nodeName === 'OPTION' && !!element.closest('select');\n if (!isOptionInsideSelect && !isSlot && !isElementStyleVisibilityVisible(element, style))\n return true;\n return belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element);\n}\n\nfunction belongsToDisplayNoneOrAriaHiddenOrNonSlotted(element: Element): boolean {\n let hidden = cacheIsHidden?.get(element);\n if (hidden === undefined) {\n hidden = false;\n\n // When parent has a shadow root, all light dom children must be assigned to a slot,\n // otherwise they are not rendered and considered hidden for aria.\n // Note: needed for <option> and <slot>, which skip checkVisibility above.\n if (element.parentElement && element.parentElement.shadowRoot && !element.assignedSlot)\n hidden = true;\n\n // display:none and aria-hidden=true are considered hidden for aria.\n if (!hidden) {\n const style = getElementComputedStyle(element);\n hidden = !style || style.display === 'none' || getAriaBoolean(element.getAttribute('aria-hidden')) === true;\n }\n\n // Check recursively.\n if (!hidden) {\n const parent = parentElementOrShadowHost(element);\n if (parent)\n hidden = belongsToDisplayNoneOrAriaHiddenOrNonSlotted(parent);\n }\n cacheIsHidden?.set(element, hidden);\n }\n return hidden;\n}\n\nfunction getIdRefs(element: Element, ref: string | null): Element[] {\n if (!ref)\n return [];\n const root = enclosingShadowRootOrDocument(element);\n if (!root)\n return [];\n try {\n const ids = ref.split(' ').filter(id => !!id);\n const result: Element[] = [];\n for (const id of ids) {\n // https://www.w3.org/TR/wai-aria-1.2/#mapping_additional_relations_error_processing\n // \"If more than one element has the same ID, the user agent SHOULD use the first element found with the given ID\"\n const firstElement = root.querySelector('#' + CSS.escape(id));\n if (firstElement && !result.includes(firstElement))\n result.push(firstElement);\n }\n return result;\n } catch (e) {\n return [];\n }\n}\n\nfunction trimFlatString(s: string): string {\n // \"Flat string\" at https://w3c.github.io/accname/#terminology\n return s.trim();\n}\n\nfunction asFlatString(s: string): string {\n // \"Flat string\" at https://w3c.github.io/accname/#terminology\n // Note that non-breaking spaces are preserved.\n return s.split('\\u00A0').map(chunk => chunk.replace(/\\r\\n/g, '\\n').replace(/[\\u200b\\u00ad]/g, '').replace(/\\s\\s*/g, ' ')).join('\\u00A0').trim();\n}\n\nfunction queryInAriaOwned(element: Element, selector: string): Element[] {\n const result = [...element.querySelectorAll(selector)];\n for (const owned of getIdRefs(element, element.getAttribute('aria-owns'))) {\n if (owned.matches(selector))\n result.push(owned);\n result.push(...owned.querySelectorAll(selector));\n }\n return result;\n}\n\nexport function getCSSContent(element: Element, pseudo?: '::before' | '::after') {\n // Relevant spec: 2.6.2 from https://w3c.github.io/accname/#computation-steps.\n // Additional considerations: https://github.com/w3c/accname/issues/204.\n const cache = pseudo === '::before' ? cachePseudoContentBefore : (pseudo === '::after' ? cachePseudoContentAfter : cachePseudoContent);\n if (cache?.has(element))\n return cache?.get(element);\n\n const style = getElementComputedStyle(element, pseudo);\n let content: string | undefined;\n if (style) {\n const contentValue = style.content;\n if (contentValue && contentValue !== 'none' && contentValue !== 'normal') {\n if (style.display !== 'none' && style.visibility !== 'hidden') {\n // Note: all browsers ignore display:none and visibility:hidden pseudos.\n content = parseCSSContentPropertyAsString(element, contentValue, !!pseudo);\n }\n }\n }\n\n if (pseudo && content !== undefined) {\n // SPEC DIFFERENCE.\n // Spec says \"CSS textual content, without a space\", but we account for display\n // to pass \"name_file-label-inline-block-styles-manual.html\"\n const display = style?.display || 'inline';\n if (display !== 'inline')\n content = ' ' + content + ' ';\n }\n\n if (cache)\n cache.set(element, content);\n return content;\n}\n\nfunction parseCSSContentPropertyAsString(element: Element, content: string, isPseudo: boolean): string | undefined {\n // Welcome to the mini CSS parser!\n // It aims to support the following syntax and any subset of it:\n // content: \"one\" attr(...) \"two\" \"three\" / \"alt\" attr(...) \"more alt\"\n // See https://developer.mozilla.org/en-US/docs/Web/CSS/content for more details.\n\n if (!content || content === 'none' || content === 'normal') {\n // Common fast path.\n return;\n }\n\n try {\n let tokens = css.tokenize(content).filter(token => !(token instanceof css.WhitespaceToken));\n const delimIndex = tokens.findIndex(token => token instanceof css.DelimToken && token.value === '/');\n if (delimIndex !== -1) {\n // Use the alternative text part when exists.\n // content: ... / \"alternative text\"\n tokens = tokens.slice(delimIndex + 1);\n } else if (!isPseudo) {\n // For non-pseudo elements, the only valid content is a url() or various gradients.\n // Therefore, we follow Chrome and only consider the alternative text.\n // Firefox, on the other hand, calculates accessible name to be empty.\n return;\n }\n\n const accumulated: string[] = [];\n let index = 0;\n while (index < tokens.length) {\n if (tokens[index] instanceof css.StringToken) {\n // content: \"some text\"\n accumulated.push(tokens[index].value as string);\n index++;\n } else if (index + 2 < tokens.length && tokens[index] instanceof css.FunctionToken && tokens[index].value === 'attr' && tokens[index + 1] instanceof css.IdentToken && tokens[index + 2] instanceof css.CloseParenToken) {\n // content: attr(...)\n // Firefox does not resolve attribute accessors in content, so we do it manually.\n const attrName = tokens[index + 1].value as string;\n accumulated.push(element.getAttribute(attrName) || '');\n index += 3;\n } else {\n // Failed to parse the content, so ignore it.\n return;\n }\n }\n return accumulated.join('');\n } catch {\n }\n}\n\nexport function getAriaLabelledByElements(element: Element): Element[] | null {\n const ref = element.getAttribute('aria-labelledby');\n if (ref === null)\n return null;\n const refs = getIdRefs(element, ref);\n // step 2b:\n // \"if the current node has an aria-labelledby attribute that contains at least one valid IDREF\"\n // Therefore, if none of the refs match an element, we consider aria-labelledby to be missing.\n return refs.length ? refs : null;\n}\n\nfunction allowsNameFromContent(role: string, targetDescendant: boolean) {\n // SPEC: https://w3c.github.io/aria/#namefromcontent\n //\n // Note: there is a spec proposal https://github.com/w3c/aria/issues/1821 that\n // is roughly aligned with what Chrome/Firefox do, and we follow that.\n //\n // See chromium implementation here:\n // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/accessibility/ax_object.cc;l=6338;drc=3decef66bc4c08b142a19db9628e9efe68973e64;bpv=0;bpt=1\n const alwaysAllowsNameFromContent = ['button', 'cell', 'checkbox', 'columnheader', 'gridcell', 'heading', 'link', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'row', 'rowheader', 'switch', 'tab', 'tooltip', 'treeitem'].includes(role);\n const descendantAllowsNameFromContent = targetDescendant && ['', 'caption', 'code', 'contentinfo', 'definition', 'deletion', 'emphasis', 'insertion', 'list', 'listitem', 'mark', 'none', 'paragraph', 'presentation', 'region', 'row', 'rowgroup', 'section', 'strong', 'subscript', 'superscript', 'table', 'term', 'time'].includes(role);\n return alwaysAllowsNameFromContent || descendantAllowsNameFromContent;\n}\n\nexport type AccessibleName = CompositeString & {\n derivedFromContent: boolean,\n};\n\nfunction computeAccessibleNameComposite(element: Element, includeHidden: boolean, collectElements: boolean): AccessibleName {\n // https://w3c.github.io/accname/#computation-steps\n\n // step 1.\n // https://w3c.github.io/aria/#namefromprohibited\n const elementProhibitsNaming = ['caption', 'code', 'definition', 'deletion', 'emphasis', 'generic', 'insertion', 'mark', 'paragraph', 'presentation', 'strong', 'subscript', 'suggestion', 'superscript', 'term', 'time'].includes(getAriaRole(element) || '');\n if (elementProhibitsNaming)\n return { ...emptyCompositeString(), derivedFromContent: false };\n\n // step 2.\n const outDerivedFromContent = { value: false };\n const result = getTextAlternativeInternal(element, {\n includeHidden,\n collectElements,\n outDerivedFromContent,\n visitedElements: new Set(),\n embeddedInTargetElement: 'self',\n });\n return { text: asFlatString(result.text), elements: result.elements, derivedFromContent: outDerivedFromContent.value };\n}\n\nexport function getElementAccessibleName(element: Element, includeHidden: boolean): AccessibleName {\n const cache = (includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName);\n let accessibleName = cache?.get(element);\n if (accessibleName === undefined) {\n accessibleName = computeAccessibleNameComposite(element, includeHidden, true /* collectElements */);\n cache?.set(element, accessibleName);\n }\n return accessibleName;\n}\n\nexport function getElementAccessibleNameText(element: Element, includeHidden: boolean): string {\n // Reuse the element-collecting composite if it happens to be cached, otherwise compute text only.\n const composite = (includeHidden ? cacheAccessibleNameHidden : cacheAccessibleName)?.get(element);\n if (composite !== undefined)\n return composite.text;\n const cache = (includeHidden ? cacheAccessibleNameTextHidden : cacheAccessibleNameText);\n let text = cache?.get(element);\n if (text === undefined) {\n text = computeAccessibleNameComposite(element, includeHidden, false /* collectElements */).text;\n cache?.set(element, text);\n }\n return text;\n}\n\nexport type AccessibleDescription = {\n text: string,\n derivedFromContent: boolean,\n};\n\nexport function getElementAccessibleDescription(element: Element, includeHidden: boolean): AccessibleDescription {\n const cache = (includeHidden ? cacheAccessibleDescriptionHidden : cacheAccessibleDescription);\n let accessibleDescription = cache?.get(element);\n\n if (accessibleDescription === undefined) {\n // https://w3c.github.io/accname/#mapping_additional_nd_description\n // https://www.w3.org/TR/html-aam-1.0/#accdesc-computation\n accessibleDescription = { text: '', derivedFromContent: false };\n\n if (element.hasAttribute('aria-describedby')) {\n // precedence 1\n const describedBy = getIdRefs(element, element.getAttribute('aria-describedby'));\n accessibleDescription.text = asFlatString(describedBy.map(ref => getTextAlternativeInternal(ref, {\n includeHidden,\n visitedElements: new Set(),\n embeddedInDescribedBy: { element: ref, hidden: isElementHiddenForAria(ref) },\n }).text).join(' '));\n accessibleDescription.derivedFromContent = describedBy.some(ref => ref === element || element.contains(ref));\n } else if (element.hasAttribute('aria-description')) {\n // precedence 2\n accessibleDescription.text = asFlatString(element.getAttribute('aria-description') || '');\n } else {\n // TODO: handle precedence 3 - html-aam-specific cases like table>caption.\n // https://www.w3.org/TR/html-aam-1.0/#accdesc-computation\n // precedence 4\n accessibleDescription.text = asFlatString(element.getAttribute('title') || '');\n }\n\n cache?.set(element, accessibleDescription);\n }\n return accessibleDescription;\n}\n\n// Roles where `aria-invalid` is conceptually meaningful per WAI-ARIA 1.2.\n// See https://www.w3.org/TR/wai-aria-1.2/#aria-invalid for the supported list.\nexport const kAriaInvalidRoles = [\n 'application',\n 'checkbox',\n 'columnheader',\n 'combobox',\n 'gridcell',\n 'listbox',\n 'radiogroup',\n 'rowheader',\n 'searchbox',\n 'slider',\n 'spinbutton',\n 'switch',\n 'textbox',\n 'tree',\n];\n\nexport function getAriaInvalid(element: Element): 'false' | 'true' | 'grammar' | 'spelling' {\n // https://www.w3.org/TR/wai-aria-1.2/#aria-invalid\n // This state is being deprecated as a global state in ARIA 1.2.\n // In future versions it will only be allowed on roles where it is specifically supported.\n const ariaInvalid = element.getAttribute('aria-invalid');\n if (!ariaInvalid || ariaInvalid.trim() === '' || ariaInvalid.toLocaleLowerCase() === 'false')\n return 'false';\n if (ariaInvalid === 'true' || ariaInvalid === 'grammar' || ariaInvalid === 'spelling')\n return ariaInvalid;\n return 'true';\n}\n\nfunction getValidityInvalid(element: Element) {\n if ('validity' in element){\n const validity = element.validity as ValidityState | undefined;\n return validity?.valid === false;\n }\n return false;\n}\n\nexport function getElementAccessibleErrorMessage(element: Element): string {\n // SPEC: https://w3c.github.io/aria/#aria-errormessage\n //\n // TODO: support https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/validationMessage\n const cache = cacheAccessibleErrorMessage;\n let accessibleErrorMessage = cacheAccessibleErrorMessage?.get(element);\n\n if (accessibleErrorMessage === undefined) {\n accessibleErrorMessage = '';\n\n const isAriaInvalid = getAriaInvalid(element) !== 'false';\n const isValidityInvalid = getValidityInvalid(element);\n if (isAriaInvalid || isValidityInvalid) {\n const errorMessageId = element.getAttribute('aria-errormessage');\n const errorMessages = getIdRefs(element, errorMessageId);\n // Ideally, this should be a separate \"embeddedInErrorMessage\", but it would follow the exact same rules.\n // Relevant vague spec: https://w3c.github.io/core-aam/#ariaErrorMessage.\n const parts = errorMessages.map(errorMessage => asFlatString(\n getTextAlternativeInternal(errorMessage, {\n visitedElements: new Set(),\n embeddedInDescribedBy: { element: errorMessage, hidden: isElementHiddenForAria(errorMessage) },\n }).text\n ));\n accessibleErrorMessage = parts.join(' ').trim();\n }\n cache?.set(element, accessibleErrorMessage);\n }\n return accessibleErrorMessage;\n}\n\ntype AccessibleNameOptions = {\n visitedElements: Set<Element>,\n collectElements?: boolean,\n includeHidden?: boolean,\n // Set to true during the computation when the name is derived from the content of the target\n // element, e.g. inner text or aria-labelledby pointing inside the element.\n outDerivedFromContent?: { value: boolean },\n embeddedInDescribedBy?: { element: Element, hidden: boolean },\n embeddedInLabelledBy?: { element: Element, hidden: boolean },\n embeddedInLabel?: { element: Element, hidden: boolean },\n embeddedInNativeTextAlternative?: { element: Element, hidden: boolean },\n embeddedInTargetElement?: 'self' | 'descendant',\n};\n\nfunction insideTargetElement(options: AccessibleNameOptions) {\n return options.embeddedInTargetElement === 'self' || options.embeddedInTargetElement === 'descendant';\n}\n\nfunction getTextAlternativeInternal(element: Element, options: AccessibleNameOptions): CompositeString {\n if (options.visitedElements.has(element))\n return emptyCompositeString();\n\n const childOptions: AccessibleNameOptions = {\n ...options,\n embeddedInTargetElement: options.embeddedInTargetElement === 'self' ? 'descendant' : options.embeddedInTargetElement,\n };\n\n // step 2a. Hidden Not Referenced: If the current node is hidden and is:\n // Not part of an aria-labelledby or aria-describedby traversal, where the node directly referenced by that relation was hidden.\n // Nor part of a native host language text alternative element (e.g. label in HTML) or attribute traversal, where the root of that traversal was hidden.\n if (!options.includeHidden) {\n const isEmbeddedInHiddenReferenceTraversal =\n !!options.embeddedInLabelledBy?.hidden ||\n !!options.embeddedInDescribedBy?.hidden ||\n !!options.embeddedInNativeTextAlternative?.hidden ||\n !!options.embeddedInLabel?.hidden;\n if (isElementIgnoredForAria(element) ||\n (!isEmbeddedInHiddenReferenceTraversal && isElementHiddenForAria(element))) {\n options.visitedElements.add(element);\n return emptyCompositeString();\n }\n }\n\n const labelledBy = getAriaLabelledByElements(element);\n\n // step 2b. LabelledBy:\n // Otherwise, if the current node has an aria-labelledby attribute that contains\n // at least one valid IDREF, and the current node is not already part of an ongoing\n // aria-labelledby or aria-describedby traversal, process its IDREFs in the order they occur...\n if (!options.embeddedInLabelledBy) {\n const accessibleName = joinCompositeString((labelledBy || []).map(ref => getTextAlternativeInternal(ref, {\n ...options,\n embeddedInLabelledBy: { element: ref, hidden: isElementHiddenForAria(ref) },\n embeddedInDescribedBy: undefined,\n embeddedInTargetElement: undefined,\n embeddedInLabel: undefined,\n embeddedInNativeTextAlternative: undefined,\n })), ' ', options.collectElements);\n if (accessibleName.text) {\n if (options.outDerivedFromContent && insideTargetElement(options) && (labelledBy || []).some(ref => ref === element || element.contains(ref)))\n options.outDerivedFromContent.value = true;\n return accessibleName;\n }\n }\n\n const role = getAriaRole(element) || '';\n const tagName = elementSafeTagName(element);\n\n // step 2c:\n // if the current node is a control embedded within the label (e.g. any element directly referenced by aria-labelledby) for another widget...\n //\n // also step 2d \"skip to rule Embedded Control\" section:\n // If traversal of the current node is due to recursion and the current node is an embedded control...\n // Note this is not strictly by the spec, because spec only applies this logic when \"aria-label\" is present.\n // However, browsers and and wpt test name_heading-combobox-focusable-alternative-manual.html follow this behavior,\n // and there is an issue filed for this: https://github.com/w3c/accname/issues/64\n if (!!options.embeddedInLabel || !!options.embeddedInLabelledBy || options.embeddedInTargetElement === 'descendant') {\n const isOwnLabel = [...(element as (HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement)).labels || []].includes(element as any);\n const isOwnLabelledBy = (labelledBy || []).includes(element);\n if (!isOwnLabel && !isOwnLabelledBy) {\n // Searchbox is a subclass of textbox, so it is handled the same way.\n if (role === 'textbox' || role === 'searchbox') {\n options.visitedElements.add(element);\n if (tagName === 'INPUT' || tagName === 'TEXTAREA')\n return compositeString((element as HTMLInputElement | HTMLTextAreaElement).value, element, options.collectElements);\n return compositeString(element.textContent, element, options.collectElements);\n }\n if (['combobox', 'listbox'].includes(role)) {\n options.visitedElements.add(element);\n let selectedOptions: Element[];\n if (tagName === 'SELECT') {\n selectedOptions = [...(element as HTMLSelectElement).selectedOptions];\n if (!selectedOptions.length && (element as HTMLSelectElement).options.length)\n selectedOptions.push((element as HTMLSelectElement).options[0]);\n } else {\n const listbox = role === 'combobox' ? queryInAriaOwned(element, '*').find(e => getAriaRole(e) === 'listbox') : element;\n selectedOptions = listbox ? queryInAriaOwned(listbox, '[aria-selected=\"true\"]').filter(e => getAriaRole(e) === 'option') : [];\n }\n if (!selectedOptions.length && tagName === 'INPUT') {\n // SPEC DIFFERENCE:\n // This fallback is not explicitly mentioned in the spec, but all browsers and\n // wpt test name_heading-combobox-focusable-alternative-manual.html do this.\n return compositeString((element as HTMLInputElement).value, element, options.collectElements);\n }\n return joinCompositeString(selectedOptions.map(option => getTextAlternativeInternal(option, childOptions)), ' ', options.collectElements);\n }\n if (['progressbar', 'scrollbar', 'slider', 'spinbutton', 'meter'].includes(role)) {\n options.visitedElements.add(element);\n if (element.hasAttribute('aria-valuetext'))\n return compositeString(element.getAttribute('aria-valuetext'), element, options.collectElements);\n if (element.hasAttribute('aria-valuenow'))\n return compositeString(element.getAttribute('aria-valuenow'), element, options.collectElements);\n return compositeString(element.getAttribute('value'), element, options.collectElements);\n }\n if (['menu'].includes(role)) {\n // https://github.com/w3c/accname/issues/67#issuecomment-553196887\n options.visitedElements.add(element);\n return emptyCompositeString();\n }\n }\n }\n\n // step 2d.\n const ariaLabel = element.getAttribute('aria-label') || '';\n if (trimFlatString(ariaLabel)) {\n options.visitedElements.add(element);\n return compositeString(ariaLabel, element, options.collectElements);\n }\n\n // step 2e.\n if (!['presentation', 'none'].includes(role)) {\n // https://w3c.github.io/html-aam/#input-type-button-input-type-submit-and-input-type-reset-accessible-name-computation\n //\n // SPEC DIFFERENCE.\n // Spec says to ignore this when aria-labelledby is defined.\n // WebKit follows the spec, while Chromium and Firefox do not.\n // We align with Chromium and Firefox here.\n if (tagName === 'INPUT' && ['button', 'submit', 'reset'].includes((element as HTMLInputElement).type)) {\n options.visitedElements.add(element);\n const value = (element as HTMLInputElement).value || '';\n if (trimFlatString(value))\n return compositeString(value, element, options.collectElements);\n if ((element as HTMLInputElement).type === 'submit')\n return compositeString('Submit', element, options.collectElements);\n if ((element as HTMLInputElement).type === 'reset')\n return compositeString('Reset', element, options.collectElements);\n const title = element.getAttribute('title') || '';\n return compositeString(title, element, options.collectElements);\n }\n\n // SPEC DIFFERENCE.\n // There is no spec for this, but Chromium/WebKit do \"Choose File\" so we follow that.\n // All browsers respect labels, aria-labelledby and aria-label.\n // No browsers respect the title attribute, although w3c accname tests disagree. We follow browsers.\n if (tagName === 'INPUT' && (element as HTMLInputElement).type === 'file') {\n options.visitedElements.add(element);\n const labels = (element as HTMLInputElement).labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return compositeString('Choose File', element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#input-type-image-accessible-name-computation\n //\n // SPEC DIFFERENCE.\n // Spec says to ignore this when aria-labelledby is defined, but all browsers take it into account.\n if (tagName === 'INPUT' && (element as HTMLInputElement).type === 'image') {\n options.visitedElements.add(element);\n const labels = (element as HTMLInputElement).labels || [];\n if (labels.length && !options.embeddedInLabelledBy)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n const alt = element.getAttribute('alt') || '';\n if (trimFlatString(alt))\n return compositeString(alt, element, options.collectElements);\n const title = element.getAttribute('title') || '';\n if (trimFlatString(title))\n return compositeString(title, element, options.collectElements);\n // SPEC DIFFERENCE.\n // Spec says return localized \"Submit Query\", but browsers and axe-core insist on \"Submit\".\n return compositeString('Submit', element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#button-element-accessible-name-computation\n if (!labelledBy && tagName === 'BUTTON') {\n options.visitedElements.add(element);\n const labels = (element as HTMLButtonElement).labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n // From here, fallthrough to step 2f.\n }\n\n // https://w3c.github.io/html-aam/#output-element-accessible-name-computation\n if (!labelledBy && tagName === 'OUTPUT') {\n options.visitedElements.add(element);\n const labels = (element as HTMLOutputElement).labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n return compositeString(element.getAttribute('title') || '', element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#input-type-text-input-type-password-input-type-number-input-type-search-input-type-tel-input-type-email-input-type-url-and-textarea-element-accessible-name-computation\n // https://w3c.github.io/html-aam/#other-form-elements-accessible-name-computation\n // For \"other form elements\", we count select and any other input.\n //\n // Note: WebKit does not follow the spec and uses placeholder when aria-labelledby is present.\n if (!labelledBy && (tagName === 'TEXTAREA' || tagName === 'SELECT' || tagName === 'INPUT' || tagName === 'METER' || tagName === 'PROGRESS')) {\n options.visitedElements.add(element);\n const labels = (element as (HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLMeterElement | HTMLProgressElement)).labels || [];\n if (labels.length)\n return getAccessibleNameFromAssociatedLabels(labels, options);\n\n const usePlaceholder = (tagName === 'INPUT' && ['text', 'password', 'number', 'search', 'tel', 'email', 'url'].includes((element as HTMLInputElement).type)) || tagName === 'TEXTAREA';\n const placeholder = element.getAttribute('placeholder') || '';\n const title = element.getAttribute('title') || '';\n if (!usePlaceholder || title)\n return compositeString(title, element, options.collectElements);\n return compositeString(placeholder, element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#fieldset-and-legend-elements\n if (!labelledBy && tagName === 'FIELDSET') {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === 'LEGEND') {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) },\n });\n }\n }\n const title = element.getAttribute('title') || '';\n return compositeString(title, element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#figure-and-figcaption-elements\n if (!labelledBy && tagName === 'FIGURE') {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === 'FIGCAPTION') {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) },\n });\n }\n }\n const title = element.getAttribute('title') || '';\n return compositeString(title, element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#img-element\n //\n // SPEC DIFFERENCE.\n // Spec says to ignore this when aria-labelledby is defined, but all browsers take it into account.\n if (tagName === 'IMG') {\n options.visitedElements.add(element);\n const alt = element.getAttribute('alt') || '';\n if (trimFlatString(alt))\n return compositeString(alt, element, options.collectElements);\n const title = element.getAttribute('title') || '';\n return compositeString(title, element, options.collectElements);\n }\n\n // https://w3c.github.io/html-aam/#table-element\n if (tagName === 'TABLE') {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === 'CAPTION') {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInNativeTextAlternative: { element: child, hidden: isElementHiddenForAria(child) },\n });\n }\n }\n // SPEC DIFFERENCE.\n // Spec does not say a word about <table summary=\"...\">, but all browsers actually support it.\n const summary = element.getAttribute('summary') || '';\n if (summary)\n return compositeString(summary, element, options.collectElements);\n // SPEC DIFFERENCE.\n // Spec says \"if the table element has a title attribute, then use that attribute\".\n // We ignore title to pass \"name_from_content-manual.html\".\n }\n\n // https://w3c.github.io/html-aam/#area-element\n if (tagName === 'AREA') {\n options.visitedElements.add(element);\n const alt = element.getAttribute('alt') || '';\n if (trimFlatString(alt))\n return compositeString(alt, element, options.collectElements);\n const title = element.getAttribute('title') || '';\n return compositeString(title, element, options.collectElements);\n }\n\n // https://www.w3.org/TR/svg-aam-1.0/#mapping_additional_nd\n if (tagName === 'SVG' || (element as SVGElement).ownerSVGElement) {\n options.visitedElements.add(element);\n for (let child = element.firstElementChild; child; child = child.nextElementSibling) {\n if (elementSafeTagName(child) === 'TITLE' && (child as SVGElement).ownerSVGElement) {\n return getTextAlternativeInternal(child, {\n ...childOptions,\n embeddedInLabelledBy: { element: child, hidden: isElementHiddenForAria(child) },\n });\n }\n }\n }\n if ((element as SVGElement).ownerSVGElement && tagName === 'A') {\n const title = element.getAttribute('xlink:title') || '';\n if (trimFlatString(title)) {\n options.visitedElements.add(element);\n return compositeString(title, element, options.collectElements);\n }\n }\n }\n\n // See https://w3c.github.io/html-aam/#summary-element-accessible-name-computation for \"summary\"-specific check.\n const shouldNameFromContentForSummary = tagName === 'SUMMARY' && !['presentation', 'none'].includes(role);\n\n // step 2f + step 2h.\n if (allowsNameFromContent(role, options.embeddedInTargetElement === 'descendant') ||\n shouldNameFromContentForSummary ||\n !!options.embeddedInLabelledBy || !!options.embeddedInDescribedBy ||\n !!options.embeddedInLabel || !!options.embeddedInNativeTextAlternative) {\n options.visitedElements.add(element);\n const accessibleName = innerAccumulatedElementText(element, childOptions);\n // Spec says \"Return the accumulated text if it is not the empty string\". However, that is not really\n // compatible with the real browser behavior and wpt tests, where an element with empty contents will fallback to the title.\n // So we follow the spec everywhere except for the target element itself. This can probably be improved.\n const maybeTrimmedAccessibleName = options.embeddedInTargetElement === 'self' ? trimFlatString(accessibleName.text) : accessibleName.text;\n if (maybeTrimmedAccessibleName) {\n if (options.outDerivedFromContent && insideTargetElement(options) && trimFlatString(accessibleName.text))\n options.outDerivedFromContent.value = true;\n // This element owns the accumulated content - record it alongside the descendants it was computed from.\n accessibleName.elements?.add(element);\n return accessibleName;\n }\n }\n\n // step 2i.\n if (!['presentation', 'none'].includes(role) || tagName === 'IFRAME' || tagName === 'FRAME') {\n options.visitedElements.add(element);\n const title = element.getAttribute('title') || '';\n if (trimFlatString(title))\n return compositeString(title, element, options.collectElements);\n }\n\n options.visitedElements.add(element);\n return emptyCompositeString();\n}\n\nfunction innerAccumulatedElementText(element: Element, options: AccessibleNameOptions): CompositeString {\n const tokens: string[] = [];\n const elements = options.collectElements ? new Set<Element>() : undefined;\n const visit = (node: Node, skipSlotted: boolean) => {\n if (skipSlotted && (node as Element | Text).assignedSlot)\n return;\n if (node.nodeType === 1 /* Node.ELEMENT_NODE */) {\n const display = getElementComputedStyle(node as Element)?.display || 'inline';\n const childComposite = getTextAlternativeInternal(node as Element, options);\n let token = childComposite.text;\n for (const contributor of childComposite.elements || [])\n elements?.add(contributor);\n // SPEC DIFFERENCE.\n // Spec says \"append the result to the accumulated text\", assuming \"with space\".\n // However, multiple tests insist that inline elements do not add a space.\n // Additionally, <br> insists on a space anyway, see \"name_file-label-inline-block-elements-manual.html\"\n if (display !== 'inline' || node.nodeName === 'BR')\n token = ' ' + token + ' ';\n tokens.push(token);\n } else if (node.nodeType === 3 /* Node.TEXT_NODE */) {\n // step 2g.\n tokens.push(node.textContent || '');\n }\n };\n tokens.push(getCSSContent(element, '::before') || '');\n const content = getCSSContent(element);\n if (content !== undefined) {\n // `content` CSS property replaces everything inside the element.\n // I was not able to find any spec or description on how this interacts with accname,\n // so this is a guess based on what browsers do.\n tokens.push(content);\n } else {\n // step 2h.\n const assignedNodes = element.nodeName === 'SLOT' ? (element as HTMLSlotElement).assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(child, false);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling)\n visit(child, true);\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(child, true);\n }\n for (const owned of getIdRefs(element, element.getAttribute('aria-owns')))\n visit(owned, true);\n }\n }\n tokens.push(getCSSContent(element, '::after') || '');\n return { text: tokens.join(''), elements };\n}\n\nexport const kAriaSelectedRoles = ['gridcell', 'option', 'row', 'tab', 'rowheader', 'columnheader', 'treeitem'];\nexport function getAriaSelected(element: Element): boolean {\n // https://www.w3.org/TR/wai-aria-1.2/#aria-selected\n // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings\n if (elementSafeTagName(element) === 'OPTION')\n return (element as HTMLOptionElement).selected;\n if (kAriaSelectedRoles.includes(getAriaRole(element) || ''))\n return getAriaBoolean(element.getAttribute('aria-selected')) === true;\n return false;\n}\n\nexport const kAriaCheckedRoles = ['checkbox', 'menuitemcheckbox', 'option', 'radio', 'switch', 'menuitemradio', 'treeitem'];\nexport function getAriaChecked(element: Element): boolean | 'mixed' {\n const result = getChecked(element, true);\n return result === 'error' ? false : result;\n}\n\nexport function getCheckedAllowMixed(element: Element): boolean | 'mixed' | 'error' {\n return getChecked(element, true);\n}\n\nexport function getCheckedWithoutMixed(element: Element): boolean | 'error' {\n const result = getChecked(element, false);\n return result as boolean | 'error';\n}\n\nfunction getChecked(element: Element, allowMixed: boolean): boolean | 'mixed' | 'error' {\n const tagName = elementSafeTagName(element);\n // https://www.w3.org/TR/wai-aria-1.2/#aria-checked\n // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings\n if (allowMixed && tagName === 'INPUT' && (element as HTMLInputElement).indeterminate)\n return 'mixed';\n if (tagName === 'INPUT' && ['checkbox', 'radio'].includes((element as HTMLInputElement).type))\n return (element as HTMLInputElement).checked;\n if (kAriaCheckedRoles.includes(getAriaRole(element) || '')) {\n const checked = element.getAttribute('aria-checked');\n if (checked === 'true')\n return true;\n if (allowMixed && checked === 'mixed')\n return 'mixed';\n return false;\n }\n return 'error';\n}\n\n// https://w3c.github.io/aria/#aria-readonly\nconst kAriaReadonlyRoles = ['checkbox', 'combobox', 'grid', 'gridcell', 'listbox', 'radiogroup', 'slider', 'spinbutton', 'textbox', 'columnheader', 'rowheader', 'searchbox', 'switch', 'treegrid'];\nexport function getReadonly(element: Element): boolean | 'error' {\n const tagName = elementSafeTagName(element);\n // https://www.w3.org/TR/wai-aria-1.2/#aria-checked\n // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(tagName))\n return element.hasAttribute('readonly');\n if (kAriaReadonlyRoles.includes(getAriaRole(element) || ''))\n return element.getAttribute('aria-readonly') === 'true';\n if ((element as HTMLElement).isContentEditable)\n return false;\n return 'error';\n}\n\nexport const kAriaPressedRoles = ['button'];\nexport function getAriaPressed(element: Element): boolean | 'mixed' {\n // https://www.w3.org/TR/wai-aria-1.2/#aria-pressed\n if (kAriaPressedRoles.includes(getAriaRole(element) || '')) {\n const pressed = element.getAttribute('aria-pressed');\n if (pressed === 'true')\n return true;\n if (pressed === 'mixed')\n return 'mixed';\n }\n return false;\n}\n\nexport const kAriaExpandedRoles = ['application', 'button', 'checkbox', 'combobox', 'gridcell', 'link', 'listbox', 'menuitem', 'row', 'rowheader', 'tab', 'treeitem', 'columnheader', 'menuitemcheckbox', 'menuitemradio', 'rowheader', 'switch'];\nexport function getAriaExpanded(element: Element): boolean | undefined {\n // https://www.w3.org/TR/wai-aria-1.2/#aria-expanded\n // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings\n if (elementSafeTagName(element) === 'DETAILS')\n return (element as HTMLDetailsElement).open;\n if (kAriaExpandedRoles.includes(getAriaRole(element) || '')) {\n const expanded = element.getAttribute('aria-expanded');\n if (expanded === null)\n return undefined;\n if (expanded === 'true')\n return true;\n return false;\n }\n return undefined;\n}\n\nexport const kAriaLevelRoles = ['heading', 'listitem', 'row', 'treeitem'];\nexport function getAriaLevel(element: Element): number {\n // https://www.w3.org/TR/wai-aria-1.2/#aria-level\n // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings\n const native = { 'H1': 1, 'H2': 2, 'H3': 3, 'H4': 4, 'H5': 5, 'H6': 6 }[elementSafeTagName(element)];\n if (native)\n return native;\n if (kAriaLevelRoles.includes(getAriaRole(element) || '')) {\n const attr = element.getAttribute('aria-level');\n const value = attr === null ? Number.NaN : Number(attr);\n if (Number.isInteger(value) && value >= 1)\n return value;\n }\n return 0;\n}\n\nexport const kAriaDisabledRoles = ['application', 'button', 'composite', 'gridcell', 'group', 'input', 'link', 'menuitem', 'scrollbar', 'separator', 'tab', 'checkbox', 'columnheader', 'combobox', 'grid', 'listbox', 'menu', 'menubar', 'menuitemcheckbox', 'menuitemradio', 'option', 'radio', 'radiogroup', 'row', 'rowheader', 'searchbox', 'select', 'slider', 'spinbutton', 'switch', 'tablist', 'textbox', 'toolbar', 'tree', 'treegrid', 'treeitem'];\nexport function getAriaDisabled(element: Element): boolean {\n // https://www.w3.org/TR/wai-aria-1.2/#aria-disabled\n // Note that aria-disabled applies to all descendants, so we look up the hierarchy.\n return isNativelyDisabled(element) || hasExplicitAriaDisabled(element);\n}\n\nfunction isNativelyDisabled(element: Element) {\n // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings\n const isNativeFormControl = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'OPTION', 'OPTGROUP'].includes(elementSafeTagName(element));\n return isNativeFormControl && (element.hasAttribute('disabled') || belongsToDisabledOptGroup(element) || belongsToDisabledFieldSet(element));\n}\n\nfunction belongsToDisabledOptGroup(element: Element): boolean {\n return elementSafeTagName(element) === 'OPTION' && !!element.closest('OPTGROUP[DISABLED]');\n}\n\nfunction belongsToDisabledFieldSet(element: Element): boolean {\n const fieldSetElement = element?.closest('FIELDSET[DISABLED]');\n if (!fieldSetElement)\n return false;\n const legendElement = fieldSetElement.querySelector(':scope > LEGEND');\n return !legendElement || !legendElement.contains(element);\n}\n\nfunction hasExplicitAriaDisabled(element: Element): boolean {\n if (!kAriaDisabledRoles.includes(getAriaRole(element) || ''))\n return false;\n return hasAriaDisabledInChain(element);\n}\n\nfunction hasAriaDisabledInChain(element: Element): boolean {\n let result = cacheAriaDisabled?.get(element);\n if (result === undefined) {\n const attribute = (element.getAttribute('aria-disabled') || '').toLowerCase();\n if (attribute === 'true') {\n result = true;\n } else if (attribute === 'false') {\n result = false;\n } else {\n // aria-disabled works across shadow boundaries.\n const parent = parentElementOrShadowHost(element);\n result = parent ? hasAriaDisabledInChain(parent) : false;\n }\n cacheAriaDisabled?.set(element, result);\n }\n return result;\n}\n\nfunction getAccessibleNameFromAssociatedLabels(labels: Iterable<HTMLLabelElement>, options: AccessibleNameOptions): CompositeString {\n return joinCompositeString([...labels].map(label => getTextAlternativeInternal(label, {\n ...options,\n embeddedInLabel: { element: label, hidden: isElementHiddenForAria(label) },\n embeddedInNativeTextAlternative: undefined,\n embeddedInLabelledBy: undefined,\n embeddedInDescribedBy: undefined,\n embeddedInTargetElement: undefined,\n })).filter(accessibleName => !!accessibleName.text), ' ', options.collectElements);\n}\n\nexport function receivesPointerEvents(element: Element): boolean {\n const cache = cachePointerEvents!;\n let e: Element | undefined = element;\n let result: boolean | undefined;\n const parents: Element[] = [];\n for (; e; e = parentElementOrShadowHost(e!)) {\n const cached = cache.get(e);\n if (cached !== undefined) {\n result = cached;\n break;\n }\n\n parents.push(e);\n const style = getElementComputedStyle(e);\n if (!style) {\n result = true;\n break;\n }\n\n const value = style.pointerEvents;\n if (value) {\n result = value !== 'none';\n break;\n }\n }\n\n if (result === undefined)\n result = true;\n\n for (const parent of parents)\n cache.set(parent, result);\n return result;\n}\n\nlet cacheAccessibleName: Map<Element, AccessibleName> | undefined;\nlet cacheAccessibleNameHidden: Map<Element, AccessibleName> | undefined;\nlet cacheAccessibleNameText: Map<Element, string> | undefined;\nlet cacheAccessibleNameTextHidden: Map<Element, string> | undefined;\nlet cacheAccessibleDescription: Map<Element, AccessibleDescription> | undefined;\nlet cacheAccessibleDescriptionHidden: Map<Element, AccessibleDescription> | undefined;\nlet cacheAccessibleErrorMessage: Map<Element, string> | undefined;\nlet cacheIsHidden: Map<Element, boolean> | undefined;\nlet cachePseudoContent: Map<Element, string | undefined> | undefined;\nlet cachePseudoContentBefore: Map<Element, string | undefined> | undefined;\nlet cachePseudoContentAfter: Map<Element, string | undefined> | undefined;\nlet cachePointerEvents: Map<Element, boolean> | undefined;\nlet cacheAriaRole: Map<Element, AriaRole | null> | undefined;\nlet cacheAriaDisabled: Map<Element, boolean> | undefined;\nlet cachesCounter = 0;\n\nexport function beginAriaCaches() {\n beginDOMCaches();\n ++cachesCounter;\n cacheAriaRole ??= new Map();\n cacheAriaDisabled ??= new Map();\n cacheAccessibleName ??= new Map();\n cacheAccessibleNameHidden ??= new Map();\n cacheAccessibleNameText ??= new Map();\n cacheAccessibleNameTextHidden ??= new Map();\n cacheAccessibleDescription ??= new Map();\n cacheAccessibleDescriptionHidden ??= new Map();\n cacheAccessibleErrorMessage ??= new Map();\n cacheIsHidden ??= new Map();\n cachePseudoContent ??= new Map();\n cachePseudoContentBefore ??= new Map();\n cachePseudoContentAfter ??= new Map();\n cachePointerEvents ??= new Map();\n}\n\nexport function endAriaCaches() {\n if (!--cachesCounter) {\n cacheAccessibleName = undefined;\n cacheAccessibleNameHidden = undefined;\n cacheAccessibleNameText = undefined;\n cacheAccessibleNameTextHidden = undefined;\n cacheAccessibleDescription = undefined;\n cacheAccessibleDescriptionHidden = undefined;\n cacheAccessibleErrorMessage = undefined;\n cacheIsHidden = undefined;\n cachePseudoContent = undefined;\n cachePseudoContentBefore = undefined;\n cachePseudoContentAfter = undefined;\n cachePointerEvents = undefined;\n cacheAriaRole = undefined;\n cacheAriaDisabled = undefined;\n }\n endDOMCaches();\n}\n\nconst inputTypeToRole: Record<string, AriaRole> = {\n 'button': 'button',\n 'checkbox': 'checkbox',\n 'image': 'button',\n 'number': 'spinbutton',\n 'radio': 'radio',\n 'range': 'slider',\n 'reset': 'button',\n 'submit': 'button',\n};\n\ntype CompositeString = {\n text: string,\n elements?: Set<Element>,\n};\n\nfunction emptyCompositeString(): CompositeString {\n return { text: '' };\n}\n\nfunction compositeString(text: string | null, element: Element, collectElements: boolean | undefined): CompositeString {\n const elements = text && collectElements ? new Set([element]) : undefined;\n return { text: text || '', elements };\n}\n\nfunction joinCompositeString(parts: CompositeString[], separator: string, collectElements: boolean | undefined): CompositeString {\n let elements: Set<Element> | undefined;\n if (collectElements) {\n elements = new Set();\n for (const part of parts) {\n for (const element of part.elements || [])\n elements.add(element);\n }\n }\n return { text: parts.map(part => part.text).join(separator), elements };\n}\n","/* eslint-disable */ // @ts-nocheck: vendored from Playwright, kept as is (see ../README.md)\n/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as aria from '../isomorphic/ariaSnapshot';\nimport { renderAriaSnapshotAsYaml } from '../isomorphic/ariaSnapshotRenderer';\nimport { normalizeWhiteSpace, truncateDataUrl } from '../isomorphic/stringUtils';\n\nimport { distillAriaSnapshot } from './ariaSnapshotDistiller';\nimport { computeBox, getElementComputedStyle, isElementVisible } from './domUtils';\nimport * as roleUtils from './roleUtils';\n\nexport type AriaSnapshot = {\n root: aria.AriaNode;\n info: Map<string, { element: Element, nameFromContentRefs: string[] }>;\n refs: Map<Element, string>;\n iframeRefs: string[];\n};\n\ntype AriaRef = {\n role: string;\n name: string;\n ref: string;\n};\n\nlet lastRef = 0;\n\nexport type AriaTreeOptions = {\n mode: 'ai' | 'default' | 'codegen' | 'autoexpect';\n refPrefix?: string;\n doNotRenderActive?: boolean;\n depth?: number;\n boxes?: boolean;\n};\n\ntype InternalOptions = {\n visibility: 'aria' | 'ariaOrVisible' | 'ariaAndVisible',\n refs: 'all' | 'interactable' | 'none',\n refPrefix?: string,\n includeGenericRole?: boolean,\n renderCursorPointer?: boolean,\n renderActive?: boolean,\n renderBoxes?: boolean,\n};\n\nfunction toInternalOptions(options: AriaTreeOptions): InternalOptions {\n const renderBoxes = options.boxes;\n if (options.mode === 'ai') {\n // For AI consumption.\n return {\n visibility: 'ariaOrVisible',\n refs: 'interactable',\n refPrefix: options.refPrefix,\n includeGenericRole: true,\n renderActive: !options.doNotRenderActive,\n renderCursorPointer: true,\n renderBoxes,\n };\n }\n if (options.mode === 'autoexpect') {\n // To auto-generate assertions on visible elements.\n return { visibility: 'ariaAndVisible', refs: 'none', renderBoxes };\n }\n // To match aria snapshot. In 'codegen' mode, the generated tree is the same,\n // strings are converted to regexes when serializing to yaml.\n return { visibility: 'aria', refs: 'none', renderBoxes };\n}\n\nexport function generateAriaTree(rootElement: Element, publicOptions: AriaTreeOptions): AriaSnapshot {\n const options = toInternalOptions(publicOptions);\n const visited = new Set<Node>();\n // For each node, the elements that contributed to its accessible name.\n const nameSourceElements = new Map<aria.AriaNode, Set<Element> | undefined>();\n\n const snapshot: AriaSnapshot = {\n root: { role: 'fragment', name: '', children: [], props: {}, box: computeBox(rootElement), receivesPointerEvents: true },\n info: new Map<string, { element: Element, nameFromContentRefs: string[] }>(),\n refs: new Map<Element, string>(),\n iframeRefs: [],\n };\n setAriaNodeElement(snapshot.root, rootElement);\n\n const visit = (ariaNode: aria.AriaNode, node: Node, parentElementVisible: boolean) => {\n if (visited.has(node))\n return;\n visited.add(node);\n\n if (node.nodeType === Node.TEXT_NODE && node.nodeValue) {\n if (!parentElementVisible)\n return;\n\n const text = node.nodeValue;\n // <textarea>AAA</textarea> should not report AAA as a child of the textarea.\n if (ariaNode.role !== 'textbox' && text)\n ariaNode.children.push(node.nodeValue || '');\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE)\n return;\n\n const element = node as Element;\n const isElementVisibleForAria = !roleUtils.isElementHiddenForAria(element);\n let visible = isElementVisibleForAria;\n if (options.visibility === 'ariaOrVisible')\n visible = isElementVisibleForAria || isElementVisible(element);\n if (options.visibility === 'ariaAndVisible')\n visible = isElementVisibleForAria && isElementVisible(element);\n\n // Optimization: if we only consider aria visibility, we can skip child elements because\n // they will not be visible for aria as well.\n if (options.visibility === 'aria' && !visible)\n return;\n\n const ariaChildren: Element[] = [];\n if (element.hasAttribute('aria-owns')) {\n const ids = element.getAttribute('aria-owns')!.split(/\\s+/);\n for (const id of ids) {\n const ownedElement = rootElement.ownerDocument.getElementById(id);\n if (ownedElement)\n ariaChildren.push(ownedElement);\n }\n }\n\n const childAriaNode = visible ? toAriaNode(element, options, nameSourceElements) : null;\n if (childAriaNode && element.getAttribute('aria-hidden')?.toLowerCase() === 'true')\n childAriaNode.props['aria-hidden'] = 'true';\n let elementInfo: { element: Element, nameFromContentRefs: string[] } | undefined;\n if (childAriaNode) {\n if (childAriaNode.ref) {\n elementInfo = { element, nameFromContentRefs: [] };\n snapshot.info.set(childAriaNode.ref, elementInfo);\n snapshot.refs.set(element, childAriaNode.ref);\n if (childAriaNode.role === 'iframe')\n snapshot.iframeRefs.push(childAriaNode.ref);\n }\n ariaNode.children.push(childAriaNode);\n }\n processElement(childAriaNode || ariaNode, element, ariaChildren, visible);\n\n // Now that the subtree is processed, every descendant that contributed to this node's\n // accessible name has its ref assigned, so we can resolve those refs as the name's origins.\n if (elementInfo) {\n for (const contributor of nameSourceElements.get(childAriaNode!) || []) {\n const ref = snapshot.refs.get(contributor);\n if (ref && ref !== childAriaNode!.ref)\n elementInfo.nameFromContentRefs.push(ref);\n }\n }\n };\n\n function processElement(ariaNode: aria.AriaNode, element: Element, ariaChildren: Element[], parentElementVisible: boolean) {\n // Surround every element with spaces for the sake of concatenated text nodes.\n const display = getElementComputedStyle(element)?.display || 'inline';\n const treatAsBlock = (display !== 'inline' || element.nodeName === 'BR') ? ' ' : '';\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n\n ariaNode.children.push(roleUtils.getCSSContent(element, '::before') || '');\n const assignedNodes = element.nodeName === 'SLOT' ? (element as HTMLSlotElement).assignedNodes() : [];\n if (assignedNodes.length) {\n for (const child of assignedNodes)\n visit(ariaNode, child, parentElementVisible);\n } else {\n for (let child = element.firstChild; child; child = child.nextSibling) {\n if (!(child as Element | Text).assignedSlot)\n visit(ariaNode, child, parentElementVisible);\n }\n if (element.shadowRoot) {\n for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling)\n visit(ariaNode, child, parentElementVisible);\n }\n }\n\n for (const child of ariaChildren)\n visit(ariaNode, child, parentElementVisible);\n\n ariaNode.children.push(roleUtils.getCSSContent(element, '::after') || '');\n\n if (treatAsBlock)\n ariaNode.children.push(treatAsBlock);\n\n if (ariaNode.children.length === 1 && ariaNode.name === ariaNode.children[0])\n ariaNode.children = [];\n\n if (ariaNode.role === 'link' && element.hasAttribute('href')) {\n const href = element.getAttribute('href')!;\n ariaNode.props['url'] = truncateDataUrl(href);\n }\n\n if (ariaNode.role === 'textbox' && element.hasAttribute('placeholder') && element.getAttribute('placeholder') !== ariaNode.name) {\n const placeholder = element.getAttribute('placeholder')!;\n ariaNode.props['placeholder'] = placeholder;\n }\n }\n\n roleUtils.beginAriaCaches();\n try {\n visit(snapshot.root, rootElement, true);\n } finally {\n roleUtils.endAriaCaches();\n }\n\n distillAriaSnapshot(snapshot, publicOptions);\n return snapshot;\n}\n\nfunction computeAriaRef(ariaNode: aria.AriaNode, options: InternalOptions) {\n if (options.refs === 'none')\n return;\n if (options.refs === 'interactable' && (!ariaNode.box.visible || !ariaNode.receivesPointerEvents))\n return;\n\n const element = ariaNodeElement(ariaNode);\n let ariaRef = (element as any)._ariaRef as AriaRef | undefined;\n if (!ariaRef || ariaRef.role !== ariaNode.role || ariaRef.name !== ariaNode.name) {\n ariaRef = { role: ariaNode.role, name: ariaNode.name, ref: (options.refPrefix ?? '') + 'e' + (++lastRef) };\n (element as any)._ariaRef = ariaRef;\n }\n ariaNode.ref = ariaRef.ref;\n}\n\nfunction toAriaNode(element: Element, options: InternalOptions, nameSourceElements: Map<aria.AriaNode, Set<Element> | undefined>): aria.AriaNode | null {\n const active = element.ownerDocument.activeElement === element && element.ownerDocument.hasFocus();\n if (element.nodeName === 'IFRAME' || element.nodeName === 'FRAME') {\n const ariaNode: aria.AriaNode = {\n role: 'iframe',\n name: '',\n children: [],\n props: {},\n box: computeBox(element),\n receivesPointerEvents: true,\n active\n };\n setAriaNodeElement(ariaNode, element);\n computeAriaRef(ariaNode, options);\n return ariaNode;\n }\n\n const defaultRole = options.includeGenericRole ? 'generic' : null;\n const role = roleUtils.getAriaRole(element) ?? defaultRole;\n if (!role || role === 'presentation' || role === 'none')\n return null;\n\n const name = roleUtils.getElementAccessibleName(element, false);\n const receivesPointerEvents = roleUtils.receivesPointerEvents(element);\n\n const box = computeBox(element);\n if (role === 'generic' && box.inline && element.childNodes.length === 1 && element.childNodes[0].nodeType === Node.TEXT_NODE)\n return null;\n\n const result: aria.AriaNode = {\n role,\n name: normalizeWhiteSpace(name.text),\n children: [],\n props: {},\n box,\n receivesPointerEvents,\n active\n };\n setAriaNodeElement(result, element);\n nameSourceElements.set(result, name.elements);\n computeAriaRef(result, options);\n\n if (roleUtils.kAriaCheckedRoles.includes(role))\n result.checked = roleUtils.getAriaChecked(element);\n\n if (roleUtils.kAriaDisabledRoles.includes(role))\n result.disabled = roleUtils.getAriaDisabled(element);\n\n if (roleUtils.kAriaExpandedRoles.includes(role))\n result.expanded = roleUtils.getAriaExpanded(element);\n\n if (roleUtils.kAriaInvalidRoles.includes(role)) {\n const invalid = roleUtils.getAriaInvalid(element);\n result.invalid = invalid === 'false' ? false : invalid === 'true' ? true : invalid;\n }\n\n if (roleUtils.kAriaLevelRoles.includes(role))\n result.level = roleUtils.getAriaLevel(element);\n\n if (roleUtils.kAriaPressedRoles.includes(role))\n result.pressed = roleUtils.getAriaPressed(element);\n\n if (roleUtils.kAriaSelectedRoles.includes(role))\n result.selected = roleUtils.getAriaSelected(element);\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n if (element.type !== 'checkbox' && element.type !== 'radio' && element.type !== 'file')\n result.children = [element.value];\n }\n\n return result;\n}\n\nfunction matchesStringOrRegex(text: string, template: aria.AriaRegex | string | undefined): boolean {\n if (!template)\n return true;\n if (!text)\n return false;\n if (typeof template === 'string')\n return text === template;\n return !!text.match(new RegExp(template.pattern));\n}\n\nfunction matchesTextValue(text: string, template: aria.AriaTextValue | undefined) {\n if (!template?.normalized)\n return true;\n if (!text)\n return false;\n if (text === template.normalized)\n return true;\n // Accept pattern as value.\n if (text === template.raw)\n return true;\n\n const regex = cachedRegex(template);\n if (regex)\n return !!text.match(regex);\n return false;\n}\n\nconst cachedRegexSymbol = Symbol('cachedRegex');\n\nfunction cachedRegex(template: aria.AriaTextValue): RegExp | null {\n if ((template as any)[cachedRegexSymbol] !== undefined)\n return (template as any)[cachedRegexSymbol];\n\n const { raw } = template;\n const canBeRegex = raw.startsWith('/') && raw.endsWith('/') && raw.length > 1;\n let regex: RegExp | null;\n try {\n regex = canBeRegex ? new RegExp(raw.slice(1, -1)) : null;\n } catch (e) {\n regex = null;\n }\n (template as any)[cachedRegexSymbol] = regex;\n return regex;\n}\n\nexport type MatcherReceived = {\n raw: string;\n regex: string;\n};\n\nexport function matchesExpectAriaTemplate(rootElement: Element, template: aria.AriaTemplateNode): { matches: aria.AriaNode[], received: MatcherReceived } {\n const snapshot = generateAriaTree(rootElement, { mode: 'default' });\n const matches = matchesNodeDeep(snapshot.root, template, false, false);\n const { json } = renderAriaTreeAsJSON(snapshot, { mode: 'default' });\n return {\n matches,\n received: {\n raw: renderAriaSnapshotAsYaml(json),\n regex: renderAriaSnapshotAsYaml(json, { convertStringsToRegex: true }),\n }\n };\n}\n\nexport function getAllElementsMatchingExpectAriaTemplate(rootElement: Element, template: aria.AriaTemplateNode): Element[] {\n const root = generateAriaTree(rootElement, { mode: 'default' }).root;\n const matches = matchesNodeDeep(root, template, true, false);\n return matches.map(n => ariaNodeElement(n));\n}\n\nfunction matchesNode(node: aria.AriaNode | string, template: aria.AriaTemplateNode, isDeepEqual: boolean): boolean {\n if (typeof node === 'string' && template.kind === 'text')\n return matchesTextValue(node, template.text);\n\n if (node === null || typeof node !== 'object' || template.kind !== 'role')\n return false;\n\n if (template.role !== 'fragment' && template.role !== node.role)\n return false;\n if (template.checked !== undefined && template.checked !== node.checked)\n return false;\n if (template.disabled !== undefined && template.disabled !== node.disabled)\n return false;\n if (template.expanded !== undefined && template.expanded !== node.expanded)\n return false;\n if (template.invalid !== undefined && template.invalid !== node.invalid)\n return false;\n if (template.level !== undefined && template.level !== node.level)\n return false;\n if (template.pressed !== undefined && template.pressed !== node.pressed)\n return false;\n if (template.selected !== undefined && template.selected !== node.selected)\n return false;\n if (!matchesStringOrRegex(node.name, template.name))\n return false;\n if (!matchesTextValue(node.props.url, template.props?.url))\n return false;\n\n // Proceed based on the container mode.\n if (template.containerMode === 'contain')\n return containsList(node.children || [], template.children || []);\n if (template.containerMode === 'equal')\n return listEqual(node.children || [], template.children || [], false);\n if (template.containerMode === 'deep-equal' || isDeepEqual)\n return listEqual(node.children || [], template.children || [], true);\n return containsList(node.children || [], template.children || []);\n}\n\nfunction listEqual(children: (aria.AriaNode | string)[], template: aria.AriaTemplateNode[], isDeepEqual: boolean): boolean {\n if (template.length !== children.length)\n return false;\n for (let i = 0; i < template.length; ++i) {\n if (!matchesNode(children[i], template[i], isDeepEqual))\n return false;\n }\n return true;\n}\n\nfunction containsList(children: (aria.AriaNode | string)[], template: aria.AriaTemplateNode[]): boolean {\n if (template.length > children.length)\n return false;\n const cc = children.slice();\n const tt = template.slice();\n for (const t of tt) {\n let c = cc.shift();\n while (c) {\n if (matchesNode(c, t, false))\n break;\n c = cc.shift();\n }\n if (!c)\n return false;\n }\n return true;\n}\n\nfunction matchesNodeDeep(root: aria.AriaNode, template: aria.AriaTemplateNode, collectAll: boolean, isDeepEqual: boolean): aria.AriaNode[] {\n const results: aria.AriaNode[] = [];\n const visit = (node: aria.AriaNode | string, parent: aria.AriaNode | null): boolean => {\n if (matchesNode(node, template, isDeepEqual)) {\n const result = typeof node === 'string' ? parent : node;\n if (result)\n results.push(result);\n return !collectAll;\n }\n if (typeof node === 'string')\n return false;\n for (const child of node.children || []) {\n if (visit(child, node))\n return true;\n }\n return false;\n };\n visit(root, null);\n return results;\n}\n\nexport function renderAriaTreeAsJSON(ariaSnapshot: AriaSnapshot, publicOptions: AriaTreeOptions): { json: aria.AriaSnapshotJSON, iframeDepths: Record<string, number> } {\n const options = toInternalOptions(publicOptions);\n const iframeDepths: Record<string, number> = {};\n\n const visit = (ariaNode: aria.AriaNode, depth: number, renderCursorPointer: boolean): aria.AriaNodeJSON => {\n if (ariaNode.role === 'iframe' && ariaNode.ref)\n iframeDepths[ariaNode.ref] = depth;\n\n const node: aria.AriaNodeJSON = { role: ariaNode.role as aria.AriaNodeJSON['role'] };\n if (ariaNode.name)\n node.name = ariaNode.name;\n if (ariaNode.checked === 'mixed' || ariaNode.checked === true)\n node.checked = ariaNode.checked;\n if (ariaNode.disabled)\n node.disabled = true;\n if (ariaNode.expanded)\n node.expanded = true;\n if (ariaNode.active && options.renderActive)\n node.active = true;\n if (ariaNode.invalid)\n node.invalid = ariaNode.invalid;\n if (ariaNode.level)\n node.level = ariaNode.level;\n if (ariaNode.pressed === 'mixed' || ariaNode.pressed === true)\n node.pressed = ariaNode.pressed;\n if (ariaNode.selected === true)\n node.selected = true;\n if (ariaNode.ref) {\n node.ref = ariaNode.ref;\n if (renderCursorPointer && aria.hasPointerCursor(ariaNode))\n node.cursor = 'pointer';\n }\n if (options.renderBoxes) {\n const element = ariaNodeElement(ariaNode);\n if (element) {\n const r = element.getBoundingClientRect();\n node.box = { x: Math.round(r.x), y: Math.round(r.y), width: Math.round(r.width), height: Math.round(r.height) };\n }\n }\n if (ariaNode.props.url !== undefined)\n node.url = ariaNode.props.url;\n if (ariaNode.props.placeholder !== undefined)\n node.placeholder = ariaNode.props.placeholder;\n if (ariaNode.props['aria-hidden'] !== undefined)\n node.ariaHidden = true;\n\n const singleTextChild = ariaNode.children.length === 1 && typeof ariaNode.children[0] === 'string' ? ariaNode.children[0] : undefined;\n const isAtDepthLimit = !!publicOptions.depth && depth === publicOptions.depth;\n if (singleTextChild !== undefined) {\n node.text = singleTextChild;\n } else if (!isAtDepthLimit && ariaNode.children.length) {\n const inCursorPointer = !!ariaNode.ref && renderCursorPointer && aria.hasPointerCursor(ariaNode);\n node.children = ariaNode.children.map(child => {\n if (typeof child === 'string')\n return child;\n return visit(child, depth + 1, renderCursorPointer && !inCursorPointer);\n });\n }\n return node;\n };\n\n const json: aria.AriaSnapshotJSON = [];\n const nodesToRender = ariaSnapshot.root.role === 'fragment' ? ariaSnapshot.root.children : [ariaSnapshot.root];\n for (const nodeToRender of nodesToRender) {\n if (typeof nodeToRender === 'string')\n json.push({ role: 'text', text: nodeToRender });\n else\n json.push(visit(nodeToRender, 0, !!options.renderCursorPointer));\n }\n return { json, iframeDepths };\n}\n\nconst elementSymbol = Symbol('element');\n\nfunction ariaNodeElement(ariaNode: aria.AriaNode): Element {\n return (ariaNode as any)[elementSymbol];\n}\n\nfunction setAriaNodeElement(ariaNode: aria.AriaNode, element: Element) {\n (ariaNode as any)[elementSymbol] = element;\n}\n\nexport function findNewElement(from: aria.AriaNode | undefined, to: aria.AriaNode): Element | undefined {\n const node = aria.findNewNode(from, to);\n return node ? ariaNodeElement(node) : undefined;\n}\n","import { setGlobalOptions } from '../vendor/playwright/injected/domUtils'\nimport {\n beginAriaCaches,\n endAriaCaches,\n getAriaRole,\n getElementAccessibleName,\n} from '../vendor/playwright/injected/roleUtils'\nimport { isMasked, MASK } from '../privacy'\n\nconst ua = navigator.userAgent\nexport const isWebKit = /AppleWebKit/.test(ua) && !/Chrome|Chromium|Android/.test(ua)\n\nlet configured = false\n\n/**\n * Run DOM queries of the vendored Playwright code. It relies on\n * Element.checkVisibility() (Chrome 105, Safari 17.4); older webviews get a\n * stand-in for the duration of the call only, so the page never sees it.\n */\nexport function withDomCompat<T>(fn: () => T): T {\n if (!configured) {\n configured = true\n setGlobalOptions({ browserNameForWorkarounds: isWebKit ? 'webkit' : 'chromium' })\n }\n const proto = Element.prototype as any\n if (typeof proto.checkVisibility === 'function') return fn()\n proto.checkVisibility = checkVisibilityFallback\n try {\n return fn()\n } finally {\n delete proto.checkVisibility\n }\n}\n\n// An element whose box is not rendered (display: none on it or an ancestor,\n// display: contents) has no client rects.\nfunction checkVisibilityFallback(this: Element) {\n return this.getClientRects().length > 0\n}\n\n/** Role and accessible name, as the snapshot would show them. */\nexport function describeForAgent(el: Element): { role: string; name: string } {\n return withDomCompat(() => {\n beginAriaCaches()\n try {\n const role = getAriaRole(el) || 'generic'\n let name = getElementAccessibleName(el, false).text.replace(/\\s+/g, ' ').trim()\n if (name && isMasked(el) && !isFormField(el)) name = MASK\n return { role, name }\n } finally {\n endAriaCaches()\n }\n })\n}\n\nexport function isFormField(el: Element) {\n return (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n )\n}\n\n/** `<tag#id.class>` for messages. */\nexport function tagOf(el: Element) {\n let s = el.tagName.toLowerCase()\n if (el.id) s += '#' + el.id\n const cls = typeof el.className === 'string' ? el.className.trim() : ''\n if (cls) s += '.' + cls.split(/\\s+/).slice(0, 2).join('.')\n return `<${s}>`\n}\n\n/** Whether `inner` is `outer` or inside it, also across shadow roots. */\nexport function containsComposed(outer: Element, inner: Element | null) {\n let node: Node | null = inner\n while (node) {\n if (node === outer) return true\n const parent: Node | null = node.parentNode\n if (parent) {\n node = parent\n } else {\n node = (node as ShadowRoot).host || null\n }\n }\n return false\n}\n\n/** The focused element, looking into shadow roots. */\nexport function deepActiveElement(): Element | null {\n let el: Element | null = document.activeElement\n while (el && el.shadowRoot && el.shadowRoot.activeElement) {\n el = el.shadowRoot.activeElement\n }\n return el\n}\n\nexport function sleep(ms: number) {\n return new Promise<void>(resolve => setTimeout(resolve, ms))\n}\n\n/** Next animation frame; falls back to a timer when rAF is paused (hidden tab). */\nexport function nextFrame() {\n return new Promise<void>(resolve => {\n let done = false\n const finish = () => {\n if (done) return\n done = true\n resolve()\n }\n requestAnimationFrame(finish)\n setTimeout(finish, 100)\n })\n}\n","import { elementFromPoint } from '../hitTest'\nimport { isMasked, MASK, scrub } from '../privacy'\n\n// Layers floating over the page: a popup's backdrop, the popup itself, a\n// bottom sheet. A backdrop is an empty <div>, so the aria snapshot has no node\n// (and no ref) for it, and the agent cannot click it to close the popup.\n// Found by hit testing a few points of the viewport: whatever is on top there\n// and sits in a fixed (or viewport-sized absolute) box is a layer.\n\nexport interface Overlay {\n element: Element\n kind: 'mask' | 'layer'\n /** Share of the viewport it covers, 0..100. */\n coverage: number\n /** A few words of its text (scrubbed); empty for a mask. */\n text: string\n}\n\nconst SAMPLES: [number, number][] = [\n [0.5, 0.5],\n [0.25, 0.3],\n [0.75, 0.3],\n [0.25, 0.7],\n [0.75, 0.7],\n [0.5, 0.15],\n [0.5, 0.85],\n]\nconst MIN_COVERAGE = 15 // %: smaller fixed things (floating buttons) are not layers\nconst FULL_COVERAGE = 80 // %: an absolute box this big acts like a fixed one\n\n/**\n * Layers over the page, topmost first. `contentRefs` are the elements of the\n * snapshot: a fixed box holding most of them is the app's own root, not a\n * layer over it.\n */\nexport function findOverlays(contentRefs: Element[]): Overlay[] {\n const vw = window.innerWidth\n const vh = window.innerHeight\n if (!vw || !vh) return []\n const found: Overlay[] = []\n for (const [fx, fy] of SAMPLES) {\n const root = layerOf(elementFromPoint(vw * fx, vh * fy))\n if (!root || found.some(o => o.element === root)) continue\n const coverage = coverageOf(root)\n if (coverage < MIN_COVERAGE) continue\n let inside = 0\n for (const el of contentRefs) if (root.contains(el)) inside++\n if (contentRefs.length >= 4 && inside * 2 >= contentRefs.length) continue\n const text = (root.textContent || '').replace(/\\s+/g, ' ').trim()\n const mask = !text && !root.querySelector('img, svg, canvas, video, input, textarea, select, button')\n found.push({\n element: root,\n kind: mask ? 'mask' : 'layer',\n coverage,\n text: mask ? '' : isMasked(root) ? MASK : clip(scrub(text), 30),\n })\n }\n return found\n}\n\n/** The positioned box that makes `el` float over the page, if any. */\nexport function layerOf(el: Element | null): Element | null {\n for (let node = el; node && node !== document.body && node !== document.documentElement; node = node.parentElement) {\n const position = getComputedStyle(node).position\n if (position === 'fixed') return node\n if (position === 'absolute' && coverageOf(node) >= FULL_COVERAGE) return node\n }\n return null\n}\n\nfunction coverageOf(el: Element) {\n const r = el.getBoundingClientRect()\n const w = Math.max(0, Math.min(r.right, window.innerWidth) - Math.max(r.left, 0))\n const h = Math.max(0, Math.min(r.bottom, window.innerHeight) - Math.max(r.top, 0))\n return Math.round(((w * h) / (window.innerWidth * window.innerHeight)) * 100)\n}\n\nfunction clip(text: string, n: number) {\n return text.length > n ? text.slice(0, n) + '…' : text\n}\n","import {\n generateAriaTree,\n renderAriaTreeAsJSON,\n} from '../vendor/playwright/injected/ariaSnapshot'\nimport { normalizeWhiteSpace } from '../vendor/playwright/isomorphic/stringUtils'\nimport { renderAriaSnapshotAsYaml } from '../vendor/playwright/isomorphic/ariaSnapshotRenderer'\nimport type { AriaNode } from '../vendor/playwright/isomorphic/ariaSnapshot'\nimport { isDebugUi, isMasked, maskedElements, MASK, scrubPatterns, shownText } from '../privacy'\nimport { isFormField, tagOf, withDomCompat } from './dom'\nimport { rwdError } from './errors'\nimport { agentText } from './i18n'\nimport { findOverlays } from './overlays'\n\n// The agent's view of the page: Playwright's AI-mode aria snapshot (the same\n// YAML Playwright MCP produces), with [ref=eN] on elements the agent can act\n// on. The vendored code is used as is; this wrapper only drops debug tools'\n// UI (eruda, PageSpy, vConsole; ours lives outside <body>) and masks\n// sensitive values.\n\nconst OPTIONS = { mode: 'ai' as const }\n\n// ref -> element, from the latest snapshot only.\nlet refs = new Map<string, Element>()\n// Refs for elements the aria snapshot has no node for (a popup's empty\n// backdrop, the element covering a click target): oN, kept while connected.\nconst extraRefs = new Map<string, Element>()\nlet extraSeq = 0\n// The cleaned tree of the latest snapshot (what the agent saw), for rwd.query.\nlet lastTree: AriaNode | undefined\n\nexport function takeSnapshot(): string {\n const root = document.body || document.documentElement\n return withDomCompat(() => {\n const snapshot = generateAriaTree(root, OPTIONS)\n clean(snapshot.root, collectSecrets())\n applyPatterns(snapshot.root)\n lastTree = snapshot.root\n\n const next = new Map<string, Element>()\n snapshot.info.forEach((info, ref) => {\n if (!isDebugUi(info.element)) next.set(ref, info.element)\n })\n refs = next\n extraRefs.forEach((el, ref) => {\n if (!el.isConnected) extraRefs.delete(ref)\n })\n\n const { json } = renderAriaTreeAsJSON(snapshot, OPTIONS)\n return renderAriaSnapshotAsYaml(json) + overlaySection(Array.from(next.values()))\n })\n}\n\n/** A ref for any element: its snapshot ref, or an oN ref of its own. */\nexport function refFor(el: Element): string {\n let found = ''\n refs.forEach((other, ref) => {\n if (!found && other === el) found = ref\n })\n extraRefs.forEach((other, ref) => {\n if (!found && other === el) found = ref\n })\n if (found) return found\n const ref = 'o' + ++extraSeq\n extraRefs.set(ref, el)\n return ref\n}\n\n// Popups and their backdrops, listed after the tree so the agent knows what\n// sits on top and can click a backdrop to close its popup.\nfunction overlaySection(content: Element[]) {\n const overlays = findOverlays(content)\n if (!overlays.length) return ''\n const t = agentText()\n const lines = overlays.map(o =>\n o.kind === 'mask'\n ? t.overlayMask(tagOf(o.element), o.coverage, refFor(o.element))\n : t.overlayLayer(tagOf(o.element), o.text, o.coverage, refFor(o.element))\n )\n return '\\n\\n' + t.overlayHeader + '\\n' + lines.join('\\n') + '\\n'\n}\n\n/** The element behind a ref of the latest snapshot. */\nexport function resolveRef(ref: unknown): Element {\n if (typeof ref !== 'string' || !ref) {\n throw rwdError('bad_request', agentText().missingParam('ref'))\n }\n const el = refs.get(ref) || extraRefs.get(ref)\n if (!el) {\n throw rwdError('not_found', agentText().refNotInSnapshot(ref))\n }\n if (!el.isConnected) {\n throw rwdError('not_found', agentText().refDetached(ref))\n }\n return el\n}\n\nexport interface QueryMatch {\n ref: string\n role: string\n name: string\n text: string\n}\n\n/**\n * Elements of a fresh snapshot (refs stay stable for unchanged elements) by\n * role (exact), accessible name and / or text (substrings, case-insensitive).\n * Text matches return the innermost elements only, not every ancestor.\n */\nexport function querySnapshot(params: { role?: unknown; name?: unknown; text?: unknown; limit?: unknown }) {\n const lower = (v: unknown) => (typeof v === 'string' ? v.trim().toLowerCase() : '')\n const role = lower(params.role)\n const name = lower(params.name)\n const text = lower(params.text)\n if (!role && !name && !text) throw rwdError('bad_request', agentText().queryNeedsCriteria)\n const limit = Math.max(1, Math.min(100, Number(params.limit) || 20))\n takeSnapshot()\n const matches: QueryMatch[] = []\n const walk = (node: AriaNode): { text: string; matched: boolean } => {\n let all = node.name || ''\n let inner = false\n for (const child of node.children) {\n if (typeof child === 'string') {\n all += ' ' + child\n } else {\n const sub = walk(child)\n all += ' ' + sub.text\n inner = inner || sub.matched\n }\n }\n all = normalizeWhiteSpace(all)\n const ok =\n !!node.ref &&\n refs.has(node.ref) &&\n (!role || node.role.toLowerCase() === role) &&\n (!name || (node.name || '').toLowerCase().indexOf(name) >= 0) &&\n (!text || all.toLowerCase().indexOf(text) >= 0)\n // Ancestors of a text match contain the same text: keep the innermost.\n if (ok && !(text && inner)) {\n matches.push({ ref: node.ref!, role: node.role, name: node.name || '', text: all.length > 100 ? all.slice(0, 100) + '…' : all })\n }\n return { text: all, matched: ok || inner }\n }\n if (lastTree) walk(lastTree)\n return { matches: matches.slice(0, limit), total: matches.length }\n}\n\nfunction applyPatterns(node: AriaNode) {\n if (node.name) node.name = scrubPatterns(node.name)\n for (const key in node.props) node.props[key] = scrubPatterns(node.props[key])\n node.children = node.children.map(child => {\n if (typeof child === 'string') return scrubPatterns(child)\n applyPatterns(child)\n return child\n })\n}\n\ninterface Secret {\n element: Element\n text: string\n}\n\nfunction collectSecrets(): Secret[] {\n const secrets: Secret[] = []\n const elements = maskedElements()\n for (let i = 0; i < elements.length; i++) {\n const text = normalizeWhiteSpace(shownText(elements[i]))\n if (text) secrets.push({ element: elements[i], text })\n }\n return secrets\n}\n\nfunction clean(node: AriaNode, secrets: Secret[]) {\n const children: (AriaNode | string)[] = []\n for (const child of node.children) {\n if (typeof child !== 'string') {\n const el = elementOf(child)\n if (el && isDebugUi(el)) continue\n clean(child, secrets)\n }\n children.push(child)\n }\n node.children = children\n\n const el = elementOf(node)\n if (!el || !secrets.length) return\n\n if (isMasked(el)) {\n // A field keeps its label; anything else shows nothing of its content.\n if (!isFormField(el) && node.name) node.name = MASK\n node.children = node.children.map(child =>\n typeof child === 'string' && child ? MASK : child\n )\n return\n }\n\n // Text of masked descendants that was merged into this node's text or name.\n const inside: string[] = []\n for (const secret of secrets) {\n if (el.contains(secret.element)) inside.push(secret.text)\n }\n if (!inside.length) return\n const scrub = (text: string) => {\n for (const secret of inside) text = text.split(secret).join(MASK)\n return text\n }\n if (node.name) node.name = scrub(node.name)\n node.children = node.children.map(child =>\n typeof child === 'string' ? scrub(child) : child\n )\n}\n\n// The vendored ariaSnapshot.ts keeps each node's element under a private\n// symbol, Symbol('element'). Find it once instead of patching the vendored code.\nlet elementSymbol: symbol | undefined\n\nfunction elementOf(node: AriaNode): Element | undefined {\n if (!elementSymbol) {\n const symbols = Object.getOwnPropertySymbols(node)\n for (const symbol of symbols) {\n if (String(symbol) === 'Symbol(element)') elementSymbol = symbol\n }\n if (!elementSymbol) return undefined\n }\n return (node as any)[elementSymbol]\n}\n","import { MASK, scrub } from '../privacy'\nimport { rwdError } from './errors'\nimport { agentText } from './i18n'\n\n// rwd.storage (docs/protocol.md §5.2, §6): localStorage, sessionStorage or the\n// cookies scripts can read (not HttpOnly). Values go through the same masking\n// as console text; the SDK's own credentials never leave the page.\n\nconst ENTRY_LIMIT = 500\nconst VALUE_LIMIT = 4000\nconst OWN_SECRETS = /^rwd:(dtoken|resume)$/\n\nexport function readStorage(params: any = {}) {\n const area = params.area\n const raw: [string, string][] = []\n if (area === 'local' || area === 'session') {\n let store: Storage\n try {\n store = area === 'local' ? window.localStorage : window.sessionStorage\n for (let i = 0; i < store.length && raw.length < ENTRY_LIMIT; i++) {\n const key = store.key(i)\n if (key !== null) raw.push([key, store.getItem(key) || ''])\n }\n } catch (e) {\n throw rwdError('internal', agentText().storageUnavailable(area))\n }\n } else if (area === 'cookie') {\n const cookie = document.cookie || ''\n for (const part of cookie.split(';')) {\n const at = part.indexOf('=')\n const key = (at < 0 ? '' : part.slice(0, at)).trim()\n const value = at < 0 ? part.trim() : part.slice(at + 1).trim()\n if ((key || value) && raw.length < ENTRY_LIMIT) raw.push([key, value])\n }\n } else {\n throw rwdError('bad_request', agentText().badStorageArea)\n }\n const entries = raw.map(([key, value]) => {\n value = OWN_SECRETS.test(key) ? MASK : scrub(value)\n if (value.length > VALUE_LIMIT) value = value.slice(0, VALUE_LIMIT) + '…'\n return { key, value }\n })\n return { entries }\n}\n","import { closestComposed, validSelectors } from '../privacy'\nimport { deepActiveElement, describeForAgent, tagOf } from './dom'\nimport { userText } from './i18n'\n\n// Permission levels and sensitive-action confirmation (docs/protocol.md §6,\n// §8). The gateway checks levels first; the page checks again.\n\nexport type Level = 'observe' | 'interact' | 'advanced'\nexport const LEVELS: Level[] = ['observe', 'interact', 'advanced']\n\nconst METHOD_LEVELS: { [method: string]: Level } = {\n 'rwd.ping': 'observe',\n 'rwd.snapshot': 'observe',\n 'rwd.screenshot': 'observe',\n 'rwd.console': 'observe',\n 'rwd.network': 'observe',\n 'rwd.waitFor': 'observe',\n 'rwd.query': 'observe',\n 'rwd.log': 'observe',\n 'rwd.click': 'interact',\n 'rwd.fill': 'interact',\n 'rwd.type': 'interact',\n 'rwd.press': 'interact',\n 'rwd.select': 'interact',\n 'rwd.hover': 'interact',\n 'rwd.scroll': 'interact',\n 'rwd.drag': 'interact',\n 'rwd.navigate': 'interact',\n 'rwd.back': 'interact',\n 'rwd.reload': 'interact',\n 'rwd.evaluate': 'advanced',\n 'rwd.networkDetail': 'advanced',\n 'rwd.storage': 'advanced',\n 'rwd.logDetail': 'advanced',\n}\n\n/** Level a method needs; unknown methods need nothing (they fail as bad_request). */\nexport function requiredLevel(method: string): Level | null {\n return Object.prototype.hasOwnProperty.call(METHOD_LEVELS, method) ? METHOD_LEVELS[method] : null\n}\n\n/** A level string from the gateway; anything unknown is the most restrictive. */\nexport function toLevel(value: unknown): Level {\n return LEVELS.indexOf(value as Level) >= 0 ? (value as Level) : 'observe'\n}\n\nexport function levelAllows(granted: Level, needed: Level) {\n return LEVELS.indexOf(granted) >= LEVELS.indexOf(needed)\n}\n\nexport const CONFIRM_SELECTOR = '[data-rwd-confirm]'\nlet confirmSelector = CONFIRM_SELECTOR\n\n/** Project policy `confirmSelectors`, on top of [data-rwd-confirm]. */\nexport function setConfirmSelectors(list: unknown) {\n confirmSelector = [CONFIRM_SELECTOR].concat(validSelectors(list)).join(', ')\n}\n\n/** The element (or the ancestor) that asks for confirmation, if any. */\nexport function confirmTarget(el: Element): Element | null {\n return closestComposed(el, confirmSelector)\n}\n\nfunction label(el: Element) {\n let name = describeForAgent(el).name\n if (!name) name = (el.textContent || '').replace(/\\s+/g, ' ').trim()\n if (name.length > 30) name = name.slice(0, 30) + '…'\n return name ? userText().quote(name) : tagOf(el)\n}\n\n/**\n * 'click \"Place order\"' when clicking `el` needs the user's consent, else\n * null. In the user's language: the SDK shows it as \"AI wants to …\".\n */\nexport function clickConfirmation(el: Element): string | null {\n const target = confirmTarget(el)\n return target ? userText().click(label(target)) : null\n}\n\n/**\n * Pressing Enter in a form that holds (or is) a confirm element submits it:\n * 'press Enter to submit \"Place order\"'. Enter in a textarea or rich editor\n * only adds a line; Enter on a focused confirm button activates it.\n */\nexport function enterConfirmation(): string | null {\n const el = deepActiveElement()\n if (!el || el === document.body) return null\n const own = confirmTarget(el)\n if (own) return userText().enterActivate(label(own))\n if (el instanceof HTMLTextAreaElement || (el instanceof HTMLElement && el.isContentEditable)) return null\n const form = (el as HTMLInputElement).form || closestComposed(el, 'form')\n if (!form) return null\n const inside = confirmTarget(form) || form.querySelector(confirmSelector)\n return inside ? userText().enterSubmit(label(inside)) : null\n}\n","import { deepActiveElement } from './dom'\n\n// What a browser does by default after an unprevented keydown: insert text,\n// delete, move the caret, select all. Synthetic key events never trigger\n// these, so the engine applies them itself on the focused field.\n\ntype TextField = HTMLInputElement | HTMLTextAreaElement\n\nconst ALT = 1\nconst CTRL = 2\nconst META = 4\nconst SHIFT = 8\n\n/** Input types that keep a value but expose no selection API. */\nconst NO_SELECTION = /^(email|number|date|datetime-local|month|time|week)$/\nconst NOT_TEXT = /^(checkbox|radio|file|button|submit|reset|image|hidden|range|color)$/\n\nfunction focused(): Element {\n return deepActiveElement() || document.body\n}\n\nfunction textField(el: Element): TextField | null {\n if (el instanceof HTMLTextAreaElement) return el\n if (el instanceof HTMLInputElement && !NOT_TEXT.test(el.type)) return el\n return null\n}\n\nfunction writable(el: TextField) {\n return !el.readOnly && !el.disabled\n}\n\nfunction setValue(el: TextField, value: string) {\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype\n const setter = Object.getOwnPropertyDescriptor(proto, 'value')?.set\n if (setter) setter.call(el, value)\n else el.value = value\n}\n\n/** [start, end] of the selection; fields without one act as \"caret at the end\". */\nfunction range(el: TextField): [number, number] {\n if (el instanceof HTMLInputElement && NO_SELECTION.test(el.type)) {\n return [el.value.length, el.value.length]\n }\n const start = el.selectionStart\n const end = el.selectionEnd\n if (start === null || end === null) return [el.value.length, el.value.length]\n return [start, end]\n}\n\nfunction select(el: TextField, start: number, end: number, backward = false) {\n if (el instanceof HTMLInputElement && NO_SELECTION.test(el.type)) return\n try {\n el.setSelectionRange(start, end, backward ? 'backward' : 'forward')\n } catch {\n // Some input types refuse a selection; the caret simply stays put.\n }\n}\n\n/** Replace [start, end) with text, firing beforeinput / input like typing does. */\nfunction edit(el: TextField, start: number, end: number, text: string, inputType: string) {\n if (!writable(el)) return\n const before = new InputEvent('beforeinput', {\n bubbles: true,\n cancelable: true,\n composed: true,\n inputType,\n data: text || null,\n })\n if (!el.dispatchEvent(before)) return\n\n const value = el.value\n if (el.maxLength >= 0 && text) {\n const room = el.maxLength - (value.length - (end - start))\n text = room > 0 ? Array.from(text).slice(0, room).join('') : ''\n if (!text && start === end) return\n }\n setValue(el, value.slice(0, start) + text + value.slice(end))\n const caret = start + text.length\n select(el, caret, caret)\n el.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType, data: text || null }))\n}\n\n/** Length of the code point that ends (backward) or starts (forward) at i. */\nfunction charLength(value: string, i: number, backward: boolean) {\n const at = backward ? i - 1 : i\n const code = value.charCodeAt(at)\n if (backward && code >= 0xdc00 && code <= 0xdfff && i >= 2) return 2\n if (!backward && code >= 0xd800 && code <= 0xdbff && i + 1 < value.length) return 2\n return 1\n}\n\n/** Offset of the previous / next word boundary, for Alt/Ctrl + arrow or delete. */\nfunction wordBoundary(value: string, i: number, backward: boolean) {\n const word = /[\\p{L}\\p{N}_]/u\n if (backward) {\n while (i > 0 && !word.test(value[i - 1])) i--\n while (i > 0 && word.test(value[i - 1])) i--\n } else {\n while (i < value.length && !word.test(value[i])) i++\n while (i < value.length && word.test(value[i])) i++\n }\n return i\n}\n\nfunction lineStart(value: string, i: number) {\n return value.lastIndexOf('\\n', i - 1) + 1\n}\n\nfunction lineEnd(value: string, i: number) {\n const next = value.indexOf('\\n', i)\n return next < 0 ? value.length : next\n}\n\n/** Caret one line up or down in a textarea, keeping the column when it fits. */\nfunction verticalMove(value: string, i: number, up: boolean) {\n const start = lineStart(value, i)\n const column = i - start\n if (up) {\n if (start === 0) return 0\n const prev = lineStart(value, start - 1)\n return Math.min(prev + column, start - 1)\n }\n const end = lineEnd(value, i)\n if (end === value.length) return value.length\n const nextStart = end + 1\n return Math.min(nextStart + column, lineEnd(value, nextStart))\n}\n\n/** Insert text at the caret of the focused field or contenteditable. */\nexport function insertText(text: string) {\n if (!text) return\n const el = focused()\n const field = textField(el)\n if (field) {\n const [start, end] = range(field)\n const value = field instanceof HTMLInputElement ? text.replace(/[\\r\\n]+/g, '') : text\n edit(field, start, end, value, text === '\\n' ? 'insertLineBreak' : 'insertText')\n return\n }\n if (el instanceof HTMLElement && el.isContentEditable) {\n if (text === '\\n') {\n if (!document.execCommand('insertLineBreak')) document.execCommand('insertText', false, '\\n')\n } else {\n document.execCommand('insertText', false, text)\n }\n }\n}\n\n/**\n * Default action of an editing / navigation key on the focused element.\n * Returns false when the key has no editing meaning there.\n */\nexport function editKey(key: string, mods: number): boolean {\n const el = focused()\n const field = textField(el)\n const word = !!(mods & (ALT | CTRL))\n const line = !!(mods & META)\n const extend = !!(mods & SHIFT)\n\n if (key === 'a' || key === 'A') {\n if (!(mods & (CTRL | META))) return false\n if (field) select(field, 0, field.value.length)\n else document.execCommand('selectAll')\n return true\n }\n\n if (!field) {\n if (!(el instanceof HTMLElement) || !el.isContentEditable) return false\n return editContent(key, word, line, extend)\n }\n\n const value = field.value\n const [start, end] = range(field)\n const backwardAnchor = field.selectionDirection === 'backward'\n const caret = backwardAnchor ? start : end\n const anchor = backwardAnchor ? end : start\n const multiline = field instanceof HTMLTextAreaElement\n\n const moveTo = (to: number) => {\n if (extend) select(field, Math.min(anchor, to), Math.max(anchor, to), to < anchor)\n else select(field, to, to)\n }\n\n switch (key) {\n case 'Backspace':\n case 'Delete': {\n const backward = key === 'Backspace'\n if (start !== end) {\n edit(field, start, end, '', backward ? 'deleteContentBackward' : 'deleteContentForward')\n return true\n }\n let from = start\n let to = start\n if (backward) {\n if (line) from = lineStart(value, start)\n else if (word) from = wordBoundary(value, start, true)\n else if (start > 0) from = start - charLength(value, start, true)\n } else {\n if (line) to = lineEnd(value, start)\n else if (word) to = wordBoundary(value, start, false)\n else if (start < value.length) to = start + charLength(value, start, false)\n }\n if (from !== to) {\n const type = backward\n ? word ? 'deleteWordBackward' : line ? 'deleteSoftLineBackward' : 'deleteContentBackward'\n : word ? 'deleteWordForward' : line ? 'deleteSoftLineForward' : 'deleteContentForward'\n edit(field, from, to, '', type)\n }\n return true\n }\n case 'ArrowLeft':\n case 'ArrowRight': {\n const backward = key === 'ArrowLeft'\n if (!extend && start !== end) {\n select(field, backward ? start : end, backward ? start : end)\n return true\n }\n let to: number\n if (line) to = backward ? lineStart(value, caret) : lineEnd(value, caret)\n else if (word) to = wordBoundary(value, caret, backward)\n else if (backward) to = caret > 0 ? caret - charLength(value, caret, true) : 0\n else to = caret < value.length ? caret + charLength(value, caret, false) : value.length\n moveTo(to)\n return true\n }\n case 'ArrowUp':\n case 'ArrowDown': {\n const up = key === 'ArrowUp'\n if (!multiline || line) moveTo(up ? 0 : value.length)\n else moveTo(verticalMove(value, caret, up))\n return true\n }\n case 'Home':\n case 'End': {\n const home = key === 'Home'\n if (!multiline || mods & CTRL) moveTo(home ? 0 : value.length)\n else moveTo(home ? lineStart(value, caret) : lineEnd(value, caret))\n return true\n }\n default:\n return false\n }\n}\n\n/** The same keys in a contenteditable, through the browser's own editing commands. */\nfunction editContent(key: string, word: boolean, line: boolean, extend: boolean): boolean {\n const sel = document.getSelection()\n const granularity = line ? 'lineboundary' : word ? 'word' : 'character'\n switch (key) {\n case 'Backspace':\n case 'Delete': {\n const backward = key === 'Backspace'\n if (sel && sel.isCollapsed && granularity !== 'character' && (sel as any).modify) {\n ;(sel as any).modify('extend', backward ? 'backward' : 'forward', granularity)\n }\n document.execCommand(backward ? 'delete' : 'forwardDelete')\n return true\n }\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'ArrowUp':\n case 'ArrowDown':\n case 'Home':\n case 'End': {\n if (!sel || !(sel as any).modify) return true\n const backward = key === 'ArrowLeft' || key === 'ArrowUp' || key === 'Home'\n const unit =\n key === 'Home' || key === 'End' ? 'lineboundary' : key === 'ArrowUp' || key === 'ArrowDown' ? 'line' : granularity\n ;(sel as any).modify(extend ? 'extend' : 'move', backward ? 'backward' : 'forward', unit)\n return true\n }\n default:\n return false\n }\n}\n","import { editKey, insertText } from './editing'\nimport { deepActiveElement } from './dom'\nimport { rwdError } from './errors'\nimport { agentText } from './i18n'\n\n// Keyboard input with Playwright key names (\"Enter\", \"ArrowDown\", \"a\",\n// \"Control+A\", \"Shift+Tab\", \"ControlOrMeta+A\"). Printable keys go through\n// keydown → keypress → beforeinput/input (value updated) → keyup; editing keys\n// (Backspace, arrows, Home/End, Select All) get their default action from\n// ./editing.ts. Characters outside the US layout (e.g. Chinese) are inserted as\n// text without key events, as Playwright does.\n\ninterface KeyDef {\n key: string\n code: string\n keyCode: number\n text: string\n location?: number\n}\n\n// name: [keyCode, code, key (defaults to name), text]\nconst SPECIAL: { [name: string]: [number, string, string?, string?] } = {\n Backspace: [8, 'Backspace'],\n Tab: [9, 'Tab', 'Tab', '\\t'],\n Enter: [13, 'Enter', 'Enter', '\\r'],\n Shift: [16, 'ShiftLeft'],\n Control: [17, 'ControlLeft'],\n Alt: [18, 'AltLeft'],\n Meta: [91, 'MetaLeft'],\n CapsLock: [20, 'CapsLock'],\n Escape: [27, 'Escape'],\n Space: [32, 'Space', ' ', ' '],\n PageUp: [33, 'PageUp'],\n PageDown: [34, 'PageDown'],\n End: [35, 'End'],\n Home: [36, 'Home'],\n ArrowLeft: [37, 'ArrowLeft'],\n ArrowUp: [38, 'ArrowUp'],\n ArrowRight: [39, 'ArrowRight'],\n ArrowDown: [40, 'ArrowDown'],\n Insert: [45, 'Insert'],\n Delete: [46, 'Delete'],\n}\nfor (let i = 1; i <= 12; i++) SPECIAL['F' + i] = [111 + i, 'F' + i]\n\n// Punctuation on the US layout: char -> [keyCode, code, shifted?]\nconst PUNCT: { [ch: string]: [number, string, boolean] } = {}\nconst PUNCT_ROWS: [string, string, number, string][] = [\n ['`', '~', 192, 'Backquote'],\n ['-', '_', 189, 'Minus'],\n ['=', '+', 187, 'Equal'],\n ['[', '{', 219, 'BracketLeft'],\n [']', '}', 221, 'BracketRight'],\n ['\\\\', '|', 220, 'Backslash'],\n [';', ':', 186, 'Semicolon'],\n [\"'\", '\"', 222, 'Quote'],\n [',', '<', 188, 'Comma'],\n ['.', '>', 190, 'Period'],\n ['/', '?', 191, 'Slash'],\n]\nfor (const [plain, shifted, keyCode, code] of PUNCT_ROWS) {\n PUNCT[plain] = [keyCode, code, false]\n PUNCT[shifted] = [keyCode, code, true]\n}\nconst SHIFTED_DIGITS = ')!@#$%^&*('\n\nconst MOD_BITS: { [name: string]: number } = { Alt: 1, Control: 2, Meta: 4, Shift: 8 }\n\nconst isMac = /Mac|iPhone|iPad|iPod/.test(navigator.platform || navigator.userAgent)\n\n/** Key definition for a Playwright key name or a single character. */\nfunction keyDef(name: string, shift: boolean): KeyDef | null {\n const special = SPECIAL[name]\n if (special) {\n const [keyCode, code, key, text] = special\n return { key: key || name, code, keyCode, text: text || '' }\n }\n if (/^Key[A-Z]$/.test(name)) name = shift ? name[3] : name[3].toLowerCase()\n if (/^Digit[0-9]$/.test(name)) name = name[5]\n if (name.length !== 1) return null\n\n if (/[a-zA-Z]/.test(name)) {\n const upper = name.toUpperCase()\n const ch = shift ? upper : name\n return { key: ch, code: 'Key' + upper, keyCode: upper.charCodeAt(0), text: ch }\n }\n if (/[0-9]/.test(name)) {\n const ch = shift ? SHIFTED_DIGITS[+name] : name\n return { key: ch, code: 'Digit' + name, keyCode: name.charCodeAt(0), text: ch }\n }\n const digit = SHIFTED_DIGITS.indexOf(name)\n if (digit >= 0) {\n return { key: name, code: 'Digit' + digit, keyCode: 48 + digit, text: name }\n }\n const punct = PUNCT[name]\n if (punct) return { key: name, code: punct[1], keyCode: punct[0], text: name }\n if (name === ' ') return keyDef('Space', shift)\n return null\n}\n\nfunction target(): HTMLElement {\n const el = deepActiveElement()\n return el instanceof HTMLElement ? el : document.body\n}\n\nfunction fireKey(type: string, def: KeyDef, mods: number, el: HTMLElement) {\n const ev = new KeyboardEvent(type, {\n key: def.key,\n code: def.code,\n location: def.location || 0,\n bubbles: true,\n cancelable: true,\n composed: true,\n view: window,\n altKey: !!(mods & 1),\n ctrlKey: !!(mods & 2),\n metaKey: !!(mods & 4),\n shiftKey: !!(mods & 8),\n })\n const code = type === 'keypress' ? def.text.charCodeAt(0) : def.keyCode\n // Legacy fields many pages still read.\n for (const name of ['keyCode', 'which', 'charCode']) {\n const value = name === 'charCode' ? (type === 'keypress' ? code : 0) : code\n Object.defineProperty(ev, name, { configurable: true, get: () => value })\n }\n return el.dispatchEvent(ev)\n}\n\nfunction pressDef(def: KeyDef, mods: number) {\n const el = target()\n const printable = !!def.text && !(mods & (1 | 2 | 4))\n\n if (def.key === 'Enter' && !(mods & (1 | 2 | 4))) {\n if (fireKey('keydown', def, mods, el) && fireKey('keypress', def, mods, el)) {\n enterDefault(el)\n }\n fireKey('keyup', def, mods, target())\n return\n }\n if (printable && def.key !== 'Tab') {\n if (fireKey('keydown', def, mods, el) && fireKey('keypress', def, mods, el)) {\n insertText(def.text)\n }\n fireKey('keyup', def, mods, target())\n return\n }\n // Editing and navigation keys: keydown plus the default editing action.\n if (fireKey('keydown', def, mods, el)) {\n if (def.key === 'Tab' && !(mods & (1 | 2 | 4))) moveFocus(!!(mods & 8))\n else editKey(def.key, mods)\n }\n fireKey('keyup', def, mods, target())\n}\n\nfunction enterDefault(el: HTMLElement) {\n if (el instanceof HTMLTextAreaElement || el.isContentEditable) {\n insertText('\\n')\n return\n }\n if (el instanceof HTMLInputElement && el.form) {\n // Implicit submission: the form's default button, else submit directly.\n const form = el.form\n const submitter = form.querySelector(\n 'button:not([type]), button[type=submit], input[type=submit], input[type=image]'\n ) as HTMLElement | null\n if (submitter) {\n if (!(submitter as HTMLButtonElement).disabled) submitter.click()\n } else if (typeof (form as any).requestSubmit === 'function') {\n ;(form as any).requestSubmit()\n } else if (form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }))) {\n form.submit()\n }\n } else if (el instanceof HTMLAnchorElement || el instanceof HTMLButtonElement) {\n el.click()\n }\n}\n\nfunction moveFocus(backwards: boolean) {\n const all = Array.prototype.filter.call(\n document.querySelectorAll(\n 'a[href], button, input, select, textarea, [tabindex], [contenteditable]'\n ),\n (el: HTMLElement) =>\n el.tabIndex >= 0 && !(el as HTMLButtonElement).disabled && el.getClientRects().length > 0\n ) as HTMLElement[]\n if (!all.length) return\n const index = all.indexOf(target())\n const next = backwards\n ? all[(index <= 0 ? all.length : index) - 1]\n : all[(index + 1) % all.length]\n next.focus()\n}\n\n/** rwd.press: a Playwright key name, optionally with modifiers (\"Control+A\"). */\nexport function press(combo: string) {\n if (typeof combo !== 'string' || !combo) throw rwdError('bad_request', agentText().missingParam('key'))\n const parts = combo === '+' ? ['+'] : combo.split('+')\n if (parts[parts.length - 1] === '' && parts.length > 1) {\n parts.splice(parts.length - 2, 2, '+')\n }\n const main = parts.pop()!\n const modNames = parts.map(m => (m === 'ControlOrMeta' ? (isMac ? 'Meta' : 'Control') : m))\n let mods = 0\n for (const m of modNames) {\n if (!(m in MOD_BITS)) throw rwdError('bad_request', agentText().unknownModifier(m))\n }\n const shift = modNames.indexOf('Shift') >= 0\n const def = keyDef(main, shift)\n if (!def) throw rwdError('bad_request', agentText().unknownKey(main))\n\n for (const m of modNames) {\n mods |= MOD_BITS[m]\n fireKey('keydown', keyDef(m, false)!, mods, target())\n }\n pressDef(def, mods)\n for (let i = modNames.length - 1; i >= 0; i--) {\n mods &= ~MOD_BITS[modNames[i]]\n fireKey('keyup', keyDef(modNames[i], false)!, mods, target())\n }\n}\n\n/** rwd.type: type text into the focused element, key by key. */\nexport function typeText(text: string) {\n // Code points, not UTF-16 units.\n const chars = Array.from(text)\n for (const ch of chars) {\n if (ch === '\\n' || ch === '\\r') {\n pressDef(keyDef('Enter', false)!, 0)\n continue\n }\n const shifted = /[A-Z~!@#$%^&*()_+{}|:\"<>?]/.test(ch)\n const def = ch.length === 1 && ch !== '\\t' ? keyDef(ch, shifted) : null\n if (def) {\n pressDef(def, shifted ? 8 : 0)\n } else {\n insertText(ch)\n }\n }\n}\n","import { computeBox } from '../vendor/playwright/injected/domUtils'\nimport {\n beginAriaCaches,\n endAriaCaches,\n getAriaDisabled,\n} from '../vendor/playwright/injected/roleUtils'\nimport { elementFromPoint } from '../hitTest'\nimport { closestComposed } from '../privacy'\nimport { containsComposed, deepActiveElement, nextFrame, sleep, tagOf, withDomCompat } from './dom'\nimport { rwdError } from './errors'\nimport { agentText } from './i18n'\nimport { refFor } from './snapshot'\n\n// Actionability checks and synthesized pointer input, done inside the page in\n// one go (Playwright does the same checks over a dozen CDP round trips).\n// Synthesized events are untrusted (isTrusted === false); that is also what\n// lets them pass the input lock while the agent is in control.\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport const ACTION_TIMEOUT = 5000\nconst RETRY_WAITS = [0, 20, 50, 100, 100, 250, 500]\n\nexport interface ActionabilityOptions {\n /** Require the point under the element's center to hit it (clicks). */\n hitTest?: boolean\n timeoutMs?: number\n}\n\n/**\n * Wait until the element is connected, visible, enabled, stable over two\n * animation frames and in the viewport, and (optionally) receives the\n * pointer at its center. Returns that point in client coordinates.\n */\nexport async function waitForActionable(\n el: Element,\n options: ActionabilityOptions = {}\n): Promise<Point> {\n const deadline = Date.now() + (options.timeoutMs || ACTION_TIMEOUT)\n let reason = ''\n for (let attempt = 0; ; attempt++) {\n if (attempt) {\n if (Date.now() >= deadline) break\n await sleep(RETRY_WAITS[Math.min(attempt, RETRY_WAITS.length - 1)])\n }\n if (!el.isConnected) {\n throw rwdError('not_found', agentText().elementDetached(tagOf(el)))\n }\n reason = withDomCompat(() => checkState(el))\n if (reason) continue\n\n if (!centerInViewport(el.getBoundingClientRect())) {\n el.scrollIntoView({ block: 'center', inline: 'center', behavior: 'instant' as ScrollBehavior })\n }\n const before = el.getBoundingClientRect()\n await nextFrame()\n if (!el.isConnected) continue\n const rect = el.getBoundingClientRect()\n if (!sameRect(before, rect)) {\n reason = agentText().reasonMoving\n continue\n }\n const points = visiblePoints(rect)\n if (!points.length) {\n reason = agentText().reasonOffscreen\n continue\n }\n if (options.hitTest === false) return points[0]\n // The center first, as a finger would; when something covers it (a\n // popup over a backdrop, a badge over a button), any other exposed spot\n // of the element will do.\n const point = points.find(p => hitsTarget(el, elementFromPoint(p.x, p.y)))\n if (!point) {\n const hit = elementFromPoint(points[0].x, points[0].y)\n reason = agentText().reasonObscured(tagOf(hit), refFor(hit))\n continue\n }\n return point\n }\n throw rwdError('not_interactable', agentText().notActionable(tagOf(el), reason))\n}\n\n/**\n * The element a real tap at `p` would be dispatched to: the deepest element\n * under the point (through open shadow roots), as long as it is part of\n * `el`. A ref often names a wrapper whose child holds the listener; events\n * bubble up, never down, so they must start at the hit element.\n */\nexport function targetAt(el: Element, p: Point): Element {\n let hit: Element | null = elementFromPoint(p.x, p.y)\n while (hit && hit.shadowRoot) {\n const inner = hit.shadowRoot.elementFromPoint(p.x, p.y)\n if (!inner || inner === hit) break\n hit = inner\n }\n return hit && hitsTarget(el, hit) ? hit : el\n}\n\nfunction checkState(el: Element): string {\n if (!computeBox(el).visible) return agentText().reasonHidden\n beginAriaCaches()\n try {\n if (getAriaDisabled(el)) return agentText().reasonDisabled\n } finally {\n endAriaCaches()\n }\n return ''\n}\n\nfunction centerInViewport(r: DOMRect) {\n const x = r.left + r.width / 2\n const y = r.top + r.height / 2\n return x >= 0 && y >= 0 && x < window.innerWidth && y < window.innerHeight\n}\n\nfunction sameRect(a: DOMRect, b: DOMRect) {\n return (\n Math.abs(a.left - b.left) < 1 &&\n Math.abs(a.top - b.top) < 1 &&\n Math.abs(a.width - b.width) < 1 &&\n Math.abs(a.height - b.height) < 1\n )\n}\n\nconst SPOTS = [0.5, 0.15, 0.85]\n\n/** The visible center of a box, then other spots on a 3x3 grid inside it. */\nfunction visiblePoints(r: DOMRect): Point[] {\n const left = Math.max(r.left, 0)\n const right = Math.min(r.right, window.innerWidth)\n const top = Math.max(r.top, 0)\n const bottom = Math.min(r.bottom, window.innerHeight)\n if (right <= left || bottom <= top) return []\n const points: Point[] = []\n for (const fy of SPOTS) {\n for (const fx of SPOTS) {\n points.push({ x: left + (right - left) * fx, y: top + (bottom - top) * fy })\n }\n }\n return points\n}\n\nfunction hitsTarget(el: Element, hit: Element) {\n if (containsComposed(el, hit)) return true\n // A styled checkbox: the input sits under its label's custom box.\n const label = closestComposed(hit, 'label') as HTMLLabelElement | null\n if (label && label.control === el) return true\n if (el instanceof HTMLLabelElement && el.control && containsComposed(el.control, hit)) {\n return true\n }\n return false\n}\n\n/* ------------------------------- synthesis -------------------------------- */\n\nexport const hasTouch =\n navigator.maxTouchPoints > 0 || 'ontouchstart' in window\n\nconst BUTTONS: { [name: string]: number } = { left: 0, middle: 1, right: 2 }\nconst BUTTON_MASKS = [1, 4, 2]\n\nlet hovered: Element | null = null\n\nfunction mouseInit(x: number, y: number, init: MouseEventInit = {}): MouseEventInit {\n return {\n bubbles: true,\n cancelable: true,\n composed: true,\n view: window,\n clientX: x,\n clientY: y,\n screenX: x,\n screenY: y,\n ...init,\n }\n}\n\nfunction firePointer(type: string, el: Element, x: number, y: number, init: PointerEventInit = {}) {\n if (typeof PointerEvent === 'undefined') return true\n const enterLeave = type === 'pointerenter' || type === 'pointerleave'\n return el.dispatchEvent(\n new PointerEvent(type, {\n ...mouseInit(x, y, init),\n bubbles: !enterLeave,\n cancelable: !enterLeave,\n pointerId: hasTouch ? 2 : 1,\n pointerType: hasTouch ? 'touch' : 'mouse',\n isPrimary: true,\n width: 1,\n height: 1,\n pressure: init.buttons ? 0.5 : 0,\n })\n )\n}\n\nfunction fireMouse(type: string, el: Element, x: number, y: number, init: MouseEventInit = {}) {\n const enterLeave = type === 'mouseenter' || type === 'mouseleave'\n return el.dispatchEvent(\n new MouseEvent(type, {\n ...mouseInit(x, y, init),\n bubbles: !enterLeave,\n cancelable: !enterLeave,\n })\n )\n}\n\nlet touchId = 1\n\nfunction fireTouch(type: string, el: Element, x: number, y: number) {\n try {\n const touch = new Touch({\n identifier: touchId,\n target: el,\n clientX: x,\n clientY: y,\n pageX: x + window.scrollX,\n pageY: y + window.scrollY,\n screenX: x,\n screenY: y,\n radiusX: 1,\n radiusY: 1,\n rotationAngle: 0,\n force: 1,\n })\n const active = type === 'touchend' || type === 'touchcancel' ? [] : [touch]\n return el.dispatchEvent(\n new TouchEvent(type, {\n bubbles: true,\n cancelable: true,\n composed: true,\n view: window,\n touches: active,\n targetTouches: active,\n changedTouches: [touch],\n })\n )\n } catch (e) {\n // No Touch constructor (desktop Safari): pointer and mouse events only.\n return true\n }\n}\n\n/** Move the (virtual) pointer onto el: over/enter on change, then move. */\nexport function moveTo(el: Element, p: Point) {\n if (hovered !== el) {\n const prev = hovered\n if (prev && prev.isConnected) {\n firePointer('pointerout', prev, p.x, p.y, { relatedTarget: el })\n firePointer('pointerleave', prev, p.x, p.y, { relatedTarget: el })\n fireMouse('mouseout', prev, p.x, p.y, { relatedTarget: el })\n fireMouse('mouseleave', prev, p.x, p.y, { relatedTarget: el })\n }\n firePointer('pointerover', el, p.x, p.y, { relatedTarget: prev })\n firePointer('pointerenter', el, p.x, p.y, { relatedTarget: prev })\n fireMouse('mouseover', el, p.x, p.y, { relatedTarget: prev })\n fireMouse('mouseenter', el, p.x, p.y, { relatedTarget: prev })\n hovered = el\n }\n firePointer('pointermove', el, p.x, p.y)\n fireMouse('mousemove', el, p.x, p.y)\n}\n\nconst FOCUSABLE =\n 'a[href], area[href], button, input, select, textarea, iframe, summary, [tabindex], [contenteditable]:not([contenteditable=false])'\n\n/** What a real mousedown does to focus: focus the target or blur. */\nexport function focusFor(el: Element) {\n const target = closestComposed(el, FOCUSABLE) as HTMLElement | null\n const active = deepActiveElement() as HTMLElement | null\n if (target) {\n if (active !== target) target.focus({ preventScroll: true })\n } else if (active && active !== document.body && typeof active.blur === 'function') {\n active.blur()\n }\n}\n\nexport function click(\n el: Element,\n p: Point,\n { button = 'left', clickCount = 1 }: { button?: string; clickCount?: number } = {}\n) {\n const b = BUTTONS[button] === undefined ? 0 : BUTTONS[button]\n const down = { button: b, buttons: BUTTON_MASKS[b] }\n const up = { button: b, buttons: 0 }\n const count = Math.max(1, Math.min(3, clickCount | 0 || 1))\n\n if (hasTouch && b === 0) {\n for (let i = 1; i <= count; i++) {\n touchId++\n firePointer('pointerover', el, p.x, p.y)\n firePointer('pointerenter', el, p.x, p.y)\n firePointer('pointerdown', el, p.x, p.y, down)\n const started = fireTouch('touchstart', el, p.x, p.y)\n firePointer('pointerup', el, p.x, p.y, up)\n const ended = fireTouch('touchend', el, p.x, p.y)\n firePointer('pointerout', el, p.x, p.y)\n firePointer('pointerleave', el, p.x, p.y)\n // A cancelled touch suppresses the compatibility mouse events and the\n // click, as on a real device (FastClick-style libraries click themselves).\n if (!started || !ended) continue\n if (hovered !== el) {\n fireMouse('mouseover', el, p.x, p.y)\n hovered = el\n }\n fireMouse('mousemove', el, p.x, p.y)\n if (fireMouse('mousedown', el, p.x, p.y, { ...down, detail: i })) focusFor(el)\n fireMouse('mouseup', el, p.x, p.y, { ...up, detail: i })\n fireMouse('click', el, p.x, p.y, { ...up, detail: i })\n }\n } else {\n moveTo(el, p)\n for (let i = 1; i <= count; i++) {\n const pointerDown = firePointer('pointerdown', el, p.x, p.y, down)\n // A cancelled pointerdown suppresses mousedown/mouseup, not the click.\n if (pointerDown && fireMouse('mousedown', el, p.x, p.y, { ...down, detail: i })) {\n focusFor(el)\n }\n firePointer('pointerup', el, p.x, p.y, up)\n if (pointerDown) fireMouse('mouseup', el, p.x, p.y, { ...up, detail: i })\n if (b === 0) fireMouse('click', el, p.x, p.y, { ...up, detail: i })\n else if (b === 1) fireMouse('auxclick', el, p.x, p.y, { ...up, detail: i })\n }\n if (b === 2) fireMouse('contextmenu', el, p.x, p.y, { button: 2, buttons: 0 })\n }\n if (count === 2 && b === 0) fireMouse('dblclick', el, p.x, p.y, { detail: 2 })\n}\n\nexport function hover(el: Element, p: Point) {\n moveTo(el, p)\n}\n\nexport function wheel(el: Element, p: Point, dx: number, dy: number) {\n try {\n el.dispatchEvent(\n new WheelEvent('wheel', { ...mouseInit(p.x, p.y), deltaX: dx, deltaY: dy, deltaMode: 0 })\n )\n } catch (e) {\n // Old webview without the WheelEvent constructor.\n }\n}\n\nexport async function drag(from: Element, p1: Point, to: Element, p2: Point) {\n const down = { button: 0, buttons: 1 }\n const up = { button: 0, buttons: 0 }\n touchId++\n moveTo(from, p1)\n firePointer('pointerdown', from, p1.x, p1.y, down)\n fireMouse('mousedown', from, p1.x, p1.y, down)\n if (hasTouch) fireTouch('touchstart', from, p1.x, p1.y)\n\n const draggable = closestComposed(from, '[draggable=true], a[href], img')\n let dataTransfer: DataTransfer | null = null\n if (draggable && draggable.getAttribute('draggable') !== 'false') {\n try {\n dataTransfer = new DataTransfer()\n } catch (e) {\n dataTransfer = null\n }\n }\n if (dataTransfer && !fireDrag('dragstart', draggable!, p1, dataTransfer)) {\n dataTransfer = null\n }\n\n const steps = 5\n let over: Element = from\n for (let i = 1; i <= steps; i++) {\n const p = { x: p1.x + ((p2.x - p1.x) * i) / steps, y: p1.y + ((p2.y - p1.y) * i) / steps }\n const under = i === steps ? to : elementFromPoint(p.x, p.y)\n if (dataTransfer) {\n fireDrag('drag', draggable!, p, dataTransfer)\n if (under !== over) fireDrag('dragenter', under, p, dataTransfer)\n fireDrag('dragover', under, p, dataTransfer)\n } else {\n moveTo(under, p)\n firePointer('pointermove', under, p.x, p.y, down)\n fireMouse('mousemove', under, p.x, p.y, down)\n // Touches stay targeted at the element they started on.\n if (hasTouch) fireTouch('touchmove', from, p.x, p.y)\n }\n over = under\n await nextFrame()\n }\n\n if (dataTransfer) {\n // drop only fires where dragover was cancelled, i.e. on a drop target.\n if (!fireDrag('dragover', to, p2, dataTransfer)) fireDrag('drop', to, p2, dataTransfer)\n fireDrag('dragend', draggable!, p2, dataTransfer)\n } else {\n firePointer('pointerup', to, p2.x, p2.y, up)\n fireMouse('mouseup', to, p2.x, p2.y, up)\n if (hasTouch) fireTouch('touchend', from, p2.x, p2.y)\n }\n}\n\nfunction fireDrag(type: string, el: Element, p: Point, dataTransfer: DataTransfer) {\n try {\n return el.dispatchEvent(\n new DragEvent(type, { ...mouseInit(p.x, p.y), dataTransfer })\n )\n } catch (e) {\n return true\n }\n}\n","import { captureScreenshot } from '../screenshot'\nimport { querySnapshot, resolveRef, takeSnapshot } from './snapshot'\nimport { readStorage } from './storage'\nimport { clickConfirmation, enterConfirmation } from './policy'\nimport { press, typeText } from './keyboard'\nimport { click, drag, hover, targetAt, waitForActionable, wheel, type Point } from './pointer'\nimport { deepActiveElement, tagOf, sleep } from './dom'\nimport { queryConsole, queryNetwork, networkDetail, networkHidden } from './observe'\nimport { listSessions, overview, queryLog, recordDetail } from './coldlog'\nimport { rwdError } from './errors'\nimport { agentText } from './i18n'\n\n// The rwd.* RPC methods (docs/protocol.md §5). Each acts on this page.\n\nexport interface ActionHooks {\n /** Briefly show the user which element the agent acts on. */\n highlight?(el: Element): void\n /**\n * Ask the user before a sensitive action (docs/protocol.md §8), e.g.\n * \"click \\\"Place order\\\"\". Resolves when allowed; rejects (forbidden) otherwise.\n */\n confirm?(action: string): Promise<void>\n /**\n * Show the user where the agent is about to act (the on-page agent cursor).\n * Awaited before the input is dispatched, so the cursor gets there first.\n */\n pointer?(p: Point, kind: PointerKind, el: Element): Promise<void> | void\n}\n\nexport type PointerKind = 'click' | 'hover' | 'focus' | 'select' | 'scroll' | 'drag' | 'drop'\n\ntype Method = (params: any, hooks: ActionHooks) => any\n\n/** Methods that operate the page (the gateway switches to `agent` first). */\nexport const INTERACTIVE_METHODS = [\n 'rwd.click',\n 'rwd.fill',\n 'rwd.type',\n 'rwd.press',\n 'rwd.select',\n 'rwd.hover',\n 'rwd.scroll',\n 'rwd.drag',\n 'rwd.navigate',\n 'rwd.back',\n 'rwd.reload',\n]\n\nfunction show(hooks: ActionHooks, el: Element) {\n try {\n if (hooks.highlight) hooks.highlight(el)\n } catch (e) {\n // Cosmetic only.\n }\n}\n\n/**\n * Scroll by (dx, dy) with an ease-out over ~260 ms, so the user can follow\n * it; resolves when done. Each frame jumps instantly, so a page-wide\n * `scroll-behavior: smooth` does not fight the animation.\n */\nfunction glide(scroller: Element | null, dx: number, dy: number): Promise<void> {\n const target = scroller || document.scrollingElement || document.documentElement\n const x0 = target.scrollLeft\n const y0 = target.scrollTop\n const set = (x: number, y: number) => {\n if (scroller) scroller.scrollTo({ left: x, top: y, behavior: 'instant' as ScrollBehavior })\n else window.scrollTo({ left: x, top: y, behavior: 'instant' as ScrollBehavior })\n }\n const ms = Math.min(360, Math.max(160, Math.sqrt(dx * dx + dy * dy) * 0.4))\n const start = Date.now()\n return new Promise(resolve => {\n const step = () => {\n const t = Math.min(1, (Date.now() - start) / ms)\n const k = 1 - Math.pow(1 - t, 3)\n set(x0 + dx * k, y0 + dy * k)\n if (t < 1) setTimeout(step, 16)\n else resolve()\n }\n step()\n })\n}\n\nasync function aim(hooks: ActionHooks, p: Point, kind: PointerKind, el: Element) {\n if (!hooks.pointer) return\n try {\n await hooks.pointer(p, kind, el)\n } catch (e) {\n // Cosmetic only.\n }\n}\n\nasync function confirm(hooks: ActionHooks, action: string | null) {\n if (!action || !hooks.confirm) return\n // Tapping the dialog moves focus; Enter must still go to the same field.\n const focused = deepActiveElement()\n await hooks.confirm(action)\n if (focused instanceof HTMLElement && focused.isConnected && deepActiveElement() !== focused) {\n focused.focus({ preventScroll: true })\n }\n}\n\nfunction str(value: unknown, name: string): string {\n if (typeof value !== 'string') throw rwdError('bad_request', agentText().notString(name))\n return value\n}\n\ntype TextField = HTMLInputElement | HTMLTextAreaElement\n\nconst NON_TEXT_INPUTS = /^(checkbox|radio|file|button|submit|reset|image|hidden|range|color)$/\n\nfunction setNativeValue(el: TextField, value: string) {\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype\n const desc = Object.getOwnPropertyDescriptor(proto, 'value')\n if (desc && desc.set) desc.set.call(el, value)\n else el.value = value\n}\n\n/** Labels point at their control, like Playwright's retargeting. */\nfunction retarget(el: Element): Element {\n if (el instanceof HTMLLabelElement && el.control) return el.control\n return el\n}\n\nfunction editable(el: Element): TextField | HTMLElement {\n el = retarget(el)\n if (el instanceof HTMLInputElement && !NON_TEXT_INPUTS.test(el.type)) {\n if (el.readOnly) throw rwdError('not_interactable', agentText().readOnly(tagOf(el)))\n return el\n }\n if (el instanceof HTMLTextAreaElement) {\n if (el.readOnly) throw rwdError('not_interactable', agentText().readOnly(tagOf(el)))\n return el\n }\n if (el instanceof HTMLElement && el.isContentEditable) return el\n if (el instanceof HTMLSelectElement) {\n throw rwdError('bad_request', agentText().isSelect(tagOf(el)))\n }\n throw rwdError('not_interactable', agentText().notFillable(tagOf(el)))\n}\n\nfunction caretToEnd(el: Element) {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n try {\n const len = el.value.length\n el.setSelectionRange(len, len)\n } catch (e) {\n // Input types without selection (email, number).\n }\n }\n}\n\nfunction scrollableAncestor(el: Element | null): Element | null {\n for (; el && el !== document.body && el !== document.documentElement; el = el.parentElement) {\n const style = getComputedStyle(el)\n const scrollY = /(auto|scroll|overlay)/.test(style.overflowY) && el.scrollHeight > el.clientHeight\n const scrollX = /(auto|scroll|overlay)/.test(style.overflowX) && el.scrollWidth > el.clientWidth\n if (scrollY || scrollX) return el\n }\n return null\n}\n\nfunction visibleText() {\n return (document.body && document.body.innerText) || ''\n}\n\nfunction later(fn: () => void) {\n // Let the RPC reply leave before the page unloads.\n setTimeout(fn, 50)\n}\n\n/** JSON-safe copy of an evaluate result. */\nfunction toJson(value: any): any {\n const seen: any[] = []\n const walk = (v: any, depth: number): any => {\n if (v === undefined || typeof v === 'function' || typeof v === 'symbol') return null\n if (typeof v === 'bigint') return String(v)\n if (typeof v === 'number') return isFinite(v) ? v : String(v)\n if (v === null || typeof v !== 'object') return v\n if (typeof Element !== 'undefined' && v instanceof Element) return tagOf(v)\n if (v instanceof Date) return v.toISOString()\n if (v instanceof Error) return `${v.name}: ${v.message}`\n if (seen.indexOf(v) >= 0 || depth > 20) return '[Circular]'\n seen.push(v)\n let out: any\n if (Array.isArray(v) || (typeof NodeList !== 'undefined' && v instanceof NodeList)) {\n out = Array.prototype.map.call(v, (it: any) => walk(it, depth + 1))\n } else if (typeof v.toJSON === 'function') {\n out = walk(v.toJSON(), depth + 1)\n } else {\n out = {}\n for (const key of Object.keys(v)) {\n const item = v[key]\n if (item !== undefined && typeof item !== 'function' && typeof item !== 'symbol') {\n out[key] = walk(item, depth + 1)\n }\n }\n }\n seen.pop()\n return out\n }\n return walk(value, 0)\n}\n\nconst methods: { [name: string]: Method } = {\n 'rwd.ping': () => ({ at: Date.now() }),\n\n 'rwd.snapshot': () => {\n const snapshot = takeSnapshot()\n return { url: location.href, title: document.title, snapshot }\n },\n\n 'rwd.query': params => querySnapshot(params),\n\n 'rwd.click': async (params, hooks) => {\n const el = resolveRef(params.ref)\n await confirm(hooks, clickConfirmation(el))\n const point = await waitForActionable(el, { hitTest: true })\n await aim(hooks, point, 'click', el)\n show(hooks, el)\n click(targetAt(el, point), point, { button: params.button || 'left', clickCount: params.clickCount || 1 })\n return {}\n },\n\n 'rwd.hover': async (params, hooks) => {\n const el = resolveRef(params.ref)\n const point = await waitForActionable(el, { hitTest: true })\n await aim(hooks, point, 'hover', el)\n show(hooks, el)\n hover(targetAt(el, point), point)\n return {}\n },\n\n 'rwd.fill': async (params, hooks) => {\n const el = editable(resolveRef(params.ref))\n const value = params.value === undefined || params.value === null ? '' : String(params.value)\n await aim(hooks, await waitForActionable(el, { hitTest: false }), 'focus', el)\n show(hooks, el)\n el.focus({ preventScroll: true })\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n try {\n el.select()\n } catch (e) {\n // Not selectable.\n }\n const proceed = el.dispatchEvent(\n new InputEvent('beforeinput', { bubbles: true, cancelable: true, inputType: 'insertText', data: value })\n )\n if (proceed) {\n // The native setter bypasses React's value tracker, so React (and Vue's\n // v-model) see the input event as a real change.\n setNativeValue(el, value)\n el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: value }))\n el.dispatchEvent(new Event('change', { bubbles: true }))\n }\n } else {\n const selection = window.getSelection()\n if (selection) {\n const range = document.createRange()\n range.selectNodeContents(el)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n let inserted = false\n try {\n inserted = document.execCommand('insertText', false, value)\n } catch (e) {\n inserted = false\n }\n if (!inserted) {\n el.textContent = value\n el.dispatchEvent(new InputEvent('input', { bubbles: true, inputType: 'insertText', data: value }))\n }\n }\n return {}\n },\n\n 'rwd.type': async (params, hooks) => {\n const text = str(params.text, 'text')\n if (params.ref !== undefined && params.ref !== null) {\n const el = editable(resolveRef(params.ref))\n await aim(hooks, await waitForActionable(el, { hitTest: false }), 'focus', el)\n show(hooks, el)\n if (document.activeElement !== el) el.focus({ preventScroll: true })\n caretToEnd(el)\n }\n if (params.submit) await confirm(hooks, enterConfirmation())\n typeText(text)\n if (params.submit) press('Enter')\n return {}\n },\n\n 'rwd.press': async (params, hooks) => {\n const key = str(params.key, 'key')\n if (/(^|\\+)Enter$/.test(key)) await confirm(hooks, enterConfirmation())\n press(key)\n return {}\n },\n\n 'rwd.select': async (params, hooks) => {\n const el = retarget(resolveRef(params.ref))\n if (!(el instanceof HTMLSelectElement)) {\n throw rwdError('bad_request', agentText().notSelect(tagOf(el)))\n }\n const values: string[] = (Array.isArray(params.values) ? params.values : [params.values])\n .filter((v: any) => v !== undefined && v !== null)\n .map(String)\n if (!values.length) throw rwdError('bad_request', agentText().missingParam('values'))\n if (values.length > 1 && !el.multiple) throw rwdError('bad_request', agentText().singleSelect)\n await aim(hooks, await waitForActionable(el, { hitTest: false }), 'select', el)\n show(hooks, el)\n\n const options = Array.prototype.slice.call(el.options) as HTMLOptionElement[]\n const picked: HTMLOptionElement[] = []\n for (const value of values) {\n let option: HTMLOptionElement | undefined\n for (const o of options) {\n if (!option && (o.value === value || o.label === value || (o.textContent || '').trim() === value)) option = o\n }\n if (!option) {\n const choices = options.map(o => (o.textContent || o.value).trim())\n throw rwdError('not_found', agentText().noSuchOption(value, choices))\n }\n if (option.disabled) throw rwdError('not_interactable', agentText().optionDisabled(value))\n picked.push(option)\n }\n el.focus({ preventScroll: true })\n for (const o of options) o.selected = picked.indexOf(o) >= 0\n el.dispatchEvent(new Event('input', { bubbles: true }))\n el.dispatchEvent(new Event('change', { bubbles: true }))\n return {\n selected: options.filter(o => o.selected).map(o => o.value),\n }\n },\n\n 'rwd.scroll': async (params, hooks) => {\n const dx = Number(params.dx) || 0\n const dy = Number(params.dy) || 0\n if (params.ref === undefined || params.ref === null) {\n await glide(null, dx, dy)\n return {}\n }\n const el = resolveRef(params.ref)\n const point = await waitForActionable(el, { hitTest: false })\n await aim(hooks, point, 'scroll', el)\n show(hooks, el)\n wheel(el, point, dx, dy)\n await glide(scrollableAncestor(el), dx, dy)\n return {}\n },\n\n 'rwd.drag': async (params, hooks) => {\n const from = resolveRef(params.fromRef)\n const to = resolveRef(params.toRef)\n const p1 = await waitForActionable(from, { hitTest: true })\n await aim(hooks, p1, 'drag', from)\n show(hooks, from)\n const p2 = await waitForActionable(to, { hitTest: false })\n await Promise.all([drag(targetAt(from, p1), p1, to, p2), aim(hooks, p2, 'drop', to)])\n show(hooks, to)\n return {}\n },\n\n 'rwd.navigate': params => {\n const raw = str(params.url, 'url')\n let url: URL\n try {\n url = new URL(raw, location.href)\n } catch (e) {\n throw rwdError('bad_request', agentText().badUrl(raw))\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw rwdError('bad_request', agentText().httpOnly)\n }\n later(() => location.assign(url.href))\n return {}\n },\n\n 'rwd.back': () => {\n later(() => history.back())\n return {}\n },\n\n 'rwd.reload': () => {\n later(() => location.reload())\n return {}\n },\n\n 'rwd.waitFor': async params => {\n if (typeof params.timeMs === 'number' && params.timeMs > 0) {\n await sleep(Math.min(params.timeMs, 60000))\n }\n const text = typeof params.text === 'string' && params.text ? params.text : ''\n const gone = typeof params.textGone === 'string' && params.textGone ? params.textGone : ''\n if (!text && !gone) return {}\n const timeout = typeof params.timeoutMs === 'number' && params.timeoutMs > 0 ? params.timeoutMs : 10000\n const deadline = Date.now() + timeout\n for (;;) {\n const content = visibleText()\n if ((!text || content.indexOf(text) >= 0) && (!gone || content.indexOf(gone) < 0)) return {}\n if (Date.now() >= deadline) {\n throw rwdError('timeout', text ? agentText().textAppearTimeout(text) : agentText().textGoneTimeout(gone))\n }\n await sleep(100)\n }\n },\n\n 'rwd.screenshot': async params => {\n const format = params.format === 'png' || params.format === 'webp' ? params.format : 'jpeg'\n const quality = typeof params.quality === 'number' ? Math.max(1, Math.min(100, params.quality)) : 80\n let clip\n if (params.ref !== undefined && params.ref !== null) {\n const el = resolveRef(params.ref)\n el.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'instant' as ScrollBehavior })\n const r = el.getBoundingClientRect()\n if (!r.width || !r.height) throw rwdError('not_interactable', agentText().notVisible(tagOf(el)))\n clip = { x: r.left + window.scrollX, y: r.top + window.scrollY, width: r.width, height: r.height, scale: 1 }\n }\n const shot = await captureScreenshot({\n format,\n quality: format === 'png' ? undefined : quality,\n clip,\n captureBeyondViewport: !clip && !!params.fullPage,\n })\n return {\n data: shot.data,\n mimeType: 'image/' + format,\n source: shot.source,\n width: shot.width,\n height: shot.height,\n }\n },\n\n 'rwd.console': params => queryConsole(params),\n 'rwd.network': params => queryNetwork(params),\n 'rwd.networkDetail': params => networkDetail(params),\n 'rwd.storage': params => readStorage(params),\n\n // The session log (coldlog.ts). op: 'sessions' | 'overview' | 'records'.\n 'rwd.log': async params => {\n const session = typeof params.session === 'string' ? params.session : undefined\n if (params.op === 'sessions') return { sessions: await listSessions() }\n if (params.op === 'overview') return await overview(session)\n const all = !!params.includeExcluded\n return await queryLog({\n session,\n kinds: Array.isArray(params.kinds) ? params.kinds.filter((k: unknown) => typeof k === 'string') : undefined,\n problems: !!params.problems,\n page: typeof params.page === 'string' ? params.page : undefined,\n text: typeof params.text === 'string' ? params.text : undefined,\n after: Number(params.after) || 0,\n from: Number(params.from) || 0,\n to: Number(params.to) || 0,\n limit: Number(params.limit) || 100,\n hide: all ? undefined : r => r.kind === 'net' && networkHidden(r.data.url, params.exclude),\n })\n },\n 'rwd.logDetail': params => recordDetail(params.seq),\n\n 'rwd.evaluate': async params => {\n const source = str(params.function, 'function')\n let fn: any\n try {\n // Indirect eval: the function runs in global scope, not ours.\n fn = (0, eval)(`(${source}\\n)`)\n } catch (e: any) {\n throw rwdError('bad_request', agentText().badFunction(String(e && e.message)))\n }\n if (typeof fn !== 'function') throw rwdError('bad_request', agentText().notAFunction)\n const args = Array.isArray(params.args) ? params.args : []\n const value = await fn.apply(window, args)\n return { value: toJson(value) }\n },\n}\n\nexport function hasMethod(method: string) {\n return Object.prototype.hasOwnProperty.call(methods, method)\n}\n\nexport async function callMethod(method: string, params: any, hooks: ActionHooks = {}) {\n if (!hasMethod(method)) throw rwdError('bad_request', agentText().unknownMethod(method))\n return await methods[method](params && typeof params === 'object' ? params : {}, hooks)\n}\n","// Device and page identity (docs/protocol.md §2).\n//\n// deviceId UUID v4, localStorage `rwd:device` (opts.deviceId wins)\n// pageId 12 base62, sessionStorage `rwd:page`: kept across reloads and\n// navigations in the same tab, new for every new tab\n// openerId pageId of the tab that opened this one, best effort\n//\n// Device token (§3.5): deviceToken (localStorage `rwd:dtoken`, issued by the\n// gateway for this deviceId), resume (sessionStorage `rwd:resume`, rotated by\n// every welcome, bound to the pageId) and the one-time invite from the URL.\n\nconst DEVICE_KEY = 'rwd:device'\nconst PAGE_KEY = 'rwd:page'\nconst OPENER_KEY = 'rwd:opener'\nconst TAP_KEY = 'rwd:lastTap'\nexport const TOKEN_KEY = 'rwd:dtoken'\nconst RESUME_KEY = 'rwd:resume'\nconst INVITE_KEY = 'rwd:invite'\nconst INVITE_PARAM = 'rwd_invite'\n\nconst BASE62 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'\n\nfunction randomBytes(n: number): number[] {\n const out: number[] = []\n const c = (window as any).crypto\n if (c && typeof c.getRandomValues === 'function') {\n const buf = new Uint8Array(n)\n c.getRandomValues(buf)\n for (let i = 0; i < n; i++) out.push(buf[i])\n } else {\n for (let i = 0; i < n; i++) out.push(Math.floor(Math.random() * 256))\n }\n return out\n}\n\nexport function base62(length: number) {\n let s = ''\n while (s.length < length) {\n for (const b of randomBytes(length)) {\n // Rejection sampling keeps the distribution uniform.\n if (b < 248 && s.length < length) s += BASE62[b % 62]\n }\n }\n return s\n}\n\nexport function uuid(): string {\n const c = (window as any).crypto\n if (c && typeof c.randomUUID === 'function') return c.randomUUID()\n const b = randomBytes(16)\n b[6] = (b[6] & 0x0f) | 0x40\n b[8] = (b[8] & 0x3f) | 0x80\n const hex = b.map(x => (x + 0x100).toString(16).slice(1)).join('')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n}\n\ntype Kind = 'localStorage' | 'sessionStorage'\n\nexport function read(kind: Kind, key: string): string | null {\n try {\n return window[kind].getItem(key)\n } catch (e) {\n return null\n }\n}\n\nexport function write(kind: Kind, key: string, value: string | null) {\n try {\n if (value === null) window[kind].removeItem(key)\n else window[kind].setItem(key, value)\n } catch (e) {\n // Storage disabled (private mode, sandboxed webview): identity is per load.\n }\n}\n\nexport interface Identity {\n deviceId: string\n pageId: string\n openerId: string | null\n}\n\nexport function deviceIdFor(override?: string): string {\n if (override) {\n // The token belongs to the deviceId it was issued for.\n if (read('localStorage', DEVICE_KEY) !== override) write('localStorage', TOKEN_KEY, null)\n write('localStorage', DEVICE_KEY, override)\n return override\n }\n let id = read('localStorage', DEVICE_KEY)\n if (!id) {\n id = uuid()\n write('localStorage', DEVICE_KEY, id)\n }\n return id\n}\n\nfunction openerPageId(): string | null {\n try {\n const opener = window.opener\n // Cross-origin openers throw on access; that is fine.\n if (opener && opener !== window) return opener.sessionStorage.getItem(PAGE_KEY)\n } catch (e) {\n // Not same-origin.\n }\n return null\n}\n\nexport function resolveIdentity(deviceOverride?: string): Identity {\n const deviceId = deviceIdFor(deviceOverride)\n const fromOpener = openerPageId()\n let pageId = read('sessionStorage', PAGE_KEY)\n // A tab opened with window.open() starts with a copy of the opener's\n // sessionStorage, pageId included.\n if (pageId && fromOpener && pageId === fromOpener) pageId = null\n if (!pageId) {\n pageId = base62(12)\n let openerId = fromOpener\n if (!openerId) {\n // target=_blank links are noopener nowadays: fall back to \"a tab of this\n // site was tapped a moment ago\".\n try {\n const last = JSON.parse(read('localStorage', TAP_KEY) || 'null')\n if (last && typeof last.p === 'string' && Date.now() - last.t < 5000) openerId = last.p\n } catch (e) {\n // Ignore malformed data.\n }\n }\n write('sessionStorage', PAGE_KEY, pageId)\n write('sessionStorage', OPENER_KEY, openerId || '')\n }\n return { deviceId, pageId, openerId: read('sessionStorage', OPENER_KEY) || fromOpener || null }\n}\n\n/** Remember that this page was just tapped (for the opener heuristic). */\nexport function noteTap(pageId: string) {\n write('localStorage', TAP_KEY, JSON.stringify({ p: pageId, t: Date.now() }))\n}\n\n/**\n * A duplicated tab (browser \"Duplicate\", or a sessionStorage copy we could not\n * detect above) shares our pageId with a live tab. Ask the other tabs of this\n * origin; if one answers, take a new pageId and treat that tab as the opener.\n * The channel stays open to answer later tabs, except while the page sits in\n * the back/forward cache.\n */\nexport function ensureUniquePage(identity: Identity): Promise<void> {\n const BC = (window as any).BroadcastChannel\n if (typeof BC !== 'function') return Promise.resolve()\n const me = base62(8)\n let taken = false\n let channel: BroadcastChannel | null = null\n\n const open = () => {\n try {\n channel = new BC('rwd:pages') as BroadcastChannel\n } catch (e) {\n channel = null\n return\n }\n const ch = channel\n ch.onmessage = (e: MessageEvent) => {\n const m = e.data\n if (!m || typeof m !== 'object') return\n if (m.t === 'probe' && m.page === identity.pageId && m.from !== me) {\n ch.postMessage({ t: 'taken', page: m.page, to: m.from })\n } else if (m.t === 'taken' && m.to === me) {\n taken = true\n }\n }\n }\n open()\n if (!channel) return Promise.resolve()\n window.addEventListener('pagehide', () => {\n if (channel) channel.close()\n channel = null\n })\n window.addEventListener('pageshow', e => {\n if (e.persisted && !channel) open()\n })\n\n ;(channel as BroadcastChannel).postMessage({ t: 'probe', page: identity.pageId, from: me })\n return new Promise(resolve =>\n setTimeout(() => {\n if (taken) {\n identity.openerId = identity.pageId\n identity.pageId = base62(12)\n write('sessionStorage', PAGE_KEY, identity.pageId)\n write('sessionStorage', OPENER_KEY, identity.openerId)\n }\n resolve()\n }, 60)\n )\n}\n\n/** The resume value of the last welcome, if it was issued to this pageId. */\nexport function readResume(pageId: string): string | null {\n try {\n const saved = JSON.parse(read('sessionStorage', RESUME_KEY) || 'null')\n if (saved && saved.p === pageId && typeof saved.r === 'string') return saved.r\n } catch (e) {\n // Ignore malformed data.\n }\n return null\n}\n\nexport function writeResume(pageId: string, resume: string | null) {\n write('sessionStorage', RESUME_KEY, resume ? JSON.stringify({ p: pageId, r: resume }) : null)\n}\n\n/** The gateway refused our pageId + resume (close 4409): start over as a new page. */\nexport function renewPageId(identity: Identity) {\n identity.pageId = base62(12)\n write('sessionStorage', PAGE_KEY, identity.pageId)\n writeResume(identity.pageId, null)\n}\n\n/**\n * The invite token of `?rwd_invite=…`: taken out of the address bar right\n * away (history.replaceState, same document) and kept for this tab until a\n * welcome confirms the gateway got it.\n */\nexport function takeInvite(): string | null {\n try {\n const url = new URL(location.href)\n const token = url.searchParams.get(INVITE_PARAM)\n if (token !== null) {\n url.searchParams.delete(INVITE_PARAM)\n history.replaceState(history.state, '', url.href)\n if (token) write('sessionStorage', INVITE_KEY, token)\n }\n } catch (e) {\n // No URL / history support: no invite.\n }\n return read('sessionStorage', INVITE_KEY)\n}\n\nexport function clearInvite() {\n write('sessionStorage', INVITE_KEY, null)\n}\n","import { agentText, RwdError, toLevel, type Level } from '@chobitsu/engine/rwd'\nimport { base62 } from './ids'\nimport type { DialogHandle, Ui } from './ui'\n\n// The user's consent on this device (docs/protocol.md §7, §8):\n//\n// attach an agent asks to join (`attach_request`); the user picks a level\n// or refuses → `attach_decision`\n// confirm the agent is about to click a sensitive element; the RPC waits\n//\n// Either our dialog asks (trusted taps only), or, with run({nativeApproval}),\n// the native host does: it reads status().pending and answers through\n// nativeDecide(nativeKey, …). A decision on one tab of this origin dismisses\n// the same request on the others (BroadcastChannel).\n\nconst CONFIRM_MS = 30_000\n\nexport interface AttachPending {\n kind: 'attach'\n requestId: string\n agent: { name: string; keyHint: string | null }\n levels: Level[]\n expiresAt: number\n}\n\nexport interface ConfirmPending {\n kind: 'confirm'\n requestId: string\n action: string\n expiresAt: number\n}\n\ninterface Open<P> {\n info: P\n dialog: DialogHandle | null\n timer: ReturnType<typeof setTimeout>\n finish(value: string | null): void\n}\n\nexport interface ApprovalOptions {\n ui: Ui\n native: boolean\n send(msg: object): void\n}\n\nexport class Approvals {\n private attach: Open<AttachPending> | null = null\n private confirmation: Open<ConfirmPending> | null = null\n private channel: BroadcastChannel | null = null\n\n constructor(private opts: ApprovalOptions) {\n const BC = (window as any).BroadcastChannel\n if (typeof BC !== 'function') return\n try {\n this.channel = new BC('rwd:approval') as BroadcastChannel\n this.channel.onmessage = (e: MessageEvent) => {\n const m = e.data\n if (m && m.t === 'decided' && this.attach && this.attach.info.requestId === m.requestId) this.dropAttach()\n }\n } catch (e) {\n this.channel = null\n }\n }\n\n /** What the native host should ask about, if anything (a confirmation first). */\n pending(): AttachPending | ConfirmPending | null {\n const open = this.confirmation || this.attach\n return open ? { ...open.info } : null\n }\n\n onAttachRequest(msg: any) {\n const requestId = typeof msg.requestId === 'string' ? msg.requestId : ''\n if (!requestId) return\n this.dropAttach()\n const levels: Level[] = []\n for (const l of Array.isArray(msg.levels) ? msg.levels : []) {\n const level = toLevel(l)\n if (levels.indexOf(level) < 0) levels.push(level)\n }\n if (!levels.length) levels.push('observe')\n const agent = msg.agent && typeof msg.agent === 'object' ? msg.agent : {}\n const t = this.opts.ui.t\n const info: AttachPending = {\n kind: 'attach',\n requestId,\n agent: {\n name: String(agent.name || t.agentName),\n keyHint: agent.keyHint ? String(agent.keyHint) : null,\n },\n levels,\n expiresAt: Date.now() + (Number(msg.expiresInSec) > 0 ? Number(msg.expiresInSec) : 30) * 1000,\n }\n const open: Open<AttachPending> = {\n info,\n dialog: null,\n // No answer in time: the gateway treats it as refused and cancels.\n timer: setTimeout(() => this.dropAttach(), info.expiresAt - Date.now()),\n finish: value => {\n if (this.attach !== open) return\n this.dropAttach()\n const level = value === null ? null : levels.indexOf(value as Level) >= 0 ? value : null\n this.opts.send({ t: 'attach_decision', requestId, level })\n if (this.channel) this.channel.postMessage({ t: 'decided', requestId })\n },\n }\n this.attach = open\n // The user turned on auto-approve in our window: answer at once, and say so.\n const auto = this.opts.ui.autoLevel()\n if (auto) {\n const rank = (l: Level) => ['observe', 'interact', 'advanced'].indexOf(l)\n const allowed = levels.filter(l => rank(l) <= rank(auto))\n const level = allowed.length ? allowed[allowed.length - 1] : levels[0]\n open.finish(level)\n this.opts.ui.toast(t.autoAllowedToast(info.agent.name, t.attachLevels[level]))\n return\n }\n if (!this.opts.native) {\n open.dialog = this.opts.ui.dialog({\n title: t.attachTitle,\n text: t.attachText(info.agent.name),\n hint: info.agent.keyHint ? `API Key ${info.agent.keyHint}` : undefined,\n choices: levels.map(value => ({ value, label: t.attachLevels[value] })),\n // The last one is what the agent asked for.\n choice: levels[levels.length - 1],\n okText: t.allow,\n cancelText: t.deny,\n expiresAt: info.expiresAt,\n onDecide: (ok, choice) => open.finish(ok ? choice || levels[levels.length - 1] : null),\n })\n }\n }\n\n onAttachCancel(requestId: string) {\n if (this.attach && this.attach.info.requestId === requestId) this.dropAttach()\n }\n\n /** Resolves when the user allows `action`; rejects with `forbidden` otherwise. */\n confirm(action: string): Promise<void> {\n if (this.confirmation) return Promise.reject(new RwdError('forbidden', agentText().confirmBusy))\n return new Promise<void>((resolve, reject) => {\n const info: ConfirmPending = { kind: 'confirm', requestId: base62(12), action, expiresAt: Date.now() + CONFIRM_MS }\n const open: Open<ConfirmPending> = {\n info,\n dialog: null,\n timer: setTimeout(() => open.finish(null), CONFIRM_MS),\n finish: value => {\n if (this.confirmation !== open) return\n clearTimeout(open.timer)\n if (open.dialog) open.dialog.close()\n this.confirmation = null\n if (value === 'allow') resolve()\n else reject(new RwdError('forbidden', agentText().userDenied))\n },\n }\n this.confirmation = open\n if (!this.opts.native) {\n const t = this.opts.ui.t\n open.dialog = this.opts.ui.dialog({\n title: t.confirmTitle,\n text: t.confirmText(action),\n okText: t.allow,\n cancelText: t.deny,\n expiresAt: info.expiresAt,\n onDecide: ok => open.finish(ok ? 'allow' : null),\n })\n }\n })\n }\n\n /** The user can no longer be asked on behalf of this agent (takeover, end, offline). */\n cancelConfirm() {\n if (this.confirmation) this.confirmation.finish(null)\n }\n\n /** Answer from the native host; false when there is no such request or the value is invalid. */\n decide(requestId: string, value: string | null): boolean {\n if (this.attach && this.attach.info.requestId === requestId) {\n if (value !== null && this.attach.info.levels.indexOf(value as Level) < 0) return false\n this.attach.finish(value)\n return true\n }\n if (this.confirmation && this.confirmation.info.requestId === requestId) {\n if (value !== null && value !== 'allow') return false\n this.confirmation.finish(value)\n return true\n }\n return false\n }\n\n destroy() {\n this.dropAttach()\n this.cancelConfirm()\n if (this.channel) this.channel.close()\n this.channel = null\n }\n\n private dropAttach() {\n const open = this.attach\n if (!open) return\n this.attach = null\n clearTimeout(open.timer)\n if (open.dialog) open.dialog.close()\n }\n}\n","import { nativeFetch, nativeWebSocket } from './native'\n\n// The page's link to the gateway (docs/protocol.md §3, §9).\n//\n// - WebSocket to /v1/page?key=…, `hello` right after open (the gateway closes\n// connections that stay silent for 5 s).\n// - No message for 60 s (the gateway sends `hb` every 25 s) → reconnect.\n// - Reconnect with exponential backoff 1 s → 30 s plus jitter.\n// - 3 failed attempts in a row (closed before `welcome`) → POST /v1/presence\n// every 60 s; back to the WebSocket when it answers `connect: true` (and, as\n// a safety net, every 5th poll).\n// - Close codes (§3.6): 4401 bad deviceToken → retry at once if the token\n// changed meanwhile (a sibling tab just got it), else `rejected` and retry\n// every ~10 min; 4409 resume mismatch → new pageId, reconnect; 4429 over\n// the online-device quota → `quota`, retry every ~5 min.\n\nexport type LinkState = 'connecting' | 'online' | 'polling' | 'stopped' | 'rejected' | 'quota'\n\nexport interface TransportOptions {\n wsUrl: string\n presenceUrl: string\n hello(): object\n presence(): object\n onMessage(msg: any): void\n onState(state: LinkState): void\n onPresence(res: { deviceCode?: string; connect?: boolean }): void\n /** Close 4401. True: the token changed since the hello, retry right away. */\n onRejected(): boolean\n /** Close 4409: take a new pageId before the next hello. */\n onConflict(): void\n}\n\nconst IDLE_MS = 60_000\nconst POLL_MS = 60_000\nconst MAX_FAILURES = 3\nconst QUEUE_LIMIT = 100\nconst REJECTED_RETRY_MS = 10 * 60_000\nconst QUOTA_RETRY_MS = 5 * 60_000\n\nexport class Transport {\n private ws: WebSocket | null = null\n private failures = 0\n private attempt = 0\n private timer: ReturnType<typeof setTimeout> | undefined\n private idleTimer: ReturnType<typeof setTimeout> | undefined\n private pollTimer: ReturnType<typeof setInterval> | undefined\n private polls = 0\n private online = false\n private stopped = true\n private queue: object[] = []\n state: LinkState = 'stopped'\n\n constructor(private opts: TransportOptions) {}\n\n start() {\n if (!this.stopped) return\n this.stopped = false\n this.connect()\n }\n\n stop() {\n this.stopped = true\n this.clearTimers()\n this.stopPolling()\n this.drop()\n this.queue = []\n this.setState('stopped')\n }\n\n /** Close now and reconnect right away (e.g. to send a fresh hello). */\n restart(delayMs = 0) {\n if (this.stopped) return\n this.clearTimers()\n this.stopPolling()\n this.drop()\n this.timer = setTimeout(() => this.connect(), delayMs)\n }\n\n /** Close for bfcache (pagehide); `resume()` reconnects. */\n suspend() {\n this.clearTimers()\n this.stopPolling()\n this.drop()\n }\n\n resume() {\n if (!this.stopped && !this.ws) this.connect()\n }\n\n isOnline() {\n return this.online\n }\n\n /**\n * Send now if online. Otherwise `queue: true` messages wait for the next\n * welcome (timeline events, control actions); the rest are dropped (an RPC\n * reply only makes sense on the connection that carried the request).\n */\n send(msg: object, queue = false): boolean {\n if (this.online && this.ws && this.ws.readyState === 1) {\n try {\n this.ws.send(JSON.stringify(msg))\n return true\n } catch (e) {\n // Fall through to queueing.\n }\n }\n if (queue) {\n this.queue.push(msg)\n if (this.queue.length > QUEUE_LIMIT) this.queue.shift()\n }\n return false\n }\n\n private setState(state: LinkState) {\n if (this.state === state) return\n this.state = state\n this.opts.onState(state)\n }\n\n private clearTimers() {\n clearTimeout(this.timer)\n clearTimeout(this.idleTimer)\n }\n\n private drop() {\n const ws = this.ws\n this.ws = null\n this.online = false\n if (ws) {\n ws.onopen = ws.onmessage = ws.onclose = ws.onerror = null\n try {\n ws.close(1000)\n } catch (e) {\n // Already closed.\n }\n }\n }\n\n private connect() {\n if (this.stopped) return\n this.clearTimers()\n this.drop()\n this.setState('connecting')\n\n let socket: WebSocket\n try {\n const WS = nativeWebSocket()\n socket = new WS(this.opts.wsUrl)\n } catch (e) {\n this.failed()\n return\n }\n this.ws = socket\n let welcomed = false\n\n const touch = () => {\n clearTimeout(this.idleTimer)\n this.idleTimer = setTimeout(() => {\n // A dead TCP connection may take minutes to report close.\n if (this.ws !== socket) return\n this.drop()\n this.scheduleReconnect()\n }, IDLE_MS)\n }\n\n socket.onopen = () => {\n touch()\n try {\n socket.send(JSON.stringify(this.opts.hello()))\n } catch (e) {\n // onclose follows.\n }\n }\n socket.onmessage = event => {\n touch()\n let msg: any\n try {\n msg = JSON.parse(String(event.data))\n } catch (e) {\n return\n }\n if (!msg || typeof msg !== 'object') return\n if (msg.t === 'welcome') {\n welcomed = true\n this.online = true\n this.failures = 0\n this.attempt = 0\n this.setState('online')\n this.opts.onMessage(msg)\n this.flush()\n return\n }\n if (msg.t === 'hb') return\n if (msg.t === 'reconnect') {\n this.restart(Math.max(0, Number(msg.afterMs) || 0))\n return\n }\n this.opts.onMessage(msg)\n }\n socket.onclose = event => {\n if (this.ws !== socket) return\n this.ws = null\n this.online = false\n clearTimeout(this.idleTimer)\n if (this.stopped) return\n const code = event && event.code\n if (code === 4401) {\n if (this.opts.onRejected()) this.timer = setTimeout(() => this.connect(), 0)\n else this.backOff('rejected', REJECTED_RETRY_MS)\n return\n }\n if (code === 4429) {\n this.backOff('quota', QUOTA_RETRY_MS)\n return\n }\n if (code === 4409) {\n this.opts.onConflict()\n } else if (!welcomed) {\n this.failures++\n }\n this.scheduleReconnect()\n }\n socket.onerror = () => {\n // onclose follows.\n }\n }\n\n private failed() {\n this.failures++\n this.scheduleReconnect()\n }\n\n private scheduleReconnect() {\n if (this.stopped) return\n if (this.failures >= MAX_FAILURES) {\n this.startPolling()\n return\n }\n this.setState('connecting')\n const base = Math.min(30_000, 1000 * Math.pow(2, this.attempt++))\n const delay = base / 2 + Math.random() * (base / 2)\n clearTimeout(this.timer)\n this.timer = setTimeout(() => this.connect(), delay)\n }\n\n /** The gateway refuses us for now: no fast reconnect loop, no polling. */\n private backOff(state: LinkState, ms: number) {\n this.setState(state)\n clearTimeout(this.timer)\n this.timer = setTimeout(() => this.connect(), ms * (0.75 + Math.random() * 0.5))\n }\n\n private flush() {\n const queued = this.queue\n this.queue = []\n for (const msg of queued) this.send(msg, true)\n }\n\n private startPolling() {\n this.setState('polling')\n if (this.pollTimer) return\n this.polls = 0\n this.poll()\n this.pollTimer = setInterval(() => this.poll(), POLL_MS)\n }\n\n private stopPolling() {\n if (this.pollTimer) clearInterval(this.pollTimer)\n this.pollTimer = undefined\n }\n\n private retryWebSocket() {\n this.stopPolling()\n this.failures = 0\n this.attempt = 0\n this.connect()\n }\n\n private poll() {\n if (this.stopped) return\n this.polls++\n if (this.polls > 1 && this.polls % 5 === 1) {\n this.retryWebSocket()\n return\n }\n if (!nativeFetch) return\n nativeFetch(this.opts.presenceUrl, {\n method: 'POST',\n // A \"simple\" request: no CORS preflight from pages on other origins.\n headers: { 'Content-Type': 'text/plain;charset=UTF-8' },\n body: JSON.stringify(this.opts.presence()),\n credentials: 'omit',\n cache: 'no-store',\n })\n .then(res => (res.ok ? res.json() : null))\n .then(res => {\n if (!res || this.stopped || !this.pollTimer) return\n this.opts.onPresence(res)\n if (res.connect) this.retryWebSocket()\n })\n .catch(() => {\n // Try again next minute.\n })\n }\n}\n","import { agentText, closestComposed, describeForAgent, isDebugUi, isMasked, flushLog, logRecord, MASK, scrub, tagOf } from '@chobitsu/engine/rwd'\n\n// Page state for the gateway: url / title / visibility changes (`page`\n// messages, from which the gateway derives navigations) and the user's taps\n// as timeline events. The same, plus the user's input, submits and scrolling,\n// go to the session log.\n\nexport interface PageState {\n url: string\n title: string\n visibility: 'visible' | 'hidden'\n}\n\nexport function currentPage(): PageState {\n return {\n url: location.href,\n title: document.title,\n visibility: document.visibilityState === 'hidden' ? 'hidden' : 'visible',\n }\n}\n\nexport function shortLocation(url: string) {\n try {\n const u = new URL(url)\n // No query string: it may carry tokens.\n return u.pathname + u.hash\n } catch (e) {\n return url.split('?')[0]\n }\n}\n\nexport interface PageWatchOptions {\n onChange(page: PageState): void\n onTap(summary: string, target: Element): void\n}\n\nconst TAP_TARGETS =\n 'a, button, input, select, textarea, label, summary, [role=button], [role=link], [role=tab], [role=menuitem], [role=checkbox], [role=radio], [role=switch], [role=option], [onclick]'\n\n/** 'Tapped button \"Place order\"': role and accessible name, never a field's value. In the agent's language. */\nexport function tapSummary(target: Element): string {\n const el = closestComposed(target, TAP_TARGETS) || target\n const { role, name } = describeForAgent(el)\n let text = name\n if (!text && !(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement)) {\n text = isMasked(el) ? MASK : scrub((el.textContent || '').replace(/\\s+/g, ' ').trim())\n }\n if (text.length > 30) text = text.slice(0, 30) + '…'\n const t = agentText()\n const label = t.roles[role] || t.element\n return text ? t.tapped(label, text) : t.tappedTag(label, tagOf(el))\n}\n\nfunction fieldName(el: Element) {\n const { role, name } = describeForAgent(el)\n return name ? `${role} \"${name.length > 30 ? name.slice(0, 30) + '…' : name}\"` : tagOf(el)\n}\n\nfunction fieldValue(el: Element): string {\n if (isMasked(el)) return MASK\n if (el instanceof HTMLInputElement) {\n if (el.type === 'password') return MASK\n if (el.type === 'checkbox' || el.type === 'radio') return el.checked ? 'checked' : 'unchecked'\n }\n const value = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement ? el.value : ''\n const text = scrub(value)\n return text.length > 200 ? text.slice(0, 200) + '…' : text\n}\n\nexport function watchPage(opts: PageWatchOptions) {\n let last = currentPage()\n let timer: ReturnType<typeof setTimeout> | undefined\n\n const check = () => {\n timer = undefined\n const page = currentPage()\n if (page.url === last.url && page.title === last.title && page.visibility === last.visibility) return\n const prev = last\n last = page\n if (page.url !== prev.url) {\n logRecord('page', { event: 'nav', url: scrub(page.url), from: scrub(prev.url), title: scrub(page.title) })\n }\n if (page.visibility !== prev.visibility) {\n logRecord('page', { event: 'visibility', state: page.visibility })\n // The app may be killed in the background: write now.\n if (page.visibility === 'hidden') flushLog()\n }\n opts.onChange(page)\n }\n const schedule = () => {\n if (!timer) timer = setTimeout(check, 50)\n }\n\n for (const name of ['pushState', 'replaceState'] as const) {\n const orig = history[name]\n if (typeof orig !== 'function') continue\n history[name] = function (this: History) {\n const result = orig.apply(this, arguments as any)\n schedule()\n return result\n }\n }\n window.addEventListener('popstate', schedule)\n window.addEventListener('hashchange', schedule)\n document.addEventListener('visibilitychange', check)\n\n // <title> changes. The SDK runs in <head>, so <head> exists.\n try {\n new MutationObserver(schedule).observe(document.head || document.documentElement, {\n subtree: true,\n childList: true,\n characterData: true,\n })\n } catch (e) {\n // No MutationObserver: url changes still re-read the title.\n }\n\n // The user's taps, for the timeline. Untrusted clicks are the agent's own.\n window.addEventListener(\n 'click',\n e => {\n if (!e.isTrusted) return\n const target = (e.composedPath ? e.composedPath()[0] : e.target) as Element\n if (!target || target.nodeType !== 1 || isDebugUi(target)) return\n try {\n const summary = tapSummary(target)\n opts.onTap(summary, target)\n logRecord('action', { event: 'tap', target: summary, tag: tagOf(target) }, true)\n } catch (err) {\n // Timeline only.\n }\n },\n true\n )\n\n // Session log: what the user typed (masked fields never), submitted and\n // where they scrolled to.\n document.addEventListener(\n 'change',\n e => {\n const el = e.target as Element\n if (!e.isTrusted || !el || el.nodeType !== 1 || isDebugUi(el)) return\n try {\n logRecord('action', { event: 'input', target: fieldName(el), value: fieldValue(el) }, true)\n } catch (err) {\n // Log only.\n }\n },\n true\n )\n document.addEventListener(\n 'submit',\n e => {\n const form = e.target as Element\n if (!e.isTrusted || !form || form.nodeType !== 1) return\n try {\n logRecord('action', { event: 'submit', target: fieldName(form) }, true)\n } catch (err) {\n // Log only.\n }\n },\n true\n )\n const scrolls = new Map<EventTarget, ReturnType<typeof setTimeout>>()\n document.addEventListener(\n 'scroll',\n e => {\n if (!e.isTrusted || !e.target) return\n const target = e.target\n const old = scrolls.get(target)\n if (old) clearTimeout(old)\n scrolls.set(\n target,\n setTimeout(() => {\n scrolls.delete(target)\n const el = target === document ? document.scrollingElement : (target as Element)\n if (!el || isDebugUi(el)) return\n logRecord('action', {\n event: 'scroll',\n target: target === document ? 'page' : tagOf(el),\n y: Math.round(el.scrollTop),\n x: Math.round(el.scrollLeft),\n })\n }, 600)\n )\n },\n true\n )\n\n return { check }\n}\n","import type { LocalePack } from './i18n'\n\n// How the <script> build (dist/sdk.js) loads a built-in language pack that is\n// not bundled: dist/locales/<id>.js from next to sdk.js (the CDN or wherever\n// the page got it), else from the gateway (<gatewayUrl>/locales/<id>.js). The\n// pack registers itself through window.RemoteWebviewDebugger.registerLocale.\n// The ES module build swaps this file for localeLoader.esm.ts (vite.config.ts).\n\nconst TIMEOUT_MS = 10_000\n\nlet base = ''\nlet nonce = ''\ntry {\n const script = document.currentScript as HTMLScriptElement | null\n if (script && script.src) base = script.src.replace(/[^/]*([?#].*)?$/, '')\n if (script) nonce = script.nonce || script.getAttribute('nonce') || ''\n} catch (e) {\n // Injected by a native host: no script element.\n}\n\nfunction inject(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const s = document.createElement('script')\n let timer: ReturnType<typeof setTimeout>\n const done = (ok: boolean) => {\n clearTimeout(timer)\n s.remove()\n if (ok) resolve()\n else reject(new Error(`failed to load ${url}`))\n }\n timer = setTimeout(() => done(false), TIMEOUT_MS)\n s.onload = () => done(true)\n s.onerror = () => done(false)\n s.async = true\n if (nonce) s.nonce = nonce\n s.src = url\n ;(document.head || document.documentElement).appendChild(s)\n })\n}\n\n/** Resolves once the pack's script ran (it registered itself), or rejects. */\nexport function loadLocale(id: string, gatewayUrl?: string): Promise<LocalePack | null> {\n const urls: string[] = []\n if (base) urls.push(`${base}locales/${id}.js`)\n if (gatewayUrl) {\n const url = `${gatewayUrl.replace(/\\/+$/, '')}/locales/${id}.js`\n if (urls.indexOf(url) < 0) urls.push(url)\n }\n let chain: Promise<void> = Promise.reject(new Error(`no URL to load locale ${id} from`))\n for (const url of urls) chain = chain.catch(() => inject(url))\n return chain.then(() => null)\n}\n","import { AGENT_EN, USER_EN } from '@chobitsu/engine/rwd/i18n'\n\n// English: the built-in default and the shape of every language pack. Missing\n// keys in any other pack fall back to these.\n\ntype LevelText = { observe: string; interact: string; advanced: string }\n\nconst ui = {\n /** Levels in the floating window (auto-allow). */\n levels: {\n observe: 'View only',\n interact: 'View and interact',\n advanced: 'Advanced (run scripts, read storage)',\n } as LevelText,\n /** Levels in the attach dialog: what each choice adds. */\n attachLevels: {\n observe: 'View only',\n interact: 'View and interact',\n advanced: 'Advanced (also run scripts, read storage)',\n } as LevelText,\n state: {\n none: 'Idle: no AI connected',\n observe: 'AI is viewing this page',\n agent: 'AI is in control; your input is paused',\n user: \"You've taken over; AI is paused\",\n },\n link: {\n connecting: 'Connecting',\n online: 'Online',\n offline: 'Offline',\n },\n connecting: 'Connecting…',\n helpPending: 'Assisting',\n copy: 'Copy',\n copied: 'Copied',\n noteHelp: 'Assistance requested. The developer will find you by this device code.',\n noteAuto: 'Auto-allow is on: AI joins without asking. You can take over or end anytime.',\n noteShare: 'Share this device code with the developer. AI asks before joining, and you can take over or end anytime.',\n help: 'Request assistance',\n cancelHelp: 'Cancel request',\n collapse: 'Hide',\n deviceCode: 'Device code',\n barViewing: 'AI is viewing',\n barAgent: 'AI working',\n barUser: 'Your turn',\n connectedFor: (time: string) => `Connected · ${time}`,\n takeover: 'Take over',\n handback: 'Hand back',\n end: 'End',\n autoTitle: 'Auto-allow AI',\n autoOn: (level: string) => `Joins without asking · ${level}`,\n autoOff: 'Ask me each time AI wants to join',\n lockTitle: 'Lock screen while AI is connected',\n lockOn: 'Your taps and swipes are blocked while AI is connected',\n lockOff: \"You can still tap and scroll; try not to get in the AI's way\",\n lockedToast: 'Screen will lock while AI is connected',\n unlockedToast: \"Screen won't lock while AI is connected\",\n autoOffToast: 'Auto-allow is off. AI will ask before joining',\n autoDialogTitle: 'Turn on auto-allow?',\n autoDialogText:\n \"When AI asks to join this device, it joins right away with the access you pick below. You'll see a notice each time, can take over or end anytime, and can turn this off here.\",\n turnOn: 'Turn on',\n cancel: 'Cancel',\n autoOnToast: (level: string) => `Auto-allow on · ${level}`,\n countdown: (seconds: number) => `Auto-deny in ${seconds}s`,\n\n // approval\n agentName: 'AI assistant',\n autoAllowedToast: (agent: string, level: string) => `Auto-allowed \"${agent}\" · ${level}`,\n attachTitle: 'AI wants to join',\n attachText: (agent: string) => `\"${agent}\" wants to view this page. Allow?`,\n confirmTitle: 'Please confirm',\n confirmText: (action: string) => `AI wants to ${action}. Allow?`,\n allow: 'Allow',\n deny: 'Deny',\n}\n\nexport type UiMessages = typeof ui\n\nconst en = {\n id: 'en',\n name: 'English',\n dir: 'ltr' as 'ltr' | 'rtl',\n ui,\n action: USER_EN,\n agent: AGENT_EN,\n}\n\nexport default en\n","import type { ActionMessages, AgentMessages, Locale, UiMessages } from '../i18n'\n\n// 简体中文。\n\nconst ui: UiMessages = {\n levels: {\n observe: '仅查看',\n interact: '查看并操作',\n advanced: '高级(可执行脚本、读取存储)',\n },\n attachLevels: {\n observe: '仅查看',\n interact: '查看并操作',\n advanced: '高级(另可执行脚本、读取存储)',\n },\n state: {\n none: '空闲:没有 AI 接入',\n observe: 'AI 正在查看这个页面',\n agent: 'AI 正在操作,你的输入已暂停',\n user: '你已接管,AI 已暂停',\n },\n link: {\n connecting: '连接中',\n online: '在线',\n offline: '离线',\n },\n connecting: '连接中…',\n helpPending: '协助中',\n copy: '复制',\n copied: '已复制',\n noteHelp: '已请求协助,开发同学会通过设备码找到你。',\n noteAuto: '已开启自动允许:AI 接入时不再询问,你随时可以接管或结束。',\n noteShare: '把设备码发给开发同学:AI 接入前会先征得你的同意,接入后你随时可以接管或结束。',\n help: '请求协助',\n cancelHelp: '取消请求',\n collapse: '收起',\n deviceCode: '设备码',\n barViewing: 'AI 查看中',\n barAgent: 'AI 操作中',\n barUser: '你在操作',\n connectedFor: time => `已连接 · ${time}`,\n takeover: '接管',\n handback: '交还 AI',\n end: '结束',\n autoTitle: '自动允许 AI 接入',\n autoOn: level => `不再询问,以「${level}」接入`,\n autoOff: '每次 AI 请求接入都先问你',\n lockTitle: 'AI 接入时锁定屏幕',\n lockOn: 'AI 接入期间你的点击和滑动会被拦住',\n lockOff: 'AI 接入期间你仍可以点和滑,注意别和 AI 抢操作',\n lockedToast: 'AI 接入期间会锁定屏幕',\n unlockedToast: 'AI 接入期间不再锁定屏幕',\n autoOffToast: '已关闭自动允许,AI 接入前会先问你',\n autoDialogTitle: '开启自动允许接入?',\n autoDialogText:\n '开启后,AI 请求接入这台设备时不再弹窗询问,直接按下面选的权限接入。每次自动接入都会在屏幕上提示,你随时可以接管或结束,也可以在这里关掉。',\n turnOn: '开启',\n cancel: '取消',\n autoOnToast: level => `已开启自动允许接入 · ${level}`,\n countdown: seconds => `${seconds} 秒后自动拒绝`,\n\n agentName: 'AI 助手',\n autoAllowedToast: (agent, level) => `已自动允许「${agent}」接入 · ${level}`,\n attachTitle: 'AI 请求接入',\n attachText: agent => `「${agent}」请求查看此页面,允许吗?`,\n confirmTitle: '需要你的确认',\n confirmText: action => `AI 想要${action},允许吗?`,\n allow: '允许',\n deny: '拒绝',\n}\n\nconst agent: AgentMessages = {\n missingParam: name => `缺少参数 ${name}`,\n notString: name => `参数 ${name} 必须是字符串`,\n unknownMethod: method => `未知方法:${method}`,\n needLevel: level => `需要 ${level} 权限`,\n takenOver: '用户已接管控制,等待用户交还',\n userDenied: '用户拒绝了该操作',\n confirmBusy: '正在等待用户确认上一个操作',\n\n unknownModifier: m => `未知的修饰键:${m}`,\n unknownKey: key => `未知的按键:${key}`,\n\n refNotInSnapshot: ref => `ref=${ref} 不在最近一次快照里,请重新获取快照`,\n refDetached: ref => `ref=${ref} 对应的元素已不在页面上,请重新获取快照`,\n queryNeedsCriteria: '至少需要 text、role、name 之一',\n noSuchRecord: seq => `会话日志里没有 seq=${seq} 的记录(可能已被清理)`,\n noSuchSession: id => `这台设备上没有会话 ${id} 的日志(只保留最近 3 次启动)`,\n noSessionLog: '这台设备上还没有会话日志(项目可能关闭了记录,或页面用 run({ record: false }) 关掉了)',\n sessionLogUnavailable: '这个页面用不了 IndexedDB,没有会话日志',\n\n readOnly: tag => `${tag} 是只读的`,\n isSelect: tag => `${tag} 是下拉框,请用 rwd.select`,\n notFillable: tag => `${tag} 不是输入框,不能填写`,\n notSelect: tag => `${tag} 不是下拉框(select),请用 click 操作`,\n singleSelect: '该下拉框只能选一项',\n noSuchOption: (value, choices) => `下拉框里没有选项「${value}」,可选:${choices.join('、')}`,\n optionDisabled: value => `选项「${value}」已禁用`,\n\n badUrl: url => `无效的网址:${url}`,\n httpOnly: '只能打开 http(s) 网址',\n textAppearTimeout: text => `等待文字「${text}」出现超时`,\n textGoneTimeout: text => `等待文字「${text}」消失超时`,\n badFunction: message => `无法解析 function:${message}`,\n notAFunction: 'function 必须是函数表达式,例如 \"() => document.title\"',\n\n elementDetached: tag => `元素 ${tag} 已不在页面上,请重新获取快照`,\n notActionable: (tag, reason) => `元素 ${tag} 不可操作:${reason}`,\n notVisible: tag => `元素 ${tag} 不可见`,\n reasonMoving: '元素位置一直在变化(可能在动画中)',\n reasonOffscreen: '元素不在可视区域内',\n reasonObscured: (tag, ref) => `点击位置被 ${tag} 遮挡(遮挡元素 ref=${ref},可以直接 click 它,比如点遮罩关闭弹窗)`,\n\n overlayHeader: '[浮层] 下面这些元素盖在页面内容上方。点击被挡住时,可以直接点它们(比如点遮罩关闭弹窗):',\n overlayMask: (tag, coverage, ref) => `- 遮罩 ${tag},覆盖视口 ${coverage}% [ref=${ref}]`,\n overlayLayer: (tag, text, coverage, ref) => `- 弹层 ${tag}${text ? `「${text}」` : ''},覆盖视口 ${coverage}% [ref=${ref}]`,\n reasonHidden: '元素不可见',\n reasonDisabled: '元素已禁用',\n\n storageUnavailable: area => `${area}Storage 不可用`,\n badStorageArea: \"参数 area 必须是 'local'、'session' 或 'cookie'\",\n\n requestFailed: '请求失败',\n noSuchRequest: id => `找不到请求 id=${id}(可能已被丢弃)`,\n netFailed: (what, error) => `${what} → 失败(${error})`,\n wsFailed: url => `WebSocket ${url} → 失败`,\n\n tapped: (role, text) => `点击了${role}「${text}」`,\n tappedTag: (role, tag) => `点击了${role} ${tag}`,\n roles: {\n button: '按钮',\n link: '链接',\n textbox: '输入框',\n searchbox: '搜索框',\n checkbox: '复选框',\n radio: '单选框',\n switch: '开关',\n combobox: '下拉框',\n listbox: '列表',\n option: '选项',\n tab: '标签页',\n menuitem: '菜单项',\n img: '图片',\n heading: '标题',\n cell: '单元格',\n row: '行',\n listitem: '列表项',\n },\n element: '元素',\n}\n\nconst action: ActionMessages = {\n quote: name => `「${name}」`,\n click: target => `点击${target}`,\n enterActivate: target => `按 Enter 触发${target}`,\n enterSubmit: target => `按 Enter 提交${target}`,\n}\n\nconst zh: Locale = { id: 'zh', name: '简体中文', dir: 'ltr', ui, action, agent }\n\nexport default zh\n","import { setAgentText, setUserText, type AgentText, type UserText } from '@chobitsu/engine/rwd'\nimport { loadLocale } from 'rwd:locale-loader'\nimport en, { type UiMessages } from './locales/en'\nimport zh from './locales/zh'\n\n// Language packs for everything the page says, like a component library's\n// locales. A pack holds three catalogs:\n//\n// ui the phone user's UI (pill, floating window, bottom bar, dialogs,\n// toasts, eruda tab), in run({ lang }) or the browser's language\n// action what the agent is about to do, completing \"AI wants to …\" in the\n// confirmation dialog; same language as ui\n// agent RPC errors and timeline events that go back to the AI agent, in\n// the language the gateway asks for (welcome.agentLang)\n//\n// English and Simplified Chinese are bundled. The other built-in packs load\n// on demand: dist/locales/<id>.js next to sdk.js (or from the gateway), or a\n// dynamic import in the ES module build. Pages can register their own packs\n// and override single messages. A language falls back tag by tag, then to\n// English: zh-HK → zh-TW → zh → en, pt-BR → pt → en.\n\nexport type { UiMessages }\nexport type AgentMessages = AgentText\nexport type ActionMessages = UserText\n\nexport interface Messages {\n ui: UiMessages\n action: ActionMessages\n agent: AgentMessages\n}\n\n/** Optional at every level; functions stay whole. */\nexport type DeepPartial<T> = T extends (...args: never[]) => unknown\n ? T\n : T extends object\n ? { [K in keyof T]?: DeepPartial<T[K]> }\n : T\n\n/** A complete language pack, like the built-in ones. */\nexport interface Locale extends Messages {\n /** BCP 47 tag: 'en', 'zh-TW', 'pt'… */\n id: string\n /** The language's own name: 'Deutsch', '日本語'. */\n name: string\n dir?: 'ltr' | 'rtl'\n}\n\n/** A pack for registerLocale(): anything left out comes from its fallback languages. */\nexport interface LocalePack extends DeepPartial<Messages> {\n id: string\n name?: string\n dir?: 'ltr' | 'rtl'\n}\n\n/** Messages to override, per language tag: { en: { ui: { help: 'Contact support' } } }. */\nexport type MessageOverrides = { [lang: string]: DeepPartial<Messages> }\n\n/** The built-in languages; all but en and zh load on demand. */\nexport const BUILTIN_LOCALES = ['en', 'zh', 'zh-TW', 'fr', 'es', 'ru', 'ar', 'ja', 'ko', 'de', 'pt']\n\nconst RTL = ['ar', 'fa', 'he', 'ur', 'ps', 'sd', 'ug', 'yi', 'dv', 'ckb']\n\nconst packs: { [id: string]: LocalePack } = { en, zh }\nconst overrides: { [id: string]: DeepPartial<Messages>[] } = {}\nconst loading: { [id: string]: Promise<void> } = {}\nconst resolved: { [id: string]: Messages } = {}\nconst listeners: (() => void)[] = []\n\n/**\n * Canonical case for a language tag: zh_tw → zh-TW, ZH-hant-hk → zh-Hant-HK.\n * '' for anything that is not a tag.\n */\nexport function canonical(tag: unknown): string {\n if (typeof tag !== 'string') return ''\n const parts = tag.trim().replace(/_/g, '-').split('-')\n if (!/^[a-z]{2,8}$/i.test(parts[0])) return ''\n return parts\n .map((p, i) => {\n if (i === 0) return p.toLowerCase()\n if (/^[a-z]{4}$/i.test(p)) return p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()\n if (/^([a-z]{2}|\\d{3})$/i.test(p)) return p.toUpperCase()\n return p.toLowerCase()\n })\n .join('-')\n}\n\n/**\n * The tags to try for a language, most specific first (English is the\n * implicit last resort): pt-BR → pt-BR, pt; zh-HK → zh-HK, zh-TW, zh;\n * zh-Hans-CN → zh-Hans-CN, zh-Hans, zh.\n */\nexport function fallbacks(tag: unknown): string[] {\n const t = canonical(tag)\n if (!t) return []\n const parts = t.split('-')\n const out: string[] = []\n for (let i = parts.length; i > 0; i--) out.push(parts.slice(0, i).join('-'))\n if (parts[0] === 'zh') {\n // Traditional Chinese is one pack (zh-TW) for Taiwan, Hong Kong and Macau.\n const hant = parts.indexOf('Hant') > 0 || (parts.indexOf('Hans') < 0 && /-(TW|HK|MO)\\b/.test(t))\n if (hant && out.indexOf('zh-TW') < 0) out.splice(out.length - 1, 0, 'zh-TW')\n }\n return out\n}\n\nfunction known(id: string) {\n return !!packs[id] || BUILTIN_LOCALES.indexOf(id) >= 0\n}\n\n/**\n * The first preference we have a pack for (registered or built in), else 'en':\n * ['it', 'de-AT'] → 'de'; ['zh-HK'] → 'zh-TW'.\n */\nexport function pickLocale(prefs: unknown[]): string {\n for (const pref of prefs) {\n for (const id of fallbacks(pref)) if (known(id)) return id\n }\n return 'en'\n}\n\n/** The browser's languages, most preferred first. */\nexport function browserLangs(): string[] {\n try {\n const list = navigator.languages && navigator.languages.length ? navigator.languages.slice() : []\n if (navigator.language && list.indexOf(navigator.language) < 0) list.unshift(navigator.language)\n return list\n } catch (e) {\n return []\n }\n}\n\nfunction isObject(v: unknown): v is { [k: string]: unknown } {\n return !!v && typeof v === 'object' && !Array.isArray(v)\n}\n\nfunction merge<T>(base: T, over: unknown): T {\n if (!isObject(over) || !isObject(base)) return base\n const out: { [k: string]: unknown } = {}\n for (const k in base) out[k] = (base as { [k: string]: unknown })[k]\n for (const k in over) {\n const v = over[k]\n if (v === undefined) continue\n out[k] = isObject(v) && isObject(out[k]) ? merge(out[k], v) : v\n }\n return out as T\n}\n\nfunction changed() {\n for (const k in resolved) delete resolved[k]\n for (const l of listeners.slice()) l()\n}\n\n/** The full messages of a language: English, then each fallback, then the pack, with overrides on top. */\nexport function messagesOf(id: string): Messages {\n const cached = resolved[id]\n if (cached) return cached\n let m: Messages = { ui: en.ui, action: en.action, agent: en.agent }\n const chain = fallbacks(id).reverse()\n if (chain[0] !== 'en') chain.unshift('en')\n for (const tag of chain) {\n const pack = packs[tag]\n if (pack) m = merge(m, { ui: pack.ui, action: pack.action, agent: pack.agent })\n for (const o of overrides[tag] || []) m = merge(m, o)\n }\n resolved[id] = m\n return m\n}\n\n/** Text direction of a language: the pack's, else rtl for Arabic, Hebrew, Persian… */\nexport function dirOf(id: string): 'ltr' | 'rtl' {\n for (const tag of fallbacks(id)) {\n const pack = packs[tag]\n if (pack && pack.dir) return pack.dir\n }\n return RTL.indexOf(id.split('-')[0]) >= 0 ? 'rtl' : 'ltr'\n}\n\n/** Add language packs (or replace one with the same id). Pages that already chose that language switch to it. */\nexport function registerLocale(pack: LocalePack | LocalePack[]) {\n const list = Array.isArray(pack) ? pack : [pack]\n let any = false\n for (const p of list) {\n const id = p && canonical(p.id)\n if (!id) continue\n packs[id] = id === p.id ? p : { ...p, id }\n any = true\n }\n if (any) changed()\n}\n\n/** Override single messages per language; later calls win. */\nexport function overrideMessages(messages: MessageOverrides | null | undefined) {\n if (!isObject(messages)) return\n for (const tag in messages) {\n const id = canonical(tag)\n if (!id || !isObject(messages[tag])) continue\n ;(overrides[id] = overrides[id] || []).push(messages[tag])\n }\n changed()\n}\n\n/** Calls listener after any pack registers or an override changes; returns the unsubscribe function. */\nexport function onLocalesChange(listener: () => void) {\n listeners.push(listener)\n return () => {\n const i = listeners.indexOf(listener)\n if (i >= 0) listeners.splice(i, 1)\n }\n}\n\n/**\n * Load a built-in pack that is not bundled (and the packs it falls back to).\n * Resolves either way: a language that can't load falls back.\n */\nexport function ensureLocale(id: string, gatewayUrl?: string): Promise<void> {\n const jobs: Promise<void>[] = []\n for (const tag of fallbacks(id)) {\n if (packs[tag] || BUILTIN_LOCALES.indexOf(tag) < 0) continue\n if (!loading[tag]) {\n loading[tag] = loadLocale(tag, gatewayUrl)\n .then(pack => {\n if (pack && !packs[tag]) registerLocale(pack)\n })\n .catch(() => undefined)\n .then(() => {\n // Failed: a later call (another gateway URL) may try again.\n if (!packs[tag]) delete loading[tag]\n })\n }\n jobs.push(loading[tag])\n }\n return Promise.all(jobs).then(() => undefined)\n}\n\n/** BCP 47 tag for lang attributes: zh → zh-CN, the id otherwise. */\nexport function htmlLang(id: string) {\n return id === 'zh' ? 'zh-CN' : id\n}\n\n/* ------------------------------ engine languages ----------------------------- */\n\nlet agentLang = 'en'\n\n/** Language of what goes back to the agent (welcome.agentLang); English until set, and while it loads. */\nexport function setAgentLang(tag: unknown, gatewayUrl?: string) {\n agentLang = pickLocale([tag])\n setAgentText(messagesOf(agentLang).agent)\n void ensureLocale(agentLang, gatewayUrl)\n}\n\n/** The page UI's language, for the engine's action descriptions. */\nexport function setActionLang(id: string) {\n setUserText(messagesOf(id).action)\n}\n\nonLocalesChange(() => setAgentText(messagesOf(agentLang).agent))\n\n// Packs loaded before this script (dist/locales/*.js queue themselves).\ntry {\n const queued = (window as unknown as { __RWD_LOCALES__?: LocalePack[] }).__RWD_LOCALES__\n if (Array.isArray(queued)) registerLocale(queued)\n} catch (e) {\n // No window.\n}\n","import { read, write } from './ids'\nimport { htmlLang, type UiMessages } from './i18n'\n\n// The SDK's on-page UI, all inside one shadow root whose host is\n// `.__chobitsu-hide__` + aria-hidden and sits outside <body>: invisible to the\n// agent's snapshot, DOM screenshots and hit testing. One visual language:\n// dark glass, hairline borders, a single electric-blue accent, no gradients.\n//\n// pill idle: device code / help, translucent, draggable, snaps to the\n// edges; hidden while docked into eruda\n// bar an agent is attached: bottom-center status, connected-for timer\n// + take over / hand back / end\n// task top-center: the agent's task name, progress and planned steps\n// overlay full-screen, transparent, swallows input in `observe` / `agent`\n// glow breathing blue edge halo from the moment an agent attaches\n// cursor the agent's pointer, on screen for the whole operating session\n// hl brief outline around the element an agent action targets\n// dialog approval / confirmation (attach request, sensitive action);\n// only trusted taps count, buttons arm after a short delay\n// panel the Remote Debugger tab inside eruda (its own shadow root; opt-in)\n//\n// Pages restyle it with the --rwd-* custom properties (VARS below; they\n// inherit into the shadow root from :root or #__rwd), run({ style }) which\n// sets the same properties on #__rwd, or #__rwd::part(...) for the parts\n// named in the markup (pill, window, bar, task, dialog, toast, button…).\n// Text comes from the language packs (i18n.ts); rtl languages mirror the\n// layout through :host([dir=rtl]).\n\nexport type ControlState = 'none' | 'observe' | 'agent' | 'user'\nexport type LinkView = 'connecting' | 'online' | 'offline'\nexport type CursorKind = 'click' | 'hover' | 'focus' | 'select' | 'scroll' | 'drag' | 'drop'\n\n/** What the attached agent says it is doing (docs/protocol.md §14.3, set_task). */\nexport interface AgentTask {\n title: string\n steps: string[]\n current: number\n agent?: string\n}\n\nexport const BRAND = 'Remote Debugger'\n\nexport interface UiOptions {\n helpButton: boolean\n /** Lock the page while an agent is attached, unless the user turned it off. */\n lockScreen: boolean\n /** auto: follow the page's background; system: prefers-color-scheme. */\n theme?: 'auto' | 'system' | 'light' | 'dark'\n /** Language of all of our text (a language pack id) and its direction. */\n lang: string\n dir: 'ltr' | 'rtl'\n text: UiMessages\n style?: StyleOptions\n onHelp(on: boolean): void\n onControl(action: 'takeover' | 'handback' | 'end'): void\n /** The user changed a setting in our window (auto-approve, lock). */\n onSettings(): void\n}\n\n/**\n * run({ style }): each field sets one --rwd-* custom property on #__rwd (see\n * VARS). Colors take any CSS color; lengths a number of px or a CSS length.\n */\nexport interface StyleOptions {\n /** --rwd-accent-rgb: buttons, switches, the agent's pointer and the edge glow. */\n accent?: string\n /** --rwd-danger-rgb: the End button. */\n danger?: string\n /** --rwd-warning-rgb: help, the user-in-control state. */\n warning?: string\n /** --rwd-success-rgb: online dot, copied. */\n success?: string\n /** --rwd-font */\n font?: string\n /** --rwd-font-mono: device code, tags. */\n monoFont?: string\n /** --rwd-radius: floating window (dialog +2px, task card −2px, smaller parts follow). */\n radius?: number | string\n /** --rwd-button-radius: pill-shaped buttons and toasts. */\n buttonRadius?: number | string\n /** --rwd-z-index of the whole UI (default 2147483647). */\n zIndex?: number\n /** --rwd-bar-bottom: bottom bar distance from the bottom safe area (default 14px). */\n barBottom?: number | string\n /** --rwd-task-top: task card distance from the top safe area (default 10px). */\n taskTop?: number | string\n /** --rwd-toast-bottom: toast distance from the bottom safe area (default 84px). */\n toastBottom?: number | string\n /** Where the idle pill starts until the user drags it: the screen edge and the height (0 top … 1 bottom). */\n pill?: { side?: 'left' | 'right'; top?: number }\n}\n\nexport type AutoLevel = 'observe' | 'interact' | 'advanced'\n\nexport interface DialogSpec {\n title: string\n text: string\n hint?: string\n choices?: { value: string; label: string }[]\n /** Preselected choice. */\n choice?: string\n okText: string\n cancelText: string\n /** Auto-deny deadline shown as a countdown; none for a plain question. */\n expiresAt?: number\n /** ok: allowed (with the chosen value), or denied. */\n onDecide(ok: boolean, choice?: string): void\n}\n\nexport interface DialogHandle {\n close(): void\n}\n\nconst POS_KEY = 'rwd:pill'\nconst CURSOR_KEY = 'rwd:cursor'\nconst TASK_KEY = 'rwd:task-min'\nconst AUTO_KEY = 'rwd:auto'\nconst LOCK_KEY = 'rwd:lock'\nconst EDGE = 8\n// A tap that started before the dialog appeared must not answer it.\nconst ARM_MS = 400\nconst FONT = `-apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Helvetica Neue\", \"Microsoft YaHei\", sans-serif`\nconst MONO = `ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, monospace`\n\n// The public custom properties and their defaults, mapped onto the names the\n// stylesheets use. Colors are r, g, b triplets so translucent shades follow.\nconst VARS = `\n --accent-rgb: var(--rwd-accent-rgb, 59, 130, 246); --accent: rgb(var(--accent-rgb));\n --danger-rgb: var(--rwd-danger-rgb, 239, 68, 68);\n --warning-rgb: var(--rwd-warning-rgb, 245, 158, 11);\n --success-rgb: var(--rwd-success-rgb, 34, 197, 94);\n --font: var(--rwd-font, ${FONT}); --mono: var(--rwd-font-mono, ${MONO});\n --radius: var(--rwd-radius, 18px); --button-radius: var(--rwd-button-radius, 999px);\n`\n\n// Han characters take their shapes from the first CJK font that has them: one\n// per language, so Japanese and Traditional Chinese don't render in a\n// Simplified Chinese font.\nconst CJK_FONTS = `\n:host(:lang(zh-TW)) { --font: var(--rwd-font, -apple-system, BlinkMacSystemFont, \"PingFang TC\", \"Helvetica Neue\", \"Microsoft JhengHei\", sans-serif); }\n:host(:lang(ja)) { --font: var(--rwd-font, -apple-system, BlinkMacSystemFont, \"Hiragino Sans\", \"Hiragino Kaku Gothic ProN\", \"Helvetica Neue\", \"Yu Gothic UI\", Meiryo, sans-serif); }\n:host(:lang(ko)) { --font: var(--rwd-font, -apple-system, BlinkMacSystemFont, \"Apple SD Gothic Neo\", \"Helvetica Neue\", \"Malgun Gothic\", sans-serif); }\n`\n\n// The agent's pointer: a rounded navigation arrow, black with a white rim,\n// tip at (0, 0).\nconst ARROW = `<svg class=\"arrow\" viewBox=\"0 0 26 26\" aria-hidden=\"true\">\n<path d=\"M3.2 1.6 L23.4 9.4 Q24.8 10 23.4 10.7 L14.6 14.6 L10.7 23.4 Q10 24.8 9.4 23.4 L1.6 3.2 Q1.1 1.1 3.2 1.6 Z\"\n fill=\"#0b0d12\" stroke=\"#fff\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n</svg>`\n\nconst COPY_ICON = `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"8.5\" height=\"8.5\" rx=\"2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"/><path d=\"M3.5 10.5V4a1.5 1.5 0 0 1 1.5-1.5h6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>`\n\nconst CHECK = `<svg viewBox=\"0 0 16 16\" aria-hidden=\"true\"><path d=\"M4 8.4 6.8 11 12 5.6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`\n\nconst CSS = `\n:host {\n all: initial;${VARS}\n --ink: 255, 255, 255; --paper: 12, 14, 20; --fg: #fff; --solid-bg: #fff; --solid-fg: #0b0d12; --track: rgba(var(--ink), .2);\n}\n${CJK_FONTS}\n/* Light pages get light glass (data-theme is set from the page, see Ui.theme). */\n:host([data-theme=light]) {\n --ink: 11, 13, 18; --paper: 255, 255, 255; --fg: #0b0d12; --solid-bg: #0b0d12; --solid-fg: #fff; --track: rgba(11, 13, 18, .16);\n}\n* { box-sizing: border-box; }\n.glass {\n background: rgba(var(--paper), .9); color: var(--fg);\n border: 1px solid rgba(var(--ink), .1);\n box-shadow: 0 12px 32px rgba(0, 0, 0, .28), inset 0 1px 0 rgba(var(--ink), .06);\n -webkit-backdrop-filter: blur(18px) saturate(1.5); backdrop-filter: blur(18px) saturate(1.5);\n}\n.win.glass, .dlg.glass, .task.glass { background: rgba(var(--paper), .96); }\n.pill, .bar, .btn { font: 500 12px/16px var(--font); }\n\n/* idle floating window: a translucent pill that expands into a card */\n.pill {\n position: fixed; z-index: 3; top: 0; left: 0;\n display: flex; align-items: center; gap: 8px;\n max-width: calc(100vw - ${EDGE * 2}px); padding: 7px 12px 7px 8px; border-radius: 999px; white-space: nowrap;\n background: rgba(var(--paper), .55); color: var(--fg); border: 1px solid rgba(var(--ink), .14);\n box-shadow: 0 8px 24px rgba(0, 0, 0, .18);\n -webkit-backdrop-filter: blur(16px) saturate(1.6); backdrop-filter: blur(16px) saturate(1.6);\n pointer-events: auto; touch-action: none; cursor: pointer;\n user-select: none; -webkit-user-select: none; -webkit-tap-highlight-color: transparent;\n transition: opacity .22s ease, transform .22s cubic-bezier(.2, .9, .2, 1), background .2s ease;\n}\n.pill:active { transform: scale(.97); }\n.pill.open { background: rgba(var(--paper), .85); }\n.pill.hidden { opacity: 0; transform: scale(.9); pointer-events: none; visibility: hidden; transition: opacity .22s ease, transform .22s ease, visibility 0s linear .22s; }\n.pill.snap { transition: left .22s cubic-bezier(.2, .9, .2, 1), top .22s cubic-bezier(.2, .9, .2, 1), opacity .22s ease, transform .22s ease; }\n.logo { position: relative; flex: none; width: 18px; height: 18px; border-radius: 6px; background: #0b0d12; box-shadow: inset 0 0 0 1px rgba(var(--ink), .18); }\n.logo .dot { position: absolute; left: 5px; top: 5px; }\n.brand { font-weight: 650; letter-spacing: .2px; }\n.win {\n position: fixed; z-index: 3; width: min(calc(100vw - ${EDGE * 2}px), 300px); padding: 14px; border-radius: var(--radius);\n font: 13px/18px var(--font); pointer-events: auto;\n opacity: 0; visibility: hidden; transform: scale(.92) translateY(6px);\n transition: opacity .2s ease, transform .24s cubic-bezier(.2, .9, .2, 1), visibility 0s linear .24s;\n}\n.win.open { opacity: 1; visibility: visible; transform: none; transition: opacity .2s ease, transform .24s cubic-bezier(.2, .9, .2, 1); }\n.win .head { display: flex; align-items: center; gap: 8px; }\n.win .name { font-weight: 700; font-size: 14px; }\n.win .link { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: rgba(var(--ink), .6); }\n.win .k { margin-top: 14px; font: 600 10px/14px var(--mono); letter-spacing: 1px; text-transform: uppercase; color: rgba(var(--ink), .45); }\n.win .codebox { display: flex; align-items: center; gap: 10px; margin-top: 4px; }\n.win .big { font: 700 24px/30px var(--mono); letter-spacing: 1.5px; }\n.win .note { margin-top: 10px; font-size: 12px; line-height: 17px; color: rgba(var(--ink), .55); }\n.win .row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }\n/* Equal halves; a label too long for half the card gets its own row. */\n.win .row .btn { flex: 1 0 0; min-width: max-content; text-align: center; white-space: nowrap; }\n.code { font: 500 12px/16px var(--mono); letter-spacing: .5px; color: rgba(var(--ink), .7); }\n.pill { border-radius: calc(var(--radius) - 2px); padding: 7px 12px 7px 9px; gap: 9px; }\n.pill .lines { display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n.pill .brand { font-size: 12px; line-height: 16px; cursor: pointer; }\n.pill .copy, .pill .logo { cursor: pointer; }\n.pill .copy {\n display: inline-flex; align-items: center; gap: 5px; margin: 0 -4px; padding: 1px 4px; border-radius: 6px;\n font: 600 12px/16px var(--mono); letter-spacing: .6px; color: rgba(var(--ink), .78); transition: background .15s ease, color .15s ease;\n}\n.pill .copy:active { background: rgba(var(--ink), .14); }\n.pill .copy svg { width: 12px; height: 12px; opacity: .7; }\n.pill .copy.done { color: rgb(var(--success-rgb)); }\n.win .opts { margin-top: 12px; border-radius: calc(var(--radius) - 8px); background: rgba(var(--ink), .05); box-shadow: inset 0 0 0 1px rgba(var(--ink), .08); }\n.win .opt { display: flex; align-items: center; gap: 10px; padding: 8px 10px; cursor: pointer; -webkit-tap-highlight-color: transparent; }\n.win .opt + .opt { border-top: 1px solid rgba(var(--ink), .08); }\n.win .opt .t { flex: 1; min-width: 0; font-size: 12px; line-height: 16px; font-weight: 600; }\n.win .opt small { display: block; margin-top: 1px; font-size: 10.5px; line-height: 14px; font-weight: 400; color: rgba(var(--ink), .5); }\n.sw { position: relative; flex: none; width: 30px; height: 18px; border-radius: 999px; background: var(--track); transition: background .2s ease; }\n.sw::after {\n content: \"\"; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, .3); transition: transform .22s cubic-bezier(.2, .9, .2, 1);\n}\n.sw.on { background: var(--accent); }\n.sw.on::after { transform: translateX(12px); }\n.toast {\n position: fixed; z-index: 4; left: 50%; bottom: calc(env(safe-area-inset-bottom, 0px) + var(--rwd-toast-bottom, 84px));\n max-width: calc(100vw - 32px); padding: 10px 16px; border-radius: var(--button-radius); font: 600 13px/18px var(--font);\n pointer-events: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n animation: rwd-toast 3.2s cubic-bezier(.2, .9, .2, 1) both;\n}\n@keyframes rwd-toast {\n 0% { opacity: 0; transform: translate(-50%, 12px) scale(.96); }\n 8%, 88% { opacity: 1; transform: translate(-50%, 0); }\n 100% { opacity: 0; transform: translate(-50%, 6px); }\n}\n\n.dot { position: relative; flex: none; width: 8px; height: 8px; border-radius: 50%; background: #6b7280; }\n.online .dot { background: rgb(var(--success-rgb)); }\n.observe .dot { background: var(--accent); }\n.agent .dot { background: var(--accent); }\n.observe .dot::after, .agent .dot::after, .task .now .mark::after {\n content: \"\"; position: absolute; inset: -4px; border-radius: 50%;\n border: 2px solid var(--accent); animation: rwd-ping 1.4s cubic-bezier(.2, .6, .3, 1) infinite;\n}\n.user .dot { background: rgb(var(--warning-rgb)); }\n\n.btn {\n flex: none; margin: 0; padding: 7px 14px; border: 0; border-radius: var(--button-radius);\n font-weight: 600; letter-spacing: .2px; cursor: pointer; pointer-events: auto;\n -webkit-tap-highlight-color: transparent; transition: transform .12s ease, background .15s ease;\n}\n.btn:active { transform: scale(.96); }\n.btn.light { background: var(--solid-bg); color: var(--solid-fg); }\n.btn.accent { background: var(--accent); color: #fff; }\n.btn.ghost { background: rgba(var(--ink), .08); color: rgba(var(--ink), .9); box-shadow: inset 0 0 0 1px rgba(var(--ink), .14); }\n.btn.stop { background: rgb(var(--danger-rgb)); color: #fff; box-shadow: 0 6px 16px rgba(var(--danger-rgb), .35); }\n.btn.help { background: rgb(var(--warning-rgb)); color: #0b0d12; padding: 4px 10px; }\n.btn.help.on { background: rgba(var(--warning-rgb), .18); color: #fcd34d; }\n\n/* bottom bar while an agent is attached */\n.bar {\n position: fixed; z-index: 3; left: 50%; transform: translateX(-50%);\n bottom: calc(env(safe-area-inset-bottom, 0px) + var(--rwd-bar-bottom, 14px));\n display: flex; align-items: center; gap: 12px; padding: 7px 7px 7px 18px; border-radius: var(--button-radius);\n white-space: nowrap; pointer-events: none; max-width: calc(100vw - 24px);\n user-select: none; -webkit-user-select: none;\n opacity: 0; visibility: hidden; transform: translate(-50%, 18px) scale(.96);\n transition: opacity .22s ease, transform .3s cubic-bezier(.2, .9, .2, 1), visibility 0s linear .3s;\n}\n.observe .bar, .agent .bar, .user .bar {\n pointer-events: auto; opacity: 1; visibility: visible; transform: translateX(-50%);\n transition: opacity .22s ease, transform .3s cubic-bezier(.2, .9, .2, 1);\n}\n.bar .status { display: flex; align-items: center; gap: 10px; min-width: 0; font-size: 14px; font-weight: 650; letter-spacing: .3px; }\n.bar .text { display: flex; flex-direction: column; min-width: 0; overflow: hidden; }\n.bar .head { display: flex; align-items: baseline; gap: 10px; min-width: 0; }\n.bar .since { overflow: hidden; text-overflow: ellipsis; font-size: 12px; line-height: 16px; font-weight: 500; font-variant-numeric: tabular-nums; color: rgba(var(--ink), .55); }\n/* The label stays whole (the agent's name gives way); when it can't fit next to\n the buttons (a long language, a narrow phone) the buttons move below it. */\n.bar .label { flex: none; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }\n.bar.stack { flex-wrap: wrap; justify-content: center; row-gap: 8px; width: calc(100vw - 24px); padding: 10px 7px 7px; border-radius: min(var(--button-radius), 26px); }\n.bar.stack .status { flex: 1 0 100%; justify-content: center; }\n.bar.stack .acts { flex: 1 0 100%; }\n.bar.stack .acts .btn { flex: 1; }\n.bar .who { color: rgba(var(--ink), .5); font-weight: 500; overflow: hidden; text-overflow: ellipsis; max-width: 96px; }\n.bar .acts { display: flex; gap: 8px; }\n.bar .btn { min-width: 78px; min-height: 46px; padding: 12px 22px; font-size: 15px; line-height: 20px; font-weight: 700; text-align: center; }\n\n/* task card */\n.task {\n position: fixed; z-index: 3; left: 50%; transform: translateX(-50%);\n top: calc(env(safe-area-inset-top, 0px) + var(--rwd-task-top, 10px));\n width: min(calc(100vw - 24px), 380px); padding: 12px 14px 12px; border-radius: calc(var(--radius) - 2px);\n pointer-events: none; cursor: pointer; font: 13px/18px var(--font);\n user-select: none; -webkit-user-select: none; -webkit-tap-highlight-color: transparent;\n opacity: 0; visibility: hidden; transform: translate(-50%, -14px) scale(.97);\n transition: opacity .22s ease, transform .3s cubic-bezier(.2, .9, .2, 1), visibility 0s linear .3s;\n}\n.task.on {\n pointer-events: auto; opacity: 1; visibility: visible; transform: translateX(-50%);\n transition: opacity .22s ease, transform .3s cubic-bezier(.2, .9, .2, 1);\n}\n.task li { transition: color .25s ease; }\n.task .mark { transition: background .25s ease, box-shadow .25s ease; }\n.task .top { display: flex; align-items: center; gap: 8px; }\n.task .tag {\n flex: none; padding: 2px 6px; border-radius: 5px; font: 600 10px/14px var(--mono); letter-spacing: 1px;\n color: var(--accent); background: rgba(var(--accent-rgb), .14); box-shadow: inset 0 0 0 1px rgba(var(--accent-rgb), .35);\n}\n.task .agent { flex: 1; min-width: 0; color: rgba(var(--ink), .5); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.task .count { flex: none; font: 600 12px/16px var(--mono); color: rgba(var(--ink), .6); }\n.task .title { margin-top: 8px; font-size: 16px; line-height: 22px; font-weight: 700; letter-spacing: .2px; }\n.task .track { margin-top: 8px; height: 3px; border-radius: 3px; background: rgba(var(--ink), .1); overflow: hidden; }\n.task .fill { height: 100%; width: 0; background: var(--accent); box-shadow: 0 0 8px var(--accent); transition: width .35s cubic-bezier(.2, .9, .2, 1); }\n.task ol {\n list-style: none; margin: 10px -6px 0 0; padding: 0 6px 0 0;\n max-height: min(26vh, 134px); overflow-y: auto; overscroll-behavior: contain;\n -webkit-overflow-scrolling: touch; touch-action: pan-y; scrollbar-width: thin;\n}\n.task ol.more { -webkit-mask-image: linear-gradient(#000 82%, transparent); mask-image: linear-gradient(#000 82%, transparent); }\n.task ol.more.end { -webkit-mask-image: none; mask-image: none; }\n.task li { display: flex; align-items: flex-start; gap: 10px; padding: 4px 0; color: rgba(var(--ink), .42); }\n.task .mark {\n position: relative; flex: none; width: 16px; height: 16px; margin-top: 1px; border-radius: 50%;\n box-shadow: inset 0 0 0 1.5px rgba(var(--ink), .25);\n}\n.task .done { color: rgba(var(--ink), .62); }\n.task .done .mark { background: var(--accent); box-shadow: none; color: #fff; }\n.task .done .mark svg { width: 16px; height: 16px; display: block; }\n.task .now { color: var(--fg); font-weight: 600; }\n.task .now .mark { box-shadow: inset 0 0 0 2px var(--accent); }\n.task .now .mark::before { content: \"\"; position: absolute; inset: 4px; border-radius: 50%; background: var(--accent); }\n.task.min ol { display: none; }\n.task.min .title { font-size: 14px; line-height: 20px; }\n\n.overlay {\n position: fixed; z-index: 1; top: 0; right: 0; bottom: 0; left: 0;\n display: none; background: transparent; pointer-events: auto; touch-action: none;\n}\n.glow { position: fixed; z-index: 2; pointer-events: none; display: none; top: 0; right: 0; bottom: 0; left: 0; }\n.observe.locked .overlay, .agent.locked .overlay { display: block; }\n/* From the moment an agent attaches: a strong, wide breathing halo, so the\n user sees at a glance that the AI is connected and their input is paused. */\n.observe .glow, .agent .glow {\n display: block;\n box-shadow:\n inset 0 0 0 5px rgba(var(--accent-rgb), .95),\n inset 0 0 36px 14px rgba(var(--accent-rgb), .8),\n inset 0 0 140px 56px rgba(var(--accent-rgb), .42);\n animation: rwd-glow 1.9s ease-in-out infinite;\n}\n.user .glow { display: block; box-shadow: inset 0 0 0 3px rgba(var(--warning-rgb), .9), inset 0 0 18px 4px rgba(var(--warning-rgb), .3); }\n\n.cursor {\n position: fixed; z-index: 3; top: 0; left: 0; width: 0; height: 0;\n pointer-events: none; opacity: 0; will-change: transform; transition: opacity .2s ease;\n}\n.cursor.on { opacity: 1; }\n.cursor .arrow {\n position: absolute; left: -2px; top: -2px; width: 26px; height: 26px; overflow: visible;\n filter: drop-shadow(0 2px 3px rgba(0, 0, 0, .35)) drop-shadow(0 0 12px rgba(var(--accent-rgb), .45));\n transform-origin: 2px 2px; transition: transform .09s ease-out;\n}\n.cursor.press .arrow { transform: scale(.82); }\n.ripple {\n position: fixed; z-index: 3; width: 40px; height: 40px; margin: -20px 0 0 -20px; border-radius: 50%;\n border: 2px solid var(--accent); background: rgba(var(--accent-rgb), .16); pointer-events: none;\n animation: rwd-ripple .45s cubic-bezier(.2, .7, .3, 1) forwards;\n}\n.hl {\n position: fixed; z-index: 2; pointer-events: none; border-radius: 6px;\n outline: 2px solid rgba(var(--accent-rgb), .9); outline-offset: 2px; background: rgba(var(--accent-rgb), .08);\n transition: opacity .25s ease;\n}\n\n.scrim {\n position: fixed; z-index: 4; top: 0; right: 0; bottom: 0; left: 0;\n display: flex; align-items: center; justify-content: center; padding: 20px;\n background: rgba(4, 6, 10, .46); pointer-events: auto; touch-action: none;\n -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);\n animation: rwd-fade .2s ease both;\n}\n.scrim.out { animation: rwd-fade-out .18s ease both; pointer-events: none; }\n.dlg {\n width: 100%; max-width: 330px; padding: 18px 16px 14px; border-radius: calc(var(--radius) + 2px);\n font: 14px/20px var(--font); user-select: none; -webkit-user-select: none;\n animation: rwd-pop .26s cubic-bezier(.2, .9, .2, 1) both;\n}\n.scrim.out .dlg { animation: rwd-pop-out .18s ease both; }\n.dlg .tag {\n display: inline-block; padding: 2px 6px; border-radius: 5px; font: 600 10px/14px var(--mono); letter-spacing: 1px;\n color: var(--accent); background: rgba(var(--accent-rgb), .14); box-shadow: inset 0 0 0 1px rgba(var(--accent-rgb), .35);\n}\n.dlg h3 { margin: 10px 0 6px; font-size: 17px; line-height: 24px; font-weight: 700; }\n.dlg p { margin: 0; word-break: break-word; color: rgba(var(--ink), .78); }\n.dlg .hint, .dlg .count { margin-top: 6px; color: rgba(var(--ink), .45); font-size: 12px; line-height: 16px; }\n.choices { display: flex; flex-direction: column; gap: 6px; margin-top: 14px; }\n.dlg button {\n margin: 0; font: inherit; color: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent;\n transition: transform .12s ease, background .15s ease, box-shadow .15s ease, opacity .15s ease;\n}\n.dlg button:active { transform: scale(.97); }\n.choice {\n padding: 10px 12px; border: 0; border-radius: calc(var(--radius) - 6px); text-align: left; color: rgba(var(--ink), .85);\n background: rgba(var(--ink), .06); box-shadow: inset 0 0 0 1px rgba(var(--ink), .12);\n}\n.choice.on { color: var(--fg); background: rgba(var(--accent-rgb), .16); box-shadow: inset 0 0 0 1.5px var(--accent); }\n.dlg .acts { display: flex; gap: 8px; margin-top: 16px; }\n.dlg .acts button { flex: 1; padding: 11px; border: 0; border-radius: calc(var(--radius) - 6px); font-weight: 650; }\n.dlg .acts .deny { background: rgba(var(--ink), .08); color: rgba(var(--ink), .9); box-shadow: inset 0 0 0 1px rgba(var(--ink), .14); }\n.dlg .acts .allow { background: var(--accent); color: #fff; box-shadow: 0 6px 18px rgba(var(--accent-rgb), .4); }\n.dlg button[disabled] { opacity: .45; }\n\n@keyframes rwd-ping { 0% { transform: scale(.6); opacity: .9; } 100% { transform: scale(1.9); opacity: 0; } }\n@keyframes rwd-glow { 0%, 100% { opacity: .22; } 50% { opacity: 1; } }\n@keyframes rwd-ripple { from { transform: scale(.25); opacity: 1; } to { transform: scale(1.6); opacity: 0; } }\n@keyframes rwd-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes rwd-fade-out { from { opacity: 1; } to { opacity: 0; } }\n@keyframes rwd-pop { from { opacity: 0; transform: translateY(10px) scale(.94); } to { opacity: 1; transform: none; } }\n@keyframes rwd-pop-out { from { opacity: 1; transform: none; } to { opacity: 0; transform: translateY(6px) scale(.97); } }\n/* Right-to-left languages: mirror what is not symmetric. The pill and the\n window stay where the user put them (they are placed in JS). */\n:host([dir=rtl]) .pill { padding: 7px 9px 7px 12px; }\n:host([dir=rtl]) .win .link { margin-left: 0; margin-right: auto; }\n:host([dir=rtl]) .bar { padding: 7px 18px 7px 7px; }\n:host([dir=rtl]) .task ol { margin: 10px 0 0 -6px; padding: 0 0 0 6px; }\n:host([dir=rtl]) .choice { text-align: right; }\n:host([dir=rtl]) .sw::after { left: auto; right: 2px; }\n:host([dir=rtl]) .sw.on::after { transform: translateX(-12px); }\n/* Arabic script joins its letters: no letter spacing, and no monospace font for the label. */\n:host([dir=rtl]) .win .k { font-family: var(--font); letter-spacing: 0; }\n:host([dir=rtl]) .btn, :host([dir=rtl]) .bar .status { letter-spacing: 0; }\n/* Device codes read left to right in any language. */\n.ltr { direction: ltr; unicode-bidi: isolate; }\n\n@media (prefers-reduced-motion: reduce) {\n .observe .glow, .agent .glow, .observe .dot::after, .agent .dot::after, .task .now .mark::after { animation: none; }\n .observe .glow, .agent .glow { opacity: .9; }\n .pill, .pill.snap, .hl, .win, .bar, .task, .scrim, .dlg { transition: none !important; animation: none !important; }\n}\n`\n\n// The eruda tab. Colors follow eruda's light / dark theme through currentColor.\nconst PANEL_CSS = `\n:host { all: initial; display: block; color: inherit;${VARS}}\n* { box-sizing: border-box; }\n.panel { padding: 14px; font: 13px/18px var(--font); color: inherit; }\n.head { display: flex; align-items: center; gap: 8px; }\n.logo { position: relative; width: 22px; height: 22px; border-radius: 6px; flex: none; background: #0b0d12; }\n.logo::after { content: \"\"; position: absolute; inset: 7px; border-radius: 50%; background: var(--accent); }\n.name { font-weight: 600; font-size: 14px; }\n.status { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font-size: 12px; opacity: .8; }\n.dot { width: 8px; height: 8px; border-radius: 50%; background: #8e8e93; }\n.online .dot { background: rgb(var(--success-rgb)); }\n.observe .dot, .agent .dot { background: var(--accent); }\n.user .dot { background: rgb(var(--warning-rgb)); }\n.card { margin-top: 12px; padding: 12px; border-radius: 10px;\n border: 1px solid rgba(127, 127, 127, .25); background: rgba(127, 127, 127, .08); }\n.k { font-size: 12px; opacity: .65; }\n.code { display: flex; align-items: center; gap: 10px; margin-top: 4px; }\n.code b { font: 600 22px/28px var(--mono); letter-spacing: 1px; }\n.state { margin-top: 10px; font-size: 13px; }\n.hint { margin-top: 8px; font-size: 12px; opacity: .65; }\n.acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }\nbutton { margin: 0; padding: 7px 14px; border: 0; border-radius: 8px; font: 600 13px/18px var(--font);\n cursor: pointer; -webkit-tap-highlight-color: transparent; }\n.primary { background: var(--accent); color: #fff; }\n.ghost { background: rgba(127, 127, 127, .16); color: inherit; }\n.warn { background: rgb(var(--warning-rgb)); color: #0b0d12; }\n.small { padding: 4px 10px; font-size: 12px; }\n${CJK_FONTS}\n:host([dir=rtl]) .status { margin-left: 0; margin-right: auto; }\n.ltr { direction: ltr; unicode-bidi: isolate; }\n`\n\nexport class Ui {\n readonly host: HTMLElement\n /** Our text, in the user's language. */\n t: UiMessages\n private root: ShadowRoot | HTMLElement\n private frame: HTMLElement\n private pill: HTMLElement\n private win: HTMLElement\n private winOpen = false\n private bar: HTMLElement\n private taskEl: HTMLElement\n private cursor: HTMLElement\n private cursorAt: { x: number; y: number } | null = null\n private panel: HTMLElement | null = null\n private control: ControlState = 'none'\n /** When the agent attached (local clock); null: none attached. */\n private since: number | null = null\n private sinceEl: HTMLElement | null = null\n private ticker: ReturnType<typeof setInterval> | null = null\n private link: LinkView = 'connecting'\n private code = ''\n private help = false\n private agent = 'AI'\n private task: AgentTask | null = null\n private taskKey = ''\n private taskPct = 0\n private dragged = false\n private onClickBound = (e: Event) => this.onClick(e)\n private dialogs: HTMLElement[] = []\n\n constructor(private opts: UiOptions) {\n this.t = opts.text\n const host = document.createElement('div')\n host.id = '__rwd'\n host.className = '__chobitsu-hide__'\n host.setAttribute('aria-hidden', 'true')\n host.setAttribute('lang', htmlLang(opts.lang))\n host.setAttribute('dir', opts.dir)\n host.style.cssText =\n 'all:initial;position:fixed;top:0;left:0;width:0;height:0;overflow:visible;z-index:var(--rwd-z-index,2147483647);pointer-events:none;'\n applyStyle(host, opts.style)\n this.host = host\n this.root = host.attachShadow ? host.attachShadow({ mode: 'open' }) : host\n\n const style = document.createElement('style')\n style.textContent = CSS\n this.frame = document.createElement('div')\n this.frame.innerHTML =\n '<div class=\"overlay\" part=\"overlay\"></div><div class=\"glow\" part=\"glow\"></div>' +\n '<div class=\"pill\" part=\"pill\" data-action=\"toggle\" role=\"status\"></div><div class=\"win glass\" part=\"window\" role=\"dialog\"></div>' +\n '<div class=\"bar glass\" part=\"bar\" role=\"status\"></div>' +\n '<div class=\"task glass\" part=\"task\" data-action=\"task\" role=\"status\"></div>' +\n `<div class=\"cursor\" part=\"cursor\">${ARROW}</div>`\n this.pill = this.frame.querySelector('.pill') as HTMLElement\n this.win = this.frame.querySelector('.win') as HTMLElement\n this.bar = this.frame.querySelector('.bar') as HTMLElement\n this.taskEl = this.frame.querySelector('.task') as HTMLElement\n this.cursor = this.frame.querySelector('.cursor') as HTMLElement\n this.root.appendChild(style)\n this.root.appendChild(this.frame)\n\n this.root.addEventListener('click', e => this.onClick(e))\n // The page's colors settle after load; the system theme can change.\n window.addEventListener('load', () => this.render())\n try {\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => this.render())\n } catch (e) {\n // Old WebView.\n }\n // iOS only turns a tap on a non-control element into a click when the\n // element itself listens for it.\n this.taskEl.addEventListener('click', e => this.onClick(e))\n this.pill.addEventListener('click', e => this.onClick(e))\n this.bindDrag()\n window.addEventListener('resize', () => this.place())\n this.render()\n }\n\n /** Switch language: the next render uses the new text and direction. */\n setText(text: UiMessages, lang: string, dir: 'ltr' | 'rtl') {\n this.t = text\n this.opts.lang = lang\n this.opts.dir = dir\n this.host.setAttribute('lang', htmlLang(lang))\n this.host.setAttribute('dir', dir)\n if (this.panel) {\n const host = (this.panel.getRootNode() as ShadowRoot).host\n if (host) {\n host.setAttribute('lang', htmlLang(lang))\n host.setAttribute('dir', dir)\n }\n }\n this.render()\n }\n\n mount() {\n // Outside <body>: the snapshot walks <body> only. Available before <body>\n // exists, so the lock shows without a gap on navigation.\n if (!this.host.isConnected) document.documentElement.appendChild(this.host)\n this.place()\n }\n\n unmount() {\n this.host.remove()\n this.setTicker(false)\n }\n\n /** Whether an event belongs to our own controls (they must keep working under the lock). */\n isOwnControl(e: Event) {\n const path = e.composedPath ? e.composedPath() : []\n for (const el of [this.pill, this.win, this.bar, this.taskEl, this.panel]) {\n if (el && path.indexOf(el) >= 0) return true\n }\n for (const d of this.dialogs) if (path.indexOf(d) >= 0) return true\n return false\n }\n\n /** The level the user lets agents attach with automatically, or null (ask every time). */\n autoLevel(): AutoLevel | null {\n const v = read('localStorage', AUTO_KEY)\n return v === 'observe' || v === 'interact' || v === 'advanced' ? v : null\n }\n\n /** Whether the page locks while the agent operates. */\n lockScreen(): boolean {\n const v = read('localStorage', LOCK_KEY)\n return v === null ? this.opts.lockScreen : v === '1'\n }\n\n /** Light or dark glass, matching the page by default. */\n theme(): 'light' | 'dark' {\n const t = this.opts.theme || 'auto'\n if (t === 'light' || t === 'dark') return t\n const system = !!(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'\n return t === 'system' ? system : pageTheme() || 'light'\n }\n\n /** A short note above the bottom bar. */\n toast(text: string) {\n const t = document.createElement('div')\n t.className = 'toast glass'\n t.setAttribute('part', 'toast')\n t.textContent = text\n this.frame.appendChild(t)\n setTimeout(() => t.remove(), 3300)\n }\n\n setHelpButton(on: boolean) {\n if (this.opts.helpButton === on) return\n this.opts.helpButton = on\n this.render()\n }\n\n /**\n * Render the Remote Debugger tab into `container` (eruda's tool element). While\n * docked, the idle pill is hidden; the bottom bar still shows whenever an\n * agent is attached, so the user can always take over or end.\n */\n dock(container: HTMLElement) {\n const host = document.createElement('div')\n host.className = '__chobitsu-hide__'\n host.setAttribute('lang', htmlLang(this.opts.lang))\n host.setAttribute('dir', this.opts.dir)\n applyStyle(host, this.opts.style)\n const root = host.attachShadow ? host.attachShadow({ mode: 'open' }) : host\n const style = document.createElement('style')\n style.textContent = PANEL_CSS\n const panel = document.createElement('div')\n panel.className = 'panel'\n root.appendChild(style)\n root.appendChild(panel)\n root.addEventListener('click', e => this.onClick(e))\n container.appendChild(host)\n this.panel = panel\n this.render()\n }\n\n undock() {\n if (this.panel) {\n const host = (this.panel.getRootNode() as ShadowRoot).host || this.panel\n if (host.parentNode) host.parentNode.removeChild(host)\n }\n this.panel = null\n this.render()\n }\n\n /** A modal question; the caller enforces the deadline and closes it. */\n dialog(spec: DialogSpec): DialogHandle {\n const scrim = document.createElement('div')\n scrim.className = 'scrim'\n const box = document.createElement('div')\n box.className = 'dlg glass'\n box.setAttribute('role', 'dialog')\n box.setAttribute('part', 'dialog')\n scrim.appendChild(box)\n const el = (tag: string, cls: string, text: string, parent: HTMLElement = box) => {\n const node = document.createElement(tag)\n if (cls) node.className = cls\n node.textContent = text\n parent.appendChild(node)\n return node\n }\n el('span', 'tag', BRAND.toUpperCase())\n el('h3', '', spec.title)\n el('p', '', spec.text)\n if (spec.hint) el('p', 'hint', spec.hint)\n let choice = spec.choice\n const choiceButtons: HTMLElement[] = []\n if (spec.choices && spec.choices.length) {\n const list = el('div', 'choices', '')\n for (const c of spec.choices) {\n const b = el('button', 'choice', c.label, list) as HTMLButtonElement\n b.type = 'button'\n b.setAttribute('data-choice', c.value)\n choiceButtons.push(b)\n }\n }\n const count = el('p', 'count', '')\n const acts = el('div', 'acts', '')\n const deny = el('button', 'deny', spec.cancelText, acts) as HTMLButtonElement\n const allow = el('button', 'allow', spec.okText, acts) as HTMLButtonElement\n const buttons = [deny, allow].concat(choiceButtons as HTMLButtonElement[])\n for (const b of buttons) {\n b.type = 'button'\n b.setAttribute('part', 'button')\n b.disabled = true\n }\n const paint = () => {\n for (const b of choiceButtons) b.className = b.getAttribute('data-choice') === choice ? 'choice on' : 'choice'\n if (spec.expiresAt === undefined) return\n const left = Math.max(0, Math.ceil((spec.expiresAt - Date.now()) / 1000))\n count.textContent = this.t.countdown(left)\n }\n paint()\n const ticker = setInterval(paint, 1000)\n if (spec.expiresAt === undefined) count.remove()\n const arm = setTimeout(() => {\n for (const b of buttons) b.disabled = false\n }, ARM_MS)\n\n let open = true\n const close = () => {\n if (!open) return\n open = false\n clearInterval(ticker)\n clearTimeout(arm)\n const i = this.dialogs.indexOf(scrim)\n if (i >= 0) this.dialogs.splice(i, 1)\n scrim.classList.add('out')\n setTimeout(() => scrim.remove(), 190)\n }\n scrim.addEventListener('click', e => {\n e.stopPropagation()\n // Only real taps: the agent's synthesized clicks (and page scripts'\n // element.click()) are untrusted.\n if (!e.isTrusted || !open) return\n const target = e.target as Element\n const b = target && target.closest ? (target.closest('button') as HTMLButtonElement | null) : null\n if (!b || b.disabled) return\n if (b.hasAttribute('data-choice')) {\n choice = b.getAttribute('data-choice') || undefined\n paint()\n return\n }\n close()\n spec.onDecide(b === allow, choice)\n })\n this.dialogs.push(scrim)\n this.frame.appendChild(scrim)\n return { close }\n }\n\n setLink(link: LinkView, code?: string) {\n this.link = link\n if (code) this.code = code\n this.render()\n }\n\n setControl(state: ControlState, agent?: string, since?: number | null) {\n if (agent) this.agent = agent\n this.control = state\n this.since = state === 'none' ? null : since == null ? this.since || Date.now() : since\n this.setTicker(this.since != null)\n // The pointer stays on screen for as long as the agent operates.\n if (state === 'agent') this.showCursor()\n else this.cursor.classList.remove('on')\n if (state === 'none') this.task = null\n this.render()\n }\n\n setTask(task: AgentTask | null) {\n this.task = task && typeof task.title === 'string' ? task : null\n if (this.task && this.task.agent) this.agent = this.task.agent\n this.render()\n }\n\n setHelp(on: boolean) {\n this.help = on\n this.render()\n }\n\n highlight(el: Element) {\n const r = el.getBoundingClientRect()\n if (!r.width && !r.height) return\n const box = document.createElement('div')\n box.className = 'hl'\n box.style.cssText = `left:${r.left}px;top:${r.top}px;width:${r.width}px;height:${r.height}px;`\n this.frame.appendChild(box)\n setTimeout(() => (box.style.opacity = '0'), 500)\n setTimeout(() => box.remove(), 800)\n }\n\n /**\n * Glide the agent's pointer to (x, y), then press (taps). Resolves once it\n * has arrived, so the real input follows the pointer the user sees. Kept\n * quick: the glide is 90-240 ms depending on the distance.\n */\n pointer(x: number, y: number, kind: CursorKind): Promise<void> {\n const c = this.cursor\n const reduced = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches)\n let from = this.cursorAt\n if (!from || !c.classList.contains('on')) {\n from = from || { x: Math.min(window.innerWidth - 24, x + 30), y: Math.min(window.innerHeight - 12, y + 48) }\n this.placeCursor(from.x, from.y)\n }\n const distance = Math.sqrt((x - from.x) * (x - from.x) + (y - from.y) * (y - from.y))\n const ms = reduced || distance < 2 ? 0 : Math.round(Math.min(240, Math.max(90, 70 + distance * 0.35)))\n c.style.transition = `transform ${ms}ms cubic-bezier(.2, .9, .25, 1), opacity .2s ease`\n c.style.transform = `translate3d(${x}px, ${y}px, 0)`\n c.classList.add('on')\n this.saveCursor(x, y)\n return new Promise(resolve => {\n setTimeout(() => {\n if (kind === 'click' || kind === 'focus' || kind === 'select' || kind === 'drop') this.tap(x, y)\n resolve()\n }, ms)\n })\n }\n\n private tap(x: number, y: number) {\n const c = this.cursor\n c.classList.add('press')\n setTimeout(() => c.classList.remove('press'), 90)\n const r = document.createElement('div')\n r.className = 'ripple'\n r.style.left = `${x}px`\n r.style.top = `${y}px`\n this.frame.appendChild(r)\n setTimeout(() => r.remove(), 600)\n }\n\n /** Show the resting pointer: where it last was (also on the previous page), else mid-screen. */\n private showCursor() {\n if (this.cursor.classList.contains('on')) return\n let at = this.cursorAt\n if (!at) {\n try {\n const saved = JSON.parse(read('sessionStorage', CURSOR_KEY) || 'null')\n if (saved && typeof saved.x === 'number' && typeof saved.y === 'number') at = saved\n } catch (e) {\n // Ignore.\n }\n }\n const vw = window.innerWidth\n const vh = window.innerHeight\n at = at\n ? { x: Math.min(vw - 12, Math.max(12, at.x)), y: Math.min(vh - 12, Math.max(12, at.y)) }\n : { x: vw * 0.5, y: vh * 0.5 }\n this.placeCursor(at.x, at.y)\n this.cursor.classList.add('on')\n this.saveCursor(at.x, at.y)\n }\n\n private placeCursor(x: number, y: number) {\n const c = this.cursor\n c.style.transition = 'none'\n c.style.transform = `translate3d(${x}px, ${y}px, 0)`\n void c.offsetWidth\n }\n\n private saveCursor(x: number, y: number) {\n this.cursorAt = { x, y }\n write('sessionStorage', CURSOR_KEY, JSON.stringify({ x: Math.round(x), y: Math.round(y) }))\n }\n\n private render() {\n this.host.setAttribute('data-theme', this.theme())\n this.frame.className = `${this.control} ${this.link}${this.lockScreen() ? ' locked' : ''}`\n const make = (tag: string, cls: string, text: string, parent: HTMLElement, action?: string) => {\n const el = document.createElement(tag)\n if (cls) el.className = cls\n if (text) el.textContent = text\n if (action) {\n el.setAttribute('data-action', action)\n ;(el as HTMLButtonElement).type = 'button'\n if (tag === 'button') el.setAttribute('part', 'button')\n // A listener on the element itself: touch target adjustment (Android)\n // and iOS click synthesis only treat such elements as tap targets.\n el.addEventListener('click', this.onClickBound)\n }\n parent.appendChild(el)\n return el\n }\n const clear = (el: HTMLElement) => {\n while (el.firstChild) el.removeChild(el.firstChild)\n }\n\n // Idle floating window: the pill, and the card it expands into.\n const idle = this.control === 'none' && !this.panel\n if (!idle) this.winOpen = false\n const t = this.t\n const pill = this.pill\n pill.className = `pill ${this.control} ${this.link}${idle ? '' : ' hidden'}${this.winOpen ? ' open' : ''}${\n pill.classList.contains('snap') ? ' snap' : ''\n }`\n clear(pill)\n // Each part is its own tap target: browsers snap touches to the nearest\n // clickable element, and a tap on the name must not land on the code.\n const logo = make('span', 'logo', '', pill, 'toggle')\n make('span', 'dot', '', logo)\n const lines = make('span', 'lines', '', pill)\n make('span', 'brand', BRAND, lines, 'toggle')\n if (this.code) {\n // Tap the code to copy it; anywhere else on the pill opens the card.\n const copy = make('span', 'copy', '', lines, 'copy')\n make('span', 'ltr', this.code, copy)\n if (this.help) copy.appendChild(document.createTextNode(` · ${t.helpPending}`))\n copy.insertAdjacentHTML('beforeend', COPY_ICON)\n } else {\n make('span', 'code', this.link === 'online' ? '' : t.connecting, lines)\n }\n pill.setAttribute('aria-label', pill.textContent || '')\n\n const win = this.win\n win.className = `win glass ${this.control} ${this.link}${this.winOpen ? ' open' : ''}`\n clear(win)\n const head = make('div', 'head', '', win)\n const wlogo = make('span', 'logo', '', head)\n make('span', 'dot', '', wlogo)\n make('span', 'name', BRAND, head)\n const link = make('span', 'link', '', head)\n make('span', 'dot', '', link)\n make('span', '', t.link[this.link], link)\n make('div', 'k', t.deviceCode, win)\n const codebox = make('div', 'codebox', '', win)\n make('span', 'big ltr', this.code || '—', codebox)\n if (this.code) make('button', 'btn ghost', t.copy, codebox, 'copy')\n make(\n 'div',\n 'note',\n this.help ? t.noteHelp : this.autoLevel() ? t.noteAuto : t.noteShare,\n win\n )\n this.renderOptions(make, win)\n const row = make('div', 'row', '', win)\n if (this.opts.helpButton) make('button', this.help ? 'btn ghost' : 'btn accent', this.help ? t.cancelHelp : t.help, row, 'help')\n make('button', 'btn ghost', t.collapse, row, 'toggle')\n\n // Bottom bar.\n const bar = this.bar\n bar.className = 'bar glass'\n clear(bar)\n const status = make('span', 'status', '', bar)\n make('span', 'dot', '', status)\n const text = make('span', 'text', '', status)\n const line = make('span', 'head', '', text)\n const acts = make('span', 'acts', '', bar)\n switch (this.control) {\n case 'observe':\n make('span', 'label', t.barViewing, line)\n make('span', 'who', this.agent, line)\n // Locked already: the user needs a way back in before the agent acts.\n make('button', 'btn light', t.takeover, acts, 'takeover')\n make('button', 'btn stop', t.end, acts, 'end')\n break\n case 'agent':\n make('span', 'label', t.barAgent, line)\n make('button', 'btn light', t.takeover, acts, 'takeover')\n make('button', 'btn stop', t.end, acts, 'end')\n break\n case 'user':\n make('span', 'label', t.barUser, line)\n make('button', 'btn accent', t.handback, acts, 'handback')\n make('button', 'btn stop', t.end, acts, 'end')\n break\n }\n this.sinceEl = this.control === 'none' ? null : make('span', 'since', '', text)\n this.tick()\n bar.setAttribute('aria-label', bar.textContent || '')\n\n this.renderTask(make, clear)\n this.renderPanel(make, clear)\n this.place()\n }\n\n /** The connected-for timer, every second while an agent is attached. */\n private setTicker(on: boolean) {\n if (on && !this.ticker) this.ticker = setInterval(() => this.tick(), 1000)\n if (!on && this.ticker) {\n clearInterval(this.ticker)\n this.ticker = null\n }\n }\n\n private tick() {\n const el = this.sinceEl\n if (!el) return\n // Not online: the gateway (and the agent behind it) can't reach us right now.\n el.textContent =\n this.link !== 'online' ? this.t.connecting : this.since == null ? '' : this.t.connectedFor(clock(Date.now() - this.since))\n }\n\n private renderOptions(\n make: (tag: string, cls: string, text: string, parent: HTMLElement, action?: string) => HTMLElement,\n parent: HTMLElement\n ) {\n const t = this.t\n const auto = this.autoLevel()\n const lock = this.lockScreen()\n const opts = make('div', 'opts', '', parent)\n const row = (action: string, title: string, note: string, on: boolean) => {\n const el = make('div', 'opt', '', opts, action)\n el.setAttribute('role', 'switch')\n el.setAttribute('aria-checked', on ? 'true' : 'false')\n const t = make('span', 't', title, el)\n make('small', '', note, t)\n make('span', on ? 'sw on' : 'sw', '', el)\n }\n row('auto', t.autoTitle, auto ? t.autoOn(t.levels[auto]) : t.autoOff, !!auto)\n row('lock', t.lockTitle, lock ? t.lockOn : t.lockOff, lock)\n }\n\n private renderTask(\n make: (tag: string, cls: string, text: string, parent: HTMLElement, action?: string) => HTMLElement,\n clear: (el: HTMLElement) => void\n ) {\n const el = this.taskEl\n const task = this.task\n const show = !!task && this.control !== 'none'\n const min = read('sessionStorage', TASK_KEY) === '1'\n el.className = `task glass${show ? ' on' : ''}${min ? ' min' : ''}`\n // Keep the last content while it fades out.\n if (!task || !show) {\n this.taskKey = ''\n return\n }\n // Rebuild only when the task changes, so the user's scroll position in\n // the step list and the progress animation survive unrelated renders.\n const key = JSON.stringify([task.title, task.steps, task.current, task.agent || this.agent, min])\n if (key === this.taskKey) return\n this.taskKey = key\n clear(el)\n const total = task.steps.length\n const current = Math.max(0, Math.min(task.current | 0, total))\n const top = make('div', 'top', '', el)\n make('span', 'tag', 'AGENT', top)\n make('span', 'agent', task.agent || this.agent, top)\n if (total) make('span', 'count', `${Math.min(current + 1, total)}/${total}`, top)\n make('div', 'title', task.title, el)\n if (total) {\n const track = make('div', 'track', '', el)\n const fill = make('div', 'fill', '', track)\n const pct = Math.round((current / total) * 100)\n fill.style.width = `${this.taskPct}%`\n void fill.offsetWidth\n fill.style.width = `${pct}%`\n this.taskPct = pct\n const list = make('ol', '', '', el)\n task.steps.forEach((step, i) => {\n const li = make('li', i < current ? 'done' : i === current ? 'now' : '', '', list)\n const mark = make('span', 'mark', '', li)\n if (i < current) mark.innerHTML = CHECK\n make('span', '', step, li)\n })\n // Scrollable when long; keep the current step in view and fade the\n // bottom edge while more steps are below.\n const edge = () => list.classList.toggle('end', list.scrollTop + list.clientHeight >= list.scrollHeight - 2)\n if (list.scrollHeight > list.clientHeight + 2) {\n list.classList.add('more')\n const now = list.querySelector('.now') as HTMLElement | null\n if (now) list.scrollTop = Math.max(0, now.offsetTop - list.offsetTop - list.clientHeight / 2 + now.offsetHeight / 2)\n edge()\n list.addEventListener('scroll', edge, { passive: true })\n }\n if (min && current < total) make('div', 'agent', `${this.opts.dir === 'rtl' ? '←' : '→'} ${task.steps[current]}`, el)\n }\n }\n\n private renderPanel(\n make: (tag: string, cls: string, text: string, parent: HTMLElement, action?: string) => HTMLElement,\n clear: (el: HTMLElement) => void\n ) {\n const panel = this.panel\n if (!panel) return\n const t = this.t\n panel.className = `panel ${this.control} ${this.link}`\n clear(panel)\n const head = make('div', 'head', '', panel)\n make('span', 'logo', '', head)\n make('span', 'name', BRAND, head)\n const status = make('span', 'status', '', head)\n make('span', 'dot', '', status)\n make('span', '', t.link[this.link], status)\n\n const card = make('div', 'card', '', panel)\n make('div', 'k', t.deviceCode, card)\n const code = make('div', 'code', '', card)\n make('b', 'ltr', this.code || '—', code)\n if (this.code) make('button', 'ghost small', t.copy, code, 'copy')\n make('div', 'state', this.task && this.control !== 'none' ? `${t.state[this.control]} · ${this.task.title}` : t.state[this.control], card)\n make('div', 'hint', t.noteShare, card)\n\n const acts = make('div', 'acts', '', panel)\n if (this.control === 'agent') {\n make('button', 'primary', t.takeover, acts, 'takeover')\n make('button', 'ghost', t.end, acts, 'end')\n } else if (this.control === 'user') {\n make('button', 'primary', t.handback, acts, 'handback')\n make('button', 'ghost', t.end, acts, 'end')\n } else if (this.control === 'observe') {\n make('button', 'primary', t.takeover, acts, 'takeover')\n make('button', 'ghost', t.end, acts, 'end')\n }\n if (this.opts.helpButton && this.control === 'none') {\n make('button', this.help ? 'ghost' : 'warn', this.help ? t.cancelHelp : t.help, acts, 'help')\n }\n }\n\n private onClick(e: Event) {\n // Only real taps: the agent cannot press our buttons.\n if (!e.isTrusted || this.dragged) return\n const target = e.target as Element\n const button = target && target.closest ? target.closest('[data-action]') : null\n if (!button) return\n e.preventDefault()\n e.stopPropagation()\n const action = button.getAttribute('data-action')\n if (action === 'help') {\n this.opts.onHelp(!this.help)\n } else if (action === 'auto') {\n this.toggleAuto()\n } else if (action === 'lock') {\n const on = !this.lockScreen()\n write('localStorage', LOCK_KEY, on ? '1' : '0')\n this.toast(on ? this.t.lockedToast : this.t.unlockedToast)\n this.opts.onSettings()\n this.render()\n } else if (action === 'toggle') {\n this.winOpen = !this.winOpen\n this.render()\n } else if (action === 'task') {\n const min = read('sessionStorage', TASK_KEY) === '1'\n write('sessionStorage', TASK_KEY, min ? null : '1')\n this.render()\n } else if (action === 'copy') {\n copyText(this.code)\n if (button.classList.contains('copy')) {\n button.classList.add('done')\n button.textContent = this.t.copied\n setTimeout(() => this.render(), 1200)\n } else {\n button.textContent = this.t.copied\n setTimeout(() => (button.textContent = this.t.copy), 1500)\n }\n } else if (action === 'takeover' || action === 'handback' || action === 'end') {\n this.opts.onControl(action)\n }\n }\n\n /** Turning auto-approve on is a decision: say what it means and pick the level. */\n private toggleAuto() {\n const t = this.t\n if (this.autoLevel()) {\n write('localStorage', AUTO_KEY, null)\n this.toast(t.autoOffToast)\n this.opts.onSettings()\n this.render()\n return\n }\n this.dialog({\n title: t.autoDialogTitle,\n text: t.autoDialogText,\n choices: (['observe', 'interact'] as AutoLevel[]).map(value => ({ value, label: t.levels[value] })),\n choice: 'interact',\n okText: t.turnOn,\n cancelText: t.cancel,\n onDecide: (ok, choice) => {\n if (!ok) return\n const level = choice === 'observe' ? 'observe' : 'interact'\n write('localStorage', AUTO_KEY, level)\n this.toast(t.autoOnToast(t.levels[level]))\n this.opts.onSettings()\n this.render()\n },\n })\n }\n\n /** Bottom bar: stack the buttons below the status when its label would be cut off. */\n private fitBar() {\n const bar = this.bar\n bar.classList.remove('stack')\n const label = bar.querySelector('.label') as HTMLElement | null\n if (label && label.scrollWidth > label.clientWidth + 1) bar.classList.add('stack')\n }\n\n private savedPosition(): { side: 'left' | 'right'; top: number } {\n try {\n const saved = JSON.parse(read('localStorage', POS_KEY) || 'null')\n if (saved && (saved.side === 'left' || saved.side === 'right') && typeof saved.top === 'number') {\n return saved\n }\n } catch (e) {\n // Ignore.\n }\n const pill = this.opts.style && this.opts.style.pill\n const side = pill && (pill.side === 'left' || pill.side === 'right') ? pill.side : this.opts.dir === 'rtl' ? 'left' : 'right'\n const top = pill && typeof pill.top === 'number' && pill.top >= 0 && pill.top <= 1 ? pill.top : 0.62\n return { side, top }\n }\n\n /** Put the idle pill at its saved edge and height, kept inside the viewport; fit the bottom bar. */\n private place() {\n if (!this.host.isConnected) return\n this.fitBar()\n const { side, top } = this.savedPosition()\n const w = this.pill.offsetWidth\n const h = this.pill.offsetHeight\n const maxTop = Math.max(EDGE, window.innerHeight - h - EDGE)\n const y = Math.min(maxTop, Math.max(EDGE, top * window.innerHeight))\n const x = side === 'left' ? EDGE : Math.max(EDGE, window.innerWidth - w - EDGE)\n this.pill.style.left = `${x}px`\n this.pill.style.top = `${y}px`\n // The card opens from the pill, toward the middle of the screen.\n const ww = this.win.offsetWidth\n const wh = this.win.offsetHeight\n const below = y + h / 2 < window.innerHeight / 2\n const wx = side === 'left' ? EDGE : Math.max(EDGE, window.innerWidth - ww - EDGE)\n const wy = below ? Math.min(window.innerHeight - wh - EDGE, y + h + 8) : Math.max(EDGE, y - wh - 8)\n this.win.style.left = `${wx}px`\n this.win.style.top = `${wy}px`\n this.win.style.transformOrigin = `${side === 'left' ? 'left' : 'right'} ${below ? 'top' : 'bottom'}`\n }\n\n private bindDrag() {\n const t = this.t\n const pill = this.pill\n let start: { x: number; y: number; left: number; top: number; id: number } | null = null\n let moving = false\n\n pill.addEventListener('pointerdown', e => {\n if (!e.isTrusted || (e.target as Element).closest('button')) return\n const r = pill.getBoundingClientRect()\n start = { x: e.clientX, y: e.clientY, left: r.left, top: r.top, id: e.pointerId }\n moving = false\n this.dragged = false\n pill.classList.remove('snap')\n try {\n pill.setPointerCapture(e.pointerId)\n } catch (err) {\n // Old webview.\n }\n })\n pill.addEventListener('pointermove', e => {\n if (!start || e.pointerId !== start.id) return\n const dx = e.clientX - start.x\n const dy = e.clientY - start.y\n if (!moving && Math.abs(dx) + Math.abs(dy) < 6) return\n moving = true\n pill.style.left = `${start.left + dx}px`\n pill.style.top = `${start.top + dy}px`\n })\n const end = (e: PointerEvent) => {\n if (!start || e.pointerId !== start.id) return\n start = null\n if (!moving) return\n moving = false\n this.dragged = true\n // Swallow the click that ends the drag.\n setTimeout(() => (this.dragged = false), 0)\n const r = pill.getBoundingClientRect()\n const side = r.left + r.width / 2 < window.innerWidth / 2 ? 'left' : 'right'\n write('localStorage', POS_KEY, JSON.stringify({ side, top: r.top / window.innerHeight }))\n pill.classList.add('snap')\n this.place()\n }\n pill.addEventListener('pointerup', end)\n pill.addEventListener('pointercancel', end)\n }\n}\n\n/** Whether the page looks light or dark: the first opaque background of body / html. */\nfunction pageTheme(): 'light' | 'dark' | null {\n for (const el of [document.body, document.documentElement]) {\n if (!el) continue\n const m = getComputedStyle(el).backgroundColor.match(/rgba?\\(([\\d.]+),\\s*([\\d.]+),\\s*([\\d.]+)(?:,\\s*([\\d.]+))?/)\n if (!m || (m[4] !== undefined && Number(m[4]) < 0.5)) continue\n const luminance = (0.2126 * Number(m[1]) + 0.7152 * Number(m[2]) + 0.0722 * Number(m[3])) / 255\n return luminance > 0.5 ? 'light' : 'dark'\n }\n return null\n}\n\n/** 83_000 → \"01:23\"; from an hour on \"1:02:03\". */\nfunction clock(ms: number) {\n const sec = Math.max(0, Math.floor(ms / 1000))\n const two = (n: number) => (n < 10 ? '0' : '') + n\n const h = Math.floor(sec / 3600)\n return (h ? h + ':' : '') + two(Math.floor(sec / 60) % 60) + ':' + two(sec % 60)\n}\n\nfunction copyText(text: string) {\n try {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n navigator.clipboard.writeText(text).catch(() => copyFallback(text))\n return\n }\n } catch (e) {\n // Fall through.\n }\n copyFallback(text)\n}\n\n// WebViews without the async clipboard API.\nfunction copyFallback(text: string) {\n const area = document.createElement('textarea')\n area.value = text\n area.setAttribute('readonly', '')\n area.style.cssText = 'position:fixed;top:-1000px;opacity:0;'\n document.body.appendChild(area)\n area.select()\n try {\n document.execCommand('copy')\n } catch (e) {\n // Nothing more to try.\n }\n area.remove()\n}\n\n/** r, g, b of any CSS color ('#e11d48', 'tomato', 'rgb(…)', '225, 29, 72'); null if it isn't one. */\nfunction rgbTriplet(color: string): string | null {\n const v = color.trim()\n if (/^\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}$/.test(v)) return v\n try {\n const ctx = document.createElement('canvas').getContext('2d')\n if (!ctx) return null\n // The canvas keeps its previous color for an invalid one: try two.\n ctx.fillStyle = '#000'\n ctx.fillStyle = v\n const a = String(ctx.fillStyle)\n ctx.fillStyle = '#fff'\n ctx.fillStyle = v\n if (String(ctx.fillStyle) !== a) return null\n const hex = a.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)\n if (hex) return [hex[1], hex[2], hex[3]].map(h => parseInt(h, 16)).join(', ')\n const rgb = a.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/)\n return rgb ? `${rgb[1]}, ${rgb[2]}, ${rgb[3]}` : null\n } catch (e) {\n return null\n }\n}\n\nfunction length(v: number | string) {\n return typeof v === 'number' ? `${v}px` : v\n}\n\n/** run({ style }) as --rwd-* properties on a host element. */\nfunction applyStyle(host: HTMLElement, style: StyleOptions | undefined) {\n if (!style) return\n const set = (name: string, value: string | null) => {\n if (value) host.style.setProperty(name, value)\n }\n const color = (name: string, v: unknown) => {\n if (typeof v === 'string') set(name, rgbTriplet(v))\n }\n color('--rwd-accent-rgb', style.accent)\n color('--rwd-danger-rgb', style.danger)\n color('--rwd-warning-rgb', style.warning)\n color('--rwd-success-rgb', style.success)\n if (typeof style.font === 'string') set('--rwd-font', style.font)\n if (typeof style.monoFont === 'string') set('--rwd-font-mono', style.monoFont)\n for (const [key, name] of [\n ['radius', '--rwd-radius'],\n ['buttonRadius', '--rwd-button-radius'],\n ['barBottom', '--rwd-bar-bottom'],\n ['taskTop', '--rwd-task-top'],\n ['toastBottom', '--rwd-toast-bottom'],\n ] as const) {\n const v = style[key]\n if (typeof v === 'number' || typeof v === 'string') set(name, length(v))\n }\n if (typeof style.zIndex === 'number') set('--rwd-z-index', String(Math.round(style.zIndex)))\n}\n","import { BRAND, type Ui } from './ui'\n\n// Working together with eruda (docs/protocol.md §10). Off by default: the page\n// shows our floating window. Turned on by run({ eruda }) or by the project\n// policy (welcome.config.eruda); run() options win field by field.\n\nexport interface ErudaOptions {\n /** Show Remote Debugger as a tab inside eruda instead of the floating window. Default true. */\n dock?: boolean\n /** Load eruda when the page has none (the latest release by default) and init it. Default false. */\n load?: boolean\n /** Script URL for `load`. */\n src?: string\n /** Name of the eruda tab. */\n name?: string\n}\n\nexport interface ErudaRemote {\n dock?: boolean\n load?: boolean\n}\n\ninterface Resolved {\n dock: boolean\n load: boolean\n src: string\n name: string\n}\n\nexport const ERUDA_SRC = 'https://cdn.jsdelivr.net/npm/eruda'\n\nexport function resolveEruda(local: boolean | ErudaOptions | undefined, remote: ErudaRemote | null | undefined): Resolved {\n const opts: ErudaOptions = local === true ? {} : local && typeof local === 'object' ? local : {}\n const localOn = local === true || (!!local && typeof local === 'object')\n const pick = (key: 'dock' | 'load', localDefault: boolean) => {\n if (typeof opts[key] === 'boolean') return opts[key] as boolean\n if (localOn && key === 'dock') return localDefault\n return !!(remote && remote[key])\n }\n return {\n dock: local === false ? false : pick('dock', true),\n load: local === false ? false : pick('load', false),\n src: typeof opts.src === 'string' && opts.src ? opts.src : ERUDA_SRC,\n name: typeof opts.name === 'string' && opts.name ? opts.name : BRAND,\n }\n}\n\n/** Keeps the page in line with the resolved settings; apply() is idempotent. */\nexport class ErudaBridge {\n private loading = false\n private docked: string | null = null\n private timer: ReturnType<typeof setInterval> | undefined\n\n constructor(private ui: Ui) {}\n\n apply(r: Resolved) {\n if (r.load) this.load(r.src)\n if (r.dock) this.dock(r.name)\n else this.undock()\n }\n\n private load(src: string) {\n const w = window as any\n if (this.loading || w.eruda) return\n this.loading = true\n const script = document.createElement('script')\n script.src = src\n script.async = true\n script.onload = () => {\n try {\n if (w.eruda && !w.eruda._isInit) w.eruda.init()\n } catch (e) {\n // A broken eruda build must not break the page.\n }\n }\n script.onerror = () => {\n this.loading = false\n }\n ;(document.head || document.documentElement).appendChild(script)\n }\n\n /** Register the tab once eruda is initialized (it may load after us). Gives up after a minute. */\n private dock(name: string) {\n if (this.docked === name || this.timer) return\n if (this.docked) this.undock()\n let tries = 0\n this.timer = setInterval(() => {\n const eruda = (window as any).eruda\n if (++tries > 120) this.stopWaiting()\n if (!eruda || typeof eruda.add !== 'function' || !eruda._isInit) return\n this.stopWaiting()\n const ui = this.ui\n try {\n if (typeof eruda.get === 'function' && eruda.get(name)) return\n eruda.add({\n name,\n init($el: any) {\n this._$el = $el\n const el = $el && typeof $el.get === 'function' ? $el.get(0) : $el && $el[0]\n if (el) ui.dock(el)\n },\n show() {\n if (this._$el) this._$el.show()\n return this\n },\n hide() {\n if (this._$el) this._$el.hide()\n return this\n },\n destroy() {\n ui.undock()\n },\n })\n this.docked = name\n } catch (e) {\n // eruda without tool support: keep the floating window.\n }\n }, 500)\n }\n\n private undock() {\n this.stopWaiting()\n const name = this.docked\n if (!name) return\n this.docked = null\n try {\n const eruda = (window as any).eruda\n if (eruda && typeof eruda.remove === 'function') eruda.remove(name)\n } catch (e) {\n // Ignore.\n }\n this.ui.undock()\n }\n\n private stopWaiting() {\n if (this.timer) clearInterval(this.timer)\n this.timer = undefined\n }\n}\n","// Input lock while an agent is attached (docs/platform.md A3): besides the\n// full-screen overlay, capture-phase listeners on window swallow every trusted\n// (real user) pointer, touch, mouse, keyboard and wheel event before the page\n// sees it. The agent's synthesized events are untrusted and pass. Events on\n// our own controls (take over / end) pass too.\n//\n// Installed once, as early as possible, so we run before the page's own\n// window capture listeners.\n\nconst TYPES = [\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n 'pointerover',\n 'pointerout',\n 'pointerenter',\n 'pointerleave',\n 'pointercancel',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'mousedown',\n 'mouseup',\n 'mousemove',\n 'mouseover',\n 'mouseout',\n 'mouseenter',\n 'mouseleave',\n 'click',\n 'dblclick',\n 'auxclick',\n 'contextmenu',\n 'wheel',\n 'keydown',\n 'keypress',\n 'keyup',\n 'beforeinput',\n 'dragstart',\n 'drop',\n 'selectstart',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n]\n\nexport function createLock(isOwnControl: (e: Event) => boolean) {\n let locked = false\n\n const block = (e: Event) => {\n if (!locked || !e.isTrusted || isOwnControl(e)) return\n if (e.cancelable) e.preventDefault()\n e.stopImmediatePropagation()\n }\n\n for (const type of TYPES) {\n // passive: false, or Chrome ignores preventDefault on window touch/wheel.\n window.addEventListener(type, block, { capture: true, passive: false })\n }\n\n return {\n set(on: boolean) {\n if (on && !locked) {\n // Close the virtual keyboard: typing would be swallowed anyway.\n const active = document.activeElement as HTMLElement | null\n if (active && active !== document.body && typeof active.blur === 'function') active.blur()\n }\n locked = on\n },\n get locked() {\n return locked\n },\n }\n}\n","import { newId } from '@chobitsu/engine/rwd'\n\n// Which launch of the app this page belongs to, i.e. the session its session\n// log records go under. Best first:\n//\n// 1. The host app's own launch id, generated at every cold start and the same\n// for every webview of that process: run({ launchId }), or a global the\n// host (or the integration snippet) defines, window.RWDLaunchId, as a\n// string or a function returning one (or a Promise of one).\n// 2. Inferred: a session cookie (no expiry) lives as long as the app process,\n// so a page that finds it belongs to the same launch. A webview that keeps\n// session cookies across launches is caught by the engine: a session that\n// has been silent for an hour is not resumed.\n\nexport interface Launch {\n id: string\n source: 'app' | 'cookie'\n}\n\nconst COOKIE = 'rwd_launch'\nconst HOST_WAIT_MS = 300\n\nexport async function resolveLaunch(launchId: unknown): Promise<Launch> {\n const fromApp = validId(launchId) || validId(await hostLaunchId())\n if (fromApp) return { id: fromApp, source: 'app' }\n return { id: readCookie() || writeCookie(newId()), source: 'cookie' }\n}\n\n/** The engine started a new session instead of the cookie's: remember it. */\nexport function rememberLaunch(launch: Launch, used: string) {\n if (launch.source === 'cookie' && used !== launch.id) writeCookie(used)\n}\n\nasync function hostLaunchId(): Promise<unknown> {\n const w = window as any\n const value = w.RWDLaunchId\n if (typeof value !== 'function') return value\n try {\n return await Promise.race([\n Promise.resolve(value()),\n new Promise(resolve => setTimeout(() => resolve(null), HOST_WAIT_MS)),\n ])\n } catch (e) {\n return null\n }\n}\n\nfunction validId(v: unknown): string {\n if (typeof v === 'number' && isFinite(v)) v = String(v)\n return typeof v === 'string' && /^[\\w.:-]{4,128}$/.test(v) ? v : ''\n}\n\nfunction readCookie(): string {\n try {\n const m = document.cookie.match(/(?:^|;\\s*)rwd_launch=([\\w-]{4,64})/)\n return m ? m[1] : ''\n } catch (e) {\n return ''\n }\n}\n\nfunction writeCookie(id: string) {\n try {\n document.cookie = `${COOKIE}=${id}; path=/; SameSite=Lax`\n } catch (e) {\n // Cookies blocked: every page starts its own session.\n }\n return id\n}\n","// Must stay the first import: captures fetch / WebSocket before any hook.\nimport './native'\nimport {\n agentText,\n callMethod,\n currentSession,\n flushLog,\n logRecord,\n startLog,\n stopLog,\n INTERACTIVE_METHODS,\n levelAllows,\n requiredLevel,\n RwdError,\n scrub,\n setConfirmSelectors,\n setMaskRules,\n setNetworkExclude,\n startObserving,\n toLevel,\n toRpcError,\n type EventKind,\n type Level,\n} from '@chobitsu/engine/rwd'\nimport {\n clearInvite,\n ensureUniquePage,\n noteTap,\n read,\n readResume,\n renewPageId,\n resolveIdentity,\n takeInvite,\n TOKEN_KEY,\n write,\n writeResume,\n type Identity,\n} from './ids'\nimport { Approvals } from './approval'\nimport { Transport, type LinkState } from './transport'\nimport { currentPage, watchPage } from './pageWatch'\nimport { Ui, type ControlState, type StyleOptions } from './ui'\nimport { ErudaBridge, resolveEruda, type ErudaOptions, type ErudaRemote } from './eruda'\nimport { createLock } from './lock'\nimport {\n BUILTIN_LOCALES,\n browserLangs,\n dirOf,\n ensureLocale,\n messagesOf,\n onLocalesChange,\n overrideMessages,\n pickLocale,\n registerLocale,\n setActionLang,\n setAgentLang,\n type LocalePack,\n type MessageOverrides,\n} from './i18n'\nimport { rememberLaunch, resolveLaunch } from './launch'\n\n// remote-webview-debugger page SDK.\n//\n// <script src=\"https://rwd.example.com/v1/sdk.js\"></script>\n// <script>RemoteWebviewDebugger.run(\"https://rwd.example.com/v1\", \"rwd_pk_…\")</script>\n//\n// Loading the file starts collecting console / errors / network into bounded\n// buffers, so an agent that joins later sees what happened before. run()\n// brings the device online (device code, pill UI) and serves the agent's RPCs.\n\ndeclare const __RWD_VERSION__: string\nexport const version: string = __RWD_VERSION__\n\nexport interface RunOptions {\n userId?: string | null\n deviceId?: string\n helpButton?: boolean\n app?: { name: string; version: string } | null\n /**\n * Secret chosen by a native host (iOS/Android) when it injects the SDK.\n * Enables nativeControl() so the app can offer its own takeover / handback /\n * end buttons. Page scripts never see it.\n */\n nativeKey?: string\n /**\n * deviceToken the gateway issued to this deviceId (status().deviceToken),\n * kept by the native host: localStorage is per origin.\n */\n deviceToken?: string\n /**\n * The native host shows the attach / confirm questions itself: no page\n * dialog; it reads status().pending and answers with nativeDecide().\n */\n nativeApproval?: boolean\n /**\n * Work with eruda: `true` (or `{ dock: true }`) shows Remote Debugger as a\n * tab inside eruda instead of the floating window; `load: true` loads the\n * latest eruda when the page has none. Off by default; the project policy\n * can turn it on remotely, these options win field by field.\n */\n eruda?: boolean | ErudaOptions\n /**\n * Lock the page while an agent is attached (default true). The user can\n * still change it in the floating window.\n */\n lockScreen?: boolean\n /** Our UI's look: 'auto' (default) follows the page background, 'system' the OS, or fixed 'light' / 'dark'. */\n theme?: 'auto' | 'system' | 'light' | 'dark'\n /**\n * Colors, fonts, radii, z-index and positions of our UI, as --rwd-* CSS\n * custom properties (pages can also set those in their own CSS).\n */\n style?: StyleOptions\n /**\n * Language of the UI the phone user sees (pill, bottom bar, dialogs…): a\n * language tag such as 'ja' or 'pt-BR'. Default: the browser's languages.\n * Either way the first one with a pack wins, falling back tag by tag\n * (zh-HK → zh-TW → zh) and finally to English. Built in: en, zh, zh-TW,\n * fr, es, ru, ar, ja, ko, de, pt. What the agent reads follows the gateway\n * (welcome.agentLang).\n */\n lang?: string\n /** Extra language packs, registered before the language is picked (see registerLocale). */\n locales?: LocalePack[]\n /** Messages to override per language: { en: { ui: { help: 'Contact support' } } }. */\n messages?: MessageOverrides\n /**\n * Requests left out of what the agent sees in the network list and the\n * timeline (still recorded): URL substrings, `*` wildcards or /regex/,\n * e.g. ['.ttf', 'WebTracks', '*beacon*']. Added to the project's rules.\n */\n networkExclude?: string[]\n /**\n * Keep the session log (default true): what happened since the app was\n * launched, in IndexedDB on the device, for an attached agent to read. The\n * project policy can turn it off for every page.\n */\n record?: boolean\n /**\n * The host app's id for this launch (same for every webview until the app\n * process ends). Without it the SDK infers the launch; a host can also\n * define window.RWDLaunchId.\n */\n launchId?: string\n}\n\nexport type Status = 'idle' | LinkState\n\n/** welcome.config: the project policy the page applies (docs/protocol.md §3.4, §11). */\nexport interface RemoteConfig {\n helpButton: boolean\n maskSelectors: string[]\n maskPatterns: { name: string; regex: string }[]\n confirmSelectors: string[]\n networkExclude: string[]\n /** Keep the session log (project policy). */\n sessionLog: boolean\n eruda: ErudaRemote | null\n}\n\nexport interface RunResult {\n deviceCode: string | null\n status: Status\n}\n\nconst CODE_KEY = 'rwd:code'\nconst HELP_KEY = 'rwd:help'\nconst CONTROL_KEY = 'rwd:ctl'\nconst CONFIG_KEY = 'rwd:cfg'\nconst AGENT_LANG_KEY = 'rwd:alang'\nconst CONTROL_TTL = 2 * 60 * 1000\nconst RUN_WAIT_MS = 8000\n\ninterface Session {\n gatewayUrl: string\n appKey: string\n opts: RunOptions\n identity: Identity\n /** Language of the user's UI: the id of the pack in use. */\n lang: string\n transport: Transport\n ui: Ui\n deviceCode: string | null\n label: string | null\n control: ControlState\n /** When the agent attached (local clock), for the connected-for timer; null: none. */\n attachedAt: number | null\n /** Level of the attached agent as the gateway granted it; null: not sent. */\n level: Level | null\n help: boolean\n deviceToken: string | null\n /** The token the last hello carried (a 4401 retry needs a different one). */\n sentToken: string | null\n invite: string | null\n config: RemoteConfig | null\n approvals: Approvals\n eruda: ErudaBridge\n waiters: ((r: RunResult) => void)[]\n}\n\nlet session: Session | null = null\nlet pending: Promise<RunResult> | null = null\n\n/* ---------------------------- always-on pieces ---------------------------- */\n\n// Events wait here until a session is online (they are part of the timeline).\nconst recentEvents: { [key: string]: number } = {}\nlet eventBudget = { start: 0, count: 0 }\n\nfunction emit(kind: EventKind, summary: string) {\n if (!summary) return\n const now = Date.now()\n // Same event within 2 s: once. At most 30 events per 10 s.\n const key = kind + '|' + summary\n if (recentEvents[key] && now - recentEvents[key] < 2000) return\n recentEvents[key] = now\n if (now - eventBudget.start > 10_000) eventBudget = { start: now, count: 0 }\n if (++eventBudget.count > 30) return\n for (const k in recentEvents) if (now - recentEvents[k] > 10_000) delete recentEvents[k]\n if (session) session.transport.send({ t: 'event', kind, summary: scrub(summary), at: now }, true)\n}\n\n// The agent's language as the last welcome set it, so events from before this\n// page's welcome (load errors, failed requests) are already in it.\nsetAgentLang(read('localStorage', AGENT_LANG_KEY))\nstartObserving(emit)\n\n/** The UI language for run({ lang }) / setLang(), else the browser's. */\nfunction uiLang(s: Session) {\n return pickLocale([s.opts.lang].concat(browserLangs()))\n}\n\n/** Show the session's UI in its language, loading the pack if it isn't here yet. */\nfunction applyLang(s: Session) {\n s.lang = uiLang(s)\n setActionLang(s.lang)\n s.ui.setText(messagesOf(s.lang).ui, s.lang, dirOf(s.lang))\n void ensureLocale(s.lang, s.gatewayUrl)\n}\n\n// A pack arrived (or an override): the chosen language may change or get its text.\nonLocalesChange(() => {\n if (session) applyLang(session)\n})\n\nlet lockApi: ReturnType<typeof createLock> | null = null\nlet uiRef: Ui | null = null\nfunction lock() {\n if (!lockApi) lockApi = createLock(e => !!uiRef && uiRef.isOwnControl(e))\n return lockApi\n}\n// Install the lock listeners now, before the page adds its own.\nlock()\n\nlet pageWatcher: ReturnType<typeof watchPage> | null = null\nfunction watch() {\n if (pageWatcher) return\n pageWatcher = watchPage({\n onChange: page => {\n if (session) session.transport.send({ t: 'page', ...page })\n },\n onTap: summary => {\n if (session) noteTap(session.identity.pageId)\n emit('user_tap', summary)\n },\n })\n}\n\n/* --------------------------------- helpers -------------------------------- */\n\nfunction platform(): 'ios' | 'android' | 'web' {\n const ua = navigator.userAgent\n if (/iPhone|iPad|iPod/.test(ua) || (/Macintosh/.test(ua) && navigator.maxTouchPoints > 1)) return 'ios'\n if (/Android/.test(ua)) return 'android'\n return 'web'\n}\n\nfunction deviceInfo(opts: RunOptions) {\n return {\n ua: navigator.userAgent,\n platform: platform(),\n screen: {\n w: window.screen ? screen.width : window.innerWidth,\n h: window.screen ? screen.height : window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n app: opts.app && opts.app.name ? { name: String(opts.app.name), version: String(opts.app.version || '') } : null,\n }\n}\n\nfunction endpoints(gatewayUrl: string, appKey: string) {\n const base = new URL(gatewayUrl.replace(/\\/+$/, '') + '/', location.href)\n if (base.protocol !== 'https:' && base.protocol !== 'http:') throw new Error('gatewayUrl must be http(s)')\n const ws = new URL('page', base)\n ws.protocol = base.protocol === 'https:' ? 'wss:' : 'ws:'\n ws.searchParams.set('key', appKey)\n return { wsUrl: ws.href, presenceUrl: new URL('presence', base).href }\n}\n\nfunction linkStatus(): Status {\n return session ? session.transport.state : 'idle'\n}\n\nfunction result(): RunResult {\n return { deviceCode: session ? session.deviceCode : null, status: linkStatus() }\n}\n\nfunction resolveWaiters() {\n if (!session) return\n const waiters = session.waiters\n session.waiters = []\n for (const w of waiters) w(result())\n}\n\nfunction storedControl(): { state: ControlState; since: number | null } | null {\n try {\n const saved = JSON.parse(read('localStorage', CONTROL_KEY) || 'null')\n if (saved && attached(saved.s) && Date.now() - saved.at < CONTROL_TTL) {\n return { state: saved.s, since: typeof saved.since === 'number' ? saved.since : null }\n }\n } catch (e) {\n // Ignore.\n }\n return null\n}\n\n/** An agent is attached and the user has not taken over: the page locks. */\nfunction attached(state: unknown): state is ControlState {\n return state === 'observe' || state === 'agent'\n}\n\nfunction applyLock(s: Session) {\n lock().set(attached(s.control) && s.ui.lockScreen())\n}\n\nfunction setLevel(s: Session, level: unknown) {\n s.level = level == null ? null : toLevel(level)\n}\n\nfunction agentName(control: any): string | undefined {\n return control && control.agent && typeof control.agent.name === 'string' ? control.agent.name : undefined\n}\n\nfunction applyControl(s: Session, state: ControlState, agent?: string, attachedMs?: unknown) {\n // The user took over or the agent left: nobody to ask on its behalf.\n if (state === 'user' || state === 'none') s.approvals.cancelConfirm()\n if (state === 'none') s.level = null\n if (state !== s.control) logRecord('control', { state, agent: agent || null }, true)\n // When the agent attached: from the gateway's attachedMs (no clock in\n // common needed), else from when this page first saw it.\n if (state === 'none') s.attachedAt = null\n else if (typeof attachedMs === 'number' && attachedMs >= 0) s.attachedAt = Date.now() - attachedMs\n else if (s.attachedAt == null) s.attachedAt = Date.now()\n s.control = state\n s.ui.setControl(state, agent, s.attachedAt)\n // Locked from the moment the agent attaches, not only while it acts.\n applyLock(s)\n write('localStorage', CONTROL_KEY, JSON.stringify({ s: state, at: Date.now(), since: s.attachedAt }))\n}\n\n/** Level the page enforces: as granted; an agent without one (a phase 1 gateway) interacts. */\nfunction grantedLevel(s: Session): Level | null {\n if (s.level) return s.level\n return s.control === 'none' ? null : 'interact'\n}\n\nfunction list(v: any): string[] {\n return Array.isArray(v) ? v.filter((x: any) => typeof x === 'string') : []\n}\n\nfunction readConfig(raw: any): RemoteConfig {\n return {\n helpButton: !!raw.helpButton,\n maskSelectors: list(raw.maskSelectors),\n maskPatterns: Array.isArray(raw.maskPatterns)\n ? raw.maskPatterns\n .filter((p: any) => p && typeof p.regex === 'string')\n .map((p: any) => ({ name: String(p.name || ''), regex: p.regex }))\n : [],\n confirmSelectors: list(raw.confirmSelectors),\n networkExclude: list(raw.networkExclude),\n sessionLog: raw.sessionLog !== false,\n eruda: raw.eruda && typeof raw.eruda === 'object' ? { dock: !!raw.eruda.dock, load: !!raw.eruda.load } : null,\n }\n}\n\nfunction applyConfig(s: Session, config: RemoteConfig | null) {\n s.config = config\n setMaskRules(config ? config.maskSelectors : [], config ? config.maskPatterns : [])\n setConfirmSelectors(config ? config.confirmSelectors : [])\n setNetworkExclude(list(s.opts.networkExclude).concat(config ? config.networkExclude : []))\n // The project turned the session log off: also delete what this origin kept.\n if (config && !config.sessionLog) void stopLog(true)\n s.ui.setHelpButton(!!s.opts.helpButton || (!!config && config.helpButton))\n if (s.ui.host.isConnected) s.eruda.apply(resolveEruda(s.opts.eruda, config && config.eruda))\n}\n\nfunction currentToken(s: Session): string | null {\n return s.opts.deviceToken || read('localStorage', TOKEN_KEY) || null\n}\n\nfunction linkView(state: LinkState) {\n if (state === 'online') return 'online'\n return state === 'polling' || state === 'rejected' || state === 'quota' ? 'offline' : 'connecting'\n}\n\n/* ---------------------------------- RPCs ---------------------------------- */\n\nasync function onRpc(s: Session, msg: { id: number; method: string; params?: any }) {\n let reply: object\n try {\n const needed = requiredLevel(msg.method)\n const granted = grantedLevel(s)\n if (needed && granted && !levelAllows(granted, needed)) {\n throw new RwdError('forbidden', agentText().needLevel(needed))\n }\n if (s.control === 'user' && INTERACTIVE_METHODS.indexOf(msg.method) >= 0) {\n throw new RwdError('takeover', agentText().takenOver)\n }\n if (msg.method === 'rwd.click') noteTap(s.identity.pageId)\n const res = await callMethod(msg.method, msg.params, {\n highlight: el => s.ui.highlight(el),\n pointer: (p, kind) => s.ui.pointer(p.x, p.y, kind),\n confirm: action => s.approvals.confirm(action),\n })\n reply = { id: msg.id, result: res === undefined ? {} : res }\n } catch (e) {\n reply = { id: msg.id, error: toRpcError(e) }\n }\n logAgentAction(msg.method, msg.params, reply)\n if (session === s) s.transport.send(reply)\n}\n\n/** What the agent did, for the session log (reads are left out). */\nfunction logAgentAction(method: string, params: any, reply: any) {\n if (INTERACTIVE_METHODS.indexOf(method) < 0 && method !== 'rwd.evaluate') return\n const p = params && typeof params === 'object' ? params : {}\n const data: { [key: string]: unknown } = { method }\n for (const key of ['ref', 'fromRef', 'toRef', 'key', 'url', 'values']) if (p[key] !== undefined) data[key] = p[key]\n if (typeof p.value === 'string' || typeof p.text === 'string') data.text = scrub(String(p.value ?? p.text)).slice(0, 200)\n if (reply.error) data.error = `${reply.error.code}: ${reply.error.message}`\n logRecord('agent', data, true)\n}\n\nfunction onMessage(s: Session, msg: any) {\n if (typeof msg.id === 'number' && typeof msg.method === 'string') {\n onRpc(s, msg)\n return\n }\n switch (msg.t) {\n case 'welcome':\n // First: sibling tabs of a new device pick the token up from here.\n if (typeof msg.deviceToken === 'string' && msg.deviceToken) {\n s.deviceToken = msg.deviceToken\n write('localStorage', TOKEN_KEY, msg.deviceToken)\n }\n writeResume(s.identity.pageId, typeof msg.resume === 'string' ? msg.resume : null)\n // Language of what we send the agent; a gateway without it gets English.\n if (typeof msg.agentLang === 'string') {\n setAgentLang(msg.agentLang, s.gatewayUrl)\n write('localStorage', AGENT_LANG_KEY, msg.agentLang)\n }\n if (s.invite) {\n s.invite = null\n clearInvite()\n }\n if (msg.config && typeof msg.config === 'object') {\n const config = readConfig(msg.config)\n applyConfig(s, config)\n write('localStorage', CONFIG_KEY, JSON.stringify(config))\n }\n if (msg.deviceCode) {\n s.deviceCode = String(msg.deviceCode)\n write('localStorage', CODE_KEY, s.deviceCode)\n }\n s.label = msg.label || null\n s.ui.setLink('online', s.deviceCode || undefined)\n setLevel(s, msg.level != null ? msg.level : msg.control && msg.control.level)\n applyControl(s, (msg.control && msg.control.state) || 'none', agentName(msg.control), msg.control && msg.control.attachedMs)\n s.ui.setTask(msg.task || null)\n storeHelp(s, !!msg.help)\n resolveWaiters()\n break\n case 'task':\n s.ui.setTask(msg.task || null)\n break\n case 'control':\n setLevel(s, msg.level)\n applyControl(s, msg.state || 'none', agentName(msg), msg.attachedMs)\n break\n case 'attach_request':\n s.approvals.onAttachRequest(msg)\n break\n case 'attach_cancel':\n s.approvals.onAttachCancel(String(msg.requestId))\n break\n case 'help':\n storeHelp(s, !!msg.on)\n break\n }\n}\n\n/* ------------------------------- public API ------------------------------- */\n\n/**\n * Bring this page online for remote debugging. Resolves with the device code\n * once the gateway has answered (or after a few seconds with what is known).\n * Calling it again is harmless.\n */\nexport function run(gatewayUrl: string, appKey: string, opts: RunOptions = {}): Promise<RunResult> {\n if (pending) return pending\n if (typeof gatewayUrl !== 'string' || !gatewayUrl) return Promise.reject(new Error('RemoteWebviewDebugger.run: gatewayUrl is required'))\n if (typeof appKey !== 'string' || !appKey) return Promise.reject(new Error('RemoteWebviewDebugger.run: appKey is required'))\n let urls: { wsUrl: string; presenceUrl: string }\n try {\n urls = endpoints(gatewayUrl, appKey)\n } catch (e) {\n return Promise.reject(e)\n }\n\n // Before watch(): taking the invite out of the URL is not a navigation.\n const invite = takeInvite()\n watch()\n const identity = resolveIdentity(opts.deviceId)\n if (opts.locales) registerLocale(opts.locales)\n if (opts.messages) overrideMessages(opts.messages)\n const lang = pickLocale([opts.lang].concat(browserLangs()))\n // Sensitive-action descriptions (\"AI wants to …\") come from the engine.\n setActionLang(lang)\n const ui = new Ui({\n lang,\n dir: dirOf(lang),\n text: messagesOf(lang).ui,\n style: opts.style,\n helpButton: !!opts.helpButton,\n lockScreen: opts.lockScreen !== false,\n theme: opts.theme,\n onSettings: () => {\n if (session) applyLock(session)\n },\n onHelp: on => setHelp(on),\n onControl: action => {\n if (session) session.transport.send({ t: 'control', action }, true)\n },\n })\n uiRef = ui\n\n const s: Session = {\n gatewayUrl,\n appKey,\n opts: { ...opts },\n identity,\n lang,\n ui,\n deviceCode: read('localStorage', CODE_KEY),\n label: null,\n control: 'none',\n attachedAt: null,\n level: null,\n // Help is per device and survives navigation; the gateway has the last word.\n help: read('localStorage', HELP_KEY) === '1',\n deviceToken: null,\n sentToken: null,\n invite,\n config: null,\n waiters: [],\n transport: null as unknown as Transport,\n approvals: null as unknown as Approvals,\n eruda: new ErudaBridge(ui),\n }\n s.deviceToken = currentToken(s)\n s.approvals = new Approvals({\n ui,\n native: !!opts.nativeApproval,\n send: msg => s.transport.send(msg, true),\n })\n setNetworkExclude(list(opts.networkExclude))\n // The last project config until the welcome brings the current one.\n try {\n const saved = JSON.parse(read('localStorage', CONFIG_KEY) || 'null')\n if (saved && typeof saved === 'object') applyConfig(s, readConfig(saved))\n } catch (e) {\n // Ignore malformed data.\n }\n // Session log: on unless the page or the project (last known config) said no.\n if (opts.record === false) void stopLog(false)\n else if (!s.config || s.config.sessionLog) {\n logRecord('page', { event: 'open', url: scrub(location.href), title: scrub(document.title), referrer: scrub(document.referrer) })\n resolveLaunch(opts.launchId)\n .then(launch => startLog(launch, identity.pageId).then(used => rememberLaunch(launch, used)))\n .catch(() => undefined)\n }\n s.transport = new Transport({\n wsUrl: urls.wsUrl,\n presenceUrl: urls.presenceUrl,\n hello: () => {\n s.sentToken = s.deviceToken = currentToken(s)\n return {\n t: 'hello',\n v: 1,\n sdk: version,\n deviceId: s.identity.deviceId,\n pageId: s.identity.pageId,\n openerId: s.identity.openerId,\n userId: s.opts.userId == null ? null : String(s.opts.userId),\n page: currentPage(),\n device: deviceInfo(s.opts),\n help: s.help,\n deviceToken: s.sentToken,\n resume: readResume(s.identity.pageId),\n invite: s.invite,\n }\n },\n presence: () => ({\n key: s.appKey,\n deviceId: s.identity.deviceId,\n pageId: s.identity.pageId,\n page: currentPage(),\n device: deviceInfo(s.opts),\n userId: s.opts.userId == null ? null : String(s.opts.userId),\n help: s.help,\n deviceToken: currentToken(s),\n }),\n onMessage: msg => onMessage(s, msg),\n onState: state => {\n s.ui.setLink(linkView(state), s.deviceCode || undefined)\n // An RPC reply cannot reach the agent any more.\n if (state !== 'online') s.approvals.cancelConfirm()\n if (state === 'polling' || state === 'stopped' || state === 'rejected' || state === 'quota') {\n // No live gateway: no agent can be acting.\n if (s.control !== 'none') applyControl(s, 'none')\n }\n if (state === 'stopped' || state === 'rejected' || state === 'quota') resolveWaiters()\n },\n onRejected: () => {\n const token = currentToken(s)\n return !!token && token !== s.sentToken\n },\n onConflict: () => renewPageId(s.identity),\n onPresence: res => {\n if (res.deviceCode) {\n s.deviceCode = String(res.deviceCode)\n write('localStorage', CODE_KEY, s.deviceCode)\n s.ui.setLink('offline', s.deviceCode)\n }\n resolveWaiters()\n },\n })\n session = s\n\n ui.setLink('connecting', s.deviceCode || undefined)\n ui.setHelp(s.help)\n ui.mount()\n // Not bundled (only en and zh are): shown in its fallback until it loads.\n void ensureLocale(lang, gatewayUrl)\n s.eruda.apply(resolveEruda(s.opts.eruda, s.config && s.config.eruda))\n // An agent was attached a moment ago (we navigated): lock right away and\n // let the welcome confirm or release it.\n const stored = storedControl()\n if (stored) {\n s.attachedAt = stored.since\n applyControl(s, stored.state)\n setTimeout(() => {\n if (session === s && attached(s.control) && !s.transport.isOnline()) applyControl(s, 'none')\n }, RUN_WAIT_MS)\n }\n\n pending = new Promise<RunResult>(resolve => {\n s.waiters.push(resolve)\n setTimeout(() => resolveWaiters(), RUN_WAIT_MS)\n })\n ensureUniquePage(identity).then(() => {\n if (session === s) s.transport.start()\n })\n return pending\n}\n\nfunction onPageHide(e: PageTransitionEvent) {\n if (!session) return\n // Close now: the gateway learns right away, and an open WebSocket would keep\n // the page out of the bfcache. Not stop(): that would also clear the stored\n // control state the next page needs to lock without a gap.\n void e\n logRecord('page', { event: 'hide' })\n flushLog()\n session.transport.suspend()\n}\n\nfunction onPageShow(e: PageTransitionEvent) {\n if (session && e.persisted) session.transport.resume()\n}\n\nwindow.addEventListener('pagehide', onPageHide)\nwindow.addEventListener('pageshow', onPageShow)\n\n/** Current state: device code, link status, control state. */\nexport function getStatus() {\n const s = session\n return {\n deviceCode: s ? s.deviceCode : read('localStorage', CODE_KEY),\n status: linkStatus(),\n control: s ? s.control : ('none' as ControlState),\n help: s ? s.help : false,\n label: s ? s.label : null,\n deviceId: s ? s.identity.deviceId : null,\n pageId: s ? s.identity.pageId : null,\n version,\n lang: s ? s.lang : null,\n deviceToken: s ? s.deviceToken : read('localStorage', TOKEN_KEY),\n level: s ? grantedLevel(s) : null,\n config: s ? s.config : null,\n pending: s ? s.approvals.pending() : null,\n /** Id of the session log this page writes to; null when not recording. */\n logSession: currentSession() || null,\n }\n}\nexport { getStatus as status }\n\n/** Disconnect and remove the UI. Console / network collection continues (bounded). */\nexport function stop() {\n const s = session\n if (!s) return\n session = null\n pending = null\n uiRef = null\n s.transport.stop()\n s.approvals.destroy()\n s.ui.unmount()\n lock().set(false)\n resolveWaitersOf(s)\n}\n\nfunction resolveWaitersOf(s: Session) {\n const waiters = s.waiters\n s.waiters = []\n for (const w of waiters) w({ deviceCode: s.deviceCode, status: 'stopped' })\n}\n\n/**\n * Change the UI language at runtime (an app's own language switch): a tag\n * like run({ lang }), or nothing to follow the browser again.\n */\nexport function setLang(lang?: string | null) {\n const s = session\n if (!s) return\n s.opts.lang = lang || undefined\n applyLang(s)\n}\n\n/** Add language packs, or replace one with the same id: RemoteWebviewDebugger.registerLocale({ id: 'it', name: 'Italiano', ui: { … } }). */\nexport { registerLocale }\n\n/** The languages that ship with the SDK (all but en and zh load on demand). */\nexport const builtinLocales: string[] = BUILTIN_LOCALES.slice()\n\nexport type {\n ActionMessages,\n AgentMessages,\n DeepPartial,\n Locale,\n LocalePack,\n MessageOverrides,\n Messages,\n UiMessages,\n} from './i18n'\nexport type { StyleOptions } from './ui'\n\n/** Set or change the signed-in user. The gateway learns it through a new hello. */\nexport function setUser(userId: string | null) {\n const s = session\n const value = userId == null || userId === '' ? null : String(userId)\n if (!s) return\n if ((s.opts.userId == null ? null : String(s.opts.userId)) === value) return\n s.opts.userId = value\n if (s.transport.state !== 'stopped') s.transport.restart()\n}\n\nfunction storeHelp(s: Session, on: boolean) {\n s.help = on\n s.ui.setHelp(on)\n write('localStorage', HELP_KEY, on ? '1' : null)\n}\n\nfunction setHelp(on: boolean) {\n const s = session\n if (!s) return\n storeHelp(s, !!on)\n // Offline: the next hello / presence call carries it.\n s.transport.send({ t: 'help', on: s.help }, false)\n}\n\n/** Request assistance (the pill shows it; the console and agents see the device as assisting), or cancel the request. */\nexport function help(on = true) {\n setHelp(on)\n}\n\n/**\n * Take over, hand back or end from the native host's own UI. Requires the\n * nativeKey given to run(): page scripts, including an agent's\n * evaluate_script, cannot read it, so they cannot hand control to the agent.\n */\nexport function nativeControl(key: string, action: 'takeover' | 'handback' | 'end'): boolean {\n const s = session\n if (!s || !keyMatches(s, key) || (action !== 'takeover' && action !== 'handback' && action !== 'end')) return false\n s.transport.send({ t: 'control', action }, true)\n return true\n}\n\n/**\n * Answer status().pending from the native host's own dialog: a level (or null\n * to refuse) for `attach`, 'allow' (or null) for `confirm`. Requires the\n * nativeKey, like nativeControl(). False when the key, request or value is wrong.\n */\nexport function nativeDecide(key: string, requestId: string, value: string | null): boolean {\n const s = session\n if (!s || !keyMatches(s, key) || typeof requestId !== 'string') return false\n return s.approvals.decide(requestId, value == null ? null : String(value))\n}\n\nfunction keyMatches(s: Session, key: string) {\n const expected = s.opts.nativeKey\n if (!expected || typeof key !== 'string' || key.length !== expected.length) return false\n let diff = 0\n for (let i = 0; i < key.length; i++) diff |= key.charCodeAt(i) ^ expected.charCodeAt(i)\n return diff === 0\n}\n"],"ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,74,75,80,81,82,83,84,85,96],"mappings":"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"}