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.
- package/README.md +99 -18
- package/dist/adapters/alpine/index.js +2 -0
- package/dist/adapters/alpine/index.js.map +1 -0
- package/dist/adapters/angular/index.js +2 -0
- package/dist/adapters/angular/index.js.map +1 -0
- package/dist/adapters/htmx/index.js +2 -0
- package/dist/adapters/htmx/index.js.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/lit/index.js +44 -0
- package/dist/adapters/lit/index.js.map +1 -0
- package/dist/adapters/preact/index.js +2 -0
- package/dist/adapters/preact/index.js.map +1 -0
- package/dist/adapters/qwik/index.js +2 -0
- package/dist/adapters/qwik/index.js.map +1 -0
- package/dist/adapters/react/index.js +2 -0
- package/dist/adapters/react/index.js.map +1 -0
- package/dist/adapters/shared.js +2 -0
- package/dist/adapters/shared.js.map +1 -0
- package/dist/adapters/solid/index.js +2 -0
- package/dist/adapters/solid/index.js.map +1 -0
- package/dist/adapters/stencil/index.js +2 -0
- package/dist/adapters/stencil/index.js.map +1 -0
- package/dist/adapters/stimulus/index.js +2 -0
- package/dist/adapters/stimulus/index.js.map +1 -0
- package/dist/adapters/svelte/index.js +2 -0
- package/dist/adapters/svelte/index.js.map +1 -0
- package/dist/adapters/vanilla/index.js +2 -0
- package/dist/adapters/vanilla/index.js.map +1 -0
- package/dist/adapters/vue/index.js +2 -0
- package/dist/adapters/vue/index.js.map +1 -0
- package/dist/ai/wu-ai.js +2 -0
- package/dist/ai/wu-ai.js.map +1 -0
- package/dist/core/wu-mcp-bridge.js +2 -0
- package/dist/core/wu-mcp-bridge.js.map +1 -0
- package/{src → dist}/index.d.ts +445 -317
- package/dist/wu-ai-browser-primitives-BDKXJlwc.js +2 -0
- package/dist/wu-ai-browser-primitives-BDKXJlwc.js.map +1 -0
- package/dist/wu-framework.cjs.js +2 -2
- package/dist/wu-framework.cjs.js.map +1 -1
- package/dist/wu-framework.dev.js +2640 -9197
- package/dist/wu-framework.dev.js.map +1 -1
- package/dist/wu-framework.esm.js +2 -2
- package/dist/wu-framework.esm.js.map +1 -1
- package/dist/wu-framework.umd.js +2 -2
- package/dist/wu-framework.umd.js.map +1 -1
- package/dist/wu-html-parser.js +2 -0
- package/dist/wu-html-parser.js.map +1 -0
- package/dist/wu-iframe-sandbox.js +2 -0
- package/dist/wu-iframe-sandbox.js.map +1 -0
- package/dist/wu-logger-fJfUHBGA.js +2 -0
- package/dist/wu-logger-fJfUHBGA.js.map +1 -0
- package/dist/wu-script-executor.js +2 -0
- package/dist/wu-script-executor.js.map +1 -0
- package/package.json +43 -34
- package/src/adapters/alpine/index.js +0 -231
- package/src/adapters/alpine.js +0 -3
- package/src/adapters/angular/ai.js +0 -30
- package/src/adapters/angular/index.js +0 -932
- package/src/adapters/angular.js +0 -3
- package/src/adapters/htmx/index.js +0 -242
- package/src/adapters/htmx.js +0 -3
- package/src/adapters/index.js +0 -225
- package/src/adapters/lit/ai.js +0 -20
- package/src/adapters/lit/index.js +0 -721
- package/src/adapters/lit.js +0 -3
- package/src/adapters/preact/ai.js +0 -33
- package/src/adapters/preact/index.js +0 -661
- package/src/adapters/preact.js +0 -3
- package/src/adapters/qwik/index.js +0 -108
- package/src/adapters/qwik.js +0 -3
- package/src/adapters/react/ai.js +0 -135
- package/src/adapters/react/index.js +0 -695
- package/src/adapters/react.js +0 -3
- package/src/adapters/shared.js +0 -64
- package/src/adapters/solid/ai.js +0 -32
- package/src/adapters/solid/index.js +0 -586
- package/src/adapters/solid.js +0 -3
- package/src/adapters/stencil/index.js +0 -228
- package/src/adapters/stencil.js +0 -3
- package/src/adapters/stimulus/index.js +0 -255
- package/src/adapters/stimulus.js +0 -3
- package/src/adapters/svelte/ai.js +0 -31
- package/src/adapters/svelte/index.js +0 -798
- package/src/adapters/svelte.js +0 -3
- package/src/adapters/vanilla/ai.js +0 -30
- package/src/adapters/vanilla/index.js +0 -785
- package/src/adapters/vanilla.js +0 -3
- package/src/adapters/vue/ai.js +0 -52
- package/src/adapters/vue/index.js +0 -618
- package/src/adapters/vue.js +0 -3
- package/src/ai/wu-ai-actions.js +0 -261
- package/src/ai/wu-ai-agent.js +0 -546
- package/src/ai/wu-ai-browser-primitives.js +0 -354
- package/src/ai/wu-ai-browser.js +0 -380
- package/src/ai/wu-ai-context.js +0 -332
- package/src/ai/wu-ai-conversation.js +0 -613
- package/src/ai/wu-ai-orchestrate.js +0 -1021
- package/src/ai/wu-ai-permissions.js +0 -381
- package/src/ai/wu-ai-provider.js +0 -700
- package/src/ai/wu-ai-schema.js +0 -225
- package/src/ai/wu-ai-triggers.js +0 -396
- package/src/ai/wu-ai.js +0 -804
- package/src/core/wu-app.js +0 -236
- package/src/core/wu-cache.js +0 -498
- package/src/core/wu-core.js +0 -1412
- package/src/core/wu-error-boundary.js +0 -396
- package/src/core/wu-event-bus.js +0 -390
- package/src/core/wu-hooks.js +0 -350
- package/src/core/wu-html-parser.js +0 -199
- package/src/core/wu-iframe-sandbox.js +0 -328
- package/src/core/wu-loader.js +0 -450
- package/src/core/wu-logger.js +0 -143
- package/src/core/wu-manifest.js +0 -533
- package/src/core/wu-mcp-bridge.js +0 -432
- package/src/core/wu-overrides.js +0 -510
- package/src/core/wu-performance.js +0 -228
- package/src/core/wu-plugin.js +0 -401
- package/src/core/wu-prefetch.js +0 -414
- package/src/core/wu-proxy-sandbox.js +0 -477
- package/src/core/wu-sandbox.js +0 -779
- package/src/core/wu-script-executor.js +0 -161
- package/src/core/wu-sentinel-client.js +0 -311
- package/src/core/wu-snapshot-sandbox.js +0 -227
- package/src/core/wu-store.js +0 -307
- package/src/core/wu-strategies.js +0 -256
- package/src/core/wu-style-bridge.js +0 -477
- package/src/index.js +0 -234
- package/src/utils/dependency-resolver.js +0 -328
- /package/{src → dist}/adapters/alpine/index.d.ts +0 -0
- /package/{src → dist}/adapters/alpine.d.ts +0 -0
- /package/{src → dist}/adapters/angular/index.d.ts +0 -0
- /package/{src → dist}/adapters/angular.d.ts +0 -0
- /package/{src → dist}/adapters/htmx/index.d.ts +0 -0
- /package/{src → dist}/adapters/htmx.d.ts +0 -0
- /package/{src → dist}/adapters/lit/index.d.ts +0 -0
- /package/{src → dist}/adapters/lit.d.ts +0 -0
- /package/{src → dist}/adapters/preact/index.d.ts +0 -0
- /package/{src → dist}/adapters/preact.d.ts +0 -0
- /package/{src → dist}/adapters/qwik/index.d.ts +0 -0
- /package/{src → dist}/adapters/qwik.d.ts +0 -0
- /package/{src → dist}/adapters/react/index.d.ts +0 -0
- /package/{src → dist}/adapters/react.d.ts +0 -0
- /package/{src → dist}/adapters/solid/index.d.ts +0 -0
- /package/{src → dist}/adapters/solid.d.ts +0 -0
- /package/{src → dist}/adapters/stencil/index.d.ts +0 -0
- /package/{src → dist}/adapters/stencil.d.ts +0 -0
- /package/{src → dist}/adapters/stimulus/index.d.ts +0 -0
- /package/{src → dist}/adapters/stimulus.d.ts +0 -0
- /package/{src → dist}/adapters/svelte/index.d.ts +0 -0
- /package/{src → dist}/adapters/svelte.d.ts +0 -0
- /package/{src → dist}/adapters/vanilla/index.d.ts +0 -0
- /package/{src → dist}/adapters/vanilla.d.ts +0 -0
- /package/{src → dist}/adapters/vue/index.d.ts +0 -0
- /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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"}
|