wu-framework 1.2.1 → 2.1.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 (155) hide show
  1. package/README.md +99 -18
  2. package/dist/adapters/alpine/index.js +2 -0
  3. package/dist/adapters/alpine/index.js.map +1 -0
  4. package/dist/adapters/angular/index.js +2 -0
  5. package/dist/adapters/angular/index.js.map +1 -0
  6. package/dist/adapters/htmx/index.js +2 -0
  7. package/dist/adapters/htmx/index.js.map +1 -0
  8. package/dist/adapters/index.js +2 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/lit/index.js +44 -0
  11. package/dist/adapters/lit/index.js.map +1 -0
  12. package/dist/adapters/preact/index.js +2 -0
  13. package/dist/adapters/preact/index.js.map +1 -0
  14. package/dist/adapters/qwik/index.js +2 -0
  15. package/dist/adapters/qwik/index.js.map +1 -0
  16. package/dist/adapters/react/index.js +2 -0
  17. package/dist/adapters/react/index.js.map +1 -0
  18. package/dist/adapters/shared.js +2 -0
  19. package/dist/adapters/shared.js.map +1 -0
  20. package/dist/adapters/solid/index.js +2 -0
  21. package/dist/adapters/solid/index.js.map +1 -0
  22. package/dist/adapters/stencil/index.js +2 -0
  23. package/dist/adapters/stencil/index.js.map +1 -0
  24. package/dist/adapters/stimulus/index.js +2 -0
  25. package/dist/adapters/stimulus/index.js.map +1 -0
  26. package/dist/adapters/svelte/index.js +2 -0
  27. package/dist/adapters/svelte/index.js.map +1 -0
  28. package/dist/adapters/vanilla/index.js +2 -0
  29. package/dist/adapters/vanilla/index.js.map +1 -0
  30. package/dist/adapters/vue/index.js +2 -0
  31. package/dist/adapters/vue/index.js.map +1 -0
  32. package/dist/ai/wu-ai.js +2 -0
  33. package/dist/ai/wu-ai.js.map +1 -0
  34. package/dist/core/wu-mcp-bridge.js +2 -0
  35. package/dist/core/wu-mcp-bridge.js.map +1 -0
  36. package/{src → dist}/index.d.ts +445 -317
  37. package/dist/wu-ai-browser-primitives-BDKXJlwc.js +2 -0
  38. package/dist/wu-ai-browser-primitives-BDKXJlwc.js.map +1 -0
  39. package/dist/wu-framework.cjs.js +2 -2
  40. package/dist/wu-framework.cjs.js.map +1 -1
  41. package/dist/wu-framework.dev.js +2640 -9197
  42. package/dist/wu-framework.dev.js.map +1 -1
  43. package/dist/wu-framework.esm.js +2 -2
  44. package/dist/wu-framework.esm.js.map +1 -1
  45. package/dist/wu-framework.umd.js +2 -2
  46. package/dist/wu-framework.umd.js.map +1 -1
  47. package/dist/wu-html-parser.js +2 -0
  48. package/dist/wu-html-parser.js.map +1 -0
  49. package/dist/wu-iframe-sandbox.js +2 -0
  50. package/dist/wu-iframe-sandbox.js.map +1 -0
  51. package/dist/wu-logger-fJfUHBGA.js +2 -0
  52. package/dist/wu-logger-fJfUHBGA.js.map +1 -0
  53. package/dist/wu-script-executor.js +2 -0
  54. package/dist/wu-script-executor.js.map +1 -0
  55. package/package.json +43 -34
  56. package/src/adapters/alpine/index.js +0 -231
  57. package/src/adapters/alpine.js +0 -3
  58. package/src/adapters/angular/ai.js +0 -30
  59. package/src/adapters/angular/index.js +0 -932
  60. package/src/adapters/angular.js +0 -3
  61. package/src/adapters/htmx/index.js +0 -242
  62. package/src/adapters/htmx.js +0 -3
  63. package/src/adapters/index.js +0 -225
  64. package/src/adapters/lit/ai.js +0 -20
  65. package/src/adapters/lit/index.js +0 -721
  66. package/src/adapters/lit.js +0 -3
  67. package/src/adapters/preact/ai.js +0 -33
  68. package/src/adapters/preact/index.js +0 -661
  69. package/src/adapters/preact.js +0 -3
  70. package/src/adapters/qwik/index.js +0 -108
  71. package/src/adapters/qwik.js +0 -3
  72. package/src/adapters/react/ai.js +0 -135
  73. package/src/adapters/react/index.js +0 -695
  74. package/src/adapters/react.js +0 -3
  75. package/src/adapters/shared.js +0 -64
  76. package/src/adapters/solid/ai.js +0 -32
  77. package/src/adapters/solid/index.js +0 -586
  78. package/src/adapters/solid.js +0 -3
  79. package/src/adapters/stencil/index.js +0 -228
  80. package/src/adapters/stencil.js +0 -3
  81. package/src/adapters/stimulus/index.js +0 -255
  82. package/src/adapters/stimulus.js +0 -3
  83. package/src/adapters/svelte/ai.js +0 -31
  84. package/src/adapters/svelte/index.js +0 -798
  85. package/src/adapters/svelte.js +0 -3
  86. package/src/adapters/vanilla/ai.js +0 -30
  87. package/src/adapters/vanilla/index.js +0 -785
  88. package/src/adapters/vanilla.js +0 -3
  89. package/src/adapters/vue/ai.js +0 -52
  90. package/src/adapters/vue/index.js +0 -618
  91. package/src/adapters/vue.js +0 -3
  92. package/src/ai/wu-ai-actions.js +0 -261
  93. package/src/ai/wu-ai-agent.js +0 -546
  94. package/src/ai/wu-ai-browser-primitives.js +0 -354
  95. package/src/ai/wu-ai-browser.js +0 -380
  96. package/src/ai/wu-ai-context.js +0 -332
  97. package/src/ai/wu-ai-conversation.js +0 -613
  98. package/src/ai/wu-ai-orchestrate.js +0 -1021
  99. package/src/ai/wu-ai-permissions.js +0 -381
  100. package/src/ai/wu-ai-provider.js +0 -700
  101. package/src/ai/wu-ai-schema.js +0 -225
  102. package/src/ai/wu-ai-triggers.js +0 -396
  103. package/src/ai/wu-ai.js +0 -804
  104. package/src/core/wu-app.js +0 -236
  105. package/src/core/wu-cache.js +0 -498
  106. package/src/core/wu-core.js +0 -1412
  107. package/src/core/wu-error-boundary.js +0 -396
  108. package/src/core/wu-event-bus.js +0 -390
  109. package/src/core/wu-hooks.js +0 -350
  110. package/src/core/wu-html-parser.js +0 -199
  111. package/src/core/wu-iframe-sandbox.js +0 -328
  112. package/src/core/wu-loader.js +0 -450
  113. package/src/core/wu-logger.js +0 -143
  114. package/src/core/wu-manifest.js +0 -533
  115. package/src/core/wu-mcp-bridge.js +0 -432
  116. package/src/core/wu-overrides.js +0 -510
  117. package/src/core/wu-performance.js +0 -228
  118. package/src/core/wu-plugin.js +0 -401
  119. package/src/core/wu-prefetch.js +0 -414
  120. package/src/core/wu-proxy-sandbox.js +0 -477
  121. package/src/core/wu-sandbox.js +0 -779
  122. package/src/core/wu-script-executor.js +0 -161
  123. package/src/core/wu-sentinel-client.js +0 -311
  124. package/src/core/wu-snapshot-sandbox.js +0 -227
  125. package/src/core/wu-store.js +0 -307
  126. package/src/core/wu-strategies.js +0 -256
  127. package/src/core/wu-style-bridge.js +0 -477
  128. package/src/index.js +0 -234
  129. package/src/utils/dependency-resolver.js +0 -328
  130. /package/{src → dist}/adapters/alpine/index.d.ts +0 -0
  131. /package/{src → dist}/adapters/alpine.d.ts +0 -0
  132. /package/{src → dist}/adapters/angular/index.d.ts +0 -0
  133. /package/{src → dist}/adapters/angular.d.ts +0 -0
  134. /package/{src → dist}/adapters/htmx/index.d.ts +0 -0
  135. /package/{src → dist}/adapters/htmx.d.ts +0 -0
  136. /package/{src → dist}/adapters/lit/index.d.ts +0 -0
  137. /package/{src → dist}/adapters/lit.d.ts +0 -0
  138. /package/{src → dist}/adapters/preact/index.d.ts +0 -0
  139. /package/{src → dist}/adapters/preact.d.ts +0 -0
  140. /package/{src → dist}/adapters/qwik/index.d.ts +0 -0
  141. /package/{src → dist}/adapters/qwik.d.ts +0 -0
  142. /package/{src → dist}/adapters/react/index.d.ts +0 -0
  143. /package/{src → dist}/adapters/react.d.ts +0 -0
  144. /package/{src → dist}/adapters/solid/index.d.ts +0 -0
  145. /package/{src → dist}/adapters/solid.d.ts +0 -0
  146. /package/{src → dist}/adapters/stencil/index.d.ts +0 -0
  147. /package/{src → dist}/adapters/stencil.d.ts +0 -0
  148. /package/{src → dist}/adapters/stimulus/index.d.ts +0 -0
  149. /package/{src → dist}/adapters/stimulus.d.ts +0 -0
  150. /package/{src → dist}/adapters/svelte/index.d.ts +0 -0
  151. /package/{src → dist}/adapters/svelte.d.ts +0 -0
  152. /package/{src → dist}/adapters/vanilla/index.d.ts +0 -0
  153. /package/{src → dist}/adapters/vanilla.d.ts +0 -0
  154. /package/{src → dist}/adapters/vue/index.d.ts +0 -0
  155. /package/{src → dist}/adapters/vue.d.ts +0 -0
