wu-framework 1.2.1 → 2.1.1
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/LICENSE +39 -39
- package/README.md +570 -489
- package/dist/adapters/alpine/index.js +2 -0
- package/dist/adapters/alpine/index.js.map +1 -0
- package/{src → dist}/adapters/angular/index.d.ts +154 -154
- package/dist/adapters/angular/index.js +2 -0
- package/dist/adapters/angular/index.js.map +1 -0
- package/{src → dist}/adapters/angular.d.ts +3 -3
- 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/{src → dist}/adapters/lit/index.d.ts +120 -120
- package/dist/adapters/lit/index.js +44 -0
- package/dist/adapters/lit/index.js.map +1 -0
- package/{src → dist}/adapters/lit.d.ts +3 -3
- package/{src → dist}/adapters/preact/index.d.ts +108 -108
- package/dist/adapters/preact/index.js +2 -0
- package/dist/adapters/preact/index.js.map +1 -0
- package/{src → dist}/adapters/preact.d.ts +3 -3
- package/dist/adapters/qwik/index.js +2 -0
- package/dist/adapters/qwik/index.js.map +1 -0
- package/{src → dist}/adapters/react/index.d.ts +246 -246
- package/dist/adapters/react/index.js +2 -0
- package/dist/adapters/react/index.js.map +1 -0
- package/{src → dist}/adapters/react.d.ts +3 -3
- package/dist/adapters/shared.js +2 -0
- package/dist/adapters/shared.js.map +1 -0
- package/{src → dist}/adapters/solid/index.d.ts +101 -101
- package/dist/adapters/solid/index.js +2 -0
- package/dist/adapters/solid/index.js.map +1 -0
- package/{src → dist}/adapters/solid.d.ts +3 -3
- 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/{src → dist}/adapters/svelte/index.d.ts +166 -166
- package/dist/adapters/svelte/index.js +2 -0
- package/dist/adapters/svelte/index.js.map +1 -0
- package/{src → dist}/adapters/svelte.d.ts +3 -3
- package/{src → dist}/adapters/vanilla/index.d.ts +179 -179
- package/dist/adapters/vanilla/index.js +2 -0
- package/dist/adapters/vanilla/index.js.map +1 -0
- package/{src → dist}/adapters/vanilla.d.ts +3 -3
- package/{src → dist}/adapters/vue/index.d.ts +299 -299
- package/dist/adapters/vue/index.js +2 -0
- package/dist/adapters/vue/index.js.map +1 -0
- package/{src → dist}/adapters/vue.d.ts +3 -3
- package/dist/ai/wu-ai.js +2 -0
- package/dist/ai/wu-ai.js.map +1 -0
- package/dist/core/wu-html-parser.js +2 -0
- package/dist/core/wu-html-parser.js.map +1 -0
- package/dist/core/wu-iframe-sandbox.js +2 -0
- package/dist/core/wu-iframe-sandbox.js.map +1 -0
- package/dist/core/wu-loader.js +2 -0
- package/dist/core/wu-loader.js.map +1 -0
- package/dist/core/wu-mcp-bridge.js +2 -0
- package/dist/core/wu-mcp-bridge.js.map +1 -0
- package/dist/core/wu-script-executor.js +2 -0
- package/dist/core/wu-script-executor.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 +8681 -15683
- 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-logger-fJfUHBGA.js +2 -0
- package/dist/wu-logger-fJfUHBGA.js.map +1 -0
- package/integrations/astro/README.md +127 -127
- package/integrations/astro/WuApp.astro +63 -63
- package/integrations/astro/WuShell.astro +39 -39
- package/integrations/astro/index.js +68 -68
- package/integrations/astro/package.json +38 -38
- package/integrations/astro/types.d.ts +53 -53
- package/package.json +218 -209
- 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/htmx/index.d.ts +0 -0
- /package/{src → dist}/adapters/htmx.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/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
|
@@ -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":["/**\n * WU-AI Browser Primitives\n *\n * Shared browser capabilities used by both wu-ai-browser.js (Paradigm 1/2)\n * and wu-mcp-bridge.js (Paradigm 3). Single source of truth to avoid\n * duplicating interceptors, DOM traversal, and Canvas rendering.\n */\n\n// ── Shared capture buffers (singleton) ──\n\nexport const networkLog = [];\nexport const MAX_NETWORK_LOG = 300;\nexport const consoleLog = [];\nexport const MAX_CONSOLE_LOG = 500;\n\nlet _interceptorsInstalled = false;\n\n/**\n * Install network + console interceptors (idempotent — only runs once).\n */\nexport function ensureInterceptors() {\n if (_interceptorsInstalled) return;\n _installNetworkInterceptor();\n _installConsoleInterceptor();\n _interceptorsInstalled = true;\n}\n\n/**\n * Build an accessibility tree representation of a DOM element.\n * Traverses into Shadow DOM if present.\n */\nexport function buildA11yTree(el, depth = 0, maxDepth = 5) {\n if (depth > maxDepth || !el) return '';\n\n const indent = ' '.repeat(depth);\n const tag = el.tagName?.toLowerCase() || '';\n const role = el.getAttribute?.('role') || '';\n const ariaLabel = el.getAttribute?.('aria-label') || '';\n const text = el.childNodes?.length === 1 && el.childNodes[0].nodeType === 3\n ? el.textContent?.trim().slice(0, 80) : '';\n\n let line = `${indent}<${tag}`;\n if (el.id) line += ` id=\"${el.id}\"`;\n if (role) line += ` role=\"${role}\"`;\n if (ariaLabel) line += ` aria-label=\"${ariaLabel}\"`;\n if (el.className && typeof el.className === 'string') {\n const cls = el.className.trim().slice(0, 60);\n if (cls) line += ` class=\"${cls}\"`;\n }\n line += '>';\n if (text) line += ` \"${text}\"`;\n\n let result = line + '\\n';\n const root = el.shadowRoot || el;\n const children = root.children || [];\n\n for (let i = 0; i < children.length && i < 50; i++) {\n result += buildA11yTree(children[i], depth + 1, maxDepth);\n }\n return result;\n}\n\n/**\n * Recursively inline computed styles from source to clone for Canvas rendering.\n */\nexport function inlineComputedStyles(source, clone) {\n const props = ['color', 'background', 'background-color', 'font-family',\n 'font-size', 'font-weight', 'border', 'border-radius', 'padding', 'margin',\n 'display', 'flex-direction', 'align-items', 'justify-content', 'gap',\n 'width', 'height', 'max-width', 'max-height', 'overflow', 'opacity',\n 'box-shadow', 'text-align', 'line-height', 'position', 'top', 'left',\n 'right', 'bottom', 'z-index', 'transform', 'visibility'];\n\n try {\n const style = window.getComputedStyle(source);\n for (const prop of props) {\n const val = style.getPropertyValue(prop);\n if (val) clone.style?.setProperty(prop, val);\n }\n } catch (_) { /* skip */ }\n\n const srcKids = source.children || [];\n const cloneKids = clone.children || [];\n const max = Math.min(srcKids.length, cloneKids.length, 200);\n for (let i = 0; i < max; i++) {\n inlineComputedStyles(srcKids[i], cloneKids[i]);\n }\n}\n\n/**\n * Capture a screenshot of a DOM element via Canvas API (SVG foreignObject).\n * @returns {Promise<{ width, height, format, base64, sizeKB } | { error: string }>}\n */\nexport async function captureScreenshot(selector, quality = 0.8) {\n const target = selector\n ? document.querySelector(selector)\n : document.documentElement;\n\n if (!target) return { error: `Element not found: ${selector}` };\n\n const rect = target.getBoundingClientRect();\n const w = Math.ceil(Math.min(rect.width || window.innerWidth, 1920));\n const h = Math.ceil(Math.min(rect.height || window.innerHeight, 1080));\n\n const clone = target.cloneNode(true);\n inlineComputedStyles(target, clone);\n\n const serializer = new XMLSerializer();\n const xhtml = serializer.serializeToString(clone);\n\n const svgStr = [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\">`,\n '<foreignObject width=\"100%\" height=\"100%\">',\n `<div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"width:${w}px;height:${h}px;overflow:hidden;\">`,\n xhtml,\n '</div>',\n '</foreignObject>',\n '</svg>',\n ].join('');\n\n const svgBlob = new Blob([svgStr], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n const dataUrl = await new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n URL.revokeObjectURL(url);\n resolve(canvas.toDataURL('image/png', quality));\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n\n if (!dataUrl) return { error: 'Canvas rendering failed' };\n\n const base64 = dataUrl.split(',')[1];\n return {\n width: w,\n height: h,\n format: 'png',\n base64,\n sizeKB: Math.round((base64.length * 3) / 4 / 1024),\n };\n}\n\n/**\n * Click an element by CSS selector or visible text content.\n * @returns {{ clicked, text } | { error }}\n */\nexport function clickElement(selector, text) {\n let el = null;\n\n if (selector) {\n el = document.querySelector(selector);\n }\n\n if (!el && text) {\n const candidates = document.querySelectorAll(\n 'button, a, [role=\"button\"], input[type=\"submit\"], input[type=\"button\"], [data-click], label, [onclick]'\n );\n const searchText = text.toLowerCase();\n for (const candidate of candidates) {\n if (candidate.textContent?.trim().toLowerCase().includes(searchText)) {\n el = candidate;\n break;\n }\n }\n }\n\n if (!el) return { error: `Element not found: ${selector || `text=\"${text}\"`}` };\n\n el.scrollIntoView({ behavior: 'instant', block: 'center' });\n el.click();\n\n const tag = el.tagName?.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n return {\n clicked: `${tag}${id}`,\n text: el.textContent?.trim().slice(0, 100) || '',\n rect: el.getBoundingClientRect().toJSON?.() || null,\n };\n}\n\n/**\n * Type into an input, textarea, or contenteditable element.\n * Works with React, Vue, Angular, and other frameworks.\n * @returns {{ selector, typed, currentValue, submitted } | { error }}\n */\nexport function typeIntoElement(selector, text, { clear = false, submit = false } = {}) {\n if (!selector) return { error: 'selector is required' };\n if (text === undefined) return { error: 'text is required' };\n\n const el = document.querySelector(selector);\n if (!el) return { error: `Element not found: ${selector}` };\n\n el.focus();\n\n if (clear) {\n el.value = '';\n el.dispatchEvent(new Event('input', { bubbles: true }));\n }\n\n // Use native setter to trigger framework reactivity (React, Vue, etc.)\n const nativeSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype, 'value'\n )?.set || Object.getOwnPropertyDescriptor(\n window.HTMLTextAreaElement.prototype, 'value'\n )?.set;\n\n const newValue = clear ? text : (el.value || '') + text;\n if (nativeSetter) {\n nativeSetter.call(el, newValue);\n } else {\n el.value = newValue;\n }\n\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n\n if (submit) {\n const form = el.closest('form');\n if (form) {\n form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));\n } else {\n el.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', bubbles: true }));\n }\n }\n\n return {\n selector,\n typed: text,\n currentValue: el.value?.slice(0, 200),\n submitted: !!submit,\n };\n}\n\n/**\n * Filter and return network log entries.\n */\nexport function getFilteredNetwork(method, status, limit = 30) {\n let filtered = networkLog;\n if (method) {\n filtered = filtered.filter((r) => r.method === method.toUpperCase());\n }\n if (status) {\n if (status === 'error') {\n filtered = filtered.filter((r) => r.status === 0 || r.status >= 400);\n } else {\n filtered = filtered.filter((r) => String(r.status).startsWith(String(status)));\n }\n }\n return {\n requests: filtered.slice(-limit),\n total: networkLog.length,\n showing: Math.min(filtered.length, limit),\n };\n}\n\n/**\n * Filter and return console log entries.\n */\nexport function getFilteredConsole(level, limit = 30) {\n const filtered = level && level !== 'all'\n ? consoleLog.filter((m) => m.level === level)\n : consoleLog;\n return {\n messages: filtered.slice(-limit),\n total: consoleLog.length,\n showing: Math.min(filtered.length, limit),\n };\n}\n\n// ── Private: Interceptors ──\n\nfunction _installNetworkInterceptor() {\n // Intercept fetch\n const originalFetch = window.fetch;\n window.fetch = async function (...args) {\n const start = Date.now();\n const req = args[0];\n const url = typeof req === 'string' ? req : req?.url || '';\n const method = (args[1]?.method || req?.method || 'GET').toUpperCase();\n\n try {\n const response = await originalFetch.apply(window, args);\n const size = parseInt(response.headers?.get('content-length') || '0', 10);\n networkLog.push({\n type: 'fetch', method, url,\n status: response.status, statusText: response.statusText,\n duration: Date.now() - start, size, timestamp: start,\n });\n if (networkLog.length > MAX_NETWORK_LOG) networkLog.shift();\n return response;\n } catch (err) {\n networkLog.push({\n type: 'fetch', method, url,\n status: 0, error: err.message,\n duration: Date.now() - start, timestamp: start,\n });\n if (networkLog.length > MAX_NETWORK_LOG) networkLog.shift();\n throw err;\n }\n };\n\n // Intercept XMLHttpRequest\n const origOpen = XMLHttpRequest.prototype.open;\n const origSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (method, url, ...rest) {\n this._wuAi = { method: (method || 'GET').toUpperCase(), url: String(url) };\n return origOpen.call(this, method, url, ...rest);\n };\n\n XMLHttpRequest.prototype.send = function (...args) {\n if (this._wuAi) {\n this._wuAi.start = Date.now();\n this.addEventListener('loadend', () => {\n networkLog.push({\n type: 'xhr', method: this._wuAi.method, url: this._wuAi.url,\n status: this.status, statusText: this.statusText,\n duration: Date.now() - this._wuAi.start,\n size: parseInt(this.getResponseHeader('content-length') || '0', 10),\n timestamp: this._wuAi.start,\n });\n if (networkLog.length > MAX_NETWORK_LOG) networkLog.shift();\n });\n }\n return origSend.apply(this, args);\n };\n}\n\nfunction _installConsoleInterceptor() {\n const levels = ['log', 'warn', 'error'];\n for (const level of levels) {\n const original = console[level];\n console[level] = (...args) => {\n consoleLog.push({\n level,\n message: args.map((a) => (typeof a === 'object' ? JSON.stringify(a) : String(a))).join(' '),\n timestamp: Date.now(),\n });\n if (consoleLog.length > MAX_CONSOLE_LOG) consoleLog.shift();\n original.apply(console, args);\n };\n }\n}\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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"}
|