@softinterface/voe-cli 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/bin/voe.js +348 -0
  2. package/package.json +57 -0
@@ -0,0 +1,348 @@
1
+ #!/usr/bin/env node
2
+ var wr=Object.defineProperty;var ae=(e,t)=>()=>(e&&(t=e(e=0)),t);var br=(e,t)=>{for(var n in t)wr(e,n,{get:t[n],enumerable:!0})};var K,tt=ae(()=>{"use strict";(function(e){e[e.Document=0]="Document",e[e.DocumentType=1]="DocumentType",e[e.Element=2]="Element",e[e.Text=3]="Text",e[e.CDATA=4]="CDATA",e[e.Comment=5]="Comment"})(K||(K={}))});function at(e){if(!e)return!1;let t=e.trim().toLowerCase();return!t||t==="module"?!1:Er.has(t)||t.endsWith("+json")}function st(e){if(!e)return!1;let t=e.trim().toLowerCase();return Ar.some(n=>t.includes(n))}function Tr(e){if(e==null)return!0;let t=e.trim().toLowerCase();return t===""||t==="text/javascript"||t==="application/javascript"}function ct(e,t){if(!e)return!1;try{let n=new URL(e,t),r=new URL(t,t);return n.origin===r.origin}catch{return!1}}function ot(e,t){if(!e||e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("#"))return e;try{return new URL(e,t).href}catch{return e}}function kr(e,t){return e.split(",").map(n=>{let r=n.trim().split(/\s+/);return r[0]&&(r[0]=ot(r[0],t)),r.join(" ")}).join(", ")}function Cr(e){return e.replace(/[\w-]+:\s*;/g,"")}function Rr(e){try{if(e.tagName.toLowerCase()==="style"){let t=e.sheet;if(t){let n=Array.from(t.cssRules);return Cr(n.map(r=>r.cssText).join(`
3
+ `))}}}catch{return null}return null}function Ft(e=document,t={}){let{baseUrl:n=e.baseURI||e.location?.href||"",inlineStylesheet:r=!0,captureCanvas:o=!0,captureScroll:a=!0,captureFormState:s=!0,captureShadowDom:u=!0,interactive:w=!1,blockClass:S,blockSelector:b}=t,O=1;function p(m){if(S&&(S instanceof RegExp?S:new RegExp(`\\b${S}\\b`)).test(m.className))return!0;if(b)try{if(m.matches(b))return!0}catch{}return!1}function d(m){if(m.tagName.toLowerCase()!=="dialog"||typeof HTMLDialogElement>"u"||!(m instanceof HTMLDialogElement)||!m.open)return null;try{if(!m.matches(":modal"))return null}catch{return null}let R=m.getBoundingClientRect(),h=e.defaultView?.getComputedStyle(m,"::backdrop");return{[Nt]:"true",[zt]:R.top.toFixed(2),[Mt]:R.left.toFixed(2),[Ut]:R.width.toFixed(2),[Ht]:R.height.toFixed(2),[Bt]:"2147483646",[nt]:h?.backgroundColor||"rgba(0, 0, 0, 0)",[rt]:h?.backdropFilter||""}}function y(m){let R=O++;switch(m.nodeType){case Node.DOCUMENT_NODE:{let h=m,C=[];for(let f of Array.from(h.childNodes)){let $=y(f);$&&C.push($)}return{type:K.Document,childNodes:C,compatMode:h.compatMode,id:R}}case Node.DOCUMENT_TYPE_NODE:{let h=m;return{type:K.DocumentType,name:h.name,publicId:h.publicId,systemId:h.systemId,id:R}}case Node.ELEMENT_NODE:{let h=m;if(p(h)){let v=h.getBoundingClientRect();return{type:K.Element,tagName:"div",attributes:{"data-voe-blocked":"true",style:`width:${v.width}px;height:${v.height}px;background:#f0f0f0;`},childNodes:[],id:R}}let C=h.tagName.toLowerCase(),f={};for(let v of Array.from(h.attributes)){let g=v.value;v.name==="srcset"?g=kr(g,n):Sr.has(v.name)&&(g=ot(g,n)),f[v.name]=g}let $=d(h);if($&&Object.assign(f,$),C==="script"){let v=typeof f.type=="string"?f.type:h.getAttribute("type"),g=typeof f.src=="string"?f.src:h.getAttribute("src");if(at(v)){let M=Array.from(h.childNodes).map(D=>y(D)).filter(D=>D!==null);return{type:K.Element,tagName:"script",attributes:f,childNodes:M,id:R}}return w&&g&&Tr(v)&&ct(g,n)&&!st(g)?(f.src=ot(String(g),n),f["data-voe-interactive"]="true",{type:K.Element,tagName:"script",attributes:f,childNodes:[],id:R}):{type:K.Element,tagName:"noscript",attributes:{"data-voe-original":"script"},childNodes:[{type:K.Comment,textContent:"script removed by snap",id:O++}],id:R}}if(r&&C==="style"){let v=Rr(h);v!==null&&(f._cssText=v)}if(s)if(C==="input"){let v=h,g=(v.type||"text").toLowerCase();g==="checkbox"||g==="radio"?f.checked=v.checked:f.value=v.value}else C==="textarea"?f["data-voe-value"]=h.value:C==="select"?f["data-voe-selected-index"]=String(h.selectedIndex):C==="option"&&(f.selected=h.selected);if(o&&C==="canvas")try{let v=h.toDataURL(),g=h.getBoundingClientRect();return{type:K.Element,tagName:"img",attributes:{src:v,width:String(g.width),height:String(g.height),"data-voe-original":"canvas"},childNodes:[],id:R}}catch{}a&&(h.scrollTop>0&&(f["data-voe-scroll-top"]=String(h.scrollTop)),h.scrollLeft>0&&(f["data-voe-scroll-left"]=String(h.scrollLeft)));let N=h instanceof SVGElement,I=[];if(u&&h.shadowRoot){for(let v of Array.from(h.shadowRoot.childNodes)){let g=y(v);g&&I.push(g)}return{type:K.Element,tagName:C,attributes:f,childNodes:I,isSVG:N,isShadowHost:!0,id:R}}for(let v of Array.from(h.childNodes)){let g=y(v);g&&I.push(g)}return{type:K.Element,tagName:C,attributes:f,childNodes:I,isSVG:N,id:R}}case Node.TEXT_NODE:return{type:K.Text,textContent:m.textContent??"",id:R};case Node.CDATA_SECTION_NODE:return{type:K.CDATA,textContent:"",id:R};case Node.COMMENT_NODE:return{type:K.Comment,textContent:m.textContent??"",id:R};default:return null}}let E=y(e);return E||{type:K.Document,childNodes:[],id:0}}function $r(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function it(e){let t=[];for(let[n,r]of Object.entries(e))n==="_cssText"||r===void 0||r===null||(r===!0?t.push(n):r===!1||t.push(`${n}="${$r(String(r))}"`));return t.length>0?" "+t.join(" "):""}function Ce(e,t){let n=e[t];if(typeof n!="string"&&typeof n!="number")return null;let r=Number(n);return Number.isFinite(r)?r:null}function Pr(e){let t={};for(let[n,r]of Object.entries(e))n.startsWith("data-voe-modal-")||(t[n]=r);return t}function Lt(e,t){let n=t.map(a=>a.trim()).filter(a=>a.length>0),r=e?.trim();return r?`${r.endsWith(";")?r:`${r};`} ${n.join("; ")};`:`${n.join("; ")};`}function Or(e){if(e.tagName!=="dialog"||e.attributes[Nt]!=="true")return null;let t=Ce(e.attributes,zt)??0,n=Ce(e.attributes,Mt)??0,r=Ce(e.attributes,Ut),o=Ce(e.attributes,Ht),a=Ce(e.attributes,Bt)??2147483646,s=typeof e.attributes[nt]=="string"?e.attributes[nt]:"rgba(0, 0, 0, 0)",u=typeof e.attributes[rt]=="string"?e.attributes[rt]:"",w=Pr(e.attributes),S=typeof w.style=="string"?w.style:null;w.style=Lt(S,["position: fixed","inset: auto",`top: ${t}px`,`left: ${n}px`,r===null?"":`width: ${r}px`,o===null?"":`height: ${o}px`,"margin: 0","display: block",`z-index: ${a}`]);let b={"data-voe-dialog-backdrop":"true","aria-hidden":"true",style:Lt(null,["position: fixed","inset: 0",`background: ${s}`,u?`backdrop-filter: ${u}`:"",`z-index: ${Math.max(a-1,0)}`])},O=it(w),p=it(b),d=e.childNodes.map(Re).join("");return`<div${p}></div><dialog${O}>${d}</dialog>`}function Re(e){switch(e.type){case K.Document:return e.childNodes.map(Re).join("");case K.DocumentType:{let t=["<!DOCTYPE",e.name];return e.publicId&&t.push(`PUBLIC "${e.publicId}"`),e.systemId&&t.push(`"${e.systemId}"`),t.join(" ")+">"}case K.Element:{let t=e.tagName,n=Or(e);if(n)return n;let r=it(e.attributes);if(xr.has(t))return`<${t}${r}>`;if(t==="style"&&e.attributes._cssText)return`<style${r}>${e.attributes._cssText}</style>`;let o=e.childNodes.map(Re).join(""),a=t==="script"?o.replace(/<\/script/gi,"<\\/script"):o;return`<${t}${r}>${a}</${t}>`}case K.Text:return e.textContent;case K.CDATA:return"<![CDATA[]]>";case K.Comment:return`<!--${e.textContent}-->`;default:return""}}function jt(e={}){return`(${Ir.toString()})(${JSON.stringify({interactive:e.interactive??!1})})`}function Gt(){return`(${_r.toString()})()`}function Vt(){return`(${Dr.toString()})()`}async function _r(){let e=Date.now(),t={totalImages:0,alreadyLoaded:0,lazyNativeFixed:0,dataSrcCopied:0,loadErrors:0,durationMs:0},n=["data-src","data-lazy-src","data-original"],r=["data-srcset","data-lazy-srcset"];function o(p,d){for(let y of d){let E=p.getAttribute(y);if(E&&E.trim())return E.trim()}return null}function a(p){let d=p.trim().toLowerCase();return d===""||d==="#"||d==="about:blank"||d==="data:,"||d.startsWith("data:image/gif;base64,r0lgodlhaqab")||d.startsWith("data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaab")}function s(p){return p.complete&&p.naturalWidth>0}function u(p){return!!(p.currentSrc||p.getAttribute("src")||p.getAttribute("srcset"))}function w(p){let d=p.getAttribute("src");return!d||a(d)||a(p.currentSrc)}function S(p){let d=o(p,n);d&&w(p)&&(p.setAttribute("src",d),t.dataSrcCopied+=1);let y=o(p,r),E=p.getAttribute("srcset");y&&(!E||!E.trim())&&(p.setAttribute("srcset",y),t.dataSrcCopied+=1)}function b(p){let d=p.getAttribute("srcset");if(d&&d.trim())return;let y=o(p,r);y&&(p.setAttribute("srcset",y),t.dataSrcCopied+=1)}function O(p,d){return s(p)?Promise.resolve("loaded"):u(p)?p.complete&&p.naturalWidth===0?Promise.resolve("error"):new Promise(y=>{let E=!1,m=()=>f("loaded"),R=()=>f("error"),h=window.setTimeout(()=>{f(s(p)?"loaded":p.complete?"error":"timeout")},d);function C(){window.clearTimeout(h),p.removeEventListener("load",m),p.removeEventListener("error",R)}function f($){E||(E=!0,C(),y($))}p.addEventListener("load",m,{once:!0}),p.addEventListener("error",R,{once:!0})}):Promise.resolve("skipped")}try{let p=Array.from(document.images);t.totalImages=p.length,t.alreadyLoaded=p.filter(s).length;for(let E of p)(E.loading==="lazy"||E.getAttribute("loading")==="lazy")&&(E.loading="eager",E.setAttribute("loading","eager"),t.lazyNativeFixed+=1),S(E);for(let E of Array.from(document.querySelectorAll("source")))b(E);await new Promise(E=>setTimeout(E,100));let d=await Promise.all(Array.from(document.images).filter(E=>!s(E)&&u(E)).map(E=>O(E,5e3)));t.loadErrors=d.filter(E=>E==="error"||E==="timeout").length;let y=Array.from(document.images);t.totalImages=y.length}finally{t.durationMs=Date.now()-e}return t}function Dr(){let e=Date.now(),t="data-voe-frozen-states",n={hover:"data-voe-hover",focus:"data-voe-focus",focusWithin:"data-voe-focus-within",focusVisible:"data-voe-focus-visible"},r=Object.values(n);function o(){document.querySelectorAll(`style[${t}]`).forEach(h=>h.remove()),document.querySelectorAll(`[${n.hover}], [${n.focus}], [${n.focusWithin}], [${n.focusVisible}]`).forEach(h=>{h.removeAttribute(n.hover),h.removeAttribute(n.focus),h.removeAttribute(n.focusWithin),h.removeAttribute(n.focusVisible)})}function a(h){let C=[],f="",$=0,N=0,I=null;for(let v=0;v<h.length;v+=1){let g=h[v];if(I){f+=g,g===I&&h[v-1]!=="\\"&&(I=null);continue}if(g==='"'||g==="'"){I=g,f+=g;continue}if(g==="(")$+=1;else if(g===")")$=Math.max($-1,0);else if(g==="[")N+=1;else if(g==="]")N=Math.max(N-1,0);else if(g===","&&$===0&&N===0){f.trim()&&C.push(f.trim()),f="";continue}f+=g}return f.trim()&&C.push(f.trim()),C}function s(h){let C=[[":focus-visible",`[${n.focusVisible}]`],[":focus-within",`[${n.focusWithin}]`],[":focus",`[${n.focus}]`],[":hover",`[${n.hover}]`]],f=h,$=!1;for(let[N,I]of C)f.includes(N)&&(f=f.split(N).join(I),$=!0);return $?f:null}function u(h){return h.replace(/::[a-zA-Z0-9-]+(?:\([^)]*\))?/g,"").replace(/:(before|after|first-letter|first-line|marker|placeholder|selection|backdrop|file-selector-button)\b/gi,"").trim()}function w(h){if(!h)return 0;try{return document.querySelectorAll(h).length}catch{return 0}}function S(h,C){let f=[];document.querySelectorAll(`[${n.hover}], [${n.focus}], [${n.focusWithin}], [${n.focusVisible}]`).forEach($=>{let N=h.filter(I=>$.hasAttribute(I));N.length!==0&&(N.forEach(I=>$.removeAttribute(I)),f.push({element:$,names:N}))});try{return C()}finally{for(let $ of f)$.names.forEach(N=>$.element.setAttribute(N,""))}}function b(h){let C=[],f=0;for(let $ of Array.from(h)){if($.type===CSSRule.STYLE_RULE){let N=$,I=[];for(let v of a(N.selectorText)){if(!/:(hover|focus-visible|focus-within|focus)\b/.test(v))continue;let g=s(v);if(!g)continue;let T=u(g);if(!T)continue;let M=r.filter(J=>g.includes(J));if(M.length===0)continue;let D=w(T),H=S(M,()=>w(T));D>H&&I.push(g)}I.length>0&&(C.push(`${I.join(", ")} { ${N.style.cssText} }`),f+=1);continue}if($.type===CSSRule.MEDIA_RULE||$.type===CSSRule.SUPPORTS_RULE){let N=$,I=b(N.cssRules);if(I.ruleCount>0){let v=$.type===CSSRule.MEDIA_RULE?"@media":"@supports";C.push(`${v} ${N.conditionText} {
4
+ ${I.cssTexts.join(`
5
+ `)}
6
+ }`),f+=I.ruleCount}continue}if($.type===CSSRule.IMPORT_RULE)try{let N=$.styleSheet;if(!N)continue;let I=b(N.cssRules);C.push(...I.cssTexts),f+=I.ruleCount}catch{}}return{cssTexts:C,ruleCount:f}}o();let O=new Set;try{for(let h of Array.from(document.querySelectorAll(":hover")))h instanceof Element&&O.add(h)}catch{}let p=document.activeElement instanceof Element&&document.activeElement!==document.body&&document.activeElement!==document.documentElement?document.activeElement:null,d=new Set;if(O.forEach(h=>h.setAttribute(n.hover,"")),p){p.setAttribute(n.focus,""),d.add(p);let h=p;for(;h;)h.setAttribute(n.focusWithin,""),d.add(h),h=h.parentElement;try{p.matches(":focus-visible")&&p.setAttribute(n.focusVisible,"")}catch{}}let y={hoveredElements:O.size,focusedElements:d.size,frozenRules:0,durationMs:0};if(y.hoveredElements===0&&y.focusedElements===0)return y.durationMs=Date.now()-e,y;let E=[],m=0;for(let h of Array.from(document.styleSheets))try{let C=b(h.cssRules);E.push(...C.cssTexts),m+=C.ruleCount}catch{}if(m===0)return o(),y.durationMs=Date.now()-e,y;let R=document.createElement("style");return R.setAttribute(t,"true"),R.textContent=E.join(`
7
+ `),(document.head||document.documentElement).appendChild(R),y.frozenRules=m,y.durationMs=Date.now()-e,y}function Ir(e={}){let t=new Set(["href","src","action","data","poster","formaction","cite","background"]),n="data-voe-modal-dialog",r="data-voe-modal-top",o="data-voe-modal-left",a="data-voe-modal-width",s="data-voe-modal-height",u="data-voe-modal-z-index",w="data-voe-modal-backdrop-color",S="data-voe-modal-backdrop-filter",b=new Set(["application/json","application/ld+json","text/template","text/x-template","application/template"]),O=["google-analytics.com","google-analytics","googletagmanager.com","sentry.io","segment.com","fullstory.com"],p=e.interactive===!0;function d(v){return v.replace(/[\w-]+:\s*;/g,"")}function y(v,g){if(!v||v.startsWith("data:")||v.startsWith("blob:")||v.startsWith("#"))return v;try{return new URL(v,g).href}catch{return v}}function E(v,g){return v.split(",").map(T=>{let M=T.trim().split(/\s+/);return M[0]&&(M[0]=y(M[0],g)),M.join(" ")}).join(", ")}function m(v){if(!v)return!1;let g=v.trim().toLowerCase();return!g||g==="module"?!1:b.has(g)||g.endsWith("+json")}function R(v){if(!v)return!1;let g=v.trim().toLowerCase();return O.some(T=>g.includes(T))}function h(v){if(v==null)return!0;let g=v.trim().toLowerCase();return g===""||g==="text/javascript"||g==="application/javascript"}function C(v,g){if(!v)return!1;try{return new URL(v,g).origin===new URL(g,g).origin}catch{return!1}}function f(v){if(v.tagName.toLowerCase()!=="dialog"||typeof HTMLDialogElement>"u"||!(v instanceof HTMLDialogElement)||!v.open)return null;try{if(!v.matches(":modal"))return null}catch{return null}let g=v.getBoundingClientRect(),T=window.getComputedStyle(v,"::backdrop");return{[n]:"true",[r]:g.top.toFixed(2),[o]:g.left.toFixed(2),[a]:g.width.toFixed(2),[s]:g.height.toFixed(2),[u]:"2147483646",[w]:T.backgroundColor||"rgba(0, 0, 0, 0)",[S]:T.backdropFilter||""}}let $=1,N=document.baseURI||document.location.href;function I(v){let g=$++;if(v.nodeType===Node.DOCUMENT_NODE){let T=[];for(let M of Array.from(v.childNodes)){let D=I(M);D&&T.push(D)}return{type:0,childNodes:T,compatMode:v.compatMode,id:g}}if(v.nodeType===Node.DOCUMENT_TYPE_NODE){let T=v;return{type:1,name:T.name,publicId:T.publicId,systemId:T.systemId,id:g}}if(v.nodeType===Node.ELEMENT_NODE){let T=v,M=T.tagName.toLowerCase(),D={};for(let U of Array.from(T.attributes)){let c=U.value;U.name==="srcset"?c=E(c,N):t.has(U.name)&&(c=y(c,N)),D[U.name]=c}let H=f(T);if(H&&Object.assign(D,H),M==="script"){let U=typeof D.type=="string"?D.type:T.getAttribute("type"),c=typeof D.src=="string"?D.src:T.getAttribute("src");if(m(U)){let L=[];for(let B of Array.from(T.childNodes)){let j=I(B);j&&L.push(j)}return{type:2,tagName:"script",attributes:D,childNodes:L,id:g}}return p&&c&&h(U)&&C(c,N)&&!R(c)?(D.src=y(String(c),N),D["data-voe-interactive"]="true",{type:2,tagName:"script",attributes:D,childNodes:[],id:g}):{type:2,tagName:"noscript",attributes:{"data-voe-original":"script"},childNodes:[{type:5,textContent:"script removed by snap",id:$++}],id:g}}if(M==="input"){let U=T,c=(U.type||"text").toLowerCase();c==="checkbox"||c==="radio"?D.checked=U.checked:D.value=U.value}else M==="textarea"?D["data-voe-value"]=T.value:M==="select"?D["data-voe-selected-index"]=String(T.selectedIndex):M==="option"&&(D.selected=T.selected);if(M==="canvas")try{let U=T.toDataURL(),c=T.getBoundingClientRect();return{type:2,tagName:"img",attributes:{src:U,width:String(c.width),height:String(c.height),"data-voe-original":"canvas"},childNodes:[],id:g}}catch{}if(T.scrollTop>0&&(D["data-voe-scroll-top"]=String(T.scrollTop)),T.scrollLeft>0&&(D["data-voe-scroll-left"]=String(T.scrollLeft)),M==="style")try{let U=T.sheet;U&&(D._cssText=d(Array.from(U.cssRules).map(c=>c.cssText).join(`
8
+ `)))}catch{}let J=[];if(T.shadowRoot){for(let U of Array.from(T.shadowRoot.childNodes)){let c=I(U);c&&J.push(c)}return{type:2,tagName:M,attributes:D,childNodes:J,isSVG:T instanceof SVGElement,isShadowHost:!0,id:g}}for(let U of Array.from(T.childNodes)){let c=I(U);c&&J.push(c)}return{type:2,tagName:M,attributes:D,childNodes:J,isSVG:T instanceof SVGElement,id:g}}return v.nodeType===Node.TEXT_NODE?{type:3,textContent:v.textContent??"",id:g}:v.nodeType===Node.COMMENT_NODE?{type:5,textContent:v.textContent??"",id:g}:v.nodeType===Node.CDATA_SECTION_NODE?{type:4,textContent:"",id:g}:null}return I(document)??{type:0,childNodes:[],id:0}}function Wt(){return`(${Lr.toString()})()`}function Lr(){let e=Date.now(),t=[],n=0,r=0;function o(d){let y=document.querySelectorAll(d),E=y.length;return y.forEach(m=>m.remove()),E>0&&(t.push({selector:d,action:"remove",count:E}),n+=E),E}function a(d){let y=d.parentNode;if(y){for(;d.firstChild;)y.insertBefore(d.firstChild,d);y.removeChild(d),r+=1}}function s(d){let y=0;return document.querySelectorAll("style").forEach(E=>{E.textContent&&E.textContent.includes(d)&&(E.remove(),y+=1,n+=1)}),y>0&&t.push({selector:`style containing "${d}"`,action:"remove",count:y}),y}function u(){let d=document.querySelectorAll("style[data-voe-frozen-states]");d.length>0&&(d.forEach(E=>E.remove()),n+=d.length,t.push({selector:"style[data-voe-frozen-states]",action:"remove",count:d.length}));let y=document.querySelectorAll("[data-voe-hover], [data-voe-focus], [data-voe-focus-within], [data-voe-focus-visible]");y.length>0&&(y.forEach(E=>{E.removeAttribute("data-voe-hover"),E.removeAttribute("data-voe-focus"),E.removeAttribute("data-voe-focus-within"),E.removeAttribute("data-voe-focus-visible")}),t.push({selector:"[data-voe-*]",action:"cleanup",count:y.length}))}let w=-1,S=document.querySelector('input[name="voe-step"]:checked');if(S){let d=S.id.match(/voe-step-radio-(\d+)/);d&&d[1]&&(w=parseInt(d[1],10))}o("#voe-demo-nav"),o("#voe-demo-actions"),o('input[name="voe-step"]');let b=document.querySelectorAll(".voe-step-content");if(b.length>0){let d=0,y=0;b.forEach(E=>{let R=E.id.match(/voe-step-(\d+)/);(R&&R[1]?parseInt(R[1],10):-1)===w?(a(E),d+=1):(E.remove(),y+=1)}),y>0&&(t.push({selector:".voe-step-content (inactive)",action:"remove",count:y}),n+=y),d>0&&t.push({selector:".voe-step-content (active)",action:"unwrap",count:d})}let O=document.querySelectorAll(".voe-step-panel");if(O.length>0){let y=(w>0?document.getElementById(`voe-step-panel-${w}`):O[0])?.querySelector("iframe.voe-demo-frame"),E=y?.getAttribute("srcdoc")||y?.srcdoc||"";if(E)try{let m=new DOMParser().parseFromString(E,"text/html");document.head.innerHTML=m.head.innerHTML,document.body.innerHTML=m.body.innerHTML,t.push({selector:".voe-demo-frame (active)",action:"replace-document",count:1}),n+=O.length}catch{}}s(".voe-step-content"),s("#voe-demo-actions"),s(".voe-step-panel"),o("#voe-banner");let p=document.getElementById("voe-content");return p&&(a(p),t.push({selector:"#voe-content",action:"unwrap",count:1})),o("script#voe-metadata"),document.querySelectorAll('meta[http-equiv="Content-Security-Policy"]').forEach(d=>{let y=d.getAttribute("content")||"";y.includes("script-src 'none'")&&y.includes("form-action 'none'")&&(d.remove(),n+=1,t.push({selector:'meta[http-equiv="Content-Security-Policy"] (Voe)',action:"remove",count:1}))}),s("#voe-content"),o("#__voe_overlay__"),o("#__voe_overlay_style__"),o("#__voe_spacer__"),o("[data-agentation-root]"),o("[data-feedback-toolbar]"),o("[data-annotation-marker]"),o("[data-annotation-popup]"),u(),{removed:n,unwrapped:r,details:t,durationMs:Date.now()-e}}var Sr,xr,Er,Ar,Nt,zt,Mt,Ut,Ht,Bt,nt,rt,qt=ae(()=>{"use strict";tt();Sr=new Set(["href","src","action","data","poster","formaction","cite","background"]),xr=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Er=new Set(["application/json","application/ld+json","text/template","text/x-template","application/template"]),Ar=["google-analytics.com","google-analytics","googletagmanager.com","sentry.io","segment.com","fullstory.com"],Nt="data-voe-modal-dialog",zt="data-voe-modal-top",Mt="data-voe-modal-left",Ut="data-voe-modal-width",Ht="data-voe-modal-height",Bt="data-voe-modal-z-index",nt="data-voe-modal-backdrop-color",rt="data-voe-modal-backdrop-filter"});function zr(e,t){if(t&&!t.includes("octet-stream"))return t.split(";")[0].trim();let n=e.match(/\.([a-z0-9]+)(?:\?|#|$)/i);if(n){let r=Nr["."+n[1].toLowerCase()];if(r)return r}return"application/octet-stream"}function Mr(e){let t=e.toLowerCase();return t.includes("text/html")||t.includes("application/xhtml+xml")}function ge(e,t){if(!e||e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("#"))return null;try{return new URL(e,t).href}catch{return null}}function le(e,t){let n=new RegExp(`(?:^|\\s)${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`,"i"),r=e.match(n);return r?.[1]??r?.[2]??r?.[3]??null}function Kt(e,t,n){let r=new RegExp(`(^|\\s)(${t}\\s*=\\s*)(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i");return e.replace(r,`$1$2"${n}"`)}function je(e,t,n){let r=new RegExp(`(^|\\s)(${t}\\s*=\\s*)(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i");return r.test(e)?e.replace(r,`$1$2"${n}"`):e.replace(/\s*\/?>$/,o=>` ${t}="${n}"${o}`)}function Ur(e,t){let n=new RegExp(`\\s${t}\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i");return e.replace(n,"")}function lt(e,t){for(let n of t){let r=le(e,n);if(r&&r.trim())return r.trim()}return null}function ut(e){if(!e)return!0;let t=e.trim().toLowerCase();return t===""||t==="#"||t==="about:blank"||t==="data:,"||t.startsWith("data:image/gif;base64,r0lgodlhaqab")||t.startsWith("data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaab")}async function he(e,t,n){let r=n.get(e);if(r!==void 0)return r;let o=(async()=>{let a=t.fetchFn??globalThis.fetch,s=t.fetchTimeout??1e4;try{let u=new AbortController,w=setTimeout(()=>u.abort(),s),S=await a(e);if(clearTimeout(w),!S.ok)return t.onWarning?.(`Failed to fetch asset: ${e} (HTTP ${S.status})`),null;let b=S.headers.get("content-type")??"application/octet-stream";if(Mr(b))return t.onWarning?.(`Skipped asset with HTML content type (possible route fallback): ${e} (${b})`),null;let O=await S.arrayBuffer(),p=t.maxAssetSize??5242880;return O.byteLength>p?(t.onWarning?.(`Skipped large asset: ${e} (${O.byteLength} bytes exceeds ${p} bytes)`),null):{data:O,contentType:b}}catch(u){let w=u instanceof Error?u.message:String(u);return t.onWarning?.(`Failed to fetch asset: ${e} (${w})`),null}})();return n.set(e,o),o}function Hr(e){let t=new Uint8Array(e),n="";for(let r=0;r<t.length;r++)n+=String.fromCharCode(t[r]);return btoa(n)}function $e(e,t,n){return`data:${zr(t,n)};base64,${Hr(e)}`}async function Ge(e,t,n,r,o=0){if(o>5)return e;let a=/@import\s+(?:url\(\s*['"]?([^'")\s]+)['"]?\s*\)|['"]([^'"]+)['"]);?/g,s=e,u=[],w;for(;(w=a.exec(e))!==null;){let p=w[1]||w[2];p&&u.push({match:w[0],url:p})}for(let p of u){let d=ge(p.url,t);if(!d)continue;let y=await he(d,n,r);if(y){let E=new TextDecoder().decode(y.data),m=await Ge(E,d,n,r,o+1);s=s.replace(p.match,m)}}let S=/url\(\s*['"]?(?!data:)(?!blob:)([^'")\s]+)['"]?\s*\)/g,b=[];for(;(w=S.exec(s))!==null;)w[1]&&b.push({match:w[0],url:w[1]});let O=await Promise.all(b.map(async p=>{let d=ge(p.url,t);if(!d)return null;let y=await he(d,n,r);return y?{match:p.match,dataUri:$e(y.data,d,y.contentType)}:null}));for(let p of O)p&&(s=s.replaceAll(p.match,`url("${p.dataUri}")`));return s}async function Jt(e,t){let n=new Map,r=e,o=["data-src","data-lazy-src","data-original"],a=["data-srcset","data-lazy-srcset"],s={stylesheets:{found:0,inlined:0,failed:[]},fonts:{found:0,inlined:0,failed:[]},images:{found:0,inlined:0,failed:[]}},u=/<link\s[^>]*rel\s*=\s*["']stylesheet["'][^>]*>/gi,w=[...r.matchAll(u)],S=await Promise.all(w.map(async c=>{let P=c[0].match(/href\s*=\s*["']([^"']+)["']/);if(!P?.[1])return null;let L=ge(P[1],t.baseUrl);if(!L)return null;let B=await he(L,t,n);if(!B)return{match:c[0],resolved:L,replacement:null};let j=new TextDecoder().decode(B.data);return j=await Ge(j,L,t,n),{match:c[0],resolved:L,replacement:`<style data-voe-inlined="true">${j}</style>`}}));for(let c of S)c&&(s.stylesheets.found++,c.replacement!==null?(r=r.replace(c.match,c.replacement),s.stylesheets.inlined++):s.stylesheets.failed.push(c.resolved));let b=/<style([^>]*)>([\s\S]*?)<\/style>/gi,O=[...r.matchAll(b)],p=await Promise.all(O.map(async c=>{let P=c[2];if(!P)return null;let L=`<style${c[1]}>`,B=le(L,"data-voe-base")??t.baseUrl,j=await Ge(P,B,t,n);return j===P?null:{match:c[0],replacement:`<style${c[1]}>${j}</style>`}}));for(let c of p)c&&(r=r.replace(c.match,c.replacement));let d=/<link\s[^>]*>/gi,y=[...r.matchAll(d)],E=await Promise.all(y.map(async c=>{let P=c[0],L=le(P,"rel"),B=le(P,"as"),j=le(P,"href");if(!L||!B||!j||!L.toLowerCase().split(/\s+/).includes("preload")||B.toLowerCase()!=="font"||j.startsWith("data:"))return null;let q=ge(j,t.baseUrl);if(!q)return null;let G=await he(q,t,n);return G?{tag:P,resolved:q,dataUri:$e(G.data,q,G.contentType)}:{tag:P,resolved:q,dataUri:null}}));for(let c of E)c&&(s.fonts.found++,c.dataUri!==null?(r=r.replace(c.tag,Kt(c.tag,"href",c.dataUri)),s.fonts.inlined++):s.fonts.failed.push(c.resolved));let m=/<img\s[^>]*>/gi,R=[...r.matchAll(m)];for(let c of R){let P=c[0],L=P,B=le(L,"src"),j=le(L,"srcset"),q=lt(L,o),G=lt(L,a);q&&ut(B)&&(L=je(L,"src",q)),G&&ut(j)&&(L=je(L,"srcset",G)),L!==P&&(r=r.replace(P,L))}let h=/<source\s[^>]*>/gi,C=[...r.matchAll(h)];for(let c of C){let P=c[0],L=le(P,"srcset"),B=lt(P,a);!B||!ut(L)||(r=r.replace(P,je(P,"srcset",B)))}let f=/<img\s[^>]*src\s*=\s*["'](?!data:)([^"']+)["'][^>]*>/gi,$=[...r.matchAll(f)],N=await Promise.all($.map(async c=>{let P=c[1];if(!P)return null;let L=ge(P,t.baseUrl);if(!L)return null;let B=await he(L,t,n);return B?{match:c[0],srcUrl:P,resolved:L,dataUri:$e(B.data,L,B.contentType)}:{match:c[0],srcUrl:P,resolved:L,dataUri:null}}));for(let c of N)c&&(s.images.found++,c.dataUri!==null?(r=r.replace(c.match,c.match.replace(c.srcUrl,c.dataUri)),s.images.inlined++):s.images.failed.push(c.resolved));let I=/<(?:img|source)\s[^>]*>/gi,v=[...r.matchAll(I)],g=await Promise.all(v.map(async c=>{let P=c[0],L=le(P,"srcset");if(!L)return null;let B=L.split(",").map(q=>q.trim()),j=await Promise.all(B.map(async q=>{let G=q.split(/\s+/),X=G[0];if(!X||X.startsWith("data:"))return q;let ee=ge(X,t.baseUrl);if(!ee)return q;let ie=await he(ee,t,n);if(!ie)return q;let me=$e(ie.data,ee,ie.contentType);return G[0]=me,G.join(" ")}));return{tag:P,newSrcset:j.join(", ")}}));for(let c of g)c&&(r=r.replace(c.tag,Kt(c.tag,"srcset",c.newSrcset)));let T=/<link\s[^>]*rel\s*=\s*["'](?:icon|shortcut icon|apple-touch-icon)["'][^>]*>/gi,M=[...r.matchAll(T)],D=await Promise.all(M.map(async c=>{let P=c[0].match(/href\s*=\s*["'](?!data:)([^"']+)["']/);if(!P?.[1])return null;let L=ge(P[1],t.baseUrl);if(!L)return null;let B=await he(L,t,n);return B?{match:c[0],originalHref:P[1],dataUri:$e(B.data,L,B.contentType)}:null}));for(let c of D)c&&(r=r.replace(c.match,c.match.replace(c.originalHref,c.dataUri)));let H=/style\s*=\s*["']([^"']*url\([^)]+\)[^"']*)["']/gi,J=[...r.matchAll(H)],U=await Promise.all(J.map(async c=>{let P=c[1];if(!P)return null;let L=await Ge(P,t.baseUrl,t,n);return L===P?null:{match:c[0],styleValue:P,processed:L}}));for(let c of U)c&&(r=r.replace(c.match,c.match.replace(c.styleValue,c.processed)));if(t.interactive){let c=/<script\b(?=[^>]*\bdata-voe-interactive\s*=\s*["']true["'])[^>]*>[\s\S]*?<\/script>/gi,P=[...r.matchAll(c)],L=await Promise.all(P.map(async B=>{let j=B[0],G=j.match(/^<script\b[^>]*>/i)?.[0];if(!G)return null;let X=le(G,"src");if(!X||X.startsWith("data:"))return null;let ee=ge(X,t.baseUrl);if(!ee)return null;let ie=await he(ee,t,n);if(!ie)return null;let me=new TextDecoder().decode(ie.data).replace(/<\/script/gi,"<\\/script"),ce=je(Ur(G,"src"),"data-voe-inlined","true");return{fullTag:j,replacement:`${ce}${me}</script>`}}));for(let B of L)B&&(r=r.replace(B.fullTag,B.replacement))}return{html:r,stats:s}}function Zt(e){let t=[],n="(?:localhost|127\\.0\\.0\\.1|\\[::1\\]|0\\.0\\.0\\.0)",r=new RegExp(`<(?:link|img|source|script)\\s[^>]*(?:href|src|srcset)\\s*=\\s*["']([^"']*${n}[^"']*)["'][^>]*>`,"gi"),o;for(;(o=r.exec(e))!==null;)o[1]&&t.push(o[1]);return t}var Nr,Yt=ae(()=>{"use strict";Nr={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".webp":"image/webp",".avif":"image/avif",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".eot":"application/vnd.ms-fontobject",".css":"text/css",".js":"application/javascript",".json":"application/json",".mp4":"video/mp4",".webm":"video/webm",".mp3":"audio/mpeg",".ogg":"audio/ogg"}});import{createHash as Br}from"crypto";function Gr(e){return jr[e]??""}function Qt(e,t){return`${Br("sha256").update(e).update("\0").update(t).digest("hex")}${Gr(e)}`}function en(e){let t=new TextEncoder,n=new Map,r=e.replace(Fr,(s,u,w)=>{let S=n.get(s);if(!S){let b=new Uint8Array(Buffer.from(w,"base64"));S={filename:Qt(u,b),contentType:u,data:b,byteLength:b.byteLength},n.set(s,S)}return`${xe}/${S.filename}`}),o=[...n.values()],a=t.encode(r).byteLength+o.reduce((s,u)=>s+u.byteLength,0);return{html:r,assets:o,totalBytes:a}}async function Kr(e){let t=(await import("sharp")).default,n=e.contentType==="image/gif"?t(e.data,{pages:1}):t(e.data),r=await n.metadata(),o=n;r.width&&r.width>Xt&&(o=o.resize({width:Xt,withoutEnlargement:!0}));let a,s;return e.contentType==="image/gif"?(a=new Uint8Array(await o.flatten({background:"#ffffff"}).jpeg({quality:80}).toBuffer()),s="image/jpeg"):e.contentType==="image/png"&&r.hasAlpha?(a=new Uint8Array(await o.webp({lossless:!0}).toBuffer()),s="image/webp"):e.contentType==="image/jpeg"?(a=new Uint8Array(await o.jpeg({quality:80}).toBuffer()),s="image/jpeg"):(a=new Uint8Array(await o.webp({quality:85}).toBuffer()),s="image/webp"),a.byteLength>=e.byteLength?e:{filename:Qt(s,a),contentType:s,data:a,byteLength:a.byteLength}}async function tn(e,t=Vr){if(process.env.VOE_SKIP_OPTIMIZE==="1")return{bundle:e,optimized:!1,originalBytes:e.totalBytes,assetsOptimized:0};if(e.totalBytes<=t)return{bundle:e,optimized:!1,originalBytes:e.totalBytes,assetsOptimized:0};let n=e.totalBytes,o=e.assets.map((S,b)=>({asset:S,i:b})).filter(({asset:S})=>qr.has(S.contentType)&&S.byteLength>Wr).sort((S,b)=>b.asset.byteLength-S.asset.byteLength),a=[...e.assets],s=e.html,u=e.totalBytes,w=0;for(let{asset:S,i:b}of o){if(u<=t)break;try{let O=await Kr(S);if(O!==S){let p=S.byteLength-O.byteLength;u-=p,w++,s=s.replaceAll(`${xe}/${S.filename}`,`${xe}/${O.filename}`),a[b]=O}}catch{continue}}return{bundle:{html:s,assets:a,totalBytes:u},optimized:w>0,originalBytes:n,assetsOptimized:w}}function nn(e){let t=[...e.assets].sort((r,o)=>o.byteLength-r.byteLength).slice(0,5),n=[`Bundle size: ${(e.totalBytes/1024/1024).toFixed(1)} MB`];n.push("Top assets:");for(let r of t){let o=(r.byteLength/1024/1024).toFixed(2);n.push(` ${o} MB ${r.contentType} ${r.filename.slice(0,16)}...`)}return n.join(`
9
+ `)}function rn(e,t){let n=t.endsWith("/")?t.slice(0,-1):t;return e.replaceAll(xe,n)}var xe,Fr,jr,Vr,Xt,Wr,qr,on=ae(()=>{"use strict";xe="__VOE_ASSET_BASE__",Fr=/data:([a-zA-Z0-9!#$&.+\-^_]+\/[a-zA-Z0-9!#$&.+\-^_]+(?:;[a-zA-Z0-9!#$&.+\-^_]+=[^;,]+)*);base64,([A-Za-z0-9+/=]+)/g,jr={"audio/mpeg":".mp3","audio/ogg":".ogg","font/otf":".otf","font/ttf":".ttf","font/woff":".woff","font/woff2":".woff2","image/avif":".avif","image/gif":".gif","image/jpeg":".jpg","image/png":".png","image/svg+xml":".svg","image/webp":".webp","text/css":".css","video/mp4":".mp4","video/webm":".webm"};Vr=20*1024*1024,Xt=2560,Wr=100*1024,qr=new Set(["image/png","image/jpeg","image/webp","image/gif"])});function Yr(e,t){let n=1,r=-1;for(let o=0;o<t&&o<e.length;o++)e[o]===`
10
+ `&&(n++,r=o);return{line:n,column:t-r}}function Xr(e,t=40){return e.length<=t?e:e.slice(0,t)+"..."}function Qr(e,t){let n=[],r=new RegExp(t.pattern.source,t.pattern.flags),o;for(;(o=r.exec(e))!==null;){let a=o[0];Jr.some(s=>s.test(a))||n.push({pattern:t,value:a,matchIndex:o.index,matchLength:a.length})}return n}function eo(e){let t=[],n=new RegExp(an.source,an.flags),r;for(;(r=n.exec(e))!==null;){let s=r[0],u=r.index,w=new RegExp(sn.source,sn.flags),S;for(;(S=w.exec(s))!==null;){let b=S[2];if(!b)continue;let O=S[0],p=S[1];if(!p)continue;let d=O.indexOf(p);if(d===-1)continue;let y=u+S.index+d+1,E=new RegExp(Ee.pattern.source,Ee.pattern.flags),m;for(;(m=E.exec(b))!==null;){let R=m[0];t.push({pattern:Ee,value:R,matchIndex:y+m.index,matchLength:R.length})}}}let o=new RegExp(cn.source,cn.flags),a;for(;(a=o.exec(e))!==null;){let s=a[0],u=a[1];if(!u)continue;let w=s.indexOf(">");if(w===-1)continue;let S=a.index+w+1,b=new RegExp(Ee.pattern.source,Ee.pattern.flags),O;for(;(O=b.exec(u))!==null;){let p=O[0];t.push({pattern:Ee,value:p,matchIndex:S+O.index,matchLength:p.length})}}return t}function un(e){let t=[];for(let n of dt)t.push(...Qr(e,n));return t.push(...eo(e)),t}function dn(e,t){let n=[],r=new Set;for(let o of t){let a=`${o.pattern.type}:${o.value}`;if(r.has(a))continue;r.add(a);let{line:s,column:u}=Yr(e,o.matchIndex);n.push({type:o.pattern.type,value:Xr(o.value),location:`line ${s}, column ${u}`,line:s,column:u,severity:o.pattern.severity})}return{clean:n.length===0,matches:n}}function fn(e){if(e.length<=1)return e;let t=[...e].sort((r,o)=>r.start-o.start),n=[t[0]];for(let r=1;r<t.length;r++){let o=t[r],a=n[n.length-1];if(o.start<=a.end){a.end=Math.max(a.end,o.end);continue}n.push({start:o.start,end:o.end})}return n}function to(e){let t=[],n=new RegExp(ln.source,ln.flags),r;for(;(r=n.exec(e))!==null;){let o=r[1];if(!o)continue;let a=r.index+r[0].length-o.length;t.push({start:a,end:a+o.length})}return fn(t)}function no(e,t){return t.some(n=>e.start<n.end&&n.start<e.end)}function Ve(e){let t=un(e);return dn(e,t)}function We(e){let t=un(e),n=dn(e,t),r=to(e),o=t.filter(u=>u.pattern.severity==="error").map(u=>({start:u.matchIndex,end:u.matchIndex+u.matchLength})).filter(u=>!no(u,r));if(o.length===0)return{redacted:e,scanResult:n};let a=fn(o),s=e;for(let u=a.length-1;u>=0;u--){let w=a[u];s=s.slice(0,w.start)+Zr+s.slice(w.end)}return{redacted:s,scanResult:n}}var dt,Ee,an,sn,cn,ln,Jr,Zr,ft=ae(()=>{"use strict";dt=[{name:"AWS Access Key",type:"aws-access-key",pattern:/AKIA[0-9A-Z]{16}/g,severity:"error"},{name:"GitHub Personal Access Token",type:"github-pat",pattern:/ghp_[0-9a-zA-Z]{36,}/g,severity:"error"},{name:"GitHub OAuth Token",type:"github-oauth",pattern:/gho_[0-9a-zA-Z]{36,}/g,severity:"error"},{name:"GitHub App Token",type:"github-app",pattern:/ghs_[0-9a-zA-Z]{36,}/g,severity:"error"},{name:"Stripe Secret Key (Live)",type:"stripe-secret",pattern:/sk_live_[0-9a-zA-Z]{24,}/g,severity:"error"},{name:"Stripe Publishable Key (Live)",type:"stripe-publishable",pattern:/pk_live_[0-9a-zA-Z]{24,}/g,severity:"error"},{name:"Slack Token",type:"slack-token",pattern:/xox[bpors]-[0-9a-zA-Z-]{10,}/g,severity:"error"},{name:"Anthropic API Key",type:"anthropic-api-key",pattern:/sk-ant-[0-9a-zA-Z_-]{20,}/g,severity:"error"},{name:"OpenAI API Key",type:"openai-api-key",pattern:/sk-(?!ant-)[0-9a-zA-Z_-]{20,}/g,severity:"error"},{name:"Google API Key",type:"google-api-key",pattern:/AIza[0-9A-Za-z_-]{35}/g,severity:"error"},{name:"Twilio Auth Token",type:"twilio-auth-token",pattern:/SK[0-9a-fA-F]{32}/g,severity:"error"},{name:"Private Key",type:"private-key",pattern:/-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g,severity:"error"},{name:"Generic Authorization Header",type:"auth-header",pattern:/(?:authorization|x-api-key|api-key|apikey)[\s]*[:=][\s]*["']?[A-Za-z0-9_\-/.+]{20,}/gi,severity:"error"},{name:"JWT",type:"jwt",pattern:/eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g,severity:"warning"},{name:"Connection String",type:"connection-string",pattern:/(?:mongodb|postgres|mysql|redis):\/\/[^\s"'<>]{10,}/gi,severity:"warning"}],Ee={name:"Email Address",type:"email",pattern:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,severity:"warning"},an=/<input\b[^>]*>/gi,sn=/\bvalue\s*=\s*(["'])([\s\S]*?)\1/gi,cn=/<textarea\b[^>]*>([\s\S]*?)<\/textarea>/gi,ln=/data:[^,]*;base64,([A-Za-z0-9+/=_-]+)/gi,Jr=[/sk_test_/,/pk_test_/],Zr="[REDACTED]"});function ro(e){return e.replace(/<base\b[^>]*>/gi,"")}function oo(e){return e.replace(/<form\b[^>]*>/gi,t=>t.replace(/\saction\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,""))}function io(e){return e.replace(/\sdownload(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?/gi,"")}function ao(e){return e.replace(/\son[a-z0-9_-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+))?/gi,"")}function co(e){let t=new RegExp(`\\s(?:${so.join("|")})(?:\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]+))?`,"gi");return e.replace(t,"")}function lo(e){return e.replace(/<meta\b[^>]*http-equiv\s*=\s*(?:"refresh"|'refresh'|refresh)[^>]*>/gi,"")}function uo(e){return e.replace(/\s(href|src|action|formaction)\s*=\s*("([^"]*)"|'([^']*)'|([^\s>]+))/gi,(t,n,r,o,a,s)=>{let u=o??a??s??"";return/^\s*javascript\s*:/i.test(u)?o!==void 0?` ${n}="javascript:void(0)"`:a!==void 0?` ${n}='javascript:void(0)'`:` ${n}=javascript:void(0)`:t})}function fo(e){return e.replace(/<a(\s[^>]*)href\s*=\s*["']([^"']*)["']/gi,'<a$1data-voe-href="$2" href="javascript:void(0)"')}function po(e){let t=e;return t=t.replace(/<div\s+id="voe-banner"[^>]*>[\s\S]*?<\/div>/gi,""),t=t.replace(/<[^>]+\bdata-agentation-root\b[^>]*>[\s\S]*?<\/[^>]+>/gi,""),t=t.replace(/<[^>]+\bdata-feedback-toolbar\b[^>]*>[\s\S]*?<\/[^>]+>/gi,""),t=t.replace(/<[^>]+\bdata-annotation-marker\b[^>]*>[\s\S]*?<\/[^>]+>/gi,""),t=t.replace(/<[^>]+\bdata-annotation-popup\b[^>]*>[\s\S]*?<\/[^>]+>/gi,""),t}function qe(e,t={}){let n=e;return n=ro(n),n=lo(n),n=oo(n),n=io(n),n=t.interactive?co(n):ao(n),n=uo(n),n=fo(n),n=po(n),n}function Pe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function we(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var so,Ke=ae(()=>{"use strict";so=["onerror","onload","onabort","onunload","onbeforeunload","onpageshow","onpagehide","onresize","onhashchange","onpopstate","onmessage","onstorage","onoffline","ononline","onanimationend","onanimationstart","ontransitionend"]});function mo(e){return e.toISOString().replace("T"," ").replace(/\.\d+Z$/," UTC")}function mn(e,t){return gn(e,t,{embedded:!1})}function Ye(e,t){return gn(e,t,{embedded:!0})}function gn(e,t,n){let r=t.interactive??!1,o=qe(e,{interactive:r}),a=mo(t.capturedAt),s=t.title??"Voe Prototype",u={...t,engineVersion:Je,bundleSize:0},w=vo(u),S=go({interactive:r}),b=r?ho():"",O=`<script type="application/json" id="voe-metadata">${w}</script>`,p=/<!doctype\s+html/i.test(o),d=/<html[\s>]/i.test(o),y;return p||d?(o=o.replace(/<head([^>]*)>/i,`<head$1>${S}${b}${n.embedded?"":pn()}`),o=o.replace(/<body([^>]*)>/i,`<body$1>${n.embedded?"":Ze()}${n.embedded?"":'<div id="voe-content">'}`),o=o.replace(/<\/body>/i,`${n.embedded?"":"</div>"}${O}</body>`),y=o):y=`<!DOCTYPE html>
11
+ <html lang="en">
12
+ <head>
13
+ <meta charset="utf-8">
14
+ <meta name="viewport" content="width=device-width, initial-scale=1">
15
+ ${S}
16
+ ${b}
17
+ <meta name="voe-capture-url" content="${we(t.captureUrl)}">
18
+ <meta name="voe-captured-at" content="${we(a)}">
19
+ <meta name="voe-viewport" content="${t.viewport.width}x${t.viewport.height}">
20
+ <meta name="voe-engine-version" content="${Je}">
21
+ <title>${Pe(s)}</title>
22
+ ${n.embedded?"":pn()}
23
+ </head>
24
+ <body>
25
+ ${n.embedded?"":Ze()}
26
+ ${n.embedded?"":'<div id="voe-content">'}
27
+ ${o}
28
+ ${n.embedded?"":"</div>"}
29
+ ${O}
30
+ </body>
31
+ </html>`,u.bundleSize=new TextEncoder().encode(y).length,{html:y,metadata:u}}function go(e){return e?.interactive?`<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: blob: 'unsafe-inline'; font-src 'self' data:; script-src 'unsafe-inline'; connect-src 'none'; form-action 'none'; worker-src 'none';">`:`<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: blob: 'unsafe-inline'; font-src 'self' data:; script-src 'none'; form-action 'none';">`}function ho(){return'<script>(function(){window.open=function(){return null};var l=window.location;if(l.assign)l.assign=function(){};if(l.replace)l.replace=function(){};if(l.reload)l.reload=function(){};window.addEventListener("beforeunload",function(e){e.preventDefault();e.returnValue=""},{capture:true});history.back=function(){};history.forward=function(){};history.go=function(){};var oP=history.pushState,oR=history.replaceState;history.pushState=function(s,t,u){if(u===undefined||u===null)return oP.call(this,s,t)};history.replaceState=function(s,t,u){if(u===undefined||u===null)return oR.call(this,s,t)}})()</script>'}function Ze(){return`<div id="voe-banner" aria-label="${we("Voe snapshot")}"><span class="voe-fallback" aria-hidden="true">voe</span><template shadowrootmode="open"><style>${yo()}</style><span class="voe-logo">voe</span><button type="button" class="voe-copy-btn" data-voe-copy>copy link</button></template></div>`}function yo(){return`
32
+ :host {
33
+ all: initial !important;
34
+ display: flex !important;
35
+ align-items: center !important;
36
+ justify-content: space-between !important;
37
+ position: fixed !important;
38
+ top: 0 !important;
39
+ left: 0 !important;
40
+ right: 0 !important;
41
+ z-index: 2147483647 !important;
42
+ box-sizing: border-box !important;
43
+ height: ${ye}px !important;
44
+ margin: 0 !important;
45
+ border: none !important;
46
+ padding: 0 12px !important;
47
+ white-space: nowrap !important;
48
+ overflow: hidden !important;
49
+ background: #000 !important;
50
+ color: #fff !important;
51
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace !important;
52
+ font-size: 13px !important;
53
+ line-height: 1 !important;
54
+ text-align: left !important;
55
+ user-select: none !important;
56
+ -webkit-user-select: none !important;
57
+ -webkit-font-smoothing: antialiased !important;
58
+ pointer-events: none !important;
59
+ }
60
+ .voe-copy-btn {
61
+ all: unset;
62
+ pointer-events: auto;
63
+ cursor: pointer;
64
+ background: #fff;
65
+ color: #000;
66
+ font-family: inherit;
67
+ font-size: inherit;
68
+ padding: 6px 14px;
69
+ border-radius: 0;
70
+ white-space: nowrap;
71
+ user-select: none;
72
+ -webkit-user-select: none;
73
+ min-width: 9ch;
74
+ text-align: center;
75
+ box-sizing: content-box;
76
+ }
77
+ .voe-copy-btn:hover { background: #e0e0e0; }
78
+ .voe-copy-btn:active { background: #ccc; }
79
+ `}function pn(){return`<style>
80
+ #voe-content { padding-top: ${ye}px; overflow-x: auto; max-inline-size: 100%; }
81
+ </style>`}function vo(e){return JSON.stringify(e,null,2).replace(/</g,"\\u003c").replace(/-->/g,"--\\>")}var Je,ye,pt=ae(()=>{"use strict";Ke();Je="0.1.0",ye=40});import{randomBytes as wo}from"crypto";function hn(e,t){if(e.length===0)throw new Error("Demo path requires at least one step.");e.length>bo&&console.warn(`Warning: Demo path has ${e.length} steps. Large step counts increase bundle size and memory usage.`);let n=t.title??"Voe Prototype",r=e[0],o=t.transitions??[],a=wo(16).toString("base64url"),s=e.some(d=>mt(d.runtime)==="interactive"),u={...t,type:"demo-path",engineVersion:Je,captureUrl:r.captureUrl,viewport:{...r.viewport},bundleSize:0,stepCount:e.length,steps:e.map(d=>({index:d.index,name:d.name,note:d.note,captureUrl:d.captureUrl,viewport:d.viewport,capturedAt:d.capturedAt.toISOString(),title:d.title,runtime:mt(d.runtime)})),transitions:o},w=To(u),S=Ze(),b=So(e),O=xo(e),p=`<!DOCTYPE html>
82
+ <html lang="en">
83
+ <head>
84
+ <meta charset="utf-8">
85
+ <meta name="viewport" content="width=device-width, initial-scale=1">
86
+ ${Eo(a,s)}
87
+ <title>${Pe(n)}</title>
88
+ <style>
89
+ ${Ao()}
90
+ </style>
91
+ </head>
92
+ <body>
93
+ ${S}
94
+ <div id="voe-prototype-app">
95
+ <main id="voe-prototype-stage">
96
+ ${b}
97
+ </main>
98
+ ${O}
99
+ </div>
100
+ <script type="application/json" id="voe-metadata">${w}</script>
101
+ <script nonce="${a}">(${ko.toString()})();</script>
102
+ </body>
103
+ </html>`;return u.bundleSize=new TextEncoder().encode(p).length,{html:p,metadata:u}}function So(e){return e.map((t,n)=>{let r=mt(t.runtime),o=Ye(t.html,{captureUrl:t.captureUrl,viewport:t.viewport,capturedAt:t.capturedAt,title:t.title??t.name,interactive:r==="interactive"}),a=we(o.html);return` <section id="voe-step-panel-${t.index}" class="voe-step-panel${n===0?" is-active":""}" data-step-panel="${t.index}">
104
+ <iframe
105
+ class="voe-demo-frame"
106
+ title="${we(t.name)}"
107
+ sandbox="${r==="interactive"?"allow-same-origin allow-scripts":"allow-same-origin"}"
108
+ data-step-runtime="${r}"
109
+ srcdoc="${a}"
110
+ ></iframe>
111
+ </section>`}).join(`
112
+ `)}function mt(e){return e==="interactive"?"interactive":"static"}function xo(e){let t=e.length>1?"":" is-hidden",n=e.map((r,o)=>`<button type="button" class="voe-prototype-step${o===0?" is-active":""}" data-step-target="${r.index}"><span class="voe-prototype-step-index">${String(r.index).padStart(2,"0")}</span>${Pe(r.name)}</button>`).join(`
113
+ `);return`<button type="button" id="voe-prototype-drawer-toggle" class="${t.trim()}" aria-expanded="false" aria-controls="voe-prototype-drawer">Steps</button>
114
+ <aside id="voe-prototype-drawer" class="${t.trim()}" aria-hidden="true">
115
+ ${n}
116
+ </aside>`}function Eo(e,t){return t?`<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: blob: 'unsafe-inline'; font-src 'self' data:; connect-src 'none'; script-src 'unsafe-inline'; form-action 'none'; worker-src 'none';">`:`<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: blob: 'unsafe-inline'; font-src 'self' data:; connect-src 'none'; script-src 'nonce-${e}'; form-action 'none';">`}function Ao(){return`
117
+ html, body {
118
+ margin: 0;
119
+ min-height: 100%;
120
+ background: #fff;
121
+ overflow: hidden;
122
+ }
123
+
124
+ body {
125
+ color: #111111;
126
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
127
+ -webkit-font-smoothing: antialiased;
128
+ }
129
+
130
+ #voe-prototype-app {
131
+ min-height: calc(100vh - ${ye}px);
132
+ padding-top: ${ye}px;
133
+ }
134
+
135
+ #voe-prototype-stage {
136
+ position: relative;
137
+ padding: 0;
138
+ box-sizing: border-box;
139
+ min-height: calc(100vh - ${ye}px);
140
+ }
141
+
142
+ .voe-step-panel {
143
+ position: absolute;
144
+ inset: 0;
145
+ opacity: 0;
146
+ visibility: hidden;
147
+ z-index: 0;
148
+ }
149
+
150
+ .voe-step-panel.is-incoming {
151
+ opacity: 0;
152
+ visibility: visible;
153
+ z-index: 2;
154
+ transition: opacity 150ms ease-out;
155
+ }
156
+
157
+ .voe-step-panel.is-active {
158
+ opacity: 1;
159
+ visibility: visible;
160
+ z-index: 1;
161
+ }
162
+
163
+ .voe-step-panel.is-outgoing {
164
+ opacity: 1;
165
+ visibility: visible;
166
+ z-index: 0;
167
+ }
168
+
169
+ .voe-demo-frame {
170
+ width: 100%;
171
+ height: calc(100vh - ${ye}px);
172
+ border: none;
173
+ border-radius: 0;
174
+ background: #fff;
175
+ box-shadow: none;
176
+ overflow: auto;
177
+ }
178
+
179
+ #voe-prototype-drawer-toggle {
180
+ position: fixed;
181
+ right: 16px;
182
+ bottom: 16px;
183
+ z-index: 2147483646;
184
+ padding: 8px 14px;
185
+ border: 1px solid #fff;
186
+ border-radius: 0;
187
+ background: #000;
188
+ color: #fff;
189
+ font: inherit;
190
+ font-size: 13px;
191
+ cursor: pointer;
192
+ touch-action: manipulation;
193
+ }
194
+
195
+ #voe-prototype-drawer-toggle:hover {
196
+ background: #fff;
197
+ color: #000;
198
+ }
199
+
200
+ #voe-prototype-drawer-toggle.is-hidden,
201
+ #voe-prototype-drawer.is-hidden {
202
+ display: none !important;
203
+ }
204
+
205
+ #voe-prototype-drawer {
206
+ position: fixed;
207
+ right: 16px;
208
+ bottom: 64px;
209
+ width: min(280px, calc(100vw - 32px));
210
+ max-height: min(60vh, 520px);
211
+ padding: 0;
212
+ box-sizing: border-box;
213
+ border-radius: 0;
214
+ background: #000;
215
+ color: #fff;
216
+ border: 1px solid #fff;
217
+ overflow: auto;
218
+ opacity: 0;
219
+ pointer-events: none;
220
+ transform: translateY(10px);
221
+ transition: opacity 120ms ease, transform 120ms ease;
222
+ z-index: 2147483646;
223
+ }
224
+
225
+ body[data-voe-drawer-open="true"] #voe-prototype-drawer {
226
+ opacity: 1;
227
+ pointer-events: auto;
228
+ transform: translateY(0);
229
+ }
230
+
231
+ .voe-prototype-step {
232
+ display: block;
233
+ width: 100%;
234
+ padding: 8px 12px;
235
+ border: none;
236
+ border-bottom: 1px solid rgba(255, 255, 255, 0.15);
237
+ border-radius: 0;
238
+ background: transparent;
239
+ color: #fff;
240
+ font: inherit;
241
+ font-size: 13px;
242
+ text-align: left;
243
+ cursor: pointer;
244
+ white-space: nowrap;
245
+ overflow: hidden;
246
+ text-overflow: ellipsis;
247
+ }
248
+
249
+ .voe-prototype-step:last-child {
250
+ border-bottom: none;
251
+ }
252
+
253
+ .voe-prototype-step-index {
254
+ color: rgba(255, 255, 255, 0.4);
255
+ font-variant-numeric: tabular-nums;
256
+ margin-right: 8px;
257
+ }
258
+
259
+ .voe-prototype-step.is-active {
260
+ background: #fff;
261
+ color: #000;
262
+ }
263
+
264
+ .voe-prototype-step.is-active .voe-prototype-step-index {
265
+ color: rgba(0, 0, 0, 0.4);
266
+ }
267
+
268
+ .voe-prototype-step:hover {
269
+ background: #fff;
270
+ color: #000;
271
+ }
272
+
273
+ .voe-prototype-step:hover .voe-prototype-step-index {
274
+ color: rgba(0, 0, 0, 0.4);
275
+ }
276
+
277
+ #voe-prototype-drawer-toggle:focus-visible,
278
+ .voe-prototype-step:focus-visible {
279
+ outline: 2px solid #fff;
280
+ outline-offset: -2px;
281
+ }
282
+
283
+ @media (max-width: 720px) {
284
+ #voe-prototype-stage {
285
+ padding: 0;
286
+ }
287
+
288
+ .voe-demo-frame {
289
+ height: calc(100vh - ${ye}px);
290
+ }
291
+
292
+ #voe-prototype-drawer {
293
+ left: 12px;
294
+ right: 12px;
295
+ bottom: 64px;
296
+ width: auto;
297
+ }
298
+ }
299
+
300
+ @media (prefers-reduced-motion: reduce) {
301
+ .voe-step-panel,
302
+ .voe-step-panel.is-incoming,
303
+ #voe-prototype-drawer {
304
+ transition: none;
305
+ }
306
+ }
307
+ `}function To(e){return JSON.stringify(e).replace(/</g,"\\u003c").replace(/-->/g,"--\\>")}function ko(){let e=document.getElementById("voe-metadata");if(!e||!e.textContent)return;let t=JSON.parse(e.textContent),n=document.getElementById("voe-prototype-drawer-toggle"),r=document.getElementById("voe-prototype-drawer"),o=new Map,a=new Map,s=Array.from(document.querySelectorAll("[data-step-target]")),u=new WeakMap,w=new WeakSet,S=[],b=t.steps[0]?.index??1,O=b,p=0,d=new Map;for(let i of t.transitions){let l=d.get(i.fromStepIndex)??[];l.push(i),d.set(i.fromStepIndex,l)}let y=new Map;for(let i of t.steps)if(i.captureUrl)try{let l=new URL(i.captureUrl).pathname,A=y.get(l)??[];A.push(i.index),y.set(l,A)}catch{}let E=(i,l)=>!Array.isArray(i)||!Array.isArray(l)||i.length!==l.length?!1:i.every((A,x)=>A===l[x]),m=i=>(i??"").replace(/\s+/g," ").trim(),R=i=>i?.ownerDocument?.defaultView??null,h=i=>{let l=R(i);return!!(l&&i instanceof l.HTMLElement)},C=i=>{let l=R(i);return!!(l&&i instanceof l.HTMLInputElement)},f=i=>{let l=R(i);return!!(l&&i instanceof l.HTMLButtonElement)},$=i=>{let l=R(i);return!!(l&&i instanceof l.HTMLTextAreaElement)},N=i=>{let l=R(i);return!!(l&&i instanceof l.HTMLSelectElement)},I=i=>!!(i&&typeof i=="object"&&"nodeType"in i&&i.nodeType===1),v=i=>{if(I(i))return i;if(i&&typeof i=="object"&&"parentElement"in i){let l=i.parentElement;return I(l)?l:null}return null},g=i=>{if(!h(i))return"";if(i.id){let l=i.ownerDocument.querySelector(`label[for="${CSS.escape(i.id)}"]`),A=m(l?.textContent);if(A)return A}return m(i.closest("label")?.textContent)},T=i=>{let l=[],A=i;for(;A&&A!==A.ownerDocument.documentElement;){let x=A.parentElement;if(!x)break;l.unshift(Array.from(x.children).indexOf(A)),A=x}return l},M=i=>{if(!i)return;let l=C(i)&&["submit","button"].includes(i.type)?m(i.value):m(i.textContent).slice(0,80);return{domPath:T(i),tagName:i.tagName.toLowerCase(),role:h(i)&&m(i.getAttribute("role"))||void 0,type:C(i)?i.type.toLowerCase():void 0,id:h(i)&&m(i.id)||void 0,name:(C(i)||$(i)||N(i))&&m(i.name)||void 0,placeholder:(C(i)||$(i))&&m(i.placeholder)||void 0,ariaLabel:h(i)&&m(i.getAttribute("aria-label"))||void 0,label:g(i)||void 0,text:l||void 0}},D=i=>{if(C(i)){let l=i.type.toLowerCase();return l==="checkbox"||l==="radio"?{checked:i.checked}:{value:i.value}}if($(i))return{value:i.value};if(N(i))return{value:i.value,selectedIndex:i.selectedIndex};if(h(i)&&i.isContentEditable)return{value:i.textContent||""}},H=(i,l)=>{if(!i||!l)return 0;let A=0;return E(i.domPath,l.domPath)&&(A+=50),i.tagName&&i.tagName===l.tagName&&(A+=6),i.type&&i.type===l.type&&(A+=5),i.id&&i.id===l.id&&(A+=12),i.name&&i.name===l.name&&(A+=9),i.placeholder&&i.placeholder===l.placeholder&&(A+=7),i.ariaLabel&&i.ariaLabel===l.ariaLabel&&(A+=9),i.label&&i.label===l.label&&(A+=8),i.text&&i.text===l.text&&(A+=6),i.role&&i.role===l.role&&(A+=4),A},J=(i,l)=>{if(!Array.isArray(l))return null;let A=i.documentElement;for(let x of l){if(!A||typeof x!="number")return null;A=A.children.item(x)}return A},U=(i,l)=>{if(!l)return null;let A=J(i,l.domPath);if(A&&H(l,M(A))>=50)return A;let x=Array.from(i.querySelectorAll('button, a, input, textarea, select, [role="button"], [contenteditable="true"], [tabindex]:not([tabindex="-1"]), [aria-label]')),_=null,F=0;for(let k of x){let z=H(l,M(k));z>F&&(_=k,F=z)}return F>=12?_:null},c=i=>{document.body.dataset.voeDrawerOpen=i?"true":"false",n instanceof HTMLButtonElement&&n.setAttribute("aria-expanded",i?"true":"false"),r&&r.setAttribute("aria-hidden",i?"false":"true")},P=()=>{p&&(window.clearTimeout(p),p=0)},L=0,B=()=>{L&&(window.clearTimeout(L),L=0);let i=o.get(O),l=o.get(b),A=O===b;for(let[x,_]of o)_.classList.remove("is-active","is-incoming","is-outgoing"),x===b?A||!i?_.classList.add("is-active"):_.classList.add("is-incoming"):x===O&&!A&&_.classList.add("is-outgoing");!A&&l&&(l.offsetWidth,l.classList.remove("is-incoming"),l.classList.add("is-active"),L=window.setTimeout(()=>{i&&i.classList.remove("is-outgoing"),L=0},180));for(let x of s){let _=Number(x.dataset.stepTarget)===b;x.classList.toggle("is-active",_),x.setAttribute("aria-current",_?"step":"false")}},j=()=>{P();let i=(d.get(b)??[]).filter(x=>x.playback==="auto");if(i.length===0)return;let l=i[0],A=Math.min(Math.max(l.delayMs||180,120),1400);p=window.setTimeout(()=>{G(l.toStepIndex,{pushHistory:!0})},A)},q=(i,l)=>{if(!l)return;let x=a.get(b)?.contentDocument;if(!x)return;let _=U(x,i.descriptor);if(!_)return;let F=i.kind==="input"||i.kind==="change";if(C(_)){let k=_.type.toLowerCase();(k==="checkbox"||k==="radio")&&typeof l.checked=="boolean"?_.checked=l.checked:!F&&typeof l.value=="string"&&(_.value=l.value)}else $(_)?!F&&typeof l.value=="string"&&(_.value=l.value):N(_)?typeof l.selectedIndex=="number"?_.selectedIndex=l.selectedIndex:typeof l.value=="string"&&(_.value=l.value):!F&&h(_)&&_.isContentEditable&&typeof l.value=="string"&&(_.textContent=l.value);(i.kind==="focus"||i.kind==="input")&&h(_)&&_.focus({preventScroll:!0})};function G(i,l){o.has(i)&&(l.pushHistory&&S[S.length-1]!==i&&S.push(i),O=b,b=i,B(),l.transition&&window.setTimeout(()=>{q(l.transition,l.payload)},0),j())}function X(i){let l=S.lastIndexOf(i);return l===-1||l===S.length-1?!1:(S.length=l+1,P(),O=b,b=i,B(),j(),!0)}let ee=(i,l)=>{let A=M(l),x=(d.get(b)??[]).filter(k=>k.playback==="user"&&k.kind===i);if(x.length===0)return null;for(let k of x)if(E(k.descriptor?.domPath,A?.domPath))return k;let _=null,F=0;for(let k of x){let z=H(k.descriptor,A);z>F&&(_=k,F=z)}return F>=12?_:null},ie=(i,l)=>{let A=M(l),x=null,_=0,F=1/0,k=t.steps.length;for(let[z,W]of d){if(z===b)continue;let V=W.filter(Z=>Z.playback==="user"&&Z.kind===i);for(let Z of V){let Q=H(Z.descriptor,A);if(Q<12)continue;let Y=(Z.toStepIndex-b+k)%k||k;(Q>_||Q===_&&Y<F)&&(x=Z,_=Q,F=Y)}}return x},me=i=>{if(!i)return null;let l=null,A=i;for(;A&&(l=A.getAttribute("data-voe-href"),!l);)A=A.parentElement;if(!l)return null;let x;try{x=new URL(l).pathname}catch{x=l.split(/[?#]/)[0]||"/"}let _=y.get(x);if(!_)return null;let F=t.steps.length,k=null,z=1/0;for(let W of _){if(W===b)continue;let V=(W-b+F)%F||F;V<z&&(k=W,z=V)}return k},ce=i=>{if(!i)return null;let l=[i];if(f(i)&&(i.getAttribute("type")||"submit").toLowerCase()==="submit"||C(i)&&i.type.toLowerCase()==="submit"){let V=i.form||i.closest("form");V&&l.push(V)}for(let V of l){let Z=ee("submit",V);if(Z)return Z}let A=M(i),x=l.length>1?M(l[1]):void 0,_=null,F=0,k=1/0,z=t.steps.length;for(let[V,Z]of d){if(V===b)continue;let Q=Z.filter(Y=>Y.playback==="user"&&Y.kind==="submit");for(let Y of Q){let _t=Y.descriptor,Fe=Math.max(H(_t,A),x?H(_t,x):0);if(Fe<12)continue;let Dt=(Y.toStepIndex-b+z)%z||z;(Fe>F||Fe===F&&Dt<k)&&(_=Y,F=Fe,k=Dt)}}if(_)return _;let W=(d.get(b)??[]).filter(V=>V.playback==="user"&&V.kind==="submit");return W.length===1?W[0]:null},pe=(i,l)=>{let A=l.contentDocument;if(!A||w.has(A))return;w.add(A);let x=()=>b===i,_=k=>C(k)||$(k)||N(k)||h(k)&&k.isContentEditable,F=(k,z,W,V)=>{if(!x())return;let Z=ee(k,z);if(Z){V?.preventDefault(),X(Z.toStepIndex)||G(Z.toStepIndex,{pushHistory:!0,payload:W,transition:Z});return}if(k==="submit"||k==="change"){let Q=ie(k,z);if(Q){V?.preventDefault(),X(Q.toStepIndex)||G(Q.toStepIndex,{pushHistory:!0,payload:W});return}let Y=me(z);if(Y!==null){V?.preventDefault(),X(Y)||G(Y,{pushHistory:!0});return}}};A.addEventListener("click",k=>{let z=v(k.target),W=z?z.closest('button, a, [role="button"], input[type="submit"], input[type="button"]'):null;if(!W&&z&&(W=z.closest('[tabindex]:not([tabindex="-1"]), [aria-label]')),!W)return;let V=ce(W);if(V){k.preventDefault(),X(V.toStepIndex)||G(V.toStepIndex,{pushHistory:!0,transition:V});return}if(x()){let Z=ee("click",W);if(Z){k.preventDefault(),X(Z.toStepIndex)||G(Z.toStepIndex,{pushHistory:!0,payload:D(W),transition:Z});return}let Q=ie("click",W);if(Q){k.preventDefault(),X(Q.toStepIndex)||G(Q.toStepIndex,{pushHistory:!0});return}let Y=me(W);if(Y!==null){k.preventDefault(),X(Y)||G(Y,{pushHistory:!0});return}}},!0),A.addEventListener("submit",k=>{let z=v(k.target);z&&F("submit",z,void 0,k)},!0),A.addEventListener("focusin",k=>{let z=v(k.target);!z||!_(z)||F("focus",z,D(z),k)},!0),A.addEventListener("change",k=>{let z=v(k.target);z&&F("change",z,D(z),k)},!0),A.addEventListener("input",k=>{let z=v(k.target);if(!z||!_(z))return;let W=u.get(z);W&&window.clearTimeout(W);let V=window.setTimeout(()=>{F("input",z,D(z),k)},360);u.set(z,V)},!0)};for(let i of Array.from(document.querySelectorAll("[data-step-panel]"))){let l=Number(i.dataset.stepPanel),A=i.querySelector("iframe.voe-demo-frame");!Number.isFinite(l)||!A||(o.set(l,i),a.set(l,A),A.addEventListener("load",()=>{pe(l,A)}),A.contentDocument?.readyState==="complete"&&pe(l,A))}s.forEach(i=>{i.addEventListener("click",()=>{let l=Number(i.dataset.stepTarget);Number.isFinite(l)&&(G(l,{pushHistory:!0}),c(!1))})}),n instanceof HTMLButtonElement&&n.addEventListener("click",()=>{let i=document.body.dataset.voeDrawerOpen!=="true";c(i)}),document.addEventListener("keydown",i=>{if(i.key==="Escape"&&c(!1),(i.metaKey||i.ctrlKey)&&i.key.toLowerCase()==="z"&&S.length>1){S.pop();let l=S[S.length-1];typeof l=="number"&&(P(),O=b,b=l,B(),j())}}),S.push(b),B(),j();let Se=document.getElementById("voe-banner")?.shadowRoot?.querySelector("[data-voe-copy]");Se instanceof HTMLButtonElement&&Se.addEventListener("click",function(){navigator.clipboard.writeText(location.href).then(function(){Se.textContent="copied!",setTimeout(function(){Se.textContent="copy link"},2e3)})})}var bo,yn=ae(()=>{"use strict";Ke();pt();bo=15});function ue(e){let t=e?.trim();return t||void 0}function vn(e){if(!e)return;let t=e.map(n=>n.trim()).filter(n=>n.length>0).slice(0,10);return t.length>0?t:void 0}function Co(e,t){let n=ue(e?.summary)??ue(t),r=vn(e?.focus),o=vn(e?.acceptanceCriteria);if(!(!n&&!r&&!o))return{summary:n,focus:r,acceptanceCriteria:o}}function Ro(e){let t=ue(e?.framework),n=ue(e?.packageManager);if(!(!t&&!n))return{framework:t,packageManager:n}}function $o(e){let t=ue(e?.tool);if(t)return{tool:t}}function Oe(e){if(!e)return"unknown";try{let n=new URL(e).hostname.toLowerCase();return n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="[::1]"||n==="0.0.0.0"?"localhost":"remote"}catch{return"unknown"}}function _e(e){if(e)try{return new URL(e).pathname||"/"}catch{return}}function wn(e){let t=e.handoff,n=Co(t?.intent,t?.note),r=Ro(t?.environment),o=t?.sourceKind??Oe(e.captureUrl),a=t?.sourcePath??_e(e.captureUrl),s=!!e.handoffUrl,u=s;return{version:1,type:(e.stepCount??1)>1?"demo-path":"snapshot",slug:e.slug,shareUrl:e.shareUrl,rawUrl:e.rawUrl,handoffUrl:e.handoffUrl,capture:{title:ue(e.title),capturedAt:e.capturedAt,viewport:e.viewport,stepCount:e.stepCount??1,sourcePath:a,sourceKind:o},repo:t?{provider:ue(t.provider),name:ue(t.repo),branch:ue(t.branch),commitHash:ue(t.commitHash),workingState:t.workingState}:void 0,changes:t?{files:t.files.slice(0,20),totals:t.totals}:void 0,intent:n,environment:r,agent:$o(t?.agent),capabilities:{hasHandoff:s,hasDiff:u,canPromoteViaCli:u,canCompare:!1}}}function Po(e){return We(e).redacted}function gt(e){if(typeof e=="string")return Po(e);if(Array.isArray(e))return e.map(t=>gt(t));if(e&&typeof e=="object"){let t=Object.entries(e).map(([n,r])=>[n,gt(r)]);return Object.fromEntries(t)}return e}function bn(e){return gt(e)}var Sn=ae(()=>{"use strict";ft()});function xn(e){let t=["B","KB","MB","GB"],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return r===0?`${n} ${t[r]}`:`${n.toFixed(1)} ${t[r]}`}async function En(e,t){let n=await e.text(),r,o,a;try{let s=JSON.parse(n);r=s.message??s.error??n,o=typeof s.maxSize=="number"?s.maxSize:void 0,a=typeof s.hint=="string"?s.hint:void 0}catch{r=n}return e.status===413&&t&&o&&(r=`${r} (${xn(t)}, limit ${xn(o)})`),new De(`Upload failed (${e.status}): ${r}`,e.status,a)}async function An(e,t,n,r=fetch,o){let a;if(n){let s=new FormData;s.set("bundle",new Blob([e],{type:"text/html"}),"snapshot.html"),s.set("handoff",JSON.stringify(n)),a=await r(`${t}/api/upload`,{method:"POST",...o?{headers:{Authorization:`Bearer ${o}`}}:{},body:s})}else{let s=new TextEncoder().encode(e),u={"Content-Type":"text/html; charset=utf-8","Content-Length":String(s.byteLength)};o&&(u.Authorization=`Bearer ${o}`),a=await r(`${t}/api/upload`,{method:"POST",headers:u,body:s})}if(!a.ok){let s=new TextEncoder().encode(e).byteLength;throw await En(a,s)}return await a.json()}async function Tn(e,t,n,r=fetch,o){let a=new FormData;a.set("bundleKind","hosted"),a.set("html",new Blob([e.html],{type:"text/html"}),"snapshot.html");for(let u of e.assets)a.append("asset",new Blob([Uint8Array.from(u.data)],{type:u.contentType}),u.filename);n&&a.set("handoff",JSON.stringify(n));let s=await r(`${t}/api/upload`,{method:"POST",...o?{headers:{Authorization:`Bearer ${o}`}}:{},body:a});if(!s.ok)throw await En(s,e.totalBytes);return await s.json()}var De,kn=ae(()=>{"use strict";De=class extends Error{status;hint;constructor(t,n,r){super(t),this.name="UploadError",this.status=n,this.hint=r}}});var Xe={};br(Xe,{HOSTED_ASSET_BASE_PLACEHOLDER:()=>xe,NodeType:()=>K,PATTERNS:()=>dt,UploadError:()=>De,buildPublicManifest:()=>wn,deriveSourceKind:()=>Oe,detectLocalhostReferences:()=>Zt,extractSourcePath:()=>_e,formatBundleDiagnostics:()=>nn,getInteractiveStateFreezeScript:()=>Vt,getOverlayStripScript:()=>Wt,getPreCaptureScript:()=>Gt,getSerializerScript:()=>jt,inlineAssets:()=>Jt,isDataScriptType:()=>at,isSameOrigin:()=>ct,isTrackerScript:()=>st,optimizeHostedBundleForUpload:()=>tn,packageBundle:()=>mn,packageDemoPath:()=>hn,packageEmbeddedDocument:()=>Ye,prepareHostedBundle:()=>en,redactPublicManifest:()=>bn,redactSecrets:()=>We,resolveHostedAssetUrls:()=>rn,sanitizeHtml:()=>qe,scanForSecrets:()=>Ve,serialize:()=>Ft,serializeToHtml:()=>Re,uploadBundle:()=>An,uploadHostedBundle:()=>Tn});var Ae=ae(()=>{"use strict";tt();qt();Yt();on();ft();pt();yn();Ke();Sn();kn()});import{createRequire as ia}from"module";import{program as He}from"commander";import{access as Rt,readFile as qn,writeFile as Kn}from"fs/promises";import{resolve as Ue}from"path";import{exec as Jn}from"child_process";import{createInterface as Zn}from"readline/promises";function ke(e,t){if(!e&&!t)return;let n={tool:t?.tool??e?.tool,sessionId:t?.sessionId??e?.sessionId,custom:{...e?.custom??{},...t?.custom??{}}},r=Object.keys(n.custom??{}).length>0;if(r||delete n.custom,!(!n.tool&&!n.sessionId&&!r))return n}async function It(e){let{chromium:t}=await import("playwright"),n=await t.launch({headless:!e.headed}),r=await n.newContext({viewport:e.viewport,...e.storageState?{storageState:e.storageState}:{}}),o=await r.newPage();return{browser:n,page:o,async close(){await r.close(),await n.close()}}}Ae();Ae();import{execFile as Oo}from"child_process";import{access as _o,readFile as Do}from"fs/promises";import{join as Cn}from"path";import{promisify as Io}from"util";var Lo=Io(Oo),No=5e3,_n=20,zo=512*1024,Mo=`
308
+ [DIFF_TRUNCATED]
309
+ `,Rn={modified:0,added:1,deleted:2,renamed:3,untracked:4};async function te(e,t,n={}){try{let{stdout:r}=await Lo("git",t,{cwd:e,timeout:No,encoding:"utf8"});return n.trim===!1?r:r.trim()}catch{return null}}function ht(e){let t=e.trim();return t.startsWith('"')&&t.endsWith('"')?t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"):t}function Uo(e){if(!e.trim())return[];let t=[];for(let n of e.split(`
310
+ `)){if(!n||n.length<3)continue;let r=n.slice(0,2),o=ht(n.slice(3));if(r==="??"){t.push({path:o,status:"untracked"});continue}if(r.includes("R")){let[a,s]=o.split(" -> "),u=a?ht(a):void 0,w=s?ht(s):o;t.push({path:w,status:"renamed",oldPath:u});continue}if(r.includes("A")){t.push({path:o,status:"added"});continue}if(r.includes("D")){t.push({path:o,status:"deleted"});continue}t.push({path:o,status:"modified"})}return t}function $n(e){if(e==="-")return-1;let t=Number(e);return Number.isFinite(t)?t:0}function Ho(e){let t=e.match(/^\{(.+?) => (.+?)\}(.*)$/);if(t)return{oldPath:`${t[1]}${t[3]}`,path:`${t[2]}${t[3]}`};let n=e.match(/^(.+?) => (.+)$/);if(n)return{oldPath:n[1],path:n[2]}}function Bo(e){if(!e.trim())return[];let t=[];for(let n of e.split(`
311
+ `)){if(!n)continue;let r=n.split(" ");if(r.length<3)continue;let o=$n(r[0]),a=$n(r[1]),s=r.slice(2).join(" ").trim(),u=Ho(s);t.push({path:u?.path??s,oldPath:u?.oldPath,additions:o,deletions:a})}return t}function Fo(e){return[...e].sort((t,n)=>{let r=(Rn[t.status]??0)-(Rn[n.status]??0);return r!==0?r:t.path.localeCompare(n.path)})}function jo(e){let n=e.replace(/\\/g,"/").split("/");return(n[n.length-1]??"").startsWith(".env")?!0:n.some(o=>o==="node_modules"||o==="dist"||o==="build"||o===".next"||o===".git")}function Go(e){return e.length===0?"clean":e.some(n=>n.status!=="untracked")?"dirty":"untracked-only"}function Pn(e){let t=e.toLowerCase();return t.includes("github")?"github":t.includes("gitlab")?"gitlab":t.includes("bitbucket")?"bitbucket":"other"}function Vo(e){return e.replace(/\.git$/i,"")}function On(e){return Vo(e).replace(/^\/+/,"").trim()||void 0}function Wo(e){try{let t=new URL(e),n=On(t.pathname),r=Pn(t.hostname);t.username="",t.password="";let o=n?`/${n}`:t.pathname,a=`${t.protocol}//${t.host}${o}`;return{repo:n,provider:r,remoteUrl:a}}catch{let t=e.match(/^(?:[^@\s]+@)?([^:\s]+):(.+)$/);if(t){let n=t[1],r=On(t[2]);return{repo:r,provider:Pn(n),remoteUrl:r?`ssh://${n}/${r}`:void 0}}return{}}}function qo(e){if(e.CLAUDE_CODE)return{tool:"claude-code"};if(e.CURSOR_SESSION_ID)return{tool:"cursor",sessionId:e.CURSOR_SESSION_ID};if(e.CONDUCTOR)return{tool:"conductor"};if(e.WINDSURF_SESSION)return{tool:"windsurf",sessionId:e.WINDSURF_SESSION}}function Ko(e){let t=e.intent?.summary?.trim()||e.note?.trim()||void 0,n=e.intent?.focus?.map(o=>o.trim()).filter(o=>o.length>0),r=e.intent?.acceptanceCriteria?.map(o=>o.trim()).filter(o=>o.length>0);if(!(!t&&(!n||n.length===0)&&(!r||r.length===0)))return{summary:t,focus:n&&n.length>0?n:void 0,acceptanceCriteria:r&&r.length>0?r:void 0}}function Jo(e,t){let n=t?.framework?.trim()||e?.framework?.trim()||void 0,r=t?.packageManager?.trim()||e?.packageManager?.trim()||void 0;if(!(!n&&!r))return{framework:n,packageManager:r}}function Zo(e){if(typeof e!="string")return;let[t]=e.split("@");return t?.trim()||void 0}function Yo(e){let t={...e.dependencies,...e.devDependencies},n=[["next","next"],["nuxt","nuxt"],["@remix-run/react","remix"],["astro","astro"],["@sveltejs/kit","sveltekit"],["gatsby","gatsby"],["@angular/core","angular"],["vite","vite"],["react","react"]];for(let[r,o]of n)if(r in t)return o}async function Xo(e){try{return await _o(e),!0}catch{return!1}}async function Qo(e){let t;try{let a=await Do(Cn(e,"package.json"),"utf8");t=JSON.parse(a)}catch{t=void 0}let n=t?Yo(t):void 0,o=Zo(t?.packageManager);if(!o){let a=[["package-lock.json","npm"],["pnpm-lock.yaml","pnpm"],["yarn.lock","yarn"],["bun.lockb","bun"]];for(let[s,u]of a)if(await Xo(Cn(e,s))){o=u;break}}if(!(!n&&!o))return{framework:n,packageManager:o}}function ei(e){return/^[+\- ]/.test(e)?`${e[0]}[REDACTED]`:"[REDACTED]"}function ti(e){return Ve(e).matches.length>0}function ni(e){return e&&e.split(`
312
+ `).map(t=>ti(t)?ei(t):t).join(`
313
+ `)}function ri(e,t,n){if(Buffer.byteLength(e,"utf8")<=t)return e;let r=Buffer.byteLength(n,"utf8"),o=Math.max(0,t-r),a=0,s=e.length;for(;a<s;){let u=Math.ceil((a+s)/2);Buffer.byteLength(e.slice(0,u),"utf8")<=o?a=u:s=u-1}return`${e.slice(0,a)}${n}`}function oi(e){if(!e||!e.trim())return;let t=e.split(`
314
+ `),n=[];for(let r=0;r+4<t.length;r+=5){let o=t[r]?.trim(),a=t[r+1]?.trim(),s=t[r+2]?.trim(),u=t[r+3]?.trim(),w=t[r+4]?.trim();!o||!a||!s||!u||!w||n.push({hash:o,shortHash:a,subject:s,author:u,date:w})}return n.length>0?n:void 0}async function ii(e){for(let t of["main","master","develop"])if(await te(e,["show-ref","--verify",`refs/heads/${t}`])!==null||await te(e,["show-ref","--verify",`refs/remotes/origin/${t}`])!==null)return t}function ai(e,t,n,r){if(!(!e||!t))return{branch:e,commitHash:t,dirty:n!=="clean",changedFiles:r.filter(o=>o.status!=="untracked").map(o=>o.path).slice(0,_n)}}async function si(e){let t=await te(e,["rev-parse","--abbrev-ref","HEAD"]);if(t)return t!=="HEAD"?t:await te(e,["symbolic-ref","--short","HEAD"])??t}async function yt(e,t={}){if(await te(e,["rev-parse","--is-inside-work-tree"])!=="true")return null;let r=await si(e);if(!r)return null;let o=await te(e,["status","--porcelain","--untracked-files=all"],{trim:!1});if(o===null)return null;let a=Uo(o),s=Go(a),u=await te(e,["diff","HEAD","--numstat"]);u===null&&(u=await te(e,["diff","--numstat"]));let w=Bo(u??""),S=new Map;for(let c of a)c.status==="untracked"&&jo(c.path)||S.set(c.path,{path:c.path,status:c.status,additions:0,deletions:0,oldPath:c.oldPath});for(let c of w){let P=S.get(c.path),L=P?.status??(c.oldPath?"renamed":"modified");S.set(c.path,{path:c.path,status:L,additions:c.additions,deletions:c.deletions,oldPath:P?.oldPath??c.oldPath})}let b=Fo(Array.from(S.values())),O=b.slice(0,_n),p=b.reduce((c,P)=>(c.filesChanged+=1,P.additions>0&&(c.additions+=P.additions),P.deletions>0&&(c.deletions+=P.deletions),P.status==="untracked"&&(c.untracked+=1),c),{filesChanged:0,additions:0,deletions:0,untracked:0}),d=await te(e,["rev-parse","HEAD"]),y=d?await te(e,["rev-parse","--short","HEAD"])??d.slice(0,7):void 0,E=await te(e,["diff","HEAD"],{trim:!1});E===null&&(E=await te(e,["diff"],{trim:!1}));let m=E?.trim()?ri(ni(E),zo,Mo):void 0,R=await te(e,["log","-10","--format=%H%n%h%n%s%n%aN%n%aI"]),h=oi(R),C=await te(e,["remote","get-url","origin"]),f=C?Wo(C):{},$=await ii(e),N=qo(t.env??process.env),I=ke(N,t.agentContext),v=Ko(t),g=Jo(await Qo(e),t.environment),T=v?.summary??t.note?.trim()??void 0,M=t.captureUrl?Oe(t.captureUrl):void 0,D=t.captureUrl?_e(t.captureUrl):void 0,H={version:1,repo:f.repo,provider:f.provider,branch:r,commitHash:y,commitHashFull:d??void 0,workingState:s,files:O,totals:p,agent:I,note:T,intent:v,environment:g,sourceKind:M,sourcePath:D},J={manifest:H,allFiles:b,unifiedDiff:m,recentCommits:h,remoteUrl:f.remoteUrl,baseBranch:$},U=ai(r,y,s,b);return{manifest:H,payload:J,legacyProvenance:U}}import{Chalk as Dn}from"chalk";import ci from"ora";function li(e){return process.env.NO_COLOR!==void 0||process.env.FORCE_COLOR==="0"||!e.isTTY?new Dn({level:0}):new Dn({level:1})}var se=class{quiet;json;stdout;stderr;shouldAnimate;shouldSuggest;chalk;activeSpinner;constructor(t={}){this.quiet=t.quiet===!0,this.json=t.json===!0,this.stdout=t.stdout??process.stdout,this.stderr=t.stderr??process.stderr,this.shouldAnimate=this.quiet!==!0&&this.stderr.isTTY===!0,this.shouldSuggest=this.quiet!==!0&&this.json!==!0&&this.stdout.isTTY===!0,this.chalk=li(this.stderr)}async step(t,n,r=t){if(this.quiet)return n();if(!this.shouldAnimate)return this.writeStderr(t),n();let o=ci({text:t,stream:this.stderr,isEnabled:!0}),a=this.activeSpinner;this.activeSpinner=o,o.start();try{let s=await n();return this.activeSpinner=a,o.succeed(this.chalk.green(r)),s}catch(s){throw this.activeSpinner=a,o.fail(this.chalk.red(t)),s}}info(t){this.quiet||this.writeStderr(t)}detail(t){this.quiet||this.writeStderr(this.chalk.dim(t))}success(t){this.quiet||this.writeStderr(this.chalk.green(t))}warn(t){this.writeStderr(this.chalk.yellow(`Warning: ${t}`))}error(t){this.writeStderr(this.chalk.red(t))}hint(t){if(!(!this.shouldSuggest||t.length===0)){this.writeStderr("");for(let n of t)this.writeStderr(this.chalk.dim(n))}}result(t){this.writeStdout(t)}resultJson(t){this.writeStdout(JSON.stringify(t,null,2))}writeStdout(t){this.stdout.write(`${t}
315
+ `)}writeStderr(t){let n=this.activeSpinner,r=n?.isSpinning===!0;r&&n.stop(),this.stderr.write(`${t}
316
+ `),r&&n.start()}};import{promises as Le,readFileSync as ui}from"fs";import{homedir as di}from"os";import{dirname as fi,join as In}from"path";function pi(e){try{return ui(e,"utf8")}catch{return null}}var vt="voe",wt="credentials",Qe="voe_live_",mi="Not signed in. Run `voe auth login` or set VOE_TOKEN.",Ie;async function bt(){if(Ie!==void 0)return Ie;try{Ie=await import("@napi-rs/keyring")}catch{Ie=null}return Ie}function Ne(){let e=process.env.XDG_CONFIG_HOME||In(di(),".config");return In(e,"voe","credentials.json")}function ze(e){return!e.startsWith(Qe)||e.length<=Qe.length+8?`${Qe}\u2026`:`${e.slice(0,Qe.length+4)}\u2026${e.slice(-4)}`}async function gi(){let e=await bt();if(!e)return null;try{return await new e.AsyncEntry(vt,wt).getPassword()??null}catch{return null}}async function hi(e){let t=await bt();if(!t)return!1;try{return await new t.AsyncEntry(vt,wt).setPassword(e),!0}catch{return!1}}async function yi(){let e=await bt();if(!e)return!1;try{return await new e.AsyncEntry(vt,wt).deletePassword(),!0}catch{return!1}}async function vi(){try{let e=await Le.readFile(Ne(),"utf8"),t=JSON.parse(e);return typeof t.token=="string"?t.token:null}catch{return null}}async function wi(e){let t=Ne();return await Le.mkdir(fi(t),{recursive:!0,mode:448}),await Le.writeFile(t,JSON.stringify({token:e}),{mode:384}),await Le.chmod(t,384),t}async function bi(){try{return await Le.unlink(Ne()),!0}catch{return!1}}async function St(){let e=process.env.VOE_TOKEN;if(e&&e.trim())return{token:e.trim(),source:"env"};let t=await gi();if(t)return{token:t,source:"keychain"};let n=await vi();return n?{token:n,source:"file",filePath:Ne()}:{token:null,source:"none"}}async function Si(e){return e&&e.trim()?{token:e.trim(),source:"env"}:St()}async function Ln(e){let t=await Si(e);if(!t.token)throw new Error(mi);return t.token}function Nn(){let e=process.env.VOE_TOKEN;if(e&&e.trim())return{token:e.trim(),source:"env"};try{let t=Ne(),n=pi(t);if(n){let r=JSON.parse(n);if(typeof r.token=="string"&&r.token.trim())return{token:r.token,source:"file",filePath:t}}}catch{}return{token:null,source:"none"}}async function zn(e){return await hi(e)?{location:"keychain"}:{location:"file",filePath:await wi(e)}}async function Mn(){await yi(),await bi()}async function xt(e,t,n=fetch){let r=await n(`${t}/api/auth/validate`,{method:"POST",headers:{Authorization:`Bearer ${e}`}});if(r.ok){let a=await r.json();return{email:a.email??null,scopes:Array.isArray(a.scopes)?a.scopes:[]}}let o=`Validation failed (${r.status})`;try{let a=await r.json();a.message?o=a.message:a.error&&(o=a.error)}catch{}throw new Error(o)}var xi=/voe_live_[A-Za-z0-9_-]{20,}/g,Ei="voe_live_<redacted>";function Ai(e){return e.replace(xi,Ei)}function Et(e){if(typeof e=="string")return Ai(e);if(Array.isArray(e))return e.map(Et);if(e&&typeof e=="object"){let t={};for(let[n,r]of Object.entries(e))t[n]=Et(r);return t}return e}function At(e){return Et(e)}var Ti="VOE_NO_CRASH_REPORT",ki="VOE_CLI_SENTRY_DSN",ne=null,be=!1,Me=!1,Ci=new Set(["durationMs","nodeCount","assetCount","errorCount","warningCount","bundleSizeBytes","suspiciousCount","slug","headed","viewportWidth","viewportHeight","totalImages","lazyNativeFixed","dataSrcCopied","loadErrors","removed","unwrapped","hoveredElements","focusedElements","frozenRules"]);function Ri(e){let t={};for(let[n,r]of Object.entries(e))Ci.has(n)&&(t[n]=r);return t}function $i(){return(process.env[ki]??process.env.SENTRY_DSN)?.trim()||void 0}function Pi(){let e=process.env.npm_package_version;return e?`voe-cli@${e}`:void 0}function Oi(){return process.env.VOE_TESTING_SESSION?.trim()||void 0}async function Un(e){if(be)return;if(process.env[Ti]==="1"){be=!1;return}let t=$i();if(!t){be=!1;return}ne=await import("@sentry/node");let n=e?.testingSession||Oi()||void 0;Me=!!n||process.env.VOE_TESTING==="1",ne.init({dsn:t,release:Pi(),environment:Me?"design-partner":void 0,tracesSampleRate:Me?1:0,sendDefaultPii:!1,beforeSend(r){return delete r.user,delete r.server_name,At(r)},beforeBreadcrumb(r){return At(r)}}),Me&&n&&ne.setTag("testing_session",n),be=!0}function Tt(){return be&&Me}function de(e,t){!Tt()||!ne||ne.addBreadcrumb({category:"capture",message:e,level:"info",data:Ri(t)})}async function ve(e,t){return!Tt()||!ne?t():ne.startSpan({name:e,op:"capture.step"},t)}function Hn(e){return!Tt()||!ne?e():ne.startSpan({name:"capture",op:"capture.pipeline"},e)}function Bn(e){if(!(!be||!ne)){if(e instanceof Error){ne.captureException(e);return}ne.captureException(new Error(String(e)))}}async function Fn(){!be||!ne||await ne.close(2e3)}function Yn(e){let[t,n]=e.split("x").map(Number);if(!t||!n||isNaN(t)||isNaN(n))throw new Error(`Invalid viewport format: "${e}". Use WxH (e.g., 1280x720)`);return{width:t,height:n}}function _i(e){try{let n=new URL(e).hostname;return n==="localhost"||n==="127.0.0.1"||n==="::1"||n==="0.0.0.0"}catch{return!1}}var Di=[/<img\b[^>]*\bsrc\s*=\s*["']data:text\/html;base64,/gi,/\bsrcset\s*=\s*["'][^"']*data:text\/html;base64,/gi,/<link\b[^>]*\bhref\s*=\s*["']data:text\/html;base64,/gi,/url\(\s*["']?data:text\/html;base64,/gi],Xn=`(() => {
317
+ document.querySelectorAll('style[data-voe-frozen-states]').forEach((style) => style.remove());
318
+ document.querySelectorAll('[data-voe-hover], [data-voe-focus], [data-voe-focus-within], [data-voe-focus-visible]').forEach((element) => {
319
+ element.removeAttribute('data-voe-hover');
320
+ element.removeAttribute('data-voe-focus');
321
+ element.removeAttribute('data-voe-focus-within');
322
+ element.removeAttribute('data-voe-focus-visible');
323
+ });
324
+ })()`;function Qn(e){return Di.reduce((t,n)=>{let r=e.match(n);return t+(r?r.length:0)},0)}function er(e){return`Found ${e} suspicious HTML data URI asset${e===1?"":"s"}. This may indicate broken relative asset resolution or route fallback responses.`}function tr(e){return e.provenance===!0}function re(...e){for(let t of e)console.error(t);process.exit(1)}async function Ii(){let e=Zn({input:process.stdin,output:process.stderr});try{await e.question("")}finally{e.close()}}async function Li(e){if(!e)return;let t=Ue(e);try{await Rt(t)}catch{re(`Error: Storage state file not found: ${t}`)}return t}function jn(e,t,n){let r=e instanceof Error?e.message:String(e);throw(r.includes("ERR_CONNECTION_REFUSED")||r.includes("ECONNREFUSED"))&&re(`
325
+ Error: Could not connect to ${t}`,"Make sure your dev server is running before capturing."),(r.includes("Timeout")||r.includes("timeout"))&&re(`
326
+ Error: Page load timed out after ${n}ms.`,"Try increasing the timeout with --timeout <ms>."),e}function nr(e,t){let n=e.matches.filter(o=>o.severity==="error"),r=e.matches.filter(o=>o.severity==="warning");if(n.length>0){t.push(`Detected ${n.length} potential secret(s); error-level matches were redacted in the snapshot.`),console.error(`
327
+ Found ${n.length} potential secret(s):`);for(let o of n)console.error(` [ERROR] ${o.type}: ${o.value} (${o.location})`)}if(r.length>0){t.push(`Detected ${r.length} scanner warning(s).`),console.warn(`
328
+ Found ${r.length} warning(s):`);for(let o of r)console.warn(` [WARN] ${o.type}: ${o.value} (${o.location})`)}n.length>0&&console.error(`
329
+ Proceeding with capture. Review the output for sensitive data.`)}function Ct(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function rr(e,t){if(!e&&!t.intent&&!t.environment)return;let n={version:1,workingState:"no-repo",files:[],totals:{filesChanged:0,additions:0,deletions:0,untracked:0},agent:e,note:t.intent?.summary,intent:t.intent,environment:t.environment};return{manifest:n,payload:{manifest:n}}}function Gn(e,t){if(e===void 0)return;if(!Array.isArray(e)||e.some(r=>typeof r!="string"))throw new Error(`${t} must be an array of strings.`);let n=e.map(r=>r.trim()).filter(r=>r.length>0);return n.length>0?n:void 0}function kt(e,t){if(e===void 0)return;if(typeof e!="string")throw new Error(`${t} must be a string.`);return e.trim()||void 0}function Ni(e){if(!Ct(e))throw new Error("handoff file must be a JSON object.");return{summary:kt(e.summary,"handoff file.summary"),focus:Gn(e.focus,"handoff file.focus"),acceptanceCriteria:Gn(e.acceptanceCriteria,"handoff file.acceptanceCriteria"),framework:kt(e.framework,"handoff file.framework"),packageManager:kt(e.packageManager,"handoff file.packageManager")}}async function zi(e){let t;if(e.handoffFile){let u=Ue(e.handoffFile);try{await Rt(u)}catch{re(`Error: Handoff file not found: ${u}`)}let w;try{w=JSON.parse(await qn(u,"utf8"))}catch(S){let b=S instanceof Error?S.message:String(S);re(`Error: Could not parse handoff file JSON (${b})`)}try{t=Ni(w)}catch(S){let b=S instanceof Error?S.message:String(S);re(`Error: ${b}`)}}let n=e.note?.trim()||void 0,r=[...t?.focus??[],...(e.focus??[]).map(u=>u.trim()).filter(u=>u.length>0)],o=[...t?.acceptanceCriteria??[],...(e.acceptance??[]).map(u=>u.trim()).filter(u=>u.length>0)],a=n||t?.summary||r.length>0||o.length>0?{summary:t?.summary??n,focus:r.length>0?r:void 0,acceptanceCriteria:o.length>0?o:void 0}:void 0,s=t?.framework||t?.packageManager?{framework:t.framework,packageManager:t.packageManager}:void 0;return{intent:a,environment:s}}function Vn(e,t){if(!Ct(e))throw new Error(`${t} must be a JSON object.`);let n={};if(e.tool!==void 0){if(typeof e.tool!="string")throw new Error(`${t}.tool must be a string.`);n.tool=e.tool}if(e.sessionId!==void 0){if(typeof e.sessionId!="string")throw new Error(`${t}.sessionId must be a string.`);n.sessionId=e.sessionId}if(e.custom!==void 0){if(!Ct(e.custom))throw new Error(`${t}.custom must be an object.`);n.custom=e.custom}let r=Object.entries(e).filter(([o])=>o!=="tool"&&o!=="sessionId"&&o!=="custom");return r.length>0&&(n.custom={...n.custom??{},...Object.fromEntries(r)}),n}async function Mi(e){let t;if(e.contextFile){let n=Ue(e.contextFile);try{await Rt(n)}catch{re(`Error: Context file not found: ${n}`)}let r;try{r=JSON.parse(await qn(n,"utf8"))}catch(o){let a=o instanceof Error?o.message:String(o);re(`Error: Could not parse context file JSON (${a})`)}try{t=ke(t,Vn(r,"context file"))}catch(o){let a=o instanceof Error?o.message:String(o);re(`Error: ${a}`)}}if(e.context){let n;try{n=JSON.parse(e.context)}catch(r){let o=r instanceof Error?r.message:String(r);re(`Error: Could not parse --context JSON (${o})`)}try{t=ke(t,Vn(n,"--context"))}catch(r){let o=r instanceof Error?r.message:String(r);re(`Error: ${o}`)}}return t}function or(e){let t=e.branch?`${e.branch}@${e.commitHash??"no-commit"}`:e.commitHash,n=e.workingState==="clean"?"":"*";return`${e.repo?`${e.repo}${t?` ${t}`:""}`:t??"unknown"}${n} (${e.totals.filesChanged} files, +${e.totals.additions} -${e.totals.deletions})`}function Ui(e){return`${(e/(1024*1024)).toFixed(2)} MB`}function ir(e,t){let{stylesheets:n,fonts:r,images:o}=e;if(t.detail(`[inline] stylesheets: ${n.inlined}/${n.found}, fonts: ${r.inlined}/${r.found}, images: ${o.inlined}/${o.found}`),n.failed.length>0){t.warn(`${n.failed.length} stylesheet(s) could not be inlined \u2014 the snapshot may appear unstyled`);for(let a of n.failed)t.warn(` - ${a}`)}if(r.failed.length>0){t.warn(`${r.failed.length} font(s) could not be inlined`);for(let a of r.failed)t.warn(` - ${a}`)}}function Wn(e,t,n,r){let o={path:r.path,url:r.url,slug:r.slug,size:r.size,expiresAt:r.expiresAt,steps:r.steps,warnings:r.warnings};n.json?e.resultJson(o):r.url?e.result(r.url):e.result(r.path);let a=r.steps?`, ${r.steps} steps`:"";if(e.success(`Snapshot saved to ${r.path} (${Ui(r.size)}${a})`),r.url&&r.expiresAt&&e.detail(`Expires: ${new Date(r.expiresAt).toLocaleDateString()}`),!r.url){let s=["Next:"];n.preview||s.push(` voe capture ${t} --preview`),n.share||s.push(` voe capture ${t} --share`),s.length>1&&e.hint(s)}}async function Hi(e,t,n,r,o){let{getOverlayStripScript:a,getPreCaptureScript:s,getInteractiveStateFreezeScript:u,getSerializerScript:w,serializeToHtml:S,inlineAssets:b,redactSecrets:O}=await Promise.resolve().then(()=>(Ae(),Xe));try{let f=await e.page.evaluate(a());(f.removed>0||f.unwrapped>0)&&r.detail(` Stripped ${f.removed} overlay element(s), unwrapped ${f.unwrapped}`)}catch(f){let $=f instanceof Error?f.message:String(f);r.warn(`[voe:overlay-strip] Failed to strip overlays: ${$}`)}try{let f=s();await e.page.evaluate(f)}catch(f){let $=f instanceof Error?f.message:String(f);r.warn(`[voe:precapture] Failed to load lazy images: ${$}`)}try{let f=await e.page.evaluate(u());f.frozenRules>0&&r.detail(` Preserved ${f.frozenRules} interactive rule(s)`)}catch(f){let $=f instanceof Error?f.message:String(f);r.warn(`[voe:freeze] Failed to freeze interactive states: ${$}`)}let p=await e.page.title(),d=w({interactive:n.interactive}),y;try{let f=await e.page.evaluate(d);y=S(f)}finally{await e.page.evaluate(Xn).catch(()=>{})}let E=await b(y,{baseUrl:t,interactive:n.interactive,fetchFn:async f=>{let $=await e.page.request.get(f),N=await $.body(),I=$.headers();return new Response(new Uint8Array(N),{status:$.status(),headers:new Headers(I)})},onWarning:f=>{r.warn(`[voe:inline] ${f}`)}}),m=E.html;ir(E.stats,r);let R=Qn(m);if(R>0){let f=er(R);n.strictAssets&&(console.error(`
330
+ Error: ${f}`),process.exit(1)),o.push(f),r.warn(f)}let{redacted:h,scanResult:C}=O(m);return m=h,n.scan!==!1&&!C.clean&&nr(C,o),{html:m,title:p}}async function Bi(e,t,n,r,o,a,s,u){let{packageDemoPath:w,detectLocalhostReferences:S,prepareHostedBundle:b,optimizeHostedBundleForUpload:O,uploadHostedBundle:p,UploadError:d,formatBundleDiagnostics:y}=await Promise.resolve().then(()=>(Ae(),Xe)),E=Yn(t.viewport),m=[],R=1,h=Zn({input:process.stdin,output:process.stderr});try{for(r.info(""),r.info("Demo Path mode - capture multiple steps across routes."),r.info("Navigate the browser, then come back here to capture each step."),r.info("");(await h.question(`Press Enter to capture step ${R} (or type "done" to finish): `)).trim().toLowerCase()!=="done";){let D=(await h.question(` Step name (default: "Step ${R}"): `)).trim()||`Step ${R}`,J=(await h.question(" Note (optional, Enter to skip): ")).trim()||void 0,U=n.page.url();r.info(` Capturing ${U}...`);let{html:c,title:P}=await Hi(n,U,t,r,o);m.push({index:R,name:D,note:J,captureUrl:U,viewport:E,html:c,capturedAt:new Date,title:P||void 0,runtime:t.interactive?"interactive":"static"}),r.success(` Step ${R} captured: "${D}"`),r.info(""),R++}}finally{h.close()}if(m.length===0)return r.info("No steps captured. Exiting."),null;let C,f,$;if(tr(t)){let T=await r.step("Collecting git provenance...",async()=>yt(process.cwd(),{agentContext:a,intent:s.intent,environment:s.environment,captureUrl:e}),"Git provenance collected");C=T?.legacyProvenance,f=T?.manifest,$=T?.payload,f&&r.detail(`Git: ${or(f)}`)}if(!f){let T=rr(a,s);f=T?.manifest,$=T?.payload}let N={title:s.intent?.summary??t.note?.trim()??void 0,provenance:C,handoff:f},I=await r.step(`Packaging ${m.length}-step demo path...`,async()=>w(m,N),"Demo path packaged"),v=Ue(t.output.replace(".html","-demo.html"));if(await Kn(v,I.html,"utf-8"),I.metadata.bundleSize>15*1024*1024){let T="Demo path bundle exceeds 15MB target size.";o.push(T),r.warn(T)}if(t.preview){let T=process.platform==="darwin"?"open":"xdg-open";Jn(`${T} "${v}"`),r.info("Opening preview in browser...")}let g;if(t.share){let T=S(I.html);if(T.length>0){r.warn(`Bundle contains ${T.length} localhost reference(s) that won't resolve when shared`);for(let D of T)r.warn(` - ${D}`)}let M=t.apiUrl??process.env.VOE_API_URL??"https://voe.dev";try{g=await r.step("Uploading demo path...",async()=>{let D=b(I.html),{bundle:H,optimized:J,originalBytes:U,assetsOptimized:c}=await O(D);if(J){let P=((U-H.totalBytes)/1024/1024).toFixed(1);r.detail(`Optimized ${c} asset(s), saved ${P} MB`)}return p(H,M,$,void 0,u)},"Demo path uploaded")}catch(D){let H=D instanceof Error?D.message:String(D);D instanceof d&&D.status===401?(r.error(H),r.hint([D.hint??"Run: voe auth login"])):H.includes("ECONNREFUSED")||H.includes("fetch failed")?r.error("Could not connect to Voe API."):(r.error(`Upload error: ${H}`),H.includes("413")&&r.error(y(b(I.html)))),process.exit(1)}}return{path:v,size:I.metadata.bundleSize,url:g?.url,slug:g?.slug,expiresAt:g?.expiresAt,steps:m.length,warnings:[...o]}}async function ar(e,t){let{serializeToHtml:n,inlineAssets:r,detectLocalhostReferences:o,redactSecrets:a,packageBundle:s,prepareHostedBundle:u,optimizeHostedBundleForUpload:w,formatBundleDiagnostics:S,getSerializerScript:b,getPreCaptureScript:O,getOverlayStripScript:p,getInteractiveStateFreezeScript:d,uploadHostedBundle:y,UploadError:E}=await Promise.resolve().then(()=>(Ae(),Xe)),m=new se({quiet:t.quiet,json:t.json}),R=[];!t.allowRemote&&!_i(e)&&re(`Error: Only localhost URLs are allowed by default.
331
+ Use --allow-remote to capture non-localhost URLs.`),t.interactive&&t.share&&re(`Error: --interactive and --share cannot be used together.
332
+ Interactive snapshots run client-side scripts and are not safe for hosted sharing.
333
+ Save locally and open the file directly instead.`);let h;if(t.share)try{h=await Ln(t.token)}catch(T){let M=T instanceof Error?T.message:String(T);re(`Error: ${M}`)}let C=Yn(t.viewport),f=parseInt(t.wait,10)||2e3,$=await Li(t.storageState),N=await Mi(t),I=await zi(t),v=t.demo?!0:t.headed;m.info(`Capturing ${e}...`);let g=await It({viewport:C,storageState:$,headed:v});try{if(t.demo){let M=parseInt(t.timeout,10)||3e4;await m.step("Loading page...",async()=>{try{await g.page.goto(e,{waitUntil:"load",timeout:M})}catch(H){jn(H,e,M)}},"Page loaded"),f>0&&await g.page.waitForTimeout(f);let D=await Bi(e,t,g,m,R,N,I,h);D&&Wn(m,e,t,D);return}let T=await Hn(async()=>{let M=parseInt(t.timeout,10)||3e4,D=Date.now();await m.step("Loading page...",async()=>{try{await ve("page.loaded",()=>g.page.goto(e,{waitUntil:"load",timeout:M}))}catch(x){jn(x,e,M)}},"Page loaded"),f>0&&await g.page.waitForTimeout(f),v&&(m.info(""),m.info("Browser is open. Interact with the page, then press Enter here to capture..."),await Ii(),m.info("")),de("page.loaded",{durationMs:Date.now()-D});let H=await m.step("Stripping overlays...",async()=>ve("overlays.stripped",async()=>{try{return await g.page.evaluate(p())}catch(x){let _=x instanceof Error?x.message:String(x);return m.warn(`[voe:overlay-strip] Failed to strip overlays: ${_}`),null}}),"Overlays stripped");H&&(H.removed>0||H.unwrapped>0)&&(m.detail(` Stripped ${H.removed} overlay element(s), unwrapped ${H.unwrapped}`),de("overlays.stripped",{durationMs:H.durationMs,removed:H.removed,unwrapped:H.unwrapped}));let J=await m.step("Loading lazy images...",async()=>ve("images.precaptured",async()=>{try{let x=O();return await g.page.evaluate(x)}catch(x){let _=x instanceof Error?x.message:String(x);return m.warn(`[voe:precapture] Failed to load lazy images: ${_}`),null}}),"Lazy images loaded");J&&de("images.precaptured",{durationMs:J.durationMs,totalImages:J.totalImages,lazyNativeFixed:J.lazyNativeFixed,dataSrcCopied:J.dataSrcCopied,loadErrors:J.loadErrors});let U=await m.step("Freezing interactive states...",async()=>ve("states.frozen",async()=>{try{return await g.page.evaluate(d())}catch(x){let _=x instanceof Error?x.message:String(x);return m.warn(`[voe:freeze] Failed to freeze interactive states: ${_}`),null}}),"Interactive states frozen");U&&(U.frozenRules>0&&m.detail(` Preserved ${U.frozenRules} interactive rule(s)`),de("states.frozen",{durationMs:U.durationMs,hoveredElements:U.hoveredElements,focusedElements:U.focusedElements,frozenRules:U.frozenRules}));let c=await g.page.title(),P=Date.now(),L=await m.step("Serializing DOM...",async()=>{try{return await ve("dom.serialized",async()=>{let x=b({interactive:t.interactive}),_=await g.page.evaluate(x);return n(_)})}finally{await g.page.evaluate(Xn).catch(()=>{})}},"DOM serialized");de("dom.serialized",{durationMs:Date.now()-P});let B=Date.now(),j=await m.step("Inlining assets...",async()=>ve("assets.inlined",()=>r(L,{baseUrl:e,interactive:t.interactive,fetchFn:async x=>{let _=await g.page.request.get(x),F=await _.body(),k=_.headers();return new Response(new Uint8Array(F),{status:_.status(),headers:new Headers(k)})},onWarning:x=>{m.warn(`[voe:inline] ${x}`)}})),"Assets inlined"),q=j.html;ir(j.stats,m);let G=Qn(q);if(G>0){let x=er(G);t.strictAssets&&(console.error(`
334
+ Error: ${x}`),console.error("Run without --strict-assets to continue with a warning instead."),process.exit(1)),R.push(x),m.warn(x)}de("assets.inlined",{durationMs:Date.now()-B,suspiciousCount:G});let X=Date.now(),ee=t.scan!==!1?await m.step("Scanning for secrets...",async()=>a(q),"Secrets scanned"):a(q);q=ee.redacted,t.scan!==!1&&!ee.scanResult.clean&&nr(ee.scanResult,R);let ie=ee.scanResult.matches.filter(x=>x.severity==="error"),me=ee.scanResult.matches.filter(x=>x.severity==="warning");de("secrets.scanned",{durationMs:Date.now()-X,errorCount:ie.length,warningCount:me.length});let ce,pe,Be;if(tr(t)){let x=await m.step("Collecting git provenance...",async()=>yt(process.cwd(),{agentContext:N,intent:I.intent,environment:I.environment,captureUrl:e}),"Git provenance collected");if(ce=x?.legacyProvenance,pe=x?.manifest,Be=x?.payload,pe)m.detail(`Git: ${or(pe)}`);else if(ce){let _=ce.dirty?" (dirty)":"";m.detail(`Git: ${ce.branch}@${ce.commitHash}${_}`)}}if(!pe){let x=rr(N,I);pe=x?.manifest,Be=x?.payload}let Se=Date.now(),i=await m.step("Packaging bundle...",async()=>{let x={captureUrl:e,viewport:C,capturedAt:new Date,userAgent:await g.page.evaluate(()=>navigator.userAgent),title:c||void 0,provenance:ce,handoff:pe,interactive:t.interactive};return s(q,x)},"Bundle packaged");de("bundle.packaged",{durationMs:Date.now()-Se,bundleSizeBytes:i.metadata.bundleSize});let l=Ue(t.output);if(await Kn(l,i.html,"utf-8"),i.metadata.bundleSize>5*1024*1024){let x="Bundle exceeds 5MB target size.";R.push(x),m.warn(x)}if(t.preview){let x=process.platform==="darwin"?"open":"xdg-open";Jn(`${x} "${l}"`),m.info("Opening preview in browser...")}let A;if(t.share){let x=o(i.html);if(x.length>0){m.warn(`Bundle contains ${x.length} localhost reference(s) that won't resolve when shared`);for(let k of x)m.warn(` - ${k}`)}let _=t.apiUrl??process.env.VOE_API_URL??"https://voe.dev",F=Date.now();try{A=await m.step("Uploading snapshot...",async()=>{let k=u(i.html),{bundle:z,optimized:W,originalBytes:V,assetsOptimized:Z}=await w(k);if(W){let Y=((V-z.totalBytes)/1024/1024).toFixed(1);m.detail(`Optimized ${Z} asset(s), saved ${Y} MB`)}let Q=await ve("upload.completed",()=>y(z,_,Be,void 0,h));return de("upload.completed",{durationMs:Date.now()-F,bundleSizeBytes:z.totalBytes,slug:Q.url.split("/").pop()??""}),Q},"Snapshot uploaded")}catch(k){let z=k instanceof Error?k.message:String(k);k instanceof E&&k.status===401?(m.error(z),m.hint([k.hint??"Run: voe auth login"])):z.includes("ECONNREFUSED")||z.includes("fetch failed")?(m.error("Could not connect to Voe API."),m.info("Check your network connection or use --api-url for a custom endpoint.")):(m.error(`Upload error: ${z}`),z.includes("413")&&m.error(S(u(i.html)))),process.exit(1)}}return{path:l,size:i.metadata.bundleSize,url:A?.url,slug:A?.slug,expiresAt:A?.expiresAt,warnings:[...R]}});Wn(m,e,t,T)}finally{await g.close()}}import{execFile as Fi}from"child_process";import{promisify as ji}from"util";import{writeFile as Gi,unlink as sr}from"fs/promises";import{join as Vi}from"path";import{tmpdir as Wi}from"os";var lr=ji(Fi),qi=/^[a-zA-Z0-9]{22}$/,Ki=/\/s\/([a-zA-Z0-9]{22})$/;function fe(...e){for(let t of e)console.error(t);process.exit(1)}function Ji(e){return qi.test(e)?e:e.match(Ki)?.[1]??null}async function Zi(e,t,n=fetch){let r=await n(`${t}/api/handoff/${e}`);if(r.status===404)throw new Error("No handoff data found for this snapshot. The snapshot may have expired, or it was captured without git context (--provenance).");if(!r.ok)throw new Error(`Failed to fetch handoff data (${r.status})`);return await r.json()}function Yi(e,t){return t||`voe/promote/${e.slice(0,8)}`}function Xi(e){try{return new URL(e).pathname.replace(/^\/+/,"").replace(/\.git$/i,"")||void 0}catch{let t=e.match(/^(?:[^@\s]+@)?[^:\s]+:(.+)$/);return t&&t[1].replace(/\.git$/i,"")||void 0}}async function oe(e,t,n){return n?n(e,t):lr("git",e,{cwd:t,encoding:"utf8",timeout:1e4})}async function cr(e,t,n){return n?n(e,t):lr("gh",e,{cwd:t,encoding:"utf8",timeout:3e4})}async function ur(e,t,n={}){let r=new se({quiet:t.quiet}),o=Ji(e);o||fe(`Error: Invalid snapshot identifier: "${e}"`,"Provide a 22-character slug or a full voe.fyi URL.");let a=process.cwd(),s=t.apiUrl??process.env.VOE_API_URL??"https://voe.dev";try{await oe(["rev-parse","--is-inside-work-tree"],a,n.execGit)}catch{fe("Error: Not inside a git repository.","Run this command from within the repo.")}let{stdout:u}=await oe(["status","--porcelain"],a,n.execGit);if(u.trim()&&fe("Error: Working tree has uncommitted changes.","Please commit or stash your changes before promoting."),t.to==="pr")try{await cr(["--version"],a,n.execGh)}catch{fe("Error: GitHub CLI (gh) is not installed or not in PATH.","Install it from https://cli.github.com/ or use --to branch to skip PR creation.")}let w;try{w=await r.step("Fetching handoff data...",async()=>Zi(o,s,n.fetchFn),"Handoff data fetched")}catch(C){let f=C instanceof Error?C.message:String(C);fe(`Error: ${f}`)}(!w.unifiedDiff||!w.unifiedDiff.trim())&&fe("Error: No diff available for this snapshot.","The snapshot was captured with a clean working tree or diffs were not collected.");let{stdout:S}=await oe(["remote","get-url","origin"],a,n.execGit).catch(()=>({stdout:"",stderr:""})),b=Xi(S.trim()),O=w.manifest.repo;b&&O&&b!==O&&!t.force&&fe("Error: Repo mismatch.",` Local: ${b}`,` Snapshot: ${O}`,"Use --force to override this check.");let p=w.baseBranch??"main";await r.step(`Checking out base branch ${p}...`,async()=>{try{await oe(["checkout",p],a,n.execGit)}catch{fe(`Error: Could not checkout base branch "${p}".`,"Make sure the branch exists locally. Try: git fetch origin")}},`Checked out ${p}`);let d=Yi(o,t.branch);await r.step(`Creating branch ${d}...`,async()=>{try{await oe(["checkout","-b",d],a,n.execGit)}catch{fe(`Error: Could not create branch "${d}".`,"The branch may already exist. Use --branch to specify a different name.")}},`Created branch ${d}`);let y=Vi(Wi(),`voe-promote-${o}.patch`),E=!1;try{if(await Gi(y,w.unifiedDiff,"utf-8"),t.dryRun){await r.step("Checking if diff applies cleanly...",async()=>{await oe(["apply","--check",y],a,n.execGit)},"Dry run succeeded"),await oe(["checkout",p],a,n.execGit).catch(()=>{}),await oe(["branch","-D",d],a,n.execGit).catch(()=>{}),await sr(y).catch(()=>{}),r.result("ok");return}await r.step("Applying diff...",async()=>{await oe(["apply",y],a,n.execGit)},"Diff applied"),E=!0}catch(C){await oe(["checkout",p],a,n.execGit).catch(()=>{}),await oe(["branch","-D",d],a,n.execGit).catch(()=>{});let f=C instanceof Error?C.message:String(C);fe("Error: Diff does not apply cleanly.",f,"",`The patch has been saved to: ${y}`,`You can try applying it manually with: git apply --3way ${y}`)}finally{E&&await sr(y).catch(()=>{})}await oe(["add","-A"],a,n.execGit);let m=w.manifest.note,R=m?`voe: ${m}`:`voe: promote snapshot ${o.slice(0,8)}`,h=[`Promoted from Voe snapshot: ${o}`,`Capture branch: ${w.manifest.branch??"unknown"}`].join(`
335
+ `);if(await oe(["commit","-m",`${R}
336
+
337
+ ${h}`],a,n.execGit),r.success("Changes committed."),t.to==="pr"){await r.step("Pushing branch...",async()=>{await oe(["push","-u","origin",d],a,n.execGit)},"Branch pushed");let C=m?`[Voe] ${m}`:`[Voe] Promote snapshot ${o.slice(0,8)}`,f=w.manifest.totals,$=["## Promoted from Voe snapshot","",`**Snapshot:** \`${o}\``,`**Captured from:** \`${w.manifest.branch??"unknown"}\`${w.manifest.commitHash?` @ \`${w.manifest.commitHash}\``:""}`,`**Changes:** ${f.filesChanged} files, +${f.additions} -${f.deletions}`,w.manifest.note?`**Note:** ${w.manifest.note}`:"",w.manifest.agent?.tool?`**Agent:** ${w.manifest.agent.tool}`:"","","---","_Created by [Voe](https://voe.dev) promotion pipeline_"].filter(Boolean).join(`
338
+ `);try{let{stdout:N}=await r.step("Creating PR...",async()=>cr(["pr","create","--title",C,"--body",$,"--base",p],a,n.execGh),"PR created");r.result(N.trim())}catch(N){let I=N instanceof Error?N.message:String(N);r.warn(`PR creation failed: ${I}`),console.error(`Branch "${d}" has been pushed. Create the PR manually.`),r.result(d)}}else r.success(`Branch "${d}" created with snapshot changes.`),r.hint(["Next:",` git push -u origin ${d}`,` gh pr create --base ${p}`]),r.result(d)}import*as $t from"readline";import{Writable as Qi}from"stream";var Pt="voe_live_",ea="https://voe.dev";function Ot(e){if(e.apiUrl&&e.apiUrl.trim())return e.apiUrl;let t=process.env.VOE_API_URL;return t&&t.trim()?t:ea}async function ta(e){if(process.stdout.write(e),!process.stdin.isTTY){let o=$t.createInterface({input:process.stdin,output:process.stdout,terminal:!1}),a=await new Promise(s=>{o.question("",s)});return o.close(),a}let t=new Qi({write(o,a,s){s()}}),n=$t.createInterface({input:process.stdin,output:t,terminal:!0}),r=await new Promise(o=>{n.question("",o)});return n.close(),process.stdout.write(`
339
+ `),r}function na(e){return e.startsWith(Pt)?e.length>=Pt.length+30:!1}async function dr(e,t,n){if(!na(e)){n.error(`Token must start with "${Pt}" and look like a VOE token.`),process.exitCode=1;return}let r;try{r=await xt(e,t)}catch(s){let u=s instanceof Error?s.message:String(s);n.error(`Could not validate token: ${u}`),process.exitCode=1;return}let o=await zn(e),a=r.email??"(unknown email)";n.success(`Signed in as ${a}`),n.info(`Token: ${ze(e)}`),r.scopes.length>0&&n.info(`Scopes: ${r.scopes.join(", ")}`),o.location==="keychain"?n.info("Stored in OS keychain."):n.info(`Stored at ${o.filePath} (0600).`)}async function fr(e){let t=new se;if(process.env.VOE_TOKEN&&!e.force){t.info("VOE_TOKEN is set in your environment \u2014 using it directly without storing locally."),t.info("Run `voe auth login --force` to also save the token to disk.");return}let n=Ot(e),o=(await ta("Paste your VOE token: ")).trim();if(!o){t.error("No token provided."),process.exitCode=1;return}await dr(o,n,t)}async function pr(e,t){let n=new se,r=(e??process.env.VOE_TOKEN??"").trim();if(!r){n.error("No token provided."),n.hint(["Pass the token as an argument: voe auth token <value>","Or set: export VOE_TOKEN=<value>"]),process.exitCode=1;return}let o=Ot(t);await dr(r,o,n)}async function mr(e){let t=new se;await Mn(),t.info("Signed out. (Server-side token still valid \u2014 ask a maintainer to revoke if needed.)")}function ra(e,t){switch(e){case"env":return"env (VOE_TOKEN)";case"keychain":return"OS keychain";case"file":return`file (${t??"unknown path"})`;default:return"none"}}async function gr(e){let t=new se,n=Ot(e),r=await St();if(!r.token){t.error("Not signed in."),t.info(`API URL: ${n}`),t.hint(["Run: voe auth login","Or set: export VOE_TOKEN=<value>"]),process.exitCode=1;return}if(t.info(`Token: ${ze(r.token)}`),t.info(`API URL: ${n}`),t.info(`Storage: ${ra(r.source,r.filePath)}`),!e.noCheck)try{let o=await xt(r.token,n),a=o.email??"(unknown email)";t.success(`Signed in as ${a}`),o.scopes.length>0&&t.info(`Scopes: ${o.scopes.join(", ")}`)}catch(o){let a=o instanceof Error?o.message:String(o);t.error(`Stored token failed validation: ${a}`),process.exitCode=1}}var hr=`
340
+ Examples:
341
+ voe capture http://localhost:3000 --preview
342
+ voe capture http://localhost:3000 --share
343
+
344
+ Run \`voe <command> --help\` for details.
345
+ `.trimEnd();function oa(){let e=Nn();return e.token?`Signed in: ${ze(e.token)}`:"Not logged in. Run `voe auth login` to get started."}function yr(){return["voe - Capture and share reviewable artifacts of real code","",oa(),"","Usage:"," voe capture <url> Capture a web page snapshot"," voe promote <slug-or-url> Promote a snapshot to a PR or branch"," voe auth <subcommand> Manage authentication","","Examples:"," voe capture http://localhost:3000 --preview"," voe capture http://localhost:3000 --share","","Run `voe <command> --help` for details."].join(`
346
+ `)}var aa=ia(import.meta.url)("../../package.json");function vr(e,t){return[...t,e]}function Te(e){return async(...t)=>{await Un({testingSession:sa()});try{await e(...t)}catch(n){throw Bn(n),n}}}He.name("voe").description("Capture and share reviewable artifacts of real code").version(aa.version).addHelpText("after",`
347
+ ${hr}
348
+ `);He.command("capture <url>").description("Capture a snapshot of a web page").option("-o, --output <path>","Output file path","voe-output.html").option("-q, --quiet","Suppress progress output and only print the final result").option("--json","Print structured JSON result to stdout").option("--testing-session <id>","Enable design partner testing telemetry").option("--viewport <size>","Viewport size (WxH)","1280x720").option("--wait <ms>","Wait time after page load (ms)","2000").option("--timeout <ms>","Navigation timeout (ms)","30000").option("--no-scan","Skip secret scanning").option("--provenance","Collect git provenance and handoff context").option("--allow-remote","Allow capturing non-localhost URLs").option("--storage-state <path>","Load Playwright storage state JSON (cookies/localStorage)").option("--headed","Open a visible browser and wait for Enter before capturing").option("--strict-assets","Fail capture if suspicious HTML fallback assets are detected").option("--preview","Open the snapshot in default browser after capture").option("--interactive","Preserve same-origin client-side scripts for local interactive prototypes").option("--share","Upload snapshot and print shareable URL").option("--api-url <url>","API base URL (default: https://voe.dev)").option("--token <value>","VOE token (overrides VOE_TOKEN and stored credentials)").option("--note <text>","Describe what the snapshot captures").option("--focus <text>","Focus review on this area (repeatable)",vr,[]).option("--acceptance <text>","Acceptance criterion (repeatable)",vr,[]).option("--handoff-file <path>","JSON file with structured handoff intent").option("--context <json>","Agent/session context as JSON").option("--context-file <path>","Path to JSON file with agent/session context").option("--demo","Capture a multi-step demo path").action(Te(ar));He.command("promote <slug-or-url>").description("Promote a Voe snapshot to a PR or branch").option("-q, --quiet","Suppress progress output and only print the final result").option("--to <target>","Promotion target: pr or branch","pr").option("--branch <name>","Custom branch name").option("--api-url <url>","API base URL (default: https://voe.dev)").option("--token <value>","VOE token (reserved for future auth-gated promote endpoints)").option("--force","Skip repo mismatch validation").option("--dry-run","Check if diff applies without making changes").option("--testing-session <id>","Enable design partner testing telemetry").action(Te(ur));var et=He.command("auth").description("Manage VOE authentication for the CLI");et.command("login").description("Sign in by pasting a VOE token").option("--api-url <url>","API base URL (default: https://voe.dev)").option("--force","Save to local storage even when VOE_TOKEN is set").action(Te(fr));et.command("logout").description("Remove stored VOE credentials from this machine").action(Te(mr));et.command("status").description("Show current auth state: token, API URL, storage location").option("--api-url <url>","API base URL (default: https://voe.dev)").option("--no-check","Skip the network validation call").action(Te(gr));et.command("token [value]").description("Sign in non-interactively (for CI/agents) using arg or VOE_TOKEN").option("--api-url <url>","API base URL (default: https://voe.dev)").action(Te(pr));function sa(){let e=process.argv.indexOf("--testing-session");if(e!==-1&&e+1<process.argv.length)return process.argv[e+1]}async function ca(){try{if(process.argv.length<=2){console.log(yr());return}await He.parseAsync(process.argv)}finally{await Fn()}}ca().catch(e=>{e instanceof Error?console.error(e.stack??e.message):console.error(String(e)),process.exitCode=1});
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@softinterface/voe-cli",
3
+ "version": "0.2.1",
4
+ "description": "Capture and share reviewable artifacts of real code from a running localhost. No setup required for viewers.",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "bin": {
8
+ "voe": "./dist/bin/voe.js"
9
+ },
10
+ "files": ["dist"],
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/fraser-stanley/voe.git",
14
+ "directory": "packages/cli"
15
+ },
16
+ "homepage": "https://voe.dev",
17
+ "bugs": "https://github.com/fraser-stanley/voe/issues",
18
+ "engines": {
19
+ "node": ">=20.0.0"
20
+ },
21
+ "keywords": [
22
+ "voe",
23
+ "snapshot",
24
+ "capture",
25
+ "share",
26
+ "prototype",
27
+ "design-review",
28
+ "agent"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "lint": "eslint \"src/**/*.{ts,mts,cts}\" vitest.config.ts --max-warnings=0",
34
+ "lint:fix": "npm run lint -- --fix",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "typecheck": "tsc --noEmit",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "dependencies": {
41
+ "@napi-rs/keyring": "^1.1.0",
42
+ "@sentry/node": "^10.42.0",
43
+ "chalk": "^5.0.0",
44
+ "commander": "^13.0.0",
45
+ "ora": "^8.0.0",
46
+ "playwright": "^1.50.0",
47
+ "sharp": "^0.34.5"
48
+ },
49
+ "devDependencies": {
50
+ "@softinterface/voe-engine": "^0.2.0",
51
+ "@types/pngjs": "^6.0.5",
52
+ "pixelmatch": "^7.1.0",
53
+ "pngjs": "^7.0.0",
54
+ "tsup": "^8.5.1",
55
+ "vitest": "^3.0.0"
56
+ }
57
+ }