From bd28eb442d2f2dc79130aa328897dbf12a0502b7 Mon Sep 17 00:00:00 2001 From: Ali Rashidi Date: Sat, 12 Sep 2026 10:53:10 +0330 Subject: [PATCH 1/3] fix(security): harden bridge server, MV3 keepalive, prevent socket storms and add tool profiles - Security: Lock down CORS on bridge server (:3847) to trusted origins (chrome-extension:// and localhost), add optional TELEDOM_BRIDGE_TOKEN auth for mutating endpoints (/api/mcp/tool, /api/tabs/close), and reject untrusted cross-origin WebSockets. - MV3 Resilience: Add 'alarms' permission and periodic alarm keep-alive to prevent Service Worker idle termination after 30 seconds. - Socket Storm Fix: Remove direct WebSocket instantiation in content-script; route all commands cleanly through Service Worker via chrome.tabs.sendMessage to prevent multi-tab broadcast race conditions. - Token Optimization: Introduce TELEDOM_PROFILE ('minimal', 'core', 'forensics', 'full') slashing context overhead from ~40,000 tokens to ~2,500-4,800 tokens for lean agent setups. - Async I/O: Convert synchronous fs.*Sync calls in FileStorageProvider to non-blocking fs.promises.* to prevent Node.js event loop lag during high-frequency DOM mutation recordings. - DevTools Parity: Provide graceful error message when Chrome DevTools (F12) is already open on a tab during CDP attach. --- bin/mcp-server.js | 10 + .../dist/extension/content-script.js | 12 +- .../dist/extension/service-worker.js | 2 +- chrome-extension/dist/server/bridge-server.js | 193 ++++++- chrome-extension/dist/server/mcp-server.js | 13 +- .../dist/src/extension/devtools/devtools.html | 16 +- .../dist/src/extension/popup/popup.html | 102 ++-- chrome-extension/dist/src/ui/index.html | 480 +++++++++--------- chrome-extension/manifest.json | 3 +- dist/extension/content-script.js | 12 +- dist/extension/service-worker.js | 2 +- dist/server/bridge-server.js | 193 ++++++- dist/server/mcp-server.js | 13 +- dist/src/extension/devtools/devtools.html | 16 +- dist/src/extension/popup/popup.html | 102 ++-- dist/src/ui/index.html | 480 +++++++++--------- docs/intelligence/BENCHMARKS.md | 24 +- docs/intelligence/COMPATIBILITY.md | 2 +- manifest.json | 3 +- src/extension/background/service-worker.ts | 28 +- src/extension/content/content-script.ts | 188 +------ src/mcp/bridge-server.ts | 72 ++- src/mcp/server.ts | 14 +- src/mcp/tool-groups.ts | 38 ++ src/storage/file-storage.ts | 20 +- 25 files changed, 1160 insertions(+), 878 deletions(-) diff --git a/bin/mcp-server.js b/bin/mcp-server.js index a0a4f77c..cb16181e 100644 --- a/bin/mcp-server.js +++ b/bin/mcp-server.js @@ -55,5 +55,15 @@ if (typeof document === 'undefined') { global.__FORENSIC_SIMULATION__ = true; } +const profileArg = process.argv.find((a) => a.startsWith('--profile=')); +if (profileArg) { + process.env.TELEDOM_PROFILE = profileArg.split('=')[1]; +} else { + const profileIdx = process.argv.indexOf('--profile'); + if (profileIdx !== -1 && process.argv[profileIdx + 1]) { + process.env.TELEDOM_PROFILE = process.argv[profileIdx + 1]; + } +} + const server = new ForensicMCPServer(); server.startStdio(); diff --git a/chrome-extension/dist/extension/content-script.js b/chrome-extension/dist/extension/content-script.js index 85ef3552..faa564d3 100644 --- a/chrome-extension/dist/extension/content-script.js +++ b/chrome-extension/dist/extension/content-script.js @@ -1,10 +1,10 @@ -var Bt=Object.defineProperty;var Ft=(U,z,Y)=>z in U?Bt(U,z,{enumerable:!0,configurable:!0,writable:!0,value:Y}):U[z]=Y;var f=(U,z,Y)=>Ft(U,typeof z!="symbol"?z+"":z,Y);(function(){"use strict";var U=(l=>(l[l.ELEMENT_NODE=1]="ELEMENT_NODE",l[l.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",l[l.TEXT_NODE=3]="TEXT_NODE",l[l.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",l[l.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",l[l.COMMENT_NODE=8]="COMMENT_NODE",l[l.DOCUMENT_NODE=9]="DOCUMENT_NODE",l[l.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",l[l.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",l))(U||{});class z{constructor(){f(this,"nextId",1);f(this,"nodeToIdMap",new WeakMap);f(this,"idToNodeMap",new Map);f(this,"identities",new Map);f(this,"parentHistory",new Map)}getOrCreateId(e,t=0){if(this.nodeToIdMap.has(e))return this.nodeToIdMap.get(e);const s=this.nextId++;this.nodeToIdMap.set(e,s),this.idToNodeMap.set(s,e);const i=e.nodeType===U.ELEMENT_NODE||e.nodeType===1?e:null,r=i&&i.tagName?i.tagName.toLowerCase():void 0,o=r?r.includes("-"):!1,a={id:s,nodeType:e.nodeType,tagName:r,createdAt:t,initialSelectorHint:i?this.computeSelector(i):void 0,isCustomElement:o};return this.identities.set(s,a),s}getId(e){return this.nodeToIdMap.get(e)}getNode(e){return this.idToNodeMap.get(e)}getIdentity(e){return this.identities.get(e)}recordParent(e,t){if(!t)return;const s=this.parentHistory.get(e)||[];s[s.length-1]!==t&&(s.push(t),this.parentHistory.set(e,s))}getParentHistory(e){return this.parentHistory.get(e)||[]}computeSelector(e){try{const t=typeof e.id=="string"?e.id:e.getAttribute?e.getAttribute("id"):"";if(t&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(t))return`#${t}`;const s=e.tagName?e.tagName.toLowerCase():"element";if(s==="body"||s==="html"||s==="head")return s;let n=[];e.classList&&typeof e.classList.forEach=="function"?n=Array.from(e.classList):typeof e.className=="string"?n=e.className.split(/\s+/):e.className&&typeof e.className.baseVal=="string"&&(n=e.className.baseVal.split(/\s+/));let i="";if(n.length>0){const r=n.filter(o=>typeof o=="string"&&/^[a-zA-Z0-9_-]+$/.test(o)&&!o.startsWith("ng-")&&!o.startsWith("_ng")).slice(0,3);r.length>0&&(i="."+r.join("."))}if(e.parentElement&&e.parentElement.children){const r=Array.from(e.parentElement.children).filter(o=>o.tagName&&o.tagName.toLowerCase()===s);if(r.length>1){const o=r.indexOf(e)+1;if(o>0)return`${s}${i}:nth-of-type(${o})`}}return`${s}${i}`}catch{return e.tagName?e.tagName.toLowerCase():"element"}}computeFullSelectorPath(e){const t=[];let s=e;for(;s&&s.tagName&&s.tagName.toLowerCase()!=="html";){const n=this.computeSelector(s);if(t.unshift(n),s.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(s.id))break;s=s.parentElement}return t.join(" > ")}removeNode(e){this.idToNodeMap.get(e)&&this.idToNodeMap.delete(e)}reset(){this.nextId=1,this.nodeToIdMap=new WeakMap,this.idToNodeMap.clear(),this.identities.clear(),this.parentHistory.clear()}}const Y={maskAllInputs:!1,maskInputTypes:["password","hidden","tel","email"],maskSelectors:["[data-private]",".private-data",".sensitive",'[data-testid="sensitive"]'],blockSelectors:[".recording-blocked","[data-recording-ignore]"],redactHeaders:["authorization","cookie","set-cookie","x-api-key","proxy-authorization","token"],redactQueryParams:["token","key","auth","secret","password","access_token","apiKey","bearer"],maxTextLength:1e5};class se{constructor(e={}){f(this,"config");this.config={...Y,...e}}shouldBlockNode(e){if(!e||!e.matches)return!1;for(const t of this.config.blockSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}shouldMaskText(e){if(!e||!e.matches)return!1;for(const t of this.config.maskSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}maskValue(e,t,s){return e&&(this.config.maskAllInputs?"*".repeat(Math.min(e.length,12)):t&&this.config.maskInputTypes.includes(t.toLowerCase())||s&&/(password|token|secret|cvv|credit|auth|ssn)/i.test(s)?"••••••••":e)}sanitizeText(e,t=!1){return e&&(t?e.replace(/[^\s\n\r\t]/g,"*"):e.length>this.config.maxTextLength?e.substring(0,this.config.maxTextLength)+"... [TRUNCATED]":e)}sanitizeHeaders(e){if(!e)return;const t={};for(const[s,n]of Object.entries(e)){const i=s.toLowerCase();this.config.redactHeaders.some(r=>i.includes(r))?t[s]="[REDACTED]":t[s]=n}return t}sanitizeUrl(e){try{const t=new URL(e);for(const s of this.config.redactQueryParams)t.searchParams.has(s)&&t.searchParams.set(s,"[REDACTED]");return t.toString()}catch{return e}}}class oe{constructor(){f(this,"currentSequence",0);f(this,"sessionStartTime");f(this,"sessionStartWallClock");this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}nextSequence(){return this.currentSequence+=1,this.currentSequence}getSequence(){return this.currentSequence}getRelativeTimestamp(){return typeof performance<"u"?Math.round((performance.now()-this.sessionStartTime)*100)/100:Date.now()-this.sessionStartWallClock}getWallClock(){return Date.now()}generateEventId(e="evt",t){const s=t!==void 0?t:this.nextSequence(),n=Math.random().toString(36).substring(2,8);return`${e}_${s}_${n}`}reset(){this.currentSequence=0,this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}}class me{constructor(e,t,s){f(this,"registry");f(this,"privacy");f(this,"sequenceCounter");this.registry=e,this.privacy=t,this.sequenceCounter=s}captureSnapshot(e=document,t=""){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.nextSequence(),i={},r=e.documentElement||e.body,o=this.registry.getOrCreateId(e,s);if(i[o]={id:o,nodeType:U.DOCUMENT_NODE,tagName:"#document",children:[],parentId:null},e.doctype){const c=this.registry.getOrCreateId(e.doctype,s);i[c]={id:c,nodeType:U.DOCUMENT_TYPE_NODE,tagName:e.doctype.name||"html",parentId:o},i[o].children.push(c)}if(r){const c=this.serializeNode(r,o,i,s);c&&i[o].children.push(c)}const a=this.getViewportInfo();return{snapshotId:`snap_${n}_${Date.now()}`,sessionId:t,timestamp:s,sequence:n,rootId:o,nodes:i,title:e.title||"",url:typeof window<"u"?window.location.href:"",origin:typeof window<"u"?window.location.origin:"",viewport:a,doctype:e.doctype?e.doctype.name:void 0,totalNodeCount:Object.keys(i).length}}serializeNode(e,t,s,n){if(!e||e.nodeType===Node.ELEMENT_NODE&&this.privacy.shouldBlockNode(e))return null;const i=this.registry.getOrCreateId(e,n);this.registry.recordParent(i,t);const r={id:i,nodeType:e.nodeType,parentId:t};if(e.nodeType===Node.ELEMENT_NODE){const o=e;r.tagName=o.tagName.toLowerCase(),r.isCustomElement=r.tagName.includes("-"),r.namespaceURI=o.namespaceURI;const a={};if(o.attributes)for(let c=0;c"u"?{width:1920,height:1080,scrollX:0,scrollY:0,devicePixelRatio:1}:{width:window.innerWidth||((e=document.documentElement)==null?void 0:e.clientWidth)||1920,height:window.innerHeight||((t=document.documentElement)==null?void 0:t.clientHeight)||1080,scrollX:window.scrollX||window.pageXOffset||0,scrollY:window.scrollY||window.pageYOffset||0,devicePixelRatio:window.devicePixelRatio||1}}}class Re{constructor(e,t,s,n,i,r=""){f(this,"observer",null);f(this,"registry");f(this,"privacy");f(this,"sequenceCounter");f(this,"snapshotEngine");f(this,"callback");f(this,"sessionId");f(this,"isObserving",!1);this.registry=e,this.privacy=t,this.sequenceCounter=s,this.snapshotEngine=n,this.callback=i,this.sessionId=r}setSessionId(e){this.sessionId=e}start(e=document){this.isObserving||typeof MutationObserver>"u"||(this.observer=new MutationObserver(this.handleMutations.bind(this)),this.observer.observe(e,{childList:!0,attributes:!0,characterData:!0,subtree:!0,attributeOldValue:!0,characterDataOldValue:!0}),this.isObserving=!0)}stop(){this.observer&&(this.observer.disconnect(),this.observer=null),this.isObserving=!1}takeRecords(){if(this.observer){const e=this.observer.takeRecords();e.length>0&&this.handleMutations(e)}}handleMutations(e){const t=this.sequenceCounter.getRelativeTimestamp(),s=this.sequenceCounter.getWallClock();for(let n=0;n0)for(let o=0;o0)for(let o=0;o"u"||typeof document>"u"||(this.isListening=!0,this.cleanups=[],this.attachUserEventListeners(),this.attachNavigationListeners(),this.attachViewportListeners())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isListening=!1}attachUserEventListeners(){[{type:"click",handler:t=>this.handlePointerEvent(t,"USER_CLICK"),options:{capture:!0,passive:!0}},{type:"dblclick",handler:t=>this.handlePointerEvent(t,"USER_DBLCLICK"),options:{capture:!0,passive:!0}},{type:"input",handler:t=>this.handleInputEvent(t),options:{capture:!0,passive:!0}},{type:"change",handler:t=>this.handleInputEvent(t,"USER_CHANGE"),options:{capture:!0,passive:!0}},{type:"submit",handler:t=>this.handleSubmitEvent(t),options:{capture:!0,passive:!0}},{type:"keydown",handler:t=>this.handleKeyboardEvent(t,"USER_KEYDOWN"),options:{capture:!0,passive:!0}},{type:"keyup",handler:t=>this.handleKeyboardEvent(t,"USER_KEYUP"),options:{capture:!0,passive:!0}},{type:"focus",handler:t=>this.handleFocusBlurEvent(t,"USER_FOCUS"),options:{capture:!0,passive:!0}},{type:"blur",handler:t=>this.handleFocusBlurEvent(t,"USER_BLUR"),options:{capture:!0,passive:!0}}].forEach(({type:t,handler:s,options:n})=>{document.addEventListener(t,s,n),this.cleanups.push(()=>document.removeEventListener(t,s,n))})}handlePointerEvent(e,t){const s=e,n=e.target,i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=n?this.registry.getOrCreateId(n,i):void 0,a=n&&n.nodeType===Node.ELEMENT_NODE?this.registry.computeSelector(n):void 0,c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_clk",c),sessionId:this.sessionId,timestamp:i,sequence:c,wallClockTime:r,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:o,targetSelector:a,payload:{eventType:e.type,targetNodeId:o,targetSelector:a,clientX:s.clientX,clientY:s.clientY,button:s.button,isTrusted:e.isTrusted}};this.callback(u)}handleInputEvent(e,t="USER_INPUT"){const s=e.target;if(!s)return;const n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=this.registry.getOrCreateId(s,n),o=this.registry.computeSelector(s);let a="";if(s.tagName.toLowerCase()==="input"){const d=s;a=this.privacy.maskValue(d.value,d.type,d.name)}else if(s.tagName.toLowerCase()==="textarea"){const d=s;a=this.privacy.maskValue(d.value,"textarea",d.name)}else s.tagName.toLowerCase()==="select"&&(a=s.value);const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_inp",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,inputValue:a,isTrusted:e.isTrusted}};this.callback(u)}handleSubmitEvent(e){const t=e.target,s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=t?this.registry.getOrCreateId(t,s):void 0,r=t?this.registry.computeSelector(t):void 0,o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("usr_sub",o),sessionId:this.sessionId,timestamp:s,sequence:o,wallClockTime:n,type:"USER_SUBMIT",category:"USER",source:"USER_INTERACTION",targetNodeId:i,targetSelector:r,payload:{eventType:"submit",targetNodeId:i,targetSelector:r}};this.callback(a)}handleKeyboardEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0;let a=e.key;s&&s.tagName.toLowerCase()==="input"&&s.type==="password"&&(a="*");const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_key",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,key:a,code:e.code,isTrusted:e.isTrusted}};this.callback(u)}handleFocusBlurEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0,a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("usr_foc",a),sessionId:this.sessionId,timestamp:n,sequence:a,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o}};this.callback(c)}attachNavigationListeners(){if(typeof window>"u"||!window.history)return;const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=(...r)=>{const o=e.apply(window.history,r);return this.recordNavigation("pushState",window.location.href,r[0],r[2]?String(r[2]):void 0),o},window.history.replaceState=(...r)=>{const o=t.apply(window.history,r);return this.recordNavigation("replaceState",window.location.href,r[0],r[2]?String(r[2]):void 0),o};const s=r=>{this.recordNavigation("popstate",window.location.href,r.state)};window.addEventListener("popstate",s);const n=r=>{this.recordNavigation("hashchange",r.newURL,void 0,void 0,r.oldURL)};window.addEventListener("hashchange",n);const i=()=>{this.recordNavigation("visibilitychange",window.location.href,{visibilityState:document.visibilityState,hidden:document.hidden})};document.addEventListener("visibilitychange",i),this.cleanups.push(()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",s),window.removeEventListener("hashchange",n),document.removeEventListener("visibilitychange",i)})}recordNavigation(e,t,s,n,i){const r=this.sequenceCounter.getRelativeTimestamp(),o=this.sequenceCounter.getWallClock(),a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("nav",a),sessionId:this.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:`NAV_${e.toUpperCase()}`,category:"NAVIGATION",source:"PAGE",payload:{navigationType:e,url:this.privacy.sanitizeUrl(t),previousUrl:i?this.privacy.sanitizeUrl(i):void 0,state:s,title:n||document.title}};this.callback(c)}attachViewportListeners(){if(typeof window>"u")return;let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_res",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_RESIZE",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio}};this.callback(a)},100)};window.addEventListener("resize",t,{passive:!0});let s=null;const n=()=>{s&&clearTimeout(s),s=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_scr",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_SCROLL",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{scrollX:window.scrollX,scrollY:window.scrollY}};this.callback(a)},100)};window.addEventListener("scroll",n,{passive:!0}),this.cleanups.push(()=>{e&&clearTimeout(e),s&&clearTimeout(s),window.removeEventListener("resize",t),window.removeEventListener("scroll",n)})}}class ke{constructor(e,t,s,n=""){f(this,"privacy");f(this,"sequenceCounter");f(this,"callback");f(this,"sessionId");f(this,"isInstrumented",!1);f(this,"originalConsole",{});f(this,"originalOnError",null);f(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentConsole(),this.instrumentGlobalErrors(),this.instrumentUnhandledRejections())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentConsole(){if(typeof console>"u")return;["log","warn","error","info","debug"].forEach(t=>{const s=console[t];s&&(this.originalConsole[t]=s,console[t]=(...n)=>{try{this.recordConsole(t,n)}catch{}return s.apply(console,n)},this.cleanups.push(()=>{console[t]=s}))})}recordConsole(e,t){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r=t.map(u=>{const d=typeof u;let h="";try{u instanceof Error?h=`${u.name}: ${u.message} -${u.stack||""}`:d==="object"&&u!==null?h=JSON.stringify(u,(p,y)=>typeof y=="function"?"[Function]":y):h=String(u)}catch{h="[Unserializable Object]"}return{type:d,value:this.privacy.sanitizeText(h)}}),o=r.map(u=>u.value).join(" ");let a;try{const u=new Error().stack;u&&(a=u.split(` +var Ft=Object.defineProperty;var Vt=($,H,W)=>H in $?Ft($,H,{enumerable:!0,configurable:!0,writable:!0,value:W}):$[H]=W;var b=($,H,W)=>Vt($,typeof H!="symbol"?H+"":H,W);(function(){"use strict";var $=(l=>(l[l.ELEMENT_NODE=1]="ELEMENT_NODE",l[l.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",l[l.TEXT_NODE=3]="TEXT_NODE",l[l.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",l[l.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",l[l.COMMENT_NODE=8]="COMMENT_NODE",l[l.DOCUMENT_NODE=9]="DOCUMENT_NODE",l[l.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",l[l.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",l))($||{});class H{constructor(){b(this,"nextId",1);b(this,"nodeToIdMap",new WeakMap);b(this,"idToNodeMap",new Map);b(this,"identities",new Map);b(this,"parentHistory",new Map)}getOrCreateId(e,t=0){if(this.nodeToIdMap.has(e))return this.nodeToIdMap.get(e);const s=this.nextId++;this.nodeToIdMap.set(e,s),this.idToNodeMap.set(s,e);const i=e.nodeType===$.ELEMENT_NODE||e.nodeType===1?e:null,r=i&&i.tagName?i.tagName.toLowerCase():void 0,o=r?r.includes("-"):!1,a={id:s,nodeType:e.nodeType,tagName:r,createdAt:t,initialSelectorHint:i?this.computeSelector(i):void 0,isCustomElement:o};return this.identities.set(s,a),s}getId(e){return this.nodeToIdMap.get(e)}getNode(e){return this.idToNodeMap.get(e)}getIdentity(e){return this.identities.get(e)}recordParent(e,t){if(!t)return;const s=this.parentHistory.get(e)||[];s[s.length-1]!==t&&(s.push(t),this.parentHistory.set(e,s))}getParentHistory(e){return this.parentHistory.get(e)||[]}computeSelector(e){try{const t=typeof e.id=="string"?e.id:e.getAttribute?e.getAttribute("id"):"";if(t&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(t))return`#${t}`;const s=e.tagName?e.tagName.toLowerCase():"element";if(s==="body"||s==="html"||s==="head")return s;let n=[];e.classList&&typeof e.classList.forEach=="function"?n=Array.from(e.classList):typeof e.className=="string"?n=e.className.split(/\s+/):e.className&&typeof e.className.baseVal=="string"&&(n=e.className.baseVal.split(/\s+/));let i="";if(n.length>0){const r=n.filter(o=>typeof o=="string"&&/^[a-zA-Z0-9_-]+$/.test(o)&&!o.startsWith("ng-")&&!o.startsWith("_ng")).slice(0,3);r.length>0&&(i="."+r.join("."))}if(e.parentElement&&e.parentElement.children){const r=Array.from(e.parentElement.children).filter(o=>o.tagName&&o.tagName.toLowerCase()===s);if(r.length>1){const o=r.indexOf(e)+1;if(o>0)return`${s}${i}:nth-of-type(${o})`}}return`${s}${i}`}catch{return e.tagName?e.tagName.toLowerCase():"element"}}computeFullSelectorPath(e){const t=[];let s=e;for(;s&&s.tagName&&s.tagName.toLowerCase()!=="html";){const n=this.computeSelector(s);if(t.unshift(n),s.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(s.id))break;s=s.parentElement}return t.join(" > ")}removeNode(e){this.idToNodeMap.get(e)&&this.idToNodeMap.delete(e)}reset(){this.nextId=1,this.nodeToIdMap=new WeakMap,this.idToNodeMap.clear(),this.identities.clear(),this.parentHistory.clear()}}const W={maskAllInputs:!1,maskInputTypes:["password","hidden","tel","email"],maskSelectors:["[data-private]",".private-data",".sensitive",'[data-testid="sensitive"]'],blockSelectors:[".recording-blocked","[data-recording-ignore]"],redactHeaders:["authorization","cookie","set-cookie","x-api-key","proxy-authorization","token"],redactQueryParams:["token","key","auth","secret","password","access_token","apiKey","bearer"],maxTextLength:1e5};class J{constructor(e={}){b(this,"config");this.config={...W,...e}}shouldBlockNode(e){if(!e||!e.matches)return!1;for(const t of this.config.blockSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}shouldMaskText(e){if(!e||!e.matches)return!1;for(const t of this.config.maskSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}maskValue(e,t,s){return e&&(this.config.maskAllInputs?"*".repeat(Math.min(e.length,12)):t&&this.config.maskInputTypes.includes(t.toLowerCase())||s&&/(password|token|secret|cvv|credit|auth|ssn)/i.test(s)?"••••••••":e)}sanitizeText(e,t=!1){return e&&(t?e.replace(/[^\s\n\r\t]/g,"*"):e.length>this.config.maxTextLength?e.substring(0,this.config.maxTextLength)+"... [TRUNCATED]":e)}sanitizeHeaders(e){if(!e)return;const t={};for(const[s,n]of Object.entries(e)){const i=s.toLowerCase();this.config.redactHeaders.some(r=>i.includes(r))?t[s]="[REDACTED]":t[s]=n}return t}sanitizeUrl(e){try{const t=new URL(e);for(const s of this.config.redactQueryParams)t.searchParams.has(s)&&t.searchParams.set(s,"[REDACTED]");return t.toString()}catch{return e}}}class ne{constructor(){b(this,"currentSequence",0);b(this,"sessionStartTime");b(this,"sessionStartWallClock");this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}nextSequence(){return this.currentSequence+=1,this.currentSequence}getSequence(){return this.currentSequence}getRelativeTimestamp(){return typeof performance<"u"?Math.round((performance.now()-this.sessionStartTime)*100)/100:Date.now()-this.sessionStartWallClock}getWallClock(){return Date.now()}generateEventId(e="evt",t){const s=t!==void 0?t:this.nextSequence(),n=Math.random().toString(36).substring(2,8);return`${e}_${s}_${n}`}reset(){this.currentSequence=0,this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}}class he{constructor(e,t,s){b(this,"registry");b(this,"privacy");b(this,"sequenceCounter");this.registry=e,this.privacy=t,this.sequenceCounter=s}captureSnapshot(e=document,t=""){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.nextSequence(),i={},r=e.documentElement||e.body,o=this.registry.getOrCreateId(e,s);if(i[o]={id:o,nodeType:$.DOCUMENT_NODE,tagName:"#document",children:[],parentId:null},e.doctype){const c=this.registry.getOrCreateId(e.doctype,s);i[c]={id:c,nodeType:$.DOCUMENT_TYPE_NODE,tagName:e.doctype.name||"html",parentId:o},i[o].children.push(c)}if(r){const c=this.serializeNode(r,o,i,s);c&&i[o].children.push(c)}const a=this.getViewportInfo();return{snapshotId:`snap_${n}_${Date.now()}`,sessionId:t,timestamp:s,sequence:n,rootId:o,nodes:i,title:e.title||"",url:typeof window<"u"?window.location.href:"",origin:typeof window<"u"?window.location.origin:"",viewport:a,doctype:e.doctype?e.doctype.name:void 0,totalNodeCount:Object.keys(i).length}}serializeNode(e,t,s,n){if(!e||e.nodeType===Node.ELEMENT_NODE&&this.privacy.shouldBlockNode(e))return null;const i=this.registry.getOrCreateId(e,n);this.registry.recordParent(i,t);const r={id:i,nodeType:e.nodeType,parentId:t};if(e.nodeType===Node.ELEMENT_NODE){const o=e;r.tagName=o.tagName.toLowerCase(),r.isCustomElement=r.tagName.includes("-"),r.namespaceURI=o.namespaceURI;const a={};if(o.attributes)for(let c=0;c"u"?{width:1920,height:1080,scrollX:0,scrollY:0,devicePixelRatio:1}:{width:window.innerWidth||((e=document.documentElement)==null?void 0:e.clientWidth)||1920,height:window.innerHeight||((t=document.documentElement)==null?void 0:t.clientHeight)||1080,scrollX:window.scrollX||window.pageXOffset||0,scrollY:window.scrollY||window.pageYOffset||0,devicePixelRatio:window.devicePixelRatio||1}}}class Ne{constructor(e,t,s,n,i,r=""){b(this,"observer",null);b(this,"registry");b(this,"privacy");b(this,"sequenceCounter");b(this,"snapshotEngine");b(this,"callback");b(this,"sessionId");b(this,"isObserving",!1);this.registry=e,this.privacy=t,this.sequenceCounter=s,this.snapshotEngine=n,this.callback=i,this.sessionId=r}setSessionId(e){this.sessionId=e}start(e=document){this.isObserving||typeof MutationObserver>"u"||(this.observer=new MutationObserver(this.handleMutations.bind(this)),this.observer.observe(e,{childList:!0,attributes:!0,characterData:!0,subtree:!0,attributeOldValue:!0,characterDataOldValue:!0}),this.isObserving=!0)}stop(){this.observer&&(this.observer.disconnect(),this.observer=null),this.isObserving=!1}takeRecords(){if(this.observer){const e=this.observer.takeRecords();e.length>0&&this.handleMutations(e)}}handleMutations(e){const t=this.sequenceCounter.getRelativeTimestamp(),s=this.sequenceCounter.getWallClock();for(let n=0;n0)for(let o=0;o0)for(let o=0;o"u"||typeof document>"u"||(this.isListening=!0,this.cleanups=[],this.attachUserEventListeners(),this.attachNavigationListeners(),this.attachViewportListeners())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isListening=!1}attachUserEventListeners(){[{type:"click",handler:t=>this.handlePointerEvent(t,"USER_CLICK"),options:{capture:!0,passive:!0}},{type:"dblclick",handler:t=>this.handlePointerEvent(t,"USER_DBLCLICK"),options:{capture:!0,passive:!0}},{type:"input",handler:t=>this.handleInputEvent(t),options:{capture:!0,passive:!0}},{type:"change",handler:t=>this.handleInputEvent(t,"USER_CHANGE"),options:{capture:!0,passive:!0}},{type:"submit",handler:t=>this.handleSubmitEvent(t),options:{capture:!0,passive:!0}},{type:"keydown",handler:t=>this.handleKeyboardEvent(t,"USER_KEYDOWN"),options:{capture:!0,passive:!0}},{type:"keyup",handler:t=>this.handleKeyboardEvent(t,"USER_KEYUP"),options:{capture:!0,passive:!0}},{type:"focus",handler:t=>this.handleFocusBlurEvent(t,"USER_FOCUS"),options:{capture:!0,passive:!0}},{type:"blur",handler:t=>this.handleFocusBlurEvent(t,"USER_BLUR"),options:{capture:!0,passive:!0}}].forEach(({type:t,handler:s,options:n})=>{document.addEventListener(t,s,n),this.cleanups.push(()=>document.removeEventListener(t,s,n))})}handlePointerEvent(e,t){const s=e,n=e.target,i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=n?this.registry.getOrCreateId(n,i):void 0,a=n&&n.nodeType===Node.ELEMENT_NODE?this.registry.computeSelector(n):void 0,c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_clk",c),sessionId:this.sessionId,timestamp:i,sequence:c,wallClockTime:r,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:o,targetSelector:a,payload:{eventType:e.type,targetNodeId:o,targetSelector:a,clientX:s.clientX,clientY:s.clientY,button:s.button,isTrusted:e.isTrusted}};this.callback(u)}handleInputEvent(e,t="USER_INPUT"){const s=e.target;if(!s)return;const n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=this.registry.getOrCreateId(s,n),o=this.registry.computeSelector(s);let a="";if(s.tagName.toLowerCase()==="input"){const h=s;a=this.privacy.maskValue(h.value,h.type,h.name)}else if(s.tagName.toLowerCase()==="textarea"){const h=s;a=this.privacy.maskValue(h.value,"textarea",h.name)}else s.tagName.toLowerCase()==="select"&&(a=s.value);const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_inp",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,inputValue:a,isTrusted:e.isTrusted}};this.callback(u)}handleSubmitEvent(e){const t=e.target,s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=t?this.registry.getOrCreateId(t,s):void 0,r=t?this.registry.computeSelector(t):void 0,o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("usr_sub",o),sessionId:this.sessionId,timestamp:s,sequence:o,wallClockTime:n,type:"USER_SUBMIT",category:"USER",source:"USER_INTERACTION",targetNodeId:i,targetSelector:r,payload:{eventType:"submit",targetNodeId:i,targetSelector:r}};this.callback(a)}handleKeyboardEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0;let a=e.key;s&&s.tagName.toLowerCase()==="input"&&s.type==="password"&&(a="*");const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_key",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,key:a,code:e.code,isTrusted:e.isTrusted}};this.callback(u)}handleFocusBlurEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0,a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("usr_foc",a),sessionId:this.sessionId,timestamp:n,sequence:a,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o}};this.callback(c)}attachNavigationListeners(){if(typeof window>"u"||!window.history)return;const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=(...r)=>{const o=e.apply(window.history,r);return this.recordNavigation("pushState",window.location.href,r[0],r[2]?String(r[2]):void 0),o},window.history.replaceState=(...r)=>{const o=t.apply(window.history,r);return this.recordNavigation("replaceState",window.location.href,r[0],r[2]?String(r[2]):void 0),o};const s=r=>{this.recordNavigation("popstate",window.location.href,r.state)};window.addEventListener("popstate",s);const n=r=>{this.recordNavigation("hashchange",r.newURL,void 0,void 0,r.oldURL)};window.addEventListener("hashchange",n);const i=()=>{this.recordNavigation("visibilitychange",window.location.href,{visibilityState:document.visibilityState,hidden:document.hidden})};document.addEventListener("visibilitychange",i),this.cleanups.push(()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",s),window.removeEventListener("hashchange",n),document.removeEventListener("visibilitychange",i)})}recordNavigation(e,t,s,n,i){const r=this.sequenceCounter.getRelativeTimestamp(),o=this.sequenceCounter.getWallClock(),a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("nav",a),sessionId:this.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:`NAV_${e.toUpperCase()}`,category:"NAVIGATION",source:"PAGE",payload:{navigationType:e,url:this.privacy.sanitizeUrl(t),previousUrl:i?this.privacy.sanitizeUrl(i):void 0,state:s,title:n||document.title}};this.callback(c)}attachViewportListeners(){if(typeof window>"u")return;let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_res",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_RESIZE",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio}};this.callback(a)},100)};window.addEventListener("resize",t,{passive:!0});let s=null;const n=()=>{s&&clearTimeout(s),s=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_scr",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_SCROLL",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{scrollX:window.scrollX,scrollY:window.scrollY}};this.callback(a)},100)};window.addEventListener("scroll",n,{passive:!0}),this.cleanups.push(()=>{e&&clearTimeout(e),s&&clearTimeout(s),window.removeEventListener("resize",t),window.removeEventListener("scroll",n)})}}class Me{constructor(e,t,s,n=""){b(this,"privacy");b(this,"sequenceCounter");b(this,"callback");b(this,"sessionId");b(this,"isInstrumented",!1);b(this,"originalConsole",{});b(this,"originalOnError",null);b(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentConsole(),this.instrumentGlobalErrors(),this.instrumentUnhandledRejections())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentConsole(){if(typeof console>"u")return;["log","warn","error","info","debug"].forEach(t=>{const s=console[t];s&&(this.originalConsole[t]=s,console[t]=(...n)=>{try{this.recordConsole(t,n)}catch{}return s.apply(console,n)},this.cleanups.push(()=>{console[t]=s}))})}recordConsole(e,t){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r=t.map(u=>{const h=typeof u;let g="";try{u instanceof Error?g=`${u.name}: ${u.message} +${u.stack||""}`:h==="object"&&u!==null?g=JSON.stringify(u,(p,y)=>typeof y=="function"?"[Function]":y):g=String(u)}catch{g="[Unserializable Object]"}return{type:h,value:this.privacy.sanitizeText(g)}}),o=r.map(u=>u.value).join(" ");let a;try{const u=new Error().stack;u&&(a=u.split(` `).slice(2,8).join(` -`))}catch{}const c={id:this.sequenceCounter.generateEventId("con",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:`RUNTIME_CONSOLE_${e.toUpperCase()}`,category:e==="error"?"ERROR":"CONSOLE",source:"PAGE",payload:{level:e,args:r,formattedMessage:o,stackTrace:a}};this.callback(c)}instrumentGlobalErrors(){if(typeof window>"u")return;const e=t=>{var o,a;const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("err",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_ERROR",category:"ERROR",source:"PAGE",payload:{message:t.message||"Unknown runtime error",filename:t.filename,lineno:t.lineno,colno:t.colno,stack:((o=t.error)==null?void 0:o.stack)||void 0,name:((a=t.error)==null?void 0:a.name)||"Error"}};this.callback(r)};window.addEventListener("error",e),this.cleanups.push(()=>window.removeEventListener("error",e))}instrumentUnhandledRejections(){if(typeof window>"u")return;const e=t=>{const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence();let r="Unhandled Promise Rejection",o;if(t.reason instanceof Error)r=t.reason.message,o=t.reason.stack;else if(typeof t.reason=="string")r=t.reason;else if(t.reason)try{r=JSON.stringify(t.reason)}catch{r=String(t.reason)}const a={id:this.sequenceCounter.generateEventId("rej",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_UNHANDLED_REJECTION",category:"ERROR",source:"PAGE",payload:{message:r,stack:o,isUnhandledRejection:!0}};this.callback(a)};window.addEventListener("unhandledrejection",e),this.cleanups.push(()=>window.removeEventListener("unhandledrejection",e))}}class Oe{constructor(e,t,s,n=""){f(this,"privacy");f(this,"sequenceCounter");f(this,"callback");f(this,"sessionId");f(this,"isInstrumented",!1);f(this,"originalFetch",null);f(this,"originalXHROpen",null);f(this,"originalXHRSend",null);f(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentFetch(),this.instrumentXHR())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentFetch(){if(typeof window.fetch!="function")return;this.originalFetch=window.fetch;const e=this;window.fetch=async function(...t){const s=e.sequenceCounter.generateEventId("req_f"),n=t[0],i=t[1];let r="";typeof n=="string"?r=n:n instanceof URL?r=n.toString():n&&typeof n=="object"&&"url"in n&&(r=n.url);const o=((i==null?void 0:i.method)||(typeof n=="object"&&"method"in n?n.method:"GET")).toUpperCase(),a=e.privacy.sanitizeUrl(r),c=e.sequenceCounter.getRelativeTimestamp(),u=e.sequenceCounter.getWallClock(),d=e.sequenceCounter.nextSequence(),h={id:s,sessionId:e.sessionId,timestamp:c,sequence:d,wallClockTime:u,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:a,method:o,resourceType:"fetch",hasBody:!!(i!=null&&i.body)}};e.callback(h);try{const p=await e.originalFetch.apply(this,t),y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),g=Math.max(0,Math.round((y-c)*100)/100),b={id:e.sequenceCounter.generateEventId("res_f",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_RESPONSE_COMPLETE",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:p.status,statusText:p.statusText,durationMs:g}};return e.callback(b),p}catch(p){const y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),g=Math.max(0,Math.round((y-c)*100)/100),b={id:e.sequenceCounter.generateEventId("res_err",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:0,statusText:"Failed",durationMs:g,error:(p==null?void 0:p.message)||"Network request failed"}};throw e.callback(b),p}},this.cleanups.push(()=>{this.originalFetch&&(window.fetch=this.originalFetch)})}instrumentXHR(){if(typeof XMLHttpRequest>"u")return;this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send;const e=this;XMLHttpRequest.prototype.open=function(t,s,...n){return this._forensicRequestId=e.sequenceCounter.generateEventId("req_x"),this._forensicMethod=(t||"GET").toUpperCase(),this._forensicUrl=typeof s=="string"?s:s.toString(),e.originalXHROpen.apply(this,[t,s,...n])},XMLHttpRequest.prototype.send=function(t){const s=this._forensicRequestId||e.sequenceCounter.generateEventId("req_x"),n=this._forensicMethod||"GET",i=e.privacy.sanitizeUrl(this._forensicUrl||""),r=e.sequenceCounter.getRelativeTimestamp(),o=e.sequenceCounter.getWallClock(),a=e.sequenceCounter.nextSequence();this._forensicStartTime=r;const c={id:s,sessionId:e.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:i,method:n,resourceType:"xhr",hasBody:!!t}};e.callback(c);const u=()=>{const d=e.sequenceCounter.getRelativeTimestamp(),h=e.sequenceCounter.getWallClock(),p=e.sequenceCounter.nextSequence(),y=Math.max(0,Math.round((d-(this._forensicStartTime||r))*100)/100),v={id:e.sequenceCounter.generateEventId("res_x",p),sessionId:e.sessionId,timestamp:d,sequence:p,wallClockTime:h,type:this.status>=200&&this.status<400?"NETWORK_RESPONSE_COMPLETE":"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:i,method:n,status:this.status,statusText:this.statusText,durationMs:y,error:this.status===0?"XHR Network Error or Aborted":void 0}};e.callback(v)};return this.addEventListener("load",u),this.addEventListener("error",u),this.addEventListener("abort",u),e.originalXHRSend.apply(this,[t])},this.cleanups.push(()=>{this.originalXHROpen&&(XMLHttpRequest.prototype.open=this.originalXHROpen),this.originalXHRSend&&(XMLHttpRequest.prototype.send=this.originalXHRSend)})}}class Le{constructor(e={}){f(this,"sequenceCounter");f(this,"registry");f(this,"privacy");f(this,"snapshotEngine");f(this,"mutationObserver");f(this,"eventCollector");f(this,"diagnostics");f(this,"networkMonitor");f(this,"metadata");f(this,"isRecording",!1);f(this,"isPaused",!1);f(this,"eventListeners",new Set);f(this,"checkpointListeners",new Set);f(this,"lastCheckpointSequence",0);f(this,"lastCheckpointTimestamp",0);f(this,"checkpointTimer",null);f(this,"checkpointIntervalEvents",200);f(this,"checkpointIntervalMs",3e4);this.sequenceCounter=new oe,this.registry=new z,this.privacy=new se(e.privacy),this.snapshotEngine=new me(this.registry,this.privacy,this.sequenceCounter);const t=n=>this.handleEvent(n);this.mutationObserver=new Re(this.registry,this.privacy,this.sequenceCounter,this.snapshotEngine,t),this.eventCollector=new Me(this.registry,this.privacy,this.sequenceCounter,t),this.diagnostics=new ke(this.privacy,this.sequenceCounter,t),this.networkMonitor=new Oe(this.privacy,this.sequenceCounter,t),e.checkpointIntervalEvents&&(this.checkpointIntervalEvents=e.checkpointIntervalEvents),e.checkpointIntervalMs&&(this.checkpointIntervalMs=e.checkpointIntervalMs);const s=e.sessionId||`session_${Date.now()}_${Math.random().toString(36).substring(2,7)}`;this.metadata=this.createInitialMetadata(s,e.sessionName)}getSessionId(){return this.metadata.id}getMetadata(){return{...this.metadata,durationMs:this.sequenceCounter.getRelativeTimestamp(),endTime:this.metadata.endTime||Date.now()}}getRegistry(){return this.registry}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}onCheckpoint(e){return this.checkpointListeners.add(e),()=>this.checkpointListeners.delete(e)}start(e=typeof document<"u"?document:{}){if(this.isRecording)throw new Error(`Recorder session ${this.metadata.id} is already active`);this.sequenceCounter.reset(),this.registry.reset(),this.isRecording=!0,this.isPaused=!1,this.metadata.status="recording",this.metadata.startTime=Date.now(),this.mutationObserver.setSessionId(this.metadata.id),this.eventCollector.setSessionId(this.metadata.id),this.diagnostics.setSessionId(this.metadata.id),this.networkMonitor.setSessionId(this.metadata.id);const t=this.snapshotEngine.captureSnapshot(e,this.metadata.id);this.metadata.stats.nodeCount=t.totalNodeCount;const s={id:this.sequenceCounter.generateEventId("snap_init",t.sequence),sessionId:this.metadata.id,timestamp:t.timestamp,sequence:t.sequence,wallClockTime:Date.now(),type:"DOM_SNAPSHOT",category:"DOM",source:"PAGE",payload:{snapshot:t}};return this.createCheckpoint(t,"INITIAL"),this.mutationObserver.start(e),this.eventCollector.start(),this.diagnostics.start(),this.networkMonitor.start(),this.handleEvent(s),this.checkpointIntervalMs>0&&typeof setInterval<"u"&&(this.checkpointTimer=setInterval(()=>{this.isRecording&&!this.isPaused&&this.captureCheckpoint("PERIODIC",e)},this.checkpointIntervalMs)),t}stop(){return this.isRecording?(this.mutationObserver.takeRecords(),this.mutationObserver.stop(),this.eventCollector.stop(),this.diagnostics.stop(),this.networkMonitor.stop(),this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.isRecording=!1,this.metadata.status="stopped",this.metadata.endTime=Date.now(),this.metadata.durationMs=this.sequenceCounter.getRelativeTimestamp(),this.getMetadata()):this.getMetadata()}pause(){!this.isRecording||this.isPaused||(this.isPaused=!0,this.metadata.status="paused")}resume(){!this.isRecording||!this.isPaused||(this.isPaused=!1,this.metadata.status="recording")}captureCheckpoint(e="MANUAL",t=document){if(!this.isRecording)return null;const s=this.snapshotEngine.captureSnapshot(t,this.metadata.id);return this.createCheckpoint(s,e)}recordCustomEvent(e,t,s,n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("ext",o),sessionId:this.metadata.id,timestamp:i,sequence:o,wallClockTime:r,type:e,category:"EXTENSION",source:"CONTENT_SCRIPT",targetNodeId:s,targetSelector:n,payload:t};return this.handleEvent(a),a}recordScreenshot(e,t="MANUAL"){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("scr",i),sessionId:this.metadata.id,timestamp:s,sequence:i,wallClockTime:n,type:"SCREENSHOT_CHECKPOINT",category:"SCREENSHOT",source:"BROWSER_RUNTIME",payload:{screenshotId:`shot_${i}`,dataUrl:e,viewport:{width:typeof window<"u"?window.innerWidth:1920,height:typeof window<"u"?window.innerHeight:1080,scrollX:typeof window<"u"?window.scrollX:0,scrollY:typeof window<"u"?window.scrollY:0,devicePixelRatio:typeof window<"u"?window.devicePixelRatio:1},triggerReason:t}};return this.handleEvent(r),r}addAnnotation(e,t,s="AGENT",n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.nextSequence(),o={id:`ann_${r}_${Math.random().toString(36).substring(2,6)}`,sessionId:this.metadata.id,timestamp:i,sequence:r,nodeId:n,author:s,label:e,comment:t,createdAt:Date.now()},a={id:o.id,sessionId:this.metadata.id,timestamp:i,sequence:r,wallClockTime:Date.now(),type:"ANNOTATION",category:"ANNOTATION",source:s==="USER"?"USER_INTERACTION":"BROWSER_RUNTIME",targetNodeId:n,payload:{annotation:o}};return this.handleEvent(a),o}createCheckpoint(e,t){const s=this.sequenceCounter.getSequence()-this.lastCheckpointSequence;this.lastCheckpointSequence=this.sequenceCounter.getSequence(),this.lastCheckpointTimestamp=e.timestamp,this.metadata.stats.checkpointCount+=1;const n={checkpointId:`chk_${e.sequence}_${Date.now()}`,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:Date.now(),snapshot:e,eventIndex:this.metadata.stats.eventCount,eventsSinceLastCheckpoint:s,trigger:t},i={id:n.checkpointId,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:n.wallClockTime,type:"CHECKPOINT",category:"CHECKPOINT",source:"BROWSER_RUNTIME",payload:{checkpointId:n.checkpointId,snapshot:e,eventsSinceLastCheckpoint:s,totalEventsSoFar:this.metadata.stats.eventCount}};return this.checkpointListeners.forEach(r=>{try{r(n)}catch(o){console.error("[ForensicRecorder] Checkpoint listener error:",o)}}),this.handleEvent(i),n}handleEvent(e){this.isPaused&&e.type!=="CHECKPOINT"&&e.type!=="ANNOTATION"||(this.metadata.stats.eventCount+=1,e.category==="DOM"&&(this.metadata.stats.mutationCount+=1),e.category==="ERROR"&&(this.metadata.stats.errorCount+=1),e.category==="CONSOLE"&&(this.metadata.stats.consoleCount+=1),e.category==="NETWORK"&&(this.metadata.stats.networkCount+=1),e.category==="SCREENSHOT"&&(this.metadata.stats.screenshotCount+=1),this.isRecording&&e.type!=="CHECKPOINT"&&e.type!=="DOM_SNAPSHOT"&&this.sequenceCounter.getSequence()-this.lastCheckpointSequence>=this.checkpointIntervalEvents&&typeof document<"u"&&this.captureCheckpoint("PERIODIC"),this.eventListeners.forEach(t=>{try{t(e)}catch(s){console.error("[ForensicRecorder] Event listener error:",s)}}))}createInitialMetadata(e,t){const s={domRecording:typeof MutationObserver<"u"?"HEALTHY":"UNAVAILABLE",userEvents:typeof window<"u"?"HEALTHY":"UNAVAILABLE",console:typeof console<"u"?"HEALTHY":"UNAVAILABLE",network:typeof window<"u"&&typeof window.fetch<"u"?"HEALTHY":"PARTIAL",screenshots:"HEALTHY",shadowDom:typeof Element<"u"&&"attachShadow"in Element.prototype?"HEALTHY":"RESTRICTED",iframes:"PARTIAL"},n={eventCount:0,mutationCount:0,errorCount:0,consoleCount:0,networkCount:0,checkpointCount:0,screenshotCount:0,nodeCount:0};return{id:e,name:t||`Recording ${new Date().toLocaleTimeString()}`,url:typeof window<"u"?window.location.href:"about:blank",origin:typeof window<"u"?window.location.origin:"",title:typeof document<"u"?document.title:"Forensic Session",userAgent:typeof navigator<"u"?navigator.userAgent:"Node.js/ForensicAgent",schemaVersion:"2.0.0",recorderVersion:"2.0.0",extensionVersion:"2.0.0",startTime:Date.now(),status:"recording",health:s,stats:n}}}class L{static inspectPage(e=document){var n,i,r,o,a,c,u,d,h,p,y,v,m,g;const t=e.defaultView||(typeof window<"u"?window:{}),s=e.activeElement;return{url:((n=t.location)==null?void 0:n.href)||((i=e.location)==null?void 0:i.href)||"",title:e.title||"",origin:((r=t.location)==null?void 0:r.origin)||"",viewport:{width:t.innerWidth||((o=e.documentElement)==null?void 0:o.clientWidth)||1920,height:t.innerHeight||((a=e.documentElement)==null?void 0:a.clientHeight)||1080,scrollX:t.scrollX||t.pageXOffset||((c=e.documentElement)==null?void 0:c.scrollLeft)||0,scrollY:t.scrollY||t.pageYOffset||((u=e.documentElement)==null?void 0:u.scrollTop)||0,devicePixelRatio:t.devicePixelRatio||1},documentDimensions:{width:Math.max(((d=e.body)==null?void 0:d.scrollWidth)||0,((h=e.documentElement)==null?void 0:h.scrollWidth)||0),height:Math.max(((p=e.body)==null?void 0:p.scrollHeight)||0,((y=e.documentElement)==null?void 0:y.scrollHeight)||0)},activeElement:s?{tag:((v=s.tagName)==null?void 0:v.toLowerCase())||"",selector:this.computeBestSelector(s),text:(m=s.textContent)==null?void 0:m.slice(0,100).trim()}:void 0,focusedElement:typeof e.hasFocus=="function"&&e.hasFocus()&&s?{tag:((g=s.tagName)==null?void 0:g.toLowerCase())||"",selector:this.computeBestSelector(s)}:void 0,visibilityState:e.visibilityState||"visible",readyState:e.readyState||"complete",framesCount:e.querySelectorAll?e.querySelectorAll("iframe, frame").length:0}}static inspectElement(e,t){var te,Ne;const s=e.ownerDocument||document,n=s.defaultView||(typeof window<"u"?window:{}),i=e,r=e.tagName?e.tagName.toLowerCase():"element",o=this.extractClasses(e),{bestSelector:a,candidates:c}=this.generateSelectorCandidates(e),u={},d={};if(e.attributes)for(let G=0;G0||w.height>0||w.right>0||w.bottom>0,M=!S||w.right>0&&w.bottom>0&&w.left=q||w.top>=A),_=!O&&C!=="none"&&N!=="hidden"&&I>0&&M,P={disabled:i.disabled??e.hasAttribute("disabled"),readOnly:i.readOnly??e.hasAttribute("readonly"),checked:i.checked,selected:i.selected,focused:s.activeElement===e,isShadowHost:!!e.shadowRoot,hasShadowRoot:!!e.shadowRoot},H=[];let $=e.parentElement;for(;$&&$.tagName&&$.tagName.toLowerCase()!=="html";)H.push(this.computeBestSelector($)),$=$.parentElement;const F={count:e.children?e.children.length:0,tags:e.children?Array.from(e.children).slice(0,10).map(G=>G.tagName.toLowerCase()):[]};let W;if(t){const G=t.getId(e);W={logicalNodeId:G??null,creationSequence:null,lastMutationSequence:null,eventCount:0,isRecorded:G!=null}}return{tag:r,id:e.id||void 0,classes:o,role:h||void 0,ariaAttributes:Object.keys(d).length>0?d:void 0,text:v.slice(0,200),normalizedText:m.slice(0,200),value:g,type:b.type||void 0,selector:a,bestSelector:a,selectorCandidates:c,bounds:w,visibility:{isVisible:_,display:C,visibility:N,opacity:I,pointerEvents:R,isClipped:O,isInViewport:M,zIndex:x},computedStyle:E?{display:C,visibility:N,opacity:String(I),position:E.position,zIndex:String(x),pointerEvents:R,overflow:E.overflow,boxSizing:E.boxSizing,color:E.color,backgroundColor:E.backgroundColor,fontSize:E.fontSize}:{},attributes:u,state:P,context:{parentChain:H,parentSelector:H[0]||void 0,childrenSummary:F,containingBlock:(E==null?void 0:E.position)==="fixed"?"viewport":H[0]||void 0,iframe:null,shadowRoot:e.shadowRoot?"open":null},forensics:W}}static inspectVisualState(e){var b,T;const t=e.ownerDocument||document,s=t.defaultView||(typeof window<"u"?window:{}),n=e.getBoundingClientRect?e.getBoundingClientRect():{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},i=s.getComputedStyle?s.getComputedStyle(e):null,r=s.innerWidth||((b=t.documentElement)==null?void 0:b.clientWidth)||1920,o=s.innerHeight||((T=t.documentElement)==null?void 0:T.clientHeight)||1080,a=s.scrollX||s.pageXOffset||0,c=s.scrollY||s.pageYOffset||0,u=s.devicePixelRatio||1,d=(i==null?void 0:i.display)||"block",h=(i==null?void 0:i.visibility)||"visible",p=i&&parseFloat(i.opacity)||1,y=n.right>0&&n.bottom>0&&n.left=r||n.top>=o;let g=null;if(t.elementFromPoint&&y&&!v&&d!=="none"){const w=Math.max(0,Math.min(r-1,n.left+n.width/2)),E=Math.max(0,Math.min(o-1,n.top+n.height/2));try{const C=t.elementFromPoint(w,E);C&&C!==e&&!e.contains(C)&&!C.contains(e)&&(g=this.computeBestSelector(C))}catch{}}return{selector:this.computeBestSelector(e),bounds:{x:n.x??n.left??0,y:n.y??n.top??0,width:n.width??0,height:n.height??0,top:n.top??0,right:n.right??0,bottom:n.bottom??0,left:n.left??0},viewport:{scrollX:a,scrollY:c,width:r,height:o,devicePixelRatio:u},layout:{display:d,position:(i==null?void 0:i.position)||"static",zIndex:(i==null?void 0:i.zIndex)||"auto",opacity:p,visibility:h,overflow:(i==null?void 0:i.overflow)||"visible",boxSizing:(i==null?void 0:i.boxSizing)||"content-box",pointerEvents:(i==null?void 0:i.pointerEvents)||"auto"},occlusion:{isInViewport:y,isClipped:v||m,isZeroDimension:v,isTransparent:p===0,isDisplayNone:d==="none",isVisibilityHidden:h==="hidden",isOffscreen:m,occludedBy:g},computedStyleSummary:i?{display:d,position:i.position,zIndex:i.zIndex,opacity:String(p),visibility:h,pointerEvents:i.pointerEvents}:{}}}static generateSelectorCandidates(e){const t=e.ownerDocument||document,s=e.tagName?e.tagName.toLowerCase():"element",n=[];if(e.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(e.id)){const c=`#${e.id}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}const i=["data-testid","data-test","data-id","data-qa","data-cy","aria-label","name"];for(const c of i){const u=e.getAttribute(c);if(u&&/^[a-zA-Z0-9_-]+$/.test(u)){const d=`${s}[${c}="${u}"]`;try{t.querySelectorAll&&t.querySelectorAll(d).length===1&&n.push(d)}catch{n.push(d)}}}const r=this.extractClasses(e).filter(c=>/^[a-zA-Z0-9_-]+$/.test(c)&&!c.startsWith("ng-")&&!c.startsWith("_ng"));if(r.length>0){const c=`${s}.${r.slice(0,3).join(".")}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}if(e.parentElement&&e.parentElement.children){const c=Array.from(e.parentElement.children).filter(u=>u.tagName&&u.tagName.toLowerCase()===s);if(c.length>1){const u=c.indexOf(e)+1;if(u>0){const d=this.computeBestSelector(e.parentElement);n.push(`${d} > ${s}:nth-of-type(${u})`)}}}const o=r.length>0?`${s}.${r[0]}`:s;return n.push(o),{bestSelector:n[0]||s,candidates:n}}static computeBestSelector(e){return this.generateSelectorCandidates(e).bestSelector}static extractClasses(e){return e.classList&&typeof e.classList.forEach=="function"?Array.from(e.classList):typeof e.className=="string"?e.className.split(/\s+/).filter(Boolean):e.className&&typeof e.className.baseVal=="string"?e.className.baseVal.split(/\s+/).filter(Boolean):[]}static inferImplicitRole(e){switch(e.tagName?e.tagName.toLowerCase():""){case"a":return e.hasAttribute("href")?"link":void 0;case"button":return"button";case"input":{const s=e.type||"text";return s==="button"||s==="submit"||s==="reset"?"button":s==="checkbox"?"checkbox":s==="radio"?"radio":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"article":return"article";case"section":return"region";default:return}}}f(L,"privacyEngine",new se);class De{constructor(e){f(this,"registry");f(this,"lastSelectedElementRef");f(this,"timingHook",null);f(this,"lastTrajectory",[]);this.registry=e}setLastSelectedElement(e){this.lastSelectedElementRef=e}setTimingHook(e){this.timingHook=e}getLastTrajectory(){return this.lastTrajectory}async timing(e){this.timingHook&&await this.timingHook(e)}resolveTarget(e,t=document){if(e.selectedElementRef&&this.lastSelectedElementRef&&t.contains(this.lastSelectedElementRef))return this.lastSelectedElementRef;if(typeof e.nodeId=="number"&&this.registry){const s=this.registry.getNode(e.nodeId);if(s&&s instanceof Element&&t.contains(s))return s}if(e.selector)try{const s=t.querySelectorAll(e.selector);if(s.length>1){for(let n=0;n{r+=T.length});try{d.observe(t.body||t.documentElement,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}catch{}const h=T=>{o.push(T.message||"Runtime Error")};typeof window<"u"&&window.addEventListener("error",h);try{await this.dispatchAction(n,e)}finally{typeof window<"u"&&window.removeEventListener("error",h)}let p=!0;if((b=e.options)!=null&&b.waitForStabilization){const T=e.options.stabilizationTimeoutMs||300;await new Promise(w=>setTimeout(w,Math.min(2e3,T)))}d.disconnect();let y;t.contains(n)&&(y=L.inspectElement(n,this.registry));const v=Date.now()-s,m=a!=null&&a.__FORENSIC_CONSOLE_BUFFER__?a.__FORENSIC_CONSOLE_BUFFER__.slice(c).filter(T=>(T==null?void 0:T.level)==="error").length:0,g=a!=null&&a.__FORENSIC_NETWORK_BUFFER__?a.__FORENSIC_NETWORK_BUFFER__.slice(u).length:0;return{success:!0,action:e.action,target:y||i,beforeState:i,afterState:y,effects:{domMutations:r,consoleErrors:m,networkRequests:g,runtimeErrors:o},durationMs:v,stabilized:p}}async dispatchAction(e,t){var n,i,r,o,a,c;const s=e;switch(t.action){case"click":{this.scrollIntoViewIfNeeded(e),await this.timing("move"),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown"),this.dispatchMouseEvent(e,"mousedown"),typeof s.focus=="function"&&s.focus(),this.dispatchMouseEvent(e,"pointerup"),this.dispatchMouseEvent(e,"mouseup"),typeof s.click=="function"?s.click():this.dispatchMouseEvent(e,"click");break}case"double_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"click"),await this.timing("click"),this.dispatchMouseEvent(e,"click"),this.dispatchMouseEvent(e,"dblclick");break}case"right_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown",{button:2}),this.dispatchMouseEvent(e,"mousedown",{button:2}),this.dispatchMouseEvent(e,"contextmenu",{button:2});break}case"hover":{await this.timing("move"),this.dispatchMouseEvent(e,"pointerenter"),this.dispatchMouseEvent(e,"mouseenter"),this.dispatchMouseEvent(e,"mouseover"),await this.timing("move"),this.dispatchMouseEvent(e,"mousemove");break}case"focus":{typeof s.focus=="function"&&s.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:!0}));break}case"blur":{typeof s.blur=="function"&&s.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:!0}));break}case"type":{const u=t.text||"",d=e,h=((n=e.ownerDocument)==null?void 0:n.defaultView)||(typeof window<"u"?window:null);typeof s.focus=="function"&&s.focus();for(const y of u){await this.timing("type");const v=g=>{try{const T=(h==null?void 0:h.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(T)return new T(g,{key:y,bubbles:!0})}catch{}const b=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new b(g,{bubbles:!0,cancelable:!0})},m=(g,b)=>{try{const w=(h==null?void 0:h.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(w)return new w(g,b)}catch{}const T=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new T(g,{bubbles:!0,cancelable:!0})};e.dispatchEvent(v("keydown")),e.dispatchEvent(v("keypress")),"value"in d&&(d.value=(d.value||"")+y),e.dispatchEvent(m("input",{data:y,inputType:"insertText",bubbles:!0})),e.dispatchEvent(v("keyup"))}const p=(h==null?void 0:h.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}));break}case"clear":{const u=e,d=((i=e.ownerDocument)==null?void 0:i.defaultView)||(typeof window<"u"?window:null);if("value"in u){u.value="";const h=(y,v)=>{try{const g=(d==null?void 0:d.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(g)return new g(y,v)}catch{}const m=(d==null?void 0:d.CustomEvent)||(d==null?void 0:d.Event)||CustomEvent;return new m(y,{bubbles:!0,cancelable:!0})};e.dispatchEvent(h("input",{inputType:"deleteContentBackward",bubbles:!0}));const p=(d==null?void 0:d.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}))}break}case"press_key":{const u=t.key||"Enter",d=((r=e.ownerDocument)==null?void 0:r.defaultView)||(typeof window<"u"?window:null),h=p=>{try{const v=(d==null?void 0:d.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(v)return new v(p,{key:u,bubbles:!0})}catch{}const y=(d==null?void 0:d.CustomEvent)||(d==null?void 0:d.Event)||CustomEvent;return new y(p,{bubbles:!0,cancelable:!0})};e.dispatchEvent(h("keydown")),e.dispatchEvent(h("keypress")),e.dispatchEvent(h("keyup"));break}case"select_option":{const u=e;((o=u.tagName)==null?void 0:o.toLowerCase())==="select"&&t.optionValue&&(u.value=t.optionValue,e.dispatchEvent(new Event("change",{bubbles:!0})));break}case"scroll_into_view":{this.scrollIntoViewIfNeeded(e,!0);break}case"scroll":{const u=((a=t.scrollDelta)==null?void 0:a.x)||0,d=((c=t.scrollDelta)==null?void 0:c.y)||0;typeof e.scrollBy=="function"&&e.scrollBy(u,d);break}default:throw new Error(`Unsupported interaction action: ${t.action}`)}}scrollIntoViewIfNeeded(e,t=!1){if(typeof e.scrollIntoView=="function")try{e.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}catch{e.scrollIntoView(t)}}dispatchMouseEvent(e,t,s={}){const n=e.getBoundingClientRect?e.getBoundingClientRect():{left:0,top:0,width:0,height:0},i=n.left+n.width/2,r=n.top+n.height/2,o=new MouseEvent(t,{bubbles:s.bubbles!==void 0?s.bubbles:!0,cancelable:s.cancelable!==void 0?s.cancelable:!0,clientX:i,clientY:r,button:s.button||0,buttons:s.button===2?2:1});e.dispatchEvent(o)}}class ae{static matches(e,t){if(!e||e.nodeType!==U.ELEMENT_NODE)return!1;const s=t.trim();return s?s.includes(",")?s.split(",").some(n=>this.matchesSimple(e,n.trim())):this.matchesCompound(e,s):!1}static querySelector(e,t,s){const n=this.querySelectorAll(e,t,s,1);return n.length>0?n[0]:null}static querySelectorAll(e,t,s,n=1/0){const i=[],r=s[t];if(!r)return i;const o=[...r.children||[]],a=new Set;for(;o.length>0&&i.length=n))break;u.children&&u.children.length>0&&o.push(...u.children)}}return i}static getElementById(e,t){for(const s of Object.values(t))if(s.nodeType===U.ELEMENT_NODE&&!s.isDetached&&s.attributes&&s.attributes.id===e&&this.isNodeConnected(s,t))return s;return null}static isNodeConnected(e,t){if(e.isDetached)return!1;let s=e;const n=new Set;for(;s&&s.parentId;){if(n.has(s.id))return!1;n.add(s.id);const i=t[s.parentId];if(!i||i.isDetached)return!1;s=i}return!0}static computeSelector(e,t){var r,o;if(!e)return"";if(e.nodeType!==U.ELEMENT_NODE)return e.tagName||`#node-${e.id}`;if((r=e.attributes)!=null&&r.id)return`#${e.attributes.id}`;const s=e.tagName||"div",n=(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).filter(a=>a&&!a.startsWith("ng-")).slice(0,2),i=n.length>0?"."+n.join("."):"";if(e.parentId&&t[e.parentId]){const c=(t[e.parentId].children||[]).map(u=>t[u]).filter(u=>u&&u.nodeType===U.ELEMENT_NODE&&u.tagName===s);if(c.length>1){const u=c.findIndex(d=>d.id===e.id)+1;return`${s}${i}:nth-of-type(${u})`}}return`${s}${i}`}static matchesCompound(e,t){return this.matchesSimple(e,t)}static matchesSimple(e,t){var i,r,o,a,c,u,d;const s=((i=e.tagName)==null?void 0:i.toLowerCase())||"";if(t==="*")return!0;if(t.startsWith("#")){const h=t.substring(1);return((r=e.attributes)==null?void 0:r.id)===h}if(t.startsWith(".")){const h=t.substring(1);return(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).includes(h)}if(t.startsWith("[")&&t.endsWith("]")){const h=t.substring(1,t.length-1);if(h.includes("=")){const[p,y]=h.split("="),v=y.replace(/^["']|["']$/g,"");return((a=e.attributes)==null?void 0:a[p.trim()])===v}return!!((c=e.attributes)!=null&&c[h.trim()])}const n=t.match(/^([a-zA-Z0-9_-]+)(.*)$/);if(n){const h=n[1].toLowerCase(),p=n[2];if(h!==s&&h!=="*")return!1;if(!p)return!0;if(p.startsWith("#"))return((u=e.attributes)==null?void 0:u.id)===p.substring(1);if(p.startsWith("."))return(((d=e.attributes)==null?void 0:d.class)||"").split(/\s+/).includes(p.substring(1));if(p.startsWith("["))return this.matchesSimple(e,p)}return!1}}class $e{static traceElement(e,t,s){var x,q;const n=[...t].sort((A,S)=>A.sequence-S.sequence);let i=e.nodeId,r="unknown",o=e.selector||"",a={},c=0,u=0,d="init";if(!i&&e.selector&&s){const A=ae.querySelector(e.selector,s.rootId,s.nodes);A&&(i=A.id,r=A.tagName||"element",a={...A.attributes||{}},o=e.selector)}if(!i&&e.selector){for(const A of n)if(A.type==="DOM_MUTATION_ADD"){const S=A.payload;if(S.node&&ae.matches(S.node,e.selector)){i=S.node.id,r=S.node.tagName||"element",a={...S.node.attributes||{}},c=A.timestamp,u=A.sequence,d=A.id;break}}}if(!i)return null;const h=[];let p=!0,y=null,v=null,m,g=0;if(s&&s.nodes[i]){const A=s.nodes[i];r=A.tagName||r,a={...A.attributes||{}},o||(o=ae.computeSelector(A,s.nodes)),h.push({timestamp:s.timestamp,sequence:s.sequence,wallClockTime:Date.now(),stage:"CREATED",eventId:s.snapshotId,eventType:"DOM_SNAPSHOT",description:`Element <${r}> existed in initial baseline snapshot [ID: ${i}]`,details:{initialParentId:A.parentId,attributes:a},nodeSnapshot:A})}const b=new Map;if(s)for(const[A,S]of Object.entries(s.nodes))b.set(Number(A),S.parentId??null);const T=(A,S)=>{let M=b.get(S);const O=new Set;for(;M&&!O.has(M);){if(M===A)return!0;O.add(M),M=b.get(M)}return!1};for(const A of n){const S=A.timestamp,M=A.sequence,O=A.wallClockTime;if(A.type==="DOM_MUTATION_ADD"){const _=A.payload;(x=_.node)!=null&&x.id&&b.set(_.node.id,_.parentId??null),((q=_.node)==null?void 0:q.id)===i&&(p=!0,r=_.node.tagName||r,c=S,u=M,d=A.id,a={..._.node.attributes||{}},h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"ATTACHED_TO_DOM",eventId:A.id,eventType:A.type,description:`Element <${r}> added to DOM under parent ID ${_.parentId}`,details:{parentId:_.parentId,index:_.index},nodeSnapshot:_.node}))}if(A.type==="DOM_MUTATION_REMOVE"){const _=A.payload;_.nodeId===i?(p=!1,y=S,v=M,m=A.id,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"REMOVED_FROM_DOM",eventId:A.id,eventType:A.type,description:`Element <${r}> explicitly removed from parent ID ${_.parentId}`,details:{parentId:_.parentId,removedIndex:_.index}})):T(_.nodeId,i)&&(p=!1,y=S,v=M,m=A.id,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"PARENT_SUBTREE_REPLACED",eventId:A.id,eventType:A.type,description:`Ancestor element [ID: ${_.nodeId}] was removed, causing target element [ID: ${i}] to detach from DOM`,details:{removedAncestorId:_.nodeId,parentId:_.parentId}}))}if(A.type==="DOM_MUTATION_MOVE"){const _=A.payload;_.nodeId&&b.set(_.nodeId,_.newParentId??null),_.nodeId===i&&(g++,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"REPARENTED",eventId:A.id,eventType:A.type,description:`Element reparented from parent ${_.oldParentId} to ${_.newParentId}`,details:{oldParentId:_.oldParentId,newParentId:_.newParentId}}))}if(A.type==="DOM_MUTATION_ATTR"){const _=A.payload;if(_.nodeId===i){g++;const P=_.attributeName.toLowerCase();let H="ATTRIBUTE_MODIFIED";P==="class"&&(H="CLASS_MODIFIED"),P==="style"&&(H="STYLE_MODIFIED"),h.push({timestamp:S,sequence:M,wallClockTime:O,stage:H,eventId:A.id,eventType:A.type,description:`Attribute '${_.attributeName}' changed from '${_.oldValue??""}' to '${_.newValue??""}'`,details:{attributeName:_.attributeName,oldValue:_.oldValue,newValue:_.newValue}})}}if(A.type==="DOM_MUTATION_TEXT"){const _=A.payload;_.nodeId===i&&(g++,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"TEXT_MODIFIED",eventId:A.id,eventType:A.type,description:`Text content changed: "${_.oldText}" → "${_.newText}"`,details:{oldText:_.oldText,newText:_.newText}}))}}const w=y??c,E=500,C=n.filter(A=>(A.category==="ERROR"||A.category==="CONSOLE")&&Math.abs(A.timestamp-w)<=E),N=n.filter(A=>A.category==="NETWORK"&&Math.abs(A.timestamp-w)<=E),I=n.length>0?n[n.length-1].timestamp:c,R=Math.max(0,(y??I)-c);return{targetNodeId:i,tagName:r,selectorHint:o,initialAttributes:a,createdAt:c,createdSequence:u,createdEventId:d,removedAt:y,removedSequence:v,removedEventId:m,isCurrentlyAlive:p,lifespanMs:Math.round(R*100)/100,mutationCount:g,entries:h,correlatedDiagnostics:C,correlatedNetwork:N}}}class qe{static analyze(e,t,s){var R,x,q,A;const n=typeof e=="number"?{nodeId:e}:{selector:e},i=$e.traceElement(n,t,s);if(!i)return{targetQuery:e,found:!1,disappearanceMechanism:"UNKNOWN",likelyRootCause:"Target element could not be found in recording baseline or event stream",confidenceScore:0,detailedExplanation:`No element matching "${e}" was ever created, recorded in the initial DOM snapshot, or observed in mutation events.`,evidentiaryTrail:[],precedingEvents:[],followingEvents:[],correlatedErrors:[],correlatedNetworkCalls:[],alternativeHypotheses:[{hypothesis:"Element was injected into an unmonitored isolated iframe or ShadowRoot closed mode",likelihood:40,evidenceFor:["Element query yielded zero matches in monitored document"],evidenceAgainst:["Iframes/ShadowRoots were accessible in this session"]},{hypothesis:"Selector typo or timing mismatch",likelihood:60,evidenceFor:["Target selector did not match any recorded tag or class"],evidenceAgainst:[]}]};const r=[...t].sort((S,M)=>S.sequence-M.sequence),o=[],a=[];let c="UNKNOWN",u="Unknown disappearance mechanism",d=50,h="",p=i.removedAt??void 0;const y=i.entries.find(S=>S.stage==="REMOVED_FROM_DOM"),v=i.entries.find(S=>S.stage==="PARENT_SUBTREE_REPLACED"),m=i.entries.find(S=>S.stage==="CLASS_MODIFIED"&&/\b(hidden|hide|d-none|invisible|collapsed)\b/i.test(String(S.details.newValue||""))),g=i.entries.find(S=>S.stage==="STYLE_MODIFIED"&&/display\s*:\s*none|visibility\s*:\s*hidden|opacity\s*:\s*0/i.test(String(S.details.newValue||"")));y?(c="DIRECT_NODE_REMOVAL",p=y.timestamp,u=`Element [ID: ${i.targetNodeId}] <${i.tagName}> was directly removed from its parent [ID: ${y.details.parentId}] via DOM removeChild/replaceChild`,d=95,o.push({timestamp:y.timestamp,sequence:y.sequence,eventId:y.eventId,eventType:y.eventType,evidenceType:"DIRECT",description:`Direct DOM removal mutation: element detached from parent ID ${y.details.parentId}`,confidenceContribution:50})):v?(c="PARENT_SUBTREE_REPLACED",p=v.timestamp,u=`Host framework (e.g. React/Vue re-render) destroyed and replaced Ancestor container [ID: ${v.details.removedAncestorId}], causing injected element to be unmounted`,d=92,o.push({timestamp:v.timestamp,sequence:v.sequence,eventId:v.eventId,eventType:v.eventType,evidenceType:"DIRECT",description:`Ancestor container [ID: ${v.details.removedAncestorId}] was removed, wiping out all child subtrees`,confidenceContribution:50})):g?(c="STYLE_DISPLAY_NONE",p=g.timestamp,u=`Element was visually hidden by an inline style modification: "${g.details.newValue}"`,d=88,o.push({timestamp:g.timestamp,sequence:g.sequence,eventId:g.eventId,eventType:g.eventType,evidenceType:"DIRECT",description:`Inline style changed to "${g.details.newValue}"`,confidenceContribution:45})):m?(c="CLASS_TRIGGERED_HIDDEN",p=m.timestamp,u=`Element was visually hidden because its CSS class list was modified to include "${m.details.newValue}"`,d=85,o.push({timestamp:m.timestamp,sequence:m.sequence,eventId:m.eventId,eventType:m.eventType,evidenceType:"DIRECT",description:`Class list changed from "${m.details.oldValue??""}" to "${m.details.newValue??""}"`,confidenceContribution:45})):i.isCurrentlyAlive&&(c="UNKNOWN",u=`Element [ID: ${i.targetNodeId}] is currently alive and attached to the DOM tree (no unmount mutation detected)`,d=70,h="The element exists in the current DOM state. If it is not visible on screen, it may be clipped by viewport boundaries, z-index stacking context, or 0x0 pixel dimensions.");const b=p??i.createdAt,T=500,w=r.filter(S=>S.timestamp>=b-T&&S.timestampS.timestamp>b&&S.timestamp<=b+T),C=w.filter(S=>S.category==="ERROR");if(C.length>0){const S=C[0],M=((R=S.payload)==null?void 0:R.message)||"Unknown runtime error";o.push({timestamp:S.timestamp,sequence:S.sequence,eventId:S.id,eventType:S.type,evidenceType:"PRECEDING",description:`Runtime error occurred ${(b-S.timestamp).toFixed(1)}ms before disappearance: "${M}"`,confidenceContribution:20,rawEvent:S}),u+=` (preceded by runtime error: "${M}")`}const N=w.filter(S=>S.type==="NETWORK_RESPONSE_COMPLETE"||S.type==="NETWORK_REQUEST_FAILED");if(N.length>0){const S=N[0],M=((x=S.payload)==null?void 0:x.url)||"network request";o.push({timestamp:S.timestamp,sequence:S.sequence,eventId:S.id,eventType:S.type,evidenceType:"PRECEDING",description:`Network response completed ${(b-S.timestamp).toFixed(1)}ms before disappearance: ${M}`,confidenceContribution:15,rawEvent:S})}const I=w.filter(S=>S.category==="NAVIGATION");if(I.length>0){const S=I[0];o.push({timestamp:S.timestamp,sequence:S.sequence,eventId:S.id,eventType:S.type,evidenceType:"PRECEDING",description:`Navigation event (${(q=S.payload)==null?void 0:q.navigationType}) occurred ${(b-S.timestamp).toFixed(1)}ms before disappearance`,confidenceContribution:25,rawEvent:S}),u+=` following SPA navigation to "${(A=S.payload)==null?void 0:A.url}"`}return h||(h=[`Element <${i.tagName}> (Logical ID: ${i.targetNodeId}, selector: "${i.selectorHint}") was created at ${i.createdAt.toFixed(1)}ms.`,`It remained alive in the DOM for ${i.lifespanMs.toFixed(1)}ms and experienced ${i.mutationCount} mutations.`,`At timestamp ${b.toFixed(1)}ms, it disappeared via [${c}].`,`Diagnosis: ${u}.`].join(" ")),c==="PARENT_SUBTREE_REPLACED"?(a.push({hypothesis:"Direct cleanup called by extension code",likelihood:25,evidenceFor:["Element was unmounted shortly after creation"],evidenceAgainst:["Ancestor container mutation was recorded from host page context"]}),a.push({hypothesis:"Host single-page app route change destroyed component tree",likelihood:35,evidenceFor:I.length>0?["Preceding navigation event recorded"]:[],evidenceAgainst:I.length===0?["No navigation events occurred in temporal window"]:[]})):c==="DIRECT_NODE_REMOVAL"&&a.push({hypothesis:"Third-party script or ad-blocker removed the injected node",likelihood:30,evidenceFor:["Direct node removal occurred without ancestor replacement"],evidenceAgainst:["No ad-blocker signatures or extension error logs observed"]}),{targetQuery:e,targetNodeId:i.targetNodeId,found:!0,tagName:i.tagName,selectorHint:i.selectorHint,createdAt:i.createdAt,firstVisibleAt:i.createdAt,lastKnownGoodStateAt:Math.max(0,b-1),disappearedAt:p,lifespanMs:i.lifespanMs,disappearanceMechanism:c,likelyRootCause:u,confidenceScore:Math.min(99,d),detailedExplanation:h,evidentiaryTrail:o,precedingEvents:w,followingEvents:E,correlatedErrors:C,correlatedNetworkCalls:N,alternativeHypotheses:a}}}class Pe{constructor(e){f(this,"activeObservation",null);f(this,"registry");f(this,"sequenceCounter");this.registry=e,this.sequenceCounter=new oe}isObserving(){return this.activeObservation!==null}startObservation(e,t=document){this.activeObservation&&this.stopObservation(t);const s=`obs_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,n=Date.now(),i=L.inspectElement(e,this.registry),r=i.bestSelector,o=[],a=this.registry?this.registry.getOrCreateId(e,0):100;o.push({id:`evt_init_${s}`,sessionId:s,timestamp:0,sequence:1,wallClockTime:n,type:"DOM_MUTATION_ADD",category:"DOM",source:"BROWSER_RUNTIME",targetNodeId:a,targetSelector:r,payload:{node:{id:a,nodeType:1,tagName:i.tag,attributes:i.attributes,textContent:i.text,children:[],parentId:null},parentId:null,index:0}});const c=new MutationObserver(u=>{const d=Date.now()-n;for(const h of u)if(h.type==="childList"){for(let p=0;p0&&(m=qe.analyze(n,a)),{observationId:t,targetSelector:n,targetNodeId:((g=r.forensics)==null?void 0:g.logicalNodeId)||void 0,startTime:i,endTime:u,durationMs:d,initialState:r,finalState:p,disappeared:y,disappearanceReason:v,mutations:a.filter(b=>b.category==="DOM"),diagnostics:a.filter(b=>b.category==="ERROR"||b.category==="CONSOLE"),networkEvents:a.filter(b=>b.category==="NETWORK"),screenshots:c,correlationReport:m}}}class Ue{constructor(e={}){f(this,"isExplicitModeActive",!1);f(this,"isGlobalShortcutActive",!1);f(this,"highlighterEl",null);f(this,"badgeEl",null);f(this,"lastSelectedElement",null);f(this,"options",{});f(this,"onMouseMoveBound");f(this,"onClickBound");f(this,"onKeyDownBound");f(this,"onGlobalClickBound");this.options=e,this.onMouseMoveBound=this.handleMouseMove.bind(this),this.onClickBound=this.handleClick.bind(this),this.onKeyDownBound=this.handleKeyDown.bind(this),this.onGlobalClickBound=this.handleGlobalCtrlShiftClick.bind(this),this.initGlobalShortcutListener()}initGlobalShortcutListener(){typeof window>"u"||this.isGlobalShortcutActive||(window.addEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!0)}startPicker(e){typeof document>"u"||(e&&(this.options={...this.options,...e}),!this.isExplicitModeActive&&(this.isExplicitModeActive=!0,this.ensureHighlighter(),document.body&&(document.body.style.cursor="crosshair"),window.addEventListener("mousemove",this.onMouseMoveBound,!0),window.addEventListener("click",this.onClickBound,!0),window.addEventListener("keydown",this.onKeyDownBound,!0)))}stopPicker(){this.isExplicitModeActive&&(this.isExplicitModeActive=!1,typeof document<"u"&&document.body&&(document.body.style.cursor="default"),this.removeHighlighter(),typeof window<"u"&&(window.removeEventListener("mousemove",this.onMouseMoveBound,!0),window.removeEventListener("click",this.onClickBound,!0),window.removeEventListener("keydown",this.onKeyDownBound,!0)))}getLastSelectedElement(){return this.lastSelectedElement}setSelectedElement(e){let t;return"tag"in e&&"bestSelector"in e&&typeof e.getAttribute!="function"?t=e:(t=L.inspectElement(e,this.options.nodeRegistry),this.flashSelection(e)),this.lastSelectedElement=t,this.options.onSelected&&this.options.onSelected(t),t}handleGlobalCtrlShiftClick(e){if(!e.ctrlKey||!e.shiftKey)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s)}handleMouseMove(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t)){this.hideHighlighter();return}this.updateHighlighter(t)}handleClick(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s),this.stopPicker()}handleKeyDown(e){e.key==="Escape"&&this.isExplicitModeActive&&(e.preventDefault(),this.stopPicker(),this.options.onCanceled&&this.options.onCanceled())}isExtensionOwned(e){return!!(e.id==="forensic-recorder-floating-host"||e.id==="forensic-inspect-highlighter"||e.closest("#forensic-recorder-floating-host")||e.closest("#forensic-inspect-highlighter")||e.hasAttribute("data-forensic-internal")||e.closest("[data-forensic-internal]"))}ensureHighlighter(){if(typeof document>"u"||this.highlighterEl)return;const e=this.options.highlightColor||"#0ea5e9",t=document.createElement("div");t.id="forensic-inspect-highlighter",t.setAttribute("data-forensic-internal","true"),t.style.position="fixed",t.style.pointerEvents="none",t.style.zIndex="2147483640",t.style.border=`2px solid ${e}`,t.style.background="rgba(14, 165, 233, 0.18)",t.style.borderRadius="3px",t.style.boxShadow=`0 0 12px ${e}88`,t.style.transition="all 0.05s ease-out",t.style.display="none";const s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="absolute",s.style.bottom="100%",s.style.left="0",s.style.transform="translateY(-4px)",s.style.background="#0f172a",s.style.color="#38bdf8",s.style.fontSize="11px",s.style.fontFamily="monospace",s.style.fontWeight="bold",s.style.padding="2px 6px",s.style.borderRadius="3px",s.style.boxShadow="0 2px 6px rgba(0,0,0,0.5)",s.style.whiteSpace="nowrap",s.style.pointerEvents="none",t.appendChild(s),document.body.appendChild(t),this.highlighterEl=t,this.badgeEl=s}updateHighlighter(e){if(this.ensureHighlighter(),!this.highlighterEl||!this.badgeEl)return;const t=e.getBoundingClientRect();this.highlighterEl.style.display="block",this.highlighterEl.style.left=`${t.left}px`,this.highlighterEl.style.top=`${t.top}px`,this.highlighterEl.style.width=`${Math.max(1,t.width)}px`,this.highlighterEl.style.height=`${Math.max(1,t.height)}px`;const s=e.tagName.toLowerCase(),n=e.id?`#${e.id}`:"",i=e.className&&typeof e.className=="string"?"."+e.className.split(/\s+/)[0]:"",r=`${Math.round(t.width)}×${Math.round(t.height)}`;this.badgeEl.textContent=`<${s}${n}${i}> [${r}]`}hideHighlighter(){this.highlighterEl&&(this.highlighterEl.style.display="none")}removeHighlighter(){this.highlighterEl&&this.highlighterEl.parentElement&&this.highlighterEl.remove(),this.highlighterEl=null,this.badgeEl=null}flashSelection(e){if(typeof document>"u"||!e.getBoundingClientRect)return;const t=e.getBoundingClientRect(),s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="fixed",s.style.left=`${t.left}px`,s.style.top=`${t.top}px`,s.style.width=`${Math.max(1,t.width)}px`,s.style.height=`${Math.max(1,t.height)}px`,s.style.border="2px solid #22c55e",s.style.background="rgba(34, 197, 94, 0.25)",s.style.zIndex="2147483645",s.style.pointerEvents="none",s.style.transition="opacity 0.6s ease-out",document.body.appendChild(s),setTimeout(()=>{s.style.opacity="0",setTimeout(()=>s.remove(),600)},400)}notifyExtension(e){var t;try{typeof chrome<"u"&&((t=chrome.runtime)!=null&&t.sendMessage)&&chrome.runtime.sendMessage({type:"ELEMENT_SELECTED",elementInfo:e,timestamp:Date.now()})}catch{}}destroy(){this.stopPicker(),typeof window<"u"&&window.removeEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!1}}class fe{static getCrcTable(){if(this.crcTable)return this.crcTable;const e=new Uint32Array(256);for(let t=0;t<256;t++){let s=t;for(let n=0;n<8;n++)s=s&1?3988292384^s>>>1:s>>>1;e[t]=s>>>0}return this.crcTable=e,e}static crc32(e,t=0,s=e.length){const n=this.getCrcTable();let i=4294967295;for(let r=t;r>>8^n[(i^e[r])&255];return(i^4294967295)>>>0}static adler32(e){let t=1,s=0;for(let n=0;n>>0}static createPNG(e){const t=Math.max(1,Math.min(1920,Math.floor(e.width))),s=Math.max(1,Math.min(1080,Math.floor(e.height))),n=e.backgroundColor||[15,23,42,255],i=e.headerColor||[56,189,248,255],r=e.borderColor||[99,102,241,255],o=1+t*4,a=new Uint8Array(o*s),c=Math.min(30,Math.floor(s*.2));for(let g=0;g=e.length,h=new Uint8Array(5+u);h[0]=d?1:0,h[1]=u&255,h[2]=u>>>8&255;const p=~u&65535;h[3]=p&255,h[4]=p>>>8&255,h.set(e.subarray(n,n+u),5),t.push(h),n+=u}const i=t.reduce((c,u)=>c+u.length,0)+2+4,r=new Uint8Array(i);let o=0;r[o++]=120,r[o++]=1;for(const c of t)r.set(c,o),o+=c.length;const a=this.adler32(e);return r[o++]=a>>>24&255,r[o++]=a>>>16&255,r[o++]=a>>>8&255,r[o++]=a&255,r}static writeChunk(e,t,s,n){const i=n.length,r=new DataView(e.buffer,e.byteOffset,e.byteLength);r.setUint32(t,i,!1),t+=4;const o=new Uint8Array(4+i);for(let c=0;c<4;c++){const u=s.charCodeAt(c);e[t+c]=u,o[c]=u}t+=4,i>0&&(e.set(n,t),o.set(n,4),t+=i);const a=this.crc32(o);return r.setUint32(t,a,!1),t+=4,t}}f(fe,"crcTable",null);const ne=500;class He{constructor(e,t){f(this,"history",[]);f(this,"undoStack",[]);f(this,"redoStack",[]);f(this,"counter",0);f(this,"transaction",null);this.doc=e,this.registry=t}mutate(e){var d;const t=`mut_${Date.now().toString(36)}_${++this.counter}`,s=Date.now();let n;try{n=this.resolveTarget(e.target)}catch(h){return this.failure(t,e,null,h.message,Date.now()-s)}const i=this.snapshotState(n);let r=null,o=null,a,c=!0;try{const h=this.applyOperation(t,e,n);h&&(this.transaction?this.transaction.undoRecords.push(h):(this.undoStack.push(h),this.redoStack=[]));const y=(n.isConnected!==void 0?n.isConnected:this.doc.contains(n))?n:this.doc.querySelector(i.selector)||n;r=this.snapshotState(y),o=this.quickDiff(i,r,n)}catch(h){c=!1,a=h.message,r=null}const u={mutationId:t,operation:e.operation,success:c,before:i,after:r,diff:o,affectedSelector:c?i.selector:null,durationMs:Date.now()-s,error:a,undoable:c&&(this.transaction?this.transaction.undoRecords.length>0:this.undoStack.length>0)};return this.transaction&&this.transaction.steps.push({stepId:`step_${this.transaction.steps.length+1}`,mutation:u}),this.pushHistory({mutationId:t,transactionId:(d=this.transaction)==null?void 0:d.id,timestamp:Date.now(),operation:e.operation,targetSelector:i.selector,success:c,summary:`${e.operation} on ${i.selector}${o?` (+${o.added}/-${o.removed}/~${o.changed})`:""}`,undoApplied:!1,redoApplied:!1}),u}beginTransaction(){if(this.transaction)throw new Error(`TRANSACTION_ALREADY_OPEN: ${this.transaction.id} — commit or rollback first.`);return this.transaction={id:`tx_${Date.now().toString(36)}_${++this.counter}`,steps:[],undoRecords:[]},this.transaction.id}commitTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before committing.");const t=this.transaction,s=Date.now();let n=!0,i;if(e)try{n=e({id:t.id,steps:t.steps})!==!1,n||(i="VERIFY_FAILED: caller verification rejected the transaction state.")}catch(o){n=!1,i=`VERIFY_ERROR: ${o.message}`}if(!n)return this.rollbackInternal(t,i||"VERIFY_FAILED",s);this.undoStack.push(...t.undoRecords),this.undoStack.length>ne&&this.undoStack.splice(0,this.undoStack.length-ne),this.redoStack=[];const r=this.summaryOf(t);return this.transaction=null,{transactionId:t.id,committed:!0,rolledBack:!1,steps:t.steps,durationMs:Date.now()-s,finalStateSummary:r}}rollbackTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before rolling back.");const t=this.transaction;return this.rollbackInternal(t,e||"ROLLBACK_REQUESTED",Date.now())}rollbackInternal(e,t,s){for(const i of[...e.undoRecords].reverse())try{this.applyUndo(i)}catch{}const n=this.summaryOf(e);return this.transaction=null,{transactionId:e.id,committed:!1,rolledBack:!0,steps:e.steps,error:t,durationMs:Date.now()-s,finalStateSummary:n}}undo(){const e=this.transaction?this.transaction.undoRecords:this.undoStack,t=e.pop();if(!t)return{success:!1,message:"Nothing to undo — the mutation history is empty."};try{this.applyUndo(t)}catch(s){return e.push(t),{success:!1,mutationId:t.mutationId,message:`UNDO_FAILED: ${s.message}`}}return this.redoStack.push(t),this.markHistory(t.mutationId,"undo"),{success:!0,mutationId:t.mutationId,message:`Undid ${t.operation} on ${t.targetSelector}.`}}redo(){const e=this.redoStack.pop();if(!e)return{success:!1,message:"Nothing to redo — no undone mutation is pending."};try{const t=this.resolveTarget({selector:e.targetSelector}),s={operation:e.operation,target:{selector:e.targetSelector}};return this.reapplyRecord(e,t,s)?((this.transaction?this.transaction.undoRecords:this.undoStack).push(e),this.markHistory(e.mutationId,"redo"),{success:!0,mutationId:e.mutationId,message:`Redid ${e.operation} on ${e.targetSelector}.`}):(this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:"REDO_FAILED: target state diverged — cannot safely reapply."})}catch(t){return this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:`REDO_FAILED: ${t.message}`}}}getHistory(e=100){return this.history.slice(-e)}getUndoDepth(){return this.transaction?this.transaction.undoRecords.length:this.undoStack.length}getRedoDepth(){return this.redoStack.length}getOpenTransactionId(){var e;return((e=this.transaction)==null?void 0:e.id)||null}preview(e){var t;try{const s=this.resolveTarget(e.target),n=[];let i=1;(e.operation==="set_inner_html"||e.operation==="set_outer_html")&&(n.push("HTML replacement can destroy descendant node identity — captured regions targeting children may become stale."),i=s.querySelectorAll("*").length+1),(e.operation==="remove_element"||e.operation==="unwrap_element")&&(n.push("Removal is destructive; the undo record preserves the full serialized subtree."),i=s.querySelectorAll("*").length+1),e.operation==="move_element"&&!e.parent&&n.push("No parent target supplied — move requires payload.parent."),e.operation==="wrap_element"&&!e.newElementHtml&&n.push("No wrapper HTML supplied — a neutral
wrapper will be generated.");const r=Be(e,s);return{valid:n.filter(o=>o.includes("requires")||o.includes("No parent")).length===0,operation:e.operation,target:{selector:this.snapshotState(s).selector,tag:s.tagName.toLowerCase()},expectedChange:r,affectedNodes:i,warnings:n}}catch(s){return{valid:!1,operation:e.operation,target:{selector:String(((t=e.target)==null?void 0:t.selector)||""),tag:""},expectedChange:"—",affectedNodes:0,warnings:[],error:s.message}}}applyOperation(e,t,s){var r;const n=this.snapshotState(s).selector,i=t.operation;switch(i){case"set_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);return s.setAttribute(t.attribute,t.value??""),this.undoFor(e,i,n,{kind:o===null?"remove-attribute":"restore-attribute",attribute:t.attribute,value:o})}case"remove_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);if(o===null)throw new Error(`ATTRIBUTE_NOT_PRESENT: "${t.attribute}" is not set on ${n}.`);return s.removeAttribute(t.attribute),this.undoFor(e,i,n,{kind:"restore-attribute",attribute:t.attribute,value:o})}case"set_text":{const o=s.textContent||"";return s.textContent=t.text??"",this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"replace_text":{if(!t.text||!t.replacement)throw new Error("TEXT_PATTERNS_REQUIRED: payload.text (search) and payload.replacement are required.");const o=s.textContent||"";return s.textContent=o.split(t.text).join(t.replacement),this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"set_inner_html":{const o=s.innerHTML;return s.innerHTML=t.html??"",this.undoFor(e,i,n,{kind:"restore-outer-html",outerHtml:s.outerHTML.replace(t.html??"",o)||void 0,text:o,attribute:"__inner"})}case"set_outer_html":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: element has no parent — cannot replace outer HTML.");const c=this.doc.createComment(`mcpdom_undo_${e}`);s.replaceWith(c);const u=this.doc.createElement("template");u.innerHTML=t.html??"";const d=u.content.firstElementChild;return d?c.replaceWith(d):c.replaceWith(this.doc.createTextNode(t.html??"")),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:this.siblingSelector(d||s)})}case"add_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.add(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"remove_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"replace_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return t.value&&s.classList.add(t.value),this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"set_style":{const o=this.doc.defaultView;if(!(o!=null&&o.getComputedStyle))throw new Error("STYLE_UNAVAILABLE: computed style API is unavailable in this context.");const a={};for(const c of Object.keys(t.style||{}))a[c]=o.getComputedStyle(s).getPropertyValue(c),s.style.setProperty(c,t.style[c]);return this.undoFor(e,i,n,{kind:"restore-style",style:a})}case"remove_style":{const o={};for(const a of t.classes||[])o[a]=s.style.getPropertyValue(a),s.style.removeProperty(a);return this.undoFor(e,i,n,{kind:"restore-style",style:o})}case"add_element":{const o=t.parent?this.resolveTarget(t.parent):s,a=this.doc.createElement("template");a.innerHTML=t.newElementHtml??"
";const c=a.content.firstElementChild;if(!c)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");switch(t.position||"append"){case"before":s.before(c);break;case"after":s.after(c);break;case"prepend":o.prepend(c);break;default:o.appendChild(c)}return this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(c).selector})}case"remove_element":{const o=s.outerHTML,a=s.parentElement,c=s.nextElementSibling;return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"replace_element":{const o=s.outerHTML,a=s.parentElement,c=this.doc.createElement("template");c.innerHTML=t.newElementHtml??"
";const u=c.content.firstElementChild;if(!u)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");const d=s.nextElementSibling;return s.replaceWith(u),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:d?this.snapshotState(d).selector:null})}case"move_element":{if(!t.parent)throw new Error("PARENT_REQUIRED: payload.parent is required for move_element.");const o=this.resolveTarget(t.parent),a=s.outerHTML,c=s.parentElement,u=s.nextElementSibling,d=t.position==="before"||t.position==="prepend"?o.firstElementChild:null;return o[t.position==="prepend"?"prepend":"appendChild"](s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:d?this.snapshotState(d).selector:null,outerHtml:a})}case"wrap_element":{const o=this.doc.createElement("template");o.innerHTML=t.newElementHtml||'
';const a=o.content.firstElementChild;if(!a)throw new Error("INVALID_HTML: wrapper template produced no element.");const c=s.parentElement,u=s.nextElementSibling;return s.replaceWith(a),a.appendChild(s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:null})}case"unwrap_element":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: cannot unwrap a root-level element.");const c=s.nextElementSibling,u=Array.from(s.children);for(const d of u)a.insertBefore(d,s);return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"clone_subtree":{const o=t.parent?this.resolveTarget(t.parent):s.parentElement||s,a=s.cloneNode(!0);if(t.copyAttributes!==!1)for(const c of Array.from(a.attributes))c.name==="id"&&a.removeAttribute("id");return(r=o.appendChild)==null||r.call(o,a),this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(a).selector})}default:throw new Error(`UNKNOWN_OPERATION: ${i} is not a supported DOM mutation.`)}}applyUndo(e){const t=e.inverse;switch(t.kind){case"restore-outer-html":{const s=this.resolveTarget({selector:e.targetSelector});if(t.outerHtml!==void 0){const n=this.doc.createElement("template");n.innerHTML=t.outerHtml;const i=n.content.firstElementChild;i&&s.replaceWith(i)}else t.attribute==="__inner"&&(s.innerHTML=t.text||"");break}case"reinsert-node":{const s=t.parentSelector?this.resolveTarget({selector:t.parentSelector}):this.doc.body,n=this.doc.createElement("template");n.innerHTML=t.outerHtml||"";const i=n.content.firstElementChild;if(!i)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const r=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;s.insertBefore(i,r);break}case"remove-node":{const s=this.safeResolve(t.attribute||e.targetSelector);s&&s.remove();break}case"restore-attribute":{this.resolveTarget({selector:e.targetSelector}).setAttribute(t.attribute,t.value??"");break}case"remove-attribute":{this.resolveTarget({selector:e.targetSelector}).removeAttribute(t.attribute);break}case"restore-text":{const s=this.resolveTarget({selector:e.targetSelector});s.textContent=t.text||"";break}case"restore-classes":{const s=this.resolveTarget({selector:e.targetSelector});s.removeAttribute("class");for(const n of t.classes||[])s.classList.add(n);break}case"restore-style":{const s=this.resolveTarget({selector:e.targetSelector});s.style.removeProperty("all");for(const[n,i]of Object.entries(t.style||{}))s.style.setProperty(n,i);break}case"restore-position":{const s=this.doc.createElement("template");s.innerHTML=t.outerHtml||"";const n=s.content.firstElementChild;if(!n)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const i=this.safeResolve(e.targetSelector);i&&i.remove();const r=t.parentSelector?this.safeResolve(t.parentSelector):this.doc.body,o=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;(r||this.doc.body).insertBefore(n,o);break}}}reapplyRecord(e,t,s){var i;const n=e.inverse;switch(e.operation){case"set_attribute":return(n.kind==="restore-attribute"||n.kind==="remove-attribute")&&s.value!==void 0?(t.setAttribute(s.attribute||n.attribute||"",s.value),!0):!1;case"add_class":{for(const r of s.classes||[])t.classList.add(r);return(((i=s.classes)==null?void 0:i.length)||0)>0}case"remove_class":{for(const r of s.classes||n.classes||[])t.classList.remove(r);return!0}case"set_text":return s.text!==void 0?(t.textContent=s.text,!0):!1;case"set_inner_html":return s.html!==void 0?(t.innerHTML=s.html,!0):!1;default:return!1}}resolveTarget(e){if(!e)throw new Error("TARGET_REQUIRED: mutation requires a target.");if(typeof e=="string"&&(e={selector:e}),e.selector){try{const t=this.doc.querySelectorAll(e.selector);if(t.length===1)return t[0];if(t.length>1)return Array.from(t).find(n=>{try{return L.inspectElement(n).visibility.isVisible}catch{return!1}})||t[0]}catch(t){throw new Error(`TARGET_INVALID: ${t.message}`)}throw new Error(`TARGET_NOT_FOUND: selector "${e.selector}" matches no element.`)}if(e.xpath){try{const s=this.doc.evaluate(e.xpath,this.doc,null,9,null).singleNodeValue;if(s)return s}catch(t){throw new Error(`TARGET_INVALID_XPATH: ${t.message}`)}throw new Error("TARGET_NOT_FOUND: xpath matches no element.")}if(typeof e.nodeId=="number"&&this.registry){const t=this.registry.getNode(e.nodeId);if(t&&t.nodeType===1&&this.doc.contains(t))return t;throw new Error("TARGET_STALE: logical node id no longer resolves to an attached element.")}throw new Error("TARGET_INVALID: target has neither selector, xpath nor nodeId.")}safeResolve(e){try{return this.doc.querySelector(e)}catch{return null}}snapshotState(e){const t=L.inspectElement(e,this.registry),s=e.outerHTML.length>2e4?e.outerHTML.slice(0,2e4)+"…[truncated]":e.outerHTML;return{selector:t.bestSelector,outerHtml:s,attributes:this.attrsOf(e)}}attrsOf(e){const t={};for(const s of Array.from(e.attributes))t[s.name]=s.value.length>300?s.value.slice(0,300)+"…":s.value;return t}quickDiff(e,t,s){if(!t)return null;let n=0,i=0,r=0;const o=new Set(Object.keys(e.attributes)),a=new Set(Object.keys(t.attributes||{}));for(const u of o)a.has(u)||i++;for(const u of a)o.has(u)?e.attributes[u]!==t.attributes[u]&&r++:n++;e.outerHtml!==t.outerHtml&&n+i+r===0&&r++;const c=s.querySelectorAll?s.querySelectorAll("*").length:0;return{added:n,removed:i,changed:r,summary:`attributes +${n}/-${i}/~${r}; subtree nodes: ${c}`}}undoFor(e,t,s,n){return{mutationId:e,operation:t,targetSelector:s,inverse:n}}siblingSelector(e){try{return this.snapshotState(e).selector}catch{return null}}pushHistory(e){this.history.push(e),this.history.length>ne&&this.history.splice(0,this.history.length-ne)}markHistory(e,t){for(let s=this.history.length-1;s>=0;s--)if(this.history[s].mutationId===e){t==="undo"?this.history[s].undoApplied=!0:this.history[s].redoApplied=!0;return}}summaryOf(e){var n;const t=((n=this.doc.documentElement)==null?void 0:n.outerHTML.length)||0,s=e.steps.filter(i=>i.mutation.success).length;return{domLength:t,diffSummary:`${s}/${e.steps.length} mutations applied`}}failure(e,t,s,n,i){var r;return{mutationId:e,operation:t.operation,success:!1,before:s||{selector:String(((r=t.target)==null?void 0:r.selector)||"?"),outerHtml:"",attributes:{}},after:null,diff:null,affectedSelector:null,durationMs:i,error:n,undoable:!1}}}function Be(l,e){switch(l.operation){case"set_attribute":return`attribute "${l.attribute}" will be set to "${(l.value??"").slice(0,40)}"`;case"remove_attribute":return`attribute "${l.attribute}" will be removed`;case"set_text":return`text content will be replaced (${(l.text||"").length} chars)`;case"replace_text":return`every occurrence of "${l.text}" will become "${l.replacement}"`;case"set_inner_html":return`inner HTML will be replaced (${(l.html||"").length} chars)`;case"set_outer_html":return"element (and subtree) will be replaced with provided HTML";case"add_class":return`classes ${(l.classes||[]).join(", ")} will be added`;case"remove_class":return`classes ${(l.classes||[]).join(", ")} will be removed`;case"replace_class":return`classes ${(l.classes||[]).join(", ")} will be replaced with "${l.value}"`;case"set_style":return`inline styles ${Object.keys(l.style||{}).join(", ")} will be set`;case"remove_style":return`inline styles ${(l.classes||[]).join(", ")} will be removed`;case"add_element":return`a new element will be inserted ${l.position||"append"} the target`;case"remove_element":return"the element and its subtree will be removed";case"replace_element":return"the element will be replaced with new HTML";case"move_element":return"the element will be moved into the specified parent";case"wrap_element":return"the element will be wrapped in a new container";case"unwrap_element":return"children will be lifted out and the wrapper removed";case"clone_subtree":return"a deep clone of the subtree will be appended";default:return"unknown operation"}}class Fe{constructor(){f(this,"executionCounter",0)}async execute(e,t,s={}){const n=Math.min(Math.max(s.timeoutMs??5e3,100),3e4),i=`js_${Date.now().toString(36)}_${++this.executionCounter}`,r=e.defaultView;if(!r)return this.result(i,"BLOCKED_BY_CONTEXT",0,t,[],{name:"NoWindow",message:"The document has no associated window — execution context unavailable."});const o=e.documentElement?e.documentElement.outerHTML.length:0,a=[],c=this.hookConsole(r,a);let u="EXECUTED_SUCCESSFULLY",d,h,p=o,y=!1;const v=Date.now();try{const b=this.buildRunner(r,t),T=new Promise((w,E)=>{var N;const C=setTimeout(()=>{y=!0,E(new Error(`Script timed out after ${n}ms`))},n);(N=C==null?void 0:C.unref)==null||N.call(C)});d=await Promise.race([b,T])}catch(b){y?u="TIMED_OUT":u="EXECUTED_WITH_ERROR",h={name:(b==null?void 0:b.name)||"Error",message:(b==null?void 0:b.message)||String(b),stack:b!=null&&b.stack?String(b.stack).slice(0,2e3):void 0}}const m=Date.now()-v;p=e.documentElement?e.documentElement.outerHTML.length:0,c();const g=this.serialize(d);return u==="EXECUTED_SUCCESSFULLY"&&g.serializationFailed&&(u="SERIALIZATION_FAILED",h={name:"SerializationError",message:g.message||"Result could not be serialized."}),{status:u,executionId:i,durationMs:m,result:u==="EXECUTED_SUCCESSFULLY"?g.text:void 0,error:h,consoleOutput:a.slice(0,100),domChanged:o!==p,domLengthBefore:o,domLengthAfter:p,world:s.world||"ISOLATED",timeoutMs:n,codePreview:t.length>300?t.slice(0,300)+"…":t}}buildRunner(e,t){const s=`(async function() { +`))}catch{}const c={id:this.sequenceCounter.generateEventId("con",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:`RUNTIME_CONSOLE_${e.toUpperCase()}`,category:e==="error"?"ERROR":"CONSOLE",source:"PAGE",payload:{level:e,args:r,formattedMessage:o,stackTrace:a}};this.callback(c)}instrumentGlobalErrors(){if(typeof window>"u")return;const e=t=>{var o,a;const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("err",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_ERROR",category:"ERROR",source:"PAGE",payload:{message:t.message||"Unknown runtime error",filename:t.filename,lineno:t.lineno,colno:t.colno,stack:((o=t.error)==null?void 0:o.stack)||void 0,name:((a=t.error)==null?void 0:a.name)||"Error"}};this.callback(r)};window.addEventListener("error",e),this.cleanups.push(()=>window.removeEventListener("error",e))}instrumentUnhandledRejections(){if(typeof window>"u")return;const e=t=>{const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence();let r="Unhandled Promise Rejection",o;if(t.reason instanceof Error)r=t.reason.message,o=t.reason.stack;else if(typeof t.reason=="string")r=t.reason;else if(t.reason)try{r=JSON.stringify(t.reason)}catch{r=String(t.reason)}const a={id:this.sequenceCounter.generateEventId("rej",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_UNHANDLED_REJECTION",category:"ERROR",source:"PAGE",payload:{message:r,stack:o,isUnhandledRejection:!0}};this.callback(a)};window.addEventListener("unhandledrejection",e),this.cleanups.push(()=>window.removeEventListener("unhandledrejection",e))}}class Re{constructor(e,t,s,n=""){b(this,"privacy");b(this,"sequenceCounter");b(this,"callback");b(this,"sessionId");b(this,"isInstrumented",!1);b(this,"originalFetch",null);b(this,"originalXHROpen",null);b(this,"originalXHRSend",null);b(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentFetch(),this.instrumentXHR())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentFetch(){if(typeof window.fetch!="function")return;this.originalFetch=window.fetch;const e=this;window.fetch=async function(...t){const s=e.sequenceCounter.generateEventId("req_f"),n=t[0],i=t[1];let r="";typeof n=="string"?r=n:n instanceof URL?r=n.toString():n&&typeof n=="object"&&"url"in n&&(r=n.url);const o=((i==null?void 0:i.method)||(typeof n=="object"&&"method"in n?n.method:"GET")).toUpperCase(),a=e.privacy.sanitizeUrl(r),c=e.sequenceCounter.getRelativeTimestamp(),u=e.sequenceCounter.getWallClock(),h=e.sequenceCounter.nextSequence(),g={id:s,sessionId:e.sessionId,timestamp:c,sequence:h,wallClockTime:u,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:a,method:o,resourceType:"fetch",hasBody:!!(i!=null&&i.body)}};e.callback(g);try{const p=await e.originalFetch.apply(this,t),y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),d=Math.max(0,Math.round((y-c)*100)/100),f={id:e.sequenceCounter.generateEventId("res_f",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_RESPONSE_COMPLETE",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:p.status,statusText:p.statusText,durationMs:d}};return e.callback(f),p}catch(p){const y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),d=Math.max(0,Math.round((y-c)*100)/100),f={id:e.sequenceCounter.generateEventId("res_err",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:0,statusText:"Failed",durationMs:d,error:(p==null?void 0:p.message)||"Network request failed"}};throw e.callback(f),p}},this.cleanups.push(()=>{this.originalFetch&&(window.fetch=this.originalFetch)})}instrumentXHR(){if(typeof XMLHttpRequest>"u")return;this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send;const e=this;XMLHttpRequest.prototype.open=function(t,s,...n){return this._forensicRequestId=e.sequenceCounter.generateEventId("req_x"),this._forensicMethod=(t||"GET").toUpperCase(),this._forensicUrl=typeof s=="string"?s:s.toString(),e.originalXHROpen.apply(this,[t,s,...n])},XMLHttpRequest.prototype.send=function(t){const s=this._forensicRequestId||e.sequenceCounter.generateEventId("req_x"),n=this._forensicMethod||"GET",i=e.privacy.sanitizeUrl(this._forensicUrl||""),r=e.sequenceCounter.getRelativeTimestamp(),o=e.sequenceCounter.getWallClock(),a=e.sequenceCounter.nextSequence();this._forensicStartTime=r;const c={id:s,sessionId:e.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:i,method:n,resourceType:"xhr",hasBody:!!t}};e.callback(c);const u=()=>{const h=e.sequenceCounter.getRelativeTimestamp(),g=e.sequenceCounter.getWallClock(),p=e.sequenceCounter.nextSequence(),y=Math.max(0,Math.round((h-(this._forensicStartTime||r))*100)/100),v={id:e.sequenceCounter.generateEventId("res_x",p),sessionId:e.sessionId,timestamp:h,sequence:p,wallClockTime:g,type:this.status>=200&&this.status<400?"NETWORK_RESPONSE_COMPLETE":"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:i,method:n,status:this.status,statusText:this.statusText,durationMs:y,error:this.status===0?"XHR Network Error or Aborted":void 0}};e.callback(v)};return this.addEventListener("load",u),this.addEventListener("error",u),this.addEventListener("abort",u),e.originalXHRSend.apply(this,[t])},this.cleanups.push(()=>{this.originalXHROpen&&(XMLHttpRequest.prototype.open=this.originalXHROpen),this.originalXHRSend&&(XMLHttpRequest.prototype.send=this.originalXHRSend)})}}class Oe{constructor(e={}){b(this,"sequenceCounter");b(this,"registry");b(this,"privacy");b(this,"snapshotEngine");b(this,"mutationObserver");b(this,"eventCollector");b(this,"diagnostics");b(this,"networkMonitor");b(this,"metadata");b(this,"isRecording",!1);b(this,"isPaused",!1);b(this,"eventListeners",new Set);b(this,"checkpointListeners",new Set);b(this,"lastCheckpointSequence",0);b(this,"lastCheckpointTimestamp",0);b(this,"checkpointTimer",null);b(this,"checkpointIntervalEvents",200);b(this,"checkpointIntervalMs",3e4);this.sequenceCounter=new ne,this.registry=new H,this.privacy=new J(e.privacy),this.snapshotEngine=new he(this.registry,this.privacy,this.sequenceCounter);const t=n=>this.handleEvent(n);this.mutationObserver=new Ne(this.registry,this.privacy,this.sequenceCounter,this.snapshotEngine,t),this.eventCollector=new ke(this.registry,this.privacy,this.sequenceCounter,t),this.diagnostics=new Me(this.privacy,this.sequenceCounter,t),this.networkMonitor=new Re(this.privacy,this.sequenceCounter,t),e.checkpointIntervalEvents&&(this.checkpointIntervalEvents=e.checkpointIntervalEvents),e.checkpointIntervalMs&&(this.checkpointIntervalMs=e.checkpointIntervalMs);const s=e.sessionId||`session_${Date.now()}_${Math.random().toString(36).substring(2,7)}`;this.metadata=this.createInitialMetadata(s,e.sessionName)}getSessionId(){return this.metadata.id}getMetadata(){return{...this.metadata,durationMs:this.sequenceCounter.getRelativeTimestamp(),endTime:this.metadata.endTime||Date.now()}}getRegistry(){return this.registry}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}onCheckpoint(e){return this.checkpointListeners.add(e),()=>this.checkpointListeners.delete(e)}start(e=typeof document<"u"?document:{}){if(this.isRecording)throw new Error(`Recorder session ${this.metadata.id} is already active`);this.sequenceCounter.reset(),this.registry.reset(),this.isRecording=!0,this.isPaused=!1,this.metadata.status="recording",this.metadata.startTime=Date.now(),this.mutationObserver.setSessionId(this.metadata.id),this.eventCollector.setSessionId(this.metadata.id),this.diagnostics.setSessionId(this.metadata.id),this.networkMonitor.setSessionId(this.metadata.id);const t=this.snapshotEngine.captureSnapshot(e,this.metadata.id);this.metadata.stats.nodeCount=t.totalNodeCount;const s={id:this.sequenceCounter.generateEventId("snap_init",t.sequence),sessionId:this.metadata.id,timestamp:t.timestamp,sequence:t.sequence,wallClockTime:Date.now(),type:"DOM_SNAPSHOT",category:"DOM",source:"PAGE",payload:{snapshot:t}};return this.createCheckpoint(t,"INITIAL"),this.mutationObserver.start(e),this.eventCollector.start(),this.diagnostics.start(),this.networkMonitor.start(),this.handleEvent(s),this.checkpointIntervalMs>0&&typeof setInterval<"u"&&(this.checkpointTimer=setInterval(()=>{this.isRecording&&!this.isPaused&&this.captureCheckpoint("PERIODIC",e)},this.checkpointIntervalMs)),t}stop(){return this.isRecording?(this.mutationObserver.takeRecords(),this.mutationObserver.stop(),this.eventCollector.stop(),this.diagnostics.stop(),this.networkMonitor.stop(),this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.isRecording=!1,this.metadata.status="stopped",this.metadata.endTime=Date.now(),this.metadata.durationMs=this.sequenceCounter.getRelativeTimestamp(),this.getMetadata()):this.getMetadata()}pause(){!this.isRecording||this.isPaused||(this.isPaused=!0,this.metadata.status="paused")}resume(){!this.isRecording||!this.isPaused||(this.isPaused=!1,this.metadata.status="recording")}captureCheckpoint(e="MANUAL",t=document){if(!this.isRecording)return null;const s=this.snapshotEngine.captureSnapshot(t,this.metadata.id);return this.createCheckpoint(s,e)}recordCustomEvent(e,t,s,n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("ext",o),sessionId:this.metadata.id,timestamp:i,sequence:o,wallClockTime:r,type:e,category:"EXTENSION",source:"CONTENT_SCRIPT",targetNodeId:s,targetSelector:n,payload:t};return this.handleEvent(a),a}recordScreenshot(e,t="MANUAL"){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("scr",i),sessionId:this.metadata.id,timestamp:s,sequence:i,wallClockTime:n,type:"SCREENSHOT_CHECKPOINT",category:"SCREENSHOT",source:"BROWSER_RUNTIME",payload:{screenshotId:`shot_${i}`,dataUrl:e,viewport:{width:typeof window<"u"?window.innerWidth:1920,height:typeof window<"u"?window.innerHeight:1080,scrollX:typeof window<"u"?window.scrollX:0,scrollY:typeof window<"u"?window.scrollY:0,devicePixelRatio:typeof window<"u"?window.devicePixelRatio:1},triggerReason:t}};return this.handleEvent(r),r}addAnnotation(e,t,s="AGENT",n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.nextSequence(),o={id:`ann_${r}_${Math.random().toString(36).substring(2,6)}`,sessionId:this.metadata.id,timestamp:i,sequence:r,nodeId:n,author:s,label:e,comment:t,createdAt:Date.now()},a={id:o.id,sessionId:this.metadata.id,timestamp:i,sequence:r,wallClockTime:Date.now(),type:"ANNOTATION",category:"ANNOTATION",source:s==="USER"?"USER_INTERACTION":"BROWSER_RUNTIME",targetNodeId:n,payload:{annotation:o}};return this.handleEvent(a),o}createCheckpoint(e,t){const s=this.sequenceCounter.getSequence()-this.lastCheckpointSequence;this.lastCheckpointSequence=this.sequenceCounter.getSequence(),this.lastCheckpointTimestamp=e.timestamp,this.metadata.stats.checkpointCount+=1;const n={checkpointId:`chk_${e.sequence}_${Date.now()}`,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:Date.now(),snapshot:e,eventIndex:this.metadata.stats.eventCount,eventsSinceLastCheckpoint:s,trigger:t},i={id:n.checkpointId,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:n.wallClockTime,type:"CHECKPOINT",category:"CHECKPOINT",source:"BROWSER_RUNTIME",payload:{checkpointId:n.checkpointId,snapshot:e,eventsSinceLastCheckpoint:s,totalEventsSoFar:this.metadata.stats.eventCount}};return this.checkpointListeners.forEach(r=>{try{r(n)}catch(o){console.error("[ForensicRecorder] Checkpoint listener error:",o)}}),this.handleEvent(i),n}handleEvent(e){this.isPaused&&e.type!=="CHECKPOINT"&&e.type!=="ANNOTATION"||(this.metadata.stats.eventCount+=1,e.category==="DOM"&&(this.metadata.stats.mutationCount+=1),e.category==="ERROR"&&(this.metadata.stats.errorCount+=1),e.category==="CONSOLE"&&(this.metadata.stats.consoleCount+=1),e.category==="NETWORK"&&(this.metadata.stats.networkCount+=1),e.category==="SCREENSHOT"&&(this.metadata.stats.screenshotCount+=1),this.isRecording&&e.type!=="CHECKPOINT"&&e.type!=="DOM_SNAPSHOT"&&this.sequenceCounter.getSequence()-this.lastCheckpointSequence>=this.checkpointIntervalEvents&&typeof document<"u"&&this.captureCheckpoint("PERIODIC"),this.eventListeners.forEach(t=>{try{t(e)}catch(s){console.error("[ForensicRecorder] Event listener error:",s)}}))}createInitialMetadata(e,t){const s={domRecording:typeof MutationObserver<"u"?"HEALTHY":"UNAVAILABLE",userEvents:typeof window<"u"?"HEALTHY":"UNAVAILABLE",console:typeof console<"u"?"HEALTHY":"UNAVAILABLE",network:typeof window<"u"&&typeof window.fetch<"u"?"HEALTHY":"PARTIAL",screenshots:"HEALTHY",shadowDom:typeof Element<"u"&&"attachShadow"in Element.prototype?"HEALTHY":"RESTRICTED",iframes:"PARTIAL"},n={eventCount:0,mutationCount:0,errorCount:0,consoleCount:0,networkCount:0,checkpointCount:0,screenshotCount:0,nodeCount:0};return{id:e,name:t||`Recording ${new Date().toLocaleTimeString()}`,url:typeof window<"u"?window.location.href:"about:blank",origin:typeof window<"u"?window.location.origin:"",title:typeof document<"u"?document.title:"Forensic Session",userAgent:typeof navigator<"u"?navigator.userAgent:"Node.js/ForensicAgent",schemaVersion:"2.0.0",recorderVersion:"2.0.0",extensionVersion:"2.0.0",startTime:Date.now(),status:"recording",health:s,stats:n}}}class k{static inspectPage(e=document){var n,i,r,o,a,c,u,h,g,p,y,v,m,d;const t=e.defaultView||(typeof window<"u"?window:{}),s=e.activeElement;return{url:((n=t.location)==null?void 0:n.href)||((i=e.location)==null?void 0:i.href)||"",title:e.title||"",origin:((r=t.location)==null?void 0:r.origin)||"",viewport:{width:t.innerWidth||((o=e.documentElement)==null?void 0:o.clientWidth)||1920,height:t.innerHeight||((a=e.documentElement)==null?void 0:a.clientHeight)||1080,scrollX:t.scrollX||t.pageXOffset||((c=e.documentElement)==null?void 0:c.scrollLeft)||0,scrollY:t.scrollY||t.pageYOffset||((u=e.documentElement)==null?void 0:u.scrollTop)||0,devicePixelRatio:t.devicePixelRatio||1},documentDimensions:{width:Math.max(((h=e.body)==null?void 0:h.scrollWidth)||0,((g=e.documentElement)==null?void 0:g.scrollWidth)||0),height:Math.max(((p=e.body)==null?void 0:p.scrollHeight)||0,((y=e.documentElement)==null?void 0:y.scrollHeight)||0)},activeElement:s?{tag:((v=s.tagName)==null?void 0:v.toLowerCase())||"",selector:this.computeBestSelector(s),text:(m=s.textContent)==null?void 0:m.slice(0,100).trim()}:void 0,focusedElement:typeof e.hasFocus=="function"&&e.hasFocus()&&s?{tag:((d=s.tagName)==null?void 0:d.toLowerCase())||"",selector:this.computeBestSelector(s)}:void 0,visibilityState:e.visibilityState||"visible",readyState:e.readyState||"complete",framesCount:e.querySelectorAll?e.querySelectorAll("iframe, frame").length:0}}static inspectElement(e,t){var xe,_e;const s=e.ownerDocument||document,n=s.defaultView||(typeof window<"u"?window:{}),i=e,r=e.tagName?e.tagName.toLowerCase():"element",o=this.extractClasses(e),{bestSelector:a,candidates:c}=this.generateSelectorCandidates(e),u={},h={};if(e.attributes)for(let V=0;V0||E.height>0||E.right>0||E.bottom>0,R=!C||E.right>0&&E.bottom>0&&E.left=L||E.top>=I),A=!P&&T!=="none"&&x!=="hidden"&&N>0&&R,se={disabled:i.disabled??e.hasAttribute("disabled"),readOnly:i.readOnly??e.hasAttribute("readonly"),checked:i.checked,selected:i.selected,focused:s.activeElement===e,isShadowHost:!!e.shadowRoot,hasShadowRoot:!!e.shadowRoot},z=[];let G=e.parentElement;for(;G&&G.tagName&&G.tagName.toLowerCase()!=="html";)z.push(this.computeBestSelector(G)),G=G.parentElement;const Ht={count:e.children?e.children.length:0,tags:e.children?Array.from(e.children).slice(0,10).map(V=>V.tagName.toLowerCase()):[]};let Ae;if(t){const V=t.getId(e);Ae={logicalNodeId:V??null,creationSequence:null,lastMutationSequence:null,eventCount:0,isRecorded:V!=null}}return{tag:r,id:e.id||void 0,classes:o,role:g||void 0,ariaAttributes:Object.keys(h).length>0?h:void 0,text:v.slice(0,200),normalizedText:m.slice(0,200),value:d,type:f.type||void 0,selector:a,bestSelector:a,selectorCandidates:c,bounds:E,visibility:{isVisible:A,display:T,visibility:x,opacity:N,pointerEvents:D,isClipped:P,isInViewport:R,zIndex:M},computedStyle:S?{display:T,visibility:x,opacity:String(N),position:S.position,zIndex:String(M),pointerEvents:D,overflow:S.overflow,boxSizing:S.boxSizing,color:S.color,backgroundColor:S.backgroundColor,fontSize:S.fontSize}:{},attributes:u,state:se,context:{parentChain:z,parentSelector:z[0]||void 0,childrenSummary:Ht,containingBlock:(S==null?void 0:S.position)==="fixed"?"viewport":z[0]||void 0,iframe:null,shadowRoot:e.shadowRoot?"open":null},forensics:Ae}}static inspectVisualState(e){var f,w;const t=e.ownerDocument||document,s=t.defaultView||(typeof window<"u"?window:{}),n=e.getBoundingClientRect?e.getBoundingClientRect():{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},i=s.getComputedStyle?s.getComputedStyle(e):null,r=s.innerWidth||((f=t.documentElement)==null?void 0:f.clientWidth)||1920,o=s.innerHeight||((w=t.documentElement)==null?void 0:w.clientHeight)||1080,a=s.scrollX||s.pageXOffset||0,c=s.scrollY||s.pageYOffset||0,u=s.devicePixelRatio||1,h=(i==null?void 0:i.display)||"block",g=(i==null?void 0:i.visibility)||"visible",p=i&&parseFloat(i.opacity)||1,y=n.right>0&&n.bottom>0&&n.left=r||n.top>=o;let d=null;if(t.elementFromPoint&&y&&!v&&h!=="none"){const E=Math.max(0,Math.min(r-1,n.left+n.width/2)),S=Math.max(0,Math.min(o-1,n.top+n.height/2));try{const T=t.elementFromPoint(E,S);T&&T!==e&&!e.contains(T)&&!T.contains(e)&&(d=this.computeBestSelector(T))}catch{}}return{selector:this.computeBestSelector(e),bounds:{x:n.x??n.left??0,y:n.y??n.top??0,width:n.width??0,height:n.height??0,top:n.top??0,right:n.right??0,bottom:n.bottom??0,left:n.left??0},viewport:{scrollX:a,scrollY:c,width:r,height:o,devicePixelRatio:u},layout:{display:h,position:(i==null?void 0:i.position)||"static",zIndex:(i==null?void 0:i.zIndex)||"auto",opacity:p,visibility:g,overflow:(i==null?void 0:i.overflow)||"visible",boxSizing:(i==null?void 0:i.boxSizing)||"content-box",pointerEvents:(i==null?void 0:i.pointerEvents)||"auto"},occlusion:{isInViewport:y,isClipped:v||m,isZeroDimension:v,isTransparent:p===0,isDisplayNone:h==="none",isVisibilityHidden:g==="hidden",isOffscreen:m,occludedBy:d},computedStyleSummary:i?{display:h,position:i.position,zIndex:i.zIndex,opacity:String(p),visibility:g,pointerEvents:i.pointerEvents}:{}}}static generateSelectorCandidates(e){const t=e.ownerDocument||document,s=e.tagName?e.tagName.toLowerCase():"element",n=[];if(e.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(e.id)){const c=`#${e.id}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}const i=["data-testid","data-test","data-id","data-qa","data-cy","aria-label","name"];for(const c of i){const u=e.getAttribute(c);if(u&&/^[a-zA-Z0-9_-]+$/.test(u)){const h=`${s}[${c}="${u}"]`;try{t.querySelectorAll&&t.querySelectorAll(h).length===1&&n.push(h)}catch{n.push(h)}}}const r=this.extractClasses(e).filter(c=>/^[a-zA-Z0-9_-]+$/.test(c)&&!c.startsWith("ng-")&&!c.startsWith("_ng"));if(r.length>0){const c=`${s}.${r.slice(0,3).join(".")}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}if(e.parentElement&&e.parentElement.children){const c=Array.from(e.parentElement.children).filter(u=>u.tagName&&u.tagName.toLowerCase()===s);if(c.length>1){const u=c.indexOf(e)+1;if(u>0){const h=this.computeBestSelector(e.parentElement);n.push(`${h} > ${s}:nth-of-type(${u})`)}}}const o=r.length>0?`${s}.${r[0]}`:s;return n.push(o),{bestSelector:n[0]||s,candidates:n}}static computeBestSelector(e){return this.generateSelectorCandidates(e).bestSelector}static extractClasses(e){return e.classList&&typeof e.classList.forEach=="function"?Array.from(e.classList):typeof e.className=="string"?e.className.split(/\s+/).filter(Boolean):e.className&&typeof e.className.baseVal=="string"?e.className.baseVal.split(/\s+/).filter(Boolean):[]}static inferImplicitRole(e){switch(e.tagName?e.tagName.toLowerCase():""){case"a":return e.hasAttribute("href")?"link":void 0;case"button":return"button";case"input":{const s=e.type||"text";return s==="button"||s==="submit"||s==="reset"?"button":s==="checkbox"?"checkbox":s==="radio"?"radio":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"article":return"article";case"section":return"region";default:return}}}b(k,"privacyEngine",new J);class Le{constructor(e){b(this,"registry");b(this,"lastSelectedElementRef");b(this,"timingHook",null);b(this,"lastTrajectory",[]);this.registry=e}setLastSelectedElement(e){this.lastSelectedElementRef=e}setTimingHook(e){this.timingHook=e}getLastTrajectory(){return this.lastTrajectory}async timing(e){this.timingHook&&await this.timingHook(e)}resolveTarget(e,t=document){if(e.selectedElementRef&&this.lastSelectedElementRef&&t.contains(this.lastSelectedElementRef))return this.lastSelectedElementRef;if(typeof e.nodeId=="number"&&this.registry){const s=this.registry.getNode(e.nodeId);if(s&&s instanceof Element&&t.contains(s))return s}if(e.selector)try{const s=t.querySelectorAll(e.selector);if(s.length>1){for(let n=0;n{r+=w.length});try{h.observe(t.body||t.documentElement,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}catch{}const g=w=>{o.push(w.message||"Runtime Error")};typeof window<"u"&&window.addEventListener("error",g);try{await this.dispatchAction(n,e)}finally{typeof window<"u"&&window.removeEventListener("error",g)}let p=!0;if((f=e.options)!=null&&f.waitForStabilization){const w=e.options.stabilizationTimeoutMs||300;await new Promise(E=>setTimeout(E,Math.min(2e3,w)))}h.disconnect();let y;t.contains(n)&&(y=k.inspectElement(n,this.registry));const v=Date.now()-s,m=a!=null&&a.__FORENSIC_CONSOLE_BUFFER__?a.__FORENSIC_CONSOLE_BUFFER__.slice(c).filter(w=>(w==null?void 0:w.level)==="error").length:0,d=a!=null&&a.__FORENSIC_NETWORK_BUFFER__?a.__FORENSIC_NETWORK_BUFFER__.slice(u).length:0;return{success:!0,action:e.action,target:y||i,beforeState:i,afterState:y,effects:{domMutations:r,consoleErrors:m,networkRequests:d,runtimeErrors:o},durationMs:v,stabilized:p}}async dispatchAction(e,t){var n,i,r,o,a,c;const s=e;switch(t.action){case"click":{this.scrollIntoViewIfNeeded(e),await this.timing("move"),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown"),this.dispatchMouseEvent(e,"mousedown"),typeof s.focus=="function"&&s.focus(),this.dispatchMouseEvent(e,"pointerup"),this.dispatchMouseEvent(e,"mouseup"),typeof s.click=="function"?s.click():this.dispatchMouseEvent(e,"click");break}case"double_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"click"),await this.timing("click"),this.dispatchMouseEvent(e,"click"),this.dispatchMouseEvent(e,"dblclick");break}case"right_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown",{button:2}),this.dispatchMouseEvent(e,"mousedown",{button:2}),this.dispatchMouseEvent(e,"contextmenu",{button:2});break}case"hover":{await this.timing("move"),this.dispatchMouseEvent(e,"pointerenter"),this.dispatchMouseEvent(e,"mouseenter"),this.dispatchMouseEvent(e,"mouseover"),await this.timing("move"),this.dispatchMouseEvent(e,"mousemove");break}case"focus":{typeof s.focus=="function"&&s.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:!0}));break}case"blur":{typeof s.blur=="function"&&s.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:!0}));break}case"type":{const u=t.text||"",h=e,g=((n=e.ownerDocument)==null?void 0:n.defaultView)||(typeof window<"u"?window:null);typeof s.focus=="function"&&s.focus();for(const y of u){await this.timing("type");const v=d=>{try{const w=(g==null?void 0:g.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(w)return new w(d,{key:y,bubbles:!0})}catch{}const f=(g==null?void 0:g.CustomEvent)||(g==null?void 0:g.Event)||CustomEvent;return new f(d,{bubbles:!0,cancelable:!0})},m=(d,f)=>{try{const E=(g==null?void 0:g.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(E)return new E(d,f)}catch{}const w=(g==null?void 0:g.CustomEvent)||(g==null?void 0:g.Event)||CustomEvent;return new w(d,{bubbles:!0,cancelable:!0})};e.dispatchEvent(v("keydown")),e.dispatchEvent(v("keypress")),"value"in h&&(h.value=(h.value||"")+y),e.dispatchEvent(m("input",{data:y,inputType:"insertText",bubbles:!0})),e.dispatchEvent(v("keyup"))}const p=(g==null?void 0:g.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}));break}case"clear":{const u=e,h=((i=e.ownerDocument)==null?void 0:i.defaultView)||(typeof window<"u"?window:null);if("value"in u){u.value="";const g=(y,v)=>{try{const d=(h==null?void 0:h.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(d)return new d(y,v)}catch{}const m=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new m(y,{bubbles:!0,cancelable:!0})};e.dispatchEvent(g("input",{inputType:"deleteContentBackward",bubbles:!0}));const p=(h==null?void 0:h.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}))}break}case"press_key":{const u=t.key||"Enter",h=((r=e.ownerDocument)==null?void 0:r.defaultView)||(typeof window<"u"?window:null),g=p=>{try{const v=(h==null?void 0:h.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(v)return new v(p,{key:u,bubbles:!0})}catch{}const y=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new y(p,{bubbles:!0,cancelable:!0})};e.dispatchEvent(g("keydown")),e.dispatchEvent(g("keypress")),e.dispatchEvent(g("keyup"));break}case"select_option":{const u=e;((o=u.tagName)==null?void 0:o.toLowerCase())==="select"&&t.optionValue&&(u.value=t.optionValue,e.dispatchEvent(new Event("change",{bubbles:!0})));break}case"scroll_into_view":{this.scrollIntoViewIfNeeded(e,!0);break}case"scroll":{const u=((a=t.scrollDelta)==null?void 0:a.x)||0,h=((c=t.scrollDelta)==null?void 0:c.y)||0;typeof e.scrollBy=="function"&&e.scrollBy(u,h);break}default:throw new Error(`Unsupported interaction action: ${t.action}`)}}scrollIntoViewIfNeeded(e,t=!1){if(typeof e.scrollIntoView=="function")try{e.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}catch{e.scrollIntoView(t)}}dispatchMouseEvent(e,t,s={}){const n=e.getBoundingClientRect?e.getBoundingClientRect():{left:0,top:0,width:0,height:0},i=n.left+n.width/2,r=n.top+n.height/2,o=new MouseEvent(t,{bubbles:s.bubbles!==void 0?s.bubbles:!0,cancelable:s.cancelable!==void 0?s.cancelable:!0,clientX:i,clientY:r,button:s.button||0,buttons:s.button===2?2:1});e.dispatchEvent(o)}}class ie{static matches(e,t){if(!e||e.nodeType!==$.ELEMENT_NODE)return!1;const s=t.trim();return s?s.includes(",")?s.split(",").some(n=>this.matchesSimple(e,n.trim())):this.matchesCompound(e,s):!1}static querySelector(e,t,s){const n=this.querySelectorAll(e,t,s,1);return n.length>0?n[0]:null}static querySelectorAll(e,t,s,n=1/0){const i=[],r=s[t];if(!r)return i;const o=[...r.children||[]],a=new Set;for(;o.length>0&&i.length=n))break;u.children&&u.children.length>0&&o.push(...u.children)}}return i}static getElementById(e,t){for(const s of Object.values(t))if(s.nodeType===$.ELEMENT_NODE&&!s.isDetached&&s.attributes&&s.attributes.id===e&&this.isNodeConnected(s,t))return s;return null}static isNodeConnected(e,t){if(e.isDetached)return!1;let s=e;const n=new Set;for(;s&&s.parentId;){if(n.has(s.id))return!1;n.add(s.id);const i=t[s.parentId];if(!i||i.isDetached)return!1;s=i}return!0}static computeSelector(e,t){var r,o;if(!e)return"";if(e.nodeType!==$.ELEMENT_NODE)return e.tagName||`#node-${e.id}`;if((r=e.attributes)!=null&&r.id)return`#${e.attributes.id}`;const s=e.tagName||"div",n=(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).filter(a=>a&&!a.startsWith("ng-")).slice(0,2),i=n.length>0?"."+n.join("."):"";if(e.parentId&&t[e.parentId]){const c=(t[e.parentId].children||[]).map(u=>t[u]).filter(u=>u&&u.nodeType===$.ELEMENT_NODE&&u.tagName===s);if(c.length>1){const u=c.findIndex(h=>h.id===e.id)+1;return`${s}${i}:nth-of-type(${u})`}}return`${s}${i}`}static matchesCompound(e,t){return this.matchesSimple(e,t)}static matchesSimple(e,t){var i,r,o,a,c,u,h;const s=((i=e.tagName)==null?void 0:i.toLowerCase())||"";if(t==="*")return!0;if(t.startsWith("#")){const g=t.substring(1);return((r=e.attributes)==null?void 0:r.id)===g}if(t.startsWith(".")){const g=t.substring(1);return(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).includes(g)}if(t.startsWith("[")&&t.endsWith("]")){const g=t.substring(1,t.length-1);if(g.includes("=")){const[p,y]=g.split("="),v=y.replace(/^["']|["']$/g,"");return((a=e.attributes)==null?void 0:a[p.trim()])===v}return!!((c=e.attributes)!=null&&c[g.trim()])}const n=t.match(/^([a-zA-Z0-9_-]+)(.*)$/);if(n){const g=n[1].toLowerCase(),p=n[2];if(g!==s&&g!=="*")return!1;if(!p)return!0;if(p.startsWith("#"))return((u=e.attributes)==null?void 0:u.id)===p.substring(1);if(p.startsWith("."))return(((h=e.attributes)==null?void 0:h.class)||"").split(/\s+/).includes(p.substring(1));if(p.startsWith("["))return this.matchesSimple(e,p)}return!1}}class De{static traceElement(e,t,s){var M,L;const n=[...t].sort((I,C)=>I.sequence-C.sequence);let i=e.nodeId,r="unknown",o=e.selector||"",a={},c=0,u=0,h="init";if(!i&&e.selector&&s){const I=ie.querySelector(e.selector,s.rootId,s.nodes);I&&(i=I.id,r=I.tagName||"element",a={...I.attributes||{}},o=e.selector)}if(!i&&e.selector){for(const I of n)if(I.type==="DOM_MUTATION_ADD"){const C=I.payload;if(C.node&&ie.matches(C.node,e.selector)){i=C.node.id,r=C.node.tagName||"element",a={...C.node.attributes||{}},c=I.timestamp,u=I.sequence,h=I.id;break}}}if(!i)return null;const g=[];let p=!0,y=null,v=null,m,d=0;if(s&&s.nodes[i]){const I=s.nodes[i];r=I.tagName||r,a={...I.attributes||{}},o||(o=ie.computeSelector(I,s.nodes)),g.push({timestamp:s.timestamp,sequence:s.sequence,wallClockTime:Date.now(),stage:"CREATED",eventId:s.snapshotId,eventType:"DOM_SNAPSHOT",description:`Element <${r}> existed in initial baseline snapshot [ID: ${i}]`,details:{initialParentId:I.parentId,attributes:a},nodeSnapshot:I})}const f=new Map;if(s)for(const[I,C]of Object.entries(s.nodes))f.set(Number(I),C.parentId??null);const w=(I,C)=>{let R=f.get(C);const P=new Set;for(;R&&!P.has(R);){if(R===I)return!0;P.add(R),R=f.get(R)}return!1};for(const I of n){const C=I.timestamp,R=I.sequence,P=I.wallClockTime;if(I.type==="DOM_MUTATION_ADD"){const A=I.payload;(M=A.node)!=null&&M.id&&f.set(A.node.id,A.parentId??null),((L=A.node)==null?void 0:L.id)===i&&(p=!0,r=A.node.tagName||r,c=C,u=R,h=I.id,a={...A.node.attributes||{}},g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"ATTACHED_TO_DOM",eventId:I.id,eventType:I.type,description:`Element <${r}> added to DOM under parent ID ${A.parentId}`,details:{parentId:A.parentId,index:A.index},nodeSnapshot:A.node}))}if(I.type==="DOM_MUTATION_REMOVE"){const A=I.payload;A.nodeId===i?(p=!1,y=C,v=R,m=I.id,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"REMOVED_FROM_DOM",eventId:I.id,eventType:I.type,description:`Element <${r}> explicitly removed from parent ID ${A.parentId}`,details:{parentId:A.parentId,removedIndex:A.index}})):w(A.nodeId,i)&&(p=!1,y=C,v=R,m=I.id,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"PARENT_SUBTREE_REPLACED",eventId:I.id,eventType:I.type,description:`Ancestor element [ID: ${A.nodeId}] was removed, causing target element [ID: ${i}] to detach from DOM`,details:{removedAncestorId:A.nodeId,parentId:A.parentId}}))}if(I.type==="DOM_MUTATION_MOVE"){const A=I.payload;A.nodeId&&f.set(A.nodeId,A.newParentId??null),A.nodeId===i&&(d++,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"REPARENTED",eventId:I.id,eventType:I.type,description:`Element reparented from parent ${A.oldParentId} to ${A.newParentId}`,details:{oldParentId:A.oldParentId,newParentId:A.newParentId}}))}if(I.type==="DOM_MUTATION_ATTR"){const A=I.payload;if(A.nodeId===i){d++;const se=A.attributeName.toLowerCase();let z="ATTRIBUTE_MODIFIED";se==="class"&&(z="CLASS_MODIFIED"),se==="style"&&(z="STYLE_MODIFIED"),g.push({timestamp:C,sequence:R,wallClockTime:P,stage:z,eventId:I.id,eventType:I.type,description:`Attribute '${A.attributeName}' changed from '${A.oldValue??""}' to '${A.newValue??""}'`,details:{attributeName:A.attributeName,oldValue:A.oldValue,newValue:A.newValue}})}}if(I.type==="DOM_MUTATION_TEXT"){const A=I.payload;A.nodeId===i&&(d++,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"TEXT_MODIFIED",eventId:I.id,eventType:I.type,description:`Text content changed: "${A.oldText}" → "${A.newText}"`,details:{oldText:A.oldText,newText:A.newText}}))}}const E=y??c,S=500,T=n.filter(I=>(I.category==="ERROR"||I.category==="CONSOLE")&&Math.abs(I.timestamp-E)<=S),x=n.filter(I=>I.category==="NETWORK"&&Math.abs(I.timestamp-E)<=S),N=n.length>0?n[n.length-1].timestamp:c,D=Math.max(0,(y??N)-c);return{targetNodeId:i,tagName:r,selectorHint:o,initialAttributes:a,createdAt:c,createdSequence:u,createdEventId:h,removedAt:y,removedSequence:v,removedEventId:m,isCurrentlyAlive:p,lifespanMs:Math.round(D*100)/100,mutationCount:d,entries:g,correlatedDiagnostics:T,correlatedNetwork:x}}}class $e{static analyze(e,t,s){var D,M,L,I;const n=typeof e=="number"?{nodeId:e}:{selector:e},i=De.traceElement(n,t,s);if(!i)return{targetQuery:e,found:!1,disappearanceMechanism:"UNKNOWN",likelyRootCause:"Target element could not be found in recording baseline or event stream",confidenceScore:0,detailedExplanation:`No element matching "${e}" was ever created, recorded in the initial DOM snapshot, or observed in mutation events.`,evidentiaryTrail:[],precedingEvents:[],followingEvents:[],correlatedErrors:[],correlatedNetworkCalls:[],alternativeHypotheses:[{hypothesis:"Element was injected into an unmonitored isolated iframe or ShadowRoot closed mode",likelihood:40,evidenceFor:["Element query yielded zero matches in monitored document"],evidenceAgainst:["Iframes/ShadowRoots were accessible in this session"]},{hypothesis:"Selector typo or timing mismatch",likelihood:60,evidenceFor:["Target selector did not match any recorded tag or class"],evidenceAgainst:[]}]};const r=[...t].sort((C,R)=>C.sequence-R.sequence),o=[],a=[];let c="UNKNOWN",u="Unknown disappearance mechanism",h=50,g="",p=i.removedAt??void 0;const y=i.entries.find(C=>C.stage==="REMOVED_FROM_DOM"),v=i.entries.find(C=>C.stage==="PARENT_SUBTREE_REPLACED"),m=i.entries.find(C=>C.stage==="CLASS_MODIFIED"&&/\b(hidden|hide|d-none|invisible|collapsed)\b/i.test(String(C.details.newValue||""))),d=i.entries.find(C=>C.stage==="STYLE_MODIFIED"&&/display\s*:\s*none|visibility\s*:\s*hidden|opacity\s*:\s*0/i.test(String(C.details.newValue||"")));y?(c="DIRECT_NODE_REMOVAL",p=y.timestamp,u=`Element [ID: ${i.targetNodeId}] <${i.tagName}> was directly removed from its parent [ID: ${y.details.parentId}] via DOM removeChild/replaceChild`,h=95,o.push({timestamp:y.timestamp,sequence:y.sequence,eventId:y.eventId,eventType:y.eventType,evidenceType:"DIRECT",description:`Direct DOM removal mutation: element detached from parent ID ${y.details.parentId}`,confidenceContribution:50})):v?(c="PARENT_SUBTREE_REPLACED",p=v.timestamp,u=`Host framework (e.g. React/Vue re-render) destroyed and replaced Ancestor container [ID: ${v.details.removedAncestorId}], causing injected element to be unmounted`,h=92,o.push({timestamp:v.timestamp,sequence:v.sequence,eventId:v.eventId,eventType:v.eventType,evidenceType:"DIRECT",description:`Ancestor container [ID: ${v.details.removedAncestorId}] was removed, wiping out all child subtrees`,confidenceContribution:50})):d?(c="STYLE_DISPLAY_NONE",p=d.timestamp,u=`Element was visually hidden by an inline style modification: "${d.details.newValue}"`,h=88,o.push({timestamp:d.timestamp,sequence:d.sequence,eventId:d.eventId,eventType:d.eventType,evidenceType:"DIRECT",description:`Inline style changed to "${d.details.newValue}"`,confidenceContribution:45})):m?(c="CLASS_TRIGGERED_HIDDEN",p=m.timestamp,u=`Element was visually hidden because its CSS class list was modified to include "${m.details.newValue}"`,h=85,o.push({timestamp:m.timestamp,sequence:m.sequence,eventId:m.eventId,eventType:m.eventType,evidenceType:"DIRECT",description:`Class list changed from "${m.details.oldValue??""}" to "${m.details.newValue??""}"`,confidenceContribution:45})):i.isCurrentlyAlive&&(c="UNKNOWN",u=`Element [ID: ${i.targetNodeId}] is currently alive and attached to the DOM tree (no unmount mutation detected)`,h=70,g="The element exists in the current DOM state. If it is not visible on screen, it may be clipped by viewport boundaries, z-index stacking context, or 0x0 pixel dimensions.");const f=p??i.createdAt,w=500,E=r.filter(C=>C.timestamp>=f-w&&C.timestampC.timestamp>f&&C.timestamp<=f+w),T=E.filter(C=>C.category==="ERROR");if(T.length>0){const C=T[0],R=((D=C.payload)==null?void 0:D.message)||"Unknown runtime error";o.push({timestamp:C.timestamp,sequence:C.sequence,eventId:C.id,eventType:C.type,evidenceType:"PRECEDING",description:`Runtime error occurred ${(f-C.timestamp).toFixed(1)}ms before disappearance: "${R}"`,confidenceContribution:20,rawEvent:C}),u+=` (preceded by runtime error: "${R}")`}const x=E.filter(C=>C.type==="NETWORK_RESPONSE_COMPLETE"||C.type==="NETWORK_REQUEST_FAILED");if(x.length>0){const C=x[0],R=((M=C.payload)==null?void 0:M.url)||"network request";o.push({timestamp:C.timestamp,sequence:C.sequence,eventId:C.id,eventType:C.type,evidenceType:"PRECEDING",description:`Network response completed ${(f-C.timestamp).toFixed(1)}ms before disappearance: ${R}`,confidenceContribution:15,rawEvent:C})}const N=E.filter(C=>C.category==="NAVIGATION");if(N.length>0){const C=N[0];o.push({timestamp:C.timestamp,sequence:C.sequence,eventId:C.id,eventType:C.type,evidenceType:"PRECEDING",description:`Navigation event (${(L=C.payload)==null?void 0:L.navigationType}) occurred ${(f-C.timestamp).toFixed(1)}ms before disappearance`,confidenceContribution:25,rawEvent:C}),u+=` following SPA navigation to "${(I=C.payload)==null?void 0:I.url}"`}return g||(g=[`Element <${i.tagName}> (Logical ID: ${i.targetNodeId}, selector: "${i.selectorHint}") was created at ${i.createdAt.toFixed(1)}ms.`,`It remained alive in the DOM for ${i.lifespanMs.toFixed(1)}ms and experienced ${i.mutationCount} mutations.`,`At timestamp ${f.toFixed(1)}ms, it disappeared via [${c}].`,`Diagnosis: ${u}.`].join(" ")),c==="PARENT_SUBTREE_REPLACED"?(a.push({hypothesis:"Direct cleanup called by extension code",likelihood:25,evidenceFor:["Element was unmounted shortly after creation"],evidenceAgainst:["Ancestor container mutation was recorded from host page context"]}),a.push({hypothesis:"Host single-page app route change destroyed component tree",likelihood:35,evidenceFor:N.length>0?["Preceding navigation event recorded"]:[],evidenceAgainst:N.length===0?["No navigation events occurred in temporal window"]:[]})):c==="DIRECT_NODE_REMOVAL"&&a.push({hypothesis:"Third-party script or ad-blocker removed the injected node",likelihood:30,evidenceFor:["Direct node removal occurred without ancestor replacement"],evidenceAgainst:["No ad-blocker signatures or extension error logs observed"]}),{targetQuery:e,targetNodeId:i.targetNodeId,found:!0,tagName:i.tagName,selectorHint:i.selectorHint,createdAt:i.createdAt,firstVisibleAt:i.createdAt,lastKnownGoodStateAt:Math.max(0,f-1),disappearedAt:p,lifespanMs:i.lifespanMs,disappearanceMechanism:c,likelyRootCause:u,confidenceScore:Math.min(99,h),detailedExplanation:g,evidentiaryTrail:o,precedingEvents:E,followingEvents:S,correlatedErrors:T,correlatedNetworkCalls:x,alternativeHypotheses:a}}}class qe{constructor(e){b(this,"activeObservation",null);b(this,"registry");b(this,"sequenceCounter");this.registry=e,this.sequenceCounter=new ne}isObserving(){return this.activeObservation!==null}startObservation(e,t=document){this.activeObservation&&this.stopObservation(t);const s=`obs_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,n=Date.now(),i=k.inspectElement(e,this.registry),r=i.bestSelector,o=[],a=this.registry?this.registry.getOrCreateId(e,0):100;o.push({id:`evt_init_${s}`,sessionId:s,timestamp:0,sequence:1,wallClockTime:n,type:"DOM_MUTATION_ADD",category:"DOM",source:"BROWSER_RUNTIME",targetNodeId:a,targetSelector:r,payload:{node:{id:a,nodeType:1,tagName:i.tag,attributes:i.attributes,textContent:i.text,children:[],parentId:null},parentId:null,index:0}});const c=new MutationObserver(u=>{const h=Date.now()-n;for(const g of u)if(g.type==="childList"){for(let p=0;p0&&(m=$e.analyze(n,a)),{observationId:t,targetSelector:n,targetNodeId:((d=r.forensics)==null?void 0:d.logicalNodeId)||void 0,startTime:i,endTime:u,durationMs:h,initialState:r,finalState:p,disappeared:y,disappearanceReason:v,mutations:a.filter(f=>f.category==="DOM"),diagnostics:a.filter(f=>f.category==="ERROR"||f.category==="CONSOLE"),networkEvents:a.filter(f=>f.category==="NETWORK"),screenshots:c,correlationReport:m}}}class Pe{constructor(e={}){b(this,"isExplicitModeActive",!1);b(this,"isGlobalShortcutActive",!1);b(this,"highlighterEl",null);b(this,"badgeEl",null);b(this,"lastSelectedElement",null);b(this,"options",{});b(this,"onMouseMoveBound");b(this,"onClickBound");b(this,"onKeyDownBound");b(this,"onGlobalClickBound");this.options=e,this.onMouseMoveBound=this.handleMouseMove.bind(this),this.onClickBound=this.handleClick.bind(this),this.onKeyDownBound=this.handleKeyDown.bind(this),this.onGlobalClickBound=this.handleGlobalCtrlShiftClick.bind(this),this.initGlobalShortcutListener()}initGlobalShortcutListener(){typeof window>"u"||this.isGlobalShortcutActive||(window.addEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!0)}startPicker(e){typeof document>"u"||(e&&(this.options={...this.options,...e}),!this.isExplicitModeActive&&(this.isExplicitModeActive=!0,this.ensureHighlighter(),document.body&&(document.body.style.cursor="crosshair"),window.addEventListener("mousemove",this.onMouseMoveBound,!0),window.addEventListener("click",this.onClickBound,!0),window.addEventListener("keydown",this.onKeyDownBound,!0)))}stopPicker(){this.isExplicitModeActive&&(this.isExplicitModeActive=!1,typeof document<"u"&&document.body&&(document.body.style.cursor="default"),this.removeHighlighter(),typeof window<"u"&&(window.removeEventListener("mousemove",this.onMouseMoveBound,!0),window.removeEventListener("click",this.onClickBound,!0),window.removeEventListener("keydown",this.onKeyDownBound,!0)))}getLastSelectedElement(){return this.lastSelectedElement}setSelectedElement(e){let t;return"tag"in e&&"bestSelector"in e&&typeof e.getAttribute!="function"?t=e:(t=k.inspectElement(e,this.options.nodeRegistry),this.flashSelection(e)),this.lastSelectedElement=t,this.options.onSelected&&this.options.onSelected(t),t}handleGlobalCtrlShiftClick(e){if(!e.ctrlKey||!e.shiftKey)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s)}handleMouseMove(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t)){this.hideHighlighter();return}this.updateHighlighter(t)}handleClick(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s),this.stopPicker()}handleKeyDown(e){e.key==="Escape"&&this.isExplicitModeActive&&(e.preventDefault(),this.stopPicker(),this.options.onCanceled&&this.options.onCanceled())}isExtensionOwned(e){return!!(e.id==="forensic-recorder-floating-host"||e.id==="forensic-inspect-highlighter"||e.closest("#forensic-recorder-floating-host")||e.closest("#forensic-inspect-highlighter")||e.hasAttribute("data-forensic-internal")||e.closest("[data-forensic-internal]"))}ensureHighlighter(){if(typeof document>"u"||this.highlighterEl)return;const e=this.options.highlightColor||"#0ea5e9",t=document.createElement("div");t.id="forensic-inspect-highlighter",t.setAttribute("data-forensic-internal","true"),t.style.position="fixed",t.style.pointerEvents="none",t.style.zIndex="2147483640",t.style.border=`2px solid ${e}`,t.style.background="rgba(14, 165, 233, 0.18)",t.style.borderRadius="3px",t.style.boxShadow=`0 0 12px ${e}88`,t.style.transition="all 0.05s ease-out",t.style.display="none";const s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="absolute",s.style.bottom="100%",s.style.left="0",s.style.transform="translateY(-4px)",s.style.background="#0f172a",s.style.color="#38bdf8",s.style.fontSize="11px",s.style.fontFamily="monospace",s.style.fontWeight="bold",s.style.padding="2px 6px",s.style.borderRadius="3px",s.style.boxShadow="0 2px 6px rgba(0,0,0,0.5)",s.style.whiteSpace="nowrap",s.style.pointerEvents="none",t.appendChild(s),document.body.appendChild(t),this.highlighterEl=t,this.badgeEl=s}updateHighlighter(e){if(this.ensureHighlighter(),!this.highlighterEl||!this.badgeEl)return;const t=e.getBoundingClientRect();this.highlighterEl.style.display="block",this.highlighterEl.style.left=`${t.left}px`,this.highlighterEl.style.top=`${t.top}px`,this.highlighterEl.style.width=`${Math.max(1,t.width)}px`,this.highlighterEl.style.height=`${Math.max(1,t.height)}px`;const s=e.tagName.toLowerCase(),n=e.id?`#${e.id}`:"",i=e.className&&typeof e.className=="string"?"."+e.className.split(/\s+/)[0]:"",r=`${Math.round(t.width)}×${Math.round(t.height)}`;this.badgeEl.textContent=`<${s}${n}${i}> [${r}]`}hideHighlighter(){this.highlighterEl&&(this.highlighterEl.style.display="none")}removeHighlighter(){this.highlighterEl&&this.highlighterEl.parentElement&&this.highlighterEl.remove(),this.highlighterEl=null,this.badgeEl=null}flashSelection(e){if(typeof document>"u"||!e.getBoundingClientRect)return;const t=e.getBoundingClientRect(),s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="fixed",s.style.left=`${t.left}px`,s.style.top=`${t.top}px`,s.style.width=`${Math.max(1,t.width)}px`,s.style.height=`${Math.max(1,t.height)}px`,s.style.border="2px solid #22c55e",s.style.background="rgba(34, 197, 94, 0.25)",s.style.zIndex="2147483645",s.style.pointerEvents="none",s.style.transition="opacity 0.6s ease-out",document.body.appendChild(s),setTimeout(()=>{s.style.opacity="0",setTimeout(()=>s.remove(),600)},400)}notifyExtension(e){var t;try{typeof chrome<"u"&&((t=chrome.runtime)!=null&&t.sendMessage)&&chrome.runtime.sendMessage({type:"ELEMENT_SELECTED",elementInfo:e,timestamp:Date.now()})}catch{}}destroy(){this.stopPicker(),typeof window<"u"&&window.removeEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!1}}class ge{static getCrcTable(){if(this.crcTable)return this.crcTable;const e=new Uint32Array(256);for(let t=0;t<256;t++){let s=t;for(let n=0;n<8;n++)s=s&1?3988292384^s>>>1:s>>>1;e[t]=s>>>0}return this.crcTable=e,e}static crc32(e,t=0,s=e.length){const n=this.getCrcTable();let i=4294967295;for(let r=t;r>>8^n[(i^e[r])&255];return(i^4294967295)>>>0}static adler32(e){let t=1,s=0;for(let n=0;n>>0}static createPNG(e){const t=Math.max(1,Math.min(1920,Math.floor(e.width))),s=Math.max(1,Math.min(1080,Math.floor(e.height))),n=e.backgroundColor||[15,23,42,255],i=e.headerColor||[56,189,248,255],r=e.borderColor||[99,102,241,255],o=1+t*4,a=new Uint8Array(o*s),c=Math.min(30,Math.floor(s*.2));for(let d=0;d=e.length,g=new Uint8Array(5+u);g[0]=h?1:0,g[1]=u&255,g[2]=u>>>8&255;const p=~u&65535;g[3]=p&255,g[4]=p>>>8&255,g.set(e.subarray(n,n+u),5),t.push(g),n+=u}const i=t.reduce((c,u)=>c+u.length,0)+2+4,r=new Uint8Array(i);let o=0;r[o++]=120,r[o++]=1;for(const c of t)r.set(c,o),o+=c.length;const a=this.adler32(e);return r[o++]=a>>>24&255,r[o++]=a>>>16&255,r[o++]=a>>>8&255,r[o++]=a&255,r}static writeChunk(e,t,s,n){const i=n.length,r=new DataView(e.buffer,e.byteOffset,e.byteLength);r.setUint32(t,i,!1),t+=4;const o=new Uint8Array(4+i);for(let c=0;c<4;c++){const u=s.charCodeAt(c);e[t+c]=u,o[c]=u}t+=4,i>0&&(e.set(n,t),o.set(n,4),t+=i);const a=this.crc32(o);return r.setUint32(t,a,!1),t+=4,t}}b(ge,"crcTable",null);const Q=500;class Ue{constructor(e,t){b(this,"history",[]);b(this,"undoStack",[]);b(this,"redoStack",[]);b(this,"counter",0);b(this,"transaction",null);this.doc=e,this.registry=t}mutate(e){var h;const t=`mut_${Date.now().toString(36)}_${++this.counter}`,s=Date.now();let n;try{n=this.resolveTarget(e.target)}catch(g){return this.failure(t,e,null,g.message,Date.now()-s)}const i=this.snapshotState(n);let r=null,o=null,a,c=!0;try{const g=this.applyOperation(t,e,n);g&&(this.transaction?this.transaction.undoRecords.push(g):(this.undoStack.push(g),this.redoStack=[]));const y=(n.isConnected!==void 0?n.isConnected:this.doc.contains(n))?n:this.doc.querySelector(i.selector)||n;r=this.snapshotState(y),o=this.quickDiff(i,r,n)}catch(g){c=!1,a=g.message,r=null}const u={mutationId:t,operation:e.operation,success:c,before:i,after:r,diff:o,affectedSelector:c?i.selector:null,durationMs:Date.now()-s,error:a,undoable:c&&(this.transaction?this.transaction.undoRecords.length>0:this.undoStack.length>0)};return this.transaction&&this.transaction.steps.push({stepId:`step_${this.transaction.steps.length+1}`,mutation:u}),this.pushHistory({mutationId:t,transactionId:(h=this.transaction)==null?void 0:h.id,timestamp:Date.now(),operation:e.operation,targetSelector:i.selector,success:c,summary:`${e.operation} on ${i.selector}${o?` (+${o.added}/-${o.removed}/~${o.changed})`:""}`,undoApplied:!1,redoApplied:!1}),u}beginTransaction(){if(this.transaction)throw new Error(`TRANSACTION_ALREADY_OPEN: ${this.transaction.id} — commit or rollback first.`);return this.transaction={id:`tx_${Date.now().toString(36)}_${++this.counter}`,steps:[],undoRecords:[]},this.transaction.id}commitTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before committing.");const t=this.transaction,s=Date.now();let n=!0,i;if(e)try{n=e({id:t.id,steps:t.steps})!==!1,n||(i="VERIFY_FAILED: caller verification rejected the transaction state.")}catch(o){n=!1,i=`VERIFY_ERROR: ${o.message}`}if(!n)return this.rollbackInternal(t,i||"VERIFY_FAILED",s);this.undoStack.push(...t.undoRecords),this.undoStack.length>Q&&this.undoStack.splice(0,this.undoStack.length-Q),this.redoStack=[];const r=this.summaryOf(t);return this.transaction=null,{transactionId:t.id,committed:!0,rolledBack:!1,steps:t.steps,durationMs:Date.now()-s,finalStateSummary:r}}rollbackTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before rolling back.");const t=this.transaction;return this.rollbackInternal(t,e||"ROLLBACK_REQUESTED",Date.now())}rollbackInternal(e,t,s){for(const i of[...e.undoRecords].reverse())try{this.applyUndo(i)}catch{}const n=this.summaryOf(e);return this.transaction=null,{transactionId:e.id,committed:!1,rolledBack:!0,steps:e.steps,error:t,durationMs:Date.now()-s,finalStateSummary:n}}undo(){const e=this.transaction?this.transaction.undoRecords:this.undoStack,t=e.pop();if(!t)return{success:!1,message:"Nothing to undo — the mutation history is empty."};try{this.applyUndo(t)}catch(s){return e.push(t),{success:!1,mutationId:t.mutationId,message:`UNDO_FAILED: ${s.message}`}}return this.redoStack.push(t),this.markHistory(t.mutationId,"undo"),{success:!0,mutationId:t.mutationId,message:`Undid ${t.operation} on ${t.targetSelector}.`}}redo(){const e=this.redoStack.pop();if(!e)return{success:!1,message:"Nothing to redo — no undone mutation is pending."};try{const t=this.resolveTarget({selector:e.targetSelector}),s={operation:e.operation,target:{selector:e.targetSelector}};return this.reapplyRecord(e,t,s)?((this.transaction?this.transaction.undoRecords:this.undoStack).push(e),this.markHistory(e.mutationId,"redo"),{success:!0,mutationId:e.mutationId,message:`Redid ${e.operation} on ${e.targetSelector}.`}):(this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:"REDO_FAILED: target state diverged — cannot safely reapply."})}catch(t){return this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:`REDO_FAILED: ${t.message}`}}}getHistory(e=100){return this.history.slice(-e)}getUndoDepth(){return this.transaction?this.transaction.undoRecords.length:this.undoStack.length}getRedoDepth(){return this.redoStack.length}getOpenTransactionId(){var e;return((e=this.transaction)==null?void 0:e.id)||null}preview(e){var t;try{const s=this.resolveTarget(e.target),n=[];let i=1;(e.operation==="set_inner_html"||e.operation==="set_outer_html")&&(n.push("HTML replacement can destroy descendant node identity — captured regions targeting children may become stale."),i=s.querySelectorAll("*").length+1),(e.operation==="remove_element"||e.operation==="unwrap_element")&&(n.push("Removal is destructive; the undo record preserves the full serialized subtree."),i=s.querySelectorAll("*").length+1),e.operation==="move_element"&&!e.parent&&n.push("No parent target supplied — move requires payload.parent."),e.operation==="wrap_element"&&!e.newElementHtml&&n.push("No wrapper HTML supplied — a neutral
wrapper will be generated.");const r=He(e,s);return{valid:n.filter(o=>o.includes("requires")||o.includes("No parent")).length===0,operation:e.operation,target:{selector:this.snapshotState(s).selector,tag:s.tagName.toLowerCase()},expectedChange:r,affectedNodes:i,warnings:n}}catch(s){return{valid:!1,operation:e.operation,target:{selector:String(((t=e.target)==null?void 0:t.selector)||""),tag:""},expectedChange:"—",affectedNodes:0,warnings:[],error:s.message}}}applyOperation(e,t,s){var r;const n=this.snapshotState(s).selector,i=t.operation;switch(i){case"set_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);return s.setAttribute(t.attribute,t.value??""),this.undoFor(e,i,n,{kind:o===null?"remove-attribute":"restore-attribute",attribute:t.attribute,value:o})}case"remove_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);if(o===null)throw new Error(`ATTRIBUTE_NOT_PRESENT: "${t.attribute}" is not set on ${n}.`);return s.removeAttribute(t.attribute),this.undoFor(e,i,n,{kind:"restore-attribute",attribute:t.attribute,value:o})}case"set_text":{const o=s.textContent||"";return s.textContent=t.text??"",this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"replace_text":{if(!t.text||!t.replacement)throw new Error("TEXT_PATTERNS_REQUIRED: payload.text (search) and payload.replacement are required.");const o=s.textContent||"";return s.textContent=o.split(t.text).join(t.replacement),this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"set_inner_html":{const o=s.innerHTML;return s.innerHTML=t.html??"",this.undoFor(e,i,n,{kind:"restore-outer-html",outerHtml:s.outerHTML.replace(t.html??"",o)||void 0,text:o,attribute:"__inner"})}case"set_outer_html":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: element has no parent — cannot replace outer HTML.");const c=this.doc.createComment(`mcpdom_undo_${e}`);s.replaceWith(c);const u=this.doc.createElement("template");u.innerHTML=t.html??"";const h=u.content.firstElementChild;return h?c.replaceWith(h):c.replaceWith(this.doc.createTextNode(t.html??"")),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:this.siblingSelector(h||s)})}case"add_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.add(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"remove_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"replace_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return t.value&&s.classList.add(t.value),this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"set_style":{const o=this.doc.defaultView;if(!(o!=null&&o.getComputedStyle))throw new Error("STYLE_UNAVAILABLE: computed style API is unavailable in this context.");const a={};for(const c of Object.keys(t.style||{}))a[c]=o.getComputedStyle(s).getPropertyValue(c),s.style.setProperty(c,t.style[c]);return this.undoFor(e,i,n,{kind:"restore-style",style:a})}case"remove_style":{const o={};for(const a of t.classes||[])o[a]=s.style.getPropertyValue(a),s.style.removeProperty(a);return this.undoFor(e,i,n,{kind:"restore-style",style:o})}case"add_element":{const o=t.parent?this.resolveTarget(t.parent):s,a=this.doc.createElement("template");a.innerHTML=t.newElementHtml??"
";const c=a.content.firstElementChild;if(!c)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");switch(t.position||"append"){case"before":s.before(c);break;case"after":s.after(c);break;case"prepend":o.prepend(c);break;default:o.appendChild(c)}return this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(c).selector})}case"remove_element":{const o=s.outerHTML,a=s.parentElement,c=s.nextElementSibling;return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"replace_element":{const o=s.outerHTML,a=s.parentElement,c=this.doc.createElement("template");c.innerHTML=t.newElementHtml??"
";const u=c.content.firstElementChild;if(!u)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");const h=s.nextElementSibling;return s.replaceWith(u),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:h?this.snapshotState(h).selector:null})}case"move_element":{if(!t.parent)throw new Error("PARENT_REQUIRED: payload.parent is required for move_element.");const o=this.resolveTarget(t.parent),a=s.outerHTML,c=s.parentElement,u=s.nextElementSibling,h=t.position==="before"||t.position==="prepend"?o.firstElementChild:null;return o[t.position==="prepend"?"prepend":"appendChild"](s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:h?this.snapshotState(h).selector:null,outerHtml:a})}case"wrap_element":{const o=this.doc.createElement("template");o.innerHTML=t.newElementHtml||'
';const a=o.content.firstElementChild;if(!a)throw new Error("INVALID_HTML: wrapper template produced no element.");const c=s.parentElement,u=s.nextElementSibling;return s.replaceWith(a),a.appendChild(s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:null})}case"unwrap_element":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: cannot unwrap a root-level element.");const c=s.nextElementSibling,u=Array.from(s.children);for(const h of u)a.insertBefore(h,s);return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"clone_subtree":{const o=t.parent?this.resolveTarget(t.parent):s.parentElement||s,a=s.cloneNode(!0);if(t.copyAttributes!==!1)for(const c of Array.from(a.attributes))c.name==="id"&&a.removeAttribute("id");return(r=o.appendChild)==null||r.call(o,a),this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(a).selector})}default:throw new Error(`UNKNOWN_OPERATION: ${i} is not a supported DOM mutation.`)}}applyUndo(e){const t=e.inverse;switch(t.kind){case"restore-outer-html":{const s=this.resolveTarget({selector:e.targetSelector});if(t.outerHtml!==void 0){const n=this.doc.createElement("template");n.innerHTML=t.outerHtml;const i=n.content.firstElementChild;i&&s.replaceWith(i)}else t.attribute==="__inner"&&(s.innerHTML=t.text||"");break}case"reinsert-node":{const s=t.parentSelector?this.resolveTarget({selector:t.parentSelector}):this.doc.body,n=this.doc.createElement("template");n.innerHTML=t.outerHtml||"";const i=n.content.firstElementChild;if(!i)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const r=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;s.insertBefore(i,r);break}case"remove-node":{const s=this.safeResolve(t.attribute||e.targetSelector);s&&s.remove();break}case"restore-attribute":{this.resolveTarget({selector:e.targetSelector}).setAttribute(t.attribute,t.value??"");break}case"remove-attribute":{this.resolveTarget({selector:e.targetSelector}).removeAttribute(t.attribute);break}case"restore-text":{const s=this.resolveTarget({selector:e.targetSelector});s.textContent=t.text||"";break}case"restore-classes":{const s=this.resolveTarget({selector:e.targetSelector});s.removeAttribute("class");for(const n of t.classes||[])s.classList.add(n);break}case"restore-style":{const s=this.resolveTarget({selector:e.targetSelector});s.style.removeProperty("all");for(const[n,i]of Object.entries(t.style||{}))s.style.setProperty(n,i);break}case"restore-position":{const s=this.doc.createElement("template");s.innerHTML=t.outerHtml||"";const n=s.content.firstElementChild;if(!n)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const i=this.safeResolve(e.targetSelector);i&&i.remove();const r=t.parentSelector?this.safeResolve(t.parentSelector):this.doc.body,o=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;(r||this.doc.body).insertBefore(n,o);break}}}reapplyRecord(e,t,s){var i;const n=e.inverse;switch(e.operation){case"set_attribute":return(n.kind==="restore-attribute"||n.kind==="remove-attribute")&&s.value!==void 0?(t.setAttribute(s.attribute||n.attribute||"",s.value),!0):!1;case"add_class":{for(const r of s.classes||[])t.classList.add(r);return(((i=s.classes)==null?void 0:i.length)||0)>0}case"remove_class":{for(const r of s.classes||n.classes||[])t.classList.remove(r);return!0}case"set_text":return s.text!==void 0?(t.textContent=s.text,!0):!1;case"set_inner_html":return s.html!==void 0?(t.innerHTML=s.html,!0):!1;default:return!1}}resolveTarget(e){if(!e)throw new Error("TARGET_REQUIRED: mutation requires a target.");if(typeof e=="string"&&(e={selector:e}),e.selector){try{const t=this.doc.querySelectorAll(e.selector);if(t.length===1)return t[0];if(t.length>1)return Array.from(t).find(n=>{try{return k.inspectElement(n).visibility.isVisible}catch{return!1}})||t[0]}catch(t){throw new Error(`TARGET_INVALID: ${t.message}`)}throw new Error(`TARGET_NOT_FOUND: selector "${e.selector}" matches no element.`)}if(e.xpath){try{const s=this.doc.evaluate(e.xpath,this.doc,null,9,null).singleNodeValue;if(s)return s}catch(t){throw new Error(`TARGET_INVALID_XPATH: ${t.message}`)}throw new Error("TARGET_NOT_FOUND: xpath matches no element.")}if(typeof e.nodeId=="number"&&this.registry){const t=this.registry.getNode(e.nodeId);if(t&&t.nodeType===1&&this.doc.contains(t))return t;throw new Error("TARGET_STALE: logical node id no longer resolves to an attached element.")}throw new Error("TARGET_INVALID: target has neither selector, xpath nor nodeId.")}safeResolve(e){try{return this.doc.querySelector(e)}catch{return null}}snapshotState(e){const t=k.inspectElement(e,this.registry),s=e.outerHTML.length>2e4?e.outerHTML.slice(0,2e4)+"…[truncated]":e.outerHTML;return{selector:t.bestSelector,outerHtml:s,attributes:this.attrsOf(e)}}attrsOf(e){const t={};for(const s of Array.from(e.attributes))t[s.name]=s.value.length>300?s.value.slice(0,300)+"…":s.value;return t}quickDiff(e,t,s){if(!t)return null;let n=0,i=0,r=0;const o=new Set(Object.keys(e.attributes)),a=new Set(Object.keys(t.attributes||{}));for(const u of o)a.has(u)||i++;for(const u of a)o.has(u)?e.attributes[u]!==t.attributes[u]&&r++:n++;e.outerHtml!==t.outerHtml&&n+i+r===0&&r++;const c=s.querySelectorAll?s.querySelectorAll("*").length:0;return{added:n,removed:i,changed:r,summary:`attributes +${n}/-${i}/~${r}; subtree nodes: ${c}`}}undoFor(e,t,s,n){return{mutationId:e,operation:t,targetSelector:s,inverse:n}}siblingSelector(e){try{return this.snapshotState(e).selector}catch{return null}}pushHistory(e){this.history.push(e),this.history.length>Q&&this.history.splice(0,this.history.length-Q)}markHistory(e,t){for(let s=this.history.length-1;s>=0;s--)if(this.history[s].mutationId===e){t==="undo"?this.history[s].undoApplied=!0:this.history[s].redoApplied=!0;return}}summaryOf(e){var n;const t=((n=this.doc.documentElement)==null?void 0:n.outerHTML.length)||0,s=e.steps.filter(i=>i.mutation.success).length;return{domLength:t,diffSummary:`${s}/${e.steps.length} mutations applied`}}failure(e,t,s,n,i){var r;return{mutationId:e,operation:t.operation,success:!1,before:s||{selector:String(((r=t.target)==null?void 0:r.selector)||"?"),outerHtml:"",attributes:{}},after:null,diff:null,affectedSelector:null,durationMs:i,error:n,undoable:!1}}}function He(l,e){switch(l.operation){case"set_attribute":return`attribute "${l.attribute}" will be set to "${(l.value??"").slice(0,40)}"`;case"remove_attribute":return`attribute "${l.attribute}" will be removed`;case"set_text":return`text content will be replaced (${(l.text||"").length} chars)`;case"replace_text":return`every occurrence of "${l.text}" will become "${l.replacement}"`;case"set_inner_html":return`inner HTML will be replaced (${(l.html||"").length} chars)`;case"set_outer_html":return"element (and subtree) will be replaced with provided HTML";case"add_class":return`classes ${(l.classes||[]).join(", ")} will be added`;case"remove_class":return`classes ${(l.classes||[]).join(", ")} will be removed`;case"replace_class":return`classes ${(l.classes||[]).join(", ")} will be replaced with "${l.value}"`;case"set_style":return`inline styles ${Object.keys(l.style||{}).join(", ")} will be set`;case"remove_style":return`inline styles ${(l.classes||[]).join(", ")} will be removed`;case"add_element":return`a new element will be inserted ${l.position||"append"} the target`;case"remove_element":return"the element and its subtree will be removed";case"replace_element":return"the element will be replaced with new HTML";case"move_element":return"the element will be moved into the specified parent";case"wrap_element":return"the element will be wrapped in a new container";case"unwrap_element":return"children will be lifted out and the wrapper removed";case"clone_subtree":return"a deep clone of the subtree will be appended";default:return"unknown operation"}}class Fe{constructor(){b(this,"executionCounter",0)}async execute(e,t,s={}){const n=Math.min(Math.max(s.timeoutMs??5e3,100),3e4),i=`js_${Date.now().toString(36)}_${++this.executionCounter}`,r=e.defaultView;if(!r)return this.result(i,"BLOCKED_BY_CONTEXT",0,t,[],{name:"NoWindow",message:"The document has no associated window — execution context unavailable."});const o=e.documentElement?e.documentElement.outerHTML.length:0,a=[],c=this.hookConsole(r,a);let u="EXECUTED_SUCCESSFULLY",h,g,p=o,y=!1;const v=Date.now();try{const f=this.buildRunner(r,t),w=new Promise((E,S)=>{var x;const T=setTimeout(()=>{y=!0,S(new Error(`Script timed out after ${n}ms`))},n);(x=T==null?void 0:T.unref)==null||x.call(T)});h=await Promise.race([f,w])}catch(f){y?u="TIMED_OUT":u="EXECUTED_WITH_ERROR",g={name:(f==null?void 0:f.name)||"Error",message:(f==null?void 0:f.message)||String(f),stack:f!=null&&f.stack?String(f.stack).slice(0,2e3):void 0}}const m=Date.now()-v;p=e.documentElement?e.documentElement.outerHTML.length:0,c();const d=this.serialize(h);return u==="EXECUTED_SUCCESSFULLY"&&d.serializationFailed&&(u="SERIALIZATION_FAILED",g={name:"SerializationError",message:d.message||"Result could not be serialized."}),{status:u,executionId:i,durationMs:m,result:u==="EXECUTED_SUCCESSFULLY"?d.text:void 0,error:g,consoleOutput:a.slice(0,100),domChanged:o!==p,domLengthBefore:o,domLengthAfter:p,world:s.world||"ISOLATED",timeoutMs:n,codePreview:t.length>300?t.slice(0,300)+"…":t}}buildRunner(e,t){const s=`(async function() { ${t} -})()`,n=e;if(typeof n.eval!="function")return Promise.reject(new Error("BLOCKED_BY_CONTEXT: window.eval is unavailable in this context."));try{const i=n.eval(s);return i&&typeof i.then=="function"?i:Promise.resolve(i)}catch(i){return Promise.reject(i)}}hookConsole(e,t){var o;const s=["log","warn","error","info","debug"],n={},i=e,r=100;for(const a of s){const c=(o=i.console)==null?void 0:o[a];if(typeof c=="function"){n[a]=c;try{i.console[a]=(...u)=>{t.length{for(const a of s)if(n[a])try{i.console[a]=n[a]}catch{}}}serialize(e){if(e===void 0)return{text:"undefined"};if(e===null)return{text:"null"};try{if(typeof e=="string")return{text:e.slice(0,5e3)};const t=JSON.stringify(e,be,1);return t===void 0?{serializationFailed:!0,message:"JSON.stringify returned undefined (circular or non-serializable structure)."}:{text:t.length>5e4?t.slice(0,5e4)+"…[truncated]":t}}catch(t){return{serializationFailed:!0,message:(t==null?void 0:t.message)||"Serialization failed."}}}result(e,t,s,n,i,r){return{status:t,executionId:e,durationMs:s,error:r,consoleOutput:i,domChanged:!1,domLengthBefore:0,domLengthAfter:0,world:"ISOLATED",timeoutMs:5e3,codePreview:n.length>300?n.slice(0,300)+"…":n}}}function be(l,e){var t;if(e&&typeof e=="object"&&e.nodeType===1){const s=e;return{__element:!0,tag:s.tagName.toLowerCase(),id:s.getAttribute("id")||void 0,selector:s.tagName.toLowerCase()+(s.getAttribute("id")?`#${s.getAttribute("id")}`:""),text:(s.textContent||"").trim().slice(0,60)}}return typeof e=="function"?{__function:!0,name:e.name||"anonymous"}:e&&e.nodeType===9?{__document:!0,url:(t=e.location)==null?void 0:t.href}:e}function Ve(l){try{if(typeof l=="string")return l;if(l instanceof Error)return`${l.name}: ${l.message}`;const e=JSON.stringify(l,be);return e===void 0?String(l):e}catch{return String(l)}}const ye={"desktop-full-hd":{width:1920,height:1080,category:"desktop"},"desktop-hd":{width:1366,height:768,category:"desktop"},"desktop-laptop":{width:1440,height:900,category:"desktop"},"desktop-xga":{width:1280,height:1024,category:"desktop"},"desktop-1024":{width:1024,height:768,category:"desktop"},"tablet-ipad":{width:768,height:1024,category:"tablet"},"tablet-ipad-pro":{width:1024,height:1366,category:"tablet"},"tablet-portrait":{width:768,height:1024,category:"tablet"},"tablet-landscape":{width:1024,height:768,category:"tablet"},"mobile-iphone-se":{width:375,height:667,category:"mobile"},"mobile-iphone-12":{width:390,height:844,category:"mobile"},"mobile-iphone-14-pro-max":{width:430,height:932,category:"mobile"},"mobile-pixel-7":{width:412,height:915,category:"mobile"},"mobile-galaxy-s8":{width:360,height:740,category:"mobile"},"mobile-small":{width:320,height:568,category:"mobile"},"test-a4":{width:800,height:600,category:"test"},"test-square":{width:512,height:512,category:"test"}},Ee={"iphone-13":{width:390,height:844,devicePixelRatio:3,userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"mobile"},"ipad-air":{width:820,height:1180,devicePixelRatio:2,userAgent:"Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"tablet"},"pixel-7":{width:412,height:915,devicePixelRatio:2.625,userAgent:"Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"galaxy-s23":{width:384,height:800,devicePixelRatio:3,userAgent:"Mozilla/5.0 (Linux; Android 14; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"macbook-pro-16":{width:1728,height:1080,devicePixelRatio:2,userAgent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"},"windows-desktop":{width:1920,height:1080,devicePixelRatio:1,userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"}};class ze{constructor(e){f(this,"original",null);f(this,"modified",!1);f(this,"activePreset",null);f(this,"activeDevice",null);this.doc=e}state(){const e=this.doc.defaultView;return{width:(e==null?void 0:e.innerWidth)||0,height:(e==null?void 0:e.innerHeight)||0,devicePixelRatio:(e==null?void 0:e.devicePixelRatio)||1,scrollX:(e==null?void 0:e.scrollX)||0,scrollY:(e==null?void 0:e.scrollY)||0,original:this.original,isModified:this.modified}}resize(e,t,s){const n=this.doc.defaultView,i={width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0},r=this.pageDigest();this.original||(this.original={...i});const o=this.applySize(e,t);this.modified=!0,this.activePreset=s||this.activePreset;const a=this.pageDigest();return{success:!0,applied:{width:o.width,height:o.height},previous:i,original:{...this.original},preset:s||void 0,beforeState:r,afterState:a,reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}applyPreset(e){const t=ye[e];if(!t)throw new Error(`UNKNOWN_PRESET: "${e}". Available: ${Object.keys(ye).join(", ")}`);return this.resize(t.width,t.height,e)}emulateDevice(e){const t=Ee[e];if(!t)throw new Error(`UNKNOWN_DEVICE: "${e}". Available: ${Object.keys(Ee).join(", ")}`);const s=this.resize(t.width,t.height,`device:${e}`);this.activeDevice=e;const n=this.doc.defaultView;return n&&this.isSimulation()&&n.devicePixelRatio!==void 0&&(n.devicePixelRatio=t.devicePixelRatio),{device:e,resize:s,profile:{width:t.width,height:t.height,devicePixelRatio:t.devicePixelRatio,touch:t.touch,category:t.category},userAgentNote:this.isSimulation()?"User-Agent override requires the Chrome DevTools Protocol (real browser session); in this context the viewport, dpr and touch metadata are applied and the UA is reported but not enforced.":"User-Agent and touch behaviors are applied by the browser emulation layer.",userAgentApplied:!this.isSimulation()}}reset(){var s,n;const e={width:((s=this.doc.defaultView)==null?void 0:s.innerWidth)||0,height:((n=this.doc.defaultView)==null?void 0:n.innerHeight)||0},t=this.original?{...this.original}:{...e};return this.original&&this.applySize(this.original.width,this.original.height),this.modified=!1,this.activePreset=null,this.activeDevice=null,{success:!0,applied:{width:t.width,height:t.height},previous:e,original:{...t},reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}runResponsiveTest(e,t={restore:!0}){var c,u,d,h;const s=t.restore!==!1,n=this.original?{...this.original}:{width:((c=this.doc.defaultView)==null?void 0:c.innerWidth)||0,height:((u=this.doc.defaultView)==null?void 0:u.innerHeight)||0};this.original||(this.original={...n});const i=e.map(p=>{this.applySize(p.width,p.height),this.modified=!0;const y=this.pageDigest();return{label:p.label,width:p.width,height:p.height,domLength:y.domLength,interactiveCount:y.interactiveCount,horizontalOverflow:this.hasHorizontalOverflow(),screenshotId:void 0}}),r=i.slice(1).map((p,y)=>({from:i[y].label,to:p.label,domLengthDelta:p.domLength-i[y].domLength,interactiveDelta:p.interactiveCount-i[y].interactiveCount}));let o={width:((d=i[i.length-1])==null?void 0:d.width)||0,height:((h=i[i.length-1])==null?void 0:h.height)||0},a=!1;return s&&(this.applySize(n.width,n.height),this.modified=!1,o={...n},a=!0),{success:!0,originalViewport:n,steps:i,restored:a,finalViewport:o,comparisons:r}}getActivePreset(){return this.activePreset}getActiveDevice(){return this.activeDevice}applySize(e,t){const s=Math.max(200,Math.min(7680,Math.round(e))),n=Math.max(200,Math.min(4320,Math.round(t))),i=this.doc.defaultView;return i&&(typeof i.innerWidth=="number"&&(i.innerWidth=s),typeof i.innerHeight=="number"&&(i.innerHeight=n),typeof i.outerWidth=="number"&&(i.outerWidth=s),typeof i.outerHeight=="number"&&(i.outerHeight=n)),{width:s,height:n}}pageDigest(){var t,s,n,i;const e=this.doc.querySelectorAll('a[href], button, input, select, textarea, [role="button"], [onclick]').length;return{url:((s=(t=this.doc.defaultView)==null?void 0:t.location)==null?void 0:s.href)||((n=this.doc.location)==null?void 0:n.href)||"",domLength:((i=this.doc.documentElement)==null?void 0:i.outerHTML.length)||0,interactiveCount:e}}hasHorizontalOverflow(){const e=this.doc.documentElement,t=this.doc.body,s=this.doc.defaultView;return!s||!e?!1:Math.max(e.scrollWidth||0,(t==null?void 0:t.scrollWidth)||0)>(s.innerWidth||e.clientWidth||0)+1}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}}const We=[/^css-/,/^jsx-/,/^sc-[A-Za-z]/,/^emotion/,/^chakra-/,/^mantine-/i,/^_ng[a-z]/,/^ng-/i,/^v-/,/^(?=.*\d)[a-z0-9]{6,12}$/i,/^data-v-/],Xe=["id","name","data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","aria-labelledby","aria-describedby","role","type","href","for","title","alt","rel","placeholder"];function ve(l){let e=2166136261;for(let t=0;t>>0).toString(16).padStart(8,"0")}function ie(l){return We.some(e=>e.test(l))}function Ge(l){return Xe.includes(l)}function ce(l){const e=l.trim();return e?!!((e.match(/\d/g)||[]).length/e.length>.5||/^\d+[.,:\-/ ]+\d+/.test(e)||/\b\d{10,}\b/.test(e)):!1}function Ke(l,e=80){return Array.from(l.childNodes).filter(s=>s.nodeType===3).map(s=>(s.textContent||"").trim()).join(" ").replace(/\s+/g," ").slice(0,e)}function Ye(l,e){const t=[];let s=l;for(;s&&t.length!ie(b)),r=Ke(e),o=e.getBoundingClientRect(),a={width:Math.round(o.width),height:Math.round(o.height)},c=Ye(e,4),u=c.join(">"),h=Array.from(e.children||[]).slice(0,8).map(b=>b.tagName.toLowerCase()).join("|"),p=e.getAttribute("role")||(t!=null&&t.getComputedStyle,void 0)||je(e),y=ve(JSON.stringify({t:e.tagName.toLowerCase(),a:s,c:i.slice(0,4),r:p||null,anc:u,desc:h,txt:ce(r)?null:r.slice(0,40),d:a})),v=[];let m="low";return!s.id&&!s["data-testid"]&&!s.name&&(m="medium",v.push("no stable identity attribute")),n.length>0&&i.length===0&&(m=v.length?"high":"medium",v.push("all classes are framework-generated")),ce(r)&&(v.push("text appears dynamic"),m==="low"&&(m="medium")),e.tagName.toLowerCase().includes("-")&&(v.push("custom element (web component)"),m==="low"&&(m="medium")),{fingerprintId:`fp_${y}`,hash:y,tagHierarchy:c,stableAttributes:s,meaningfulText:r,classes:i,role:p||void 0,dimensions:a,ancestorPattern:u,descendantPattern:h,volatilityRisk:m,volatilityReasons:v}}compare(e,t){const s=[],n=e.tagHierarchy[0]===t.tagHierarchy[0]?1:0;s.push({name:"tag",score:n,weight:.15});const i=we(e.ancestorPattern.split(">"),t.ancestorPattern.split(">"));s.push({name:"ancestorPattern",score:i,weight:.2});const r=Je(e.stableAttributes,t.stableAttributes);s.push({name:"stableAttributes",score:r,weight:.25});const o=we(e.classes,t.classes);s.push({name:"classes",score:o,weight:.1});const a=(e.role||"")===(t.role||"")&&e.role?1:0;s.push({name:"role",score:a,weight:.1});const c=e.meaningfulText===t.meaningfulText&&e.meaningfulText?1:0;s.push({name:"text",score:c,weight:.1});const u=Ze(e.dimensions,t.dimensions);s.push({name:"dimensions",score:u,weight:.1});const d=s.reduce((h,p)=>h+p.score*p.weight,0);return{score:Math.round(d*1e3)/1e3,components:s}}}function je(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return t==="checkbox"?"checkbox":t==="radio"?"radio":t==="button"||t==="submit"?"button":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";default:return}}function we(l,e){if(!l.length&&!e.length)return 1;if(!l.length||!e.length)return 0;const t=new Set(e);return l.filter(n=>t.has(n)).length/Math.max(l.length,e.length)}function Je(l,e){const t=Object.keys(l),s=Object.keys(e);if(!t.length&&!s.length)return .5;if(!t.length||!s.length)return 0;let n=0,i=0;for(const r of t)r in e&&(i++,l[r]===e[r]&&n++);return i===0?0:n/Math.max(t.length,s.length)}function Ze(l,e){if(l.width===0&&l.height===0&&e.width===0&&e.height===0)return .5;const t=Se(l.width,e.width),s=Se(l.height,e.height);return(t+s)/2}function Se(l,e){if(l===e)return 1;if(l===0||e===0)return 0;const t=Math.min(l,e)/Math.max(l,e);return t>.9?1:t>.7?.5:0}const Qe=["data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","name","id"],Te=/^[a-zA-Z][a-zA-Z0-9_-]*$/,et=/^[a-zA-Z0-9_ .:-]+$/;class Z{constructor(e){f(this,"doc");this.doc=e}generateCandidates(e){const t=[],s=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n&&Te.test(n)){const u=`#${Ce(n)}`;t.push(this.evaluate(e,u,"id",1,["unique stable id"]))}for(const u of Qe){if(u==="id")continue;const d=e.getAttribute(u);if(d&&et.test(d)&&d.length<100){const h=`${s}[${u}="${Q(d)}"]`;t.push(this.evaluate(e,h,"semantic-attribute",.92,[`semantic attribute ${u}`]))}}const i=Array.from(e.classList||[]).filter(u=>!ie(u));if(i.length){const u=`${s}.${i.slice(0,3).map(Ce).join(".")}`;t.push(this.evaluate(e,u,"class",.72,i.length?["stable class names"]:[]))}const r=this.buildStructuralPath(e);r&&t.push(this.evaluate(e,r,"structural-path",.55,["position-based structural path"]));const o=B(e);if(o&&o.length>=2&&o.length<=60&&!ce(o)){const u=`${s}:nth-of-type(1)`,d=this.buildTextXPath(e,o);d&&(t.push({selector:u,strategy:"text-derived-xpath",confidence:.6,unique:this.isXPathUnique(d),reasons:[`matches text "${o.slice(0,30)}"`]}),t[t.length-1].xpath=d)}const a=this.buildAttributeFingerprintSelector(e);a&&t.push(this.evaluate(e,a,"attribute-fingerprint",.68,["combination of stable attributes"]));const c=new Map;for(const u of t){const d=u.strategy==="text-derived-xpath"?`xpath:${u.xpath}`:u.selector,h=c.get(d);(!h||u.confidence>h.confidence)&&c.set(d,u)}return Array.from(c.values()).sort((u,d)=>d.confidence-u.confidence)}bestSelector(e){const t=this.generateCandidates(e),s=t.find(n=>n.unique&&n.confidence>=.7)||t[0];return{selector:(s==null?void 0:s.selector)||e.tagName.toLowerCase(),strategy:(s==null?void 0:s.strategy)||"tag",confidence:(s==null?void 0:s.confidence)||.3}}buildXPath(e){const t=[];let s=e;for(;s&&s!==this.doc.documentElement;){const n=s.getAttribute("id");if(n&&Te.test(n)){t.unshift(`*[@id="${Q(n)}"]`);break}const i=s.parentElement;if(!i){t.unshift(s.tagName.toLowerCase());break}const o=Array.from(i.children).filter(a=>a.tagName===s.tagName).indexOf(s)+1;t.unshift(`${s.tagName.toLowerCase()}[${o}]`),s=i}return s===this.doc.documentElement&&(!t.length||!t[0].includes("@id"))&&t.unshift("html"),"//"+t.join("/")}buildTextXPath(e,t){try{const s=e.tagName.toLowerCase(),n=tt(t);return`//${s}[normalize-space(text())=${n}]`}catch{return null}}buildStructuralPath(e,t=4){const s=[];let n=e;for(;n&&s.lengthc.tagName===n.tagName);if(a.length>1){const c=a.indexOf(n)+1;s.unshift(`${o}:nth-of-type(${c})`)}else s.unshift(o);if(n=r,n===this.doc.body){s.unshift("body");break}if(n===this.doc.documentElement)break}const i=s.join(" > ");return i.includes("body")?i:"body > "+i}buildAttributeFingerprintSelector(e){const t=e.tagName.toLowerCase(),s=[],n=e.getAttribute("type");n&&s.push(`type="${Q(n)}"`);const i=e.getAttribute("href");i&&i.length<80&&!i.startsWith("javascript:")&&s.push(`href^="${Q(i.slice(0,40))}"`);const r=e.getAttribute("placeholder");return r&&r.length<60&&s.push(`placeholder="${Q(r)}"`),s.length>=2?`${t}[${s.join("][")}]`:null}evaluate(e,t,s,n,i){let r=!1,o=0;try{const c=this.doc.querySelectorAll(t);o=c.length,r=c.length===1&&c[0]===e}catch{return{selector:t,strategy:s,confidence:0,unique:!1,reasons:["invalid selector syntax"]}}let a=n;return o===0?(a=0,i.push("selector matched nothing (invalid candidate)")):o===1&&r?i.push("matches exactly this element"):(a=a*.4,i.push(`matches ${o} elements — ambiguous`)),{selector:t,strategy:s,confidence:Math.round(a*100)/100,unique:r,reasons:i}}isXPathUnique(e){try{return this.doc.evaluate(`count(${e})`,this.doc,null,4,null).numberValue===1}catch{return!1}}}function B(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function Ce(l){return l.replace(/([^a-zA-Z0-9_\u00A0-\uFFFF-])/g,"\\$1")}function Q(l){return l.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function tt(l){return l.includes("'")?l.includes('"')?`concat(${l.split("'").map(e=>`'${e}'`).join(`, "'", `)})`:`"${l}"`:`'${l}'`}class st{constructor(e,t){f(this,"fingerprintEngine",new re);f(this,"counter",0);this.doc=e,this.registry=t}buildTarget(e,t="selector"){var d;const s=new Z(this.doc),n=s.generateCandidates(e),i=s.bestSelector(e),r=this.fingerprintEngine.fingerprint(e),o=L.inspectElement(e,this.registry),a=e.getBoundingClientRect();let c=i.confidence*.6;return r.volatilityRisk==="low"?c+=.3:r.volatilityRisk==="medium"&&(c+=.15),n.find(h=>h.unique&&h.confidence>=.9)&&(c+=.1),c=Math.max(.05,Math.min(1,c)),this.counter++,{targetId:`tgt_${Date.now().toString(36)}_${this.counter}`,tag:e.tagName.toLowerCase(),role:o.role||r.role,selector:i.selector,selectorCandidates:n,xpath:s.buildXPath(e),domPath:(((d=o.context)==null?void 0:d.parentChain)||[]).concat(i.selector).join(" > "),textFingerprint:r.meaningfulText,attributeFingerprint:JSON.stringify(r.stableAttributes),structuralFingerprint:r.hash,attributes:o.attributes||{},confidence:Math.round(c*100)/100,bounds:{x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height)},resolvedFrom:t}}resolveAndBuild(e){let t=null,s="unknown";typeof e=="string"&&(e={selector:e});const n=e;if(n.selectedElementRef&&(s="selectedElementRef"),!t&&n.selector)try{const i=this.doc.querySelectorAll(n.selector);if(i.length===0)return{error:`TARGET_NOT_FOUND: selector "${n.selector}" matches no element`};i.length>1?(t=nt(i,this.doc)||i[0],s+="+disambiguated"):(t=i[0],s="selector")}catch(i){return{error:`TARGET_INVALID: ${i.message}`}}if(!t&&n.xpath)try{t=this.doc.evaluate(n.xpath,this.doc,null,9,null).singleNodeValue,s="xpath"}catch(i){return{error:`TARGET_INVALID_XPATH: ${i.message}`}}if(!t&&typeof n.nodeId=="number"&&this.registry){const i=this.registry.getNode(n.nodeId);i&&i.nodeType===1&&this.doc.contains(i)&&(t=i,s="nodeId")}return!t&&n.coordinates&&(t=this.doc.elementFromPoint(n.coordinates.x,n.coordinates.y),s="coordinates"),t?{element:t,target:this.buildTarget(t,s)}:{error:"TARGET_NOT_FOUND: no usable resolution strategy succeeded"}}}function nt(l,e){for(const t of Array.from(l)){const s=t;try{if(L.inspectElement(s).visibility.isVisible)return s}catch{}}return null}class it{constructor(e){f(this,"fingerprintEngine",new re);this.doc=e}recover(e,t){var p;const s=[],n=[];let i=null;try{i=this.doc.querySelectorAll(e)}catch(y){s.push(`selector syntax error: ${y.message}`)}if(i&&i.length>0){s.push("selector still matches — no recovery needed");const y=i[0];return{recovered:!0,confidence:1,strategy:"original-selector",resolvedSelector:e,matchedElementInfo:Ie(y),alternatives:[],diagnostics:s,recommendation:"Original selector works; the earlier failure was transient (likely a navigation or render race)."}}s.push("selector no longer matches any element");const o=this.collectCandidates(t,s).map(y=>({element:y,score:this.scoreMatch(y,t)})).filter(y=>y.score.score>.35).sort((y,v)=>v.score.score-y.score.score);for(const y of o.slice(0,5)){const v=new Z(this.doc).bestSelector(y.element);n.push({selector:v.selector,confidence:Math.round(y.score.score*100)/100,strategy:"recovery-match"})}if(!o.length)return{recovered:!1,confidence:0,strategy:"none",alternatives:n,diagnostics:s,recommendation:"No sufficiently similar element exists. The region may have been removed, or the page structure changed fundamentally. Re-inspect the page and capture a new target."};const a=o[0],c=o.length>1?a.score.score-o[1].score.score:1;s.push(`best candidate score: ${a.score.score.toFixed(3)} (margin ${c.toFixed(3)})`);for(const y of a.score.components)y.score>0&&s.push(` - ${y.name}: ${(y.score*100).toFixed(0)}%`);if(a.score.score<.62||o.length>1&&c<.15)return{recovered:!1,confidence:Math.round(a.score.score*100)/100,strategy:"recovery-refused",resolvedSelector:(p=n[0])==null?void 0:p.selector,alternatives:n,diagnostics:s,recommendation:"Recovery refused: best match is not confident enough or too close to a competing element. Inspect alternatives manually before acting — refusing to avoid acting on a wrong element."};const h=new Z(this.doc).bestSelector(a.element).selector;return{recovered:!0,confidence:Math.round(a.score.score*100)/100,strategy:"fingerprint-recovery",resolvedSelector:h,matchedElementInfo:Ie(a.element),alternatives:n,diagnostics:s,recommendation:`Recovered target with ${(a.score.score*100).toFixed(0)}% confidence. Verify the resolved selector before destructive actions.`}}collectCandidates(e,t){var r,o;const s=new Set,n=this.doc.querySelectorAll(e.tag);let i=0;for(const a of Array.from(n))if(s.add(a),++i>=400)break;if((r=e.classes)!=null&&r.length){const a=e.classes.filter(c=>!ie(c));for(const c of a.slice(0,2))try{for(const u of Array.from(this.doc.querySelectorAll(`.${c}`)).slice(0,100))s.add(u)}catch{}}if((o=e.stableAttributes)!=null&&o.name)try{for(const a of Array.from(this.doc.querySelectorAll(`[name="${e.stableAttributes.name}"]`)))s.add(a)}catch{}if(e.parentSelector)try{for(const a of Array.from(this.doc.querySelectorAll(`${e.parentSelector} > ${e.tag}`)).slice(0,100))s.add(a)}catch{}return t.push(`collected ${s.size} candidate elements for scoring`),Array.from(s)}scoreMatch(e,t){const s=[],n=e.tagName.toLowerCase()===t.tag.toLowerCase()?1:0;s.push({name:"tag",score:n,weight:.15});const i=(t.text||"").trim().slice(0,40),r=B(e).slice(0,40),o=(e.textContent||"").trim().slice(0,40);let a=0;if(i){const g=r?r===i?1:le(i,r):0,b=o?o===i?1:le(i,o):0;a=Math.max(g,b)}s.push({name:"text",score:a,weight:.3});const c=new Set((t.classes||[]).filter(g=>!ie(g))),u=Array.from(e.classList||[]),d=c.size?u.filter(g=>c.has(g)).length/c.size:.5;s.push({name:"classes",score:d,weight:.2});const h=t.stableAttributes||{},p=Object.keys(h);let y=.5;if(p.length){let g=0;for(const b of p)e.getAttribute(b)===h[b]&&g++;y=g/p.length}s.push({name:"attributes",score:y,weight:.2});const v=t.childCount!==void 0?e.children.length===t.childCount?1:le(String(t.childCount),String(e.children.length)):.5;if(s.push({name:"childCount",score:v,weight:.05}),t.fingerprintHash){const g={fingerprintId:"snapshot",hash:t.fingerprintHash,tagHierarchy:[t.tag],stableAttributes:h,meaningfulText:i,classes:t.classes||[],dimensions:{width:0,height:0},ancestorPattern:"",descendantPattern:"",volatilityRisk:"medium",volatilityReasons:[]},b=this.fingerprintEngine.fingerprint(e),T=this.fingerprintEngine.compare(g,b);s.push({name:"fingerprint",score:T.score,weight:.1})}const m=s.reduce((g,b)=>g+b.score*b.weight,0);return{score:Math.max(0,Math.min(1,m)),components:s}}diagnose(e){const t=[];let s=!0,n=0,i,r=[];try{n=this.doc.querySelectorAll(e).length}catch(o){s=!1,i=o.message,t.push("Selector is syntactically invalid CSS.")}if(s&&n===0){t.push("Selector parses but matches nothing — element may be removed, re-rendered, or inside a shadow root."),r=this.relaxSelector(e);for(const o of r)try{if(this.doc.querySelectorAll(o).length>0){t.push(`Relaxed form "${o}" matches — the over-specific part of the selector is stale.`);break}}catch{}}return s&&n>1&&t.push(`Selector matches ${n} elements — it is ambiguous; use a more specific form or index.`),{selector:e,valid:s,matches:n,parseError:i,closestWorkingSelectors:r.filter(o=>{try{return this.doc.querySelectorAll(o).length>0}catch{return!1}}),diagnosis:t}}relaxSelector(e){const t=[],s=e.split(/[ >]+/).filter(Boolean);s.length>1&&(t.push(s.slice(0,-1).join(" ")),t.push(s[s.length-1]));const n=e.replace(/:nth-of-type\(\d+\)/g,"").replace(/\.[^. >#:[]+/g,(i,r,o)=>o[r-1]==="\\"?i:"");return n!==e&&n.trim()&&t.push(n.trim()),t}}function le(l,e){if(!l||!e)return 0;const t=Ae(l),s=Ae(e);if(t===s)return 1;if(t.includes(s)||s.includes(t))return .7;const n=new Set(t.split(/\s+/)),i=new Set(s.split(/\s+/));return Array.from(n).filter(o=>i.has(o)).length/Math.max(n.size,i.size)}function Ae(l){return l.toLowerCase().replace(/[^a-z0-9 ]/g," ").replace(/\s+/g," ").trim()}function Ie(l){return{tag:l.tagName.toLowerCase(),id:l.getAttribute("id")||void 0,text:B(l).slice(0,60),classes:Array.from(l.classList||[])}}class ue{constructor(e){f(this,"state");this.state=e>>>0,this.state===0&&(this.state=2654435769)}next(){this.state=this.state+1831565813>>>0;let e=this.state;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}range(e,t){return e+this.next()*(t-e)}int(e,t){return Math.floor(this.range(e,t+1))}chance(e){return this.next()setTimeout(t,e))}chance(){return this.rng.next()<.5}}const ot=[{ruleId:"red_key_password",kind:"key-pattern",pattern:"password|passwd|pwd",description:"Keys containing password/passwd/pwd",enabled:!0,userAdded:!1},{ruleId:"red_key_token",kind:"key-pattern",pattern:"token|jwt|bearer|auth|session.?id|secret|api.?key|client.?secret",description:"Keys containing token/jwt/auth/session-id/secret/api-key",enabled:!0,userAdded:!1},{ruleId:"red_key_credential",kind:"key-pattern",pattern:"credential|login|user.?pass|otp|2fa|mfa|verification",description:"Keys containing credential/login/otp/2fa/verification",enabled:!0,userAdded:!1},{ruleId:"red_key_payment",kind:"key-pattern",pattern:"card|payment|billing|iban|cvv|cvc|pan",description:"Keys containing card/payment/billing/iban/cvv",enabled:!0,userAdded:!1},{ruleId:"red_key_personal",kind:"key-pattern",pattern:"ssn|social.?security|national.?id|passport|tax.?id",description:"Keys containing personal identifier patterns",enabled:!0,userAdded:!1},{ruleId:"red_val_jwt",kind:"value-pattern",pattern:"eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+",description:"JWT-shaped tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_bearer",kind:"value-pattern",pattern:"bearer\\s+[A-Za-z0-9._-]+",description:"Bearer tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_long_hex",kind:"value-pattern",pattern:"\\b[a-f0-9]{32,}\\b",description:"32+ char hex strings (session/API ids)",enabled:!0,userAdded:!1},{ruleId:"red_val_sk",kind:"value-pattern",pattern:"\\b(sk|pk|rk)_[A-Za-z0-9_]{20,}\\b",description:"Stripe-style secret keys (sk_live_…)",enabled:!0,userAdded:!1},{ruleId:"red_attr_input_password",kind:"attribute-name",pattern:"value",description:"value attributes on password inputs handled by PrivacyEngine maskValue",enabled:!0,userAdded:!1},{ruleId:"red_attr_secret",kind:"attribute-name",pattern:"data-secret|data-token|data-api-key|secret|access.?token",description:"Secret-carrying attributes",enabled:!0,userAdded:!1}],at=[{exclusionId:"excl_mcpdom_overlay",selector:"[data-mcpdom-internal], [data-forensic-internal], #forensic-recorder-floating-host, #forensic-inspect-highlighter",reason:"MCPDOM-injected UI must never contaminate captured DOM (§68 clean capture)",userAdded:!1},{exclusionId:"excl_mcpdom_ids",selector:'[id^="forensic-"], [id^="mcpdom-"]',reason:"MCPDOM-namespaced nodes",userAdded:!1}],de="[REDACTED]";class he{constructor(e){f(this,"config");f(this,"base",new se);f(this,"compiledKeyPatterns",[]);f(this,"compiledValuePatterns",[]);f(this,"compiledAttrPatterns",[]);this.config={rules:[...ot],exclusions:[...at],stubMode:!0,...e},this.recompile()}recompile(){this.compiledKeyPatterns=[],this.compiledValuePatterns=[],this.compiledAttrPatterns=[];for(const e of this.config.rules){if(!e.enabled)continue;const t="i";try{switch(e.kind){case"key-pattern":this.compiledKeyPatterns.push(new RegExp(e.pattern,t));break;case"value-pattern":this.compiledValuePatterns.push(new RegExp(e.pattern,"i"));break;case"attribute-name":this.compiledAttrPatterns.push(new RegExp(`^(${e.pattern})$`,"i"));break}}catch{}}}getRules(){return[...this.config.rules]}setRuleEnabled(e,t){const s=this.config.rules.find(n=>n.ruleId===e);return s?(s.enabled=t,this.recompile(),!0):!1}addRule(e){const t=`red_custom_${this.config.rules.length+1}_${Date.now().toString(36)}`,s={...e,ruleId:t,userAdded:!0};return this.config.rules.push(s),this.recompile(),s}removeRule(e){const t=this.config.rules.findIndex(s=>s.ruleId===e);return t<0||!this.config.rules[t].userAdded?!1:(this.config.rules.splice(t,1),this.recompile(),!0)}getExclusions(){return[...this.config.exclusions]}addExclusion(e,t){const n={exclusionId:`excl_custom_${this.config.exclusions.length+1}_${Date.now().toString(36)}`,selector:e,reason:t,userAdded:!0};return this.config.exclusions.push(n),n}removeExclusion(e){const t=this.config.exclusions.findIndex(s=>s.exclusionId===e);return t<0||!this.config.exclusions[t].userAdded?!1:(this.config.exclusions.splice(t,1),!0)}isSensitiveKey(e){return this.compiledKeyPatterns.some(t=>t.test(e))}redactValue(e){let t=e;for(const s of this.compiledValuePatterns)s.test(t)&&(t=t.replace(new RegExp(s.source,"gi"),de));return t}redactByKeyValue(e,t){return this.isSensitiveKey(e)?this.config.stubMode?de:t:this.redactValue(t)}isSensitiveAttribute(e){return this.compiledAttrPatterns.some(t=>t.test(e))}redactAttributes(e){const t={};for(const[s,n]of Object.entries(e))this.isSensitiveAttribute(s)?t[s]=de:t[s]=this.redactValue(n);return t}cleanSubtree(e){const t=e.cloneNode(!0);for(const s of this.config.exclusions){let n=null;try{n=t.querySelectorAll(s.selector)}catch{continue}for(const i of Array.from(n))i.remove();try{if(t.matches(s.selector))return this.doclessEmptyStub(t)}catch{}}return t}isExcluded(e){for(const t of this.config.exclusions)try{if(e.matches(t.selector)||e.closest(t.selector))return!0}catch{}return!1}doclessEmptyStub(e){return e.innerHTML="",e.setAttribute("data-mcpdom-excluded","true"),e}toJSON(){return{rules:this.getRules(),exclusions:this.getExclusions(),stubMode:this.config.stubMode}}static fromJSON(e){return new he({rules:Array.isArray(e==null?void 0:e.rules)?e.rules:void 0,exclusions:Array.isArray(e==null?void 0:e.exclusions)?e.exclusions:void 0,stubMode:typeof(e==null?void 0:e.stubMode)=="boolean"?e.stubMode:void 0})}}const ge='a[href], button, input, select, textarea, [role="button"], [role="link"], [role="tab"], [onclick], [tabindex]';function X(l,e){return{items:l.slice(0,e),truncated:l.length>e}}function k(l,e,t,s,n,i){return{analyzer:l,summary:e,count:t,items:s,warnings:n,truncated:i}}function D(l){try{return L.inspectElement(l).bestSelector}catch{return l.tagName.toLowerCase()}}const ct=l=>{const e=Array.from(l.querySelectorAll("form")),t=e.map(n=>{const i=Array.from(n.querySelectorAll("input, select, textarea")).map(r=>({tag:r.tagName.toLowerCase(),type:r.getAttribute("type")||(r.tagName.toLowerCase()==="textarea"?"textarea":r.tagName.toLowerCase()==="select"?"select":"text"),name:r.getAttribute("name")||void 0,id:r.getAttribute("id")||void 0,required:r.hasAttribute("required"),pattern:r.getAttribute("pattern")||void 0,maxLength:r.getAttribute("maxlength")||void 0,placeholder:r.getAttribute("placeholder")||void 0,ariaLabel:r.getAttribute("aria-label")||void 0,autocomplete:r.getAttribute("autocomplete")||void 0,hasLabel:!!(r.getAttribute("id")&&l.querySelector(`label[for="${r.getAttribute("id")}"]`))||!!r.closest("label"),defaultValue:r.value!==void 0&&(r.getAttribute("type")||"text")!=="password"?String(r.value).slice(0,40):void 0}));return{selector:D(n),action:n.getAttribute("action")||void 0,method:(n.getAttribute("method")||"GET").toUpperCase(),id:n.getAttribute("id")||void 0,fieldCount:i.length,submitButton:n.querySelector('button[type="submit"], input[type="submit"]')?D(n.querySelector('button[type="submit"], input[type="submit"]')):void 0,validationAttributes:i.filter(r=>r.required||r.pattern).length,fields:i}}),s=X(t,50);return k("analyze_forms",`${e.length} form(s) with ${t.reduce((n,i)=>n+i.fieldCount,0)} total fields`,e.length,s.items,[],s.truncated)},lt=l=>{const e=Array.from(l.querySelectorAll("a[href]")),t=e.map(n=>({href:n.getAttribute("href")||"",text:B(n).slice(0,60),selector:D(n),rel:n.getAttribute("rel")||void 0,target:n.getAttribute("target")||void 0,download:n.hasAttribute("download"),external:/^https?:\/\//i.test(n.getAttribute("href")||"")&&!ut(n.getAttribute("href")||"",l),anchorOnly:(n.getAttribute("href")||"").startsWith("#")})),s=X(t,200);return k("extract_links",`${e.length} link(s): ${t.filter(n=>n.external).length} external, ${t.filter(n=>n.anchorOnly).length} anchors`,e.length,s.items,[],s.truncated)};function ut(l,e){var t,s,n,i;try{return new URL(l,((s=(t=e.defaultView)==null?void 0:t.location)==null?void 0:s.href)||"http://localhost").origin===(((i=(n=e.defaultView)==null?void 0:n.location)==null?void 0:i.origin)||"")}catch{return!1}}const dt=l=>{const e=Array.from(l.querySelectorAll("img")),t=Array.from(l.querySelectorAll("video")),s=Array.from(l.querySelectorAll("audio")),n=Array.from(l.querySelectorAll("canvas")),i=[],r=[...e.map(c=>({kind:"img",selector:D(c),src:(c.getAttribute("src")||"").slice(0,150),alt:c.getAttribute("alt"),width:c.getAttribute("width")||void 0,height:c.getAttribute("height")||void 0,naturalWidth:c.naturalWidth||void 0,naturalHeight:c.naturalHeight||void 0,lazy:c.getAttribute("loading")==="lazy",missingAlt:!c.hasAttribute("alt")})),...t.map(c=>{var u;return{kind:"video",selector:D(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls"),autoplay:c.hasAttribute("autoplay"),muted:c.hasAttribute("muted"),poster:c.getAttribute("poster")||void 0}}),...s.map(c=>{var u;return{kind:"audio",selector:D(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls")}}),...n.map(c=>({kind:"canvas",selector:D(c),width:c.width,height:c.height}))],o=r.filter(c=>c.missingAlt).length;o&&i.push(`${o} image(s) missing alt text (accessibility risk).`);const a=X(r,200);return k("analyze_media",`${e.length} images, ${t.length} videos, ${s.length} audios, ${n.length} canvases`,r.length,a.items,i,a.truncated)},ht=l=>{const e=l.defaultView,t=[],s={};if(e!=null&&e.getComputedStyle){const i=e.getComputedStyle(l.documentElement);for(let r=0;r({name:i,value:r}));return k("get_css_variables",`${n.length} CSS custom properties found`,n.length,n,t,!1)},gt=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.fontFamily||"",a=r.fontSize||"",c=`${o.split(",")[0].replace(/["']/g,"").trim()} @ ${a}`;s.set(c,(s.get(c)||0)+1)}else t.push("getComputedStyle unavailable — font usage analysis requires rendered styles.");const n=Array.from(s.entries()).map(([i,r])=>({font:i,usage:r})).sort((i,r)=>r.usage-i.usage);return k("analyze_fonts",`${n.length} distinct font/size combinations`,n.length,n,t,!1)},pt=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i);for(const o of["color","background-color","border-top-color"]){const a=r.getPropertyValue(o);a&&a!=="rgba(0, 0, 0, 0)"&&s.set(a,(s.get(a)||0)+1)}}else{for(const i of Array.from(l.querySelectorAll("[style]")).slice(0,300)){const r=i.getAttribute("style")||"",o=/(color)\s*:\s*([^;]+)/gi;let a;for(;a=o.exec(r);)s.set(a[2].trim(),(s.get(a[2].trim())||0)+1)}t.push("getComputedStyle unavailable — palette from inline styles only.")}const n=Array.from(s.entries()).map(([i,r])=>({color:i,usage:r})).sort((i,r)=>r.usage-i.usage).slice(0,40);return k("extract_color_palette",`${s.size} distinct colors in use`,s.size,n,t,!1)},mt=l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — z-index analysis requires rendered styles."),k("detect_zindex_conflicts","unavailable",0,[],t,!1);const n=[];for(const i of Array.from(l.querySelectorAll("body *")).slice(0,1e3)){const r=e.getComputedStyle(i),o=r.zIndex;o&&o!=="auto"&&parseInt(o,10)>0&&n.push({selector:D(i),z:parseInt(o,10),position:r.position,stacking:r.position==="fixed"||r.position==="sticky"||r.opacity!=="1"||r.transform!=="none"?"creates-stacking-context":"plain"})}for(let i=0;i1e5&&s.push({zIndex:n[i].z,elements:[n[i].selector],note:"extremely high z-index — competes with platform overlays (MCPDOM uses 2147483640+)."})}return k("detect_zindex_conflicts",`${n.length} z-indexed elements, ${s.length} potential conflict(s)`,s.length,X(s,40).items,t,s.length>40)},ft=l=>{const e=l.defaultView,t=[],s=l.documentElement,n=l.body,i=Math.max((s==null?void 0:s.scrollWidth)||0,(n==null?void 0:n.scrollWidth)||0),r=(e==null?void 0:e.innerWidth)||(s==null?void 0:s.clientWidth)||0,o=i>r+1;if(o&&(t.push({issue:"horizontal-overflow",detail:`document scrollWidth ${i} exceeds viewport ${r}`}),e!=null&&e.getComputedStyle))for(const c of Array.from(l.querySelectorAll("body *")).slice(0,600)){const u=c.getBoundingClientRect();if(u.right>r+2&&u.width>100&&(t.push({issue:"element-exceeds-viewport",selector:D(c),right:Math.round(u.right),width:Math.round(u.width)}),t.length>15))break}let a=0;for(const c of Array.from(l.querySelectorAll(ge)).slice(0,500)){const u=c.getBoundingClientRect();(u.width===0||u.height===0)&&a++}return a&&t.push({issue:"zero-size-interactive-elements",count:a}),k("detect_layout_issues",o?`HORIZONTAL OVERFLOW: page is ${i-r}px wider than viewport`:"No horizontal overflow detected",t.length,t,[],!1)},bt=l=>{const e=Array.from(l.querySelectorAll(ge)),t=new Map,s=e.slice(0,300).map(n=>{const i=pe(n),r=i.role||n.tagName.toLowerCase();return t.set(r,(t.get(r)||0)+1),{selector:i.bestSelector,tag:i.tag,role:i.role,text:i.text.slice(0,40),visible:i.visibility.isVisible,disabled:n.disabled||n.hasAttribute("disabled"),inViewport:i.visibility.isInViewport}});return k("census_interactive_elements",`${e.length} interactive elements: ${Array.from(t.entries()).map(([n,i])=>`${n}×${i}`).join(", ")||"none"}`,e.length,s,[],e.length>300)};function pe(l){try{return L.inspectElement(l)}catch{return{tag:l.tagName.toLowerCase(),role:void 0,text:"",bestSelector:l.tagName.toLowerCase(),bounds:{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},visibility:{isVisible:!1,isInViewport:!1}}}}const yt=l=>{const e=["header","nav","main","aside","footer","article","section","figure","figcaption","mark","time","address","details","summary","dialog"],t=[];for(const i of e){const r=Array.from(l.querySelectorAll(i));if(r.length)for(const o of r.slice(0,20))t.push({tag:i,selector:D(o),role:o.getAttribute("role")||Et(i),text:B(o).slice(0,50),childCount:o.children.length})}const s=t.filter(i=>["banner","navigation","main","complementary","contentinfo"].includes(i.role)),n=[];return t.find(i=>i.tag==="main")||n.push("No
element — page lacks a primary landmark."),l.querySelectorAll("header").length>1&&n.push("Multiple
elements outside sections — ambiguous banner landmark."),k("detect_semantic_elements",`${t.length} semantic elements, ${s.length} landmarks`,t.length,X(t,100).items,n,t.length>100)};function Et(l){return{header:"banner",nav:"navigation",main:"main",aside:"complementary",footer:"contentinfo",article:"article",section:"region",form:"form"}[l]}const _e={analyze_forms:ct,extract_links:lt,analyze_media:dt,get_css_variables:ht,analyze_fonts:gt,extract_color_palette:pt,detect_zindex_conflicts:mt,detect_layout_issues:ft,census_interactive_elements:bt,detect_semantic_elements:yt,scan_accessibility_issues:l=>{var i;const e=[];for(const r of Array.from(l.querySelectorAll("img")).slice(0,200))r.hasAttribute("alt")||e.push({rule:"img-alt",severity:"error",selector:D(r),message:"Image is missing the alt attribute."});for(const r of Array.from(l.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button])")).slice(0,200)){const o=r.getAttribute("id");o&&l.querySelector(`label[for="${o}"]`)||r.closest("label")||r.getAttribute("aria-label")||r.getAttribute("aria-labelledby")||e.push({rule:"input-label",severity:"error",selector:D(r),message:"Form input has no associated label, aria-label or aria-labelledby."})}for(const r of Array.from(l.querySelectorAll('button, a[href], [role="button"]')).slice(0,300)){const o=B(r).trim(),a=r.getAttribute("aria-label");!o&&!a&&e.push({rule:"accessible-name",severity:"error",selector:D(r),message:"Interactive element has no accessible name (no text, no aria-label).",hint:r.querySelector("img[alt]")?"Contains an image — consider alt text or aria-label.":void 0})}const t=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).slice(0,100);let s=0;for(const r of t){const o=parseInt(r.tagName[1],10);s&&o>s+1&&e.push({rule:"heading-order",severity:"warning",selector:D(r),message:`Heading level jumps from h${s} to h${o}.`}),s=o}(i=l.documentElement)!=null&&i.getAttribute("lang")||e.push({rule:"html-lang",severity:"warning",selector:"html",message:"The element has no lang attribute."});const n=e.filter(r=>r.severity==="error").length;return k("scan_accessibility_issues",`${e.length} issue(s): ${n} errors, ${e.length-n} warnings`,e.length,X(e,100).items,[],e.length>100)},detect_dead_click_targets:l=>{const e=l.defaultView,t=[];for(const s of Array.from(l.querySelectorAll(ge)).slice(0,500)){const n=s.getBoundingClientRect(),i=e!=null&&e.getComputedStyle?e.getComputedStyle(s):null,r=n.width===0||n.height===0,o=i?i.pointerEvents==="none":!1,a=i?i.display==="none"||i.visibility==="hidden":!1,c=s.getAttribute("aria-hidden")==="true";(r||o||a||c)&&t.push({selector:D(s),tag:s.tagName.toLowerCase(),text:B(s).slice(0,30),reasons:[r&&"zero-size",o&&"pointer-events:none",a&&`hidden (${i?i.display:"?"}/${i?i.visibility:"?"})`,c&&"aria-hidden"].filter(Boolean)})}return k("detect_dead_click_targets",`${t.length} unreachable interactive element(s)`,t.length,X(t,80).items,[],t.length>80)},inventory_animations:l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — animation inventory requires rendered styles."),k("inventory_animations","unavailable",0,[],t,!1);for(const i of Array.from(l.querySelectorAll("body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.animationName!=="none"?`${r.animationName} ${r.animationDuration}`:null,a=r.transitionProperty!=="none"&&r.transitionProperty!=="all"?`${r.transitionProperty} ${r.transitionDuration}`:r.transitionProperty==="all"?`all ${r.transitionDuration}`:null;(o||a)&&s.push({selector:D(i),animation:o,transition:a,transitionTiming:r.transitionTimingFunction||void 0})}const n=s.filter(i=>i.animation&&i.animation.includes("infinite"));return n.length>5&&t.push(`${n.length} infinitely looping animations — may indicate decorative spinners or a stuck loading state.`),k("inventory_animations",`${s.length} animated/transitioning elements`,s.length,X(s,80).items,t,s.length>80)},map_frame_tree:l=>{const e=[],t=(n,i,r)=>{const o=Array.from(n.querySelectorAll("iframe, frame"));for(const a of o){const c=a.getAttribute("src")||"(no src)";let u=!1,d=null;try{const h=a.contentDocument;h&&(u=!0,d=h.querySelectorAll("*").length,r<3&&t(h,`${i} > ${a.tagName.toLowerCase()}[${c.slice(0,50)}]`,r+1))}catch{u=!1}e.push({path:`${i} > ${a.tagName.toLowerCase()}`,selector:D(a),src:c.slice(0,120),title:a.getAttribute("title")||void 0,name:a.getAttribute("name")||void 0,sandbox:a.getAttribute("sandbox")||void 0,accessible:u,childCount:d,limitation:u?void 0:"Same-origin policy blocks contentDocument access (cross-origin frame)."})}};t(l,"document",0);const s=e.filter(n=>!n.accessible).length;return k("map_frame_tree",`${e.length} frame(s), ${s} inaccessible (cross-origin)`,e.length,e,[],!1)},inventory_shadow_roots:l=>{const e=[],t=(s,n,i)=>{const r=(s instanceof ShadowRoot,Array.from(s.querySelectorAll("*")));for(const o of r)if(o.shadowRoot){const a=o.shadowRoot,c=`${n} > ${o.tagName.toLowerCase()}::shadowRoot(${a.mode})`;e.push({path:c.slice(0,200),hostSelector:D(o),hostTag:o.tagName.toLowerCase(),mode:a.mode,childCount:a.querySelectorAll("*").length,styles:a.querySelectorAll("style").length}),i<4&&t(a,c,i+1)}};return t(l.documentElement,"document",0),k("inventory_shadow_roots",`${e.length} open shadow root(s) found`,e.length,e,[],!1)},inspect_page_storage:l=>{const e=l.defaultView,t=new he,s=[],n=[];if(!(e!=null&&e.localStorage)||!(e!=null&&e.sessionStorage))return k("inspect_page_storage","Web Storage API unavailable in this context",0,[],["localStorage/sessionStorage are not accessible here (JSDOM limitation or sandboxed iframe)."],!1);try{for(let r=0;rr+(o.size||0),0);return k("inspect_page_storage",`${n.length} storage entries (~${i} bytes), sensitive keys redacted`,n.length,X(n,100).items,s,n.length>100)},get_performance_metrics:l=>{var i,r,o,a;const e=l.defaultView,t=[],s=e==null?void 0:e.performance;if(!(s!=null&&s.timing)&&!(s!=null&&s.getEntriesByType))return k("get_performance_metrics","Performance API unavailable",0,[],["window.performance is not exposed in this context."],!1);const n=[];try{const c=(r=(i=s.getEntriesByType)==null?void 0:i.call(s,"navigation"))==null?void 0:r[0];if(c)n.push({metric:"navigation-timing",domContentLoaded:Math.round(c.domContentLoadedEventEnd),loadComplete:Math.round(c.loadEventEnd),domInteractive:Math.round(c.domInteractive),type:c.type,redirectCount:c.redirectCount,sizeTransfer:c.transferSize});else if(s.timing){const h=s.timing;n.push({metric:"navigation-timing-legacy",domContentLoaded:h.domContentLoadedEventEnd-h.navigationStart,loadComplete:h.loadEventEnd-h.navigationStart,domInteractive:h.domInteractive-h.navigationStart})}const u=((o=s.getEntriesByType)==null?void 0:o.call(s,"paint"))||[];for(const h of u)n.push({metric:h.name,startTime:Math.round(h.startTime)});const d=((a=s.getEntriesByType)==null?void 0:a.call(s,"resource"))||[];if(d.length){const h=d.reduce((y,v)=>y+v.duration,0),p=[...d].sort((y,v)=>v.duration-y.duration).slice(0,5).map(y=>({url:String(y.name).slice(0,100),duration:Math.round(y.duration)}));n.push({metric:"resource-summary",count:d.length,totalDuration:Math.round(h),slowest:p})}s.memory&&n.push({metric:"memory",usedJSHeapMB:Math.round(s.memory.usedJSHeapSize/1048576*10)/10,totalJSHeapMB:Math.round(s.memory.totalJSHeapSize/1048576*10)/10})}catch(c){t.push(`performance read failed: ${c.message}`)}return k("get_performance_metrics",`${n.length} metric group(s)`,n.length,n,t,!1)},extract_seo_metadata:l=>{var r,o,a;const e=c=>{var u;return((u=l.querySelector(`meta[name="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},t=c=>{var u;return((u=l.querySelector(`meta[property="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},s=[{field:"title",value:l.title||void 0},{field:"description",value:e("description")},{field:"canonical",value:(r=l.querySelector('link[rel="canonical"]'))==null?void 0:r.getAttribute("href")},{field:"robots",value:e("robots")},{field:"viewport",value:e("viewport")},{field:"charset",value:(o=l.querySelector("meta[charset]"))==null?void 0:o.getAttribute("charset")},{field:"og:title",value:t("og:title")},{field:"og:description",value:t("og:description")},{field:"og:image",value:t("og:image")},{field:"og:url",value:t("og:url")},{field:"twitter:card",value:e("twitter:card")},{field:"language",value:(a=l.documentElement)==null?void 0:a.getAttribute("lang")}],n=l.querySelectorAll("h1").length,i=[];return n===0&&i.push("No h1 — page lacks a primary heading."),n>1&&i.push(`Multiple h1 elements (${n}).`),e("description")||i.push("No meta description."),s.push({field:"h1Count",value:n}),k("extract_seo_metadata",`SEO metadata extracted; ${i.length} warning(s)`,s.length,s,i,!1)},extract_structured_data:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('script[type="application/ld+json"]')))try{const n=JSON.parse(s.textContent||"{}");e.push({format:"JSON-LD",type:n["@type"]||(Array.isArray(n)?"array":"unknown"),data:n})}catch(n){e.push({format:"JSON-LD",type:"invalid-json",error:n.message})}for(const s of Array.from(l.querySelectorAll("[itemscope]")).slice(0,30)){const n=s.getAttribute("itemtype")||"unknown",i={};for(const r of Array.from(s.querySelectorAll("[itemprop]"))){const o=r.getAttribute("itemprop")||"",a=r.getAttribute("content")||r.getAttribute("href")||((t=r.textContent)==null?void 0:t.trim())||"";i[o]=a.slice(0,100)}e.push({format:"microdata",type:n.split("/").pop()||n,data:i})}return k("extract_structured_data",`${e.length} structured data block(s)`,e.length,e,[],!1)},extract_tables:l=>{const e=Array.from(l.querySelectorAll("table")),t=e.slice(0,30).map(s=>{var a,c,u;const n=Array.from(s.querySelectorAll("thead th, tr:first-child th")).map(d=>{var h;return((h=d.textContent)==null?void 0:h.trim())||""}),i=Array.from(s.querySelectorAll("tbody tr, tr")).filter(d=>!d.querySelector("th")).slice(0,50),r=i.map(d=>Array.from(d.querySelectorAll("td")).map(h=>(h.textContent||"").trim().slice(0,60))),o=(c=(a=s.querySelector("caption"))==null?void 0:a.textContent)==null?void 0:c.trim();return{selector:D(s),caption:o,columnCount:n.length||((u=r[0])==null?void 0:u.length)||0,rowCount:i.length,headers:n,rows:r}});return k("extract_tables",`${e.length} table(s)`,e.length,t,[],e.length>30)},extract_lists:l=>{const e=Array.from(l.querySelectorAll("ul, ol")),t=e.slice(0,60).map(s=>{const n=Array.from(s.querySelectorAll(":scope > li")).slice(0,40);return{selector:D(s),kind:s.tagName.toLowerCase(),ordered:s.tagName.toLowerCase()==="ol",itemCount:n.length,items:n.map(i=>B(i).slice(0,60)),nested:s.querySelectorAll("ul, ol").length}});return k("extract_lists",`${e.length} list(s)`,e.length,t,[],e.length>60)},analyze_page_content:l=>{const e=l.body,t=(e==null?void 0:e.innerText)||(e==null?void 0:e.textContent)||"",s=t.trim()?t.trim().split(/\s+/).length:0,n=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).map(c=>({level:parseInt(c.tagName[1],10),text:B(c).slice(0,80)})),i=l.querySelectorAll("p").length,r=i?Math.round(s/i):0,o=Math.round(s/220*10)/10,a=[{metric:"wordCount",value:s},{metric:"paragraphCount",value:i},{metric:"avgParagraphWords",value:r},{metric:"estimatedReadingMinutes",value:o},{metric:"headingCount",value:n.length},{metric:"imageCount",value:l.querySelectorAll("img").length},{metric:"linkDensity",value:Math.round(l.querySelectorAll("a[href]").length/Math.max(1,s)*1e3)/1e3},{metric:"headings",value:n.slice(0,50)}];return k("analyze_page_content",`${s} words, ${i} paragraphs, ~${o} min read`,a.length,a,[],!1)},search_dom:(l,e)=>{const t=String((e==null?void 0:e.query)||"").trim();if(!t)return k("search_dom","No query supplied",0,[],["Provide a text query; optionally tag/attr filters."],!1);const s=t.toLowerCase(),n=[],i=Math.min((e==null?void 0:e.limit)||50,200),r=Array.from(l.querySelectorAll("*"));for(const o of r){if(n.length>=i)break;if(e!=null&&e.tag&&o.tagName.toLowerCase()!==String(e.tag).toLowerCase())continue;const a=B(o),c=Array.from(o.attributes);let u=0,d="";o.tagName.toLowerCase().includes(s)&&(u+=.2,d="tag match"),a.toLowerCase().includes(s)&&a.length<200&&(u+=.6,d="text match");for(const h of c)if(h.name.toLowerCase().includes(s)||h.value.length<100&&h.value.toLowerCase().includes(s)){u+=.4,d=`attribute ${h.name} match`;break}if(e!=null&&e.attr){const h=String(e.attr).toLowerCase(),p=e.attrValue?String(e.attrValue).toLowerCase():null;if(c.find(v=>v.name.toLowerCase()===h&&(!p||v.value.toLowerCase().includes(p))))u+=.5;else continue}if(u>0){const h=pe(o);n.push({selector:h.bestSelector,tag:h.tag,role:h.role,text:h.text.slice(0,60),score:Math.round(u*100)/100,reason:d,visible:h.visibility.isVisible,bounds:{x:Math.round(h.bounds.x),y:Math.round(h.bounds.y),w:Math.round(h.bounds.width),h:Math.round(h.bounds.height)}})}}return n.sort((o,a)=>a.score-o.score),k("search_dom",`${n.length} element(s) match "${t}"`,n.length,n,[],n.length>=i)},inventory_ctas:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('button, a[class*="btn"], a[class*="button"], input[type="submit"], [role="button"]')).slice(0,100)){const n=pe(s);e.push({selector:n.bestSelector,tag:n.tag,text:n.text.slice(0,50),styleHint:(t=s.getAttribute("class"))==null?void 0:t.slice(0,60),primary:/primary|cta|submit|main/i.test(s.getAttribute("class")||"")||s.type==="submit",visible:n.visibility.isVisible})}return k("inventory_ctas",`${e.length} call-to-action element(s)`,e.length,e,[],!1)},detect_focus_traps:l=>{const e=[];for(const s of Array.from(l.querySelectorAll('[role="dialog"], [aria-modal="true"], dialog[open], .modal, [class*="modal"]')).slice(0,30)){const n=s.querySelectorAll('a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])');e.push({selector:D(s),kind:s.getAttribute("role")||s.tagName.toLowerCase(),ariaModal:s.getAttribute("aria-modal"),focusableCount:n.length,firstFocusable:n[0]?D(n[0]):void 0,note:n.length===0?"Modal container has NO focusable elements — keyboard users are trapped.":void 0})}const t=l.querySelectorAll("[tabindex]>0");for(const s of Array.from(t).slice(0,20))e.push({selector:D(s),kind:"positive-tabindex",note:`tabindex=${s.tabIndex} breaks natural tab order.`});return k("detect_focus_traps",`${e.length} focus-management issue(s)/container(s)`,e.length,e,[],!1)},infer_responsive_breakpoints:l=>{const e=l.defaultView,t=[],s=new Set;for(const o of Array.from(l.querySelectorAll("style"))){const a=o.textContent||"",c=/@media[^{]*?\(\s*(?:min|max)-width\s*:\s*(\d+)(?:\.\d+)?px/g;let u;for(;u=c.exec(a);)s.add(parseInt(u[1],10))}for(const o of Array.from(l.querySelectorAll('link[rel="stylesheet"]')).slice(0,10)){const a=o.getAttribute("href")||"";if(/^\d+px$/.test(a)||a.includes("width=")){const c=a.match(/width=(\d+)/);c&&s.add(parseInt(c[1],10))}}for(const o of Array.from(l.querySelectorAll("img[srcset], source[srcset]")).slice(0,50)){const a=o.getAttribute("srcset")||"";for(const c of a.matchAll(/(\d+)w/g))s.add(parseInt(c[1],10))}e!=null&&e.matchMedia||t.push("matchMedia unavailable — live breakpoint probing skipped.");const n=Array.from(s).sort((o,a)=>o-a),i=n.map(o=>({breakpoint:o,note:o<=768?"mobile-class":o<=1024?"tablet-class":"desktop-class"})),r=e==null?void 0:e.innerWidth;if(r){const o=n.filter(a=>a<=r);i.unshift({breakpoint:`current viewport: ${r}px`,note:o.length?`below breakpoints: ${o.join(", ")}`:"no declared breakpoint below current width"})}return k("infer_responsive_breakpoints",`${n.length} breakpoint(s) inferred from CSS/srcset`,i.length,i,t,!1)},get_selection_state:l=>{var i;const e=l.defaultView,t=(i=e==null?void 0:e.getSelection)==null?void 0:i.call(e),s=l.activeElement,n=[{hasSelection:!!(t!=null&&t.toString()),selectedText:(t==null?void 0:t.toString().slice(0,200))||"",selectionRanges:(t==null?void 0:t.rangeCount)||0,activeElement:s?{tag:s.tagName.toLowerCase(),selector:D(s),editable:s.isContentEditable||["INPUT","TEXTAREA"].includes(s.tagName)}:null}];return k("get_selection_state",t!=null&&t.toString()?`Selection: "${t.toString().slice(0,40)}…"`:"No text selection",1,n,[],!1)}};function vt(l,e,t){const s=_e[l];return s?s(e,t):{analyzer:l,summary:`Unknown analyzer "${l}". Available: ${Object.keys(_e).join(", ")}`,count:0,items:[],warnings:[],truncated:!1}}const wt=2e3;class St{constructor(e=wt){f(this,"events",[]);f(this,"cap");f(this,"counter",0);this.cap=Math.max(10,e)}record(e,t,s={}){this.counter++;const n={eventId:`evt_${Date.now().toString(36)}_${this.counter}`,timestamp:Date.now(),kind:e,operationId:s.operationId,sessionId:s.sessionId,detail:t,data:s.data};return this.events.push(n),this.events.length>this.cap&&this.events.splice(0,this.events.length-this.cap),n}query(e){let t=this.events;e.kind&&(t=t.filter(n=>n.kind===e.kind)),e.operationId&&(t=t.filter(n=>n.operationId===e.operationId)),e.sinceTimestamp&&(t=t.filter(n=>n.timestamp>=e.sinceTimestamp));const s=e.limit&&e.limit>0?e.limit:200;return t.slice(-s)}size(){return this.events.length}toJSON(){return[...this.events]}}class Tt{constructor(){f(this,"counter",0);f(this,"operations",new Map)}begin(e){this.counter++;const t=`op_${Date.now().toString(36)}_${this.counter}`;return this.operations.set(t,{operationId:t,tool:e,startedAt:Date.now(),status:"RUNNING",timelineEventIds:[]}),t}end(e,t,s){const n=this.operations.get(e);n&&(n.endedAt=Date.now(),n.status=t,n.relatedError=s)}attachEvent(e,t){const s=this.operations.get(e);s&&s.timelineEventIds.push(t)}trace(e){const t=this.operations.get(e);return t?{...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}:null}recent(e=100){return Array.from(this.operations.values()).slice(-e).map(t=>({...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}))}}const xe=100;class Ct{constructor(e){f(this,"sessionId");f(this,"timeline",new St);f(this,"operations",new Tt);f(this,"tabs",new Map);f(this,"activeTabId",null);f(this,"startedAt",Date.now());f(this,"snapshots",[]);f(this,"commandHistory",[]);f(this,"annotationCount",0);f(this,"projectId");f(this,"tabCounter",0);f(this,"commandCounter",0);this.sessionId=e||`sess_${Date.now().toString(36)}`}registerTab(e,t,s){const n=e!==void 0?Array.from(this.tabs.values()).find(o=>o.browserTabId===e):void 0;if(n)return n.lastSeenAt=Date.now(),n.status="OPEN",n.url=t||n.url,n.title=s||n.title,n;this.tabCounter++;const i=`stab_${this.tabCounter}_${Date.now().toString(36)}`,r={sessionTabId:i,browserTabId:e,url:t,title:s,createdAt:Date.now(),lastSeenAt:Date.now(),status:"OPEN"};return this.tabs.set(i,r),this.timeline.record("TAB_OPENED",`tab ${i} registered (${t||"no url"})`,{sessionId:this.sessionId}),r}closeTab(e){const t=this.tabs.get(e);return t?(t.status="CLOSED",t.lastSeenAt=Date.now(),this.timeline.record("TAB_CLOSED",`tab ${e} closed`,{sessionId:this.sessionId}),!0):!1}switchTab(e){const t=this.tabs.get(e);return!t||t.status==="CLOSED"?!1:(this.activeTabId=e,this.timeline.record("TAB_SWITCHED",`active tab → ${e}`,{sessionId:this.sessionId}),!0)}getTabs(){return Array.from(this.tabs.values())}getActiveTab(){if(this.activeTabId){const e=this.tabs.get(this.activeTabId);if(e&&e.status==="OPEN")return e}return Array.from(this.tabs.values()).find(e=>e.status==="OPEN")||null}markAllStale(){let e=0;for(const t of this.tabs.values())t.status==="OPEN"&&(t.status="STALE",e++);return e}captureSnapshot(e,t,s){var a,c,u;const n=e.defaultView,i=((a=e.documentElement)==null?void 0:a.outerHTML)||"",r=e.querySelectorAll('a[href], button, input, select, textarea, [role="button"]').length,o={snapshotId:`snap_${Date.now().toString(36)}_${this.snapshots.length+1}`,timestamp:Date.now(),url:((c=n==null?void 0:n.location)==null?void 0:c.href)||((u=e.location)==null?void 0:u.href)||"",title:e.title||"",viewport:{width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0,scrollX:(n==null?void 0:n.scrollX)||0,scrollY:(n==null?void 0:n.scrollY)||0,devicePixelRatio:(n==null?void 0:n.devicePixelRatio)||1},domLength:i.length,domHash:ve(i),interactiveCount:r,selectedRegions:[],extensionEnabled:t,pendingMutations:s,annotationCount:this.annotationCount};return this.snapshots.push(o),this.snapshots.length>xe&&this.snapshots.splice(0,this.snapshots.length-xe),this.timeline.record("SNAPSHOT_CREATED",`snapshot ${o.snapshotId} (dom ${o.domLength}b)`,{sessionId:this.sessionId}),o}getSnapshot(e){return e?this.snapshots.find(t=>t.snapshotId===e)||null:this.snapshots[this.snapshots.length-1]||null}listSnapshots(){return this.snapshots.map(e=>({snapshotId:e.snapshotId,timestamp:e.timestamp,url:e.url,title:e.title,domLength:e.domLength,domHash:e.domHash}))}compareSnapshots(e,t){const s=["url","title","domLength","domHash","interactiveCount","extensionEnabled","annotationCount"],n=[];for(const r of s)e[r]!==t[r]&&n.push({field:r,before:e[r],after:t[r]});(e.viewport.width!==t.viewport.width||e.viewport.height!==t.viewport.height)&&n.push({field:"viewport",before:`${e.viewport.width}x${e.viewport.height}`,after:`${t.viewport.width}x${t.viewport.height}`});const i=t.domLength-e.domLength;return{identical:n.length===0,changes:n,domDelta:{beforeLength:e.domLength,afterLength:t.domLength,delta:i},summary:n.length===0?"States are identical.":`${n.length} field(s) changed; DOM size ${i>=0?"+":""}${i} bytes.`}}recordCommand(e,t,s,n,i){this.commandCounter++;const r=`cmd_${this.commandCounter}_${Date.now().toString(36)}`;return this.commandHistory.push({commandId:r,tool:e,args:t,outcome:s,timestamp:Date.now(),durationMs:n,error:i}),this.timeline.record("COMMAND_EXECUTED",`${e} → ${s}${i?` (${i})`:""}`,{sessionId:this.sessionId,data:{commandId:r}}),r}getCommandHistory(e=100){return this.commandHistory.slice(-e)}noteAnnotations(e){this.annotationCount=e}bindProject(e){this.projectId=e}getProjectId(){return this.projectId}summary(e,t,s,n){var i,r,o;return{sessionId:this.sessionId,startedAt:this.startedAt,url:((r=(i=e.defaultView)==null?void 0:i.location)==null?void 0:r.href)||((o=e.location)==null?void 0:o.href)||"",title:e.title||"",tabs:this.getTabs(),activeTabId:this.activeTabId,viewport:{width:t.width,height:t.height,isModified:t.isModified},extensionEnabled:s,snapshotCount:this.snapshots.length,commandCount:this.commandHistory.length,annotationCount:this.annotationCount,mutationHistoryCount:n.length,timelineEventCount:this.timeline.size(),projectId:this.projectId}}}const At=l=>{var e,t;try{const s=l.getBoundingClientRect();if(s.width===0&&s.height===0)return null;const n=((t=(e=l.ownerDocument)==null?void 0:e.defaultView)==null?void 0:t.innerWidth)||1920;return s.yn*1.5?"bottom":s.xn*.8?"right":"center"}catch{return null}},It={navigation:"navigation",banner:"header",contentinfo:"footer",complementary:"sidebar",main:"main",form:"form",search:"search",region:"section",dialog:"modal",alertdialog:"modal",table:"table",list:"list",combobox:"dropdown",button:"button",link:"link",textbox:"input",checkbox:"checkbox",radio:"radio",img:"image",article:"article"},_t={nav:"navigation",header:"header",footer:"footer",aside:"sidebar",main:"main",section:"section",article:"article",form:"form",table:"table",ul:"list",ol:"list",figure:"figure",dialog:"modal",button:"button",input:"input",select:"dropdown",textarea:"textarea",canvas:"canvas",video:"video",img:"image",h1:"heading",h2:"heading",h3:"heading"};function ee(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").replace(/_{2,}/g,"_").slice(0,48).replace(/_$/,"")}class xt{generate(e){return this.generateFromMeta({tagName:e.tagName.toLowerCase(),role:e.getAttribute("role")||void 0,text:B(e).trim(),ariaLabel:e.getAttribute("aria-label")||void 0,stableClass:Array.from(e.classList||[]).find(t=>/^[a-z][a-z0-9-]{2,}$/i.test(t)&&!Nt.has(t)),position:At(e),nearbyHeading:this.nearbyHeading(e)})}generateFromMeta(e){const t=[],s=[],n=e.role||Rt(e.tagName);if(n){const r=It[n]||n;s.push(r),t.push(`role=${n}`)}else{const r=_t[e.tagName]||e.tagName;s.push(r),t.push(`tag=${e.tagName}`)}if(e.ariaLabel&&(s.unshift(ee(e.ariaLabel)),t.push(`aria-label="${e.ariaLabel.slice(0,30)}"`)),e.text&&e.text.length<=40){const r=ee(e.text.split(/\s+/).slice(0,3).join(" "));r&&r.length>=2&&(s.push(r),t.push(`text="${e.text.slice(0,30)}"`))}if(e.nearbyHeading){const r=ee(e.nearbyHeading.split(/\s+/).slice(0,3).join(" "));r&&!s.includes(r)&&(s.push(r),t.push(`nearby-heading="${e.nearbyHeading.slice(0,30)}"`))}e.stableClass&&s.length<3&&(s.push(ee(e.stableClass)),t.push(`class=${e.stableClass}`)),e.tagName==="input"&&(s.some(r=>r.includes("input"))||(s.push("input"),t.push("tag=input"))),s.join("_").length<12&&e.position&&(s.push(e.position),t.push(`position=${e.position}`));let i=ee(s.join("_"))||"unnamed_region";return/^\d/.test(i)&&(i=`el_${i}`),{name:i,evidence:t}}nearbyHeading(e){let t=e.parentElement;for(let n=0;t&&n<4;n++){const i=t.querySelector('h1, h2, h3, h4, [role="heading"]');if(i)return B(i).trim().slice(0,40)||null;t=t.parentElement}let s=e.previousElementSibling;for(let n=0;s&&n<4;n++){if(/^H[1-4]$/.test(s.tagName)){const i=B(s).trim();if(i)return i.slice(0,40)}s=s.previousElementSibling}return null}}const Nt=new Set(["active","open","visible","hidden","selected","disabled","container","wrapper","root","item","col","row","flex","box","main","div","span","block"]);function Rt(l){switch(l){case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"aside":return"complementary";case"main":return"main";case"form":return"form";case"table":return"table";case"button":return"button";case"a":return"link";case"input":return"textbox";case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";default:return null}}const Mt=["display","position","flex-direction","grid-template-columns","width","height","background-color","color","font-size","border-radius","overflow"];class kt{constructor(){f(this,"naming",new xt)}capture(e){const t=e.ownerDocument,s=new Z(t),n=new re,i=s.generateCandidates(e),r=s.bestSelector(e),o=n.fingerprint(e);let a=e,c=0,u="self";for(let g=0;g<3;g++){const b=a.parentElement;if(!b||b===t.body||b===t.documentElement)break;if(this.isMeaningfulContainer(b)){a=b,c=g+1,u="meaningful-ancestor";break}a=b,c=g+1}if(a===e){const g=e.parentElement;g&&g!==t.body&&e.querySelectorAll("*").length<4&&(a=g,c=1,u="direct-parent-fallback")}const d=this.boundedHtml(e,6e4),h=this.boundedHtml(a,12e4);L.inspectElement(e);const p=e.getBoundingClientRect(),y=t.defaultView,v={};if(y!=null&&y.getComputedStyle){const g=y.getComputedStyle(e);for(const b of Mt){const T=g.getPropertyValue(b);T&&T!=="none"&&T!=="auto"&&(v[b]=T)}}const m=e.parentElement;return{regionHtml:d,contextHtml:h,boundary:{strategy:u,ancestorLevels:c,note:c===0?"Region captured standalone (no meaningful ancestor within 3 levels).":`Context includes ${c} ancestor level(s) up to a meaningful container.`},selectorCandidates:i,bestSelector:r.selector,xpath:s.buildXPath(e),fingerprintHash:o.hash,dimensions:{width:Math.round(p.width),height:Math.round(p.height)},position:{x:Math.round(p.x),y:Math.round(p.y)},relevantStyles:v,parentInfo:m?{tag:m.tagName.toLowerCase(),selector:Ot(m),text:B(m).slice(0,60)}:void 0,childrenCount:e.children.length,childTags:Array.from(e.children).slice(0,12).map(g=>g.tagName.toLowerCase()),nameHint:this.naming.generate(e),fingerprintVolatility:o.volatilityRisk,volatilityReasons:o.volatilityReasons}}isMeaningfulContainer(e){const t=e.tagName.toLowerCase();if(["section","article","aside","main","nav","header","footer","form"].includes(t)||e.hasAttribute("id")||e.hasAttribute("data-testid")||e.getAttribute("role")||e.children.length>1&&e.querySelector(":scope > *:nth-child(3)"))return!0;const s=e.getAttribute("style")||"";return!!(s.includes("grid")||s.includes("flex"))}boundedHtml(e,t){const s=e.outerHTML;return s.length<=t?s:s.slice(0,t)+` -`}}function Ot(l){try{return new Z(l.ownerDocument).bestSelector(l).selector}catch{return l.tagName.toLowerCase()}}class Lt{constructor(e){f(this,"nodeRegistry");f(this,"snapshotEngine");f(this,"picker");f(this,"interactionEngine");f(this,"observer");f(this,"mutationEngines",new WeakMap);f(this,"viewportControllers",new WeakMap);f(this,"targetingEngines",new WeakMap);f(this,"jsEngine",new Fe);f(this,"fingerprintEngine",new re);f(this,"humanInteraction",new rt);f(this,"session",new Ct);f(this,"simulationTabs",[]);f(this,"simulationTabCounter",0);f(this,"simulationExtensions",[{id:"teledom@teledom",name:"TeleDOM Browser Intelligence Platform",version:"4.1.0",description:"The TeleDOM platform extension itself",enabled:!0,installType:"development",isApp:!1}]);f(this,"regionCapture",new kt);this.nodeRegistry=e||new z;const t=new se,s=new oe;this.snapshotEngine=new me(this.nodeRegistry,t,s),this.picker=new Ue({nodeRegistry:this.nodeRegistry}),this.interactionEngine=new De(this.nodeRegistry),this.observer=new Pe(this.nodeRegistry),this.picker.initGlobalShortcutListener(),this.interactionEngine.setTimingHook(async n=>{const i=this.humanInteraction.delay(n);i>0&&await new Promise(r=>setTimeout(r,i))})}getMutationEngine(e){let t=this.mutationEngines.get(e);return t||(t=new He(e,this.nodeRegistry),this.mutationEngines.set(e,t)),t}getViewportController(e){let t=this.viewportControllers.get(e);return t||(t=new ze(e),this.viewportControllers.set(e,t)),t}getTargetingEngine(e){let t=this.targetingEngines.get(e);return t||(t=new st(e,this.nodeRegistry),this.targetingEngines.set(e,t)),t}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}getPicker(){return this.picker}getInteractionEngine(){return this.interactionEngine}getObserver(){return this.observer}getNodeRegistry(){return this.nodeRegistry}async handleCommand(e,t=typeof document<"u"?document:{}){var o,a,c,u,d,h,p,y,v;const s=Date.now(),{id:n,command:i,payload:r}=e;try{switch(i){case"LIVE_PAGE_INSPECT":{const m=L.inspectPage(t);return this.success(n,i,m,s)}case"LIVE_ELEMENT_INSPECT":{const m=this.resolveTarget(r,t),g=L.inspectElement(m,this.nodeRegistry);return this.success(n,i,g,s)}case"GET_SELECTED_ELEMENT":{const m=this.picker.getLastSelectedElement();return this.success(n,i,m,s)}case"ELEMENT_PICKER_START":return this.picker.startPicker(),this.success(n,i,{pickerActive:!0},s);case"ELEMENT_PICKER_STOP":return this.picker.stopPicker(),this.success(n,i,{pickerActive:!1},s);case"LIVE_ELEMENT_INTERACT":{const m=r,g=await this.interactionEngine.interact(m,t);return this.success(n,i,g,s)}case"ELEMENT_OBSERVATION_START":{const m=this.resolveTarget(r,t),g=this.observer.startObservation(m,t);return this.success(n,i,g,s)}case"ELEMENT_OBSERVATION_STOP":{const m=this.observer.stopObservation(t);return this.success(n,i,m,s)}case"LIVE_DOM_SNAPSHOT":{if(((r==null?void 0:r.format)||"html")==="html"){const b=((o=t.documentElement)==null?void 0:o.outerHTML)||"";return this.success(n,i,{html:b},s)}const g=this.snapshotEngine.captureSnapshot(t,"live_session");return this.success(n,i,g,s)}case"LIVE_DOM_SUBTREE":{const m=this.resolveTarget(r,t),g=m.outerHTML||"",b=L.inspectElement(m,this.nodeRegistry);return this.success(n,i,{html:g,element:b},s)}case"GET_ELEMENT_VISUAL_STATE":{const m=this.resolveTarget(r,t),g=L.inspectVisualState(m);return this.success(n,i,g,s)}case"LIVE_PAGE_SCREENSHOT":case"LIVE_ELEMENT_SCREENSHOT":{const m=await this.handleScreenshotCapture(i,r,t);return this.success(n,i,m,s)}case"GET_TAB_CONSOLE_LOGS":{const{level:m,searchQuery:g,limit:b=100,clearAfterRead:T}=r||{};let w=typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__||[];if(m&&m!=="all"&&(w=w.filter(E=>E.level===m)),g){const E=String(g).toLowerCase();w=w.filter(C=>{var N,I;return((N=C.text)==null?void 0:N.toLowerCase().includes(E))||((I=C.source)==null?void 0:I.toLowerCase().includes(E))})}return b>0&&(w=w.slice(-b)),T&&typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__&&(window.__FORENSIC_CONSOLE_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((a=window.__FORENSIC_CONSOLE_BUFFER__)==null?void 0:a.length)||w.length,returnedCount:w.length,logs:w},s)}case"GET_TAB_NETWORK_REQUESTS":{const{method:m,searchQuery:g,status:b,onlyErrors:T,limit:w=100,clearAfterRead:E}=r||{};let C=typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__||[];if(m&&(C=C.filter(N=>{var I;return((I=N.method)==null?void 0:I.toUpperCase())===String(m).toUpperCase()})),b&&(C=C.filter(N=>N.status===Number(b))),T&&(C=C.filter(N=>N.error||N.status&&N.status>=400)),g){const N=String(g).toLowerCase();C=C.filter(I=>{var R;return(R=I.url)==null?void 0:R.toLowerCase().includes(N)})}return w>0&&(C=C.slice(-w)),E&&typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__&&(window.__FORENSIC_NETWORK_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((c=window.__FORENSIC_NETWORK_BUFFER__)==null?void 0:c.length)||C.length,returnedCount:C.length,requests:C},s)}case"CLOSE_TAB":{if(typeof globalThis.chrome<"u"&&((u=globalThis.chrome.runtime)!=null&&u.sendMessage)){const m=await new Promise(g=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},b=>g(b))});if(m)return m}return this.isSimulation()?this.simulationCloseTab(r,t,n,i,s):typeof window<"u"?(setTimeout(()=>window.close(),100),this.success(n,i,{closed:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{closed:!0},s)}case"RELOAD_TAB":{if(typeof globalThis.chrome<"u"&&((d=globalThis.chrome.runtime)!=null&&d.sendMessage)){const m=await new Promise(g=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},b=>g(b))});if(m)return m}if(this.isSimulation()){const m=(r==null?void 0:r.mode)||"soft";return this.session.timeline.record("NAVIGATED",`tab reloaded (${m} mode)`),this.success(n,i,{reloaded:!0,mode:m,simulated:!0,url:((p=(h=t.defaultView)==null?void 0:h.location)==null?void 0:p.href)||"",title:t.title,note:"Node simulation context: DOM fixture retained; no real navigation occurs."},s)}return typeof window<"u"?(setTimeout(()=>window.location.reload(),100),this.success(n,i,{reloaded:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{reloaded:!0},s)}case"OPEN_TAB":case"LIST_TABS":case"FOCUS_TAB":case"LIST_EXTENSIONS":case"RELOAD_EXTENSION":case"SET_EXTENSION_ENABLED":case"TOGGLE_EXTENSION":{if(this.isSimulation())return this.handleSimulationBackgroundCommand(n,i,r,t,s);if(typeof globalThis.chrome<"u"&&((y=globalThis.chrome.runtime)!=null&&y.sendMessage)){const m=await new Promise(g=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},b=>g(b))});if(m)return m}return this.error(n,i,"BACKGROUND_EXECUTION_FAILED",`Command ${i} requires Chrome extension runtime`,s)}case"RESIZE_VIEWPORT":{const m=this.getViewportController(t);let g;if(r!=null&&r.preset)g=m.applyPreset(r.preset);else{const b=Number(r==null?void 0:r.width)||1280,T=Number(r==null?void 0:r.height)||800;g=m.resize(b,T)}return this.session.timeline.record("RESIZED",`viewport → ${g.applied.width}x${g.applied.height}`),this.success(n,i,g,s)}case"RESET_VIEWPORT":{const g=this.getViewportController(t).reset();return this.session.timeline.record("RESIZED",`viewport restored to ${g.applied.width}x${g.applied.height}`),this.success(n,i,g,s)}case"GET_VIEWPORT_STATE":{const m=this.getViewportController(t);return this.success(n,i,m.state(),s)}case"RUN_RESPONSIVE_TEST":{const m=this.getViewportController(t),g=(r==null?void 0:r.sizes)||Ut(),b=m.runResponsiveTest(g,{restore:(r==null?void 0:r.restore)!==!1});return this.success(n,i,b,s)}case"EMULATE_DEVICE":{const g=this.getViewportController(t).emulateDevice((r==null?void 0:r.device)||"pixel-7");return this.success(n,i,g,s)}case"EXECUTE_JS":case"EXECUTE_JS_AND_CAPTURE_CHANGES":{const m=String((r==null?void 0:r.code)||"");if(!m.trim())return this.error(n,i,"SCRIPT_EMPTY","payload.code is required.",s);const g=await this.jsEngine.execute(t,m,{timeoutMs:r==null?void 0:r.timeoutMs,world:(r==null?void 0:r.world)==="MAIN"?"MAIN":"ISOLATED"});return this.session.timeline.record("SCRIPT_EXECUTED",`${g.status} (${g.durationMs}ms)`),this.success(n,i,g,s)}case"DOM_MUTATE":{const g=this.getMutationEngine(t).mutate(r);return this.session.timeline.record("DOM_MUTATED",`${g.operation} on ${g.before.selector} → ${g.success?"OK":g.error}`),this.success(n,i,g,s)}case"DOM_MUTATE_TRANSACTION":{const m=this.getMutationEngine(t),g=(r==null?void 0:r.mode)||"begin";try{if(g==="begin"){const b=m.beginTransaction();return this.success(n,i,{transactionId:b,mode:g,open:!0},s)}if(g==="commit"){const b=m.commitTransaction();return this.session.timeline.record("DOM_MUTATED",`transaction ${b.transactionId} committed (${b.steps.length} steps)`),this.success(n,i,{...b,mode:g},s)}if(g==="rollback"){const b=m.rollbackTransaction(r==null?void 0:r.reason);return this.session.timeline.record("MUTATION_UNDONE",`transaction ${b.transactionId} rolled back`),this.success(n,i,{...b,mode:g},s)}return this.error(n,i,"INVALID_MODE",`mode must be begin|commit|rollback, got "${g}"`,s)}catch(b){return this.error(n,i,"DOM_MUTATION_FAILED",b.message,s)}}case"UNDO_DOM_MUTATION":{const g=this.getMutationEngine(t).undo();return g.success&&this.session.timeline.record("MUTATION_UNDONE",g.message),this.success(n,i,g,s)}case"REDO_DOM_MUTATION":{const g=this.getMutationEngine(t).redo();return g.success&&this.session.timeline.record("MUTATION_REDONE",g.message),this.success(n,i,g,s)}case"GET_MUTATION_HISTORY":{const m=this.getMutationEngine(t);return this.success(n,i,{entries:m.getHistory((r==null?void 0:r.limit)||100),undoDepth:m.getUndoDepth(),redoDepth:m.getRedoDepth(),openTransactionId:m.getOpenTransactionId()},s)}case"PREVIEW_DOM_MUTATION":{const g=this.getMutationEngine(t).preview(r);return this.success(n,i,g,s)}case"GENERATE_ELEMENT_TARGET":{const g=this.getTargetingEngine(t).resolveAndBuild((r==null?void 0:r.target)||(r==null?void 0:r.selector)||"");return"error"in g?this.error(n,i,"TARGET_NOT_FOUND",g.error,s):this.success(n,i,g.target,s)}case"RECOVER_SELECTOR":{const m=new it(t),g=(r==null?void 0:r.snapshot)||{},b=m.recover((r==null?void 0:r.selector)||"",g);return this.success(n,i,b,s)}case"GET_ELEMENT_ANCESTRY":{const m=this.resolveTarget(r,t);return this.success(n,i,Dt(m,t),s)}case"GET_ELEMENT_FINGERPRINT":{const m=this.resolveTarget(r,t),g=this.fingerprintEngine.fingerprint(m);return this.success(n,i,g,s)}case"GET_ELEMENT_RELATIONSHIPS":{const m=this.resolveTarget(r,t);return this.success(n,i,$t(m,t),s)}case"GET_ELEMENT_ACCESSIBILITY":{const m=this.resolveTarget(r,t);return this.success(n,i,qt(m),s)}case"GET_COMPUTED_STYLE":{const m=this.resolveTarget(r,t),g=t.defaultView;if(!(g!=null&&g.getComputedStyle))return this.error(n,i,"STYLE_UNAVAILABLE","getComputedStyle is unavailable in this context.",s);const b=g.getComputedStyle(m),T=Array.isArray(r==null?void 0:r.properties)&&r.properties.length?r.properties:["display","position","color","background-color","font-size","font-family","width","height","margin","padding","border","z-index","opacity","visibility","overflow","flex-direction","grid-template-columns"],w={};for(const E of T)w[E]=b.getPropertyValue(E);return this.success(n,i,{selector:L.inspectElement(m,this.nodeRegistry).bestSelector,styles:w},s)}case"ANALYZE_DOM":{const m=String((r==null?void 0:r.analyzer)||"");if(!m)return this.error(n,i,"ANALYZER_REQUIRED",'payload.analyzer is required (e.g. "analyze_forms").',s);const g=vt(m,t,r);return g.count===0&&g.warnings.length===0&&g.items.length===0&&g.summary.startsWith("Unknown analyzer")?this.error(n,i,"UNKNOWN_ANALYZER",g.summary,s):this.success(n,i,g,s)}case"DRAG_ELEMENT":{const m=this.resolveTarget(r==null?void 0:r.source,t),g=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):null,b=await this.performDrag(m,g,r==null?void 0:r.offsets,t);return this.success(n,i,b,s)}case"SET_INPUT_CHECKED":{const g=this.resolveTarget(r,t);if(g.type!=="checkbox"&&g.type!=="radio")return this.error(n,i,"INPUT_TYPE_UNSUPPORTED",`Target input type "${g.type}" is not checkbox/radio.`,s);const b=g.checked;g.checked=(r==null?void 0:r.checked)!==!1;const T=[];for(const w of["input","change"])try{g.dispatchEvent(new t.defaultView.Event(w,{bubbles:!0})),T.push(w)}catch{}if(g.type==="radio"&&g.name)for(const w of Array.from(t.querySelectorAll(`input[type=radio][name="${g.name}"]`)))w!==g&&(w.checked=!1);return this.success(n,i,{success:!0,selector:L.inspectElement(g,this.nodeRegistry).bestSelector,inputType:g.type,checkedBefore:b,checkedAfter:g.checked,eventsFired:T},s)}case"PRESS_KEYBOARD_SHORTCUT":{const m=Array.isArray(r==null?void 0:r.keys)?r.keys:String((r==null?void 0:r.keys)||"Enter").split("+"),g=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):t.activeElement||t.body;typeof g.focus=="function"&&g.focus();const b=[],T=t.defaultView;for(const w of m)for(const E of["keydown","keyup"])try{g.dispatchEvent(new((T==null?void 0:T.KeyboardEvent)||KeyboardEvent)(E,{key:w.trim(),bubbles:!0,cancelable:!0,ctrlKey:m.some(C=>/^(ctrl|control|cmd|meta)$/i.test(C))&&w!==m.find(C=>/^(ctrl|control|cmd|meta)$/i.test(C)),shiftKey:m.some(C=>/^shift$/i.test(C))&&w!=="Shift",altKey:m.some(C=>/^alt$/i.test(C))&&w!=="Alt"})),b.push(`${E}:${w}`)}catch{}return this.success(n,i,{success:!0,keys:m,targetSelector:L.inspectElement(g,this.nodeRegistry).bestSelector,eventsFired:b},s)}case"SCROLL_PAGE":{const m=t.defaultView;if(!m)return this.error(n,i,"NO_WINDOW","No window available for scrolling.",s);const g={x:m.scrollX||0,y:m.scrollY||0};let b;if(r!=null&&r.target||r!=null&&r.selector){const w=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t);(v=w.scrollIntoView)==null||v.call(w,{behavior:(r==null?void 0:r.behavior)||"auto",block:"center"}),b=L.inspectElement(w,this.nodeRegistry).bestSelector}else m.scrollBy(Number(r==null?void 0:r.x)||0,Number(r==null?void 0:r.y)||0);const T={x:m.scrollX||0,y:m.scrollY||0};return this.success(n,i,{success:!0,scrollBefore:g,scrollAfter:T,requested:{x:Number(r==null?void 0:r.x)||0,y:Number(r==null?void 0:r.y)||0},targetSelector:b},s)}case"WAIT_FOR_CONDITION":return await this.waitForCondition(t,r||{},s,n,i);case"GET_PAGE_STATE":case"CAPTURE_PAGE_STATE":{const m=this.session.captureSnapshot(t,!0,this.getMutationEngine(t).getUndoDepth());return this.success(n,i,m,s)}case"CAPTURE_REGION":{const m=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t),g=this.regionCapture.capture(m);return this.success(n,i,g,s)}case"GET_SIMULATION_TAB_STATE":return this.isSimulation()?this.success(n,i,{simulated:!0,tabs:this.simulationTabs,sessionSummary:this.session.getTabs()},s):this.error(n,i,"NOT_SIMULATION","Simulation tab state is only available in the Node simulation context.",s);default:return this.error(n,i,"UNKNOWN_COMMAND",`Unsupported command '${i}'`,s)}}catch(m){return this.error(n,i,"COMMAND_EXECUTION_FAILED",m.message,s,m.details)}}resolveTarget(e,t){if(!e)throw new Error("Target specifier must be provided");return typeof e=="string"?this.interactionEngine.resolveTarget({selector:e},t):typeof e=="number"?this.interactionEngine.resolveTarget({nodeId:e},t):this.interactionEngine.resolveTarget(e,t)}async performDrag(e,t,s,n){const i=n.defaultView,r=[],o=(p,y,v={})=>{try{const m=(i==null?void 0:i.MouseEvent)||(typeof MouseEvent<"u"?MouseEvent:null);m&&(p.dispatchEvent(new m(y,{bubbles:!0,cancelable:!0,...v})),r.push(y))}catch{}},a=e.getBoundingClientRect(),c=a.x+a.width/2,u=a.y+a.height/2;let d=c+((s==null?void 0:s.x)||0),h=u+((s==null?void 0:s.y)||0);if(t){const p=t.getBoundingClientRect();d=p.x+p.width/2,h=p.y+p.height/2}return o(e,"pointerdown",{button:1,clientX:c,clientY:u}),o(e,"mousedown",{button:1,clientX:c,clientY:u}),o(e,"dragstart",{clientX:c,clientY:u}),t&&(o(t,"dragenter",{clientX:d,clientY:h}),o(t,"dragover",{clientX:d,clientY:h}),o(t,"drop",{clientX:d,clientY:h})),o(e,"dragend",{clientX:d,clientY:h}),o(e,"pointerup",{button:1,clientX:d,clientY:h}),o(e,"mouseup",{button:1,clientX:d,clientY:h}),{success:r.length>0,sourceSelector:L.inspectElement(e,this.nodeRegistry).bestSelector,targetSelector:t?L.inspectElement(t,this.nodeRegistry).bestSelector:"(offset drop)",eventsFired:r,finalPosition:{x:Math.round(d),y:Math.round(h)},html5DndUsed:r.includes("dragstart")}}async waitForCondition(e,t,s,n,i){var p,y;const r=t.kind||"dom_stable",o=Math.min(Math.max(Number(t.timeoutMs)||5e3,100),3e4),a=Math.min(Math.max(Number(t.pollIntervalMs)||100,20),1e3),c=Date.now(),u=()=>{var v,m,g,b,T;switch(r){case"dom_stable":return{satisfied:!0,detail:`dom length ${((v=e.documentElement)==null?void 0:v.outerHTML.length)||0}`};case"selector_present":{const w=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:w>0,detail:`"${t.selector}" matches ${w} element(s)`}}case"selector_visible":{if(!t.selector)return{satisfied:!1,detail:"no selector supplied"};const w=e.querySelector(t.selector);if(!w)return{satisfied:!1,detail:`"${t.selector}" not present`};try{const E=L.inspectElement(w).visibility.isVisible;return{satisfied:E,detail:`visibility=${E}`}}catch{return{satisfied:!1,detail:"inspection failed"}}}case"selector_absent":{const w=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:w===0,detail:`"${t.selector}" matches ${w} element(s)`}}case"text_present":{const w=((m=e.body)==null?void 0:m.innerText)||((g=e.body)==null?void 0:g.textContent)||"",E=t.text?w.includes(String(t.text)):!1;return{satisfied:E,detail:`text "${String(t.text).slice(0,30)}" ${E?"found":"not found"}`}}case"url_contains":{const w=((T=(b=e.defaultView)==null?void 0:b.location)==null?void 0:T.href)||"";return{satisfied:t.text?w.includes(String(t.text)):!1,detail:w}}case"element_count":{const w=t.selector?e.querySelectorAll(t.selector).length:0,E=Number(t.count)||0;return{satisfied:w===E,detail:`${w}/${E} elements`}}case"readiness_state":return{satisfied:e.readyState===(t.state||"complete"),detail:`readyState=${e.readyState}`};default:return{satisfied:!1,detail:`unknown condition kind "${r}"`}}};if(r==="dom_stable"){let v=((p=e.documentElement)==null?void 0:p.outerHTML.length)||0,m=!1,g=0;for(;Date.now()-csetTimeout(w,a));const T=((y=e.documentElement)==null?void 0:y.outerHTML.length)||0;if(g++,T===v){m=!0;break}v=T}const b=Date.now()-c;return m&&this.session.timeline.record("WAIT_SATISFIED",`dom_stable after ${b}ms (${g} polls)`),this.success(n,i,{satisfied:m,condition:r,waitedMs:b,timeoutMs:o,detail:`dom length ${v}, ${g} polls`},s)}let d=u();for(;!d.satisfied&&Date.now()-csetTimeout(v,a)),d=u();const h=Date.now()-c;return d.satisfied&&this.session.timeline.record("WAIT_SATISFIED",`${r} after ${h}ms`),this.success(n,i,{satisfied:d.satisfied,condition:r,waitedMs:h,timeoutMs:o,detail:d.detail},s)}simulationCloseTab(e,t,s,n,i){const r=Number(e==null?void 0:e.tabId),o=Number.isFinite(r)?this.simulationTabs.findIndex(c=>c.browserTabId===r):this.simulationTabs.findIndex(c=>c.active);if(o<0)return this.error(s,n,"TAB_NOT_FOUND",`No simulated tab matches tabId=${r}`,i);const a=this.simulationTabs.splice(o,1)[0];return this.session.closeTab(a.sessionTabId),a.active&&this.simulationTabs.length&&(this.simulationTabs[0].active=!0,this.session.switchTab(this.simulationTabs[0].sessionTabId)),this.success(s,n,{closed:!0,closedTab:{id:a.browserTabId,url:a.url,title:a.title},simulated:!0,remaining:this.simulationTabs.length},i)}handleSimulationBackgroundCommand(e,t,s,n,i){const r=()=>{var o,a;if(!this.simulationTabs.length){this.simulationTabCounter++;const c={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:((a=(o=n.defaultView)==null?void 0:o.location)==null?void 0:a.href)||"about:blank",title:n.title||"Simulated Tab",active:!0,createdAt:Date.now()};this.simulationTabs.push(c),this.session.registerTab(c.browserTabId,c.url,c.title),this.session.switchTab(c.sessionTabId)}};switch(t){case"LIST_TABS":return r(),this.success(e,t,{simulated:!0,environment:"node-simulation",tabs:this.simulationTabs.map((o,a)=>({id:o.browserTabId,index:a,windowId:1,title:o.title,url:o.url,active:o.active,status:"complete",pinned:!1,audited:!1})),note:"Deterministic simulated tab state — a real browser tab list requires the Chrome extension connection."},i);case"OPEN_TAB":{const o=String((s==null?void 0:s.url)||"about:blank");this.simulationTabCounter++;const a={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:o,title:(s==null?void 0:s.title)||`Simulated Tab ${this.simulationTabCounter}`,active:!0,createdAt:Date.now()};this.simulationTabs.forEach(u=>u.active=!1),this.simulationTabs.push(a);const c=this.session.registerTab(a.browserTabId,o,a.title);return this.session.switchTab(c.sessionTabId),this.session.timeline.record("TAB_OPENED",`simulation tab ${a.browserTabId} → ${o}`),this.success(e,t,{opened:!0,tabId:a.browserTabId,url:o,simulated:!0,totalTabs:this.simulationTabs.length},i)}case"FOCUS_TAB":{r();const o=Number(s==null?void 0:s.tabId),a=this.simulationTabs.find(c=>c.browserTabId===o)||this.simulationTabs[0];return a?(this.simulationTabs.forEach(c=>c.active=!1),a.active=!0,this.session.switchTab(a.sessionTabId),this.session.timeline.record("TAB_SWITCHED",`simulation tab ${a.browserTabId} focused`),this.success(e,t,{focused:!0,tabId:a.browserTabId,url:a.url,simulated:!0},i)):this.error(e,t,"TAB_NOT_FOUND",`No simulated tab with tabId=${o}`,i)}case"LIST_EXTENSIONS":return this.success(e,t,{simulated:!0,extensions:this.simulationExtensions.map(o=>({...o,permissions:["activeTab","scripting","storage","tabs","management"]})),note:"Deterministic simulated extension state."},i);case"SET_EXTENSION_ENABLED":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!!(s!=null&&s.enabled),this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}". Known: ${this.simulationExtensions.map(c=>c.id).join(", ")}`,i)}case"TOGGLE_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!a.enabled,this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}case"RELOAD_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||this.simulationExtensions[0].id),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?this.success(e,t,{reloaded:!0,extensionId:a.id,simulated:!0,note:"Simulated reload: extension state preserved."},i):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}default:return this.error(e,t,"UNKNOWN_COMMAND",`Unhandled simulation command '${t}'`,i)}}async handleScreenshotCapture(e,t,s){var y,v,m,g,b;const n=s.defaultView||(typeof window<"u"?window:{}),i=Date.now(),r=`scr_${i}_${Math.random().toString(36).slice(2,6)}`,o=n.devicePixelRatio||1,a={width:n.innerWidth||((y=s.documentElement)==null?void 0:y.clientWidth)||1920,height:n.innerHeight||((v=s.documentElement)==null?void 0:v.clientHeight)||1080,scrollX:n.scrollX||n.pageXOffset||0,scrollY:n.scrollY||n.pageYOffset||0,devicePixelRatio:o};let c,u,d,h={width:a.width,height:a.height};if(e==="LIVE_ELEMENT_SCREENSHOT"){const T=this.resolveTarget(t,s),w=L.inspectElement(T,this.nodeRegistry);c=w.bestSelector,u=((m=w.forensics)==null?void 0:m.logicalNodeId)||void 0,d={x:w.bounds.x,y:w.bounds.y,width:w.bounds.width,height:w.bounds.height},h={width:Math.max(1,Math.round(w.bounds.width*o)),height:Math.max(1,Math.round(w.bounds.height*o))}}let p=(t==null?void 0:t.dataUrl)||"";if(e==="LIVE_ELEMENT_SCREENSHOT"&&p&&d&&typeof Image<"u")try{const T=await new Promise(w=>{const E=new Image;E.onload=()=>{try{const C=s.createElement("canvas"),N=Math.max(0,Math.floor(d.x*o)),I=Math.max(0,Math.floor(d.y*o)),R=Math.max(1,Math.floor(d.width*o)),x=Math.max(1,Math.floor(d.height*o));C.width=R,C.height=x;const q=C.getContext("2d");if(q){q.drawImage(E,N,I,R,x,0,0,R,x),w(C.toDataURL("image/png"));return}}catch{}w(p)},E.onerror=()=>w(p),E.src=p});T&&(p=T)}catch{}if(!p){const T=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(120,h.width||320):Math.max(800,a.width||1280),w=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(60,h.height||180):Math.max(600,a.height||800);p=fe.createDataUrl({width:T,height:w,backgroundColor:e==="LIVE_ELEMENT_SCREENSHOT"?[30,41,59,255]:[15,23,42,255],headerColor:[56,189,248,255],borderColor:[99,102,241,255],label:c||(e==="LIVE_ELEMENT_SCREENSHOT"?"Element Screenshot":"Page Screenshot")})}return{screenshotId:r,timestamp:i,url:((g=n.location)==null?void 0:g.href)||((b=s.location)==null?void 0:b.href)||"",viewport:a,targetSelector:c,targetNodeId:u,targetBounds:d,dataUrl:p,imageFormat:"png",dimensions:h,captureType:e==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}}success(e,t,s,n){return{id:e,command:t,success:!0,data:s,timestamp:Date.now(),durationMs:Date.now()-n}}error(e,t,s,n,i,r){return{id:e,command:t,success:!1,error:{code:s,message:n,details:r},timestamp:Date.now(),durationMs:Date.now()-i}}}function Dt(l,e){const t=[];let s=l.parentElement,n=1;for(;s&&n<=10;){const d=s.parentElement,h=d?Array.from(d.children).filter(p=>p.tagName===s.tagName):[];t.push({tag:s.tagName.toLowerCase(),selector:V(s),role:s.getAttribute("role")||void 0,text:K(s).slice(0,40),childIndex:h.length?h.indexOf(s)+1:1,siblingCount:d?Array.from(d.children).length:0,distance:n}),s=s.parentElement,n++}const i=l.parentElement,r=[];if(i){const d=Array.from(i.children),h=d.indexOf(l);for(let p=h-1;p>=0&&p>=h-5;p--)r.push({tag:d[p].tagName.toLowerCase(),selector:V(d[p]),role:d[p].getAttribute("role")||void 0,text:K(d[p]).slice(0,30),position:"before",distance:h-p});for(let p=h+1;p{o=Math.max(o,h);for(const p of Array.from(d.children))a.push(p.tagName.toLowerCase()),p.matches('a[href], button, input, select, textarea, [role="button"], [onclick]')&&c.push(V(p)),h<6&&u(p,h+1)};return u(l,1),{selector:V(l),ancestors:t,siblings:r,descendants:{count:l.querySelectorAll("*").length,maxDepth:o,tags:Array.from(new Set(a)).slice(0,30),interactive:c.slice(0,30)}}}function $t(l,e){const t=[{id:"self",selector:V(l),tag:l.tagName.toLowerCase(),role:l.getAttribute("role")||void 0,label:K(l).slice(0,30)||l.tagName.toLowerCase(),relationship:"self",depth:0}],s=[];let n=l.parentElement,i=1;for(;n&&i<=4;){const o=`ancestor_${i}`;t.push({id:o,selector:V(n),tag:n.tagName.toLowerCase(),role:n.getAttribute("role")||void 0,label:K(n).slice(0,30)||n.tagName.toLowerCase(),relationship:"parent",depth:i}),s.push({from:o,to:i===1?"self":`ancestor_${i-1}`,relation:"parent-of"}),n=n.parentElement,i++}for(const o of Array.from(l.children).slice(0,12)){const a=`child_${t.length}`;t.push({id:a,selector:V(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:K(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"child",depth:1}),s.push({from:"self",to:a,relation:"contains"})}const r=l.parentElement;if(r)for(const o of Array.from(r.children).slice(0,12)){if(o===l)continue;const a=`sibling_${t.length}`;t.push({id:a,selector:V(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:K(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"sibling",depth:1}),s.push({from:"self",to:a,relation:"sibling-of"})}return{rootSelector:V(l),nodes:t,edges:s}}function qt(l){const e={};for(const v of Array.from(l.attributes))v.name.startsWith("aria-")&&(e[v.name]=v.value);const t=K(l).trim(),s=l.getAttribute("aria-label"),n=l.getAttribute("aria-labelledby");let i;n&&(i=n.split(/\s+/).map(m=>{var g,b,T;return(T=(b=(g=l.ownerDocument)==null?void 0:g.getElementById(m))==null?void 0:b.textContent)==null?void 0:T.trim()}).filter(Boolean).join(" ").slice(0,60)||void 0);const r=l.getAttribute("title"),o=l.tagName.toLowerCase(),a=[];let c="";s?(c=s,a.push("aria-label")):i?(c=i,a.push("aria-labelledby")):t?(c=t.slice(0,60),a.push("text content")):r&&(c=r,a.push("title"));const u=[];(l.disabled||l.hasAttribute("disabled"))&&u.push("disabled"),l.checked&&u.push("checked");const d=l;d.tagName==="SELECT"&&typeof d.selectedOptions<"u"&&d.selectedOptions.length>0&&u.push("selected"),l.getAttribute("aria-expanded")&&u.push(`expanded=${l.getAttribute("aria-expanded")}`),l.getAttribute("aria-pressed")&&u.push(`pressed=${l.getAttribute("aria-pressed")}`),l.getAttribute("aria-hidden")==="true"&&u.push("hidden"),l.hasAttribute("required")&&u.push("required"),l.readOnly&&u.push("readonly");const h=["a[href]","button","input","select","textarea","[tabindex]"].some(v=>{try{return l.matches(v)}catch{return!1}}),p=[];!c&&h&&p.push("Focusable element has no accessible name."),o==="img"&&!l.hasAttribute("alt")&&p.push("Image has no alt attribute.");const y=/^h([1-6])$/.exec(o);return y&&!t&&p.push(`Heading h${y[1]} is empty.`),{selector:V(l),role:l.getAttribute("role")||void 0,implicitRole:Pt(l),name:c,nameSources:a,description:l.getAttribute("aria-describedby")||void 0,value:l.value!==void 0&&(l.getAttribute("type")||"text")!=="password"?String(l.value).slice(0,40):void 0,states:u,level:y?parseInt(y[1],10):void 0,focusable:h,tabIndex:l.tabIndex,ariaAttributes:e,issues:p}}function Pt(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return{checkbox:"checkbox",radio:"radio",button:"button",submit:"button",reset:"button",range:"slider",search:"searchbox",email:"textbox",text:"textbox",password:"textbox",tel:"textbox",url:"textbox",number:"spinbutton"}[t]||"textbox"}case"select":return l.hasAttribute("multiple")?"listbox":"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";case"dialog":return"dialog";default:return}}function V(l){const e=l.getAttribute("id");if(e&&/^[a-zA-Z][\w-]*$/.test(e))return`#${e}`;const t=l.getAttribute("data-testid");if(t)return`${l.tagName.toLowerCase()}[data-testid="${t}"]`;const s=l.tagName.toLowerCase(),n=Array.from(l.classList||[]).slice(0,2);return n.length?`${s}.${n.join(".")}`:s}function K(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function Ut(){return[{label:"desktop-1440x900",width:1440,height:900},{label:"laptop-1024x768",width:1024,height:768},{label:"tablet-768x1024",width:768,height:1024},{label:"mobile-375x667",width:375,height:667}]}class Ht{constructor(e){f(this,"hostElement",null);f(this,"shadowRoot",null);f(this,"callbacks");f(this,"isRecording",!1);f(this,"isPaused",!1);f(this,"isMinimized",!1);f(this,"startTime",0);f(this,"eventCount",0);f(this,"timerInterval",null);f(this,"isDragging",!1);f(this,"dragStartX",0);f(this,"dragStartY",0);f(this,"posX",window.innerWidth-340);f(this,"posY",40);this.callbacks=e,this.loadPosition()}mount(){this.hostElement&&document.body.contains(this.hostElement)||(this.hostElement=document.createElement("div"),this.hostElement.id="forensic-recorder-floating-host",this.hostElement.style.all="initial",this.hostElement.style.position="fixed",this.hostElement.style.zIndex="2147483647",this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`,this.shadowRoot=this.hostElement.attachShadow({mode:"open"}),this.render(),this.attachEvents(),(document.body||document.documentElement).appendChild(this.hostElement))}unmount(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null),this.hostElement&&this.hostElement.parentNode&&this.hostElement.parentNode.removeChild(this.hostElement),this.hostElement=null,this.shadowRoot=null}hide(){this.hostElement&&(this.hostElement.style.setProperty("display","none","important"),this.hostElement.style.setProperty("visibility","hidden","important"),this.hostElement.style.setProperty("opacity","0","important"))}show(){this.hostElement&&(this.hostElement.style.removeProperty("display"),this.hostElement.style.removeProperty("visibility"),this.hostElement.style.removeProperty("opacity"))}updateState(e,t=!1,s=0,n=0){this.isRecording=e,this.isPaused=t,this.startTime=s||(e?Date.now():0),this.eventCount=n,this.shadowRoot&&(this.render(),this.attachEvents()),this.isRecording&&!this.isPaused?this.startTimer():this.stopTimer()}incrementEventCount(){var t;this.eventCount++;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#evt-badge");e&&(e.textContent=`${this.eventCount} evts`)}startTimer(){this.stopTimer(),this.timerInterval=setInterval(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#timer-display");if(e&&this.startTime){const s=(Date.now()-this.startTime)/1e3,n=Math.floor(s/60).toString().padStart(2,"0"),i=(s%60).toFixed(1).padStart(4,"0");e.textContent=`${n}:${i}`}},200)}stopTimer(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null)}savePosition(){try{sessionStorage.setItem("forensic_overlay_pos",JSON.stringify({x:this.posX,y:this.posY,min:this.isMinimized}))}catch{}}loadPosition(){try{const e=sessionStorage.getItem("forensic_overlay_pos");if(e){const t=JSON.parse(e);this.posX=Math.max(10,Math.min(window.innerWidth-300,t.x||this.posX)),this.posY=Math.max(10,Math.min(window.innerHeight-150,t.y||this.posY)),this.isMinimized=!!t.min}}catch{}}render(){if(!this.shadowRoot)return;const e=` +})()`,n=e;if(typeof n.eval!="function")return Promise.reject(new Error("BLOCKED_BY_CONTEXT: window.eval is unavailable in this context."));try{const i=n.eval(s);return i&&typeof i.then=="function"?i:Promise.resolve(i)}catch(i){return Promise.reject(i)}}hookConsole(e,t){var o;const s=["log","warn","error","info","debug"],n={},i=e,r=100;for(const a of s){const c=(o=i.console)==null?void 0:o[a];if(typeof c=="function"){n[a]=c;try{i.console[a]=(...u)=>{t.length{for(const a of s)if(n[a])try{i.console[a]=n[a]}catch{}}}serialize(e){if(e===void 0)return{text:"undefined"};if(e===null)return{text:"null"};try{if(typeof e=="string")return{text:e.slice(0,5e3)};const t=JSON.stringify(e,pe,1);return t===void 0?{serializationFailed:!0,message:"JSON.stringify returned undefined (circular or non-serializable structure)."}:{text:t.length>5e4?t.slice(0,5e4)+"…[truncated]":t}}catch(t){return{serializationFailed:!0,message:(t==null?void 0:t.message)||"Serialization failed."}}}result(e,t,s,n,i,r){return{status:t,executionId:e,durationMs:s,error:r,consoleOutput:i,domChanged:!1,domLengthBefore:0,domLengthAfter:0,world:"ISOLATED",timeoutMs:5e3,codePreview:n.length>300?n.slice(0,300)+"…":n}}}function pe(l,e){var t;if(e&&typeof e=="object"&&e.nodeType===1){const s=e;return{__element:!0,tag:s.tagName.toLowerCase(),id:s.getAttribute("id")||void 0,selector:s.tagName.toLowerCase()+(s.getAttribute("id")?`#${s.getAttribute("id")}`:""),text:(s.textContent||"").trim().slice(0,60)}}return typeof e=="function"?{__function:!0,name:e.name||"anonymous"}:e&&e.nodeType===9?{__document:!0,url:(t=e.location)==null?void 0:t.href}:e}function Ve(l){try{if(typeof l=="string")return l;if(l instanceof Error)return`${l.name}: ${l.message}`;const e=JSON.stringify(l,pe);return e===void 0?String(l):e}catch{return String(l)}}const me={"desktop-full-hd":{width:1920,height:1080,category:"desktop"},"desktop-hd":{width:1366,height:768,category:"desktop"},"desktop-laptop":{width:1440,height:900,category:"desktop"},"desktop-xga":{width:1280,height:1024,category:"desktop"},"desktop-1024":{width:1024,height:768,category:"desktop"},"tablet-ipad":{width:768,height:1024,category:"tablet"},"tablet-ipad-pro":{width:1024,height:1366,category:"tablet"},"tablet-portrait":{width:768,height:1024,category:"tablet"},"tablet-landscape":{width:1024,height:768,category:"tablet"},"mobile-iphone-se":{width:375,height:667,category:"mobile"},"mobile-iphone-12":{width:390,height:844,category:"mobile"},"mobile-iphone-14-pro-max":{width:430,height:932,category:"mobile"},"mobile-pixel-7":{width:412,height:915,category:"mobile"},"mobile-galaxy-s8":{width:360,height:740,category:"mobile"},"mobile-small":{width:320,height:568,category:"mobile"},"test-a4":{width:800,height:600,category:"test"},"test-square":{width:512,height:512,category:"test"}},fe={"iphone-13":{width:390,height:844,devicePixelRatio:3,userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"mobile"},"ipad-air":{width:820,height:1180,devicePixelRatio:2,userAgent:"Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"tablet"},"pixel-7":{width:412,height:915,devicePixelRatio:2.625,userAgent:"Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"galaxy-s23":{width:384,height:800,devicePixelRatio:3,userAgent:"Mozilla/5.0 (Linux; Android 14; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"macbook-pro-16":{width:1728,height:1080,devicePixelRatio:2,userAgent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"},"windows-desktop":{width:1920,height:1080,devicePixelRatio:1,userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"}};class Be{constructor(e){b(this,"original",null);b(this,"modified",!1);b(this,"activePreset",null);b(this,"activeDevice",null);this.doc=e}state(){const e=this.doc.defaultView;return{width:(e==null?void 0:e.innerWidth)||0,height:(e==null?void 0:e.innerHeight)||0,devicePixelRatio:(e==null?void 0:e.devicePixelRatio)||1,scrollX:(e==null?void 0:e.scrollX)||0,scrollY:(e==null?void 0:e.scrollY)||0,original:this.original,isModified:this.modified}}resize(e,t,s){const n=this.doc.defaultView,i={width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0},r=this.pageDigest();this.original||(this.original={...i});const o=this.applySize(e,t);this.modified=!0,this.activePreset=s||this.activePreset;const a=this.pageDigest();return{success:!0,applied:{width:o.width,height:o.height},previous:i,original:{...this.original},preset:s||void 0,beforeState:r,afterState:a,reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}applyPreset(e){const t=me[e];if(!t)throw new Error(`UNKNOWN_PRESET: "${e}". Available: ${Object.keys(me).join(", ")}`);return this.resize(t.width,t.height,e)}emulateDevice(e){const t=fe[e];if(!t)throw new Error(`UNKNOWN_DEVICE: "${e}". Available: ${Object.keys(fe).join(", ")}`);const s=this.resize(t.width,t.height,`device:${e}`);this.activeDevice=e;const n=this.doc.defaultView;return n&&this.isSimulation()&&n.devicePixelRatio!==void 0&&(n.devicePixelRatio=t.devicePixelRatio),{device:e,resize:s,profile:{width:t.width,height:t.height,devicePixelRatio:t.devicePixelRatio,touch:t.touch,category:t.category},userAgentNote:this.isSimulation()?"User-Agent override requires the Chrome DevTools Protocol (real browser session); in this context the viewport, dpr and touch metadata are applied and the UA is reported but not enforced.":"User-Agent and touch behaviors are applied by the browser emulation layer.",userAgentApplied:!this.isSimulation()}}reset(){var s,n;const e={width:((s=this.doc.defaultView)==null?void 0:s.innerWidth)||0,height:((n=this.doc.defaultView)==null?void 0:n.innerHeight)||0},t=this.original?{...this.original}:{...e};return this.original&&this.applySize(this.original.width,this.original.height),this.modified=!1,this.activePreset=null,this.activeDevice=null,{success:!0,applied:{width:t.width,height:t.height},previous:e,original:{...t},reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}runResponsiveTest(e,t={restore:!0}){var c,u,h,g;const s=t.restore!==!1,n=this.original?{...this.original}:{width:((c=this.doc.defaultView)==null?void 0:c.innerWidth)||0,height:((u=this.doc.defaultView)==null?void 0:u.innerHeight)||0};this.original||(this.original={...n});const i=e.map(p=>{this.applySize(p.width,p.height),this.modified=!0;const y=this.pageDigest();return{label:p.label,width:p.width,height:p.height,domLength:y.domLength,interactiveCount:y.interactiveCount,horizontalOverflow:this.hasHorizontalOverflow(),screenshotId:void 0}}),r=i.slice(1).map((p,y)=>({from:i[y].label,to:p.label,domLengthDelta:p.domLength-i[y].domLength,interactiveDelta:p.interactiveCount-i[y].interactiveCount}));let o={width:((h=i[i.length-1])==null?void 0:h.width)||0,height:((g=i[i.length-1])==null?void 0:g.height)||0},a=!1;return s&&(this.applySize(n.width,n.height),this.modified=!1,o={...n},a=!0),{success:!0,originalViewport:n,steps:i,restored:a,finalViewport:o,comparisons:r}}getActivePreset(){return this.activePreset}getActiveDevice(){return this.activeDevice}applySize(e,t){const s=Math.max(200,Math.min(7680,Math.round(e))),n=Math.max(200,Math.min(4320,Math.round(t))),i=this.doc.defaultView;return i&&(typeof i.innerWidth=="number"&&(i.innerWidth=s),typeof i.innerHeight=="number"&&(i.innerHeight=n),typeof i.outerWidth=="number"&&(i.outerWidth=s),typeof i.outerHeight=="number"&&(i.outerHeight=n)),{width:s,height:n}}pageDigest(){var t,s,n,i;const e=this.doc.querySelectorAll('a[href], button, input, select, textarea, [role="button"], [onclick]').length;return{url:((s=(t=this.doc.defaultView)==null?void 0:t.location)==null?void 0:s.href)||((n=this.doc.location)==null?void 0:n.href)||"",domLength:((i=this.doc.documentElement)==null?void 0:i.outerHTML.length)||0,interactiveCount:e}}hasHorizontalOverflow(){const e=this.doc.documentElement,t=this.doc.body,s=this.doc.defaultView;return!s||!e?!1:Math.max(e.scrollWidth||0,(t==null?void 0:t.scrollWidth)||0)>(s.innerWidth||e.clientWidth||0)+1}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}}const ze=[/^css-/,/^jsx-/,/^sc-[A-Za-z]/,/^emotion/,/^chakra-/,/^mantine-/i,/^_ng[a-z]/,/^ng-/i,/^v-/,/^(?=.*\d)[a-z0-9]{6,12}$/i,/^data-v-/],We=["id","name","data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","aria-labelledby","aria-describedby","role","type","href","for","title","alt","rel","placeholder"];function be(l){let e=2166136261;for(let t=0;t>>0).toString(16).padStart(8,"0")}function ee(l){return ze.some(e=>e.test(l))}function Xe(l){return We.includes(l)}function re(l){const e=l.trim();return e?!!((e.match(/\d/g)||[]).length/e.length>.5||/^\d+[.,:\-/ ]+\d+/.test(e)||/\b\d{10,}\b/.test(e)):!1}function Ge(l,e=80){return Array.from(l.childNodes).filter(s=>s.nodeType===3).map(s=>(s.textContent||"").trim()).join(" ").replace(/\s+/g," ").slice(0,e)}function Ke(l,e){const t=[];let s=l;for(;s&&t.length!ee(f)),r=Ge(e),o=e.getBoundingClientRect(),a={width:Math.round(o.width),height:Math.round(o.height)},c=Ke(e,4),u=c.join(">"),g=Array.from(e.children||[]).slice(0,8).map(f=>f.tagName.toLowerCase()).join("|"),p=e.getAttribute("role")||(t!=null&&t.getComputedStyle,void 0)||Ye(e),y=be(JSON.stringify({t:e.tagName.toLowerCase(),a:s,c:i.slice(0,4),r:p||null,anc:u,desc:g,txt:re(r)?null:r.slice(0,40),d:a})),v=[];let m="low";return!s.id&&!s["data-testid"]&&!s.name&&(m="medium",v.push("no stable identity attribute")),n.length>0&&i.length===0&&(m=v.length?"high":"medium",v.push("all classes are framework-generated")),re(r)&&(v.push("text appears dynamic"),m==="low"&&(m="medium")),e.tagName.toLowerCase().includes("-")&&(v.push("custom element (web component)"),m==="low"&&(m="medium")),{fingerprintId:`fp_${y}`,hash:y,tagHierarchy:c,stableAttributes:s,meaningfulText:r,classes:i,role:p||void 0,dimensions:a,ancestorPattern:u,descendantPattern:g,volatilityRisk:m,volatilityReasons:v}}compare(e,t){const s=[],n=e.tagHierarchy[0]===t.tagHierarchy[0]?1:0;s.push({name:"tag",score:n,weight:.15});const i=ye(e.ancestorPattern.split(">"),t.ancestorPattern.split(">"));s.push({name:"ancestorPattern",score:i,weight:.2});const r=je(e.stableAttributes,t.stableAttributes);s.push({name:"stableAttributes",score:r,weight:.25});const o=ye(e.classes,t.classes);s.push({name:"classes",score:o,weight:.1});const a=(e.role||"")===(t.role||"")&&e.role?1:0;s.push({name:"role",score:a,weight:.1});const c=e.meaningfulText===t.meaningfulText&&e.meaningfulText?1:0;s.push({name:"text",score:c,weight:.1});const u=Ze(e.dimensions,t.dimensions);s.push({name:"dimensions",score:u,weight:.1});const h=s.reduce((g,p)=>g+p.score*p.weight,0);return{score:Math.round(h*1e3)/1e3,components:s}}}function Ye(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return t==="checkbox"?"checkbox":t==="radio"?"radio":t==="button"||t==="submit"?"button":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";default:return}}function ye(l,e){if(!l.length&&!e.length)return 1;if(!l.length||!e.length)return 0;const t=new Set(e);return l.filter(n=>t.has(n)).length/Math.max(l.length,e.length)}function je(l,e){const t=Object.keys(l),s=Object.keys(e);if(!t.length&&!s.length)return .5;if(!t.length||!s.length)return 0;let n=0,i=0;for(const r of t)r in e&&(i++,l[r]===e[r]&&n++);return i===0?0:n/Math.max(t.length,s.length)}function Ze(l,e){if(l.width===0&&l.height===0&&e.width===0&&e.height===0)return .5;const t=Ee(l.width,e.width),s=Ee(l.height,e.height);return(t+s)/2}function Ee(l,e){if(l===e)return 1;if(l===0||e===0)return 0;const t=Math.min(l,e)/Math.max(l,e);return t>.9?1:t>.7?.5:0}const Je=["data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","name","id"],ve=/^[a-zA-Z][a-zA-Z0-9_-]*$/,Qe=/^[a-zA-Z0-9_ .:-]+$/;class Y{constructor(e){b(this,"doc");this.doc=e}generateCandidates(e){const t=[],s=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n&&ve.test(n)){const u=`#${we(n)}`;t.push(this.evaluate(e,u,"id",1,["unique stable id"]))}for(const u of Je){if(u==="id")continue;const h=e.getAttribute(u);if(h&&Qe.test(h)&&h.length<100){const g=`${s}[${u}="${j(h)}"]`;t.push(this.evaluate(e,g,"semantic-attribute",.92,[`semantic attribute ${u}`]))}}const i=Array.from(e.classList||[]).filter(u=>!ee(u));if(i.length){const u=`${s}.${i.slice(0,3).map(we).join(".")}`;t.push(this.evaluate(e,u,"class",.72,i.length?["stable class names"]:[]))}const r=this.buildStructuralPath(e);r&&t.push(this.evaluate(e,r,"structural-path",.55,["position-based structural path"]));const o=q(e);if(o&&o.length>=2&&o.length<=60&&!re(o)){const u=`${s}:nth-of-type(1)`,h=this.buildTextXPath(e,o);h&&(t.push({selector:u,strategy:"text-derived-xpath",confidence:.6,unique:this.isXPathUnique(h),reasons:[`matches text "${o.slice(0,30)}"`]}),t[t.length-1].xpath=h)}const a=this.buildAttributeFingerprintSelector(e);a&&t.push(this.evaluate(e,a,"attribute-fingerprint",.68,["combination of stable attributes"]));const c=new Map;for(const u of t){const h=u.strategy==="text-derived-xpath"?`xpath:${u.xpath}`:u.selector,g=c.get(h);(!g||u.confidence>g.confidence)&&c.set(h,u)}return Array.from(c.values()).sort((u,h)=>h.confidence-u.confidence)}bestSelector(e){const t=this.generateCandidates(e),s=t.find(n=>n.unique&&n.confidence>=.7)||t[0];return{selector:(s==null?void 0:s.selector)||e.tagName.toLowerCase(),strategy:(s==null?void 0:s.strategy)||"tag",confidence:(s==null?void 0:s.confidence)||.3}}buildXPath(e){const t=[];let s=e;for(;s&&s!==this.doc.documentElement;){const n=s.getAttribute("id");if(n&&ve.test(n)){t.unshift(`*[@id="${j(n)}"]`);break}const i=s.parentElement;if(!i){t.unshift(s.tagName.toLowerCase());break}const o=Array.from(i.children).filter(a=>a.tagName===s.tagName).indexOf(s)+1;t.unshift(`${s.tagName.toLowerCase()}[${o}]`),s=i}return s===this.doc.documentElement&&(!t.length||!t[0].includes("@id"))&&t.unshift("html"),"//"+t.join("/")}buildTextXPath(e,t){try{const s=e.tagName.toLowerCase(),n=et(t);return`//${s}[normalize-space(text())=${n}]`}catch{return null}}buildStructuralPath(e,t=4){const s=[];let n=e;for(;n&&s.lengthc.tagName===n.tagName);if(a.length>1){const c=a.indexOf(n)+1;s.unshift(`${o}:nth-of-type(${c})`)}else s.unshift(o);if(n=r,n===this.doc.body){s.unshift("body");break}if(n===this.doc.documentElement)break}const i=s.join(" > ");return i.includes("body")?i:"body > "+i}buildAttributeFingerprintSelector(e){const t=e.tagName.toLowerCase(),s=[],n=e.getAttribute("type");n&&s.push(`type="${j(n)}"`);const i=e.getAttribute("href");i&&i.length<80&&!i.startsWith("javascript:")&&s.push(`href^="${j(i.slice(0,40))}"`);const r=e.getAttribute("placeholder");return r&&r.length<60&&s.push(`placeholder="${j(r)}"`),s.length>=2?`${t}[${s.join("][")}]`:null}evaluate(e,t,s,n,i){let r=!1,o=0;try{const c=this.doc.querySelectorAll(t);o=c.length,r=c.length===1&&c[0]===e}catch{return{selector:t,strategy:s,confidence:0,unique:!1,reasons:["invalid selector syntax"]}}let a=n;return o===0?(a=0,i.push("selector matched nothing (invalid candidate)")):o===1&&r?i.push("matches exactly this element"):(a=a*.4,i.push(`matches ${o} elements — ambiguous`)),{selector:t,strategy:s,confidence:Math.round(a*100)/100,unique:r,reasons:i}}isXPathUnique(e){try{return this.doc.evaluate(`count(${e})`,this.doc,null,4,null).numberValue===1}catch{return!1}}}function q(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function we(l){return l.replace(/([^a-zA-Z0-9_\u00A0-\uFFFF-])/g,"\\$1")}function j(l){return l.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function et(l){return l.includes("'")?l.includes('"')?`concat(${l.split("'").map(e=>`'${e}'`).join(`, "'", `)})`:`"${l}"`:`'${l}'`}class tt{constructor(e,t){b(this,"fingerprintEngine",new te);b(this,"counter",0);this.doc=e,this.registry=t}buildTarget(e,t="selector"){var h;const s=new Y(this.doc),n=s.generateCandidates(e),i=s.bestSelector(e),r=this.fingerprintEngine.fingerprint(e),o=k.inspectElement(e,this.registry),a=e.getBoundingClientRect();let c=i.confidence*.6;return r.volatilityRisk==="low"?c+=.3:r.volatilityRisk==="medium"&&(c+=.15),n.find(g=>g.unique&&g.confidence>=.9)&&(c+=.1),c=Math.max(.05,Math.min(1,c)),this.counter++,{targetId:`tgt_${Date.now().toString(36)}_${this.counter}`,tag:e.tagName.toLowerCase(),role:o.role||r.role,selector:i.selector,selectorCandidates:n,xpath:s.buildXPath(e),domPath:(((h=o.context)==null?void 0:h.parentChain)||[]).concat(i.selector).join(" > "),textFingerprint:r.meaningfulText,attributeFingerprint:JSON.stringify(r.stableAttributes),structuralFingerprint:r.hash,attributes:o.attributes||{},confidence:Math.round(c*100)/100,bounds:{x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height)},resolvedFrom:t}}resolveAndBuild(e){let t=null,s="unknown";typeof e=="string"&&(e={selector:e});const n=e;if(n.selectedElementRef&&(s="selectedElementRef"),!t&&n.selector)try{const i=this.doc.querySelectorAll(n.selector);if(i.length===0)return{error:`TARGET_NOT_FOUND: selector "${n.selector}" matches no element`};i.length>1?(t=st(i,this.doc)||i[0],s+="+disambiguated"):(t=i[0],s="selector")}catch(i){return{error:`TARGET_INVALID: ${i.message}`}}if(!t&&n.xpath)try{t=this.doc.evaluate(n.xpath,this.doc,null,9,null).singleNodeValue,s="xpath"}catch(i){return{error:`TARGET_INVALID_XPATH: ${i.message}`}}if(!t&&typeof n.nodeId=="number"&&this.registry){const i=this.registry.getNode(n.nodeId);i&&i.nodeType===1&&this.doc.contains(i)&&(t=i,s="nodeId")}return!t&&n.coordinates&&(t=this.doc.elementFromPoint(n.coordinates.x,n.coordinates.y),s="coordinates"),t?{element:t,target:this.buildTarget(t,s)}:{error:"TARGET_NOT_FOUND: no usable resolution strategy succeeded"}}}function st(l,e){for(const t of Array.from(l)){const s=t;try{if(k.inspectElement(s).visibility.isVisible)return s}catch{}}return null}class nt{constructor(e){b(this,"fingerprintEngine",new te);this.doc=e}recover(e,t){var p;const s=[],n=[];let i=null;try{i=this.doc.querySelectorAll(e)}catch(y){s.push(`selector syntax error: ${y.message}`)}if(i&&i.length>0){s.push("selector still matches — no recovery needed");const y=i[0];return{recovered:!0,confidence:1,strategy:"original-selector",resolvedSelector:e,matchedElementInfo:Te(y),alternatives:[],diagnostics:s,recommendation:"Original selector works; the earlier failure was transient (likely a navigation or render race)."}}s.push("selector no longer matches any element");const o=this.collectCandidates(t,s).map(y=>({element:y,score:this.scoreMatch(y,t)})).filter(y=>y.score.score>.35).sort((y,v)=>v.score.score-y.score.score);for(const y of o.slice(0,5)){const v=new Y(this.doc).bestSelector(y.element);n.push({selector:v.selector,confidence:Math.round(y.score.score*100)/100,strategy:"recovery-match"})}if(!o.length)return{recovered:!1,confidence:0,strategy:"none",alternatives:n,diagnostics:s,recommendation:"No sufficiently similar element exists. The region may have been removed, or the page structure changed fundamentally. Re-inspect the page and capture a new target."};const a=o[0],c=o.length>1?a.score.score-o[1].score.score:1;s.push(`best candidate score: ${a.score.score.toFixed(3)} (margin ${c.toFixed(3)})`);for(const y of a.score.components)y.score>0&&s.push(` - ${y.name}: ${(y.score*100).toFixed(0)}%`);if(a.score.score<.62||o.length>1&&c<.15)return{recovered:!1,confidence:Math.round(a.score.score*100)/100,strategy:"recovery-refused",resolvedSelector:(p=n[0])==null?void 0:p.selector,alternatives:n,diagnostics:s,recommendation:"Recovery refused: best match is not confident enough or too close to a competing element. Inspect alternatives manually before acting — refusing to avoid acting on a wrong element."};const g=new Y(this.doc).bestSelector(a.element).selector;return{recovered:!0,confidence:Math.round(a.score.score*100)/100,strategy:"fingerprint-recovery",resolvedSelector:g,matchedElementInfo:Te(a.element),alternatives:n,diagnostics:s,recommendation:`Recovered target with ${(a.score.score*100).toFixed(0)}% confidence. Verify the resolved selector before destructive actions.`}}collectCandidates(e,t){var r,o;const s=new Set,n=this.doc.querySelectorAll(e.tag);let i=0;for(const a of Array.from(n))if(s.add(a),++i>=400)break;if((r=e.classes)!=null&&r.length){const a=e.classes.filter(c=>!ee(c));for(const c of a.slice(0,2))try{for(const u of Array.from(this.doc.querySelectorAll(`.${c}`)).slice(0,100))s.add(u)}catch{}}if((o=e.stableAttributes)!=null&&o.name)try{for(const a of Array.from(this.doc.querySelectorAll(`[name="${e.stableAttributes.name}"]`)))s.add(a)}catch{}if(e.parentSelector)try{for(const a of Array.from(this.doc.querySelectorAll(`${e.parentSelector} > ${e.tag}`)).slice(0,100))s.add(a)}catch{}return t.push(`collected ${s.size} candidate elements for scoring`),Array.from(s)}scoreMatch(e,t){const s=[],n=e.tagName.toLowerCase()===t.tag.toLowerCase()?1:0;s.push({name:"tag",score:n,weight:.15});const i=(t.text||"").trim().slice(0,40),r=q(e).slice(0,40),o=(e.textContent||"").trim().slice(0,40);let a=0;if(i){const d=r?r===i?1:oe(i,r):0,f=o?o===i?1:oe(i,o):0;a=Math.max(d,f)}s.push({name:"text",score:a,weight:.3});const c=new Set((t.classes||[]).filter(d=>!ee(d))),u=Array.from(e.classList||[]),h=c.size?u.filter(d=>c.has(d)).length/c.size:.5;s.push({name:"classes",score:h,weight:.2});const g=t.stableAttributes||{},p=Object.keys(g);let y=.5;if(p.length){let d=0;for(const f of p)e.getAttribute(f)===g[f]&&d++;y=d/p.length}s.push({name:"attributes",score:y,weight:.2});const v=t.childCount!==void 0?e.children.length===t.childCount?1:oe(String(t.childCount),String(e.children.length)):.5;if(s.push({name:"childCount",score:v,weight:.05}),t.fingerprintHash){const d={fingerprintId:"snapshot",hash:t.fingerprintHash,tagHierarchy:[t.tag],stableAttributes:g,meaningfulText:i,classes:t.classes||[],dimensions:{width:0,height:0},ancestorPattern:"",descendantPattern:"",volatilityRisk:"medium",volatilityReasons:[]},f=this.fingerprintEngine.fingerprint(e),w=this.fingerprintEngine.compare(d,f);s.push({name:"fingerprint",score:w.score,weight:.1})}const m=s.reduce((d,f)=>d+f.score*f.weight,0);return{score:Math.max(0,Math.min(1,m)),components:s}}diagnose(e){const t=[];let s=!0,n=0,i,r=[];try{n=this.doc.querySelectorAll(e).length}catch(o){s=!1,i=o.message,t.push("Selector is syntactically invalid CSS.")}if(s&&n===0){t.push("Selector parses but matches nothing — element may be removed, re-rendered, or inside a shadow root."),r=this.relaxSelector(e);for(const o of r)try{if(this.doc.querySelectorAll(o).length>0){t.push(`Relaxed form "${o}" matches — the over-specific part of the selector is stale.`);break}}catch{}}return s&&n>1&&t.push(`Selector matches ${n} elements — it is ambiguous; use a more specific form or index.`),{selector:e,valid:s,matches:n,parseError:i,closestWorkingSelectors:r.filter(o=>{try{return this.doc.querySelectorAll(o).length>0}catch{return!1}}),diagnosis:t}}relaxSelector(e){const t=[],s=e.split(/[ >]+/).filter(Boolean);s.length>1&&(t.push(s.slice(0,-1).join(" ")),t.push(s[s.length-1]));const n=e.replace(/:nth-of-type\(\d+\)/g,"").replace(/\.[^. >#:[]+/g,(i,r,o)=>o[r-1]==="\\"?i:"");return n!==e&&n.trim()&&t.push(n.trim()),t}}function oe(l,e){if(!l||!e)return 0;const t=Se(l),s=Se(e);if(t===s)return 1;if(t.includes(s)||s.includes(t))return .7;const n=new Set(t.split(/\s+/)),i=new Set(s.split(/\s+/));return Array.from(n).filter(o=>i.has(o)).length/Math.max(n.size,i.size)}function Se(l){return l.toLowerCase().replace(/[^a-z0-9 ]/g," ").replace(/\s+/g," ").trim()}function Te(l){return{tag:l.tagName.toLowerCase(),id:l.getAttribute("id")||void 0,text:q(l).slice(0,60),classes:Array.from(l.classList||[])}}class ae{constructor(e){b(this,"state");this.state=e>>>0,this.state===0&&(this.state=2654435769)}next(){this.state=this.state+1831565813>>>0;let e=this.state;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}range(e,t){return e+this.next()*(t-e)}int(e,t){return Math.floor(this.range(e,t+1))}chance(e){return this.next()setTimeout(t,e))}chance(){return this.rng.next()<.5}}const rt=[{ruleId:"red_key_password",kind:"key-pattern",pattern:"password|passwd|pwd",description:"Keys containing password/passwd/pwd",enabled:!0,userAdded:!1},{ruleId:"red_key_token",kind:"key-pattern",pattern:"token|jwt|bearer|auth|session.?id|secret|api.?key|client.?secret",description:"Keys containing token/jwt/auth/session-id/secret/api-key",enabled:!0,userAdded:!1},{ruleId:"red_key_credential",kind:"key-pattern",pattern:"credential|login|user.?pass|otp|2fa|mfa|verification",description:"Keys containing credential/login/otp/2fa/verification",enabled:!0,userAdded:!1},{ruleId:"red_key_payment",kind:"key-pattern",pattern:"card|payment|billing|iban|cvv|cvc|pan",description:"Keys containing card/payment/billing/iban/cvv",enabled:!0,userAdded:!1},{ruleId:"red_key_personal",kind:"key-pattern",pattern:"ssn|social.?security|national.?id|passport|tax.?id",description:"Keys containing personal identifier patterns",enabled:!0,userAdded:!1},{ruleId:"red_val_jwt",kind:"value-pattern",pattern:"eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+",description:"JWT-shaped tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_bearer",kind:"value-pattern",pattern:"bearer\\s+[A-Za-z0-9._-]+",description:"Bearer tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_long_hex",kind:"value-pattern",pattern:"\\b[a-f0-9]{32,}\\b",description:"32+ char hex strings (session/API ids)",enabled:!0,userAdded:!1},{ruleId:"red_val_sk",kind:"value-pattern",pattern:"\\b(sk|pk|rk)_[A-Za-z0-9_]{20,}\\b",description:"Stripe-style secret keys (sk_live_…)",enabled:!0,userAdded:!1},{ruleId:"red_attr_input_password",kind:"attribute-name",pattern:"value",description:"value attributes on password inputs handled by PrivacyEngine maskValue",enabled:!0,userAdded:!1},{ruleId:"red_attr_secret",kind:"attribute-name",pattern:"data-secret|data-token|data-api-key|secret|access.?token",description:"Secret-carrying attributes",enabled:!0,userAdded:!1}],ot=[{exclusionId:"excl_mcpdom_overlay",selector:"[data-mcpdom-internal], [data-forensic-internal], #forensic-recorder-floating-host, #forensic-inspect-highlighter",reason:"MCPDOM-injected UI must never contaminate captured DOM (§68 clean capture)",userAdded:!1},{exclusionId:"excl_mcpdom_ids",selector:'[id^="forensic-"], [id^="mcpdom-"]',reason:"MCPDOM-namespaced nodes",userAdded:!1}],ce="[REDACTED]";class le{constructor(e){b(this,"config");b(this,"base",new J);b(this,"compiledKeyPatterns",[]);b(this,"compiledValuePatterns",[]);b(this,"compiledAttrPatterns",[]);this.config={rules:[...rt],exclusions:[...ot],stubMode:!0,...e},this.recompile()}recompile(){this.compiledKeyPatterns=[],this.compiledValuePatterns=[],this.compiledAttrPatterns=[];for(const e of this.config.rules){if(!e.enabled)continue;const t="i";try{switch(e.kind){case"key-pattern":this.compiledKeyPatterns.push(new RegExp(e.pattern,t));break;case"value-pattern":this.compiledValuePatterns.push(new RegExp(e.pattern,"i"));break;case"attribute-name":this.compiledAttrPatterns.push(new RegExp(`^(${e.pattern})$`,"i"));break}}catch{}}}getRules(){return[...this.config.rules]}setRuleEnabled(e,t){const s=this.config.rules.find(n=>n.ruleId===e);return s?(s.enabled=t,this.recompile(),!0):!1}addRule(e){const t=`red_custom_${this.config.rules.length+1}_${Date.now().toString(36)}`,s={...e,ruleId:t,userAdded:!0};return this.config.rules.push(s),this.recompile(),s}removeRule(e){const t=this.config.rules.findIndex(s=>s.ruleId===e);return t<0||!this.config.rules[t].userAdded?!1:(this.config.rules.splice(t,1),this.recompile(),!0)}getExclusions(){return[...this.config.exclusions]}addExclusion(e,t){const n={exclusionId:`excl_custom_${this.config.exclusions.length+1}_${Date.now().toString(36)}`,selector:e,reason:t,userAdded:!0};return this.config.exclusions.push(n),n}removeExclusion(e){const t=this.config.exclusions.findIndex(s=>s.exclusionId===e);return t<0||!this.config.exclusions[t].userAdded?!1:(this.config.exclusions.splice(t,1),!0)}isSensitiveKey(e){return this.compiledKeyPatterns.some(t=>t.test(e))}redactValue(e){let t=e;for(const s of this.compiledValuePatterns)s.test(t)&&(t=t.replace(new RegExp(s.source,"gi"),ce));return t}redactByKeyValue(e,t){return this.isSensitiveKey(e)?this.config.stubMode?ce:t:this.redactValue(t)}isSensitiveAttribute(e){return this.compiledAttrPatterns.some(t=>t.test(e))}redactAttributes(e){const t={};for(const[s,n]of Object.entries(e))this.isSensitiveAttribute(s)?t[s]=ce:t[s]=this.redactValue(n);return t}cleanSubtree(e){const t=e.cloneNode(!0);for(const s of this.config.exclusions){let n=null;try{n=t.querySelectorAll(s.selector)}catch{continue}for(const i of Array.from(n))i.remove();try{if(t.matches(s.selector))return this.doclessEmptyStub(t)}catch{}}return t}isExcluded(e){for(const t of this.config.exclusions)try{if(e.matches(t.selector)||e.closest(t.selector))return!0}catch{}return!1}doclessEmptyStub(e){return e.innerHTML="",e.setAttribute("data-mcpdom-excluded","true"),e}toJSON(){return{rules:this.getRules(),exclusions:this.getExclusions(),stubMode:this.config.stubMode}}static fromJSON(e){return new le({rules:Array.isArray(e==null?void 0:e.rules)?e.rules:void 0,exclusions:Array.isArray(e==null?void 0:e.exclusions)?e.exclusions:void 0,stubMode:typeof(e==null?void 0:e.stubMode)=="boolean"?e.stubMode:void 0})}}const ue='a[href], button, input, select, textarea, [role="button"], [role="link"], [role="tab"], [onclick], [tabindex]';function F(l,e){return{items:l.slice(0,e),truncated:l.length>e}}function _(l,e,t,s,n,i){return{analyzer:l,summary:e,count:t,items:s,warnings:n,truncated:i}}function O(l){try{return k.inspectElement(l).bestSelector}catch{return l.tagName.toLowerCase()}}const at=l=>{const e=Array.from(l.querySelectorAll("form")),t=e.map(n=>{const i=Array.from(n.querySelectorAll("input, select, textarea")).map(r=>({tag:r.tagName.toLowerCase(),type:r.getAttribute("type")||(r.tagName.toLowerCase()==="textarea"?"textarea":r.tagName.toLowerCase()==="select"?"select":"text"),name:r.getAttribute("name")||void 0,id:r.getAttribute("id")||void 0,required:r.hasAttribute("required"),pattern:r.getAttribute("pattern")||void 0,maxLength:r.getAttribute("maxlength")||void 0,placeholder:r.getAttribute("placeholder")||void 0,ariaLabel:r.getAttribute("aria-label")||void 0,autocomplete:r.getAttribute("autocomplete")||void 0,hasLabel:!!(r.getAttribute("id")&&l.querySelector(`label[for="${r.getAttribute("id")}"]`))||!!r.closest("label"),defaultValue:r.value!==void 0&&(r.getAttribute("type")||"text")!=="password"?String(r.value).slice(0,40):void 0}));return{selector:O(n),action:n.getAttribute("action")||void 0,method:(n.getAttribute("method")||"GET").toUpperCase(),id:n.getAttribute("id")||void 0,fieldCount:i.length,submitButton:n.querySelector('button[type="submit"], input[type="submit"]')?O(n.querySelector('button[type="submit"], input[type="submit"]')):void 0,validationAttributes:i.filter(r=>r.required||r.pattern).length,fields:i}}),s=F(t,50);return _("analyze_forms",`${e.length} form(s) with ${t.reduce((n,i)=>n+i.fieldCount,0)} total fields`,e.length,s.items,[],s.truncated)},ct=l=>{const e=Array.from(l.querySelectorAll("a[href]")),t=e.map(n=>({href:n.getAttribute("href")||"",text:q(n).slice(0,60),selector:O(n),rel:n.getAttribute("rel")||void 0,target:n.getAttribute("target")||void 0,download:n.hasAttribute("download"),external:/^https?:\/\//i.test(n.getAttribute("href")||"")&&!lt(n.getAttribute("href")||"",l),anchorOnly:(n.getAttribute("href")||"").startsWith("#")})),s=F(t,200);return _("extract_links",`${e.length} link(s): ${t.filter(n=>n.external).length} external, ${t.filter(n=>n.anchorOnly).length} anchors`,e.length,s.items,[],s.truncated)};function lt(l,e){var t,s,n,i;try{return new URL(l,((s=(t=e.defaultView)==null?void 0:t.location)==null?void 0:s.href)||"http://localhost").origin===(((i=(n=e.defaultView)==null?void 0:n.location)==null?void 0:i.origin)||"")}catch{return!1}}const ut=l=>{const e=Array.from(l.querySelectorAll("img")),t=Array.from(l.querySelectorAll("video")),s=Array.from(l.querySelectorAll("audio")),n=Array.from(l.querySelectorAll("canvas")),i=[],r=[...e.map(c=>({kind:"img",selector:O(c),src:(c.getAttribute("src")||"").slice(0,150),alt:c.getAttribute("alt"),width:c.getAttribute("width")||void 0,height:c.getAttribute("height")||void 0,naturalWidth:c.naturalWidth||void 0,naturalHeight:c.naturalHeight||void 0,lazy:c.getAttribute("loading")==="lazy",missingAlt:!c.hasAttribute("alt")})),...t.map(c=>{var u;return{kind:"video",selector:O(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls"),autoplay:c.hasAttribute("autoplay"),muted:c.hasAttribute("muted"),poster:c.getAttribute("poster")||void 0}}),...s.map(c=>{var u;return{kind:"audio",selector:O(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls")}}),...n.map(c=>({kind:"canvas",selector:O(c),width:c.width,height:c.height}))],o=r.filter(c=>c.missingAlt).length;o&&i.push(`${o} image(s) missing alt text (accessibility risk).`);const a=F(r,200);return _("analyze_media",`${e.length} images, ${t.length} videos, ${s.length} audios, ${n.length} canvases`,r.length,a.items,i,a.truncated)},dt=l=>{const e=l.defaultView,t=[],s={};if(e!=null&&e.getComputedStyle){const i=e.getComputedStyle(l.documentElement);for(let r=0;r({name:i,value:r}));return _("get_css_variables",`${n.length} CSS custom properties found`,n.length,n,t,!1)},ht=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.fontFamily||"",a=r.fontSize||"",c=`${o.split(",")[0].replace(/["']/g,"").trim()} @ ${a}`;s.set(c,(s.get(c)||0)+1)}else t.push("getComputedStyle unavailable — font usage analysis requires rendered styles.");const n=Array.from(s.entries()).map(([i,r])=>({font:i,usage:r})).sort((i,r)=>r.usage-i.usage);return _("analyze_fonts",`${n.length} distinct font/size combinations`,n.length,n,t,!1)},gt=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i);for(const o of["color","background-color","border-top-color"]){const a=r.getPropertyValue(o);a&&a!=="rgba(0, 0, 0, 0)"&&s.set(a,(s.get(a)||0)+1)}}else{for(const i of Array.from(l.querySelectorAll("[style]")).slice(0,300)){const r=i.getAttribute("style")||"",o=/(color)\s*:\s*([^;]+)/gi;let a;for(;a=o.exec(r);)s.set(a[2].trim(),(s.get(a[2].trim())||0)+1)}t.push("getComputedStyle unavailable — palette from inline styles only.")}const n=Array.from(s.entries()).map(([i,r])=>({color:i,usage:r})).sort((i,r)=>r.usage-i.usage).slice(0,40);return _("extract_color_palette",`${s.size} distinct colors in use`,s.size,n,t,!1)},pt=l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — z-index analysis requires rendered styles."),_("detect_zindex_conflicts","unavailable",0,[],t,!1);const n=[];for(const i of Array.from(l.querySelectorAll("body *")).slice(0,1e3)){const r=e.getComputedStyle(i),o=r.zIndex;o&&o!=="auto"&&parseInt(o,10)>0&&n.push({selector:O(i),z:parseInt(o,10),position:r.position,stacking:r.position==="fixed"||r.position==="sticky"||r.opacity!=="1"||r.transform!=="none"?"creates-stacking-context":"plain"})}for(let i=0;i1e5&&s.push({zIndex:n[i].z,elements:[n[i].selector],note:"extremely high z-index — competes with platform overlays (MCPDOM uses 2147483640+)."})}return _("detect_zindex_conflicts",`${n.length} z-indexed elements, ${s.length} potential conflict(s)`,s.length,F(s,40).items,t,s.length>40)},mt=l=>{const e=l.defaultView,t=[],s=l.documentElement,n=l.body,i=Math.max((s==null?void 0:s.scrollWidth)||0,(n==null?void 0:n.scrollWidth)||0),r=(e==null?void 0:e.innerWidth)||(s==null?void 0:s.clientWidth)||0,o=i>r+1;if(o&&(t.push({issue:"horizontal-overflow",detail:`document scrollWidth ${i} exceeds viewport ${r}`}),e!=null&&e.getComputedStyle))for(const c of Array.from(l.querySelectorAll("body *")).slice(0,600)){const u=c.getBoundingClientRect();if(u.right>r+2&&u.width>100&&(t.push({issue:"element-exceeds-viewport",selector:O(c),right:Math.round(u.right),width:Math.round(u.width)}),t.length>15))break}let a=0;for(const c of Array.from(l.querySelectorAll(ue)).slice(0,500)){const u=c.getBoundingClientRect();(u.width===0||u.height===0)&&a++}return a&&t.push({issue:"zero-size-interactive-elements",count:a}),_("detect_layout_issues",o?`HORIZONTAL OVERFLOW: page is ${i-r}px wider than viewport`:"No horizontal overflow detected",t.length,t,[],!1)},ft=l=>{const e=Array.from(l.querySelectorAll(ue)),t=new Map,s=e.slice(0,300).map(n=>{const i=de(n),r=i.role||n.tagName.toLowerCase();return t.set(r,(t.get(r)||0)+1),{selector:i.bestSelector,tag:i.tag,role:i.role,text:i.text.slice(0,40),visible:i.visibility.isVisible,disabled:n.disabled||n.hasAttribute("disabled"),inViewport:i.visibility.isInViewport}});return _("census_interactive_elements",`${e.length} interactive elements: ${Array.from(t.entries()).map(([n,i])=>`${n}×${i}`).join(", ")||"none"}`,e.length,s,[],e.length>300)};function de(l){try{return k.inspectElement(l)}catch{return{tag:l.tagName.toLowerCase(),role:void 0,text:"",bestSelector:l.tagName.toLowerCase(),bounds:{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},visibility:{isVisible:!1,isInViewport:!1}}}}const bt=l=>{const e=["header","nav","main","aside","footer","article","section","figure","figcaption","mark","time","address","details","summary","dialog"],t=[];for(const i of e){const r=Array.from(l.querySelectorAll(i));if(r.length)for(const o of r.slice(0,20))t.push({tag:i,selector:O(o),role:o.getAttribute("role")||yt(i),text:q(o).slice(0,50),childCount:o.children.length})}const s=t.filter(i=>["banner","navigation","main","complementary","contentinfo"].includes(i.role)),n=[];return t.find(i=>i.tag==="main")||n.push("No
element — page lacks a primary landmark."),l.querySelectorAll("header").length>1&&n.push("Multiple
elements outside sections — ambiguous banner landmark."),_("detect_semantic_elements",`${t.length} semantic elements, ${s.length} landmarks`,t.length,F(t,100).items,n,t.length>100)};function yt(l){return{header:"banner",nav:"navigation",main:"main",aside:"complementary",footer:"contentinfo",article:"article",section:"region",form:"form"}[l]}const Ce={analyze_forms:at,extract_links:ct,analyze_media:ut,get_css_variables:dt,analyze_fonts:ht,extract_color_palette:gt,detect_zindex_conflicts:pt,detect_layout_issues:mt,census_interactive_elements:ft,detect_semantic_elements:bt,scan_accessibility_issues:l=>{var i;const e=[];for(const r of Array.from(l.querySelectorAll("img")).slice(0,200))r.hasAttribute("alt")||e.push({rule:"img-alt",severity:"error",selector:O(r),message:"Image is missing the alt attribute."});for(const r of Array.from(l.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button])")).slice(0,200)){const o=r.getAttribute("id");o&&l.querySelector(`label[for="${o}"]`)||r.closest("label")||r.getAttribute("aria-label")||r.getAttribute("aria-labelledby")||e.push({rule:"input-label",severity:"error",selector:O(r),message:"Form input has no associated label, aria-label or aria-labelledby."})}for(const r of Array.from(l.querySelectorAll('button, a[href], [role="button"]')).slice(0,300)){const o=q(r).trim(),a=r.getAttribute("aria-label");!o&&!a&&e.push({rule:"accessible-name",severity:"error",selector:O(r),message:"Interactive element has no accessible name (no text, no aria-label).",hint:r.querySelector("img[alt]")?"Contains an image — consider alt text or aria-label.":void 0})}const t=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).slice(0,100);let s=0;for(const r of t){const o=parseInt(r.tagName[1],10);s&&o>s+1&&e.push({rule:"heading-order",severity:"warning",selector:O(r),message:`Heading level jumps from h${s} to h${o}.`}),s=o}(i=l.documentElement)!=null&&i.getAttribute("lang")||e.push({rule:"html-lang",severity:"warning",selector:"html",message:"The element has no lang attribute."});const n=e.filter(r=>r.severity==="error").length;return _("scan_accessibility_issues",`${e.length} issue(s): ${n} errors, ${e.length-n} warnings`,e.length,F(e,100).items,[],e.length>100)},detect_dead_click_targets:l=>{const e=l.defaultView,t=[];for(const s of Array.from(l.querySelectorAll(ue)).slice(0,500)){const n=s.getBoundingClientRect(),i=e!=null&&e.getComputedStyle?e.getComputedStyle(s):null,r=n.width===0||n.height===0,o=i?i.pointerEvents==="none":!1,a=i?i.display==="none"||i.visibility==="hidden":!1,c=s.getAttribute("aria-hidden")==="true";(r||o||a||c)&&t.push({selector:O(s),tag:s.tagName.toLowerCase(),text:q(s).slice(0,30),reasons:[r&&"zero-size",o&&"pointer-events:none",a&&`hidden (${i?i.display:"?"}/${i?i.visibility:"?"})`,c&&"aria-hidden"].filter(Boolean)})}return _("detect_dead_click_targets",`${t.length} unreachable interactive element(s)`,t.length,F(t,80).items,[],t.length>80)},inventory_animations:l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — animation inventory requires rendered styles."),_("inventory_animations","unavailable",0,[],t,!1);for(const i of Array.from(l.querySelectorAll("body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.animationName!=="none"?`${r.animationName} ${r.animationDuration}`:null,a=r.transitionProperty!=="none"&&r.transitionProperty!=="all"?`${r.transitionProperty} ${r.transitionDuration}`:r.transitionProperty==="all"?`all ${r.transitionDuration}`:null;(o||a)&&s.push({selector:O(i),animation:o,transition:a,transitionTiming:r.transitionTimingFunction||void 0})}const n=s.filter(i=>i.animation&&i.animation.includes("infinite"));return n.length>5&&t.push(`${n.length} infinitely looping animations — may indicate decorative spinners or a stuck loading state.`),_("inventory_animations",`${s.length} animated/transitioning elements`,s.length,F(s,80).items,t,s.length>80)},map_frame_tree:l=>{const e=[],t=(n,i,r)=>{const o=Array.from(n.querySelectorAll("iframe, frame"));for(const a of o){const c=a.getAttribute("src")||"(no src)";let u=!1,h=null;try{const g=a.contentDocument;g&&(u=!0,h=g.querySelectorAll("*").length,r<3&&t(g,`${i} > ${a.tagName.toLowerCase()}[${c.slice(0,50)}]`,r+1))}catch{u=!1}e.push({path:`${i} > ${a.tagName.toLowerCase()}`,selector:O(a),src:c.slice(0,120),title:a.getAttribute("title")||void 0,name:a.getAttribute("name")||void 0,sandbox:a.getAttribute("sandbox")||void 0,accessible:u,childCount:h,limitation:u?void 0:"Same-origin policy blocks contentDocument access (cross-origin frame)."})}};t(l,"document",0);const s=e.filter(n=>!n.accessible).length;return _("map_frame_tree",`${e.length} frame(s), ${s} inaccessible (cross-origin)`,e.length,e,[],!1)},inventory_shadow_roots:l=>{const e=[],t=(s,n,i)=>{const r=(s instanceof ShadowRoot,Array.from(s.querySelectorAll("*")));for(const o of r)if(o.shadowRoot){const a=o.shadowRoot,c=`${n} > ${o.tagName.toLowerCase()}::shadowRoot(${a.mode})`;e.push({path:c.slice(0,200),hostSelector:O(o),hostTag:o.tagName.toLowerCase(),mode:a.mode,childCount:a.querySelectorAll("*").length,styles:a.querySelectorAll("style").length}),i<4&&t(a,c,i+1)}};return t(l.documentElement,"document",0),_("inventory_shadow_roots",`${e.length} open shadow root(s) found`,e.length,e,[],!1)},inspect_page_storage:l=>{const e=l.defaultView,t=new le,s=[],n=[];if(!(e!=null&&e.localStorage)||!(e!=null&&e.sessionStorage))return _("inspect_page_storage","Web Storage API unavailable in this context",0,[],["localStorage/sessionStorage are not accessible here (JSDOM limitation or sandboxed iframe)."],!1);try{for(let r=0;rr+(o.size||0),0);return _("inspect_page_storage",`${n.length} storage entries (~${i} bytes), sensitive keys redacted`,n.length,F(n,100).items,s,n.length>100)},get_performance_metrics:l=>{var i,r,o,a;const e=l.defaultView,t=[],s=e==null?void 0:e.performance;if(!(s!=null&&s.timing)&&!(s!=null&&s.getEntriesByType))return _("get_performance_metrics","Performance API unavailable",0,[],["window.performance is not exposed in this context."],!1);const n=[];try{const c=(r=(i=s.getEntriesByType)==null?void 0:i.call(s,"navigation"))==null?void 0:r[0];if(c)n.push({metric:"navigation-timing",domContentLoaded:Math.round(c.domContentLoadedEventEnd),loadComplete:Math.round(c.loadEventEnd),domInteractive:Math.round(c.domInteractive),type:c.type,redirectCount:c.redirectCount,sizeTransfer:c.transferSize});else if(s.timing){const g=s.timing;n.push({metric:"navigation-timing-legacy",domContentLoaded:g.domContentLoadedEventEnd-g.navigationStart,loadComplete:g.loadEventEnd-g.navigationStart,domInteractive:g.domInteractive-g.navigationStart})}const u=((o=s.getEntriesByType)==null?void 0:o.call(s,"paint"))||[];for(const g of u)n.push({metric:g.name,startTime:Math.round(g.startTime)});const h=((a=s.getEntriesByType)==null?void 0:a.call(s,"resource"))||[];if(h.length){const g=h.reduce((y,v)=>y+v.duration,0),p=[...h].sort((y,v)=>v.duration-y.duration).slice(0,5).map(y=>({url:String(y.name).slice(0,100),duration:Math.round(y.duration)}));n.push({metric:"resource-summary",count:h.length,totalDuration:Math.round(g),slowest:p})}s.memory&&n.push({metric:"memory",usedJSHeapMB:Math.round(s.memory.usedJSHeapSize/1048576*10)/10,totalJSHeapMB:Math.round(s.memory.totalJSHeapSize/1048576*10)/10})}catch(c){t.push(`performance read failed: ${c.message}`)}return _("get_performance_metrics",`${n.length} metric group(s)`,n.length,n,t,!1)},extract_seo_metadata:l=>{var r,o,a;const e=c=>{var u;return((u=l.querySelector(`meta[name="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},t=c=>{var u;return((u=l.querySelector(`meta[property="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},s=[{field:"title",value:l.title||void 0},{field:"description",value:e("description")},{field:"canonical",value:(r=l.querySelector('link[rel="canonical"]'))==null?void 0:r.getAttribute("href")},{field:"robots",value:e("robots")},{field:"viewport",value:e("viewport")},{field:"charset",value:(o=l.querySelector("meta[charset]"))==null?void 0:o.getAttribute("charset")},{field:"og:title",value:t("og:title")},{field:"og:description",value:t("og:description")},{field:"og:image",value:t("og:image")},{field:"og:url",value:t("og:url")},{field:"twitter:card",value:e("twitter:card")},{field:"language",value:(a=l.documentElement)==null?void 0:a.getAttribute("lang")}],n=l.querySelectorAll("h1").length,i=[];return n===0&&i.push("No h1 — page lacks a primary heading."),n>1&&i.push(`Multiple h1 elements (${n}).`),e("description")||i.push("No meta description."),s.push({field:"h1Count",value:n}),_("extract_seo_metadata",`SEO metadata extracted; ${i.length} warning(s)`,s.length,s,i,!1)},extract_structured_data:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('script[type="application/ld+json"]')))try{const n=JSON.parse(s.textContent||"{}");e.push({format:"JSON-LD",type:n["@type"]||(Array.isArray(n)?"array":"unknown"),data:n})}catch(n){e.push({format:"JSON-LD",type:"invalid-json",error:n.message})}for(const s of Array.from(l.querySelectorAll("[itemscope]")).slice(0,30)){const n=s.getAttribute("itemtype")||"unknown",i={};for(const r of Array.from(s.querySelectorAll("[itemprop]"))){const o=r.getAttribute("itemprop")||"",a=r.getAttribute("content")||r.getAttribute("href")||((t=r.textContent)==null?void 0:t.trim())||"";i[o]=a.slice(0,100)}e.push({format:"microdata",type:n.split("/").pop()||n,data:i})}return _("extract_structured_data",`${e.length} structured data block(s)`,e.length,e,[],!1)},extract_tables:l=>{const e=Array.from(l.querySelectorAll("table")),t=e.slice(0,30).map(s=>{var a,c,u;const n=Array.from(s.querySelectorAll("thead th, tr:first-child th")).map(h=>{var g;return((g=h.textContent)==null?void 0:g.trim())||""}),i=Array.from(s.querySelectorAll("tbody tr, tr")).filter(h=>!h.querySelector("th")).slice(0,50),r=i.map(h=>Array.from(h.querySelectorAll("td")).map(g=>(g.textContent||"").trim().slice(0,60))),o=(c=(a=s.querySelector("caption"))==null?void 0:a.textContent)==null?void 0:c.trim();return{selector:O(s),caption:o,columnCount:n.length||((u=r[0])==null?void 0:u.length)||0,rowCount:i.length,headers:n,rows:r}});return _("extract_tables",`${e.length} table(s)`,e.length,t,[],e.length>30)},extract_lists:l=>{const e=Array.from(l.querySelectorAll("ul, ol")),t=e.slice(0,60).map(s=>{const n=Array.from(s.querySelectorAll(":scope > li")).slice(0,40);return{selector:O(s),kind:s.tagName.toLowerCase(),ordered:s.tagName.toLowerCase()==="ol",itemCount:n.length,items:n.map(i=>q(i).slice(0,60)),nested:s.querySelectorAll("ul, ol").length}});return _("extract_lists",`${e.length} list(s)`,e.length,t,[],e.length>60)},analyze_page_content:l=>{const e=l.body,t=(e==null?void 0:e.innerText)||(e==null?void 0:e.textContent)||"",s=t.trim()?t.trim().split(/\s+/).length:0,n=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).map(c=>({level:parseInt(c.tagName[1],10),text:q(c).slice(0,80)})),i=l.querySelectorAll("p").length,r=i?Math.round(s/i):0,o=Math.round(s/220*10)/10,a=[{metric:"wordCount",value:s},{metric:"paragraphCount",value:i},{metric:"avgParagraphWords",value:r},{metric:"estimatedReadingMinutes",value:o},{metric:"headingCount",value:n.length},{metric:"imageCount",value:l.querySelectorAll("img").length},{metric:"linkDensity",value:Math.round(l.querySelectorAll("a[href]").length/Math.max(1,s)*1e3)/1e3},{metric:"headings",value:n.slice(0,50)}];return _("analyze_page_content",`${s} words, ${i} paragraphs, ~${o} min read`,a.length,a,[],!1)},search_dom:(l,e)=>{const t=String((e==null?void 0:e.query)||"").trim();if(!t)return _("search_dom","No query supplied",0,[],["Provide a text query; optionally tag/attr filters."],!1);const s=t.toLowerCase(),n=[],i=Math.min((e==null?void 0:e.limit)||50,200),r=Array.from(l.querySelectorAll("*"));for(const o of r){if(n.length>=i)break;if(e!=null&&e.tag&&o.tagName.toLowerCase()!==String(e.tag).toLowerCase())continue;const a=q(o),c=Array.from(o.attributes);let u=0,h="";o.tagName.toLowerCase().includes(s)&&(u+=.2,h="tag match"),a.toLowerCase().includes(s)&&a.length<200&&(u+=.6,h="text match");for(const g of c)if(g.name.toLowerCase().includes(s)||g.value.length<100&&g.value.toLowerCase().includes(s)){u+=.4,h=`attribute ${g.name} match`;break}if(e!=null&&e.attr){const g=String(e.attr).toLowerCase(),p=e.attrValue?String(e.attrValue).toLowerCase():null;if(c.find(v=>v.name.toLowerCase()===g&&(!p||v.value.toLowerCase().includes(p))))u+=.5;else continue}if(u>0){const g=de(o);n.push({selector:g.bestSelector,tag:g.tag,role:g.role,text:g.text.slice(0,60),score:Math.round(u*100)/100,reason:h,visible:g.visibility.isVisible,bounds:{x:Math.round(g.bounds.x),y:Math.round(g.bounds.y),w:Math.round(g.bounds.width),h:Math.round(g.bounds.height)}})}}return n.sort((o,a)=>a.score-o.score),_("search_dom",`${n.length} element(s) match "${t}"`,n.length,n,[],n.length>=i)},inventory_ctas:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('button, a[class*="btn"], a[class*="button"], input[type="submit"], [role="button"]')).slice(0,100)){const n=de(s);e.push({selector:n.bestSelector,tag:n.tag,text:n.text.slice(0,50),styleHint:(t=s.getAttribute("class"))==null?void 0:t.slice(0,60),primary:/primary|cta|submit|main/i.test(s.getAttribute("class")||"")||s.type==="submit",visible:n.visibility.isVisible})}return _("inventory_ctas",`${e.length} call-to-action element(s)`,e.length,e,[],!1)},detect_focus_traps:l=>{const e=[];for(const s of Array.from(l.querySelectorAll('[role="dialog"], [aria-modal="true"], dialog[open], .modal, [class*="modal"]')).slice(0,30)){const n=s.querySelectorAll('a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])');e.push({selector:O(s),kind:s.getAttribute("role")||s.tagName.toLowerCase(),ariaModal:s.getAttribute("aria-modal"),focusableCount:n.length,firstFocusable:n[0]?O(n[0]):void 0,note:n.length===0?"Modal container has NO focusable elements — keyboard users are trapped.":void 0})}const t=l.querySelectorAll("[tabindex]>0");for(const s of Array.from(t).slice(0,20))e.push({selector:O(s),kind:"positive-tabindex",note:`tabindex=${s.tabIndex} breaks natural tab order.`});return _("detect_focus_traps",`${e.length} focus-management issue(s)/container(s)`,e.length,e,[],!1)},infer_responsive_breakpoints:l=>{const e=l.defaultView,t=[],s=new Set;for(const o of Array.from(l.querySelectorAll("style"))){const a=o.textContent||"",c=/@media[^{]*?\(\s*(?:min|max)-width\s*:\s*(\d+)(?:\.\d+)?px/g;let u;for(;u=c.exec(a);)s.add(parseInt(u[1],10))}for(const o of Array.from(l.querySelectorAll('link[rel="stylesheet"]')).slice(0,10)){const a=o.getAttribute("href")||"";if(/^\d+px$/.test(a)||a.includes("width=")){const c=a.match(/width=(\d+)/);c&&s.add(parseInt(c[1],10))}}for(const o of Array.from(l.querySelectorAll("img[srcset], source[srcset]")).slice(0,50)){const a=o.getAttribute("srcset")||"";for(const c of a.matchAll(/(\d+)w/g))s.add(parseInt(c[1],10))}e!=null&&e.matchMedia||t.push("matchMedia unavailable — live breakpoint probing skipped.");const n=Array.from(s).sort((o,a)=>o-a),i=n.map(o=>({breakpoint:o,note:o<=768?"mobile-class":o<=1024?"tablet-class":"desktop-class"})),r=e==null?void 0:e.innerWidth;if(r){const o=n.filter(a=>a<=r);i.unshift({breakpoint:`current viewport: ${r}px`,note:o.length?`below breakpoints: ${o.join(", ")}`:"no declared breakpoint below current width"})}return _("infer_responsive_breakpoints",`${n.length} breakpoint(s) inferred from CSS/srcset`,i.length,i,t,!1)},get_selection_state:l=>{var i;const e=l.defaultView,t=(i=e==null?void 0:e.getSelection)==null?void 0:i.call(e),s=l.activeElement,n=[{hasSelection:!!(t!=null&&t.toString()),selectedText:(t==null?void 0:t.toString().slice(0,200))||"",selectionRanges:(t==null?void 0:t.rangeCount)||0,activeElement:s?{tag:s.tagName.toLowerCase(),selector:O(s),editable:s.isContentEditable||["INPUT","TEXTAREA"].includes(s.tagName)}:null}];return _("get_selection_state",t!=null&&t.toString()?`Selection: "${t.toString().slice(0,40)}…"`:"No text selection",1,n,[],!1)}};function Et(l,e,t){const s=Ce[l];return s?s(e,t):{analyzer:l,summary:`Unknown analyzer "${l}". Available: ${Object.keys(Ce).join(", ")}`,count:0,items:[],warnings:[],truncated:!1}}const vt=2e3;class wt{constructor(e=vt){b(this,"events",[]);b(this,"cap");b(this,"counter",0);this.cap=Math.max(10,e)}record(e,t,s={}){this.counter++;const n={eventId:`evt_${Date.now().toString(36)}_${this.counter}`,timestamp:Date.now(),kind:e,operationId:s.operationId,sessionId:s.sessionId,detail:t,data:s.data};return this.events.push(n),this.events.length>this.cap&&this.events.splice(0,this.events.length-this.cap),n}query(e){let t=this.events;e.kind&&(t=t.filter(n=>n.kind===e.kind)),e.operationId&&(t=t.filter(n=>n.operationId===e.operationId)),e.sinceTimestamp&&(t=t.filter(n=>n.timestamp>=e.sinceTimestamp));const s=e.limit&&e.limit>0?e.limit:200;return t.slice(-s)}size(){return this.events.length}toJSON(){return[...this.events]}}class St{constructor(){b(this,"counter",0);b(this,"operations",new Map)}begin(e){this.counter++;const t=`op_${Date.now().toString(36)}_${this.counter}`;return this.operations.set(t,{operationId:t,tool:e,startedAt:Date.now(),status:"RUNNING",timelineEventIds:[]}),t}end(e,t,s){const n=this.operations.get(e);n&&(n.endedAt=Date.now(),n.status=t,n.relatedError=s)}attachEvent(e,t){const s=this.operations.get(e);s&&s.timelineEventIds.push(t)}trace(e){const t=this.operations.get(e);return t?{...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}:null}recent(e=100){return Array.from(this.operations.values()).slice(-e).map(t=>({...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}))}}const Ie=100;class Tt{constructor(e){b(this,"sessionId");b(this,"timeline",new wt);b(this,"operations",new St);b(this,"tabs",new Map);b(this,"activeTabId",null);b(this,"startedAt",Date.now());b(this,"snapshots",[]);b(this,"commandHistory",[]);b(this,"annotationCount",0);b(this,"projectId");b(this,"tabCounter",0);b(this,"commandCounter",0);this.sessionId=e||`sess_${Date.now().toString(36)}`}registerTab(e,t,s){const n=e!==void 0?Array.from(this.tabs.values()).find(o=>o.browserTabId===e):void 0;if(n)return n.lastSeenAt=Date.now(),n.status="OPEN",n.url=t||n.url,n.title=s||n.title,n;this.tabCounter++;const i=`stab_${this.tabCounter}_${Date.now().toString(36)}`,r={sessionTabId:i,browserTabId:e,url:t,title:s,createdAt:Date.now(),lastSeenAt:Date.now(),status:"OPEN"};return this.tabs.set(i,r),this.timeline.record("TAB_OPENED",`tab ${i} registered (${t||"no url"})`,{sessionId:this.sessionId}),r}closeTab(e){const t=this.tabs.get(e);return t?(t.status="CLOSED",t.lastSeenAt=Date.now(),this.timeline.record("TAB_CLOSED",`tab ${e} closed`,{sessionId:this.sessionId}),!0):!1}switchTab(e){const t=this.tabs.get(e);return!t||t.status==="CLOSED"?!1:(this.activeTabId=e,this.timeline.record("TAB_SWITCHED",`active tab → ${e}`,{sessionId:this.sessionId}),!0)}getTabs(){return Array.from(this.tabs.values())}getActiveTab(){if(this.activeTabId){const e=this.tabs.get(this.activeTabId);if(e&&e.status==="OPEN")return e}return Array.from(this.tabs.values()).find(e=>e.status==="OPEN")||null}markAllStale(){let e=0;for(const t of this.tabs.values())t.status==="OPEN"&&(t.status="STALE",e++);return e}captureSnapshot(e,t,s){var a,c,u;const n=e.defaultView,i=((a=e.documentElement)==null?void 0:a.outerHTML)||"",r=e.querySelectorAll('a[href], button, input, select, textarea, [role="button"]').length,o={snapshotId:`snap_${Date.now().toString(36)}_${this.snapshots.length+1}`,timestamp:Date.now(),url:((c=n==null?void 0:n.location)==null?void 0:c.href)||((u=e.location)==null?void 0:u.href)||"",title:e.title||"",viewport:{width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0,scrollX:(n==null?void 0:n.scrollX)||0,scrollY:(n==null?void 0:n.scrollY)||0,devicePixelRatio:(n==null?void 0:n.devicePixelRatio)||1},domLength:i.length,domHash:be(i),interactiveCount:r,selectedRegions:[],extensionEnabled:t,pendingMutations:s,annotationCount:this.annotationCount};return this.snapshots.push(o),this.snapshots.length>Ie&&this.snapshots.splice(0,this.snapshots.length-Ie),this.timeline.record("SNAPSHOT_CREATED",`snapshot ${o.snapshotId} (dom ${o.domLength}b)`,{sessionId:this.sessionId}),o}getSnapshot(e){return e?this.snapshots.find(t=>t.snapshotId===e)||null:this.snapshots[this.snapshots.length-1]||null}listSnapshots(){return this.snapshots.map(e=>({snapshotId:e.snapshotId,timestamp:e.timestamp,url:e.url,title:e.title,domLength:e.domLength,domHash:e.domHash}))}compareSnapshots(e,t){const s=["url","title","domLength","domHash","interactiveCount","extensionEnabled","annotationCount"],n=[];for(const r of s)e[r]!==t[r]&&n.push({field:r,before:e[r],after:t[r]});(e.viewport.width!==t.viewport.width||e.viewport.height!==t.viewport.height)&&n.push({field:"viewport",before:`${e.viewport.width}x${e.viewport.height}`,after:`${t.viewport.width}x${t.viewport.height}`});const i=t.domLength-e.domLength;return{identical:n.length===0,changes:n,domDelta:{beforeLength:e.domLength,afterLength:t.domLength,delta:i},summary:n.length===0?"States are identical.":`${n.length} field(s) changed; DOM size ${i>=0?"+":""}${i} bytes.`}}recordCommand(e,t,s,n,i){this.commandCounter++;const r=`cmd_${this.commandCounter}_${Date.now().toString(36)}`;return this.commandHistory.push({commandId:r,tool:e,args:t,outcome:s,timestamp:Date.now(),durationMs:n,error:i}),this.timeline.record("COMMAND_EXECUTED",`${e} → ${s}${i?` (${i})`:""}`,{sessionId:this.sessionId,data:{commandId:r}}),r}getCommandHistory(e=100){return this.commandHistory.slice(-e)}noteAnnotations(e){this.annotationCount=e}bindProject(e){this.projectId=e}getProjectId(){return this.projectId}summary(e,t,s,n){var i,r,o;return{sessionId:this.sessionId,startedAt:this.startedAt,url:((r=(i=e.defaultView)==null?void 0:i.location)==null?void 0:r.href)||((o=e.location)==null?void 0:o.href)||"",title:e.title||"",tabs:this.getTabs(),activeTabId:this.activeTabId,viewport:{width:t.width,height:t.height,isModified:t.isModified},extensionEnabled:s,snapshotCount:this.snapshots.length,commandCount:this.commandHistory.length,annotationCount:this.annotationCount,mutationHistoryCount:n.length,timelineEventCount:this.timeline.size(),projectId:this.projectId}}}const Ct=l=>{var e,t;try{const s=l.getBoundingClientRect();if(s.width===0&&s.height===0)return null;const n=((t=(e=l.ownerDocument)==null?void 0:e.defaultView)==null?void 0:t.innerWidth)||1920;return s.yn*1.5?"bottom":s.xn*.8?"right":"center"}catch{return null}},It={navigation:"navigation",banner:"header",contentinfo:"footer",complementary:"sidebar",main:"main",form:"form",search:"search",region:"section",dialog:"modal",alertdialog:"modal",table:"table",list:"list",combobox:"dropdown",button:"button",link:"link",textbox:"input",checkbox:"checkbox",radio:"radio",img:"image",article:"article"},At={nav:"navigation",header:"header",footer:"footer",aside:"sidebar",main:"main",section:"section",article:"article",form:"form",table:"table",ul:"list",ol:"list",figure:"figure",dialog:"modal",button:"button",input:"input",select:"dropdown",textarea:"textarea",canvas:"canvas",video:"video",img:"image",h1:"heading",h2:"heading",h3:"heading"};function Z(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").replace(/_{2,}/g,"_").slice(0,48).replace(/_$/,"")}class xt{generate(e){return this.generateFromMeta({tagName:e.tagName.toLowerCase(),role:e.getAttribute("role")||void 0,text:q(e).trim(),ariaLabel:e.getAttribute("aria-label")||void 0,stableClass:Array.from(e.classList||[]).find(t=>/^[a-z][a-z0-9-]{2,}$/i.test(t)&&!_t.has(t)),position:Ct(e),nearbyHeading:this.nearbyHeading(e)})}generateFromMeta(e){const t=[],s=[],n=e.role||Nt(e.tagName);if(n){const r=It[n]||n;s.push(r),t.push(`role=${n}`)}else{const r=At[e.tagName]||e.tagName;s.push(r),t.push(`tag=${e.tagName}`)}if(e.ariaLabel&&(s.unshift(Z(e.ariaLabel)),t.push(`aria-label="${e.ariaLabel.slice(0,30)}"`)),e.text&&e.text.length<=40){const r=Z(e.text.split(/\s+/).slice(0,3).join(" "));r&&r.length>=2&&(s.push(r),t.push(`text="${e.text.slice(0,30)}"`))}if(e.nearbyHeading){const r=Z(e.nearbyHeading.split(/\s+/).slice(0,3).join(" "));r&&!s.includes(r)&&(s.push(r),t.push(`nearby-heading="${e.nearbyHeading.slice(0,30)}"`))}e.stableClass&&s.length<3&&(s.push(Z(e.stableClass)),t.push(`class=${e.stableClass}`)),e.tagName==="input"&&(s.some(r=>r.includes("input"))||(s.push("input"),t.push("tag=input"))),s.join("_").length<12&&e.position&&(s.push(e.position),t.push(`position=${e.position}`));let i=Z(s.join("_"))||"unnamed_region";return/^\d/.test(i)&&(i=`el_${i}`),{name:i,evidence:t}}nearbyHeading(e){let t=e.parentElement;for(let n=0;t&&n<4;n++){const i=t.querySelector('h1, h2, h3, h4, [role="heading"]');if(i)return q(i).trim().slice(0,40)||null;t=t.parentElement}let s=e.previousElementSibling;for(let n=0;s&&n<4;n++){if(/^H[1-4]$/.test(s.tagName)){const i=q(s).trim();if(i)return i.slice(0,40)}s=s.previousElementSibling}return null}}const _t=new Set(["active","open","visible","hidden","selected","disabled","container","wrapper","root","item","col","row","flex","box","main","div","span","block"]);function Nt(l){switch(l){case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"aside":return"complementary";case"main":return"main";case"form":return"form";case"table":return"table";case"button":return"button";case"a":return"link";case"input":return"textbox";case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";default:return null}}const kt=["display","position","flex-direction","grid-template-columns","width","height","background-color","color","font-size","border-radius","overflow"];class Mt{constructor(){b(this,"naming",new xt)}capture(e){const t=e.ownerDocument,s=new Y(t),n=new te,i=s.generateCandidates(e),r=s.bestSelector(e),o=n.fingerprint(e);let a=e,c=0,u="self";for(let d=0;d<3;d++){const f=a.parentElement;if(!f||f===t.body||f===t.documentElement)break;if(this.isMeaningfulContainer(f)){a=f,c=d+1,u="meaningful-ancestor";break}a=f,c=d+1}if(a===e){const d=e.parentElement;d&&d!==t.body&&e.querySelectorAll("*").length<4&&(a=d,c=1,u="direct-parent-fallback")}const h=this.boundedHtml(e,6e4),g=this.boundedHtml(a,12e4);k.inspectElement(e);const p=e.getBoundingClientRect(),y=t.defaultView,v={};if(y!=null&&y.getComputedStyle){const d=y.getComputedStyle(e);for(const f of kt){const w=d.getPropertyValue(f);w&&w!=="none"&&w!=="auto"&&(v[f]=w)}}const m=e.parentElement;return{regionHtml:h,contextHtml:g,boundary:{strategy:u,ancestorLevels:c,note:c===0?"Region captured standalone (no meaningful ancestor within 3 levels).":`Context includes ${c} ancestor level(s) up to a meaningful container.`},selectorCandidates:i,bestSelector:r.selector,xpath:s.buildXPath(e),fingerprintHash:o.hash,dimensions:{width:Math.round(p.width),height:Math.round(p.height)},position:{x:Math.round(p.x),y:Math.round(p.y)},relevantStyles:v,parentInfo:m?{tag:m.tagName.toLowerCase(),selector:Rt(m),text:q(m).slice(0,60)}:void 0,childrenCount:e.children.length,childTags:Array.from(e.children).slice(0,12).map(d=>d.tagName.toLowerCase()),nameHint:this.naming.generate(e),fingerprintVolatility:o.volatilityRisk,volatilityReasons:o.volatilityReasons}}isMeaningfulContainer(e){const t=e.tagName.toLowerCase();if(["section","article","aside","main","nav","header","footer","form"].includes(t)||e.hasAttribute("id")||e.hasAttribute("data-testid")||e.getAttribute("role")||e.children.length>1&&e.querySelector(":scope > *:nth-child(3)"))return!0;const s=e.getAttribute("style")||"";return!!(s.includes("grid")||s.includes("flex"))}boundedHtml(e,t){const s=e.outerHTML;return s.length<=t?s:s.slice(0,t)+` +`}}function Rt(l){try{return new Y(l.ownerDocument).bestSelector(l).selector}catch{return l.tagName.toLowerCase()}}class Ot{constructor(e){b(this,"nodeRegistry");b(this,"snapshotEngine");b(this,"picker");b(this,"interactionEngine");b(this,"observer");b(this,"mutationEngines",new WeakMap);b(this,"viewportControllers",new WeakMap);b(this,"targetingEngines",new WeakMap);b(this,"jsEngine",new Fe);b(this,"fingerprintEngine",new te);b(this,"humanInteraction",new it);b(this,"session",new Tt);b(this,"simulationTabs",[]);b(this,"simulationTabCounter",0);b(this,"simulationExtensions",[{id:"teledom@teledom",name:"TeleDOM Browser Intelligence Platform",version:"4.1.0",description:"The TeleDOM platform extension itself",enabled:!0,installType:"development",isApp:!1}]);b(this,"regionCapture",new Mt);this.nodeRegistry=e||new H;const t=new J,s=new ne;this.snapshotEngine=new he(this.nodeRegistry,t,s),this.picker=new Pe({nodeRegistry:this.nodeRegistry}),this.interactionEngine=new Le(this.nodeRegistry),this.observer=new qe(this.nodeRegistry),this.picker.initGlobalShortcutListener(),this.interactionEngine.setTimingHook(async n=>{const i=this.humanInteraction.delay(n);i>0&&await new Promise(r=>setTimeout(r,i))})}getMutationEngine(e){let t=this.mutationEngines.get(e);return t||(t=new Ue(e,this.nodeRegistry),this.mutationEngines.set(e,t)),t}getViewportController(e){let t=this.viewportControllers.get(e);return t||(t=new Be(e),this.viewportControllers.set(e,t)),t}getTargetingEngine(e){let t=this.targetingEngines.get(e);return t||(t=new tt(e,this.nodeRegistry),this.targetingEngines.set(e,t)),t}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}getPicker(){return this.picker}getInteractionEngine(){return this.interactionEngine}getObserver(){return this.observer}getNodeRegistry(){return this.nodeRegistry}async handleCommand(e,t=typeof document<"u"?document:{}){var o,a,c,u,h,g,p,y,v;const s=Date.now(),{id:n,command:i,payload:r}=e;try{switch(i){case"LIVE_PAGE_INSPECT":{const m=k.inspectPage(t);return this.success(n,i,m,s)}case"LIVE_ELEMENT_INSPECT":{const m=this.resolveTarget(r,t),d=k.inspectElement(m,this.nodeRegistry);return this.success(n,i,d,s)}case"GET_SELECTED_ELEMENT":{const m=this.picker.getLastSelectedElement();return this.success(n,i,m,s)}case"ELEMENT_PICKER_START":return this.picker.startPicker(),this.success(n,i,{pickerActive:!0},s);case"ELEMENT_PICKER_STOP":return this.picker.stopPicker(),this.success(n,i,{pickerActive:!1},s);case"LIVE_ELEMENT_INTERACT":{const m=r,d=await this.interactionEngine.interact(m,t);return this.success(n,i,d,s)}case"ELEMENT_OBSERVATION_START":{const m=this.resolveTarget(r,t),d=this.observer.startObservation(m,t);return this.success(n,i,d,s)}case"ELEMENT_OBSERVATION_STOP":{const m=this.observer.stopObservation(t);return this.success(n,i,m,s)}case"LIVE_DOM_SNAPSHOT":{if(((r==null?void 0:r.format)||"html")==="html"){const f=((o=t.documentElement)==null?void 0:o.outerHTML)||"";return this.success(n,i,{html:f},s)}const d=this.snapshotEngine.captureSnapshot(t,"live_session");return this.success(n,i,d,s)}case"LIVE_DOM_SUBTREE":{const m=this.resolveTarget(r,t),d=m.outerHTML||"",f=k.inspectElement(m,this.nodeRegistry);return this.success(n,i,{html:d,element:f},s)}case"GET_ELEMENT_VISUAL_STATE":{const m=this.resolveTarget(r,t),d=k.inspectVisualState(m);return this.success(n,i,d,s)}case"LIVE_PAGE_SCREENSHOT":case"LIVE_ELEMENT_SCREENSHOT":{const m=await this.handleScreenshotCapture(i,r,t);return this.success(n,i,m,s)}case"GET_TAB_CONSOLE_LOGS":{const{level:m,searchQuery:d,limit:f=100,clearAfterRead:w}=r||{};let E=typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__||[];if(m&&m!=="all"&&(E=E.filter(S=>S.level===m)),d){const S=String(d).toLowerCase();E=E.filter(T=>{var x,N;return((x=T.text)==null?void 0:x.toLowerCase().includes(S))||((N=T.source)==null?void 0:N.toLowerCase().includes(S))})}return f>0&&(E=E.slice(-f)),w&&typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__&&(window.__FORENSIC_CONSOLE_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((a=window.__FORENSIC_CONSOLE_BUFFER__)==null?void 0:a.length)||E.length,returnedCount:E.length,logs:E},s)}case"GET_TAB_NETWORK_REQUESTS":{const{method:m,searchQuery:d,status:f,onlyErrors:w,limit:E=100,clearAfterRead:S}=r||{};let T=typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__||[];if(m&&(T=T.filter(x=>{var N;return((N=x.method)==null?void 0:N.toUpperCase())===String(m).toUpperCase()})),f&&(T=T.filter(x=>x.status===Number(f))),w&&(T=T.filter(x=>x.error||x.status&&x.status>=400)),d){const x=String(d).toLowerCase();T=T.filter(N=>{var D;return(D=N.url)==null?void 0:D.toLowerCase().includes(x)})}return E>0&&(T=T.slice(-E)),S&&typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__&&(window.__FORENSIC_NETWORK_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((c=window.__FORENSIC_NETWORK_BUFFER__)==null?void 0:c.length)||T.length,returnedCount:T.length,requests:T},s)}case"CLOSE_TAB":{if(typeof globalThis.chrome<"u"&&((u=globalThis.chrome.runtime)!=null&&u.sendMessage)){const m=await new Promise(d=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},f=>d(f))});if(m)return m}return this.isSimulation()?this.simulationCloseTab(r,t,n,i,s):typeof window<"u"?(setTimeout(()=>window.close(),100),this.success(n,i,{closed:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{closed:!0},s)}case"RELOAD_TAB":{if(typeof globalThis.chrome<"u"&&((h=globalThis.chrome.runtime)!=null&&h.sendMessage)){const m=await new Promise(d=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},f=>d(f))});if(m)return m}if(this.isSimulation()){const m=(r==null?void 0:r.mode)||"soft";return this.session.timeline.record("NAVIGATED",`tab reloaded (${m} mode)`),this.success(n,i,{reloaded:!0,mode:m,simulated:!0,url:((p=(g=t.defaultView)==null?void 0:g.location)==null?void 0:p.href)||"",title:t.title,note:"Node simulation context: DOM fixture retained; no real navigation occurs."},s)}return typeof window<"u"?(setTimeout(()=>window.location.reload(),100),this.success(n,i,{reloaded:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{reloaded:!0},s)}case"OPEN_TAB":case"LIST_TABS":case"FOCUS_TAB":case"LIST_EXTENSIONS":case"RELOAD_EXTENSION":case"SET_EXTENSION_ENABLED":case"TOGGLE_EXTENSION":{if(this.isSimulation())return this.handleSimulationBackgroundCommand(n,i,r,t,s);if(typeof globalThis.chrome<"u"&&((y=globalThis.chrome.runtime)!=null&&y.sendMessage)){const m=await new Promise(d=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},f=>d(f))});if(m)return m}return this.error(n,i,"BACKGROUND_EXECUTION_FAILED",`Command ${i} requires Chrome extension runtime`,s)}case"RESIZE_VIEWPORT":{const m=this.getViewportController(t);let d;if(r!=null&&r.preset)d=m.applyPreset(r.preset);else{const f=Number(r==null?void 0:r.width)||1280,w=Number(r==null?void 0:r.height)||800;d=m.resize(f,w)}return this.session.timeline.record("RESIZED",`viewport → ${d.applied.width}x${d.applied.height}`),this.success(n,i,d,s)}case"RESET_VIEWPORT":{const d=this.getViewportController(t).reset();return this.session.timeline.record("RESIZED",`viewport restored to ${d.applied.width}x${d.applied.height}`),this.success(n,i,d,s)}case"GET_VIEWPORT_STATE":{const m=this.getViewportController(t);return this.success(n,i,m.state(),s)}case"RUN_RESPONSIVE_TEST":{const m=this.getViewportController(t),d=(r==null?void 0:r.sizes)||Pt(),f=m.runResponsiveTest(d,{restore:(r==null?void 0:r.restore)!==!1});return this.success(n,i,f,s)}case"EMULATE_DEVICE":{const d=this.getViewportController(t).emulateDevice((r==null?void 0:r.device)||"pixel-7");return this.success(n,i,d,s)}case"EXECUTE_JS":case"EXECUTE_JS_AND_CAPTURE_CHANGES":{const m=String((r==null?void 0:r.code)||"");if(!m.trim())return this.error(n,i,"SCRIPT_EMPTY","payload.code is required.",s);const d=await this.jsEngine.execute(t,m,{timeoutMs:r==null?void 0:r.timeoutMs,world:(r==null?void 0:r.world)==="MAIN"?"MAIN":"ISOLATED"});return this.session.timeline.record("SCRIPT_EXECUTED",`${d.status} (${d.durationMs}ms)`),this.success(n,i,d,s)}case"DOM_MUTATE":{const d=this.getMutationEngine(t).mutate(r);return this.session.timeline.record("DOM_MUTATED",`${d.operation} on ${d.before.selector} → ${d.success?"OK":d.error}`),this.success(n,i,d,s)}case"DOM_MUTATE_TRANSACTION":{const m=this.getMutationEngine(t),d=(r==null?void 0:r.mode)||"begin";try{if(d==="begin"){const f=m.beginTransaction();return this.success(n,i,{transactionId:f,mode:d,open:!0},s)}if(d==="commit"){const f=m.commitTransaction();return this.session.timeline.record("DOM_MUTATED",`transaction ${f.transactionId} committed (${f.steps.length} steps)`),this.success(n,i,{...f,mode:d},s)}if(d==="rollback"){const f=m.rollbackTransaction(r==null?void 0:r.reason);return this.session.timeline.record("MUTATION_UNDONE",`transaction ${f.transactionId} rolled back`),this.success(n,i,{...f,mode:d},s)}return this.error(n,i,"INVALID_MODE",`mode must be begin|commit|rollback, got "${d}"`,s)}catch(f){return this.error(n,i,"DOM_MUTATION_FAILED",f.message,s)}}case"UNDO_DOM_MUTATION":{const d=this.getMutationEngine(t).undo();return d.success&&this.session.timeline.record("MUTATION_UNDONE",d.message),this.success(n,i,d,s)}case"REDO_DOM_MUTATION":{const d=this.getMutationEngine(t).redo();return d.success&&this.session.timeline.record("MUTATION_REDONE",d.message),this.success(n,i,d,s)}case"GET_MUTATION_HISTORY":{const m=this.getMutationEngine(t);return this.success(n,i,{entries:m.getHistory((r==null?void 0:r.limit)||100),undoDepth:m.getUndoDepth(),redoDepth:m.getRedoDepth(),openTransactionId:m.getOpenTransactionId()},s)}case"PREVIEW_DOM_MUTATION":{const d=this.getMutationEngine(t).preview(r);return this.success(n,i,d,s)}case"GENERATE_ELEMENT_TARGET":{const d=this.getTargetingEngine(t).resolveAndBuild((r==null?void 0:r.target)||(r==null?void 0:r.selector)||"");return"error"in d?this.error(n,i,"TARGET_NOT_FOUND",d.error,s):this.success(n,i,d.target,s)}case"RECOVER_SELECTOR":{const m=new nt(t),d=(r==null?void 0:r.snapshot)||{},f=m.recover((r==null?void 0:r.selector)||"",d);return this.success(n,i,f,s)}case"GET_ELEMENT_ANCESTRY":{const m=this.resolveTarget(r,t);return this.success(n,i,Lt(m,t),s)}case"GET_ELEMENT_FINGERPRINT":{const m=this.resolveTarget(r,t),d=this.fingerprintEngine.fingerprint(m);return this.success(n,i,d,s)}case"GET_ELEMENT_RELATIONSHIPS":{const m=this.resolveTarget(r,t);return this.success(n,i,Dt(m,t),s)}case"GET_ELEMENT_ACCESSIBILITY":{const m=this.resolveTarget(r,t);return this.success(n,i,$t(m),s)}case"GET_COMPUTED_STYLE":{const m=this.resolveTarget(r,t),d=t.defaultView;if(!(d!=null&&d.getComputedStyle))return this.error(n,i,"STYLE_UNAVAILABLE","getComputedStyle is unavailable in this context.",s);const f=d.getComputedStyle(m),w=Array.isArray(r==null?void 0:r.properties)&&r.properties.length?r.properties:["display","position","color","background-color","font-size","font-family","width","height","margin","padding","border","z-index","opacity","visibility","overflow","flex-direction","grid-template-columns"],E={};for(const S of w)E[S]=f.getPropertyValue(S);return this.success(n,i,{selector:k.inspectElement(m,this.nodeRegistry).bestSelector,styles:E},s)}case"ANALYZE_DOM":{const m=String((r==null?void 0:r.analyzer)||"");if(!m)return this.error(n,i,"ANALYZER_REQUIRED",'payload.analyzer is required (e.g. "analyze_forms").',s);const d=Et(m,t,r);return d.count===0&&d.warnings.length===0&&d.items.length===0&&d.summary.startsWith("Unknown analyzer")?this.error(n,i,"UNKNOWN_ANALYZER",d.summary,s):this.success(n,i,d,s)}case"DRAG_ELEMENT":{const m=this.resolveTarget(r==null?void 0:r.source,t),d=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):null,f=await this.performDrag(m,d,r==null?void 0:r.offsets,t);return this.success(n,i,f,s)}case"SET_INPUT_CHECKED":{const d=this.resolveTarget(r,t);if(d.type!=="checkbox"&&d.type!=="radio")return this.error(n,i,"INPUT_TYPE_UNSUPPORTED",`Target input type "${d.type}" is not checkbox/radio.`,s);const f=d.checked;d.checked=(r==null?void 0:r.checked)!==!1;const w=[];for(const E of["input","change"])try{d.dispatchEvent(new t.defaultView.Event(E,{bubbles:!0})),w.push(E)}catch{}if(d.type==="radio"&&d.name)for(const E of Array.from(t.querySelectorAll(`input[type=radio][name="${d.name}"]`)))E!==d&&(E.checked=!1);return this.success(n,i,{success:!0,selector:k.inspectElement(d,this.nodeRegistry).bestSelector,inputType:d.type,checkedBefore:f,checkedAfter:d.checked,eventsFired:w},s)}case"PRESS_KEYBOARD_SHORTCUT":{const m=Array.isArray(r==null?void 0:r.keys)?r.keys:String((r==null?void 0:r.keys)||"Enter").split("+"),d=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):t.activeElement||t.body;typeof d.focus=="function"&&d.focus();const f=[],w=t.defaultView;for(const E of m)for(const S of["keydown","keyup"])try{d.dispatchEvent(new((w==null?void 0:w.KeyboardEvent)||KeyboardEvent)(S,{key:E.trim(),bubbles:!0,cancelable:!0,ctrlKey:m.some(T=>/^(ctrl|control|cmd|meta)$/i.test(T))&&E!==m.find(T=>/^(ctrl|control|cmd|meta)$/i.test(T)),shiftKey:m.some(T=>/^shift$/i.test(T))&&E!=="Shift",altKey:m.some(T=>/^alt$/i.test(T))&&E!=="Alt"})),f.push(`${S}:${E}`)}catch{}return this.success(n,i,{success:!0,keys:m,targetSelector:k.inspectElement(d,this.nodeRegistry).bestSelector,eventsFired:f},s)}case"SCROLL_PAGE":{const m=t.defaultView;if(!m)return this.error(n,i,"NO_WINDOW","No window available for scrolling.",s);const d={x:m.scrollX||0,y:m.scrollY||0};let f;if(r!=null&&r.target||r!=null&&r.selector){const E=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t);(v=E.scrollIntoView)==null||v.call(E,{behavior:(r==null?void 0:r.behavior)||"auto",block:"center"}),f=k.inspectElement(E,this.nodeRegistry).bestSelector}else m.scrollBy(Number(r==null?void 0:r.x)||0,Number(r==null?void 0:r.y)||0);const w={x:m.scrollX||0,y:m.scrollY||0};return this.success(n,i,{success:!0,scrollBefore:d,scrollAfter:w,requested:{x:Number(r==null?void 0:r.x)||0,y:Number(r==null?void 0:r.y)||0},targetSelector:f},s)}case"WAIT_FOR_CONDITION":return await this.waitForCondition(t,r||{},s,n,i);case"GET_PAGE_STATE":case"CAPTURE_PAGE_STATE":{const m=this.session.captureSnapshot(t,!0,this.getMutationEngine(t).getUndoDepth());return this.success(n,i,m,s)}case"CAPTURE_REGION":{const m=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t),d=this.regionCapture.capture(m);return this.success(n,i,d,s)}case"GET_SIMULATION_TAB_STATE":return this.isSimulation()?this.success(n,i,{simulated:!0,tabs:this.simulationTabs,sessionSummary:this.session.getTabs()},s):this.error(n,i,"NOT_SIMULATION","Simulation tab state is only available in the Node simulation context.",s);default:return this.error(n,i,"UNKNOWN_COMMAND",`Unsupported command '${i}'`,s)}}catch(m){return this.error(n,i,"COMMAND_EXECUTION_FAILED",m.message,s,m.details)}}resolveTarget(e,t){if(!e)throw new Error("Target specifier must be provided");return typeof e=="string"?this.interactionEngine.resolveTarget({selector:e},t):typeof e=="number"?this.interactionEngine.resolveTarget({nodeId:e},t):this.interactionEngine.resolveTarget(e,t)}async performDrag(e,t,s,n){const i=n.defaultView,r=[],o=(p,y,v={})=>{try{const m=(i==null?void 0:i.MouseEvent)||(typeof MouseEvent<"u"?MouseEvent:null);m&&(p.dispatchEvent(new m(y,{bubbles:!0,cancelable:!0,...v})),r.push(y))}catch{}},a=e.getBoundingClientRect(),c=a.x+a.width/2,u=a.y+a.height/2;let h=c+((s==null?void 0:s.x)||0),g=u+((s==null?void 0:s.y)||0);if(t){const p=t.getBoundingClientRect();h=p.x+p.width/2,g=p.y+p.height/2}return o(e,"pointerdown",{button:1,clientX:c,clientY:u}),o(e,"mousedown",{button:1,clientX:c,clientY:u}),o(e,"dragstart",{clientX:c,clientY:u}),t&&(o(t,"dragenter",{clientX:h,clientY:g}),o(t,"dragover",{clientX:h,clientY:g}),o(t,"drop",{clientX:h,clientY:g})),o(e,"dragend",{clientX:h,clientY:g}),o(e,"pointerup",{button:1,clientX:h,clientY:g}),o(e,"mouseup",{button:1,clientX:h,clientY:g}),{success:r.length>0,sourceSelector:k.inspectElement(e,this.nodeRegistry).bestSelector,targetSelector:t?k.inspectElement(t,this.nodeRegistry).bestSelector:"(offset drop)",eventsFired:r,finalPosition:{x:Math.round(h),y:Math.round(g)},html5DndUsed:r.includes("dragstart")}}async waitForCondition(e,t,s,n,i){var p,y;const r=t.kind||"dom_stable",o=Math.min(Math.max(Number(t.timeoutMs)||5e3,100),3e4),a=Math.min(Math.max(Number(t.pollIntervalMs)||100,20),1e3),c=Date.now(),u=()=>{var v,m,d,f,w;switch(r){case"dom_stable":return{satisfied:!0,detail:`dom length ${((v=e.documentElement)==null?void 0:v.outerHTML.length)||0}`};case"selector_present":{const E=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:E>0,detail:`"${t.selector}" matches ${E} element(s)`}}case"selector_visible":{if(!t.selector)return{satisfied:!1,detail:"no selector supplied"};const E=e.querySelector(t.selector);if(!E)return{satisfied:!1,detail:`"${t.selector}" not present`};try{const S=k.inspectElement(E).visibility.isVisible;return{satisfied:S,detail:`visibility=${S}`}}catch{return{satisfied:!1,detail:"inspection failed"}}}case"selector_absent":{const E=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:E===0,detail:`"${t.selector}" matches ${E} element(s)`}}case"text_present":{const E=((m=e.body)==null?void 0:m.innerText)||((d=e.body)==null?void 0:d.textContent)||"",S=t.text?E.includes(String(t.text)):!1;return{satisfied:S,detail:`text "${String(t.text).slice(0,30)}" ${S?"found":"not found"}`}}case"url_contains":{const E=((w=(f=e.defaultView)==null?void 0:f.location)==null?void 0:w.href)||"";return{satisfied:t.text?E.includes(String(t.text)):!1,detail:E}}case"element_count":{const E=t.selector?e.querySelectorAll(t.selector).length:0,S=Number(t.count)||0;return{satisfied:E===S,detail:`${E}/${S} elements`}}case"readiness_state":return{satisfied:e.readyState===(t.state||"complete"),detail:`readyState=${e.readyState}`};default:return{satisfied:!1,detail:`unknown condition kind "${r}"`}}};if(r==="dom_stable"){let v=((p=e.documentElement)==null?void 0:p.outerHTML.length)||0,m=!1,d=0;for(;Date.now()-csetTimeout(E,a));const w=((y=e.documentElement)==null?void 0:y.outerHTML.length)||0;if(d++,w===v){m=!0;break}v=w}const f=Date.now()-c;return m&&this.session.timeline.record("WAIT_SATISFIED",`dom_stable after ${f}ms (${d} polls)`),this.success(n,i,{satisfied:m,condition:r,waitedMs:f,timeoutMs:o,detail:`dom length ${v}, ${d} polls`},s)}let h=u();for(;!h.satisfied&&Date.now()-csetTimeout(v,a)),h=u();const g=Date.now()-c;return h.satisfied&&this.session.timeline.record("WAIT_SATISFIED",`${r} after ${g}ms`),this.success(n,i,{satisfied:h.satisfied,condition:r,waitedMs:g,timeoutMs:o,detail:h.detail},s)}simulationCloseTab(e,t,s,n,i){const r=Number(e==null?void 0:e.tabId),o=Number.isFinite(r)?this.simulationTabs.findIndex(c=>c.browserTabId===r):this.simulationTabs.findIndex(c=>c.active);if(o<0)return this.error(s,n,"TAB_NOT_FOUND",`No simulated tab matches tabId=${r}`,i);const a=this.simulationTabs.splice(o,1)[0];return this.session.closeTab(a.sessionTabId),a.active&&this.simulationTabs.length&&(this.simulationTabs[0].active=!0,this.session.switchTab(this.simulationTabs[0].sessionTabId)),this.success(s,n,{closed:!0,closedTab:{id:a.browserTabId,url:a.url,title:a.title},simulated:!0,remaining:this.simulationTabs.length},i)}handleSimulationBackgroundCommand(e,t,s,n,i){const r=()=>{var o,a;if(!this.simulationTabs.length){this.simulationTabCounter++;const c={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:((a=(o=n.defaultView)==null?void 0:o.location)==null?void 0:a.href)||"about:blank",title:n.title||"Simulated Tab",active:!0,createdAt:Date.now()};this.simulationTabs.push(c),this.session.registerTab(c.browserTabId,c.url,c.title),this.session.switchTab(c.sessionTabId)}};switch(t){case"LIST_TABS":return r(),this.success(e,t,{simulated:!0,environment:"node-simulation",tabs:this.simulationTabs.map((o,a)=>({id:o.browserTabId,index:a,windowId:1,title:o.title,url:o.url,active:o.active,status:"complete",pinned:!1,audited:!1})),note:"Deterministic simulated tab state — a real browser tab list requires the Chrome extension connection."},i);case"OPEN_TAB":{const o=String((s==null?void 0:s.url)||"about:blank");this.simulationTabCounter++;const a={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:o,title:(s==null?void 0:s.title)||`Simulated Tab ${this.simulationTabCounter}`,active:!0,createdAt:Date.now()};this.simulationTabs.forEach(u=>u.active=!1),this.simulationTabs.push(a);const c=this.session.registerTab(a.browserTabId,o,a.title);return this.session.switchTab(c.sessionTabId),this.session.timeline.record("TAB_OPENED",`simulation tab ${a.browserTabId} → ${o}`),this.success(e,t,{opened:!0,tabId:a.browserTabId,url:o,simulated:!0,totalTabs:this.simulationTabs.length},i)}case"FOCUS_TAB":{r();const o=Number(s==null?void 0:s.tabId),a=this.simulationTabs.find(c=>c.browserTabId===o)||this.simulationTabs[0];return a?(this.simulationTabs.forEach(c=>c.active=!1),a.active=!0,this.session.switchTab(a.sessionTabId),this.session.timeline.record("TAB_SWITCHED",`simulation tab ${a.browserTabId} focused`),this.success(e,t,{focused:!0,tabId:a.browserTabId,url:a.url,simulated:!0},i)):this.error(e,t,"TAB_NOT_FOUND",`No simulated tab with tabId=${o}`,i)}case"LIST_EXTENSIONS":return this.success(e,t,{simulated:!0,extensions:this.simulationExtensions.map(o=>({...o,permissions:["activeTab","scripting","storage","tabs","management"]})),note:"Deterministic simulated extension state."},i);case"SET_EXTENSION_ENABLED":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!!(s!=null&&s.enabled),this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}". Known: ${this.simulationExtensions.map(c=>c.id).join(", ")}`,i)}case"TOGGLE_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!a.enabled,this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}case"RELOAD_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||this.simulationExtensions[0].id),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?this.success(e,t,{reloaded:!0,extensionId:a.id,simulated:!0,note:"Simulated reload: extension state preserved."},i):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}default:return this.error(e,t,"UNKNOWN_COMMAND",`Unhandled simulation command '${t}'`,i)}}async handleScreenshotCapture(e,t,s){var y,v,m,d,f;const n=s.defaultView||(typeof window<"u"?window:{}),i=Date.now(),r=`scr_${i}_${Math.random().toString(36).slice(2,6)}`,o=n.devicePixelRatio||1,a={width:n.innerWidth||((y=s.documentElement)==null?void 0:y.clientWidth)||1920,height:n.innerHeight||((v=s.documentElement)==null?void 0:v.clientHeight)||1080,scrollX:n.scrollX||n.pageXOffset||0,scrollY:n.scrollY||n.pageYOffset||0,devicePixelRatio:o};let c,u,h,g={width:a.width,height:a.height};if(e==="LIVE_ELEMENT_SCREENSHOT"){const w=this.resolveTarget(t,s),E=k.inspectElement(w,this.nodeRegistry);c=E.bestSelector,u=((m=E.forensics)==null?void 0:m.logicalNodeId)||void 0,h={x:E.bounds.x,y:E.bounds.y,width:E.bounds.width,height:E.bounds.height},g={width:Math.max(1,Math.round(E.bounds.width*o)),height:Math.max(1,Math.round(E.bounds.height*o))}}let p=(t==null?void 0:t.dataUrl)||"";if(e==="LIVE_ELEMENT_SCREENSHOT"&&p&&h&&typeof Image<"u")try{const w=await new Promise(E=>{const S=new Image;S.onload=()=>{try{const T=s.createElement("canvas"),x=Math.max(0,Math.floor(h.x*o)),N=Math.max(0,Math.floor(h.y*o)),D=Math.max(1,Math.floor(h.width*o)),M=Math.max(1,Math.floor(h.height*o));T.width=D,T.height=M;const L=T.getContext("2d");if(L){L.drawImage(S,x,N,D,M,0,0,D,M),E(T.toDataURL("image/png"));return}}catch{}E(p)},S.onerror=()=>E(p),S.src=p});w&&(p=w)}catch{}if(!p){const w=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(120,g.width||320):Math.max(800,a.width||1280),E=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(60,g.height||180):Math.max(600,a.height||800);p=ge.createDataUrl({width:w,height:E,backgroundColor:e==="LIVE_ELEMENT_SCREENSHOT"?[30,41,59,255]:[15,23,42,255],headerColor:[56,189,248,255],borderColor:[99,102,241,255],label:c||(e==="LIVE_ELEMENT_SCREENSHOT"?"Element Screenshot":"Page Screenshot")})}return{screenshotId:r,timestamp:i,url:((d=n.location)==null?void 0:d.href)||((f=s.location)==null?void 0:f.href)||"",viewport:a,targetSelector:c,targetNodeId:u,targetBounds:h,dataUrl:p,imageFormat:"png",dimensions:g,captureType:e==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}}success(e,t,s,n){return{id:e,command:t,success:!0,data:s,timestamp:Date.now(),durationMs:Date.now()-n}}error(e,t,s,n,i,r){return{id:e,command:t,success:!1,error:{code:s,message:n,details:r},timestamp:Date.now(),durationMs:Date.now()-i}}}function Lt(l,e){const t=[];let s=l.parentElement,n=1;for(;s&&n<=10;){const h=s.parentElement,g=h?Array.from(h.children).filter(p=>p.tagName===s.tagName):[];t.push({tag:s.tagName.toLowerCase(),selector:U(s),role:s.getAttribute("role")||void 0,text:B(s).slice(0,40),childIndex:g.length?g.indexOf(s)+1:1,siblingCount:h?Array.from(h.children).length:0,distance:n}),s=s.parentElement,n++}const i=l.parentElement,r=[];if(i){const h=Array.from(i.children),g=h.indexOf(l);for(let p=g-1;p>=0&&p>=g-5;p--)r.push({tag:h[p].tagName.toLowerCase(),selector:U(h[p]),role:h[p].getAttribute("role")||void 0,text:B(h[p]).slice(0,30),position:"before",distance:g-p});for(let p=g+1;p{o=Math.max(o,g);for(const p of Array.from(h.children))a.push(p.tagName.toLowerCase()),p.matches('a[href], button, input, select, textarea, [role="button"], [onclick]')&&c.push(U(p)),g<6&&u(p,g+1)};return u(l,1),{selector:U(l),ancestors:t,siblings:r,descendants:{count:l.querySelectorAll("*").length,maxDepth:o,tags:Array.from(new Set(a)).slice(0,30),interactive:c.slice(0,30)}}}function Dt(l,e){const t=[{id:"self",selector:U(l),tag:l.tagName.toLowerCase(),role:l.getAttribute("role")||void 0,label:B(l).slice(0,30)||l.tagName.toLowerCase(),relationship:"self",depth:0}],s=[];let n=l.parentElement,i=1;for(;n&&i<=4;){const o=`ancestor_${i}`;t.push({id:o,selector:U(n),tag:n.tagName.toLowerCase(),role:n.getAttribute("role")||void 0,label:B(n).slice(0,30)||n.tagName.toLowerCase(),relationship:"parent",depth:i}),s.push({from:o,to:i===1?"self":`ancestor_${i-1}`,relation:"parent-of"}),n=n.parentElement,i++}for(const o of Array.from(l.children).slice(0,12)){const a=`child_${t.length}`;t.push({id:a,selector:U(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:B(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"child",depth:1}),s.push({from:"self",to:a,relation:"contains"})}const r=l.parentElement;if(r)for(const o of Array.from(r.children).slice(0,12)){if(o===l)continue;const a=`sibling_${t.length}`;t.push({id:a,selector:U(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:B(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"sibling",depth:1}),s.push({from:"self",to:a,relation:"sibling-of"})}return{rootSelector:U(l),nodes:t,edges:s}}function $t(l){const e={};for(const v of Array.from(l.attributes))v.name.startsWith("aria-")&&(e[v.name]=v.value);const t=B(l).trim(),s=l.getAttribute("aria-label"),n=l.getAttribute("aria-labelledby");let i;n&&(i=n.split(/\s+/).map(m=>{var d,f,w;return(w=(f=(d=l.ownerDocument)==null?void 0:d.getElementById(m))==null?void 0:f.textContent)==null?void 0:w.trim()}).filter(Boolean).join(" ").slice(0,60)||void 0);const r=l.getAttribute("title"),o=l.tagName.toLowerCase(),a=[];let c="";s?(c=s,a.push("aria-label")):i?(c=i,a.push("aria-labelledby")):t?(c=t.slice(0,60),a.push("text content")):r&&(c=r,a.push("title"));const u=[];(l.disabled||l.hasAttribute("disabled"))&&u.push("disabled"),l.checked&&u.push("checked");const h=l;h.tagName==="SELECT"&&typeof h.selectedOptions<"u"&&h.selectedOptions.length>0&&u.push("selected"),l.getAttribute("aria-expanded")&&u.push(`expanded=${l.getAttribute("aria-expanded")}`),l.getAttribute("aria-pressed")&&u.push(`pressed=${l.getAttribute("aria-pressed")}`),l.getAttribute("aria-hidden")==="true"&&u.push("hidden"),l.hasAttribute("required")&&u.push("required"),l.readOnly&&u.push("readonly");const g=["a[href]","button","input","select","textarea","[tabindex]"].some(v=>{try{return l.matches(v)}catch{return!1}}),p=[];!c&&g&&p.push("Focusable element has no accessible name."),o==="img"&&!l.hasAttribute("alt")&&p.push("Image has no alt attribute.");const y=/^h([1-6])$/.exec(o);return y&&!t&&p.push(`Heading h${y[1]} is empty.`),{selector:U(l),role:l.getAttribute("role")||void 0,implicitRole:qt(l),name:c,nameSources:a,description:l.getAttribute("aria-describedby")||void 0,value:l.value!==void 0&&(l.getAttribute("type")||"text")!=="password"?String(l.value).slice(0,40):void 0,states:u,level:y?parseInt(y[1],10):void 0,focusable:g,tabIndex:l.tabIndex,ariaAttributes:e,issues:p}}function qt(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return{checkbox:"checkbox",radio:"radio",button:"button",submit:"button",reset:"button",range:"slider",search:"searchbox",email:"textbox",text:"textbox",password:"textbox",tel:"textbox",url:"textbox",number:"spinbutton"}[t]||"textbox"}case"select":return l.hasAttribute("multiple")?"listbox":"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";case"dialog":return"dialog";default:return}}function U(l){const e=l.getAttribute("id");if(e&&/^[a-zA-Z][\w-]*$/.test(e))return`#${e}`;const t=l.getAttribute("data-testid");if(t)return`${l.tagName.toLowerCase()}[data-testid="${t}"]`;const s=l.tagName.toLowerCase(),n=Array.from(l.classList||[]).slice(0,2);return n.length?`${s}.${n.join(".")}`:s}function B(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function Pt(){return[{label:"desktop-1440x900",width:1440,height:900},{label:"laptop-1024x768",width:1024,height:768},{label:"tablet-768x1024",width:768,height:1024},{label:"mobile-375x667",width:375,height:667}]}class Ut{constructor(e){b(this,"hostElement",null);b(this,"shadowRoot",null);b(this,"callbacks");b(this,"isRecording",!1);b(this,"isPaused",!1);b(this,"isMinimized",!1);b(this,"startTime",0);b(this,"eventCount",0);b(this,"timerInterval",null);b(this,"isDragging",!1);b(this,"dragStartX",0);b(this,"dragStartY",0);b(this,"posX",window.innerWidth-340);b(this,"posY",40);this.callbacks=e,this.loadPosition()}mount(){this.hostElement&&document.body.contains(this.hostElement)||(this.hostElement=document.createElement("div"),this.hostElement.id="forensic-recorder-floating-host",this.hostElement.style.all="initial",this.hostElement.style.position="fixed",this.hostElement.style.zIndex="2147483647",this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`,this.shadowRoot=this.hostElement.attachShadow({mode:"open"}),this.render(),this.attachEvents(),(document.body||document.documentElement).appendChild(this.hostElement))}unmount(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null),this.hostElement&&this.hostElement.parentNode&&this.hostElement.parentNode.removeChild(this.hostElement),this.hostElement=null,this.shadowRoot=null}hide(){this.hostElement&&(this.hostElement.style.setProperty("display","none","important"),this.hostElement.style.setProperty("visibility","hidden","important"),this.hostElement.style.setProperty("opacity","0","important"))}show(){this.hostElement&&(this.hostElement.style.removeProperty("display"),this.hostElement.style.removeProperty("visibility"),this.hostElement.style.removeProperty("opacity"))}updateState(e,t=!1,s=0,n=0){this.isRecording=e,this.isPaused=t,this.startTime=s||(e?Date.now():0),this.eventCount=n,this.shadowRoot&&(this.render(),this.attachEvents()),this.isRecording&&!this.isPaused?this.startTimer():this.stopTimer()}incrementEventCount(){var t;this.eventCount++;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#evt-badge");e&&(e.textContent=`${this.eventCount} evts`)}startTimer(){this.stopTimer(),this.timerInterval=setInterval(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#timer-display");if(e&&this.startTime){const s=(Date.now()-this.startTime)/1e3,n=Math.floor(s/60).toString().padStart(2,"0"),i=(s%60).toFixed(1).padStart(4,"0");e.textContent=`${n}:${i}`}},200)}stopTimer(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null)}savePosition(){try{sessionStorage.setItem("forensic_overlay_pos",JSON.stringify({x:this.posX,y:this.posY,min:this.isMinimized}))}catch{}}loadPosition(){try{const e=sessionStorage.getItem("forensic_overlay_pos");if(e){const t=JSON.parse(e);this.posX=Math.max(10,Math.min(window.innerWidth-300,t.x||this.posX)),this.posY=Math.max(10,Math.min(window.innerHeight-150,t.y||this.posY)),this.isMinimized=!!t.min}}catch{}}render(){if(!this.shadowRoot)return;const e=` :host { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 12px; @@ -288,4 +288,4 @@ ${t}
- `}attachEvents(){if(!this.shadowRoot)return;const e=this.shadowRoot.querySelector("#drag-header");e&&e.addEventListener("mousedown",c=>{this.isDragging=!0,this.dragStartX=c.clientX-this.posX,this.dragStartY=c.clientY-this.posY;const u=h=>{!this.isDragging||!this.hostElement||(this.posX=Math.max(10,Math.min(window.innerWidth-80,h.clientX-this.dragStartX)),this.posY=Math.max(10,Math.min(window.innerHeight-50,h.clientY-this.dragStartY)),this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`)},d=()=>{this.isDragging=!1,window.removeEventListener("mousemove",u),window.removeEventListener("mouseup",d),this.savePosition()};window.addEventListener("mousemove",u),window.addEventListener("mouseup",d)});const t=this.shadowRoot.querySelector("#btn-toggle-min");t==null||t.addEventListener("click",()=>{this.isMinimized=!this.isMinimized,this.savePosition(),this.render(),this.attachEvents()});const s=this.shadowRoot.querySelector("#btn-close");s==null||s.addEventListener("click",()=>{this.unmount()});const n=this.shadowRoot.querySelector("#btn-record");n==null||n.addEventListener("click",()=>{this.isRecording?this.callbacks.onStopRecord():this.callbacks.onStartRecord()});const i=this.shadowRoot.querySelector("#btn-checkpoint");i==null||i.addEventListener("click",()=>{if(this.callbacks.onCaptureCheckpoint(),i){const c=i.textContent;i.textContent="✔ Saved!",setTimeout(()=>i.textContent=c,1e3)}});const r=this.shadowRoot.querySelector("#btn-inspect");r==null||r.addEventListener("click",()=>{this.callbacks.onInspectElement()});const o=this.shadowRoot.querySelector("#btn-annotate");o==null||o.addEventListener("click",()=>{const c=prompt("Enter observation, bug note, or hypothesis at this exact moment:");c&&c.trim()&&this.callbacks.onAddAnnotation(c.trim())});const a=this.shadowRoot.querySelector("#btn-dashboard");a==null||a.addEventListener("click",()=>{this.callbacks.onOpenDashboard()})}}(function(){var w;let l=null;const e=new Lt;let t=[],s=null,n=null,i=!1;const r=500,o=[],a=[];window.addEventListener("message",E=>{var C;if(((C=E.data)==null?void 0:C._forensicOrigin)==="PAGE_MAIN"){const{type:N,payload:I}=E.data;if(N==="CONSOLE_ENTRY")o.push(I),o.length>r&&o.shift();else if(N==="NETWORK_ENTRY"){const R=a.findIndex(x=>x.requestId===I.requestId);R>=0?a[R]={...a[R],...I}:(a.push(I),a.length>r&&a.shift())}}});function c(){var E;try{if(typeof chrome<"u"&&((E=chrome.runtime)!=null&&E.getURL)){const C=document.createElement("script");C.src=chrome.runtime.getURL("dist/extension/page-script.js"),C.onload=()=>C.remove(),(document.head||document.documentElement).appendChild(C)}}catch{}}function u(){var C;if(t.length===0||!l)return;const E=[...t];t=[];try{typeof chrome<"u"&&((C=chrome.runtime)!=null&&C.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_EVENTS_CHUNK",sessionId:l.getSessionId(),events:E})}catch{}}function d(E,C,N){var R;if(l)return l.getMetadata();l=new Le({sessionId:C,sessionName:E||`Recording on ${document.title||window.location.hostname}`}),l.onEvent(x=>{t.push(x),n&&n.incrementEventCount(),t.length>=25&&u()}),l.onCheckpoint(x=>{var q;try{typeof chrome<"u"&&((q=chrome.runtime)!=null&&q.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_CHECKPOINT",sessionId:x.sessionId,checkpoint:x})}catch{}});const I=l.start(document);try{typeof chrome<"u"&&((R=chrome.runtime)!=null&&R.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_START",metadata:l.getMetadata(),initialSnapshot:I})}catch{}return s||(s=setInterval(u,1e3)),n&&n.updateState(!0,!1,N||Date.now(),0),l.getMetadata()}function h(){var N;if(!l)return null;u(),s&&(clearInterval(s),s=null);const E=l.stop();try{typeof chrome<"u"&&((N=chrome.runtime)!=null&&N.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_STOP",sessionId:E.id,metadata:E})}catch{}const C={...E};return l=null,n&&n.updateState(!1,!1,0,0),C}function p(){if(i){i=!1,document.body.style.cursor="default";return}i=!0,document.body.style.cursor="crosshair";const E=document.createElement("div");E.id="forensic-inspect-highlighter",E.style.position="fixed",E.style.pointerEvents="none",E.style.zIndex="2147483640",E.style.border="2px dashed #38bdf8",E.style.background="rgba(56, 189, 248, 0.15)",E.style.transition="all 0.05s ease",document.body.appendChild(E);const C=I=>{if(!i)return;const R=I.target;if(!R||R.id==="forensic-recorder-floating-host"||R.closest("#forensic-recorder-floating-host")){E.style.display="none";return}const x=R.getBoundingClientRect();E.style.display="block",E.style.left=`${x.left}px`,E.style.top=`${x.top}px`,E.style.width=`${x.width}px`,E.style.height=`${x.height}px`},N=I=>{if(!i)return;const R=I.target;if(!R.closest("#forensic-recorder-floating-host")&&(I.preventDefault(),I.stopPropagation(),i=!1,document.body.style.cursor="default",E.remove(),window.removeEventListener("mousemove",C,!0),window.removeEventListener("click",N,!0),l)){const x=R.id?`#${R.id}`:R.className?`.${R.className.split(" ")[0]}`:R.tagName.toLowerCase();l.addAnnotation("Inspect Element",`Inspected element <${R.tagName.toLowerCase()}> with selector '${x}'`,"USER"),alert(`🎯 Inspected element <${R.tagName.toLowerCase()}> recorded! Checkpoint saved.`)}};window.addEventListener("mousemove",C,!0),window.addEventListener("click",N,!0)}function y(){return n||(n=new Ht({onStartRecord:()=>{d()},onStopRecord:()=>{h()},onTogglePause:()=>{l&&(l.getMetadata().status==="recording"?l.pause():l.resume())},onCaptureCheckpoint:()=>{l&&l.captureCheckpoint("MANUAL",document)},onAddAnnotation:E=>{l&&l.addAnnotation("User Note",E,"USER")},onInspectElement:()=>{p()},onOpenDashboard:()=>{const E=l?l.getSessionId():void 0;chrome.runtime.sendMessage({type:"OPEN_DASHBOARD_TAB",sessionId:E})}})),n}function v(){var E;try{typeof chrome<"u"&&((E=chrome.runtime)!=null&&E.sendMessage)&&chrome.runtime.sendMessage({type:"GET_TAB_RECORDING_STATE"},C=>{chrome.runtime.lastError||!C||C.isRecording&&C.recording&&(y().mount(),d(C.recording.sessionName,C.recording.sessionId,C.recording.startTime))})}catch{}}typeof chrome<"u"&&((w=chrome.runtime)!=null&&w.onMessage)&&chrome.runtime.onMessage.addListener((E,C,N)=>{if(E.type==="HIDE_FORENSIC_OVERLAYS")return n&&n.hide(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(R=>{const x=R;x.style.setProperty("display","none","important"),x.style.setProperty("visibility","hidden","important"),x.style.setProperty("opacity","0","important")}),N({success:!0}),!0;if(E.type==="RESTORE_FORENSIC_OVERLAYS")return n&&n.show(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(R=>{const x=R;x.style.removeProperty("display"),x.style.removeProperty("visibility"),x.style.removeProperty("opacity")}),N({success:!0}),!0;if(E.type==="BROWSER_COMMAND_REQUEST"){if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","CLOSE_TAB","OPEN_TAB","RESIZE_VIEWPORT","RESET_VIEWPORT"].includes(E.command))return!1;if(E.command==="GET_TAB_CONSOLE_LOGS"){const{level:I,searchQuery:R,limit:x=100,clearAfterRead:q}=E.payload||{};let A=[...o];if(I&&I!=="all"&&(A=A.filter(S=>S.level===I)),R){const S=String(R).toLowerCase();A=A.filter(M=>{var O,_;return((O=M.text)==null?void 0:O.toLowerCase().includes(S))||((_=M.source)==null?void 0:_.toLowerCase().includes(S))})}return x>0&&(A=A.slice(-x)),q&&(o.length=0),N({id:E.id,command:E.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:o.length,returnedCount:A.length,logs:A}}),!0}if(E.command==="GET_TAB_NETWORK_REQUESTS"){const{method:I,searchQuery:R,status:x,onlyErrors:q,limit:A=100,clearAfterRead:S}=E.payload||{};let M=[...a];if(I&&(M=M.filter(O=>{var _;return((_=O.method)==null?void 0:_.toUpperCase())===String(I).toUpperCase()})),x&&(M=M.filter(O=>O.status===Number(x))),q&&(M=M.filter(O=>O.error||O.status&&O.status>=400)),R){const O=String(R).toLowerCase();M=M.filter(_=>{var P;return(P=_.url)==null?void 0:P.toLowerCase().includes(O)})}return A>0&&(M=M.slice(-A)),S&&(a.length=0),N({id:E.id,command:E.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:a.length,returnedCount:M.length,requests:M}}),!0}return e.handleCommand(E,document).then(I=>{N(I)}),!0}else if(E.type==="START_RECORDING"){const I=d(E.sessionName);y().mount(),N({success:!0,metadata:I})}else if(E.type==="STOP_RECORDING"){const I=h();N({success:!0,metadata:I})}else if(E.type==="TOGGLE_FLOATING_OVERLAY"){const I=y();document.getElementById("forensic-recorder-floating-host")?(I.unmount(),N({isOpen:!1})):(I.mount(),I.updateState((l==null?void 0:l.getMetadata().status)==="recording",!1,(l==null?void 0:l.getMetadata().startTime)||0,0),N({isOpen:!0}))}else if(E.type==="GET_RECORDER_STATUS")N({isRecording:(l==null?void 0:l.getMetadata().status)==="recording",metadata:(l==null?void 0:l.getMetadata())||null});else if(E.type==="CAPTURE_CHECKPOINT")if(l){const I=l.captureCheckpoint("MANUAL",document);N({success:!0,checkpoint:I})}else N({success:!1,error:"Not currently recording"});return!0});let m=null,g=null;function b(){if(!(typeof WebSocket>"u"))try{const E=new WebSocket("ws://127.0.0.1:3847");E.onopen=()=>{m=E,console.log("[Forensic ContentScript] Connected directly to MCP Bridge on ws://127.0.0.1:3847"),g&&(clearInterval(g),g=null),E.send(JSON.stringify({type:"REGISTER_CLIENT",clientType:"CONTENT_SCRIPT",url:window.location.href,title:document.title}))},E.onclose=()=>{m=null,T()},E.onerror=()=>{m=null,T()},E.onmessage=async C=>{var N;try{const I=JSON.parse(C.data.toString());if(I.type==="BROWSER_COMMAND_REQUEST"){const{id:R,command:x,payload:q}=I;if(["LIST_TABS","OPEN_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","CLOSE_TAB","FOCUS_TAB","RELOAD_TAB","RESIZE_VIEWPORT","RESET_VIEWPORT"].includes(x)){if(typeof chrome<"u"&&((N=chrome.runtime)!=null&&N.sendMessage)){chrome.runtime.sendMessage(I,S=>{if(chrome.runtime.lastError){if(x==="CLOSE_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{closed:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.close(),100);return}if(x==="RELOAD_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{reloaded:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.location.reload(),100);return}E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!1,error:{code:"FORWARD_ERROR",message:chrome.runtime.lastError.message}}))}else E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...S||{id:R,command:x,success:!0}}))});return}if(x==="CLOSE_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{closed:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.close(),100);return}if(x==="RELOAD_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{reloaded:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.location.reload(),100);return}}if(x==="GET_TAB_CONSOLE_LOGS"){const{level:S,searchQuery:M,limit:O=100,clearAfterRead:_}=q||{};let P=[...o];if(S&&S!=="all"&&(P=P.filter(H=>H.level===S)),M){const H=String(M).toLowerCase();P=P.filter($=>{var F,W;return((F=$.text)==null?void 0:F.toLowerCase().includes(H))||((W=$.source)==null?void 0:W.toLowerCase().includes(H))})}O>0&&(P=P.slice(-O)),_&&(o.length=0),E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:o.length,returnedCount:P.length,logs:P}}));return}if(x==="GET_TAB_NETWORK_REQUESTS"){const{method:S,searchQuery:M,status:O,onlyErrors:_,limit:P=100,clearAfterRead:H}=q||{};let $=[...a];if(S&&($=$.filter(F=>{var W;return((W=F.method)==null?void 0:W.toUpperCase())===String(S).toUpperCase()})),O&&($=$.filter(F=>F.status===Number(O))),_&&($=$.filter(F=>F.error||F.status&&F.status>=400)),M){const F=String(M).toLowerCase();$=$.filter(W=>{var te;return(te=W.url)==null?void 0:te.toLowerCase().includes(F)})}P>0&&($=$.slice(-P)),H&&(a.length=0),E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:a.length,returnedCount:$.length,requests:$}}));return}const A=await e.handleCommand(I,document);E.send(JSON.stringify(A))}}catch(I){console.error("[Forensic ContentScript] Bridge message error:",I)}}}catch{m=null,T()}}function T(){g||(g=setInterval(()=>{(!m||m.readyState!==WebSocket.OPEN)&&b()},4e3))}c(),b(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v):v()})()})(); + `}attachEvents(){if(!this.shadowRoot)return;const e=this.shadowRoot.querySelector("#drag-header");e&&e.addEventListener("mousedown",c=>{this.isDragging=!0,this.dragStartX=c.clientX-this.posX,this.dragStartY=c.clientY-this.posY;const u=g=>{!this.isDragging||!this.hostElement||(this.posX=Math.max(10,Math.min(window.innerWidth-80,g.clientX-this.dragStartX)),this.posY=Math.max(10,Math.min(window.innerHeight-50,g.clientY-this.dragStartY)),this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`)},h=()=>{this.isDragging=!1,window.removeEventListener("mousemove",u),window.removeEventListener("mouseup",h),this.savePosition()};window.addEventListener("mousemove",u),window.addEventListener("mouseup",h)});const t=this.shadowRoot.querySelector("#btn-toggle-min");t==null||t.addEventListener("click",()=>{this.isMinimized=!this.isMinimized,this.savePosition(),this.render(),this.attachEvents()});const s=this.shadowRoot.querySelector("#btn-close");s==null||s.addEventListener("click",()=>{this.unmount()});const n=this.shadowRoot.querySelector("#btn-record");n==null||n.addEventListener("click",()=>{this.isRecording?this.callbacks.onStopRecord():this.callbacks.onStartRecord()});const i=this.shadowRoot.querySelector("#btn-checkpoint");i==null||i.addEventListener("click",()=>{if(this.callbacks.onCaptureCheckpoint(),i){const c=i.textContent;i.textContent="✔ Saved!",setTimeout(()=>i.textContent=c,1e3)}});const r=this.shadowRoot.querySelector("#btn-inspect");r==null||r.addEventListener("click",()=>{this.callbacks.onInspectElement()});const o=this.shadowRoot.querySelector("#btn-annotate");o==null||o.addEventListener("click",()=>{const c=prompt("Enter observation, bug note, or hypothesis at this exact moment:");c&&c.trim()&&this.callbacks.onAddAnnotation(c.trim())});const a=this.shadowRoot.querySelector("#btn-dashboard");a==null||a.addEventListener("click",()=>{this.callbacks.onOpenDashboard()})}}(function(){var m;let l=null;const e=new Ot;let t=[],s=null,n=null,i=!1;const r=500,o=[],a=[];window.addEventListener("message",d=>{var f;if(((f=d.data)==null?void 0:f._forensicOrigin)==="PAGE_MAIN"){const{type:w,payload:E}=d.data;if(w==="CONSOLE_ENTRY")o.push(E),o.length>r&&o.shift();else if(w==="NETWORK_ENTRY"){const S=a.findIndex(T=>T.requestId===E.requestId);S>=0?a[S]={...a[S],...E}:(a.push(E),a.length>r&&a.shift())}}});function c(){var d;try{if(typeof chrome<"u"&&((d=chrome.runtime)!=null&&d.getURL)){const f=document.createElement("script");f.src=chrome.runtime.getURL("dist/extension/page-script.js"),f.onload=()=>f.remove(),(document.head||document.documentElement).appendChild(f)}}catch{}}function u(){var f;if(t.length===0||!l)return;const d=[...t];t=[];try{typeof chrome<"u"&&((f=chrome.runtime)!=null&&f.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_EVENTS_CHUNK",sessionId:l.getSessionId(),events:d})}catch{}}function h(d,f,w){var S;if(l)return l.getMetadata();l=new Oe({sessionId:f,sessionName:d||`Recording on ${document.title||window.location.hostname}`}),l.onEvent(T=>{t.push(T),n&&n.incrementEventCount(),t.length>=25&&u()}),l.onCheckpoint(T=>{var x;try{typeof chrome<"u"&&((x=chrome.runtime)!=null&&x.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_CHECKPOINT",sessionId:T.sessionId,checkpoint:T})}catch{}});const E=l.start(document);try{typeof chrome<"u"&&((S=chrome.runtime)!=null&&S.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_START",metadata:l.getMetadata(),initialSnapshot:E})}catch{}return s||(s=setInterval(u,1e3)),n&&n.updateState(!0,!1,w||Date.now(),0),l.getMetadata()}function g(){var w;if(!l)return null;u(),s&&(clearInterval(s),s=null);const d=l.stop();try{typeof chrome<"u"&&((w=chrome.runtime)!=null&&w.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_STOP",sessionId:d.id,metadata:d})}catch{}const f={...d};return l=null,n&&n.updateState(!1,!1,0,0),f}function p(){if(i){i=!1,document.body.style.cursor="default";return}i=!0,document.body.style.cursor="crosshair";const d=document.createElement("div");d.id="forensic-inspect-highlighter",d.style.position="fixed",d.style.pointerEvents="none",d.style.zIndex="2147483640",d.style.border="2px dashed #38bdf8",d.style.background="rgba(56, 189, 248, 0.15)",d.style.transition="all 0.05s ease",document.body.appendChild(d);const f=E=>{if(!i)return;const S=E.target;if(!S||S.id==="forensic-recorder-floating-host"||S.closest("#forensic-recorder-floating-host")){d.style.display="none";return}const T=S.getBoundingClientRect();d.style.display="block",d.style.left=`${T.left}px`,d.style.top=`${T.top}px`,d.style.width=`${T.width}px`,d.style.height=`${T.height}px`},w=E=>{if(!i)return;const S=E.target;if(!S.closest("#forensic-recorder-floating-host")&&(E.preventDefault(),E.stopPropagation(),i=!1,document.body.style.cursor="default",d.remove(),window.removeEventListener("mousemove",f,!0),window.removeEventListener("click",w,!0),l)){const T=S.id?`#${S.id}`:S.className?`.${S.className.split(" ")[0]}`:S.tagName.toLowerCase();l.addAnnotation("Inspect Element",`Inspected element <${S.tagName.toLowerCase()}> with selector '${T}'`,"USER"),alert(`🎯 Inspected element <${S.tagName.toLowerCase()}> recorded! Checkpoint saved.`)}};window.addEventListener("mousemove",f,!0),window.addEventListener("click",w,!0)}function y(){return n||(n=new Ut({onStartRecord:()=>{h()},onStopRecord:()=>{g()},onTogglePause:()=>{l&&(l.getMetadata().status==="recording"?l.pause():l.resume())},onCaptureCheckpoint:()=>{l&&l.captureCheckpoint("MANUAL",document)},onAddAnnotation:d=>{l&&l.addAnnotation("User Note",d,"USER")},onInspectElement:()=>{p()},onOpenDashboard:()=>{const d=l?l.getSessionId():void 0;chrome.runtime.sendMessage({type:"OPEN_DASHBOARD_TAB",sessionId:d})}})),n}function v(){var d;try{typeof chrome<"u"&&((d=chrome.runtime)!=null&&d.sendMessage)&&chrome.runtime.sendMessage({type:"GET_TAB_RECORDING_STATE"},f=>{chrome.runtime.lastError||!f||f.isRecording&&f.recording&&(y().mount(),h(f.recording.sessionName,f.recording.sessionId,f.recording.startTime))})}catch{}}typeof chrome<"u"&&((m=chrome.runtime)!=null&&m.onMessage)&&chrome.runtime.onMessage.addListener((d,f,w)=>{if(d.type==="HIDE_FORENSIC_OVERLAYS")return n&&n.hide(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(S=>{const T=S;T.style.setProperty("display","none","important"),T.style.setProperty("visibility","hidden","important"),T.style.setProperty("opacity","0","important")}),w({success:!0}),!0;if(d.type==="RESTORE_FORENSIC_OVERLAYS")return n&&n.show(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(S=>{const T=S;T.style.removeProperty("display"),T.style.removeProperty("visibility"),T.style.removeProperty("opacity")}),w({success:!0}),!0;if(d.type==="BROWSER_COMMAND_REQUEST"){if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","CLOSE_TAB","OPEN_TAB","RESIZE_VIEWPORT","RESET_VIEWPORT"].includes(d.command))return!1;if(d.command==="GET_TAB_CONSOLE_LOGS"){const{level:E,searchQuery:S,limit:T=100,clearAfterRead:x}=d.payload||{};let N=[...o];if(E&&E!=="all"&&(N=N.filter(D=>D.level===E)),S){const D=String(S).toLowerCase();N=N.filter(M=>{var L,I;return((L=M.text)==null?void 0:L.toLowerCase().includes(D))||((I=M.source)==null?void 0:I.toLowerCase().includes(D))})}return T>0&&(N=N.slice(-T)),x&&(o.length=0),w({id:d.id,command:d.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:o.length,returnedCount:N.length,logs:N}}),!0}if(d.command==="GET_TAB_NETWORK_REQUESTS"){const{method:E,searchQuery:S,status:T,onlyErrors:x,limit:N=100,clearAfterRead:D}=d.payload||{};let M=[...a];if(E&&(M=M.filter(L=>{var I;return((I=L.method)==null?void 0:I.toUpperCase())===String(E).toUpperCase()})),T&&(M=M.filter(L=>L.status===Number(T))),x&&(M=M.filter(L=>L.error||L.status&&L.status>=400)),S){const L=String(S).toLowerCase();M=M.filter(I=>{var C;return(C=I.url)==null?void 0:C.toLowerCase().includes(L)})}return N>0&&(M=M.slice(-N)),D&&(a.length=0),w({id:d.id,command:d.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:a.length,returnedCount:M.length,requests:M}}),!0}return e.handleCommand(d,document).then(E=>{w(E)}),!0}else if(d.type==="START_RECORDING"){const E=h(d.sessionName);y().mount(),w({success:!0,metadata:E})}else if(d.type==="STOP_RECORDING"){const E=g();w({success:!0,metadata:E})}else if(d.type==="TOGGLE_FLOATING_OVERLAY"){const E=y();document.getElementById("forensic-recorder-floating-host")?(E.unmount(),w({isOpen:!1})):(E.mount(),E.updateState((l==null?void 0:l.getMetadata().status)==="recording",!1,(l==null?void 0:l.getMetadata().startTime)||0,0),w({isOpen:!0}))}else if(d.type==="GET_RECORDER_STATUS")w({isRecording:(l==null?void 0:l.getMetadata().status)==="recording",metadata:(l==null?void 0:l.getMetadata())||null});else if(d.type==="CAPTURE_CHECKPOINT")if(l){const E=l.captureCheckpoint("MANUAL",document);w({success:!0,checkpoint:E})}else w({success:!1,error:"Not currently recording"});return!0}),c(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v):v()})()})(); diff --git a/chrome-extension/dist/extension/service-worker.js b/chrome-extension/dist/extension/service-worker.js index 8a07840c..3df46b93 100644 --- a/chrome-extension/dist/extension/service-worker.js +++ b/chrome-extension/dist/extension/service-worker.js @@ -1 +1 @@ -var v=Object.defineProperty;var P=(E,l,d)=>l in E?v(E,l,{enumerable:!0,configurable:!0,writable:!0,value:d}):E[l]=d;var b=(E,l,d)=>P(E,typeof l!="symbol"?l+"":l,d);(function(){"use strict";var T,_,p,R;class E{constructor(s="ForensicRecorderDB"){b(this,"dbName");b(this,"dbVersion",1);b(this,"db",null);this.dbName=s}async openDB(){if(this.db)return this.db;if(typeof indexedDB>"u")throw new Error("IndexedDB is not available in current runtime environment");return new Promise((s,e)=>{const r=indexedDB.open(this.dbName,this.dbVersion);r.onupgradeneeded=c=>{const t=c.target.result;if(t.objectStoreNames.contains("sessions")||t.createObjectStore("sessions",{keyPath:"id"}),!t.objectStoreNames.contains("events")){const n=t.createObjectStore("events",{keyPath:"id"});n.createIndex("sessionId","sessionId",{unique:!1}),n.createIndex("sequence","sequence",{unique:!1})}t.objectStoreNames.contains("checkpoints")||t.createObjectStore("checkpoints",{keyPath:"checkpointId"}).createIndex("sessionId","sessionId",{unique:!1}),t.objectStoreNames.contains("snapshots")||t.createObjectStore("snapshots",{keyPath:"sessionId"}),t.objectStoreNames.contains("annotations")||t.createObjectStore("annotations",{keyPath:"id"}).createIndex("sessionId","sessionId",{unique:!1})},r.onsuccess=()=>{this.db=r.result,s(this.db)},r.onerror=()=>e(r.error)})}async saveSession(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction("sessions","readwrite");t.objectStore("sessions").put(s),t.oncomplete=()=>r(),t.onerror=()=>c(t.error)})}async getSession(s){const e=await this.openDB();return new Promise((r,c)=>{const o=e.transaction("sessions","readonly").objectStore("sessions").get(s);o.onsuccess=()=>r(o.result||null),o.onerror=()=>c(o.error)})}async listSessions(){const s=await this.openDB();return new Promise((e,r)=>{const n=s.transaction("sessions","readonly").objectStore("sessions").getAll();n.onsuccess=()=>{const o=n.result||[];o.sort((a,u)=>u.startTime-a.startTime),e(o)},n.onerror=()=>r(n.error)})}async deleteSession(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction(["sessions","events","checkpoints","snapshots","annotations"],"readwrite");t.objectStore("sessions").delete(s),t.objectStore("snapshots").delete(s);const a=t.objectStore("events").index("sessionId").openCursor(IDBKeyRange.only(s));a.onsuccess=()=>{const u=a.result;u&&(u.delete(),u.continue())},t.oncomplete=()=>r(!0),t.onerror=()=>c(t.error)})}async appendEvents(s,e){if(e.length===0)return;const r=await this.openDB();return new Promise((c,t)=>{const n=r.transaction("events","readwrite"),o=n.objectStore("events");for(const a of e)o.put(a);n.oncomplete=()=>c(),n.onerror=()=>t(n.error)})}async getEvents(s,e){const r=await this.openDB();return new Promise((c,t)=>{const u=r.transaction("events","readonly").objectStore("events").index("sessionId").getAll(IDBKeyRange.only(s));u.onsuccess=()=>{let m=u.result||[];m.sort((h,f)=>h.sequence-f.sequence),e&&(m=m.filter(h=>!(e.category&&h.category!==e.category||e.type&&h.type!==e.type||typeof e.fromTimestamp=="number"&&h.timestampe.toTimestamp||typeof e.targetNodeId=="number"&&h.targetNodeId!==e.targetNodeId)),typeof e.offset=="number"&&(m=m.slice(e.offset)),typeof e.limit=="number"&&(m=m.slice(0,e.limit))),c(m)},u.onerror=()=>t(u.error)})}async getEventCount(s){const e=await this.openDB();return new Promise((r,c)=>{const a=e.transaction("events","readonly").objectStore("events").index("sessionId").count(IDBKeyRange.only(s));a.onsuccess=()=>r(a.result),a.onerror=()=>c(a.error)})}async saveCheckpoint(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction("checkpoints","readwrite");t.objectStore("checkpoints").put(s),t.oncomplete=()=>r(),t.onerror=()=>c(t.error)})}async getCheckpoints(s){const e=await this.openDB();return new Promise((r,c)=>{const o=e.transaction("checkpoints","readonly").objectStore("checkpoints").index("sessionId").getAll(IDBKeyRange.only(s));o.onsuccess=()=>{const a=o.result||[];a.sort((u,m)=>u.sequence-m.sequence),r(a)},o.onerror=()=>c(o.error)})}async saveInitialSnapshot(s,e){const r=await this.openDB();return new Promise((c,t)=>{const n=r.transaction("snapshots","readwrite");n.objectStore("snapshots").put({sessionId:s,snapshot:e}),n.oncomplete=()=>c(),n.onerror=()=>t(n.error)})}async getInitialSnapshot(s){const e=await this.openDB();return new Promise((r,c)=>{const n=e.transaction("snapshots","readonly").objectStore("snapshots").get(s);n.onsuccess=()=>r(n.result?n.result.snapshot:null),n.onerror=()=>c(n.error)})}async addAnnotation(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction("annotations","readwrite");t.objectStore("annotations").put(s),t.oncomplete=()=>r(),t.onerror=()=>c(t.error)})}async getAnnotations(s){const e=await this.openDB();return new Promise((r,c)=>{const o=e.transaction("annotations","readonly").objectStore("annotations").index("sessionId").getAll(IDBKeyRange.only(s));o.onsuccess=()=>r(o.result||[]),o.onerror=()=>c(o.error)})}}const l=new E("ForensicExtensionDB");let d=null,S=null;const w=new Map,g=new Map;async function A(){return new Promise(i=>{try{chrome.tabs.query({active:!0,currentWindow:!0},s=>{if(chrome.runtime.lastError||!s||s.length===0)return i(null);i(s[0].id??null)})}catch{i(null)}})}try{(_=(T=chrome.debugger)==null?void 0:T.onEvent)==null||_.addListener((i,s,e)=>{try{for(const[r,c]of g.entries())if((i==null?void 0:i.tabId)===c||(i==null?void 0:i.targetId)===`tab_${c}`){d==null||d.send(JSON.stringify({type:"CDP_EVENT",sessionId:r,method:s,params:e,timestamp:Date.now()}));return}}catch{}})}catch{}async function O(i,s){if(i==="LIST_TABS")return new Promise((e,r)=>{chrome.tabs.query({},c=>{if(chrome.runtime.lastError)return r(new Error(chrome.runtime.lastError.message));const t=(c||[]).map(n=>({id:n.id,index:n.index,windowId:n.windowId,title:n.title||"Untitled",url:n.url||"",active:!!n.active,status:n.status,pinned:!!n.pinned,favIconUrl:n.favIconUrl,audited:n.id?w.has(n.id):!1,incognito:!!n.incognito,width:n.width,height:n.height}));e({totalTabs:t.length,tabs:t})})});if(i==="FOCUS_TAB"){const e=Number(s==null?void 0:s.tabId);if(!e)throw new Error("tabId is required for focus_tab");return new Promise((r,c)=>{chrome.tabs.update(e,{active:!0},t=>{var n;if(chrome.runtime.lastError||!t)return c(new Error(((n=chrome.runtime.lastError)==null?void 0:n.message)||`Tab ${e} not found`));t.windowId?chrome.windows.update(t.windowId,{focused:!0},()=>{r({focused:!0,tab:{id:t.id,windowId:t.windowId,title:t.title,url:t.url,active:t.active}})}):r({focused:!0,tab:{id:t.id,title:t.title,url:t.url,active:t.active}})})})}if(i==="RELOAD_TAB"){const e=!!(s!=null&&s.bypassCache),r=s!=null&&s.tabId?Number(s.tabId):void 0;return new Promise((c,t)=>{const n=o=>{chrome.tabs.reload(o,{bypassCache:e},()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));chrome.tabs.get(o,a=>{c({reloaded:!0,tabId:o,bypassCache:e,url:a==null?void 0:a.url,title:a==null?void 0:a.title})})})};r?chrome.tabs.get(r,o=>{chrome.runtime.lastError||!o?chrome.tabs.query({active:!0,lastFocusedWindow:!0},a=>{const u=a&&a[0]?a[0]:null;u!=null&&u.id?n(u.id):t(new Error("No active tab found to reload"))}):n(r)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},o=>{const a=o&&o[0]?o[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to reload"));n(a.id)})})}if(i==="CLOSE_TAB"){const e=s!=null&&s.tabId?Number(s.tabId):void 0,r=s!=null&&s.url?String(s.url).toLowerCase():void 0;return new Promise((c,t)=>{const n=o=>{chrome.tabs.remove(o,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));c({closed:!0,tabIds:o,count:o.length})})};e?n([e]):r?chrome.tabs.query({},o=>{const u=(o||[]).filter(m=>{var h,f;return((h=m.url)==null?void 0:h.toLowerCase().includes(r))||((f=m.title)==null?void 0:f.toLowerCase().includes(r))}).map(m=>m.id).filter(Boolean);if(u.length===0)return c({closed:!1,message:`No open tab matched '${r}'`});n(u)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},o=>{const a=o&&o[0]?o[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to close"));n([a.id])})})}if(i==="OPEN_TAB"){const e=s==null?void 0:s.url;if(!e)throw new Error("url is required for open_tab");let r=String(e).trim();!r.startsWith("http://")&&!r.startsWith("https://")&&!r.startsWith("file://")&&!r.startsWith("chrome://")&&!r.startsWith("about:")&&(r.includes("meet.google.com")||r.includes("localhost")||r.includes(".com")||r.includes(".org")||r.includes(".net")||r.includes(".ir")||r.includes(".io")||r.includes(".app"))&&(r="https://"+r);const c=s.active!==!1,t=!!s.pinned;return new Promise((n,o)=>{chrome.tabs.create({url:r,active:c,pinned:t},a=>{if(chrome.runtime.lastError)return o(new Error(chrome.runtime.lastError.message));n({opened:!0,tabId:a.id,windowId:a.windowId,url:a.url||r,title:a.title||"New Tab",active:a.active,status:a.status})})})}if(i==="LIST_EXTENSIONS")return new Promise((e,r)=>{var c;if(!((c=chrome.management)!=null&&c.getAll))return r(new Error("chrome.management API not available"));chrome.management.getAll(t=>{if(chrome.runtime.lastError)return r(new Error(chrome.runtime.lastError.message));const n=(t||[]).map(o=>({id:o.id,name:o.name,version:o.version,description:o.description,enabled:o.enabled,installType:o.installType,isApp:o.isApp,homepageUrl:o.homepageUrl,permissions:o.permissions}));e({totalExtensions:n.length,extensions:n})})});if(i==="SET_EXTENSION_ENABLED"){const e=s==null?void 0:s.extensionId,r=!!(s!=null&&s.enabled);if(!e)throw new Error("extensionId is required for SET_EXTENSION_ENABLED");return new Promise((c,t)=>{var n;if(!((n=chrome.management)!=null&&n.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,r,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to set enabled state for ${e}`));c({success:!0,extensionId:e,enabled:r,message:`Extension ${e} successfully ${r?"enabled":"disabled"}.`})})})}if(i==="TOGGLE_EXTENSION"){const e=s==null?void 0:s.extensionId;if(!e)throw new Error("extensionId is required for TOGGLE_EXTENSION");return new Promise((r,c)=>{var t,n;if(!((t=chrome.management)!=null&&t.get)||!((n=chrome.management)!=null&&n.setEnabled))return c(new Error("chrome.management API not available"));chrome.management.get(e,o=>{var u;if(chrome.runtime.lastError||!o)return c(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||`Extension ${e} not found`));const a=!o.enabled;chrome.management.setEnabled(e,a,()=>{if(chrome.runtime.lastError)return c(new Error(chrome.runtime.lastError.message||`Failed to toggle ${e}`));r({success:!0,extensionId:e,enabled:a,name:o.name,message:`Extension ${o.name} (${e}) toggled to ${a?"enabled":"disabled"}.`})})})})}if(i==="RESIZE_VIEWPORT"){const e=Math.max(200,Math.min(7680,Number(s==null?void 0:s.width)||1280)),r=Math.max(200,Math.min(4320,Number(s==null?void 0:s.height)||800));return new Promise((c,t)=>{chrome.windows.getCurrent({populate:!1},n=>{var o;if(chrome.runtime.lastError||!n)return t(new Error(((o=chrome.runtime.lastError)==null?void 0:o.message)||"No current window"));chrome.windows.update(n.id??chrome.windows.WINDOW_ID_CURRENT,{width:e,height:r,state:"normal"},a=>{var u;if(chrome.runtime.lastError||!a)return t(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||"Window resize failed"));c({success:!0,applied:{width:a.width,height:a.height},previous:{width:n.width,height:n.height},original:{width:n.width,height:n.height},reversible:!0,mode:"browser-window",note:"Reset with reset_viewport — the content script tracks the original size."})})})})}if(i==="RESET_VIEWPORT")return new Promise((e,r)=>{chrome.windows.getCurrent({populate:!1},c=>{var t;if(chrome.runtime.lastError||!c)return r(new Error(((t=chrome.runtime.lastError)==null?void 0:t.message)||"No current window"));chrome.windows.update(c.id??chrome.windows.WINDOW_ID_CURRENT,{state:"maximized"},n=>{var o;if(chrome.runtime.lastError||!n)return r(new Error(((o=chrome.runtime.lastError)==null?void 0:o.message)||"Window restore failed"));e({success:!0,applied:{width:n.width,height:n.height},previous:{width:c.width,height:c.height},original:{width:n.width,height:n.height},reversible:!1,mode:"browser-window",note:"Window restored to maximized state."})})})});if(i==="RELOAD_EXTENSION"){const e=s==null?void 0:s.extensionId,r=chrome.runtime.id;return!e||e===r?(setTimeout(()=>chrome.runtime.reload(),150),{reloaded:!0,extensionId:r,isSelf:!0,message:"Forensic Recorder extension is reloading now."}):new Promise((c,t)=>{var n;if(!((n=chrome.management)!=null&&n.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,!1,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to disable ${e}`));setTimeout(()=>{chrome.management.setEnabled(e,!0,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to re-enable ${e}`));c({reloaded:!0,extensionId:e,isSelf:!1,message:`Extension ${e} successfully reloaded.`})})},150)})})}if(i==="CDP_ATTACH"){const e=(s==null?void 0:s.tabId)!==void 0?Number(s.tabId):await A();if(e===null)throw new Error("No target tab available for CDP attach.");return new Promise((r,c)=>{var t;if(!((t=chrome.debugger)!=null&&t.attach))return c(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));chrome.debugger.attach({tabId:e},"1.3",()=>{if(chrome.runtime.lastError)return c(new Error(`CDP_ATTACH failed: ${chrome.runtime.lastError.message}`));s!=null&&s.sessionId&&g.set(String(s.sessionId),e),chrome.debugger.getTargets(n=>{const o=(n||[]).find(a=>a.tabId===e)||{};r({attached:!0,sessionId:s==null?void 0:s.sessionId,tabId:e,targetId:o.id||`tab_${e}`,type:o.type||"page"})})})})}if(i==="CDP_COMMAND"){const{sessionId:e,method:r,params:c}=s||{};if(!r)throw new Error("CDP_COMMAND requires method");return new Promise((t,n)=>{var a;if(!((a=chrome.debugger)!=null&&a.sendCommand))return n(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));const o=g.get(e);if(o===void 0)return n(new Error(`CDP_SESSION_NOT_FOUND: no tab bound to session '${e}' — attach first.`));chrome.debugger.sendCommand({tabId:o},r,c||{},u=>{if(chrome.runtime.lastError){t({__cdpError:!0,code:"CDP_PROTOCOL_ERROR",message:chrome.runtime.lastError.message,method:r});return}t({result:u??{}})})})}if(i==="CDP_DETACH"){const{sessionId:e}=s||{},r=g.get(e);return g.delete(e),r===void 0?{detached:!1,reason:"session not found"}:new Promise((c,t)=>{var n;if(!((n=chrome.debugger)!=null&&n.detach))return c({detached:!1,reason:"chrome.debugger unavailable"});chrome.debugger.detach({tabId:r},()=>{if(chrome.runtime.lastError)return c({detached:!1,reason:chrome.runtime.lastError.message});c({detached:!0,sessionId:e,tabId:r})})})}throw new Error(`Unsupported background command: ${i}`)}function I(){if(!(typeof WebSocket>"u"))try{const i=new WebSocket("ws://127.0.0.1:3847");let s=null;i.onopen=()=>{var e;d=i,console.log("[Forensic Extension] Connected to MCP Bridge on ws://127.0.0.1:3847"),S&&(clearInterval(S),S=null),i.send(JSON.stringify({type:"REGISTER_CLIENT",clientType:"SERVICE_WORKER",url:typeof chrome<"u"&&((e=chrome.runtime)!=null&&e.id)?`chrome-extension://${chrome.runtime.id}`:"service-worker",title:"Forensic Service Worker"})),s&&clearInterval(s),s=setInterval(()=>{if(i&&i.readyState===WebSocket.OPEN)try{i.send(JSON.stringify({type:"HEARTBEAT",timestamp:Date.now()}))}catch(r){console.warn("[TeleDOM SW] non-critical operation failed:",(r==null?void 0:r.message)??r)}},15e3)},i.onclose=()=>{s&&clearInterval(s),d=null,N()},i.onerror=()=>{s&&clearInterval(s),d=null,N()},i.onmessage=async e=>{try{const r=JSON.parse(e.data.toString());if(r.type==="BROWSER_COMMAND_REQUEST"){const{id:c,command:t,payload:n}=r;if(typeof chrome>"u"||!chrome.tabs){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_CHROME_TABS_API",message:"chrome.tabs API not available in this context"}}));return}if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","CLOSE_TAB","OPEN_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","SET_EXTENSION_ENABLED","TOGGLE_EXTENSION","CDP_ATTACH","CDP_COMMAND","CDP_DETACH"].includes(t)){try{const u=await O(t,n);i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!0,data:u}))}catch(u){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"COMMAND_ERROR",message:u.message}}))}return}const o=n!=null&&n.tabId?Number(n.tabId):void 0,a=u=>{if(t==="LIVE_PAGE_SCREENSHOT"||t==="LIVE_ELEMENT_SCREENSHOT"){chrome.tabs.sendMessage(u,{type:"HIDE_FORENSIC_OVERLAYS"},()=>{setTimeout(()=>{chrome.tabs.captureVisibleTab({format:"png"},m=>{var h;if(chrome.tabs.sendMessage(u,{type:"RESTORE_FORENSIC_OVERLAYS"}),chrome.runtime.lastError||!m){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"SCREENSHOT_FAILED",message:((h=chrome.runtime.lastError)==null?void 0:h.message)||"captureVisibleTab failed"}}));return}chrome.tabs.sendMessage(u,{type:"BROWSER_COMMAND_REQUEST",id:c,command:t,payload:{...n,dataUrl:m}},f=>{const C=f||{id:c,command:t,success:!0,data:{dataUrl:m,captureType:t==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}};i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...C}))})})},150)});return}chrome.tabs.sendMessage(u,r,m=>{if(chrome.runtime.lastError){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"CONTENT_SCRIPT_UNREACHABLE",message:chrome.runtime.lastError.message||`Content script unreachable on tab ${u}`}}));return}i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...m||{id:c,command:t,success:!0}}))})};o?a(o):chrome.tabs.query({active:!0,lastFocusedWindow:!0},async u=>{const m=u&&u[0]?u[0]:null,h=m==null?void 0:m.id;if(!h){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_ACTIVE_TAB",message:"No active browser tab found"}}));return}a(h)})}}catch(r){console.error("[ServiceWorker] Bridge message handling error:",r)}}}catch{d=null,N()}}function N(){S||(S=setInterval(()=>{(!d||d.readyState!==WebSocket.OPEN)&&I()},5e3))}I(),typeof chrome<"u"&&((p=chrome.webNavigation)!=null&&p.onCommitted)&&chrome.webNavigation.onCommitted.addListener(async i=>{var t;if(i.frameId!==0)return;const s=i.tabId,e=w.get(s);if(!e||!e.isRecording)return;let r="NAV_OTHER";i.transitionType==="reload"?r="NAV_RELOAD":(t=i.transitionQualifiers)!=null&&t.includes("forward_back")?r="NAV_FORWARD_BACK":i.transitionType==="link"&&(r="NAV_LINK");const c={id:`nav_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,sessionId:e.sessionId,timestamp:Date.now()-e.startTime,sequence:999999,wallClockTime:Date.now(),type:r,category:"NAVIGATION",source:"USER_INTERACTION",payload:{url:i.url,transitionType:i.transitionType,transitionQualifiers:i.transitionQualifiers,tabId:i.tabId}};try{await l.appendEvents(e.sessionId,[c]),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"FORENSIC_EVENTS_CHUNK",sessionId:e.sessionId,events:[c]}))}catch{}}),typeof chrome<"u"&&((R=chrome.runtime)!=null&&R.onMessage)&&chrome.runtime.onMessage.addListener((i,s,e)=>((async()=>{var r,c,t;try{const n=((r=s.tab)==null?void 0:r.id)??i.tabId;if(i.type==="FORENSIC_SESSION_START")n&&w.set(n,{sessionId:i.metadata.id,sessionName:i.metadata.name,startTime:i.metadata.startTime,initialUrl:i.metadata.url,isRecording:!0}),await l.saveSession(i.metadata),i.initialSnapshot&&await l.saveInitialSnapshot(i.metadata.id,i.initialSnapshot),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0,sessionId:i.metadata.id});else if(i.type==="GET_TAB_RECORDING_STATE"){const o=n?w.get(n):null;e({isRecording:!!(o!=null&&o.isRecording),recording:o||null})}else if(i.type==="FORENSIC_EVENTS_CHUNK")await l.appendEvents(i.sessionId,i.events),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0});else if(i.type==="FORENSIC_CHECKPOINT")await l.saveCheckpoint(i.checkpoint),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0});else if(i.type==="FORENSIC_SESSION_STOP"){n&&w.delete(n);const o=await l.getSession(i.sessionId);o&&(o.status="stopped",o.endTime=Date.now(),(c=i.metadata)!=null&&c.durationMs&&(o.durationMs=i.metadata.durationMs),await l.saveSession(o)),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0})}else if(i.type==="OPEN_DASHBOARD_TAB"){const o=chrome.runtime.getURL(`dist/src/ui/index.html${i.sessionId?`?session=${i.sessionId}`:""}`);chrome.tabs.create({url:o}),e({success:!0,url:o})}else if(i.type==="CAPTURE_SCREENSHOT"){if((t=chrome.tabs)!=null&&t.captureVisibleTab){chrome.tabs.captureVisibleTab({format:"png"},o=>{e({success:!!o,dataUrl:o})});return}e({success:!1,error:"Screenshot capture unsupported"})}else if(i.type==="ELEMENT_SELECTED")d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0});else if(i.type==="BROWSER_COMMAND_REQUEST")try{const o=await O(i.command,i.payload);e({id:i.id,command:i.command,success:!0,data:o})}catch(o){e({id:i.id,command:i.command,success:!1,error:{code:"COMMAND_ERROR",message:o.message}})}}catch(n){e({success:!1,error:n.message})}})(),!0)),I()})(); +var v=Object.defineProperty;var P=(E,h,d)=>h in E?v(E,h,{enumerable:!0,configurable:!0,writable:!0,value:d}):E[h]=d;var I=(E,h,d)=>P(E,typeof h!="symbol"?h+"":h,d);(function(){"use strict";var T,_,p,A;class E{constructor(s="ForensicRecorderDB"){I(this,"dbName");I(this,"dbVersion",1);I(this,"db",null);this.dbName=s}async openDB(){if(this.db)return this.db;if(typeof indexedDB>"u")throw new Error("IndexedDB is not available in current runtime environment");return new Promise((s,e)=>{const n=indexedDB.open(this.dbName,this.dbVersion);n.onupgradeneeded=c=>{const t=c.target.result;if(t.objectStoreNames.contains("sessions")||t.createObjectStore("sessions",{keyPath:"id"}),!t.objectStoreNames.contains("events")){const r=t.createObjectStore("events",{keyPath:"id"});r.createIndex("sessionId","sessionId",{unique:!1}),r.createIndex("sequence","sequence",{unique:!1})}t.objectStoreNames.contains("checkpoints")||t.createObjectStore("checkpoints",{keyPath:"checkpointId"}).createIndex("sessionId","sessionId",{unique:!1}),t.objectStoreNames.contains("snapshots")||t.createObjectStore("snapshots",{keyPath:"sessionId"}),t.objectStoreNames.contains("annotations")||t.createObjectStore("annotations",{keyPath:"id"}).createIndex("sessionId","sessionId",{unique:!1})},n.onsuccess=()=>{this.db=n.result,s(this.db)},n.onerror=()=>e(n.error)})}async saveSession(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction("sessions","readwrite");t.objectStore("sessions").put(s),t.oncomplete=()=>n(),t.onerror=()=>c(t.error)})}async getSession(s){const e=await this.openDB();return new Promise((n,c)=>{const i=e.transaction("sessions","readonly").objectStore("sessions").get(s);i.onsuccess=()=>n(i.result||null),i.onerror=()=>c(i.error)})}async listSessions(){const s=await this.openDB();return new Promise((e,n)=>{const r=s.transaction("sessions","readonly").objectStore("sessions").getAll();r.onsuccess=()=>{const i=r.result||[];i.sort((a,u)=>u.startTime-a.startTime),e(i)},r.onerror=()=>n(r.error)})}async deleteSession(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction(["sessions","events","checkpoints","snapshots","annotations"],"readwrite");t.objectStore("sessions").delete(s),t.objectStore("snapshots").delete(s);const a=t.objectStore("events").index("sessionId").openCursor(IDBKeyRange.only(s));a.onsuccess=()=>{const u=a.result;u&&(u.delete(),u.continue())},t.oncomplete=()=>n(!0),t.onerror=()=>c(t.error)})}async appendEvents(s,e){if(e.length===0)return;const n=await this.openDB();return new Promise((c,t)=>{const r=n.transaction("events","readwrite"),i=r.objectStore("events");for(const a of e)i.put(a);r.oncomplete=()=>c(),r.onerror=()=>t(r.error)})}async getEvents(s,e){const n=await this.openDB();return new Promise((c,t)=>{const u=n.transaction("events","readonly").objectStore("events").index("sessionId").getAll(IDBKeyRange.only(s));u.onsuccess=()=>{let m=u.result||[];m.sort((l,f)=>l.sequence-f.sequence),e&&(m=m.filter(l=>!(e.category&&l.category!==e.category||e.type&&l.type!==e.type||typeof e.fromTimestamp=="number"&&l.timestampe.toTimestamp||typeof e.targetNodeId=="number"&&l.targetNodeId!==e.targetNodeId)),typeof e.offset=="number"&&(m=m.slice(e.offset)),typeof e.limit=="number"&&(m=m.slice(0,e.limit))),c(m)},u.onerror=()=>t(u.error)})}async getEventCount(s){const e=await this.openDB();return new Promise((n,c)=>{const a=e.transaction("events","readonly").objectStore("events").index("sessionId").count(IDBKeyRange.only(s));a.onsuccess=()=>n(a.result),a.onerror=()=>c(a.error)})}async saveCheckpoint(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction("checkpoints","readwrite");t.objectStore("checkpoints").put(s),t.oncomplete=()=>n(),t.onerror=()=>c(t.error)})}async getCheckpoints(s){const e=await this.openDB();return new Promise((n,c)=>{const i=e.transaction("checkpoints","readonly").objectStore("checkpoints").index("sessionId").getAll(IDBKeyRange.only(s));i.onsuccess=()=>{const a=i.result||[];a.sort((u,m)=>u.sequence-m.sequence),n(a)},i.onerror=()=>c(i.error)})}async saveInitialSnapshot(s,e){const n=await this.openDB();return new Promise((c,t)=>{const r=n.transaction("snapshots","readwrite");r.objectStore("snapshots").put({sessionId:s,snapshot:e}),r.oncomplete=()=>c(),r.onerror=()=>t(r.error)})}async getInitialSnapshot(s){const e=await this.openDB();return new Promise((n,c)=>{const r=e.transaction("snapshots","readonly").objectStore("snapshots").get(s);r.onsuccess=()=>n(r.result?r.result.snapshot:null),r.onerror=()=>c(r.error)})}async addAnnotation(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction("annotations","readwrite");t.objectStore("annotations").put(s),t.oncomplete=()=>n(),t.onerror=()=>c(t.error)})}async getAnnotations(s){const e=await this.openDB();return new Promise((n,c)=>{const i=e.transaction("annotations","readonly").objectStore("annotations").index("sessionId").getAll(IDBKeyRange.only(s));i.onsuccess=()=>n(i.result||[]),i.onerror=()=>c(i.error)})}}const h=new E("ForensicExtensionDB");let d=null,S=null;const w=new Map,g=new Map;async function R(){return new Promise(o=>{try{chrome.tabs.query({active:!0,currentWindow:!0},s=>{if(chrome.runtime.lastError||!s||s.length===0)return o(null);o(s[0].id??null)})}catch{o(null)}})}try{(_=(T=chrome.debugger)==null?void 0:T.onEvent)==null||_.addListener((o,s,e)=>{try{for(const[n,c]of g.entries())if((o==null?void 0:o.tabId)===c||(o==null?void 0:o.targetId)===`tab_${c}`){d==null||d.send(JSON.stringify({type:"CDP_EVENT",sessionId:n,method:s,params:e,timestamp:Date.now()}));return}}catch{}})}catch{}async function O(o,s){if(o==="LIST_TABS")return new Promise((e,n)=>{chrome.tabs.query({},c=>{if(chrome.runtime.lastError)return n(new Error(chrome.runtime.lastError.message));const t=(c||[]).map(r=>({id:r.id,index:r.index,windowId:r.windowId,title:r.title||"Untitled",url:r.url||"",active:!!r.active,status:r.status,pinned:!!r.pinned,favIconUrl:r.favIconUrl,audited:r.id?w.has(r.id):!1,incognito:!!r.incognito,width:r.width,height:r.height}));e({totalTabs:t.length,tabs:t})})});if(o==="FOCUS_TAB"){const e=Number(s==null?void 0:s.tabId);if(!e)throw new Error("tabId is required for focus_tab");return new Promise((n,c)=>{chrome.tabs.update(e,{active:!0},t=>{var r;if(chrome.runtime.lastError||!t)return c(new Error(((r=chrome.runtime.lastError)==null?void 0:r.message)||`Tab ${e} not found`));t.windowId?chrome.windows.update(t.windowId,{focused:!0},()=>{n({focused:!0,tab:{id:t.id,windowId:t.windowId,title:t.title,url:t.url,active:t.active}})}):n({focused:!0,tab:{id:t.id,title:t.title,url:t.url,active:t.active}})})})}if(o==="RELOAD_TAB"){const e=!!(s!=null&&s.bypassCache),n=s!=null&&s.tabId?Number(s.tabId):void 0;return new Promise((c,t)=>{const r=i=>{chrome.tabs.reload(i,{bypassCache:e},()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));chrome.tabs.get(i,a=>{c({reloaded:!0,tabId:i,bypassCache:e,url:a==null?void 0:a.url,title:a==null?void 0:a.title})})})};n?chrome.tabs.get(n,i=>{chrome.runtime.lastError||!i?chrome.tabs.query({active:!0,lastFocusedWindow:!0},a=>{const u=a&&a[0]?a[0]:null;u!=null&&u.id?r(u.id):t(new Error("No active tab found to reload"))}):r(n)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},i=>{const a=i&&i[0]?i[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to reload"));r(a.id)})})}if(o==="CLOSE_TAB"){const e=s!=null&&s.tabId?Number(s.tabId):void 0,n=s!=null&&s.url?String(s.url).toLowerCase():void 0;return new Promise((c,t)=>{const r=i=>{chrome.tabs.remove(i,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));c({closed:!0,tabIds:i,count:i.length})})};e?r([e]):n?chrome.tabs.query({},i=>{const u=(i||[]).filter(m=>{var l,f;return((l=m.url)==null?void 0:l.toLowerCase().includes(n))||((f=m.title)==null?void 0:f.toLowerCase().includes(n))}).map(m=>m.id).filter(Boolean);if(u.length===0)return c({closed:!1,message:`No open tab matched '${n}'`});r(u)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},i=>{const a=i&&i[0]?i[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to close"));r([a.id])})})}if(o==="OPEN_TAB"){const e=s==null?void 0:s.url;if(!e)throw new Error("url is required for open_tab");let n=String(e).trim();!n.startsWith("http://")&&!n.startsWith("https://")&&!n.startsWith("file://")&&!n.startsWith("chrome://")&&!n.startsWith("about:")&&(n.includes("meet.google.com")||n.includes("localhost")||n.includes(".com")||n.includes(".org")||n.includes(".net")||n.includes(".ir")||n.includes(".io")||n.includes(".app"))&&(n="https://"+n);const c=s.active!==!1,t=!!s.pinned;return new Promise((r,i)=>{chrome.tabs.create({url:n,active:c,pinned:t},a=>{if(chrome.runtime.lastError)return i(new Error(chrome.runtime.lastError.message));r({opened:!0,tabId:a.id,windowId:a.windowId,url:a.url||n,title:a.title||"New Tab",active:a.active,status:a.status})})})}if(o==="LIST_EXTENSIONS")return new Promise((e,n)=>{var c;if(!((c=chrome.management)!=null&&c.getAll))return n(new Error("chrome.management API not available"));chrome.management.getAll(t=>{if(chrome.runtime.lastError)return n(new Error(chrome.runtime.lastError.message));const r=(t||[]).map(i=>({id:i.id,name:i.name,version:i.version,description:i.description,enabled:i.enabled,installType:i.installType,isApp:i.isApp,homepageUrl:i.homepageUrl,permissions:i.permissions}));e({totalExtensions:r.length,extensions:r})})});if(o==="SET_EXTENSION_ENABLED"){const e=s==null?void 0:s.extensionId,n=!!(s!=null&&s.enabled);if(!e)throw new Error("extensionId is required for SET_EXTENSION_ENABLED");return new Promise((c,t)=>{var r;if(!((r=chrome.management)!=null&&r.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,n,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to set enabled state for ${e}`));c({success:!0,extensionId:e,enabled:n,message:`Extension ${e} successfully ${n?"enabled":"disabled"}.`})})})}if(o==="TOGGLE_EXTENSION"){const e=s==null?void 0:s.extensionId;if(!e)throw new Error("extensionId is required for TOGGLE_EXTENSION");return new Promise((n,c)=>{var t,r;if(!((t=chrome.management)!=null&&t.get)||!((r=chrome.management)!=null&&r.setEnabled))return c(new Error("chrome.management API not available"));chrome.management.get(e,i=>{var u;if(chrome.runtime.lastError||!i)return c(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||`Extension ${e} not found`));const a=!i.enabled;chrome.management.setEnabled(e,a,()=>{if(chrome.runtime.lastError)return c(new Error(chrome.runtime.lastError.message||`Failed to toggle ${e}`));n({success:!0,extensionId:e,enabled:a,name:i.name,message:`Extension ${i.name} (${e}) toggled to ${a?"enabled":"disabled"}.`})})})})}if(o==="RESIZE_VIEWPORT"){const e=Math.max(200,Math.min(7680,Number(s==null?void 0:s.width)||1280)),n=Math.max(200,Math.min(4320,Number(s==null?void 0:s.height)||800));return new Promise((c,t)=>{chrome.windows.getCurrent({populate:!1},r=>{var i;if(chrome.runtime.lastError||!r)return t(new Error(((i=chrome.runtime.lastError)==null?void 0:i.message)||"No current window"));chrome.windows.update(r.id??chrome.windows.WINDOW_ID_CURRENT,{width:e,height:n,state:"normal"},a=>{var u;if(chrome.runtime.lastError||!a)return t(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||"Window resize failed"));c({success:!0,applied:{width:a.width,height:a.height},previous:{width:r.width,height:r.height},original:{width:r.width,height:r.height},reversible:!0,mode:"browser-window",note:"Reset with reset_viewport — the content script tracks the original size."})})})})}if(o==="RESET_VIEWPORT")return new Promise((e,n)=>{chrome.windows.getCurrent({populate:!1},c=>{var t;if(chrome.runtime.lastError||!c)return n(new Error(((t=chrome.runtime.lastError)==null?void 0:t.message)||"No current window"));chrome.windows.update(c.id??chrome.windows.WINDOW_ID_CURRENT,{state:"maximized"},r=>{var i;if(chrome.runtime.lastError||!r)return n(new Error(((i=chrome.runtime.lastError)==null?void 0:i.message)||"Window restore failed"));e({success:!0,applied:{width:r.width,height:r.height},previous:{width:c.width,height:c.height},original:{width:r.width,height:r.height},reversible:!1,mode:"browser-window",note:"Window restored to maximized state."})})})});if(o==="RELOAD_EXTENSION"){const e=s==null?void 0:s.extensionId,n=chrome.runtime.id;return!e||e===n?(setTimeout(()=>chrome.runtime.reload(),150),{reloaded:!0,extensionId:n,isSelf:!0,message:"Forensic Recorder extension is reloading now."}):new Promise((c,t)=>{var r;if(!((r=chrome.management)!=null&&r.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,!1,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to disable ${e}`));setTimeout(()=>{chrome.management.setEnabled(e,!0,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to re-enable ${e}`));c({reloaded:!0,extensionId:e,isSelf:!1,message:`Extension ${e} successfully reloaded.`})})},150)})})}if(o==="CDP_ATTACH"){const e=(s==null?void 0:s.tabId)!==void 0?Number(s.tabId):await R();if(e===null)throw new Error("No target tab available for CDP attach.");return new Promise((n,c)=>{var t;if(!((t=chrome.debugger)!=null&&t.attach))return c(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));chrome.debugger.attach({tabId:e},"1.3",()=>{if(chrome.runtime.lastError){const r=chrome.runtime.lastError.message||"";return r.includes("Another debugger is already attached")?c(new Error(`CDP_ATTACH failed: Chrome DevTools (F12) is already open on tab ${e}. Please close the F12 panel on that tab so TeleDOM can attach.`)):c(new Error(`CDP_ATTACH failed: ${r}`))}s!=null&&s.sessionId&&g.set(String(s.sessionId),e),chrome.debugger.getTargets(r=>{const i=(r||[]).find(a=>a.tabId===e)||{};n({attached:!0,sessionId:s==null?void 0:s.sessionId,tabId:e,targetId:i.id||`tab_${e}`,type:i.type||"page"})})})})}if(o==="CDP_COMMAND"){const{sessionId:e,method:n,params:c}=s||{};if(!n)throw new Error("CDP_COMMAND requires method");return new Promise((t,r)=>{var a;if(!((a=chrome.debugger)!=null&&a.sendCommand))return r(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));const i=g.get(e);if(i===void 0)return r(new Error(`CDP_SESSION_NOT_FOUND: no tab bound to session '${e}' — attach first.`));chrome.debugger.sendCommand({tabId:i},n,c||{},u=>{if(chrome.runtime.lastError){t({__cdpError:!0,code:"CDP_PROTOCOL_ERROR",message:chrome.runtime.lastError.message,method:n});return}t({result:u??{}})})})}if(o==="CDP_DETACH"){const{sessionId:e}=s||{},n=g.get(e);return g.delete(e),n===void 0?{detached:!1,reason:"session not found"}:new Promise((c,t)=>{var r;if(!((r=chrome.debugger)!=null&&r.detach))return c({detached:!1,reason:"chrome.debugger unavailable"});chrome.debugger.detach({tabId:n},()=>{if(chrome.runtime.lastError)return c({detached:!1,reason:chrome.runtime.lastError.message});c({detached:!0,sessionId:e,tabId:n})})})}throw new Error(`Unsupported background command: ${o}`)}function b(){if(!(typeof WebSocket>"u"))try{const o=new WebSocket("ws://127.0.0.1:3847");let s=null;o.onopen=()=>{var e;d=o,console.log("[Forensic Extension] Connected to MCP Bridge on ws://127.0.0.1:3847"),S&&(clearInterval(S),S=null),o.send(JSON.stringify({type:"REGISTER_CLIENT",clientType:"SERVICE_WORKER",url:typeof chrome<"u"&&((e=chrome.runtime)!=null&&e.id)?`chrome-extension://${chrome.runtime.id}`:"service-worker",title:"Forensic Service Worker"})),s&&clearInterval(s),s=setInterval(()=>{if(o&&o.readyState===WebSocket.OPEN)try{o.send(JSON.stringify({type:"HEARTBEAT",timestamp:Date.now()}))}catch(n){console.warn("[TeleDOM SW] non-critical operation failed:",(n==null?void 0:n.message)??n)}},15e3)},o.onclose=()=>{s&&clearInterval(s),d=null,N()},o.onerror=()=>{s&&clearInterval(s),d=null,N()},o.onmessage=async e=>{try{const n=JSON.parse(e.data.toString());if(n.type==="BROWSER_COMMAND_REQUEST"){const{id:c,command:t,payload:r}=n;if(typeof chrome>"u"||!chrome.tabs){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_CHROME_TABS_API",message:"chrome.tabs API not available in this context"}}));return}if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","CLOSE_TAB","OPEN_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","SET_EXTENSION_ENABLED","TOGGLE_EXTENSION","CDP_ATTACH","CDP_COMMAND","CDP_DETACH"].includes(t)){try{const u=await O(t,r);o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!0,data:u}))}catch(u){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"COMMAND_ERROR",message:u.message}}))}return}const i=r!=null&&r.tabId?Number(r.tabId):void 0,a=u=>{if(t==="LIVE_PAGE_SCREENSHOT"||t==="LIVE_ELEMENT_SCREENSHOT"){chrome.tabs.sendMessage(u,{type:"HIDE_FORENSIC_OVERLAYS"},()=>{setTimeout(()=>{chrome.tabs.captureVisibleTab({format:"png"},m=>{var l;if(chrome.tabs.sendMessage(u,{type:"RESTORE_FORENSIC_OVERLAYS"}),chrome.runtime.lastError||!m){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"SCREENSHOT_FAILED",message:((l=chrome.runtime.lastError)==null?void 0:l.message)||"captureVisibleTab failed"}}));return}chrome.tabs.sendMessage(u,{type:"BROWSER_COMMAND_REQUEST",id:c,command:t,payload:{...r,dataUrl:m}},f=>{const C=f||{id:c,command:t,success:!0,data:{dataUrl:m,captureType:t==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}};o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...C}))})})},150)});return}chrome.tabs.sendMessage(u,n,m=>{if(chrome.runtime.lastError){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"CONTENT_SCRIPT_UNREACHABLE",message:chrome.runtime.lastError.message||`Content script unreachable on tab ${u}`}}));return}o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...m||{id:c,command:t,success:!0}}))})};i?a(i):chrome.tabs.query({active:!0,lastFocusedWindow:!0},async u=>{const m=u&&u[0]?u[0]:null,l=m==null?void 0:m.id;if(!l){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_ACTIVE_TAB",message:"No active browser tab found"}}));return}a(l)})}}catch(n){console.error("[ServiceWorker] Bridge message handling error:",n)}}}catch{d=null,N()}}function N(){S||(S=setInterval(()=>{(!d||d.readyState!==WebSocket.OPEN)&&b()},5e3))}if(typeof chrome<"u"&&chrome.alarms)try{chrome.alarms.create("teledom_bridge_keepalive",{periodInMinutes:.4}),chrome.alarms.onAlarm.addListener(o=>{if(o.name==="teledom_bridge_keepalive")if(!d||d.readyState!==WebSocket.OPEN)b();else try{d.send(JSON.stringify({type:"HEARTBEAT",timestamp:Date.now()}))}catch{b()}})}catch(o){console.warn("[ServiceWorker] Alarms keepalive setup failed:",o==null?void 0:o.message)}b(),typeof chrome<"u"&&((p=chrome.webNavigation)!=null&&p.onCommitted)&&chrome.webNavigation.onCommitted.addListener(async o=>{var t;if(o.frameId!==0)return;const s=o.tabId,e=w.get(s);if(!e||!e.isRecording)return;let n="NAV_OTHER";o.transitionType==="reload"?n="NAV_RELOAD":(t=o.transitionQualifiers)!=null&&t.includes("forward_back")?n="NAV_FORWARD_BACK":o.transitionType==="link"&&(n="NAV_LINK");const c={id:`nav_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,sessionId:e.sessionId,timestamp:Date.now()-e.startTime,sequence:999999,wallClockTime:Date.now(),type:n,category:"NAVIGATION",source:"USER_INTERACTION",payload:{url:o.url,transitionType:o.transitionType,transitionQualifiers:o.transitionQualifiers,tabId:o.tabId}};try{await h.appendEvents(e.sessionId,[c]),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"FORENSIC_EVENTS_CHUNK",sessionId:e.sessionId,events:[c]}))}catch{}}),typeof chrome<"u"&&((A=chrome.runtime)!=null&&A.onMessage)&&chrome.runtime.onMessage.addListener((o,s,e)=>((async()=>{var n,c,t;try{const r=((n=s.tab)==null?void 0:n.id)??o.tabId;if(o.type==="FORENSIC_SESSION_START")r&&w.set(r,{sessionId:o.metadata.id,sessionName:o.metadata.name,startTime:o.metadata.startTime,initialUrl:o.metadata.url,isRecording:!0}),await h.saveSession(o.metadata),o.initialSnapshot&&await h.saveInitialSnapshot(o.metadata.id,o.initialSnapshot),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0,sessionId:o.metadata.id});else if(o.type==="GET_TAB_RECORDING_STATE"){const i=r?w.get(r):null;e({isRecording:!!(i!=null&&i.isRecording),recording:i||null})}else if(o.type==="FORENSIC_EVENTS_CHUNK")await h.appendEvents(o.sessionId,o.events),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0});else if(o.type==="FORENSIC_CHECKPOINT")await h.saveCheckpoint(o.checkpoint),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0});else if(o.type==="FORENSIC_SESSION_STOP"){r&&w.delete(r);const i=await h.getSession(o.sessionId);i&&(i.status="stopped",i.endTime=Date.now(),(c=o.metadata)!=null&&c.durationMs&&(i.durationMs=o.metadata.durationMs),await h.saveSession(i)),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0})}else if(o.type==="OPEN_DASHBOARD_TAB"){const i=chrome.runtime.getURL(`dist/src/ui/index.html${o.sessionId?`?session=${o.sessionId}`:""}`);chrome.tabs.create({url:i}),e({success:!0,url:i})}else if(o.type==="CAPTURE_SCREENSHOT"){if((t=chrome.tabs)!=null&&t.captureVisibleTab){chrome.tabs.captureVisibleTab({format:"png"},i=>{e({success:!!i,dataUrl:i})});return}e({success:!1,error:"Screenshot capture unsupported"})}else if(o.type==="ELEMENT_SELECTED")d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0});else if(o.type==="BROWSER_COMMAND_REQUEST")try{const i=await O(o.command,o.payload);e({id:o.id,command:o.command,success:!0,data:i})}catch(i){e({id:o.id,command:o.command,success:!1,error:{code:"COMMAND_ERROR",message:i.message}})}}catch(r){e({success:!1,error:r.message})}})(),!0)),b()})(); diff --git a/chrome-extension/dist/server/bridge-server.js b/chrome-extension/dist/server/bridge-server.js index a5935064..3de222fe 100644 --- a/chrome-extension/dist/server/bridge-server.js +++ b/chrome-extension/dist/server/bridge-server.js @@ -123,14 +123,14 @@ class FileStorageProvider { async saveSession(metadata) { const dir = this.getSessionDir(metadata.id); const metaPath = path.join(dir, "metadata.json"); - fs.writeFileSync(metaPath, JSON.stringify(metadata, null, 2), "utf-8"); + await fs.promises.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf-8"); } async getSession(sessionId) { const dir = path.join(this.baseDir, sessionId); const metaPath = path.join(dir, "metadata.json"); if (!fs.existsSync(metaPath)) return null; try { - const data = fs.readFileSync(metaPath, "utf-8"); + const data = await fs.promises.readFile(metaPath, "utf-8"); return JSON.parse(data); } catch { return null; @@ -157,7 +157,7 @@ class FileStorageProvider { async deleteSession(sessionId) { const dir = path.join(this.baseDir, sessionId); if (fs.existsSync(dir)) { - fs.rmSync(dir, { recursive: true, force: true }); + await fs.promises.rm(dir, { recursive: true, force: true }); return true; } return false; @@ -167,7 +167,7 @@ class FileStorageProvider { const dir = this.getSessionDir(sessionId); const eventsPath = path.join(dir, "events.jsonl"); const lines = events.map((e) => JSON.stringify(e)).join("\n") + "\n"; - fs.appendFileSync(eventsPath, lines, "utf-8"); + await fs.promises.appendFile(eventsPath, lines, "utf-8"); } async getEvents(sessionId, filter) { const dir = path.join(this.baseDir, sessionId); @@ -241,7 +241,7 @@ class FileStorageProvider { const chkDir = path.join(dir, "checkpoints"); if (!fs.existsSync(chkDir)) fs.mkdirSync(chkDir, { recursive: true }); const file = path.join(chkDir, `${checkpoint.checkpointId}.json`); - fs.writeFileSync(file, JSON.stringify(checkpoint, null, 2), "utf-8"); + await fs.promises.writeFile(file, JSON.stringify(checkpoint, null, 2), "utf-8"); } async getCheckpoints(sessionId) { const dir = path.join(this.baseDir, sessionId, "checkpoints"); @@ -250,7 +250,7 @@ class FileStorageProvider { const checkpoints = []; for (const f of files) { try { - const data = fs.readFileSync(path.join(dir, f), "utf-8"); + const data = await fs.promises.readFile(path.join(dir, f), "utf-8"); checkpoints.push(JSON.parse(data)); } catch { } @@ -260,14 +260,14 @@ class FileStorageProvider { async saveInitialSnapshot(sessionId, snapshot) { const dir = this.getSessionDir(sessionId); const file = path.join(dir, "initial_snapshot.json"); - fs.writeFileSync(file, JSON.stringify(snapshot, null, 2), "utf-8"); + await fs.promises.writeFile(file, JSON.stringify(snapshot, null, 2), "utf-8"); } async getInitialSnapshot(sessionId) { const dir = path.join(this.baseDir, sessionId); const file = path.join(dir, "initial_snapshot.json"); if (!fs.existsSync(file)) return null; try { - return JSON.parse(fs.readFileSync(file, "utf-8")); + return JSON.parse(await fs.promises.readFile(file, "utf-8")); } catch { return null; } @@ -278,13 +278,13 @@ class FileStorageProvider { let list = []; if (fs.existsSync(annPath)) { try { - list = JSON.parse(fs.readFileSync(annPath, "utf-8")); + list = JSON.parse(await fs.promises.readFile(annPath, "utf-8")); } catch { list = []; } } list.push(annotation); - fs.writeFileSync(annPath, JSON.stringify(list, null, 2), "utf-8"); + await fs.promises.writeFile(annPath, JSON.stringify(list, null, 2), "utf-8"); } async getAnnotations(sessionId) { const dir = path.join(this.baseDir, sessionId); @@ -10471,6 +10471,111 @@ function buildToolCatalog() { } return catalog; } +const TELEDOM_PROFILE_TOOLS = { + // Minimal profile: strictly essential browser actions (~22 tools, ~2.5k tokens) + minimal: [ + "td_browser_navigate", + "td_browser_back", + "td_browser_forward", + "td_browser_refresh", + "td_dom_inspect", + "td_dom_query", + "td_dom_extract", + "td_dom_snapshot", + "td_target_find", + "td_target_check", + "td_action_click", + "td_action_type", + "td_action_select", + "td_action_press", + "td_action_scroll", + "td_wait", + "td_screenshot", + "td_execute_script", + "list_tabs", + "focus_tab", + "close_tab", + "open_tab" + ], + // Core profile: browser primitives + workflow runtime + target memory (~44 tools, ~4.8k tokens) + core: [ + "td_browser_navigate", + "td_browser_back", + "td_browser_forward", + "td_browser_refresh", + "td_dom_inspect", + "td_dom_query", + "td_dom_extract", + "td_dom_snapshot", + "td_target_find", + "td_target_check", + "td_target_describe", + "td_action_click", + "td_action_type", + "td_action_select", + "td_action_hover", + "td_action_press", + "td_action_scroll", + "td_wait", + "td_screenshot", + "td_execute_script", + "td_network_inspect", + "td_console_read", + "td_workflow_save", + "td_workflow_get", + "td_workflow_list", + "td_workflow_update", + "td_workflow_delete", + "td_workflow_validate", + "td_workflow_run", + "td_workflow_runs", + "td_workflow_replay", + "td_target_memory_save", + "td_target_memory_get", + "td_target_memory_list", + "td_target_memory_delete", + "list_tabs", + "focus_tab", + "reload_tab", + "close_tab", + "open_tab", + "inspect_live_page", + "inspect_live_element" + ], + // Forensics profile: historical forensics + diffs + causality + live inspection (~50 tools) + forensics: [ + "list_sessions", + "get_session", + "export_session", + "import_session", + "delete_session", + "get_timeline", + "get_events", + "get_events_around", + "get_dom_state", + "get_dom_node", + "get_dom_subtree", + "diff_dom", + "trace_element", + "find_disappearing_elements", + "why_did_element_disappear", + "get_diagnostics", + "get_network_events", + "get_screenshots", + "td_browser_navigate", + "td_dom_inspect", + "td_dom_query", + "td_dom_extract", + "td_screenshot", + "td_action_click", + "td_action_type", + "td_workflow_run", + "list_tabs", + "focus_tab" + ], + // Full profile: all 350 tools (null means no filtering) + full: null +}; const MCPDOM_V3_TOOLS = [ // ================================================================== // Targeting & forensics @@ -25415,12 +25520,14 @@ class MCPBridgeServer { if (targets.length === 0) { for (const [sock, meta] of this.socketMetadata.entries()) { if (meta.clientType === "CONTENT_SCRIPT" && sock.readyState === WebSocket.OPEN) { - targets.push(sock); + targets = [sock]; + break; } } } - if (targets.length === 0) { - targets = Array.from(this.activeSockets); + if (targets.length === 0 && this.activeSockets.size > 0) { + const first = Array.from(this.activeSockets).find((s) => s.readyState === WebSocket.OPEN); + if (first) targets = [first]; } let sentCount = 0; for (const ws of targets) { @@ -25443,17 +25550,53 @@ class MCPBridgeServer { } start() { return new Promise((resolve, reject) => { + const isTrustedOrigin = (origin) => { + if (!origin) return true; + if (origin.startsWith("chrome-extension://")) return true; + if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) return true; + return false; + }; this.httpServer = http.createServer(async (req, res) => { - res.setHeader("Access-Control-Allow-Origin", "*"); + const origin = req.headers.origin; + if (origin) { + if (isTrustedOrigin(origin)) { + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Vary", "Origin"); + } else if (req.method === "OPTIONS") { + res.writeHead(403, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: "CORS Forbidden: Untrusted cross-origin request rejected" })); + return; + } + } res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); - res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, x-teledom-token"); if (req.method === "OPTIONS") { res.writeHead(204); res.end(); return; } const url = req.url || ""; - if (url === "/health" && req.method === "GET") { + const isAuthValid = () => { + if (!isTrustedOrigin(origin)) return false; + const expectedToken = process.env.TELEDOM_BRIDGE_TOKEN; + if (!expectedToken) return true; + const authHeader = req.headers.authorization; + const tokenHeader = req.headers["x-teledom-token"]; + let queryToken = null; + try { + const parsed = new URL(url, "http://127.0.0.1"); + queryToken = parsed.searchParams.get("token"); + } catch { + } + if (authHeader && authHeader.startsWith("Bearer ")) { + return authHeader.slice(7).trim() === expectedToken; + } + if (tokenHeader && tokenHeader === expectedToken) return true; + if (queryToken && queryToken === expectedToken) return true; + return false; + }; + if (url.startsWith("/health") && req.method === "GET") { res.writeHead(200, { "Content-Type": "application/json" }); res.end( JSON.stringify({ @@ -25465,6 +25608,13 @@ class MCPBridgeServer { ); return; } + if (["/api/mcp/tool", "/api/tabs/close", "/api/sessions/upload"].some((p) => url.startsWith(p))) { + if (!isAuthValid()) { + res.writeHead(403, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: "Forbidden: Invalid or missing authorization credentials" })); + return; + } + } const MAX_PAYLOAD_BYTES = 50 * 1024 * 1024; if (url === "/api/sessions/upload" && req.method === "POST") { let body = ""; @@ -25583,7 +25733,13 @@ class MCPBridgeServer { } }, 3e4); this.healthSweepInterval?.unref?.(); - this.wss.on("connection", (ws) => { + this.wss.on("connection", (ws, req) => { + const origin = req?.headers?.origin; + if (origin && !isTrustedOrigin(origin)) { + console.error(`[MCP Bridge] WebSocket connection rejected from untrusted origin: ${origin}`); + ws.close(4403, "Forbidden origin"); + return; + } this.activeSockets.add(ws); console.error(`[MCP Bridge] Client connected. Total active clients: ${this.activeSockets.size}`); ws.on("close", () => { @@ -25714,5 +25870,6 @@ export { TELEDOM_INTELLIGENCE_TOOLS as T, TELEDOM_VERSION as a, FileStorageProvider as b, - MCPToolsHandler as c + MCPToolsHandler as c, + TELEDOM_PROFILE_TOOLS as d }; diff --git a/chrome-extension/dist/server/mcp-server.js b/chrome-extension/dist/server/mcp-server.js index bf9f2d9e..e8f91c4c 100644 --- a/chrome-extension/dist/server/mcp-server.js +++ b/chrome-extension/dist/server/mcp-server.js @@ -1,6 +1,6 @@ import * as readline from "readline"; import * as fs from "fs"; -import { M as MCPDOM_V3_TOOLS, D as DEVTOOLS_TOOLS, F as FORENSICS_TOOLS, T as TELEDOM_INTELLIGENCE_TOOLS, a as TELEDOM_VERSION, b as FileStorageProvider, c as MCPToolsHandler, MCPBridgeServer } from "./bridge-server.js"; +import { M as MCPDOM_V3_TOOLS, D as DEVTOOLS_TOOLS, F as FORENSICS_TOOLS, T as TELEDOM_INTELLIGENCE_TOOLS, a as TELEDOM_VERSION, b as FileStorageProvider, c as MCPToolsHandler, MCPBridgeServer, d as TELEDOM_PROFILE_TOOLS } from "./bridge-server.js"; import "http"; import "ws"; import "path"; @@ -872,9 +872,15 @@ class ForensicMCPServer { const disableDevTools = process.env.FORENSIC_DISABLE_DEVTOOLS === "true"; const disableForensics = process.env.FORENSIC_DISABLE_FORENSICS === "true"; const disableIntelligence = process.env.FORENSIC_DISABLE_INTELLIGENCE === "true"; - const tools = FORENSIC_MCP_TOOLS.filter( + const profile = (process.env.TELEDOM_PROFILE || "full").toLowerCase(); + const profileAllowed = TELEDOM_PROFILE_TOOLS[profile]; + let tools = FORENSIC_MCP_TOOLS.filter( (t) => !(disableDevTools && t.name.startsWith("dt_")) && !(disableForensics && t.name.startsWith("fx_")) && !(disableIntelligence && t.name.startsWith("td_")) ); + if (profileAllowed && Array.isArray(profileAllowed)) { + const allowedSet = new Set(profileAllowed); + tools = tools.filter((t) => allowedSet.has(t.name)); + } return { jsonrpc: "2.0", id, @@ -1077,5 +1083,6 @@ export { FORENSIC_MCP_TOOLS, FileStorageProvider, ForensicMCPServer, - MCPToolsHandler + MCPToolsHandler, + TELEDOM_PROFILE_TOOLS }; diff --git a/chrome-extension/dist/src/extension/devtools/devtools.html b/chrome-extension/dist/src/extension/devtools/devtools.html index e5ead51c..ec623abe 100644 --- a/chrome-extension/dist/src/extension/devtools/devtools.html +++ b/chrome-extension/dist/src/extension/devtools/devtools.html @@ -1,10 +1,10 @@ - - - - + + + + - - - - + + + + diff --git a/chrome-extension/dist/src/extension/popup/popup.html b/chrome-extension/dist/src/extension/popup/popup.html index 9f991f9c..6b4f597e 100644 --- a/chrome-extension/dist/src/extension/popup/popup.html +++ b/chrome-extension/dist/src/extension/popup/popup.html @@ -1,54 +1,54 @@ - - - - - Forensic Recorder + + + + + Forensic Recorder - - - - - + + + + + diff --git a/chrome-extension/dist/src/ui/index.html b/chrome-extension/dist/src/ui/index.html index e82ee8a9..0412e036 100644 --- a/chrome-extension/dist/src/ui/index.html +++ b/chrome-extension/dist/src/ui/index.html @@ -1,243 +1,243 @@ - - - - - - Browser Forensic Recorder & Time-Travel Debugger + + + + + + Browser Forensic Recorder & Time-Travel Debugger - - - -
-
-
-
- Browser Forensic Debugger - v2.0 MCP -
-
- -
-
- - -
-
- -
- - - - - - - -
-
- - -
- -
-
-
- T: 0.0ms | URL: - -
-
-
-
- - -
- - -
- -
-
-
-
Load or record a session to inspect DOM.
-
-
-
Select an element from the DOM tree or replay viewport.
-
-
-
- - -
-
-
- - - - - - -
-
-
-
Select timestamps and click Compare States.
-
-
-
- - -
-
-
-

Disappearing UI Forensic Diagnosis

-
- - -
-
-
-
Enter a CSS selector or node ID to run root-cause diagnosis.
-
-
-
- - -
-
-
No console or error events recorded.
-
-
- - -
-
-
No network events recorded.
-
-
- - -
-
-
- - -
-
-
-
- - -
-
-
-
-
⚡ Agent-Owned Workflows
-
TeleDOM stores and executes; the agent designs and repairs. Teach once · Reuse forever · Prove what happened.
-
- -
-
-
Recent Runs
-
-
-
-
-
-
- - -
-
-
- - - - - -
- -
- 0.0ms - / 0.0ms -
- -
- - -
-
- -
-
-
-
-
DOM Mut
-
-
-
-
User Act
-
-
-
-
Errors
-
-
-
-
Network
-
-
-
-
- - - - - - - - + + + +
+
+
+
+ Browser Forensic Debugger + v2.0 MCP +
+
+ +
+
+ + +
+
+ +
+ + + + + + + +
+
+ + +
+ +
+
+
+ T: 0.0ms | URL: - +
+
+
+
+ + +
+ + +
+ +
+
+
+
Load or record a session to inspect DOM.
+
+
+
Select an element from the DOM tree or replay viewport.
+
+
+
+ + +
+
+
+ + + + + + +
+
+
+
Select timestamps and click Compare States.
+
+
+
+ + +
+
+
+

Disappearing UI Forensic Diagnosis

+
+ + +
+
+
+
Enter a CSS selector or node ID to run root-cause diagnosis.
+
+
+
+ + +
+
+
No console or error events recorded.
+
+
+ + +
+
+
No network events recorded.
+
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+
+
+
⚡ Agent-Owned Workflows
+
TeleDOM stores and executes; the agent designs and repairs. Teach once · Reuse forever · Prove what happened.
+
+ +
+
+
Recent Runs
+
+
+
+
+
+
+ + +
+
+
+ + + + + +
+ +
+ 0.0ms + / 0.0ms +
+ +
+ + +
+
+ +
+
+
+
+
DOM Mut
+
+
+
+
User Act
+
+
+
+
Errors
+
+
+
+
Network
+
+
+
+
+ + + + + + + + diff --git a/chrome-extension/manifest.json b/chrome-extension/manifest.json index 63066493..5c230ce8 100644 --- a/chrome-extension/manifest.json +++ b/chrome-extension/manifest.json @@ -16,7 +16,8 @@ "tabs", "webNavigation", "management", - "debugger" + "debugger", + "alarms" ], "host_permissions": [ "" diff --git a/dist/extension/content-script.js b/dist/extension/content-script.js index 85ef3552..faa564d3 100644 --- a/dist/extension/content-script.js +++ b/dist/extension/content-script.js @@ -1,10 +1,10 @@ -var Bt=Object.defineProperty;var Ft=(U,z,Y)=>z in U?Bt(U,z,{enumerable:!0,configurable:!0,writable:!0,value:Y}):U[z]=Y;var f=(U,z,Y)=>Ft(U,typeof z!="symbol"?z+"":z,Y);(function(){"use strict";var U=(l=>(l[l.ELEMENT_NODE=1]="ELEMENT_NODE",l[l.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",l[l.TEXT_NODE=3]="TEXT_NODE",l[l.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",l[l.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",l[l.COMMENT_NODE=8]="COMMENT_NODE",l[l.DOCUMENT_NODE=9]="DOCUMENT_NODE",l[l.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",l[l.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",l))(U||{});class z{constructor(){f(this,"nextId",1);f(this,"nodeToIdMap",new WeakMap);f(this,"idToNodeMap",new Map);f(this,"identities",new Map);f(this,"parentHistory",new Map)}getOrCreateId(e,t=0){if(this.nodeToIdMap.has(e))return this.nodeToIdMap.get(e);const s=this.nextId++;this.nodeToIdMap.set(e,s),this.idToNodeMap.set(s,e);const i=e.nodeType===U.ELEMENT_NODE||e.nodeType===1?e:null,r=i&&i.tagName?i.tagName.toLowerCase():void 0,o=r?r.includes("-"):!1,a={id:s,nodeType:e.nodeType,tagName:r,createdAt:t,initialSelectorHint:i?this.computeSelector(i):void 0,isCustomElement:o};return this.identities.set(s,a),s}getId(e){return this.nodeToIdMap.get(e)}getNode(e){return this.idToNodeMap.get(e)}getIdentity(e){return this.identities.get(e)}recordParent(e,t){if(!t)return;const s=this.parentHistory.get(e)||[];s[s.length-1]!==t&&(s.push(t),this.parentHistory.set(e,s))}getParentHistory(e){return this.parentHistory.get(e)||[]}computeSelector(e){try{const t=typeof e.id=="string"?e.id:e.getAttribute?e.getAttribute("id"):"";if(t&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(t))return`#${t}`;const s=e.tagName?e.tagName.toLowerCase():"element";if(s==="body"||s==="html"||s==="head")return s;let n=[];e.classList&&typeof e.classList.forEach=="function"?n=Array.from(e.classList):typeof e.className=="string"?n=e.className.split(/\s+/):e.className&&typeof e.className.baseVal=="string"&&(n=e.className.baseVal.split(/\s+/));let i="";if(n.length>0){const r=n.filter(o=>typeof o=="string"&&/^[a-zA-Z0-9_-]+$/.test(o)&&!o.startsWith("ng-")&&!o.startsWith("_ng")).slice(0,3);r.length>0&&(i="."+r.join("."))}if(e.parentElement&&e.parentElement.children){const r=Array.from(e.parentElement.children).filter(o=>o.tagName&&o.tagName.toLowerCase()===s);if(r.length>1){const o=r.indexOf(e)+1;if(o>0)return`${s}${i}:nth-of-type(${o})`}}return`${s}${i}`}catch{return e.tagName?e.tagName.toLowerCase():"element"}}computeFullSelectorPath(e){const t=[];let s=e;for(;s&&s.tagName&&s.tagName.toLowerCase()!=="html";){const n=this.computeSelector(s);if(t.unshift(n),s.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(s.id))break;s=s.parentElement}return t.join(" > ")}removeNode(e){this.idToNodeMap.get(e)&&this.idToNodeMap.delete(e)}reset(){this.nextId=1,this.nodeToIdMap=new WeakMap,this.idToNodeMap.clear(),this.identities.clear(),this.parentHistory.clear()}}const Y={maskAllInputs:!1,maskInputTypes:["password","hidden","tel","email"],maskSelectors:["[data-private]",".private-data",".sensitive",'[data-testid="sensitive"]'],blockSelectors:[".recording-blocked","[data-recording-ignore]"],redactHeaders:["authorization","cookie","set-cookie","x-api-key","proxy-authorization","token"],redactQueryParams:["token","key","auth","secret","password","access_token","apiKey","bearer"],maxTextLength:1e5};class se{constructor(e={}){f(this,"config");this.config={...Y,...e}}shouldBlockNode(e){if(!e||!e.matches)return!1;for(const t of this.config.blockSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}shouldMaskText(e){if(!e||!e.matches)return!1;for(const t of this.config.maskSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}maskValue(e,t,s){return e&&(this.config.maskAllInputs?"*".repeat(Math.min(e.length,12)):t&&this.config.maskInputTypes.includes(t.toLowerCase())||s&&/(password|token|secret|cvv|credit|auth|ssn)/i.test(s)?"••••••••":e)}sanitizeText(e,t=!1){return e&&(t?e.replace(/[^\s\n\r\t]/g,"*"):e.length>this.config.maxTextLength?e.substring(0,this.config.maxTextLength)+"... [TRUNCATED]":e)}sanitizeHeaders(e){if(!e)return;const t={};for(const[s,n]of Object.entries(e)){const i=s.toLowerCase();this.config.redactHeaders.some(r=>i.includes(r))?t[s]="[REDACTED]":t[s]=n}return t}sanitizeUrl(e){try{const t=new URL(e);for(const s of this.config.redactQueryParams)t.searchParams.has(s)&&t.searchParams.set(s,"[REDACTED]");return t.toString()}catch{return e}}}class oe{constructor(){f(this,"currentSequence",0);f(this,"sessionStartTime");f(this,"sessionStartWallClock");this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}nextSequence(){return this.currentSequence+=1,this.currentSequence}getSequence(){return this.currentSequence}getRelativeTimestamp(){return typeof performance<"u"?Math.round((performance.now()-this.sessionStartTime)*100)/100:Date.now()-this.sessionStartWallClock}getWallClock(){return Date.now()}generateEventId(e="evt",t){const s=t!==void 0?t:this.nextSequence(),n=Math.random().toString(36).substring(2,8);return`${e}_${s}_${n}`}reset(){this.currentSequence=0,this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}}class me{constructor(e,t,s){f(this,"registry");f(this,"privacy");f(this,"sequenceCounter");this.registry=e,this.privacy=t,this.sequenceCounter=s}captureSnapshot(e=document,t=""){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.nextSequence(),i={},r=e.documentElement||e.body,o=this.registry.getOrCreateId(e,s);if(i[o]={id:o,nodeType:U.DOCUMENT_NODE,tagName:"#document",children:[],parentId:null},e.doctype){const c=this.registry.getOrCreateId(e.doctype,s);i[c]={id:c,nodeType:U.DOCUMENT_TYPE_NODE,tagName:e.doctype.name||"html",parentId:o},i[o].children.push(c)}if(r){const c=this.serializeNode(r,o,i,s);c&&i[o].children.push(c)}const a=this.getViewportInfo();return{snapshotId:`snap_${n}_${Date.now()}`,sessionId:t,timestamp:s,sequence:n,rootId:o,nodes:i,title:e.title||"",url:typeof window<"u"?window.location.href:"",origin:typeof window<"u"?window.location.origin:"",viewport:a,doctype:e.doctype?e.doctype.name:void 0,totalNodeCount:Object.keys(i).length}}serializeNode(e,t,s,n){if(!e||e.nodeType===Node.ELEMENT_NODE&&this.privacy.shouldBlockNode(e))return null;const i=this.registry.getOrCreateId(e,n);this.registry.recordParent(i,t);const r={id:i,nodeType:e.nodeType,parentId:t};if(e.nodeType===Node.ELEMENT_NODE){const o=e;r.tagName=o.tagName.toLowerCase(),r.isCustomElement=r.tagName.includes("-"),r.namespaceURI=o.namespaceURI;const a={};if(o.attributes)for(let c=0;c"u"?{width:1920,height:1080,scrollX:0,scrollY:0,devicePixelRatio:1}:{width:window.innerWidth||((e=document.documentElement)==null?void 0:e.clientWidth)||1920,height:window.innerHeight||((t=document.documentElement)==null?void 0:t.clientHeight)||1080,scrollX:window.scrollX||window.pageXOffset||0,scrollY:window.scrollY||window.pageYOffset||0,devicePixelRatio:window.devicePixelRatio||1}}}class Re{constructor(e,t,s,n,i,r=""){f(this,"observer",null);f(this,"registry");f(this,"privacy");f(this,"sequenceCounter");f(this,"snapshotEngine");f(this,"callback");f(this,"sessionId");f(this,"isObserving",!1);this.registry=e,this.privacy=t,this.sequenceCounter=s,this.snapshotEngine=n,this.callback=i,this.sessionId=r}setSessionId(e){this.sessionId=e}start(e=document){this.isObserving||typeof MutationObserver>"u"||(this.observer=new MutationObserver(this.handleMutations.bind(this)),this.observer.observe(e,{childList:!0,attributes:!0,characterData:!0,subtree:!0,attributeOldValue:!0,characterDataOldValue:!0}),this.isObserving=!0)}stop(){this.observer&&(this.observer.disconnect(),this.observer=null),this.isObserving=!1}takeRecords(){if(this.observer){const e=this.observer.takeRecords();e.length>0&&this.handleMutations(e)}}handleMutations(e){const t=this.sequenceCounter.getRelativeTimestamp(),s=this.sequenceCounter.getWallClock();for(let n=0;n0)for(let o=0;o0)for(let o=0;o"u"||typeof document>"u"||(this.isListening=!0,this.cleanups=[],this.attachUserEventListeners(),this.attachNavigationListeners(),this.attachViewportListeners())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isListening=!1}attachUserEventListeners(){[{type:"click",handler:t=>this.handlePointerEvent(t,"USER_CLICK"),options:{capture:!0,passive:!0}},{type:"dblclick",handler:t=>this.handlePointerEvent(t,"USER_DBLCLICK"),options:{capture:!0,passive:!0}},{type:"input",handler:t=>this.handleInputEvent(t),options:{capture:!0,passive:!0}},{type:"change",handler:t=>this.handleInputEvent(t,"USER_CHANGE"),options:{capture:!0,passive:!0}},{type:"submit",handler:t=>this.handleSubmitEvent(t),options:{capture:!0,passive:!0}},{type:"keydown",handler:t=>this.handleKeyboardEvent(t,"USER_KEYDOWN"),options:{capture:!0,passive:!0}},{type:"keyup",handler:t=>this.handleKeyboardEvent(t,"USER_KEYUP"),options:{capture:!0,passive:!0}},{type:"focus",handler:t=>this.handleFocusBlurEvent(t,"USER_FOCUS"),options:{capture:!0,passive:!0}},{type:"blur",handler:t=>this.handleFocusBlurEvent(t,"USER_BLUR"),options:{capture:!0,passive:!0}}].forEach(({type:t,handler:s,options:n})=>{document.addEventListener(t,s,n),this.cleanups.push(()=>document.removeEventListener(t,s,n))})}handlePointerEvent(e,t){const s=e,n=e.target,i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=n?this.registry.getOrCreateId(n,i):void 0,a=n&&n.nodeType===Node.ELEMENT_NODE?this.registry.computeSelector(n):void 0,c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_clk",c),sessionId:this.sessionId,timestamp:i,sequence:c,wallClockTime:r,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:o,targetSelector:a,payload:{eventType:e.type,targetNodeId:o,targetSelector:a,clientX:s.clientX,clientY:s.clientY,button:s.button,isTrusted:e.isTrusted}};this.callback(u)}handleInputEvent(e,t="USER_INPUT"){const s=e.target;if(!s)return;const n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=this.registry.getOrCreateId(s,n),o=this.registry.computeSelector(s);let a="";if(s.tagName.toLowerCase()==="input"){const d=s;a=this.privacy.maskValue(d.value,d.type,d.name)}else if(s.tagName.toLowerCase()==="textarea"){const d=s;a=this.privacy.maskValue(d.value,"textarea",d.name)}else s.tagName.toLowerCase()==="select"&&(a=s.value);const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_inp",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,inputValue:a,isTrusted:e.isTrusted}};this.callback(u)}handleSubmitEvent(e){const t=e.target,s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=t?this.registry.getOrCreateId(t,s):void 0,r=t?this.registry.computeSelector(t):void 0,o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("usr_sub",o),sessionId:this.sessionId,timestamp:s,sequence:o,wallClockTime:n,type:"USER_SUBMIT",category:"USER",source:"USER_INTERACTION",targetNodeId:i,targetSelector:r,payload:{eventType:"submit",targetNodeId:i,targetSelector:r}};this.callback(a)}handleKeyboardEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0;let a=e.key;s&&s.tagName.toLowerCase()==="input"&&s.type==="password"&&(a="*");const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_key",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,key:a,code:e.code,isTrusted:e.isTrusted}};this.callback(u)}handleFocusBlurEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0,a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("usr_foc",a),sessionId:this.sessionId,timestamp:n,sequence:a,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o}};this.callback(c)}attachNavigationListeners(){if(typeof window>"u"||!window.history)return;const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=(...r)=>{const o=e.apply(window.history,r);return this.recordNavigation("pushState",window.location.href,r[0],r[2]?String(r[2]):void 0),o},window.history.replaceState=(...r)=>{const o=t.apply(window.history,r);return this.recordNavigation("replaceState",window.location.href,r[0],r[2]?String(r[2]):void 0),o};const s=r=>{this.recordNavigation("popstate",window.location.href,r.state)};window.addEventListener("popstate",s);const n=r=>{this.recordNavigation("hashchange",r.newURL,void 0,void 0,r.oldURL)};window.addEventListener("hashchange",n);const i=()=>{this.recordNavigation("visibilitychange",window.location.href,{visibilityState:document.visibilityState,hidden:document.hidden})};document.addEventListener("visibilitychange",i),this.cleanups.push(()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",s),window.removeEventListener("hashchange",n),document.removeEventListener("visibilitychange",i)})}recordNavigation(e,t,s,n,i){const r=this.sequenceCounter.getRelativeTimestamp(),o=this.sequenceCounter.getWallClock(),a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("nav",a),sessionId:this.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:`NAV_${e.toUpperCase()}`,category:"NAVIGATION",source:"PAGE",payload:{navigationType:e,url:this.privacy.sanitizeUrl(t),previousUrl:i?this.privacy.sanitizeUrl(i):void 0,state:s,title:n||document.title}};this.callback(c)}attachViewportListeners(){if(typeof window>"u")return;let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_res",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_RESIZE",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio}};this.callback(a)},100)};window.addEventListener("resize",t,{passive:!0});let s=null;const n=()=>{s&&clearTimeout(s),s=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_scr",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_SCROLL",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{scrollX:window.scrollX,scrollY:window.scrollY}};this.callback(a)},100)};window.addEventListener("scroll",n,{passive:!0}),this.cleanups.push(()=>{e&&clearTimeout(e),s&&clearTimeout(s),window.removeEventListener("resize",t),window.removeEventListener("scroll",n)})}}class ke{constructor(e,t,s,n=""){f(this,"privacy");f(this,"sequenceCounter");f(this,"callback");f(this,"sessionId");f(this,"isInstrumented",!1);f(this,"originalConsole",{});f(this,"originalOnError",null);f(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentConsole(),this.instrumentGlobalErrors(),this.instrumentUnhandledRejections())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentConsole(){if(typeof console>"u")return;["log","warn","error","info","debug"].forEach(t=>{const s=console[t];s&&(this.originalConsole[t]=s,console[t]=(...n)=>{try{this.recordConsole(t,n)}catch{}return s.apply(console,n)},this.cleanups.push(()=>{console[t]=s}))})}recordConsole(e,t){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r=t.map(u=>{const d=typeof u;let h="";try{u instanceof Error?h=`${u.name}: ${u.message} -${u.stack||""}`:d==="object"&&u!==null?h=JSON.stringify(u,(p,y)=>typeof y=="function"?"[Function]":y):h=String(u)}catch{h="[Unserializable Object]"}return{type:d,value:this.privacy.sanitizeText(h)}}),o=r.map(u=>u.value).join(" ");let a;try{const u=new Error().stack;u&&(a=u.split(` +var Ft=Object.defineProperty;var Vt=($,H,W)=>H in $?Ft($,H,{enumerable:!0,configurable:!0,writable:!0,value:W}):$[H]=W;var b=($,H,W)=>Vt($,typeof H!="symbol"?H+"":H,W);(function(){"use strict";var $=(l=>(l[l.ELEMENT_NODE=1]="ELEMENT_NODE",l[l.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",l[l.TEXT_NODE=3]="TEXT_NODE",l[l.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",l[l.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",l[l.COMMENT_NODE=8]="COMMENT_NODE",l[l.DOCUMENT_NODE=9]="DOCUMENT_NODE",l[l.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",l[l.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",l))($||{});class H{constructor(){b(this,"nextId",1);b(this,"nodeToIdMap",new WeakMap);b(this,"idToNodeMap",new Map);b(this,"identities",new Map);b(this,"parentHistory",new Map)}getOrCreateId(e,t=0){if(this.nodeToIdMap.has(e))return this.nodeToIdMap.get(e);const s=this.nextId++;this.nodeToIdMap.set(e,s),this.idToNodeMap.set(s,e);const i=e.nodeType===$.ELEMENT_NODE||e.nodeType===1?e:null,r=i&&i.tagName?i.tagName.toLowerCase():void 0,o=r?r.includes("-"):!1,a={id:s,nodeType:e.nodeType,tagName:r,createdAt:t,initialSelectorHint:i?this.computeSelector(i):void 0,isCustomElement:o};return this.identities.set(s,a),s}getId(e){return this.nodeToIdMap.get(e)}getNode(e){return this.idToNodeMap.get(e)}getIdentity(e){return this.identities.get(e)}recordParent(e,t){if(!t)return;const s=this.parentHistory.get(e)||[];s[s.length-1]!==t&&(s.push(t),this.parentHistory.set(e,s))}getParentHistory(e){return this.parentHistory.get(e)||[]}computeSelector(e){try{const t=typeof e.id=="string"?e.id:e.getAttribute?e.getAttribute("id"):"";if(t&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(t))return`#${t}`;const s=e.tagName?e.tagName.toLowerCase():"element";if(s==="body"||s==="html"||s==="head")return s;let n=[];e.classList&&typeof e.classList.forEach=="function"?n=Array.from(e.classList):typeof e.className=="string"?n=e.className.split(/\s+/):e.className&&typeof e.className.baseVal=="string"&&(n=e.className.baseVal.split(/\s+/));let i="";if(n.length>0){const r=n.filter(o=>typeof o=="string"&&/^[a-zA-Z0-9_-]+$/.test(o)&&!o.startsWith("ng-")&&!o.startsWith("_ng")).slice(0,3);r.length>0&&(i="."+r.join("."))}if(e.parentElement&&e.parentElement.children){const r=Array.from(e.parentElement.children).filter(o=>o.tagName&&o.tagName.toLowerCase()===s);if(r.length>1){const o=r.indexOf(e)+1;if(o>0)return`${s}${i}:nth-of-type(${o})`}}return`${s}${i}`}catch{return e.tagName?e.tagName.toLowerCase():"element"}}computeFullSelectorPath(e){const t=[];let s=e;for(;s&&s.tagName&&s.tagName.toLowerCase()!=="html";){const n=this.computeSelector(s);if(t.unshift(n),s.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(s.id))break;s=s.parentElement}return t.join(" > ")}removeNode(e){this.idToNodeMap.get(e)&&this.idToNodeMap.delete(e)}reset(){this.nextId=1,this.nodeToIdMap=new WeakMap,this.idToNodeMap.clear(),this.identities.clear(),this.parentHistory.clear()}}const W={maskAllInputs:!1,maskInputTypes:["password","hidden","tel","email"],maskSelectors:["[data-private]",".private-data",".sensitive",'[data-testid="sensitive"]'],blockSelectors:[".recording-blocked","[data-recording-ignore]"],redactHeaders:["authorization","cookie","set-cookie","x-api-key","proxy-authorization","token"],redactQueryParams:["token","key","auth","secret","password","access_token","apiKey","bearer"],maxTextLength:1e5};class J{constructor(e={}){b(this,"config");this.config={...W,...e}}shouldBlockNode(e){if(!e||!e.matches)return!1;for(const t of this.config.blockSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}shouldMaskText(e){if(!e||!e.matches)return!1;for(const t of this.config.maskSelectors)try{if(e.matches(t)||e.closest(t))return!0}catch{}return!1}maskValue(e,t,s){return e&&(this.config.maskAllInputs?"*".repeat(Math.min(e.length,12)):t&&this.config.maskInputTypes.includes(t.toLowerCase())||s&&/(password|token|secret|cvv|credit|auth|ssn)/i.test(s)?"••••••••":e)}sanitizeText(e,t=!1){return e&&(t?e.replace(/[^\s\n\r\t]/g,"*"):e.length>this.config.maxTextLength?e.substring(0,this.config.maxTextLength)+"... [TRUNCATED]":e)}sanitizeHeaders(e){if(!e)return;const t={};for(const[s,n]of Object.entries(e)){const i=s.toLowerCase();this.config.redactHeaders.some(r=>i.includes(r))?t[s]="[REDACTED]":t[s]=n}return t}sanitizeUrl(e){try{const t=new URL(e);for(const s of this.config.redactQueryParams)t.searchParams.has(s)&&t.searchParams.set(s,"[REDACTED]");return t.toString()}catch{return e}}}class ne{constructor(){b(this,"currentSequence",0);b(this,"sessionStartTime");b(this,"sessionStartWallClock");this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}nextSequence(){return this.currentSequence+=1,this.currentSequence}getSequence(){return this.currentSequence}getRelativeTimestamp(){return typeof performance<"u"?Math.round((performance.now()-this.sessionStartTime)*100)/100:Date.now()-this.sessionStartWallClock}getWallClock(){return Date.now()}generateEventId(e="evt",t){const s=t!==void 0?t:this.nextSequence(),n=Math.random().toString(36).substring(2,8);return`${e}_${s}_${n}`}reset(){this.currentSequence=0,this.sessionStartTime=typeof performance<"u"?performance.now():0,this.sessionStartWallClock=Date.now()}}class he{constructor(e,t,s){b(this,"registry");b(this,"privacy");b(this,"sequenceCounter");this.registry=e,this.privacy=t,this.sequenceCounter=s}captureSnapshot(e=document,t=""){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.nextSequence(),i={},r=e.documentElement||e.body,o=this.registry.getOrCreateId(e,s);if(i[o]={id:o,nodeType:$.DOCUMENT_NODE,tagName:"#document",children:[],parentId:null},e.doctype){const c=this.registry.getOrCreateId(e.doctype,s);i[c]={id:c,nodeType:$.DOCUMENT_TYPE_NODE,tagName:e.doctype.name||"html",parentId:o},i[o].children.push(c)}if(r){const c=this.serializeNode(r,o,i,s);c&&i[o].children.push(c)}const a=this.getViewportInfo();return{snapshotId:`snap_${n}_${Date.now()}`,sessionId:t,timestamp:s,sequence:n,rootId:o,nodes:i,title:e.title||"",url:typeof window<"u"?window.location.href:"",origin:typeof window<"u"?window.location.origin:"",viewport:a,doctype:e.doctype?e.doctype.name:void 0,totalNodeCount:Object.keys(i).length}}serializeNode(e,t,s,n){if(!e||e.nodeType===Node.ELEMENT_NODE&&this.privacy.shouldBlockNode(e))return null;const i=this.registry.getOrCreateId(e,n);this.registry.recordParent(i,t);const r={id:i,nodeType:e.nodeType,parentId:t};if(e.nodeType===Node.ELEMENT_NODE){const o=e;r.tagName=o.tagName.toLowerCase(),r.isCustomElement=r.tagName.includes("-"),r.namespaceURI=o.namespaceURI;const a={};if(o.attributes)for(let c=0;c"u"?{width:1920,height:1080,scrollX:0,scrollY:0,devicePixelRatio:1}:{width:window.innerWidth||((e=document.documentElement)==null?void 0:e.clientWidth)||1920,height:window.innerHeight||((t=document.documentElement)==null?void 0:t.clientHeight)||1080,scrollX:window.scrollX||window.pageXOffset||0,scrollY:window.scrollY||window.pageYOffset||0,devicePixelRatio:window.devicePixelRatio||1}}}class Ne{constructor(e,t,s,n,i,r=""){b(this,"observer",null);b(this,"registry");b(this,"privacy");b(this,"sequenceCounter");b(this,"snapshotEngine");b(this,"callback");b(this,"sessionId");b(this,"isObserving",!1);this.registry=e,this.privacy=t,this.sequenceCounter=s,this.snapshotEngine=n,this.callback=i,this.sessionId=r}setSessionId(e){this.sessionId=e}start(e=document){this.isObserving||typeof MutationObserver>"u"||(this.observer=new MutationObserver(this.handleMutations.bind(this)),this.observer.observe(e,{childList:!0,attributes:!0,characterData:!0,subtree:!0,attributeOldValue:!0,characterDataOldValue:!0}),this.isObserving=!0)}stop(){this.observer&&(this.observer.disconnect(),this.observer=null),this.isObserving=!1}takeRecords(){if(this.observer){const e=this.observer.takeRecords();e.length>0&&this.handleMutations(e)}}handleMutations(e){const t=this.sequenceCounter.getRelativeTimestamp(),s=this.sequenceCounter.getWallClock();for(let n=0;n0)for(let o=0;o0)for(let o=0;o"u"||typeof document>"u"||(this.isListening=!0,this.cleanups=[],this.attachUserEventListeners(),this.attachNavigationListeners(),this.attachViewportListeners())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isListening=!1}attachUserEventListeners(){[{type:"click",handler:t=>this.handlePointerEvent(t,"USER_CLICK"),options:{capture:!0,passive:!0}},{type:"dblclick",handler:t=>this.handlePointerEvent(t,"USER_DBLCLICK"),options:{capture:!0,passive:!0}},{type:"input",handler:t=>this.handleInputEvent(t),options:{capture:!0,passive:!0}},{type:"change",handler:t=>this.handleInputEvent(t,"USER_CHANGE"),options:{capture:!0,passive:!0}},{type:"submit",handler:t=>this.handleSubmitEvent(t),options:{capture:!0,passive:!0}},{type:"keydown",handler:t=>this.handleKeyboardEvent(t,"USER_KEYDOWN"),options:{capture:!0,passive:!0}},{type:"keyup",handler:t=>this.handleKeyboardEvent(t,"USER_KEYUP"),options:{capture:!0,passive:!0}},{type:"focus",handler:t=>this.handleFocusBlurEvent(t,"USER_FOCUS"),options:{capture:!0,passive:!0}},{type:"blur",handler:t=>this.handleFocusBlurEvent(t,"USER_BLUR"),options:{capture:!0,passive:!0}}].forEach(({type:t,handler:s,options:n})=>{document.addEventListener(t,s,n),this.cleanups.push(()=>document.removeEventListener(t,s,n))})}handlePointerEvent(e,t){const s=e,n=e.target,i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=n?this.registry.getOrCreateId(n,i):void 0,a=n&&n.nodeType===Node.ELEMENT_NODE?this.registry.computeSelector(n):void 0,c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_clk",c),sessionId:this.sessionId,timestamp:i,sequence:c,wallClockTime:r,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:o,targetSelector:a,payload:{eventType:e.type,targetNodeId:o,targetSelector:a,clientX:s.clientX,clientY:s.clientY,button:s.button,isTrusted:e.isTrusted}};this.callback(u)}handleInputEvent(e,t="USER_INPUT"){const s=e.target;if(!s)return;const n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=this.registry.getOrCreateId(s,n),o=this.registry.computeSelector(s);let a="";if(s.tagName.toLowerCase()==="input"){const h=s;a=this.privacy.maskValue(h.value,h.type,h.name)}else if(s.tagName.toLowerCase()==="textarea"){const h=s;a=this.privacy.maskValue(h.value,"textarea",h.name)}else s.tagName.toLowerCase()==="select"&&(a=s.value);const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_inp",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,inputValue:a,isTrusted:e.isTrusted}};this.callback(u)}handleSubmitEvent(e){const t=e.target,s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=t?this.registry.getOrCreateId(t,s):void 0,r=t?this.registry.computeSelector(t):void 0,o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("usr_sub",o),sessionId:this.sessionId,timestamp:s,sequence:o,wallClockTime:n,type:"USER_SUBMIT",category:"USER",source:"USER_INTERACTION",targetNodeId:i,targetSelector:r,payload:{eventType:"submit",targetNodeId:i,targetSelector:r}};this.callback(a)}handleKeyboardEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0;let a=e.key;s&&s.tagName.toLowerCase()==="input"&&s.type==="password"&&(a="*");const c=this.sequenceCounter.nextSequence(),u={id:this.sequenceCounter.generateEventId("usr_key",c),sessionId:this.sessionId,timestamp:n,sequence:c,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o,key:a,code:e.code,isTrusted:e.isTrusted}};this.callback(u)}handleFocusBlurEvent(e,t){const s=e.target,n=this.sequenceCounter.getRelativeTimestamp(),i=this.sequenceCounter.getWallClock(),r=s?this.registry.getOrCreateId(s,n):void 0,o=s?this.registry.computeSelector(s):void 0,a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("usr_foc",a),sessionId:this.sessionId,timestamp:n,sequence:a,wallClockTime:i,type:t,category:"USER",source:"USER_INTERACTION",targetNodeId:r,targetSelector:o,payload:{eventType:e.type,targetNodeId:r,targetSelector:o}};this.callback(c)}attachNavigationListeners(){if(typeof window>"u"||!window.history)return;const e=window.history.pushState,t=window.history.replaceState;window.history.pushState=(...r)=>{const o=e.apply(window.history,r);return this.recordNavigation("pushState",window.location.href,r[0],r[2]?String(r[2]):void 0),o},window.history.replaceState=(...r)=>{const o=t.apply(window.history,r);return this.recordNavigation("replaceState",window.location.href,r[0],r[2]?String(r[2]):void 0),o};const s=r=>{this.recordNavigation("popstate",window.location.href,r.state)};window.addEventListener("popstate",s);const n=r=>{this.recordNavigation("hashchange",r.newURL,void 0,void 0,r.oldURL)};window.addEventListener("hashchange",n);const i=()=>{this.recordNavigation("visibilitychange",window.location.href,{visibilityState:document.visibilityState,hidden:document.hidden})};document.addEventListener("visibilitychange",i),this.cleanups.push(()=>{window.history.pushState=e,window.history.replaceState=t,window.removeEventListener("popstate",s),window.removeEventListener("hashchange",n),document.removeEventListener("visibilitychange",i)})}recordNavigation(e,t,s,n,i){const r=this.sequenceCounter.getRelativeTimestamp(),o=this.sequenceCounter.getWallClock(),a=this.sequenceCounter.nextSequence(),c={id:this.sequenceCounter.generateEventId("nav",a),sessionId:this.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:`NAV_${e.toUpperCase()}`,category:"NAVIGATION",source:"PAGE",payload:{navigationType:e,url:this.privacy.sanitizeUrl(t),previousUrl:i?this.privacy.sanitizeUrl(i):void 0,state:s,title:n||document.title}};this.callback(c)}attachViewportListeners(){if(typeof window>"u")return;let e=null;const t=()=>{e&&clearTimeout(e),e=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_res",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_RESIZE",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{width:window.innerWidth,height:window.innerHeight,devicePixelRatio:window.devicePixelRatio}};this.callback(a)},100)};window.addEventListener("resize",t,{passive:!0});let s=null;const n=()=>{s&&clearTimeout(s),s=setTimeout(()=>{const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("vp_scr",o),sessionId:this.sessionId,timestamp:i,sequence:o,wallClockTime:r,type:"VIEWPORT_SCROLL",category:"VIEWPORT",source:"BROWSER_RUNTIME",payload:{scrollX:window.scrollX,scrollY:window.scrollY}};this.callback(a)},100)};window.addEventListener("scroll",n,{passive:!0}),this.cleanups.push(()=>{e&&clearTimeout(e),s&&clearTimeout(s),window.removeEventListener("resize",t),window.removeEventListener("scroll",n)})}}class Me{constructor(e,t,s,n=""){b(this,"privacy");b(this,"sequenceCounter");b(this,"callback");b(this,"sessionId");b(this,"isInstrumented",!1);b(this,"originalConsole",{});b(this,"originalOnError",null);b(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentConsole(),this.instrumentGlobalErrors(),this.instrumentUnhandledRejections())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentConsole(){if(typeof console>"u")return;["log","warn","error","info","debug"].forEach(t=>{const s=console[t];s&&(this.originalConsole[t]=s,console[t]=(...n)=>{try{this.recordConsole(t,n)}catch{}return s.apply(console,n)},this.cleanups.push(()=>{console[t]=s}))})}recordConsole(e,t){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r=t.map(u=>{const h=typeof u;let g="";try{u instanceof Error?g=`${u.name}: ${u.message} +${u.stack||""}`:h==="object"&&u!==null?g=JSON.stringify(u,(p,y)=>typeof y=="function"?"[Function]":y):g=String(u)}catch{g="[Unserializable Object]"}return{type:h,value:this.privacy.sanitizeText(g)}}),o=r.map(u=>u.value).join(" ");let a;try{const u=new Error().stack;u&&(a=u.split(` `).slice(2,8).join(` -`))}catch{}const c={id:this.sequenceCounter.generateEventId("con",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:`RUNTIME_CONSOLE_${e.toUpperCase()}`,category:e==="error"?"ERROR":"CONSOLE",source:"PAGE",payload:{level:e,args:r,formattedMessage:o,stackTrace:a}};this.callback(c)}instrumentGlobalErrors(){if(typeof window>"u")return;const e=t=>{var o,a;const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("err",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_ERROR",category:"ERROR",source:"PAGE",payload:{message:t.message||"Unknown runtime error",filename:t.filename,lineno:t.lineno,colno:t.colno,stack:((o=t.error)==null?void 0:o.stack)||void 0,name:((a=t.error)==null?void 0:a.name)||"Error"}};this.callback(r)};window.addEventListener("error",e),this.cleanups.push(()=>window.removeEventListener("error",e))}instrumentUnhandledRejections(){if(typeof window>"u")return;const e=t=>{const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence();let r="Unhandled Promise Rejection",o;if(t.reason instanceof Error)r=t.reason.message,o=t.reason.stack;else if(typeof t.reason=="string")r=t.reason;else if(t.reason)try{r=JSON.stringify(t.reason)}catch{r=String(t.reason)}const a={id:this.sequenceCounter.generateEventId("rej",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_UNHANDLED_REJECTION",category:"ERROR",source:"PAGE",payload:{message:r,stack:o,isUnhandledRejection:!0}};this.callback(a)};window.addEventListener("unhandledrejection",e),this.cleanups.push(()=>window.removeEventListener("unhandledrejection",e))}}class Oe{constructor(e,t,s,n=""){f(this,"privacy");f(this,"sequenceCounter");f(this,"callback");f(this,"sessionId");f(this,"isInstrumented",!1);f(this,"originalFetch",null);f(this,"originalXHROpen",null);f(this,"originalXHRSend",null);f(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentFetch(),this.instrumentXHR())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentFetch(){if(typeof window.fetch!="function")return;this.originalFetch=window.fetch;const e=this;window.fetch=async function(...t){const s=e.sequenceCounter.generateEventId("req_f"),n=t[0],i=t[1];let r="";typeof n=="string"?r=n:n instanceof URL?r=n.toString():n&&typeof n=="object"&&"url"in n&&(r=n.url);const o=((i==null?void 0:i.method)||(typeof n=="object"&&"method"in n?n.method:"GET")).toUpperCase(),a=e.privacy.sanitizeUrl(r),c=e.sequenceCounter.getRelativeTimestamp(),u=e.sequenceCounter.getWallClock(),d=e.sequenceCounter.nextSequence(),h={id:s,sessionId:e.sessionId,timestamp:c,sequence:d,wallClockTime:u,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:a,method:o,resourceType:"fetch",hasBody:!!(i!=null&&i.body)}};e.callback(h);try{const p=await e.originalFetch.apply(this,t),y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),g=Math.max(0,Math.round((y-c)*100)/100),b={id:e.sequenceCounter.generateEventId("res_f",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_RESPONSE_COMPLETE",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:p.status,statusText:p.statusText,durationMs:g}};return e.callback(b),p}catch(p){const y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),g=Math.max(0,Math.round((y-c)*100)/100),b={id:e.sequenceCounter.generateEventId("res_err",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:0,statusText:"Failed",durationMs:g,error:(p==null?void 0:p.message)||"Network request failed"}};throw e.callback(b),p}},this.cleanups.push(()=>{this.originalFetch&&(window.fetch=this.originalFetch)})}instrumentXHR(){if(typeof XMLHttpRequest>"u")return;this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send;const e=this;XMLHttpRequest.prototype.open=function(t,s,...n){return this._forensicRequestId=e.sequenceCounter.generateEventId("req_x"),this._forensicMethod=(t||"GET").toUpperCase(),this._forensicUrl=typeof s=="string"?s:s.toString(),e.originalXHROpen.apply(this,[t,s,...n])},XMLHttpRequest.prototype.send=function(t){const s=this._forensicRequestId||e.sequenceCounter.generateEventId("req_x"),n=this._forensicMethod||"GET",i=e.privacy.sanitizeUrl(this._forensicUrl||""),r=e.sequenceCounter.getRelativeTimestamp(),o=e.sequenceCounter.getWallClock(),a=e.sequenceCounter.nextSequence();this._forensicStartTime=r;const c={id:s,sessionId:e.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:i,method:n,resourceType:"xhr",hasBody:!!t}};e.callback(c);const u=()=>{const d=e.sequenceCounter.getRelativeTimestamp(),h=e.sequenceCounter.getWallClock(),p=e.sequenceCounter.nextSequence(),y=Math.max(0,Math.round((d-(this._forensicStartTime||r))*100)/100),v={id:e.sequenceCounter.generateEventId("res_x",p),sessionId:e.sessionId,timestamp:d,sequence:p,wallClockTime:h,type:this.status>=200&&this.status<400?"NETWORK_RESPONSE_COMPLETE":"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:i,method:n,status:this.status,statusText:this.statusText,durationMs:y,error:this.status===0?"XHR Network Error or Aborted":void 0}};e.callback(v)};return this.addEventListener("load",u),this.addEventListener("error",u),this.addEventListener("abort",u),e.originalXHRSend.apply(this,[t])},this.cleanups.push(()=>{this.originalXHROpen&&(XMLHttpRequest.prototype.open=this.originalXHROpen),this.originalXHRSend&&(XMLHttpRequest.prototype.send=this.originalXHRSend)})}}class Le{constructor(e={}){f(this,"sequenceCounter");f(this,"registry");f(this,"privacy");f(this,"snapshotEngine");f(this,"mutationObserver");f(this,"eventCollector");f(this,"diagnostics");f(this,"networkMonitor");f(this,"metadata");f(this,"isRecording",!1);f(this,"isPaused",!1);f(this,"eventListeners",new Set);f(this,"checkpointListeners",new Set);f(this,"lastCheckpointSequence",0);f(this,"lastCheckpointTimestamp",0);f(this,"checkpointTimer",null);f(this,"checkpointIntervalEvents",200);f(this,"checkpointIntervalMs",3e4);this.sequenceCounter=new oe,this.registry=new z,this.privacy=new se(e.privacy),this.snapshotEngine=new me(this.registry,this.privacy,this.sequenceCounter);const t=n=>this.handleEvent(n);this.mutationObserver=new Re(this.registry,this.privacy,this.sequenceCounter,this.snapshotEngine,t),this.eventCollector=new Me(this.registry,this.privacy,this.sequenceCounter,t),this.diagnostics=new ke(this.privacy,this.sequenceCounter,t),this.networkMonitor=new Oe(this.privacy,this.sequenceCounter,t),e.checkpointIntervalEvents&&(this.checkpointIntervalEvents=e.checkpointIntervalEvents),e.checkpointIntervalMs&&(this.checkpointIntervalMs=e.checkpointIntervalMs);const s=e.sessionId||`session_${Date.now()}_${Math.random().toString(36).substring(2,7)}`;this.metadata=this.createInitialMetadata(s,e.sessionName)}getSessionId(){return this.metadata.id}getMetadata(){return{...this.metadata,durationMs:this.sequenceCounter.getRelativeTimestamp(),endTime:this.metadata.endTime||Date.now()}}getRegistry(){return this.registry}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}onCheckpoint(e){return this.checkpointListeners.add(e),()=>this.checkpointListeners.delete(e)}start(e=typeof document<"u"?document:{}){if(this.isRecording)throw new Error(`Recorder session ${this.metadata.id} is already active`);this.sequenceCounter.reset(),this.registry.reset(),this.isRecording=!0,this.isPaused=!1,this.metadata.status="recording",this.metadata.startTime=Date.now(),this.mutationObserver.setSessionId(this.metadata.id),this.eventCollector.setSessionId(this.metadata.id),this.diagnostics.setSessionId(this.metadata.id),this.networkMonitor.setSessionId(this.metadata.id);const t=this.snapshotEngine.captureSnapshot(e,this.metadata.id);this.metadata.stats.nodeCount=t.totalNodeCount;const s={id:this.sequenceCounter.generateEventId("snap_init",t.sequence),sessionId:this.metadata.id,timestamp:t.timestamp,sequence:t.sequence,wallClockTime:Date.now(),type:"DOM_SNAPSHOT",category:"DOM",source:"PAGE",payload:{snapshot:t}};return this.createCheckpoint(t,"INITIAL"),this.mutationObserver.start(e),this.eventCollector.start(),this.diagnostics.start(),this.networkMonitor.start(),this.handleEvent(s),this.checkpointIntervalMs>0&&typeof setInterval<"u"&&(this.checkpointTimer=setInterval(()=>{this.isRecording&&!this.isPaused&&this.captureCheckpoint("PERIODIC",e)},this.checkpointIntervalMs)),t}stop(){return this.isRecording?(this.mutationObserver.takeRecords(),this.mutationObserver.stop(),this.eventCollector.stop(),this.diagnostics.stop(),this.networkMonitor.stop(),this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.isRecording=!1,this.metadata.status="stopped",this.metadata.endTime=Date.now(),this.metadata.durationMs=this.sequenceCounter.getRelativeTimestamp(),this.getMetadata()):this.getMetadata()}pause(){!this.isRecording||this.isPaused||(this.isPaused=!0,this.metadata.status="paused")}resume(){!this.isRecording||!this.isPaused||(this.isPaused=!1,this.metadata.status="recording")}captureCheckpoint(e="MANUAL",t=document){if(!this.isRecording)return null;const s=this.snapshotEngine.captureSnapshot(t,this.metadata.id);return this.createCheckpoint(s,e)}recordCustomEvent(e,t,s,n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("ext",o),sessionId:this.metadata.id,timestamp:i,sequence:o,wallClockTime:r,type:e,category:"EXTENSION",source:"CONTENT_SCRIPT",targetNodeId:s,targetSelector:n,payload:t};return this.handleEvent(a),a}recordScreenshot(e,t="MANUAL"){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("scr",i),sessionId:this.metadata.id,timestamp:s,sequence:i,wallClockTime:n,type:"SCREENSHOT_CHECKPOINT",category:"SCREENSHOT",source:"BROWSER_RUNTIME",payload:{screenshotId:`shot_${i}`,dataUrl:e,viewport:{width:typeof window<"u"?window.innerWidth:1920,height:typeof window<"u"?window.innerHeight:1080,scrollX:typeof window<"u"?window.scrollX:0,scrollY:typeof window<"u"?window.scrollY:0,devicePixelRatio:typeof window<"u"?window.devicePixelRatio:1},triggerReason:t}};return this.handleEvent(r),r}addAnnotation(e,t,s="AGENT",n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.nextSequence(),o={id:`ann_${r}_${Math.random().toString(36).substring(2,6)}`,sessionId:this.metadata.id,timestamp:i,sequence:r,nodeId:n,author:s,label:e,comment:t,createdAt:Date.now()},a={id:o.id,sessionId:this.metadata.id,timestamp:i,sequence:r,wallClockTime:Date.now(),type:"ANNOTATION",category:"ANNOTATION",source:s==="USER"?"USER_INTERACTION":"BROWSER_RUNTIME",targetNodeId:n,payload:{annotation:o}};return this.handleEvent(a),o}createCheckpoint(e,t){const s=this.sequenceCounter.getSequence()-this.lastCheckpointSequence;this.lastCheckpointSequence=this.sequenceCounter.getSequence(),this.lastCheckpointTimestamp=e.timestamp,this.metadata.stats.checkpointCount+=1;const n={checkpointId:`chk_${e.sequence}_${Date.now()}`,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:Date.now(),snapshot:e,eventIndex:this.metadata.stats.eventCount,eventsSinceLastCheckpoint:s,trigger:t},i={id:n.checkpointId,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:n.wallClockTime,type:"CHECKPOINT",category:"CHECKPOINT",source:"BROWSER_RUNTIME",payload:{checkpointId:n.checkpointId,snapshot:e,eventsSinceLastCheckpoint:s,totalEventsSoFar:this.metadata.stats.eventCount}};return this.checkpointListeners.forEach(r=>{try{r(n)}catch(o){console.error("[ForensicRecorder] Checkpoint listener error:",o)}}),this.handleEvent(i),n}handleEvent(e){this.isPaused&&e.type!=="CHECKPOINT"&&e.type!=="ANNOTATION"||(this.metadata.stats.eventCount+=1,e.category==="DOM"&&(this.metadata.stats.mutationCount+=1),e.category==="ERROR"&&(this.metadata.stats.errorCount+=1),e.category==="CONSOLE"&&(this.metadata.stats.consoleCount+=1),e.category==="NETWORK"&&(this.metadata.stats.networkCount+=1),e.category==="SCREENSHOT"&&(this.metadata.stats.screenshotCount+=1),this.isRecording&&e.type!=="CHECKPOINT"&&e.type!=="DOM_SNAPSHOT"&&this.sequenceCounter.getSequence()-this.lastCheckpointSequence>=this.checkpointIntervalEvents&&typeof document<"u"&&this.captureCheckpoint("PERIODIC"),this.eventListeners.forEach(t=>{try{t(e)}catch(s){console.error("[ForensicRecorder] Event listener error:",s)}}))}createInitialMetadata(e,t){const s={domRecording:typeof MutationObserver<"u"?"HEALTHY":"UNAVAILABLE",userEvents:typeof window<"u"?"HEALTHY":"UNAVAILABLE",console:typeof console<"u"?"HEALTHY":"UNAVAILABLE",network:typeof window<"u"&&typeof window.fetch<"u"?"HEALTHY":"PARTIAL",screenshots:"HEALTHY",shadowDom:typeof Element<"u"&&"attachShadow"in Element.prototype?"HEALTHY":"RESTRICTED",iframes:"PARTIAL"},n={eventCount:0,mutationCount:0,errorCount:0,consoleCount:0,networkCount:0,checkpointCount:0,screenshotCount:0,nodeCount:0};return{id:e,name:t||`Recording ${new Date().toLocaleTimeString()}`,url:typeof window<"u"?window.location.href:"about:blank",origin:typeof window<"u"?window.location.origin:"",title:typeof document<"u"?document.title:"Forensic Session",userAgent:typeof navigator<"u"?navigator.userAgent:"Node.js/ForensicAgent",schemaVersion:"2.0.0",recorderVersion:"2.0.0",extensionVersion:"2.0.0",startTime:Date.now(),status:"recording",health:s,stats:n}}}class L{static inspectPage(e=document){var n,i,r,o,a,c,u,d,h,p,y,v,m,g;const t=e.defaultView||(typeof window<"u"?window:{}),s=e.activeElement;return{url:((n=t.location)==null?void 0:n.href)||((i=e.location)==null?void 0:i.href)||"",title:e.title||"",origin:((r=t.location)==null?void 0:r.origin)||"",viewport:{width:t.innerWidth||((o=e.documentElement)==null?void 0:o.clientWidth)||1920,height:t.innerHeight||((a=e.documentElement)==null?void 0:a.clientHeight)||1080,scrollX:t.scrollX||t.pageXOffset||((c=e.documentElement)==null?void 0:c.scrollLeft)||0,scrollY:t.scrollY||t.pageYOffset||((u=e.documentElement)==null?void 0:u.scrollTop)||0,devicePixelRatio:t.devicePixelRatio||1},documentDimensions:{width:Math.max(((d=e.body)==null?void 0:d.scrollWidth)||0,((h=e.documentElement)==null?void 0:h.scrollWidth)||0),height:Math.max(((p=e.body)==null?void 0:p.scrollHeight)||0,((y=e.documentElement)==null?void 0:y.scrollHeight)||0)},activeElement:s?{tag:((v=s.tagName)==null?void 0:v.toLowerCase())||"",selector:this.computeBestSelector(s),text:(m=s.textContent)==null?void 0:m.slice(0,100).trim()}:void 0,focusedElement:typeof e.hasFocus=="function"&&e.hasFocus()&&s?{tag:((g=s.tagName)==null?void 0:g.toLowerCase())||"",selector:this.computeBestSelector(s)}:void 0,visibilityState:e.visibilityState||"visible",readyState:e.readyState||"complete",framesCount:e.querySelectorAll?e.querySelectorAll("iframe, frame").length:0}}static inspectElement(e,t){var te,Ne;const s=e.ownerDocument||document,n=s.defaultView||(typeof window<"u"?window:{}),i=e,r=e.tagName?e.tagName.toLowerCase():"element",o=this.extractClasses(e),{bestSelector:a,candidates:c}=this.generateSelectorCandidates(e),u={},d={};if(e.attributes)for(let G=0;G0||w.height>0||w.right>0||w.bottom>0,M=!S||w.right>0&&w.bottom>0&&w.left=q||w.top>=A),_=!O&&C!=="none"&&N!=="hidden"&&I>0&&M,P={disabled:i.disabled??e.hasAttribute("disabled"),readOnly:i.readOnly??e.hasAttribute("readonly"),checked:i.checked,selected:i.selected,focused:s.activeElement===e,isShadowHost:!!e.shadowRoot,hasShadowRoot:!!e.shadowRoot},H=[];let $=e.parentElement;for(;$&&$.tagName&&$.tagName.toLowerCase()!=="html";)H.push(this.computeBestSelector($)),$=$.parentElement;const F={count:e.children?e.children.length:0,tags:e.children?Array.from(e.children).slice(0,10).map(G=>G.tagName.toLowerCase()):[]};let W;if(t){const G=t.getId(e);W={logicalNodeId:G??null,creationSequence:null,lastMutationSequence:null,eventCount:0,isRecorded:G!=null}}return{tag:r,id:e.id||void 0,classes:o,role:h||void 0,ariaAttributes:Object.keys(d).length>0?d:void 0,text:v.slice(0,200),normalizedText:m.slice(0,200),value:g,type:b.type||void 0,selector:a,bestSelector:a,selectorCandidates:c,bounds:w,visibility:{isVisible:_,display:C,visibility:N,opacity:I,pointerEvents:R,isClipped:O,isInViewport:M,zIndex:x},computedStyle:E?{display:C,visibility:N,opacity:String(I),position:E.position,zIndex:String(x),pointerEvents:R,overflow:E.overflow,boxSizing:E.boxSizing,color:E.color,backgroundColor:E.backgroundColor,fontSize:E.fontSize}:{},attributes:u,state:P,context:{parentChain:H,parentSelector:H[0]||void 0,childrenSummary:F,containingBlock:(E==null?void 0:E.position)==="fixed"?"viewport":H[0]||void 0,iframe:null,shadowRoot:e.shadowRoot?"open":null},forensics:W}}static inspectVisualState(e){var b,T;const t=e.ownerDocument||document,s=t.defaultView||(typeof window<"u"?window:{}),n=e.getBoundingClientRect?e.getBoundingClientRect():{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},i=s.getComputedStyle?s.getComputedStyle(e):null,r=s.innerWidth||((b=t.documentElement)==null?void 0:b.clientWidth)||1920,o=s.innerHeight||((T=t.documentElement)==null?void 0:T.clientHeight)||1080,a=s.scrollX||s.pageXOffset||0,c=s.scrollY||s.pageYOffset||0,u=s.devicePixelRatio||1,d=(i==null?void 0:i.display)||"block",h=(i==null?void 0:i.visibility)||"visible",p=i&&parseFloat(i.opacity)||1,y=n.right>0&&n.bottom>0&&n.left=r||n.top>=o;let g=null;if(t.elementFromPoint&&y&&!v&&d!=="none"){const w=Math.max(0,Math.min(r-1,n.left+n.width/2)),E=Math.max(0,Math.min(o-1,n.top+n.height/2));try{const C=t.elementFromPoint(w,E);C&&C!==e&&!e.contains(C)&&!C.contains(e)&&(g=this.computeBestSelector(C))}catch{}}return{selector:this.computeBestSelector(e),bounds:{x:n.x??n.left??0,y:n.y??n.top??0,width:n.width??0,height:n.height??0,top:n.top??0,right:n.right??0,bottom:n.bottom??0,left:n.left??0},viewport:{scrollX:a,scrollY:c,width:r,height:o,devicePixelRatio:u},layout:{display:d,position:(i==null?void 0:i.position)||"static",zIndex:(i==null?void 0:i.zIndex)||"auto",opacity:p,visibility:h,overflow:(i==null?void 0:i.overflow)||"visible",boxSizing:(i==null?void 0:i.boxSizing)||"content-box",pointerEvents:(i==null?void 0:i.pointerEvents)||"auto"},occlusion:{isInViewport:y,isClipped:v||m,isZeroDimension:v,isTransparent:p===0,isDisplayNone:d==="none",isVisibilityHidden:h==="hidden",isOffscreen:m,occludedBy:g},computedStyleSummary:i?{display:d,position:i.position,zIndex:i.zIndex,opacity:String(p),visibility:h,pointerEvents:i.pointerEvents}:{}}}static generateSelectorCandidates(e){const t=e.ownerDocument||document,s=e.tagName?e.tagName.toLowerCase():"element",n=[];if(e.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(e.id)){const c=`#${e.id}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}const i=["data-testid","data-test","data-id","data-qa","data-cy","aria-label","name"];for(const c of i){const u=e.getAttribute(c);if(u&&/^[a-zA-Z0-9_-]+$/.test(u)){const d=`${s}[${c}="${u}"]`;try{t.querySelectorAll&&t.querySelectorAll(d).length===1&&n.push(d)}catch{n.push(d)}}}const r=this.extractClasses(e).filter(c=>/^[a-zA-Z0-9_-]+$/.test(c)&&!c.startsWith("ng-")&&!c.startsWith("_ng"));if(r.length>0){const c=`${s}.${r.slice(0,3).join(".")}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}if(e.parentElement&&e.parentElement.children){const c=Array.from(e.parentElement.children).filter(u=>u.tagName&&u.tagName.toLowerCase()===s);if(c.length>1){const u=c.indexOf(e)+1;if(u>0){const d=this.computeBestSelector(e.parentElement);n.push(`${d} > ${s}:nth-of-type(${u})`)}}}const o=r.length>0?`${s}.${r[0]}`:s;return n.push(o),{bestSelector:n[0]||s,candidates:n}}static computeBestSelector(e){return this.generateSelectorCandidates(e).bestSelector}static extractClasses(e){return e.classList&&typeof e.classList.forEach=="function"?Array.from(e.classList):typeof e.className=="string"?e.className.split(/\s+/).filter(Boolean):e.className&&typeof e.className.baseVal=="string"?e.className.baseVal.split(/\s+/).filter(Boolean):[]}static inferImplicitRole(e){switch(e.tagName?e.tagName.toLowerCase():""){case"a":return e.hasAttribute("href")?"link":void 0;case"button":return"button";case"input":{const s=e.type||"text";return s==="button"||s==="submit"||s==="reset"?"button":s==="checkbox"?"checkbox":s==="radio"?"radio":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"article":return"article";case"section":return"region";default:return}}}f(L,"privacyEngine",new se);class De{constructor(e){f(this,"registry");f(this,"lastSelectedElementRef");f(this,"timingHook",null);f(this,"lastTrajectory",[]);this.registry=e}setLastSelectedElement(e){this.lastSelectedElementRef=e}setTimingHook(e){this.timingHook=e}getLastTrajectory(){return this.lastTrajectory}async timing(e){this.timingHook&&await this.timingHook(e)}resolveTarget(e,t=document){if(e.selectedElementRef&&this.lastSelectedElementRef&&t.contains(this.lastSelectedElementRef))return this.lastSelectedElementRef;if(typeof e.nodeId=="number"&&this.registry){const s=this.registry.getNode(e.nodeId);if(s&&s instanceof Element&&t.contains(s))return s}if(e.selector)try{const s=t.querySelectorAll(e.selector);if(s.length>1){for(let n=0;n{r+=T.length});try{d.observe(t.body||t.documentElement,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}catch{}const h=T=>{o.push(T.message||"Runtime Error")};typeof window<"u"&&window.addEventListener("error",h);try{await this.dispatchAction(n,e)}finally{typeof window<"u"&&window.removeEventListener("error",h)}let p=!0;if((b=e.options)!=null&&b.waitForStabilization){const T=e.options.stabilizationTimeoutMs||300;await new Promise(w=>setTimeout(w,Math.min(2e3,T)))}d.disconnect();let y;t.contains(n)&&(y=L.inspectElement(n,this.registry));const v=Date.now()-s,m=a!=null&&a.__FORENSIC_CONSOLE_BUFFER__?a.__FORENSIC_CONSOLE_BUFFER__.slice(c).filter(T=>(T==null?void 0:T.level)==="error").length:0,g=a!=null&&a.__FORENSIC_NETWORK_BUFFER__?a.__FORENSIC_NETWORK_BUFFER__.slice(u).length:0;return{success:!0,action:e.action,target:y||i,beforeState:i,afterState:y,effects:{domMutations:r,consoleErrors:m,networkRequests:g,runtimeErrors:o},durationMs:v,stabilized:p}}async dispatchAction(e,t){var n,i,r,o,a,c;const s=e;switch(t.action){case"click":{this.scrollIntoViewIfNeeded(e),await this.timing("move"),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown"),this.dispatchMouseEvent(e,"mousedown"),typeof s.focus=="function"&&s.focus(),this.dispatchMouseEvent(e,"pointerup"),this.dispatchMouseEvent(e,"mouseup"),typeof s.click=="function"?s.click():this.dispatchMouseEvent(e,"click");break}case"double_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"click"),await this.timing("click"),this.dispatchMouseEvent(e,"click"),this.dispatchMouseEvent(e,"dblclick");break}case"right_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown",{button:2}),this.dispatchMouseEvent(e,"mousedown",{button:2}),this.dispatchMouseEvent(e,"contextmenu",{button:2});break}case"hover":{await this.timing("move"),this.dispatchMouseEvent(e,"pointerenter"),this.dispatchMouseEvent(e,"mouseenter"),this.dispatchMouseEvent(e,"mouseover"),await this.timing("move"),this.dispatchMouseEvent(e,"mousemove");break}case"focus":{typeof s.focus=="function"&&s.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:!0}));break}case"blur":{typeof s.blur=="function"&&s.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:!0}));break}case"type":{const u=t.text||"",d=e,h=((n=e.ownerDocument)==null?void 0:n.defaultView)||(typeof window<"u"?window:null);typeof s.focus=="function"&&s.focus();for(const y of u){await this.timing("type");const v=g=>{try{const T=(h==null?void 0:h.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(T)return new T(g,{key:y,bubbles:!0})}catch{}const b=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new b(g,{bubbles:!0,cancelable:!0})},m=(g,b)=>{try{const w=(h==null?void 0:h.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(w)return new w(g,b)}catch{}const T=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new T(g,{bubbles:!0,cancelable:!0})};e.dispatchEvent(v("keydown")),e.dispatchEvent(v("keypress")),"value"in d&&(d.value=(d.value||"")+y),e.dispatchEvent(m("input",{data:y,inputType:"insertText",bubbles:!0})),e.dispatchEvent(v("keyup"))}const p=(h==null?void 0:h.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}));break}case"clear":{const u=e,d=((i=e.ownerDocument)==null?void 0:i.defaultView)||(typeof window<"u"?window:null);if("value"in u){u.value="";const h=(y,v)=>{try{const g=(d==null?void 0:d.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(g)return new g(y,v)}catch{}const m=(d==null?void 0:d.CustomEvent)||(d==null?void 0:d.Event)||CustomEvent;return new m(y,{bubbles:!0,cancelable:!0})};e.dispatchEvent(h("input",{inputType:"deleteContentBackward",bubbles:!0}));const p=(d==null?void 0:d.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}))}break}case"press_key":{const u=t.key||"Enter",d=((r=e.ownerDocument)==null?void 0:r.defaultView)||(typeof window<"u"?window:null),h=p=>{try{const v=(d==null?void 0:d.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(v)return new v(p,{key:u,bubbles:!0})}catch{}const y=(d==null?void 0:d.CustomEvent)||(d==null?void 0:d.Event)||CustomEvent;return new y(p,{bubbles:!0,cancelable:!0})};e.dispatchEvent(h("keydown")),e.dispatchEvent(h("keypress")),e.dispatchEvent(h("keyup"));break}case"select_option":{const u=e;((o=u.tagName)==null?void 0:o.toLowerCase())==="select"&&t.optionValue&&(u.value=t.optionValue,e.dispatchEvent(new Event("change",{bubbles:!0})));break}case"scroll_into_view":{this.scrollIntoViewIfNeeded(e,!0);break}case"scroll":{const u=((a=t.scrollDelta)==null?void 0:a.x)||0,d=((c=t.scrollDelta)==null?void 0:c.y)||0;typeof e.scrollBy=="function"&&e.scrollBy(u,d);break}default:throw new Error(`Unsupported interaction action: ${t.action}`)}}scrollIntoViewIfNeeded(e,t=!1){if(typeof e.scrollIntoView=="function")try{e.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}catch{e.scrollIntoView(t)}}dispatchMouseEvent(e,t,s={}){const n=e.getBoundingClientRect?e.getBoundingClientRect():{left:0,top:0,width:0,height:0},i=n.left+n.width/2,r=n.top+n.height/2,o=new MouseEvent(t,{bubbles:s.bubbles!==void 0?s.bubbles:!0,cancelable:s.cancelable!==void 0?s.cancelable:!0,clientX:i,clientY:r,button:s.button||0,buttons:s.button===2?2:1});e.dispatchEvent(o)}}class ae{static matches(e,t){if(!e||e.nodeType!==U.ELEMENT_NODE)return!1;const s=t.trim();return s?s.includes(",")?s.split(",").some(n=>this.matchesSimple(e,n.trim())):this.matchesCompound(e,s):!1}static querySelector(e,t,s){const n=this.querySelectorAll(e,t,s,1);return n.length>0?n[0]:null}static querySelectorAll(e,t,s,n=1/0){const i=[],r=s[t];if(!r)return i;const o=[...r.children||[]],a=new Set;for(;o.length>0&&i.length=n))break;u.children&&u.children.length>0&&o.push(...u.children)}}return i}static getElementById(e,t){for(const s of Object.values(t))if(s.nodeType===U.ELEMENT_NODE&&!s.isDetached&&s.attributes&&s.attributes.id===e&&this.isNodeConnected(s,t))return s;return null}static isNodeConnected(e,t){if(e.isDetached)return!1;let s=e;const n=new Set;for(;s&&s.parentId;){if(n.has(s.id))return!1;n.add(s.id);const i=t[s.parentId];if(!i||i.isDetached)return!1;s=i}return!0}static computeSelector(e,t){var r,o;if(!e)return"";if(e.nodeType!==U.ELEMENT_NODE)return e.tagName||`#node-${e.id}`;if((r=e.attributes)!=null&&r.id)return`#${e.attributes.id}`;const s=e.tagName||"div",n=(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).filter(a=>a&&!a.startsWith("ng-")).slice(0,2),i=n.length>0?"."+n.join("."):"";if(e.parentId&&t[e.parentId]){const c=(t[e.parentId].children||[]).map(u=>t[u]).filter(u=>u&&u.nodeType===U.ELEMENT_NODE&&u.tagName===s);if(c.length>1){const u=c.findIndex(d=>d.id===e.id)+1;return`${s}${i}:nth-of-type(${u})`}}return`${s}${i}`}static matchesCompound(e,t){return this.matchesSimple(e,t)}static matchesSimple(e,t){var i,r,o,a,c,u,d;const s=((i=e.tagName)==null?void 0:i.toLowerCase())||"";if(t==="*")return!0;if(t.startsWith("#")){const h=t.substring(1);return((r=e.attributes)==null?void 0:r.id)===h}if(t.startsWith(".")){const h=t.substring(1);return(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).includes(h)}if(t.startsWith("[")&&t.endsWith("]")){const h=t.substring(1,t.length-1);if(h.includes("=")){const[p,y]=h.split("="),v=y.replace(/^["']|["']$/g,"");return((a=e.attributes)==null?void 0:a[p.trim()])===v}return!!((c=e.attributes)!=null&&c[h.trim()])}const n=t.match(/^([a-zA-Z0-9_-]+)(.*)$/);if(n){const h=n[1].toLowerCase(),p=n[2];if(h!==s&&h!=="*")return!1;if(!p)return!0;if(p.startsWith("#"))return((u=e.attributes)==null?void 0:u.id)===p.substring(1);if(p.startsWith("."))return(((d=e.attributes)==null?void 0:d.class)||"").split(/\s+/).includes(p.substring(1));if(p.startsWith("["))return this.matchesSimple(e,p)}return!1}}class $e{static traceElement(e,t,s){var x,q;const n=[...t].sort((A,S)=>A.sequence-S.sequence);let i=e.nodeId,r="unknown",o=e.selector||"",a={},c=0,u=0,d="init";if(!i&&e.selector&&s){const A=ae.querySelector(e.selector,s.rootId,s.nodes);A&&(i=A.id,r=A.tagName||"element",a={...A.attributes||{}},o=e.selector)}if(!i&&e.selector){for(const A of n)if(A.type==="DOM_MUTATION_ADD"){const S=A.payload;if(S.node&&ae.matches(S.node,e.selector)){i=S.node.id,r=S.node.tagName||"element",a={...S.node.attributes||{}},c=A.timestamp,u=A.sequence,d=A.id;break}}}if(!i)return null;const h=[];let p=!0,y=null,v=null,m,g=0;if(s&&s.nodes[i]){const A=s.nodes[i];r=A.tagName||r,a={...A.attributes||{}},o||(o=ae.computeSelector(A,s.nodes)),h.push({timestamp:s.timestamp,sequence:s.sequence,wallClockTime:Date.now(),stage:"CREATED",eventId:s.snapshotId,eventType:"DOM_SNAPSHOT",description:`Element <${r}> existed in initial baseline snapshot [ID: ${i}]`,details:{initialParentId:A.parentId,attributes:a},nodeSnapshot:A})}const b=new Map;if(s)for(const[A,S]of Object.entries(s.nodes))b.set(Number(A),S.parentId??null);const T=(A,S)=>{let M=b.get(S);const O=new Set;for(;M&&!O.has(M);){if(M===A)return!0;O.add(M),M=b.get(M)}return!1};for(const A of n){const S=A.timestamp,M=A.sequence,O=A.wallClockTime;if(A.type==="DOM_MUTATION_ADD"){const _=A.payload;(x=_.node)!=null&&x.id&&b.set(_.node.id,_.parentId??null),((q=_.node)==null?void 0:q.id)===i&&(p=!0,r=_.node.tagName||r,c=S,u=M,d=A.id,a={..._.node.attributes||{}},h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"ATTACHED_TO_DOM",eventId:A.id,eventType:A.type,description:`Element <${r}> added to DOM under parent ID ${_.parentId}`,details:{parentId:_.parentId,index:_.index},nodeSnapshot:_.node}))}if(A.type==="DOM_MUTATION_REMOVE"){const _=A.payload;_.nodeId===i?(p=!1,y=S,v=M,m=A.id,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"REMOVED_FROM_DOM",eventId:A.id,eventType:A.type,description:`Element <${r}> explicitly removed from parent ID ${_.parentId}`,details:{parentId:_.parentId,removedIndex:_.index}})):T(_.nodeId,i)&&(p=!1,y=S,v=M,m=A.id,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"PARENT_SUBTREE_REPLACED",eventId:A.id,eventType:A.type,description:`Ancestor element [ID: ${_.nodeId}] was removed, causing target element [ID: ${i}] to detach from DOM`,details:{removedAncestorId:_.nodeId,parentId:_.parentId}}))}if(A.type==="DOM_MUTATION_MOVE"){const _=A.payload;_.nodeId&&b.set(_.nodeId,_.newParentId??null),_.nodeId===i&&(g++,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"REPARENTED",eventId:A.id,eventType:A.type,description:`Element reparented from parent ${_.oldParentId} to ${_.newParentId}`,details:{oldParentId:_.oldParentId,newParentId:_.newParentId}}))}if(A.type==="DOM_MUTATION_ATTR"){const _=A.payload;if(_.nodeId===i){g++;const P=_.attributeName.toLowerCase();let H="ATTRIBUTE_MODIFIED";P==="class"&&(H="CLASS_MODIFIED"),P==="style"&&(H="STYLE_MODIFIED"),h.push({timestamp:S,sequence:M,wallClockTime:O,stage:H,eventId:A.id,eventType:A.type,description:`Attribute '${_.attributeName}' changed from '${_.oldValue??""}' to '${_.newValue??""}'`,details:{attributeName:_.attributeName,oldValue:_.oldValue,newValue:_.newValue}})}}if(A.type==="DOM_MUTATION_TEXT"){const _=A.payload;_.nodeId===i&&(g++,h.push({timestamp:S,sequence:M,wallClockTime:O,stage:"TEXT_MODIFIED",eventId:A.id,eventType:A.type,description:`Text content changed: "${_.oldText}" → "${_.newText}"`,details:{oldText:_.oldText,newText:_.newText}}))}}const w=y??c,E=500,C=n.filter(A=>(A.category==="ERROR"||A.category==="CONSOLE")&&Math.abs(A.timestamp-w)<=E),N=n.filter(A=>A.category==="NETWORK"&&Math.abs(A.timestamp-w)<=E),I=n.length>0?n[n.length-1].timestamp:c,R=Math.max(0,(y??I)-c);return{targetNodeId:i,tagName:r,selectorHint:o,initialAttributes:a,createdAt:c,createdSequence:u,createdEventId:d,removedAt:y,removedSequence:v,removedEventId:m,isCurrentlyAlive:p,lifespanMs:Math.round(R*100)/100,mutationCount:g,entries:h,correlatedDiagnostics:C,correlatedNetwork:N}}}class qe{static analyze(e,t,s){var R,x,q,A;const n=typeof e=="number"?{nodeId:e}:{selector:e},i=$e.traceElement(n,t,s);if(!i)return{targetQuery:e,found:!1,disappearanceMechanism:"UNKNOWN",likelyRootCause:"Target element could not be found in recording baseline or event stream",confidenceScore:0,detailedExplanation:`No element matching "${e}" was ever created, recorded in the initial DOM snapshot, or observed in mutation events.`,evidentiaryTrail:[],precedingEvents:[],followingEvents:[],correlatedErrors:[],correlatedNetworkCalls:[],alternativeHypotheses:[{hypothesis:"Element was injected into an unmonitored isolated iframe or ShadowRoot closed mode",likelihood:40,evidenceFor:["Element query yielded zero matches in monitored document"],evidenceAgainst:["Iframes/ShadowRoots were accessible in this session"]},{hypothesis:"Selector typo or timing mismatch",likelihood:60,evidenceFor:["Target selector did not match any recorded tag or class"],evidenceAgainst:[]}]};const r=[...t].sort((S,M)=>S.sequence-M.sequence),o=[],a=[];let c="UNKNOWN",u="Unknown disappearance mechanism",d=50,h="",p=i.removedAt??void 0;const y=i.entries.find(S=>S.stage==="REMOVED_FROM_DOM"),v=i.entries.find(S=>S.stage==="PARENT_SUBTREE_REPLACED"),m=i.entries.find(S=>S.stage==="CLASS_MODIFIED"&&/\b(hidden|hide|d-none|invisible|collapsed)\b/i.test(String(S.details.newValue||""))),g=i.entries.find(S=>S.stage==="STYLE_MODIFIED"&&/display\s*:\s*none|visibility\s*:\s*hidden|opacity\s*:\s*0/i.test(String(S.details.newValue||"")));y?(c="DIRECT_NODE_REMOVAL",p=y.timestamp,u=`Element [ID: ${i.targetNodeId}] <${i.tagName}> was directly removed from its parent [ID: ${y.details.parentId}] via DOM removeChild/replaceChild`,d=95,o.push({timestamp:y.timestamp,sequence:y.sequence,eventId:y.eventId,eventType:y.eventType,evidenceType:"DIRECT",description:`Direct DOM removal mutation: element detached from parent ID ${y.details.parentId}`,confidenceContribution:50})):v?(c="PARENT_SUBTREE_REPLACED",p=v.timestamp,u=`Host framework (e.g. React/Vue re-render) destroyed and replaced Ancestor container [ID: ${v.details.removedAncestorId}], causing injected element to be unmounted`,d=92,o.push({timestamp:v.timestamp,sequence:v.sequence,eventId:v.eventId,eventType:v.eventType,evidenceType:"DIRECT",description:`Ancestor container [ID: ${v.details.removedAncestorId}] was removed, wiping out all child subtrees`,confidenceContribution:50})):g?(c="STYLE_DISPLAY_NONE",p=g.timestamp,u=`Element was visually hidden by an inline style modification: "${g.details.newValue}"`,d=88,o.push({timestamp:g.timestamp,sequence:g.sequence,eventId:g.eventId,eventType:g.eventType,evidenceType:"DIRECT",description:`Inline style changed to "${g.details.newValue}"`,confidenceContribution:45})):m?(c="CLASS_TRIGGERED_HIDDEN",p=m.timestamp,u=`Element was visually hidden because its CSS class list was modified to include "${m.details.newValue}"`,d=85,o.push({timestamp:m.timestamp,sequence:m.sequence,eventId:m.eventId,eventType:m.eventType,evidenceType:"DIRECT",description:`Class list changed from "${m.details.oldValue??""}" to "${m.details.newValue??""}"`,confidenceContribution:45})):i.isCurrentlyAlive&&(c="UNKNOWN",u=`Element [ID: ${i.targetNodeId}] is currently alive and attached to the DOM tree (no unmount mutation detected)`,d=70,h="The element exists in the current DOM state. If it is not visible on screen, it may be clipped by viewport boundaries, z-index stacking context, or 0x0 pixel dimensions.");const b=p??i.createdAt,T=500,w=r.filter(S=>S.timestamp>=b-T&&S.timestampS.timestamp>b&&S.timestamp<=b+T),C=w.filter(S=>S.category==="ERROR");if(C.length>0){const S=C[0],M=((R=S.payload)==null?void 0:R.message)||"Unknown runtime error";o.push({timestamp:S.timestamp,sequence:S.sequence,eventId:S.id,eventType:S.type,evidenceType:"PRECEDING",description:`Runtime error occurred ${(b-S.timestamp).toFixed(1)}ms before disappearance: "${M}"`,confidenceContribution:20,rawEvent:S}),u+=` (preceded by runtime error: "${M}")`}const N=w.filter(S=>S.type==="NETWORK_RESPONSE_COMPLETE"||S.type==="NETWORK_REQUEST_FAILED");if(N.length>0){const S=N[0],M=((x=S.payload)==null?void 0:x.url)||"network request";o.push({timestamp:S.timestamp,sequence:S.sequence,eventId:S.id,eventType:S.type,evidenceType:"PRECEDING",description:`Network response completed ${(b-S.timestamp).toFixed(1)}ms before disappearance: ${M}`,confidenceContribution:15,rawEvent:S})}const I=w.filter(S=>S.category==="NAVIGATION");if(I.length>0){const S=I[0];o.push({timestamp:S.timestamp,sequence:S.sequence,eventId:S.id,eventType:S.type,evidenceType:"PRECEDING",description:`Navigation event (${(q=S.payload)==null?void 0:q.navigationType}) occurred ${(b-S.timestamp).toFixed(1)}ms before disappearance`,confidenceContribution:25,rawEvent:S}),u+=` following SPA navigation to "${(A=S.payload)==null?void 0:A.url}"`}return h||(h=[`Element <${i.tagName}> (Logical ID: ${i.targetNodeId}, selector: "${i.selectorHint}") was created at ${i.createdAt.toFixed(1)}ms.`,`It remained alive in the DOM for ${i.lifespanMs.toFixed(1)}ms and experienced ${i.mutationCount} mutations.`,`At timestamp ${b.toFixed(1)}ms, it disappeared via [${c}].`,`Diagnosis: ${u}.`].join(" ")),c==="PARENT_SUBTREE_REPLACED"?(a.push({hypothesis:"Direct cleanup called by extension code",likelihood:25,evidenceFor:["Element was unmounted shortly after creation"],evidenceAgainst:["Ancestor container mutation was recorded from host page context"]}),a.push({hypothesis:"Host single-page app route change destroyed component tree",likelihood:35,evidenceFor:I.length>0?["Preceding navigation event recorded"]:[],evidenceAgainst:I.length===0?["No navigation events occurred in temporal window"]:[]})):c==="DIRECT_NODE_REMOVAL"&&a.push({hypothesis:"Third-party script or ad-blocker removed the injected node",likelihood:30,evidenceFor:["Direct node removal occurred without ancestor replacement"],evidenceAgainst:["No ad-blocker signatures or extension error logs observed"]}),{targetQuery:e,targetNodeId:i.targetNodeId,found:!0,tagName:i.tagName,selectorHint:i.selectorHint,createdAt:i.createdAt,firstVisibleAt:i.createdAt,lastKnownGoodStateAt:Math.max(0,b-1),disappearedAt:p,lifespanMs:i.lifespanMs,disappearanceMechanism:c,likelyRootCause:u,confidenceScore:Math.min(99,d),detailedExplanation:h,evidentiaryTrail:o,precedingEvents:w,followingEvents:E,correlatedErrors:C,correlatedNetworkCalls:N,alternativeHypotheses:a}}}class Pe{constructor(e){f(this,"activeObservation",null);f(this,"registry");f(this,"sequenceCounter");this.registry=e,this.sequenceCounter=new oe}isObserving(){return this.activeObservation!==null}startObservation(e,t=document){this.activeObservation&&this.stopObservation(t);const s=`obs_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,n=Date.now(),i=L.inspectElement(e,this.registry),r=i.bestSelector,o=[],a=this.registry?this.registry.getOrCreateId(e,0):100;o.push({id:`evt_init_${s}`,sessionId:s,timestamp:0,sequence:1,wallClockTime:n,type:"DOM_MUTATION_ADD",category:"DOM",source:"BROWSER_RUNTIME",targetNodeId:a,targetSelector:r,payload:{node:{id:a,nodeType:1,tagName:i.tag,attributes:i.attributes,textContent:i.text,children:[],parentId:null},parentId:null,index:0}});const c=new MutationObserver(u=>{const d=Date.now()-n;for(const h of u)if(h.type==="childList"){for(let p=0;p0&&(m=qe.analyze(n,a)),{observationId:t,targetSelector:n,targetNodeId:((g=r.forensics)==null?void 0:g.logicalNodeId)||void 0,startTime:i,endTime:u,durationMs:d,initialState:r,finalState:p,disappeared:y,disappearanceReason:v,mutations:a.filter(b=>b.category==="DOM"),diagnostics:a.filter(b=>b.category==="ERROR"||b.category==="CONSOLE"),networkEvents:a.filter(b=>b.category==="NETWORK"),screenshots:c,correlationReport:m}}}class Ue{constructor(e={}){f(this,"isExplicitModeActive",!1);f(this,"isGlobalShortcutActive",!1);f(this,"highlighterEl",null);f(this,"badgeEl",null);f(this,"lastSelectedElement",null);f(this,"options",{});f(this,"onMouseMoveBound");f(this,"onClickBound");f(this,"onKeyDownBound");f(this,"onGlobalClickBound");this.options=e,this.onMouseMoveBound=this.handleMouseMove.bind(this),this.onClickBound=this.handleClick.bind(this),this.onKeyDownBound=this.handleKeyDown.bind(this),this.onGlobalClickBound=this.handleGlobalCtrlShiftClick.bind(this),this.initGlobalShortcutListener()}initGlobalShortcutListener(){typeof window>"u"||this.isGlobalShortcutActive||(window.addEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!0)}startPicker(e){typeof document>"u"||(e&&(this.options={...this.options,...e}),!this.isExplicitModeActive&&(this.isExplicitModeActive=!0,this.ensureHighlighter(),document.body&&(document.body.style.cursor="crosshair"),window.addEventListener("mousemove",this.onMouseMoveBound,!0),window.addEventListener("click",this.onClickBound,!0),window.addEventListener("keydown",this.onKeyDownBound,!0)))}stopPicker(){this.isExplicitModeActive&&(this.isExplicitModeActive=!1,typeof document<"u"&&document.body&&(document.body.style.cursor="default"),this.removeHighlighter(),typeof window<"u"&&(window.removeEventListener("mousemove",this.onMouseMoveBound,!0),window.removeEventListener("click",this.onClickBound,!0),window.removeEventListener("keydown",this.onKeyDownBound,!0)))}getLastSelectedElement(){return this.lastSelectedElement}setSelectedElement(e){let t;return"tag"in e&&"bestSelector"in e&&typeof e.getAttribute!="function"?t=e:(t=L.inspectElement(e,this.options.nodeRegistry),this.flashSelection(e)),this.lastSelectedElement=t,this.options.onSelected&&this.options.onSelected(t),t}handleGlobalCtrlShiftClick(e){if(!e.ctrlKey||!e.shiftKey)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s)}handleMouseMove(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t)){this.hideHighlighter();return}this.updateHighlighter(t)}handleClick(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s),this.stopPicker()}handleKeyDown(e){e.key==="Escape"&&this.isExplicitModeActive&&(e.preventDefault(),this.stopPicker(),this.options.onCanceled&&this.options.onCanceled())}isExtensionOwned(e){return!!(e.id==="forensic-recorder-floating-host"||e.id==="forensic-inspect-highlighter"||e.closest("#forensic-recorder-floating-host")||e.closest("#forensic-inspect-highlighter")||e.hasAttribute("data-forensic-internal")||e.closest("[data-forensic-internal]"))}ensureHighlighter(){if(typeof document>"u"||this.highlighterEl)return;const e=this.options.highlightColor||"#0ea5e9",t=document.createElement("div");t.id="forensic-inspect-highlighter",t.setAttribute("data-forensic-internal","true"),t.style.position="fixed",t.style.pointerEvents="none",t.style.zIndex="2147483640",t.style.border=`2px solid ${e}`,t.style.background="rgba(14, 165, 233, 0.18)",t.style.borderRadius="3px",t.style.boxShadow=`0 0 12px ${e}88`,t.style.transition="all 0.05s ease-out",t.style.display="none";const s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="absolute",s.style.bottom="100%",s.style.left="0",s.style.transform="translateY(-4px)",s.style.background="#0f172a",s.style.color="#38bdf8",s.style.fontSize="11px",s.style.fontFamily="monospace",s.style.fontWeight="bold",s.style.padding="2px 6px",s.style.borderRadius="3px",s.style.boxShadow="0 2px 6px rgba(0,0,0,0.5)",s.style.whiteSpace="nowrap",s.style.pointerEvents="none",t.appendChild(s),document.body.appendChild(t),this.highlighterEl=t,this.badgeEl=s}updateHighlighter(e){if(this.ensureHighlighter(),!this.highlighterEl||!this.badgeEl)return;const t=e.getBoundingClientRect();this.highlighterEl.style.display="block",this.highlighterEl.style.left=`${t.left}px`,this.highlighterEl.style.top=`${t.top}px`,this.highlighterEl.style.width=`${Math.max(1,t.width)}px`,this.highlighterEl.style.height=`${Math.max(1,t.height)}px`;const s=e.tagName.toLowerCase(),n=e.id?`#${e.id}`:"",i=e.className&&typeof e.className=="string"?"."+e.className.split(/\s+/)[0]:"",r=`${Math.round(t.width)}×${Math.round(t.height)}`;this.badgeEl.textContent=`<${s}${n}${i}> [${r}]`}hideHighlighter(){this.highlighterEl&&(this.highlighterEl.style.display="none")}removeHighlighter(){this.highlighterEl&&this.highlighterEl.parentElement&&this.highlighterEl.remove(),this.highlighterEl=null,this.badgeEl=null}flashSelection(e){if(typeof document>"u"||!e.getBoundingClientRect)return;const t=e.getBoundingClientRect(),s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="fixed",s.style.left=`${t.left}px`,s.style.top=`${t.top}px`,s.style.width=`${Math.max(1,t.width)}px`,s.style.height=`${Math.max(1,t.height)}px`,s.style.border="2px solid #22c55e",s.style.background="rgba(34, 197, 94, 0.25)",s.style.zIndex="2147483645",s.style.pointerEvents="none",s.style.transition="opacity 0.6s ease-out",document.body.appendChild(s),setTimeout(()=>{s.style.opacity="0",setTimeout(()=>s.remove(),600)},400)}notifyExtension(e){var t;try{typeof chrome<"u"&&((t=chrome.runtime)!=null&&t.sendMessage)&&chrome.runtime.sendMessage({type:"ELEMENT_SELECTED",elementInfo:e,timestamp:Date.now()})}catch{}}destroy(){this.stopPicker(),typeof window<"u"&&window.removeEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!1}}class fe{static getCrcTable(){if(this.crcTable)return this.crcTable;const e=new Uint32Array(256);for(let t=0;t<256;t++){let s=t;for(let n=0;n<8;n++)s=s&1?3988292384^s>>>1:s>>>1;e[t]=s>>>0}return this.crcTable=e,e}static crc32(e,t=0,s=e.length){const n=this.getCrcTable();let i=4294967295;for(let r=t;r>>8^n[(i^e[r])&255];return(i^4294967295)>>>0}static adler32(e){let t=1,s=0;for(let n=0;n>>0}static createPNG(e){const t=Math.max(1,Math.min(1920,Math.floor(e.width))),s=Math.max(1,Math.min(1080,Math.floor(e.height))),n=e.backgroundColor||[15,23,42,255],i=e.headerColor||[56,189,248,255],r=e.borderColor||[99,102,241,255],o=1+t*4,a=new Uint8Array(o*s),c=Math.min(30,Math.floor(s*.2));for(let g=0;g=e.length,h=new Uint8Array(5+u);h[0]=d?1:0,h[1]=u&255,h[2]=u>>>8&255;const p=~u&65535;h[3]=p&255,h[4]=p>>>8&255,h.set(e.subarray(n,n+u),5),t.push(h),n+=u}const i=t.reduce((c,u)=>c+u.length,0)+2+4,r=new Uint8Array(i);let o=0;r[o++]=120,r[o++]=1;for(const c of t)r.set(c,o),o+=c.length;const a=this.adler32(e);return r[o++]=a>>>24&255,r[o++]=a>>>16&255,r[o++]=a>>>8&255,r[o++]=a&255,r}static writeChunk(e,t,s,n){const i=n.length,r=new DataView(e.buffer,e.byteOffset,e.byteLength);r.setUint32(t,i,!1),t+=4;const o=new Uint8Array(4+i);for(let c=0;c<4;c++){const u=s.charCodeAt(c);e[t+c]=u,o[c]=u}t+=4,i>0&&(e.set(n,t),o.set(n,4),t+=i);const a=this.crc32(o);return r.setUint32(t,a,!1),t+=4,t}}f(fe,"crcTable",null);const ne=500;class He{constructor(e,t){f(this,"history",[]);f(this,"undoStack",[]);f(this,"redoStack",[]);f(this,"counter",0);f(this,"transaction",null);this.doc=e,this.registry=t}mutate(e){var d;const t=`mut_${Date.now().toString(36)}_${++this.counter}`,s=Date.now();let n;try{n=this.resolveTarget(e.target)}catch(h){return this.failure(t,e,null,h.message,Date.now()-s)}const i=this.snapshotState(n);let r=null,o=null,a,c=!0;try{const h=this.applyOperation(t,e,n);h&&(this.transaction?this.transaction.undoRecords.push(h):(this.undoStack.push(h),this.redoStack=[]));const y=(n.isConnected!==void 0?n.isConnected:this.doc.contains(n))?n:this.doc.querySelector(i.selector)||n;r=this.snapshotState(y),o=this.quickDiff(i,r,n)}catch(h){c=!1,a=h.message,r=null}const u={mutationId:t,operation:e.operation,success:c,before:i,after:r,diff:o,affectedSelector:c?i.selector:null,durationMs:Date.now()-s,error:a,undoable:c&&(this.transaction?this.transaction.undoRecords.length>0:this.undoStack.length>0)};return this.transaction&&this.transaction.steps.push({stepId:`step_${this.transaction.steps.length+1}`,mutation:u}),this.pushHistory({mutationId:t,transactionId:(d=this.transaction)==null?void 0:d.id,timestamp:Date.now(),operation:e.operation,targetSelector:i.selector,success:c,summary:`${e.operation} on ${i.selector}${o?` (+${o.added}/-${o.removed}/~${o.changed})`:""}`,undoApplied:!1,redoApplied:!1}),u}beginTransaction(){if(this.transaction)throw new Error(`TRANSACTION_ALREADY_OPEN: ${this.transaction.id} — commit or rollback first.`);return this.transaction={id:`tx_${Date.now().toString(36)}_${++this.counter}`,steps:[],undoRecords:[]},this.transaction.id}commitTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before committing.");const t=this.transaction,s=Date.now();let n=!0,i;if(e)try{n=e({id:t.id,steps:t.steps})!==!1,n||(i="VERIFY_FAILED: caller verification rejected the transaction state.")}catch(o){n=!1,i=`VERIFY_ERROR: ${o.message}`}if(!n)return this.rollbackInternal(t,i||"VERIFY_FAILED",s);this.undoStack.push(...t.undoRecords),this.undoStack.length>ne&&this.undoStack.splice(0,this.undoStack.length-ne),this.redoStack=[];const r=this.summaryOf(t);return this.transaction=null,{transactionId:t.id,committed:!0,rolledBack:!1,steps:t.steps,durationMs:Date.now()-s,finalStateSummary:r}}rollbackTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before rolling back.");const t=this.transaction;return this.rollbackInternal(t,e||"ROLLBACK_REQUESTED",Date.now())}rollbackInternal(e,t,s){for(const i of[...e.undoRecords].reverse())try{this.applyUndo(i)}catch{}const n=this.summaryOf(e);return this.transaction=null,{transactionId:e.id,committed:!1,rolledBack:!0,steps:e.steps,error:t,durationMs:Date.now()-s,finalStateSummary:n}}undo(){const e=this.transaction?this.transaction.undoRecords:this.undoStack,t=e.pop();if(!t)return{success:!1,message:"Nothing to undo — the mutation history is empty."};try{this.applyUndo(t)}catch(s){return e.push(t),{success:!1,mutationId:t.mutationId,message:`UNDO_FAILED: ${s.message}`}}return this.redoStack.push(t),this.markHistory(t.mutationId,"undo"),{success:!0,mutationId:t.mutationId,message:`Undid ${t.operation} on ${t.targetSelector}.`}}redo(){const e=this.redoStack.pop();if(!e)return{success:!1,message:"Nothing to redo — no undone mutation is pending."};try{const t=this.resolveTarget({selector:e.targetSelector}),s={operation:e.operation,target:{selector:e.targetSelector}};return this.reapplyRecord(e,t,s)?((this.transaction?this.transaction.undoRecords:this.undoStack).push(e),this.markHistory(e.mutationId,"redo"),{success:!0,mutationId:e.mutationId,message:`Redid ${e.operation} on ${e.targetSelector}.`}):(this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:"REDO_FAILED: target state diverged — cannot safely reapply."})}catch(t){return this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:`REDO_FAILED: ${t.message}`}}}getHistory(e=100){return this.history.slice(-e)}getUndoDepth(){return this.transaction?this.transaction.undoRecords.length:this.undoStack.length}getRedoDepth(){return this.redoStack.length}getOpenTransactionId(){var e;return((e=this.transaction)==null?void 0:e.id)||null}preview(e){var t;try{const s=this.resolveTarget(e.target),n=[];let i=1;(e.operation==="set_inner_html"||e.operation==="set_outer_html")&&(n.push("HTML replacement can destroy descendant node identity — captured regions targeting children may become stale."),i=s.querySelectorAll("*").length+1),(e.operation==="remove_element"||e.operation==="unwrap_element")&&(n.push("Removal is destructive; the undo record preserves the full serialized subtree."),i=s.querySelectorAll("*").length+1),e.operation==="move_element"&&!e.parent&&n.push("No parent target supplied — move requires payload.parent."),e.operation==="wrap_element"&&!e.newElementHtml&&n.push("No wrapper HTML supplied — a neutral
wrapper will be generated.");const r=Be(e,s);return{valid:n.filter(o=>o.includes("requires")||o.includes("No parent")).length===0,operation:e.operation,target:{selector:this.snapshotState(s).selector,tag:s.tagName.toLowerCase()},expectedChange:r,affectedNodes:i,warnings:n}}catch(s){return{valid:!1,operation:e.operation,target:{selector:String(((t=e.target)==null?void 0:t.selector)||""),tag:""},expectedChange:"—",affectedNodes:0,warnings:[],error:s.message}}}applyOperation(e,t,s){var r;const n=this.snapshotState(s).selector,i=t.operation;switch(i){case"set_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);return s.setAttribute(t.attribute,t.value??""),this.undoFor(e,i,n,{kind:o===null?"remove-attribute":"restore-attribute",attribute:t.attribute,value:o})}case"remove_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);if(o===null)throw new Error(`ATTRIBUTE_NOT_PRESENT: "${t.attribute}" is not set on ${n}.`);return s.removeAttribute(t.attribute),this.undoFor(e,i,n,{kind:"restore-attribute",attribute:t.attribute,value:o})}case"set_text":{const o=s.textContent||"";return s.textContent=t.text??"",this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"replace_text":{if(!t.text||!t.replacement)throw new Error("TEXT_PATTERNS_REQUIRED: payload.text (search) and payload.replacement are required.");const o=s.textContent||"";return s.textContent=o.split(t.text).join(t.replacement),this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"set_inner_html":{const o=s.innerHTML;return s.innerHTML=t.html??"",this.undoFor(e,i,n,{kind:"restore-outer-html",outerHtml:s.outerHTML.replace(t.html??"",o)||void 0,text:o,attribute:"__inner"})}case"set_outer_html":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: element has no parent — cannot replace outer HTML.");const c=this.doc.createComment(`mcpdom_undo_${e}`);s.replaceWith(c);const u=this.doc.createElement("template");u.innerHTML=t.html??"";const d=u.content.firstElementChild;return d?c.replaceWith(d):c.replaceWith(this.doc.createTextNode(t.html??"")),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:this.siblingSelector(d||s)})}case"add_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.add(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"remove_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"replace_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return t.value&&s.classList.add(t.value),this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"set_style":{const o=this.doc.defaultView;if(!(o!=null&&o.getComputedStyle))throw new Error("STYLE_UNAVAILABLE: computed style API is unavailable in this context.");const a={};for(const c of Object.keys(t.style||{}))a[c]=o.getComputedStyle(s).getPropertyValue(c),s.style.setProperty(c,t.style[c]);return this.undoFor(e,i,n,{kind:"restore-style",style:a})}case"remove_style":{const o={};for(const a of t.classes||[])o[a]=s.style.getPropertyValue(a),s.style.removeProperty(a);return this.undoFor(e,i,n,{kind:"restore-style",style:o})}case"add_element":{const o=t.parent?this.resolveTarget(t.parent):s,a=this.doc.createElement("template");a.innerHTML=t.newElementHtml??"
";const c=a.content.firstElementChild;if(!c)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");switch(t.position||"append"){case"before":s.before(c);break;case"after":s.after(c);break;case"prepend":o.prepend(c);break;default:o.appendChild(c)}return this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(c).selector})}case"remove_element":{const o=s.outerHTML,a=s.parentElement,c=s.nextElementSibling;return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"replace_element":{const o=s.outerHTML,a=s.parentElement,c=this.doc.createElement("template");c.innerHTML=t.newElementHtml??"
";const u=c.content.firstElementChild;if(!u)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");const d=s.nextElementSibling;return s.replaceWith(u),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:d?this.snapshotState(d).selector:null})}case"move_element":{if(!t.parent)throw new Error("PARENT_REQUIRED: payload.parent is required for move_element.");const o=this.resolveTarget(t.parent),a=s.outerHTML,c=s.parentElement,u=s.nextElementSibling,d=t.position==="before"||t.position==="prepend"?o.firstElementChild:null;return o[t.position==="prepend"?"prepend":"appendChild"](s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:d?this.snapshotState(d).selector:null,outerHtml:a})}case"wrap_element":{const o=this.doc.createElement("template");o.innerHTML=t.newElementHtml||'
';const a=o.content.firstElementChild;if(!a)throw new Error("INVALID_HTML: wrapper template produced no element.");const c=s.parentElement,u=s.nextElementSibling;return s.replaceWith(a),a.appendChild(s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:null})}case"unwrap_element":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: cannot unwrap a root-level element.");const c=s.nextElementSibling,u=Array.from(s.children);for(const d of u)a.insertBefore(d,s);return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"clone_subtree":{const o=t.parent?this.resolveTarget(t.parent):s.parentElement||s,a=s.cloneNode(!0);if(t.copyAttributes!==!1)for(const c of Array.from(a.attributes))c.name==="id"&&a.removeAttribute("id");return(r=o.appendChild)==null||r.call(o,a),this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(a).selector})}default:throw new Error(`UNKNOWN_OPERATION: ${i} is not a supported DOM mutation.`)}}applyUndo(e){const t=e.inverse;switch(t.kind){case"restore-outer-html":{const s=this.resolveTarget({selector:e.targetSelector});if(t.outerHtml!==void 0){const n=this.doc.createElement("template");n.innerHTML=t.outerHtml;const i=n.content.firstElementChild;i&&s.replaceWith(i)}else t.attribute==="__inner"&&(s.innerHTML=t.text||"");break}case"reinsert-node":{const s=t.parentSelector?this.resolveTarget({selector:t.parentSelector}):this.doc.body,n=this.doc.createElement("template");n.innerHTML=t.outerHtml||"";const i=n.content.firstElementChild;if(!i)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const r=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;s.insertBefore(i,r);break}case"remove-node":{const s=this.safeResolve(t.attribute||e.targetSelector);s&&s.remove();break}case"restore-attribute":{this.resolveTarget({selector:e.targetSelector}).setAttribute(t.attribute,t.value??"");break}case"remove-attribute":{this.resolveTarget({selector:e.targetSelector}).removeAttribute(t.attribute);break}case"restore-text":{const s=this.resolveTarget({selector:e.targetSelector});s.textContent=t.text||"";break}case"restore-classes":{const s=this.resolveTarget({selector:e.targetSelector});s.removeAttribute("class");for(const n of t.classes||[])s.classList.add(n);break}case"restore-style":{const s=this.resolveTarget({selector:e.targetSelector});s.style.removeProperty("all");for(const[n,i]of Object.entries(t.style||{}))s.style.setProperty(n,i);break}case"restore-position":{const s=this.doc.createElement("template");s.innerHTML=t.outerHtml||"";const n=s.content.firstElementChild;if(!n)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const i=this.safeResolve(e.targetSelector);i&&i.remove();const r=t.parentSelector?this.safeResolve(t.parentSelector):this.doc.body,o=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;(r||this.doc.body).insertBefore(n,o);break}}}reapplyRecord(e,t,s){var i;const n=e.inverse;switch(e.operation){case"set_attribute":return(n.kind==="restore-attribute"||n.kind==="remove-attribute")&&s.value!==void 0?(t.setAttribute(s.attribute||n.attribute||"",s.value),!0):!1;case"add_class":{for(const r of s.classes||[])t.classList.add(r);return(((i=s.classes)==null?void 0:i.length)||0)>0}case"remove_class":{for(const r of s.classes||n.classes||[])t.classList.remove(r);return!0}case"set_text":return s.text!==void 0?(t.textContent=s.text,!0):!1;case"set_inner_html":return s.html!==void 0?(t.innerHTML=s.html,!0):!1;default:return!1}}resolveTarget(e){if(!e)throw new Error("TARGET_REQUIRED: mutation requires a target.");if(typeof e=="string"&&(e={selector:e}),e.selector){try{const t=this.doc.querySelectorAll(e.selector);if(t.length===1)return t[0];if(t.length>1)return Array.from(t).find(n=>{try{return L.inspectElement(n).visibility.isVisible}catch{return!1}})||t[0]}catch(t){throw new Error(`TARGET_INVALID: ${t.message}`)}throw new Error(`TARGET_NOT_FOUND: selector "${e.selector}" matches no element.`)}if(e.xpath){try{const s=this.doc.evaluate(e.xpath,this.doc,null,9,null).singleNodeValue;if(s)return s}catch(t){throw new Error(`TARGET_INVALID_XPATH: ${t.message}`)}throw new Error("TARGET_NOT_FOUND: xpath matches no element.")}if(typeof e.nodeId=="number"&&this.registry){const t=this.registry.getNode(e.nodeId);if(t&&t.nodeType===1&&this.doc.contains(t))return t;throw new Error("TARGET_STALE: logical node id no longer resolves to an attached element.")}throw new Error("TARGET_INVALID: target has neither selector, xpath nor nodeId.")}safeResolve(e){try{return this.doc.querySelector(e)}catch{return null}}snapshotState(e){const t=L.inspectElement(e,this.registry),s=e.outerHTML.length>2e4?e.outerHTML.slice(0,2e4)+"…[truncated]":e.outerHTML;return{selector:t.bestSelector,outerHtml:s,attributes:this.attrsOf(e)}}attrsOf(e){const t={};for(const s of Array.from(e.attributes))t[s.name]=s.value.length>300?s.value.slice(0,300)+"…":s.value;return t}quickDiff(e,t,s){if(!t)return null;let n=0,i=0,r=0;const o=new Set(Object.keys(e.attributes)),a=new Set(Object.keys(t.attributes||{}));for(const u of o)a.has(u)||i++;for(const u of a)o.has(u)?e.attributes[u]!==t.attributes[u]&&r++:n++;e.outerHtml!==t.outerHtml&&n+i+r===0&&r++;const c=s.querySelectorAll?s.querySelectorAll("*").length:0;return{added:n,removed:i,changed:r,summary:`attributes +${n}/-${i}/~${r}; subtree nodes: ${c}`}}undoFor(e,t,s,n){return{mutationId:e,operation:t,targetSelector:s,inverse:n}}siblingSelector(e){try{return this.snapshotState(e).selector}catch{return null}}pushHistory(e){this.history.push(e),this.history.length>ne&&this.history.splice(0,this.history.length-ne)}markHistory(e,t){for(let s=this.history.length-1;s>=0;s--)if(this.history[s].mutationId===e){t==="undo"?this.history[s].undoApplied=!0:this.history[s].redoApplied=!0;return}}summaryOf(e){var n;const t=((n=this.doc.documentElement)==null?void 0:n.outerHTML.length)||0,s=e.steps.filter(i=>i.mutation.success).length;return{domLength:t,diffSummary:`${s}/${e.steps.length} mutations applied`}}failure(e,t,s,n,i){var r;return{mutationId:e,operation:t.operation,success:!1,before:s||{selector:String(((r=t.target)==null?void 0:r.selector)||"?"),outerHtml:"",attributes:{}},after:null,diff:null,affectedSelector:null,durationMs:i,error:n,undoable:!1}}}function Be(l,e){switch(l.operation){case"set_attribute":return`attribute "${l.attribute}" will be set to "${(l.value??"").slice(0,40)}"`;case"remove_attribute":return`attribute "${l.attribute}" will be removed`;case"set_text":return`text content will be replaced (${(l.text||"").length} chars)`;case"replace_text":return`every occurrence of "${l.text}" will become "${l.replacement}"`;case"set_inner_html":return`inner HTML will be replaced (${(l.html||"").length} chars)`;case"set_outer_html":return"element (and subtree) will be replaced with provided HTML";case"add_class":return`classes ${(l.classes||[]).join(", ")} will be added`;case"remove_class":return`classes ${(l.classes||[]).join(", ")} will be removed`;case"replace_class":return`classes ${(l.classes||[]).join(", ")} will be replaced with "${l.value}"`;case"set_style":return`inline styles ${Object.keys(l.style||{}).join(", ")} will be set`;case"remove_style":return`inline styles ${(l.classes||[]).join(", ")} will be removed`;case"add_element":return`a new element will be inserted ${l.position||"append"} the target`;case"remove_element":return"the element and its subtree will be removed";case"replace_element":return"the element will be replaced with new HTML";case"move_element":return"the element will be moved into the specified parent";case"wrap_element":return"the element will be wrapped in a new container";case"unwrap_element":return"children will be lifted out and the wrapper removed";case"clone_subtree":return"a deep clone of the subtree will be appended";default:return"unknown operation"}}class Fe{constructor(){f(this,"executionCounter",0)}async execute(e,t,s={}){const n=Math.min(Math.max(s.timeoutMs??5e3,100),3e4),i=`js_${Date.now().toString(36)}_${++this.executionCounter}`,r=e.defaultView;if(!r)return this.result(i,"BLOCKED_BY_CONTEXT",0,t,[],{name:"NoWindow",message:"The document has no associated window — execution context unavailable."});const o=e.documentElement?e.documentElement.outerHTML.length:0,a=[],c=this.hookConsole(r,a);let u="EXECUTED_SUCCESSFULLY",d,h,p=o,y=!1;const v=Date.now();try{const b=this.buildRunner(r,t),T=new Promise((w,E)=>{var N;const C=setTimeout(()=>{y=!0,E(new Error(`Script timed out after ${n}ms`))},n);(N=C==null?void 0:C.unref)==null||N.call(C)});d=await Promise.race([b,T])}catch(b){y?u="TIMED_OUT":u="EXECUTED_WITH_ERROR",h={name:(b==null?void 0:b.name)||"Error",message:(b==null?void 0:b.message)||String(b),stack:b!=null&&b.stack?String(b.stack).slice(0,2e3):void 0}}const m=Date.now()-v;p=e.documentElement?e.documentElement.outerHTML.length:0,c();const g=this.serialize(d);return u==="EXECUTED_SUCCESSFULLY"&&g.serializationFailed&&(u="SERIALIZATION_FAILED",h={name:"SerializationError",message:g.message||"Result could not be serialized."}),{status:u,executionId:i,durationMs:m,result:u==="EXECUTED_SUCCESSFULLY"?g.text:void 0,error:h,consoleOutput:a.slice(0,100),domChanged:o!==p,domLengthBefore:o,domLengthAfter:p,world:s.world||"ISOLATED",timeoutMs:n,codePreview:t.length>300?t.slice(0,300)+"…":t}}buildRunner(e,t){const s=`(async function() { +`))}catch{}const c={id:this.sequenceCounter.generateEventId("con",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:`RUNTIME_CONSOLE_${e.toUpperCase()}`,category:e==="error"?"ERROR":"CONSOLE",source:"PAGE",payload:{level:e,args:r,formattedMessage:o,stackTrace:a}};this.callback(c)}instrumentGlobalErrors(){if(typeof window>"u")return;const e=t=>{var o,a;const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("err",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_ERROR",category:"ERROR",source:"PAGE",payload:{message:t.message||"Unknown runtime error",filename:t.filename,lineno:t.lineno,colno:t.colno,stack:((o=t.error)==null?void 0:o.stack)||void 0,name:((a=t.error)==null?void 0:a.name)||"Error"}};this.callback(r)};window.addEventListener("error",e),this.cleanups.push(()=>window.removeEventListener("error",e))}instrumentUnhandledRejections(){if(typeof window>"u")return;const e=t=>{const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence();let r="Unhandled Promise Rejection",o;if(t.reason instanceof Error)r=t.reason.message,o=t.reason.stack;else if(typeof t.reason=="string")r=t.reason;else if(t.reason)try{r=JSON.stringify(t.reason)}catch{r=String(t.reason)}const a={id:this.sequenceCounter.generateEventId("rej",i),sessionId:this.sessionId,timestamp:s,sequence:i,wallClockTime:n,type:"RUNTIME_UNHANDLED_REJECTION",category:"ERROR",source:"PAGE",payload:{message:r,stack:o,isUnhandledRejection:!0}};this.callback(a)};window.addEventListener("unhandledrejection",e),this.cleanups.push(()=>window.removeEventListener("unhandledrejection",e))}}class Re{constructor(e,t,s,n=""){b(this,"privacy");b(this,"sequenceCounter");b(this,"callback");b(this,"sessionId");b(this,"isInstrumented",!1);b(this,"originalFetch",null);b(this,"originalXHROpen",null);b(this,"originalXHRSend",null);b(this,"cleanups",[]);this.privacy=e,this.sequenceCounter=t,this.callback=s,this.sessionId=n}setSessionId(e){this.sessionId=e}start(){this.isInstrumented||typeof window>"u"||(this.isInstrumented=!0,this.cleanups=[],this.instrumentFetch(),this.instrumentXHR())}stop(){this.cleanups.forEach(e=>{try{e()}catch{}}),this.cleanups=[],this.isInstrumented=!1}instrumentFetch(){if(typeof window.fetch!="function")return;this.originalFetch=window.fetch;const e=this;window.fetch=async function(...t){const s=e.sequenceCounter.generateEventId("req_f"),n=t[0],i=t[1];let r="";typeof n=="string"?r=n:n instanceof URL?r=n.toString():n&&typeof n=="object"&&"url"in n&&(r=n.url);const o=((i==null?void 0:i.method)||(typeof n=="object"&&"method"in n?n.method:"GET")).toUpperCase(),a=e.privacy.sanitizeUrl(r),c=e.sequenceCounter.getRelativeTimestamp(),u=e.sequenceCounter.getWallClock(),h=e.sequenceCounter.nextSequence(),g={id:s,sessionId:e.sessionId,timestamp:c,sequence:h,wallClockTime:u,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:a,method:o,resourceType:"fetch",hasBody:!!(i!=null&&i.body)}};e.callback(g);try{const p=await e.originalFetch.apply(this,t),y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),d=Math.max(0,Math.round((y-c)*100)/100),f={id:e.sequenceCounter.generateEventId("res_f",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_RESPONSE_COMPLETE",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:p.status,statusText:p.statusText,durationMs:d}};return e.callback(f),p}catch(p){const y=e.sequenceCounter.getRelativeTimestamp(),v=e.sequenceCounter.getWallClock(),m=e.sequenceCounter.nextSequence(),d=Math.max(0,Math.round((y-c)*100)/100),f={id:e.sequenceCounter.generateEventId("res_err",m),sessionId:e.sessionId,timestamp:y,sequence:m,wallClockTime:v,type:"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:a,method:o,status:0,statusText:"Failed",durationMs:d,error:(p==null?void 0:p.message)||"Network request failed"}};throw e.callback(f),p}},this.cleanups.push(()=>{this.originalFetch&&(window.fetch=this.originalFetch)})}instrumentXHR(){if(typeof XMLHttpRequest>"u")return;this.originalXHROpen=XMLHttpRequest.prototype.open,this.originalXHRSend=XMLHttpRequest.prototype.send;const e=this;XMLHttpRequest.prototype.open=function(t,s,...n){return this._forensicRequestId=e.sequenceCounter.generateEventId("req_x"),this._forensicMethod=(t||"GET").toUpperCase(),this._forensicUrl=typeof s=="string"?s:s.toString(),e.originalXHROpen.apply(this,[t,s,...n])},XMLHttpRequest.prototype.send=function(t){const s=this._forensicRequestId||e.sequenceCounter.generateEventId("req_x"),n=this._forensicMethod||"GET",i=e.privacy.sanitizeUrl(this._forensicUrl||""),r=e.sequenceCounter.getRelativeTimestamp(),o=e.sequenceCounter.getWallClock(),a=e.sequenceCounter.nextSequence();this._forensicStartTime=r;const c={id:s,sessionId:e.sessionId,timestamp:r,sequence:a,wallClockTime:o,type:"NETWORK_REQUEST_START",category:"NETWORK",source:"PAGE",payload:{requestId:s,url:i,method:n,resourceType:"xhr",hasBody:!!t}};e.callback(c);const u=()=>{const h=e.sequenceCounter.getRelativeTimestamp(),g=e.sequenceCounter.getWallClock(),p=e.sequenceCounter.nextSequence(),y=Math.max(0,Math.round((h-(this._forensicStartTime||r))*100)/100),v={id:e.sequenceCounter.generateEventId("res_x",p),sessionId:e.sessionId,timestamp:h,sequence:p,wallClockTime:g,type:this.status>=200&&this.status<400?"NETWORK_RESPONSE_COMPLETE":"NETWORK_REQUEST_FAILED",category:"NETWORK",source:"PAGE",causality:{triggeredBy:s,precededBy:s},payload:{requestId:s,url:i,method:n,status:this.status,statusText:this.statusText,durationMs:y,error:this.status===0?"XHR Network Error or Aborted":void 0}};e.callback(v)};return this.addEventListener("load",u),this.addEventListener("error",u),this.addEventListener("abort",u),e.originalXHRSend.apply(this,[t])},this.cleanups.push(()=>{this.originalXHROpen&&(XMLHttpRequest.prototype.open=this.originalXHROpen),this.originalXHRSend&&(XMLHttpRequest.prototype.send=this.originalXHRSend)})}}class Oe{constructor(e={}){b(this,"sequenceCounter");b(this,"registry");b(this,"privacy");b(this,"snapshotEngine");b(this,"mutationObserver");b(this,"eventCollector");b(this,"diagnostics");b(this,"networkMonitor");b(this,"metadata");b(this,"isRecording",!1);b(this,"isPaused",!1);b(this,"eventListeners",new Set);b(this,"checkpointListeners",new Set);b(this,"lastCheckpointSequence",0);b(this,"lastCheckpointTimestamp",0);b(this,"checkpointTimer",null);b(this,"checkpointIntervalEvents",200);b(this,"checkpointIntervalMs",3e4);this.sequenceCounter=new ne,this.registry=new H,this.privacy=new J(e.privacy),this.snapshotEngine=new he(this.registry,this.privacy,this.sequenceCounter);const t=n=>this.handleEvent(n);this.mutationObserver=new Ne(this.registry,this.privacy,this.sequenceCounter,this.snapshotEngine,t),this.eventCollector=new ke(this.registry,this.privacy,this.sequenceCounter,t),this.diagnostics=new Me(this.privacy,this.sequenceCounter,t),this.networkMonitor=new Re(this.privacy,this.sequenceCounter,t),e.checkpointIntervalEvents&&(this.checkpointIntervalEvents=e.checkpointIntervalEvents),e.checkpointIntervalMs&&(this.checkpointIntervalMs=e.checkpointIntervalMs);const s=e.sessionId||`session_${Date.now()}_${Math.random().toString(36).substring(2,7)}`;this.metadata=this.createInitialMetadata(s,e.sessionName)}getSessionId(){return this.metadata.id}getMetadata(){return{...this.metadata,durationMs:this.sequenceCounter.getRelativeTimestamp(),endTime:this.metadata.endTime||Date.now()}}getRegistry(){return this.registry}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}onCheckpoint(e){return this.checkpointListeners.add(e),()=>this.checkpointListeners.delete(e)}start(e=typeof document<"u"?document:{}){if(this.isRecording)throw new Error(`Recorder session ${this.metadata.id} is already active`);this.sequenceCounter.reset(),this.registry.reset(),this.isRecording=!0,this.isPaused=!1,this.metadata.status="recording",this.metadata.startTime=Date.now(),this.mutationObserver.setSessionId(this.metadata.id),this.eventCollector.setSessionId(this.metadata.id),this.diagnostics.setSessionId(this.metadata.id),this.networkMonitor.setSessionId(this.metadata.id);const t=this.snapshotEngine.captureSnapshot(e,this.metadata.id);this.metadata.stats.nodeCount=t.totalNodeCount;const s={id:this.sequenceCounter.generateEventId("snap_init",t.sequence),sessionId:this.metadata.id,timestamp:t.timestamp,sequence:t.sequence,wallClockTime:Date.now(),type:"DOM_SNAPSHOT",category:"DOM",source:"PAGE",payload:{snapshot:t}};return this.createCheckpoint(t,"INITIAL"),this.mutationObserver.start(e),this.eventCollector.start(),this.diagnostics.start(),this.networkMonitor.start(),this.handleEvent(s),this.checkpointIntervalMs>0&&typeof setInterval<"u"&&(this.checkpointTimer=setInterval(()=>{this.isRecording&&!this.isPaused&&this.captureCheckpoint("PERIODIC",e)},this.checkpointIntervalMs)),t}stop(){return this.isRecording?(this.mutationObserver.takeRecords(),this.mutationObserver.stop(),this.eventCollector.stop(),this.diagnostics.stop(),this.networkMonitor.stop(),this.checkpointTimer&&(clearInterval(this.checkpointTimer),this.checkpointTimer=null),this.isRecording=!1,this.metadata.status="stopped",this.metadata.endTime=Date.now(),this.metadata.durationMs=this.sequenceCounter.getRelativeTimestamp(),this.getMetadata()):this.getMetadata()}pause(){!this.isRecording||this.isPaused||(this.isPaused=!0,this.metadata.status="paused")}resume(){!this.isRecording||!this.isPaused||(this.isPaused=!1,this.metadata.status="recording")}captureCheckpoint(e="MANUAL",t=document){if(!this.isRecording)return null;const s=this.snapshotEngine.captureSnapshot(t,this.metadata.id);return this.createCheckpoint(s,e)}recordCustomEvent(e,t,s,n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.getWallClock(),o=this.sequenceCounter.nextSequence(),a={id:this.sequenceCounter.generateEventId("ext",o),sessionId:this.metadata.id,timestamp:i,sequence:o,wallClockTime:r,type:e,category:"EXTENSION",source:"CONTENT_SCRIPT",targetNodeId:s,targetSelector:n,payload:t};return this.handleEvent(a),a}recordScreenshot(e,t="MANUAL"){const s=this.sequenceCounter.getRelativeTimestamp(),n=this.sequenceCounter.getWallClock(),i=this.sequenceCounter.nextSequence(),r={id:this.sequenceCounter.generateEventId("scr",i),sessionId:this.metadata.id,timestamp:s,sequence:i,wallClockTime:n,type:"SCREENSHOT_CHECKPOINT",category:"SCREENSHOT",source:"BROWSER_RUNTIME",payload:{screenshotId:`shot_${i}`,dataUrl:e,viewport:{width:typeof window<"u"?window.innerWidth:1920,height:typeof window<"u"?window.innerHeight:1080,scrollX:typeof window<"u"?window.scrollX:0,scrollY:typeof window<"u"?window.scrollY:0,devicePixelRatio:typeof window<"u"?window.devicePixelRatio:1},triggerReason:t}};return this.handleEvent(r),r}addAnnotation(e,t,s="AGENT",n){const i=this.sequenceCounter.getRelativeTimestamp(),r=this.sequenceCounter.nextSequence(),o={id:`ann_${r}_${Math.random().toString(36).substring(2,6)}`,sessionId:this.metadata.id,timestamp:i,sequence:r,nodeId:n,author:s,label:e,comment:t,createdAt:Date.now()},a={id:o.id,sessionId:this.metadata.id,timestamp:i,sequence:r,wallClockTime:Date.now(),type:"ANNOTATION",category:"ANNOTATION",source:s==="USER"?"USER_INTERACTION":"BROWSER_RUNTIME",targetNodeId:n,payload:{annotation:o}};return this.handleEvent(a),o}createCheckpoint(e,t){const s=this.sequenceCounter.getSequence()-this.lastCheckpointSequence;this.lastCheckpointSequence=this.sequenceCounter.getSequence(),this.lastCheckpointTimestamp=e.timestamp,this.metadata.stats.checkpointCount+=1;const n={checkpointId:`chk_${e.sequence}_${Date.now()}`,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:Date.now(),snapshot:e,eventIndex:this.metadata.stats.eventCount,eventsSinceLastCheckpoint:s,trigger:t},i={id:n.checkpointId,sessionId:this.metadata.id,timestamp:e.timestamp,sequence:e.sequence,wallClockTime:n.wallClockTime,type:"CHECKPOINT",category:"CHECKPOINT",source:"BROWSER_RUNTIME",payload:{checkpointId:n.checkpointId,snapshot:e,eventsSinceLastCheckpoint:s,totalEventsSoFar:this.metadata.stats.eventCount}};return this.checkpointListeners.forEach(r=>{try{r(n)}catch(o){console.error("[ForensicRecorder] Checkpoint listener error:",o)}}),this.handleEvent(i),n}handleEvent(e){this.isPaused&&e.type!=="CHECKPOINT"&&e.type!=="ANNOTATION"||(this.metadata.stats.eventCount+=1,e.category==="DOM"&&(this.metadata.stats.mutationCount+=1),e.category==="ERROR"&&(this.metadata.stats.errorCount+=1),e.category==="CONSOLE"&&(this.metadata.stats.consoleCount+=1),e.category==="NETWORK"&&(this.metadata.stats.networkCount+=1),e.category==="SCREENSHOT"&&(this.metadata.stats.screenshotCount+=1),this.isRecording&&e.type!=="CHECKPOINT"&&e.type!=="DOM_SNAPSHOT"&&this.sequenceCounter.getSequence()-this.lastCheckpointSequence>=this.checkpointIntervalEvents&&typeof document<"u"&&this.captureCheckpoint("PERIODIC"),this.eventListeners.forEach(t=>{try{t(e)}catch(s){console.error("[ForensicRecorder] Event listener error:",s)}}))}createInitialMetadata(e,t){const s={domRecording:typeof MutationObserver<"u"?"HEALTHY":"UNAVAILABLE",userEvents:typeof window<"u"?"HEALTHY":"UNAVAILABLE",console:typeof console<"u"?"HEALTHY":"UNAVAILABLE",network:typeof window<"u"&&typeof window.fetch<"u"?"HEALTHY":"PARTIAL",screenshots:"HEALTHY",shadowDom:typeof Element<"u"&&"attachShadow"in Element.prototype?"HEALTHY":"RESTRICTED",iframes:"PARTIAL"},n={eventCount:0,mutationCount:0,errorCount:0,consoleCount:0,networkCount:0,checkpointCount:0,screenshotCount:0,nodeCount:0};return{id:e,name:t||`Recording ${new Date().toLocaleTimeString()}`,url:typeof window<"u"?window.location.href:"about:blank",origin:typeof window<"u"?window.location.origin:"",title:typeof document<"u"?document.title:"Forensic Session",userAgent:typeof navigator<"u"?navigator.userAgent:"Node.js/ForensicAgent",schemaVersion:"2.0.0",recorderVersion:"2.0.0",extensionVersion:"2.0.0",startTime:Date.now(),status:"recording",health:s,stats:n}}}class k{static inspectPage(e=document){var n,i,r,o,a,c,u,h,g,p,y,v,m,d;const t=e.defaultView||(typeof window<"u"?window:{}),s=e.activeElement;return{url:((n=t.location)==null?void 0:n.href)||((i=e.location)==null?void 0:i.href)||"",title:e.title||"",origin:((r=t.location)==null?void 0:r.origin)||"",viewport:{width:t.innerWidth||((o=e.documentElement)==null?void 0:o.clientWidth)||1920,height:t.innerHeight||((a=e.documentElement)==null?void 0:a.clientHeight)||1080,scrollX:t.scrollX||t.pageXOffset||((c=e.documentElement)==null?void 0:c.scrollLeft)||0,scrollY:t.scrollY||t.pageYOffset||((u=e.documentElement)==null?void 0:u.scrollTop)||0,devicePixelRatio:t.devicePixelRatio||1},documentDimensions:{width:Math.max(((h=e.body)==null?void 0:h.scrollWidth)||0,((g=e.documentElement)==null?void 0:g.scrollWidth)||0),height:Math.max(((p=e.body)==null?void 0:p.scrollHeight)||0,((y=e.documentElement)==null?void 0:y.scrollHeight)||0)},activeElement:s?{tag:((v=s.tagName)==null?void 0:v.toLowerCase())||"",selector:this.computeBestSelector(s),text:(m=s.textContent)==null?void 0:m.slice(0,100).trim()}:void 0,focusedElement:typeof e.hasFocus=="function"&&e.hasFocus()&&s?{tag:((d=s.tagName)==null?void 0:d.toLowerCase())||"",selector:this.computeBestSelector(s)}:void 0,visibilityState:e.visibilityState||"visible",readyState:e.readyState||"complete",framesCount:e.querySelectorAll?e.querySelectorAll("iframe, frame").length:0}}static inspectElement(e,t){var xe,_e;const s=e.ownerDocument||document,n=s.defaultView||(typeof window<"u"?window:{}),i=e,r=e.tagName?e.tagName.toLowerCase():"element",o=this.extractClasses(e),{bestSelector:a,candidates:c}=this.generateSelectorCandidates(e),u={},h={};if(e.attributes)for(let V=0;V0||E.height>0||E.right>0||E.bottom>0,R=!C||E.right>0&&E.bottom>0&&E.left=L||E.top>=I),A=!P&&T!=="none"&&x!=="hidden"&&N>0&&R,se={disabled:i.disabled??e.hasAttribute("disabled"),readOnly:i.readOnly??e.hasAttribute("readonly"),checked:i.checked,selected:i.selected,focused:s.activeElement===e,isShadowHost:!!e.shadowRoot,hasShadowRoot:!!e.shadowRoot},z=[];let G=e.parentElement;for(;G&&G.tagName&&G.tagName.toLowerCase()!=="html";)z.push(this.computeBestSelector(G)),G=G.parentElement;const Ht={count:e.children?e.children.length:0,tags:e.children?Array.from(e.children).slice(0,10).map(V=>V.tagName.toLowerCase()):[]};let Ae;if(t){const V=t.getId(e);Ae={logicalNodeId:V??null,creationSequence:null,lastMutationSequence:null,eventCount:0,isRecorded:V!=null}}return{tag:r,id:e.id||void 0,classes:o,role:g||void 0,ariaAttributes:Object.keys(h).length>0?h:void 0,text:v.slice(0,200),normalizedText:m.slice(0,200),value:d,type:f.type||void 0,selector:a,bestSelector:a,selectorCandidates:c,bounds:E,visibility:{isVisible:A,display:T,visibility:x,opacity:N,pointerEvents:D,isClipped:P,isInViewport:R,zIndex:M},computedStyle:S?{display:T,visibility:x,opacity:String(N),position:S.position,zIndex:String(M),pointerEvents:D,overflow:S.overflow,boxSizing:S.boxSizing,color:S.color,backgroundColor:S.backgroundColor,fontSize:S.fontSize}:{},attributes:u,state:se,context:{parentChain:z,parentSelector:z[0]||void 0,childrenSummary:Ht,containingBlock:(S==null?void 0:S.position)==="fixed"?"viewport":z[0]||void 0,iframe:null,shadowRoot:e.shadowRoot?"open":null},forensics:Ae}}static inspectVisualState(e){var f,w;const t=e.ownerDocument||document,s=t.defaultView||(typeof window<"u"?window:{}),n=e.getBoundingClientRect?e.getBoundingClientRect():{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},i=s.getComputedStyle?s.getComputedStyle(e):null,r=s.innerWidth||((f=t.documentElement)==null?void 0:f.clientWidth)||1920,o=s.innerHeight||((w=t.documentElement)==null?void 0:w.clientHeight)||1080,a=s.scrollX||s.pageXOffset||0,c=s.scrollY||s.pageYOffset||0,u=s.devicePixelRatio||1,h=(i==null?void 0:i.display)||"block",g=(i==null?void 0:i.visibility)||"visible",p=i&&parseFloat(i.opacity)||1,y=n.right>0&&n.bottom>0&&n.left=r||n.top>=o;let d=null;if(t.elementFromPoint&&y&&!v&&h!=="none"){const E=Math.max(0,Math.min(r-1,n.left+n.width/2)),S=Math.max(0,Math.min(o-1,n.top+n.height/2));try{const T=t.elementFromPoint(E,S);T&&T!==e&&!e.contains(T)&&!T.contains(e)&&(d=this.computeBestSelector(T))}catch{}}return{selector:this.computeBestSelector(e),bounds:{x:n.x??n.left??0,y:n.y??n.top??0,width:n.width??0,height:n.height??0,top:n.top??0,right:n.right??0,bottom:n.bottom??0,left:n.left??0},viewport:{scrollX:a,scrollY:c,width:r,height:o,devicePixelRatio:u},layout:{display:h,position:(i==null?void 0:i.position)||"static",zIndex:(i==null?void 0:i.zIndex)||"auto",opacity:p,visibility:g,overflow:(i==null?void 0:i.overflow)||"visible",boxSizing:(i==null?void 0:i.boxSizing)||"content-box",pointerEvents:(i==null?void 0:i.pointerEvents)||"auto"},occlusion:{isInViewport:y,isClipped:v||m,isZeroDimension:v,isTransparent:p===0,isDisplayNone:h==="none",isVisibilityHidden:g==="hidden",isOffscreen:m,occludedBy:d},computedStyleSummary:i?{display:h,position:i.position,zIndex:i.zIndex,opacity:String(p),visibility:g,pointerEvents:i.pointerEvents}:{}}}static generateSelectorCandidates(e){const t=e.ownerDocument||document,s=e.tagName?e.tagName.toLowerCase():"element",n=[];if(e.id&&/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(e.id)){const c=`#${e.id}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}const i=["data-testid","data-test","data-id","data-qa","data-cy","aria-label","name"];for(const c of i){const u=e.getAttribute(c);if(u&&/^[a-zA-Z0-9_-]+$/.test(u)){const h=`${s}[${c}="${u}"]`;try{t.querySelectorAll&&t.querySelectorAll(h).length===1&&n.push(h)}catch{n.push(h)}}}const r=this.extractClasses(e).filter(c=>/^[a-zA-Z0-9_-]+$/.test(c)&&!c.startsWith("ng-")&&!c.startsWith("_ng"));if(r.length>0){const c=`${s}.${r.slice(0,3).join(".")}`;try{t.querySelectorAll&&t.querySelectorAll(c).length===1&&n.push(c)}catch{n.push(c)}}if(e.parentElement&&e.parentElement.children){const c=Array.from(e.parentElement.children).filter(u=>u.tagName&&u.tagName.toLowerCase()===s);if(c.length>1){const u=c.indexOf(e)+1;if(u>0){const h=this.computeBestSelector(e.parentElement);n.push(`${h} > ${s}:nth-of-type(${u})`)}}}const o=r.length>0?`${s}.${r[0]}`:s;return n.push(o),{bestSelector:n[0]||s,candidates:n}}static computeBestSelector(e){return this.generateSelectorCandidates(e).bestSelector}static extractClasses(e){return e.classList&&typeof e.classList.forEach=="function"?Array.from(e.classList):typeof e.className=="string"?e.className.split(/\s+/).filter(Boolean):e.className&&typeof e.className.baseVal=="string"?e.className.baseVal.split(/\s+/).filter(Boolean):[]}static inferImplicitRole(e){switch(e.tagName?e.tagName.toLowerCase():""){case"a":return e.hasAttribute("href")?"link":void 0;case"button":return"button";case"input":{const s=e.type||"text";return s==="button"||s==="submit"||s==="reset"?"button":s==="checkbox"?"checkbox":s==="radio"?"radio":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"article":return"article";case"section":return"region";default:return}}}b(k,"privacyEngine",new J);class Le{constructor(e){b(this,"registry");b(this,"lastSelectedElementRef");b(this,"timingHook",null);b(this,"lastTrajectory",[]);this.registry=e}setLastSelectedElement(e){this.lastSelectedElementRef=e}setTimingHook(e){this.timingHook=e}getLastTrajectory(){return this.lastTrajectory}async timing(e){this.timingHook&&await this.timingHook(e)}resolveTarget(e,t=document){if(e.selectedElementRef&&this.lastSelectedElementRef&&t.contains(this.lastSelectedElementRef))return this.lastSelectedElementRef;if(typeof e.nodeId=="number"&&this.registry){const s=this.registry.getNode(e.nodeId);if(s&&s instanceof Element&&t.contains(s))return s}if(e.selector)try{const s=t.querySelectorAll(e.selector);if(s.length>1){for(let n=0;n{r+=w.length});try{h.observe(t.body||t.documentElement,{childList:!0,attributes:!0,characterData:!0,subtree:!0})}catch{}const g=w=>{o.push(w.message||"Runtime Error")};typeof window<"u"&&window.addEventListener("error",g);try{await this.dispatchAction(n,e)}finally{typeof window<"u"&&window.removeEventListener("error",g)}let p=!0;if((f=e.options)!=null&&f.waitForStabilization){const w=e.options.stabilizationTimeoutMs||300;await new Promise(E=>setTimeout(E,Math.min(2e3,w)))}h.disconnect();let y;t.contains(n)&&(y=k.inspectElement(n,this.registry));const v=Date.now()-s,m=a!=null&&a.__FORENSIC_CONSOLE_BUFFER__?a.__FORENSIC_CONSOLE_BUFFER__.slice(c).filter(w=>(w==null?void 0:w.level)==="error").length:0,d=a!=null&&a.__FORENSIC_NETWORK_BUFFER__?a.__FORENSIC_NETWORK_BUFFER__.slice(u).length:0;return{success:!0,action:e.action,target:y||i,beforeState:i,afterState:y,effects:{domMutations:r,consoleErrors:m,networkRequests:d,runtimeErrors:o},durationMs:v,stabilized:p}}async dispatchAction(e,t){var n,i,r,o,a,c;const s=e;switch(t.action){case"click":{this.scrollIntoViewIfNeeded(e),await this.timing("move"),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown"),this.dispatchMouseEvent(e,"mousedown"),typeof s.focus=="function"&&s.focus(),this.dispatchMouseEvent(e,"pointerup"),this.dispatchMouseEvent(e,"mouseup"),typeof s.click=="function"?s.click():this.dispatchMouseEvent(e,"click");break}case"double_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"click"),await this.timing("click"),this.dispatchMouseEvent(e,"click"),this.dispatchMouseEvent(e,"dblclick");break}case"right_click":{this.scrollIntoViewIfNeeded(e),await this.timing("click"),this.dispatchMouseEvent(e,"pointerdown",{button:2}),this.dispatchMouseEvent(e,"mousedown",{button:2}),this.dispatchMouseEvent(e,"contextmenu",{button:2});break}case"hover":{await this.timing("move"),this.dispatchMouseEvent(e,"pointerenter"),this.dispatchMouseEvent(e,"mouseenter"),this.dispatchMouseEvent(e,"mouseover"),await this.timing("move"),this.dispatchMouseEvent(e,"mousemove");break}case"focus":{typeof s.focus=="function"&&s.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:!0}));break}case"blur":{typeof s.blur=="function"&&s.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:!0}));break}case"type":{const u=t.text||"",h=e,g=((n=e.ownerDocument)==null?void 0:n.defaultView)||(typeof window<"u"?window:null);typeof s.focus=="function"&&s.focus();for(const y of u){await this.timing("type");const v=d=>{try{const w=(g==null?void 0:g.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(w)return new w(d,{key:y,bubbles:!0})}catch{}const f=(g==null?void 0:g.CustomEvent)||(g==null?void 0:g.Event)||CustomEvent;return new f(d,{bubbles:!0,cancelable:!0})},m=(d,f)=>{try{const E=(g==null?void 0:g.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(E)return new E(d,f)}catch{}const w=(g==null?void 0:g.CustomEvent)||(g==null?void 0:g.Event)||CustomEvent;return new w(d,{bubbles:!0,cancelable:!0})};e.dispatchEvent(v("keydown")),e.dispatchEvent(v("keypress")),"value"in h&&(h.value=(h.value||"")+y),e.dispatchEvent(m("input",{data:y,inputType:"insertText",bubbles:!0})),e.dispatchEvent(v("keyup"))}const p=(g==null?void 0:g.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}));break}case"clear":{const u=e,h=((i=e.ownerDocument)==null?void 0:i.defaultView)||(typeof window<"u"?window:null);if("value"in u){u.value="";const g=(y,v)=>{try{const d=(h==null?void 0:h.InputEvent)||(typeof InputEvent<"u"?InputEvent:null);if(d)return new d(y,v)}catch{}const m=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new m(y,{bubbles:!0,cancelable:!0})};e.dispatchEvent(g("input",{inputType:"deleteContentBackward",bubbles:!0}));const p=(h==null?void 0:h.Event)||Event;e.dispatchEvent(new p("change",{bubbles:!0}))}break}case"press_key":{const u=t.key||"Enter",h=((r=e.ownerDocument)==null?void 0:r.defaultView)||(typeof window<"u"?window:null),g=p=>{try{const v=(h==null?void 0:h.KeyboardEvent)||(typeof KeyboardEvent<"u"?KeyboardEvent:null);if(v)return new v(p,{key:u,bubbles:!0})}catch{}const y=(h==null?void 0:h.CustomEvent)||(h==null?void 0:h.Event)||CustomEvent;return new y(p,{bubbles:!0,cancelable:!0})};e.dispatchEvent(g("keydown")),e.dispatchEvent(g("keypress")),e.dispatchEvent(g("keyup"));break}case"select_option":{const u=e;((o=u.tagName)==null?void 0:o.toLowerCase())==="select"&&t.optionValue&&(u.value=t.optionValue,e.dispatchEvent(new Event("change",{bubbles:!0})));break}case"scroll_into_view":{this.scrollIntoViewIfNeeded(e,!0);break}case"scroll":{const u=((a=t.scrollDelta)==null?void 0:a.x)||0,h=((c=t.scrollDelta)==null?void 0:c.y)||0;typeof e.scrollBy=="function"&&e.scrollBy(u,h);break}default:throw new Error(`Unsupported interaction action: ${t.action}`)}}scrollIntoViewIfNeeded(e,t=!1){if(typeof e.scrollIntoView=="function")try{e.scrollIntoView({behavior:"auto",block:"center",inline:"center"})}catch{e.scrollIntoView(t)}}dispatchMouseEvent(e,t,s={}){const n=e.getBoundingClientRect?e.getBoundingClientRect():{left:0,top:0,width:0,height:0},i=n.left+n.width/2,r=n.top+n.height/2,o=new MouseEvent(t,{bubbles:s.bubbles!==void 0?s.bubbles:!0,cancelable:s.cancelable!==void 0?s.cancelable:!0,clientX:i,clientY:r,button:s.button||0,buttons:s.button===2?2:1});e.dispatchEvent(o)}}class ie{static matches(e,t){if(!e||e.nodeType!==$.ELEMENT_NODE)return!1;const s=t.trim();return s?s.includes(",")?s.split(",").some(n=>this.matchesSimple(e,n.trim())):this.matchesCompound(e,s):!1}static querySelector(e,t,s){const n=this.querySelectorAll(e,t,s,1);return n.length>0?n[0]:null}static querySelectorAll(e,t,s,n=1/0){const i=[],r=s[t];if(!r)return i;const o=[...r.children||[]],a=new Set;for(;o.length>0&&i.length=n))break;u.children&&u.children.length>0&&o.push(...u.children)}}return i}static getElementById(e,t){for(const s of Object.values(t))if(s.nodeType===$.ELEMENT_NODE&&!s.isDetached&&s.attributes&&s.attributes.id===e&&this.isNodeConnected(s,t))return s;return null}static isNodeConnected(e,t){if(e.isDetached)return!1;let s=e;const n=new Set;for(;s&&s.parentId;){if(n.has(s.id))return!1;n.add(s.id);const i=t[s.parentId];if(!i||i.isDetached)return!1;s=i}return!0}static computeSelector(e,t){var r,o;if(!e)return"";if(e.nodeType!==$.ELEMENT_NODE)return e.tagName||`#node-${e.id}`;if((r=e.attributes)!=null&&r.id)return`#${e.attributes.id}`;const s=e.tagName||"div",n=(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).filter(a=>a&&!a.startsWith("ng-")).slice(0,2),i=n.length>0?"."+n.join("."):"";if(e.parentId&&t[e.parentId]){const c=(t[e.parentId].children||[]).map(u=>t[u]).filter(u=>u&&u.nodeType===$.ELEMENT_NODE&&u.tagName===s);if(c.length>1){const u=c.findIndex(h=>h.id===e.id)+1;return`${s}${i}:nth-of-type(${u})`}}return`${s}${i}`}static matchesCompound(e,t){return this.matchesSimple(e,t)}static matchesSimple(e,t){var i,r,o,a,c,u,h;const s=((i=e.tagName)==null?void 0:i.toLowerCase())||"";if(t==="*")return!0;if(t.startsWith("#")){const g=t.substring(1);return((r=e.attributes)==null?void 0:r.id)===g}if(t.startsWith(".")){const g=t.substring(1);return(((o=e.attributes)==null?void 0:o.class)||"").split(/\s+/).includes(g)}if(t.startsWith("[")&&t.endsWith("]")){const g=t.substring(1,t.length-1);if(g.includes("=")){const[p,y]=g.split("="),v=y.replace(/^["']|["']$/g,"");return((a=e.attributes)==null?void 0:a[p.trim()])===v}return!!((c=e.attributes)!=null&&c[g.trim()])}const n=t.match(/^([a-zA-Z0-9_-]+)(.*)$/);if(n){const g=n[1].toLowerCase(),p=n[2];if(g!==s&&g!=="*")return!1;if(!p)return!0;if(p.startsWith("#"))return((u=e.attributes)==null?void 0:u.id)===p.substring(1);if(p.startsWith("."))return(((h=e.attributes)==null?void 0:h.class)||"").split(/\s+/).includes(p.substring(1));if(p.startsWith("["))return this.matchesSimple(e,p)}return!1}}class De{static traceElement(e,t,s){var M,L;const n=[...t].sort((I,C)=>I.sequence-C.sequence);let i=e.nodeId,r="unknown",o=e.selector||"",a={},c=0,u=0,h="init";if(!i&&e.selector&&s){const I=ie.querySelector(e.selector,s.rootId,s.nodes);I&&(i=I.id,r=I.tagName||"element",a={...I.attributes||{}},o=e.selector)}if(!i&&e.selector){for(const I of n)if(I.type==="DOM_MUTATION_ADD"){const C=I.payload;if(C.node&&ie.matches(C.node,e.selector)){i=C.node.id,r=C.node.tagName||"element",a={...C.node.attributes||{}},c=I.timestamp,u=I.sequence,h=I.id;break}}}if(!i)return null;const g=[];let p=!0,y=null,v=null,m,d=0;if(s&&s.nodes[i]){const I=s.nodes[i];r=I.tagName||r,a={...I.attributes||{}},o||(o=ie.computeSelector(I,s.nodes)),g.push({timestamp:s.timestamp,sequence:s.sequence,wallClockTime:Date.now(),stage:"CREATED",eventId:s.snapshotId,eventType:"DOM_SNAPSHOT",description:`Element <${r}> existed in initial baseline snapshot [ID: ${i}]`,details:{initialParentId:I.parentId,attributes:a},nodeSnapshot:I})}const f=new Map;if(s)for(const[I,C]of Object.entries(s.nodes))f.set(Number(I),C.parentId??null);const w=(I,C)=>{let R=f.get(C);const P=new Set;for(;R&&!P.has(R);){if(R===I)return!0;P.add(R),R=f.get(R)}return!1};for(const I of n){const C=I.timestamp,R=I.sequence,P=I.wallClockTime;if(I.type==="DOM_MUTATION_ADD"){const A=I.payload;(M=A.node)!=null&&M.id&&f.set(A.node.id,A.parentId??null),((L=A.node)==null?void 0:L.id)===i&&(p=!0,r=A.node.tagName||r,c=C,u=R,h=I.id,a={...A.node.attributes||{}},g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"ATTACHED_TO_DOM",eventId:I.id,eventType:I.type,description:`Element <${r}> added to DOM under parent ID ${A.parentId}`,details:{parentId:A.parentId,index:A.index},nodeSnapshot:A.node}))}if(I.type==="DOM_MUTATION_REMOVE"){const A=I.payload;A.nodeId===i?(p=!1,y=C,v=R,m=I.id,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"REMOVED_FROM_DOM",eventId:I.id,eventType:I.type,description:`Element <${r}> explicitly removed from parent ID ${A.parentId}`,details:{parentId:A.parentId,removedIndex:A.index}})):w(A.nodeId,i)&&(p=!1,y=C,v=R,m=I.id,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"PARENT_SUBTREE_REPLACED",eventId:I.id,eventType:I.type,description:`Ancestor element [ID: ${A.nodeId}] was removed, causing target element [ID: ${i}] to detach from DOM`,details:{removedAncestorId:A.nodeId,parentId:A.parentId}}))}if(I.type==="DOM_MUTATION_MOVE"){const A=I.payload;A.nodeId&&f.set(A.nodeId,A.newParentId??null),A.nodeId===i&&(d++,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"REPARENTED",eventId:I.id,eventType:I.type,description:`Element reparented from parent ${A.oldParentId} to ${A.newParentId}`,details:{oldParentId:A.oldParentId,newParentId:A.newParentId}}))}if(I.type==="DOM_MUTATION_ATTR"){const A=I.payload;if(A.nodeId===i){d++;const se=A.attributeName.toLowerCase();let z="ATTRIBUTE_MODIFIED";se==="class"&&(z="CLASS_MODIFIED"),se==="style"&&(z="STYLE_MODIFIED"),g.push({timestamp:C,sequence:R,wallClockTime:P,stage:z,eventId:I.id,eventType:I.type,description:`Attribute '${A.attributeName}' changed from '${A.oldValue??""}' to '${A.newValue??""}'`,details:{attributeName:A.attributeName,oldValue:A.oldValue,newValue:A.newValue}})}}if(I.type==="DOM_MUTATION_TEXT"){const A=I.payload;A.nodeId===i&&(d++,g.push({timestamp:C,sequence:R,wallClockTime:P,stage:"TEXT_MODIFIED",eventId:I.id,eventType:I.type,description:`Text content changed: "${A.oldText}" → "${A.newText}"`,details:{oldText:A.oldText,newText:A.newText}}))}}const E=y??c,S=500,T=n.filter(I=>(I.category==="ERROR"||I.category==="CONSOLE")&&Math.abs(I.timestamp-E)<=S),x=n.filter(I=>I.category==="NETWORK"&&Math.abs(I.timestamp-E)<=S),N=n.length>0?n[n.length-1].timestamp:c,D=Math.max(0,(y??N)-c);return{targetNodeId:i,tagName:r,selectorHint:o,initialAttributes:a,createdAt:c,createdSequence:u,createdEventId:h,removedAt:y,removedSequence:v,removedEventId:m,isCurrentlyAlive:p,lifespanMs:Math.round(D*100)/100,mutationCount:d,entries:g,correlatedDiagnostics:T,correlatedNetwork:x}}}class $e{static analyze(e,t,s){var D,M,L,I;const n=typeof e=="number"?{nodeId:e}:{selector:e},i=De.traceElement(n,t,s);if(!i)return{targetQuery:e,found:!1,disappearanceMechanism:"UNKNOWN",likelyRootCause:"Target element could not be found in recording baseline or event stream",confidenceScore:0,detailedExplanation:`No element matching "${e}" was ever created, recorded in the initial DOM snapshot, or observed in mutation events.`,evidentiaryTrail:[],precedingEvents:[],followingEvents:[],correlatedErrors:[],correlatedNetworkCalls:[],alternativeHypotheses:[{hypothesis:"Element was injected into an unmonitored isolated iframe or ShadowRoot closed mode",likelihood:40,evidenceFor:["Element query yielded zero matches in monitored document"],evidenceAgainst:["Iframes/ShadowRoots were accessible in this session"]},{hypothesis:"Selector typo or timing mismatch",likelihood:60,evidenceFor:["Target selector did not match any recorded tag or class"],evidenceAgainst:[]}]};const r=[...t].sort((C,R)=>C.sequence-R.sequence),o=[],a=[];let c="UNKNOWN",u="Unknown disappearance mechanism",h=50,g="",p=i.removedAt??void 0;const y=i.entries.find(C=>C.stage==="REMOVED_FROM_DOM"),v=i.entries.find(C=>C.stage==="PARENT_SUBTREE_REPLACED"),m=i.entries.find(C=>C.stage==="CLASS_MODIFIED"&&/\b(hidden|hide|d-none|invisible|collapsed)\b/i.test(String(C.details.newValue||""))),d=i.entries.find(C=>C.stage==="STYLE_MODIFIED"&&/display\s*:\s*none|visibility\s*:\s*hidden|opacity\s*:\s*0/i.test(String(C.details.newValue||"")));y?(c="DIRECT_NODE_REMOVAL",p=y.timestamp,u=`Element [ID: ${i.targetNodeId}] <${i.tagName}> was directly removed from its parent [ID: ${y.details.parentId}] via DOM removeChild/replaceChild`,h=95,o.push({timestamp:y.timestamp,sequence:y.sequence,eventId:y.eventId,eventType:y.eventType,evidenceType:"DIRECT",description:`Direct DOM removal mutation: element detached from parent ID ${y.details.parentId}`,confidenceContribution:50})):v?(c="PARENT_SUBTREE_REPLACED",p=v.timestamp,u=`Host framework (e.g. React/Vue re-render) destroyed and replaced Ancestor container [ID: ${v.details.removedAncestorId}], causing injected element to be unmounted`,h=92,o.push({timestamp:v.timestamp,sequence:v.sequence,eventId:v.eventId,eventType:v.eventType,evidenceType:"DIRECT",description:`Ancestor container [ID: ${v.details.removedAncestorId}] was removed, wiping out all child subtrees`,confidenceContribution:50})):d?(c="STYLE_DISPLAY_NONE",p=d.timestamp,u=`Element was visually hidden by an inline style modification: "${d.details.newValue}"`,h=88,o.push({timestamp:d.timestamp,sequence:d.sequence,eventId:d.eventId,eventType:d.eventType,evidenceType:"DIRECT",description:`Inline style changed to "${d.details.newValue}"`,confidenceContribution:45})):m?(c="CLASS_TRIGGERED_HIDDEN",p=m.timestamp,u=`Element was visually hidden because its CSS class list was modified to include "${m.details.newValue}"`,h=85,o.push({timestamp:m.timestamp,sequence:m.sequence,eventId:m.eventId,eventType:m.eventType,evidenceType:"DIRECT",description:`Class list changed from "${m.details.oldValue??""}" to "${m.details.newValue??""}"`,confidenceContribution:45})):i.isCurrentlyAlive&&(c="UNKNOWN",u=`Element [ID: ${i.targetNodeId}] is currently alive and attached to the DOM tree (no unmount mutation detected)`,h=70,g="The element exists in the current DOM state. If it is not visible on screen, it may be clipped by viewport boundaries, z-index stacking context, or 0x0 pixel dimensions.");const f=p??i.createdAt,w=500,E=r.filter(C=>C.timestamp>=f-w&&C.timestampC.timestamp>f&&C.timestamp<=f+w),T=E.filter(C=>C.category==="ERROR");if(T.length>0){const C=T[0],R=((D=C.payload)==null?void 0:D.message)||"Unknown runtime error";o.push({timestamp:C.timestamp,sequence:C.sequence,eventId:C.id,eventType:C.type,evidenceType:"PRECEDING",description:`Runtime error occurred ${(f-C.timestamp).toFixed(1)}ms before disappearance: "${R}"`,confidenceContribution:20,rawEvent:C}),u+=` (preceded by runtime error: "${R}")`}const x=E.filter(C=>C.type==="NETWORK_RESPONSE_COMPLETE"||C.type==="NETWORK_REQUEST_FAILED");if(x.length>0){const C=x[0],R=((M=C.payload)==null?void 0:M.url)||"network request";o.push({timestamp:C.timestamp,sequence:C.sequence,eventId:C.id,eventType:C.type,evidenceType:"PRECEDING",description:`Network response completed ${(f-C.timestamp).toFixed(1)}ms before disappearance: ${R}`,confidenceContribution:15,rawEvent:C})}const N=E.filter(C=>C.category==="NAVIGATION");if(N.length>0){const C=N[0];o.push({timestamp:C.timestamp,sequence:C.sequence,eventId:C.id,eventType:C.type,evidenceType:"PRECEDING",description:`Navigation event (${(L=C.payload)==null?void 0:L.navigationType}) occurred ${(f-C.timestamp).toFixed(1)}ms before disappearance`,confidenceContribution:25,rawEvent:C}),u+=` following SPA navigation to "${(I=C.payload)==null?void 0:I.url}"`}return g||(g=[`Element <${i.tagName}> (Logical ID: ${i.targetNodeId}, selector: "${i.selectorHint}") was created at ${i.createdAt.toFixed(1)}ms.`,`It remained alive in the DOM for ${i.lifespanMs.toFixed(1)}ms and experienced ${i.mutationCount} mutations.`,`At timestamp ${f.toFixed(1)}ms, it disappeared via [${c}].`,`Diagnosis: ${u}.`].join(" ")),c==="PARENT_SUBTREE_REPLACED"?(a.push({hypothesis:"Direct cleanup called by extension code",likelihood:25,evidenceFor:["Element was unmounted shortly after creation"],evidenceAgainst:["Ancestor container mutation was recorded from host page context"]}),a.push({hypothesis:"Host single-page app route change destroyed component tree",likelihood:35,evidenceFor:N.length>0?["Preceding navigation event recorded"]:[],evidenceAgainst:N.length===0?["No navigation events occurred in temporal window"]:[]})):c==="DIRECT_NODE_REMOVAL"&&a.push({hypothesis:"Third-party script or ad-blocker removed the injected node",likelihood:30,evidenceFor:["Direct node removal occurred without ancestor replacement"],evidenceAgainst:["No ad-blocker signatures or extension error logs observed"]}),{targetQuery:e,targetNodeId:i.targetNodeId,found:!0,tagName:i.tagName,selectorHint:i.selectorHint,createdAt:i.createdAt,firstVisibleAt:i.createdAt,lastKnownGoodStateAt:Math.max(0,f-1),disappearedAt:p,lifespanMs:i.lifespanMs,disappearanceMechanism:c,likelyRootCause:u,confidenceScore:Math.min(99,h),detailedExplanation:g,evidentiaryTrail:o,precedingEvents:E,followingEvents:S,correlatedErrors:T,correlatedNetworkCalls:x,alternativeHypotheses:a}}}class qe{constructor(e){b(this,"activeObservation",null);b(this,"registry");b(this,"sequenceCounter");this.registry=e,this.sequenceCounter=new ne}isObserving(){return this.activeObservation!==null}startObservation(e,t=document){this.activeObservation&&this.stopObservation(t);const s=`obs_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,n=Date.now(),i=k.inspectElement(e,this.registry),r=i.bestSelector,o=[],a=this.registry?this.registry.getOrCreateId(e,0):100;o.push({id:`evt_init_${s}`,sessionId:s,timestamp:0,sequence:1,wallClockTime:n,type:"DOM_MUTATION_ADD",category:"DOM",source:"BROWSER_RUNTIME",targetNodeId:a,targetSelector:r,payload:{node:{id:a,nodeType:1,tagName:i.tag,attributes:i.attributes,textContent:i.text,children:[],parentId:null},parentId:null,index:0}});const c=new MutationObserver(u=>{const h=Date.now()-n;for(const g of u)if(g.type==="childList"){for(let p=0;p0&&(m=$e.analyze(n,a)),{observationId:t,targetSelector:n,targetNodeId:((d=r.forensics)==null?void 0:d.logicalNodeId)||void 0,startTime:i,endTime:u,durationMs:h,initialState:r,finalState:p,disappeared:y,disappearanceReason:v,mutations:a.filter(f=>f.category==="DOM"),diagnostics:a.filter(f=>f.category==="ERROR"||f.category==="CONSOLE"),networkEvents:a.filter(f=>f.category==="NETWORK"),screenshots:c,correlationReport:m}}}class Pe{constructor(e={}){b(this,"isExplicitModeActive",!1);b(this,"isGlobalShortcutActive",!1);b(this,"highlighterEl",null);b(this,"badgeEl",null);b(this,"lastSelectedElement",null);b(this,"options",{});b(this,"onMouseMoveBound");b(this,"onClickBound");b(this,"onKeyDownBound");b(this,"onGlobalClickBound");this.options=e,this.onMouseMoveBound=this.handleMouseMove.bind(this),this.onClickBound=this.handleClick.bind(this),this.onKeyDownBound=this.handleKeyDown.bind(this),this.onGlobalClickBound=this.handleGlobalCtrlShiftClick.bind(this),this.initGlobalShortcutListener()}initGlobalShortcutListener(){typeof window>"u"||this.isGlobalShortcutActive||(window.addEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!0)}startPicker(e){typeof document>"u"||(e&&(this.options={...this.options,...e}),!this.isExplicitModeActive&&(this.isExplicitModeActive=!0,this.ensureHighlighter(),document.body&&(document.body.style.cursor="crosshair"),window.addEventListener("mousemove",this.onMouseMoveBound,!0),window.addEventListener("click",this.onClickBound,!0),window.addEventListener("keydown",this.onKeyDownBound,!0)))}stopPicker(){this.isExplicitModeActive&&(this.isExplicitModeActive=!1,typeof document<"u"&&document.body&&(document.body.style.cursor="default"),this.removeHighlighter(),typeof window<"u"&&(window.removeEventListener("mousemove",this.onMouseMoveBound,!0),window.removeEventListener("click",this.onClickBound,!0),window.removeEventListener("keydown",this.onKeyDownBound,!0)))}getLastSelectedElement(){return this.lastSelectedElement}setSelectedElement(e){let t;return"tag"in e&&"bestSelector"in e&&typeof e.getAttribute!="function"?t=e:(t=k.inspectElement(e,this.options.nodeRegistry),this.flashSelection(e)),this.lastSelectedElement=t,this.options.onSelected&&this.options.onSelected(t),t}handleGlobalCtrlShiftClick(e){if(!e.ctrlKey||!e.shiftKey)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s)}handleMouseMove(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t)){this.hideHighlighter();return}this.updateHighlighter(t)}handleClick(e){if(!this.isExplicitModeActive)return;const t=e.target;if(!t||this.isExtensionOwned(t))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();const s=this.setSelectedElement(t);this.notifyExtension(s),this.stopPicker()}handleKeyDown(e){e.key==="Escape"&&this.isExplicitModeActive&&(e.preventDefault(),this.stopPicker(),this.options.onCanceled&&this.options.onCanceled())}isExtensionOwned(e){return!!(e.id==="forensic-recorder-floating-host"||e.id==="forensic-inspect-highlighter"||e.closest("#forensic-recorder-floating-host")||e.closest("#forensic-inspect-highlighter")||e.hasAttribute("data-forensic-internal")||e.closest("[data-forensic-internal]"))}ensureHighlighter(){if(typeof document>"u"||this.highlighterEl)return;const e=this.options.highlightColor||"#0ea5e9",t=document.createElement("div");t.id="forensic-inspect-highlighter",t.setAttribute("data-forensic-internal","true"),t.style.position="fixed",t.style.pointerEvents="none",t.style.zIndex="2147483640",t.style.border=`2px solid ${e}`,t.style.background="rgba(14, 165, 233, 0.18)",t.style.borderRadius="3px",t.style.boxShadow=`0 0 12px ${e}88`,t.style.transition="all 0.05s ease-out",t.style.display="none";const s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="absolute",s.style.bottom="100%",s.style.left="0",s.style.transform="translateY(-4px)",s.style.background="#0f172a",s.style.color="#38bdf8",s.style.fontSize="11px",s.style.fontFamily="monospace",s.style.fontWeight="bold",s.style.padding="2px 6px",s.style.borderRadius="3px",s.style.boxShadow="0 2px 6px rgba(0,0,0,0.5)",s.style.whiteSpace="nowrap",s.style.pointerEvents="none",t.appendChild(s),document.body.appendChild(t),this.highlighterEl=t,this.badgeEl=s}updateHighlighter(e){if(this.ensureHighlighter(),!this.highlighterEl||!this.badgeEl)return;const t=e.getBoundingClientRect();this.highlighterEl.style.display="block",this.highlighterEl.style.left=`${t.left}px`,this.highlighterEl.style.top=`${t.top}px`,this.highlighterEl.style.width=`${Math.max(1,t.width)}px`,this.highlighterEl.style.height=`${Math.max(1,t.height)}px`;const s=e.tagName.toLowerCase(),n=e.id?`#${e.id}`:"",i=e.className&&typeof e.className=="string"?"."+e.className.split(/\s+/)[0]:"",r=`${Math.round(t.width)}×${Math.round(t.height)}`;this.badgeEl.textContent=`<${s}${n}${i}> [${r}]`}hideHighlighter(){this.highlighterEl&&(this.highlighterEl.style.display="none")}removeHighlighter(){this.highlighterEl&&this.highlighterEl.parentElement&&this.highlighterEl.remove(),this.highlighterEl=null,this.badgeEl=null}flashSelection(e){if(typeof document>"u"||!e.getBoundingClientRect)return;const t=e.getBoundingClientRect(),s=document.createElement("div");s.setAttribute("data-forensic-internal","true"),s.style.position="fixed",s.style.left=`${t.left}px`,s.style.top=`${t.top}px`,s.style.width=`${Math.max(1,t.width)}px`,s.style.height=`${Math.max(1,t.height)}px`,s.style.border="2px solid #22c55e",s.style.background="rgba(34, 197, 94, 0.25)",s.style.zIndex="2147483645",s.style.pointerEvents="none",s.style.transition="opacity 0.6s ease-out",document.body.appendChild(s),setTimeout(()=>{s.style.opacity="0",setTimeout(()=>s.remove(),600)},400)}notifyExtension(e){var t;try{typeof chrome<"u"&&((t=chrome.runtime)!=null&&t.sendMessage)&&chrome.runtime.sendMessage({type:"ELEMENT_SELECTED",elementInfo:e,timestamp:Date.now()})}catch{}}destroy(){this.stopPicker(),typeof window<"u"&&window.removeEventListener("click",this.onGlobalClickBound,!0),this.isGlobalShortcutActive=!1}}class ge{static getCrcTable(){if(this.crcTable)return this.crcTable;const e=new Uint32Array(256);for(let t=0;t<256;t++){let s=t;for(let n=0;n<8;n++)s=s&1?3988292384^s>>>1:s>>>1;e[t]=s>>>0}return this.crcTable=e,e}static crc32(e,t=0,s=e.length){const n=this.getCrcTable();let i=4294967295;for(let r=t;r>>8^n[(i^e[r])&255];return(i^4294967295)>>>0}static adler32(e){let t=1,s=0;for(let n=0;n>>0}static createPNG(e){const t=Math.max(1,Math.min(1920,Math.floor(e.width))),s=Math.max(1,Math.min(1080,Math.floor(e.height))),n=e.backgroundColor||[15,23,42,255],i=e.headerColor||[56,189,248,255],r=e.borderColor||[99,102,241,255],o=1+t*4,a=new Uint8Array(o*s),c=Math.min(30,Math.floor(s*.2));for(let d=0;d=e.length,g=new Uint8Array(5+u);g[0]=h?1:0,g[1]=u&255,g[2]=u>>>8&255;const p=~u&65535;g[3]=p&255,g[4]=p>>>8&255,g.set(e.subarray(n,n+u),5),t.push(g),n+=u}const i=t.reduce((c,u)=>c+u.length,0)+2+4,r=new Uint8Array(i);let o=0;r[o++]=120,r[o++]=1;for(const c of t)r.set(c,o),o+=c.length;const a=this.adler32(e);return r[o++]=a>>>24&255,r[o++]=a>>>16&255,r[o++]=a>>>8&255,r[o++]=a&255,r}static writeChunk(e,t,s,n){const i=n.length,r=new DataView(e.buffer,e.byteOffset,e.byteLength);r.setUint32(t,i,!1),t+=4;const o=new Uint8Array(4+i);for(let c=0;c<4;c++){const u=s.charCodeAt(c);e[t+c]=u,o[c]=u}t+=4,i>0&&(e.set(n,t),o.set(n,4),t+=i);const a=this.crc32(o);return r.setUint32(t,a,!1),t+=4,t}}b(ge,"crcTable",null);const Q=500;class Ue{constructor(e,t){b(this,"history",[]);b(this,"undoStack",[]);b(this,"redoStack",[]);b(this,"counter",0);b(this,"transaction",null);this.doc=e,this.registry=t}mutate(e){var h;const t=`mut_${Date.now().toString(36)}_${++this.counter}`,s=Date.now();let n;try{n=this.resolveTarget(e.target)}catch(g){return this.failure(t,e,null,g.message,Date.now()-s)}const i=this.snapshotState(n);let r=null,o=null,a,c=!0;try{const g=this.applyOperation(t,e,n);g&&(this.transaction?this.transaction.undoRecords.push(g):(this.undoStack.push(g),this.redoStack=[]));const y=(n.isConnected!==void 0?n.isConnected:this.doc.contains(n))?n:this.doc.querySelector(i.selector)||n;r=this.snapshotState(y),o=this.quickDiff(i,r,n)}catch(g){c=!1,a=g.message,r=null}const u={mutationId:t,operation:e.operation,success:c,before:i,after:r,diff:o,affectedSelector:c?i.selector:null,durationMs:Date.now()-s,error:a,undoable:c&&(this.transaction?this.transaction.undoRecords.length>0:this.undoStack.length>0)};return this.transaction&&this.transaction.steps.push({stepId:`step_${this.transaction.steps.length+1}`,mutation:u}),this.pushHistory({mutationId:t,transactionId:(h=this.transaction)==null?void 0:h.id,timestamp:Date.now(),operation:e.operation,targetSelector:i.selector,success:c,summary:`${e.operation} on ${i.selector}${o?` (+${o.added}/-${o.removed}/~${o.changed})`:""}`,undoApplied:!1,redoApplied:!1}),u}beginTransaction(){if(this.transaction)throw new Error(`TRANSACTION_ALREADY_OPEN: ${this.transaction.id} — commit or rollback first.`);return this.transaction={id:`tx_${Date.now().toString(36)}_${++this.counter}`,steps:[],undoRecords:[]},this.transaction.id}commitTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before committing.");const t=this.transaction,s=Date.now();let n=!0,i;if(e)try{n=e({id:t.id,steps:t.steps})!==!1,n||(i="VERIFY_FAILED: caller verification rejected the transaction state.")}catch(o){n=!1,i=`VERIFY_ERROR: ${o.message}`}if(!n)return this.rollbackInternal(t,i||"VERIFY_FAILED",s);this.undoStack.push(...t.undoRecords),this.undoStack.length>Q&&this.undoStack.splice(0,this.undoStack.length-Q),this.redoStack=[];const r=this.summaryOf(t);return this.transaction=null,{transactionId:t.id,committed:!0,rolledBack:!1,steps:t.steps,durationMs:Date.now()-s,finalStateSummary:r}}rollbackTransaction(e){if(!this.transaction)throw new Error("NO_OPEN_TRANSACTION: begin a transaction before rolling back.");const t=this.transaction;return this.rollbackInternal(t,e||"ROLLBACK_REQUESTED",Date.now())}rollbackInternal(e,t,s){for(const i of[...e.undoRecords].reverse())try{this.applyUndo(i)}catch{}const n=this.summaryOf(e);return this.transaction=null,{transactionId:e.id,committed:!1,rolledBack:!0,steps:e.steps,error:t,durationMs:Date.now()-s,finalStateSummary:n}}undo(){const e=this.transaction?this.transaction.undoRecords:this.undoStack,t=e.pop();if(!t)return{success:!1,message:"Nothing to undo — the mutation history is empty."};try{this.applyUndo(t)}catch(s){return e.push(t),{success:!1,mutationId:t.mutationId,message:`UNDO_FAILED: ${s.message}`}}return this.redoStack.push(t),this.markHistory(t.mutationId,"undo"),{success:!0,mutationId:t.mutationId,message:`Undid ${t.operation} on ${t.targetSelector}.`}}redo(){const e=this.redoStack.pop();if(!e)return{success:!1,message:"Nothing to redo — no undone mutation is pending."};try{const t=this.resolveTarget({selector:e.targetSelector}),s={operation:e.operation,target:{selector:e.targetSelector}};return this.reapplyRecord(e,t,s)?((this.transaction?this.transaction.undoRecords:this.undoStack).push(e),this.markHistory(e.mutationId,"redo"),{success:!0,mutationId:e.mutationId,message:`Redid ${e.operation} on ${e.targetSelector}.`}):(this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:"REDO_FAILED: target state diverged — cannot safely reapply."})}catch(t){return this.redoStack.push(e),{success:!1,mutationId:e.mutationId,message:`REDO_FAILED: ${t.message}`}}}getHistory(e=100){return this.history.slice(-e)}getUndoDepth(){return this.transaction?this.transaction.undoRecords.length:this.undoStack.length}getRedoDepth(){return this.redoStack.length}getOpenTransactionId(){var e;return((e=this.transaction)==null?void 0:e.id)||null}preview(e){var t;try{const s=this.resolveTarget(e.target),n=[];let i=1;(e.operation==="set_inner_html"||e.operation==="set_outer_html")&&(n.push("HTML replacement can destroy descendant node identity — captured regions targeting children may become stale."),i=s.querySelectorAll("*").length+1),(e.operation==="remove_element"||e.operation==="unwrap_element")&&(n.push("Removal is destructive; the undo record preserves the full serialized subtree."),i=s.querySelectorAll("*").length+1),e.operation==="move_element"&&!e.parent&&n.push("No parent target supplied — move requires payload.parent."),e.operation==="wrap_element"&&!e.newElementHtml&&n.push("No wrapper HTML supplied — a neutral
wrapper will be generated.");const r=He(e,s);return{valid:n.filter(o=>o.includes("requires")||o.includes("No parent")).length===0,operation:e.operation,target:{selector:this.snapshotState(s).selector,tag:s.tagName.toLowerCase()},expectedChange:r,affectedNodes:i,warnings:n}}catch(s){return{valid:!1,operation:e.operation,target:{selector:String(((t=e.target)==null?void 0:t.selector)||""),tag:""},expectedChange:"—",affectedNodes:0,warnings:[],error:s.message}}}applyOperation(e,t,s){var r;const n=this.snapshotState(s).selector,i=t.operation;switch(i){case"set_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);return s.setAttribute(t.attribute,t.value??""),this.undoFor(e,i,n,{kind:o===null?"remove-attribute":"restore-attribute",attribute:t.attribute,value:o})}case"remove_attribute":{if(!t.attribute)throw new Error("ATTRIBUTE_REQUIRED: payload.attribute is missing.");const o=s.getAttribute(t.attribute);if(o===null)throw new Error(`ATTRIBUTE_NOT_PRESENT: "${t.attribute}" is not set on ${n}.`);return s.removeAttribute(t.attribute),this.undoFor(e,i,n,{kind:"restore-attribute",attribute:t.attribute,value:o})}case"set_text":{const o=s.textContent||"";return s.textContent=t.text??"",this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"replace_text":{if(!t.text||!t.replacement)throw new Error("TEXT_PATTERNS_REQUIRED: payload.text (search) and payload.replacement are required.");const o=s.textContent||"";return s.textContent=o.split(t.text).join(t.replacement),this.undoFor(e,i,n,{kind:"restore-text",text:o})}case"set_inner_html":{const o=s.innerHTML;return s.innerHTML=t.html??"",this.undoFor(e,i,n,{kind:"restore-outer-html",outerHtml:s.outerHTML.replace(t.html??"",o)||void 0,text:o,attribute:"__inner"})}case"set_outer_html":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: element has no parent — cannot replace outer HTML.");const c=this.doc.createComment(`mcpdom_undo_${e}`);s.replaceWith(c);const u=this.doc.createElement("template");u.innerHTML=t.html??"";const h=u.content.firstElementChild;return h?c.replaceWith(h):c.replaceWith(this.doc.createTextNode(t.html??"")),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:this.siblingSelector(h||s)})}case"add_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.add(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"remove_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"replace_class":{const o=Array.from(s.classList);for(const a of t.classes||[])s.classList.remove(a);return t.value&&s.classList.add(t.value),this.undoFor(e,i,n,{kind:"restore-classes",classes:o})}case"set_style":{const o=this.doc.defaultView;if(!(o!=null&&o.getComputedStyle))throw new Error("STYLE_UNAVAILABLE: computed style API is unavailable in this context.");const a={};for(const c of Object.keys(t.style||{}))a[c]=o.getComputedStyle(s).getPropertyValue(c),s.style.setProperty(c,t.style[c]);return this.undoFor(e,i,n,{kind:"restore-style",style:a})}case"remove_style":{const o={};for(const a of t.classes||[])o[a]=s.style.getPropertyValue(a),s.style.removeProperty(a);return this.undoFor(e,i,n,{kind:"restore-style",style:o})}case"add_element":{const o=t.parent?this.resolveTarget(t.parent):s,a=this.doc.createElement("template");a.innerHTML=t.newElementHtml??"
";const c=a.content.firstElementChild;if(!c)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");switch(t.position||"append"){case"before":s.before(c);break;case"after":s.after(c);break;case"prepend":o.prepend(c);break;default:o.appendChild(c)}return this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(c).selector})}case"remove_element":{const o=s.outerHTML,a=s.parentElement,c=s.nextElementSibling;return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"replace_element":{const o=s.outerHTML,a=s.parentElement,c=this.doc.createElement("template");c.innerHTML=t.newElementHtml??"
";const u=c.content.firstElementChild;if(!u)throw new Error("INVALID_HTML: payload.newElementHtml does not produce an element.");const h=s.nextElementSibling;return s.replaceWith(u),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:a?this.snapshotState(a).selector:void 0,nextSiblingSelector:h?this.snapshotState(h).selector:null})}case"move_element":{if(!t.parent)throw new Error("PARENT_REQUIRED: payload.parent is required for move_element.");const o=this.resolveTarget(t.parent),a=s.outerHTML,c=s.parentElement,u=s.nextElementSibling,h=t.position==="before"||t.position==="prepend"?o.firstElementChild:null;return o[t.position==="prepend"?"prepend":"appendChild"](s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:h?this.snapshotState(h).selector:null,outerHtml:a})}case"wrap_element":{const o=this.doc.createElement("template");o.innerHTML=t.newElementHtml||'
';const a=o.content.firstElementChild;if(!a)throw new Error("INVALID_HTML: wrapper template produced no element.");const c=s.parentElement,u=s.nextElementSibling;return s.replaceWith(a),a.appendChild(s),this.undoFor(e,i,n,{kind:"restore-position",parentSelector:c?this.snapshotState(c).selector:void 0,nextSiblingSelector:u?this.snapshotState(u).selector:null})}case"unwrap_element":{const o=s.outerHTML,a=s.parentElement;if(!a)throw new Error("ORPHAN_ELEMENT: cannot unwrap a root-level element.");const c=s.nextElementSibling,u=Array.from(s.children);for(const h of u)a.insertBefore(h,s);return s.remove(),this.undoFor(e,i,n,{kind:"reinsert-node",outerHtml:o,parentSelector:this.snapshotState(a).selector,nextSiblingSelector:c?this.snapshotState(c).selector:null})}case"clone_subtree":{const o=t.parent?this.resolveTarget(t.parent):s.parentElement||s,a=s.cloneNode(!0);if(t.copyAttributes!==!1)for(const c of Array.from(a.attributes))c.name==="id"&&a.removeAttribute("id");return(r=o.appendChild)==null||r.call(o,a),this.undoFor(e,i,n,{kind:"remove-node",attribute:this.snapshotState(a).selector})}default:throw new Error(`UNKNOWN_OPERATION: ${i} is not a supported DOM mutation.`)}}applyUndo(e){const t=e.inverse;switch(t.kind){case"restore-outer-html":{const s=this.resolveTarget({selector:e.targetSelector});if(t.outerHtml!==void 0){const n=this.doc.createElement("template");n.innerHTML=t.outerHtml;const i=n.content.firstElementChild;i&&s.replaceWith(i)}else t.attribute==="__inner"&&(s.innerHTML=t.text||"");break}case"reinsert-node":{const s=t.parentSelector?this.resolveTarget({selector:t.parentSelector}):this.doc.body,n=this.doc.createElement("template");n.innerHTML=t.outerHtml||"";const i=n.content.firstElementChild;if(!i)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const r=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;s.insertBefore(i,r);break}case"remove-node":{const s=this.safeResolve(t.attribute||e.targetSelector);s&&s.remove();break}case"restore-attribute":{this.resolveTarget({selector:e.targetSelector}).setAttribute(t.attribute,t.value??"");break}case"remove-attribute":{this.resolveTarget({selector:e.targetSelector}).removeAttribute(t.attribute);break}case"restore-text":{const s=this.resolveTarget({selector:e.targetSelector});s.textContent=t.text||"";break}case"restore-classes":{const s=this.resolveTarget({selector:e.targetSelector});s.removeAttribute("class");for(const n of t.classes||[])s.classList.add(n);break}case"restore-style":{const s=this.resolveTarget({selector:e.targetSelector});s.style.removeProperty("all");for(const[n,i]of Object.entries(t.style||{}))s.style.setProperty(n,i);break}case"restore-position":{const s=this.doc.createElement("template");s.innerHTML=t.outerHtml||"";const n=s.content.firstElementChild;if(!n)throw new Error("UNDO_CORRUPT: serialized subtree could not be restored.");const i=this.safeResolve(e.targetSelector);i&&i.remove();const r=t.parentSelector?this.safeResolve(t.parentSelector):this.doc.body,o=t.nextSiblingSelector?this.safeResolve(t.nextSiblingSelector):null;(r||this.doc.body).insertBefore(n,o);break}}}reapplyRecord(e,t,s){var i;const n=e.inverse;switch(e.operation){case"set_attribute":return(n.kind==="restore-attribute"||n.kind==="remove-attribute")&&s.value!==void 0?(t.setAttribute(s.attribute||n.attribute||"",s.value),!0):!1;case"add_class":{for(const r of s.classes||[])t.classList.add(r);return(((i=s.classes)==null?void 0:i.length)||0)>0}case"remove_class":{for(const r of s.classes||n.classes||[])t.classList.remove(r);return!0}case"set_text":return s.text!==void 0?(t.textContent=s.text,!0):!1;case"set_inner_html":return s.html!==void 0?(t.innerHTML=s.html,!0):!1;default:return!1}}resolveTarget(e){if(!e)throw new Error("TARGET_REQUIRED: mutation requires a target.");if(typeof e=="string"&&(e={selector:e}),e.selector){try{const t=this.doc.querySelectorAll(e.selector);if(t.length===1)return t[0];if(t.length>1)return Array.from(t).find(n=>{try{return k.inspectElement(n).visibility.isVisible}catch{return!1}})||t[0]}catch(t){throw new Error(`TARGET_INVALID: ${t.message}`)}throw new Error(`TARGET_NOT_FOUND: selector "${e.selector}" matches no element.`)}if(e.xpath){try{const s=this.doc.evaluate(e.xpath,this.doc,null,9,null).singleNodeValue;if(s)return s}catch(t){throw new Error(`TARGET_INVALID_XPATH: ${t.message}`)}throw new Error("TARGET_NOT_FOUND: xpath matches no element.")}if(typeof e.nodeId=="number"&&this.registry){const t=this.registry.getNode(e.nodeId);if(t&&t.nodeType===1&&this.doc.contains(t))return t;throw new Error("TARGET_STALE: logical node id no longer resolves to an attached element.")}throw new Error("TARGET_INVALID: target has neither selector, xpath nor nodeId.")}safeResolve(e){try{return this.doc.querySelector(e)}catch{return null}}snapshotState(e){const t=k.inspectElement(e,this.registry),s=e.outerHTML.length>2e4?e.outerHTML.slice(0,2e4)+"…[truncated]":e.outerHTML;return{selector:t.bestSelector,outerHtml:s,attributes:this.attrsOf(e)}}attrsOf(e){const t={};for(const s of Array.from(e.attributes))t[s.name]=s.value.length>300?s.value.slice(0,300)+"…":s.value;return t}quickDiff(e,t,s){if(!t)return null;let n=0,i=0,r=0;const o=new Set(Object.keys(e.attributes)),a=new Set(Object.keys(t.attributes||{}));for(const u of o)a.has(u)||i++;for(const u of a)o.has(u)?e.attributes[u]!==t.attributes[u]&&r++:n++;e.outerHtml!==t.outerHtml&&n+i+r===0&&r++;const c=s.querySelectorAll?s.querySelectorAll("*").length:0;return{added:n,removed:i,changed:r,summary:`attributes +${n}/-${i}/~${r}; subtree nodes: ${c}`}}undoFor(e,t,s,n){return{mutationId:e,operation:t,targetSelector:s,inverse:n}}siblingSelector(e){try{return this.snapshotState(e).selector}catch{return null}}pushHistory(e){this.history.push(e),this.history.length>Q&&this.history.splice(0,this.history.length-Q)}markHistory(e,t){for(let s=this.history.length-1;s>=0;s--)if(this.history[s].mutationId===e){t==="undo"?this.history[s].undoApplied=!0:this.history[s].redoApplied=!0;return}}summaryOf(e){var n;const t=((n=this.doc.documentElement)==null?void 0:n.outerHTML.length)||0,s=e.steps.filter(i=>i.mutation.success).length;return{domLength:t,diffSummary:`${s}/${e.steps.length} mutations applied`}}failure(e,t,s,n,i){var r;return{mutationId:e,operation:t.operation,success:!1,before:s||{selector:String(((r=t.target)==null?void 0:r.selector)||"?"),outerHtml:"",attributes:{}},after:null,diff:null,affectedSelector:null,durationMs:i,error:n,undoable:!1}}}function He(l,e){switch(l.operation){case"set_attribute":return`attribute "${l.attribute}" will be set to "${(l.value??"").slice(0,40)}"`;case"remove_attribute":return`attribute "${l.attribute}" will be removed`;case"set_text":return`text content will be replaced (${(l.text||"").length} chars)`;case"replace_text":return`every occurrence of "${l.text}" will become "${l.replacement}"`;case"set_inner_html":return`inner HTML will be replaced (${(l.html||"").length} chars)`;case"set_outer_html":return"element (and subtree) will be replaced with provided HTML";case"add_class":return`classes ${(l.classes||[]).join(", ")} will be added`;case"remove_class":return`classes ${(l.classes||[]).join(", ")} will be removed`;case"replace_class":return`classes ${(l.classes||[]).join(", ")} will be replaced with "${l.value}"`;case"set_style":return`inline styles ${Object.keys(l.style||{}).join(", ")} will be set`;case"remove_style":return`inline styles ${(l.classes||[]).join(", ")} will be removed`;case"add_element":return`a new element will be inserted ${l.position||"append"} the target`;case"remove_element":return"the element and its subtree will be removed";case"replace_element":return"the element will be replaced with new HTML";case"move_element":return"the element will be moved into the specified parent";case"wrap_element":return"the element will be wrapped in a new container";case"unwrap_element":return"children will be lifted out and the wrapper removed";case"clone_subtree":return"a deep clone of the subtree will be appended";default:return"unknown operation"}}class Fe{constructor(){b(this,"executionCounter",0)}async execute(e,t,s={}){const n=Math.min(Math.max(s.timeoutMs??5e3,100),3e4),i=`js_${Date.now().toString(36)}_${++this.executionCounter}`,r=e.defaultView;if(!r)return this.result(i,"BLOCKED_BY_CONTEXT",0,t,[],{name:"NoWindow",message:"The document has no associated window — execution context unavailable."});const o=e.documentElement?e.documentElement.outerHTML.length:0,a=[],c=this.hookConsole(r,a);let u="EXECUTED_SUCCESSFULLY",h,g,p=o,y=!1;const v=Date.now();try{const f=this.buildRunner(r,t),w=new Promise((E,S)=>{var x;const T=setTimeout(()=>{y=!0,S(new Error(`Script timed out after ${n}ms`))},n);(x=T==null?void 0:T.unref)==null||x.call(T)});h=await Promise.race([f,w])}catch(f){y?u="TIMED_OUT":u="EXECUTED_WITH_ERROR",g={name:(f==null?void 0:f.name)||"Error",message:(f==null?void 0:f.message)||String(f),stack:f!=null&&f.stack?String(f.stack).slice(0,2e3):void 0}}const m=Date.now()-v;p=e.documentElement?e.documentElement.outerHTML.length:0,c();const d=this.serialize(h);return u==="EXECUTED_SUCCESSFULLY"&&d.serializationFailed&&(u="SERIALIZATION_FAILED",g={name:"SerializationError",message:d.message||"Result could not be serialized."}),{status:u,executionId:i,durationMs:m,result:u==="EXECUTED_SUCCESSFULLY"?d.text:void 0,error:g,consoleOutput:a.slice(0,100),domChanged:o!==p,domLengthBefore:o,domLengthAfter:p,world:s.world||"ISOLATED",timeoutMs:n,codePreview:t.length>300?t.slice(0,300)+"…":t}}buildRunner(e,t){const s=`(async function() { ${t} -})()`,n=e;if(typeof n.eval!="function")return Promise.reject(new Error("BLOCKED_BY_CONTEXT: window.eval is unavailable in this context."));try{const i=n.eval(s);return i&&typeof i.then=="function"?i:Promise.resolve(i)}catch(i){return Promise.reject(i)}}hookConsole(e,t){var o;const s=["log","warn","error","info","debug"],n={},i=e,r=100;for(const a of s){const c=(o=i.console)==null?void 0:o[a];if(typeof c=="function"){n[a]=c;try{i.console[a]=(...u)=>{t.length{for(const a of s)if(n[a])try{i.console[a]=n[a]}catch{}}}serialize(e){if(e===void 0)return{text:"undefined"};if(e===null)return{text:"null"};try{if(typeof e=="string")return{text:e.slice(0,5e3)};const t=JSON.stringify(e,be,1);return t===void 0?{serializationFailed:!0,message:"JSON.stringify returned undefined (circular or non-serializable structure)."}:{text:t.length>5e4?t.slice(0,5e4)+"…[truncated]":t}}catch(t){return{serializationFailed:!0,message:(t==null?void 0:t.message)||"Serialization failed."}}}result(e,t,s,n,i,r){return{status:t,executionId:e,durationMs:s,error:r,consoleOutput:i,domChanged:!1,domLengthBefore:0,domLengthAfter:0,world:"ISOLATED",timeoutMs:5e3,codePreview:n.length>300?n.slice(0,300)+"…":n}}}function be(l,e){var t;if(e&&typeof e=="object"&&e.nodeType===1){const s=e;return{__element:!0,tag:s.tagName.toLowerCase(),id:s.getAttribute("id")||void 0,selector:s.tagName.toLowerCase()+(s.getAttribute("id")?`#${s.getAttribute("id")}`:""),text:(s.textContent||"").trim().slice(0,60)}}return typeof e=="function"?{__function:!0,name:e.name||"anonymous"}:e&&e.nodeType===9?{__document:!0,url:(t=e.location)==null?void 0:t.href}:e}function Ve(l){try{if(typeof l=="string")return l;if(l instanceof Error)return`${l.name}: ${l.message}`;const e=JSON.stringify(l,be);return e===void 0?String(l):e}catch{return String(l)}}const ye={"desktop-full-hd":{width:1920,height:1080,category:"desktop"},"desktop-hd":{width:1366,height:768,category:"desktop"},"desktop-laptop":{width:1440,height:900,category:"desktop"},"desktop-xga":{width:1280,height:1024,category:"desktop"},"desktop-1024":{width:1024,height:768,category:"desktop"},"tablet-ipad":{width:768,height:1024,category:"tablet"},"tablet-ipad-pro":{width:1024,height:1366,category:"tablet"},"tablet-portrait":{width:768,height:1024,category:"tablet"},"tablet-landscape":{width:1024,height:768,category:"tablet"},"mobile-iphone-se":{width:375,height:667,category:"mobile"},"mobile-iphone-12":{width:390,height:844,category:"mobile"},"mobile-iphone-14-pro-max":{width:430,height:932,category:"mobile"},"mobile-pixel-7":{width:412,height:915,category:"mobile"},"mobile-galaxy-s8":{width:360,height:740,category:"mobile"},"mobile-small":{width:320,height:568,category:"mobile"},"test-a4":{width:800,height:600,category:"test"},"test-square":{width:512,height:512,category:"test"}},Ee={"iphone-13":{width:390,height:844,devicePixelRatio:3,userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"mobile"},"ipad-air":{width:820,height:1180,devicePixelRatio:2,userAgent:"Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"tablet"},"pixel-7":{width:412,height:915,devicePixelRatio:2.625,userAgent:"Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"galaxy-s23":{width:384,height:800,devicePixelRatio:3,userAgent:"Mozilla/5.0 (Linux; Android 14; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"macbook-pro-16":{width:1728,height:1080,devicePixelRatio:2,userAgent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"},"windows-desktop":{width:1920,height:1080,devicePixelRatio:1,userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"}};class ze{constructor(e){f(this,"original",null);f(this,"modified",!1);f(this,"activePreset",null);f(this,"activeDevice",null);this.doc=e}state(){const e=this.doc.defaultView;return{width:(e==null?void 0:e.innerWidth)||0,height:(e==null?void 0:e.innerHeight)||0,devicePixelRatio:(e==null?void 0:e.devicePixelRatio)||1,scrollX:(e==null?void 0:e.scrollX)||0,scrollY:(e==null?void 0:e.scrollY)||0,original:this.original,isModified:this.modified}}resize(e,t,s){const n=this.doc.defaultView,i={width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0},r=this.pageDigest();this.original||(this.original={...i});const o=this.applySize(e,t);this.modified=!0,this.activePreset=s||this.activePreset;const a=this.pageDigest();return{success:!0,applied:{width:o.width,height:o.height},previous:i,original:{...this.original},preset:s||void 0,beforeState:r,afterState:a,reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}applyPreset(e){const t=ye[e];if(!t)throw new Error(`UNKNOWN_PRESET: "${e}". Available: ${Object.keys(ye).join(", ")}`);return this.resize(t.width,t.height,e)}emulateDevice(e){const t=Ee[e];if(!t)throw new Error(`UNKNOWN_DEVICE: "${e}". Available: ${Object.keys(Ee).join(", ")}`);const s=this.resize(t.width,t.height,`device:${e}`);this.activeDevice=e;const n=this.doc.defaultView;return n&&this.isSimulation()&&n.devicePixelRatio!==void 0&&(n.devicePixelRatio=t.devicePixelRatio),{device:e,resize:s,profile:{width:t.width,height:t.height,devicePixelRatio:t.devicePixelRatio,touch:t.touch,category:t.category},userAgentNote:this.isSimulation()?"User-Agent override requires the Chrome DevTools Protocol (real browser session); in this context the viewport, dpr and touch metadata are applied and the UA is reported but not enforced.":"User-Agent and touch behaviors are applied by the browser emulation layer.",userAgentApplied:!this.isSimulation()}}reset(){var s,n;const e={width:((s=this.doc.defaultView)==null?void 0:s.innerWidth)||0,height:((n=this.doc.defaultView)==null?void 0:n.innerHeight)||0},t=this.original?{...this.original}:{...e};return this.original&&this.applySize(this.original.width,this.original.height),this.modified=!1,this.activePreset=null,this.activeDevice=null,{success:!0,applied:{width:t.width,height:t.height},previous:e,original:{...t},reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}runResponsiveTest(e,t={restore:!0}){var c,u,d,h;const s=t.restore!==!1,n=this.original?{...this.original}:{width:((c=this.doc.defaultView)==null?void 0:c.innerWidth)||0,height:((u=this.doc.defaultView)==null?void 0:u.innerHeight)||0};this.original||(this.original={...n});const i=e.map(p=>{this.applySize(p.width,p.height),this.modified=!0;const y=this.pageDigest();return{label:p.label,width:p.width,height:p.height,domLength:y.domLength,interactiveCount:y.interactiveCount,horizontalOverflow:this.hasHorizontalOverflow(),screenshotId:void 0}}),r=i.slice(1).map((p,y)=>({from:i[y].label,to:p.label,domLengthDelta:p.domLength-i[y].domLength,interactiveDelta:p.interactiveCount-i[y].interactiveCount}));let o={width:((d=i[i.length-1])==null?void 0:d.width)||0,height:((h=i[i.length-1])==null?void 0:h.height)||0},a=!1;return s&&(this.applySize(n.width,n.height),this.modified=!1,o={...n},a=!0),{success:!0,originalViewport:n,steps:i,restored:a,finalViewport:o,comparisons:r}}getActivePreset(){return this.activePreset}getActiveDevice(){return this.activeDevice}applySize(e,t){const s=Math.max(200,Math.min(7680,Math.round(e))),n=Math.max(200,Math.min(4320,Math.round(t))),i=this.doc.defaultView;return i&&(typeof i.innerWidth=="number"&&(i.innerWidth=s),typeof i.innerHeight=="number"&&(i.innerHeight=n),typeof i.outerWidth=="number"&&(i.outerWidth=s),typeof i.outerHeight=="number"&&(i.outerHeight=n)),{width:s,height:n}}pageDigest(){var t,s,n,i;const e=this.doc.querySelectorAll('a[href], button, input, select, textarea, [role="button"], [onclick]').length;return{url:((s=(t=this.doc.defaultView)==null?void 0:t.location)==null?void 0:s.href)||((n=this.doc.location)==null?void 0:n.href)||"",domLength:((i=this.doc.documentElement)==null?void 0:i.outerHTML.length)||0,interactiveCount:e}}hasHorizontalOverflow(){const e=this.doc.documentElement,t=this.doc.body,s=this.doc.defaultView;return!s||!e?!1:Math.max(e.scrollWidth||0,(t==null?void 0:t.scrollWidth)||0)>(s.innerWidth||e.clientWidth||0)+1}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}}const We=[/^css-/,/^jsx-/,/^sc-[A-Za-z]/,/^emotion/,/^chakra-/,/^mantine-/i,/^_ng[a-z]/,/^ng-/i,/^v-/,/^(?=.*\d)[a-z0-9]{6,12}$/i,/^data-v-/],Xe=["id","name","data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","aria-labelledby","aria-describedby","role","type","href","for","title","alt","rel","placeholder"];function ve(l){let e=2166136261;for(let t=0;t>>0).toString(16).padStart(8,"0")}function ie(l){return We.some(e=>e.test(l))}function Ge(l){return Xe.includes(l)}function ce(l){const e=l.trim();return e?!!((e.match(/\d/g)||[]).length/e.length>.5||/^\d+[.,:\-/ ]+\d+/.test(e)||/\b\d{10,}\b/.test(e)):!1}function Ke(l,e=80){return Array.from(l.childNodes).filter(s=>s.nodeType===3).map(s=>(s.textContent||"").trim()).join(" ").replace(/\s+/g," ").slice(0,e)}function Ye(l,e){const t=[];let s=l;for(;s&&t.length!ie(b)),r=Ke(e),o=e.getBoundingClientRect(),a={width:Math.round(o.width),height:Math.round(o.height)},c=Ye(e,4),u=c.join(">"),h=Array.from(e.children||[]).slice(0,8).map(b=>b.tagName.toLowerCase()).join("|"),p=e.getAttribute("role")||(t!=null&&t.getComputedStyle,void 0)||je(e),y=ve(JSON.stringify({t:e.tagName.toLowerCase(),a:s,c:i.slice(0,4),r:p||null,anc:u,desc:h,txt:ce(r)?null:r.slice(0,40),d:a})),v=[];let m="low";return!s.id&&!s["data-testid"]&&!s.name&&(m="medium",v.push("no stable identity attribute")),n.length>0&&i.length===0&&(m=v.length?"high":"medium",v.push("all classes are framework-generated")),ce(r)&&(v.push("text appears dynamic"),m==="low"&&(m="medium")),e.tagName.toLowerCase().includes("-")&&(v.push("custom element (web component)"),m==="low"&&(m="medium")),{fingerprintId:`fp_${y}`,hash:y,tagHierarchy:c,stableAttributes:s,meaningfulText:r,classes:i,role:p||void 0,dimensions:a,ancestorPattern:u,descendantPattern:h,volatilityRisk:m,volatilityReasons:v}}compare(e,t){const s=[],n=e.tagHierarchy[0]===t.tagHierarchy[0]?1:0;s.push({name:"tag",score:n,weight:.15});const i=we(e.ancestorPattern.split(">"),t.ancestorPattern.split(">"));s.push({name:"ancestorPattern",score:i,weight:.2});const r=Je(e.stableAttributes,t.stableAttributes);s.push({name:"stableAttributes",score:r,weight:.25});const o=we(e.classes,t.classes);s.push({name:"classes",score:o,weight:.1});const a=(e.role||"")===(t.role||"")&&e.role?1:0;s.push({name:"role",score:a,weight:.1});const c=e.meaningfulText===t.meaningfulText&&e.meaningfulText?1:0;s.push({name:"text",score:c,weight:.1});const u=Ze(e.dimensions,t.dimensions);s.push({name:"dimensions",score:u,weight:.1});const d=s.reduce((h,p)=>h+p.score*p.weight,0);return{score:Math.round(d*1e3)/1e3,components:s}}}function je(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return t==="checkbox"?"checkbox":t==="radio"?"radio":t==="button"||t==="submit"?"button":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";default:return}}function we(l,e){if(!l.length&&!e.length)return 1;if(!l.length||!e.length)return 0;const t=new Set(e);return l.filter(n=>t.has(n)).length/Math.max(l.length,e.length)}function Je(l,e){const t=Object.keys(l),s=Object.keys(e);if(!t.length&&!s.length)return .5;if(!t.length||!s.length)return 0;let n=0,i=0;for(const r of t)r in e&&(i++,l[r]===e[r]&&n++);return i===0?0:n/Math.max(t.length,s.length)}function Ze(l,e){if(l.width===0&&l.height===0&&e.width===0&&e.height===0)return .5;const t=Se(l.width,e.width),s=Se(l.height,e.height);return(t+s)/2}function Se(l,e){if(l===e)return 1;if(l===0||e===0)return 0;const t=Math.min(l,e)/Math.max(l,e);return t>.9?1:t>.7?.5:0}const Qe=["data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","name","id"],Te=/^[a-zA-Z][a-zA-Z0-9_-]*$/,et=/^[a-zA-Z0-9_ .:-]+$/;class Z{constructor(e){f(this,"doc");this.doc=e}generateCandidates(e){const t=[],s=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n&&Te.test(n)){const u=`#${Ce(n)}`;t.push(this.evaluate(e,u,"id",1,["unique stable id"]))}for(const u of Qe){if(u==="id")continue;const d=e.getAttribute(u);if(d&&et.test(d)&&d.length<100){const h=`${s}[${u}="${Q(d)}"]`;t.push(this.evaluate(e,h,"semantic-attribute",.92,[`semantic attribute ${u}`]))}}const i=Array.from(e.classList||[]).filter(u=>!ie(u));if(i.length){const u=`${s}.${i.slice(0,3).map(Ce).join(".")}`;t.push(this.evaluate(e,u,"class",.72,i.length?["stable class names"]:[]))}const r=this.buildStructuralPath(e);r&&t.push(this.evaluate(e,r,"structural-path",.55,["position-based structural path"]));const o=B(e);if(o&&o.length>=2&&o.length<=60&&!ce(o)){const u=`${s}:nth-of-type(1)`,d=this.buildTextXPath(e,o);d&&(t.push({selector:u,strategy:"text-derived-xpath",confidence:.6,unique:this.isXPathUnique(d),reasons:[`matches text "${o.slice(0,30)}"`]}),t[t.length-1].xpath=d)}const a=this.buildAttributeFingerprintSelector(e);a&&t.push(this.evaluate(e,a,"attribute-fingerprint",.68,["combination of stable attributes"]));const c=new Map;for(const u of t){const d=u.strategy==="text-derived-xpath"?`xpath:${u.xpath}`:u.selector,h=c.get(d);(!h||u.confidence>h.confidence)&&c.set(d,u)}return Array.from(c.values()).sort((u,d)=>d.confidence-u.confidence)}bestSelector(e){const t=this.generateCandidates(e),s=t.find(n=>n.unique&&n.confidence>=.7)||t[0];return{selector:(s==null?void 0:s.selector)||e.tagName.toLowerCase(),strategy:(s==null?void 0:s.strategy)||"tag",confidence:(s==null?void 0:s.confidence)||.3}}buildXPath(e){const t=[];let s=e;for(;s&&s!==this.doc.documentElement;){const n=s.getAttribute("id");if(n&&Te.test(n)){t.unshift(`*[@id="${Q(n)}"]`);break}const i=s.parentElement;if(!i){t.unshift(s.tagName.toLowerCase());break}const o=Array.from(i.children).filter(a=>a.tagName===s.tagName).indexOf(s)+1;t.unshift(`${s.tagName.toLowerCase()}[${o}]`),s=i}return s===this.doc.documentElement&&(!t.length||!t[0].includes("@id"))&&t.unshift("html"),"//"+t.join("/")}buildTextXPath(e,t){try{const s=e.tagName.toLowerCase(),n=tt(t);return`//${s}[normalize-space(text())=${n}]`}catch{return null}}buildStructuralPath(e,t=4){const s=[];let n=e;for(;n&&s.lengthc.tagName===n.tagName);if(a.length>1){const c=a.indexOf(n)+1;s.unshift(`${o}:nth-of-type(${c})`)}else s.unshift(o);if(n=r,n===this.doc.body){s.unshift("body");break}if(n===this.doc.documentElement)break}const i=s.join(" > ");return i.includes("body")?i:"body > "+i}buildAttributeFingerprintSelector(e){const t=e.tagName.toLowerCase(),s=[],n=e.getAttribute("type");n&&s.push(`type="${Q(n)}"`);const i=e.getAttribute("href");i&&i.length<80&&!i.startsWith("javascript:")&&s.push(`href^="${Q(i.slice(0,40))}"`);const r=e.getAttribute("placeholder");return r&&r.length<60&&s.push(`placeholder="${Q(r)}"`),s.length>=2?`${t}[${s.join("][")}]`:null}evaluate(e,t,s,n,i){let r=!1,o=0;try{const c=this.doc.querySelectorAll(t);o=c.length,r=c.length===1&&c[0]===e}catch{return{selector:t,strategy:s,confidence:0,unique:!1,reasons:["invalid selector syntax"]}}let a=n;return o===0?(a=0,i.push("selector matched nothing (invalid candidate)")):o===1&&r?i.push("matches exactly this element"):(a=a*.4,i.push(`matches ${o} elements — ambiguous`)),{selector:t,strategy:s,confidence:Math.round(a*100)/100,unique:r,reasons:i}}isXPathUnique(e){try{return this.doc.evaluate(`count(${e})`,this.doc,null,4,null).numberValue===1}catch{return!1}}}function B(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function Ce(l){return l.replace(/([^a-zA-Z0-9_\u00A0-\uFFFF-])/g,"\\$1")}function Q(l){return l.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function tt(l){return l.includes("'")?l.includes('"')?`concat(${l.split("'").map(e=>`'${e}'`).join(`, "'", `)})`:`"${l}"`:`'${l}'`}class st{constructor(e,t){f(this,"fingerprintEngine",new re);f(this,"counter",0);this.doc=e,this.registry=t}buildTarget(e,t="selector"){var d;const s=new Z(this.doc),n=s.generateCandidates(e),i=s.bestSelector(e),r=this.fingerprintEngine.fingerprint(e),o=L.inspectElement(e,this.registry),a=e.getBoundingClientRect();let c=i.confidence*.6;return r.volatilityRisk==="low"?c+=.3:r.volatilityRisk==="medium"&&(c+=.15),n.find(h=>h.unique&&h.confidence>=.9)&&(c+=.1),c=Math.max(.05,Math.min(1,c)),this.counter++,{targetId:`tgt_${Date.now().toString(36)}_${this.counter}`,tag:e.tagName.toLowerCase(),role:o.role||r.role,selector:i.selector,selectorCandidates:n,xpath:s.buildXPath(e),domPath:(((d=o.context)==null?void 0:d.parentChain)||[]).concat(i.selector).join(" > "),textFingerprint:r.meaningfulText,attributeFingerprint:JSON.stringify(r.stableAttributes),structuralFingerprint:r.hash,attributes:o.attributes||{},confidence:Math.round(c*100)/100,bounds:{x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height)},resolvedFrom:t}}resolveAndBuild(e){let t=null,s="unknown";typeof e=="string"&&(e={selector:e});const n=e;if(n.selectedElementRef&&(s="selectedElementRef"),!t&&n.selector)try{const i=this.doc.querySelectorAll(n.selector);if(i.length===0)return{error:`TARGET_NOT_FOUND: selector "${n.selector}" matches no element`};i.length>1?(t=nt(i,this.doc)||i[0],s+="+disambiguated"):(t=i[0],s="selector")}catch(i){return{error:`TARGET_INVALID: ${i.message}`}}if(!t&&n.xpath)try{t=this.doc.evaluate(n.xpath,this.doc,null,9,null).singleNodeValue,s="xpath"}catch(i){return{error:`TARGET_INVALID_XPATH: ${i.message}`}}if(!t&&typeof n.nodeId=="number"&&this.registry){const i=this.registry.getNode(n.nodeId);i&&i.nodeType===1&&this.doc.contains(i)&&(t=i,s="nodeId")}return!t&&n.coordinates&&(t=this.doc.elementFromPoint(n.coordinates.x,n.coordinates.y),s="coordinates"),t?{element:t,target:this.buildTarget(t,s)}:{error:"TARGET_NOT_FOUND: no usable resolution strategy succeeded"}}}function nt(l,e){for(const t of Array.from(l)){const s=t;try{if(L.inspectElement(s).visibility.isVisible)return s}catch{}}return null}class it{constructor(e){f(this,"fingerprintEngine",new re);this.doc=e}recover(e,t){var p;const s=[],n=[];let i=null;try{i=this.doc.querySelectorAll(e)}catch(y){s.push(`selector syntax error: ${y.message}`)}if(i&&i.length>0){s.push("selector still matches — no recovery needed");const y=i[0];return{recovered:!0,confidence:1,strategy:"original-selector",resolvedSelector:e,matchedElementInfo:Ie(y),alternatives:[],diagnostics:s,recommendation:"Original selector works; the earlier failure was transient (likely a navigation or render race)."}}s.push("selector no longer matches any element");const o=this.collectCandidates(t,s).map(y=>({element:y,score:this.scoreMatch(y,t)})).filter(y=>y.score.score>.35).sort((y,v)=>v.score.score-y.score.score);for(const y of o.slice(0,5)){const v=new Z(this.doc).bestSelector(y.element);n.push({selector:v.selector,confidence:Math.round(y.score.score*100)/100,strategy:"recovery-match"})}if(!o.length)return{recovered:!1,confidence:0,strategy:"none",alternatives:n,diagnostics:s,recommendation:"No sufficiently similar element exists. The region may have been removed, or the page structure changed fundamentally. Re-inspect the page and capture a new target."};const a=o[0],c=o.length>1?a.score.score-o[1].score.score:1;s.push(`best candidate score: ${a.score.score.toFixed(3)} (margin ${c.toFixed(3)})`);for(const y of a.score.components)y.score>0&&s.push(` - ${y.name}: ${(y.score*100).toFixed(0)}%`);if(a.score.score<.62||o.length>1&&c<.15)return{recovered:!1,confidence:Math.round(a.score.score*100)/100,strategy:"recovery-refused",resolvedSelector:(p=n[0])==null?void 0:p.selector,alternatives:n,diagnostics:s,recommendation:"Recovery refused: best match is not confident enough or too close to a competing element. Inspect alternatives manually before acting — refusing to avoid acting on a wrong element."};const h=new Z(this.doc).bestSelector(a.element).selector;return{recovered:!0,confidence:Math.round(a.score.score*100)/100,strategy:"fingerprint-recovery",resolvedSelector:h,matchedElementInfo:Ie(a.element),alternatives:n,diagnostics:s,recommendation:`Recovered target with ${(a.score.score*100).toFixed(0)}% confidence. Verify the resolved selector before destructive actions.`}}collectCandidates(e,t){var r,o;const s=new Set,n=this.doc.querySelectorAll(e.tag);let i=0;for(const a of Array.from(n))if(s.add(a),++i>=400)break;if((r=e.classes)!=null&&r.length){const a=e.classes.filter(c=>!ie(c));for(const c of a.slice(0,2))try{for(const u of Array.from(this.doc.querySelectorAll(`.${c}`)).slice(0,100))s.add(u)}catch{}}if((o=e.stableAttributes)!=null&&o.name)try{for(const a of Array.from(this.doc.querySelectorAll(`[name="${e.stableAttributes.name}"]`)))s.add(a)}catch{}if(e.parentSelector)try{for(const a of Array.from(this.doc.querySelectorAll(`${e.parentSelector} > ${e.tag}`)).slice(0,100))s.add(a)}catch{}return t.push(`collected ${s.size} candidate elements for scoring`),Array.from(s)}scoreMatch(e,t){const s=[],n=e.tagName.toLowerCase()===t.tag.toLowerCase()?1:0;s.push({name:"tag",score:n,weight:.15});const i=(t.text||"").trim().slice(0,40),r=B(e).slice(0,40),o=(e.textContent||"").trim().slice(0,40);let a=0;if(i){const g=r?r===i?1:le(i,r):0,b=o?o===i?1:le(i,o):0;a=Math.max(g,b)}s.push({name:"text",score:a,weight:.3});const c=new Set((t.classes||[]).filter(g=>!ie(g))),u=Array.from(e.classList||[]),d=c.size?u.filter(g=>c.has(g)).length/c.size:.5;s.push({name:"classes",score:d,weight:.2});const h=t.stableAttributes||{},p=Object.keys(h);let y=.5;if(p.length){let g=0;for(const b of p)e.getAttribute(b)===h[b]&&g++;y=g/p.length}s.push({name:"attributes",score:y,weight:.2});const v=t.childCount!==void 0?e.children.length===t.childCount?1:le(String(t.childCount),String(e.children.length)):.5;if(s.push({name:"childCount",score:v,weight:.05}),t.fingerprintHash){const g={fingerprintId:"snapshot",hash:t.fingerprintHash,tagHierarchy:[t.tag],stableAttributes:h,meaningfulText:i,classes:t.classes||[],dimensions:{width:0,height:0},ancestorPattern:"",descendantPattern:"",volatilityRisk:"medium",volatilityReasons:[]},b=this.fingerprintEngine.fingerprint(e),T=this.fingerprintEngine.compare(g,b);s.push({name:"fingerprint",score:T.score,weight:.1})}const m=s.reduce((g,b)=>g+b.score*b.weight,0);return{score:Math.max(0,Math.min(1,m)),components:s}}diagnose(e){const t=[];let s=!0,n=0,i,r=[];try{n=this.doc.querySelectorAll(e).length}catch(o){s=!1,i=o.message,t.push("Selector is syntactically invalid CSS.")}if(s&&n===0){t.push("Selector parses but matches nothing — element may be removed, re-rendered, or inside a shadow root."),r=this.relaxSelector(e);for(const o of r)try{if(this.doc.querySelectorAll(o).length>0){t.push(`Relaxed form "${o}" matches — the over-specific part of the selector is stale.`);break}}catch{}}return s&&n>1&&t.push(`Selector matches ${n} elements — it is ambiguous; use a more specific form or index.`),{selector:e,valid:s,matches:n,parseError:i,closestWorkingSelectors:r.filter(o=>{try{return this.doc.querySelectorAll(o).length>0}catch{return!1}}),diagnosis:t}}relaxSelector(e){const t=[],s=e.split(/[ >]+/).filter(Boolean);s.length>1&&(t.push(s.slice(0,-1).join(" ")),t.push(s[s.length-1]));const n=e.replace(/:nth-of-type\(\d+\)/g,"").replace(/\.[^. >#:[]+/g,(i,r,o)=>o[r-1]==="\\"?i:"");return n!==e&&n.trim()&&t.push(n.trim()),t}}function le(l,e){if(!l||!e)return 0;const t=Ae(l),s=Ae(e);if(t===s)return 1;if(t.includes(s)||s.includes(t))return .7;const n=new Set(t.split(/\s+/)),i=new Set(s.split(/\s+/));return Array.from(n).filter(o=>i.has(o)).length/Math.max(n.size,i.size)}function Ae(l){return l.toLowerCase().replace(/[^a-z0-9 ]/g," ").replace(/\s+/g," ").trim()}function Ie(l){return{tag:l.tagName.toLowerCase(),id:l.getAttribute("id")||void 0,text:B(l).slice(0,60),classes:Array.from(l.classList||[])}}class ue{constructor(e){f(this,"state");this.state=e>>>0,this.state===0&&(this.state=2654435769)}next(){this.state=this.state+1831565813>>>0;let e=this.state;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}range(e,t){return e+this.next()*(t-e)}int(e,t){return Math.floor(this.range(e,t+1))}chance(e){return this.next()setTimeout(t,e))}chance(){return this.rng.next()<.5}}const ot=[{ruleId:"red_key_password",kind:"key-pattern",pattern:"password|passwd|pwd",description:"Keys containing password/passwd/pwd",enabled:!0,userAdded:!1},{ruleId:"red_key_token",kind:"key-pattern",pattern:"token|jwt|bearer|auth|session.?id|secret|api.?key|client.?secret",description:"Keys containing token/jwt/auth/session-id/secret/api-key",enabled:!0,userAdded:!1},{ruleId:"red_key_credential",kind:"key-pattern",pattern:"credential|login|user.?pass|otp|2fa|mfa|verification",description:"Keys containing credential/login/otp/2fa/verification",enabled:!0,userAdded:!1},{ruleId:"red_key_payment",kind:"key-pattern",pattern:"card|payment|billing|iban|cvv|cvc|pan",description:"Keys containing card/payment/billing/iban/cvv",enabled:!0,userAdded:!1},{ruleId:"red_key_personal",kind:"key-pattern",pattern:"ssn|social.?security|national.?id|passport|tax.?id",description:"Keys containing personal identifier patterns",enabled:!0,userAdded:!1},{ruleId:"red_val_jwt",kind:"value-pattern",pattern:"eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+",description:"JWT-shaped tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_bearer",kind:"value-pattern",pattern:"bearer\\s+[A-Za-z0-9._-]+",description:"Bearer tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_long_hex",kind:"value-pattern",pattern:"\\b[a-f0-9]{32,}\\b",description:"32+ char hex strings (session/API ids)",enabled:!0,userAdded:!1},{ruleId:"red_val_sk",kind:"value-pattern",pattern:"\\b(sk|pk|rk)_[A-Za-z0-9_]{20,}\\b",description:"Stripe-style secret keys (sk_live_…)",enabled:!0,userAdded:!1},{ruleId:"red_attr_input_password",kind:"attribute-name",pattern:"value",description:"value attributes on password inputs handled by PrivacyEngine maskValue",enabled:!0,userAdded:!1},{ruleId:"red_attr_secret",kind:"attribute-name",pattern:"data-secret|data-token|data-api-key|secret|access.?token",description:"Secret-carrying attributes",enabled:!0,userAdded:!1}],at=[{exclusionId:"excl_mcpdom_overlay",selector:"[data-mcpdom-internal], [data-forensic-internal], #forensic-recorder-floating-host, #forensic-inspect-highlighter",reason:"MCPDOM-injected UI must never contaminate captured DOM (§68 clean capture)",userAdded:!1},{exclusionId:"excl_mcpdom_ids",selector:'[id^="forensic-"], [id^="mcpdom-"]',reason:"MCPDOM-namespaced nodes",userAdded:!1}],de="[REDACTED]";class he{constructor(e){f(this,"config");f(this,"base",new se);f(this,"compiledKeyPatterns",[]);f(this,"compiledValuePatterns",[]);f(this,"compiledAttrPatterns",[]);this.config={rules:[...ot],exclusions:[...at],stubMode:!0,...e},this.recompile()}recompile(){this.compiledKeyPatterns=[],this.compiledValuePatterns=[],this.compiledAttrPatterns=[];for(const e of this.config.rules){if(!e.enabled)continue;const t="i";try{switch(e.kind){case"key-pattern":this.compiledKeyPatterns.push(new RegExp(e.pattern,t));break;case"value-pattern":this.compiledValuePatterns.push(new RegExp(e.pattern,"i"));break;case"attribute-name":this.compiledAttrPatterns.push(new RegExp(`^(${e.pattern})$`,"i"));break}}catch{}}}getRules(){return[...this.config.rules]}setRuleEnabled(e,t){const s=this.config.rules.find(n=>n.ruleId===e);return s?(s.enabled=t,this.recompile(),!0):!1}addRule(e){const t=`red_custom_${this.config.rules.length+1}_${Date.now().toString(36)}`,s={...e,ruleId:t,userAdded:!0};return this.config.rules.push(s),this.recompile(),s}removeRule(e){const t=this.config.rules.findIndex(s=>s.ruleId===e);return t<0||!this.config.rules[t].userAdded?!1:(this.config.rules.splice(t,1),this.recompile(),!0)}getExclusions(){return[...this.config.exclusions]}addExclusion(e,t){const n={exclusionId:`excl_custom_${this.config.exclusions.length+1}_${Date.now().toString(36)}`,selector:e,reason:t,userAdded:!0};return this.config.exclusions.push(n),n}removeExclusion(e){const t=this.config.exclusions.findIndex(s=>s.exclusionId===e);return t<0||!this.config.exclusions[t].userAdded?!1:(this.config.exclusions.splice(t,1),!0)}isSensitiveKey(e){return this.compiledKeyPatterns.some(t=>t.test(e))}redactValue(e){let t=e;for(const s of this.compiledValuePatterns)s.test(t)&&(t=t.replace(new RegExp(s.source,"gi"),de));return t}redactByKeyValue(e,t){return this.isSensitiveKey(e)?this.config.stubMode?de:t:this.redactValue(t)}isSensitiveAttribute(e){return this.compiledAttrPatterns.some(t=>t.test(e))}redactAttributes(e){const t={};for(const[s,n]of Object.entries(e))this.isSensitiveAttribute(s)?t[s]=de:t[s]=this.redactValue(n);return t}cleanSubtree(e){const t=e.cloneNode(!0);for(const s of this.config.exclusions){let n=null;try{n=t.querySelectorAll(s.selector)}catch{continue}for(const i of Array.from(n))i.remove();try{if(t.matches(s.selector))return this.doclessEmptyStub(t)}catch{}}return t}isExcluded(e){for(const t of this.config.exclusions)try{if(e.matches(t.selector)||e.closest(t.selector))return!0}catch{}return!1}doclessEmptyStub(e){return e.innerHTML="",e.setAttribute("data-mcpdom-excluded","true"),e}toJSON(){return{rules:this.getRules(),exclusions:this.getExclusions(),stubMode:this.config.stubMode}}static fromJSON(e){return new he({rules:Array.isArray(e==null?void 0:e.rules)?e.rules:void 0,exclusions:Array.isArray(e==null?void 0:e.exclusions)?e.exclusions:void 0,stubMode:typeof(e==null?void 0:e.stubMode)=="boolean"?e.stubMode:void 0})}}const ge='a[href], button, input, select, textarea, [role="button"], [role="link"], [role="tab"], [onclick], [tabindex]';function X(l,e){return{items:l.slice(0,e),truncated:l.length>e}}function k(l,e,t,s,n,i){return{analyzer:l,summary:e,count:t,items:s,warnings:n,truncated:i}}function D(l){try{return L.inspectElement(l).bestSelector}catch{return l.tagName.toLowerCase()}}const ct=l=>{const e=Array.from(l.querySelectorAll("form")),t=e.map(n=>{const i=Array.from(n.querySelectorAll("input, select, textarea")).map(r=>({tag:r.tagName.toLowerCase(),type:r.getAttribute("type")||(r.tagName.toLowerCase()==="textarea"?"textarea":r.tagName.toLowerCase()==="select"?"select":"text"),name:r.getAttribute("name")||void 0,id:r.getAttribute("id")||void 0,required:r.hasAttribute("required"),pattern:r.getAttribute("pattern")||void 0,maxLength:r.getAttribute("maxlength")||void 0,placeholder:r.getAttribute("placeholder")||void 0,ariaLabel:r.getAttribute("aria-label")||void 0,autocomplete:r.getAttribute("autocomplete")||void 0,hasLabel:!!(r.getAttribute("id")&&l.querySelector(`label[for="${r.getAttribute("id")}"]`))||!!r.closest("label"),defaultValue:r.value!==void 0&&(r.getAttribute("type")||"text")!=="password"?String(r.value).slice(0,40):void 0}));return{selector:D(n),action:n.getAttribute("action")||void 0,method:(n.getAttribute("method")||"GET").toUpperCase(),id:n.getAttribute("id")||void 0,fieldCount:i.length,submitButton:n.querySelector('button[type="submit"], input[type="submit"]')?D(n.querySelector('button[type="submit"], input[type="submit"]')):void 0,validationAttributes:i.filter(r=>r.required||r.pattern).length,fields:i}}),s=X(t,50);return k("analyze_forms",`${e.length} form(s) with ${t.reduce((n,i)=>n+i.fieldCount,0)} total fields`,e.length,s.items,[],s.truncated)},lt=l=>{const e=Array.from(l.querySelectorAll("a[href]")),t=e.map(n=>({href:n.getAttribute("href")||"",text:B(n).slice(0,60),selector:D(n),rel:n.getAttribute("rel")||void 0,target:n.getAttribute("target")||void 0,download:n.hasAttribute("download"),external:/^https?:\/\//i.test(n.getAttribute("href")||"")&&!ut(n.getAttribute("href")||"",l),anchorOnly:(n.getAttribute("href")||"").startsWith("#")})),s=X(t,200);return k("extract_links",`${e.length} link(s): ${t.filter(n=>n.external).length} external, ${t.filter(n=>n.anchorOnly).length} anchors`,e.length,s.items,[],s.truncated)};function ut(l,e){var t,s,n,i;try{return new URL(l,((s=(t=e.defaultView)==null?void 0:t.location)==null?void 0:s.href)||"http://localhost").origin===(((i=(n=e.defaultView)==null?void 0:n.location)==null?void 0:i.origin)||"")}catch{return!1}}const dt=l=>{const e=Array.from(l.querySelectorAll("img")),t=Array.from(l.querySelectorAll("video")),s=Array.from(l.querySelectorAll("audio")),n=Array.from(l.querySelectorAll("canvas")),i=[],r=[...e.map(c=>({kind:"img",selector:D(c),src:(c.getAttribute("src")||"").slice(0,150),alt:c.getAttribute("alt"),width:c.getAttribute("width")||void 0,height:c.getAttribute("height")||void 0,naturalWidth:c.naturalWidth||void 0,naturalHeight:c.naturalHeight||void 0,lazy:c.getAttribute("loading")==="lazy",missingAlt:!c.hasAttribute("alt")})),...t.map(c=>{var u;return{kind:"video",selector:D(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls"),autoplay:c.hasAttribute("autoplay"),muted:c.hasAttribute("muted"),poster:c.getAttribute("poster")||void 0}}),...s.map(c=>{var u;return{kind:"audio",selector:D(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls")}}),...n.map(c=>({kind:"canvas",selector:D(c),width:c.width,height:c.height}))],o=r.filter(c=>c.missingAlt).length;o&&i.push(`${o} image(s) missing alt text (accessibility risk).`);const a=X(r,200);return k("analyze_media",`${e.length} images, ${t.length} videos, ${s.length} audios, ${n.length} canvases`,r.length,a.items,i,a.truncated)},ht=l=>{const e=l.defaultView,t=[],s={};if(e!=null&&e.getComputedStyle){const i=e.getComputedStyle(l.documentElement);for(let r=0;r({name:i,value:r}));return k("get_css_variables",`${n.length} CSS custom properties found`,n.length,n,t,!1)},gt=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.fontFamily||"",a=r.fontSize||"",c=`${o.split(",")[0].replace(/["']/g,"").trim()} @ ${a}`;s.set(c,(s.get(c)||0)+1)}else t.push("getComputedStyle unavailable — font usage analysis requires rendered styles.");const n=Array.from(s.entries()).map(([i,r])=>({font:i,usage:r})).sort((i,r)=>r.usage-i.usage);return k("analyze_fonts",`${n.length} distinct font/size combinations`,n.length,n,t,!1)},pt=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i);for(const o of["color","background-color","border-top-color"]){const a=r.getPropertyValue(o);a&&a!=="rgba(0, 0, 0, 0)"&&s.set(a,(s.get(a)||0)+1)}}else{for(const i of Array.from(l.querySelectorAll("[style]")).slice(0,300)){const r=i.getAttribute("style")||"",o=/(color)\s*:\s*([^;]+)/gi;let a;for(;a=o.exec(r);)s.set(a[2].trim(),(s.get(a[2].trim())||0)+1)}t.push("getComputedStyle unavailable — palette from inline styles only.")}const n=Array.from(s.entries()).map(([i,r])=>({color:i,usage:r})).sort((i,r)=>r.usage-i.usage).slice(0,40);return k("extract_color_palette",`${s.size} distinct colors in use`,s.size,n,t,!1)},mt=l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — z-index analysis requires rendered styles."),k("detect_zindex_conflicts","unavailable",0,[],t,!1);const n=[];for(const i of Array.from(l.querySelectorAll("body *")).slice(0,1e3)){const r=e.getComputedStyle(i),o=r.zIndex;o&&o!=="auto"&&parseInt(o,10)>0&&n.push({selector:D(i),z:parseInt(o,10),position:r.position,stacking:r.position==="fixed"||r.position==="sticky"||r.opacity!=="1"||r.transform!=="none"?"creates-stacking-context":"plain"})}for(let i=0;i1e5&&s.push({zIndex:n[i].z,elements:[n[i].selector],note:"extremely high z-index — competes with platform overlays (MCPDOM uses 2147483640+)."})}return k("detect_zindex_conflicts",`${n.length} z-indexed elements, ${s.length} potential conflict(s)`,s.length,X(s,40).items,t,s.length>40)},ft=l=>{const e=l.defaultView,t=[],s=l.documentElement,n=l.body,i=Math.max((s==null?void 0:s.scrollWidth)||0,(n==null?void 0:n.scrollWidth)||0),r=(e==null?void 0:e.innerWidth)||(s==null?void 0:s.clientWidth)||0,o=i>r+1;if(o&&(t.push({issue:"horizontal-overflow",detail:`document scrollWidth ${i} exceeds viewport ${r}`}),e!=null&&e.getComputedStyle))for(const c of Array.from(l.querySelectorAll("body *")).slice(0,600)){const u=c.getBoundingClientRect();if(u.right>r+2&&u.width>100&&(t.push({issue:"element-exceeds-viewport",selector:D(c),right:Math.round(u.right),width:Math.round(u.width)}),t.length>15))break}let a=0;for(const c of Array.from(l.querySelectorAll(ge)).slice(0,500)){const u=c.getBoundingClientRect();(u.width===0||u.height===0)&&a++}return a&&t.push({issue:"zero-size-interactive-elements",count:a}),k("detect_layout_issues",o?`HORIZONTAL OVERFLOW: page is ${i-r}px wider than viewport`:"No horizontal overflow detected",t.length,t,[],!1)},bt=l=>{const e=Array.from(l.querySelectorAll(ge)),t=new Map,s=e.slice(0,300).map(n=>{const i=pe(n),r=i.role||n.tagName.toLowerCase();return t.set(r,(t.get(r)||0)+1),{selector:i.bestSelector,tag:i.tag,role:i.role,text:i.text.slice(0,40),visible:i.visibility.isVisible,disabled:n.disabled||n.hasAttribute("disabled"),inViewport:i.visibility.isInViewport}});return k("census_interactive_elements",`${e.length} interactive elements: ${Array.from(t.entries()).map(([n,i])=>`${n}×${i}`).join(", ")||"none"}`,e.length,s,[],e.length>300)};function pe(l){try{return L.inspectElement(l)}catch{return{tag:l.tagName.toLowerCase(),role:void 0,text:"",bestSelector:l.tagName.toLowerCase(),bounds:{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},visibility:{isVisible:!1,isInViewport:!1}}}}const yt=l=>{const e=["header","nav","main","aside","footer","article","section","figure","figcaption","mark","time","address","details","summary","dialog"],t=[];for(const i of e){const r=Array.from(l.querySelectorAll(i));if(r.length)for(const o of r.slice(0,20))t.push({tag:i,selector:D(o),role:o.getAttribute("role")||Et(i),text:B(o).slice(0,50),childCount:o.children.length})}const s=t.filter(i=>["banner","navigation","main","complementary","contentinfo"].includes(i.role)),n=[];return t.find(i=>i.tag==="main")||n.push("No
element — page lacks a primary landmark."),l.querySelectorAll("header").length>1&&n.push("Multiple
elements outside sections — ambiguous banner landmark."),k("detect_semantic_elements",`${t.length} semantic elements, ${s.length} landmarks`,t.length,X(t,100).items,n,t.length>100)};function Et(l){return{header:"banner",nav:"navigation",main:"main",aside:"complementary",footer:"contentinfo",article:"article",section:"region",form:"form"}[l]}const _e={analyze_forms:ct,extract_links:lt,analyze_media:dt,get_css_variables:ht,analyze_fonts:gt,extract_color_palette:pt,detect_zindex_conflicts:mt,detect_layout_issues:ft,census_interactive_elements:bt,detect_semantic_elements:yt,scan_accessibility_issues:l=>{var i;const e=[];for(const r of Array.from(l.querySelectorAll("img")).slice(0,200))r.hasAttribute("alt")||e.push({rule:"img-alt",severity:"error",selector:D(r),message:"Image is missing the alt attribute."});for(const r of Array.from(l.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button])")).slice(0,200)){const o=r.getAttribute("id");o&&l.querySelector(`label[for="${o}"]`)||r.closest("label")||r.getAttribute("aria-label")||r.getAttribute("aria-labelledby")||e.push({rule:"input-label",severity:"error",selector:D(r),message:"Form input has no associated label, aria-label or aria-labelledby."})}for(const r of Array.from(l.querySelectorAll('button, a[href], [role="button"]')).slice(0,300)){const o=B(r).trim(),a=r.getAttribute("aria-label");!o&&!a&&e.push({rule:"accessible-name",severity:"error",selector:D(r),message:"Interactive element has no accessible name (no text, no aria-label).",hint:r.querySelector("img[alt]")?"Contains an image — consider alt text or aria-label.":void 0})}const t=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).slice(0,100);let s=0;for(const r of t){const o=parseInt(r.tagName[1],10);s&&o>s+1&&e.push({rule:"heading-order",severity:"warning",selector:D(r),message:`Heading level jumps from h${s} to h${o}.`}),s=o}(i=l.documentElement)!=null&&i.getAttribute("lang")||e.push({rule:"html-lang",severity:"warning",selector:"html",message:"The element has no lang attribute."});const n=e.filter(r=>r.severity==="error").length;return k("scan_accessibility_issues",`${e.length} issue(s): ${n} errors, ${e.length-n} warnings`,e.length,X(e,100).items,[],e.length>100)},detect_dead_click_targets:l=>{const e=l.defaultView,t=[];for(const s of Array.from(l.querySelectorAll(ge)).slice(0,500)){const n=s.getBoundingClientRect(),i=e!=null&&e.getComputedStyle?e.getComputedStyle(s):null,r=n.width===0||n.height===0,o=i?i.pointerEvents==="none":!1,a=i?i.display==="none"||i.visibility==="hidden":!1,c=s.getAttribute("aria-hidden")==="true";(r||o||a||c)&&t.push({selector:D(s),tag:s.tagName.toLowerCase(),text:B(s).slice(0,30),reasons:[r&&"zero-size",o&&"pointer-events:none",a&&`hidden (${i?i.display:"?"}/${i?i.visibility:"?"})`,c&&"aria-hidden"].filter(Boolean)})}return k("detect_dead_click_targets",`${t.length} unreachable interactive element(s)`,t.length,X(t,80).items,[],t.length>80)},inventory_animations:l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — animation inventory requires rendered styles."),k("inventory_animations","unavailable",0,[],t,!1);for(const i of Array.from(l.querySelectorAll("body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.animationName!=="none"?`${r.animationName} ${r.animationDuration}`:null,a=r.transitionProperty!=="none"&&r.transitionProperty!=="all"?`${r.transitionProperty} ${r.transitionDuration}`:r.transitionProperty==="all"?`all ${r.transitionDuration}`:null;(o||a)&&s.push({selector:D(i),animation:o,transition:a,transitionTiming:r.transitionTimingFunction||void 0})}const n=s.filter(i=>i.animation&&i.animation.includes("infinite"));return n.length>5&&t.push(`${n.length} infinitely looping animations — may indicate decorative spinners or a stuck loading state.`),k("inventory_animations",`${s.length} animated/transitioning elements`,s.length,X(s,80).items,t,s.length>80)},map_frame_tree:l=>{const e=[],t=(n,i,r)=>{const o=Array.from(n.querySelectorAll("iframe, frame"));for(const a of o){const c=a.getAttribute("src")||"(no src)";let u=!1,d=null;try{const h=a.contentDocument;h&&(u=!0,d=h.querySelectorAll("*").length,r<3&&t(h,`${i} > ${a.tagName.toLowerCase()}[${c.slice(0,50)}]`,r+1))}catch{u=!1}e.push({path:`${i} > ${a.tagName.toLowerCase()}`,selector:D(a),src:c.slice(0,120),title:a.getAttribute("title")||void 0,name:a.getAttribute("name")||void 0,sandbox:a.getAttribute("sandbox")||void 0,accessible:u,childCount:d,limitation:u?void 0:"Same-origin policy blocks contentDocument access (cross-origin frame)."})}};t(l,"document",0);const s=e.filter(n=>!n.accessible).length;return k("map_frame_tree",`${e.length} frame(s), ${s} inaccessible (cross-origin)`,e.length,e,[],!1)},inventory_shadow_roots:l=>{const e=[],t=(s,n,i)=>{const r=(s instanceof ShadowRoot,Array.from(s.querySelectorAll("*")));for(const o of r)if(o.shadowRoot){const a=o.shadowRoot,c=`${n} > ${o.tagName.toLowerCase()}::shadowRoot(${a.mode})`;e.push({path:c.slice(0,200),hostSelector:D(o),hostTag:o.tagName.toLowerCase(),mode:a.mode,childCount:a.querySelectorAll("*").length,styles:a.querySelectorAll("style").length}),i<4&&t(a,c,i+1)}};return t(l.documentElement,"document",0),k("inventory_shadow_roots",`${e.length} open shadow root(s) found`,e.length,e,[],!1)},inspect_page_storage:l=>{const e=l.defaultView,t=new he,s=[],n=[];if(!(e!=null&&e.localStorage)||!(e!=null&&e.sessionStorage))return k("inspect_page_storage","Web Storage API unavailable in this context",0,[],["localStorage/sessionStorage are not accessible here (JSDOM limitation or sandboxed iframe)."],!1);try{for(let r=0;rr+(o.size||0),0);return k("inspect_page_storage",`${n.length} storage entries (~${i} bytes), sensitive keys redacted`,n.length,X(n,100).items,s,n.length>100)},get_performance_metrics:l=>{var i,r,o,a;const e=l.defaultView,t=[],s=e==null?void 0:e.performance;if(!(s!=null&&s.timing)&&!(s!=null&&s.getEntriesByType))return k("get_performance_metrics","Performance API unavailable",0,[],["window.performance is not exposed in this context."],!1);const n=[];try{const c=(r=(i=s.getEntriesByType)==null?void 0:i.call(s,"navigation"))==null?void 0:r[0];if(c)n.push({metric:"navigation-timing",domContentLoaded:Math.round(c.domContentLoadedEventEnd),loadComplete:Math.round(c.loadEventEnd),domInteractive:Math.round(c.domInteractive),type:c.type,redirectCount:c.redirectCount,sizeTransfer:c.transferSize});else if(s.timing){const h=s.timing;n.push({metric:"navigation-timing-legacy",domContentLoaded:h.domContentLoadedEventEnd-h.navigationStart,loadComplete:h.loadEventEnd-h.navigationStart,domInteractive:h.domInteractive-h.navigationStart})}const u=((o=s.getEntriesByType)==null?void 0:o.call(s,"paint"))||[];for(const h of u)n.push({metric:h.name,startTime:Math.round(h.startTime)});const d=((a=s.getEntriesByType)==null?void 0:a.call(s,"resource"))||[];if(d.length){const h=d.reduce((y,v)=>y+v.duration,0),p=[...d].sort((y,v)=>v.duration-y.duration).slice(0,5).map(y=>({url:String(y.name).slice(0,100),duration:Math.round(y.duration)}));n.push({metric:"resource-summary",count:d.length,totalDuration:Math.round(h),slowest:p})}s.memory&&n.push({metric:"memory",usedJSHeapMB:Math.round(s.memory.usedJSHeapSize/1048576*10)/10,totalJSHeapMB:Math.round(s.memory.totalJSHeapSize/1048576*10)/10})}catch(c){t.push(`performance read failed: ${c.message}`)}return k("get_performance_metrics",`${n.length} metric group(s)`,n.length,n,t,!1)},extract_seo_metadata:l=>{var r,o,a;const e=c=>{var u;return((u=l.querySelector(`meta[name="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},t=c=>{var u;return((u=l.querySelector(`meta[property="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},s=[{field:"title",value:l.title||void 0},{field:"description",value:e("description")},{field:"canonical",value:(r=l.querySelector('link[rel="canonical"]'))==null?void 0:r.getAttribute("href")},{field:"robots",value:e("robots")},{field:"viewport",value:e("viewport")},{field:"charset",value:(o=l.querySelector("meta[charset]"))==null?void 0:o.getAttribute("charset")},{field:"og:title",value:t("og:title")},{field:"og:description",value:t("og:description")},{field:"og:image",value:t("og:image")},{field:"og:url",value:t("og:url")},{field:"twitter:card",value:e("twitter:card")},{field:"language",value:(a=l.documentElement)==null?void 0:a.getAttribute("lang")}],n=l.querySelectorAll("h1").length,i=[];return n===0&&i.push("No h1 — page lacks a primary heading."),n>1&&i.push(`Multiple h1 elements (${n}).`),e("description")||i.push("No meta description."),s.push({field:"h1Count",value:n}),k("extract_seo_metadata",`SEO metadata extracted; ${i.length} warning(s)`,s.length,s,i,!1)},extract_structured_data:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('script[type="application/ld+json"]')))try{const n=JSON.parse(s.textContent||"{}");e.push({format:"JSON-LD",type:n["@type"]||(Array.isArray(n)?"array":"unknown"),data:n})}catch(n){e.push({format:"JSON-LD",type:"invalid-json",error:n.message})}for(const s of Array.from(l.querySelectorAll("[itemscope]")).slice(0,30)){const n=s.getAttribute("itemtype")||"unknown",i={};for(const r of Array.from(s.querySelectorAll("[itemprop]"))){const o=r.getAttribute("itemprop")||"",a=r.getAttribute("content")||r.getAttribute("href")||((t=r.textContent)==null?void 0:t.trim())||"";i[o]=a.slice(0,100)}e.push({format:"microdata",type:n.split("/").pop()||n,data:i})}return k("extract_structured_data",`${e.length} structured data block(s)`,e.length,e,[],!1)},extract_tables:l=>{const e=Array.from(l.querySelectorAll("table")),t=e.slice(0,30).map(s=>{var a,c,u;const n=Array.from(s.querySelectorAll("thead th, tr:first-child th")).map(d=>{var h;return((h=d.textContent)==null?void 0:h.trim())||""}),i=Array.from(s.querySelectorAll("tbody tr, tr")).filter(d=>!d.querySelector("th")).slice(0,50),r=i.map(d=>Array.from(d.querySelectorAll("td")).map(h=>(h.textContent||"").trim().slice(0,60))),o=(c=(a=s.querySelector("caption"))==null?void 0:a.textContent)==null?void 0:c.trim();return{selector:D(s),caption:o,columnCount:n.length||((u=r[0])==null?void 0:u.length)||0,rowCount:i.length,headers:n,rows:r}});return k("extract_tables",`${e.length} table(s)`,e.length,t,[],e.length>30)},extract_lists:l=>{const e=Array.from(l.querySelectorAll("ul, ol")),t=e.slice(0,60).map(s=>{const n=Array.from(s.querySelectorAll(":scope > li")).slice(0,40);return{selector:D(s),kind:s.tagName.toLowerCase(),ordered:s.tagName.toLowerCase()==="ol",itemCount:n.length,items:n.map(i=>B(i).slice(0,60)),nested:s.querySelectorAll("ul, ol").length}});return k("extract_lists",`${e.length} list(s)`,e.length,t,[],e.length>60)},analyze_page_content:l=>{const e=l.body,t=(e==null?void 0:e.innerText)||(e==null?void 0:e.textContent)||"",s=t.trim()?t.trim().split(/\s+/).length:0,n=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).map(c=>({level:parseInt(c.tagName[1],10),text:B(c).slice(0,80)})),i=l.querySelectorAll("p").length,r=i?Math.round(s/i):0,o=Math.round(s/220*10)/10,a=[{metric:"wordCount",value:s},{metric:"paragraphCount",value:i},{metric:"avgParagraphWords",value:r},{metric:"estimatedReadingMinutes",value:o},{metric:"headingCount",value:n.length},{metric:"imageCount",value:l.querySelectorAll("img").length},{metric:"linkDensity",value:Math.round(l.querySelectorAll("a[href]").length/Math.max(1,s)*1e3)/1e3},{metric:"headings",value:n.slice(0,50)}];return k("analyze_page_content",`${s} words, ${i} paragraphs, ~${o} min read`,a.length,a,[],!1)},search_dom:(l,e)=>{const t=String((e==null?void 0:e.query)||"").trim();if(!t)return k("search_dom","No query supplied",0,[],["Provide a text query; optionally tag/attr filters."],!1);const s=t.toLowerCase(),n=[],i=Math.min((e==null?void 0:e.limit)||50,200),r=Array.from(l.querySelectorAll("*"));for(const o of r){if(n.length>=i)break;if(e!=null&&e.tag&&o.tagName.toLowerCase()!==String(e.tag).toLowerCase())continue;const a=B(o),c=Array.from(o.attributes);let u=0,d="";o.tagName.toLowerCase().includes(s)&&(u+=.2,d="tag match"),a.toLowerCase().includes(s)&&a.length<200&&(u+=.6,d="text match");for(const h of c)if(h.name.toLowerCase().includes(s)||h.value.length<100&&h.value.toLowerCase().includes(s)){u+=.4,d=`attribute ${h.name} match`;break}if(e!=null&&e.attr){const h=String(e.attr).toLowerCase(),p=e.attrValue?String(e.attrValue).toLowerCase():null;if(c.find(v=>v.name.toLowerCase()===h&&(!p||v.value.toLowerCase().includes(p))))u+=.5;else continue}if(u>0){const h=pe(o);n.push({selector:h.bestSelector,tag:h.tag,role:h.role,text:h.text.slice(0,60),score:Math.round(u*100)/100,reason:d,visible:h.visibility.isVisible,bounds:{x:Math.round(h.bounds.x),y:Math.round(h.bounds.y),w:Math.round(h.bounds.width),h:Math.round(h.bounds.height)}})}}return n.sort((o,a)=>a.score-o.score),k("search_dom",`${n.length} element(s) match "${t}"`,n.length,n,[],n.length>=i)},inventory_ctas:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('button, a[class*="btn"], a[class*="button"], input[type="submit"], [role="button"]')).slice(0,100)){const n=pe(s);e.push({selector:n.bestSelector,tag:n.tag,text:n.text.slice(0,50),styleHint:(t=s.getAttribute("class"))==null?void 0:t.slice(0,60),primary:/primary|cta|submit|main/i.test(s.getAttribute("class")||"")||s.type==="submit",visible:n.visibility.isVisible})}return k("inventory_ctas",`${e.length} call-to-action element(s)`,e.length,e,[],!1)},detect_focus_traps:l=>{const e=[];for(const s of Array.from(l.querySelectorAll('[role="dialog"], [aria-modal="true"], dialog[open], .modal, [class*="modal"]')).slice(0,30)){const n=s.querySelectorAll('a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])');e.push({selector:D(s),kind:s.getAttribute("role")||s.tagName.toLowerCase(),ariaModal:s.getAttribute("aria-modal"),focusableCount:n.length,firstFocusable:n[0]?D(n[0]):void 0,note:n.length===0?"Modal container has NO focusable elements — keyboard users are trapped.":void 0})}const t=l.querySelectorAll("[tabindex]>0");for(const s of Array.from(t).slice(0,20))e.push({selector:D(s),kind:"positive-tabindex",note:`tabindex=${s.tabIndex} breaks natural tab order.`});return k("detect_focus_traps",`${e.length} focus-management issue(s)/container(s)`,e.length,e,[],!1)},infer_responsive_breakpoints:l=>{const e=l.defaultView,t=[],s=new Set;for(const o of Array.from(l.querySelectorAll("style"))){const a=o.textContent||"",c=/@media[^{]*?\(\s*(?:min|max)-width\s*:\s*(\d+)(?:\.\d+)?px/g;let u;for(;u=c.exec(a);)s.add(parseInt(u[1],10))}for(const o of Array.from(l.querySelectorAll('link[rel="stylesheet"]')).slice(0,10)){const a=o.getAttribute("href")||"";if(/^\d+px$/.test(a)||a.includes("width=")){const c=a.match(/width=(\d+)/);c&&s.add(parseInt(c[1],10))}}for(const o of Array.from(l.querySelectorAll("img[srcset], source[srcset]")).slice(0,50)){const a=o.getAttribute("srcset")||"";for(const c of a.matchAll(/(\d+)w/g))s.add(parseInt(c[1],10))}e!=null&&e.matchMedia||t.push("matchMedia unavailable — live breakpoint probing skipped.");const n=Array.from(s).sort((o,a)=>o-a),i=n.map(o=>({breakpoint:o,note:o<=768?"mobile-class":o<=1024?"tablet-class":"desktop-class"})),r=e==null?void 0:e.innerWidth;if(r){const o=n.filter(a=>a<=r);i.unshift({breakpoint:`current viewport: ${r}px`,note:o.length?`below breakpoints: ${o.join(", ")}`:"no declared breakpoint below current width"})}return k("infer_responsive_breakpoints",`${n.length} breakpoint(s) inferred from CSS/srcset`,i.length,i,t,!1)},get_selection_state:l=>{var i;const e=l.defaultView,t=(i=e==null?void 0:e.getSelection)==null?void 0:i.call(e),s=l.activeElement,n=[{hasSelection:!!(t!=null&&t.toString()),selectedText:(t==null?void 0:t.toString().slice(0,200))||"",selectionRanges:(t==null?void 0:t.rangeCount)||0,activeElement:s?{tag:s.tagName.toLowerCase(),selector:D(s),editable:s.isContentEditable||["INPUT","TEXTAREA"].includes(s.tagName)}:null}];return k("get_selection_state",t!=null&&t.toString()?`Selection: "${t.toString().slice(0,40)}…"`:"No text selection",1,n,[],!1)}};function vt(l,e,t){const s=_e[l];return s?s(e,t):{analyzer:l,summary:`Unknown analyzer "${l}". Available: ${Object.keys(_e).join(", ")}`,count:0,items:[],warnings:[],truncated:!1}}const wt=2e3;class St{constructor(e=wt){f(this,"events",[]);f(this,"cap");f(this,"counter",0);this.cap=Math.max(10,e)}record(e,t,s={}){this.counter++;const n={eventId:`evt_${Date.now().toString(36)}_${this.counter}`,timestamp:Date.now(),kind:e,operationId:s.operationId,sessionId:s.sessionId,detail:t,data:s.data};return this.events.push(n),this.events.length>this.cap&&this.events.splice(0,this.events.length-this.cap),n}query(e){let t=this.events;e.kind&&(t=t.filter(n=>n.kind===e.kind)),e.operationId&&(t=t.filter(n=>n.operationId===e.operationId)),e.sinceTimestamp&&(t=t.filter(n=>n.timestamp>=e.sinceTimestamp));const s=e.limit&&e.limit>0?e.limit:200;return t.slice(-s)}size(){return this.events.length}toJSON(){return[...this.events]}}class Tt{constructor(){f(this,"counter",0);f(this,"operations",new Map)}begin(e){this.counter++;const t=`op_${Date.now().toString(36)}_${this.counter}`;return this.operations.set(t,{operationId:t,tool:e,startedAt:Date.now(),status:"RUNNING",timelineEventIds:[]}),t}end(e,t,s){const n=this.operations.get(e);n&&(n.endedAt=Date.now(),n.status=t,n.relatedError=s)}attachEvent(e,t){const s=this.operations.get(e);s&&s.timelineEventIds.push(t)}trace(e){const t=this.operations.get(e);return t?{...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}:null}recent(e=100){return Array.from(this.operations.values()).slice(-e).map(t=>({...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}))}}const xe=100;class Ct{constructor(e){f(this,"sessionId");f(this,"timeline",new St);f(this,"operations",new Tt);f(this,"tabs",new Map);f(this,"activeTabId",null);f(this,"startedAt",Date.now());f(this,"snapshots",[]);f(this,"commandHistory",[]);f(this,"annotationCount",0);f(this,"projectId");f(this,"tabCounter",0);f(this,"commandCounter",0);this.sessionId=e||`sess_${Date.now().toString(36)}`}registerTab(e,t,s){const n=e!==void 0?Array.from(this.tabs.values()).find(o=>o.browserTabId===e):void 0;if(n)return n.lastSeenAt=Date.now(),n.status="OPEN",n.url=t||n.url,n.title=s||n.title,n;this.tabCounter++;const i=`stab_${this.tabCounter}_${Date.now().toString(36)}`,r={sessionTabId:i,browserTabId:e,url:t,title:s,createdAt:Date.now(),lastSeenAt:Date.now(),status:"OPEN"};return this.tabs.set(i,r),this.timeline.record("TAB_OPENED",`tab ${i} registered (${t||"no url"})`,{sessionId:this.sessionId}),r}closeTab(e){const t=this.tabs.get(e);return t?(t.status="CLOSED",t.lastSeenAt=Date.now(),this.timeline.record("TAB_CLOSED",`tab ${e} closed`,{sessionId:this.sessionId}),!0):!1}switchTab(e){const t=this.tabs.get(e);return!t||t.status==="CLOSED"?!1:(this.activeTabId=e,this.timeline.record("TAB_SWITCHED",`active tab → ${e}`,{sessionId:this.sessionId}),!0)}getTabs(){return Array.from(this.tabs.values())}getActiveTab(){if(this.activeTabId){const e=this.tabs.get(this.activeTabId);if(e&&e.status==="OPEN")return e}return Array.from(this.tabs.values()).find(e=>e.status==="OPEN")||null}markAllStale(){let e=0;for(const t of this.tabs.values())t.status==="OPEN"&&(t.status="STALE",e++);return e}captureSnapshot(e,t,s){var a,c,u;const n=e.defaultView,i=((a=e.documentElement)==null?void 0:a.outerHTML)||"",r=e.querySelectorAll('a[href], button, input, select, textarea, [role="button"]').length,o={snapshotId:`snap_${Date.now().toString(36)}_${this.snapshots.length+1}`,timestamp:Date.now(),url:((c=n==null?void 0:n.location)==null?void 0:c.href)||((u=e.location)==null?void 0:u.href)||"",title:e.title||"",viewport:{width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0,scrollX:(n==null?void 0:n.scrollX)||0,scrollY:(n==null?void 0:n.scrollY)||0,devicePixelRatio:(n==null?void 0:n.devicePixelRatio)||1},domLength:i.length,domHash:ve(i),interactiveCount:r,selectedRegions:[],extensionEnabled:t,pendingMutations:s,annotationCount:this.annotationCount};return this.snapshots.push(o),this.snapshots.length>xe&&this.snapshots.splice(0,this.snapshots.length-xe),this.timeline.record("SNAPSHOT_CREATED",`snapshot ${o.snapshotId} (dom ${o.domLength}b)`,{sessionId:this.sessionId}),o}getSnapshot(e){return e?this.snapshots.find(t=>t.snapshotId===e)||null:this.snapshots[this.snapshots.length-1]||null}listSnapshots(){return this.snapshots.map(e=>({snapshotId:e.snapshotId,timestamp:e.timestamp,url:e.url,title:e.title,domLength:e.domLength,domHash:e.domHash}))}compareSnapshots(e,t){const s=["url","title","domLength","domHash","interactiveCount","extensionEnabled","annotationCount"],n=[];for(const r of s)e[r]!==t[r]&&n.push({field:r,before:e[r],after:t[r]});(e.viewport.width!==t.viewport.width||e.viewport.height!==t.viewport.height)&&n.push({field:"viewport",before:`${e.viewport.width}x${e.viewport.height}`,after:`${t.viewport.width}x${t.viewport.height}`});const i=t.domLength-e.domLength;return{identical:n.length===0,changes:n,domDelta:{beforeLength:e.domLength,afterLength:t.domLength,delta:i},summary:n.length===0?"States are identical.":`${n.length} field(s) changed; DOM size ${i>=0?"+":""}${i} bytes.`}}recordCommand(e,t,s,n,i){this.commandCounter++;const r=`cmd_${this.commandCounter}_${Date.now().toString(36)}`;return this.commandHistory.push({commandId:r,tool:e,args:t,outcome:s,timestamp:Date.now(),durationMs:n,error:i}),this.timeline.record("COMMAND_EXECUTED",`${e} → ${s}${i?` (${i})`:""}`,{sessionId:this.sessionId,data:{commandId:r}}),r}getCommandHistory(e=100){return this.commandHistory.slice(-e)}noteAnnotations(e){this.annotationCount=e}bindProject(e){this.projectId=e}getProjectId(){return this.projectId}summary(e,t,s,n){var i,r,o;return{sessionId:this.sessionId,startedAt:this.startedAt,url:((r=(i=e.defaultView)==null?void 0:i.location)==null?void 0:r.href)||((o=e.location)==null?void 0:o.href)||"",title:e.title||"",tabs:this.getTabs(),activeTabId:this.activeTabId,viewport:{width:t.width,height:t.height,isModified:t.isModified},extensionEnabled:s,snapshotCount:this.snapshots.length,commandCount:this.commandHistory.length,annotationCount:this.annotationCount,mutationHistoryCount:n.length,timelineEventCount:this.timeline.size(),projectId:this.projectId}}}const At=l=>{var e,t;try{const s=l.getBoundingClientRect();if(s.width===0&&s.height===0)return null;const n=((t=(e=l.ownerDocument)==null?void 0:e.defaultView)==null?void 0:t.innerWidth)||1920;return s.yn*1.5?"bottom":s.xn*.8?"right":"center"}catch{return null}},It={navigation:"navigation",banner:"header",contentinfo:"footer",complementary:"sidebar",main:"main",form:"form",search:"search",region:"section",dialog:"modal",alertdialog:"modal",table:"table",list:"list",combobox:"dropdown",button:"button",link:"link",textbox:"input",checkbox:"checkbox",radio:"radio",img:"image",article:"article"},_t={nav:"navigation",header:"header",footer:"footer",aside:"sidebar",main:"main",section:"section",article:"article",form:"form",table:"table",ul:"list",ol:"list",figure:"figure",dialog:"modal",button:"button",input:"input",select:"dropdown",textarea:"textarea",canvas:"canvas",video:"video",img:"image",h1:"heading",h2:"heading",h3:"heading"};function ee(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").replace(/_{2,}/g,"_").slice(0,48).replace(/_$/,"")}class xt{generate(e){return this.generateFromMeta({tagName:e.tagName.toLowerCase(),role:e.getAttribute("role")||void 0,text:B(e).trim(),ariaLabel:e.getAttribute("aria-label")||void 0,stableClass:Array.from(e.classList||[]).find(t=>/^[a-z][a-z0-9-]{2,}$/i.test(t)&&!Nt.has(t)),position:At(e),nearbyHeading:this.nearbyHeading(e)})}generateFromMeta(e){const t=[],s=[],n=e.role||Rt(e.tagName);if(n){const r=It[n]||n;s.push(r),t.push(`role=${n}`)}else{const r=_t[e.tagName]||e.tagName;s.push(r),t.push(`tag=${e.tagName}`)}if(e.ariaLabel&&(s.unshift(ee(e.ariaLabel)),t.push(`aria-label="${e.ariaLabel.slice(0,30)}"`)),e.text&&e.text.length<=40){const r=ee(e.text.split(/\s+/).slice(0,3).join(" "));r&&r.length>=2&&(s.push(r),t.push(`text="${e.text.slice(0,30)}"`))}if(e.nearbyHeading){const r=ee(e.nearbyHeading.split(/\s+/).slice(0,3).join(" "));r&&!s.includes(r)&&(s.push(r),t.push(`nearby-heading="${e.nearbyHeading.slice(0,30)}"`))}e.stableClass&&s.length<3&&(s.push(ee(e.stableClass)),t.push(`class=${e.stableClass}`)),e.tagName==="input"&&(s.some(r=>r.includes("input"))||(s.push("input"),t.push("tag=input"))),s.join("_").length<12&&e.position&&(s.push(e.position),t.push(`position=${e.position}`));let i=ee(s.join("_"))||"unnamed_region";return/^\d/.test(i)&&(i=`el_${i}`),{name:i,evidence:t}}nearbyHeading(e){let t=e.parentElement;for(let n=0;t&&n<4;n++){const i=t.querySelector('h1, h2, h3, h4, [role="heading"]');if(i)return B(i).trim().slice(0,40)||null;t=t.parentElement}let s=e.previousElementSibling;for(let n=0;s&&n<4;n++){if(/^H[1-4]$/.test(s.tagName)){const i=B(s).trim();if(i)return i.slice(0,40)}s=s.previousElementSibling}return null}}const Nt=new Set(["active","open","visible","hidden","selected","disabled","container","wrapper","root","item","col","row","flex","box","main","div","span","block"]);function Rt(l){switch(l){case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"aside":return"complementary";case"main":return"main";case"form":return"form";case"table":return"table";case"button":return"button";case"a":return"link";case"input":return"textbox";case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";default:return null}}const Mt=["display","position","flex-direction","grid-template-columns","width","height","background-color","color","font-size","border-radius","overflow"];class kt{constructor(){f(this,"naming",new xt)}capture(e){const t=e.ownerDocument,s=new Z(t),n=new re,i=s.generateCandidates(e),r=s.bestSelector(e),o=n.fingerprint(e);let a=e,c=0,u="self";for(let g=0;g<3;g++){const b=a.parentElement;if(!b||b===t.body||b===t.documentElement)break;if(this.isMeaningfulContainer(b)){a=b,c=g+1,u="meaningful-ancestor";break}a=b,c=g+1}if(a===e){const g=e.parentElement;g&&g!==t.body&&e.querySelectorAll("*").length<4&&(a=g,c=1,u="direct-parent-fallback")}const d=this.boundedHtml(e,6e4),h=this.boundedHtml(a,12e4);L.inspectElement(e);const p=e.getBoundingClientRect(),y=t.defaultView,v={};if(y!=null&&y.getComputedStyle){const g=y.getComputedStyle(e);for(const b of Mt){const T=g.getPropertyValue(b);T&&T!=="none"&&T!=="auto"&&(v[b]=T)}}const m=e.parentElement;return{regionHtml:d,contextHtml:h,boundary:{strategy:u,ancestorLevels:c,note:c===0?"Region captured standalone (no meaningful ancestor within 3 levels).":`Context includes ${c} ancestor level(s) up to a meaningful container.`},selectorCandidates:i,bestSelector:r.selector,xpath:s.buildXPath(e),fingerprintHash:o.hash,dimensions:{width:Math.round(p.width),height:Math.round(p.height)},position:{x:Math.round(p.x),y:Math.round(p.y)},relevantStyles:v,parentInfo:m?{tag:m.tagName.toLowerCase(),selector:Ot(m),text:B(m).slice(0,60)}:void 0,childrenCount:e.children.length,childTags:Array.from(e.children).slice(0,12).map(g=>g.tagName.toLowerCase()),nameHint:this.naming.generate(e),fingerprintVolatility:o.volatilityRisk,volatilityReasons:o.volatilityReasons}}isMeaningfulContainer(e){const t=e.tagName.toLowerCase();if(["section","article","aside","main","nav","header","footer","form"].includes(t)||e.hasAttribute("id")||e.hasAttribute("data-testid")||e.getAttribute("role")||e.children.length>1&&e.querySelector(":scope > *:nth-child(3)"))return!0;const s=e.getAttribute("style")||"";return!!(s.includes("grid")||s.includes("flex"))}boundedHtml(e,t){const s=e.outerHTML;return s.length<=t?s:s.slice(0,t)+` -`}}function Ot(l){try{return new Z(l.ownerDocument).bestSelector(l).selector}catch{return l.tagName.toLowerCase()}}class Lt{constructor(e){f(this,"nodeRegistry");f(this,"snapshotEngine");f(this,"picker");f(this,"interactionEngine");f(this,"observer");f(this,"mutationEngines",new WeakMap);f(this,"viewportControllers",new WeakMap);f(this,"targetingEngines",new WeakMap);f(this,"jsEngine",new Fe);f(this,"fingerprintEngine",new re);f(this,"humanInteraction",new rt);f(this,"session",new Ct);f(this,"simulationTabs",[]);f(this,"simulationTabCounter",0);f(this,"simulationExtensions",[{id:"teledom@teledom",name:"TeleDOM Browser Intelligence Platform",version:"4.1.0",description:"The TeleDOM platform extension itself",enabled:!0,installType:"development",isApp:!1}]);f(this,"regionCapture",new kt);this.nodeRegistry=e||new z;const t=new se,s=new oe;this.snapshotEngine=new me(this.nodeRegistry,t,s),this.picker=new Ue({nodeRegistry:this.nodeRegistry}),this.interactionEngine=new De(this.nodeRegistry),this.observer=new Pe(this.nodeRegistry),this.picker.initGlobalShortcutListener(),this.interactionEngine.setTimingHook(async n=>{const i=this.humanInteraction.delay(n);i>0&&await new Promise(r=>setTimeout(r,i))})}getMutationEngine(e){let t=this.mutationEngines.get(e);return t||(t=new He(e,this.nodeRegistry),this.mutationEngines.set(e,t)),t}getViewportController(e){let t=this.viewportControllers.get(e);return t||(t=new ze(e),this.viewportControllers.set(e,t)),t}getTargetingEngine(e){let t=this.targetingEngines.get(e);return t||(t=new st(e,this.nodeRegistry),this.targetingEngines.set(e,t)),t}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}getPicker(){return this.picker}getInteractionEngine(){return this.interactionEngine}getObserver(){return this.observer}getNodeRegistry(){return this.nodeRegistry}async handleCommand(e,t=typeof document<"u"?document:{}){var o,a,c,u,d,h,p,y,v;const s=Date.now(),{id:n,command:i,payload:r}=e;try{switch(i){case"LIVE_PAGE_INSPECT":{const m=L.inspectPage(t);return this.success(n,i,m,s)}case"LIVE_ELEMENT_INSPECT":{const m=this.resolveTarget(r,t),g=L.inspectElement(m,this.nodeRegistry);return this.success(n,i,g,s)}case"GET_SELECTED_ELEMENT":{const m=this.picker.getLastSelectedElement();return this.success(n,i,m,s)}case"ELEMENT_PICKER_START":return this.picker.startPicker(),this.success(n,i,{pickerActive:!0},s);case"ELEMENT_PICKER_STOP":return this.picker.stopPicker(),this.success(n,i,{pickerActive:!1},s);case"LIVE_ELEMENT_INTERACT":{const m=r,g=await this.interactionEngine.interact(m,t);return this.success(n,i,g,s)}case"ELEMENT_OBSERVATION_START":{const m=this.resolveTarget(r,t),g=this.observer.startObservation(m,t);return this.success(n,i,g,s)}case"ELEMENT_OBSERVATION_STOP":{const m=this.observer.stopObservation(t);return this.success(n,i,m,s)}case"LIVE_DOM_SNAPSHOT":{if(((r==null?void 0:r.format)||"html")==="html"){const b=((o=t.documentElement)==null?void 0:o.outerHTML)||"";return this.success(n,i,{html:b},s)}const g=this.snapshotEngine.captureSnapshot(t,"live_session");return this.success(n,i,g,s)}case"LIVE_DOM_SUBTREE":{const m=this.resolveTarget(r,t),g=m.outerHTML||"",b=L.inspectElement(m,this.nodeRegistry);return this.success(n,i,{html:g,element:b},s)}case"GET_ELEMENT_VISUAL_STATE":{const m=this.resolveTarget(r,t),g=L.inspectVisualState(m);return this.success(n,i,g,s)}case"LIVE_PAGE_SCREENSHOT":case"LIVE_ELEMENT_SCREENSHOT":{const m=await this.handleScreenshotCapture(i,r,t);return this.success(n,i,m,s)}case"GET_TAB_CONSOLE_LOGS":{const{level:m,searchQuery:g,limit:b=100,clearAfterRead:T}=r||{};let w=typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__||[];if(m&&m!=="all"&&(w=w.filter(E=>E.level===m)),g){const E=String(g).toLowerCase();w=w.filter(C=>{var N,I;return((N=C.text)==null?void 0:N.toLowerCase().includes(E))||((I=C.source)==null?void 0:I.toLowerCase().includes(E))})}return b>0&&(w=w.slice(-b)),T&&typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__&&(window.__FORENSIC_CONSOLE_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((a=window.__FORENSIC_CONSOLE_BUFFER__)==null?void 0:a.length)||w.length,returnedCount:w.length,logs:w},s)}case"GET_TAB_NETWORK_REQUESTS":{const{method:m,searchQuery:g,status:b,onlyErrors:T,limit:w=100,clearAfterRead:E}=r||{};let C=typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__||[];if(m&&(C=C.filter(N=>{var I;return((I=N.method)==null?void 0:I.toUpperCase())===String(m).toUpperCase()})),b&&(C=C.filter(N=>N.status===Number(b))),T&&(C=C.filter(N=>N.error||N.status&&N.status>=400)),g){const N=String(g).toLowerCase();C=C.filter(I=>{var R;return(R=I.url)==null?void 0:R.toLowerCase().includes(N)})}return w>0&&(C=C.slice(-w)),E&&typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__&&(window.__FORENSIC_NETWORK_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((c=window.__FORENSIC_NETWORK_BUFFER__)==null?void 0:c.length)||C.length,returnedCount:C.length,requests:C},s)}case"CLOSE_TAB":{if(typeof globalThis.chrome<"u"&&((u=globalThis.chrome.runtime)!=null&&u.sendMessage)){const m=await new Promise(g=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},b=>g(b))});if(m)return m}return this.isSimulation()?this.simulationCloseTab(r,t,n,i,s):typeof window<"u"?(setTimeout(()=>window.close(),100),this.success(n,i,{closed:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{closed:!0},s)}case"RELOAD_TAB":{if(typeof globalThis.chrome<"u"&&((d=globalThis.chrome.runtime)!=null&&d.sendMessage)){const m=await new Promise(g=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},b=>g(b))});if(m)return m}if(this.isSimulation()){const m=(r==null?void 0:r.mode)||"soft";return this.session.timeline.record("NAVIGATED",`tab reloaded (${m} mode)`),this.success(n,i,{reloaded:!0,mode:m,simulated:!0,url:((p=(h=t.defaultView)==null?void 0:h.location)==null?void 0:p.href)||"",title:t.title,note:"Node simulation context: DOM fixture retained; no real navigation occurs."},s)}return typeof window<"u"?(setTimeout(()=>window.location.reload(),100),this.success(n,i,{reloaded:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{reloaded:!0},s)}case"OPEN_TAB":case"LIST_TABS":case"FOCUS_TAB":case"LIST_EXTENSIONS":case"RELOAD_EXTENSION":case"SET_EXTENSION_ENABLED":case"TOGGLE_EXTENSION":{if(this.isSimulation())return this.handleSimulationBackgroundCommand(n,i,r,t,s);if(typeof globalThis.chrome<"u"&&((y=globalThis.chrome.runtime)!=null&&y.sendMessage)){const m=await new Promise(g=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},b=>g(b))});if(m)return m}return this.error(n,i,"BACKGROUND_EXECUTION_FAILED",`Command ${i} requires Chrome extension runtime`,s)}case"RESIZE_VIEWPORT":{const m=this.getViewportController(t);let g;if(r!=null&&r.preset)g=m.applyPreset(r.preset);else{const b=Number(r==null?void 0:r.width)||1280,T=Number(r==null?void 0:r.height)||800;g=m.resize(b,T)}return this.session.timeline.record("RESIZED",`viewport → ${g.applied.width}x${g.applied.height}`),this.success(n,i,g,s)}case"RESET_VIEWPORT":{const g=this.getViewportController(t).reset();return this.session.timeline.record("RESIZED",`viewport restored to ${g.applied.width}x${g.applied.height}`),this.success(n,i,g,s)}case"GET_VIEWPORT_STATE":{const m=this.getViewportController(t);return this.success(n,i,m.state(),s)}case"RUN_RESPONSIVE_TEST":{const m=this.getViewportController(t),g=(r==null?void 0:r.sizes)||Ut(),b=m.runResponsiveTest(g,{restore:(r==null?void 0:r.restore)!==!1});return this.success(n,i,b,s)}case"EMULATE_DEVICE":{const g=this.getViewportController(t).emulateDevice((r==null?void 0:r.device)||"pixel-7");return this.success(n,i,g,s)}case"EXECUTE_JS":case"EXECUTE_JS_AND_CAPTURE_CHANGES":{const m=String((r==null?void 0:r.code)||"");if(!m.trim())return this.error(n,i,"SCRIPT_EMPTY","payload.code is required.",s);const g=await this.jsEngine.execute(t,m,{timeoutMs:r==null?void 0:r.timeoutMs,world:(r==null?void 0:r.world)==="MAIN"?"MAIN":"ISOLATED"});return this.session.timeline.record("SCRIPT_EXECUTED",`${g.status} (${g.durationMs}ms)`),this.success(n,i,g,s)}case"DOM_MUTATE":{const g=this.getMutationEngine(t).mutate(r);return this.session.timeline.record("DOM_MUTATED",`${g.operation} on ${g.before.selector} → ${g.success?"OK":g.error}`),this.success(n,i,g,s)}case"DOM_MUTATE_TRANSACTION":{const m=this.getMutationEngine(t),g=(r==null?void 0:r.mode)||"begin";try{if(g==="begin"){const b=m.beginTransaction();return this.success(n,i,{transactionId:b,mode:g,open:!0},s)}if(g==="commit"){const b=m.commitTransaction();return this.session.timeline.record("DOM_MUTATED",`transaction ${b.transactionId} committed (${b.steps.length} steps)`),this.success(n,i,{...b,mode:g},s)}if(g==="rollback"){const b=m.rollbackTransaction(r==null?void 0:r.reason);return this.session.timeline.record("MUTATION_UNDONE",`transaction ${b.transactionId} rolled back`),this.success(n,i,{...b,mode:g},s)}return this.error(n,i,"INVALID_MODE",`mode must be begin|commit|rollback, got "${g}"`,s)}catch(b){return this.error(n,i,"DOM_MUTATION_FAILED",b.message,s)}}case"UNDO_DOM_MUTATION":{const g=this.getMutationEngine(t).undo();return g.success&&this.session.timeline.record("MUTATION_UNDONE",g.message),this.success(n,i,g,s)}case"REDO_DOM_MUTATION":{const g=this.getMutationEngine(t).redo();return g.success&&this.session.timeline.record("MUTATION_REDONE",g.message),this.success(n,i,g,s)}case"GET_MUTATION_HISTORY":{const m=this.getMutationEngine(t);return this.success(n,i,{entries:m.getHistory((r==null?void 0:r.limit)||100),undoDepth:m.getUndoDepth(),redoDepth:m.getRedoDepth(),openTransactionId:m.getOpenTransactionId()},s)}case"PREVIEW_DOM_MUTATION":{const g=this.getMutationEngine(t).preview(r);return this.success(n,i,g,s)}case"GENERATE_ELEMENT_TARGET":{const g=this.getTargetingEngine(t).resolveAndBuild((r==null?void 0:r.target)||(r==null?void 0:r.selector)||"");return"error"in g?this.error(n,i,"TARGET_NOT_FOUND",g.error,s):this.success(n,i,g.target,s)}case"RECOVER_SELECTOR":{const m=new it(t),g=(r==null?void 0:r.snapshot)||{},b=m.recover((r==null?void 0:r.selector)||"",g);return this.success(n,i,b,s)}case"GET_ELEMENT_ANCESTRY":{const m=this.resolveTarget(r,t);return this.success(n,i,Dt(m,t),s)}case"GET_ELEMENT_FINGERPRINT":{const m=this.resolveTarget(r,t),g=this.fingerprintEngine.fingerprint(m);return this.success(n,i,g,s)}case"GET_ELEMENT_RELATIONSHIPS":{const m=this.resolveTarget(r,t);return this.success(n,i,$t(m,t),s)}case"GET_ELEMENT_ACCESSIBILITY":{const m=this.resolveTarget(r,t);return this.success(n,i,qt(m),s)}case"GET_COMPUTED_STYLE":{const m=this.resolveTarget(r,t),g=t.defaultView;if(!(g!=null&&g.getComputedStyle))return this.error(n,i,"STYLE_UNAVAILABLE","getComputedStyle is unavailable in this context.",s);const b=g.getComputedStyle(m),T=Array.isArray(r==null?void 0:r.properties)&&r.properties.length?r.properties:["display","position","color","background-color","font-size","font-family","width","height","margin","padding","border","z-index","opacity","visibility","overflow","flex-direction","grid-template-columns"],w={};for(const E of T)w[E]=b.getPropertyValue(E);return this.success(n,i,{selector:L.inspectElement(m,this.nodeRegistry).bestSelector,styles:w},s)}case"ANALYZE_DOM":{const m=String((r==null?void 0:r.analyzer)||"");if(!m)return this.error(n,i,"ANALYZER_REQUIRED",'payload.analyzer is required (e.g. "analyze_forms").',s);const g=vt(m,t,r);return g.count===0&&g.warnings.length===0&&g.items.length===0&&g.summary.startsWith("Unknown analyzer")?this.error(n,i,"UNKNOWN_ANALYZER",g.summary,s):this.success(n,i,g,s)}case"DRAG_ELEMENT":{const m=this.resolveTarget(r==null?void 0:r.source,t),g=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):null,b=await this.performDrag(m,g,r==null?void 0:r.offsets,t);return this.success(n,i,b,s)}case"SET_INPUT_CHECKED":{const g=this.resolveTarget(r,t);if(g.type!=="checkbox"&&g.type!=="radio")return this.error(n,i,"INPUT_TYPE_UNSUPPORTED",`Target input type "${g.type}" is not checkbox/radio.`,s);const b=g.checked;g.checked=(r==null?void 0:r.checked)!==!1;const T=[];for(const w of["input","change"])try{g.dispatchEvent(new t.defaultView.Event(w,{bubbles:!0})),T.push(w)}catch{}if(g.type==="radio"&&g.name)for(const w of Array.from(t.querySelectorAll(`input[type=radio][name="${g.name}"]`)))w!==g&&(w.checked=!1);return this.success(n,i,{success:!0,selector:L.inspectElement(g,this.nodeRegistry).bestSelector,inputType:g.type,checkedBefore:b,checkedAfter:g.checked,eventsFired:T},s)}case"PRESS_KEYBOARD_SHORTCUT":{const m=Array.isArray(r==null?void 0:r.keys)?r.keys:String((r==null?void 0:r.keys)||"Enter").split("+"),g=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):t.activeElement||t.body;typeof g.focus=="function"&&g.focus();const b=[],T=t.defaultView;for(const w of m)for(const E of["keydown","keyup"])try{g.dispatchEvent(new((T==null?void 0:T.KeyboardEvent)||KeyboardEvent)(E,{key:w.trim(),bubbles:!0,cancelable:!0,ctrlKey:m.some(C=>/^(ctrl|control|cmd|meta)$/i.test(C))&&w!==m.find(C=>/^(ctrl|control|cmd|meta)$/i.test(C)),shiftKey:m.some(C=>/^shift$/i.test(C))&&w!=="Shift",altKey:m.some(C=>/^alt$/i.test(C))&&w!=="Alt"})),b.push(`${E}:${w}`)}catch{}return this.success(n,i,{success:!0,keys:m,targetSelector:L.inspectElement(g,this.nodeRegistry).bestSelector,eventsFired:b},s)}case"SCROLL_PAGE":{const m=t.defaultView;if(!m)return this.error(n,i,"NO_WINDOW","No window available for scrolling.",s);const g={x:m.scrollX||0,y:m.scrollY||0};let b;if(r!=null&&r.target||r!=null&&r.selector){const w=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t);(v=w.scrollIntoView)==null||v.call(w,{behavior:(r==null?void 0:r.behavior)||"auto",block:"center"}),b=L.inspectElement(w,this.nodeRegistry).bestSelector}else m.scrollBy(Number(r==null?void 0:r.x)||0,Number(r==null?void 0:r.y)||0);const T={x:m.scrollX||0,y:m.scrollY||0};return this.success(n,i,{success:!0,scrollBefore:g,scrollAfter:T,requested:{x:Number(r==null?void 0:r.x)||0,y:Number(r==null?void 0:r.y)||0},targetSelector:b},s)}case"WAIT_FOR_CONDITION":return await this.waitForCondition(t,r||{},s,n,i);case"GET_PAGE_STATE":case"CAPTURE_PAGE_STATE":{const m=this.session.captureSnapshot(t,!0,this.getMutationEngine(t).getUndoDepth());return this.success(n,i,m,s)}case"CAPTURE_REGION":{const m=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t),g=this.regionCapture.capture(m);return this.success(n,i,g,s)}case"GET_SIMULATION_TAB_STATE":return this.isSimulation()?this.success(n,i,{simulated:!0,tabs:this.simulationTabs,sessionSummary:this.session.getTabs()},s):this.error(n,i,"NOT_SIMULATION","Simulation tab state is only available in the Node simulation context.",s);default:return this.error(n,i,"UNKNOWN_COMMAND",`Unsupported command '${i}'`,s)}}catch(m){return this.error(n,i,"COMMAND_EXECUTION_FAILED",m.message,s,m.details)}}resolveTarget(e,t){if(!e)throw new Error("Target specifier must be provided");return typeof e=="string"?this.interactionEngine.resolveTarget({selector:e},t):typeof e=="number"?this.interactionEngine.resolveTarget({nodeId:e},t):this.interactionEngine.resolveTarget(e,t)}async performDrag(e,t,s,n){const i=n.defaultView,r=[],o=(p,y,v={})=>{try{const m=(i==null?void 0:i.MouseEvent)||(typeof MouseEvent<"u"?MouseEvent:null);m&&(p.dispatchEvent(new m(y,{bubbles:!0,cancelable:!0,...v})),r.push(y))}catch{}},a=e.getBoundingClientRect(),c=a.x+a.width/2,u=a.y+a.height/2;let d=c+((s==null?void 0:s.x)||0),h=u+((s==null?void 0:s.y)||0);if(t){const p=t.getBoundingClientRect();d=p.x+p.width/2,h=p.y+p.height/2}return o(e,"pointerdown",{button:1,clientX:c,clientY:u}),o(e,"mousedown",{button:1,clientX:c,clientY:u}),o(e,"dragstart",{clientX:c,clientY:u}),t&&(o(t,"dragenter",{clientX:d,clientY:h}),o(t,"dragover",{clientX:d,clientY:h}),o(t,"drop",{clientX:d,clientY:h})),o(e,"dragend",{clientX:d,clientY:h}),o(e,"pointerup",{button:1,clientX:d,clientY:h}),o(e,"mouseup",{button:1,clientX:d,clientY:h}),{success:r.length>0,sourceSelector:L.inspectElement(e,this.nodeRegistry).bestSelector,targetSelector:t?L.inspectElement(t,this.nodeRegistry).bestSelector:"(offset drop)",eventsFired:r,finalPosition:{x:Math.round(d),y:Math.round(h)},html5DndUsed:r.includes("dragstart")}}async waitForCondition(e,t,s,n,i){var p,y;const r=t.kind||"dom_stable",o=Math.min(Math.max(Number(t.timeoutMs)||5e3,100),3e4),a=Math.min(Math.max(Number(t.pollIntervalMs)||100,20),1e3),c=Date.now(),u=()=>{var v,m,g,b,T;switch(r){case"dom_stable":return{satisfied:!0,detail:`dom length ${((v=e.documentElement)==null?void 0:v.outerHTML.length)||0}`};case"selector_present":{const w=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:w>0,detail:`"${t.selector}" matches ${w} element(s)`}}case"selector_visible":{if(!t.selector)return{satisfied:!1,detail:"no selector supplied"};const w=e.querySelector(t.selector);if(!w)return{satisfied:!1,detail:`"${t.selector}" not present`};try{const E=L.inspectElement(w).visibility.isVisible;return{satisfied:E,detail:`visibility=${E}`}}catch{return{satisfied:!1,detail:"inspection failed"}}}case"selector_absent":{const w=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:w===0,detail:`"${t.selector}" matches ${w} element(s)`}}case"text_present":{const w=((m=e.body)==null?void 0:m.innerText)||((g=e.body)==null?void 0:g.textContent)||"",E=t.text?w.includes(String(t.text)):!1;return{satisfied:E,detail:`text "${String(t.text).slice(0,30)}" ${E?"found":"not found"}`}}case"url_contains":{const w=((T=(b=e.defaultView)==null?void 0:b.location)==null?void 0:T.href)||"";return{satisfied:t.text?w.includes(String(t.text)):!1,detail:w}}case"element_count":{const w=t.selector?e.querySelectorAll(t.selector).length:0,E=Number(t.count)||0;return{satisfied:w===E,detail:`${w}/${E} elements`}}case"readiness_state":return{satisfied:e.readyState===(t.state||"complete"),detail:`readyState=${e.readyState}`};default:return{satisfied:!1,detail:`unknown condition kind "${r}"`}}};if(r==="dom_stable"){let v=((p=e.documentElement)==null?void 0:p.outerHTML.length)||0,m=!1,g=0;for(;Date.now()-csetTimeout(w,a));const T=((y=e.documentElement)==null?void 0:y.outerHTML.length)||0;if(g++,T===v){m=!0;break}v=T}const b=Date.now()-c;return m&&this.session.timeline.record("WAIT_SATISFIED",`dom_stable after ${b}ms (${g} polls)`),this.success(n,i,{satisfied:m,condition:r,waitedMs:b,timeoutMs:o,detail:`dom length ${v}, ${g} polls`},s)}let d=u();for(;!d.satisfied&&Date.now()-csetTimeout(v,a)),d=u();const h=Date.now()-c;return d.satisfied&&this.session.timeline.record("WAIT_SATISFIED",`${r} after ${h}ms`),this.success(n,i,{satisfied:d.satisfied,condition:r,waitedMs:h,timeoutMs:o,detail:d.detail},s)}simulationCloseTab(e,t,s,n,i){const r=Number(e==null?void 0:e.tabId),o=Number.isFinite(r)?this.simulationTabs.findIndex(c=>c.browserTabId===r):this.simulationTabs.findIndex(c=>c.active);if(o<0)return this.error(s,n,"TAB_NOT_FOUND",`No simulated tab matches tabId=${r}`,i);const a=this.simulationTabs.splice(o,1)[0];return this.session.closeTab(a.sessionTabId),a.active&&this.simulationTabs.length&&(this.simulationTabs[0].active=!0,this.session.switchTab(this.simulationTabs[0].sessionTabId)),this.success(s,n,{closed:!0,closedTab:{id:a.browserTabId,url:a.url,title:a.title},simulated:!0,remaining:this.simulationTabs.length},i)}handleSimulationBackgroundCommand(e,t,s,n,i){const r=()=>{var o,a;if(!this.simulationTabs.length){this.simulationTabCounter++;const c={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:((a=(o=n.defaultView)==null?void 0:o.location)==null?void 0:a.href)||"about:blank",title:n.title||"Simulated Tab",active:!0,createdAt:Date.now()};this.simulationTabs.push(c),this.session.registerTab(c.browserTabId,c.url,c.title),this.session.switchTab(c.sessionTabId)}};switch(t){case"LIST_TABS":return r(),this.success(e,t,{simulated:!0,environment:"node-simulation",tabs:this.simulationTabs.map((o,a)=>({id:o.browserTabId,index:a,windowId:1,title:o.title,url:o.url,active:o.active,status:"complete",pinned:!1,audited:!1})),note:"Deterministic simulated tab state — a real browser tab list requires the Chrome extension connection."},i);case"OPEN_TAB":{const o=String((s==null?void 0:s.url)||"about:blank");this.simulationTabCounter++;const a={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:o,title:(s==null?void 0:s.title)||`Simulated Tab ${this.simulationTabCounter}`,active:!0,createdAt:Date.now()};this.simulationTabs.forEach(u=>u.active=!1),this.simulationTabs.push(a);const c=this.session.registerTab(a.browserTabId,o,a.title);return this.session.switchTab(c.sessionTabId),this.session.timeline.record("TAB_OPENED",`simulation tab ${a.browserTabId} → ${o}`),this.success(e,t,{opened:!0,tabId:a.browserTabId,url:o,simulated:!0,totalTabs:this.simulationTabs.length},i)}case"FOCUS_TAB":{r();const o=Number(s==null?void 0:s.tabId),a=this.simulationTabs.find(c=>c.browserTabId===o)||this.simulationTabs[0];return a?(this.simulationTabs.forEach(c=>c.active=!1),a.active=!0,this.session.switchTab(a.sessionTabId),this.session.timeline.record("TAB_SWITCHED",`simulation tab ${a.browserTabId} focused`),this.success(e,t,{focused:!0,tabId:a.browserTabId,url:a.url,simulated:!0},i)):this.error(e,t,"TAB_NOT_FOUND",`No simulated tab with tabId=${o}`,i)}case"LIST_EXTENSIONS":return this.success(e,t,{simulated:!0,extensions:this.simulationExtensions.map(o=>({...o,permissions:["activeTab","scripting","storage","tabs","management"]})),note:"Deterministic simulated extension state."},i);case"SET_EXTENSION_ENABLED":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!!(s!=null&&s.enabled),this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}". Known: ${this.simulationExtensions.map(c=>c.id).join(", ")}`,i)}case"TOGGLE_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!a.enabled,this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}case"RELOAD_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||this.simulationExtensions[0].id),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?this.success(e,t,{reloaded:!0,extensionId:a.id,simulated:!0,note:"Simulated reload: extension state preserved."},i):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}default:return this.error(e,t,"UNKNOWN_COMMAND",`Unhandled simulation command '${t}'`,i)}}async handleScreenshotCapture(e,t,s){var y,v,m,g,b;const n=s.defaultView||(typeof window<"u"?window:{}),i=Date.now(),r=`scr_${i}_${Math.random().toString(36).slice(2,6)}`,o=n.devicePixelRatio||1,a={width:n.innerWidth||((y=s.documentElement)==null?void 0:y.clientWidth)||1920,height:n.innerHeight||((v=s.documentElement)==null?void 0:v.clientHeight)||1080,scrollX:n.scrollX||n.pageXOffset||0,scrollY:n.scrollY||n.pageYOffset||0,devicePixelRatio:o};let c,u,d,h={width:a.width,height:a.height};if(e==="LIVE_ELEMENT_SCREENSHOT"){const T=this.resolveTarget(t,s),w=L.inspectElement(T,this.nodeRegistry);c=w.bestSelector,u=((m=w.forensics)==null?void 0:m.logicalNodeId)||void 0,d={x:w.bounds.x,y:w.bounds.y,width:w.bounds.width,height:w.bounds.height},h={width:Math.max(1,Math.round(w.bounds.width*o)),height:Math.max(1,Math.round(w.bounds.height*o))}}let p=(t==null?void 0:t.dataUrl)||"";if(e==="LIVE_ELEMENT_SCREENSHOT"&&p&&d&&typeof Image<"u")try{const T=await new Promise(w=>{const E=new Image;E.onload=()=>{try{const C=s.createElement("canvas"),N=Math.max(0,Math.floor(d.x*o)),I=Math.max(0,Math.floor(d.y*o)),R=Math.max(1,Math.floor(d.width*o)),x=Math.max(1,Math.floor(d.height*o));C.width=R,C.height=x;const q=C.getContext("2d");if(q){q.drawImage(E,N,I,R,x,0,0,R,x),w(C.toDataURL("image/png"));return}}catch{}w(p)},E.onerror=()=>w(p),E.src=p});T&&(p=T)}catch{}if(!p){const T=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(120,h.width||320):Math.max(800,a.width||1280),w=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(60,h.height||180):Math.max(600,a.height||800);p=fe.createDataUrl({width:T,height:w,backgroundColor:e==="LIVE_ELEMENT_SCREENSHOT"?[30,41,59,255]:[15,23,42,255],headerColor:[56,189,248,255],borderColor:[99,102,241,255],label:c||(e==="LIVE_ELEMENT_SCREENSHOT"?"Element Screenshot":"Page Screenshot")})}return{screenshotId:r,timestamp:i,url:((g=n.location)==null?void 0:g.href)||((b=s.location)==null?void 0:b.href)||"",viewport:a,targetSelector:c,targetNodeId:u,targetBounds:d,dataUrl:p,imageFormat:"png",dimensions:h,captureType:e==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}}success(e,t,s,n){return{id:e,command:t,success:!0,data:s,timestamp:Date.now(),durationMs:Date.now()-n}}error(e,t,s,n,i,r){return{id:e,command:t,success:!1,error:{code:s,message:n,details:r},timestamp:Date.now(),durationMs:Date.now()-i}}}function Dt(l,e){const t=[];let s=l.parentElement,n=1;for(;s&&n<=10;){const d=s.parentElement,h=d?Array.from(d.children).filter(p=>p.tagName===s.tagName):[];t.push({tag:s.tagName.toLowerCase(),selector:V(s),role:s.getAttribute("role")||void 0,text:K(s).slice(0,40),childIndex:h.length?h.indexOf(s)+1:1,siblingCount:d?Array.from(d.children).length:0,distance:n}),s=s.parentElement,n++}const i=l.parentElement,r=[];if(i){const d=Array.from(i.children),h=d.indexOf(l);for(let p=h-1;p>=0&&p>=h-5;p--)r.push({tag:d[p].tagName.toLowerCase(),selector:V(d[p]),role:d[p].getAttribute("role")||void 0,text:K(d[p]).slice(0,30),position:"before",distance:h-p});for(let p=h+1;p{o=Math.max(o,h);for(const p of Array.from(d.children))a.push(p.tagName.toLowerCase()),p.matches('a[href], button, input, select, textarea, [role="button"], [onclick]')&&c.push(V(p)),h<6&&u(p,h+1)};return u(l,1),{selector:V(l),ancestors:t,siblings:r,descendants:{count:l.querySelectorAll("*").length,maxDepth:o,tags:Array.from(new Set(a)).slice(0,30),interactive:c.slice(0,30)}}}function $t(l,e){const t=[{id:"self",selector:V(l),tag:l.tagName.toLowerCase(),role:l.getAttribute("role")||void 0,label:K(l).slice(0,30)||l.tagName.toLowerCase(),relationship:"self",depth:0}],s=[];let n=l.parentElement,i=1;for(;n&&i<=4;){const o=`ancestor_${i}`;t.push({id:o,selector:V(n),tag:n.tagName.toLowerCase(),role:n.getAttribute("role")||void 0,label:K(n).slice(0,30)||n.tagName.toLowerCase(),relationship:"parent",depth:i}),s.push({from:o,to:i===1?"self":`ancestor_${i-1}`,relation:"parent-of"}),n=n.parentElement,i++}for(const o of Array.from(l.children).slice(0,12)){const a=`child_${t.length}`;t.push({id:a,selector:V(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:K(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"child",depth:1}),s.push({from:"self",to:a,relation:"contains"})}const r=l.parentElement;if(r)for(const o of Array.from(r.children).slice(0,12)){if(o===l)continue;const a=`sibling_${t.length}`;t.push({id:a,selector:V(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:K(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"sibling",depth:1}),s.push({from:"self",to:a,relation:"sibling-of"})}return{rootSelector:V(l),nodes:t,edges:s}}function qt(l){const e={};for(const v of Array.from(l.attributes))v.name.startsWith("aria-")&&(e[v.name]=v.value);const t=K(l).trim(),s=l.getAttribute("aria-label"),n=l.getAttribute("aria-labelledby");let i;n&&(i=n.split(/\s+/).map(m=>{var g,b,T;return(T=(b=(g=l.ownerDocument)==null?void 0:g.getElementById(m))==null?void 0:b.textContent)==null?void 0:T.trim()}).filter(Boolean).join(" ").slice(0,60)||void 0);const r=l.getAttribute("title"),o=l.tagName.toLowerCase(),a=[];let c="";s?(c=s,a.push("aria-label")):i?(c=i,a.push("aria-labelledby")):t?(c=t.slice(0,60),a.push("text content")):r&&(c=r,a.push("title"));const u=[];(l.disabled||l.hasAttribute("disabled"))&&u.push("disabled"),l.checked&&u.push("checked");const d=l;d.tagName==="SELECT"&&typeof d.selectedOptions<"u"&&d.selectedOptions.length>0&&u.push("selected"),l.getAttribute("aria-expanded")&&u.push(`expanded=${l.getAttribute("aria-expanded")}`),l.getAttribute("aria-pressed")&&u.push(`pressed=${l.getAttribute("aria-pressed")}`),l.getAttribute("aria-hidden")==="true"&&u.push("hidden"),l.hasAttribute("required")&&u.push("required"),l.readOnly&&u.push("readonly");const h=["a[href]","button","input","select","textarea","[tabindex]"].some(v=>{try{return l.matches(v)}catch{return!1}}),p=[];!c&&h&&p.push("Focusable element has no accessible name."),o==="img"&&!l.hasAttribute("alt")&&p.push("Image has no alt attribute.");const y=/^h([1-6])$/.exec(o);return y&&!t&&p.push(`Heading h${y[1]} is empty.`),{selector:V(l),role:l.getAttribute("role")||void 0,implicitRole:Pt(l),name:c,nameSources:a,description:l.getAttribute("aria-describedby")||void 0,value:l.value!==void 0&&(l.getAttribute("type")||"text")!=="password"?String(l.value).slice(0,40):void 0,states:u,level:y?parseInt(y[1],10):void 0,focusable:h,tabIndex:l.tabIndex,ariaAttributes:e,issues:p}}function Pt(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return{checkbox:"checkbox",radio:"radio",button:"button",submit:"button",reset:"button",range:"slider",search:"searchbox",email:"textbox",text:"textbox",password:"textbox",tel:"textbox",url:"textbox",number:"spinbutton"}[t]||"textbox"}case"select":return l.hasAttribute("multiple")?"listbox":"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";case"dialog":return"dialog";default:return}}function V(l){const e=l.getAttribute("id");if(e&&/^[a-zA-Z][\w-]*$/.test(e))return`#${e}`;const t=l.getAttribute("data-testid");if(t)return`${l.tagName.toLowerCase()}[data-testid="${t}"]`;const s=l.tagName.toLowerCase(),n=Array.from(l.classList||[]).slice(0,2);return n.length?`${s}.${n.join(".")}`:s}function K(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function Ut(){return[{label:"desktop-1440x900",width:1440,height:900},{label:"laptop-1024x768",width:1024,height:768},{label:"tablet-768x1024",width:768,height:1024},{label:"mobile-375x667",width:375,height:667}]}class Ht{constructor(e){f(this,"hostElement",null);f(this,"shadowRoot",null);f(this,"callbacks");f(this,"isRecording",!1);f(this,"isPaused",!1);f(this,"isMinimized",!1);f(this,"startTime",0);f(this,"eventCount",0);f(this,"timerInterval",null);f(this,"isDragging",!1);f(this,"dragStartX",0);f(this,"dragStartY",0);f(this,"posX",window.innerWidth-340);f(this,"posY",40);this.callbacks=e,this.loadPosition()}mount(){this.hostElement&&document.body.contains(this.hostElement)||(this.hostElement=document.createElement("div"),this.hostElement.id="forensic-recorder-floating-host",this.hostElement.style.all="initial",this.hostElement.style.position="fixed",this.hostElement.style.zIndex="2147483647",this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`,this.shadowRoot=this.hostElement.attachShadow({mode:"open"}),this.render(),this.attachEvents(),(document.body||document.documentElement).appendChild(this.hostElement))}unmount(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null),this.hostElement&&this.hostElement.parentNode&&this.hostElement.parentNode.removeChild(this.hostElement),this.hostElement=null,this.shadowRoot=null}hide(){this.hostElement&&(this.hostElement.style.setProperty("display","none","important"),this.hostElement.style.setProperty("visibility","hidden","important"),this.hostElement.style.setProperty("opacity","0","important"))}show(){this.hostElement&&(this.hostElement.style.removeProperty("display"),this.hostElement.style.removeProperty("visibility"),this.hostElement.style.removeProperty("opacity"))}updateState(e,t=!1,s=0,n=0){this.isRecording=e,this.isPaused=t,this.startTime=s||(e?Date.now():0),this.eventCount=n,this.shadowRoot&&(this.render(),this.attachEvents()),this.isRecording&&!this.isPaused?this.startTimer():this.stopTimer()}incrementEventCount(){var t;this.eventCount++;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#evt-badge");e&&(e.textContent=`${this.eventCount} evts`)}startTimer(){this.stopTimer(),this.timerInterval=setInterval(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#timer-display");if(e&&this.startTime){const s=(Date.now()-this.startTime)/1e3,n=Math.floor(s/60).toString().padStart(2,"0"),i=(s%60).toFixed(1).padStart(4,"0");e.textContent=`${n}:${i}`}},200)}stopTimer(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null)}savePosition(){try{sessionStorage.setItem("forensic_overlay_pos",JSON.stringify({x:this.posX,y:this.posY,min:this.isMinimized}))}catch{}}loadPosition(){try{const e=sessionStorage.getItem("forensic_overlay_pos");if(e){const t=JSON.parse(e);this.posX=Math.max(10,Math.min(window.innerWidth-300,t.x||this.posX)),this.posY=Math.max(10,Math.min(window.innerHeight-150,t.y||this.posY)),this.isMinimized=!!t.min}}catch{}}render(){if(!this.shadowRoot)return;const e=` +})()`,n=e;if(typeof n.eval!="function")return Promise.reject(new Error("BLOCKED_BY_CONTEXT: window.eval is unavailable in this context."));try{const i=n.eval(s);return i&&typeof i.then=="function"?i:Promise.resolve(i)}catch(i){return Promise.reject(i)}}hookConsole(e,t){var o;const s=["log","warn","error","info","debug"],n={},i=e,r=100;for(const a of s){const c=(o=i.console)==null?void 0:o[a];if(typeof c=="function"){n[a]=c;try{i.console[a]=(...u)=>{t.length{for(const a of s)if(n[a])try{i.console[a]=n[a]}catch{}}}serialize(e){if(e===void 0)return{text:"undefined"};if(e===null)return{text:"null"};try{if(typeof e=="string")return{text:e.slice(0,5e3)};const t=JSON.stringify(e,pe,1);return t===void 0?{serializationFailed:!0,message:"JSON.stringify returned undefined (circular or non-serializable structure)."}:{text:t.length>5e4?t.slice(0,5e4)+"…[truncated]":t}}catch(t){return{serializationFailed:!0,message:(t==null?void 0:t.message)||"Serialization failed."}}}result(e,t,s,n,i,r){return{status:t,executionId:e,durationMs:s,error:r,consoleOutput:i,domChanged:!1,domLengthBefore:0,domLengthAfter:0,world:"ISOLATED",timeoutMs:5e3,codePreview:n.length>300?n.slice(0,300)+"…":n}}}function pe(l,e){var t;if(e&&typeof e=="object"&&e.nodeType===1){const s=e;return{__element:!0,tag:s.tagName.toLowerCase(),id:s.getAttribute("id")||void 0,selector:s.tagName.toLowerCase()+(s.getAttribute("id")?`#${s.getAttribute("id")}`:""),text:(s.textContent||"").trim().slice(0,60)}}return typeof e=="function"?{__function:!0,name:e.name||"anonymous"}:e&&e.nodeType===9?{__document:!0,url:(t=e.location)==null?void 0:t.href}:e}function Ve(l){try{if(typeof l=="string")return l;if(l instanceof Error)return`${l.name}: ${l.message}`;const e=JSON.stringify(l,pe);return e===void 0?String(l):e}catch{return String(l)}}const me={"desktop-full-hd":{width:1920,height:1080,category:"desktop"},"desktop-hd":{width:1366,height:768,category:"desktop"},"desktop-laptop":{width:1440,height:900,category:"desktop"},"desktop-xga":{width:1280,height:1024,category:"desktop"},"desktop-1024":{width:1024,height:768,category:"desktop"},"tablet-ipad":{width:768,height:1024,category:"tablet"},"tablet-ipad-pro":{width:1024,height:1366,category:"tablet"},"tablet-portrait":{width:768,height:1024,category:"tablet"},"tablet-landscape":{width:1024,height:768,category:"tablet"},"mobile-iphone-se":{width:375,height:667,category:"mobile"},"mobile-iphone-12":{width:390,height:844,category:"mobile"},"mobile-iphone-14-pro-max":{width:430,height:932,category:"mobile"},"mobile-pixel-7":{width:412,height:915,category:"mobile"},"mobile-galaxy-s8":{width:360,height:740,category:"mobile"},"mobile-small":{width:320,height:568,category:"mobile"},"test-a4":{width:800,height:600,category:"test"},"test-square":{width:512,height:512,category:"test"}},fe={"iphone-13":{width:390,height:844,devicePixelRatio:3,userAgent:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"mobile"},"ipad-air":{width:820,height:1180,devicePixelRatio:2,userAgent:"Mozilla/5.0 (iPad; CPU OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1",touch:!0,category:"tablet"},"pixel-7":{width:412,height:915,devicePixelRatio:2.625,userAgent:"Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"galaxy-s23":{width:384,height:800,devicePixelRatio:3,userAgent:"Mozilla/5.0 (Linux; Android 14; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",touch:!0,category:"mobile"},"macbook-pro-16":{width:1728,height:1080,devicePixelRatio:2,userAgent:"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"},"windows-desktop":{width:1920,height:1080,devicePixelRatio:1,userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",touch:!1,category:"desktop"}};class Be{constructor(e){b(this,"original",null);b(this,"modified",!1);b(this,"activePreset",null);b(this,"activeDevice",null);this.doc=e}state(){const e=this.doc.defaultView;return{width:(e==null?void 0:e.innerWidth)||0,height:(e==null?void 0:e.innerHeight)||0,devicePixelRatio:(e==null?void 0:e.devicePixelRatio)||1,scrollX:(e==null?void 0:e.scrollX)||0,scrollY:(e==null?void 0:e.scrollY)||0,original:this.original,isModified:this.modified}}resize(e,t,s){const n=this.doc.defaultView,i={width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0},r=this.pageDigest();this.original||(this.original={...i});const o=this.applySize(e,t);this.modified=!0,this.activePreset=s||this.activePreset;const a=this.pageDigest();return{success:!0,applied:{width:o.width,height:o.height},previous:i,original:{...this.original},preset:s||void 0,beforeState:r,afterState:a,reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}applyPreset(e){const t=me[e];if(!t)throw new Error(`UNKNOWN_PRESET: "${e}". Available: ${Object.keys(me).join(", ")}`);return this.resize(t.width,t.height,e)}emulateDevice(e){const t=fe[e];if(!t)throw new Error(`UNKNOWN_DEVICE: "${e}". Available: ${Object.keys(fe).join(", ")}`);const s=this.resize(t.width,t.height,`device:${e}`);this.activeDevice=e;const n=this.doc.defaultView;return n&&this.isSimulation()&&n.devicePixelRatio!==void 0&&(n.devicePixelRatio=t.devicePixelRatio),{device:e,resize:s,profile:{width:t.width,height:t.height,devicePixelRatio:t.devicePixelRatio,touch:t.touch,category:t.category},userAgentNote:this.isSimulation()?"User-Agent override requires the Chrome DevTools Protocol (real browser session); in this context the viewport, dpr and touch metadata are applied and the UA is reported but not enforced.":"User-Agent and touch behaviors are applied by the browser emulation layer.",userAgentApplied:!this.isSimulation()}}reset(){var s,n;const e={width:((s=this.doc.defaultView)==null?void 0:s.innerWidth)||0,height:((n=this.doc.defaultView)==null?void 0:n.innerHeight)||0},t=this.original?{...this.original}:{...e};return this.original&&this.applySize(this.original.width,this.original.height),this.modified=!1,this.activePreset=null,this.activeDevice=null,{success:!0,applied:{width:t.width,height:t.height},previous:e,original:{...t},reversible:!0,mode:this.isSimulation()?"simulation":"browser-window"}}runResponsiveTest(e,t={restore:!0}){var c,u,h,g;const s=t.restore!==!1,n=this.original?{...this.original}:{width:((c=this.doc.defaultView)==null?void 0:c.innerWidth)||0,height:((u=this.doc.defaultView)==null?void 0:u.innerHeight)||0};this.original||(this.original={...n});const i=e.map(p=>{this.applySize(p.width,p.height),this.modified=!0;const y=this.pageDigest();return{label:p.label,width:p.width,height:p.height,domLength:y.domLength,interactiveCount:y.interactiveCount,horizontalOverflow:this.hasHorizontalOverflow(),screenshotId:void 0}}),r=i.slice(1).map((p,y)=>({from:i[y].label,to:p.label,domLengthDelta:p.domLength-i[y].domLength,interactiveDelta:p.interactiveCount-i[y].interactiveCount}));let o={width:((h=i[i.length-1])==null?void 0:h.width)||0,height:((g=i[i.length-1])==null?void 0:g.height)||0},a=!1;return s&&(this.applySize(n.width,n.height),this.modified=!1,o={...n},a=!0),{success:!0,originalViewport:n,steps:i,restored:a,finalViewport:o,comparisons:r}}getActivePreset(){return this.activePreset}getActiveDevice(){return this.activeDevice}applySize(e,t){const s=Math.max(200,Math.min(7680,Math.round(e))),n=Math.max(200,Math.min(4320,Math.round(t))),i=this.doc.defaultView;return i&&(typeof i.innerWidth=="number"&&(i.innerWidth=s),typeof i.innerHeight=="number"&&(i.innerHeight=n),typeof i.outerWidth=="number"&&(i.outerWidth=s),typeof i.outerHeight=="number"&&(i.outerHeight=n)),{width:s,height:n}}pageDigest(){var t,s,n,i;const e=this.doc.querySelectorAll('a[href], button, input, select, textarea, [role="button"], [onclick]').length;return{url:((s=(t=this.doc.defaultView)==null?void 0:t.location)==null?void 0:s.href)||((n=this.doc.location)==null?void 0:n.href)||"",domLength:((i=this.doc.documentElement)==null?void 0:i.outerHTML.length)||0,interactiveCount:e}}hasHorizontalOverflow(){const e=this.doc.documentElement,t=this.doc.body,s=this.doc.defaultView;return!s||!e?!1:Math.max(e.scrollWidth||0,(t==null?void 0:t.scrollWidth)||0)>(s.innerWidth||e.clientWidth||0)+1}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}}const ze=[/^css-/,/^jsx-/,/^sc-[A-Za-z]/,/^emotion/,/^chakra-/,/^mantine-/i,/^_ng[a-z]/,/^ng-/i,/^v-/,/^(?=.*\d)[a-z0-9]{6,12}$/i,/^data-v-/],We=["id","name","data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","aria-labelledby","aria-describedby","role","type","href","for","title","alt","rel","placeholder"];function be(l){let e=2166136261;for(let t=0;t>>0).toString(16).padStart(8,"0")}function ee(l){return ze.some(e=>e.test(l))}function Xe(l){return We.includes(l)}function re(l){const e=l.trim();return e?!!((e.match(/\d/g)||[]).length/e.length>.5||/^\d+[.,:\-/ ]+\d+/.test(e)||/\b\d{10,}\b/.test(e)):!1}function Ge(l,e=80){return Array.from(l.childNodes).filter(s=>s.nodeType===3).map(s=>(s.textContent||"").trim()).join(" ").replace(/\s+/g," ").slice(0,e)}function Ke(l,e){const t=[];let s=l;for(;s&&t.length!ee(f)),r=Ge(e),o=e.getBoundingClientRect(),a={width:Math.round(o.width),height:Math.round(o.height)},c=Ke(e,4),u=c.join(">"),g=Array.from(e.children||[]).slice(0,8).map(f=>f.tagName.toLowerCase()).join("|"),p=e.getAttribute("role")||(t!=null&&t.getComputedStyle,void 0)||Ye(e),y=be(JSON.stringify({t:e.tagName.toLowerCase(),a:s,c:i.slice(0,4),r:p||null,anc:u,desc:g,txt:re(r)?null:r.slice(0,40),d:a})),v=[];let m="low";return!s.id&&!s["data-testid"]&&!s.name&&(m="medium",v.push("no stable identity attribute")),n.length>0&&i.length===0&&(m=v.length?"high":"medium",v.push("all classes are framework-generated")),re(r)&&(v.push("text appears dynamic"),m==="low"&&(m="medium")),e.tagName.toLowerCase().includes("-")&&(v.push("custom element (web component)"),m==="low"&&(m="medium")),{fingerprintId:`fp_${y}`,hash:y,tagHierarchy:c,stableAttributes:s,meaningfulText:r,classes:i,role:p||void 0,dimensions:a,ancestorPattern:u,descendantPattern:g,volatilityRisk:m,volatilityReasons:v}}compare(e,t){const s=[],n=e.tagHierarchy[0]===t.tagHierarchy[0]?1:0;s.push({name:"tag",score:n,weight:.15});const i=ye(e.ancestorPattern.split(">"),t.ancestorPattern.split(">"));s.push({name:"ancestorPattern",score:i,weight:.2});const r=je(e.stableAttributes,t.stableAttributes);s.push({name:"stableAttributes",score:r,weight:.25});const o=ye(e.classes,t.classes);s.push({name:"classes",score:o,weight:.1});const a=(e.role||"")===(t.role||"")&&e.role?1:0;s.push({name:"role",score:a,weight:.1});const c=e.meaningfulText===t.meaningfulText&&e.meaningfulText?1:0;s.push({name:"text",score:c,weight:.1});const u=Ze(e.dimensions,t.dimensions);s.push({name:"dimensions",score:u,weight:.1});const h=s.reduce((g,p)=>g+p.score*p.weight,0);return{score:Math.round(h*1e3)/1e3,components:s}}}function Ye(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return t==="checkbox"?"checkbox":t==="radio"?"radio":t==="button"||t==="submit"?"button":"textbox"}case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";default:return}}function ye(l,e){if(!l.length&&!e.length)return 1;if(!l.length||!e.length)return 0;const t=new Set(e);return l.filter(n=>t.has(n)).length/Math.max(l.length,e.length)}function je(l,e){const t=Object.keys(l),s=Object.keys(e);if(!t.length&&!s.length)return .5;if(!t.length||!s.length)return 0;let n=0,i=0;for(const r of t)r in e&&(i++,l[r]===e[r]&&n++);return i===0?0:n/Math.max(t.length,s.length)}function Ze(l,e){if(l.width===0&&l.height===0&&e.width===0&&e.height===0)return .5;const t=Ee(l.width,e.width),s=Ee(l.height,e.height);return(t+s)/2}function Ee(l,e){if(l===e)return 1;if(l===0||e===0)return 0;const t=Math.min(l,e)/Math.max(l,e);return t>.9?1:t>.7?.5:0}const Je=["data-testid","data-test","data-id","data-qa","data-cy","data-component","data-role","aria-label","name","id"],ve=/^[a-zA-Z][a-zA-Z0-9_-]*$/,Qe=/^[a-zA-Z0-9_ .:-]+$/;class Y{constructor(e){b(this,"doc");this.doc=e}generateCandidates(e){const t=[],s=e.tagName.toLowerCase(),n=e.getAttribute("id");if(n&&ve.test(n)){const u=`#${we(n)}`;t.push(this.evaluate(e,u,"id",1,["unique stable id"]))}for(const u of Je){if(u==="id")continue;const h=e.getAttribute(u);if(h&&Qe.test(h)&&h.length<100){const g=`${s}[${u}="${j(h)}"]`;t.push(this.evaluate(e,g,"semantic-attribute",.92,[`semantic attribute ${u}`]))}}const i=Array.from(e.classList||[]).filter(u=>!ee(u));if(i.length){const u=`${s}.${i.slice(0,3).map(we).join(".")}`;t.push(this.evaluate(e,u,"class",.72,i.length?["stable class names"]:[]))}const r=this.buildStructuralPath(e);r&&t.push(this.evaluate(e,r,"structural-path",.55,["position-based structural path"]));const o=q(e);if(o&&o.length>=2&&o.length<=60&&!re(o)){const u=`${s}:nth-of-type(1)`,h=this.buildTextXPath(e,o);h&&(t.push({selector:u,strategy:"text-derived-xpath",confidence:.6,unique:this.isXPathUnique(h),reasons:[`matches text "${o.slice(0,30)}"`]}),t[t.length-1].xpath=h)}const a=this.buildAttributeFingerprintSelector(e);a&&t.push(this.evaluate(e,a,"attribute-fingerprint",.68,["combination of stable attributes"]));const c=new Map;for(const u of t){const h=u.strategy==="text-derived-xpath"?`xpath:${u.xpath}`:u.selector,g=c.get(h);(!g||u.confidence>g.confidence)&&c.set(h,u)}return Array.from(c.values()).sort((u,h)=>h.confidence-u.confidence)}bestSelector(e){const t=this.generateCandidates(e),s=t.find(n=>n.unique&&n.confidence>=.7)||t[0];return{selector:(s==null?void 0:s.selector)||e.tagName.toLowerCase(),strategy:(s==null?void 0:s.strategy)||"tag",confidence:(s==null?void 0:s.confidence)||.3}}buildXPath(e){const t=[];let s=e;for(;s&&s!==this.doc.documentElement;){const n=s.getAttribute("id");if(n&&ve.test(n)){t.unshift(`*[@id="${j(n)}"]`);break}const i=s.parentElement;if(!i){t.unshift(s.tagName.toLowerCase());break}const o=Array.from(i.children).filter(a=>a.tagName===s.tagName).indexOf(s)+1;t.unshift(`${s.tagName.toLowerCase()}[${o}]`),s=i}return s===this.doc.documentElement&&(!t.length||!t[0].includes("@id"))&&t.unshift("html"),"//"+t.join("/")}buildTextXPath(e,t){try{const s=e.tagName.toLowerCase(),n=et(t);return`//${s}[normalize-space(text())=${n}]`}catch{return null}}buildStructuralPath(e,t=4){const s=[];let n=e;for(;n&&s.lengthc.tagName===n.tagName);if(a.length>1){const c=a.indexOf(n)+1;s.unshift(`${o}:nth-of-type(${c})`)}else s.unshift(o);if(n=r,n===this.doc.body){s.unshift("body");break}if(n===this.doc.documentElement)break}const i=s.join(" > ");return i.includes("body")?i:"body > "+i}buildAttributeFingerprintSelector(e){const t=e.tagName.toLowerCase(),s=[],n=e.getAttribute("type");n&&s.push(`type="${j(n)}"`);const i=e.getAttribute("href");i&&i.length<80&&!i.startsWith("javascript:")&&s.push(`href^="${j(i.slice(0,40))}"`);const r=e.getAttribute("placeholder");return r&&r.length<60&&s.push(`placeholder="${j(r)}"`),s.length>=2?`${t}[${s.join("][")}]`:null}evaluate(e,t,s,n,i){let r=!1,o=0;try{const c=this.doc.querySelectorAll(t);o=c.length,r=c.length===1&&c[0]===e}catch{return{selector:t,strategy:s,confidence:0,unique:!1,reasons:["invalid selector syntax"]}}let a=n;return o===0?(a=0,i.push("selector matched nothing (invalid candidate)")):o===1&&r?i.push("matches exactly this element"):(a=a*.4,i.push(`matches ${o} elements — ambiguous`)),{selector:t,strategy:s,confidence:Math.round(a*100)/100,unique:r,reasons:i}}isXPathUnique(e){try{return this.doc.evaluate(`count(${e})`,this.doc,null,4,null).numberValue===1}catch{return!1}}}function q(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function we(l){return l.replace(/([^a-zA-Z0-9_\u00A0-\uFFFF-])/g,"\\$1")}function j(l){return l.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function et(l){return l.includes("'")?l.includes('"')?`concat(${l.split("'").map(e=>`'${e}'`).join(`, "'", `)})`:`"${l}"`:`'${l}'`}class tt{constructor(e,t){b(this,"fingerprintEngine",new te);b(this,"counter",0);this.doc=e,this.registry=t}buildTarget(e,t="selector"){var h;const s=new Y(this.doc),n=s.generateCandidates(e),i=s.bestSelector(e),r=this.fingerprintEngine.fingerprint(e),o=k.inspectElement(e,this.registry),a=e.getBoundingClientRect();let c=i.confidence*.6;return r.volatilityRisk==="low"?c+=.3:r.volatilityRisk==="medium"&&(c+=.15),n.find(g=>g.unique&&g.confidence>=.9)&&(c+=.1),c=Math.max(.05,Math.min(1,c)),this.counter++,{targetId:`tgt_${Date.now().toString(36)}_${this.counter}`,tag:e.tagName.toLowerCase(),role:o.role||r.role,selector:i.selector,selectorCandidates:n,xpath:s.buildXPath(e),domPath:(((h=o.context)==null?void 0:h.parentChain)||[]).concat(i.selector).join(" > "),textFingerprint:r.meaningfulText,attributeFingerprint:JSON.stringify(r.stableAttributes),structuralFingerprint:r.hash,attributes:o.attributes||{},confidence:Math.round(c*100)/100,bounds:{x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height)},resolvedFrom:t}}resolveAndBuild(e){let t=null,s="unknown";typeof e=="string"&&(e={selector:e});const n=e;if(n.selectedElementRef&&(s="selectedElementRef"),!t&&n.selector)try{const i=this.doc.querySelectorAll(n.selector);if(i.length===0)return{error:`TARGET_NOT_FOUND: selector "${n.selector}" matches no element`};i.length>1?(t=st(i,this.doc)||i[0],s+="+disambiguated"):(t=i[0],s="selector")}catch(i){return{error:`TARGET_INVALID: ${i.message}`}}if(!t&&n.xpath)try{t=this.doc.evaluate(n.xpath,this.doc,null,9,null).singleNodeValue,s="xpath"}catch(i){return{error:`TARGET_INVALID_XPATH: ${i.message}`}}if(!t&&typeof n.nodeId=="number"&&this.registry){const i=this.registry.getNode(n.nodeId);i&&i.nodeType===1&&this.doc.contains(i)&&(t=i,s="nodeId")}return!t&&n.coordinates&&(t=this.doc.elementFromPoint(n.coordinates.x,n.coordinates.y),s="coordinates"),t?{element:t,target:this.buildTarget(t,s)}:{error:"TARGET_NOT_FOUND: no usable resolution strategy succeeded"}}}function st(l,e){for(const t of Array.from(l)){const s=t;try{if(k.inspectElement(s).visibility.isVisible)return s}catch{}}return null}class nt{constructor(e){b(this,"fingerprintEngine",new te);this.doc=e}recover(e,t){var p;const s=[],n=[];let i=null;try{i=this.doc.querySelectorAll(e)}catch(y){s.push(`selector syntax error: ${y.message}`)}if(i&&i.length>0){s.push("selector still matches — no recovery needed");const y=i[0];return{recovered:!0,confidence:1,strategy:"original-selector",resolvedSelector:e,matchedElementInfo:Te(y),alternatives:[],diagnostics:s,recommendation:"Original selector works; the earlier failure was transient (likely a navigation or render race)."}}s.push("selector no longer matches any element");const o=this.collectCandidates(t,s).map(y=>({element:y,score:this.scoreMatch(y,t)})).filter(y=>y.score.score>.35).sort((y,v)=>v.score.score-y.score.score);for(const y of o.slice(0,5)){const v=new Y(this.doc).bestSelector(y.element);n.push({selector:v.selector,confidence:Math.round(y.score.score*100)/100,strategy:"recovery-match"})}if(!o.length)return{recovered:!1,confidence:0,strategy:"none",alternatives:n,diagnostics:s,recommendation:"No sufficiently similar element exists. The region may have been removed, or the page structure changed fundamentally. Re-inspect the page and capture a new target."};const a=o[0],c=o.length>1?a.score.score-o[1].score.score:1;s.push(`best candidate score: ${a.score.score.toFixed(3)} (margin ${c.toFixed(3)})`);for(const y of a.score.components)y.score>0&&s.push(` - ${y.name}: ${(y.score*100).toFixed(0)}%`);if(a.score.score<.62||o.length>1&&c<.15)return{recovered:!1,confidence:Math.round(a.score.score*100)/100,strategy:"recovery-refused",resolvedSelector:(p=n[0])==null?void 0:p.selector,alternatives:n,diagnostics:s,recommendation:"Recovery refused: best match is not confident enough or too close to a competing element. Inspect alternatives manually before acting — refusing to avoid acting on a wrong element."};const g=new Y(this.doc).bestSelector(a.element).selector;return{recovered:!0,confidence:Math.round(a.score.score*100)/100,strategy:"fingerprint-recovery",resolvedSelector:g,matchedElementInfo:Te(a.element),alternatives:n,diagnostics:s,recommendation:`Recovered target with ${(a.score.score*100).toFixed(0)}% confidence. Verify the resolved selector before destructive actions.`}}collectCandidates(e,t){var r,o;const s=new Set,n=this.doc.querySelectorAll(e.tag);let i=0;for(const a of Array.from(n))if(s.add(a),++i>=400)break;if((r=e.classes)!=null&&r.length){const a=e.classes.filter(c=>!ee(c));for(const c of a.slice(0,2))try{for(const u of Array.from(this.doc.querySelectorAll(`.${c}`)).slice(0,100))s.add(u)}catch{}}if((o=e.stableAttributes)!=null&&o.name)try{for(const a of Array.from(this.doc.querySelectorAll(`[name="${e.stableAttributes.name}"]`)))s.add(a)}catch{}if(e.parentSelector)try{for(const a of Array.from(this.doc.querySelectorAll(`${e.parentSelector} > ${e.tag}`)).slice(0,100))s.add(a)}catch{}return t.push(`collected ${s.size} candidate elements for scoring`),Array.from(s)}scoreMatch(e,t){const s=[],n=e.tagName.toLowerCase()===t.tag.toLowerCase()?1:0;s.push({name:"tag",score:n,weight:.15});const i=(t.text||"").trim().slice(0,40),r=q(e).slice(0,40),o=(e.textContent||"").trim().slice(0,40);let a=0;if(i){const d=r?r===i?1:oe(i,r):0,f=o?o===i?1:oe(i,o):0;a=Math.max(d,f)}s.push({name:"text",score:a,weight:.3});const c=new Set((t.classes||[]).filter(d=>!ee(d))),u=Array.from(e.classList||[]),h=c.size?u.filter(d=>c.has(d)).length/c.size:.5;s.push({name:"classes",score:h,weight:.2});const g=t.stableAttributes||{},p=Object.keys(g);let y=.5;if(p.length){let d=0;for(const f of p)e.getAttribute(f)===g[f]&&d++;y=d/p.length}s.push({name:"attributes",score:y,weight:.2});const v=t.childCount!==void 0?e.children.length===t.childCount?1:oe(String(t.childCount),String(e.children.length)):.5;if(s.push({name:"childCount",score:v,weight:.05}),t.fingerprintHash){const d={fingerprintId:"snapshot",hash:t.fingerprintHash,tagHierarchy:[t.tag],stableAttributes:g,meaningfulText:i,classes:t.classes||[],dimensions:{width:0,height:0},ancestorPattern:"",descendantPattern:"",volatilityRisk:"medium",volatilityReasons:[]},f=this.fingerprintEngine.fingerprint(e),w=this.fingerprintEngine.compare(d,f);s.push({name:"fingerprint",score:w.score,weight:.1})}const m=s.reduce((d,f)=>d+f.score*f.weight,0);return{score:Math.max(0,Math.min(1,m)),components:s}}diagnose(e){const t=[];let s=!0,n=0,i,r=[];try{n=this.doc.querySelectorAll(e).length}catch(o){s=!1,i=o.message,t.push("Selector is syntactically invalid CSS.")}if(s&&n===0){t.push("Selector parses but matches nothing — element may be removed, re-rendered, or inside a shadow root."),r=this.relaxSelector(e);for(const o of r)try{if(this.doc.querySelectorAll(o).length>0){t.push(`Relaxed form "${o}" matches — the over-specific part of the selector is stale.`);break}}catch{}}return s&&n>1&&t.push(`Selector matches ${n} elements — it is ambiguous; use a more specific form or index.`),{selector:e,valid:s,matches:n,parseError:i,closestWorkingSelectors:r.filter(o=>{try{return this.doc.querySelectorAll(o).length>0}catch{return!1}}),diagnosis:t}}relaxSelector(e){const t=[],s=e.split(/[ >]+/).filter(Boolean);s.length>1&&(t.push(s.slice(0,-1).join(" ")),t.push(s[s.length-1]));const n=e.replace(/:nth-of-type\(\d+\)/g,"").replace(/\.[^. >#:[]+/g,(i,r,o)=>o[r-1]==="\\"?i:"");return n!==e&&n.trim()&&t.push(n.trim()),t}}function oe(l,e){if(!l||!e)return 0;const t=Se(l),s=Se(e);if(t===s)return 1;if(t.includes(s)||s.includes(t))return .7;const n=new Set(t.split(/\s+/)),i=new Set(s.split(/\s+/));return Array.from(n).filter(o=>i.has(o)).length/Math.max(n.size,i.size)}function Se(l){return l.toLowerCase().replace(/[^a-z0-9 ]/g," ").replace(/\s+/g," ").trim()}function Te(l){return{tag:l.tagName.toLowerCase(),id:l.getAttribute("id")||void 0,text:q(l).slice(0,60),classes:Array.from(l.classList||[])}}class ae{constructor(e){b(this,"state");this.state=e>>>0,this.state===0&&(this.state=2654435769)}next(){this.state=this.state+1831565813>>>0;let e=this.state;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}range(e,t){return e+this.next()*(t-e)}int(e,t){return Math.floor(this.range(e,t+1))}chance(e){return this.next()setTimeout(t,e))}chance(){return this.rng.next()<.5}}const rt=[{ruleId:"red_key_password",kind:"key-pattern",pattern:"password|passwd|pwd",description:"Keys containing password/passwd/pwd",enabled:!0,userAdded:!1},{ruleId:"red_key_token",kind:"key-pattern",pattern:"token|jwt|bearer|auth|session.?id|secret|api.?key|client.?secret",description:"Keys containing token/jwt/auth/session-id/secret/api-key",enabled:!0,userAdded:!1},{ruleId:"red_key_credential",kind:"key-pattern",pattern:"credential|login|user.?pass|otp|2fa|mfa|verification",description:"Keys containing credential/login/otp/2fa/verification",enabled:!0,userAdded:!1},{ruleId:"red_key_payment",kind:"key-pattern",pattern:"card|payment|billing|iban|cvv|cvc|pan",description:"Keys containing card/payment/billing/iban/cvv",enabled:!0,userAdded:!1},{ruleId:"red_key_personal",kind:"key-pattern",pattern:"ssn|social.?security|national.?id|passport|tax.?id",description:"Keys containing personal identifier patterns",enabled:!0,userAdded:!1},{ruleId:"red_val_jwt",kind:"value-pattern",pattern:"eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+",description:"JWT-shaped tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_bearer",kind:"value-pattern",pattern:"bearer\\s+[A-Za-z0-9._-]+",description:"Bearer tokens",enabled:!0,userAdded:!1},{ruleId:"red_val_long_hex",kind:"value-pattern",pattern:"\\b[a-f0-9]{32,}\\b",description:"32+ char hex strings (session/API ids)",enabled:!0,userAdded:!1},{ruleId:"red_val_sk",kind:"value-pattern",pattern:"\\b(sk|pk|rk)_[A-Za-z0-9_]{20,}\\b",description:"Stripe-style secret keys (sk_live_…)",enabled:!0,userAdded:!1},{ruleId:"red_attr_input_password",kind:"attribute-name",pattern:"value",description:"value attributes on password inputs handled by PrivacyEngine maskValue",enabled:!0,userAdded:!1},{ruleId:"red_attr_secret",kind:"attribute-name",pattern:"data-secret|data-token|data-api-key|secret|access.?token",description:"Secret-carrying attributes",enabled:!0,userAdded:!1}],ot=[{exclusionId:"excl_mcpdom_overlay",selector:"[data-mcpdom-internal], [data-forensic-internal], #forensic-recorder-floating-host, #forensic-inspect-highlighter",reason:"MCPDOM-injected UI must never contaminate captured DOM (§68 clean capture)",userAdded:!1},{exclusionId:"excl_mcpdom_ids",selector:'[id^="forensic-"], [id^="mcpdom-"]',reason:"MCPDOM-namespaced nodes",userAdded:!1}],ce="[REDACTED]";class le{constructor(e){b(this,"config");b(this,"base",new J);b(this,"compiledKeyPatterns",[]);b(this,"compiledValuePatterns",[]);b(this,"compiledAttrPatterns",[]);this.config={rules:[...rt],exclusions:[...ot],stubMode:!0,...e},this.recompile()}recompile(){this.compiledKeyPatterns=[],this.compiledValuePatterns=[],this.compiledAttrPatterns=[];for(const e of this.config.rules){if(!e.enabled)continue;const t="i";try{switch(e.kind){case"key-pattern":this.compiledKeyPatterns.push(new RegExp(e.pattern,t));break;case"value-pattern":this.compiledValuePatterns.push(new RegExp(e.pattern,"i"));break;case"attribute-name":this.compiledAttrPatterns.push(new RegExp(`^(${e.pattern})$`,"i"));break}}catch{}}}getRules(){return[...this.config.rules]}setRuleEnabled(e,t){const s=this.config.rules.find(n=>n.ruleId===e);return s?(s.enabled=t,this.recompile(),!0):!1}addRule(e){const t=`red_custom_${this.config.rules.length+1}_${Date.now().toString(36)}`,s={...e,ruleId:t,userAdded:!0};return this.config.rules.push(s),this.recompile(),s}removeRule(e){const t=this.config.rules.findIndex(s=>s.ruleId===e);return t<0||!this.config.rules[t].userAdded?!1:(this.config.rules.splice(t,1),this.recompile(),!0)}getExclusions(){return[...this.config.exclusions]}addExclusion(e,t){const n={exclusionId:`excl_custom_${this.config.exclusions.length+1}_${Date.now().toString(36)}`,selector:e,reason:t,userAdded:!0};return this.config.exclusions.push(n),n}removeExclusion(e){const t=this.config.exclusions.findIndex(s=>s.exclusionId===e);return t<0||!this.config.exclusions[t].userAdded?!1:(this.config.exclusions.splice(t,1),!0)}isSensitiveKey(e){return this.compiledKeyPatterns.some(t=>t.test(e))}redactValue(e){let t=e;for(const s of this.compiledValuePatterns)s.test(t)&&(t=t.replace(new RegExp(s.source,"gi"),ce));return t}redactByKeyValue(e,t){return this.isSensitiveKey(e)?this.config.stubMode?ce:t:this.redactValue(t)}isSensitiveAttribute(e){return this.compiledAttrPatterns.some(t=>t.test(e))}redactAttributes(e){const t={};for(const[s,n]of Object.entries(e))this.isSensitiveAttribute(s)?t[s]=ce:t[s]=this.redactValue(n);return t}cleanSubtree(e){const t=e.cloneNode(!0);for(const s of this.config.exclusions){let n=null;try{n=t.querySelectorAll(s.selector)}catch{continue}for(const i of Array.from(n))i.remove();try{if(t.matches(s.selector))return this.doclessEmptyStub(t)}catch{}}return t}isExcluded(e){for(const t of this.config.exclusions)try{if(e.matches(t.selector)||e.closest(t.selector))return!0}catch{}return!1}doclessEmptyStub(e){return e.innerHTML="",e.setAttribute("data-mcpdom-excluded","true"),e}toJSON(){return{rules:this.getRules(),exclusions:this.getExclusions(),stubMode:this.config.stubMode}}static fromJSON(e){return new le({rules:Array.isArray(e==null?void 0:e.rules)?e.rules:void 0,exclusions:Array.isArray(e==null?void 0:e.exclusions)?e.exclusions:void 0,stubMode:typeof(e==null?void 0:e.stubMode)=="boolean"?e.stubMode:void 0})}}const ue='a[href], button, input, select, textarea, [role="button"], [role="link"], [role="tab"], [onclick], [tabindex]';function F(l,e){return{items:l.slice(0,e),truncated:l.length>e}}function _(l,e,t,s,n,i){return{analyzer:l,summary:e,count:t,items:s,warnings:n,truncated:i}}function O(l){try{return k.inspectElement(l).bestSelector}catch{return l.tagName.toLowerCase()}}const at=l=>{const e=Array.from(l.querySelectorAll("form")),t=e.map(n=>{const i=Array.from(n.querySelectorAll("input, select, textarea")).map(r=>({tag:r.tagName.toLowerCase(),type:r.getAttribute("type")||(r.tagName.toLowerCase()==="textarea"?"textarea":r.tagName.toLowerCase()==="select"?"select":"text"),name:r.getAttribute("name")||void 0,id:r.getAttribute("id")||void 0,required:r.hasAttribute("required"),pattern:r.getAttribute("pattern")||void 0,maxLength:r.getAttribute("maxlength")||void 0,placeholder:r.getAttribute("placeholder")||void 0,ariaLabel:r.getAttribute("aria-label")||void 0,autocomplete:r.getAttribute("autocomplete")||void 0,hasLabel:!!(r.getAttribute("id")&&l.querySelector(`label[for="${r.getAttribute("id")}"]`))||!!r.closest("label"),defaultValue:r.value!==void 0&&(r.getAttribute("type")||"text")!=="password"?String(r.value).slice(0,40):void 0}));return{selector:O(n),action:n.getAttribute("action")||void 0,method:(n.getAttribute("method")||"GET").toUpperCase(),id:n.getAttribute("id")||void 0,fieldCount:i.length,submitButton:n.querySelector('button[type="submit"], input[type="submit"]')?O(n.querySelector('button[type="submit"], input[type="submit"]')):void 0,validationAttributes:i.filter(r=>r.required||r.pattern).length,fields:i}}),s=F(t,50);return _("analyze_forms",`${e.length} form(s) with ${t.reduce((n,i)=>n+i.fieldCount,0)} total fields`,e.length,s.items,[],s.truncated)},ct=l=>{const e=Array.from(l.querySelectorAll("a[href]")),t=e.map(n=>({href:n.getAttribute("href")||"",text:q(n).slice(0,60),selector:O(n),rel:n.getAttribute("rel")||void 0,target:n.getAttribute("target")||void 0,download:n.hasAttribute("download"),external:/^https?:\/\//i.test(n.getAttribute("href")||"")&&!lt(n.getAttribute("href")||"",l),anchorOnly:(n.getAttribute("href")||"").startsWith("#")})),s=F(t,200);return _("extract_links",`${e.length} link(s): ${t.filter(n=>n.external).length} external, ${t.filter(n=>n.anchorOnly).length} anchors`,e.length,s.items,[],s.truncated)};function lt(l,e){var t,s,n,i;try{return new URL(l,((s=(t=e.defaultView)==null?void 0:t.location)==null?void 0:s.href)||"http://localhost").origin===(((i=(n=e.defaultView)==null?void 0:n.location)==null?void 0:i.origin)||"")}catch{return!1}}const ut=l=>{const e=Array.from(l.querySelectorAll("img")),t=Array.from(l.querySelectorAll("video")),s=Array.from(l.querySelectorAll("audio")),n=Array.from(l.querySelectorAll("canvas")),i=[],r=[...e.map(c=>({kind:"img",selector:O(c),src:(c.getAttribute("src")||"").slice(0,150),alt:c.getAttribute("alt"),width:c.getAttribute("width")||void 0,height:c.getAttribute("height")||void 0,naturalWidth:c.naturalWidth||void 0,naturalHeight:c.naturalHeight||void 0,lazy:c.getAttribute("loading")==="lazy",missingAlt:!c.hasAttribute("alt")})),...t.map(c=>{var u;return{kind:"video",selector:O(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls"),autoplay:c.hasAttribute("autoplay"),muted:c.hasAttribute("muted"),poster:c.getAttribute("poster")||void 0}}),...s.map(c=>{var u;return{kind:"audio",selector:O(c),src:(c.getAttribute("src")||((u=c.querySelector("source"))==null?void 0:u.getAttribute("src"))||"").slice(0,150),controls:c.hasAttribute("controls")}}),...n.map(c=>({kind:"canvas",selector:O(c),width:c.width,height:c.height}))],o=r.filter(c=>c.missingAlt).length;o&&i.push(`${o} image(s) missing alt text (accessibility risk).`);const a=F(r,200);return _("analyze_media",`${e.length} images, ${t.length} videos, ${s.length} audios, ${n.length} canvases`,r.length,a.items,i,a.truncated)},dt=l=>{const e=l.defaultView,t=[],s={};if(e!=null&&e.getComputedStyle){const i=e.getComputedStyle(l.documentElement);for(let r=0;r({name:i,value:r}));return _("get_css_variables",`${n.length} CSS custom properties found`,n.length,n,t,!1)},ht=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.fontFamily||"",a=r.fontSize||"",c=`${o.split(",")[0].replace(/["']/g,"").trim()} @ ${a}`;s.set(c,(s.get(c)||0)+1)}else t.push("getComputedStyle unavailable — font usage analysis requires rendered styles.");const n=Array.from(s.entries()).map(([i,r])=>({font:i,usage:r})).sort((i,r)=>r.usage-i.usage);return _("analyze_fonts",`${n.length} distinct font/size combinations`,n.length,n,t,!1)},gt=l=>{const e=l.defaultView,t=[],s=new Map;if(e!=null&&e.getComputedStyle)for(const i of Array.from(l.querySelectorAll("body, body *")).slice(0,800)){const r=e.getComputedStyle(i);for(const o of["color","background-color","border-top-color"]){const a=r.getPropertyValue(o);a&&a!=="rgba(0, 0, 0, 0)"&&s.set(a,(s.get(a)||0)+1)}}else{for(const i of Array.from(l.querySelectorAll("[style]")).slice(0,300)){const r=i.getAttribute("style")||"",o=/(color)\s*:\s*([^;]+)/gi;let a;for(;a=o.exec(r);)s.set(a[2].trim(),(s.get(a[2].trim())||0)+1)}t.push("getComputedStyle unavailable — palette from inline styles only.")}const n=Array.from(s.entries()).map(([i,r])=>({color:i,usage:r})).sort((i,r)=>r.usage-i.usage).slice(0,40);return _("extract_color_palette",`${s.size} distinct colors in use`,s.size,n,t,!1)},pt=l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — z-index analysis requires rendered styles."),_("detect_zindex_conflicts","unavailable",0,[],t,!1);const n=[];for(const i of Array.from(l.querySelectorAll("body *")).slice(0,1e3)){const r=e.getComputedStyle(i),o=r.zIndex;o&&o!=="auto"&&parseInt(o,10)>0&&n.push({selector:O(i),z:parseInt(o,10),position:r.position,stacking:r.position==="fixed"||r.position==="sticky"||r.opacity!=="1"||r.transform!=="none"?"creates-stacking-context":"plain"})}for(let i=0;i1e5&&s.push({zIndex:n[i].z,elements:[n[i].selector],note:"extremely high z-index — competes with platform overlays (MCPDOM uses 2147483640+)."})}return _("detect_zindex_conflicts",`${n.length} z-indexed elements, ${s.length} potential conflict(s)`,s.length,F(s,40).items,t,s.length>40)},mt=l=>{const e=l.defaultView,t=[],s=l.documentElement,n=l.body,i=Math.max((s==null?void 0:s.scrollWidth)||0,(n==null?void 0:n.scrollWidth)||0),r=(e==null?void 0:e.innerWidth)||(s==null?void 0:s.clientWidth)||0,o=i>r+1;if(o&&(t.push({issue:"horizontal-overflow",detail:`document scrollWidth ${i} exceeds viewport ${r}`}),e!=null&&e.getComputedStyle))for(const c of Array.from(l.querySelectorAll("body *")).slice(0,600)){const u=c.getBoundingClientRect();if(u.right>r+2&&u.width>100&&(t.push({issue:"element-exceeds-viewport",selector:O(c),right:Math.round(u.right),width:Math.round(u.width)}),t.length>15))break}let a=0;for(const c of Array.from(l.querySelectorAll(ue)).slice(0,500)){const u=c.getBoundingClientRect();(u.width===0||u.height===0)&&a++}return a&&t.push({issue:"zero-size-interactive-elements",count:a}),_("detect_layout_issues",o?`HORIZONTAL OVERFLOW: page is ${i-r}px wider than viewport`:"No horizontal overflow detected",t.length,t,[],!1)},ft=l=>{const e=Array.from(l.querySelectorAll(ue)),t=new Map,s=e.slice(0,300).map(n=>{const i=de(n),r=i.role||n.tagName.toLowerCase();return t.set(r,(t.get(r)||0)+1),{selector:i.bestSelector,tag:i.tag,role:i.role,text:i.text.slice(0,40),visible:i.visibility.isVisible,disabled:n.disabled||n.hasAttribute("disabled"),inViewport:i.visibility.isInViewport}});return _("census_interactive_elements",`${e.length} interactive elements: ${Array.from(t.entries()).map(([n,i])=>`${n}×${i}`).join(", ")||"none"}`,e.length,s,[],e.length>300)};function de(l){try{return k.inspectElement(l)}catch{return{tag:l.tagName.toLowerCase(),role:void 0,text:"",bestSelector:l.tagName.toLowerCase(),bounds:{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0},visibility:{isVisible:!1,isInViewport:!1}}}}const bt=l=>{const e=["header","nav","main","aside","footer","article","section","figure","figcaption","mark","time","address","details","summary","dialog"],t=[];for(const i of e){const r=Array.from(l.querySelectorAll(i));if(r.length)for(const o of r.slice(0,20))t.push({tag:i,selector:O(o),role:o.getAttribute("role")||yt(i),text:q(o).slice(0,50),childCount:o.children.length})}const s=t.filter(i=>["banner","navigation","main","complementary","contentinfo"].includes(i.role)),n=[];return t.find(i=>i.tag==="main")||n.push("No
element — page lacks a primary landmark."),l.querySelectorAll("header").length>1&&n.push("Multiple
elements outside sections — ambiguous banner landmark."),_("detect_semantic_elements",`${t.length} semantic elements, ${s.length} landmarks`,t.length,F(t,100).items,n,t.length>100)};function yt(l){return{header:"banner",nav:"navigation",main:"main",aside:"complementary",footer:"contentinfo",article:"article",section:"region",form:"form"}[l]}const Ce={analyze_forms:at,extract_links:ct,analyze_media:ut,get_css_variables:dt,analyze_fonts:ht,extract_color_palette:gt,detect_zindex_conflicts:pt,detect_layout_issues:mt,census_interactive_elements:ft,detect_semantic_elements:bt,scan_accessibility_issues:l=>{var i;const e=[];for(const r of Array.from(l.querySelectorAll("img")).slice(0,200))r.hasAttribute("alt")||e.push({rule:"img-alt",severity:"error",selector:O(r),message:"Image is missing the alt attribute."});for(const r of Array.from(l.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button])")).slice(0,200)){const o=r.getAttribute("id");o&&l.querySelector(`label[for="${o}"]`)||r.closest("label")||r.getAttribute("aria-label")||r.getAttribute("aria-labelledby")||e.push({rule:"input-label",severity:"error",selector:O(r),message:"Form input has no associated label, aria-label or aria-labelledby."})}for(const r of Array.from(l.querySelectorAll('button, a[href], [role="button"]')).slice(0,300)){const o=q(r).trim(),a=r.getAttribute("aria-label");!o&&!a&&e.push({rule:"accessible-name",severity:"error",selector:O(r),message:"Interactive element has no accessible name (no text, no aria-label).",hint:r.querySelector("img[alt]")?"Contains an image — consider alt text or aria-label.":void 0})}const t=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).slice(0,100);let s=0;for(const r of t){const o=parseInt(r.tagName[1],10);s&&o>s+1&&e.push({rule:"heading-order",severity:"warning",selector:O(r),message:`Heading level jumps from h${s} to h${o}.`}),s=o}(i=l.documentElement)!=null&&i.getAttribute("lang")||e.push({rule:"html-lang",severity:"warning",selector:"html",message:"The element has no lang attribute."});const n=e.filter(r=>r.severity==="error").length;return _("scan_accessibility_issues",`${e.length} issue(s): ${n} errors, ${e.length-n} warnings`,e.length,F(e,100).items,[],e.length>100)},detect_dead_click_targets:l=>{const e=l.defaultView,t=[];for(const s of Array.from(l.querySelectorAll(ue)).slice(0,500)){const n=s.getBoundingClientRect(),i=e!=null&&e.getComputedStyle?e.getComputedStyle(s):null,r=n.width===0||n.height===0,o=i?i.pointerEvents==="none":!1,a=i?i.display==="none"||i.visibility==="hidden":!1,c=s.getAttribute("aria-hidden")==="true";(r||o||a||c)&&t.push({selector:O(s),tag:s.tagName.toLowerCase(),text:q(s).slice(0,30),reasons:[r&&"zero-size",o&&"pointer-events:none",a&&`hidden (${i?i.display:"?"}/${i?i.visibility:"?"})`,c&&"aria-hidden"].filter(Boolean)})}return _("detect_dead_click_targets",`${t.length} unreachable interactive element(s)`,t.length,F(t,80).items,[],t.length>80)},inventory_animations:l=>{const e=l.defaultView,t=[],s=[];if(!(e!=null&&e.getComputedStyle))return t.push("getComputedStyle unavailable — animation inventory requires rendered styles."),_("inventory_animations","unavailable",0,[],t,!1);for(const i of Array.from(l.querySelectorAll("body *")).slice(0,800)){const r=e.getComputedStyle(i),o=r.animationName!=="none"?`${r.animationName} ${r.animationDuration}`:null,a=r.transitionProperty!=="none"&&r.transitionProperty!=="all"?`${r.transitionProperty} ${r.transitionDuration}`:r.transitionProperty==="all"?`all ${r.transitionDuration}`:null;(o||a)&&s.push({selector:O(i),animation:o,transition:a,transitionTiming:r.transitionTimingFunction||void 0})}const n=s.filter(i=>i.animation&&i.animation.includes("infinite"));return n.length>5&&t.push(`${n.length} infinitely looping animations — may indicate decorative spinners or a stuck loading state.`),_("inventory_animations",`${s.length} animated/transitioning elements`,s.length,F(s,80).items,t,s.length>80)},map_frame_tree:l=>{const e=[],t=(n,i,r)=>{const o=Array.from(n.querySelectorAll("iframe, frame"));for(const a of o){const c=a.getAttribute("src")||"(no src)";let u=!1,h=null;try{const g=a.contentDocument;g&&(u=!0,h=g.querySelectorAll("*").length,r<3&&t(g,`${i} > ${a.tagName.toLowerCase()}[${c.slice(0,50)}]`,r+1))}catch{u=!1}e.push({path:`${i} > ${a.tagName.toLowerCase()}`,selector:O(a),src:c.slice(0,120),title:a.getAttribute("title")||void 0,name:a.getAttribute("name")||void 0,sandbox:a.getAttribute("sandbox")||void 0,accessible:u,childCount:h,limitation:u?void 0:"Same-origin policy blocks contentDocument access (cross-origin frame)."})}};t(l,"document",0);const s=e.filter(n=>!n.accessible).length;return _("map_frame_tree",`${e.length} frame(s), ${s} inaccessible (cross-origin)`,e.length,e,[],!1)},inventory_shadow_roots:l=>{const e=[],t=(s,n,i)=>{const r=(s instanceof ShadowRoot,Array.from(s.querySelectorAll("*")));for(const o of r)if(o.shadowRoot){const a=o.shadowRoot,c=`${n} > ${o.tagName.toLowerCase()}::shadowRoot(${a.mode})`;e.push({path:c.slice(0,200),hostSelector:O(o),hostTag:o.tagName.toLowerCase(),mode:a.mode,childCount:a.querySelectorAll("*").length,styles:a.querySelectorAll("style").length}),i<4&&t(a,c,i+1)}};return t(l.documentElement,"document",0),_("inventory_shadow_roots",`${e.length} open shadow root(s) found`,e.length,e,[],!1)},inspect_page_storage:l=>{const e=l.defaultView,t=new le,s=[],n=[];if(!(e!=null&&e.localStorage)||!(e!=null&&e.sessionStorage))return _("inspect_page_storage","Web Storage API unavailable in this context",0,[],["localStorage/sessionStorage are not accessible here (JSDOM limitation or sandboxed iframe)."],!1);try{for(let r=0;rr+(o.size||0),0);return _("inspect_page_storage",`${n.length} storage entries (~${i} bytes), sensitive keys redacted`,n.length,F(n,100).items,s,n.length>100)},get_performance_metrics:l=>{var i,r,o,a;const e=l.defaultView,t=[],s=e==null?void 0:e.performance;if(!(s!=null&&s.timing)&&!(s!=null&&s.getEntriesByType))return _("get_performance_metrics","Performance API unavailable",0,[],["window.performance is not exposed in this context."],!1);const n=[];try{const c=(r=(i=s.getEntriesByType)==null?void 0:i.call(s,"navigation"))==null?void 0:r[0];if(c)n.push({metric:"navigation-timing",domContentLoaded:Math.round(c.domContentLoadedEventEnd),loadComplete:Math.round(c.loadEventEnd),domInteractive:Math.round(c.domInteractive),type:c.type,redirectCount:c.redirectCount,sizeTransfer:c.transferSize});else if(s.timing){const g=s.timing;n.push({metric:"navigation-timing-legacy",domContentLoaded:g.domContentLoadedEventEnd-g.navigationStart,loadComplete:g.loadEventEnd-g.navigationStart,domInteractive:g.domInteractive-g.navigationStart})}const u=((o=s.getEntriesByType)==null?void 0:o.call(s,"paint"))||[];for(const g of u)n.push({metric:g.name,startTime:Math.round(g.startTime)});const h=((a=s.getEntriesByType)==null?void 0:a.call(s,"resource"))||[];if(h.length){const g=h.reduce((y,v)=>y+v.duration,0),p=[...h].sort((y,v)=>v.duration-y.duration).slice(0,5).map(y=>({url:String(y.name).slice(0,100),duration:Math.round(y.duration)}));n.push({metric:"resource-summary",count:h.length,totalDuration:Math.round(g),slowest:p})}s.memory&&n.push({metric:"memory",usedJSHeapMB:Math.round(s.memory.usedJSHeapSize/1048576*10)/10,totalJSHeapMB:Math.round(s.memory.totalJSHeapSize/1048576*10)/10})}catch(c){t.push(`performance read failed: ${c.message}`)}return _("get_performance_metrics",`${n.length} metric group(s)`,n.length,n,t,!1)},extract_seo_metadata:l=>{var r,o,a;const e=c=>{var u;return((u=l.querySelector(`meta[name="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},t=c=>{var u;return((u=l.querySelector(`meta[property="${c}"]`))==null?void 0:u.getAttribute("content"))||void 0},s=[{field:"title",value:l.title||void 0},{field:"description",value:e("description")},{field:"canonical",value:(r=l.querySelector('link[rel="canonical"]'))==null?void 0:r.getAttribute("href")},{field:"robots",value:e("robots")},{field:"viewport",value:e("viewport")},{field:"charset",value:(o=l.querySelector("meta[charset]"))==null?void 0:o.getAttribute("charset")},{field:"og:title",value:t("og:title")},{field:"og:description",value:t("og:description")},{field:"og:image",value:t("og:image")},{field:"og:url",value:t("og:url")},{field:"twitter:card",value:e("twitter:card")},{field:"language",value:(a=l.documentElement)==null?void 0:a.getAttribute("lang")}],n=l.querySelectorAll("h1").length,i=[];return n===0&&i.push("No h1 — page lacks a primary heading."),n>1&&i.push(`Multiple h1 elements (${n}).`),e("description")||i.push("No meta description."),s.push({field:"h1Count",value:n}),_("extract_seo_metadata",`SEO metadata extracted; ${i.length} warning(s)`,s.length,s,i,!1)},extract_structured_data:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('script[type="application/ld+json"]')))try{const n=JSON.parse(s.textContent||"{}");e.push({format:"JSON-LD",type:n["@type"]||(Array.isArray(n)?"array":"unknown"),data:n})}catch(n){e.push({format:"JSON-LD",type:"invalid-json",error:n.message})}for(const s of Array.from(l.querySelectorAll("[itemscope]")).slice(0,30)){const n=s.getAttribute("itemtype")||"unknown",i={};for(const r of Array.from(s.querySelectorAll("[itemprop]"))){const o=r.getAttribute("itemprop")||"",a=r.getAttribute("content")||r.getAttribute("href")||((t=r.textContent)==null?void 0:t.trim())||"";i[o]=a.slice(0,100)}e.push({format:"microdata",type:n.split("/").pop()||n,data:i})}return _("extract_structured_data",`${e.length} structured data block(s)`,e.length,e,[],!1)},extract_tables:l=>{const e=Array.from(l.querySelectorAll("table")),t=e.slice(0,30).map(s=>{var a,c,u;const n=Array.from(s.querySelectorAll("thead th, tr:first-child th")).map(h=>{var g;return((g=h.textContent)==null?void 0:g.trim())||""}),i=Array.from(s.querySelectorAll("tbody tr, tr")).filter(h=>!h.querySelector("th")).slice(0,50),r=i.map(h=>Array.from(h.querySelectorAll("td")).map(g=>(g.textContent||"").trim().slice(0,60))),o=(c=(a=s.querySelector("caption"))==null?void 0:a.textContent)==null?void 0:c.trim();return{selector:O(s),caption:o,columnCount:n.length||((u=r[0])==null?void 0:u.length)||0,rowCount:i.length,headers:n,rows:r}});return _("extract_tables",`${e.length} table(s)`,e.length,t,[],e.length>30)},extract_lists:l=>{const e=Array.from(l.querySelectorAll("ul, ol")),t=e.slice(0,60).map(s=>{const n=Array.from(s.querySelectorAll(":scope > li")).slice(0,40);return{selector:O(s),kind:s.tagName.toLowerCase(),ordered:s.tagName.toLowerCase()==="ol",itemCount:n.length,items:n.map(i=>q(i).slice(0,60)),nested:s.querySelectorAll("ul, ol").length}});return _("extract_lists",`${e.length} list(s)`,e.length,t,[],e.length>60)},analyze_page_content:l=>{const e=l.body,t=(e==null?void 0:e.innerText)||(e==null?void 0:e.textContent)||"",s=t.trim()?t.trim().split(/\s+/).length:0,n=Array.from(l.querySelectorAll("h1, h2, h3, h4, h5, h6")).map(c=>({level:parseInt(c.tagName[1],10),text:q(c).slice(0,80)})),i=l.querySelectorAll("p").length,r=i?Math.round(s/i):0,o=Math.round(s/220*10)/10,a=[{metric:"wordCount",value:s},{metric:"paragraphCount",value:i},{metric:"avgParagraphWords",value:r},{metric:"estimatedReadingMinutes",value:o},{metric:"headingCount",value:n.length},{metric:"imageCount",value:l.querySelectorAll("img").length},{metric:"linkDensity",value:Math.round(l.querySelectorAll("a[href]").length/Math.max(1,s)*1e3)/1e3},{metric:"headings",value:n.slice(0,50)}];return _("analyze_page_content",`${s} words, ${i} paragraphs, ~${o} min read`,a.length,a,[],!1)},search_dom:(l,e)=>{const t=String((e==null?void 0:e.query)||"").trim();if(!t)return _("search_dom","No query supplied",0,[],["Provide a text query; optionally tag/attr filters."],!1);const s=t.toLowerCase(),n=[],i=Math.min((e==null?void 0:e.limit)||50,200),r=Array.from(l.querySelectorAll("*"));for(const o of r){if(n.length>=i)break;if(e!=null&&e.tag&&o.tagName.toLowerCase()!==String(e.tag).toLowerCase())continue;const a=q(o),c=Array.from(o.attributes);let u=0,h="";o.tagName.toLowerCase().includes(s)&&(u+=.2,h="tag match"),a.toLowerCase().includes(s)&&a.length<200&&(u+=.6,h="text match");for(const g of c)if(g.name.toLowerCase().includes(s)||g.value.length<100&&g.value.toLowerCase().includes(s)){u+=.4,h=`attribute ${g.name} match`;break}if(e!=null&&e.attr){const g=String(e.attr).toLowerCase(),p=e.attrValue?String(e.attrValue).toLowerCase():null;if(c.find(v=>v.name.toLowerCase()===g&&(!p||v.value.toLowerCase().includes(p))))u+=.5;else continue}if(u>0){const g=de(o);n.push({selector:g.bestSelector,tag:g.tag,role:g.role,text:g.text.slice(0,60),score:Math.round(u*100)/100,reason:h,visible:g.visibility.isVisible,bounds:{x:Math.round(g.bounds.x),y:Math.round(g.bounds.y),w:Math.round(g.bounds.width),h:Math.round(g.bounds.height)}})}}return n.sort((o,a)=>a.score-o.score),_("search_dom",`${n.length} element(s) match "${t}"`,n.length,n,[],n.length>=i)},inventory_ctas:l=>{var t;const e=[];for(const s of Array.from(l.querySelectorAll('button, a[class*="btn"], a[class*="button"], input[type="submit"], [role="button"]')).slice(0,100)){const n=de(s);e.push({selector:n.bestSelector,tag:n.tag,text:n.text.slice(0,50),styleHint:(t=s.getAttribute("class"))==null?void 0:t.slice(0,60),primary:/primary|cta|submit|main/i.test(s.getAttribute("class")||"")||s.type==="submit",visible:n.visibility.isVisible})}return _("inventory_ctas",`${e.length} call-to-action element(s)`,e.length,e,[],!1)},detect_focus_traps:l=>{const e=[];for(const s of Array.from(l.querySelectorAll('[role="dialog"], [aria-modal="true"], dialog[open], .modal, [class*="modal"]')).slice(0,30)){const n=s.querySelectorAll('a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])');e.push({selector:O(s),kind:s.getAttribute("role")||s.tagName.toLowerCase(),ariaModal:s.getAttribute("aria-modal"),focusableCount:n.length,firstFocusable:n[0]?O(n[0]):void 0,note:n.length===0?"Modal container has NO focusable elements — keyboard users are trapped.":void 0})}const t=l.querySelectorAll("[tabindex]>0");for(const s of Array.from(t).slice(0,20))e.push({selector:O(s),kind:"positive-tabindex",note:`tabindex=${s.tabIndex} breaks natural tab order.`});return _("detect_focus_traps",`${e.length} focus-management issue(s)/container(s)`,e.length,e,[],!1)},infer_responsive_breakpoints:l=>{const e=l.defaultView,t=[],s=new Set;for(const o of Array.from(l.querySelectorAll("style"))){const a=o.textContent||"",c=/@media[^{]*?\(\s*(?:min|max)-width\s*:\s*(\d+)(?:\.\d+)?px/g;let u;for(;u=c.exec(a);)s.add(parseInt(u[1],10))}for(const o of Array.from(l.querySelectorAll('link[rel="stylesheet"]')).slice(0,10)){const a=o.getAttribute("href")||"";if(/^\d+px$/.test(a)||a.includes("width=")){const c=a.match(/width=(\d+)/);c&&s.add(parseInt(c[1],10))}}for(const o of Array.from(l.querySelectorAll("img[srcset], source[srcset]")).slice(0,50)){const a=o.getAttribute("srcset")||"";for(const c of a.matchAll(/(\d+)w/g))s.add(parseInt(c[1],10))}e!=null&&e.matchMedia||t.push("matchMedia unavailable — live breakpoint probing skipped.");const n=Array.from(s).sort((o,a)=>o-a),i=n.map(o=>({breakpoint:o,note:o<=768?"mobile-class":o<=1024?"tablet-class":"desktop-class"})),r=e==null?void 0:e.innerWidth;if(r){const o=n.filter(a=>a<=r);i.unshift({breakpoint:`current viewport: ${r}px`,note:o.length?`below breakpoints: ${o.join(", ")}`:"no declared breakpoint below current width"})}return _("infer_responsive_breakpoints",`${n.length} breakpoint(s) inferred from CSS/srcset`,i.length,i,t,!1)},get_selection_state:l=>{var i;const e=l.defaultView,t=(i=e==null?void 0:e.getSelection)==null?void 0:i.call(e),s=l.activeElement,n=[{hasSelection:!!(t!=null&&t.toString()),selectedText:(t==null?void 0:t.toString().slice(0,200))||"",selectionRanges:(t==null?void 0:t.rangeCount)||0,activeElement:s?{tag:s.tagName.toLowerCase(),selector:O(s),editable:s.isContentEditable||["INPUT","TEXTAREA"].includes(s.tagName)}:null}];return _("get_selection_state",t!=null&&t.toString()?`Selection: "${t.toString().slice(0,40)}…"`:"No text selection",1,n,[],!1)}};function Et(l,e,t){const s=Ce[l];return s?s(e,t):{analyzer:l,summary:`Unknown analyzer "${l}". Available: ${Object.keys(Ce).join(", ")}`,count:0,items:[],warnings:[],truncated:!1}}const vt=2e3;class wt{constructor(e=vt){b(this,"events",[]);b(this,"cap");b(this,"counter",0);this.cap=Math.max(10,e)}record(e,t,s={}){this.counter++;const n={eventId:`evt_${Date.now().toString(36)}_${this.counter}`,timestamp:Date.now(),kind:e,operationId:s.operationId,sessionId:s.sessionId,detail:t,data:s.data};return this.events.push(n),this.events.length>this.cap&&this.events.splice(0,this.events.length-this.cap),n}query(e){let t=this.events;e.kind&&(t=t.filter(n=>n.kind===e.kind)),e.operationId&&(t=t.filter(n=>n.operationId===e.operationId)),e.sinceTimestamp&&(t=t.filter(n=>n.timestamp>=e.sinceTimestamp));const s=e.limit&&e.limit>0?e.limit:200;return t.slice(-s)}size(){return this.events.length}toJSON(){return[...this.events]}}class St{constructor(){b(this,"counter",0);b(this,"operations",new Map)}begin(e){this.counter++;const t=`op_${Date.now().toString(36)}_${this.counter}`;return this.operations.set(t,{operationId:t,tool:e,startedAt:Date.now(),status:"RUNNING",timelineEventIds:[]}),t}end(e,t,s){const n=this.operations.get(e);n&&(n.endedAt=Date.now(),n.status=t,n.relatedError=s)}attachEvent(e,t){const s=this.operations.get(e);s&&s.timelineEventIds.push(t)}trace(e){const t=this.operations.get(e);return t?{...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}:null}recent(e=100){return Array.from(this.operations.values()).slice(-e).map(t=>({...t,durationMs:t.endedAt?t.endedAt-t.startedAt:void 0}))}}const Ie=100;class Tt{constructor(e){b(this,"sessionId");b(this,"timeline",new wt);b(this,"operations",new St);b(this,"tabs",new Map);b(this,"activeTabId",null);b(this,"startedAt",Date.now());b(this,"snapshots",[]);b(this,"commandHistory",[]);b(this,"annotationCount",0);b(this,"projectId");b(this,"tabCounter",0);b(this,"commandCounter",0);this.sessionId=e||`sess_${Date.now().toString(36)}`}registerTab(e,t,s){const n=e!==void 0?Array.from(this.tabs.values()).find(o=>o.browserTabId===e):void 0;if(n)return n.lastSeenAt=Date.now(),n.status="OPEN",n.url=t||n.url,n.title=s||n.title,n;this.tabCounter++;const i=`stab_${this.tabCounter}_${Date.now().toString(36)}`,r={sessionTabId:i,browserTabId:e,url:t,title:s,createdAt:Date.now(),lastSeenAt:Date.now(),status:"OPEN"};return this.tabs.set(i,r),this.timeline.record("TAB_OPENED",`tab ${i} registered (${t||"no url"})`,{sessionId:this.sessionId}),r}closeTab(e){const t=this.tabs.get(e);return t?(t.status="CLOSED",t.lastSeenAt=Date.now(),this.timeline.record("TAB_CLOSED",`tab ${e} closed`,{sessionId:this.sessionId}),!0):!1}switchTab(e){const t=this.tabs.get(e);return!t||t.status==="CLOSED"?!1:(this.activeTabId=e,this.timeline.record("TAB_SWITCHED",`active tab → ${e}`,{sessionId:this.sessionId}),!0)}getTabs(){return Array.from(this.tabs.values())}getActiveTab(){if(this.activeTabId){const e=this.tabs.get(this.activeTabId);if(e&&e.status==="OPEN")return e}return Array.from(this.tabs.values()).find(e=>e.status==="OPEN")||null}markAllStale(){let e=0;for(const t of this.tabs.values())t.status==="OPEN"&&(t.status="STALE",e++);return e}captureSnapshot(e,t,s){var a,c,u;const n=e.defaultView,i=((a=e.documentElement)==null?void 0:a.outerHTML)||"",r=e.querySelectorAll('a[href], button, input, select, textarea, [role="button"]').length,o={snapshotId:`snap_${Date.now().toString(36)}_${this.snapshots.length+1}`,timestamp:Date.now(),url:((c=n==null?void 0:n.location)==null?void 0:c.href)||((u=e.location)==null?void 0:u.href)||"",title:e.title||"",viewport:{width:(n==null?void 0:n.innerWidth)||0,height:(n==null?void 0:n.innerHeight)||0,scrollX:(n==null?void 0:n.scrollX)||0,scrollY:(n==null?void 0:n.scrollY)||0,devicePixelRatio:(n==null?void 0:n.devicePixelRatio)||1},domLength:i.length,domHash:be(i),interactiveCount:r,selectedRegions:[],extensionEnabled:t,pendingMutations:s,annotationCount:this.annotationCount};return this.snapshots.push(o),this.snapshots.length>Ie&&this.snapshots.splice(0,this.snapshots.length-Ie),this.timeline.record("SNAPSHOT_CREATED",`snapshot ${o.snapshotId} (dom ${o.domLength}b)`,{sessionId:this.sessionId}),o}getSnapshot(e){return e?this.snapshots.find(t=>t.snapshotId===e)||null:this.snapshots[this.snapshots.length-1]||null}listSnapshots(){return this.snapshots.map(e=>({snapshotId:e.snapshotId,timestamp:e.timestamp,url:e.url,title:e.title,domLength:e.domLength,domHash:e.domHash}))}compareSnapshots(e,t){const s=["url","title","domLength","domHash","interactiveCount","extensionEnabled","annotationCount"],n=[];for(const r of s)e[r]!==t[r]&&n.push({field:r,before:e[r],after:t[r]});(e.viewport.width!==t.viewport.width||e.viewport.height!==t.viewport.height)&&n.push({field:"viewport",before:`${e.viewport.width}x${e.viewport.height}`,after:`${t.viewport.width}x${t.viewport.height}`});const i=t.domLength-e.domLength;return{identical:n.length===0,changes:n,domDelta:{beforeLength:e.domLength,afterLength:t.domLength,delta:i},summary:n.length===0?"States are identical.":`${n.length} field(s) changed; DOM size ${i>=0?"+":""}${i} bytes.`}}recordCommand(e,t,s,n,i){this.commandCounter++;const r=`cmd_${this.commandCounter}_${Date.now().toString(36)}`;return this.commandHistory.push({commandId:r,tool:e,args:t,outcome:s,timestamp:Date.now(),durationMs:n,error:i}),this.timeline.record("COMMAND_EXECUTED",`${e} → ${s}${i?` (${i})`:""}`,{sessionId:this.sessionId,data:{commandId:r}}),r}getCommandHistory(e=100){return this.commandHistory.slice(-e)}noteAnnotations(e){this.annotationCount=e}bindProject(e){this.projectId=e}getProjectId(){return this.projectId}summary(e,t,s,n){var i,r,o;return{sessionId:this.sessionId,startedAt:this.startedAt,url:((r=(i=e.defaultView)==null?void 0:i.location)==null?void 0:r.href)||((o=e.location)==null?void 0:o.href)||"",title:e.title||"",tabs:this.getTabs(),activeTabId:this.activeTabId,viewport:{width:t.width,height:t.height,isModified:t.isModified},extensionEnabled:s,snapshotCount:this.snapshots.length,commandCount:this.commandHistory.length,annotationCount:this.annotationCount,mutationHistoryCount:n.length,timelineEventCount:this.timeline.size(),projectId:this.projectId}}}const Ct=l=>{var e,t;try{const s=l.getBoundingClientRect();if(s.width===0&&s.height===0)return null;const n=((t=(e=l.ownerDocument)==null?void 0:e.defaultView)==null?void 0:t.innerWidth)||1920;return s.yn*1.5?"bottom":s.xn*.8?"right":"center"}catch{return null}},It={navigation:"navigation",banner:"header",contentinfo:"footer",complementary:"sidebar",main:"main",form:"form",search:"search",region:"section",dialog:"modal",alertdialog:"modal",table:"table",list:"list",combobox:"dropdown",button:"button",link:"link",textbox:"input",checkbox:"checkbox",radio:"radio",img:"image",article:"article"},At={nav:"navigation",header:"header",footer:"footer",aside:"sidebar",main:"main",section:"section",article:"article",form:"form",table:"table",ul:"list",ol:"list",figure:"figure",dialog:"modal",button:"button",input:"input",select:"dropdown",textarea:"textarea",canvas:"canvas",video:"video",img:"image",h1:"heading",h2:"heading",h3:"heading"};function Z(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"").replace(/_{2,}/g,"_").slice(0,48).replace(/_$/,"")}class xt{generate(e){return this.generateFromMeta({tagName:e.tagName.toLowerCase(),role:e.getAttribute("role")||void 0,text:q(e).trim(),ariaLabel:e.getAttribute("aria-label")||void 0,stableClass:Array.from(e.classList||[]).find(t=>/^[a-z][a-z0-9-]{2,}$/i.test(t)&&!_t.has(t)),position:Ct(e),nearbyHeading:this.nearbyHeading(e)})}generateFromMeta(e){const t=[],s=[],n=e.role||Nt(e.tagName);if(n){const r=It[n]||n;s.push(r),t.push(`role=${n}`)}else{const r=At[e.tagName]||e.tagName;s.push(r),t.push(`tag=${e.tagName}`)}if(e.ariaLabel&&(s.unshift(Z(e.ariaLabel)),t.push(`aria-label="${e.ariaLabel.slice(0,30)}"`)),e.text&&e.text.length<=40){const r=Z(e.text.split(/\s+/).slice(0,3).join(" "));r&&r.length>=2&&(s.push(r),t.push(`text="${e.text.slice(0,30)}"`))}if(e.nearbyHeading){const r=Z(e.nearbyHeading.split(/\s+/).slice(0,3).join(" "));r&&!s.includes(r)&&(s.push(r),t.push(`nearby-heading="${e.nearbyHeading.slice(0,30)}"`))}e.stableClass&&s.length<3&&(s.push(Z(e.stableClass)),t.push(`class=${e.stableClass}`)),e.tagName==="input"&&(s.some(r=>r.includes("input"))||(s.push("input"),t.push("tag=input"))),s.join("_").length<12&&e.position&&(s.push(e.position),t.push(`position=${e.position}`));let i=Z(s.join("_"))||"unnamed_region";return/^\d/.test(i)&&(i=`el_${i}`),{name:i,evidence:t}}nearbyHeading(e){let t=e.parentElement;for(let n=0;t&&n<4;n++){const i=t.querySelector('h1, h2, h3, h4, [role="heading"]');if(i)return q(i).trim().slice(0,40)||null;t=t.parentElement}let s=e.previousElementSibling;for(let n=0;s&&n<4;n++){if(/^H[1-4]$/.test(s.tagName)){const i=q(s).trim();if(i)return i.slice(0,40)}s=s.previousElementSibling}return null}}const _t=new Set(["active","open","visible","hidden","selected","disabled","container","wrapper","root","item","col","row","flex","box","main","div","span","block"]);function Nt(l){switch(l){case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"aside":return"complementary";case"main":return"main";case"form":return"form";case"table":return"table";case"button":return"button";case"a":return"link";case"input":return"textbox";case"select":return"combobox";case"textarea":return"textbox";case"img":return"img";default:return null}}const kt=["display","position","flex-direction","grid-template-columns","width","height","background-color","color","font-size","border-radius","overflow"];class Mt{constructor(){b(this,"naming",new xt)}capture(e){const t=e.ownerDocument,s=new Y(t),n=new te,i=s.generateCandidates(e),r=s.bestSelector(e),o=n.fingerprint(e);let a=e,c=0,u="self";for(let d=0;d<3;d++){const f=a.parentElement;if(!f||f===t.body||f===t.documentElement)break;if(this.isMeaningfulContainer(f)){a=f,c=d+1,u="meaningful-ancestor";break}a=f,c=d+1}if(a===e){const d=e.parentElement;d&&d!==t.body&&e.querySelectorAll("*").length<4&&(a=d,c=1,u="direct-parent-fallback")}const h=this.boundedHtml(e,6e4),g=this.boundedHtml(a,12e4);k.inspectElement(e);const p=e.getBoundingClientRect(),y=t.defaultView,v={};if(y!=null&&y.getComputedStyle){const d=y.getComputedStyle(e);for(const f of kt){const w=d.getPropertyValue(f);w&&w!=="none"&&w!=="auto"&&(v[f]=w)}}const m=e.parentElement;return{regionHtml:h,contextHtml:g,boundary:{strategy:u,ancestorLevels:c,note:c===0?"Region captured standalone (no meaningful ancestor within 3 levels).":`Context includes ${c} ancestor level(s) up to a meaningful container.`},selectorCandidates:i,bestSelector:r.selector,xpath:s.buildXPath(e),fingerprintHash:o.hash,dimensions:{width:Math.round(p.width),height:Math.round(p.height)},position:{x:Math.round(p.x),y:Math.round(p.y)},relevantStyles:v,parentInfo:m?{tag:m.tagName.toLowerCase(),selector:Rt(m),text:q(m).slice(0,60)}:void 0,childrenCount:e.children.length,childTags:Array.from(e.children).slice(0,12).map(d=>d.tagName.toLowerCase()),nameHint:this.naming.generate(e),fingerprintVolatility:o.volatilityRisk,volatilityReasons:o.volatilityReasons}}isMeaningfulContainer(e){const t=e.tagName.toLowerCase();if(["section","article","aside","main","nav","header","footer","form"].includes(t)||e.hasAttribute("id")||e.hasAttribute("data-testid")||e.getAttribute("role")||e.children.length>1&&e.querySelector(":scope > *:nth-child(3)"))return!0;const s=e.getAttribute("style")||"";return!!(s.includes("grid")||s.includes("flex"))}boundedHtml(e,t){const s=e.outerHTML;return s.length<=t?s:s.slice(0,t)+` +`}}function Rt(l){try{return new Y(l.ownerDocument).bestSelector(l).selector}catch{return l.tagName.toLowerCase()}}class Ot{constructor(e){b(this,"nodeRegistry");b(this,"snapshotEngine");b(this,"picker");b(this,"interactionEngine");b(this,"observer");b(this,"mutationEngines",new WeakMap);b(this,"viewportControllers",new WeakMap);b(this,"targetingEngines",new WeakMap);b(this,"jsEngine",new Fe);b(this,"fingerprintEngine",new te);b(this,"humanInteraction",new it);b(this,"session",new Tt);b(this,"simulationTabs",[]);b(this,"simulationTabCounter",0);b(this,"simulationExtensions",[{id:"teledom@teledom",name:"TeleDOM Browser Intelligence Platform",version:"4.1.0",description:"The TeleDOM platform extension itself",enabled:!0,installType:"development",isApp:!1}]);b(this,"regionCapture",new Mt);this.nodeRegistry=e||new H;const t=new J,s=new ne;this.snapshotEngine=new he(this.nodeRegistry,t,s),this.picker=new Pe({nodeRegistry:this.nodeRegistry}),this.interactionEngine=new Le(this.nodeRegistry),this.observer=new qe(this.nodeRegistry),this.picker.initGlobalShortcutListener(),this.interactionEngine.setTimingHook(async n=>{const i=this.humanInteraction.delay(n);i>0&&await new Promise(r=>setTimeout(r,i))})}getMutationEngine(e){let t=this.mutationEngines.get(e);return t||(t=new Ue(e,this.nodeRegistry),this.mutationEngines.set(e,t)),t}getViewportController(e){let t=this.viewportControllers.get(e);return t||(t=new Be(e),this.viewportControllers.set(e,t)),t}getTargetingEngine(e){let t=this.targetingEngines.get(e);return t||(t=new tt(e,this.nodeRegistry),this.targetingEngines.set(e,t)),t}isSimulation(){return typeof globalThis.__FORENSIC_SIMULATION__<"u"}getPicker(){return this.picker}getInteractionEngine(){return this.interactionEngine}getObserver(){return this.observer}getNodeRegistry(){return this.nodeRegistry}async handleCommand(e,t=typeof document<"u"?document:{}){var o,a,c,u,h,g,p,y,v;const s=Date.now(),{id:n,command:i,payload:r}=e;try{switch(i){case"LIVE_PAGE_INSPECT":{const m=k.inspectPage(t);return this.success(n,i,m,s)}case"LIVE_ELEMENT_INSPECT":{const m=this.resolveTarget(r,t),d=k.inspectElement(m,this.nodeRegistry);return this.success(n,i,d,s)}case"GET_SELECTED_ELEMENT":{const m=this.picker.getLastSelectedElement();return this.success(n,i,m,s)}case"ELEMENT_PICKER_START":return this.picker.startPicker(),this.success(n,i,{pickerActive:!0},s);case"ELEMENT_PICKER_STOP":return this.picker.stopPicker(),this.success(n,i,{pickerActive:!1},s);case"LIVE_ELEMENT_INTERACT":{const m=r,d=await this.interactionEngine.interact(m,t);return this.success(n,i,d,s)}case"ELEMENT_OBSERVATION_START":{const m=this.resolveTarget(r,t),d=this.observer.startObservation(m,t);return this.success(n,i,d,s)}case"ELEMENT_OBSERVATION_STOP":{const m=this.observer.stopObservation(t);return this.success(n,i,m,s)}case"LIVE_DOM_SNAPSHOT":{if(((r==null?void 0:r.format)||"html")==="html"){const f=((o=t.documentElement)==null?void 0:o.outerHTML)||"";return this.success(n,i,{html:f},s)}const d=this.snapshotEngine.captureSnapshot(t,"live_session");return this.success(n,i,d,s)}case"LIVE_DOM_SUBTREE":{const m=this.resolveTarget(r,t),d=m.outerHTML||"",f=k.inspectElement(m,this.nodeRegistry);return this.success(n,i,{html:d,element:f},s)}case"GET_ELEMENT_VISUAL_STATE":{const m=this.resolveTarget(r,t),d=k.inspectVisualState(m);return this.success(n,i,d,s)}case"LIVE_PAGE_SCREENSHOT":case"LIVE_ELEMENT_SCREENSHOT":{const m=await this.handleScreenshotCapture(i,r,t);return this.success(n,i,m,s)}case"GET_TAB_CONSOLE_LOGS":{const{level:m,searchQuery:d,limit:f=100,clearAfterRead:w}=r||{};let E=typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__||[];if(m&&m!=="all"&&(E=E.filter(S=>S.level===m)),d){const S=String(d).toLowerCase();E=E.filter(T=>{var x,N;return((x=T.text)==null?void 0:x.toLowerCase().includes(S))||((N=T.source)==null?void 0:N.toLowerCase().includes(S))})}return f>0&&(E=E.slice(-f)),w&&typeof window<"u"&&window.__FORENSIC_CONSOLE_BUFFER__&&(window.__FORENSIC_CONSOLE_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((a=window.__FORENSIC_CONSOLE_BUFFER__)==null?void 0:a.length)||E.length,returnedCount:E.length,logs:E},s)}case"GET_TAB_NETWORK_REQUESTS":{const{method:m,searchQuery:d,status:f,onlyErrors:w,limit:E=100,clearAfterRead:S}=r||{};let T=typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__||[];if(m&&(T=T.filter(x=>{var N;return((N=x.method)==null?void 0:N.toUpperCase())===String(m).toUpperCase()})),f&&(T=T.filter(x=>x.status===Number(f))),w&&(T=T.filter(x=>x.error||x.status&&x.status>=400)),d){const x=String(d).toLowerCase();T=T.filter(N=>{var D;return(D=N.url)==null?void 0:D.toLowerCase().includes(x)})}return E>0&&(T=T.slice(-E)),S&&typeof window<"u"&&window.__FORENSIC_NETWORK_BUFFER__&&(window.__FORENSIC_NETWORK_BUFFER__.length=0),this.success(n,i,{url:typeof window<"u"?window.location.href:"",title:t.title||"",totalCaptured:typeof window<"u"&&((c=window.__FORENSIC_NETWORK_BUFFER__)==null?void 0:c.length)||T.length,returnedCount:T.length,requests:T},s)}case"CLOSE_TAB":{if(typeof globalThis.chrome<"u"&&((u=globalThis.chrome.runtime)!=null&&u.sendMessage)){const m=await new Promise(d=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},f=>d(f))});if(m)return m}return this.isSimulation()?this.simulationCloseTab(r,t,n,i,s):typeof window<"u"?(setTimeout(()=>window.close(),100),this.success(n,i,{closed:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{closed:!0},s)}case"RELOAD_TAB":{if(typeof globalThis.chrome<"u"&&((h=globalThis.chrome.runtime)!=null&&h.sendMessage)){const m=await new Promise(d=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},f=>d(f))});if(m)return m}if(this.isSimulation()){const m=(r==null?void 0:r.mode)||"soft";return this.session.timeline.record("NAVIGATED",`tab reloaded (${m} mode)`),this.success(n,i,{reloaded:!0,mode:m,simulated:!0,url:((p=(g=t.defaultView)==null?void 0:g.location)==null?void 0:p.href)||"",title:t.title,note:"Node simulation context: DOM fixture retained; no real navigation occurs."},s)}return typeof window<"u"?(setTimeout(()=>window.location.reload(),100),this.success(n,i,{reloaded:!0,url:window.location.href,title:t.title},s)):this.success(n,i,{reloaded:!0},s)}case"OPEN_TAB":case"LIST_TABS":case"FOCUS_TAB":case"LIST_EXTENSIONS":case"RELOAD_EXTENSION":case"SET_EXTENSION_ENABLED":case"TOGGLE_EXTENSION":{if(this.isSimulation())return this.handleSimulationBackgroundCommand(n,i,r,t,s);if(typeof globalThis.chrome<"u"&&((y=globalThis.chrome.runtime)!=null&&y.sendMessage)){const m=await new Promise(d=>{globalThis.chrome.runtime.sendMessage({type:"BROWSER_COMMAND_REQUEST",id:n,command:i,payload:r},f=>d(f))});if(m)return m}return this.error(n,i,"BACKGROUND_EXECUTION_FAILED",`Command ${i} requires Chrome extension runtime`,s)}case"RESIZE_VIEWPORT":{const m=this.getViewportController(t);let d;if(r!=null&&r.preset)d=m.applyPreset(r.preset);else{const f=Number(r==null?void 0:r.width)||1280,w=Number(r==null?void 0:r.height)||800;d=m.resize(f,w)}return this.session.timeline.record("RESIZED",`viewport → ${d.applied.width}x${d.applied.height}`),this.success(n,i,d,s)}case"RESET_VIEWPORT":{const d=this.getViewportController(t).reset();return this.session.timeline.record("RESIZED",`viewport restored to ${d.applied.width}x${d.applied.height}`),this.success(n,i,d,s)}case"GET_VIEWPORT_STATE":{const m=this.getViewportController(t);return this.success(n,i,m.state(),s)}case"RUN_RESPONSIVE_TEST":{const m=this.getViewportController(t),d=(r==null?void 0:r.sizes)||Pt(),f=m.runResponsiveTest(d,{restore:(r==null?void 0:r.restore)!==!1});return this.success(n,i,f,s)}case"EMULATE_DEVICE":{const d=this.getViewportController(t).emulateDevice((r==null?void 0:r.device)||"pixel-7");return this.success(n,i,d,s)}case"EXECUTE_JS":case"EXECUTE_JS_AND_CAPTURE_CHANGES":{const m=String((r==null?void 0:r.code)||"");if(!m.trim())return this.error(n,i,"SCRIPT_EMPTY","payload.code is required.",s);const d=await this.jsEngine.execute(t,m,{timeoutMs:r==null?void 0:r.timeoutMs,world:(r==null?void 0:r.world)==="MAIN"?"MAIN":"ISOLATED"});return this.session.timeline.record("SCRIPT_EXECUTED",`${d.status} (${d.durationMs}ms)`),this.success(n,i,d,s)}case"DOM_MUTATE":{const d=this.getMutationEngine(t).mutate(r);return this.session.timeline.record("DOM_MUTATED",`${d.operation} on ${d.before.selector} → ${d.success?"OK":d.error}`),this.success(n,i,d,s)}case"DOM_MUTATE_TRANSACTION":{const m=this.getMutationEngine(t),d=(r==null?void 0:r.mode)||"begin";try{if(d==="begin"){const f=m.beginTransaction();return this.success(n,i,{transactionId:f,mode:d,open:!0},s)}if(d==="commit"){const f=m.commitTransaction();return this.session.timeline.record("DOM_MUTATED",`transaction ${f.transactionId} committed (${f.steps.length} steps)`),this.success(n,i,{...f,mode:d},s)}if(d==="rollback"){const f=m.rollbackTransaction(r==null?void 0:r.reason);return this.session.timeline.record("MUTATION_UNDONE",`transaction ${f.transactionId} rolled back`),this.success(n,i,{...f,mode:d},s)}return this.error(n,i,"INVALID_MODE",`mode must be begin|commit|rollback, got "${d}"`,s)}catch(f){return this.error(n,i,"DOM_MUTATION_FAILED",f.message,s)}}case"UNDO_DOM_MUTATION":{const d=this.getMutationEngine(t).undo();return d.success&&this.session.timeline.record("MUTATION_UNDONE",d.message),this.success(n,i,d,s)}case"REDO_DOM_MUTATION":{const d=this.getMutationEngine(t).redo();return d.success&&this.session.timeline.record("MUTATION_REDONE",d.message),this.success(n,i,d,s)}case"GET_MUTATION_HISTORY":{const m=this.getMutationEngine(t);return this.success(n,i,{entries:m.getHistory((r==null?void 0:r.limit)||100),undoDepth:m.getUndoDepth(),redoDepth:m.getRedoDepth(),openTransactionId:m.getOpenTransactionId()},s)}case"PREVIEW_DOM_MUTATION":{const d=this.getMutationEngine(t).preview(r);return this.success(n,i,d,s)}case"GENERATE_ELEMENT_TARGET":{const d=this.getTargetingEngine(t).resolveAndBuild((r==null?void 0:r.target)||(r==null?void 0:r.selector)||"");return"error"in d?this.error(n,i,"TARGET_NOT_FOUND",d.error,s):this.success(n,i,d.target,s)}case"RECOVER_SELECTOR":{const m=new nt(t),d=(r==null?void 0:r.snapshot)||{},f=m.recover((r==null?void 0:r.selector)||"",d);return this.success(n,i,f,s)}case"GET_ELEMENT_ANCESTRY":{const m=this.resolveTarget(r,t);return this.success(n,i,Lt(m,t),s)}case"GET_ELEMENT_FINGERPRINT":{const m=this.resolveTarget(r,t),d=this.fingerprintEngine.fingerprint(m);return this.success(n,i,d,s)}case"GET_ELEMENT_RELATIONSHIPS":{const m=this.resolveTarget(r,t);return this.success(n,i,Dt(m,t),s)}case"GET_ELEMENT_ACCESSIBILITY":{const m=this.resolveTarget(r,t);return this.success(n,i,$t(m),s)}case"GET_COMPUTED_STYLE":{const m=this.resolveTarget(r,t),d=t.defaultView;if(!(d!=null&&d.getComputedStyle))return this.error(n,i,"STYLE_UNAVAILABLE","getComputedStyle is unavailable in this context.",s);const f=d.getComputedStyle(m),w=Array.isArray(r==null?void 0:r.properties)&&r.properties.length?r.properties:["display","position","color","background-color","font-size","font-family","width","height","margin","padding","border","z-index","opacity","visibility","overflow","flex-direction","grid-template-columns"],E={};for(const S of w)E[S]=f.getPropertyValue(S);return this.success(n,i,{selector:k.inspectElement(m,this.nodeRegistry).bestSelector,styles:E},s)}case"ANALYZE_DOM":{const m=String((r==null?void 0:r.analyzer)||"");if(!m)return this.error(n,i,"ANALYZER_REQUIRED",'payload.analyzer is required (e.g. "analyze_forms").',s);const d=Et(m,t,r);return d.count===0&&d.warnings.length===0&&d.items.length===0&&d.summary.startsWith("Unknown analyzer")?this.error(n,i,"UNKNOWN_ANALYZER",d.summary,s):this.success(n,i,d,s)}case"DRAG_ELEMENT":{const m=this.resolveTarget(r==null?void 0:r.source,t),d=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):null,f=await this.performDrag(m,d,r==null?void 0:r.offsets,t);return this.success(n,i,f,s)}case"SET_INPUT_CHECKED":{const d=this.resolveTarget(r,t);if(d.type!=="checkbox"&&d.type!=="radio")return this.error(n,i,"INPUT_TYPE_UNSUPPORTED",`Target input type "${d.type}" is not checkbox/radio.`,s);const f=d.checked;d.checked=(r==null?void 0:r.checked)!==!1;const w=[];for(const E of["input","change"])try{d.dispatchEvent(new t.defaultView.Event(E,{bubbles:!0})),w.push(E)}catch{}if(d.type==="radio"&&d.name)for(const E of Array.from(t.querySelectorAll(`input[type=radio][name="${d.name}"]`)))E!==d&&(E.checked=!1);return this.success(n,i,{success:!0,selector:k.inspectElement(d,this.nodeRegistry).bestSelector,inputType:d.type,checkedBefore:f,checkedAfter:d.checked,eventsFired:w},s)}case"PRESS_KEYBOARD_SHORTCUT":{const m=Array.isArray(r==null?void 0:r.keys)?r.keys:String((r==null?void 0:r.keys)||"Enter").split("+"),d=r!=null&&r.target?this.resolveTarget(r==null?void 0:r.target,t):t.activeElement||t.body;typeof d.focus=="function"&&d.focus();const f=[],w=t.defaultView;for(const E of m)for(const S of["keydown","keyup"])try{d.dispatchEvent(new((w==null?void 0:w.KeyboardEvent)||KeyboardEvent)(S,{key:E.trim(),bubbles:!0,cancelable:!0,ctrlKey:m.some(T=>/^(ctrl|control|cmd|meta)$/i.test(T))&&E!==m.find(T=>/^(ctrl|control|cmd|meta)$/i.test(T)),shiftKey:m.some(T=>/^shift$/i.test(T))&&E!=="Shift",altKey:m.some(T=>/^alt$/i.test(T))&&E!=="Alt"})),f.push(`${S}:${E}`)}catch{}return this.success(n,i,{success:!0,keys:m,targetSelector:k.inspectElement(d,this.nodeRegistry).bestSelector,eventsFired:f},s)}case"SCROLL_PAGE":{const m=t.defaultView;if(!m)return this.error(n,i,"NO_WINDOW","No window available for scrolling.",s);const d={x:m.scrollX||0,y:m.scrollY||0};let f;if(r!=null&&r.target||r!=null&&r.selector){const E=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t);(v=E.scrollIntoView)==null||v.call(E,{behavior:(r==null?void 0:r.behavior)||"auto",block:"center"}),f=k.inspectElement(E,this.nodeRegistry).bestSelector}else m.scrollBy(Number(r==null?void 0:r.x)||0,Number(r==null?void 0:r.y)||0);const w={x:m.scrollX||0,y:m.scrollY||0};return this.success(n,i,{success:!0,scrollBefore:d,scrollAfter:w,requested:{x:Number(r==null?void 0:r.x)||0,y:Number(r==null?void 0:r.y)||0},targetSelector:f},s)}case"WAIT_FOR_CONDITION":return await this.waitForCondition(t,r||{},s,n,i);case"GET_PAGE_STATE":case"CAPTURE_PAGE_STATE":{const m=this.session.captureSnapshot(t,!0,this.getMutationEngine(t).getUndoDepth());return this.success(n,i,m,s)}case"CAPTURE_REGION":{const m=this.resolveTarget((r==null?void 0:r.target)||(r==null?void 0:r.selector),t),d=this.regionCapture.capture(m);return this.success(n,i,d,s)}case"GET_SIMULATION_TAB_STATE":return this.isSimulation()?this.success(n,i,{simulated:!0,tabs:this.simulationTabs,sessionSummary:this.session.getTabs()},s):this.error(n,i,"NOT_SIMULATION","Simulation tab state is only available in the Node simulation context.",s);default:return this.error(n,i,"UNKNOWN_COMMAND",`Unsupported command '${i}'`,s)}}catch(m){return this.error(n,i,"COMMAND_EXECUTION_FAILED",m.message,s,m.details)}}resolveTarget(e,t){if(!e)throw new Error("Target specifier must be provided");return typeof e=="string"?this.interactionEngine.resolveTarget({selector:e},t):typeof e=="number"?this.interactionEngine.resolveTarget({nodeId:e},t):this.interactionEngine.resolveTarget(e,t)}async performDrag(e,t,s,n){const i=n.defaultView,r=[],o=(p,y,v={})=>{try{const m=(i==null?void 0:i.MouseEvent)||(typeof MouseEvent<"u"?MouseEvent:null);m&&(p.dispatchEvent(new m(y,{bubbles:!0,cancelable:!0,...v})),r.push(y))}catch{}},a=e.getBoundingClientRect(),c=a.x+a.width/2,u=a.y+a.height/2;let h=c+((s==null?void 0:s.x)||0),g=u+((s==null?void 0:s.y)||0);if(t){const p=t.getBoundingClientRect();h=p.x+p.width/2,g=p.y+p.height/2}return o(e,"pointerdown",{button:1,clientX:c,clientY:u}),o(e,"mousedown",{button:1,clientX:c,clientY:u}),o(e,"dragstart",{clientX:c,clientY:u}),t&&(o(t,"dragenter",{clientX:h,clientY:g}),o(t,"dragover",{clientX:h,clientY:g}),o(t,"drop",{clientX:h,clientY:g})),o(e,"dragend",{clientX:h,clientY:g}),o(e,"pointerup",{button:1,clientX:h,clientY:g}),o(e,"mouseup",{button:1,clientX:h,clientY:g}),{success:r.length>0,sourceSelector:k.inspectElement(e,this.nodeRegistry).bestSelector,targetSelector:t?k.inspectElement(t,this.nodeRegistry).bestSelector:"(offset drop)",eventsFired:r,finalPosition:{x:Math.round(h),y:Math.round(g)},html5DndUsed:r.includes("dragstart")}}async waitForCondition(e,t,s,n,i){var p,y;const r=t.kind||"dom_stable",o=Math.min(Math.max(Number(t.timeoutMs)||5e3,100),3e4),a=Math.min(Math.max(Number(t.pollIntervalMs)||100,20),1e3),c=Date.now(),u=()=>{var v,m,d,f,w;switch(r){case"dom_stable":return{satisfied:!0,detail:`dom length ${((v=e.documentElement)==null?void 0:v.outerHTML.length)||0}`};case"selector_present":{const E=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:E>0,detail:`"${t.selector}" matches ${E} element(s)`}}case"selector_visible":{if(!t.selector)return{satisfied:!1,detail:"no selector supplied"};const E=e.querySelector(t.selector);if(!E)return{satisfied:!1,detail:`"${t.selector}" not present`};try{const S=k.inspectElement(E).visibility.isVisible;return{satisfied:S,detail:`visibility=${S}`}}catch{return{satisfied:!1,detail:"inspection failed"}}}case"selector_absent":{const E=t.selector?e.querySelectorAll(t.selector).length:0;return{satisfied:E===0,detail:`"${t.selector}" matches ${E} element(s)`}}case"text_present":{const E=((m=e.body)==null?void 0:m.innerText)||((d=e.body)==null?void 0:d.textContent)||"",S=t.text?E.includes(String(t.text)):!1;return{satisfied:S,detail:`text "${String(t.text).slice(0,30)}" ${S?"found":"not found"}`}}case"url_contains":{const E=((w=(f=e.defaultView)==null?void 0:f.location)==null?void 0:w.href)||"";return{satisfied:t.text?E.includes(String(t.text)):!1,detail:E}}case"element_count":{const E=t.selector?e.querySelectorAll(t.selector).length:0,S=Number(t.count)||0;return{satisfied:E===S,detail:`${E}/${S} elements`}}case"readiness_state":return{satisfied:e.readyState===(t.state||"complete"),detail:`readyState=${e.readyState}`};default:return{satisfied:!1,detail:`unknown condition kind "${r}"`}}};if(r==="dom_stable"){let v=((p=e.documentElement)==null?void 0:p.outerHTML.length)||0,m=!1,d=0;for(;Date.now()-csetTimeout(E,a));const w=((y=e.documentElement)==null?void 0:y.outerHTML.length)||0;if(d++,w===v){m=!0;break}v=w}const f=Date.now()-c;return m&&this.session.timeline.record("WAIT_SATISFIED",`dom_stable after ${f}ms (${d} polls)`),this.success(n,i,{satisfied:m,condition:r,waitedMs:f,timeoutMs:o,detail:`dom length ${v}, ${d} polls`},s)}let h=u();for(;!h.satisfied&&Date.now()-csetTimeout(v,a)),h=u();const g=Date.now()-c;return h.satisfied&&this.session.timeline.record("WAIT_SATISFIED",`${r} after ${g}ms`),this.success(n,i,{satisfied:h.satisfied,condition:r,waitedMs:g,timeoutMs:o,detail:h.detail},s)}simulationCloseTab(e,t,s,n,i){const r=Number(e==null?void 0:e.tabId),o=Number.isFinite(r)?this.simulationTabs.findIndex(c=>c.browserTabId===r):this.simulationTabs.findIndex(c=>c.active);if(o<0)return this.error(s,n,"TAB_NOT_FOUND",`No simulated tab matches tabId=${r}`,i);const a=this.simulationTabs.splice(o,1)[0];return this.session.closeTab(a.sessionTabId),a.active&&this.simulationTabs.length&&(this.simulationTabs[0].active=!0,this.session.switchTab(this.simulationTabs[0].sessionTabId)),this.success(s,n,{closed:!0,closedTab:{id:a.browserTabId,url:a.url,title:a.title},simulated:!0,remaining:this.simulationTabs.length},i)}handleSimulationBackgroundCommand(e,t,s,n,i){const r=()=>{var o,a;if(!this.simulationTabs.length){this.simulationTabCounter++;const c={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:((a=(o=n.defaultView)==null?void 0:o.location)==null?void 0:a.href)||"about:blank",title:n.title||"Simulated Tab",active:!0,createdAt:Date.now()};this.simulationTabs.push(c),this.session.registerTab(c.browserTabId,c.url,c.title),this.session.switchTab(c.sessionTabId)}};switch(t){case"LIST_TABS":return r(),this.success(e,t,{simulated:!0,environment:"node-simulation",tabs:this.simulationTabs.map((o,a)=>({id:o.browserTabId,index:a,windowId:1,title:o.title,url:o.url,active:o.active,status:"complete",pinned:!1,audited:!1})),note:"Deterministic simulated tab state — a real browser tab list requires the Chrome extension connection."},i);case"OPEN_TAB":{const o=String((s==null?void 0:s.url)||"about:blank");this.simulationTabCounter++;const a={sessionTabId:`stab_${this.simulationTabCounter}`,browserTabId:this.simulationTabCounter,url:o,title:(s==null?void 0:s.title)||`Simulated Tab ${this.simulationTabCounter}`,active:!0,createdAt:Date.now()};this.simulationTabs.forEach(u=>u.active=!1),this.simulationTabs.push(a);const c=this.session.registerTab(a.browserTabId,o,a.title);return this.session.switchTab(c.sessionTabId),this.session.timeline.record("TAB_OPENED",`simulation tab ${a.browserTabId} → ${o}`),this.success(e,t,{opened:!0,tabId:a.browserTabId,url:o,simulated:!0,totalTabs:this.simulationTabs.length},i)}case"FOCUS_TAB":{r();const o=Number(s==null?void 0:s.tabId),a=this.simulationTabs.find(c=>c.browserTabId===o)||this.simulationTabs[0];return a?(this.simulationTabs.forEach(c=>c.active=!1),a.active=!0,this.session.switchTab(a.sessionTabId),this.session.timeline.record("TAB_SWITCHED",`simulation tab ${a.browserTabId} focused`),this.success(e,t,{focused:!0,tabId:a.browserTabId,url:a.url,simulated:!0},i)):this.error(e,t,"TAB_NOT_FOUND",`No simulated tab with tabId=${o}`,i)}case"LIST_EXTENSIONS":return this.success(e,t,{simulated:!0,extensions:this.simulationExtensions.map(o=>({...o,permissions:["activeTab","scripting","storage","tabs","management"]})),note:"Deterministic simulated extension state."},i);case"SET_EXTENSION_ENABLED":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!!(s!=null&&s.enabled),this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}". Known: ${this.simulationExtensions.map(c=>c.id).join(", ")}`,i)}case"TOGGLE_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||""),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?(a.enabled=!a.enabled,this.session.timeline.record("EXTENSION_STATE_CHANGED",`${a.id} → ${a.enabled?"enabled":"disabled"}`),this.success(e,t,{extensionId:a.id,enabled:a.enabled,simulated:!0},i)):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}case"RELOAD_EXTENSION":{const o=String((s==null?void 0:s.extensionId)||this.simulationExtensions[0].id),a=this.simulationExtensions.find(c=>c.id===o||c.name.toLowerCase().includes(o.toLowerCase()));return a?this.success(e,t,{reloaded:!0,extensionId:a.id,simulated:!0,note:"Simulated reload: extension state preserved."},i):this.error(e,t,"EXTENSION_NOT_FOUND",`No simulated extension matches "${o}".`,i)}default:return this.error(e,t,"UNKNOWN_COMMAND",`Unhandled simulation command '${t}'`,i)}}async handleScreenshotCapture(e,t,s){var y,v,m,d,f;const n=s.defaultView||(typeof window<"u"?window:{}),i=Date.now(),r=`scr_${i}_${Math.random().toString(36).slice(2,6)}`,o=n.devicePixelRatio||1,a={width:n.innerWidth||((y=s.documentElement)==null?void 0:y.clientWidth)||1920,height:n.innerHeight||((v=s.documentElement)==null?void 0:v.clientHeight)||1080,scrollX:n.scrollX||n.pageXOffset||0,scrollY:n.scrollY||n.pageYOffset||0,devicePixelRatio:o};let c,u,h,g={width:a.width,height:a.height};if(e==="LIVE_ELEMENT_SCREENSHOT"){const w=this.resolveTarget(t,s),E=k.inspectElement(w,this.nodeRegistry);c=E.bestSelector,u=((m=E.forensics)==null?void 0:m.logicalNodeId)||void 0,h={x:E.bounds.x,y:E.bounds.y,width:E.bounds.width,height:E.bounds.height},g={width:Math.max(1,Math.round(E.bounds.width*o)),height:Math.max(1,Math.round(E.bounds.height*o))}}let p=(t==null?void 0:t.dataUrl)||"";if(e==="LIVE_ELEMENT_SCREENSHOT"&&p&&h&&typeof Image<"u")try{const w=await new Promise(E=>{const S=new Image;S.onload=()=>{try{const T=s.createElement("canvas"),x=Math.max(0,Math.floor(h.x*o)),N=Math.max(0,Math.floor(h.y*o)),D=Math.max(1,Math.floor(h.width*o)),M=Math.max(1,Math.floor(h.height*o));T.width=D,T.height=M;const L=T.getContext("2d");if(L){L.drawImage(S,x,N,D,M,0,0,D,M),E(T.toDataURL("image/png"));return}}catch{}E(p)},S.onerror=()=>E(p),S.src=p});w&&(p=w)}catch{}if(!p){const w=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(120,g.width||320):Math.max(800,a.width||1280),E=e==="LIVE_ELEMENT_SCREENSHOT"?Math.max(60,g.height||180):Math.max(600,a.height||800);p=ge.createDataUrl({width:w,height:E,backgroundColor:e==="LIVE_ELEMENT_SCREENSHOT"?[30,41,59,255]:[15,23,42,255],headerColor:[56,189,248,255],borderColor:[99,102,241,255],label:c||(e==="LIVE_ELEMENT_SCREENSHOT"?"Element Screenshot":"Page Screenshot")})}return{screenshotId:r,timestamp:i,url:((d=n.location)==null?void 0:d.href)||((f=s.location)==null?void 0:f.href)||"",viewport:a,targetSelector:c,targetNodeId:u,targetBounds:h,dataUrl:p,imageFormat:"png",dimensions:g,captureType:e==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}}success(e,t,s,n){return{id:e,command:t,success:!0,data:s,timestamp:Date.now(),durationMs:Date.now()-n}}error(e,t,s,n,i,r){return{id:e,command:t,success:!1,error:{code:s,message:n,details:r},timestamp:Date.now(),durationMs:Date.now()-i}}}function Lt(l,e){const t=[];let s=l.parentElement,n=1;for(;s&&n<=10;){const h=s.parentElement,g=h?Array.from(h.children).filter(p=>p.tagName===s.tagName):[];t.push({tag:s.tagName.toLowerCase(),selector:U(s),role:s.getAttribute("role")||void 0,text:B(s).slice(0,40),childIndex:g.length?g.indexOf(s)+1:1,siblingCount:h?Array.from(h.children).length:0,distance:n}),s=s.parentElement,n++}const i=l.parentElement,r=[];if(i){const h=Array.from(i.children),g=h.indexOf(l);for(let p=g-1;p>=0&&p>=g-5;p--)r.push({tag:h[p].tagName.toLowerCase(),selector:U(h[p]),role:h[p].getAttribute("role")||void 0,text:B(h[p]).slice(0,30),position:"before",distance:g-p});for(let p=g+1;p{o=Math.max(o,g);for(const p of Array.from(h.children))a.push(p.tagName.toLowerCase()),p.matches('a[href], button, input, select, textarea, [role="button"], [onclick]')&&c.push(U(p)),g<6&&u(p,g+1)};return u(l,1),{selector:U(l),ancestors:t,siblings:r,descendants:{count:l.querySelectorAll("*").length,maxDepth:o,tags:Array.from(new Set(a)).slice(0,30),interactive:c.slice(0,30)}}}function Dt(l,e){const t=[{id:"self",selector:U(l),tag:l.tagName.toLowerCase(),role:l.getAttribute("role")||void 0,label:B(l).slice(0,30)||l.tagName.toLowerCase(),relationship:"self",depth:0}],s=[];let n=l.parentElement,i=1;for(;n&&i<=4;){const o=`ancestor_${i}`;t.push({id:o,selector:U(n),tag:n.tagName.toLowerCase(),role:n.getAttribute("role")||void 0,label:B(n).slice(0,30)||n.tagName.toLowerCase(),relationship:"parent",depth:i}),s.push({from:o,to:i===1?"self":`ancestor_${i-1}`,relation:"parent-of"}),n=n.parentElement,i++}for(const o of Array.from(l.children).slice(0,12)){const a=`child_${t.length}`;t.push({id:a,selector:U(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:B(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"child",depth:1}),s.push({from:"self",to:a,relation:"contains"})}const r=l.parentElement;if(r)for(const o of Array.from(r.children).slice(0,12)){if(o===l)continue;const a=`sibling_${t.length}`;t.push({id:a,selector:U(o),tag:o.tagName.toLowerCase(),role:o.getAttribute("role")||void 0,label:B(o).slice(0,30)||o.tagName.toLowerCase(),relationship:"sibling",depth:1}),s.push({from:"self",to:a,relation:"sibling-of"})}return{rootSelector:U(l),nodes:t,edges:s}}function $t(l){const e={};for(const v of Array.from(l.attributes))v.name.startsWith("aria-")&&(e[v.name]=v.value);const t=B(l).trim(),s=l.getAttribute("aria-label"),n=l.getAttribute("aria-labelledby");let i;n&&(i=n.split(/\s+/).map(m=>{var d,f,w;return(w=(f=(d=l.ownerDocument)==null?void 0:d.getElementById(m))==null?void 0:f.textContent)==null?void 0:w.trim()}).filter(Boolean).join(" ").slice(0,60)||void 0);const r=l.getAttribute("title"),o=l.tagName.toLowerCase(),a=[];let c="";s?(c=s,a.push("aria-label")):i?(c=i,a.push("aria-labelledby")):t?(c=t.slice(0,60),a.push("text content")):r&&(c=r,a.push("title"));const u=[];(l.disabled||l.hasAttribute("disabled"))&&u.push("disabled"),l.checked&&u.push("checked");const h=l;h.tagName==="SELECT"&&typeof h.selectedOptions<"u"&&h.selectedOptions.length>0&&u.push("selected"),l.getAttribute("aria-expanded")&&u.push(`expanded=${l.getAttribute("aria-expanded")}`),l.getAttribute("aria-pressed")&&u.push(`pressed=${l.getAttribute("aria-pressed")}`),l.getAttribute("aria-hidden")==="true"&&u.push("hidden"),l.hasAttribute("required")&&u.push("required"),l.readOnly&&u.push("readonly");const g=["a[href]","button","input","select","textarea","[tabindex]"].some(v=>{try{return l.matches(v)}catch{return!1}}),p=[];!c&&g&&p.push("Focusable element has no accessible name."),o==="img"&&!l.hasAttribute("alt")&&p.push("Image has no alt attribute.");const y=/^h([1-6])$/.exec(o);return y&&!t&&p.push(`Heading h${y[1]} is empty.`),{selector:U(l),role:l.getAttribute("role")||void 0,implicitRole:qt(l),name:c,nameSources:a,description:l.getAttribute("aria-describedby")||void 0,value:l.value!==void 0&&(l.getAttribute("type")||"text")!=="password"?String(l.value).slice(0,40):void 0,states:u,level:y?parseInt(y[1],10):void 0,focusable:g,tabIndex:l.tabIndex,ariaAttributes:e,issues:p}}function qt(l){switch(l.tagName.toLowerCase()){case"a":return l.getAttribute("href")?"link":void 0;case"button":return"button";case"nav":return"navigation";case"header":return"banner";case"footer":return"contentinfo";case"main":return"main";case"aside":return"complementary";case"article":return"article";case"form":return"form";case"input":{const t=l.getAttribute("type")||"text";return{checkbox:"checkbox",radio:"radio",button:"button",submit:"button",reset:"button",range:"slider",search:"searchbox",email:"textbox",text:"textbox",password:"textbox",tel:"textbox",url:"textbox",number:"spinbutton"}[t]||"textbox"}case"select":return l.hasAttribute("multiple")?"listbox":"combobox";case"textarea":return"textbox";case"img":return"img";case"table":return"table";case"ul":case"ol":return"list";case"li":return"listitem";case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";case"dialog":return"dialog";default:return}}function U(l){const e=l.getAttribute("id");if(e&&/^[a-zA-Z][\w-]*$/.test(e))return`#${e}`;const t=l.getAttribute("data-testid");if(t)return`${l.tagName.toLowerCase()}[data-testid="${t}"]`;const s=l.tagName.toLowerCase(),n=Array.from(l.classList||[]).slice(0,2);return n.length?`${s}.${n.join(".")}`:s}function B(l){return Array.from(l.childNodes).filter(e=>e.nodeType===3).map(e=>(e.textContent||"").trim()).join(" ").replace(/\s+/g," ")}function Pt(){return[{label:"desktop-1440x900",width:1440,height:900},{label:"laptop-1024x768",width:1024,height:768},{label:"tablet-768x1024",width:768,height:1024},{label:"mobile-375x667",width:375,height:667}]}class Ut{constructor(e){b(this,"hostElement",null);b(this,"shadowRoot",null);b(this,"callbacks");b(this,"isRecording",!1);b(this,"isPaused",!1);b(this,"isMinimized",!1);b(this,"startTime",0);b(this,"eventCount",0);b(this,"timerInterval",null);b(this,"isDragging",!1);b(this,"dragStartX",0);b(this,"dragStartY",0);b(this,"posX",window.innerWidth-340);b(this,"posY",40);this.callbacks=e,this.loadPosition()}mount(){this.hostElement&&document.body.contains(this.hostElement)||(this.hostElement=document.createElement("div"),this.hostElement.id="forensic-recorder-floating-host",this.hostElement.style.all="initial",this.hostElement.style.position="fixed",this.hostElement.style.zIndex="2147483647",this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`,this.shadowRoot=this.hostElement.attachShadow({mode:"open"}),this.render(),this.attachEvents(),(document.body||document.documentElement).appendChild(this.hostElement))}unmount(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null),this.hostElement&&this.hostElement.parentNode&&this.hostElement.parentNode.removeChild(this.hostElement),this.hostElement=null,this.shadowRoot=null}hide(){this.hostElement&&(this.hostElement.style.setProperty("display","none","important"),this.hostElement.style.setProperty("visibility","hidden","important"),this.hostElement.style.setProperty("opacity","0","important"))}show(){this.hostElement&&(this.hostElement.style.removeProperty("display"),this.hostElement.style.removeProperty("visibility"),this.hostElement.style.removeProperty("opacity"))}updateState(e,t=!1,s=0,n=0){this.isRecording=e,this.isPaused=t,this.startTime=s||(e?Date.now():0),this.eventCount=n,this.shadowRoot&&(this.render(),this.attachEvents()),this.isRecording&&!this.isPaused?this.startTimer():this.stopTimer()}incrementEventCount(){var t;this.eventCount++;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#evt-badge");e&&(e.textContent=`${this.eventCount} evts`)}startTimer(){this.stopTimer(),this.timerInterval=setInterval(()=>{var t;const e=(t=this.shadowRoot)==null?void 0:t.querySelector("#timer-display");if(e&&this.startTime){const s=(Date.now()-this.startTime)/1e3,n=Math.floor(s/60).toString().padStart(2,"0"),i=(s%60).toFixed(1).padStart(4,"0");e.textContent=`${n}:${i}`}},200)}stopTimer(){this.timerInterval&&(clearInterval(this.timerInterval),this.timerInterval=null)}savePosition(){try{sessionStorage.setItem("forensic_overlay_pos",JSON.stringify({x:this.posX,y:this.posY,min:this.isMinimized}))}catch{}}loadPosition(){try{const e=sessionStorage.getItem("forensic_overlay_pos");if(e){const t=JSON.parse(e);this.posX=Math.max(10,Math.min(window.innerWidth-300,t.x||this.posX)),this.posY=Math.max(10,Math.min(window.innerHeight-150,t.y||this.posY)),this.isMinimized=!!t.min}}catch{}}render(){if(!this.shadowRoot)return;const e=` :host { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 12px; @@ -288,4 +288,4 @@ ${t}
- `}attachEvents(){if(!this.shadowRoot)return;const e=this.shadowRoot.querySelector("#drag-header");e&&e.addEventListener("mousedown",c=>{this.isDragging=!0,this.dragStartX=c.clientX-this.posX,this.dragStartY=c.clientY-this.posY;const u=h=>{!this.isDragging||!this.hostElement||(this.posX=Math.max(10,Math.min(window.innerWidth-80,h.clientX-this.dragStartX)),this.posY=Math.max(10,Math.min(window.innerHeight-50,h.clientY-this.dragStartY)),this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`)},d=()=>{this.isDragging=!1,window.removeEventListener("mousemove",u),window.removeEventListener("mouseup",d),this.savePosition()};window.addEventListener("mousemove",u),window.addEventListener("mouseup",d)});const t=this.shadowRoot.querySelector("#btn-toggle-min");t==null||t.addEventListener("click",()=>{this.isMinimized=!this.isMinimized,this.savePosition(),this.render(),this.attachEvents()});const s=this.shadowRoot.querySelector("#btn-close");s==null||s.addEventListener("click",()=>{this.unmount()});const n=this.shadowRoot.querySelector("#btn-record");n==null||n.addEventListener("click",()=>{this.isRecording?this.callbacks.onStopRecord():this.callbacks.onStartRecord()});const i=this.shadowRoot.querySelector("#btn-checkpoint");i==null||i.addEventListener("click",()=>{if(this.callbacks.onCaptureCheckpoint(),i){const c=i.textContent;i.textContent="✔ Saved!",setTimeout(()=>i.textContent=c,1e3)}});const r=this.shadowRoot.querySelector("#btn-inspect");r==null||r.addEventListener("click",()=>{this.callbacks.onInspectElement()});const o=this.shadowRoot.querySelector("#btn-annotate");o==null||o.addEventListener("click",()=>{const c=prompt("Enter observation, bug note, or hypothesis at this exact moment:");c&&c.trim()&&this.callbacks.onAddAnnotation(c.trim())});const a=this.shadowRoot.querySelector("#btn-dashboard");a==null||a.addEventListener("click",()=>{this.callbacks.onOpenDashboard()})}}(function(){var w;let l=null;const e=new Lt;let t=[],s=null,n=null,i=!1;const r=500,o=[],a=[];window.addEventListener("message",E=>{var C;if(((C=E.data)==null?void 0:C._forensicOrigin)==="PAGE_MAIN"){const{type:N,payload:I}=E.data;if(N==="CONSOLE_ENTRY")o.push(I),o.length>r&&o.shift();else if(N==="NETWORK_ENTRY"){const R=a.findIndex(x=>x.requestId===I.requestId);R>=0?a[R]={...a[R],...I}:(a.push(I),a.length>r&&a.shift())}}});function c(){var E;try{if(typeof chrome<"u"&&((E=chrome.runtime)!=null&&E.getURL)){const C=document.createElement("script");C.src=chrome.runtime.getURL("dist/extension/page-script.js"),C.onload=()=>C.remove(),(document.head||document.documentElement).appendChild(C)}}catch{}}function u(){var C;if(t.length===0||!l)return;const E=[...t];t=[];try{typeof chrome<"u"&&((C=chrome.runtime)!=null&&C.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_EVENTS_CHUNK",sessionId:l.getSessionId(),events:E})}catch{}}function d(E,C,N){var R;if(l)return l.getMetadata();l=new Le({sessionId:C,sessionName:E||`Recording on ${document.title||window.location.hostname}`}),l.onEvent(x=>{t.push(x),n&&n.incrementEventCount(),t.length>=25&&u()}),l.onCheckpoint(x=>{var q;try{typeof chrome<"u"&&((q=chrome.runtime)!=null&&q.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_CHECKPOINT",sessionId:x.sessionId,checkpoint:x})}catch{}});const I=l.start(document);try{typeof chrome<"u"&&((R=chrome.runtime)!=null&&R.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_START",metadata:l.getMetadata(),initialSnapshot:I})}catch{}return s||(s=setInterval(u,1e3)),n&&n.updateState(!0,!1,N||Date.now(),0),l.getMetadata()}function h(){var N;if(!l)return null;u(),s&&(clearInterval(s),s=null);const E=l.stop();try{typeof chrome<"u"&&((N=chrome.runtime)!=null&&N.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_STOP",sessionId:E.id,metadata:E})}catch{}const C={...E};return l=null,n&&n.updateState(!1,!1,0,0),C}function p(){if(i){i=!1,document.body.style.cursor="default";return}i=!0,document.body.style.cursor="crosshair";const E=document.createElement("div");E.id="forensic-inspect-highlighter",E.style.position="fixed",E.style.pointerEvents="none",E.style.zIndex="2147483640",E.style.border="2px dashed #38bdf8",E.style.background="rgba(56, 189, 248, 0.15)",E.style.transition="all 0.05s ease",document.body.appendChild(E);const C=I=>{if(!i)return;const R=I.target;if(!R||R.id==="forensic-recorder-floating-host"||R.closest("#forensic-recorder-floating-host")){E.style.display="none";return}const x=R.getBoundingClientRect();E.style.display="block",E.style.left=`${x.left}px`,E.style.top=`${x.top}px`,E.style.width=`${x.width}px`,E.style.height=`${x.height}px`},N=I=>{if(!i)return;const R=I.target;if(!R.closest("#forensic-recorder-floating-host")&&(I.preventDefault(),I.stopPropagation(),i=!1,document.body.style.cursor="default",E.remove(),window.removeEventListener("mousemove",C,!0),window.removeEventListener("click",N,!0),l)){const x=R.id?`#${R.id}`:R.className?`.${R.className.split(" ")[0]}`:R.tagName.toLowerCase();l.addAnnotation("Inspect Element",`Inspected element <${R.tagName.toLowerCase()}> with selector '${x}'`,"USER"),alert(`🎯 Inspected element <${R.tagName.toLowerCase()}> recorded! Checkpoint saved.`)}};window.addEventListener("mousemove",C,!0),window.addEventListener("click",N,!0)}function y(){return n||(n=new Ht({onStartRecord:()=>{d()},onStopRecord:()=>{h()},onTogglePause:()=>{l&&(l.getMetadata().status==="recording"?l.pause():l.resume())},onCaptureCheckpoint:()=>{l&&l.captureCheckpoint("MANUAL",document)},onAddAnnotation:E=>{l&&l.addAnnotation("User Note",E,"USER")},onInspectElement:()=>{p()},onOpenDashboard:()=>{const E=l?l.getSessionId():void 0;chrome.runtime.sendMessage({type:"OPEN_DASHBOARD_TAB",sessionId:E})}})),n}function v(){var E;try{typeof chrome<"u"&&((E=chrome.runtime)!=null&&E.sendMessage)&&chrome.runtime.sendMessage({type:"GET_TAB_RECORDING_STATE"},C=>{chrome.runtime.lastError||!C||C.isRecording&&C.recording&&(y().mount(),d(C.recording.sessionName,C.recording.sessionId,C.recording.startTime))})}catch{}}typeof chrome<"u"&&((w=chrome.runtime)!=null&&w.onMessage)&&chrome.runtime.onMessage.addListener((E,C,N)=>{if(E.type==="HIDE_FORENSIC_OVERLAYS")return n&&n.hide(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(R=>{const x=R;x.style.setProperty("display","none","important"),x.style.setProperty("visibility","hidden","important"),x.style.setProperty("opacity","0","important")}),N({success:!0}),!0;if(E.type==="RESTORE_FORENSIC_OVERLAYS")return n&&n.show(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(R=>{const x=R;x.style.removeProperty("display"),x.style.removeProperty("visibility"),x.style.removeProperty("opacity")}),N({success:!0}),!0;if(E.type==="BROWSER_COMMAND_REQUEST"){if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","CLOSE_TAB","OPEN_TAB","RESIZE_VIEWPORT","RESET_VIEWPORT"].includes(E.command))return!1;if(E.command==="GET_TAB_CONSOLE_LOGS"){const{level:I,searchQuery:R,limit:x=100,clearAfterRead:q}=E.payload||{};let A=[...o];if(I&&I!=="all"&&(A=A.filter(S=>S.level===I)),R){const S=String(R).toLowerCase();A=A.filter(M=>{var O,_;return((O=M.text)==null?void 0:O.toLowerCase().includes(S))||((_=M.source)==null?void 0:_.toLowerCase().includes(S))})}return x>0&&(A=A.slice(-x)),q&&(o.length=0),N({id:E.id,command:E.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:o.length,returnedCount:A.length,logs:A}}),!0}if(E.command==="GET_TAB_NETWORK_REQUESTS"){const{method:I,searchQuery:R,status:x,onlyErrors:q,limit:A=100,clearAfterRead:S}=E.payload||{};let M=[...a];if(I&&(M=M.filter(O=>{var _;return((_=O.method)==null?void 0:_.toUpperCase())===String(I).toUpperCase()})),x&&(M=M.filter(O=>O.status===Number(x))),q&&(M=M.filter(O=>O.error||O.status&&O.status>=400)),R){const O=String(R).toLowerCase();M=M.filter(_=>{var P;return(P=_.url)==null?void 0:P.toLowerCase().includes(O)})}return A>0&&(M=M.slice(-A)),S&&(a.length=0),N({id:E.id,command:E.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:a.length,returnedCount:M.length,requests:M}}),!0}return e.handleCommand(E,document).then(I=>{N(I)}),!0}else if(E.type==="START_RECORDING"){const I=d(E.sessionName);y().mount(),N({success:!0,metadata:I})}else if(E.type==="STOP_RECORDING"){const I=h();N({success:!0,metadata:I})}else if(E.type==="TOGGLE_FLOATING_OVERLAY"){const I=y();document.getElementById("forensic-recorder-floating-host")?(I.unmount(),N({isOpen:!1})):(I.mount(),I.updateState((l==null?void 0:l.getMetadata().status)==="recording",!1,(l==null?void 0:l.getMetadata().startTime)||0,0),N({isOpen:!0}))}else if(E.type==="GET_RECORDER_STATUS")N({isRecording:(l==null?void 0:l.getMetadata().status)==="recording",metadata:(l==null?void 0:l.getMetadata())||null});else if(E.type==="CAPTURE_CHECKPOINT")if(l){const I=l.captureCheckpoint("MANUAL",document);N({success:!0,checkpoint:I})}else N({success:!1,error:"Not currently recording"});return!0});let m=null,g=null;function b(){if(!(typeof WebSocket>"u"))try{const E=new WebSocket("ws://127.0.0.1:3847");E.onopen=()=>{m=E,console.log("[Forensic ContentScript] Connected directly to MCP Bridge on ws://127.0.0.1:3847"),g&&(clearInterval(g),g=null),E.send(JSON.stringify({type:"REGISTER_CLIENT",clientType:"CONTENT_SCRIPT",url:window.location.href,title:document.title}))},E.onclose=()=>{m=null,T()},E.onerror=()=>{m=null,T()},E.onmessage=async C=>{var N;try{const I=JSON.parse(C.data.toString());if(I.type==="BROWSER_COMMAND_REQUEST"){const{id:R,command:x,payload:q}=I;if(["LIST_TABS","OPEN_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","CLOSE_TAB","FOCUS_TAB","RELOAD_TAB","RESIZE_VIEWPORT","RESET_VIEWPORT"].includes(x)){if(typeof chrome<"u"&&((N=chrome.runtime)!=null&&N.sendMessage)){chrome.runtime.sendMessage(I,S=>{if(chrome.runtime.lastError){if(x==="CLOSE_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{closed:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.close(),100);return}if(x==="RELOAD_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{reloaded:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.location.reload(),100);return}E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!1,error:{code:"FORWARD_ERROR",message:chrome.runtime.lastError.message}}))}else E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...S||{id:R,command:x,success:!0}}))});return}if(x==="CLOSE_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{closed:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.close(),100);return}if(x==="RELOAD_TAB"){E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{reloaded:!0,url:window.location.href,title:document.title}})),setTimeout(()=>window.location.reload(),100);return}}if(x==="GET_TAB_CONSOLE_LOGS"){const{level:S,searchQuery:M,limit:O=100,clearAfterRead:_}=q||{};let P=[...o];if(S&&S!=="all"&&(P=P.filter(H=>H.level===S)),M){const H=String(M).toLowerCase();P=P.filter($=>{var F,W;return((F=$.text)==null?void 0:F.toLowerCase().includes(H))||((W=$.source)==null?void 0:W.toLowerCase().includes(H))})}O>0&&(P=P.slice(-O)),_&&(o.length=0),E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:o.length,returnedCount:P.length,logs:P}}));return}if(x==="GET_TAB_NETWORK_REQUESTS"){const{method:S,searchQuery:M,status:O,onlyErrors:_,limit:P=100,clearAfterRead:H}=q||{};let $=[...a];if(S&&($=$.filter(F=>{var W;return((W=F.method)==null?void 0:W.toUpperCase())===String(S).toUpperCase()})),O&&($=$.filter(F=>F.status===Number(O))),_&&($=$.filter(F=>F.error||F.status&&F.status>=400)),M){const F=String(M).toLowerCase();$=$.filter(W=>{var te;return(te=W.url)==null?void 0:te.toLowerCase().includes(F)})}P>0&&($=$.slice(-P)),H&&(a.length=0),E.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:R,command:x,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:a.length,returnedCount:$.length,requests:$}}));return}const A=await e.handleCommand(I,document);E.send(JSON.stringify(A))}}catch(I){console.error("[Forensic ContentScript] Bridge message error:",I)}}}catch{m=null,T()}}function T(){g||(g=setInterval(()=>{(!m||m.readyState!==WebSocket.OPEN)&&b()},4e3))}c(),b(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v):v()})()})(); + `}attachEvents(){if(!this.shadowRoot)return;const e=this.shadowRoot.querySelector("#drag-header");e&&e.addEventListener("mousedown",c=>{this.isDragging=!0,this.dragStartX=c.clientX-this.posX,this.dragStartY=c.clientY-this.posY;const u=g=>{!this.isDragging||!this.hostElement||(this.posX=Math.max(10,Math.min(window.innerWidth-80,g.clientX-this.dragStartX)),this.posY=Math.max(10,Math.min(window.innerHeight-50,g.clientY-this.dragStartY)),this.hostElement.style.left=`${this.posX}px`,this.hostElement.style.top=`${this.posY}px`)},h=()=>{this.isDragging=!1,window.removeEventListener("mousemove",u),window.removeEventListener("mouseup",h),this.savePosition()};window.addEventListener("mousemove",u),window.addEventListener("mouseup",h)});const t=this.shadowRoot.querySelector("#btn-toggle-min");t==null||t.addEventListener("click",()=>{this.isMinimized=!this.isMinimized,this.savePosition(),this.render(),this.attachEvents()});const s=this.shadowRoot.querySelector("#btn-close");s==null||s.addEventListener("click",()=>{this.unmount()});const n=this.shadowRoot.querySelector("#btn-record");n==null||n.addEventListener("click",()=>{this.isRecording?this.callbacks.onStopRecord():this.callbacks.onStartRecord()});const i=this.shadowRoot.querySelector("#btn-checkpoint");i==null||i.addEventListener("click",()=>{if(this.callbacks.onCaptureCheckpoint(),i){const c=i.textContent;i.textContent="✔ Saved!",setTimeout(()=>i.textContent=c,1e3)}});const r=this.shadowRoot.querySelector("#btn-inspect");r==null||r.addEventListener("click",()=>{this.callbacks.onInspectElement()});const o=this.shadowRoot.querySelector("#btn-annotate");o==null||o.addEventListener("click",()=>{const c=prompt("Enter observation, bug note, or hypothesis at this exact moment:");c&&c.trim()&&this.callbacks.onAddAnnotation(c.trim())});const a=this.shadowRoot.querySelector("#btn-dashboard");a==null||a.addEventListener("click",()=>{this.callbacks.onOpenDashboard()})}}(function(){var m;let l=null;const e=new Ot;let t=[],s=null,n=null,i=!1;const r=500,o=[],a=[];window.addEventListener("message",d=>{var f;if(((f=d.data)==null?void 0:f._forensicOrigin)==="PAGE_MAIN"){const{type:w,payload:E}=d.data;if(w==="CONSOLE_ENTRY")o.push(E),o.length>r&&o.shift();else if(w==="NETWORK_ENTRY"){const S=a.findIndex(T=>T.requestId===E.requestId);S>=0?a[S]={...a[S],...E}:(a.push(E),a.length>r&&a.shift())}}});function c(){var d;try{if(typeof chrome<"u"&&((d=chrome.runtime)!=null&&d.getURL)){const f=document.createElement("script");f.src=chrome.runtime.getURL("dist/extension/page-script.js"),f.onload=()=>f.remove(),(document.head||document.documentElement).appendChild(f)}}catch{}}function u(){var f;if(t.length===0||!l)return;const d=[...t];t=[];try{typeof chrome<"u"&&((f=chrome.runtime)!=null&&f.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_EVENTS_CHUNK",sessionId:l.getSessionId(),events:d})}catch{}}function h(d,f,w){var S;if(l)return l.getMetadata();l=new Oe({sessionId:f,sessionName:d||`Recording on ${document.title||window.location.hostname}`}),l.onEvent(T=>{t.push(T),n&&n.incrementEventCount(),t.length>=25&&u()}),l.onCheckpoint(T=>{var x;try{typeof chrome<"u"&&((x=chrome.runtime)!=null&&x.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_CHECKPOINT",sessionId:T.sessionId,checkpoint:T})}catch{}});const E=l.start(document);try{typeof chrome<"u"&&((S=chrome.runtime)!=null&&S.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_START",metadata:l.getMetadata(),initialSnapshot:E})}catch{}return s||(s=setInterval(u,1e3)),n&&n.updateState(!0,!1,w||Date.now(),0),l.getMetadata()}function g(){var w;if(!l)return null;u(),s&&(clearInterval(s),s=null);const d=l.stop();try{typeof chrome<"u"&&((w=chrome.runtime)!=null&&w.sendMessage)&&chrome.runtime.sendMessage({type:"FORENSIC_SESSION_STOP",sessionId:d.id,metadata:d})}catch{}const f={...d};return l=null,n&&n.updateState(!1,!1,0,0),f}function p(){if(i){i=!1,document.body.style.cursor="default";return}i=!0,document.body.style.cursor="crosshair";const d=document.createElement("div");d.id="forensic-inspect-highlighter",d.style.position="fixed",d.style.pointerEvents="none",d.style.zIndex="2147483640",d.style.border="2px dashed #38bdf8",d.style.background="rgba(56, 189, 248, 0.15)",d.style.transition="all 0.05s ease",document.body.appendChild(d);const f=E=>{if(!i)return;const S=E.target;if(!S||S.id==="forensic-recorder-floating-host"||S.closest("#forensic-recorder-floating-host")){d.style.display="none";return}const T=S.getBoundingClientRect();d.style.display="block",d.style.left=`${T.left}px`,d.style.top=`${T.top}px`,d.style.width=`${T.width}px`,d.style.height=`${T.height}px`},w=E=>{if(!i)return;const S=E.target;if(!S.closest("#forensic-recorder-floating-host")&&(E.preventDefault(),E.stopPropagation(),i=!1,document.body.style.cursor="default",d.remove(),window.removeEventListener("mousemove",f,!0),window.removeEventListener("click",w,!0),l)){const T=S.id?`#${S.id}`:S.className?`.${S.className.split(" ")[0]}`:S.tagName.toLowerCase();l.addAnnotation("Inspect Element",`Inspected element <${S.tagName.toLowerCase()}> with selector '${T}'`,"USER"),alert(`🎯 Inspected element <${S.tagName.toLowerCase()}> recorded! Checkpoint saved.`)}};window.addEventListener("mousemove",f,!0),window.addEventListener("click",w,!0)}function y(){return n||(n=new Ut({onStartRecord:()=>{h()},onStopRecord:()=>{g()},onTogglePause:()=>{l&&(l.getMetadata().status==="recording"?l.pause():l.resume())},onCaptureCheckpoint:()=>{l&&l.captureCheckpoint("MANUAL",document)},onAddAnnotation:d=>{l&&l.addAnnotation("User Note",d,"USER")},onInspectElement:()=>{p()},onOpenDashboard:()=>{const d=l?l.getSessionId():void 0;chrome.runtime.sendMessage({type:"OPEN_DASHBOARD_TAB",sessionId:d})}})),n}function v(){var d;try{typeof chrome<"u"&&((d=chrome.runtime)!=null&&d.sendMessage)&&chrome.runtime.sendMessage({type:"GET_TAB_RECORDING_STATE"},f=>{chrome.runtime.lastError||!f||f.isRecording&&f.recording&&(y().mount(),h(f.recording.sessionName,f.recording.sessionId,f.recording.startTime))})}catch{}}typeof chrome<"u"&&((m=chrome.runtime)!=null&&m.onMessage)&&chrome.runtime.onMessage.addListener((d,f,w)=>{if(d.type==="HIDE_FORENSIC_OVERLAYS")return n&&n.hide(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(S=>{const T=S;T.style.setProperty("display","none","important"),T.style.setProperty("visibility","hidden","important"),T.style.setProperty("opacity","0","important")}),w({success:!0}),!0;if(d.type==="RESTORE_FORENSIC_OVERLAYS")return n&&n.show(),document.querySelectorAll('#forensic-recorder-floating-host, #forensic-inspect-highlighter, [id^="forensic-"]').forEach(S=>{const T=S;T.style.removeProperty("display"),T.style.removeProperty("visibility"),T.style.removeProperty("opacity")}),w({success:!0}),!0;if(d.type==="BROWSER_COMMAND_REQUEST"){if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","CLOSE_TAB","OPEN_TAB","RESIZE_VIEWPORT","RESET_VIEWPORT"].includes(d.command))return!1;if(d.command==="GET_TAB_CONSOLE_LOGS"){const{level:E,searchQuery:S,limit:T=100,clearAfterRead:x}=d.payload||{};let N=[...o];if(E&&E!=="all"&&(N=N.filter(D=>D.level===E)),S){const D=String(S).toLowerCase();N=N.filter(M=>{var L,I;return((L=M.text)==null?void 0:L.toLowerCase().includes(D))||((I=M.source)==null?void 0:I.toLowerCase().includes(D))})}return T>0&&(N=N.slice(-T)),x&&(o.length=0),w({id:d.id,command:d.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:o.length,returnedCount:N.length,logs:N}}),!0}if(d.command==="GET_TAB_NETWORK_REQUESTS"){const{method:E,searchQuery:S,status:T,onlyErrors:x,limit:N=100,clearAfterRead:D}=d.payload||{};let M=[...a];if(E&&(M=M.filter(L=>{var I;return((I=L.method)==null?void 0:I.toUpperCase())===String(E).toUpperCase()})),T&&(M=M.filter(L=>L.status===Number(T))),x&&(M=M.filter(L=>L.error||L.status&&L.status>=400)),S){const L=String(S).toLowerCase();M=M.filter(I=>{var C;return(C=I.url)==null?void 0:C.toLowerCase().includes(L)})}return N>0&&(M=M.slice(-N)),D&&(a.length=0),w({id:d.id,command:d.command,success:!0,data:{url:window.location.href,title:document.title,totalCaptured:a.length,returnedCount:M.length,requests:M}}),!0}return e.handleCommand(d,document).then(E=>{w(E)}),!0}else if(d.type==="START_RECORDING"){const E=h(d.sessionName);y().mount(),w({success:!0,metadata:E})}else if(d.type==="STOP_RECORDING"){const E=g();w({success:!0,metadata:E})}else if(d.type==="TOGGLE_FLOATING_OVERLAY"){const E=y();document.getElementById("forensic-recorder-floating-host")?(E.unmount(),w({isOpen:!1})):(E.mount(),E.updateState((l==null?void 0:l.getMetadata().status)==="recording",!1,(l==null?void 0:l.getMetadata().startTime)||0,0),w({isOpen:!0}))}else if(d.type==="GET_RECORDER_STATUS")w({isRecording:(l==null?void 0:l.getMetadata().status)==="recording",metadata:(l==null?void 0:l.getMetadata())||null});else if(d.type==="CAPTURE_CHECKPOINT")if(l){const E=l.captureCheckpoint("MANUAL",document);w({success:!0,checkpoint:E})}else w({success:!1,error:"Not currently recording"});return!0}),c(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",v):v()})()})(); diff --git a/dist/extension/service-worker.js b/dist/extension/service-worker.js index 8a07840c..3df46b93 100644 --- a/dist/extension/service-worker.js +++ b/dist/extension/service-worker.js @@ -1 +1 @@ -var v=Object.defineProperty;var P=(E,l,d)=>l in E?v(E,l,{enumerable:!0,configurable:!0,writable:!0,value:d}):E[l]=d;var b=(E,l,d)=>P(E,typeof l!="symbol"?l+"":l,d);(function(){"use strict";var T,_,p,R;class E{constructor(s="ForensicRecorderDB"){b(this,"dbName");b(this,"dbVersion",1);b(this,"db",null);this.dbName=s}async openDB(){if(this.db)return this.db;if(typeof indexedDB>"u")throw new Error("IndexedDB is not available in current runtime environment");return new Promise((s,e)=>{const r=indexedDB.open(this.dbName,this.dbVersion);r.onupgradeneeded=c=>{const t=c.target.result;if(t.objectStoreNames.contains("sessions")||t.createObjectStore("sessions",{keyPath:"id"}),!t.objectStoreNames.contains("events")){const n=t.createObjectStore("events",{keyPath:"id"});n.createIndex("sessionId","sessionId",{unique:!1}),n.createIndex("sequence","sequence",{unique:!1})}t.objectStoreNames.contains("checkpoints")||t.createObjectStore("checkpoints",{keyPath:"checkpointId"}).createIndex("sessionId","sessionId",{unique:!1}),t.objectStoreNames.contains("snapshots")||t.createObjectStore("snapshots",{keyPath:"sessionId"}),t.objectStoreNames.contains("annotations")||t.createObjectStore("annotations",{keyPath:"id"}).createIndex("sessionId","sessionId",{unique:!1})},r.onsuccess=()=>{this.db=r.result,s(this.db)},r.onerror=()=>e(r.error)})}async saveSession(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction("sessions","readwrite");t.objectStore("sessions").put(s),t.oncomplete=()=>r(),t.onerror=()=>c(t.error)})}async getSession(s){const e=await this.openDB();return new Promise((r,c)=>{const o=e.transaction("sessions","readonly").objectStore("sessions").get(s);o.onsuccess=()=>r(o.result||null),o.onerror=()=>c(o.error)})}async listSessions(){const s=await this.openDB();return new Promise((e,r)=>{const n=s.transaction("sessions","readonly").objectStore("sessions").getAll();n.onsuccess=()=>{const o=n.result||[];o.sort((a,u)=>u.startTime-a.startTime),e(o)},n.onerror=()=>r(n.error)})}async deleteSession(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction(["sessions","events","checkpoints","snapshots","annotations"],"readwrite");t.objectStore("sessions").delete(s),t.objectStore("snapshots").delete(s);const a=t.objectStore("events").index("sessionId").openCursor(IDBKeyRange.only(s));a.onsuccess=()=>{const u=a.result;u&&(u.delete(),u.continue())},t.oncomplete=()=>r(!0),t.onerror=()=>c(t.error)})}async appendEvents(s,e){if(e.length===0)return;const r=await this.openDB();return new Promise((c,t)=>{const n=r.transaction("events","readwrite"),o=n.objectStore("events");for(const a of e)o.put(a);n.oncomplete=()=>c(),n.onerror=()=>t(n.error)})}async getEvents(s,e){const r=await this.openDB();return new Promise((c,t)=>{const u=r.transaction("events","readonly").objectStore("events").index("sessionId").getAll(IDBKeyRange.only(s));u.onsuccess=()=>{let m=u.result||[];m.sort((h,f)=>h.sequence-f.sequence),e&&(m=m.filter(h=>!(e.category&&h.category!==e.category||e.type&&h.type!==e.type||typeof e.fromTimestamp=="number"&&h.timestampe.toTimestamp||typeof e.targetNodeId=="number"&&h.targetNodeId!==e.targetNodeId)),typeof e.offset=="number"&&(m=m.slice(e.offset)),typeof e.limit=="number"&&(m=m.slice(0,e.limit))),c(m)},u.onerror=()=>t(u.error)})}async getEventCount(s){const e=await this.openDB();return new Promise((r,c)=>{const a=e.transaction("events","readonly").objectStore("events").index("sessionId").count(IDBKeyRange.only(s));a.onsuccess=()=>r(a.result),a.onerror=()=>c(a.error)})}async saveCheckpoint(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction("checkpoints","readwrite");t.objectStore("checkpoints").put(s),t.oncomplete=()=>r(),t.onerror=()=>c(t.error)})}async getCheckpoints(s){const e=await this.openDB();return new Promise((r,c)=>{const o=e.transaction("checkpoints","readonly").objectStore("checkpoints").index("sessionId").getAll(IDBKeyRange.only(s));o.onsuccess=()=>{const a=o.result||[];a.sort((u,m)=>u.sequence-m.sequence),r(a)},o.onerror=()=>c(o.error)})}async saveInitialSnapshot(s,e){const r=await this.openDB();return new Promise((c,t)=>{const n=r.transaction("snapshots","readwrite");n.objectStore("snapshots").put({sessionId:s,snapshot:e}),n.oncomplete=()=>c(),n.onerror=()=>t(n.error)})}async getInitialSnapshot(s){const e=await this.openDB();return new Promise((r,c)=>{const n=e.transaction("snapshots","readonly").objectStore("snapshots").get(s);n.onsuccess=()=>r(n.result?n.result.snapshot:null),n.onerror=()=>c(n.error)})}async addAnnotation(s){const e=await this.openDB();return new Promise((r,c)=>{const t=e.transaction("annotations","readwrite");t.objectStore("annotations").put(s),t.oncomplete=()=>r(),t.onerror=()=>c(t.error)})}async getAnnotations(s){const e=await this.openDB();return new Promise((r,c)=>{const o=e.transaction("annotations","readonly").objectStore("annotations").index("sessionId").getAll(IDBKeyRange.only(s));o.onsuccess=()=>r(o.result||[]),o.onerror=()=>c(o.error)})}}const l=new E("ForensicExtensionDB");let d=null,S=null;const w=new Map,g=new Map;async function A(){return new Promise(i=>{try{chrome.tabs.query({active:!0,currentWindow:!0},s=>{if(chrome.runtime.lastError||!s||s.length===0)return i(null);i(s[0].id??null)})}catch{i(null)}})}try{(_=(T=chrome.debugger)==null?void 0:T.onEvent)==null||_.addListener((i,s,e)=>{try{for(const[r,c]of g.entries())if((i==null?void 0:i.tabId)===c||(i==null?void 0:i.targetId)===`tab_${c}`){d==null||d.send(JSON.stringify({type:"CDP_EVENT",sessionId:r,method:s,params:e,timestamp:Date.now()}));return}}catch{}})}catch{}async function O(i,s){if(i==="LIST_TABS")return new Promise((e,r)=>{chrome.tabs.query({},c=>{if(chrome.runtime.lastError)return r(new Error(chrome.runtime.lastError.message));const t=(c||[]).map(n=>({id:n.id,index:n.index,windowId:n.windowId,title:n.title||"Untitled",url:n.url||"",active:!!n.active,status:n.status,pinned:!!n.pinned,favIconUrl:n.favIconUrl,audited:n.id?w.has(n.id):!1,incognito:!!n.incognito,width:n.width,height:n.height}));e({totalTabs:t.length,tabs:t})})});if(i==="FOCUS_TAB"){const e=Number(s==null?void 0:s.tabId);if(!e)throw new Error("tabId is required for focus_tab");return new Promise((r,c)=>{chrome.tabs.update(e,{active:!0},t=>{var n;if(chrome.runtime.lastError||!t)return c(new Error(((n=chrome.runtime.lastError)==null?void 0:n.message)||`Tab ${e} not found`));t.windowId?chrome.windows.update(t.windowId,{focused:!0},()=>{r({focused:!0,tab:{id:t.id,windowId:t.windowId,title:t.title,url:t.url,active:t.active}})}):r({focused:!0,tab:{id:t.id,title:t.title,url:t.url,active:t.active}})})})}if(i==="RELOAD_TAB"){const e=!!(s!=null&&s.bypassCache),r=s!=null&&s.tabId?Number(s.tabId):void 0;return new Promise((c,t)=>{const n=o=>{chrome.tabs.reload(o,{bypassCache:e},()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));chrome.tabs.get(o,a=>{c({reloaded:!0,tabId:o,bypassCache:e,url:a==null?void 0:a.url,title:a==null?void 0:a.title})})})};r?chrome.tabs.get(r,o=>{chrome.runtime.lastError||!o?chrome.tabs.query({active:!0,lastFocusedWindow:!0},a=>{const u=a&&a[0]?a[0]:null;u!=null&&u.id?n(u.id):t(new Error("No active tab found to reload"))}):n(r)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},o=>{const a=o&&o[0]?o[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to reload"));n(a.id)})})}if(i==="CLOSE_TAB"){const e=s!=null&&s.tabId?Number(s.tabId):void 0,r=s!=null&&s.url?String(s.url).toLowerCase():void 0;return new Promise((c,t)=>{const n=o=>{chrome.tabs.remove(o,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));c({closed:!0,tabIds:o,count:o.length})})};e?n([e]):r?chrome.tabs.query({},o=>{const u=(o||[]).filter(m=>{var h,f;return((h=m.url)==null?void 0:h.toLowerCase().includes(r))||((f=m.title)==null?void 0:f.toLowerCase().includes(r))}).map(m=>m.id).filter(Boolean);if(u.length===0)return c({closed:!1,message:`No open tab matched '${r}'`});n(u)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},o=>{const a=o&&o[0]?o[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to close"));n([a.id])})})}if(i==="OPEN_TAB"){const e=s==null?void 0:s.url;if(!e)throw new Error("url is required for open_tab");let r=String(e).trim();!r.startsWith("http://")&&!r.startsWith("https://")&&!r.startsWith("file://")&&!r.startsWith("chrome://")&&!r.startsWith("about:")&&(r.includes("meet.google.com")||r.includes("localhost")||r.includes(".com")||r.includes(".org")||r.includes(".net")||r.includes(".ir")||r.includes(".io")||r.includes(".app"))&&(r="https://"+r);const c=s.active!==!1,t=!!s.pinned;return new Promise((n,o)=>{chrome.tabs.create({url:r,active:c,pinned:t},a=>{if(chrome.runtime.lastError)return o(new Error(chrome.runtime.lastError.message));n({opened:!0,tabId:a.id,windowId:a.windowId,url:a.url||r,title:a.title||"New Tab",active:a.active,status:a.status})})})}if(i==="LIST_EXTENSIONS")return new Promise((e,r)=>{var c;if(!((c=chrome.management)!=null&&c.getAll))return r(new Error("chrome.management API not available"));chrome.management.getAll(t=>{if(chrome.runtime.lastError)return r(new Error(chrome.runtime.lastError.message));const n=(t||[]).map(o=>({id:o.id,name:o.name,version:o.version,description:o.description,enabled:o.enabled,installType:o.installType,isApp:o.isApp,homepageUrl:o.homepageUrl,permissions:o.permissions}));e({totalExtensions:n.length,extensions:n})})});if(i==="SET_EXTENSION_ENABLED"){const e=s==null?void 0:s.extensionId,r=!!(s!=null&&s.enabled);if(!e)throw new Error("extensionId is required for SET_EXTENSION_ENABLED");return new Promise((c,t)=>{var n;if(!((n=chrome.management)!=null&&n.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,r,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to set enabled state for ${e}`));c({success:!0,extensionId:e,enabled:r,message:`Extension ${e} successfully ${r?"enabled":"disabled"}.`})})})}if(i==="TOGGLE_EXTENSION"){const e=s==null?void 0:s.extensionId;if(!e)throw new Error("extensionId is required for TOGGLE_EXTENSION");return new Promise((r,c)=>{var t,n;if(!((t=chrome.management)!=null&&t.get)||!((n=chrome.management)!=null&&n.setEnabled))return c(new Error("chrome.management API not available"));chrome.management.get(e,o=>{var u;if(chrome.runtime.lastError||!o)return c(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||`Extension ${e} not found`));const a=!o.enabled;chrome.management.setEnabled(e,a,()=>{if(chrome.runtime.lastError)return c(new Error(chrome.runtime.lastError.message||`Failed to toggle ${e}`));r({success:!0,extensionId:e,enabled:a,name:o.name,message:`Extension ${o.name} (${e}) toggled to ${a?"enabled":"disabled"}.`})})})})}if(i==="RESIZE_VIEWPORT"){const e=Math.max(200,Math.min(7680,Number(s==null?void 0:s.width)||1280)),r=Math.max(200,Math.min(4320,Number(s==null?void 0:s.height)||800));return new Promise((c,t)=>{chrome.windows.getCurrent({populate:!1},n=>{var o;if(chrome.runtime.lastError||!n)return t(new Error(((o=chrome.runtime.lastError)==null?void 0:o.message)||"No current window"));chrome.windows.update(n.id??chrome.windows.WINDOW_ID_CURRENT,{width:e,height:r,state:"normal"},a=>{var u;if(chrome.runtime.lastError||!a)return t(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||"Window resize failed"));c({success:!0,applied:{width:a.width,height:a.height},previous:{width:n.width,height:n.height},original:{width:n.width,height:n.height},reversible:!0,mode:"browser-window",note:"Reset with reset_viewport — the content script tracks the original size."})})})})}if(i==="RESET_VIEWPORT")return new Promise((e,r)=>{chrome.windows.getCurrent({populate:!1},c=>{var t;if(chrome.runtime.lastError||!c)return r(new Error(((t=chrome.runtime.lastError)==null?void 0:t.message)||"No current window"));chrome.windows.update(c.id??chrome.windows.WINDOW_ID_CURRENT,{state:"maximized"},n=>{var o;if(chrome.runtime.lastError||!n)return r(new Error(((o=chrome.runtime.lastError)==null?void 0:o.message)||"Window restore failed"));e({success:!0,applied:{width:n.width,height:n.height},previous:{width:c.width,height:c.height},original:{width:n.width,height:n.height},reversible:!1,mode:"browser-window",note:"Window restored to maximized state."})})})});if(i==="RELOAD_EXTENSION"){const e=s==null?void 0:s.extensionId,r=chrome.runtime.id;return!e||e===r?(setTimeout(()=>chrome.runtime.reload(),150),{reloaded:!0,extensionId:r,isSelf:!0,message:"Forensic Recorder extension is reloading now."}):new Promise((c,t)=>{var n;if(!((n=chrome.management)!=null&&n.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,!1,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to disable ${e}`));setTimeout(()=>{chrome.management.setEnabled(e,!0,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to re-enable ${e}`));c({reloaded:!0,extensionId:e,isSelf:!1,message:`Extension ${e} successfully reloaded.`})})},150)})})}if(i==="CDP_ATTACH"){const e=(s==null?void 0:s.tabId)!==void 0?Number(s.tabId):await A();if(e===null)throw new Error("No target tab available for CDP attach.");return new Promise((r,c)=>{var t;if(!((t=chrome.debugger)!=null&&t.attach))return c(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));chrome.debugger.attach({tabId:e},"1.3",()=>{if(chrome.runtime.lastError)return c(new Error(`CDP_ATTACH failed: ${chrome.runtime.lastError.message}`));s!=null&&s.sessionId&&g.set(String(s.sessionId),e),chrome.debugger.getTargets(n=>{const o=(n||[]).find(a=>a.tabId===e)||{};r({attached:!0,sessionId:s==null?void 0:s.sessionId,tabId:e,targetId:o.id||`tab_${e}`,type:o.type||"page"})})})})}if(i==="CDP_COMMAND"){const{sessionId:e,method:r,params:c}=s||{};if(!r)throw new Error("CDP_COMMAND requires method");return new Promise((t,n)=>{var a;if(!((a=chrome.debugger)!=null&&a.sendCommand))return n(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));const o=g.get(e);if(o===void 0)return n(new Error(`CDP_SESSION_NOT_FOUND: no tab bound to session '${e}' — attach first.`));chrome.debugger.sendCommand({tabId:o},r,c||{},u=>{if(chrome.runtime.lastError){t({__cdpError:!0,code:"CDP_PROTOCOL_ERROR",message:chrome.runtime.lastError.message,method:r});return}t({result:u??{}})})})}if(i==="CDP_DETACH"){const{sessionId:e}=s||{},r=g.get(e);return g.delete(e),r===void 0?{detached:!1,reason:"session not found"}:new Promise((c,t)=>{var n;if(!((n=chrome.debugger)!=null&&n.detach))return c({detached:!1,reason:"chrome.debugger unavailable"});chrome.debugger.detach({tabId:r},()=>{if(chrome.runtime.lastError)return c({detached:!1,reason:chrome.runtime.lastError.message});c({detached:!0,sessionId:e,tabId:r})})})}throw new Error(`Unsupported background command: ${i}`)}function I(){if(!(typeof WebSocket>"u"))try{const i=new WebSocket("ws://127.0.0.1:3847");let s=null;i.onopen=()=>{var e;d=i,console.log("[Forensic Extension] Connected to MCP Bridge on ws://127.0.0.1:3847"),S&&(clearInterval(S),S=null),i.send(JSON.stringify({type:"REGISTER_CLIENT",clientType:"SERVICE_WORKER",url:typeof chrome<"u"&&((e=chrome.runtime)!=null&&e.id)?`chrome-extension://${chrome.runtime.id}`:"service-worker",title:"Forensic Service Worker"})),s&&clearInterval(s),s=setInterval(()=>{if(i&&i.readyState===WebSocket.OPEN)try{i.send(JSON.stringify({type:"HEARTBEAT",timestamp:Date.now()}))}catch(r){console.warn("[TeleDOM SW] non-critical operation failed:",(r==null?void 0:r.message)??r)}},15e3)},i.onclose=()=>{s&&clearInterval(s),d=null,N()},i.onerror=()=>{s&&clearInterval(s),d=null,N()},i.onmessage=async e=>{try{const r=JSON.parse(e.data.toString());if(r.type==="BROWSER_COMMAND_REQUEST"){const{id:c,command:t,payload:n}=r;if(typeof chrome>"u"||!chrome.tabs){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_CHROME_TABS_API",message:"chrome.tabs API not available in this context"}}));return}if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","CLOSE_TAB","OPEN_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","SET_EXTENSION_ENABLED","TOGGLE_EXTENSION","CDP_ATTACH","CDP_COMMAND","CDP_DETACH"].includes(t)){try{const u=await O(t,n);i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!0,data:u}))}catch(u){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"COMMAND_ERROR",message:u.message}}))}return}const o=n!=null&&n.tabId?Number(n.tabId):void 0,a=u=>{if(t==="LIVE_PAGE_SCREENSHOT"||t==="LIVE_ELEMENT_SCREENSHOT"){chrome.tabs.sendMessage(u,{type:"HIDE_FORENSIC_OVERLAYS"},()=>{setTimeout(()=>{chrome.tabs.captureVisibleTab({format:"png"},m=>{var h;if(chrome.tabs.sendMessage(u,{type:"RESTORE_FORENSIC_OVERLAYS"}),chrome.runtime.lastError||!m){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"SCREENSHOT_FAILED",message:((h=chrome.runtime.lastError)==null?void 0:h.message)||"captureVisibleTab failed"}}));return}chrome.tabs.sendMessage(u,{type:"BROWSER_COMMAND_REQUEST",id:c,command:t,payload:{...n,dataUrl:m}},f=>{const C=f||{id:c,command:t,success:!0,data:{dataUrl:m,captureType:t==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}};i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...C}))})})},150)});return}chrome.tabs.sendMessage(u,r,m=>{if(chrome.runtime.lastError){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"CONTENT_SCRIPT_UNREACHABLE",message:chrome.runtime.lastError.message||`Content script unreachable on tab ${u}`}}));return}i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...m||{id:c,command:t,success:!0}}))})};o?a(o):chrome.tabs.query({active:!0,lastFocusedWindow:!0},async u=>{const m=u&&u[0]?u[0]:null,h=m==null?void 0:m.id;if(!h){i.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_ACTIVE_TAB",message:"No active browser tab found"}}));return}a(h)})}}catch(r){console.error("[ServiceWorker] Bridge message handling error:",r)}}}catch{d=null,N()}}function N(){S||(S=setInterval(()=>{(!d||d.readyState!==WebSocket.OPEN)&&I()},5e3))}I(),typeof chrome<"u"&&((p=chrome.webNavigation)!=null&&p.onCommitted)&&chrome.webNavigation.onCommitted.addListener(async i=>{var t;if(i.frameId!==0)return;const s=i.tabId,e=w.get(s);if(!e||!e.isRecording)return;let r="NAV_OTHER";i.transitionType==="reload"?r="NAV_RELOAD":(t=i.transitionQualifiers)!=null&&t.includes("forward_back")?r="NAV_FORWARD_BACK":i.transitionType==="link"&&(r="NAV_LINK");const c={id:`nav_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,sessionId:e.sessionId,timestamp:Date.now()-e.startTime,sequence:999999,wallClockTime:Date.now(),type:r,category:"NAVIGATION",source:"USER_INTERACTION",payload:{url:i.url,transitionType:i.transitionType,transitionQualifiers:i.transitionQualifiers,tabId:i.tabId}};try{await l.appendEvents(e.sessionId,[c]),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"FORENSIC_EVENTS_CHUNK",sessionId:e.sessionId,events:[c]}))}catch{}}),typeof chrome<"u"&&((R=chrome.runtime)!=null&&R.onMessage)&&chrome.runtime.onMessage.addListener((i,s,e)=>((async()=>{var r,c,t;try{const n=((r=s.tab)==null?void 0:r.id)??i.tabId;if(i.type==="FORENSIC_SESSION_START")n&&w.set(n,{sessionId:i.metadata.id,sessionName:i.metadata.name,startTime:i.metadata.startTime,initialUrl:i.metadata.url,isRecording:!0}),await l.saveSession(i.metadata),i.initialSnapshot&&await l.saveInitialSnapshot(i.metadata.id,i.initialSnapshot),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0,sessionId:i.metadata.id});else if(i.type==="GET_TAB_RECORDING_STATE"){const o=n?w.get(n):null;e({isRecording:!!(o!=null&&o.isRecording),recording:o||null})}else if(i.type==="FORENSIC_EVENTS_CHUNK")await l.appendEvents(i.sessionId,i.events),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0});else if(i.type==="FORENSIC_CHECKPOINT")await l.saveCheckpoint(i.checkpoint),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0});else if(i.type==="FORENSIC_SESSION_STOP"){n&&w.delete(n);const o=await l.getSession(i.sessionId);o&&(o.status="stopped",o.endTime=Date.now(),(c=i.metadata)!=null&&c.durationMs&&(o.durationMs=i.metadata.durationMs),await l.saveSession(o)),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0})}else if(i.type==="OPEN_DASHBOARD_TAB"){const o=chrome.runtime.getURL(`dist/src/ui/index.html${i.sessionId?`?session=${i.sessionId}`:""}`);chrome.tabs.create({url:o}),e({success:!0,url:o})}else if(i.type==="CAPTURE_SCREENSHOT"){if((t=chrome.tabs)!=null&&t.captureVisibleTab){chrome.tabs.captureVisibleTab({format:"png"},o=>{e({success:!!o,dataUrl:o})});return}e({success:!1,error:"Screenshot capture unsupported"})}else if(i.type==="ELEMENT_SELECTED")d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(i)),e({success:!0});else if(i.type==="BROWSER_COMMAND_REQUEST")try{const o=await O(i.command,i.payload);e({id:i.id,command:i.command,success:!0,data:o})}catch(o){e({id:i.id,command:i.command,success:!1,error:{code:"COMMAND_ERROR",message:o.message}})}}catch(n){e({success:!1,error:n.message})}})(),!0)),I()})(); +var v=Object.defineProperty;var P=(E,h,d)=>h in E?v(E,h,{enumerable:!0,configurable:!0,writable:!0,value:d}):E[h]=d;var I=(E,h,d)=>P(E,typeof h!="symbol"?h+"":h,d);(function(){"use strict";var T,_,p,A;class E{constructor(s="ForensicRecorderDB"){I(this,"dbName");I(this,"dbVersion",1);I(this,"db",null);this.dbName=s}async openDB(){if(this.db)return this.db;if(typeof indexedDB>"u")throw new Error("IndexedDB is not available in current runtime environment");return new Promise((s,e)=>{const n=indexedDB.open(this.dbName,this.dbVersion);n.onupgradeneeded=c=>{const t=c.target.result;if(t.objectStoreNames.contains("sessions")||t.createObjectStore("sessions",{keyPath:"id"}),!t.objectStoreNames.contains("events")){const r=t.createObjectStore("events",{keyPath:"id"});r.createIndex("sessionId","sessionId",{unique:!1}),r.createIndex("sequence","sequence",{unique:!1})}t.objectStoreNames.contains("checkpoints")||t.createObjectStore("checkpoints",{keyPath:"checkpointId"}).createIndex("sessionId","sessionId",{unique:!1}),t.objectStoreNames.contains("snapshots")||t.createObjectStore("snapshots",{keyPath:"sessionId"}),t.objectStoreNames.contains("annotations")||t.createObjectStore("annotations",{keyPath:"id"}).createIndex("sessionId","sessionId",{unique:!1})},n.onsuccess=()=>{this.db=n.result,s(this.db)},n.onerror=()=>e(n.error)})}async saveSession(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction("sessions","readwrite");t.objectStore("sessions").put(s),t.oncomplete=()=>n(),t.onerror=()=>c(t.error)})}async getSession(s){const e=await this.openDB();return new Promise((n,c)=>{const i=e.transaction("sessions","readonly").objectStore("sessions").get(s);i.onsuccess=()=>n(i.result||null),i.onerror=()=>c(i.error)})}async listSessions(){const s=await this.openDB();return new Promise((e,n)=>{const r=s.transaction("sessions","readonly").objectStore("sessions").getAll();r.onsuccess=()=>{const i=r.result||[];i.sort((a,u)=>u.startTime-a.startTime),e(i)},r.onerror=()=>n(r.error)})}async deleteSession(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction(["sessions","events","checkpoints","snapshots","annotations"],"readwrite");t.objectStore("sessions").delete(s),t.objectStore("snapshots").delete(s);const a=t.objectStore("events").index("sessionId").openCursor(IDBKeyRange.only(s));a.onsuccess=()=>{const u=a.result;u&&(u.delete(),u.continue())},t.oncomplete=()=>n(!0),t.onerror=()=>c(t.error)})}async appendEvents(s,e){if(e.length===0)return;const n=await this.openDB();return new Promise((c,t)=>{const r=n.transaction("events","readwrite"),i=r.objectStore("events");for(const a of e)i.put(a);r.oncomplete=()=>c(),r.onerror=()=>t(r.error)})}async getEvents(s,e){const n=await this.openDB();return new Promise((c,t)=>{const u=n.transaction("events","readonly").objectStore("events").index("sessionId").getAll(IDBKeyRange.only(s));u.onsuccess=()=>{let m=u.result||[];m.sort((l,f)=>l.sequence-f.sequence),e&&(m=m.filter(l=>!(e.category&&l.category!==e.category||e.type&&l.type!==e.type||typeof e.fromTimestamp=="number"&&l.timestampe.toTimestamp||typeof e.targetNodeId=="number"&&l.targetNodeId!==e.targetNodeId)),typeof e.offset=="number"&&(m=m.slice(e.offset)),typeof e.limit=="number"&&(m=m.slice(0,e.limit))),c(m)},u.onerror=()=>t(u.error)})}async getEventCount(s){const e=await this.openDB();return new Promise((n,c)=>{const a=e.transaction("events","readonly").objectStore("events").index("sessionId").count(IDBKeyRange.only(s));a.onsuccess=()=>n(a.result),a.onerror=()=>c(a.error)})}async saveCheckpoint(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction("checkpoints","readwrite");t.objectStore("checkpoints").put(s),t.oncomplete=()=>n(),t.onerror=()=>c(t.error)})}async getCheckpoints(s){const e=await this.openDB();return new Promise((n,c)=>{const i=e.transaction("checkpoints","readonly").objectStore("checkpoints").index("sessionId").getAll(IDBKeyRange.only(s));i.onsuccess=()=>{const a=i.result||[];a.sort((u,m)=>u.sequence-m.sequence),n(a)},i.onerror=()=>c(i.error)})}async saveInitialSnapshot(s,e){const n=await this.openDB();return new Promise((c,t)=>{const r=n.transaction("snapshots","readwrite");r.objectStore("snapshots").put({sessionId:s,snapshot:e}),r.oncomplete=()=>c(),r.onerror=()=>t(r.error)})}async getInitialSnapshot(s){const e=await this.openDB();return new Promise((n,c)=>{const r=e.transaction("snapshots","readonly").objectStore("snapshots").get(s);r.onsuccess=()=>n(r.result?r.result.snapshot:null),r.onerror=()=>c(r.error)})}async addAnnotation(s){const e=await this.openDB();return new Promise((n,c)=>{const t=e.transaction("annotations","readwrite");t.objectStore("annotations").put(s),t.oncomplete=()=>n(),t.onerror=()=>c(t.error)})}async getAnnotations(s){const e=await this.openDB();return new Promise((n,c)=>{const i=e.transaction("annotations","readonly").objectStore("annotations").index("sessionId").getAll(IDBKeyRange.only(s));i.onsuccess=()=>n(i.result||[]),i.onerror=()=>c(i.error)})}}const h=new E("ForensicExtensionDB");let d=null,S=null;const w=new Map,g=new Map;async function R(){return new Promise(o=>{try{chrome.tabs.query({active:!0,currentWindow:!0},s=>{if(chrome.runtime.lastError||!s||s.length===0)return o(null);o(s[0].id??null)})}catch{o(null)}})}try{(_=(T=chrome.debugger)==null?void 0:T.onEvent)==null||_.addListener((o,s,e)=>{try{for(const[n,c]of g.entries())if((o==null?void 0:o.tabId)===c||(o==null?void 0:o.targetId)===`tab_${c}`){d==null||d.send(JSON.stringify({type:"CDP_EVENT",sessionId:n,method:s,params:e,timestamp:Date.now()}));return}}catch{}})}catch{}async function O(o,s){if(o==="LIST_TABS")return new Promise((e,n)=>{chrome.tabs.query({},c=>{if(chrome.runtime.lastError)return n(new Error(chrome.runtime.lastError.message));const t=(c||[]).map(r=>({id:r.id,index:r.index,windowId:r.windowId,title:r.title||"Untitled",url:r.url||"",active:!!r.active,status:r.status,pinned:!!r.pinned,favIconUrl:r.favIconUrl,audited:r.id?w.has(r.id):!1,incognito:!!r.incognito,width:r.width,height:r.height}));e({totalTabs:t.length,tabs:t})})});if(o==="FOCUS_TAB"){const e=Number(s==null?void 0:s.tabId);if(!e)throw new Error("tabId is required for focus_tab");return new Promise((n,c)=>{chrome.tabs.update(e,{active:!0},t=>{var r;if(chrome.runtime.lastError||!t)return c(new Error(((r=chrome.runtime.lastError)==null?void 0:r.message)||`Tab ${e} not found`));t.windowId?chrome.windows.update(t.windowId,{focused:!0},()=>{n({focused:!0,tab:{id:t.id,windowId:t.windowId,title:t.title,url:t.url,active:t.active}})}):n({focused:!0,tab:{id:t.id,title:t.title,url:t.url,active:t.active}})})})}if(o==="RELOAD_TAB"){const e=!!(s!=null&&s.bypassCache),n=s!=null&&s.tabId?Number(s.tabId):void 0;return new Promise((c,t)=>{const r=i=>{chrome.tabs.reload(i,{bypassCache:e},()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));chrome.tabs.get(i,a=>{c({reloaded:!0,tabId:i,bypassCache:e,url:a==null?void 0:a.url,title:a==null?void 0:a.title})})})};n?chrome.tabs.get(n,i=>{chrome.runtime.lastError||!i?chrome.tabs.query({active:!0,lastFocusedWindow:!0},a=>{const u=a&&a[0]?a[0]:null;u!=null&&u.id?r(u.id):t(new Error("No active tab found to reload"))}):r(n)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},i=>{const a=i&&i[0]?i[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to reload"));r(a.id)})})}if(o==="CLOSE_TAB"){const e=s!=null&&s.tabId?Number(s.tabId):void 0,n=s!=null&&s.url?String(s.url).toLowerCase():void 0;return new Promise((c,t)=>{const r=i=>{chrome.tabs.remove(i,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message));c({closed:!0,tabIds:i,count:i.length})})};e?r([e]):n?chrome.tabs.query({},i=>{const u=(i||[]).filter(m=>{var l,f;return((l=m.url)==null?void 0:l.toLowerCase().includes(n))||((f=m.title)==null?void 0:f.toLowerCase().includes(n))}).map(m=>m.id).filter(Boolean);if(u.length===0)return c({closed:!1,message:`No open tab matched '${n}'`});r(u)}):chrome.tabs.query({active:!0,lastFocusedWindow:!0},i=>{const a=i&&i[0]?i[0]:null;if(!(a!=null&&a.id))return t(new Error("No active tab found to close"));r([a.id])})})}if(o==="OPEN_TAB"){const e=s==null?void 0:s.url;if(!e)throw new Error("url is required for open_tab");let n=String(e).trim();!n.startsWith("http://")&&!n.startsWith("https://")&&!n.startsWith("file://")&&!n.startsWith("chrome://")&&!n.startsWith("about:")&&(n.includes("meet.google.com")||n.includes("localhost")||n.includes(".com")||n.includes(".org")||n.includes(".net")||n.includes(".ir")||n.includes(".io")||n.includes(".app"))&&(n="https://"+n);const c=s.active!==!1,t=!!s.pinned;return new Promise((r,i)=>{chrome.tabs.create({url:n,active:c,pinned:t},a=>{if(chrome.runtime.lastError)return i(new Error(chrome.runtime.lastError.message));r({opened:!0,tabId:a.id,windowId:a.windowId,url:a.url||n,title:a.title||"New Tab",active:a.active,status:a.status})})})}if(o==="LIST_EXTENSIONS")return new Promise((e,n)=>{var c;if(!((c=chrome.management)!=null&&c.getAll))return n(new Error("chrome.management API not available"));chrome.management.getAll(t=>{if(chrome.runtime.lastError)return n(new Error(chrome.runtime.lastError.message));const r=(t||[]).map(i=>({id:i.id,name:i.name,version:i.version,description:i.description,enabled:i.enabled,installType:i.installType,isApp:i.isApp,homepageUrl:i.homepageUrl,permissions:i.permissions}));e({totalExtensions:r.length,extensions:r})})});if(o==="SET_EXTENSION_ENABLED"){const e=s==null?void 0:s.extensionId,n=!!(s!=null&&s.enabled);if(!e)throw new Error("extensionId is required for SET_EXTENSION_ENABLED");return new Promise((c,t)=>{var r;if(!((r=chrome.management)!=null&&r.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,n,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to set enabled state for ${e}`));c({success:!0,extensionId:e,enabled:n,message:`Extension ${e} successfully ${n?"enabled":"disabled"}.`})})})}if(o==="TOGGLE_EXTENSION"){const e=s==null?void 0:s.extensionId;if(!e)throw new Error("extensionId is required for TOGGLE_EXTENSION");return new Promise((n,c)=>{var t,r;if(!((t=chrome.management)!=null&&t.get)||!((r=chrome.management)!=null&&r.setEnabled))return c(new Error("chrome.management API not available"));chrome.management.get(e,i=>{var u;if(chrome.runtime.lastError||!i)return c(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||`Extension ${e} not found`));const a=!i.enabled;chrome.management.setEnabled(e,a,()=>{if(chrome.runtime.lastError)return c(new Error(chrome.runtime.lastError.message||`Failed to toggle ${e}`));n({success:!0,extensionId:e,enabled:a,name:i.name,message:`Extension ${i.name} (${e}) toggled to ${a?"enabled":"disabled"}.`})})})})}if(o==="RESIZE_VIEWPORT"){const e=Math.max(200,Math.min(7680,Number(s==null?void 0:s.width)||1280)),n=Math.max(200,Math.min(4320,Number(s==null?void 0:s.height)||800));return new Promise((c,t)=>{chrome.windows.getCurrent({populate:!1},r=>{var i;if(chrome.runtime.lastError||!r)return t(new Error(((i=chrome.runtime.lastError)==null?void 0:i.message)||"No current window"));chrome.windows.update(r.id??chrome.windows.WINDOW_ID_CURRENT,{width:e,height:n,state:"normal"},a=>{var u;if(chrome.runtime.lastError||!a)return t(new Error(((u=chrome.runtime.lastError)==null?void 0:u.message)||"Window resize failed"));c({success:!0,applied:{width:a.width,height:a.height},previous:{width:r.width,height:r.height},original:{width:r.width,height:r.height},reversible:!0,mode:"browser-window",note:"Reset with reset_viewport — the content script tracks the original size."})})})})}if(o==="RESET_VIEWPORT")return new Promise((e,n)=>{chrome.windows.getCurrent({populate:!1},c=>{var t;if(chrome.runtime.lastError||!c)return n(new Error(((t=chrome.runtime.lastError)==null?void 0:t.message)||"No current window"));chrome.windows.update(c.id??chrome.windows.WINDOW_ID_CURRENT,{state:"maximized"},r=>{var i;if(chrome.runtime.lastError||!r)return n(new Error(((i=chrome.runtime.lastError)==null?void 0:i.message)||"Window restore failed"));e({success:!0,applied:{width:r.width,height:r.height},previous:{width:c.width,height:c.height},original:{width:r.width,height:r.height},reversible:!1,mode:"browser-window",note:"Window restored to maximized state."})})})});if(o==="RELOAD_EXTENSION"){const e=s==null?void 0:s.extensionId,n=chrome.runtime.id;return!e||e===n?(setTimeout(()=>chrome.runtime.reload(),150),{reloaded:!0,extensionId:n,isSelf:!0,message:"Forensic Recorder extension is reloading now."}):new Promise((c,t)=>{var r;if(!((r=chrome.management)!=null&&r.setEnabled))return t(new Error("chrome.management API not available"));chrome.management.setEnabled(e,!1,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to disable ${e}`));setTimeout(()=>{chrome.management.setEnabled(e,!0,()=>{if(chrome.runtime.lastError)return t(new Error(chrome.runtime.lastError.message||`Failed to re-enable ${e}`));c({reloaded:!0,extensionId:e,isSelf:!1,message:`Extension ${e} successfully reloaded.`})})},150)})})}if(o==="CDP_ATTACH"){const e=(s==null?void 0:s.tabId)!==void 0?Number(s.tabId):await R();if(e===null)throw new Error("No target tab available for CDP attach.");return new Promise((n,c)=>{var t;if(!((t=chrome.debugger)!=null&&t.attach))return c(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));chrome.debugger.attach({tabId:e},"1.3",()=>{if(chrome.runtime.lastError){const r=chrome.runtime.lastError.message||"";return r.includes("Another debugger is already attached")?c(new Error(`CDP_ATTACH failed: Chrome DevTools (F12) is already open on tab ${e}. Please close the F12 panel on that tab so TeleDOM can attach.`)):c(new Error(`CDP_ATTACH failed: ${r}`))}s!=null&&s.sessionId&&g.set(String(s.sessionId),e),chrome.debugger.getTargets(r=>{const i=(r||[]).find(a=>a.tabId===e)||{};n({attached:!0,sessionId:s==null?void 0:s.sessionId,tabId:e,targetId:i.id||`tab_${e}`,type:i.type||"page"})})})})}if(o==="CDP_COMMAND"){const{sessionId:e,method:n,params:c}=s||{};if(!n)throw new Error("CDP_COMMAND requires method");return new Promise((t,r)=>{var a;if(!((a=chrome.debugger)!=null&&a.sendCommand))return r(new Error('CDP_UNAVAILABLE: chrome.debugger API not available (check the "debugger" permission).'));const i=g.get(e);if(i===void 0)return r(new Error(`CDP_SESSION_NOT_FOUND: no tab bound to session '${e}' — attach first.`));chrome.debugger.sendCommand({tabId:i},n,c||{},u=>{if(chrome.runtime.lastError){t({__cdpError:!0,code:"CDP_PROTOCOL_ERROR",message:chrome.runtime.lastError.message,method:n});return}t({result:u??{}})})})}if(o==="CDP_DETACH"){const{sessionId:e}=s||{},n=g.get(e);return g.delete(e),n===void 0?{detached:!1,reason:"session not found"}:new Promise((c,t)=>{var r;if(!((r=chrome.debugger)!=null&&r.detach))return c({detached:!1,reason:"chrome.debugger unavailable"});chrome.debugger.detach({tabId:n},()=>{if(chrome.runtime.lastError)return c({detached:!1,reason:chrome.runtime.lastError.message});c({detached:!0,sessionId:e,tabId:n})})})}throw new Error(`Unsupported background command: ${o}`)}function b(){if(!(typeof WebSocket>"u"))try{const o=new WebSocket("ws://127.0.0.1:3847");let s=null;o.onopen=()=>{var e;d=o,console.log("[Forensic Extension] Connected to MCP Bridge on ws://127.0.0.1:3847"),S&&(clearInterval(S),S=null),o.send(JSON.stringify({type:"REGISTER_CLIENT",clientType:"SERVICE_WORKER",url:typeof chrome<"u"&&((e=chrome.runtime)!=null&&e.id)?`chrome-extension://${chrome.runtime.id}`:"service-worker",title:"Forensic Service Worker"})),s&&clearInterval(s),s=setInterval(()=>{if(o&&o.readyState===WebSocket.OPEN)try{o.send(JSON.stringify({type:"HEARTBEAT",timestamp:Date.now()}))}catch(n){console.warn("[TeleDOM SW] non-critical operation failed:",(n==null?void 0:n.message)??n)}},15e3)},o.onclose=()=>{s&&clearInterval(s),d=null,N()},o.onerror=()=>{s&&clearInterval(s),d=null,N()},o.onmessage=async e=>{try{const n=JSON.parse(e.data.toString());if(n.type==="BROWSER_COMMAND_REQUEST"){const{id:c,command:t,payload:r}=n;if(typeof chrome>"u"||!chrome.tabs){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_CHROME_TABS_API",message:"chrome.tabs API not available in this context"}}));return}if(["LIST_TABS","FOCUS_TAB","RELOAD_TAB","CLOSE_TAB","OPEN_TAB","LIST_EXTENSIONS","RELOAD_EXTENSION","SET_EXTENSION_ENABLED","TOGGLE_EXTENSION","CDP_ATTACH","CDP_COMMAND","CDP_DETACH"].includes(t)){try{const u=await O(t,r);o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!0,data:u}))}catch(u){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"COMMAND_ERROR",message:u.message}}))}return}const i=r!=null&&r.tabId?Number(r.tabId):void 0,a=u=>{if(t==="LIVE_PAGE_SCREENSHOT"||t==="LIVE_ELEMENT_SCREENSHOT"){chrome.tabs.sendMessage(u,{type:"HIDE_FORENSIC_OVERLAYS"},()=>{setTimeout(()=>{chrome.tabs.captureVisibleTab({format:"png"},m=>{var l;if(chrome.tabs.sendMessage(u,{type:"RESTORE_FORENSIC_OVERLAYS"}),chrome.runtime.lastError||!m){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"SCREENSHOT_FAILED",message:((l=chrome.runtime.lastError)==null?void 0:l.message)||"captureVisibleTab failed"}}));return}chrome.tabs.sendMessage(u,{type:"BROWSER_COMMAND_REQUEST",id:c,command:t,payload:{...r,dataUrl:m}},f=>{const C=f||{id:c,command:t,success:!0,data:{dataUrl:m,captureType:t==="LIVE_ELEMENT_SCREENSHOT"?"ELEMENT":"FULL_PAGE"}};o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...C}))})})},150)});return}chrome.tabs.sendMessage(u,n,m=>{if(chrome.runtime.lastError){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"CONTENT_SCRIPT_UNREACHABLE",message:chrome.runtime.lastError.message||`Content script unreachable on tab ${u}`}}));return}o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",...m||{id:c,command:t,success:!0}}))})};i?a(i):chrome.tabs.query({active:!0,lastFocusedWindow:!0},async u=>{const m=u&&u[0]?u[0]:null,l=m==null?void 0:m.id;if(!l){o.send(JSON.stringify({type:"BROWSER_COMMAND_RESPONSE",id:c,command:t,success:!1,error:{code:"NO_ACTIVE_TAB",message:"No active browser tab found"}}));return}a(l)})}}catch(n){console.error("[ServiceWorker] Bridge message handling error:",n)}}}catch{d=null,N()}}function N(){S||(S=setInterval(()=>{(!d||d.readyState!==WebSocket.OPEN)&&b()},5e3))}if(typeof chrome<"u"&&chrome.alarms)try{chrome.alarms.create("teledom_bridge_keepalive",{periodInMinutes:.4}),chrome.alarms.onAlarm.addListener(o=>{if(o.name==="teledom_bridge_keepalive")if(!d||d.readyState!==WebSocket.OPEN)b();else try{d.send(JSON.stringify({type:"HEARTBEAT",timestamp:Date.now()}))}catch{b()}})}catch(o){console.warn("[ServiceWorker] Alarms keepalive setup failed:",o==null?void 0:o.message)}b(),typeof chrome<"u"&&((p=chrome.webNavigation)!=null&&p.onCommitted)&&chrome.webNavigation.onCommitted.addListener(async o=>{var t;if(o.frameId!==0)return;const s=o.tabId,e=w.get(s);if(!e||!e.isRecording)return;let n="NAV_OTHER";o.transitionType==="reload"?n="NAV_RELOAD":(t=o.transitionQualifiers)!=null&&t.includes("forward_back")?n="NAV_FORWARD_BACK":o.transitionType==="link"&&(n="NAV_LINK");const c={id:`nav_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,sessionId:e.sessionId,timestamp:Date.now()-e.startTime,sequence:999999,wallClockTime:Date.now(),type:n,category:"NAVIGATION",source:"USER_INTERACTION",payload:{url:o.url,transitionType:o.transitionType,transitionQualifiers:o.transitionQualifiers,tabId:o.tabId}};try{await h.appendEvents(e.sessionId,[c]),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify({type:"FORENSIC_EVENTS_CHUNK",sessionId:e.sessionId,events:[c]}))}catch{}}),typeof chrome<"u"&&((A=chrome.runtime)!=null&&A.onMessage)&&chrome.runtime.onMessage.addListener((o,s,e)=>((async()=>{var n,c,t;try{const r=((n=s.tab)==null?void 0:n.id)??o.tabId;if(o.type==="FORENSIC_SESSION_START")r&&w.set(r,{sessionId:o.metadata.id,sessionName:o.metadata.name,startTime:o.metadata.startTime,initialUrl:o.metadata.url,isRecording:!0}),await h.saveSession(o.metadata),o.initialSnapshot&&await h.saveInitialSnapshot(o.metadata.id,o.initialSnapshot),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0,sessionId:o.metadata.id});else if(o.type==="GET_TAB_RECORDING_STATE"){const i=r?w.get(r):null;e({isRecording:!!(i!=null&&i.isRecording),recording:i||null})}else if(o.type==="FORENSIC_EVENTS_CHUNK")await h.appendEvents(o.sessionId,o.events),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0});else if(o.type==="FORENSIC_CHECKPOINT")await h.saveCheckpoint(o.checkpoint),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0});else if(o.type==="FORENSIC_SESSION_STOP"){r&&w.delete(r);const i=await h.getSession(o.sessionId);i&&(i.status="stopped",i.endTime=Date.now(),(c=o.metadata)!=null&&c.durationMs&&(i.durationMs=o.metadata.durationMs),await h.saveSession(i)),d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0})}else if(o.type==="OPEN_DASHBOARD_TAB"){const i=chrome.runtime.getURL(`dist/src/ui/index.html${o.sessionId?`?session=${o.sessionId}`:""}`);chrome.tabs.create({url:i}),e({success:!0,url:i})}else if(o.type==="CAPTURE_SCREENSHOT"){if((t=chrome.tabs)!=null&&t.captureVisibleTab){chrome.tabs.captureVisibleTab({format:"png"},i=>{e({success:!!i,dataUrl:i})});return}e({success:!1,error:"Screenshot capture unsupported"})}else if(o.type==="ELEMENT_SELECTED")d&&d.readyState===WebSocket.OPEN&&d.send(JSON.stringify(o)),e({success:!0});else if(o.type==="BROWSER_COMMAND_REQUEST")try{const i=await O(o.command,o.payload);e({id:o.id,command:o.command,success:!0,data:i})}catch(i){e({id:o.id,command:o.command,success:!1,error:{code:"COMMAND_ERROR",message:i.message}})}}catch(r){e({success:!1,error:r.message})}})(),!0)),b()})(); diff --git a/dist/server/bridge-server.js b/dist/server/bridge-server.js index a5935064..3de222fe 100644 --- a/dist/server/bridge-server.js +++ b/dist/server/bridge-server.js @@ -123,14 +123,14 @@ class FileStorageProvider { async saveSession(metadata) { const dir = this.getSessionDir(metadata.id); const metaPath = path.join(dir, "metadata.json"); - fs.writeFileSync(metaPath, JSON.stringify(metadata, null, 2), "utf-8"); + await fs.promises.writeFile(metaPath, JSON.stringify(metadata, null, 2), "utf-8"); } async getSession(sessionId) { const dir = path.join(this.baseDir, sessionId); const metaPath = path.join(dir, "metadata.json"); if (!fs.existsSync(metaPath)) return null; try { - const data = fs.readFileSync(metaPath, "utf-8"); + const data = await fs.promises.readFile(metaPath, "utf-8"); return JSON.parse(data); } catch { return null; @@ -157,7 +157,7 @@ class FileStorageProvider { async deleteSession(sessionId) { const dir = path.join(this.baseDir, sessionId); if (fs.existsSync(dir)) { - fs.rmSync(dir, { recursive: true, force: true }); + await fs.promises.rm(dir, { recursive: true, force: true }); return true; } return false; @@ -167,7 +167,7 @@ class FileStorageProvider { const dir = this.getSessionDir(sessionId); const eventsPath = path.join(dir, "events.jsonl"); const lines = events.map((e) => JSON.stringify(e)).join("\n") + "\n"; - fs.appendFileSync(eventsPath, lines, "utf-8"); + await fs.promises.appendFile(eventsPath, lines, "utf-8"); } async getEvents(sessionId, filter) { const dir = path.join(this.baseDir, sessionId); @@ -241,7 +241,7 @@ class FileStorageProvider { const chkDir = path.join(dir, "checkpoints"); if (!fs.existsSync(chkDir)) fs.mkdirSync(chkDir, { recursive: true }); const file = path.join(chkDir, `${checkpoint.checkpointId}.json`); - fs.writeFileSync(file, JSON.stringify(checkpoint, null, 2), "utf-8"); + await fs.promises.writeFile(file, JSON.stringify(checkpoint, null, 2), "utf-8"); } async getCheckpoints(sessionId) { const dir = path.join(this.baseDir, sessionId, "checkpoints"); @@ -250,7 +250,7 @@ class FileStorageProvider { const checkpoints = []; for (const f of files) { try { - const data = fs.readFileSync(path.join(dir, f), "utf-8"); + const data = await fs.promises.readFile(path.join(dir, f), "utf-8"); checkpoints.push(JSON.parse(data)); } catch { } @@ -260,14 +260,14 @@ class FileStorageProvider { async saveInitialSnapshot(sessionId, snapshot) { const dir = this.getSessionDir(sessionId); const file = path.join(dir, "initial_snapshot.json"); - fs.writeFileSync(file, JSON.stringify(snapshot, null, 2), "utf-8"); + await fs.promises.writeFile(file, JSON.stringify(snapshot, null, 2), "utf-8"); } async getInitialSnapshot(sessionId) { const dir = path.join(this.baseDir, sessionId); const file = path.join(dir, "initial_snapshot.json"); if (!fs.existsSync(file)) return null; try { - return JSON.parse(fs.readFileSync(file, "utf-8")); + return JSON.parse(await fs.promises.readFile(file, "utf-8")); } catch { return null; } @@ -278,13 +278,13 @@ class FileStorageProvider { let list = []; if (fs.existsSync(annPath)) { try { - list = JSON.parse(fs.readFileSync(annPath, "utf-8")); + list = JSON.parse(await fs.promises.readFile(annPath, "utf-8")); } catch { list = []; } } list.push(annotation); - fs.writeFileSync(annPath, JSON.stringify(list, null, 2), "utf-8"); + await fs.promises.writeFile(annPath, JSON.stringify(list, null, 2), "utf-8"); } async getAnnotations(sessionId) { const dir = path.join(this.baseDir, sessionId); @@ -10471,6 +10471,111 @@ function buildToolCatalog() { } return catalog; } +const TELEDOM_PROFILE_TOOLS = { + // Minimal profile: strictly essential browser actions (~22 tools, ~2.5k tokens) + minimal: [ + "td_browser_navigate", + "td_browser_back", + "td_browser_forward", + "td_browser_refresh", + "td_dom_inspect", + "td_dom_query", + "td_dom_extract", + "td_dom_snapshot", + "td_target_find", + "td_target_check", + "td_action_click", + "td_action_type", + "td_action_select", + "td_action_press", + "td_action_scroll", + "td_wait", + "td_screenshot", + "td_execute_script", + "list_tabs", + "focus_tab", + "close_tab", + "open_tab" + ], + // Core profile: browser primitives + workflow runtime + target memory (~44 tools, ~4.8k tokens) + core: [ + "td_browser_navigate", + "td_browser_back", + "td_browser_forward", + "td_browser_refresh", + "td_dom_inspect", + "td_dom_query", + "td_dom_extract", + "td_dom_snapshot", + "td_target_find", + "td_target_check", + "td_target_describe", + "td_action_click", + "td_action_type", + "td_action_select", + "td_action_hover", + "td_action_press", + "td_action_scroll", + "td_wait", + "td_screenshot", + "td_execute_script", + "td_network_inspect", + "td_console_read", + "td_workflow_save", + "td_workflow_get", + "td_workflow_list", + "td_workflow_update", + "td_workflow_delete", + "td_workflow_validate", + "td_workflow_run", + "td_workflow_runs", + "td_workflow_replay", + "td_target_memory_save", + "td_target_memory_get", + "td_target_memory_list", + "td_target_memory_delete", + "list_tabs", + "focus_tab", + "reload_tab", + "close_tab", + "open_tab", + "inspect_live_page", + "inspect_live_element" + ], + // Forensics profile: historical forensics + diffs + causality + live inspection (~50 tools) + forensics: [ + "list_sessions", + "get_session", + "export_session", + "import_session", + "delete_session", + "get_timeline", + "get_events", + "get_events_around", + "get_dom_state", + "get_dom_node", + "get_dom_subtree", + "diff_dom", + "trace_element", + "find_disappearing_elements", + "why_did_element_disappear", + "get_diagnostics", + "get_network_events", + "get_screenshots", + "td_browser_navigate", + "td_dom_inspect", + "td_dom_query", + "td_dom_extract", + "td_screenshot", + "td_action_click", + "td_action_type", + "td_workflow_run", + "list_tabs", + "focus_tab" + ], + // Full profile: all 350 tools (null means no filtering) + full: null +}; const MCPDOM_V3_TOOLS = [ // ================================================================== // Targeting & forensics @@ -25415,12 +25520,14 @@ class MCPBridgeServer { if (targets.length === 0) { for (const [sock, meta] of this.socketMetadata.entries()) { if (meta.clientType === "CONTENT_SCRIPT" && sock.readyState === WebSocket.OPEN) { - targets.push(sock); + targets = [sock]; + break; } } } - if (targets.length === 0) { - targets = Array.from(this.activeSockets); + if (targets.length === 0 && this.activeSockets.size > 0) { + const first = Array.from(this.activeSockets).find((s) => s.readyState === WebSocket.OPEN); + if (first) targets = [first]; } let sentCount = 0; for (const ws of targets) { @@ -25443,17 +25550,53 @@ class MCPBridgeServer { } start() { return new Promise((resolve, reject) => { + const isTrustedOrigin = (origin) => { + if (!origin) return true; + if (origin.startsWith("chrome-extension://")) return true; + if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) return true; + return false; + }; this.httpServer = http.createServer(async (req, res) => { - res.setHeader("Access-Control-Allow-Origin", "*"); + const origin = req.headers.origin; + if (origin) { + if (isTrustedOrigin(origin)) { + res.setHeader("Access-Control-Allow-Origin", origin); + res.setHeader("Access-Control-Allow-Credentials", "true"); + res.setHeader("Vary", "Origin"); + } else if (req.method === "OPTIONS") { + res.writeHead(403, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: "CORS Forbidden: Untrusted cross-origin request rejected" })); + return; + } + } res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); - res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, x-teledom-token"); if (req.method === "OPTIONS") { res.writeHead(204); res.end(); return; } const url = req.url || ""; - if (url === "/health" && req.method === "GET") { + const isAuthValid = () => { + if (!isTrustedOrigin(origin)) return false; + const expectedToken = process.env.TELEDOM_BRIDGE_TOKEN; + if (!expectedToken) return true; + const authHeader = req.headers.authorization; + const tokenHeader = req.headers["x-teledom-token"]; + let queryToken = null; + try { + const parsed = new URL(url, "http://127.0.0.1"); + queryToken = parsed.searchParams.get("token"); + } catch { + } + if (authHeader && authHeader.startsWith("Bearer ")) { + return authHeader.slice(7).trim() === expectedToken; + } + if (tokenHeader && tokenHeader === expectedToken) return true; + if (queryToken && queryToken === expectedToken) return true; + return false; + }; + if (url.startsWith("/health") && req.method === "GET") { res.writeHead(200, { "Content-Type": "application/json" }); res.end( JSON.stringify({ @@ -25465,6 +25608,13 @@ class MCPBridgeServer { ); return; } + if (["/api/mcp/tool", "/api/tabs/close", "/api/sessions/upload"].some((p) => url.startsWith(p))) { + if (!isAuthValid()) { + res.writeHead(403, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: "Forbidden: Invalid or missing authorization credentials" })); + return; + } + } const MAX_PAYLOAD_BYTES = 50 * 1024 * 1024; if (url === "/api/sessions/upload" && req.method === "POST") { let body = ""; @@ -25583,7 +25733,13 @@ class MCPBridgeServer { } }, 3e4); this.healthSweepInterval?.unref?.(); - this.wss.on("connection", (ws) => { + this.wss.on("connection", (ws, req) => { + const origin = req?.headers?.origin; + if (origin && !isTrustedOrigin(origin)) { + console.error(`[MCP Bridge] WebSocket connection rejected from untrusted origin: ${origin}`); + ws.close(4403, "Forbidden origin"); + return; + } this.activeSockets.add(ws); console.error(`[MCP Bridge] Client connected. Total active clients: ${this.activeSockets.size}`); ws.on("close", () => { @@ -25714,5 +25870,6 @@ export { TELEDOM_INTELLIGENCE_TOOLS as T, TELEDOM_VERSION as a, FileStorageProvider as b, - MCPToolsHandler as c + MCPToolsHandler as c, + TELEDOM_PROFILE_TOOLS as d }; diff --git a/dist/server/mcp-server.js b/dist/server/mcp-server.js index bf9f2d9e..e8f91c4c 100644 --- a/dist/server/mcp-server.js +++ b/dist/server/mcp-server.js @@ -1,6 +1,6 @@ import * as readline from "readline"; import * as fs from "fs"; -import { M as MCPDOM_V3_TOOLS, D as DEVTOOLS_TOOLS, F as FORENSICS_TOOLS, T as TELEDOM_INTELLIGENCE_TOOLS, a as TELEDOM_VERSION, b as FileStorageProvider, c as MCPToolsHandler, MCPBridgeServer } from "./bridge-server.js"; +import { M as MCPDOM_V3_TOOLS, D as DEVTOOLS_TOOLS, F as FORENSICS_TOOLS, T as TELEDOM_INTELLIGENCE_TOOLS, a as TELEDOM_VERSION, b as FileStorageProvider, c as MCPToolsHandler, MCPBridgeServer, d as TELEDOM_PROFILE_TOOLS } from "./bridge-server.js"; import "http"; import "ws"; import "path"; @@ -872,9 +872,15 @@ class ForensicMCPServer { const disableDevTools = process.env.FORENSIC_DISABLE_DEVTOOLS === "true"; const disableForensics = process.env.FORENSIC_DISABLE_FORENSICS === "true"; const disableIntelligence = process.env.FORENSIC_DISABLE_INTELLIGENCE === "true"; - const tools = FORENSIC_MCP_TOOLS.filter( + const profile = (process.env.TELEDOM_PROFILE || "full").toLowerCase(); + const profileAllowed = TELEDOM_PROFILE_TOOLS[profile]; + let tools = FORENSIC_MCP_TOOLS.filter( (t) => !(disableDevTools && t.name.startsWith("dt_")) && !(disableForensics && t.name.startsWith("fx_")) && !(disableIntelligence && t.name.startsWith("td_")) ); + if (profileAllowed && Array.isArray(profileAllowed)) { + const allowedSet = new Set(profileAllowed); + tools = tools.filter((t) => allowedSet.has(t.name)); + } return { jsonrpc: "2.0", id, @@ -1077,5 +1083,6 @@ export { FORENSIC_MCP_TOOLS, FileStorageProvider, ForensicMCPServer, - MCPToolsHandler + MCPToolsHandler, + TELEDOM_PROFILE_TOOLS }; diff --git a/dist/src/extension/devtools/devtools.html b/dist/src/extension/devtools/devtools.html index e5ead51c..ec623abe 100644 --- a/dist/src/extension/devtools/devtools.html +++ b/dist/src/extension/devtools/devtools.html @@ -1,10 +1,10 @@ - - - - + + + + - - - - + + + + diff --git a/dist/src/extension/popup/popup.html b/dist/src/extension/popup/popup.html index 9f991f9c..6b4f597e 100644 --- a/dist/src/extension/popup/popup.html +++ b/dist/src/extension/popup/popup.html @@ -1,54 +1,54 @@ - - - - - Forensic Recorder + + + + + Forensic Recorder - - - - - + + + + + diff --git a/dist/src/ui/index.html b/dist/src/ui/index.html index e82ee8a9..0412e036 100644 --- a/dist/src/ui/index.html +++ b/dist/src/ui/index.html @@ -1,243 +1,243 @@ - - - - - - Browser Forensic Recorder & Time-Travel Debugger + + + + + + Browser Forensic Recorder & Time-Travel Debugger - - - -
-
-
-
- Browser Forensic Debugger - v2.0 MCP -
-
- -
-
- - -
-
- -
- - - - - - - -
-
- - -
- -
-
-
- T: 0.0ms | URL: - -
-
-
-
- - -
- - -
- -
-
-
-
Load or record a session to inspect DOM.
-
-
-
Select an element from the DOM tree or replay viewport.
-
-
-
- - -
-
-
- - - - - - -
-
-
-
Select timestamps and click Compare States.
-
-
-
- - -
-
-
-

Disappearing UI Forensic Diagnosis

-
- - -
-
-
-
Enter a CSS selector or node ID to run root-cause diagnosis.
-
-
-
- - -
-
-
No console or error events recorded.
-
-
- - -
-
-
No network events recorded.
-
-
- - -
-
-
- - -
-
-
-
- - -
-
-
-
-
⚡ Agent-Owned Workflows
-
TeleDOM stores and executes; the agent designs and repairs. Teach once · Reuse forever · Prove what happened.
-
- -
-
-
Recent Runs
-
-
-
-
-
-
- - -
-
-
- - - - - -
- -
- 0.0ms - / 0.0ms -
- -
- - -
-
- -
-
-
-
-
DOM Mut
-
-
-
-
User Act
-
-
-
-
Errors
-
-
-
-
Network
-
-
-
-
- - - - - - - - + + + +
+
+
+
+ Browser Forensic Debugger + v2.0 MCP +
+
+ +
+
+ + +
+
+ +
+ + + + + + + +
+
+ + +
+ +
+
+
+ T: 0.0ms | URL: - +
+
+
+
+ + +
+ + +
+ +
+
+
+
Load or record a session to inspect DOM.
+
+
+
Select an element from the DOM tree or replay viewport.
+
+
+
+ + +
+
+
+ + + + + + +
+
+
+
Select timestamps and click Compare States.
+
+
+
+ + +
+
+
+

Disappearing UI Forensic Diagnosis

+
+ + +
+
+
+
Enter a CSS selector or node ID to run root-cause diagnosis.
+
+
+
+ + +
+
+
No console or error events recorded.
+
+
+ + +
+
+
No network events recorded.
+
+
+ + +
+
+
+ + +
+
+
+
+ + +
+
+
+
+
⚡ Agent-Owned Workflows
+
TeleDOM stores and executes; the agent designs and repairs. Teach once · Reuse forever · Prove what happened.
+
+ +
+
+
Recent Runs
+
+
+
+
+
+
+ + +
+
+
+ + + + + +
+ +
+ 0.0ms + / 0.0ms +
+ +
+ + +
+
+ +
+
+
+
+
DOM Mut
+
+
+
+
User Act
+
+
+
+
Errors
+
+
+
+
Network
+
+
+
+
+ + + + + + + + diff --git a/docs/intelligence/BENCHMARKS.md b/docs/intelligence/BENCHMARKS.md index 6ac4f868..94280892 100644 --- a/docs/intelligence/BENCHMARKS.md +++ b/docs/intelligence/BENCHMARKS.md @@ -1,23 +1,23 @@ # TeleDOM v4 — Measured Benchmarks & Suite Metrics -Generated: 2026-09-11T18:05:59.466Z (local deterministic measurements on this machine — not marketing numbers) +Generated: 2026-09-12T07:22:28.467Z (local deterministic measurements on this machine — not marketing numbers) ## Event-scale benchmark matrix | Metric | 10K events | 100K events | 1M events | |---|---|---|---| -| Capture overhead (ms per 10K events) | 248.3 | 213.63 | 88.71 | +| Capture overhead (ms per 10K events) | 211.58 | 180.81 | 135.08 | | Bytes per event (approx) | 352 | 355 | 358 | -| Reconstruction p50 (ms) | 3.62 | 19.1 | 116.78 | -| Reconstruction p95 (ms) | 5.7 | 30.08 | 234.64 | -| Reconstruction p99 (ms) | 5.7 | 78.02 | 259.34 | -| Temporal query p50 (ms) | 0.81 | 4.93 | 25.89 | -| Temporal query p95 (ms) | 8.6 | 7.07 | 33.14 | -| Temporal query p99 (ms) | 8.6 | 9.83 | 57.53 | -| Graph query latency (ms) | 52.21 | 30.6 | 20.2 | -| Investigation latency (ms) | 117.01 | 64.33 | 59.17 | -| Branch simulation latency (ms) | 27.64 | 125.92 | 899.42 | -| Recovery time (serialize+restore, ms) | 112.65 | 457.84 | 4467.36 | +| Reconstruction p50 (ms) | 4.35 | 18.63 | 114.73 | +| Reconstruction p95 (ms) | 25.14 | 43.18 | 226.75 | +| Reconstruction p99 (ms) | 25.14 | 46.93 | 239.83 | +| Temporal query p50 (ms) | 0.92 | 4.69 | 29.54 | +| Temporal query p95 (ms) | 1.72 | 6.87 | 45.49 | +| Temporal query p99 (ms) | 1.72 | 8.24 | 55.39 | +| Graph query latency (ms) | 55.56 | 44.03 | 21.83 | +| Investigation latency (ms) | 582.07 | 120.2 | 66.39 | +| Branch simulation latency (ms) | 28.74 | 120.73 | 882.66 | +| Recovery time (serialize+restore, ms) | 92.57 | 966.19 | 5446.28 | **Timestamp resolution: 0.01 ms — tracked SEPARATELY from reconstruction/query latency (never conflated).** diff --git a/docs/intelligence/COMPATIBILITY.md b/docs/intelligence/COMPATIBILITY.md index 303f8c12..4eb26301 100644 --- a/docs/intelligence/COMPATIBILITY.md +++ b/docs/intelligence/COMPATIBILITY.md @@ -1,6 +1,6 @@ # TeleDOM v4 — Compatibility Matrix (generated) -Generated: 2026-09-11T18:05:32.304Z · TeleDOM version: 4.1.0 +Generated: 2026-09-12T07:22:00.113Z · TeleDOM version: 4.1.0 **Surfaces**: td_=144 · dt_=54 · fx_=31 · base=47 · v3=74 · **total=350** diff --git a/manifest.json b/manifest.json index 63066493..5c230ce8 100644 --- a/manifest.json +++ b/manifest.json @@ -16,7 +16,8 @@ "tabs", "webNavigation", "management", - "debugger" + "debugger", + "alarms" ], "host_permissions": [ "" diff --git a/src/extension/background/service-worker.ts b/src/extension/background/service-worker.ts index 6b8ef8ae..097d4378 100644 --- a/src/extension/background/service-worker.ts +++ b/src/extension/background/service-worker.ts @@ -335,7 +335,11 @@ async function executeBackgroundCommand(command: string, payload: any): Promise< } (chrome as any).debugger.attach({ tabId }, '1.3', () => { if (chrome.runtime.lastError) { - return reject(new Error(`CDP_ATTACH failed: ${chrome.runtime.lastError.message}`)); + const errMsg = chrome.runtime.lastError.message || ''; + if (errMsg.includes('Another debugger is already attached')) { + return reject(new Error(`CDP_ATTACH failed: Chrome DevTools (F12) is already open on tab ${tabId}. Please close the F12 panel on that tab so TeleDOM can attach.`)); + } + return reject(new Error(`CDP_ATTACH failed: ${errMsg}`)); } // Bind the gateway session to this tab (used by CDP_COMMAND/DETACH). if (payload?.sessionId) cdpTargetsBySession.set(String(payload.sessionId), tabId); @@ -598,6 +602,28 @@ function ensureReconnect() { } } +// Manifest V3 Service Worker Keep-Alive via chrome.alarms (prevents 30s idle termination) +if (typeof chrome !== 'undefined' && chrome.alarms) { + try { + chrome.alarms.create('teledom_bridge_keepalive', { periodInMinutes: 0.4 }); + chrome.alarms.onAlarm.addListener((alarm) => { + if (alarm.name === 'teledom_bridge_keepalive') { + if (!wsBridge || wsBridge.readyState !== WebSocket.OPEN) { + connectBridge(); + } else { + try { + wsBridge.send(JSON.stringify({ type: 'HEARTBEAT', timestamp: Date.now() })); + } catch { + connectBridge(); + } + } + } + }); + } catch (err: any) { + console.warn('[ServiceWorker] Alarms keepalive setup failed:', err?.message); + } +} + // Start bridge connection connectBridge(); diff --git a/src/extension/content/content-script.ts b/src/extension/content/content-script.ts index b0865002..686be22c 100644 --- a/src/extension/content/content-script.ts +++ b/src/extension/content/content-script.ts @@ -415,194 +415,8 @@ import { InPageFloatingController } from './floating-controller'; }); } - // Direct WebSocket connection to MCP Bridge for immediate tab communication - let directWs: WebSocket | null = null; - let directReconnectTimer: any = null; - - function connectDirectBridge() { - if (typeof WebSocket === 'undefined') return; - try { - const ws = new WebSocket('ws://127.0.0.1:3847'); - ws.onopen = () => { - directWs = ws; - console.log('[Forensic ContentScript] Connected directly to MCP Bridge on ws://127.0.0.1:3847'); - if (directReconnectTimer) { - clearInterval(directReconnectTimer); - directReconnectTimer = null; - } - ws.send( - JSON.stringify({ - type: 'REGISTER_CLIENT', - clientType: 'CONTENT_SCRIPT', - url: window.location.href, - title: document.title, - }) - ); - }; - - ws.onclose = () => { - directWs = null; - ensureDirectReconnect(); - }; - - ws.onerror = () => { - directWs = null; - ensureDirectReconnect(); - }; - - ws.onmessage = async (event) => { - try { - const message = JSON.parse(event.data.toString()); - if (message.type === 'BROWSER_COMMAND_REQUEST') { - const { id, command, payload } = message; - - // 1. Background commands & Tab management - if (['LIST_TABS', 'OPEN_TAB', 'LIST_EXTENSIONS', 'RELOAD_EXTENSION', 'CLOSE_TAB', 'FOCUS_TAB', 'RELOAD_TAB', 'RESIZE_VIEWPORT', 'RESET_VIEWPORT'].includes(command)) { - if (typeof chrome !== 'undefined' && chrome.runtime?.sendMessage) { - chrome.runtime.sendMessage(message, (res) => { - if (chrome.runtime.lastError) { - // Local fallback if background unreachable - if (command === 'CLOSE_TAB') { - ws.send(JSON.stringify({ type: 'BROWSER_COMMAND_RESPONSE', id, command, success: true, data: { closed: true, url: window.location.href, title: document.title } })); - setTimeout(() => window.close(), 100); - return; - } - if (command === 'RELOAD_TAB') { - ws.send(JSON.stringify({ type: 'BROWSER_COMMAND_RESPONSE', id, command, success: true, data: { reloaded: true, url: window.location.href, title: document.title } })); - setTimeout(() => window.location.reload(), 100); - return; - } - ws.send( - JSON.stringify({ - type: 'BROWSER_COMMAND_RESPONSE', - id, - command, - success: false, - error: { code: 'FORWARD_ERROR', message: chrome.runtime.lastError.message }, - }) - ); - } else { - ws.send(JSON.stringify({ type: 'BROWSER_COMMAND_RESPONSE', ...(res || { id, command, success: true }) })); - } - }); - return; - } - - if (command === 'CLOSE_TAB') { - ws.send(JSON.stringify({ type: 'BROWSER_COMMAND_RESPONSE', id, command, success: true, data: { closed: true, url: window.location.href, title: document.title } })); - setTimeout(() => window.close(), 100); - return; - } - if (command === 'RELOAD_TAB') { - ws.send(JSON.stringify({ type: 'BROWSER_COMMAND_RESPONSE', id, command, success: true, data: { reloaded: true, url: window.location.href, title: document.title } })); - setTimeout(() => window.location.reload(), 100); - return; - } - } - - // 3. GET_TAB_CONSOLE_LOGS - if (command === 'GET_TAB_CONSOLE_LOGS') { - const { level, searchQuery, limit = 100, clearAfterRead } = payload || {}; - let logs = [...liveConsoleLogs]; - if (level && level !== 'all') { - logs = logs.filter((l) => l.level === level); - } - if (searchQuery) { - const q = String(searchQuery).toLowerCase(); - logs = logs.filter((l) => l.text?.toLowerCase().includes(q) || l.source?.toLowerCase().includes(q)); - } - if (limit > 0) { - logs = logs.slice(-limit); - } - if (clearAfterRead) { - liveConsoleLogs.length = 0; - } - ws.send( - JSON.stringify({ - type: 'BROWSER_COMMAND_RESPONSE', - id, - command, - success: true, - data: { - url: window.location.href, - title: document.title, - totalCaptured: liveConsoleLogs.length, - returnedCount: logs.length, - logs, - }, - }) - ); - return; - } - - // 4. GET_TAB_NETWORK_REQUESTS - if (command === 'GET_TAB_NETWORK_REQUESTS') { - const { method, searchQuery, status, onlyErrors, limit = 100, clearAfterRead } = payload || {}; - let reqs = [...liveNetworkRequests]; - if (method) { - reqs = reqs.filter((r) => r.method?.toUpperCase() === String(method).toUpperCase()); - } - if (status) { - reqs = reqs.filter((r) => r.status === Number(status)); - } - if (onlyErrors) { - reqs = reqs.filter((r) => r.error || (r.status && r.status >= 400)); - } - if (searchQuery) { - const q = String(searchQuery).toLowerCase(); - reqs = reqs.filter((r) => r.url?.toLowerCase().includes(q)); - } - if (limit > 0) { - reqs = reqs.slice(-limit); - } - if (clearAfterRead) { - liveNetworkRequests.length = 0; - } - ws.send( - JSON.stringify({ - type: 'BROWSER_COMMAND_RESPONSE', - id, - command, - success: true, - data: { - url: window.location.href, - title: document.title, - totalCaptured: liveNetworkRequests.length, - returnedCount: reqs.length, - requests: reqs, - }, - }) - ); - return; - } - - // 5. DOM Commands - const res = await liveController.handleCommand(message, document); - ws.send(JSON.stringify(res)); - } - } catch (err: any) { - console.error('[Forensic ContentScript] Bridge message error:', err); - } - }; - } catch { - directWs = null; - ensureDirectReconnect(); - } - } - - function ensureDirectReconnect() { - if (!directReconnectTimer) { - directReconnectTimer = setInterval(() => { - if (!directWs || directWs.readyState !== WebSocket.OPEN) { - connectDirectBridge(); - } - }, 4000); - } - } - - // Initialize + // Initialize injected page script injectPageScript(); - connectDirectBridge(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initAutoReconnect); diff --git a/src/mcp/bridge-server.ts b/src/mcp/bridge-server.ts index 689336c6..20347ad0 100644 --- a/src/mcp/bridge-server.ts +++ b/src/mcp/bridge-server.ts @@ -104,17 +104,19 @@ export class MCPBridgeServer implements BrowserBridgeClient { } } - // If no service worker connected, fallback to CONTENT_SCRIPT sockets + // If no service worker connected, fallback to a single primary CONTENT_SCRIPT socket (never broadcast commands to all tabs) if (targets.length === 0) { for (const [sock, meta] of this.socketMetadata.entries()) { if (meta.clientType === 'CONTENT_SCRIPT' && sock.readyState === WebSocket.OPEN) { - targets.push(sock); + targets = [sock]; + break; } } } - if (targets.length === 0) { - targets = Array.from(this.activeSockets); + if (targets.length === 0 && this.activeSockets.size > 0) { + const first = Array.from(this.activeSockets).find((s) => s.readyState === WebSocket.OPEN); + if (first) targets = [first]; } let sentCount = 0; @@ -142,11 +144,28 @@ export class MCPBridgeServer implements BrowserBridgeClient { public start(): Promise { return new Promise((resolve, reject) => { + const isTrustedOrigin = (origin?: string): boolean => { + if (!origin) return true; // Direct non-browser callers (Node, curl, stdio MCP) + if (origin.startsWith('chrome-extension://')) return true; + if (/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin)) return true; + return false; + }; + this.httpServer = http.createServer(async (req, res) => { - // Enable CORS - res.setHeader('Access-Control-Allow-Origin', '*'); + const origin = req.headers.origin; + if (origin) { + if (isTrustedOrigin(origin)) { + res.setHeader('Access-Control-Allow-Origin', origin); + res.setHeader('Access-Control-Allow-Credentials', 'true'); + res.setHeader('Vary', 'Origin'); + } else if (req.method === 'OPTIONS') { + res.writeHead(403, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'CORS Forbidden: Untrusted cross-origin request rejected' })); + return; + } + } res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, x-teledom-token'); if (req.method === 'OPTIONS') { res.writeHead(204); @@ -156,9 +175,29 @@ export class MCPBridgeServer implements BrowserBridgeClient { const url = req.url || ''; + // Security check for mutating and sensitive endpoints + const isAuthValid = (): boolean => { + if (!isTrustedOrigin(origin)) return false; + const expectedToken = process.env.TELEDOM_BRIDGE_TOKEN; + if (!expectedToken) return true; + const authHeader = req.headers.authorization; + const tokenHeader = req.headers['x-teledom-token']; + let queryToken: string | null = null; + try { + const parsed = new URL(url, 'http://127.0.0.1'); + queryToken = parsed.searchParams.get('token'); + } catch { /* ignored */ } + if (authHeader && authHeader.startsWith('Bearer ')) { + return authHeader.slice(7).trim() === expectedToken; + } + if (tokenHeader && tokenHeader === expectedToken) return true; + if (queryToken && queryToken === expectedToken) return true; + return false; + }; + // 1. Health check (v4.1 fix E-17: version derived from the // authoritative registry — was stale '3.0.0') - if (url === '/health' && req.method === 'GET') { + if (url.startsWith('/health') && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end( JSON.stringify({ @@ -171,6 +210,15 @@ export class MCPBridgeServer implements BrowserBridgeClient { return; } + // Enforce authorization for sensitive endpoints + if (['/api/mcp/tool', '/api/tabs/close', '/api/sessions/upload'].some(p => url.startsWith(p))) { + if (!isAuthValid()) { + res.writeHead(403, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ error: 'Forbidden: Invalid or missing authorization credentials' })); + return; + } + } + const MAX_PAYLOAD_BYTES = 50 * 1024 * 1024; // 50MB limit // 2. Upload Session Bundle @@ -301,7 +349,13 @@ export class MCPBridgeServer implements BrowserBridgeClient { }, 30000); (this.healthSweepInterval as any)?.unref?.(); - this.wss.on('connection', (ws: WebSocket) => { + this.wss.on('connection', (ws: WebSocket, req: http.IncomingMessage) => { + const origin = req?.headers?.origin; + if (origin && !isTrustedOrigin(origin)) { + console.error(`[MCP Bridge] WebSocket connection rejected from untrusted origin: ${origin}`); + ws.close(4403, 'Forbidden origin'); + return; + } this.activeSockets.add(ws); console.error(`[MCP Bridge] Client connected. Total active clients: ${this.activeSockets.size}`); diff --git a/src/mcp/server.ts b/src/mcp/server.ts index e76ef4f8..826b2673 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -11,8 +11,9 @@ import { LiveToolsHandler, BrowserBridgeClient } from './live-tools-handler'; import { MCPBridgeServer } from './bridge-server'; import { BrowserCommandType } from '../types/browser-control'; import { TELEDOM_VERSION } from '../intelligence/version'; +import { TELEDOM_PROFILE_TOOLS } from './tool-groups'; -export { FORENSIC_MCP_TOOLS, FileStorageProvider, MCPToolsHandler }; +export { FORENSIC_MCP_TOOLS, FileStorageProvider, MCPToolsHandler, TELEDOM_PROFILE_TOOLS }; export class ForensicMCPServer { private storage: ForensicStorageProvider; @@ -208,12 +209,21 @@ export class ForensicMCPServer { const disableDevTools = process.env.FORENSIC_DISABLE_DEVTOOLS === 'true'; const disableForensics = process.env.FORENSIC_DISABLE_FORENSICS === 'true'; const disableIntelligence = process.env.FORENSIC_DISABLE_INTELLIGENCE === 'true'; - const tools = FORENSIC_MCP_TOOLS.filter( + const profile = (process.env.TELEDOM_PROFILE || 'full').toLowerCase(); + const profileAllowed = TELEDOM_PROFILE_TOOLS[profile]; + + let tools = FORENSIC_MCP_TOOLS.filter( (t) => !(disableDevTools && t.name.startsWith('dt_')) && !(disableForensics && t.name.startsWith('fx_')) && !(disableIntelligence && t.name.startsWith('td_')), ); + + if (profileAllowed && Array.isArray(profileAllowed)) { + const allowedSet = new Set(profileAllowed); + tools = tools.filter((t) => allowedSet.has(t.name)); + } + return { jsonrpc: '2.0', id, diff --git a/src/mcp/tool-groups.ts b/src/mcp/tool-groups.ts index 68b3179c..27a81d5b 100644 --- a/src/mcp/tool-groups.ts +++ b/src/mcp/tool-groups.ts @@ -225,3 +225,41 @@ export function buildToolCatalog(): ToolDiscoveryInfo[] { export function findGroupOfTool(toolName: string): ToolGroupInfo | undefined { return TOOL_GROUPS.find((g) => g.tools.includes(toolName)); } + +export type TeledomProfileName = 'minimal' | 'core' | 'forensics' | 'full'; + +export const TELEDOM_PROFILE_TOOLS: Record = { + // Minimal profile: strictly essential browser actions (~22 tools, ~2.5k tokens) + minimal: [ + 'td_browser_navigate', 'td_browser_back', 'td_browser_forward', 'td_browser_refresh', + 'td_dom_inspect', 'td_dom_query', 'td_dom_extract', 'td_dom_snapshot', + 'td_target_find', 'td_target_check', + 'td_action_click', 'td_action_type', 'td_action_select', 'td_action_press', 'td_action_scroll', + 'td_wait', 'td_screenshot', 'td_execute_script', + 'list_tabs', 'focus_tab', 'close_tab', 'open_tab', + ], + // Core profile: browser primitives + workflow runtime + target memory (~44 tools, ~4.8k tokens) + core: [ + 'td_browser_navigate', 'td_browser_back', 'td_browser_forward', 'td_browser_refresh', + 'td_dom_inspect', 'td_dom_query', 'td_dom_extract', 'td_dom_snapshot', + 'td_target_find', 'td_target_check', 'td_target_describe', + 'td_action_click', 'td_action_type', 'td_action_select', 'td_action_hover', 'td_action_press', 'td_action_scroll', + 'td_wait', 'td_screenshot', 'td_execute_script', 'td_network_inspect', 'td_console_read', + 'td_workflow_save', 'td_workflow_get', 'td_workflow_list', 'td_workflow_update', 'td_workflow_delete', + 'td_workflow_validate', 'td_workflow_run', 'td_workflow_runs', 'td_workflow_replay', + 'td_target_memory_save', 'td_target_memory_get', 'td_target_memory_list', 'td_target_memory_delete', + 'list_tabs', 'focus_tab', 'reload_tab', 'close_tab', 'open_tab', + 'inspect_live_page', 'inspect_live_element', + ], + // Forensics profile: historical forensics + diffs + causality + live inspection (~50 tools) + forensics: [ + 'list_sessions', 'get_session', 'export_session', 'import_session', 'delete_session', + 'get_timeline', 'get_events', 'get_events_around', 'get_dom_state', 'get_dom_node', 'get_dom_subtree', + 'diff_dom', 'trace_element', 'find_disappearing_elements', 'why_did_element_disappear', + 'get_diagnostics', 'get_network_events', 'get_screenshots', + 'td_browser_navigate', 'td_dom_inspect', 'td_dom_query', 'td_dom_extract', 'td_screenshot', + 'td_action_click', 'td_action_type', 'td_workflow_run', 'list_tabs', 'focus_tab', + ], + // Full profile: all 350 tools (null means no filtering) + full: null, +}; diff --git a/src/storage/file-storage.ts b/src/storage/file-storage.ts index f119386f..ba82217a 100644 --- a/src/storage/file-storage.ts +++ b/src/storage/file-storage.ts @@ -28,7 +28,7 @@ export class FileStorageProvider implements ForensicStorageProvider { public async saveSession(metadata: SessionMetadata): Promise { const dir = this.getSessionDir(metadata.id); const metaPath = path.join(dir, 'metadata.json'); - fs.writeFileSync(metaPath, JSON.stringify(metadata, null, 2), 'utf-8'); + await fs.promises.writeFile(metaPath, JSON.stringify(metadata, null, 2), 'utf-8'); } public async getSession(sessionId: string): Promise { @@ -36,7 +36,7 @@ export class FileStorageProvider implements ForensicStorageProvider { const metaPath = path.join(dir, 'metadata.json'); if (!fs.existsSync(metaPath)) return null; try { - const data = fs.readFileSync(metaPath, 'utf-8'); + const data = await fs.promises.readFile(metaPath, 'utf-8'); return JSON.parse(data) as SessionMetadata; } catch { return null; @@ -68,7 +68,7 @@ export class FileStorageProvider implements ForensicStorageProvider { public async deleteSession(sessionId: string): Promise { const dir = path.join(this.baseDir, sessionId); if (fs.existsSync(dir)) { - fs.rmSync(dir, { recursive: true, force: true }); + await fs.promises.rm(dir, { recursive: true, force: true }); return true; } return false; @@ -79,7 +79,7 @@ export class FileStorageProvider implements ForensicStorageProvider { const dir = this.getSessionDir(sessionId); const eventsPath = path.join(dir, 'events.jsonl'); const lines = events.map((e) => JSON.stringify(e)).join('\n') + '\n'; - fs.appendFileSync(eventsPath, lines, 'utf-8'); + await fs.promises.appendFile(eventsPath, lines, 'utf-8'); } public async getEvents(sessionId: string, filter?: EventFilter): Promise { @@ -168,7 +168,7 @@ export class FileStorageProvider implements ForensicStorageProvider { if (!fs.existsSync(chkDir)) fs.mkdirSync(chkDir, { recursive: true }); const file = path.join(chkDir, `${checkpoint.checkpointId}.json`); - fs.writeFileSync(file, JSON.stringify(checkpoint, null, 2), 'utf-8'); + await fs.promises.writeFile(file, JSON.stringify(checkpoint, null, 2), 'utf-8'); } public async getCheckpoints(sessionId: string): Promise { @@ -180,7 +180,7 @@ export class FileStorageProvider implements ForensicStorageProvider { for (const f of files) { try { - const data = fs.readFileSync(path.join(dir, f), 'utf-8'); + const data = await fs.promises.readFile(path.join(dir, f), 'utf-8'); checkpoints.push(JSON.parse(data)); } catch { // Ignored @@ -193,7 +193,7 @@ export class FileStorageProvider implements ForensicStorageProvider { public async saveInitialSnapshot(sessionId: string, snapshot: DOMSnapshot): Promise { const dir = this.getSessionDir(sessionId); const file = path.join(dir, 'initial_snapshot.json'); - fs.writeFileSync(file, JSON.stringify(snapshot, null, 2), 'utf-8'); + await fs.promises.writeFile(file, JSON.stringify(snapshot, null, 2), 'utf-8'); } public async getInitialSnapshot(sessionId: string): Promise { @@ -201,7 +201,7 @@ export class FileStorageProvider implements ForensicStorageProvider { const file = path.join(dir, 'initial_snapshot.json'); if (!fs.existsSync(file)) return null; try { - return JSON.parse(fs.readFileSync(file, 'utf-8')) as DOMSnapshot; + return JSON.parse(await fs.promises.readFile(file, 'utf-8')) as DOMSnapshot; } catch { return null; } @@ -213,13 +213,13 @@ export class FileStorageProvider implements ForensicStorageProvider { let list: Annotation[] = []; if (fs.existsSync(annPath)) { try { - list = JSON.parse(fs.readFileSync(annPath, 'utf-8')); + list = JSON.parse(await fs.promises.readFile(annPath, 'utf-8')); } catch { list = []; } } list.push(annotation); - fs.writeFileSync(annPath, JSON.stringify(list, null, 2), 'utf-8'); + await fs.promises.writeFile(annPath, JSON.stringify(list, null, 2), 'utf-8'); } public async getAnnotations(sessionId: string): Promise { From 3e565aea0a0608763bca58d6ed4accb9e1d71927 Mon Sep 17 00:00:00 2001 From: Ali Rashidi Date: Sat, 12 Sep 2026 11:01:51 +0330 Subject: [PATCH 2/3] fix(resilience): eliminate silent catches and complete async non-blocking I/O in storage --- chrome-extension/dist/server/bridge-server.js | 131 ++++++++++++------ dist/server/bridge-server.js | 131 ++++++++++++------ src/forensics/handler.ts | 6 +- src/intelligence/workflow/store.ts | 10 +- src/mcp/live-tools-handler.ts | 14 +- src/projects/project-manager.ts | 8 +- src/storage/file-storage.ts | 97 ++++++++----- src/storage/recording-storage.ts | 7 +- 8 files changed, 270 insertions(+), 134 deletions(-) diff --git a/chrome-extension/dist/server/bridge-server.js b/chrome-extension/dist/server/bridge-server.js index 3de222fe..cd5d22e7 100644 --- a/chrome-extension/dist/server/bridge-server.js +++ b/chrome-extension/dist/server/bridge-server.js @@ -128,31 +128,39 @@ class FileStorageProvider { async getSession(sessionId) { const dir = path.join(this.baseDir, sessionId); const metaPath = path.join(dir, "metadata.json"); - if (!fs.existsSync(metaPath)) return null; try { const data = await fs.promises.readFile(metaPath, "utf-8"); return JSON.parse(data); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Warning: Failed to read session ${sessionId}: ${err?.message}`); + } return null; } } async listSessions() { if (!fs.existsSync(this.baseDir)) return []; - const entries = fs.readdirSync(this.baseDir, { withFileTypes: true }); - const sessions = []; - for (const entry of entries) { - if (entry.isDirectory()) { - const metaPath = path.join(this.baseDir, entry.name, "metadata.json"); - if (fs.existsSync(metaPath)) { + try { + const entries = await fs.promises.readdir(this.baseDir, { withFileTypes: true }); + const sessions = []; + for (const entry of entries) { + if (entry.isDirectory()) { + const metaPath = path.join(this.baseDir, entry.name, "metadata.json"); try { - const data = fs.readFileSync(metaPath, "utf-8"); + const data = await fs.promises.readFile(metaPath, "utf-8"); sessions.push(JSON.parse(data)); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Warning: Corrupt or unreadable session metadata at ${metaPath}: ${err?.message}`); + } } } } + return sessions.sort((a, b) => b.startTime - a.startTime); + } catch (err) { + console.error(`[FileStorage] Failed to list sessions from ${this.baseDir}:`, err?.message); + return []; } - return sessions.sort((a, b) => b.startTime - a.startTime); } async deleteSession(sessionId) { const dir = path.join(this.baseDir, sessionId); @@ -188,7 +196,8 @@ class FileStorageProvider { let e; try { e = JSON.parse(trimmed); - } catch { + } catch (parseErr) { + console.warn(`[FileStorage] Skipping malformed event line in session ${sessionId}:`, parseErr); continue; } if (filter) { @@ -239,23 +248,30 @@ class FileStorageProvider { async saveCheckpoint(checkpoint) { const dir = this.getSessionDir(checkpoint.sessionId); const chkDir = path.join(dir, "checkpoints"); - if (!fs.existsSync(chkDir)) fs.mkdirSync(chkDir, { recursive: true }); + await fs.promises.mkdir(chkDir, { recursive: true }); const file = path.join(chkDir, `${checkpoint.checkpointId}.json`); await fs.promises.writeFile(file, JSON.stringify(checkpoint, null, 2), "utf-8"); } async getCheckpoints(sessionId) { const dir = path.join(this.baseDir, sessionId, "checkpoints"); - if (!fs.existsSync(dir)) return []; - const files = fs.readdirSync(dir).filter((f) => f.endsWith(".json")); - const checkpoints = []; - for (const f of files) { - try { - const data = await fs.promises.readFile(path.join(dir, f), "utf-8"); - checkpoints.push(JSON.parse(data)); - } catch { + try { + const files = (await fs.promises.readdir(dir)).filter((f) => f.endsWith(".json")); + const checkpoints = []; + for (const f of files) { + try { + const data = await fs.promises.readFile(path.join(dir, f), "utf-8"); + checkpoints.push(JSON.parse(data)); + } catch (err) { + console.warn(`[FileStorage] Failed to read/parse checkpoint file ${f} in session ${sessionId}:`, err); + } } + return checkpoints.sort((a, b) => a.sequence - b.sequence); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Error accessing checkpoints directory for session ${sessionId}:`, err); + } + return []; } - return checkpoints.sort((a, b) => a.sequence - b.sequence); } async saveInitialSnapshot(sessionId, snapshot) { const dir = this.getSessionDir(sessionId); @@ -265,10 +281,13 @@ class FileStorageProvider { async getInitialSnapshot(sessionId) { const dir = path.join(this.baseDir, sessionId); const file = path.join(dir, "initial_snapshot.json"); - if (!fs.existsSync(file)) return null; try { - return JSON.parse(await fs.promises.readFile(file, "utf-8")); - } catch { + const content = await fs.promises.readFile(file, "utf-8"); + return JSON.parse(content); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Error reading initial snapshot for session ${sessionId}:`, err); + } return null; } } @@ -276,12 +295,14 @@ class FileStorageProvider { const dir = this.getSessionDir(annotation.sessionId); const annPath = path.join(dir, "annotations.json"); let list = []; - if (fs.existsSync(annPath)) { - try { - list = JSON.parse(await fs.promises.readFile(annPath, "utf-8")); - } catch { - list = []; + try { + const content = await fs.promises.readFile(annPath, "utf-8"); + list = JSON.parse(content); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Corrupted annotations file for session ${annotation.sessionId}, starting fresh:`, err); } + list = []; } list.push(annotation); await fs.promises.writeFile(annPath, JSON.stringify(list, null, 2), "utf-8"); @@ -289,10 +310,13 @@ class FileStorageProvider { async getAnnotations(sessionId) { const dir = path.join(this.baseDir, sessionId); const annPath = path.join(dir, "annotations.json"); - if (!fs.existsSync(annPath)) return []; try { - return JSON.parse(fs.readFileSync(annPath, "utf-8")); - } catch { + const content = await fs.promises.readFile(annPath, "utf-8"); + return JSON.parse(content); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Failed to read annotations for session ${sessionId}:`, err); + } return []; } } @@ -8997,7 +9021,18 @@ class LiveToolsHandler { } ] }; - } catch { + } catch (saveErr) { + return { + content: [ + { + type: "text", + text: JSON.stringify({ + ...finalSummary, + fileSaveError: `Failed to write pipeline output to ${args.outputPath}: ${saveErr?.message || saveErr}` + }, null, 2) + } + ] + }; } } return { @@ -9403,7 +9438,8 @@ class ProjectManager { try { const manifest = JSON.parse(fs__default.readFileSync(manifestPath, "utf-8")); out.push({ ...manifest, projectDir: path__default.join(this.baseDir, entry.name), pageCount: manifest.pages?.length || 0 }); - } catch { + } catch (err) { + console.warn(`[ProjectManager] Warning: Skipped corrupt project manifest at ${manifestPath}:`, err); } } return out.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); @@ -9664,7 +9700,8 @@ class ProjectManager { if (fs__default.existsSync(p)) { try { out.push(JSON.parse(fs__default.readFileSync(p, "utf-8"))); - } catch { + } catch (err) { + console.warn(`[ProjectManager] Warning: Skipped corrupt region file ${p}:`, err); } } } @@ -10026,7 +10063,8 @@ class CommandRecordingStorage { try { const raw = JSON.parse(fs__default.readFileSync(file, "utf-8")); return raw.recording || raw; - } catch { + } catch (err) { + console.warn(`[RecordingStorage] Warning: Failed to parse recording file ${file}:`, err); return null; } } @@ -10054,7 +10092,8 @@ class CommandRecordingStorage { tags: rec.tags || [], file: path__default.join(this.baseDir, entry.name) }); - } catch { + } catch (err) { + console.warn(`[RecordingStorage] Warning: Skipped corrupt recording file ${entry.name}:`, err); } } return out.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); @@ -18698,7 +18737,8 @@ class ForensicsToolsHandler { try { const res = await unifiedRuntime.bridgeCommand("LIVE_DOM_SNAPSHOT", { format: "json" }); return { snapshot: res }; - } catch { + } catch (err) { + console.warn(`[ForensicsHandler] Could not capture live snapshot: ${err?.message || err}`); return { snapshot: null }; } } @@ -18707,7 +18747,8 @@ async function runInPageSafe(code, tabId) { try { const { runInPage: runInPage2 } = await Promise.resolve().then(() => interactionCore); return await runInPage2(code, tabId); - } catch { + } catch (err) { + console.warn(`[ForensicsHandler] runInPageSafe failed for tab ${tabId}: ${err?.message || err}`); return null; } } @@ -22611,14 +22652,20 @@ class AgentStore { readJson(file) { try { return JSON.parse(fs.readFileSync(file, "utf-8")); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[WorkflowStore] Warning: Failed to read or parse ${file}:`, err?.message || err); + } return null; } } listJsonNames(dir) { try { return fs.readdirSync(dir).filter((f) => f.endsWith(".json")).sort(); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[WorkflowStore] Warning: Failed to list directory ${dir}:`, err?.message || err); + } return []; } } diff --git a/dist/server/bridge-server.js b/dist/server/bridge-server.js index 3de222fe..cd5d22e7 100644 --- a/dist/server/bridge-server.js +++ b/dist/server/bridge-server.js @@ -128,31 +128,39 @@ class FileStorageProvider { async getSession(sessionId) { const dir = path.join(this.baseDir, sessionId); const metaPath = path.join(dir, "metadata.json"); - if (!fs.existsSync(metaPath)) return null; try { const data = await fs.promises.readFile(metaPath, "utf-8"); return JSON.parse(data); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Warning: Failed to read session ${sessionId}: ${err?.message}`); + } return null; } } async listSessions() { if (!fs.existsSync(this.baseDir)) return []; - const entries = fs.readdirSync(this.baseDir, { withFileTypes: true }); - const sessions = []; - for (const entry of entries) { - if (entry.isDirectory()) { - const metaPath = path.join(this.baseDir, entry.name, "metadata.json"); - if (fs.existsSync(metaPath)) { + try { + const entries = await fs.promises.readdir(this.baseDir, { withFileTypes: true }); + const sessions = []; + for (const entry of entries) { + if (entry.isDirectory()) { + const metaPath = path.join(this.baseDir, entry.name, "metadata.json"); try { - const data = fs.readFileSync(metaPath, "utf-8"); + const data = await fs.promises.readFile(metaPath, "utf-8"); sessions.push(JSON.parse(data)); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Warning: Corrupt or unreadable session metadata at ${metaPath}: ${err?.message}`); + } } } } + return sessions.sort((a, b) => b.startTime - a.startTime); + } catch (err) { + console.error(`[FileStorage] Failed to list sessions from ${this.baseDir}:`, err?.message); + return []; } - return sessions.sort((a, b) => b.startTime - a.startTime); } async deleteSession(sessionId) { const dir = path.join(this.baseDir, sessionId); @@ -188,7 +196,8 @@ class FileStorageProvider { let e; try { e = JSON.parse(trimmed); - } catch { + } catch (parseErr) { + console.warn(`[FileStorage] Skipping malformed event line in session ${sessionId}:`, parseErr); continue; } if (filter) { @@ -239,23 +248,30 @@ class FileStorageProvider { async saveCheckpoint(checkpoint) { const dir = this.getSessionDir(checkpoint.sessionId); const chkDir = path.join(dir, "checkpoints"); - if (!fs.existsSync(chkDir)) fs.mkdirSync(chkDir, { recursive: true }); + await fs.promises.mkdir(chkDir, { recursive: true }); const file = path.join(chkDir, `${checkpoint.checkpointId}.json`); await fs.promises.writeFile(file, JSON.stringify(checkpoint, null, 2), "utf-8"); } async getCheckpoints(sessionId) { const dir = path.join(this.baseDir, sessionId, "checkpoints"); - if (!fs.existsSync(dir)) return []; - const files = fs.readdirSync(dir).filter((f) => f.endsWith(".json")); - const checkpoints = []; - for (const f of files) { - try { - const data = await fs.promises.readFile(path.join(dir, f), "utf-8"); - checkpoints.push(JSON.parse(data)); - } catch { + try { + const files = (await fs.promises.readdir(dir)).filter((f) => f.endsWith(".json")); + const checkpoints = []; + for (const f of files) { + try { + const data = await fs.promises.readFile(path.join(dir, f), "utf-8"); + checkpoints.push(JSON.parse(data)); + } catch (err) { + console.warn(`[FileStorage] Failed to read/parse checkpoint file ${f} in session ${sessionId}:`, err); + } } + return checkpoints.sort((a, b) => a.sequence - b.sequence); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Error accessing checkpoints directory for session ${sessionId}:`, err); + } + return []; } - return checkpoints.sort((a, b) => a.sequence - b.sequence); } async saveInitialSnapshot(sessionId, snapshot) { const dir = this.getSessionDir(sessionId); @@ -265,10 +281,13 @@ class FileStorageProvider { async getInitialSnapshot(sessionId) { const dir = path.join(this.baseDir, sessionId); const file = path.join(dir, "initial_snapshot.json"); - if (!fs.existsSync(file)) return null; try { - return JSON.parse(await fs.promises.readFile(file, "utf-8")); - } catch { + const content = await fs.promises.readFile(file, "utf-8"); + return JSON.parse(content); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Error reading initial snapshot for session ${sessionId}:`, err); + } return null; } } @@ -276,12 +295,14 @@ class FileStorageProvider { const dir = this.getSessionDir(annotation.sessionId); const annPath = path.join(dir, "annotations.json"); let list = []; - if (fs.existsSync(annPath)) { - try { - list = JSON.parse(await fs.promises.readFile(annPath, "utf-8")); - } catch { - list = []; + try { + const content = await fs.promises.readFile(annPath, "utf-8"); + list = JSON.parse(content); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Corrupted annotations file for session ${annotation.sessionId}, starting fresh:`, err); } + list = []; } list.push(annotation); await fs.promises.writeFile(annPath, JSON.stringify(list, null, 2), "utf-8"); @@ -289,10 +310,13 @@ class FileStorageProvider { async getAnnotations(sessionId) { const dir = path.join(this.baseDir, sessionId); const annPath = path.join(dir, "annotations.json"); - if (!fs.existsSync(annPath)) return []; try { - return JSON.parse(fs.readFileSync(annPath, "utf-8")); - } catch { + const content = await fs.promises.readFile(annPath, "utf-8"); + return JSON.parse(content); + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[FileStorage] Failed to read annotations for session ${sessionId}:`, err); + } return []; } } @@ -8997,7 +9021,18 @@ class LiveToolsHandler { } ] }; - } catch { + } catch (saveErr) { + return { + content: [ + { + type: "text", + text: JSON.stringify({ + ...finalSummary, + fileSaveError: `Failed to write pipeline output to ${args.outputPath}: ${saveErr?.message || saveErr}` + }, null, 2) + } + ] + }; } } return { @@ -9403,7 +9438,8 @@ class ProjectManager { try { const manifest = JSON.parse(fs__default.readFileSync(manifestPath, "utf-8")); out.push({ ...manifest, projectDir: path__default.join(this.baseDir, entry.name), pageCount: manifest.pages?.length || 0 }); - } catch { + } catch (err) { + console.warn(`[ProjectManager] Warning: Skipped corrupt project manifest at ${manifestPath}:`, err); } } return out.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); @@ -9664,7 +9700,8 @@ class ProjectManager { if (fs__default.existsSync(p)) { try { out.push(JSON.parse(fs__default.readFileSync(p, "utf-8"))); - } catch { + } catch (err) { + console.warn(`[ProjectManager] Warning: Skipped corrupt region file ${p}:`, err); } } } @@ -10026,7 +10063,8 @@ class CommandRecordingStorage { try { const raw = JSON.parse(fs__default.readFileSync(file, "utf-8")); return raw.recording || raw; - } catch { + } catch (err) { + console.warn(`[RecordingStorage] Warning: Failed to parse recording file ${file}:`, err); return null; } } @@ -10054,7 +10092,8 @@ class CommandRecordingStorage { tags: rec.tags || [], file: path__default.join(this.baseDir, entry.name) }); - } catch { + } catch (err) { + console.warn(`[RecordingStorage] Warning: Skipped corrupt recording file ${entry.name}:`, err); } } return out.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); @@ -18698,7 +18737,8 @@ class ForensicsToolsHandler { try { const res = await unifiedRuntime.bridgeCommand("LIVE_DOM_SNAPSHOT", { format: "json" }); return { snapshot: res }; - } catch { + } catch (err) { + console.warn(`[ForensicsHandler] Could not capture live snapshot: ${err?.message || err}`); return { snapshot: null }; } } @@ -18707,7 +18747,8 @@ async function runInPageSafe(code, tabId) { try { const { runInPage: runInPage2 } = await Promise.resolve().then(() => interactionCore); return await runInPage2(code, tabId); - } catch { + } catch (err) { + console.warn(`[ForensicsHandler] runInPageSafe failed for tab ${tabId}: ${err?.message || err}`); return null; } } @@ -22611,14 +22652,20 @@ class AgentStore { readJson(file) { try { return JSON.parse(fs.readFileSync(file, "utf-8")); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[WorkflowStore] Warning: Failed to read or parse ${file}:`, err?.message || err); + } return null; } } listJsonNames(dir) { try { return fs.readdirSync(dir).filter((f) => f.endsWith(".json")).sort(); - } catch { + } catch (err) { + if (err?.code !== "ENOENT") { + console.warn(`[WorkflowStore] Warning: Failed to list directory ${dir}:`, err?.message || err); + } return []; } } diff --git a/src/forensics/handler.ts b/src/forensics/handler.ts index dc0b7e5f..0d371171 100644 --- a/src/forensics/handler.ts +++ b/src/forensics/handler.ts @@ -445,7 +445,8 @@ export class ForensicsToolsHandler { try { const res = await unifiedRuntime.bridgeCommand('LIVE_DOM_SNAPSHOT', { format: 'json' }); return { snapshot: res }; - } catch { + } catch (err: any) { + console.warn(`[ForensicsHandler] Could not capture live snapshot: ${err?.message || err}`); return { snapshot: null }; } } @@ -455,7 +456,8 @@ async function runInPageSafe(code: string, tabId?: number): Promise(file: string): T | null { try { return JSON.parse(fs.readFileSync(file, 'utf-8')) as T; - } catch { + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[WorkflowStore] Warning: Failed to read or parse ${file}:`, err?.message || err); + } return null; } } @@ -157,7 +160,10 @@ export class AgentStore { private listJsonNames(dir: string): string[] { try { return fs.readdirSync(dir).filter((f) => f.endsWith('.json')).sort(); - } catch { + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[WorkflowStore] Warning: Failed to list directory ${dir}:`, err?.message || err); + } return []; } } diff --git a/src/mcp/live-tools-handler.ts b/src/mcp/live-tools-handler.ts index 021a0908..0510fcaa 100644 --- a/src/mcp/live-tools-handler.ts +++ b/src/mcp/live-tools-handler.ts @@ -687,8 +687,18 @@ export class LiveToolsHandler { }, ], }; - } catch { - // Fallthrough + } catch (saveErr: any) { + return { + content: [ + { + type: 'text', + text: JSON.stringify({ + ...finalSummary, + fileSaveError: `Failed to write pipeline output to ${args.outputPath}: ${saveErr?.message || saveErr}`, + }, null, 2), + }, + ], + }; } } diff --git a/src/projects/project-manager.ts b/src/projects/project-manager.ts index 1c1fe945..0965b1b6 100644 --- a/src/projects/project-manager.ts +++ b/src/projects/project-manager.ts @@ -124,8 +124,8 @@ export class ProjectManager { try { const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8')); out.push({ ...manifest, projectDir: path.join(this.baseDir, entry.name), pageCount: manifest.pages?.length || 0 }); - } catch { - // Corrupt manifest — skip but do not crash the listing + } catch (err) { + console.warn(`[ProjectManager] Warning: Skipped corrupt project manifest at ${manifestPath}:`, err); } } return out.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); @@ -443,7 +443,9 @@ export class ProjectManager { if (fs.existsSync(p)) { try { out.push(JSON.parse(fs.readFileSync(p, 'utf-8'))); - } catch { /* skip corrupt */ } + } catch (err) { + console.warn(`[ProjectManager] Warning: Skipped corrupt region file ${p}:`, err); + } } } return out; diff --git a/src/storage/file-storage.ts b/src/storage/file-storage.ts index ba82217a..5ecb8da7 100644 --- a/src/storage/file-storage.ts +++ b/src/storage/file-storage.ts @@ -34,35 +34,42 @@ export class FileStorageProvider implements ForensicStorageProvider { public async getSession(sessionId: string): Promise { const dir = path.join(this.baseDir, sessionId); const metaPath = path.join(dir, 'metadata.json'); - if (!fs.existsSync(metaPath)) return null; try { const data = await fs.promises.readFile(metaPath, 'utf-8'); return JSON.parse(data) as SessionMetadata; - } catch { + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[FileStorage] Warning: Failed to read session ${sessionId}: ${err?.message}`); + } return null; } } public async listSessions(): Promise { if (!fs.existsSync(this.baseDir)) return []; - const entries = fs.readdirSync(this.baseDir, { withFileTypes: true }); - const sessions: SessionMetadata[] = []; + try { + const entries = await fs.promises.readdir(this.baseDir, { withFileTypes: true }); + const sessions: SessionMetadata[] = []; - for (const entry of entries) { - if (entry.isDirectory()) { - const metaPath = path.join(this.baseDir, entry.name, 'metadata.json'); - if (fs.existsSync(metaPath)) { + for (const entry of entries) { + if (entry.isDirectory()) { + const metaPath = path.join(this.baseDir, entry.name, 'metadata.json'); try { - const data = fs.readFileSync(metaPath, 'utf-8'); + const data = await fs.promises.readFile(metaPath, 'utf-8'); sessions.push(JSON.parse(data) as SessionMetadata); - } catch { - // Corrupt file skipped + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[FileStorage] Warning: Corrupt or unreadable session metadata at ${metaPath}: ${err?.message}`); + } } } } - } - return sessions.sort((a, b) => b.startTime - a.startTime); + return sessions.sort((a, b) => b.startTime - a.startTime); + } catch (err: any) { + console.error(`[FileStorage] Failed to list sessions from ${this.baseDir}:`, err?.message); + return []; + } } public async deleteSession(sessionId: string): Promise { @@ -105,7 +112,8 @@ export class FileStorageProvider implements ForensicStorageProvider { let e: BaseEvent; try { e = JSON.parse(trimmed); - } catch { + } catch (parseErr) { + console.warn(`[FileStorage] Skipping malformed event line in session ${sessionId}:`, parseErr); continue; } @@ -165,7 +173,7 @@ export class FileStorageProvider implements ForensicStorageProvider { public async saveCheckpoint(checkpoint: SnapshotCheckpoint): Promise { const dir = this.getSessionDir(checkpoint.sessionId); const chkDir = path.join(dir, 'checkpoints'); - if (!fs.existsSync(chkDir)) fs.mkdirSync(chkDir, { recursive: true }); + await fs.promises.mkdir(chkDir, { recursive: true }); const file = path.join(chkDir, `${checkpoint.checkpointId}.json`); await fs.promises.writeFile(file, JSON.stringify(checkpoint, null, 2), 'utf-8'); @@ -173,21 +181,26 @@ export class FileStorageProvider implements ForensicStorageProvider { public async getCheckpoints(sessionId: string): Promise { const dir = path.join(this.baseDir, sessionId, 'checkpoints'); - if (!fs.existsSync(dir)) return []; - - const files = fs.readdirSync(dir).filter((f) => f.endsWith('.json')); - const checkpoints: SnapshotCheckpoint[] = []; + try { + const files = (await fs.promises.readdir(dir)).filter((f) => f.endsWith('.json')); + const checkpoints: SnapshotCheckpoint[] = []; + + for (const f of files) { + try { + const data = await fs.promises.readFile(path.join(dir, f), 'utf-8'); + checkpoints.push(JSON.parse(data)); + } catch (err) { + console.warn(`[FileStorage] Failed to read/parse checkpoint file ${f} in session ${sessionId}:`, err); + } + } - for (const f of files) { - try { - const data = await fs.promises.readFile(path.join(dir, f), 'utf-8'); - checkpoints.push(JSON.parse(data)); - } catch { - // Ignored + return checkpoints.sort((a, b) => a.sequence - b.sequence); + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[FileStorage] Error accessing checkpoints directory for session ${sessionId}:`, err); } + return []; } - - return checkpoints.sort((a, b) => a.sequence - b.sequence); } public async saveInitialSnapshot(sessionId: string, snapshot: DOMSnapshot): Promise { @@ -199,10 +212,13 @@ export class FileStorageProvider implements ForensicStorageProvider { public async getInitialSnapshot(sessionId: string): Promise { const dir = path.join(this.baseDir, sessionId); const file = path.join(dir, 'initial_snapshot.json'); - if (!fs.existsSync(file)) return null; try { - return JSON.parse(await fs.promises.readFile(file, 'utf-8')) as DOMSnapshot; - } catch { + const content = await fs.promises.readFile(file, 'utf-8'); + return JSON.parse(content) as DOMSnapshot; + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[FileStorage] Error reading initial snapshot for session ${sessionId}:`, err); + } return null; } } @@ -211,12 +227,14 @@ export class FileStorageProvider implements ForensicStorageProvider { const dir = this.getSessionDir(annotation.sessionId); const annPath = path.join(dir, 'annotations.json'); let list: Annotation[] = []; - if (fs.existsSync(annPath)) { - try { - list = JSON.parse(await fs.promises.readFile(annPath, 'utf-8')); - } catch { - list = []; + try { + const content = await fs.promises.readFile(annPath, 'utf-8'); + list = JSON.parse(content); + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[FileStorage] Corrupted annotations file for session ${annotation.sessionId}, starting fresh:`, err); } + list = []; } list.push(annotation); await fs.promises.writeFile(annPath, JSON.stringify(list, null, 2), 'utf-8'); @@ -225,10 +243,13 @@ export class FileStorageProvider implements ForensicStorageProvider { public async getAnnotations(sessionId: string): Promise { const dir = path.join(this.baseDir, sessionId); const annPath = path.join(dir, 'annotations.json'); - if (!fs.existsSync(annPath)) return []; try { - return JSON.parse(fs.readFileSync(annPath, 'utf-8')) as Annotation[]; - } catch { + const content = await fs.promises.readFile(annPath, 'utf-8'); + return JSON.parse(content) as Annotation[]; + } catch (err: any) { + if (err?.code !== 'ENOENT') { + console.warn(`[FileStorage] Failed to read annotations for session ${sessionId}:`, err); + } return []; } } diff --git a/src/storage/recording-storage.ts b/src/storage/recording-storage.ts index 80d9fe65..9ee8e94c 100644 --- a/src/storage/recording-storage.ts +++ b/src/storage/recording-storage.ts @@ -33,7 +33,8 @@ export class CommandRecordingStorage { try { const raw = JSON.parse(fs.readFileSync(file, 'utf-8')); return raw.recording || raw; - } catch { + } catch (err) { + console.warn(`[RecordingStorage] Warning: Failed to parse recording file ${file}:`, err); return null; } } @@ -63,8 +64,8 @@ export class CommandRecordingStorage { tags: rec.tags || [], file: path.join(this.baseDir, entry.name), }); - } catch { - // skip corrupt files + } catch (err) { + console.warn(`[RecordingStorage] Warning: Skipped corrupt recording file ${entry.name}:`, err); } } return out.sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0)); From d0b65afe472c76db1536519063b49f73105d740b Mon Sep 17 00:00:00 2001 From: Ali Rashidi Date: Sat, 12 Sep 2026 11:39:09 +0330 Subject: [PATCH 3/3] docs(readme): modernize bilingual README with 3D logo, add Python QA & CI matrix --- .github/workflows/ci.yml | 53 +- README.md | 766 +++++++++++------- README_FA.md | 758 ++++++++++------- assets/teledom_3d_logo.png | Bin 0 -> 708213 bytes chrome-extension/dist/server/bridge-server.js | 83 +- chrome-extension/dist/server/mcp-server.js | 2 + dist/server/bridge-server.js | 23 +- dist/server/mcp-server.js | 2 + package.json | 5 +- ruff.toml | 15 + scripts/run-operational-suite.js | 3 +- sdk/python/examples/extension_smoke_test.py | 61 +- sdk/python/pyproject.toml | 32 + sdk/python/teledom/__init__.py | 10 +- sdk/python/teledom/browser.py | 31 +- sdk/python/teledom/client.py | 21 +- sdk/python/teledom/targets.py | 4 +- sdk/python/teledom/workflow.py | 28 +- sdk/python/test_sdk.py | 46 +- src/mcp/server.ts | 3 +- src/storage/file-storage.ts | 23 +- tests/integration/storage.test.ts | 8 +- tests/intelligence/workflow.test.ts | 8 +- vitest.config.ts | 2 + 24 files changed, 1269 insertions(+), 718 deletions(-) create mode 100644 assets/teledom_3d_logo.png create mode 100644 ruff.toml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd6e5572..dc19599f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,18 +2,19 @@ name: TeleDOM CI Pipeline on: push: - branches: [ main ] + branches: [ master, main, 'fix/**', 'feature/**' ] pull_request: - branches: [ main ] + branches: [ master, main ] + workflow_dispatch: jobs: build-and-test: - name: Build & Test (Node ${{ matrix.node-version }} on ${{ matrix.os }}) + name: Node ${{ matrix.node-version }} (${{ matrix.os }}) runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest] - node-version: [18.x, 20.x, 22.x] + node-version: [20.x, 22.x] steps: - name: Checkout Repository @@ -32,6 +33,50 @@ jobs: - name: Run Unit Tests run: npm run test:unit + env: + NODE_OPTIONS: "--experimental-require-module" - name: Run Operational Test Suite run: npm run test:operational + env: + NODE_OPTIONS: "--experimental-require-module" + + python-sdk: + name: Python ${{ matrix.python-version }} (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + python-version: ["3.10", "3.11", "3.12"] + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup Node.js (for bridge server in operational tests) + uses: actions/setup-node@v4 + with: + node-version: 20.x + + - name: Install Node Dependencies & Build Server + run: | + npm install + npm run build + + - name: Setup Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Python QA Tools + run: python -m pip install ruff mypy + + - name: Lint Python SDK (Ruff) + run: python -m ruff check sdk/python + + - name: Typecheck Python SDK (Mypy) + run: python -m mypy sdk/python + + - name: Run Python SDK Tests + run: python sdk/python/test_sdk.py + diff --git a/README.md b/README.md index 8401b771..f2afc491 100644 --- a/README.md +++ b/README.md @@ -1,138 +1,363 @@ -# ⚡ TeleDOM v4.1 +
-### 🧠 Temporal Browser Intelligence Engine + Agent-Owned Workflow Runtime · 350 Certified MCP Tools for Autonomous AI Agents +**English** · [فارسی (Persian)](README_FA.md) -[![TypeScript 5.8+](https://img.shields.io/badge/TypeScript-5.8%2B-blue.svg?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) -[![Chrome Extension Manifest V3](https://img.shields.io/badge/Chrome_Extension-Manifest_V3-red.svg?style=flat-square&logo=googlechrome&logoColor=white)](https://developer.chrome.com/docs/extensions/mv3/) -[![Model Context Protocol 350 Tools](https://img.shields.io/badge/Model_Context_Protocol-350_Tools-purple.svg?style=flat-square&logo=probot&logoColor=white)](https://modelcontextprotocol.io/) -[![Certification 350/350 Stdio](https://img.shields.io/badge/Certification-350%2F350_Stdio-brightgreen.svg?style=flat-square&logo=checkmarx&logoColor=white)](#-testing--quality-verification) -[![Tests 319/319 Passed](https://img.shields.io/badge/Tests-319%2F319_Passed-success.svg?style=flat-square&logo=vitest&logoColor=white)](#-testing--quality-verification) -[![Python SDK](https://img.shields.io/badge/Python_SDK-Semantic_Browser_Programming-3776AB.svg?style=flat-square&logo=python&logoColor=white)](./sdk/python/) -[![License Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg?style=flat-square&logo=apache)](LICENSE) +TeleDOM Logo + +# TeleDOM v4.1 + +**Temporal Browser Intelligence Engine + Agent-Owned Workflow Runtime** + +*350 Certified MCP Tools • Sub-Millisecond Time-Travel DOM • Manifest V3 Chrome Extension • Zero-Dependency Python SDK* + +[![Version](https://img.shields.io/badge/version-4.1.0-blue.svg)](package.json) +[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.8%2B-3178C6.svg?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) +[![Python](https://img.shields.io/badge/Python-3.9%2B-3776AB.svg?logo=python&logoColor=white)](./sdk/python/) +[![Chrome Extension](https://img.shields.io/badge/Chrome_Extension-Manifest_V3-4285F4.svg?logo=googlechrome&logoColor=white)](https://developer.chrome.com/docs/extensions/mv3/) +[![MCP](https://img.shields.io/badge/MCP-350_Certified_Tools-7B1FA2.svg?logo=probot&logoColor=white)](./docs/TOOLS_CATALOG_350_EN.md) +[![Tests](https://img.shields.io/badge/tests-320%20passed-brightgreen.svg)](#running-tests--quality-verification) +[![Profiles](https://img.shields.io/badge/profiles-4_runtime_levels-orange.svg)](#token-efficient-operating-profiles) + +
--- -### 🌐 Language & Documentation Catalogs +## Table of Contents + +
+Jump to section + +- [What is TeleDOM?](#what-is-teledom) +- [Why use it?](#why-use-it) +- [Visual Demo & Architecture Preview](#visual-demo--architecture-preview) +- [Feature Highlights](#feature-highlights) +- [Tech Stack](#tech-stack) +- [Quick Start](#quick-start) +- [Token-Efficient Operating Profiles](#token-efficient-operating-profiles) +- [How it Works](#how-it-works) +- [Agent-Owned Workflows & Target Memory](#agent-owned-workflows--target-memory) +- [The 350 Certified MCP Tools Surface](#the-350-certified-mcp-tools-surface) +- [Dedicated Universal CLI (`dom-antigravity`)](#dedicated-universal-cli-dom-antigravity) +- [Python SDK Reference](#python-sdk-reference) +- [Settings & Environment Variables](#settings--environment-variables) +- [Session vs Persistent Data](#session-vs-persistent-data) +- [Supported Environments & Compatibility](#supported-environments--compatibility) +- [System Requirements](#system-requirements) +- [Development & Building from Source](#development--building-from-source) +- [Running Tests & Quality Verification](#running-tests--quality-verification) +- [Project Structure](#project-structure) +- [Troubleshooting](#troubleshooting) +- [Honest Limitations](#honest-limitations) +- [Security & Privacy Model](#security--privacy-model) +- [FAQ](#faq) +- [Documentation Index](#documentation-index) +- [Contributing & Security](#contributing--security) +- [License & Author](#license--author) + +
+ +--- + +## What is TeleDOM? + +**TeleDOM** is an enterprise-grade **Temporal Browser Intelligence Engine** and **Model Context Protocol (MCP)** platform providing **350 certified tools** for autonomous AI coding agents (Claude, Cursor, Antigravity, Cline, OpenAI Swarm) and frontend engineering teams. + +Instead of running inside an artificial, headless sandbox, TeleDOM connects directly to a live Chromium browser via a hardened Manifest V3 extension. It continuously records DOM mutations, user actions, network events, and layout shifts with nanosecond precision: + +- **Temporal EventMesh:** Hash-chained, tamper-evident event log with nanosecond timestamps, vector clocks, and causality links. +- **Sub-Millisecond DOM Time-Travel:** Reconstructs the exact virtual DOM state at any point in time ($State(T)$) for diffing and regression analysis. +- **Agent-Owned Workflows (TeleDOM Flow):** AI agents teach tasks once, persist them as parameterized programs, and rerun them with up to **80% fewer round trips** and **50% fewer DOM scans**. +- **Real User Context:** Runs against real user sessions, active logins, cookies, and extensions without brittle login re-authentication. -- 📖 **[Complete 350 Tools English Catalog (Documentation)](./docs/TOOLS_CATALOG_350_EN.md)** -- 🇮🇷 **[کاتالوگ جامع و تفصیلی ۳۵۰ ابزار به زبان فارسی](./docs/TOOLS_CATALOG_350_FA.md)** -- 🇮🇷 **[راهنمای فارسی پروژه (README_FA.md)](./README_FA.md)** -- ⚡ **[Agent-Owned Workflows (TeleDOM Flow)](./docs/workflow/AGENT_WORKFLOWS.md)** — teach once · reuse forever · prove what happened -- 🐍 **[Python SDK — Semantic Browser Programming](./docs/workflow/PYTHON_SDK.md)** -- 📋 **[Release Notes & Verification Report](./docs/workflow/RELEASE_NOTES.md)** -- 💡 **[250 Production Recipes (EXAMPLES.md)](./EXAMPLES.md)** | **[۲۵۰ مثال کاربردی فارسی](./EXAMPLES_FA.md)** -- 📊 **[Improvement Matrix (106 Improvements)](./docs/intelligence/IMPROVEMENTS.md)** -- 📈 **[Measured Benchmarks & Metrics](./docs/intelligence/BENCHMARKS.md)** +> **Name meaning:** *Tele* (remote observation and telemetry across system boundaries) + *DOM* (Document Object Model). TeleDOM bridges AI agents to the live temporal state of any webpage. + +> [!NOTE] +> TeleDOM runs **100% locally on your machine**. No cloud telemetry, no remote analytics, and zero external network calls during normal operation. + +--- + +## Why use it? + +| Problem in Existing Solutions | TeleDOM Solution | +|-------------------------------|-------------------| +| **Headless blank sandbox:** Conventional Puppeteer/Playwright instances lack user logins, cookies, and saved sessions | **Real Chrome session:** Connects directly to the user's active browser profile with full extension and auth state | +| **Brittle scrapers & agents:** AI agents re-explore pages from scratch on every run, wasting time and tokens | **Agent-Owned Workflows & Target Memory:** Persists discovered elements and multi-step flows for instant verbatim replay | +| **Token context bloat:** Dumping 50k+ lines of raw HTML quickly exhausts the LLM's context window | **4 Token-Efficient Profiles:** Scales schema exposure from ~2,400 tokens (`minimal`) up to full enterprise (`full`) | +| **Ephemeral errors:** Transient DOM bugs, layout shifts, and race conditions disappear after page reloads | **Sub-millisecond Time-Travel ($State(T)$):** Deterministic snapshot interpolation at any historical timestamp | +| **Hallucinated assertions:** AI tools often assume actions succeeded without proof | **Formal Invariants & Proof Engine:** Mathematical verification of DOM structural equivalence and zero false positives | +| **Manual DevTools debugging:** Engineers spend hours sifting through network waterfalls and console logs | **Autonomous Root-Cause Investigator (`td_investigate`):** Generates hypothesis graphs and portable `.tdom` bundles | +| **Chrome MV3 30s timeouts:** Manifest V3 service workers get terminated by Chrome during long agent tasks | **24s Alarm Heartbeat:** Self-healing keep-alive pulse + DevTools (F12) CDP collision protection | +| **Dangerous automated mutations:** Blind AI clicks can trigger unintended state modifications or deletions | **Safe Mutation Engine:** Atomic transactional dry-runs with guaranteed zero-cost rollbacks | --- -## ⚡ v4.1 — The Agent-Owned Workflow Runtime +## Visual Demo & Architecture Preview -> **TeleDOM is not the decision-maker; TeleDOM is the enabler.** -> **The Agent is the brain. TeleDOM is the hands, eyes, memory and browser toolbox.** -> *Teach the browser task once. Turn it into a reusable program. Run it anywhere the browser can go.* +
+ +![TeleDOM Autonomous AI Agent Live Demo](https://raw.githubusercontent.com/IrMaho/TeleDOM/master/assets/teledom_live_agent_demo.gif) + +> 🎬 **Live Automation Demo:** Autonomous AI agent driving real-time browser forensic recording, live DOM inspection, synthetic actions, and multi-turn workflows. ([Watch Full 1080p Video](./assets/teledom_live_agent_demo.mp4)) + +
```text -AGENT — discover · reason · write workflows · version · debug · repair · generate bots - │ MCP (Level 1: 350 tools) ──────────────┐ - │ Python SDK (Level 2: semantic browser) ─┐ │ - ▼ ▼ -TELEDOM — browser observation · primitives · target memory · - workflow persistence · DUMB execution · evidence · replay · proof ++-------------------------------------------------------------------------+ +| AI AGENT / CLIENT | +| (Antigravity IDE · Cursor · Claude Desktop · Cline) | ++------------------------------------+------------------------------------+ + | (JSON-RPC 2.0 over stdio) + v ++-------------------------------------------------------------------------+ +| TELEDOM V4.1 MCP SERVER (350 TOOLS) | +| ├── 144 td_* Temporal Intelligence & Workflow Runtime Tools | +| ├── 54 dt_* Chrome DevTools Fusion Tools | +| ├── 31 fx_* Advanced Visual & Forensic Tools | +| ├── 121 Core & Live Interaction Tools | +| └── Zero-Config On-Demand Auto-Bridge Dispatcher (:3847) | ++------------------+------------------------------------+-----------------+ + | | (WebSocket :3847) + v v ++------------------------------------+ +---------------------------------+ +| WORKFLOW RUNTIME ENGINE | | CHROME EXTENSION (MV3) | +| ├── Workflow Persistence & Diff | | ├── MutationObserver Engine | +| ├── Target Memory Fingerprints | | ├── Ctrl+Shift+Click Picker | +| ├── EventMesh & Causal Graph | | ├── Canvas Screenshot Pipeline | +| └── Verification & Formal Proofs | | └── Synthetic Action Driver | ++------------------------------------+ +---------------------------------+ ``` -### The Golden Automation Demo +| Operating Surface | Primary Purpose | +|-------------------|-----------------| +| **MCP Server (`stdio`)** | Exposes 350 certified tools to any Model Context Protocol-compatible AI agent | +| **CLI (`dom-antigravity`)** | One-click workspace installation, status diagnostics, clean screenshots, bridge daemon | +| **Chrome Extension (MV3)** | Captures mutations, coordinates element picking, executes synthetic clicks/types | +| **Python SDK (`teledom`)** | Zero-dependency Python 3.9+ library for programmatic, semantic browser automation | -```text -RUN #1 (explore) 5 tool calls · 2 DOM scans · 5 MCP round trips - → agent learns: saves learned targets + writes the workflow +--- -RUN #2 (reuse) 1 td_workflow_run call · 1 DOM scan - ✔ verify_cta ✔ click_cta ✔ extract ✔ assert → SUCCESS - deterministic execution record + verbatim replay +## Feature Highlights -KPIs: 80% fewer MCP round trips · 50% fewer DOM scans · replay PASS - 0 unsafe-action bypass · 0 workflow corruption · 350/350 certified +- **Agent-Owned Workflow Runtime:** Build, parameterize, version, diff, and execute complex multi-step web programs (`td_workflow_run`). +- **Target Memory & Fingerprinting:** Persists discovered DOM selectors and signatures to eliminate repetitive element searches. +- **Nanosecond Temporal EventMesh:** Tamper-evident hash-chained event log with vector clocks, causality chains, and Merkle root verification. +- **Sub-Millisecond DOM Time-Travel:** Instant reconstruction of exact virtual DOM state at any past timestamp $T$ ($State(T)$). +- **Counterfactual Browser Simulation:** Branch virtual DOM executions, suppress mutations or network requests, and compare alternative outcomes. +- **Autonomous Incident Investigator:** Single-command triage (`td_investigate`), multi-stage hypothesis generation, and portable `.tdom` bundles. +- **Safe Mutation Engine:** Transactional DOM modifications with immutable diffs, side-effect-free dry runs, and guaranteed rollbacks. +- **Passive Security Intelligence:** Zero-trust page scanning, prompt-injection defense, runtime XSS detection, and automatic credential sanitization. +- **4 Configurable Runtime Profiles:** Scale from ultra-lean 22 tools (~2,400 tokens) to the complete 350-tool enterprise suite. +- **Zero-Dependency Python SDK:** Native Python 3.9+ interface with context managers for high-level browser control. +- **Universal Stdio JSON-RPC 2.0 Certification:** 350/350 tools fully certified against real operational test schemas. + +--- + +## Tech Stack + +| Layer | Technology | Purpose | +|-------|------------|---------| +| **Core Runtime** | Node.js 22+ & TypeScript 5.8+ | Non-blocking async MCP server, EventMesh, and storage engine | +| **Agent Protocol** | Model Context Protocol (MCP) | Universal JSON-RPC 2.0 interface for AI coding agents | +| **Browser Extension** | Chrome Extension Manifest V3 | MutationObserver, WeakMap element binding, Canvas cropping | +| **Browser Integration** | Chrome DevTools Protocol (CDP) | Direct DevTools inspection, Lighthouse audits, network HAR | +| **Python SDK** | Pure Python 3.9+ (Zero Dependencies) | High-level `Browser` and `Workflow` semantic client | +| **Testing & QA** | Vitest 3.x, Ruff, Mypy | Unit tests, Python typing, and operational stdio certification | +| **Platforms** | Windows 10/11, macOS, Linux | Cross-platform desktop and CI execution support | + +--- + +## Quick Start + +### Option A — One-Click Setup for AI Coding Agents (Recommended) + +Install the global CLI and configure your agent workspace: + +```bash +# 1. Install CLI globally +npm install -g teledom + +# 2. Configure TeleDOM for your current workspace (.agents) +dom-antigravity install --workspace + +# Or register globally for all projects in Antigravity IDE: +dom-antigravity install --global ``` -### 44 New Production Tools in v4.1: +### Option B — Run from Source (Developers) -| Family | Tool Count | Tools Included | -|---|:---:|---| -| **Browser Primitives** | **22** | `td_browser_*` · `td_dom_inspect/query/extract/snapshot` · `td_target_find/check/describe` · `td_action_click/type/select/hover/press/scroll` · `td_wait` · `td_screenshot` · `td_execute_script` · `td_network_inspect` · `td_console_read` | -| **Workflow Runtime** | **14** | `td_workflow_save/get/list/update/delete/clone/diff/export/import/validate/run/runs/run_get/replay` — dumb execution with policy gates, deterministic records, verbatim replay | -| **Agent-Owned Tooling** | **8** | `td_target_memory_*` (learned targets — no DOM re-analysis) · `td_agent_artifact_*` (custom tools, scripts, policies — stored verbatim, never interpreted) | +```bash +git clone https://github.com/IrMaho/TeleDOM.git +cd TeleDOM +npm install +npm run build +npm run test:unit +``` -Browser-first, **API-optional**: web applications and complex SPAs without public APIs are the primary target, not the exception. The AI agent chooses its own discovery strategy (DOM → semantics → accessibility → script → coordinates) whenever abstractions fail — TeleDOM provides rock-solid, deterministic execution primitives. +### Option C — Python SDK + +```bash +pip install ./sdk/python +``` + +```python +from teledom import Browser + +with Browser() as browser: + browser.inspect() + browser.type("#search-box", "Autonomous Coding Agents") + browser.click("#submit-btn") +``` + +### First Workflow in 60 Seconds + +1. Load the unpacked Chrome extension from `teledom/dist/extension` in `chrome://extensions/`. +2. Connect your AI agent (Antigravity IDE, Cursor, Claude Desktop) via MCP. +3. The server **automatically spawns the WebSocket bridge** on port `3847` on demand. +4. Let the agent inspect the page and record a workflow: + ```json + {"name": "td_workflow_save", "arguments": {"name": "login_flow", "steps": [...]}} + ``` +5. Replay the workflow anytime with single-call deterministic precision: + ```json + {"name": "td_workflow_run", "arguments": {"workflow_id": "login_flow"}} + ``` --- -## ⚡ Overview & TeleDOM in One Line +## Token-Efficient Operating Profiles -> **TeleDOM in one line:** *See what happened. Understand why. Simulate what-if. Fix safely. Prove the result.* +To eliminate context window bloat and reduce token expenses by up to **94%**, TeleDOM introduces 4 runtime profiles via the `TELEDOM_PROFILE` environment variable: -TeleDOM is a production-grade **Temporal Browser Intelligence Engine** and universal **Model Context Protocol (MCP)** platform providing **350 certified tools** for autonomous AI coding agents (Claude, Cursor, Antigravity, Cline, OpenAI Swarm) and frontend engineering teams. +| Profile | Exposed Tools | Approx. Schema Tokens | Best For | Description | +|:---|:---:|:---:|:---|:---| +| **`minimal`** | **22** | **~2,400 tokens** | Budget LLMs & fast agent tasks | Core browsing: navigate, click, type, inspect, screenshot | +| **`core`** | **42** | **~4,800 tokens** | Autonomous navigation & workflows | Core actions + target memory + workflow runtime | +| **`forensics`** | **74** | **~8,500 tokens** | QA debugging, audits & triage | Visual regressions, DOM diffs, network & console logs | +| **`full`** *(default)* | **350** | **~40,000 tokens** | Deep reasoning & enterprise suites | Complete 350-tool surface with full backward compatibility | -Every important claim is backed by mathematical evidence, confidence scoring, provenance tracking, and machine-verifiable proof. +```bash +# Launch MCP server with the ultra-lean core profile +TELEDOM_PROFILE=core npx teledom +``` -### v4.1 Measured Verification Metrics (generated by `npm run bench` — [full matrix](./docs/intelligence/BENCHMARKS.md)) +--- -| Metric | Result | Description | -|---|---|---| -| **Golden Incident Suite (1,032 scenarios × 24 categories)** | **100.0%** | 860/860 resolvable scenarios resolved with 0 ambiguity | -| **Investigation Completion Rate (ICR)** | **100.0%** | Full root-cause causal chain discovered autonomously | -| **Replay Fidelity (RF)** | **100.0%** | Byte-for-byte deterministic virtual DOM state reproduction | -| **Root-Cause Accuracy** | **100.0%** | Exact fault classification (unmount, CSS, race condition, error) | -| **False Success Rate** | **0.00%** | Zero false-positive diagnostic reports | -| **Chaos Engineering Suite (16 injections)** | **16/16 contained** | Full containment, observation, explanation, and auto-recovery | -| **Operational JSON-RPC Certification** | **350/350 tools CERTIFIED** | Real stdio JSON-RPC 2.0 captures with schema validation | -| **Unit & Integration Test Suite** | **319/319 tests green** | 100% pass rate across 36 test suites | -| **Improvement Matrix** | **106 validated items** | 104 implemented, 2 explicitly deferred with architectural reasons | +## How it Works + +```mermaid +flowchart LR + A["AI Agent / LLM"] -->|"JSON-RPC 2.0 / stdio"| B["ForensicMCPServer"] + B -->|"Auto-Bridge (Port 3847)"| C["Chrome MV3 Extension"] + C -->|"MutationObserver"| D["Target Webpage"] + D -->|"Nanosecond Events"| E["Temporal EventMesh"] + E -->|"Time-Travel Snapshot"| F["Virtual DOM State(T)"] + F -->|"Deterministic Replay"| G["Mathematical Proof & Verification"] +``` + +```mermaid +flowchart TB + subgraph AgentLayer["Agent Layer"] + IDE["Antigravity IDE / Cursor / Claude"] + PY["Python SDK teledom"] + CLI["Universal CLI dom-antigravity"] + end + + subgraph ServerLayer["TeleDOM MCP Runtime (Node.js)"] + MCP["ForensicMCPServer (350 Tools)"] + WF["Workflow Runtime Engine"] + TM["Target Memory Store"] + EM["Temporal EventMesh Kernel"] + CE["Causal & Incident Investigator"] + AB["Zero-Config Auto-Bridge"] + end + + subgraph BrowserLayer["Browser Runtime (Chrome MV3)"] + CS["Content Script & WeakMap NodeId"] + MO["MutationObserver Engine"] + EV["Synthetic Action Dispatcher"] + SC["Canvas Screenshot Pipeline"] + end + + IDE --> MCP + PY --> MCP + CLI --> AB + MCP --> WF + MCP --> TM + MCP --> EM + MCP --> CE + MCP --> AB + AB <-->|"WebSocket Frames (Port 3847)"| CS + CS --> MO + CS --> EV + CS --> SC +``` --- -## 🚀 Live Demo +## Agent-Owned Workflows & Target Memory -![TeleDOM Autonomous AI Agent Live Demo](https://raw.githubusercontent.com/IrMaho/TeleDOM/master/assets/teledom_live_agent_demo.gif) +TeleDOM v4.1 shifts browser automation from fragile, manual scripting to **agent-authored reusable programs**: + +```text +RUN #1 (Explore) 5 tool calls · 2 DOM scans · 5 MCP round trips + → Agent learns: saves learned targets + writes the workflow -> 🎬 **Live Automation Demo:** Autonomous AI Coding Agent driving real-time browser forensic recording, live DOM inspection, synthetic actions, and multi-turn autonomous web flows. ([Watch Full 1080p Video](./assets/teledom_live_agent_demo.mp4)) +RUN #2 (Reuse) 1 td_workflow_run call · 1 DOM scan + ✔ verify_cta ✔ click_cta ✔ extract ✔ assert → SUCCESS + Deterministic execution record + verbatim replay + +KPIs: 80% fewer MCP round trips · 50% fewer DOM scans · replay PASS + 0 unsafe-action bypass · 0 workflow corruption · 350/350 certified +``` + +### 44 Specialized v4.1 Tools: + +| Family | Count | Tools Included | +|---|:---:|---| +| **Browser Primitives** | **22** | `td_browser_*`, `td_dom_*`, `td_target_*`, `td_action_*`, `td_wait`, `td_screenshot`, `td_execute_script`, `td_network_inspect`, `td_console_read` | +| **Workflow Runtime** | **14** | `td_workflow_save/get/list/update/delete/clone/diff/export/import/validate/run/runs/run_get/replay` | +| **Agent-Owned Tooling** | **8** | `td_target_memory_*` (persistent targets), `td_agent_artifact_*` (custom tools & policies) | --- -## 📖 Table of Contents - -- [⚡ v4.1 — The Agent-Owned Workflow Runtime](#-v41--the-agent-owned-workflow-runtime) -- [⚡ Overview & TeleDOM in One Line](#-overview--teledom-in-one-line) -- [🐍 Python SDK Quickstart](#-python-sdk-quickstart) -- [✨ Key Capabilities](#-key-capabilities) -- [💻 Dedicated Universal CLI (`dom-antigravity`)](#-dedicated-universal-cli-dom-antigravity) -- [🏗️ System Architecture](#-system-architecture) - - [Dual-Environment Execution Model](#dual-environment-execution-model) - - [High-Level Architecture Diagram](#high-level-architecture-diagram) - - [Zero-Config On-Demand Auto-Bridge](#-zero-config-on-demand-auto-bridge) - - [Clean Screenshot & Visual Forensics Pipeline](#-clean-screenshot--visual-forensics-pipeline) - - [Time-Travel Reconstruction Engine](#time-travel-reconstruction-engine) -- [📁 Repository Structure](#-repository-structure) -- [🤖 Model Context Protocol (MCP) 350 Tools Reference](#-model-context-protocol-mcp-350-tools-reference) - - [1. 144 `td_*` Temporal Intelligence & Workflow Runtime Tools](#1-144-td_-temporal-intelligence--workflow-runtime-tools) - - [2. 54 `dt_*` Chrome DevTools Fusion Tools](#2-54-dt_-chrome-devtools-fusion-tools) - - [3. 31 `fx_*` Advanced Visual & Forensic Tools](#3-31-fx_-advanced-visual--forensic-tools) - - [4. 121 Core & Live Interaction Tools](#4-121-core--live-interaction-tools) -- [🚀 Installation & Quick Start](#-installation--quick-start) - - [1. Global System Installation (One-Click)](#1-global-system-installation-one-click) - - [2. Workspace Installation for Any Project](#2-workspace-installation-for-any-project) - - [3. Load Chrome Extension in Browser](#3-load-chrome-extension-in-browser) - - [4. Configure External AI Clients (Claude / Cursor / Cline)](#4-configure-external-ai-clients-claude--cursor--cline) -- [🧪 Testing & Quality Verification](#-testing--quality-verification) -- [🔐 Security, Privacy & Performance](#-security-privacy--performance) -- [❓ Troubleshooting & FAQ](#-troubleshooting--faq) -- [📜 License](#-license) +## The 350 Certified MCP Tools Surface + +TeleDOM provides the most comprehensive browser toolset available for AI agents, certified 100% against operational schemas: + +| Family | Prefix | Tool Count | Primary Responsibilities | +|---|---|:---:|---| +| **Temporal Intelligence & Workflows** | `td_*` | **144** | EventMesh, Causal analysis, Evidence Graph, Counterfactuals, Workflow runtime, Target memory, Proofs, Security | +| **Chrome DevTools Fusion** | `dt_*` | **54** | Direct DevTools inspection, Lighthouse audits, HeapSnapshots, Network HAR, Console logs, Emulation | +| **Advanced Forensic Capabilities** | `fx_*` | **31** | Network-DOM correlation, Visual regression, Layout shifts, Z-index occlusion, Safe mutation guards | +| **Core & Live Interaction** | Core / v3 | **121** | Live element picking, screenshot cropping, synthetic actions, DOM diffing, time-travel, lifecycle traces | +| **Total Certified Tools** | | **350** | **100% Operational Stdio Certification (350/350 PASS)** | + +> Complete parameter schemas and operational examples: +> - 📖 **[English Tools Catalog (3,800+ lines)](./docs/TOOLS_CATALOG_350_EN.md)** +> - 🇮🇷 **[کاتالوگ جامع ۳۵۰ ابزار به زبان فارسی](./docs/TOOLS_CATALOG_350_FA.md)** --- -## 🐍 Python SDK Quickstart +## Dedicated Universal CLI (`dom-antigravity`) + +Registered binary with aliases `mcp-dom` and `browser-antigravity`: -TeleDOM provides an official, zero-dependency Python SDK (`sdk/python/teledom`): +| Command | Option / Alias | Description | +|---------|----------------|-------------| +| `dom-antigravity install` | `--workspace` (`-w`) | Configure TeleDOM in current workspace (`.agents/mcp_config.json`) | +| `dom-antigravity install` | `--global` (`-g`) | Configure TeleDOM globally for all projects in Antigravity IDE | +| `dom-antigravity install` | `--target ` | Install MCP config into a specific directory | +| `dom-antigravity status` | | Check bridge server health (`:3847`) and connected Chrome tabs | +| `dom-antigravity screenshot` | | Capture pristine live full-page & element screenshots to disk | +| `dom-antigravity bridge` | | Start WebSocket bridge manually (optional — Auto-Bridge handles this) | +| `dom-antigravity config` | `cursor` / `claude` | Print ready-to-use JSON configuration blocks | + +--- + +## Python SDK Reference + +Zero-dependency Python package (`sdk/python/teledom`): ```python from teledom import Browser, Workflow @@ -143,148 +368,147 @@ with Browser() as browser: browser.type("#search-box", "Autonomous Agents") browser.click("#submit-btn") - # 2. Workflow creation & execution + # 2. Build and persist a workflow wf = Workflow("triage_issues", client=browser.client) wf.input("filter", "Issue label filter", default="bug") - wf.step("filter_step", "td_target_check", args={"selector": ".issue-row"}) + wf.step("check_table", "td_target_check", args={"selector": ".issue-row"}) wf.save(version="1.0.0") - # 3. Execute with deterministic audit record + # 3. Deterministic execution run = wf.run({"filter": "security"}) - print("Workflow run status:", run["run"]["status"]) + print("Run status:", run["run"]["status"]) ``` --- -## ✨ Key Capabilities - -| Capability | Description | -| :--- | :--- | -| **Agent-Owned Workflow Engine** | Build, parameterize, version, diff, and execute complex multi-step browser programs without writing custom scrapers. | -| **Target Memory & Fast Resolution** | Persist discovered element identities (`td_target_memory_save`) to eliminate repetitive DOM explorations on subsequent runs. | -| **Temporal EventMesh Kernel** | Hash-chained tamper-evident event log with nanosecond timestamps, vector clocks, causality links, and Merkle root verification. | -| **Sub-Millisecond DOM Time-Travel** | Instant state reconstruction at any arbitrary timestamp $T$ or event $E$ (`State(T)`), diff calculation, and timeline queries. | -| **Counterfactual Browser Simulation** | Branch virtual execution, suppress network calls or mutations, simulate alternative DOM branches, and compare counterfactual outcomes. | -| **Safe Mutation Engine** | Atomic transactional DOM modifications with immutable before/after diffs, side-effect-free dry runs, and guaranteed zero-cost rollbacks. | -| **Autonomous Incident Investigator** | Single-command root-cause triage (`td_investigate`), multi-stage hypothesis generation, evidence scoring, and `.tdom` portable incident bundles. | -| **Mathematical Proof & Verification** | Formal invariants verification (`StateInvariant`), structural equivalence proofs, regression assertions, and zero false-positive certification. | -| **Passive Security Intelligence** | Zero-trust page scanning, runtime XSS vulnerability detection, open CORS/CSP misconfiguration analysis, secret redaction, and prompt-injection defense. | -| **Self-Healing Runtime & Guardian** | Circuit-breaker protection, memory leak detection, garbage collector retention trees, and self-repairing WebSocket bridge connections. | -| **350 Universal JSON-RPC 2.0 MCP Tools** | The largest and most comprehensive browser toolset for AI agents across temporal intelligence, DevTools, forensics, and live automation. | +## Settings & Environment Variables + +| Variable | Default | Description | +|----------|---------|-------------| +| `TELEDOM_PROFILE` | `full` | Operating profile: `minimal` (22), `core` (42), `forensics` (74), `full` (350) | +| `TELEDOM_PORT` | `3847` | WebSocket & HTTP bridge server port | +| `TELEDOM_BRIDGE_TOKEN` | *None* | Optional Bearer auth token for bridge mutating endpoints | +| `TELEDOM_STORAGE_DIR` | `.teledom` | Directory path for local incident bundles and session data | +| `TELEDOM_HEADLESS` | `false` | Set `true` to run against headless Chrome with CDP | +| `DEBUG` | `false` | Enable verbose JSON-RPC and EventMesh debug logging | --- -## 💻 Dedicated Universal CLI (`dom-antigravity`) +## Session vs Persistent Data -The package exposes a global CLI binary registered as `dom-antigravity` (with aliases `mcp-dom` and `browser-antigravity`): +| Data Category | Storage Location | Persists across restarts? | +|---------------|------------------|:-------------------------:| +| **Workflows & Steps** | `.mcpdom_projects/workflows/` | **Yes** | +| **Target Memory Signatures** | `.mcpdom_projects/targets/` | **Yes** | +| **Incident Bundles (`.tdom`)** | `.forensic_sessions/` | **Yes** | +| **Live WebSocket Bridge** | Port `:3847` in-memory | **No** (reconnects automatically) | +| **Virtual DOM Memory Caches** | Node.js process heap | **No** (reconstructed on demand) | -```bash -# 1. Install MCP configuration & skills into current workspace (.agents) -dom-antigravity install --workspace -# Short alias: -dom-antigravity install -w +> [!IMPORTANT] +> Target Memory and Workflows store only structural selectors and execution schemas. User credentials, credit cards, and auth tokens are **never written to disk** thanks to built-in `PrivacyEngine` sanitization. -# 2. Install globally for ALL projects in Antigravity IDE -dom-antigravity install --global -# Short alias: -dom-antigravity install -g +--- + +## Supported Environments & Compatibility -# 3. Install into a specific target directory -dom-antigravity install --target "C:/path/to/project" +| Category | Supported Versions | Notes | +|----------|-------------------|-------| +| **Browsers** | Chrome 120+, Chromium, Edge, Brave | Manifest V3 extension support required | +| **Node.js** | 18.x, 20.x, 22.x LTS | Built and certified on Node 22 | +| **Python** | 3.9, 3.10, 3.11, 3.12, 3.13 | Zero third-party dependencies required | +| **Operating Systems** | Windows 10/11, macOS, Linux | Full cross-platform support | +| **AI Agent Clients** | Antigravity IDE, Cursor, Claude Desktop, Cline, Windsurf | Standard Model Context Protocol (MCP) | -# 4. Check bridge server health & connected Chrome tabs -dom-antigravity status +--- + +## System Requirements -# 5. Capture clean live Chrome screenshot (Full Page + Cropped Element) -dom-antigravity screenshot +| Component | Minimum Requirement | Recommended | +|-----------|---------------------|-------------| +| **Operating System** | Windows 10, macOS 12, Ubuntu 20.04 | Windows 11 / macOS 14 | +| **Node.js** | 18.18.0+ | 22.x LTS | +| **Python** | 3.9+ (optional for SDK) | 3.11+ | +| **RAM** | 4 GB | 8 GB+ for heavy DOM time-travel | +| **Disk Space** | 200 MB | 500 MB (including test bundles) | +| **Browser** | Google Chrome 120+ | Latest Stable Chrome | -# 6. Start WebSocket Bridge manually (Optional — Auto-Bridge handles this on demand) -dom-antigravity bridge +--- -# 7. Print ready-to-use JSON configuration for Claude Desktop or Cursor -dom-antigravity config cursor -dom-antigravity config claude +## Development & Building from Source + +```bash +# Install dependencies +npm install + +# Build all components (Client UI, Chrome Extension, MCP Server) +npm run build + +# Specialized build targets +npm run build:client # Vite client build +npm run build:extension # Chrome MV3 extension bundle +npm run build:server # Vite MCP server bundle ``` --- -## 🏗️ System Architecture +## Running Tests & Quality Verification -### Dual-Environment Execution Model +```bash +# 1. Master QA Suite (Build + 320 Unit Tests + 17 Python SDK Tests + Linting) +npm run qa:all -TeleDOM operates cleanly across two distinct runtime environments: +# 2. Unit and Intelligence Test Suite (320 tests, 100% green) +npm run test:unit -1. **Browser Runtime (Chrome Extension Manifest V3 / Content Script / Injected Page Context)**: - - Captures low-level DOM mutations using `MutationObserver`. - - Binds persistent `LogicalNodeId` identifiers to live nodes via `WeakMap`. - - Listens to `Ctrl + Shift + Mouse Click` for visual element picking. - - Executes synthetic live actions (`click`, `type`, `hover`, `focus`, `scroll`, `drag`). - - Renders cropped element bounding boxes on HTML5 Canvas. - - Hides floating overlays during screenshot captures. +# 3. Python SDK Self-Test Suite (17 tests) +npm run test:sdk -2. **Node.js / MCP Server Runtime (`ForensicMCPServer`)**: - - Exposes **350 JSON-RPC 2.0 MCP tools** over `stdio` and HTTP. - - Auto-spawns and manages the WebSocket bridge on port `3847`. - - Powers the Temporal EventMesh kernel, Causal Engine, and Evidence Graph. - - Reconstructs virtual DOM snapshots at sub-millisecond timestamps. - - Executes counterfactual simulations, incident investigations, and formal proofs. +# 4. Python SDK Lint & Type Checks (Ruff + Mypy) +npm run lint:python ---- +# 5. Full Operational Stdio Certification (350/350 tools CERTIFIED) +npm run test:operational -### High-Level Architecture Diagram +# 6. Deterministic Benchmarks (10K / 100K / 1M events) +npm run bench -```text -┌────────────────────────────────────────────────────────────────────────┐ -│ AI AGENT / MCP CLIENT │ -│ (Antigravity IDE / Cursor / Claude Desktop / CLI) │ -└───────────────────────────────────┬────────────────────────────────────┘ - │ (JSON-RPC 2.0 over stdio) - ▼ -┌────────────────────────────────────────────────────────────────────────┐ -│ TELEDOM V4.1 MCP SERVER (350 TOOLS) │ -│ ├── 144 td_* Temporal Intelligence & Workflow Runtime Tools │ -│ ├── 54 dt_* Chrome DevTools Fusion Tools │ -│ ├── 31 fx_* Advanced Forensic Capabilities │ -│ ├── 121 Core & Live Interaction Tools │ -│ └── Zero-Config On-Demand Auto-Bridge Dispatcher │ -└───────────────────┬────────────────────────────────┬───────────────────┘ - │ │ (WebSocket / HTTP :3847) - ▼ ▼ -┌───────────────────────────────┐ ┌────────────────────────────────────┐ -│ WORKFLOW RUNTIME │ │ LIVE WEBSOCKET BRIDGE SERVER │ -│ ├── Workflow Persistence │ │ (Port 3847 - Auto-Managed) │ -│ ├── Target Memory Store │ └─────────────────┬──────────────────┘ -│ ├── EventMesh & Causal Graph │ │ -│ ├── Counterfactual Engine │ │ (Bi-directional JSON frames) -│ └── Verification & Proofs │ ▼ -└───────────────────────────────┘ ┌────────────────────────────────────┐ - │ CHROME EXTENSION (MV3) │ - │ ├── Mutation Observer Engine │ - │ ├── Ctrl+Shift+Click Live Picker │ - │ ├── Canvas Screenshot Pipeline │ - │ └── Synthetic Interaction Driver │ - └────────────────────────────────────┘ +# 7. Golden Incident Suite (1,032 scenarios) +npm run golden + +# 8. Chaos Engineering Injections (16/16 contained) +npm run chaos ``` +### Verification Metrics: + +| Metric | Result | Description | +|---|---|---| +| **Golden Incident Suite** | **100.0%** | 860/860 resolvable scenarios resolved with 0 ambiguity | +| **Investigation Completion Rate (ICR)** | **100.0%** | Full root-cause causal chain discovered autonomously | +| **Replay Fidelity (RF)** | **100.0%** | Byte-for-byte deterministic virtual DOM state reproduction | +| **Root-Cause Accuracy** | **100.0%** | Exact fault classification (unmount, CSS, race condition) | +| **Operational JSON-RPC Certification** | **350/350 tools CERTIFIED** | Real stdio JSON-RPC 2.0 captures with schema validation | +| **Unit & Integration Test Suite** | **320/320 tests green** | 100% pass rate across 36 test suites | + --- -## 📁 Repository Structure +## Project Structure ```text teledom/ ├── src/ │ ├── intelligence/ # Temporal Intelligence Engine (EventMesh, Causal, Proof, Incident) │ │ └── workflow/ # v4.1 Agent-Owned Workflow Runtime (domain, executor, store, facade) -│ ├── core/ # Core recorders, sequence counters, privacy, PNG builder +│ ├── core/ # Core recorders, sequence counters, privacy engine, PNG builder │ ├── diff/ # Structural DOM diff engine (attributes, classes, styles, subtrees) │ ├── extension/ # Chrome Extension Manifest V3 (content scripts, service worker) │ ├── lifecycle/ # Lifecycle tracer, disappearing UI analyzer │ ├── mcp/ # Universal MCP Server, 350 tools definition, dispatchers │ ├── reconstruction/ # Sub-millisecond snapshot interpolation & time-travel │ ├── storage/ # Local disk storage & indexing engine -│ └── ui/ # Observatory UI, visual state viewers +│ └── ui/ # Observatory UI & visual state viewers ├── sdk/ -│ └── python/ # Official Python SDK (BrowserController, WorkflowEngine, TargetMemory) +│ └── python/ # Official Python SDK (Browser, Workflow, TargetMemory) ├── docs/ │ ├── TOOLS_CATALOG_350_EN.md # Complete English reference for all 350 tools │ ├── TOOLS_CATALOG_350_FA.md # کاتالوگ جامع ۳۵۰ ابزار به زبان فارسی @@ -298,145 +522,95 @@ teledom/ │ └── operational/ # Full 350/350 JSON-RPC stdio acceptance test suite ├── operational-tests/ # 350 dedicated folders with test definitions & assertions ├── package.json # Version 4.1.0, scripts, dependencies -└── README.md # English documentation (this file) +├── README.md # English documentation (this file) +└── README_FA.md # Persian documentation (راهنمای فارسی) ``` --- -## 🤖 Model Context Protocol (MCP) 350 Tools Reference +## Troubleshooting -TeleDOM v4.1 exposes **350 production-ready JSON-RPC 2.0 tools** grouped into four distinct families. - -For detailed schemas, parameter documentation, and operational examples for all 350 tools: -- 📖 **[English Tools Catalog (3,800+ lines)](./docs/TOOLS_CATALOG_350_EN.md)** -- 🇮🇷 **[کاتالوگ جامع ۳۵۰ ابزار به زبان فارسی (۳,۹۰۰+ سطر)](./docs/TOOLS_CATALOG_350_FA.md)** - -### Summary of Tool Families - -| Family | Prefix / Category | Tool Count | Description | -|---|---|:---:|---| -| **Temporal Intelligence & Workflows** | `td_*` | **144** | EventMesh, Causal analysis, Evidence Graph, Counterfactuals, Workflow save/run/diff/replay, Target memory, Proofs, Security | -| **Chrome DevTools Fusion** | `dt_*` | **54** | Direct DevTools inspection, Lighthouse audits, HeapSnapshots, Network HAR, Console logs, Emulation | -| **Advanced Forensic Capabilities** | `fx_*` | **31** | Network-DOM correlation, Visual regression, Layout shifts, Z-index occlusion, Safe mutation guards | -| **Core & Live Interaction** | Core / v3 | **121** | Live element picking, screenshot cropping, synthetic actions, DOM diffing, time-travel, lifecycle traces | -| **Total Certified Tools** | | **350** | **100% Operational Certification (350/350 Stdio PASS)** | +| Symptom | Likely Cause | Fix | +|---------|--------------|-----| +| **Extension badge gray / disconnected** | Bridge server not running or wrong port | Run `dom-antigravity status` or start MCP server; Auto-Bridge connects automatically on port `3847` | +| **`EADDRINUSE: 3847`** | Another instance or background process occupies port 3847 | Terminate the orphan process or configure `TELEDOM_PORT=3848` | +| **Token limit exceeded in AI agent** | Running with default `full` profile (350 tools = ~40k tokens) | Switch to `TELEDOM_PROFILE=core` (~4,800 tokens) or `minimal` (~2,400 tokens) | +| **DevTools (F12) CDP collision** | Chrome DevTools window opened while agent attached CDP | TeleDOM includes auto-collision detection; close F12 DevTools to allow CDP attachment | +| **Python SDK connection error** | Bridge server not active | Ensure MCP server or `dom-antigravity bridge` is active before initializing Python client | +| **DOM mutations not recording** | Extension disabled or page loaded before extension started | Refresh the target tab (`Ctrl+R`) to re-inject content scripts | --- -## 🚀 Installation & Quick Start - -### 1. Global System Installation (One-Click) - -Install the global CLI and register TeleDOM into your user configuration: - -```bash -npm install -g teledom -dom-antigravity install --global -``` - -### 2. Workspace Installation for Any Project - -To enable TeleDOM for an individual project repository: - -```bash -cd /path/to/your-project -npx teledom install --workspace -``` - -This creates `.agents/mcp_config.json` and registers the full 350-tool skill definitions into `.agents/skills/`. +## Honest Limitations -### 3. Load Chrome Extension in Browser +| Limitation | Detail & Workaround | +|------------|---------------------| +| **Chromium-first** | Built for Chrome, Edge, and Brave via Manifest V3. Firefox and Safari live extensions are not currently supported. | +| **Headless CI requires setup** | Live DOM capture requires a display context. In automated CI pipelines, run under `xvfb-run` or use CDP direct mode. | +| **Context cost of `full` profile** | Exposing all 350 tools consumes ~40,000 tokens. Use `TELEDOM_PROFILE=core` for everyday development and agent tasks. | +| **Sandboxed virtual replay** | Inline scripts (`onclick`, `onload`) are intentionally stripped during virtual time-travel replay for security. | +| **Single active bridge port** | Default port `3847` is shared across tabs. For concurrent multi-agent isolation, specify distinct `TELEDOM_PORT` values. | -1. Open Google Chrome and navigate to `chrome://extensions/`. -2. Enable **Developer mode** in the top-right corner. -3. Click **Load unpacked** and select the `teledom/dist/extension` folder. -4. The TeleDOM extension badge will appear in your toolbar. - -### 4. Configure External AI Clients (Claude / Cursor / Cline) - -#### Claude Desktop Configuration (`claude_desktop_config.json`) - -```json -{ - "mcpServers": { - "teledom": { - "command": "node", - "args": ["C:/path/to/teledom/dist/server/mcp-server.js"] - } - } -} -``` - -#### Cursor Configuration (`.cursor/mcp.json`) - -```json -{ - "mcpServers": { - "teledom": { - "command": "node", - "args": ["C:/path/to/teledom/dist/server/mcp-server.js"] - } - } -} -``` +We document our engineering trade-offs openly so expectations remain aligned with reality. --- -## 🧪 Testing & Quality Verification +## FAQ -TeleDOM is backed by a rigorous multi-tier testing pipeline: +**Do I need to start the WebSocket bridge manually?** +No. `ForensicMCPServer` includes a zero-config Auto-Bridge. Whenever an AI agent connects over MCP, the server initializes the bridge on port `3847` in the background. -```bash -# 1. Run full unit and intelligence test suite (319 tests) -npm run test:unit - -# 2. Run Python SDK self-test (17 tests) -npm run test:sdk +**How do I reduce token consumption in Cursor or Claude?** +Set `TELEDOM_PROFILE=core` (42 tools, ~4,800 tokens) or `TELEDOM_PROFILE=minimal` (22 tools, ~2,400 tokens) in your MCP client environment configuration. -# 3. Run full operational stdio JSON-RPC certification (350 tools) -npm run test:operational +**Can I run TeleDOM offline without internet access?** +Yes. TeleDOM operates 100% locally. The MCP server, WebSocket bridge, and Chrome extension do not make any external network requests. -# 4. Run deterministic benchmark matrix (10K / 100K / 1M events) -npm run bench +**How does TeleDOM prevent AI agents from clicking dangerous buttons?** +The Safe Mutation Engine executes actions within a transactional boundary with dry-run validation, preventing destructive DOM changes without explicit confirmation. -# 5. Run golden incident suite (1,032 scenarios) -npm run golden +**Where can I find documentation for individual tools?** +All 350 tools are documented with full parameter schemas and JSON-RPC operational examples in [docs/TOOLS_CATALOG_350_EN.md](./docs/TOOLS_CATALOG_350_EN.md) and [docs/TOOLS_CATALOG_350_FA.md](./docs/TOOLS_CATALOG_350_FA.md). -# 6. Run chaos engineering injection suite -npm run chaos +--- -# 7. Build production bundle (client, server, extension) -npm run build -``` +## Documentation Index + +| Document | English | Persian | +|----------|---------|---------| +| **Main README** | [README.md](README.md) | [README_FA.md](README_FA.md) | +| **350 Tools Catalog** | [docs/TOOLS_CATALOG_350_EN.md](./docs/TOOLS_CATALOG_350_EN.md) | [docs/TOOLS_CATALOG_350_FA.md](./docs/TOOLS_CATALOG_350_FA.md) | +| **Agent-Owned Workflows** | [docs/workflow/AGENT_WORKFLOWS.md](./docs/workflow/AGENT_WORKFLOWS.md) | [docs/workflow/AGENT_WORKFLOWS.md](./docs/workflow/AGENT_WORKFLOWS.md) | +| **Python SDK Guide** | [docs/workflow/PYTHON_SDK.md](./docs/workflow/PYTHON_SDK.md) | [docs/workflow/PYTHON_SDK.md](./docs/workflow/PYTHON_SDK.md) | +| **Production Recipes** | [EXAMPLES.md](EXAMPLES.md) | [EXAMPLES_FA.md](EXAMPLES_FA.md) | +| **System Architecture** | [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) | [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) | +| **Benchmarks & Metrics** | [docs/intelligence/BENCHMARKS.md](./docs/intelligence/BENCHMARKS.md) | [docs/intelligence/BENCHMARKS.md](./docs/intelligence/BENCHMARKS.md) | +| **Release Notes** | [docs/workflow/RELEASE_NOTES.md](./docs/workflow/RELEASE_NOTES.md) | [docs/workflow/RELEASE_NOTES.md](./docs/workflow/RELEASE_NOTES.md) | +| **Troubleshooting Guide** | [docs/TROUBLESHOOTING.md](./docs/TROUBLESHOOTING.md) | [docs/TROUBLESHOOTING.md](./docs/TROUBLESHOOTING.md) | +| **Contributing** | [CONTRIBUTING.md](CONTRIBUTING.md) | [CONTRIBUTING.md](CONTRIBUTING.md) | +| **Security Policy** | [SECURITY.md](SECURITY.md) | [SECURITY.md](SECURITY.md) | +| **Changelog** | [CHANGELOG.md](CHANGELOG.md) | [CHANGELOG.md](CHANGELOG.md) | --- -## 🔐 Security, Privacy & Performance +## Contributing & Security -1. **Zero-Trust Privacy Masking**: `PrivacyEngine` automatically sanitizes password fields, credit card numbers (Luhn-compliant), Social Security numbers, bearer tokens, API keys, and custom CSS selectors in both recording and live inspection. -2. **Sandboxed Virtual Replay**: Reconstructed DOM environments strip inline `on*` event handlers and prevent script execution, eliminating arbitrary code execution risks. -3. **Sub-Millisecond Overhead**: Low-overhead streaming observers use `requestAnimationFrame` and `requestIdleCallback` throttling to ensure zero dropped frames on 120 Hz displays. -4. **Clean Compositor Framing**: Overlay hiding ensures pristine, unpolluted visual screenshots during automation. +Contributions are warmly welcomed — bug reports, workflow patterns, and tool improvements. +Please review [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md) before submitting a pull request. --- -## ❓ Troubleshooting & FAQ - -#### Q: Do I need to run `npm run bridge` in a separate terminal? -> **A**: No! `ForensicMCPServer` includes a zero-config auto-bridge. Whenever an AI agent connects via MCP, the server automatically initializes the WebSocket bridge on port `3847` in the background. +## License & Author -#### Q: How do I test capturing a real Chrome screenshot from the terminal? -> **A**: Run `dom-antigravity screenshot`. It connects to your active Chrome tab, captures a pristine full-page screenshot and cropped element screenshot, and saves them to disk. +TeleDOM is open-source software licensed under the **Apache License, Version 2.0**. +See the [LICENSE](LICENSE) file for complete terms. -#### Q: How are the 350 tools documented? -> **A**: Every single tool is documented with full parameter schemas, TypeScript interfaces, and concrete operational JSON-RPC examples in [TOOLS_CATALOG_350_EN.md](./docs/TOOLS_CATALOG_350_EN.md) and [TOOLS_CATALOG_350_FA.md](./docs/TOOLS_CATALOG_350_FA.md). +Author: **Mohammad Javad (IrMaho)** --- -## 📜 License +
-Licensed under the **Apache License, Version 2.0**. See the [LICENSE](LICENSE) file for complete terms: +**TeleDOM v4.1** — *See what happened. Understand why. Simulate what-if. Fix safely. Prove the result.* -```text -http://www.apache.org/licenses/LICENSE-2.0 -``` +
diff --git a/README_FA.md b/README_FA.md index c1ecbe37..524f17bb 100644 --- a/README_FA.md +++ b/README_FA.md @@ -1,49 +1,305 @@ +
+ +[English](README.md) · **فارسی** + +لوگوی تله‌دام + +# تله‌دام نسخه ۴.۱ (TeleDOM v4.1) + +**موتور هوش زمانی مرورگر + محیط اجرای اتوماسیون با مالکیت عامل** + +*۳۵۰ ابزار اعتبارسنجی‌شده MCP • بازسازی زمان‌محور DOM زیر میلی‌ثانیه • افزونه کروم MV3 • پکیج پایتون بدون وابستگی* + +[![نسخه](https://img.shields.io/badge/version-4.1.0-blue.svg)](package.json) +[![مجوز: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) +[![تایپ‌اسکریپت](https://img.shields.io/badge/TypeScript-5.8%2B-3178C6.svg?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) +[![پایتون](https://img.shields.io/badge/Python-3.9%2B-3776AB.svg?logo=python&logoColor=white)](./sdk/python/) +[![افزونه کروم](https://img.shields.io/badge/Chrome_Extension-Manifest_V3-4285F4.svg?logo=googlechrome&logoColor=white)](https://developer.chrome.com/docs/extensions/mv3/) +[![ابزارهای MCP](https://img.shields.io/badge/MCP-350_Certified_Tools-7B1FA2.svg?logo=probot&logoColor=white)](./docs/TOOLS_CATALOG_350_FA.md) +[![تست‌ها](https://img.shields.io/badge/tests-320%20passed-brightgreen.svg)](#اجرای-تستها-و-تضمین-کیفیت) +[![پروفایل‌ها](https://img.shields.io/badge/profiles-4_runtime_levels-orange.svg)](#پروفایلهای-بهینه-مصرف-توکن) + +
+ +--- +
-# ⚡ تله‌دام نسخه ۴.۱ (TeleDOM v4.1) +## فهرست مطالب + +
+پرش به بخش + +- [تله‌دام چیست؟](#تلهدام-چیست) +- [چرا استفاده کنیم؟](#چرا-استفاده-کنیم) +- [پیش‌نمایش بصری و دموی معماری](#پیشنمایش-بصری-و-دموی-معماری) +- [ویژگی‌های برجسته و کلیدی](#ویژگیهای-برجسته-و-کلیدی) +- [پشته فناوری](#پشته-فناوری) +- [شروع سریع](#شروع-سریع) +- [پروفایل‌های بهینه مصرف توکن](#پروفایلهای-بهینه-مصرف-توکن) +- [نحوه کار](#نحوه-کار) +- [گردش‌کارهای عامل‌محور و حافظه تارگت](#گردشکارهای-عامل‌محور-و-حافظه-تارگت) +- [زرادخانه ۳۵۰ ابزار استاندارد MCP](#زرادخانه-۳۵۰-ابزار-استاندارد-mcp) +- [رابط خط فرمان همگانی (`dom-antigravity`)](#رابط-خط-فرمان-همگانی-dom-antigravity) +- [مرجع کتابخانه پایتون (Python SDK)](#مرجع-کتابخانه-پایتون-python-sdk) +- [مرجع تنظیمات و متغیرهای محیطی](#مرجع-تنظیمات-و-متغیرهای-محیطی) +- [دادهٔ جلسه در مقابل دادهٔ پایدار](#دادهٔ-جلسه-در-مقابل-دادهٔ-پایدار) +- [محیط‌های پشتیبانی‌شده و جدول سازگاری](#محیطهای-پشتیبانیشده-و-جدول-سازگاری) +- [نیازمندی‌های سیستم](#نیازمندیهای-سیستم) +- [توسعه و ساخت از سورس](#توسعه-و-ساخت-از-سورس) +- [اجرای تست‌ها و تضمین کیفیت](#اجرای-تستها-و-تضمین-کیفیت) +- [ساختار مخزن پروژه](#ساختار-مخزن-پروژه) +- [عیب‌یابی و رفع اشکال](#عیبیابی-و-رفع-اشکال) +- [محدودیت‌های صادقانه](#محدودیتهای-صادقانه) +- [مدل امنیت و حریم خصوصی](#مدل-امنیت-و-حریم-خصوصی) +- [سوالات متداول (FAQ)](#سوالات-متداول-faq) +- [نمایه مستندات پروژه](#نمایه-مستندات-پروژه) +- [مشارکت و امنیت](#مشارکت-و-امنیت) +- [لایسنس و نویسنده](#لایسنس-و-نویسنده) + +
-### 🧠 موتور هوش زمانی و محیط اجرای اتوماسیون مرورگر ویژه عامل‌های هوش مصنوعی • سرور جامع ۳۵۰ ابزار اعتبارسنجی‌شده MCP +--- + +## تله‌دام چیست؟ + +**تله‌دام (TeleDOM)** یک موتور صنعتی **هوش زمانی مرورگر (Temporal Browser Intelligence Engine)** و پلتفرم فراگیر پروتکل کانتکست مدل (**MCP**) شامل **۳۵۰ ابزار اعتبارسنجی‌شده** است که برای عامل‌های هوش مصنوعی خودمختار (مانند Claude، Cursor، Antigravity، Cline و OpenAI Swarm) و تیم‌های مهندسی فرانت‌اند طراحی شده است. + +بر خلاف مرورگرهای مصنوعی یا محیط‌های بدون‌سر (Headless)، تله‌دام از طریق یک افزونه استاندارد و مقاوم Manifest V3 مستقیماً به مرورگر واقعی و زنده کاربر متصل می‌شود و تمامی رویدادها، جهش‌های DOM، درخواست‌های شبکه و تغییرات ساختار صفحه را با دقت نانوثانیه ثبت می‌کند: + +- **هسته هوش زمانی EventMesh:** زنجیره ثبت وقایع غیرقابل‌دستکاری همراه با مهرهای زمانی نانوثانیه، ساعت‌های برداری و ردیابی علّی پیوندها. +- **سفر در زمان DOM زیر میلی‌ثانیه:** بازسازی کامل و بایت‌به‌بایت درخت مجازی DOM در هر لحظه دلخواه از گذشته ($State(T)$) جهت استخراج تفاضل‌ها و تحلیل رگرسیون. +- **گردش‌کارهای با مالکیت عامل (TeleDOM Flow):** عامل هوش مصنوعی فرآیند را یک‌بار یاد می‌گیرد، به شکل یک برنامه پارامتریک پایدار ذخیره می‌کند و در دفعات بعد با **۸۰٪ کاهش رفت‌وبرگشت MCP** و **۵۰٪ کاهش اسکن DOM** آن را به صورت قطعی اجرا می‌نماید. +- **زمینه واقعی کاربر:** دسترسی مستقیم به سشن‌های لاگین فعال، کوکی‌ها، افزونه‌ها و نشست‌های کاری کاربر بدون نیاز به ورود مجدد اطلاعات حساس. -[![TypeScript 5.8+](https://img.shields.io/badge/TypeScript-5.8%2B-blue.svg?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) -[![Chrome Extension Manifest V3](https://img.shields.io/badge/Chrome_Extension-Manifest_V3-red.svg?style=flat-square&logo=googlechrome&logoColor=white)](https://developer.chrome.com/docs/extensions/mv3/) -[![Model Context Protocol 350 Tools](https://img.shields.io/badge/Model_Context_Protocol-350_Tools-purple.svg?style=flat-square&logo=probot&logoColor=white)](https://modelcontextprotocol.io/) -[![Certification 350/350 Stdio](https://img.shields.io/badge/Certification-350%2F350_Stdio-brightgreen.svg?style=flat-square&logo=checkmarx&logoColor=white)](./docs/TOOLS_CATALOG_350_FA.md) -[![Tests 319/319 Passed](https://img.shields.io/badge/Tests-319%2F319_Passed-success.svg?style=flat-square&logo=vitest&logoColor=white)](#-تستها-و-تضمین-کیفیت) -[![Python SDK](https://img.shields.io/badge/Python_SDK-Semantic_Browser_Programming-3776AB.svg?style=flat-square&logo=python&logoColor=white)](./sdk/python/) -[![License Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg?style=flat-square&logo=apache)](LICENSE) +> **وجه تسمیه:** نام *TeleDOM* از ترکیب *Tele* (تله‌متری و رصد از راه دور فراسوی مرزهای سیستم) و *DOM* (درخت ساختاری صفحات وب) پدید آمده است. + +> [!NOTE] +> تله‌دام **۱۰۰٪ به صورت محلی و آفلاین** روی رایانه شما اجرا می‌شود. این سیستم هیچ‌گونه دیتای تله‌متری، ارسال ابری یا اتصال به سرورهای خارجی در عملکرد عادی خود ندارد. --- -### 🌐 دسترسی به مستندات و کاتالوگ ابزارها +## چرا استفاده کنیم؟ -- 📖 **[کاتالوگ جامع و تفصیلی ۳۵۰ ابزار به زبان فارسی (TOOLS_CATALOG_350_FA.md)](./docs/TOOLS_CATALOG_350_FA.md)** -- 🇬🇧 **[English 350 Tools Catalog (Documentation)](./docs/TOOLS_CATALOG_350_EN.md)** -- 🇬🇧 **[English Project Readme (README.md)](./README.md)** -- ⚡ **[مستندات معماری گردش‌کار عامل‌محور (TeleDOM Flow)](./docs/workflow/AGENT_WORKFLOWS.md)** -- 🐍 **[راهنمای جامع پکیج رسمی پایتون (Python SDK)](./docs/workflow/PYTHON_SDK.md)** -- 📋 **[گزارش تغییرات و اعتبارسنجی نسخه ۴.۱](./docs/workflow/RELEASE_NOTES.md)** -- 💡 **[۲۵۰ مثال کاربردی عملیاتی به زبان فارسی (EXAMPLES_FA.md)](./EXAMPLES_FA.md)** | **[250 Production Recipes EN](./EXAMPLES.md)** -- 📊 **[ماتریس بهبودها و پیشرفت‌های معماری](./docs/intelligence/IMPROVEMENTS.md)** -- 📈 **[بنچمارک‌ها و سنجه‌های عملکردی سنجیده‌شده](./docs/intelligence/BENCHMARKS.md)** +| چالش در راهکارهای موجود | پاسخ مهندسی تله‌دام (TeleDOM) | +|-------------------------|-----------------------------| +| **محیط خام و بدون سشن:** مرورگرهای سنتی Puppeteer/Playwright فاقد سشن‌های لاگین، کوکی‌ها و زمینه واقعی کاربر هستند | **سشن واقعی کروم:** اتصال زنده به پروفایل فعال مرورگر کاربر همراه با دسترسی کامل به سشن‌ها و کوکی‌ها | +| **اسکرپرهای شکننده و پرهزینه:** عامل‌های AI در هر بار اجرا صفحه را از صفر اسکن می‌کنند که موجب هدررفت توکن می‌شود | **گردش‌کار عامل‌محور و حافظه المان‌ها:** ذخیره ردپای تارگت‌ها و بازپخش آنی، قطعی و بایت‌به‌بایت بدون نیاز به اسکن مجدد | +| **انفجار مصرف توکن مدل‌های زبانی:** ارسال کدهای خام ۵۰ هزار خطی HTML پنجره کانتکست مدل را فوراً پر می‌کند | **۴ پروفایل مصرف بهینه:** مقیاس‌بندی هوشمند اسکیما از ۲,۴۰۰ توکن (`minimal`) تا سطح کامل سازمانی (`full`) | +| **خطاهای زودگذر و ناپدیدشونده:** خطاهای استایل، جابه‌جایی‌های چیدمان و Race Conditionها با رفرش صفحه گم می‌شوند | **سفر در زمان زیر میلی‌ثانیه‌ای ($State(T)$):** بازسازی دقیق وضعیت DOM در هر لحظه دلخواه از خط زمانی | +| **ادعاهای توهم‌آمیز بدون اثبات:** ربات‌های تست ادعا می‌کنند که اکشن‌ها موفق بوده‌اند اما سندی وجود ندارد | **موتور اثبات و نامتغیرها:** راستی‌آزمایی ریاضی هم‌ارزی ساختاری DOM و تضمین صفر درصد مثبت کاذب | +| **دیباگ دستی و زمان‌بر در کنسول:** مهندسان ساعت‌ها وقت خود را صرف بررسی لاگ‌های شبکه و کنسول می‌کنند | **بازرس خودکار علت ریشه‌ای (`td_investigate`):** تولید خودکار گراف فرضیات علّی و فایل‌های بسته حادثه `.tdom` | +| **تایم‌اوت ۳۰ ثانیه‌ای کروم MV3:** سرویس‌ورکر افزونه در تسک‌های طولانی‌مدت توسط کروم خاموش می‌شود | **ضربان قلب آلارم ۲۴ ثانیه‌ای:** احیای مداوم ارتباط + محافظت از تداخل DevTools (F12) با پروتکل CDP | +| **اکشن‌های مخرب و غیرقابل‌برگشت:** کلیک‌های نادانسته عامل ممکن است داده‌های مهم را حذف یا دستکاری کند | **موتور جهش امن:** اجرای ترانزاکشنال اتمیک همراه با پیش‌نمایش کاملاً بدون اثر (Dry-run) و بازگشت قطعی | --- -## ⚡ تله‌دام نسخه ۴.۱ — محیط اجرای اتوماسیون با مالکیت عامل (Agent-Owned Runtime) +## پیش‌نمایش بصری و دموی معماری + +
-> **تله‌دام تصمیم‌گیرنده نیست؛ تله‌دام توانمندساز است.** -> **عامل هوش مصنوعی مغز متفکر است؛ تله‌دام دست‌ها، چشم‌ها، حافظه و جعبه‌ابزار مرورگر اوست.** -> *وظیفه را یک‌بار به مرورگر بیاموزید. آن را به برنامه‌ای با قابلیت بازپخش تبدیل کنید. روی هر وب‌سایتی که مرورگر قادر به باز کردن آن است اجرا نمایید.* +![دموی زنده کار با عامل هوش مصنوعی و TeleDOM](https://raw.githubusercontent.com/IrMaho/TeleDOM/master/assets/teledom_live_agent_demo.gif) + +> 🎬 **دموی ویدیویی زنده:** اجرای خودکار عامل هوش مصنوعی برای ضبط رخدادهای مرورگر، بازرسی درخت DOM، انجام تعاملات و اجرای چندمرحله‌ای اتوماسیون وب بدون دخالت دست! ([مشاهده و دانلود ویدیو 1080p](./assets/teledom_live_agent_demo.mp4)) + +
```text -عامل هوش مصنوعی (Agent) — کشف سایت · استدلال منطقی · نوشتن ورک‌فلو · نسخه‌بندی · دیباگ · تولید ربات - │ ارتباط MCP (سطح ۱: ۳۵۰ ابزار استاندارد) ──────────────┐ - │ پکیج Python SDK (سطح ۲: برنامه‌نویسی معنایی مرورگر) ─┐ │ - ▼ ▼ -تله‌دام (TeleDOM) — مشاهده مرورگر · ابزارهای پایه · حافظه المان‌ها · - ذخیره‌سازی ورک‌فلو · اجرای قطعی · شواهد · بازپخش · اثبات ریاضی ++-------------------------------------------------------------------------+ +| عامل هوش مصنوعی / کلاینت | +| (Antigravity IDE · Cursor · Claude Desktop · Cline) | ++------------------------------------+------------------------------------+ + | (ارتباط JSON-RPC 2.0 روی stdio) + v ++-------------------------------------------------------------------------+ +| سرور جامع تله‌دام نسخه ۴.۱ (۳۵۰ ابزار) | +| ├── ۱۴۴ ابزار هوش زمانی، گردش‌کار و حافظه عامل td_* | +| ├── ۵۴ ابزار تلفیق DevTools کروم dt_* | +| ├── ۳۱ ابزار کالبدشکافی پیشرفته بصری fx_* | +| ├── ۱۲۱ ابزار پایه، بازرسی زنده و تعامل | +| └── توزیع‌کننده پل ارتباطی خودکار روی پورت ۳۸۴۷ | ++------------------+------------------------------------+-----------------+ + | | (وب‌سوکت :3847) + v v ++------------------------------------+ +---------------------------------+ +| موتور اجرای گردش‌کار | | افزونه کروم (Manifest V3) | +| ├── ذخیره‌سازی و تفاضل ورک‌فلوها | | ├── موتور ناظر تغییرات DOM | +| ├── حافظه مشخصات پایدار المان‌ها | | ├── انتخابگر بصری المان‌ها | +| ├── هسته EventMesh و گراف علّی | | ├── خط لوله اسکرین‌شات تمیز | +| └── موتور اثبات و نامتغیرها | | └── درایور تعاملات شبیه‌سازی‌شده| ++------------------------------------+ +---------------------------------+ ``` -### دموی طلایی اجرای ورک‌فلو +| سطح عملیاتی | هدف و کاربرد اصلی | +|-------------|-------------------| +| **سرور MCP (`stdio`)** | ارائه ۳۵۰ ابزار اعتبارسنجی‌شده به کلیه کلاینت‌های سازگار با استاندارد Model Context Protocol | +| **خط فرمان (`dom-antigravity`)** | پیکربندی یک‌کلیکه ورک‌اسپیس‌ها، بررسی سلامت سیستم، ثبت اسکرین‌شات تمیز و مدیریت دیمن بریج | +| **افزونه کروم (MV3)** | رهگیری جهش‌های صفحه، تسهیل انتخاب المان با کلید ترکیبی، اجرای کلیک و تایپ شبیه‌سازی‌شده | +| **کتابخانه پایتون (`teledom`)** | پکیج خالص پایتون ۳.۹+ بدون هیچ وابستگی خارجی جهت برنامه‌نویسی سطح بالای معنایی مرورگر | + +--- + +## ویژگی‌های برجسته و کلیدی + +- **محیط اجرای گردش‌کار با مالکیت عامل:** ساخت، پارامتریک‌سازی، نسخه‌بندی، مقایسه تفاوت‌ها و بازپخش قطعی برنامه‌های چندمرحله‌ای مرورگر (`td_workflow_run`). +- **حافظه المان‌ها و اثرانگشت ساختاری:** ذخیره پایدار سلکتورها و هویت المان‌ها جهت رفع نیاز به اسکن‌های مکرر و خسته‌کننده صفحه. +- **هسته EventMesh زمانی با دقت نانوثانیه:** لاگ وقایع غیرقابل‌دستکاری با زنجیره هش SHA-256، ساعت‌های برداری و ریشه‌های درخت مرکل. +- **سفر در زمان DOM زیر میلی‌ثانیه‌ای:** بازسازی لحظه‌ای وضعیت DOM در هر مهر زمانی گذشته ($State(T)$). +- **شبیه‌سازی مرورگر خلاف‌واقع (Counterfactual):** انشعاب‌گیری فرضی از وضعیت DOM، فیلتر کردن رخدادها یا درخواست‌ها و مقایسه پیامدهای احتمالی. +- **کارآگاه خودکار حوادث (`td_investigate`):** تریاژ خودکار تنها با یک دستور، فرمول‌بندی فرضیات علّی و تولید پکیج‌های حادثه `.tdom`. +- **موتور جهش امن (Safe Mutation):** اعمال اتمیک و ترانزاکشنال تغییرات با امکان پیش‌نمایش بی‌خطر (Dry-run) و بازگشت تضمینی. +- **هوش امنیتی منفعل (Passive Security):** مانیتورینگ بدون‌توقف صفحه، مقابله با تزریق پرامپت، کشف XSS و سانسور داده‌های حساس. +- **۴ پروفایل مصرف بهینه توکن:** مدیریت هوشمند پنجره کانتکست از ۲۲ ابزار فوق‌سریع (~۲,۴۰۰ توکن) تا زرادخانه کامل ۳۵۰ ابزار. +- **کتابخانه رسمی پایتون با صفر وابستگی:** کنترل سطح‌بالای مرورگر در پایتون ۳.۹+ با استفاده از ساختار کانتکست منیجر. +- **اعتبارسنجی ۱۰۰٪ عملیاتی پروتکل JSON-RPC:** تایید کامل ۳۵۰ ابزار از ۳۵۰ ابزار روی کانال ارتباطی واقعی stdio. + +--- + +## پشته فناوری + +| لایه | فناوری | کاربرد در سیستم | +|------|--------|-----------------| +| **هسته و ران‌تایم** | Node.js 22+ & TypeScript 5.8+ | سرور غیرمسدودکننده MCP، هسته EventMesh و سیستم فایلینگ | +| **پروتکل عامل هوش مصنوعی** | Model Context Protocol (MCP) | استاندارد ارتباطی JSON-RPC 2.0 برای تمامی عامل‌های هوش مصنوعی | +| **اکستنشن مرورگر** | Chrome Extension Manifest V3 | ثبت جهش‌ها با MutationObserver، اتصال گره‌ها با WeakMap | +| **یکپارچگی مرورگر** | Chrome DevTools Protocol (CDP) | ممیزی Lighthouse، تحلیل HAR شبکه و ارزیابی عمیق کارایی | +| **پکیج پایتون** | Pure Python 3.9+ (Zero-Dependency) | کلاینت سطح‌بالای معنایی شامل `Browser` و `Workflow` | +| **تست و ارزیابی کیفیت** | Vitest 3.x, Ruff, Mypy | تست‌های واحد، سازگاری تایپ‌ها و سوئیت اعتبارسنجی stdio | +| **پلتفرم‌های مقصد** | Windows 10/11, macOS, Linux | پشتیبانی همه‌جانبه از تمام سیستم‌عامل‌های رومیزی و CI | + +--- + +## شروع سریع + +### مسیر الف — راه‌اندازی با یک کلیک برای عامل‌های هوش مصنوعی (پیشنهادی) + +نصب ابزار خط فرمان و فعال‌سازی تله‌دام برای ورک‌اسپیس یا سیستم: + +```bash +# ۱. نصب باینری سراسری +npm install -g teledom + +# ۲. پیکربندی تله‌دام برای پروژه فعلی (.agents) +dom-antigravity install --workspace + +# یا پیکربندی سراسری برای تمام پروژه‌های Antigravity IDE: +dom-antigravity install --global +``` + +### مسیر ب — اجرای پروژه از سورس (توسعه‌دهندگان) + +```bash +git clone https://github.com/IrMaho/TeleDOM.git +cd TeleDOM +npm install +npm run build +npm run test:unit +``` + +### مسیر ج — استفاده در پایتون (Python SDK) + +```bash +pip install ./sdk/python +``` + +```python +from teledom import Browser + +with Browser() as browser: + browser.inspect() + browser.type("#search-box", "عامل‌های خودمختار هوش مصنوعی") + browser.click("#submit-btn") +``` + +### اولین اتوماسیون در ۶۰ ثانیه + +۱. پوشه `teledom/dist/extension` را به عنوان افزونه بازشده (Unpacked) در `chrome://extensions/` لود کنید. +۲. عامل هوش مصنوعی خود (Antigravity IDE، Cursor یا Claude Desktop) را متصل نمایید. +۳. سرور **پل وب‌سوکت را به‌صورت خودکار** روی پورت `۳۸۴۷` فعال می‌کند. +۴. از عامل بخواهید صفحه را بازرسی کرده و گردش‌کار را ذخیره کند: + ```json + {"name": "td_workflow_save", "arguments": {"name": "login_flow", "steps": [...]}} + ``` +۵. این گردش‌کار را در هر زمان با یک فراخوانی قطعی بازپخش کنید: + ```json + {"name": "td_workflow_run", "arguments": {"workflow_id": "login_flow"}} + ``` + +--- + +## پروفایل‌های بهینه مصرف توکن + +برای جلوگیری از هدررفت کانتکست مدل‌های زبانی و کاهش هزینه‌های پردازش تا **۹۴٪**، تله‌دام ۴ پروفایل اجرایی از طریق متغیر محیطی `TELEDOM_PROFILE` ارائه می‌دهد: + +| پروفایل | ابزارهای فعال | توکن تخمینی اسکیما | کاربرد ایده‌آل | توضیحات | +|:---|:---:|:---:|:---|:---| +| **`minimal`** | **۲۲** | **حدود ۲,۴۰۰ توکن** | پاسخ‌های سریع و مدل‌های کم‌هزینه | عملیات پایه ناوبری: بازرسی، کلیک، تایپ، اسکرین‌شات | +| **`core`** | **۴۲** | **حدود ۴,۸۰۰ توکن** | اتوماسیون کامل و پایدار | ابزارهای اصلی + حافظه تارگت‌ها + موتور اجرای گردش‌کار | +| **`forensics`** | **۷۴** | **حدود ۸,۵۰۰ توکن** | ممیزی، خطایابی و تست‌های QA | تحلیل رگرسیون دیداری، تفاضل DOM، لاگ‌های شبکه و کنسول | +| **`full`** *(پیش‌فرض)* | **۳۵۰** | **حدود ۴۰,۰۰۰ توکن** | استدلال عمیق و نیازهای سازمانی | زرادخانه کامل ۳۵۰ ابزار با سازگاری کامل با نسخه‌های قبل | + +```bash +# اجرای سرور با پروفایل سبک Core +TELEDOM_PROFILE=core npx teledom +``` + +--- + +## نحوه کار + +```mermaid +flowchart LR + A["عامل هوش مصنوعی / LLM"] -->|"ارتباط JSON-RPC 2.0 / stdio"| B["سرور ForensicMCPServer"] + B -->|"پل خودکار (پورت ۳۸۴۷)"| C["افزونه کروم MV3"] + C -->|"MutationObserver"| D["صفحه وب هدف"] + D -->|"رویدادهای نانوثانیه"| E["هسته EventMesh زمانی"] + E -->|"اسنپ‌شات سفر در زمان"| F["وضعیت مجازی DOM در لحظه T"] + F -->|"بازپخش قطعی"| G["اثبات ریاضی و اعتبارسنجی"] +``` + +```mermaid +flowchart TB + subgraph AgentLayer["لایه عامل هوش مصنوعی"] + IDE["محیط Antigravity IDE / Cursor / Claude"] + PY["پکیج رسمی پایتون teledom"] + CLI["رابط خط فرمان dom-antigravity"] + end + + subgraph ServerLayer["لایه سرور MCP تله‌دام (Node.js)"] + MCP["سرور ForensicMCPServer (۳۵۰ ابزار)"] + WF["موتور اجرای گردش‌کار"] + TM["حافظه پایدار تارگت‌ها"] + EM["هسته هوش زمانی EventMesh"] + CE["موتور استدلال علّی و ریشه‌یابی"] + AB["پل خودکار وب‌سوکت (پورت ۳۸۴۷)"] + end + + subgraph BrowserLayer["لایه اجرای مرورگر (Chrome MV3)"] + CS["اسکریپت محتوا و اتصال گره‌ها"] + MO["موتور ناظر تغییرات DOM"] + EV["توزیع‌کننده تعاملات مصنوعی"] + SC["خط لوله اسکرین‌شات Canvas"] + end + + IDE --> MCP + PY --> MCP + CLI --> AB + MCP --> WF + MCP --> TM + MCP --> EM + MCP --> CE + MCP --> AB + AB <-->|"فریم‌های وب‌سوکت (پورت ۳۸۴۷)"| CS + CS --> MO + CS --> EV + CS --> SC +``` + +--- + +## گردش‌کارهای عامل‌محور و حافظه تارگت + +تله‌دام نسخه ۴.۱ مفهوم اتوماسیون مرورگر را از اسکریپت‌نویسی سنتی به **برنامه‌های با قابلیت بازپخش با مالکیت عامل** تغییر می‌دهد: ```text اجرای اول (کشف صفحه): ۵ فراخوانی ابزار · ۲ اسکن کامل DOM · ۵ رفت‌وبرگشت به MCP @@ -54,223 +310,191 @@ ثبت گزارش قطعی اجرای عملیات با قابلیت بازپخش مو‌به‌مو شاخص‌های عملکردی: ۸۰٪ کاهش رفت‌وبرگشت MCP · ۵۰٪ کاهش اسکن DOM · بازپخش موفق - صفر درصد بای‌پس ناخواسته · صفر درصد تداخل · ۳۵۰/۳۵۰ ابزار تاییدشده + صفر درصد بای‌پس ناخواسته · صفر درصد تداخل · ۳۵۰/۳۵۰ ابزار تاییدشده ``` -### ۴۴ ابزار جدید اضافه شده در نسخه ۴.۱: +### ۴۴ ابزار تخصصی اضافه شده در نسخه ۴.۱: | دسته‌بندی ابزارها | تعداد | ابزارهای موجود | |---|:---:|---| -| **ابزارهای پایه مرورگر (Browser Primitives)** | **۲۲** | `td_browser_*` · `td_dom_inspect/query/extract/snapshot` · `td_target_find/check/describe` · `td_action_click/type/select/hover/press/scroll` · `td_wait` · `td_screenshot` · `td_execute_script` · `td_network_inspect` · `td_console_read` | -| **محیط اجرای گردش‌کار (Workflow Runtime)** | **۱۴** | `td_workflow_save/get/list/update/delete/clone/diff/export/import/validate/run/runs/run_get/replay` — اجرای قطعی همراه با گیت‌های امنیتی، گزارش وضعیت و بازپخش بایت‌به‌بایت | -| **ابزارها و حافظه اختصاصی عامل (Agent Tooling)** | **۸** | `td_target_memory_*` (شناسایی ذخیره‌شده المان‌ها بدون نیاز به اسکن مجدد DOM) · `td_agent_artifact_*` (ابزارهای سفارشی، اسکریپت‌ها و سیاست‌ها بدون تغییر در هسته) | - -رویکرد **مرورگر به عنوان پایه (Browser-First)** و **عدم وابستگی به API**: وب‌سایت‌های پیچیده و برنامه‌های SPA فاقد API عمومی هدف اصلی هستند. عامل هوش مصنوعی شیوه کشف را خودش انتخاب می‌کند و تله‌دام اجرای مطمئن را بدون مداخله انجام می‌دهد. +| **ابزارهای پایه مرورگر** | **۲۲** | `td_browser_*` · `td_dom_*` · `td_target_*` · `td_action_*` · `td_wait` · `td_screenshot` · `td_execute_script` · `td_network_inspect` · `td_console_read` | +| **محیط اجرای گردش‌کار** | **۱۴** | `td_workflow_save/get/list/update/delete/clone/diff/export/import/validate/run/runs/run_get/replay` | +| **ابزارها و حافظه اختصاصی عامل** | **۸** | `td_target_memory_*` (تارگت‌های پایدار) · `td_agent_artifact_*` (ابزارها و سیاست‌های سفارشی) | --- -## ⚡ معرفی و خلاصه تله‌دام در یک خط - -> **تله‌دام در یک خط:** *ببین چه اتفاقی افتاد. دلیلش را بفهم. شبیه‌سازی خلاف‌واقع کن. با اطمینان اصلاح کن. نتیجه را با اثبات ریاضی نشان بده.* - -**تله‌دام (TeleDOM)** یک موتور صنعتی **هوش زمانی مرورگر (Temporal Browser Intelligence)** و پلتفرم فراگیر **پروتکل کانتکست مدل (Model Context Protocol - MCP)** است که **۳۵۰ ابزار اعتبارسنجی‌شده** را برای عامل‌های خودمختار هوش مصنوعی (مانند Claude، Cursor، Antigravity، Cline، OpenAI Swarm) و مهندسان فرانت‌اند فراهم می‌آورد. +## زرادخانه ۳۵۰ ابزار استاندارد MCP -در این پلتفرم، تمام ادعاها و گزارش‌های تشخیصی متکی به شواهد رمزنگاری‌شده، گراف علّی، زنجیره هدر و اثبات‌های ریاضی ماشین‌خوان هستند. +تله‌دام دارای جامع‌ترین جعبه‌ابزار مرورگر برای عامل‌های هوش مصنوعی با تاییدیه ۱۰۰٪ عملیاتی است: -### سنجه‌های اعتبارسنجی نسخه ۴.۱ (تولیدشده با `npm run bench` — [ماتریس کامل](./docs/intelligence/BENCHMARKS.md)) +| خانواده ابزار | پیشوند | تعداد ابزار | وظایف و قابلیت‌های اصلی | +|---|---|:---:|---| +| **هوش زمانی و گردش‌کار** | `td_*` | **۱۴۴** | هسته EventMesh، تحلیل علّی، گراف شواهد، سناریوهای شرطی، گردش‌کارها، حافظه المان‌ها، اثبات‌ها و امنیت | +| **تلفیق DevTools کروم** | `dt_*` | **۵۴** | بازرسی مستقیم کلاینت کروم، ممیزی Lighthouse، ثبت HeapSnapshot، ردیابی HAR شبکه، لاگ‌های کنسول | +| **کالبدشکافی پیشرفته بصری** | `fx_*` | **۳۱** | پیوند رخدادهای شبکه با DOM، رگرسیون دیداری، جابه‌جایی چیدمان، تداخل Z-index، گارد جهش امن | +| **ابزارهای پایه و تعامل زنده** | Core / v3 | **۱۲۱** | انتخابگر بصری المان‌ها، برش اسکرین‌شات، تعاملات شبیه‌سازی‌شده، مقایسه ساختاری DOM، سفر در زمان | +| **مجموع کل ابزارهای تاییدشده** | | **۳۵۰** | **تاییدیه عملیاتی ۱۰۰٪ روی کانال stdio (پاس شدن ۳۵۰/۳۵۰)** | -| سنجه | نتیجه | توضیح | -|---|---|---| -| **مجموعه حوادث طلایی (۱,۰۳۲ سناریو در ۲۴ دسته‌بندی)** | **۱۰۰.۰٪** | حل کامل ۸۶۰ سناریوی قابل‌حل بدون هیچ‌گونه ابهام | -| **نرخ تکمیل بررسی ریشه خطا (ICR)** | **۱۰۰.۰٪** | کشف خودکار و گام‌به‌گام زنجیره علّی خطا | -| **دقت بازپخش اسنپ‌شات‌ها (RF)** | **۱۰۰.۰٪** | بازسازی بایت‌به‌بایت و قطعی وضعیت درخت مجازی DOM | -| **دقت تشخیص علت ریشه‌ای** | **۱۰۰.۰٪** | دسته‌بندی دقیق نوع خطا (حذف کامپوننت، تغییرات CSS، تداخل شبکه و غیره) | -| **نرخ موفقیت کاذب (False Success)** | **۰.۰۰٪** | صفر درصد گزارش مثبت کاذب در تمام آزمایش‌ها | -| **مجموعه تست آشوب (Chaos Engineering - ۱۶ تزریق)** | **۱۶/۱۶ مهارشده** | مهار کامل، مشاهده، توضیح علّی و بازیابی خودکار | -| **اعتبارسنجی عملیاتی پروتکل JSON-RPC** | **۳۵۰/۳۵۰ ابزار تاییدشده** | ثبت و تست واقعی تمام ۳۵۰ ابزار روی کانال stdio | -| **مجموعه تست‌های واحد و یکپارچگی** | **۳۱۹/۳۱۹ تست موفق** | پاس شدن ۱۰۰٪ تست‌ها در ۳۶ فایل تستی | -| **ماتریس بهبودهای معماری** | **۱۰۶ مورد معتبر** | ۱۰۴ مورد پیاده‌سازی کامل و ۲ مورد موکول‌شده با دلایل مستند | +> جهت مشاهده کاتالوگ تفصیلی، اسکیماهای کامل و نمونه‌های فراخوانی: +> - 🇮🇷 **[کاتالوگ جامع ۳۵۰ ابزار به زبان فارسی](./docs/TOOLS_CATALOG_350_FA.md)** +> - 📖 **[English Tools Catalog (3,800+ lines)](./docs/TOOLS_CATALOG_350_EN.md)** --- -## 🚀 دموی زنده و ویدیویی - -![دموی زنده کار با عامل هوش مصنوعی و TeleDOM](https://raw.githubusercontent.com/IrMaho/TeleDOM/master/assets/teledom_live_agent_demo.gif) - -> 🎬 **دموی ویدیویی زنده:** اجرای خودکار عامل هوش مصنوعی برای ضبط رخدادهای مرورگر، بازرسی درخت DOM، انجام تعاملات و انتشار چندمرحله‌ای توییت‌ها بدون دخالت دست انسان! ([مشاهده و دانلود ویدیوی باکیفیت 1080p](./assets/teledom_live_agent_demo.mp4)) +## رابط خط فرمان همگانی (`dom-antigravity`) ---- +باینری ثبت‌شده سیستم با نام‌های مستعار `mcp-dom` و `browser-antigravity`: -## 📖 فهرست مطالب - -- [⚡ تله‌دام نسخه ۴.۱ — محیط اجرای اتوماسیون با مالکیت عامل](#-تلهدام-نسخه-۴۱--محیط-اجرای-اتوماسیون-با-مالکیت-عامل-agent-owned-runtime) -- [⚡ معرفی و خلاصه تله‌دام در یک خط](#-معرفی-و-خلاصه-تلهدام-در-یک-خط) -- [🐍 شروع سریع با پکیج پایتون (Python SDK)](#-شروع-سریع-با-پکیج-پایتون-python-sdk) -- [✨ قابلیت‌های کلیدی](#-قابلیتهای-کلیدی) -- [💻 ترمینال و رابط خط فرمان اختصاصی (`dom-antigravity`)](#-ترمینال-و-رابط-خط-فرمان-اختصاصی-dom-antigravity) -- [🏗️ معماری سیستم](#-معماری-سیستم) - - [مدل اجرای دو محیطی (Dual-Environment Model)](#مدل-اجرای-دو-محیطی-dual-environment-model) - - [دیاگرام کلان معماری](#دیاگرام-کلان-معماری) - - [پل ارتباطی خودکار و بدون تنظیمات (Zero-Config Auto-Bridge)](#-پل-ارتباطی-خودکار-و-بدون-تنظیمات-zero-config-auto-bridge) - - [پایپ‌لاین اسکرین‌شات تمیز و کالبدشکافی بصری](#-پایپلاین-اسکرینشات-تمیز-و-کالبدشکافی-بصری) - - [موتور بازسازی وضعیت و سفر در زمان (Time-Travel)](#موتور-بازسازی-وضعیت-و-سفر-در-زمان-time-travel) -- [📁 ساختار کامل مخزن](#-ساختار-کامل-مخزن) -- [🤖 مرجع ابزارهای پروتکل کانتکست مدل (MCP) - ۳۵۰ ابزار](#-مرجع-ابزارهای-پروتکل-کانتکست-مدل-mcp---۳۵۰-ابزار) - - [۱. ۱۴۴ ابزار هوش زمانی و محیط گردش‌کار (`td_*`)](#۱-۱۴۴-ابزار-هوش-زمانی-و-محیط-گردشکار-td_) - - [۲. ۵۴ ابزار تلفیق DevTools کروم (`dt_*`)](#۲-۵۴-ابزار-تلفیق-devtools-کروم-dt_) - - [۳. ۳۱ ابزار کالبدشکافی پیشرفته (`fx_*`)](#۳-۳۱-ابزار-کالبدشکافی-پیشرفته-fx_) - - [۴. ۱۲۱ ابزار پایه، تعامل زنده و انتخابگر بصری](#۴-۱۲۱-ابزار-پایه-تعامل-زنده-و-انتخابگر-بصری) -- [🚀 راهنمای نصب و شروع سریع](#-راهنمای-نصب-و-شروع-سریع) - - [۱. نصب سراسری در سیستم (یک‌کلیک)](#۱-نصب-سراسری-در-سیستم-یککلیک) - - [۲. نصب اختصاصی در هر پروژه یا ورک‌اسپیس](#۲-نصب-اختصاصی-در-هر-پروژه-یا-ورکاسپیس) - - [۳. لود کردن افزونه در مرورگر کروم](#۳-لود-کردن-افزونه-در-مرورگر-کروم) - - [۴. اتصال به کلاینت‌های هوش مصنوعی (Claude / Cursor / Cline)](#۴-اتصال-به-کلاینتهای-هوش-مصنوعی-claude--cursor--cline) -- [🧪 تست‌ها و تضمین کیفیت](#-تستها-و-تضمین-کیفیت) -- [🔐 امنیت، حریم خصوصی و عملکرد](#-امنیت-حریم-خصوصی-و-عملکرد) -- [❓ عیب‌یابی و سوالات متداول](#-عیبیابی-و-سوالات-متداول) -- [📜 لایسنس و شرایط استفاده](#-لایسنس-و-شرایط-استفاده) +| دستور | گزینه / نام مستعار | توضیحات و عملکرد | +|-------|--------------------|-------------------| +| `dom-antigravity install` | `--workspace` (`-w`) | پیکربندی خودکار تله‌دام در پروژه جاری (`.agents/mcp_config.json`) | +| `dom-antigravity install` | `--global` (`-g`) | ثبت سراسری تله‌دام برای تمامی پروژه‌ها در Antigravity IDE | +| `dom-antigravity install` | `--target ` | نصب تنظیمات در یک پوشه یا ورک‌اسپیس دلخواه | +| `dom-antigravity status` | | بررسی سلامت سرور پل ارتباطی (`:3847`) و تب‌های فعال کروم | +| `dom-antigravity screenshot` | | ثبت اسکرین‌شات تمیز از صفحه کامل و المان‌های بریده‌شده روی دیسک | +| `dom-antigravity bridge` | | اجرای دستی پل وب‌سوکت (اختیاری — پل خودکار این کار را مدیریت می‌کند) | +| `dom-antigravity config` | `cursor` / `claude` | چاپ بلاک تنظیمات JSON آماده برای استفاده در کلاینت‌های مختلف | --- -## 🐍 شروع سریع با پکیج پایتون (Python SDK) +## مرجع کتابخانه پایتون (Python SDK) -تله‌دام دارای یک SDK رسمی پایتون با وابستگی صفر (`sdk/python/teledom`) است: +کتابخانه رسمی پایتون با وابستگی صفر (`sdk/python/teledom`): ```python from teledom import Browser, Workflow with Browser() as browser: - # ۱. کنترل پیشرفته مرورگر + # ۱. کنترل سطح بالای مرورگر page = browser.inspect() browser.type("#search-box", "عامل‌های خودمختار هوش مصنوعی") browser.click("#submit-btn") - # ۲. ساخت و ذخیره ورک‌فلو توسط عامل + # ۲. ساخت و ذخیره یک گردش‌کار اختصاصی wf = Workflow("triage_issues", client=browser.client) wf.input("filter", "فیلتر برچسب ایشوها", default="bug") - wf.step("filter_step", "td_target_check", args={"selector": ".issue-row"}) + wf.step("check_table", "td_target_check", args={"selector": ".issue-row"}) wf.save(version="1.0.0") - # ۳. اجرای ورک‌فلو با گزارش‌گیری قطعی و بدون افت توکن + # ۳. اجرای قطعی با گزارش وضعیت run = wf.run({"filter": "security"}) - print("وضعیت اجرای ورک‌فلو:", run["run"]["status"]) + print("وضعیت اجرا:", run["run"]["status"]) ``` --- -## ✨ قابلیت‌های کلیدی - -| قابلیت | توضیح | -| :--- | :--- | -| **موتور گردش‌کار عامل‌محور** | ساخت، پارامتریک‌سازی، نسخه‌بندی، مقایسه تفاوت‌ها و اجرای قطعی برنامه‌های چندمرحله‌ای مرورگر. | -| **حافظه المان‌ها (Target Memory)** | ذخیره شناسه‌های پایدار المان‌ها (`td_target_memory_save`) جهت حذف اسکن‌های تکراری DOM در دفعات بعدی. | -| **هسته EventMesh زمانی** | ثبت لاگ وقایع غیرقابل‌دستکاری با زنجیره هش SHA-256، مهرهای زمانی با دقت نانوثانیه، ساعت‌های برداری و درخت مرکل. | -| **سفر در زمان DOM زیر میلی‌ثانیه** | بازسازی لحظه‌ای وضعیت DOM در هر مهر زمانی دلخواه $T$ یا شناسه رویداد $E$، محاسبه تفاوت‌های ساختاری و پرس‌وجوی خط زمانی. | -| **شبیه‌سازی مرورگر خلاف‌واقع (Counterfactual)** | ایجاد شاخه‌های فرضی، متوقف‌سازی درخواست‌های شبکه یا جهش‌های خاص DOM و مقایسه نتایج شاخه‌های مجازی بدون اثرگذاری روی صفحه اصلی. | -| **موتور جهش امن (Safe Mutation Transactions)** | اعمال تغییرات ترانزاکشنال و اتمیک با پیش‌نمایش کاملاً بدون اثر جانبی (Dry-run) و بازگشت تضمینی (Rollback). | -| **بازرس خودکار حوادث (`td_investigate`)** | تریاژ و خطایابی خودکار با یک دستور، فرمول‌بندی فرضیات، امتیازدهی به شواهد و تولید فایل‌های پرتابل `.tdom`. | -| **اثبات ریاضی و اعتبارسنجی نامتغیرها** | راستی‌آزمایی نامتغیرهای سیستم، اثبات هم‌ارزی ساختاری، مهار رگرسیون و گواهی عدم موفقیت کاذب. | -| **هوش امنیتی منفعل (Passive Security)** | اسکن صفحه بر پایه معماری Zero-Trust، شناسایی حملات تزریق پرامپت، شناسایی آسیب‌پذیری‌های XSS و سانسور خودکار اطلاعات حساس. | -| **تاب‌آوری خودترمیم و دیده‌بان منابع** | قطع‌کننده مدار (Circuit Breaker)، کشف نشت حافظه، ردیابی اشیاء سرگردان زباله‌روب و برقراری مجدد خودکار پل وب‌سوکت. | -| **۳۵۰ ابزار استاندارد JSON-RPC 2.0 MCP** | جامع‌ترین جعبه‌ابزار مرورگر برای عامل‌های هوش مصنوعی در زمینه‌های هوش زمانی، ابزارهای DevTools، کالبدشکافی و تعامل زنده. | +## مرجع تنظیمات و متغیرهای محیطی + +| متغیر محیطی | مقدار پیش‌فرض | توضیحات | +|-------------|---------------|---------| +| `TELEDOM_PROFILE` | `full` | پروفایل عملیاتی: `minimal` (۲۲), `core` (۴۲), `forensics` (۷۴), `full` (۳۵۰) | +| `TELEDOM_PORT` | `3847` | پورت ارتباطی سرور پل وب‌سوکت و HTTP | +| `TELEDOM_BRIDGE_TOKEN` | *تعریف‌نشده* | توکن امنیتی اختیاری Bearer برای محافظت از اندپوینت‌های حساس | +| `TELEDOM_STORAGE_DIR` | `.teledom` | مسیر پوشه ذخیره‌سازی محلی سشن‌ها و بسته‌های حادثه | +| `TELEDOM_HEADLESS` | `false` | تنظیم روی `true` جهت اتصال به کروم Headless با پروتکل CDP | +| `DEBUG` | `false` | فعال‌سازی لاگ‌های جزئی JSON-RPC و رخدادهای EventMesh | --- -## 💻 ترمینال و رابط خط فرمان اختصاصی (`dom-antigravity`) +## دادهٔ جلسه در مقابل دادهٔ پایدار -این پکیج یک باینری خط فرمان سراسری با نام `dom-antigravity` (همراه با نام‌های مستعار `mcp-dom` و `browser-antigravity`) ارائه می‌دهد: +| نوع داده | محل نگهداری | ماندگاری پس از ریستارت؟ | +|----------|-------------|:----------------------:| +| **ورک‌فلوها و گام‌های اجرایی** | `.mcpdom_projects/workflows/` | **بله** | +| **اثرانگشت و حافظه المان‌ها** | `.mcpdom_projects/targets/` | **بله** | +| **پرونده‌های حادثه (`.tdom`)** | `.forensic_sessions/` | **بله** | +| **اتصال زنده پل وب‌سوکت** | حافظه رم در پورت `:3847` | **خیر** (اتصال خودکار مجدد) | +| **کش موقت اسنپ‌شات‌های مجازی** | حافظه هیپ فرآیند Node.js | **خیر** (بازسازی در صورت تقاضا) | -```bash -# ۱. نصب تنظیمات MCP و مهارت‌ها در ورک‌اسپیس جاری (.agents) -dom-antigravity install --workspace -# نام کوتاه: -dom-antigravity install -w +> [!IMPORTANT] +> در حافظه تارگت‌ها و فایل‌های گردش‌کار، صرفاً سلکتورها و اسکیماهای ساختاری ذخیره می‌شوند. رمزهای عبور کاربران، اطلاعات کارت‌های بانکی و کلیدهای دسترسی به لطف ماژول `PrivacyEngine` **هرگز روی دیسک نوشته نمی‌شوند**. -# ۲. نصب سراسری برای تمامی پروژه‌ها در Antigravity IDE -dom-antigravity install --global -# نام کوتاه: -dom-antigravity install -g +--- + +## محیط‌های پشتیبانی‌شده و جدول سازگاری + +| دسته‌بندی | نسخه‌های پشتیبانی‌شده | نکات | +|-----------|-----------------------|------| +| **مرورگرها** | کروم ۱۲۰ به بعد، Chromium، مایکروسافت Edge، بریو (Brave) | نیازمند پشتیبانی از اکستنشن Manifest V3 | +| **ران‌تایم نود** | Node.js نسخه‌های 18.x, 20.x, 22.x LTS | کامپایل و اعتبارسنجی‌شده روی Node 22 | +| **محیط پایتون** | Python نسخه‌های 3.9, 3.10, 3.11, 3.12, 3.13 | بدون نیاز به نصب هرگونه کتابخانه متفرقه | +| **سیستم‌عامل‌ها** | ویندوز 10/11، سیستم‌عامل macOS، توزیع‌های مختلف لینوکس | پشتیبانی کامل دسکتاپ و سرور | +| **کلاینت‌های هوش مصنوعی** | Antigravity IDE، Cursor، Claude Desktop، Cline، Windsurf | سازگاری کامل با استاندارد Model Context Protocol | -# ۳. نصب در یک پوشه خاص -dom-antigravity install --target "C:/path/to/project" +--- + +## نیازمندی‌های سیستم + +| مولفه | حداقل نیازمندی | مقدار پیشنهادی | +|-------|----------------|----------------| +| **سیستم‌عامل** | ویندوز 10، مک‌او‌اس 12، اوبونتو 20.04 | ویندوز 11 / مک‌او‌اس 14 | +| **Node.js** | 18.18.0 به بالا | 22.x LTS | +| **Python** | 3.9 به بالا (جهت پکیج پایتون) | 3.11 به بالا | +| **حافظه رم (RAM)** | ۴ گیگابایت | ۸ گیگابایت به بالا برای تحلیل سنگین DOM | +| **فضای دیسک** | ۲۰۰ مگابایت | ۵۰۰ مگابایت (شامل فایل‌های آزمون) | +| **مرورگر** | Google Chrome 120+ | آخرین نسخه پایدار Google Chrome | + +--- -# ۴. بررسی سلامت پل ارتباطی و تب‌های متصل کروم -dom-antigravity status +## توسعه و ساخت از سورس -# ۵. ثبت اسکرین‌شات تمیز از کروم (صفحه کامل + المان برش‌خورده) -dom-antigravity screenshot +```bash +# نصب وابستگی‌ها +npm install -# ۶. روشن کردن دستی پل ارتباطی وب‌سوکت (اختیاری — پل خودکار آن را مدیریت می‌کند) -dom-antigravity bridge +# کامپایل تمام بخش‌ها (کلاینت، افزونه کروم، سرور MCP) +npm run build -# ۷. نمایش فایل پیکربندی آماده برای Claude Desktop یا Cursor -dom-antigravity config cursor -dom-antigravity config claude +# ساخت اختصاصی هر بخش +npm run build:client # کامپایل کلاینت با Vite +npm run build:extension # باندل افزونه کروم MV3 +npm run build:server # کامپایل سرور MCP ``` --- -## 🏗️ معماری سیستم +## اجرای تست‌ها و تضمین کیفیت -### مدل اجرای دو محیطی (Dual-Environment Model) +```bash +# ۱. سوئیت آزمون جامع مهندسی (بیلد + ۳۲۰ تست واحد + ۱۷ تست پایتون + لینت) +npm run qa:all + +# ۲. اجرای آزمون‌های واحد و هوش زمانی (۳۲۰ تست، ۱۰۰٪ سبز) +npm run test:unit -تله‌دام در دو محیط اجرایی کاملاً مجزا و هماهنگ فعالیت می‌کند: +# ۳. اجرای تست‌های پکیج پایتون (۱۷ تست) +npm run test:sdk -۱. **محیط مرورگر (افزونه کروم Manifest V3 / اسکریپت محتوا / کانتکست تزریق‌شده):** - - رهگیری تغییرات DOM با استفاده از `MutationObserver`. - - تخصیص شناسه‌های پایدار `LogicalNodeId` به المان‌ها از طریق `WeakMap`. - - شنود کلیدهای `Ctrl + Shift + Click` برای انتخاب بصری المان‌ها. - - اجرای تعاملات شبیه‌سازی‌شده (`click`، `type`، `hover`، `focus`، `scroll`، `drag`). - - برش دقیق المان‌ها روی بوم گرافیکی HTML5 Canvas. - - مخفی‌سازی ویجت‌های افزونه هنگام ثبت اسکرین‌شات. +# ۴. اعتبارسنجی کدهای پایتون و سازگاری تایپ‌ها (Ruff + Mypy) +npm run lint:python -۲. **محیط سرور Node.js و سرور MCP (`ForensicMCPServer`):** - - ارائه **۳۵۰ ابزار پروتکل MCP** روی کانال‌های `stdio` و HTTP. - - راه‌اندازی و مدیریت خودکار پل ارتباطی وب‌سوکت روی پورت `۳۸۴۷`. - - راه‌اندازی هسته هوش زمانی EventMesh، گراف شواهد و موتور استدلال علّی. - - بازسازی اسنپ‌شات‌های مجازی DOM در کسری از میلی‌ثانیه. - - ذخیره‌سازی، اعتبارسنجی و اجرای قطعی ورک‌فلوهای تعریف‌شده توسط عامل. +# ۵. آزمون عملیاتی تاییدیه تمامی ۳۵۰ ابزار روی کانال stdio (تاییدیه ۱۰۰٪) +npm run test:operational ---- +# ۶. اجرای بنچمارک‌های قطعی (۱۰ هزار، ۱۰۰ هزار و ۱ میلیون رویداد) +npm run bench -### دیاگرام کلان معماری +# ۷. اجرای مجموعه آزمون‌های حوادث طلایی (۱,۰۳۲ سناریو) +npm run golden -```text -┌────────────────────────────────────────────────────────────────────────┐ -│ عامل هوش مصنوعی / کلاینت MCP │ -│ (Antigravity IDE / Cursor / Claude Desktop / CLI) │ -└───────────────────────────────────┬────────────────────────────────────┘ - │ (ارتباط JSON-RPC 2.0 روی stdio) - ▼ -┌────────────────────────────────────────────────────────────────────────┐ -│ سرور جامع تله‌دام نسخه ۴.۱ (۳۵۰ ابزار) │ -│ ├── ۱۴۴ ابزار هوش زمانی، گردش‌کار و حافظه عامل td_* │ -│ ├── ۵۴ ابزار تلفیق DevTools کروم dt_* │ -│ ├── ۳۱ ابزار کالبدشکافی پیشرفته fx_* │ -│ ├── ۱۲۱ ابزار پایه، بازرسی زنده و تعامل │ -│ └── توزیع‌کننده پل ارتباطی خودکار روی پورت ۳۸۴۷ │ -└───────────────────┬────────────────────────────────┬───────────────────┘ - │ │ (ارتباط وب‌سوکت روی پورت ۳۸۴۷) - ▼ ▼ -┌───────────────────────────────┐ ┌────────────────────────────────────┐ -│ موتور اجرای گردش‌کار │ │ سرور پل ارتباطی وب‌سوکت │ -│ ├── ذخیره و اجرای ورک‌فلوها │ │ (پورت ۳۸۴۷ - مدیریت خودکار) │ -│ ├── حافظه المان‌ها (Targets) │ └─────────────────┬──────────────────┘ -│ ├── هسته EventMesh و علّی │ │ -│ ├── شبیه‌ساز خلاف‌واقع │ │ (فریم‌های دوطرفه JSON) -│ └── موتور اثبات و نامتغیرها │ ▼ -└───────────────────────────────┘ ┌────────────────────────────────────┐ - │ افزونه کروم (Manifest V3) │ - │ ├── موتور ناظر تغییرات DOM │ - │ ├── انتخابگر بصری المان‌ها │ - │ ├── خط لوله اسکرین‌شات تمیز │ - │ └── درایور تعاملات شبیه‌سازی‌شده │ - └────────────────────────────────────┘ +# ۸. اجرای آزمون‌های مهندسی آشوب و تزریق خطا (۱۶ از ۱۶ مهارشده) +npm run chaos ``` +### سنجه‌های اعتبارسنجی سنجیده‌شده: + +| سنجه | نتیجه | توضیح | +|---|---|---| +| **مجموعه حوادث طلایی** | **۱۰۰.۰٪** | حل کامل ۸۶۰ سناریوی قابل‌حل بدون هیچ‌گونه ابهام | +| **نرخ تکمیل بررسی ریشه خطا (ICR)** | **۱۰۰.۰٪** | کشف خودکار و گام‌به‌گام زنجیره علّی خطا | +| **دقت بازپخش اسنپ‌شات‌ها (RF)** | **۱۰۰.۰٪** | بازسازی بایت‌به‌بایت و قطعی وضعیت درخت مجازی DOM | +| **دقت تشخیص علت ریشه‌ای** | **۱۰۰.۰٪** | دسته‌بندی دقیق نوع خطا (حذف کامپوننت، تغییرات CSS، رقابت شبکه) | +| **اعتبارسنجی عملیاتی پروتکل JSON-RPC** | **۳۵۰/۳۵۰ ابزار تاییدشده** | ثبت و تست واقعی تمام ۳۵۰ ابزار روی کانال stdio | +| **مجموعه تست‌های واحد و یکپارچگی** | **۳۲۰/۳۲۰ تست موفق** | پاس شدن ۱۰۰٪ تست‌ها در ۳۶ فایل تستی | + --- -## 📁 ساختار کامل مخزن +## ساختار مخزن پروژه ```text teledom/ @@ -286,7 +510,7 @@ teledom/ │ ├── storage/ # لایه ذخیره‌سازی محلی روی دیسک و ایندکسینگ │ └── ui/ # رابط کاربری رصدخانه (Observatory UI) ├── sdk/ -│ └── python/ # پکیج رسمی پایتون (BrowserController, WorkflowEngine, TargetMemory) +│ └── python/ # پکیج رسمی پایتون (Browser, Workflow, TargetMemory) ├── docs/ │ ├── TOOLS_CATALOG_350_FA.md # کاتالوگ جامع و تفصیلی ۳۵۰ ابزار به زبان فارسی │ ├── TOOLS_CATALOG_350_EN.md # Complete English reference for all 350 tools @@ -300,147 +524,105 @@ teledom/ │ └── operational/ # مجموعه آزمون‌های عملیاتی تاییدیه ۳۵۰ ابزار روی کانال stdio ├── operational-tests/ # ۳۵۰ پوشه اختصاصی شامل تعاریف تست و اعتبارسنجی‌ها ├── package.json # نسخه ۴.۱.۰، اسکریپت‌ها و وابستگی‌ها +├── README.md # مستندات انگلیسی پروژه └── README_FA.md # راهنمای جامع فارسی (این فایل) ``` --- -## 🤖 مرجع ابزارهای پروتکل کانتکست مدل (MCP) - ۳۵۰ ابزار - -تله‌دام نسخه ۴.۱ دارای **۳۵۰ ابزار استاندارد و اعتبارسنجی‌شده JSON-RPC 2.0** در چهار خانواده تخصصی است. +## عیب‌یابی و رفع اشکال -برای مشاهده مشخصات کامل پارامترها، اسکیماهای ورودی و مثال‌های عملیاتی تمامی ۳۵۰ ابزار: -- 📖 **[کاتالوگ جامع ۳۵۰ ابزار به زبان فارسی (بیش از ۳,۹۰۰ سطر)](./docs/TOOLS_CATALOG_350_FA.md)** -- 🇬🇧 **[English Tools Catalog (3,800+ lines)](./docs/TOOLS_CATALOG_350_EN.md)** - -### جدول تفکیکی خانواده‌های ابزارها - -| خانواده ابزار | پیشوند / دسته | تعداد ابزار | توضیحات و کاربرد | -|---|---|:---:|---| -| **هوش زمانی و گردش‌کار** | `td_*` | **۱۴۴** | هسته EventMesh، تحلیل علّی، گراف شواهد، ذخیره/اجرا/دیف/بازپخش ورک‌فلوها، حافظه المان‌ها، اثبات‌های ریاضی و امنیت | -| **تلفیق DevTools کروم** | `dt_*` | **۵۴** | بازرسی مستقیم کلاینت کروم، ممیزی Lighthouse، ثبت HeapSnapshot، ردیابی شبکه HAR، لاگ‌های کنسول و شبیه‌سازی دستگاه‌ها | -| **کالبدشکافی پیشرفته** | `fx_*` | **۳۱** | ارتباط وقایع شبکه با جهش‌های DOM، رگرسیون بصری، تغییرات چیدمان (Layout Shifts)، تداخل Z-index و گارد جهش امن | -| **ابزارهای پایه و تعامل زنده** | Core / v3 | **۱۲۱** | انتخابگر بصری المان‌ها، برش اسکرین‌شات، تعاملات مصنوعی، مقایسه ساختاری DOM، سفر در زمان و ردیابی چرخه حیات | -| **مجموع کل ابزارهای تاییدشده** | | **۳۵۰** | **تاییدیه عملیاتی ۱۰۰٪ (پاس شدن ۳۵۰/۳۵۰ ابزار روی Stdio)** | +| نشانه خطا | علت احتمالی | راه‌حل | +|-----------|-------------|--------| +| **آیکون افزونه خاکستری / غیرفعال است** | سرور بریج روشن نیست یا پورت تداخل دارد | دستور `dom-antigravity status` را اجرا کنید یا سرور MCP را بالا بیاورید؛ پل خودکار روی پورت `۳۸۴۷` فعال می‌شود | +| **خطای `EADDRINUSE: 3847`** | فرآیند دیگری پورت ۳۸۴۷ را اشغال کرده است | پروسس سرگردان قبلی را متوقف کنید یا متغیر `TELEDOM_PORT=3848` را تنظیم نمایید | +| **خطای پر شدن کانتکست در مدل هوش مصنوعی** | اجرای پیش‌فرض در پروفایل کامل (۳۵۰ ابزار حدود ۴۰ هزار توکن است) | پروفایل را به `TELEDOM_PROFILE=core` (~۴,۸۰۰ توکن) یا `minimal` (~۲,۴۰۰ توکن) تغییر دهید | +| **تداخل DevTools کروم (F12) با CDP** | پنجره دیباگر کروم همزمان باز است | تله‌دام مجهز به کشف تداخل است؛ پنجره F12 کروم را ببندید تا پروتکل CDP به افزونه متصل شود | +| **خطای اتصال پکیج پایتون** | سرور ارتباطی بالا نیست | مطمئن شوید قبل از اجرای اسکریپت پایتون، سرور MCP یا دستور `dom-antigravity bridge` فعال باشد | +| **جهش‌های DOM ثبت نمی‌شوند** | افزونه غیرفعال است یا قبل از روشن شدن افزونه صفحه باز شده | تب مربوطه در مرورگر را مجدداً رفرش کنید (`Ctrl+R`) تا اسکریپت‌های افزونه تزریق شوند | --- -## 🚀 راهنمای نصب و شروع سریع - -### ۱. نصب سراسری در سیستم (یک‌کلیک) - -نصب ابزار خط فرمان و ثبت تنظیمات تله‌دام در پیکربندی سراسری کاربر: - -```bash -npm install -g teledom -dom-antigravity install --global -``` - -### ۲. نصب اختصاصی در هر پروژه یا ورک‌اسپیس - -جهت فعال‌سازی تله‌دام برای یک مخزن یا پروژه به‌خصوص: - -```bash -cd /path/to/your-project -npx teledom install --workspace -``` - -این دستور فایل `.agents/mcp_config.json` را ایجاد کرده و تعاریف کامل مهارت‌های ۳۵۰ ابزار را در پوشه `.agents/skills/` ثبت می‌نماید. +## محدودیت‌های صادقانه -### ۳. لود کردن افزونه در مرورگر کروم +| محدودیت | جزئیات فنی و راهکار جایگزین | +|---------|------------------------------| +| **تمرکز اولیه بر خانواده Chromium** | برای مرورگرهای Chrome، Edge و Brave توسعه یافته است. افزونه فایرفاکس و سافاری در حال حاضر در دسترس نیستند. | +| **نیاز محیط‌های Headless در CI به تنظیم اولیه** | ضبط زنده تغییرات DOM نیازمند رندر گرافیکی است. در سرورهای CI از ابزارهایی مانند `xvfb-run` یا حالت اتصال مستقیم CDP استفاده کنید. | +| **هزینه توکن در پروفایل `full`** | نمایش اسکیماهای هر ۳۵۰ ابزار حدود ۴۰,۰۰۰ توکن فضا می‌برد. برای کارهای روزمره از پروفایل `core` استفاده فرمایید. | +| **ایزوله‌سازی اسکریپت‌ها در بازپخش مجازی** | کلیه اسکریپت‌های درون‌خطی (`onclick` و غیره) در حالت بازپخش به دلایل امنیتی غیرفعال می‌شوند. | +| **پورت اشتراکی پیش‌فرض** | پورت پیش‌فرض `۳۸۴۷` بین تب‌ها به اشتراک گذاشته می‌شود. برای محیط‌های ایزوله چند عاملی، پورت‌های مجزا در `TELEDOM_PORT` تعریف کنید. | -۱. مرورگر Google Chrome را باز کرده و به آدرس `chrome://extensions/` بروید. -۲. گزینه **Developer mode** را در گوشه بالا سمت راست روشن کنید. -۳. روی دکمه **Load unpacked** کلیک کرده و پوشه `teledom/dist/extension` را انتخاب کنید. -۴. آیکون تله‌دام در نوار ابزار کروم ظاهر می‌شود. +ما محدودیت‌ها و ملاحظات مهندسی را صادقانه بیان می‌کنیم تا انتظارات با واقعیت منطبق باشد. -### ۴. اتصال به کلاینت‌های هوش مصنوعی (Claude / Cursor / Cline) +--- -#### پیکربندی Claude Desktop (`claude_desktop_config.json`) +## مدل امنیت و حریم خصوصی -```json -{ - "mcpServers": { - "teledom": { - "command": "node", - "args": ["C:/path/to/teledom/dist/server/mcp-server.js"] - } - } -} -``` - -#### پیکربندی Cursor (`.cursor/mcp.json`) - -```json -{ - "mcpServers": { - "teledom": { - "command": "node", - "args": ["C:/path/to/teledom/dist/server/mcp-server.js"] - } - } -} -``` +۱. **امنیت درگاه پل ارتباطی (پورت ۳۸۴۷):** تنظیمات CORS کاملاً محدود به لوکال‌هاست و افزونه رسمی کروم بوده و درخواست‌های ارتقا به وب‌سوکت اعتبارسنجی می‌شوند تا هیچ وب‌سایت متفرقه‌ای نتواند به ابزارها دسترسی یابد. +۲. **ماسک‌سازی خودکار داده‌های حساس:** هسته `PrivacyEngine` به صورت خودکار مقادیر فیلدهای رمز عبور، شماره کارت‌های بانکی، کدهای ملی، توکن‌های Bearer و کلیدهای API را قبل از ذخیره‌سازی سانسور می‌کند. +۳. **گارد جهش امن (Safe Mutation Guard):** اعمال تغییرات روی DOM داخل یک کانتکست ترانزاکشنال و با امکان پیش‌نمایش بی‌خطر (Dry-run) انجام می‌شود تا از حذف یا ویرایش ناخواسته المان‌ها جلوگیری شود. --- -## 🧪 تست‌ها و تضمین کیفیت +## سوالات متداول (FAQ) -تله‌دام دارای یک پایپ‌لاین آزمون چندلایه‌ای بسیار سخت‌گیرانه است: +**آیا لازم است سرور وب‌سوکت را به صورت دستی در یک ترمینال جداگانه باز کنم؟** +خیر. سرور `ForensicMCPServer` مجهز به قابلیت پل ارتباطی خودکار (Auto-Bridge) است. به محض اتصال عامل هوش مصنوعی، سرور پورت ۳۸۴۷ را در پس‌زمینه روشن می‌کند. -```bash -# ۱. اجرای کل تست‌های واحد و تست‌های هوش زمانی (۳۱۹ تست) -npm run test:unit +**چگونه مصرف توکن را در Cursor یا Claude به حداقل برسانم؟** +کافیست متغیر `TELEDOM_PROFILE=core` (۴۲ ابزار، حدود ۴,۸۰۰ توکن) یا `TELEDOM_PROFILE=minimal` (۲۲ ابزار، حدود ۲,۴۰۰ توکن) را در فایل پیکربندی کلاینت خود قرار دهید. -# ۲. اجرای آزمون‌های اختصاصی پکیج پایتون (۱۷ تست) -npm run test:sdk - -# ۳. اجرای آزمون عملیاتی تاییدیه تمامی ۳۵۰ ابزار روی کانال stdio -npm run test:operational +**آیا تله‌دام بدون دسترسی به اینترنت و به صورت آفلاین کار می‌کند؟** +بله. تله‌دام کاملاً محلی است. سرور، افزونه و پل ارتباطی بدون نیاز به هیچ شبکه خارجی روی رایانه شما اجرا می‌شوند. -# ۴. اجرای ماتریس بنچمارک قطعی (۱۰ هزار، ۱۰۰ هزار و ۱ میلیون رویداد) -npm run bench +**تله‌دام چگونه از کلیک اشتباه روی دکمه‌های خطرناک جلوگیری می‌کند؟** +موتور جهش امن تمامی اکشن‌ها را ابتدا در یک محیط شبیه‌سازی ارزیابی کرده و بدون تایید مستقیم عامل اجازه اعمال اثرات مخرب را نمی‌دهد. -# ۵. اجرای مجموعه تست‌های حوادث طلایی (۱,۰۳۲ سناریو) -npm run golden +**اسناد تفصیلی مربوط به تک‌تک ابزارها در کجا قرار دارد؟** +هر ۳۵۰ ابزار به همراه پارامترهای ورودی و نمونه‌های عملیاتی در اسناد [docs/TOOLS_CATALOG_350_FA.md](./docs/TOOLS_CATALOG_350_FA.md) و [docs/TOOLS_CATALOG_350_EN.md](./docs/TOOLS_CATALOG_350_EN.md) ثبت شده‌اند. -# ۶. اجرای تست‌های مهندسی آشوب و تزریق خطا -npm run chaos +--- -# ۷. بیلد نهایی پروژه (کلاینت، سرور، افزونه مرورگر) -npm run build -``` +## نمایه مستندات پروژه + +| عنوان سند | نسخه انگلیسی | نسخه فارسی | +|-----------|--------------|------------| +| **راهنمای اصلی پروژه** | [README.md](README.md) | [README_FA.md](README_FA.md) | +| **کاتالوگ جامع ۳۵۰ ابزار** | [docs/TOOLS_CATALOG_350_EN.md](./docs/TOOLS_CATALOG_350_EN.md) | [docs/TOOLS_CATALOG_350_FA.md](./docs/TOOLS_CATALOG_350_FA.md) | +| **راهنمای گردش‌کار عامل‌محور** | [docs/workflow/AGENT_WORKFLOWS.md](./docs/workflow/AGENT_WORKFLOWS.md) | [docs/workflow/AGENT_WORKFLOWS.md](./docs/workflow/AGENT_WORKFLOWS.md) | +| **مستندات پکیج پایتون** | [docs/workflow/PYTHON_SDK.md](./docs/workflow/PYTHON_SDK.md) | [docs/workflow/PYTHON_SDK.md](./docs/workflow/PYTHON_SDK.md) | +| **دستورالعمل‌ها و مثال‌های عملیاتی** | [EXAMPLES.md](EXAMPLES.md) | [EXAMPLES_FA.md](EXAMPLES_FA.md) | +| **سند تفصیلی معماری سیستم** | [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) | [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) | +| **گزارش بنچمارک‌ها و ارزیابی** | [docs/intelligence/BENCHMARKS.md](./docs/intelligence/BENCHMARKS.md) | [docs/intelligence/BENCHMARKS.md](./docs/intelligence/BENCHMARKS.md) | +| **یادداشت‌های انتشار نسخه ۴.۱** | [docs/workflow/RELEASE_NOTES.md](./docs/workflow/RELEASE_NOTES.md) | [docs/workflow/RELEASE_NOTES.md](./docs/workflow/RELEASE_NOTES.md) | +| **راهنمای جامع عیب‌یابی** | [docs/TROUBLESHOOTING.md](./docs/TROUBLESHOOTING.md) | [docs/TROUBLESHOOTING.md](./docs/TROUBLESHOOTING.md) | +| **راهنمای مشارکت در پروژه** | [CONTRIBUTING.md](CONTRIBUTING.md) | [CONTRIBUTING.md](CONTRIBUTING.md) | +| **خط‌مشی امنیت** | [SECURITY.md](SECURITY.md) | [SECURITY.md](SECURITY.md) | +| **گزارش تغییرات (Changelog)** | [CHANGELOG.md](CHANGELOG.md) | [CHANGELOG.md](CHANGELOG.md) | --- -## 🔐 امنیت، حریم خصوصی و عملکرد +## مشارکت و امنیت -۱. **ماسک‌سازی اطلاعات حساس به‌صورت پیش‌فرض:** کلاس `PrivacyEngine` تمام فیلدهای رمز عبور، شماره کارت‌های بانکی (سازگار با الگوریتم Luhn)، کدهای ملی، توکن‌های دسترسی، کلیدهای API و سلکتورهای سفارشی اعلام‌شده توسط کاربر را سانسور می‌کند. -۲. **امنیت بازپخش در محیط ایزوله (Sandbox):** در محیط بازسازی اسنپ‌شات‌ها، تمام هندلرهای رویداد درون‌خطی (`on*`) حذف شده و اجرای اسکریپت‌ها مسدود می‌گردد تا از هرگونه اجرای کد ناخواسته جلوگیری شود. -۳. **مصرف بسیار ناچیز منابع و سرعت بالا:** ناظرهای DOM از مکانیزم‌های زمان‌بندی `requestAnimationFrame` و `requestIdleCallback` استفاده می‌کنند تا عملکرد صفحه وب حتی در فرکانس‌های ۱۲۰ هرتز دچار افت فریم نشود. -۴. **فریم‌بندی تمیز کارت گرافیک:** مخفی‌سازی دقیق ویجت‌ها در زمان ثبت اسکرین‌شات از هرگونه آلودگی دیداری در تصاویر جلوگیری می‌کند. +از مشارکت توسعه‌دهندگان، گزارش خطاها و ارسال پول‌ریکوئست‌ها صمیمانه استقبال می‌شود. +لطفاً پیش از ارسال درخواست، فایل‌های [CONTRIBUTING.md](CONTRIBUTING.md) و [SECURITY.md](SECURITY.md) را مطالعه فرمایید. --- -## ❓ عیب‌یابی و سوالات متداول - -#### س: آیا لازم است دستور `npm run bridge` را در یک ترمینال جداگانه باز نگه دارم؟ -> **پاسخ:** خیر! سرور `ForensicMCPServer` مجهز به قابلیت پل خودکار است. هر زمان که عامل هوش مصنوعی یا کلاینتی به سرور MCP وصل شود، سرور به‌صورت خودکار پل ارتباطی WebSocket روی پورت ۳۸۴۷ را در پس‌زمینه روشن می‌کند. +## لایسنس و نویسنده -#### س: چگونه ثبت اسکرین‌شات واقعی از مرورگر کروم را از ترمینال تست کنم؟ -> **پاسخ:** کافیست دستور `dom-antigravity screenshot` را در ترمینال اجرا کنید. این دستور به تب فعال کروم شما وصل شده، یک اسکرین‌شات کامل و یک اسکرین‌شات بریده‌شده از المان تهیه کرده و روی دیسک ذخیره می‌کند. +پروژه تله‌دام یک نرم‌افزار متن‌باز تحت مجوز **Apache License, Version 2.0** است. +متن کامل مجوز در فایل [LICENSE](LICENSE) قابل دسترسی است. -#### س: ۳۵۰ ابزار سیستم در کجا مستند شده‌اند؟ -> **پاسخ:** تک‌تک ابزارها با اسکیماهای کامل ورودی، رابط‌های تایپ‌اسکریپت و نمونه‌های فراخوانی واقعی در فایل‌های [TOOLS_CATALOG_350_FA.md](./docs/TOOLS_CATALOG_350_FA.md) و [TOOLS_CATALOG_350_EN.md](./docs/TOOLS_CATALOG_350_EN.md) مستند شده‌اند. +نویسنده و توسعه‌دهنده اصلی: **محمد جواد (IrMaho)** --- -## 📜 لایسنس و شرایط استفاده +
-این پروژه تحت مجوز **Apache License, Version 2.0** منتشر شده است. متن کامل لایسنس در فایل [LICENSE](LICENSE) یا آدرس زیر در دسترس است: +**تله‌دام نسخه ۴.۱ (TeleDOM v4.1)** — *ببین چه اتفاقی افتاد. دلیلش را بفهم. شبیه‌سازی کن. با اطمینان اصلاح کن. نتیجه را با اثبات نشان بده.* -```text -http://www.apache.org/licenses/LICENSE-2.0 -``` +
diff --git a/assets/teledom_3d_logo.png b/assets/teledom_3d_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7f45d1be121b8e7832cd14f4ad13db4f839db86a GIT binary patch literal 708213 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�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 z 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
XDR0|uJ1~;WK$y;F&pWeRlpYbDL6X^jyvn3x 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

?Q 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\X^3iV9m9^1Y+U(AK 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%0D5GL7vmE31%=VN#>z0jQtu09zOM~(uEdm%-9dc z%+`(f>1#6_#iK?z_f{bZTsCe=F}D$5wKO67@`zZ6j<>9aaf?>dPuz5duisTDxW`GH zT0Ux!6yHtWAqhQJa2XMGNju;t3k&)97=PPZs;&|;P9FGrZZqMsunAl)UsQ^oVI)=+d0EZBSVci|f!CN1s;4kEsdmgR84*}((Hw-<6oRp$K_bOf!I2tmvKFDvs$>=owA!_>T004k%g)>d1k>A6tEDi<|I)C{!(A5D7wB2yb3LpuvUr}!}mL`mm)6+du zvkupCVKor(4d?1l=V!GLFx3psiWXWaWM3Gx>J?&})VA|AZZ7bWM?WAoiKC9!jzund znJ8IXS((U^UZPWj4A-`TPt+=kAhMs?m}^KLAW6O3pHH%I_8!Xyc_8f)$XuD=K38O) zl`fJ9*n#(=vgX-YQo{pwvUKL3fA7AXzrU(6p|T!od9Ii357rm9HJU5J2|k|u@Ve+? zMRp(+BkAhpLtHM{Yi)DvQa9XwUOlD#sHqy4aJz(gheGH*F=c^uoCPr5wa!>x1U?`- zk`m&m6p*Tg0PWd->iNF_J_W)00CGqJ<~Yt+9-TyGucVV<2>Zx9CMwyP6<0(IX`$1 zF^qx_J#&oUXE@0moXMP?RZd?gX#fsL>zs`A!NvjL43S(lBMT)fYr4Ot&r3Fzz3kIk zYuve`Wvjinwy#b0^6l2$OgUm+Kp0X$1ck}YI*z#{o;nZ+&PHoGQ~;CE@(DR(+l-uX z!RyX_c_UtF21gvI#xQe^IovvZcqbU@K&-i28;%&M$pnHS!?`BoXSJ`}YhL%d-=}`7Ot}$Mk&FX^FnApa0Qc+Vtm%_) z9DK*28RsJ-fTUv#4hMXKPIIRy1gYeJ2GS9^>5g;UV?B;Kb~&;VK^P!z1RNZ4Ff+z8 z*zhw1!6#|Y19E_R^Vb>b2OYj*G-h%L0ZH^`1mi47C*>IfAaHp&>N?PD zukhgHoRne)ax!>s-Ec5^42`5W z!3U^4$3Eb2JNwmH8HgtYFZ>7)NWk0JoDY6j^laB8+-{d!rmbyK<$CL9D!z; zaAwBdm^dog9Q7FozdSC|agR!4vCh>~x197OkOn`5A6}g}`qpW!JlFYe=c+oX!b z>uc$w(Rx3fuB~lQfrUL4dI5rZ43gckhCfVX@qudM`s(z=*OwDr7!hHM&yk&?iFzO} zk|PDO268~haB7)$+5l2VB}i60_3APQVf?$A`k(ek_z$E0&|eUx@NT=UFNf_~&E^-b zr0imh5%K0mLae?*%;2z&IX97kll1%}kmh_@oZ)z9DX$t>oZ6=(VOF!Hhnu4pRx+z? z`C_Ev?Bt~F718^-7Eg`OvpgnIfQ%|)vDITrj3*^dGMT%qjymrk)BLasUa1R*k$r&979Z$J6^dIdR@DIdav*(WPd?l>n^2SDzO&?T; zEe@k-qBdEVmNC0QEEBXW=2*m`2=f%JeDf+@;uQH)5HaiDb*;k`4 zdy;C;rPGX)O+QOs=&ni6Eu8l`>OztOAHB)OatS#Y&T2Ej filter.toTimestamp) continue; - if (typeof filter.fromSequence === "number" && e.sequence < filter.fromSequence) continue; - if (typeof filter.toSequence === "number" && e.sequence > filter.toSequence) continue; - if (typeof filter.targetNodeId === "number" && e.targetNodeId !== filter.targetNodeId) continue; - if (filter.targetSelector && e.targetSelector && !e.targetSelector.includes(filter.targetSelector)) continue; - if (filter.searchQuery) { - const query = filter.searchQuery.toLowerCase(); - const strPayload = JSON.stringify(e.payload || {}).toLowerCase(); - if (!strPayload.includes(query) && !e.type.toLowerCase().includes(query)) { - continue; + try { + for await (const line of rl) { + const trimmed = line.trim(); + if (!trimmed) continue; + let e; + try { + e = JSON.parse(trimmed); + } catch (parseErr) { + console.warn(`[FileStorage] Skipping malformed event line in session ${sessionId}:`, parseErr); + continue; + } + if (filter) { + if (filter.category && e.category !== filter.category) continue; + if (filter.type && e.type !== filter.type) continue; + if (typeof filter.fromTimestamp === "number" && e.timestamp < filter.fromTimestamp) continue; + if (typeof filter.toTimestamp === "number" && e.timestamp > filter.toTimestamp) continue; + if (typeof filter.fromSequence === "number" && e.sequence < filter.fromSequence) continue; + if (typeof filter.toSequence === "number" && e.sequence > filter.toSequence) continue; + if (typeof filter.targetNodeId === "number" && e.targetNodeId !== filter.targetNodeId) continue; + if (filter.targetSelector && e.targetSelector && !e.targetSelector.includes(filter.targetSelector)) continue; + if (filter.searchQuery) { + const query = filter.searchQuery.toLowerCase(); + const strPayload = JSON.stringify(e.payload || {}).toLowerCase(); + if (!strPayload.includes(query) && !e.type.toLowerCase().includes(query)) { + continue; + } } } + matchedCount++; + if (matchedCount <= offset) { + continue; + } + results.push(e); + if (results.length >= limit) { + break; + } } - matchedCount++; - if (matchedCount <= offset) { - continue; - } - results.push(e); - if (results.length >= limit) { - rl.close(); - fileStream.destroy(); - break; - } + } finally { + rl.close(); + fileStream.destroy(); } return results; } @@ -240,8 +243,13 @@ class FileStorageProvider { crlfDelay: Infinity }); let count = 0; - for await (const line of rl) { - if (line.trim()) count++; + try { + for await (const line of rl) { + if (line.trim()) count++; + } + } finally { + rl.close(); + fileStream.destroy(); } return count; } @@ -25914,6 +25922,7 @@ export { FORENSICS_TOOLS as F, MCPDOM_V3_TOOLS as M, MCPBridgeServer, + PNGBuilder as P, TELEDOM_INTELLIGENCE_TOOLS as T, TELEDOM_VERSION as a, FileStorageProvider as b, diff --git a/chrome-extension/dist/server/mcp-server.js b/chrome-extension/dist/server/mcp-server.js index e8f91c4c..4f33d5fa 100644 --- a/chrome-extension/dist/server/mcp-server.js +++ b/chrome-extension/dist/server/mcp-server.js @@ -1,6 +1,7 @@ import * as readline from "readline"; import * as fs from "fs"; import { M as MCPDOM_V3_TOOLS, D as DEVTOOLS_TOOLS, F as FORENSICS_TOOLS, T as TELEDOM_INTELLIGENCE_TOOLS, a as TELEDOM_VERSION, b as FileStorageProvider, c as MCPToolsHandler, MCPBridgeServer, d as TELEDOM_PROFILE_TOOLS } from "./bridge-server.js"; +import { P } from "./bridge-server.js"; import "http"; import "ws"; import "path"; @@ -1084,5 +1085,6 @@ export { FileStorageProvider, ForensicMCPServer, MCPToolsHandler, + P as PNGBuilder, TELEDOM_PROFILE_TOOLS }; diff --git a/dist/server/bridge-server.js b/dist/server/bridge-server.js index cd5d22e7..420602e0 100644 --- a/dist/server/bridge-server.js +++ b/dist/server/bridge-server.js @@ -4,7 +4,6 @@ import * as fs from "fs"; import fs__default from "fs"; import * as path from "path"; import path__default from "path"; -import * as readline from "readline"; import * as zlib from "zlib"; import { gunzipSync, gzipSync } from "zlib"; import { createHash, randomUUID } from "crypto"; @@ -165,7 +164,7 @@ class FileStorageProvider { async deleteSession(sessionId) { const dir = path.join(this.baseDir, sessionId); if (fs.existsSync(dir)) { - await fs.promises.rm(dir, { recursive: true, force: true }); + await fs.promises.rm(dir, { recursive: true, force: true, maxRetries: 10, retryDelay: 50 }); return true; } return false; @@ -181,16 +180,13 @@ class FileStorageProvider { const dir = path.join(this.baseDir, sessionId); const eventsPath = path.join(dir, "events.jsonl"); if (!fs.existsSync(eventsPath)) return []; - const fileStream = fs.createReadStream(eventsPath, { encoding: "utf-8" }); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const content = await fs.promises.readFile(eventsPath, "utf-8"); + const lines = content.split(/\r?\n/); const results = []; let matchedCount = 0; const offset = typeof filter?.offset === "number" ? filter.offset : 0; const limit = typeof filter?.limit === "number" ? filter.limit : Infinity; - for await (const line of rl) { + for (const line of lines) { const trimmed = line.trim(); if (!trimmed) continue; let e; @@ -223,8 +219,6 @@ class FileStorageProvider { } results.push(e); if (results.length >= limit) { - rl.close(); - fileStream.destroy(); break; } } @@ -234,13 +228,9 @@ class FileStorageProvider { const dir = path.join(this.baseDir, sessionId); const eventsPath = path.join(dir, "events.jsonl"); if (!fs.existsSync(eventsPath)) return 0; - const fileStream = fs.createReadStream(eventsPath, { encoding: "utf-8" }); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity - }); + const content = await fs.promises.readFile(eventsPath, "utf-8"); let count = 0; - for await (const line of rl) { + for (const line of content.split(/\r?\n/)) { if (line.trim()) count++; } return count; @@ -25914,6 +25904,7 @@ export { FORENSICS_TOOLS as F, MCPDOM_V3_TOOLS as M, MCPBridgeServer, + PNGBuilder as P, TELEDOM_INTELLIGENCE_TOOLS as T, TELEDOM_VERSION as a, FileStorageProvider as b, diff --git a/dist/server/mcp-server.js b/dist/server/mcp-server.js index e8f91c4c..4f33d5fa 100644 --- a/dist/server/mcp-server.js +++ b/dist/server/mcp-server.js @@ -1,6 +1,7 @@ import * as readline from "readline"; import * as fs from "fs"; import { M as MCPDOM_V3_TOOLS, D as DEVTOOLS_TOOLS, F as FORENSICS_TOOLS, T as TELEDOM_INTELLIGENCE_TOOLS, a as TELEDOM_VERSION, b as FileStorageProvider, c as MCPToolsHandler, MCPBridgeServer, d as TELEDOM_PROFILE_TOOLS } from "./bridge-server.js"; +import { P } from "./bridge-server.js"; import "http"; import "ws"; import "path"; @@ -1084,5 +1085,6 @@ export { FileStorageProvider, ForensicMCPServer, MCPToolsHandler, + P as PNGBuilder, TELEDOM_PROFILE_TOOLS }; diff --git a/package.json b/package.json index 0b174041..d8aae37e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,10 @@ "bench": "vitest run tests/intelligence/suite-reports.test.ts", "golden": "vitest run tests/intelligence/suite-reports.test.ts", "chaos": "vitest run tests/intelligence/suite-reports.test.ts", - "test:sdk": "python sdk/python/test_sdk.py" + "test:sdk": "python sdk/python/test_sdk.py", + "lint:python": "python -m ruff check sdk/python && python -m mypy sdk/python", + "format:python": "python -m isort sdk/python && python -m black sdk/python", + "qa:all": "npm run build && npm run test:unit && npm run test:sdk && npm run lint:python" }, "keywords": [ "browser", diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 00000000..bf842cbb --- /dev/null +++ b/ruff.toml @@ -0,0 +1,15 @@ +line-length = 100 +target-version = "py39" + +[lint] +select = ["E", "F", "W", "I", "RUF022"] +ignore = [ + "EXE001", # shebang executable check + "UP045", # requires Python 3.10+ PEP 604; project supports Python 3.9+ + "BLE001", # blind exception catch during process teardown + "S110", # try-except-pass in process termination + "PYI034", # __enter__ return self + "UP037", # quotes in type annotations + "E402", # module level import not at top of file + "E501", # line length handled by formatter +] diff --git a/scripts/run-operational-suite.js b/scripts/run-operational-suite.js index fcc1961c..a198da2b 100644 --- a/scripts/run-operational-suite.js +++ b/scripts/run-operational-suite.js @@ -4,8 +4,7 @@ import { fileURLToPath } from 'url'; import { spawn } from 'child_process'; import readline from 'readline'; import { JSDOM } from 'jsdom'; -import { FORENSIC_MCP_TOOLS, FileStorageProvider } from '../dist/server/mcp-server.js'; -import { PNGBuilder } from '../src/core/png-builder.ts'; +import { FORENSIC_MCP_TOOLS, FileStorageProvider, PNGBuilder } from '../dist/server/mcp-server.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/sdk/python/examples/extension_smoke_test.py b/sdk/python/examples/extension_smoke_test.py index b24222c6..4640b086 100644 --- a/sdk/python/examples/extension_smoke_test.py +++ b/sdk/python/examples/extension_smoke_test.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """Extension smoke test — the golden v4.1 use case, as a reusable robot. The scenario the TeleDOM owner asked for: "I develop an extension; I want @@ -24,12 +23,13 @@ HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.join(HERE, "..")) -from teledom import Browser, Workflow, TargetMemory # noqa: E402 +from teledom import Browser, TargetMemory, Workflow FIXTURE = os.path.abspath( os.path.join(HERE, "..", "..", "..", "operational-tests", "_fixtures", "dom-fixture.html") ) + def main() -> int: store = tempfile.mkdtemp(prefix="teledom-sdk-demo-") env = { @@ -54,8 +54,10 @@ def main() -> int: # ── LEARN — persist knowledge (agent-owned; TeleDOM just stores) ── mem = TargetMemory(client=browser.client) mem.save( - "example.test", "primary_action_button", - css="#primary-action-btn", aria="Run Analysis", + "example.test", + "primary_action_button", + css="#primary-action-btn", + aria="Run Analysis", identity={"role": "button", "accessibleName": "Run Analysis"}, confidence=0.95, notes="verify with browser.verify(); repair with find()+describe() when the UI changes", @@ -73,13 +75,28 @@ def main() -> int: wf.input("cta_selector", "Primary CTA selector", default="#primary-action-btn") wf.input("counter_selector", "Counter selector", default="#click-counter") wf.step("inspect", "td_dom_inspect", description="observe the page") - wf.step("verify_cta", "td_target_check", args={"selector": "{{inputs.cta_selector}}"}, - description="cheap target check — no DOM re-analysis") + wf.step( + "verify_cta", + "td_target_check", + args={"selector": "{{inputs.cta_selector}}"}, + description="cheap target check — no DOM re-analysis", + ) wf.step("click_cta", "td_action_click", args={"selector": "{{inputs.cta_selector}}"}) - wf.step("extract_counter", "td_dom_extract", - args={"selector": "{{inputs.counter_selector}}", "fields": {"text": "el.textContent.trim()"}}) - wf.step("assert_state", "td_execute_script", - args={"code": 'return document.querySelector("{{inputs.counter_selector}}").textContent.trim();'}) + wf.step( + "extract_counter", + "td_dom_extract", + args={ + "selector": "{{inputs.counter_selector}}", + "fields": {"text": "el.textContent.trim()"}, + }, + ) + wf.step( + "assert_state", + "td_execute_script", + args={ + "code": 'return document.querySelector("{{inputs.counter_selector}}").textContent.trim();' + }, + ) wf.save(version="1.0.0") print("[LEARN] workflow saved (5 steps, 2 templated inputs, policy caps)") @@ -92,9 +109,13 @@ def main() -> int: metrics = body.get("metrics", {}) print(f" runId : {run.get('runId')}") print(f" status : {body.get('status')}") - print(f" steps : {[(s.get('stepId'), s.get('status')) for s in body.get('steps', [])]}") - print(f" metrics : toolCalls={metrics.get('toolCalls')} domScans={metrics.get('domScans')} " - f"duration={metrics.get('durationMs')}ms") + print( + f" steps : {[(s.get('stepId'), s.get('status')) for s in body.get('steps', [])]}" + ) + print( + f" metrics : toolCalls={metrics.get('toolCalls')} domScans={metrics.get('domScans')} " + f"duration={metrics.get('durationMs')}ms" + ) # ── REPLAY — deterministic re-execution of the recorded run ───── replay = wf.replay(run["runId"]) @@ -108,16 +129,20 @@ def main() -> int: check = browser.verify(css) if not check.get("resolvable", False): failures.append(f"recovery check not resolvable: {check}") - print(f"[RECOVERY] : learned locator '{css}' resolvable={check.get('resolvable')} " - f"confidence={check.get('confidence')}") + print( + f"[RECOVERY] : learned locator '{css}' resolvable={check.get('resolvable')} " + f"confidence={check.get('confidence')}" + ) # ── KPI summary (the v4.1 golden demo) ────────────────────────────── print("\n=== KPIs ===") print("first run : 5 tool calls · 2 DOM scans · 5 MCP round trips") - print(f"reuse run : {metrics.get('toolCalls')} tool calls · {metrics.get('domScans')} DOM scans · 1 MCP round trip") - print(f"MCP round-trip reduction: 80% DOM-scan reduction: 50%") + print( + f"reuse run : {metrics.get('toolCalls')} tool calls · {metrics.get('domScans')} DOM scans · 1 MCP round trip" + ) + print("MCP round-trip reduction: 80% DOM-scan reduction: 50%") print(f"tokensSavedEstimate : {metrics.get('tokensSavedEstimate')}") - print(f"unsafe action bypass : 0 (approval gates BLOCK, never auto-approve)") + print("unsafe action bypass : 0 (approval gates BLOCK, never auto-approve)") if failures: print("\nFAILURES:", failures) diff --git a/sdk/python/pyproject.toml b/sdk/python/pyproject.toml index 3f985556..598a8906 100644 --- a/sdk/python/pyproject.toml +++ b/sdk/python/pyproject.toml @@ -25,3 +25,35 @@ Homepage = "https://github.com/IrMaho/TeleDOM" [tool.setuptools.packages.find] include = ["teledom*"] + +[tool.black] +line-length = 100 +target-version = ["py39", "py310", "py311", "py312"] + +[tool.isort] +profile = "black" +line_length = 100 + +[tool.ruff] +line-length = 100 +target-version = "py39" + +[tool.ruff.lint] +select = ["E", "F", "W", "I", "RUF022"] +ignore = [ + "EXE001", + "UP045", + "BLE001", + "S110", + "PYI034", + "UP037", + "E402", + "E501", +] + +[tool.mypy] +python_version = "3.9" +warn_return_any = true +warn_unused_configs = true +disallow_untyped_defs = false +ignore_missing_imports = true diff --git a/sdk/python/teledom/__init__.py b/sdk/python/teledom/__init__.py index 0461d174..68b7284e 100644 --- a/sdk/python/teledom/__init__.py +++ b/sdk/python/teledom/__init__.py @@ -24,19 +24,19 @@ internal tools, sites with no public API at all. """ -from .client import TeleDOMClient, TeleDOMError from .browser import Browser -from .workflow import Workflow, workflows +from .client import TeleDOMClient, TeleDOMError from .targets import TargetMemory +from .workflow import Workflow, workflows __version__ = "4.1.0" __all__ = [ + "Browser", + "TargetMemory", "TeleDOMClient", "TeleDOMError", - "Browser", "Workflow", - "workflows", - "TargetMemory", "__version__", + "workflows", ] diff --git a/sdk/python/teledom/browser.py b/sdk/python/teledom/browser.py index 28738243..a1be53d9 100644 --- a/sdk/python/teledom/browser.py +++ b/sdk/python/teledom/browser.py @@ -1,13 +1,13 @@ """Semantic Browser programming — the TeleDOM Level-2 primitive surface. - browser = Browser() # spawns + connects TeleDOM - browser.navigate("https://any.site") # any website — API never required - page = browser.inspect() # observe (the agent's eyes) - hits = browser.query("Comments") # find elements without selectors - target = browser.find(selector="#reply-box") - browser.click(target) - browser.type(target, "hello") - browser.verify(selector="#sent") +browser = Browser() # spawns + connects TeleDOM +browser.navigate("https://any.site") # any website — API never required +page = browser.inspect() # observe (the agent's eyes) +hits = browser.query("Comments") # find elements without selectors +target = browser.find(selector="#reply-box") +browser.click(target) +browser.type(target, "hello") +browser.verify(selector="#sent") """ from __future__ import annotations @@ -94,7 +94,12 @@ def snapshot(self, fmt: str = "html") -> Any: # ── targeting ────────────────────────────────────────────────────── - def find(self, selector: Optional[str] = None, xpath: Optional[str] = None, text: Optional[str] = None) -> Any: + def find( + self, + selector: Optional[str] = None, + xpath: Optional[str] = None, + text: Optional[str] = None, + ) -> Any: """Find an element by selector / xpath / text → canonical TARGET with confidence.""" args: dict = {} if selector: @@ -109,7 +114,9 @@ def find(self, selector: Optional[str] = None, xpath: Optional[str] = None, text def verify(self, selector: str, min_confidence: float = 0.0) -> Any: """Cheap target verification — replaces full DOM re-analysis.""" - return self._client.call("td_target_check", {"selector": selector, "minConfidence": min_confidence}) + return self._client.call( + "td_target_check", {"selector": selector, "minConfidence": min_confidence} + ) def describe(self, selector: str) -> Any: return self._client.call("td_target_describe", {"selector": selector}) @@ -155,7 +162,9 @@ def execute_script(self, code: str, timeout_ms: Optional[int] = None) -> Any: return self._client.call("td_execute_script", args) def network(self, url_contains: Optional[str] = None, limit: int = 50) -> Any: - return self._client.call("td_network_inspect", {"urlContains": url_contains, "limit": limit}) + return self._client.call( + "td_network_inspect", {"urlContains": url_contains, "limit": limit} + ) def console(self, level: str = "all") -> Any: return self._client.call("td_console_read", {"level": level}) diff --git a/sdk/python/teledom/client.py b/sdk/python/teledom/client.py index 77916c64..7c1675c9 100644 --- a/sdk/python/teledom/client.py +++ b/sdk/python/teledom/client.py @@ -8,9 +8,9 @@ import json import os +import queue import subprocess import threading -import queue from typing import Any, Optional @@ -32,7 +32,9 @@ def __init__( env: Optional[dict] = None, node_binary: str = "node", ): - self.server_path = server_path or os.environ.get("TELEDOM_SERVER_PATH") or self._default_server_path() + self.server_path = ( + server_path or os.environ.get("TELEDOM_SERVER_PATH") or self._default_server_path() + ) self.cwd = cwd self._proc: Optional[subprocess.Popen] = None self._env = env @@ -95,7 +97,13 @@ def _read_stdout(self) -> None: continue if "id" in msg: self._responses.put(msg) - self._responses.put({"jsonrpc": "2.0", "id": -1, "error": {"message": "server closed the stream"}}) + self._responses.put( + { + "jsonrpc": "2.0", + "id": -1, + "error": {"message": "server closed the stream"}, + } + ) def _next_id(self) -> int: with self._lock: @@ -106,7 +114,12 @@ def _next_id(self) -> int: def request(self, method: str, params: Optional[dict] = None, timeout: float = 60.0) -> dict: rid = self._next_id() - payload = {"jsonrpc": "2.0", "id": rid, "method": method, "params": params or {}} + payload = { + "jsonrpc": "2.0", + "id": rid, + "method": method, + "params": params or {}, + } assert self._proc and self._proc.stdin self._proc.stdin.write((json.dumps(payload) + "\n").encode("utf-8")) self._proc.stdin.flush() diff --git a/sdk/python/teledom/targets.py b/sdk/python/teledom/targets.py index 64daa0b2..7ed9497a 100644 --- a/sdk/python/teledom/targets.py +++ b/sdk/python/teledom/targets.py @@ -73,7 +73,9 @@ def list(self, site: Optional[str] = None, semantic_id: Optional[str] = None) -> return self._client.call("td_target_memory_list", args) def delete(self, site: str, semantic_id: str) -> Any: - return self._client.call("td_target_memory_delete", {"site": site, "semanticId": semantic_id}) + return self._client.call( + "td_target_memory_delete", {"site": site, "semanticId": semantic_id} + ) def close(self) -> None: if self._owns_client: diff --git a/sdk/python/teledom/workflow.py b/sdk/python/teledom/workflow.py index 8fc6894c..a97e1afb 100644 --- a/sdk/python/teledom/workflow.py +++ b/sdk/python/teledom/workflow.py @@ -48,8 +48,18 @@ def __init__( # ── authoring ────────────────────────────────────────────────────── - def input(self, name: str, description: str = "", required: bool = False, default: Any = None) -> "Workflow": - self.inputs[name] = {"description": description, "required": required, "default": default} + def input( + self, + name: str, + description: str = "", + required: bool = False, + default: Any = None, + ) -> "Workflow": + self.inputs[name] = { + "description": description, + "required": required, + "default": default, + } return self def step( @@ -63,7 +73,12 @@ def step( timeout_ms: Optional[int] = None, description: str = "", ) -> "Workflow": - s: dict = {"id": step_id, "tool": tool, "onError": on_error, "description": description} + s: dict = { + "id": step_id, + "tool": tool, + "onError": on_error, + "description": description, + } if args: s["args"] = args if retry_count: @@ -114,7 +129,12 @@ def export(self) -> Any: # ── dumb execution + records ─────────────────────────────────────── - def run(self, inputs: Optional[dict] = None, approved_steps: Optional[list] = None, dry_run: bool = False) -> Any: + def run( + self, + inputs: Optional[dict] = None, + approved_steps: Optional[list] = None, + dry_run: bool = False, + ) -> Any: args: dict = {"name": self.name, "inputs": inputs or {}} if approved_steps: args["approvedSteps"] = approved_steps diff --git a/sdk/python/test_sdk.py b/sdk/python/test_sdk.py index 3667378c..6118bcdf 100644 --- a/sdk/python/test_sdk.py +++ b/sdk/python/test_sdk.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """Self-test for the TeleDOM Python SDK (no pytest required). Runs the full Level-2 surface against the deterministic DOM fixture: @@ -13,9 +12,11 @@ HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, HERE) -from teledom import Browser, TeleDOMError, Workflow, TargetMemory # noqa: E402 +from teledom import Browser, TargetMemory, Workflow -FIXTURE = os.path.abspath(os.path.join(HERE, "..", "..", "operational-tests", "_fixtures", "dom-fixture.html")) +FIXTURE = os.path.abspath( + os.path.join(HERE, "..", "..", "operational-tests", "_fixtures", "dom-fixture.html") +) passed, failed = 0, 0 @@ -40,8 +41,14 @@ def main() -> int: with Browser(env=env) as browser: print("client:") - check("server handshake reports teledom", browser.server_info.get("name") == "teledom") - check("server version is 4.1.x", browser.server_info.get("version", "").startswith("4.1")) + check( + "server handshake reports teledom", + browser.server_info.get("name") == "teledom", + ) + check( + "server version is 4.1.x", + browser.server_info.get("version", "").startswith("4.1"), + ) tools = browser.client.list_tools() check("350 tools exposed over MCP", len(tools) == 350, f"got {len(tools)}") @@ -60,9 +67,17 @@ def main() -> int: print("target memory:") mem = TargetMemory(client=browser.client) - mem.save("example.test", "primary_action_button", css="#primary-action-btn", confidence=0.95) + mem.save( + "example.test", + "primary_action_button", + css="#primary-action-btn", + confidence=0.95, + ) target = mem.get("example.test", "primary_action_button").get("target", {}) - check("learned target persisted", (target.get("locators") or {}).get("css") == "#primary-action-btn") + check( + "learned target persisted", + (target.get("locators") or {}).get("css") == "#primary-action-btn", + ) listing = mem.list(site="example.test") check("target memory list works", listing.get("count", 0) >= 1) @@ -70,15 +85,26 @@ def main() -> int: wf = Workflow("sdk_self_test", client=browser.client, description="SDK self-test workflow") wf.input("selector", "CTA selector", default="#primary-action-btn") wf.step("verify", "td_target_check", args={"selector": "{{inputs.selector}}"}) - wf.step("assert", "td_execute_script", args={"code": 'return document.querySelector("{{inputs.selector}}") !== null;'}) + wf.step( + "assert", + "td_execute_script", + args={"code": 'return document.querySelector("{{inputs.selector}}") !== null;'}, + ) saved = wf.save(version="1.0.0") check("workflow saved verbatim", saved.get("status") == "PASS") run = wf.run() body = run.get("run", {}) - check("dumb execution SUCCESS", body.get("status") == "SUCCESS", str(body.get("error", ""))) + check( + "dumb execution SUCCESS", + body.get("status") == "SUCCESS", + str(body.get("error", "")), + ) check("deterministic record has metrics", "metrics" in body) - check("steps recorded with status", all("status" in s for s in body.get("steps", []))) + check( + "steps recorded with status", + all("status" in s for s in body.get("steps", [])), + ) replay = wf.replay(run["runId"]) check("verbatim replay works", replay.get("status") == "PASS") diff --git a/src/mcp/server.ts b/src/mcp/server.ts index 826b2673..892e30bd 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -12,8 +12,9 @@ import { MCPBridgeServer } from './bridge-server'; import { BrowserCommandType } from '../types/browser-control'; import { TELEDOM_VERSION } from '../intelligence/version'; import { TELEDOM_PROFILE_TOOLS } from './tool-groups'; +import { PNGBuilder } from '../core/png-builder'; -export { FORENSIC_MCP_TOOLS, FileStorageProvider, MCPToolsHandler, TELEDOM_PROFILE_TOOLS }; +export { FORENSIC_MCP_TOOLS, FileStorageProvider, MCPToolsHandler, TELEDOM_PROFILE_TOOLS, PNGBuilder }; export class ForensicMCPServer { private storage: ForensicStorageProvider; diff --git a/src/storage/file-storage.ts b/src/storage/file-storage.ts index 5ecb8da7..e19033ed 100644 --- a/src/storage/file-storage.ts +++ b/src/storage/file-storage.ts @@ -1,6 +1,5 @@ import * as fs from 'fs'; import * as path from 'path'; -import * as readline from 'readline'; import { Annotation, SessionMetadata } from '../types/session'; import { BaseEvent } from '../types/events'; import { SnapshotCheckpoint } from '../types/checkpoint'; @@ -75,7 +74,7 @@ export class FileStorageProvider implements ForensicStorageProvider { public async deleteSession(sessionId: string): Promise { const dir = path.join(this.baseDir, sessionId); if (fs.existsSync(dir)) { - await fs.promises.rm(dir, { recursive: true, force: true }); + await fs.promises.rm(dir, { recursive: true, force: true, maxRetries: 10, retryDelay: 50 }); return true; } return false; @@ -94,18 +93,15 @@ export class FileStorageProvider implements ForensicStorageProvider { const eventsPath = path.join(dir, 'events.jsonl'); if (!fs.existsSync(eventsPath)) return []; - const fileStream = fs.createReadStream(eventsPath, { encoding: 'utf-8' }); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity, - }); + const content = await fs.promises.readFile(eventsPath, 'utf-8'); + const lines = content.split(/\r?\n/); const results: BaseEvent[] = []; let matchedCount = 0; const offset = typeof filter?.offset === 'number' ? filter.offset : 0; const limit = typeof filter?.limit === 'number' ? filter.limit : Infinity; - for await (const line of rl) { + for (const line of lines) { const trimmed = line.trim(); if (!trimmed) continue; @@ -143,8 +139,6 @@ export class FileStorageProvider implements ForensicStorageProvider { results.push(e); if (results.length >= limit) { - rl.close(); - fileStream.destroy(); break; } } @@ -157,14 +151,9 @@ export class FileStorageProvider implements ForensicStorageProvider { const eventsPath = path.join(dir, 'events.jsonl'); if (!fs.existsSync(eventsPath)) return 0; - const fileStream = fs.createReadStream(eventsPath, { encoding: 'utf-8' }); - const rl = readline.createInterface({ - input: fileStream, - crlfDelay: Infinity, - }); - + const content = await fs.promises.readFile(eventsPath, 'utf-8'); let count = 0; - for await (const line of rl) { + for (const line of content.split(/\r?\n/)) { if (line.trim()) count++; } return count; diff --git a/tests/integration/storage.test.ts b/tests/integration/storage.test.ts index 7cd8e0a1..ffe4c205 100644 --- a/tests/integration/storage.test.ts +++ b/tests/integration/storage.test.ts @@ -174,8 +174,12 @@ describe('Storage Providers (Memory & File)', () => { expect(userPaged.every((e) => e.category === 'USER')).toBe(true); } finally { if (fs.existsSync(testDir)) { - fs.rmSync(testDir, { recursive: true, force: true }); + try { + fs.rmSync(testDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 }); + } catch { + // Allow transient lock in Windows test runners to drain + } } } - }); + }, 30_000); }); diff --git a/tests/intelligence/workflow.test.ts b/tests/intelligence/workflow.test.ts index 7d4fe5c4..4585128a 100644 --- a/tests/intelligence/workflow.test.ts +++ b/tests/intelligence/workflow.test.ts @@ -31,7 +31,13 @@ beforeEach(() => { afterEach(() => { delete process.env.TELEDOM_AGENT_STORE_DIR; - fs.rmSync(tmpDir, { recursive: true, force: true }); + if (tmpDir && fs.existsSync(tmpDir)) { + try { + fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 50 }); + } catch { + // Allow transient lock in Windows test runners to drain + } + } }); function makeWorkflow(overrides: Partial = {}): AgentWorkflow { diff --git a/vitest.config.ts b/vitest.config.ts index e10ac743..94a6e247 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,5 +5,7 @@ export default defineConfig({ environment: 'jsdom', include: ['tests/**/*.test.ts'], exclude: ['dist/**', 'node_modules/**'], + testTimeout: 30000, + hookTimeout: 30000, }, });

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