@@ -0,0 +1,2 @@
1
+ const t=[],e=300,n=[];let o=!1;function i(){o||(!function(){const n=window.fetch;window.fetch=async function(...o){const i=Date.now(),r=o[0],s="string"==typeof r?r:r?.url||"",a=(o[1]?.method||r?.method||"GET").toUpperCase();try{const r=await n.apply(window,o),l=parseInt(r.headers?.get("content-length")||"0",10);return t.push({type:"fetch",method:a,url:s,status:r.status,statusText:r.statusText,duration:Date.now()-i,size:l,timestamp:i}),t.length>e&&t.shift(),r}catch(n){throw t.push({type:"fetch",method:a,url:s,status:0,error:n.message,duration:Date.now()-i,timestamp:i}),t.length>e&&t.shift(),n}};const o=XMLHttpRequest.prototype.open,i=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(t,e,...n){return this._wuAi={method:(t||"GET").toUpperCase(),url:String(e)},o.call(this,t,e,...n)},XMLHttpRequest.prototype.send=function(...n){return this._wuAi&&(this._wuAi.start=Date.now(),this.addEventListener("loadend",()=>{t.push({type:"xhr",method:this._wuAi.method,url:this._wuAi.url,status:this.status,statusText:this.statusText,duration:Date.now()-this._wuAi.start,size:parseInt(this.getResponseHeader("content-length")||"0",10),timestamp:this._wuAi.start}),t.length>e&&t.shift()})),i.apply(this,n)}}(),function(){const t=["log","warn","error"];for(const e of t){const t=console[e];console[e]=(...o)=>{n.push({level:e,message:o.map(t=>"object"==typeof t?JSON.stringify(t):String(t)).join(" "),timestamp:Date.now()}),n.length>500&&n.shift(),t.apply(console,o)}}}(),o=!0)}function r(t,e=0,n=5){if(e>n||!t)return"";const o=" ".repeat(e),i=t.tagName?.toLowerCase()||"",s=t.getAttribute?.("role")||"",a=t.getAttribute?.("aria-label")||"",l=1===t.childNodes?.length&&3===t.childNodes[0].nodeType?t.textContent?.trim().slice(0,80):"";let c=`${o}<${i}`;if(t.id&&(c+=` id="${t.id}"`),s&&(c+=` role="${s}"`),a&&(c+=` aria-label="${a}"`),t.className&&"string"==typeof t.className){const e=t.className.trim().slice(0,60);e&&(c+=` class="${e}"`)}c+=">",l&&(c+=` "${l}"`);let u=c+"\n";const h=(t.shadowRoot||t).children||[];for(let t=0;t<h.length&&t<50;t++)u+=r(h[t],e+1,n);return u}function s(t,e){const n=["color","background","background-color","font-family","font-size","font-weight","border","border-radius","padding","margin","display","flex-direction","align-items","justify-content","gap","width","height","max-width","max-height","overflow","opacity","box-shadow","text-align","line-height","position","top","left","right","bottom","z-index","transform","visibility"];try{const o=window.getComputedStyle(t);for(const t of n){const n=o.getPropertyValue(t);n&&e.style?.setProperty(t,n)}}catch(t){}const o=t.children||[],i=e.children||[],r=Math.min(o.length,i.length,200);for(let t=0;t<r;t++)s(o[t],i[t])}async function a(t,e=.8){const n=t?document.querySelector(t):document.documentElement;if(!n)return{error:`Element not found: ${t}`};const o=n.getBoundingClientRect(),i=Math.ceil(Math.min(o.width||window.innerWidth,1920)),r=Math.ceil(Math.min(o.height||window.innerHeight,1080)),a=n.cloneNode(!0);s(n,a);const l=(new XMLSerializer).serializeToString(a),c=[`<svg xmlns="http://www.w3.org/2000/svg" width="${i}" height="${r}">`,'<foreignObject width="100%" height="100%">',`<div xmlns="http://www.w3.org/1999/xhtml" style="width:${i}px;height:${r}px;overflow:hidden;">`,l,"</div>","</foreignObject>","</svg>"].join(""),u=new Blob([c],{type:"image/svg+xml;charset=utf-8"}),h=URL.createObjectURL(u),d=await new Promise(t=>{const n=new Image;n.onload=()=>{const o=document.createElement("canvas");o.width=i,o.height=r;o.getContext("2d").drawImage(n,0,0),URL.revokeObjectURL(h),t(o.toDataURL("image/png",e))},n.onerror=()=>{URL.revokeObjectURL(h),t(null)},n.src=h});if(!d)return{error:"Canvas rendering failed"};const p=d.split(",")[1];return{width:i,height:r,format:"png",base64:p,sizeKB:Math.round(3*p.length/4/1024)}}function l(t,e){let n=null;if(t&&(n=document.querySelector(t)),!n&&e){const t=document.querySelectorAll('button, a, [role="button"], input[type="submit"], input[type="button"], [data-click], label, [onclick]'),o=e.toLowerCase();for(const e of t)if(e.textContent?.trim().toLowerCase().includes(o)){n=e;break}}if(!n)return{error:`Element not found: ${t||`text="${e}"`}`};n.scrollIntoView({behavior:"instant",block:"center"}),n.click();const o=n.tagName?.toLowerCase();return{clicked:`${o}${n.id?`#${n.id}`:""}`,text:n.textContent?.trim().slice(0,100)||"",rect:n.getBoundingClientRect().toJSON?.()||null}}function c(t,e,{clear:n=!1,submit:o=!1}={}){if(!t)return{error:"selector is required"};if(void 0===e)return{error:"text is required"};const i=document.querySelector(t);if(!i)return{error:`Element not found: ${t}`};i.focus(),n&&(i.value="",i.dispatchEvent(new Event("input",{bubbles:!0})));const r=Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype,"value")?.set||Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype,"value")?.set,s=n?e:(i.value||"")+e;if(r?r.call(i,s):i.value=s,i.dispatchEvent(new Event("input",{bubbles:!0})),i.dispatchEvent(new Event("change",{bubbles:!0})),o){const t=i.closest("form");t?t.dispatchEvent(new Event("submit",{bubbles:!0,cancelable:!0})):i.dispatchEvent(new KeyboardEvent("keydown",{key:"Enter",code:"Enter",bubbles:!0}))}return{selector:t,typed:e,currentValue:i.value?.slice(0,200),submitted:!!o}}function u(e,n,o=30){let i=t;return e&&(i=i.filter(t=>t.method===e.toUpperCase())),n&&(i="error"===n?i.filter(t=>0===t.status||t.status>=400):i.filter(t=>String(t.status).startsWith(String(n)))),{requests:i.slice(-o),total:t.length,showing:Math.min(i.length,o)}}function h(t,e=30){const o=t&&"all"!==t?n.filter(e=>e.level===t):n;return{messages:o.slice(-e),total:n.length,showing:Math.min(o.length,e)}}export{a,r as b,l as c,h as d,i as e,n as f,u as g,t as n,c as t};
2
+ //# sourceMappingURL=wu-ai-browser-primitives-BDKXJlwc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wu-ai-browser-primitives-BDKXJlwc.js","sources":["../src/ai/wu-ai-browser-primitives.js"],"sourcesContent":["/**\r\n * WU-AI Browser Primitives\r\n *\r\n * Shared browser capabilities used by both wu-ai-browser.js (Paradigm 1/2)\r\n * and wu-mcp-bridge.js (Paradigm 3). Single source of truth to avoid\r\n * duplicating interceptors, DOM traversal, and Canvas rendering.\r\n */\r\n\r\n// ── Shared capture buffers (singleton) ──\r\n\r\nexport const networkLog = [];\r\nexport const MAX_NETWORK_LOG = 300;\r\nexport const consoleLog = [];\r\nexport const MAX_CONSOLE_LOG = 500;\r\n\r\nlet _interceptorsInstalled = false;\r\n\r\n/**\r\n * Install network + console interceptors (idempotent — only runs once).\r\n */\r\nexport function ensureInterceptors() {\r\n if (_interceptorsInstalled) return;\r\n _installNetworkInterceptor();\r\n _installConsoleInterceptor();\r\n _interceptorsInstalled = true;\r\n}\r\n\r\n/**\r\n * Build an accessibility tree representation of a DOM element.\r\n * Traverses into Shadow DOM if present.\r\n */\r\nexport function buildA11yTree(el, depth = 0, maxDepth = 5) {\r\n if (depth > maxDepth || !el) return '';\r\n\r\n const indent = ' '.repeat(depth);\r\n const tag = el.tagName?.toLowerCase() || '';\r\n const role = el.getAttribute?.('role') || '';\r\n const ariaLabel = el.getAttribute?.('aria-label') || '';\r\n const text = el.childNodes?.length === 1 && el.childNodes[0].nodeType === 3\r\n ? el.textContent?.trim().slice(0, 80) : '';\r\n\r\n let line = `${indent}<${tag}`;\r\n if (el.id) line += ` id=\"${el.id}\"`;\r\n if (role) line += ` role=\"${role}\"`;\r\n if (ariaLabel) line += ` aria-label=\"${ariaLabel}\"`;\r\n if (el.className && typeof el.className === 'string') {\r\n const cls = el.className.trim().slice(0, 60);\r\n if (cls) line += ` class=\"${cls}\"`;\r\n }\r\n line += '>';\r\n if (text) line += ` \"${text}\"`;\r\n\r\n let result = line + '\\n';\r\n const root = el.shadowRoot || el;\r\n const children = root.children || [];\r\n\r\n for (let i = 0; i < children.length && i < 50; i++) {\r\n result += buildA11yTree(children[i], depth + 1, maxDepth);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Recursively inline computed styles from source to clone for Canvas rendering.\r\n */\r\nexport function inlineComputedStyles(source, clone) {\r\n const props = ['color', 'background', 'background-color', 'font-family',\r\n 'font-size', 'font-weight', 'border', 'border-radius', 'padding', 'margin',\r\n 'display', 'flex-direction', 'align-items', 'justify-content', 'gap',\r\n 'width', 'height', 'max-width', 'max-height', 'overflow', 'opacity',\r\n 'box-shadow', 'text-align', 'line-height', 'position', 'top', 'left',\r\n 'right', 'bottom', 'z-index', 'transform', 'visibility'];\r\n\r\n try {\r\n const style = window.getComputedStyle(source);\r\n for (const prop of props) {\r\n const val = style.getPropertyValue(prop);\r\n if (val) clone.style?.setProperty(prop, val);\r\n }\r\n } catch (_) { /* skip */ }\r\n\r\n const srcKids = source.children || [];\r\n const cloneKids = clone.children || [];\r\n const max = Math.min(srcKids.length, cloneKids.length, 200);\r\n for (let i = 0; i < max; i++) {\r\n inlineComputedStyles(srcKids[i], cloneKids[i]);\r\n }\r\n}\r\n\r\n/**\r\n * Capture a screenshot of a DOM element via Canvas API (SVG foreignObject).\r\n * @returns {Promise<{ width, height, format, base64, sizeKB } | { error: string }>}\r\n */\r\nexport async function captureScreenshot(selector, quality = 0.8) {\r\n const target = selector\r\n ? document.querySelector(selector)\r\n : document.documentElement;\r\n\r\n if (!target) return { error: `Element not found: ${selector}` };\r\n\r\n const rect = target.getBoundingClientRect();\r\n const w = Math.ceil(Math.min(rect.width || window.innerWidth, 1920));\r\n const h = Math.ceil(Math.min(rect.height || window.innerHeight, 1080));\r\n\r\n const clone = target.cloneNode(true);\r\n inlineComputedStyles(target, clone);\r\n\r\n const serializer = new XMLSerializer();\r\n const xhtml = serializer.serializeToString(clone);\r\n\r\n const svgStr = [\r\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\">`,\r\n '<foreignObject width=\"100%\" height=\"100%\">',\r\n `<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"width:${w}px;height:${h}px;overflow:hidden;\">`,\r\n xhtml,\r\n '</div>',\r\n '</foreignObject>',\r\n '</svg>',\r\n ].join('');\r\n\r\n const svgBlob = new Blob([svgStr], { type: 'image/svg+xml;charset=utf-8' });\r\n const url = URL.createObjectURL(svgBlob);\r\n\r\n const dataUrl = await new Promise((resolve) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = w;\r\n canvas.height = h;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0);\r\n URL.revokeObjectURL(url);\r\n resolve(canvas.toDataURL('image/png', quality));\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n resolve(null);\r\n };\r\n img.src = url;\r\n });\r\n\r\n if (!dataUrl) return { error: 'Canvas rendering failed' };\r\n\r\n const base64 = dataUrl.split(',')[1];\r\n return {\r\n width: w,\r\n height: h,\r\n format: 'png',\r\n base64,\r\n sizeKB: Math.round((base64.length * 3) / 4 / 1024),\r\n };\r\n}\r\n\r\n/**\r\n * Click an element by CSS selector or visible text content.\r\n * @returns {{ clicked, text } | { error }}\r\n */\r\nexport function clickElement(selector, text) {\r\n let el = null;\r\n\r\n if (selector) {\r\n el = document.querySelector(selector);\r\n }\r\n\r\n if (!el && text) {\r\n const candidates = document.querySelectorAll(\r\n 'button, a, [role=\"button\"], input[type=\"submit\"], input[type=\"button\"], [data-click], label, [onclick]'\r\n );\r\n const searchText = text.toLowerCase();\r\n for (const candidate of candidates) {\r\n if (candidate.textContent?.trim().toLowerCase().includes(searchText)) {\r\n el = candidate;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!el) return { error: `Element not found: ${selector || `text=\"${text}\"`}` };\r\n\r\n el.scrollIntoView({ behavior: 'instant', block: 'center' });\r\n el.click();\r\n\r\n const tag = el.tagName?.toLowerCase();\r\n const id = el.id ? `#${el.id}` : '';\r\n return {\r\n clicked: `${tag}${id}`,\r\n text: el.textContent?.trim().slice(0, 100) || '',\r\n rect: el.getBoundingClientRect().toJSON?.() || null,\r\n };\r\n}\r\n\r\n/**\r\n * Type into an input, textarea, or contenteditable element.\r\n * Works with React, Vue, Angular, and other frameworks.\r\n * @returns {{ selector, typed, currentValue, submitted } | { error }}\r\n */\r\nexport function typeIntoElement(selector, text, { clear = false, submit = false } = {}) {\r\n if (!selector) return { error: 'selector is required' };\r\n if (text === undefined) return { error: 'text is required' };\r\n\r\n const el = document.querySelector(selector);\r\n if (!el) return { error: `Element not found: ${selector}` };\r\n\r\n el.focus();\r\n\r\n if (clear) {\r\n el.value = '';\r\n el.dispatchEvent(new Event('input', { bubbles: true }));\r\n }\r\n\r\n // Use native setter to trigger framework reactivity (React, Vue, etc.)\r\n const nativeSetter = Object.getOwnPropertyDescriptor(\r\n window.HTMLInputElement.prototype, 'value'\r\n )?.set || Object.getOwnPropertyDescriptor(\r\n window.HTMLTextAreaElement.prototype, 'value'\r\n )?.set;\r\n\r\n const newValue = clear ? text : (el.value || '') + text;\r\n if (nativeSetter) {\r\n nativeSetter.call(el, newValue);\r\n } else {\r\n el.value = newValue;\r\n }\r\n\r\n el.dispatchEvent(new Event('input', { bubbles: true }));\r\n el.dispatchEvent(new Event('change', { bubbles: true }));\r\n\r\n if (submit) {\r\n const form = el.closest('form');\r\n if (form) {\r\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\r\n } else {\r\n el.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', bubbles: true }));\r\n }\r\n }\r\n\r\n return {\r\n selector,\r\n typed: text,\r\n currentValue: el.value?.slice(0, 200),\r\n submitted: !!submit,\r\n };\r\n}\r\n\r\n/**\r\n * Filter and return network log entries.\r\n */\r\nexport function getFilteredNetwork(method, status, limit = 30) {\r\n let filtered = networkLog;\r\n if (method) {\r\n filtered = filtered.filter((r) => r.method === method.toUpperCase());\r\n }\r\n if (status) {\r\n if (status === 'error') {\r\n filtered = filtered.filter((r) => r.status === 0 || r.status >= 400);\r\n } else {\r\n filtered = filtered.filter((r) => String(r.status).startsWith(String(status)));\r\n }\r\n }\r\n return {\r\n requests: filtered.slice(-limit),\r\n total: networkLog.length,\r\n showing: Math.min(filtered.length, limit),\r\n };\r\n}\r\n\r\n/**\r\n * Filter and return console log entries.\r\n */\r\nexport function getFilteredConsole(level, limit = 30) {\r\n const filtered = level && level !== 'all'\r\n ? consoleLog.filter((m) => m.level === level)\r\n : consoleLog;\r\n return {\r\n messages: filtered.slice(-limit),\r\n total: consoleLog.length,\r\n showing: Math.min(filtered.length, limit),\r\n };\r\n}\r\n\r\n// ── Private: Interceptors ──\r\n\r\nfunction _installNetworkInterceptor() {\r\n // Intercept fetch\r\n const originalFetch = window.fetch;\r\n window.fetch = async function (...args) {\r\n const start = Date.now();\r\n const req = args[0];\r\n const url = typeof req === 'string' ? req : req?.url || '';\r\n const method = (args[1]?.method || req?.method || 'GET').toUpperCase();\r\n\r\n try {\r\n const response = await originalFetch.apply(window, args);\r\n const size = parseInt(response.headers?.get('content-length') || '0', 10);\r\n networkLog.push({\r\n type: 'fetch', method, url,\r\n status: response.status, statusText: response.statusText,\r\n duration: Date.now() - start, size, timestamp: start,\r\n });\r\n if (networkLog.length > MAX_NETWORK_LOG) networkLog.shift();\r\n return response;\r\n } catch (err) {\r\n networkLog.push({\r\n type: 'fetch', method, url,\r\n status: 0, error: err.message,\r\n duration: Date.now() - start, timestamp: start,\r\n });\r\n if (networkLog.length > MAX_NETWORK_LOG) networkLog.shift();\r\n throw err;\r\n }\r\n };\r\n\r\n // Intercept XMLHttpRequest\r\n const origOpen = XMLHttpRequest.prototype.open;\r\n const origSend = XMLHttpRequest.prototype.send;\r\n\r\n XMLHttpRequest.prototype.open = function (method, url, ...rest) {\r\n this._wuAi = { method: (method || 'GET').toUpperCase(), url: String(url) };\r\n return origOpen.call(this, method, url, ...rest);\r\n };\r\n\r\n XMLHttpRequest.prototype.send = function (...args) {\r\n if (this._wuAi) {\r\n this._wuAi.start = Date.now();\r\n this.addEventListener('loadend', () => {\r\n networkLog.push({\r\n type: 'xhr', method: this._wuAi.method, url: this._wuAi.url,\r\n status: this.status, statusText: this.statusText,\r\n duration: Date.now() - this._wuAi.start,\r\n size: parseInt(this.getResponseHeader('content-length') || '0', 10),\r\n timestamp: this._wuAi.start,\r\n });\r\n if (networkLog.length > MAX_NETWORK_LOG) networkLog.shift();\r\n });\r\n }\r\n return origSend.apply(this, args);\r\n };\r\n}\r\n\r\nfunction _installConsoleInterceptor() {\r\n const levels = ['log', 'warn', 'error'];\r\n for (const level of levels) {\r\n const original = console[level];\r\n console[level] = (...args) => {\r\n consoleLog.push({\r\n level,\r\n message: args.map((a) => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' '),\r\n timestamp: Date.now(),\r\n });\r\n if (consoleLog.length > MAX_CONSOLE_LOG) consoleLog.shift();\r\n original.apply(console, args);\r\n };\r\n }\r\n}\r\n"],"names":["networkLog","MAX_NETWORK_LOG","consoleLog","_interceptorsInstalled","ensureInterceptors","originalFetch","window","fetch","async","args","start","Date","now","req","url","method","toUpperCase","response","apply","size","parseInt","headers","get","push","type","status","statusText","duration","timestamp","length","shift","err","error","message","origOpen","XMLHttpRequest","prototype","open","origSend","send","rest","this","_wuAi","String","call","addEventListener","getResponseHeader","_installNetworkInterceptor","levels","level","original","console","map","a","JSON","stringify","join","_installConsoleInterceptor","buildA11yTree","el","depth","maxDepth","indent","repeat","tag","tagName","toLowerCase","role","getAttribute","ariaLabel","text","childNodes","nodeType","textContent","trim","slice","line","id","className","cls","result","children","shadowRoot","i","inlineComputedStyles","source","clone","props","style","getComputedStyle","prop","val","getPropertyValue","setProperty","_","srcKids","cloneKids","max","Math","min","captureScreenshot","selector","quality","target","document","querySelector","documentElement","rect","getBoundingClientRect","w","ceil","width","innerWidth","h","height","innerHeight","cloneNode","xhtml","XMLSerializer","serializeToString","svgStr","svgBlob","Blob","URL","createObjectURL","dataUrl","Promise","resolve","img","Image","onload","canvas","createElement","getContext","drawImage","revokeObjectURL","toDataURL","onerror","src","base64","split","format","sizeKB","round","clickElement","candidates","querySelectorAll","searchText","candidate","includes","scrollIntoView","behavior","block","click","clicked","toJSON","typeIntoElement","clear","submit","undefined","focus","value","dispatchEvent","Event","bubbles","nativeSetter","Object","getOwnPropertyDescriptor","HTMLInputElement","set","HTMLTextAreaElement","newValue","form","closest","cancelable","KeyboardEvent","key","code","typed","currentValue","submitted","getFilteredNetwork","limit","filtered","filter","r","startsWith","requests","total","showing","getFilteredConsole","m","messages"],"mappings":"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"}