bangonit 0.5.2 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -2
- package/app/desktopapp/dist/main/index.js +14 -10
- package/app/desktopapp/dist/shared/args.js +1 -0
- package/app/replay/dist/replay.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/BUILD_ID +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/app-build-manifest.json +7 -7
- package/app/webapp/.next/standalone/app/webapp/.next/app-path-routes-manifest.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/build-manifest.json +3 -3
- package/app/webapp/.next/standalone/app/webapp/.next/prerender-manifest.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/required-server-files.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/_not-found/page.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/_not-found.html +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/_not-found.rsc +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/api/chat/route.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/api/chat/route.js.nft.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/api/screenshot/route.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/api/screenshot/route.js.nft.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/app/page.js +6 -6
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/app/page_client-reference-manifest.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/app.html +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/app.rsc +2 -2
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/index.html +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/index.rsc +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/page.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/app-paths-manifest.json +2 -2
- package/app/webapp/.next/standalone/app/webapp/.next/server/chunks/{708.js → 151.js} +9 -7
- package/app/webapp/.next/standalone/app/webapp/.next/server/chunks/679.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/middleware-build-manifest.js +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/pages/404.html +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/pages/500.html +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/pages-manifest.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/server/server-reference-manifest.json +1 -1
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/793-be37f231ca512496.js +36 -0
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/app/app/page-4c6dfbf12230aab7.js +1 -0
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/app/layout-57acb80d8da0067a.js +1 -0
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/{main-app-76384b941f0b51cb.js → main-app-106dd83f859b9dfa.js} +1 -1
- package/app/webapp/.next/standalone/app/webapp/package.json +1 -0
- package/app/webapp/.next/standalone/app/webapp/server.js +1 -1
- package/app/webapp/.next/standalone/package.json +2 -1
- package/app/webapp/.next/static/chunks/793-be37f231ca512496.js +36 -0
- package/app/webapp/.next/static/chunks/app/app/page-4c6dfbf12230aab7.js +1 -0
- package/app/webapp/.next/static/chunks/app/layout-57acb80d8da0067a.js +1 -0
- package/app/webapp/.next/static/chunks/{main-app-76384b941f0b51cb.js → main-app-106dd83f859b9dfa.js} +1 -1
- package/app/webapp/package.json +1 -0
- package/app/webapp/src/shared/api/chat.ts +13 -2
- package/app/webapp/src/shared/components/AppShell.tsx +15 -5
- package/app/webapp/src/shared/components/SessionView.tsx +10 -2
- package/app/webapp/src/shared/lib/browser/index.ts +2 -2
- package/app/webapp/src/shared/lib/browser/screenshot.ts +2 -2
- package/app/webapp/src/shared/lib/browser/snapshot.ts +107 -7
- package/app/webapp/src/shared/lib/browser/types.ts +1 -0
- package/bin/app/desktopapp/src/shared/args.js +1 -0
- package/bin/src/cli/bangonit.js +35 -25
- package/package.json +2 -1
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/631-0edca788fa58159b.js +0 -36
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/app/app/page-533a30559a8f39fa.js +0 -1
- package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/app/layout-40f50d9380154ecf.js +0 -1
- package/app/webapp/.next/static/chunks/631-0edca788fa58159b.js +0 -36
- package/app/webapp/.next/static/chunks/app/app/page-533a30559a8f39fa.js +0 -1
- package/app/webapp/.next/static/chunks/app/layout-40f50d9380154ecf.js +0 -1
- /package/app/webapp/.next/standalone/app/webapp/.next/static/{kz1a_SRPtSly3Fe8wHKDq → 96Rcgc5VRl40T_EbDikOw}/_buildManifest.js +0 -0
- /package/app/webapp/.next/standalone/app/webapp/.next/static/{kz1a_SRPtSly3Fe8wHKDq → 96Rcgc5VRl40T_EbDikOw}/_ssgManifest.js +0 -0
- /package/app/webapp/.next/static/{kz1a_SRPtSly3Fe8wHKDq → 96Rcgc5VRl40T_EbDikOw}/_buildManifest.js +0 -0
- /package/app/webapp/.next/static/{kz1a_SRPtSly3Fe8wHKDq → 96Rcgc5VRl40T_EbDikOw}/_ssgManifest.js +0 -0
package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/app/app/page-4c6dfbf12230aab7.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[191],{6421:function(e,t,n){Promise.resolve().then(n.bind(n,5274))},5274:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return V}});var a=n(7573),r=n(7653),i=n(774),o=n(1446),l=n(2574),s=n(3334);function c(e,t,n,a){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1;if(r<=0)return;e.save(),e.globalAlpha=r;let i=a?.8:1;e.save(),e.translate(t-2,n-1),e.scale(28/24*i,28/24*i);let o=new Path2D("M5 3l14 8.5-6.5 1.5-3.5 6z");e.shadowColor="rgba(0,0,0,0.5)",e.shadowBlur=2,e.shadowOffsetY=1,e.fillStyle="white",e.strokeStyle="black",e.lineWidth=1.5,e.lineJoin="round",e.fill(o),e.stroke(o),e.restore(),e.restore()}function u(e,t,n,a){a>=1||(e.save(),e.beginPath(),e.arc(t,n,24*a,0,2*Math.PI),e.fillStyle="rgba(96, 165, 250, ".concat(.8*(1-a),")"),e.fill(),e.restore(),e.save(),e.beginPath(),e.arc(t,n,32*a,0,2*Math.PI),e.strokeStyle="rgba(96, 165, 250, ".concat(.9*(1-a),")"),e.lineWidth=2,e.stroke(),e.restore())}function d(e){let{agentId:t}=e,n=(0,r.useRef)(null),i=(0,r.useRef)({x:0,y:0,clicking:!1,lastActiveTs:0,hasPos:!1,ripples:[],rafId:0}),o=(0,r.useCallback)(()=>{i.current.lastActiveTs=Date.now()},[]);return(0,r.useEffect)(()=>{let e=n.current;if(!e)return;let t=e.getContext("2d"),a=window.devicePixelRatio||1,r=()=>{let n=e.parentElement;if(!n)return;let r=n.clientWidth,i=n.clientHeight;e.width=r*a,e.height=i*a,e.style.width=r+"px",e.style.height=i+"px",t.setTransform(a,0,0,a,0,0)};r();let o=new ResizeObserver(r);o.observe(e.parentElement);let l=()=>{let n=i.current,r=e.width/a,o=e.height/a;if(t.clearRect(0,0,r,o),n.hasPos){let e=Date.now(),a=e-n.lastActiveTs;for(let a=n.ripples.length-1;a>=0;a--){let r=n.ripples[a],i=e-r.startTs;if(i>=400){n.ripples.splice(a,1);continue}u(t,r.x,r.y,i/400)}c(t,n.x,n.y,n.clicking,a<2e3?1:Math.max(0,1-(a-2e3)/400))}i.current.rafId=requestAnimationFrame(l)},s=i.current;return s.rafId=requestAnimationFrame(l),()=>{cancelAnimationFrame(s.rafId),o.disconnect()}},[]),(0,r.useEffect)(()=>{var e,n,a;let r=[],l=i.current,s=null===(e=window.bangonit)||void 0===e?void 0:e.onCursorMove(e=>{e.agentId===t&&(l.x=e.x,l.y=e.y,l.hasPos=!0,o())});s&&r.push(s);let c=null===(n=window.bangonit)||void 0===n?void 0:n.onCursorDown(e=>{e.agentId===t&&(l.x=e.x,l.y=e.y,l.hasPos=!0,l.clicking=!0,l.ripples.push({x:e.x,y:e.y,startTs:Date.now()}),o())});c&&r.push(c);let u=null===(a=window.bangonit)||void 0===a?void 0:a.onCursorUp(e=>{e.agentId===t&&(l.clicking=!1,o())});return u&&r.push(u),()=>{r.forEach(e=>null==e?void 0:e())}},[t,o]),(0,a.jsx)("canvas",{ref:n,className:"pointer-events-none absolute inset-0 z-20"})}var h=n(7077);let p=new Map;async function m(e){let t=new TextEncoder().encode(e);return Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256",t))).map(e=>e.toString(16).padStart(2,"0")).join("")}async function w(e,t,n,a,r){let i;let[{result:o},l,s,{result:c}]=await Promise.all([window.bangonit.cdpSend(e,"Runtime.evaluate",{expression:"\n(function() {\n var MAX_CHARS = 60000;\n var MAX_ELEMENTS = 5000;\n var MAX_DEPTH = 1500;\n var totalChars = 0;\n var visited = 0;\n var truncated = false;\n\n // Stable ref IDs: persist a WeakMap keyed by DOM element across snapshots.\n // Elements that survive between renders keep the same ref ID.\n // Removed elements get garbage collected from the WeakMap.\n if (!window.__dmjRefIds) window.__dmjRefIds = new WeakMap();\n if (!window.__dmjRefCounter) window.__dmjRefCounter = 0;\n window.__dmjRefs = new Map();\n\n var SKIP_TAGS = {SCRIPT:1,STYLE:1,NOSCRIPT:1,SVG:1,PATH:1,META:1,LINK:1,TEMPLATE:1,IFRAME:1,BR:1,HR:1,WBR:1,CANVAS:1,VIDEO:1,AUDIO:1,MAP:1,AREA:1,PICTURE:1,SOURCE:1,TRACK:1,OBJECT:1,EMBED:1};\n var INTERACTIVE_ROLES = {button:1,link:1,textbox:1,checkbox:1,radio:1,combobox:1,menuitem:1,tab:1,switch:1,option:1};\n var INPUT_ROLE = {checkbox:'checkbox',radio:'radio',submit:'button',button:'button',search:'searchbox',file:'file'};\n var TAG_ROLE = {A:'link',BUTTON:'button',SELECT:'combobox',TEXTAREA:'textbox',IMG:'img',H1:'heading',H2:'heading',H3:'heading',H4:'heading',H5:'heading',H6:'heading',NAV:'navigation',MAIN:'main',FORM:'form',TABLE:'table',UL:'list',OL:'list',LI:'listitem'};\n\n function isVisible(el) {\n if (el.hidden || el.getAttribute('aria-hidden') === 'true') return false;\n if (!el.offsetParent && el.tagName !== 'BODY' && el.tagName !== 'HTML') {\n var pos = getComputedStyle(el).position;\n if (pos !== 'fixed' && pos !== 'sticky') return false;\n }\n var s = el.style;\n if (s.display === 'none' || s.visibility === 'hidden') return false;\n return true;\n }\n\n function isInteractive(el) {\n var tag = el.tagName;\n if (tag === 'A' || tag === 'BUTTON' || tag === 'SELECT' || tag === 'TEXTAREA') return true;\n if (tag === 'INPUT' && el.type !== 'hidden') return true;\n var role = el.getAttribute('role');\n if (role && INTERACTIVE_ROLES[role]) return true;\n var tabindex = el.getAttribute('tabindex');\n if (el.onclick || (tabindex !== null && tabindex >= '0')) return true;\n if (el.contentEditable === 'true') return true;\n if (getComputedStyle(el).cursor === 'pointer') return true;\n return false;\n }\n\n function getRole(el) {\n var r = el.getAttribute('role');\n if (r) return r;\n if (el.tagName === 'INPUT') return INPUT_ROLE[(el.type||'text').toLowerCase()] || 'textbox';\n return TAG_ROLE[el.tagName] || null;\n }\n\n function getLabel(el) {\n return (el.getAttribute('aria-label') || el.getAttribute('placeholder') || el.getAttribute('alt') || el.getAttribute('title') || '').slice(0, 50);\n }\n\n function directText(el) {\n var t = '';\n for (var n = el.firstChild; n; n = n.nextSibling) {\n if (n.nodeType === 3) t += n.data;\n if (t.length > 60) break;\n }\n return t.trim().replace(/\\s+/g, ' ').slice(0, 60);\n }\n\n function walk(el, depth) {\n if (truncated || !el || el.nodeType !== 1) return '';\n if (SKIP_TAGS[el.tagName]) return '';\n if (!isVisible(el)) return '';\n if (depth > MAX_DEPTH) return '';\n if (++visited > MAX_ELEMENTS) { truncated = true; return ''; }\n\n var role = getRole(el);\n var interactive = isInteractive(el);\n var showThis = !!(role || interactive);\n var lines = [];\n\n if (showThis) {\n var label = getLabel(el);\n var dtext = directText(el);\n var line = '[' + (role || el.tagName.toLowerCase());\n var txt = label || dtext;\n if (txt) line += ' \"' + txt.replace(/\"/g, \"'\") + '\"';\n if (interactive) {\n var ref = window.__dmjRefIds.get(el);\n if (!ref) {\n ref = 'e' + (++window.__dmjRefCounter);\n window.__dmjRefIds.set(el, ref);\n }\n window.__dmjRefs.set(ref, new WeakRef(el));\n line += ' ref=' + ref;\n }\n line += ']';\n if (el === document.activeElement) line += ' [focused]';\n if ((el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') && el.value) line += ' val=\"' + el.value.slice(0,40) + '\"';\n if (el.tagName === 'INPUT' && (el.type === 'checkbox' || el.type === 'radio')) line += el.checked ? ' [x]' : ' [ ]';\n\n totalChars += line.length;\n if (totalChars > MAX_CHARS) { truncated = true; return ''; }\n lines.push(line);\n }\n\n for (var c = el.firstElementChild; c; c = c.nextElementSibling) {\n if (truncated) break;\n var out = walk(c, showThis ? depth + 1 : depth);\n if (out) lines.push(showThis ? out.split('\\n').map(function(l){return ' '+l}).join('\\n') : out);\n }\n\n if (!showThis) {\n var dt = directText(el);\n if (dt.length > 2) {\n totalChars += dt.length;\n if (totalChars > MAX_CHARS) { truncated = true; return ''; }\n lines.push('\"' + dt + '\"');\n }\n }\n\n return lines.join('\\n');\n }\n\n var tree = walk(document.body, 0);\n var h = 'URL: ' + location.href + '\\nTitle: ' + document.title;\n if (truncated) h += '\\n[TRUNCATED - page too large]';\n return h + '\\n\\n' + tree;\n})()\n",returnByValue:!0}),window.bangonit.getDownloads(e),window.bangonit.getFileChooserState(e),window.bangonit.cdpSend(e,"Runtime.evaluate",{expression:"JSON.stringify({w:window.innerWidth,h:window.innerHeight})",returnByValue:!0})]),u=(()=>{try{return JSON.parse(c.value)}catch(e){return null}})(),d=u?"\nViewport: ".concat(u.w,"x").concat(u.h):"",w=o.value||"Empty page",f=w.indexOf("\n\n"),g=f>=0?w.slice(0,f):w,b=f>=0?w.slice(f+2):"",v=g.match(/^URL: (.+)$/m),x=v?v[1]:"",y=g+"\n\nMouse position: ".concat(t,",").concat(n).concat(d)+a;if(s.open&&(y+="\n\n[File picker is open — use upload action with paths to select files, or cancel: true to dismiss]"),l.length>0){let e=l.map(e=>"- ".concat(e.filename," (").concat(e.bytes," bytes) [").concat(e.state,"]"));y+="\n\nDownloads:\n".concat(e.join("\n"))}let k=await m(b),I=p.get(e);if(r||!I)i=b;else if(k===I.treeHash)i="[snapshot unchanged since last observation]";else if(x!==I.url)i=b;else{let e=function(e,t){let n=(0,h.sG)("","",e,t,void 0,void 0,{context:3,maxEditLength:500,timeout:200});if(!n)return null;if(0===n.hunks.length)return"";let a=0,r=[];for(let e of n.hunks)for(let t of(r.push("@@ -".concat(e.oldStart,",").concat(e.oldLines," +").concat(e.newStart,",").concat(e.newLines," @@")),e.lines))r.push(t),("+"===t[0]||"-"===t[0])&&a++;return"[snapshot diff — ".concat(a," lines changed]\n")+r.join("\n")}(I.tree,b);i=e&&e.length<.7*b.length?e:b}return p.set(e,{treeHash:k,tree:b,url:x}),y+"\n\n"+i}async function f(e,t,n){let a=window.bangonit;if(t.ref){let{result:i}=await a.cdpSend(e,"Runtime.evaluate",{expression:'(function() { var r = window.__dmjRefs && window.__dmjRefs.get("'.concat(t.ref,'"); return r ? r.deref() || null : null; })()'),returnByValue:!1});if(!i.objectId)throw Error('Element ref "'.concat(t.ref,'" not found — take a new snapshot'));try{let{model:r}=await a.cdpSend(e,"DOM.getBoxModel",{objectId:i.objectId}),o=r.content,l=Math.round((o[0]+o[2]+o[4]+o[6])/4),s=Math.round((o[1]+o[3]+o[5]+o[7])/4);if(n){let{result:t}=await a.cdpSend(e,"Runtime.evaluate",{expression:"JSON.stringify({ w: window.innerWidth, h: window.innerHeight })",returnByValue:!0}),n=JSON.parse(t.value);if(l<0||l>n.w||s<0||s>n.h){await a.cdpSend(e,"Runtime.callFunctionOn",{objectId:i.objectId,functionDeclaration:'function() { this.scrollIntoView({ block: "center", inline: "center", behavior: "instant" }); }',returnByValue:!0}),await new Promise(e=>setTimeout(e,100));let{model:t}=await a.cdpSend(e,"DOM.getBoxModel",{objectId:i.objectId}),n=t.content;l=Math.round((n[0]+n[2]+n[4]+n[6])/4),s=Math.round((n[1]+n[3]+n[5]+n[7])/4)}}else if(l<0||s<0){let{result:n}=await a.cdpSend(e,"Runtime.callFunctionOn",{objectId:i.objectId,functionDeclaration:"function() {\n var r = this.getBoundingClientRect();\n return { top: r.top, bottom: r.bottom, left: r.left, right: r.right, vh: window.innerHeight, vw: window.innerWidth };\n }",returnByValue:!0}),r=n.value;if(r){let e=r.top<0?Math.round(r.top-100):r.bottom>r.vh?Math.round(r.bottom-r.vh+100):0,n=0!==e?" Scroll ".concat(e>0?"down":"up"," ~").concat(Math.abs(e),"px (wheel dy=").concat(e," at current mouse position)"):"";throw Error('Element ref "'.concat(t.ref,'" is not in the viewport and cannot auto-scroll because this batch contains x,y coordinates that would be invalidated by scrolling.').concat(n))}}return{x:l,y:s}}catch(o){var r;if(null===(r=o.message)||void 0===r?void 0:r.includes("not in the viewport"))throw o;if(n)try{await a.cdpSend(e,"Runtime.callFunctionOn",{objectId:i.objectId,functionDeclaration:'function() { this.scrollIntoView({ block: "center", inline: "center", behavior: "instant" }); }',returnByValue:!0}),await new Promise(e=>setTimeout(e,100));let{model:t}=await a.cdpSend(e,"DOM.getBoxModel",{objectId:i.objectId}),n=t.content;return{x:Math.round((n[0]+n[2]+n[4]+n[6])/4),y:Math.round((n[1]+n[3]+n[5]+n[7])/4)}}catch(e){throw Error('Element ref "'.concat(t.ref,'" could not be scrolled into view'))}try{let{result:n}=await a.cdpSend(e,"Runtime.callFunctionOn",{objectId:i.objectId,functionDeclaration:"function() {\n var r = this.getBoundingClientRect();\n return { top: r.top, bottom: r.bottom, left: r.left, right: r.right, vh: window.innerHeight, vw: window.innerWidth };\n }",returnByValue:!0}),r=n.value;if(r){let e=r.top<0?Math.round(r.top-100):r.bottom>r.vh?Math.round(r.bottom-r.vh+100):0,n=0!==e?" Scroll ".concat(e>0?"down":"up"," ~").concat(Math.abs(e),"px (wheel dy=").concat(e," at current mouse position)"):"";throw Error('Element ref "'.concat(t.ref,'" is not in the viewport and cannot auto-scroll because this batch contains x,y coordinates that would be invalidated by scrolling.').concat(n))}}catch(e){if(e.message.includes("not in the viewport"))throw e}throw Error('Element ref "'.concat(t.ref,'" is not visible in the viewport — use only refs or scroll manually first'))}finally{a.cdpSend(e,"Runtime.releaseObject",{objectId:i.objectId}).catch(e=>console.error(e))}}return{x:t.x,y:t.y}}async function g(e,t,n,a,r,i){let o=window.bangonit,l=Math.hypot(a-t,r-n);if(l<1){null==i||i(a,r);return}let s=Math.min(Math.max(Math.round(l/15),3),40),c=Math.min(Math.max(.8*l,30),300);for(let l=1;l<=s;l++){let u=l/s,d=u<.5?4*u*u*u:1-Math.pow(-2*u+2,3)/2,h=Math.round(t+(a-t)*d),p=Math.round(n+(r-n)*d);await o.cdpSend(e,"Input.dispatchMouseEvent",{type:"mouseMoved",x:h,y:p}),null==i||i(h,p),l<s&&await new Promise(e=>setTimeout(e,c/s))}}async function b(e,t,n,a,r){var i,o,l,s,c,u,d,h;let p=window.bangonit;null===(i=r.onMouseLock)||void 0===i||i.call(r);let m=!t.some(e=>"wait"!==e.action&&void 0!==e.x),w=n,b=a;try{let n=[];for(let a of t){if("wait"===a.action){await new Promise(e=>setTimeout(e,Math.min(a.ms||100,2e3))),n.push("wait(".concat(a.ms||100,"ms)"));continue}let t=a.ref?{ref:a.ref}:{x:a.x,y:a.y},i=await f(e,t,m),h="".concat(i.x,",").concat(i.y),{x:v,y:x}=i;switch(a.action){case"down":await g(e,w,b,v,x,r.onCursorMove),w=v,b=x,null===(o=r.onCursorDown)||void 0===o||o.call(r,v,x),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mousePressed",x:v,y:x,button:"left",clickCount:1}),n.push("down(".concat(h,")"));break;case"move":await g(e,w,b,v,x,r.onCursorMove),w=v,b=x,n.push("move(".concat(h,")"));break;case"up":await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mouseReleased",x:v,y:x,button:"left",clickCount:1}),null===(l=r.onCursorUp)||void 0===l||l.call(r,v,x),n.push("up(".concat(h,")"));break;case"click":await g(e,w,b,v,x,r.onCursorMove),w=v,b=x,null===(s=r.onCursorDown)||void 0===s||s.call(r,v,x),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mousePressed",x:v,y:x,button:"left",clickCount:1}),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mouseReleased",x:v,y:x,button:"left",clickCount:1}),null===(c=r.onCursorUp)||void 0===c||c.call(r,v,x),n.push("click(".concat(h,")"));break;case"dblclick":await g(e,w,b,v,x,r.onCursorMove),w=v,b=x,null===(u=r.onCursorDown)||void 0===u||u.call(r,v,x),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mousePressed",x:v,y:x,button:"left",clickCount:1}),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mouseReleased",x:v,y:x,button:"left",clickCount:1}),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mousePressed",x:v,y:x,button:"left",clickCount:2}),await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mouseReleased",x:v,y:x,button:"left",clickCount:2}),null===(d=r.onCursorUp)||void 0===d||d.call(r,v,x),n.push("dblclick(".concat(h,")"));break;case"wheel":{await g(e,w,b,v,x,r.onCursorMove),w=v,b=x;let t=a.dx||0,i=a.dy||0;await p.cdpSend(e,"Input.dispatchMouseEvent",{type:"mouseWheel",x:v,y:x,deltaX:t,deltaY:i}),n.push("wheel(".concat(h,",").concat(t,",").concat(i,")"))}}}return{result:"Mouse: ".concat(n.join(" → ")),mouseX:w,mouseY:b}}finally{null===(h=r.onMouseUnlock)||void 0===h||h.call(r)}}async function v(e,t){let n=window.bangonit;for(let a of t)await n.sendInputEvent(e,{type:"keyDown",keyCode:a}),await n.sendInputEvent(e,{type:"char",keyCode:a}),await n.sendInputEvent(e,{type:"keyUp",keyCode:a}),await new Promise(e=>setTimeout(e,30+70*Math.random()));return'Typed "'.concat(t.slice(0,50),'"')}async function x(e,t){let n=window.bangonit,a=t.split("+"),r=a.pop(),i=a.map(e=>e.toLowerCase()),o=[];for(let e of i)"control"===e||"ctrl"===e?o.push("control"):"meta"===e||"command"===e||"cmd"===e?o.push("meta"):"alt"===e||"option"===e?o.push("alt"):"shift"===e&&o.push("shift");return await n.sendInputEvent(e,{type:"keyDown",keyCode:r,modifiers:o}),0===o.length&&("Enter"===r?await n.sendInputEvent(e,{type:"char",keyCode:"\r"}):1===r.length&&await n.sendInputEvent(e,{type:"char",keyCode:r})),await n.sendInputEvent(e,{type:"keyUp",keyCode:r,modifiers:o}),"Pressed ".concat(t)}let y=new Map;async function k(e){let t=new TextEncoder().encode(e);return Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256",t))).map(e=>e.toString(16).padStart(2,"0")).join("")}async function I(e,t){let n;let a=window.bangonit;try{n=await a.capturePage(e)}catch(e){throw Error("could not capture page (page may be navigating)")}let{activeTabId:r}=await a.getTabInfo(e),i="".concat(e,":").concat(null!=r?r:0),o=await k(n);return t||y.get(i)!==o?(y.set(i,o),{type:"changed",base64:n}):{type:"not_changed"}}async function T(e,t){let n=window.bangonit;t.startsWith("http://")||t.startsWith("https://")||(t="https://"+t);let{url:a}=await n.loadURL(e,t);return"Navigated to ".concat(a)}async function N(e){let{ok:t,url:n,reason:a}=await window.bangonit.goBack(e);return t?"Navigated back to ".concat(n):"Cannot go back — ".concat(a)}async function C(e){let{ok:t,url:n,reason:a}=await window.bangonit.goForward(e);return t?"Navigated forward to ".concat(n):"Cannot go forward — ".concat(a)}async function j(e,t){let n=window.bangonit,a=t.action;switch(a){case"list":{let{tabs:t,activeTabId:a}=await n.getTabInfo(e);if(!t.length)return"No tabs open";return t.map(e=>{let t=e.tabId===a?" (active)":"",n=e.isPopup?" (popup)":"";return"Tab ".concat(e.tabId,": ").concat(e.title||"(untitled)"," — ").concat(e.url).concat(t).concat(n)}).join("\n")}case"new":{await n.requestNewTab(e,t.url||"about:blank"),await new Promise(e=>setTimeout(e,3e3));let{activeTabId:a}=await n.getTabInfo(e);return"Opened new tab".concat(t.url?": "+t.url:"",". Active tab is now ").concat(a,".")}case"select":{let a=t.tabId;if(void 0===a)return"Error: tabId required for select";let{tabs:r}=await n.getTabInfo(e);if(!r.find(e=>e.tabId===a))return"Error: tab ".concat(a,' not found. Use browser_tabs with action "list" to see available tabs.');await n.setActiveTab(e,a),await n.requestSelectTab(e,a);let i=r.find(e=>e.tabId===a);return"Switched to tab ".concat(a,": ").concat(null==i?void 0:i.url)}case"close":{var r;let{tabs:a,activeTabId:i}=await n.getTabInfo(e),o=null!==(r=t.tabId)&&void 0!==r?r:i;if(null===o)return"Error: no tab to close";if(!a.find(e=>e.tabId===o))return"Error: tab ".concat(o," not found.");if(a.length<=1)return"Cannot close the last tab.";return await n.requestCloseTab(e,o),"Closed tab ".concat(o)}default:return'Error: unknown tab action "'.concat(a,'". Use list, new, select, or close.')}}async function E(e){let{tabs:t,activeTabId:n}=await window.bangonit.getTabInfo(e);return t.length<=1?"":"\n\nOpen tabs:\n"+t.map(e=>{let t=e.tabId===n?" (active)":"",a=e.isPopup?" (popup)":"";return" Tab ".concat(e.tabId,": ").concat(e.title||"(untitled)"," — ").concat(e.url).concat(t).concat(a)}).join("\n")}async function S(e,t){let n=window.bangonit,a=Math.min(Math.max((null==t?void 0:t.timeout)||10,.1),30),r=null==t?void 0:t.text,i="visible"===((null==t?void 0:t.state)||"visible");if(!r)return await new Promise(e=>setTimeout(e,1e3*a)),"Waited ".concat(a," seconds");let o=Date.now()+1e3*a;for(;Date.now()<o;){let{result:t}=await n.cdpSend(e,"Runtime.evaluate",{expression:"document.body.innerText.includes(".concat(JSON.stringify(r),")"),returnByValue:!0}),a=t.value;if(i&&a)return'Text "'.concat(r,'" is now visible on the page.');if(!i&&!a)return'Text "'.concat(r,'" is no longer visible on the page.');await new Promise(e=>setTimeout(e,500))}return'Timeout: text "'.concat(r,'" ').concat(i?"did not appear":"did not disappear"," within ").concat(a,"s.")}class R{start(){!this.cleanup&&window.bangonit&&(this.cleanup=window.bangonit.onCdpEvent(e=>{"Network.requestWillBeSent"===e.method?this.inflightRequests++:("Network.loadingFinished"===e.method||"Network.loadingFailed"===e.method)&&(this.inflightRequests=Math.max(0,this.inflightRequests-1))}))}stop(){var e;null===(e=this.cleanup)||void 0===e||e.call(this),this.cleanup=null,this.inflightRequests=0}async waitForIdle(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:500,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2e3,n=Date.now()+t,a=0===this.inflightRequests?Date.now():null;for(;Date.now()<n;){if(0===this.inflightRequests){if(a||(a=Date.now()),Date.now()-a>=e)return}else a=null;await new Promise(e=>setTimeout(e,50))}}constructor(){this.inflightRequests=0,this.cleanup=null}}let M={navigate:"browser_navigate",back:"browser_navigate_back",forward:"browser_go_forward",mouse:"browser_mouse",type:"browser_type",press:"browser_press_key",tabs:"browser_tabs",upload:"browser_upload",wait:"browser_wait_for",close:"browser_close"};var z=n(8204);let P=z.VK("type",[z.Ry({type:z.i0("not_changed")}),z.Ry({type:z.i0("changed"),base64:z.Z_()})]);z.Ry({textOutput:z.Z_(),imageOutput:P.nullable()});let A=Promise.resolve();class _{destroy(){this.networkTracker.stop()}enableRecording(e){this.recorder=e}cursorCallbacks(){let e=this.agentId,t=window.bangonit,n=this.recorder;return{onCursorMove:(a,r)=>{t.emitCursorMove(e,a,r),null==n||n.updateCursor(a,r)},onCursorDown:(a,r)=>{t.emitCursorDown(e,a,r),null==n||n.setCursorDown()},onCursorUp:(a,r)=>{t.emitCursorUp(e,a,r),null==n||n.setCursorUp()},onMouseLock:()=>t.emitMouseLock(e),onMouseUnlock:()=>t.emitMouseUnlock(e)}}async callTool(e,t){switch(e){case"browser_navigate":return T(this.agentId,t.url);case"browser_navigate_back":return N(this.agentId);case"browser_go_forward":return C(this.agentId);case"browser_mouse":{let{result:e,mouseX:n,mouseY:a}=await b(this.agentId,t.steps,this.mouseX,this.mouseY,this.cursorCallbacks());return this.mouseX=n,this.mouseY=a,e}case"browser_type":return v(this.agentId,t.text);case"browser_press_key":return x(this.agentId,t.key);case"browser_close":return j(this.agentId,{action:"close"});case"browser_upload":{var n;if(t.cancel){let e=await window.bangonit.handleFileChooser(this.agentId,"cancel");if(!e.ok)return"Error: ".concat(e.error);return"File picker cancelled."}if(!(null===(n=t.paths)||void 0===n?void 0:n.length))return"Error: provide paths to upload, or cancel: true";let e=await window.bangonit.handleFileChooser(this.agentId,"accept",t.paths);if(!e.ok)return"Error: ".concat(e.error);return"Uploaded ".concat(t.paths.length," file(s).")}case"browser_wait_for":return S(this.agentId,t);case"browser_tabs":return j(this.agentId,t);default:throw Error("Unknown tool: ".concat(e))}}async exec(e){let t=function(){let e;let t=new Promise(t=>{e=t}),n=A;return A=A.then(()=>t),{promise:n,release:e}}();await t.promise;try{return await this._exec(e)}finally{t.release()}}async _exec(e){let{actions:t,observe:n}=e,a=[],r=null;if(this.recorder)try{var i,o,l;let e=await (null===(i=window.bangonit)||void 0===i?void 0:i.getTabInfo(this.agentId)),t=null!==(l=null==e?void 0:e.activeTabId)&&void 0!==l?l:0,n=null==e?void 0:null===(o=e.tabs)||void 0===o?void 0:o.find(e=>e.tabId===t);await this.recorder.startClip(t,null==n?void 0:n.url)}catch(e){console.warn("Failed to start recording clip:",e)}for(let e=0;e<t.length;e++){let n=t[e];if(!n||!n.action)continue;let r=M[n.action];if(!r){a.push("".concat(n.action,": Error — unknown action"));continue}try{let e=this.actionToToolArgs(n),t=await this.callTool(r,e);a.push(t||"OK")}catch(e){a.push("".concat(this.actionLabel(n),": Error — ").concat(e.message))}}t.length>0&&await this.networkTracker.waitForIdle(500,2e3);try{let t=await E(this.agentId),i=await w(this.agentId,this.mouseX,this.mouseY,t,e.forceFull);a.push(i),"snapshot_and_screenshot"===n&&(r=await I(this.agentId,e.forceFull))}catch(e){a.push("observe: Error — ".concat(e.message))}if(this.recorder)try{await this.recorder.stopClip()}catch(e){console.warn("Failed to stop recording clip:",e)}return{textOutput:a.join("\n\n"),imageOutput:r}}actionToToolArgs(e){switch(e.action){case"navigate":return{url:e.url};case"back":case"forward":case"close":default:return{};case"mouse":return{steps:(e.mouseActions||[]).map(e=>{if("wait"===e.action)return{action:"wait",ms:e.ms||100};let t=e.ref?{ref:e.ref}:{x:e.x,y:e.y};return"wheel"===e.action?{action:"wheel",...t,dx:e.dx||0,dy:e.dy||0}:{action:e.action,...t}})};case"type":return{text:e.text};case"press":return{key:e.key};case"upload":return{paths:e.paths,cancel:e.cancel};case"tabs":return{action:e.tabAction,tabId:e.tabId,url:e.url};case"wait":return{timeout:e.timeout}}}actionLabel(e){switch(e.action){case"navigate":return"navigate ".concat(e.url);case"mouse":{let t=(e.mouseActions||[]).map(e=>"wait"===e.action?"wait ".concat(e.ms,"ms"):"wheel"===e.action?"wheel ".concat(e.x,",").concat(e.y," ").concat(e.dx,",").concat(e.dy):"".concat(e.action," ").concat(e.x,",").concat(e.y)).join(" → ");return"mouse ".concat(t)}case"type":return'type "'.concat((e.text||"").slice(0,30),'"');case"press":return"press ".concat(e.key);case"upload":return e.cancel?"upload cancel":"upload ".concat((e.paths||[]).join(", "));case"tabs":return"tabs ".concat(e.tabAction).concat(e.tabId?" "+e.tabId:"");case"wait":return"wait ".concat(e.timeout||10,"s");default:return e.action}}constructor(e){this.mouseX=0,this.mouseY=0,this.networkTracker=new R,this.recorder=null,this.agentId=e,this.networkTracker.start()}}class D{async captureFrame(){let e=window.bangonit;try{let t=await e.capturePage(this.agentId),{result:n}=await e.cdpSend(this.agentId,"Runtime.evaluate",{expression:"JSON.stringify({w:window.innerWidth,h:window.innerHeight})",returnByValue:!0}),a=JSON.parse(n.value);this.currentFrames.push({imageData:t,cursor:{...this.cursorPos},clicking:this.clicking,ts:Date.now(),sessionId:0,deviceWidth:a.w,deviceHeight:a.h,scrollOffsetX:0,scrollOffsetY:0})}catch(e){console.warn("Failed to capture frame:",e)}}async startClip(e,t){this.currentUrl=t||"",this.recording&&await this.cancelClip(),this.recording=!0,this.currentTabId=e,this.currentFrames=[],this.cursorTrail=[],this.clipStartTime=Date.now(),await this.captureFrame();let n=window.bangonit;this.cdpCleanup=n.onCdpEvent(e=>{if(e.agentId!==this.agentId||"Page.screencastFrame"!==e.method||!this.recording)return;let{data:t,metadata:a,sessionId:r}=e.params;this.currentFrames.push({imageData:t,cursor:{...this.cursorPos},clicking:this.clicking,ts:Date.now(),sessionId:r,deviceWidth:(null==a?void 0:a.deviceWidth)||0,deviceHeight:(null==a?void 0:a.deviceHeight)||0,scrollOffsetX:(null==a?void 0:a.scrollOffsetX)||0,scrollOffsetY:(null==a?void 0:a.scrollOffsetY)||0}),n.cdpSend(this.agentId,"Page.screencastFrameAck",{sessionId:r}).catch(e=>console.error(e))}),await n.cdpSend(this.agentId,"Page.startScreencast",{format:"png",quality:100,maxWidth:1920,maxHeight:1080})}async stopClip(){if(!this.recording)return null;await this.captureFrame(),this.recording=!1;let e=Date.now();await window.bangonit.cdpSend(this.agentId,"Page.stopScreencast").catch(e=>console.error(e)),this.cdpCleanup&&(this.cdpCleanup(),this.cdpCleanup=null);let t=this.currentFrames;if(this.currentFrames=[],0===t.length)return null;let n=await this.compositeAndEncode(t);if(!n||0===n.size)return null;let a=new Uint8Array(await n.arrayBuffer()),r="";for(let e=0;e<a.length;e++)r+=String.fromCharCode(a[e]);let i=btoa(r),o={agentId:this.agentId,tabId:this.currentTabId,index:this.clips.length,startTime:this.clipStartTime,endTime:e,url:this.currentUrl||void 0,data:i};return this.clips.push(o),{meta:o}}async cancelClip(){var e;this.recording=!1,this.currentFrames=[],this.cursorTrail=[],this.cdpCleanup&&(this.cdpCleanup(),this.cdpCleanup=null),await (null===(e=window.bangonit)||void 0===e?void 0:e.cdpSend(this.agentId,"Page.stopScreencast").catch(e=>console.error(e)))}async compositeAndEncode(e){if(0===e.length)return null;let t=await this.decodeFrame(e[0].imageData);if(!t)return null;let n=t.width,a=t.height,r=document.createElement("canvas");r.width=n,r.height=a;let i=r.getContext("2d"),o=r.captureStream(0),l=o.getVideoTracks()[0],s=new MediaRecorder(o,{mimeType:"video/webm;codecs=vp8",videoBitsPerSecond:8e6}),d=[];s.ondataavailable=e=>{e.data.size>0&&d.push(e.data)};let h=new Promise(e=>{s.onstop=()=>{e(new Blob(d,{type:"video/webm"}))}});s.start();let p=[],m=this.cursorTrail,w=0,f=(e,t,r,o,s,d,h)=>{let m=t*d,w=r*h;o&&(!p.length||p[p.length-1].x!==m||p[p.length-1].y!==w)&&p.push({x:m,y:w,startTs:s}),i.clearRect(0,0,n,a),i.drawImage(e,0,0,n,a);for(let e=p.length-1;e>=0;e--){let t=p[e],n=s-t.startTs;if(n>=400){p.splice(e,1);continue}u(i,t.x,t.y,n/400)}c(i,m,w,o),l&&"function"==typeof l.requestFrame&&l.requestFrame()};for(let r=0;r<e.length;r++){let i=e[r],o=0===r?t:await this.decodeFrame(i.imageData);if(!o)continue;let l=i.deviceWidth>0?n/i.deviceWidth:1,s=i.deviceHeight>0?a/i.deviceHeight:1,c=r<e.length-1?e[r+1].ts:i.ts+100;for(f(o,i.cursor.x,i.cursor.y,i.clicking,i.ts,l,s);w<m.length&&m[w].ts<=i.ts;)w++;let u=i.ts;for(;w<m.length&&m[w].ts<c;){let e=m[w],t=e.ts-u;t>0&&await new Promise(e=>setTimeout(e,Math.min(t,16))),f(o,e.x,e.y,e.clicking,e.ts,l,s),u=e.ts,w++}if(r<e.length-1){let e=c-u;e>0&&await new Promise(t=>setTimeout(t,Math.min(e,100)))}}return await new Promise(e=>setTimeout(e,100)),s.stop(),h}async decodeFrame(e){try{let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);let a=new Blob([n],{type:"image/png"});return createImageBitmap(a)}catch(e){return console.warn("Failed to decode frame:",e),null}}updateCursor(e,t){this.cursorPos={x:e,y:t},this.recording&&this.cursorTrail.push({ts:Date.now(),x:e,y:t,clicking:this.clicking})}setCursorDown(){this.clicking=!0,this.recording&&this.cursorTrail.push({ts:Date.now(),...this.cursorPos,clicking:!0})}setCursorUp(){this.clicking=!1,this.recording&&this.cursorTrail.push({ts:Date.now(),...this.cursorPos,clicking:!1})}getClipsMeta(){return[...this.clips]}constructor(e){this.clips=[],this.currentFrames=[],this.cursorPos={x:0,y:0},this.clicking=!1,this.recording=!1,this.currentTabId=0,this.clipStartTime=0,this.cdpCleanup=null,this.ripples=[],this.cursorTrail=[],this.currentUrl="",this.agentId=e}}function O(e){var t;let{agentId:n,agentName:l,initialPrompt:s,onStatusChange:c,onRerun:u,initialMessages:h,initialTabs:p,initialActiveTabId:m,initialTodos:w,record:f,sessionRecorder:g,onRegisterRecorder:b,planDir:v}=e,[x,y]=(0,r.useState)((null==p?void 0:p.map(e=>({...e,initialUrl:e.url})))||[{id:0,url:"about:blank",title:"",initialUrl:"about:blank"}]),[k,I]=(0,r.useState)(null!=m?m:0),[T,N]=(0,r.useState)(()=>{let e=null==p?void 0:p.find(e=>e.id===(null!=m?m:0));return(null==e?void 0:e.url)||""}),[C,j]=(0,r.useState)(null),[E,S]=(0,r.useState)(!1),[R,M]=(0,r.useState)(!1),z=(0,r.useRef)(new Map),[P,A]=(0,r.useState)(w||[]),O=(0,r.useRef)(null),F=(0,r.useRef)(!1),L=(0,r.useRef)(p?Math.max(...p.map(e=>e.id))+1:1),B=(0,r.useRef)(new Set),[H,W]=(0,r.useState)(0),V=(0,r.useRef)(null),J=(0,r.useRef)(null);!J.current&&window.bangonit&&(J.current=new _(n));let X=(0,r.useRef)(null);f&&!X.current&&J.current&&(X.current=new D(n),J.current.enableRecording(X.current),null==b||b(n,X.current));let q=(0,r.useRef)(g);q.current=g;let Y=(0,r.useMemo)(()=>new o.PD({api:"/api/chat",headers:()=>({"X-Client-Platform":navigator.platform})}),[]),G=(0,r.useRef)(!1),K=(0,r.useCallback)((e,t)=>{var a,r;null===(r=window.bangonit)||void 0===r||null===(a=r.emitAgentOutput)||void 0===a||a.call(r,{agentId:n,type:e,text:t,name:l})},[n,l]),{messages:Z,sendMessage:Q,addToolOutput:$,status:ee,error:et}=(0,i.RJ)({transport:Y,messages:h,sendAutomaticallyWhen:e=>{let{messages:t}=e;return!G.current&&!E&&(0,o.Qk)({messages:t})},async onToolCall(e){var t,a,r,i,o,s,u,d,h;let{toolCall:p}=e;if("report_result"===p.toolName){let e=p.input,d=(null==e?void 0:e.result)==="pass"?"pass":"fail",h=(null==e?void 0:e.summary)||"";if(K("status","".concat(d.toUpperCase(),": ").concat(h)),j({result:d,summary:h}),q.current){q.current.addEvent({ts:Date.now(),agentId:n,type:"result",data:{result:d,summary:h}});try{let e=await (null===(i=window.bangonit)||void 0===i?void 0:null===(r=i.getRunDir)||void 0===r?void 0:r.call(i));if(e){let t=(null===(o=X.current)||void 0===o?void 0:o.getClipsMeta())||[],a=[{id:n,name:l,result:d,summary:h}],r=q.current.toJSON(a,t);await (null===(u=window.bangonit)||void 0===u?void 0:null===(s=u.generateReplayHtml)||void 0===s?void 0:s.call(u,{runDir:e,data:JSON.stringify(r)}))}}catch(e){console.error(e)}}await (null==c?void 0:c(n,"idle",d)),es.current=!0,null===(a=window.bangonit)||void 0===a||null===(t=a.reportTestResult)||void 0===t||t.call(a,{agentId:n,status:d,summary:h}),$({tool:p.toolName,toolCallId:p.toolCallId,output:"Test result recorded: ".concat(d)});return}if("todos"===p.toolName){let e=p.input,t=(null==e?void 0:e.todos)||P;(null==e?void 0:e.todos)&&A(e.todos),$({tool:p.toolName,toolCallId:p.toolCallId,output:JSON.stringify(t)});return}if("browser"===p.toolName){try{let e=p.input,t=((null==e?void 0:e.actions)||[]).map(e=>"navigate"===e.action?"navigate ".concat(e.url):"type"===e.action?'type "'.concat((e.text||"").slice(0,30),'"'):"press"===e.action?"press ".concat(e.key):"mouse"===e.action?"mouse ".concat((e.mouseActions||[]).map(e=>"".concat(e.action," ").concat(e.ref||"".concat(e.x,",").concat(e.y))).join(" > ")):e.action).join(", ");K("tool","browser: ".concat(t).concat((null==e?void 0:e.observe)?" [".concat(e.observe,"]"):"")),null===(d=q.current)||void 0===d||d.addEvent({ts:Date.now(),agentId:n,type:"tool-start",data:{tool:"browser",label:t}});let a=J.current,r=a?await a.exec({actions:(null==e?void 0:e.actions)||[],observe:(null==e?void 0:e.observe)||"snapshot",prompts:null==e?void 0:e.prompts,forceFull:null==e?void 0:e.forceFull}):{error:"Error: browser tools not available"};null===(h=q.current)||void 0===h||h.addEvent({ts:Date.now(),agentId:n,type:"tool-end",data:{tool:"browser"}}),$({tool:p.toolName,toolCallId:p.toolCallId,output:G.current?{error:"[Stopped by user]"}:JSON.stringify(r)})}catch(e){$({tool:p.toolName,toolCallId:p.toolCallId,...G.current?{output:"[Stopped by user]"}:{state:"output-error",errorText:e.message}})}return}}}),en="submitted"===ee||"streaming"===ee;(0,r.useEffect)(()=>{en&&(G.current=!1)},[en]);let ea=Z.length>0,er=null!==C;(0,r.useEffect)(()=>{if(ea&&!V.current&&(V.current=Date.now()),!ea||er)return;let e=setInterval(()=>{V.current&&W(Math.floor((Date.now()-V.current)/1e3))},1e3);return()=>clearInterval(e)},[ea,er]);let ei=(0,r.useRef)(null),eo=(0,r.useRef)(0);(0,r.useEffect)(()=>{var e;if(0===Z.length)return;let t=Z[Z.length-1];if("assistant"!==t.role)return;let n=(null===(e=t.parts)||void 0===e?void 0:e.filter(e=>"text"===e.type).map(e=>e.text).join(""))||"";t.id!==ei.current&&(ei.current=t.id,eo.current=0);let a=n.slice(eo.current);a&&(K("text",a),eo.current=n.length)},[Z,K]);let el=(0,r.useRef)(en),es=(0,r.useRef)(!1);(0,r.useEffect)(()=>{!es.current&&el.current!==en&&(el.current=en,en?null==c||c(n,"running"):(null==c||c(n,"idle",null==C?void 0:C.result),(null==C?void 0:C.result)&&(es.current=!0)))},[en,n,c,C]);let ec=(0,r.useRef)(!1),eu=(0,r.useRef)(null);(0,r.useEffect)(()=>{if(eu.current&&(clearTimeout(eu.current),eu.current=null),!en&&!er&&!E&&!ec.current&&!(Z.length<2))return eu.current=setTimeout(()=>{eu.current=null,ec.current||er||(ec.current=!0,Q({text:"You must call the report_result tool to finalize this test run. Call it now with the result (pass or fail) and a summary."}))},5e3),()=>{eu.current&&clearTimeout(eu.current)}},[en,er,E,Z.length,Q]),(0,r.useEffect)(()=>{var e,t;null===(t=window.bangonit)||void 0===t||null===(e=t.clearPartition)||void 0===e||e.call(t,n)},[n]),(0,r.useEffect)(()=>{q.current&&Z.length>0&&q.current.setMessages(n,Z)},[Z,n]);let ed=(0,r.useCallback)(e=>{var t;let a=L.current++;y(t=>[...t,{id:a,url:"about:blank",title:"",initialUrl:e}]),I(a),N("about:blank"===e?"":e),null===(t=window.bangonit)||void 0===t||t.setActiveTab(n,a)},[n]),eh=(0,r.useCallback)(e=>{y(t=>{let a=t.findIndex(t=>t.id===e);if(-1===a)return t;let r=t.filter(t=>t.id!==e);return 0===r.length?t:(I(t=>{if(t===e){var i;let e=r[Math.max(0,a-1)].id,t=r.find(t=>t.id===e);return t&&N("about:blank"===t.url?"":t.url),null===(i=window.bangonit)||void 0===i||i.setActiveTab(n,e),e}return t}),r)})},[n]),ep=(0,r.useCallback)(e=>{var t;I(e),null===(t=window.bangonit)||void 0===t||t.setActiveTab(n,e),y(t=>{let n=t.find(t=>t.id===e);return n&&N("about:blank"===n.url?"":n.url),t})},[n]),em=(0,r.useRef)(ed),ew=(0,r.useRef)(eh),ef=(0,r.useRef)(ep);em.current=ed,ew.current=eh,ef.current=ep,(0,r.useEffect)(()=>{var e,t,a,r,i;let o=[],l=e=>{e&&o.push(e)};return l(null===(e=window.bangonit)||void 0===e?void 0:e.onTabUpdated(e=>{if(e.agentId!==n)return;let t="about:blank"===e.url,a="about:blank"===e.title;y(n=>n.map(n=>n.id===e.tabId?{...n,...!t&&void 0!==e.url&&{url:e.url},...!a&&void 0!==e.title&&{title:e.title}}:n)),void 0===e.url||t||I(t=>(t===e.tabId&&N(e.url),t))})),l(null===(t=window.bangonit)||void 0===t?void 0:t.onOpenNewTab(e=>{e.agentId===n&&em.current(e.url)})),l(null===(a=window.bangonit)||void 0===a?void 0:a.onPopupOpened(e=>{e.agentId===n&&y(t=>[...t,{id:e.tabId,url:e.url||"about:blank",title:"",initialUrl:e.url||"about:blank",isPopup:!0}])})),l(null===(r=window.bangonit)||void 0===r?void 0:r.onCloseTab(e=>{e.agentId===n&&ew.current(e.tabId)})),l(null===(i=window.bangonit)||void 0===i?void 0:i.onSelectTab(e=>{e.agentId===n&&ef.current(e.tabId)})),()=>o.forEach(e=>null==e?void 0:e())},[n]),(0,r.useEffect)(()=>{F.current||(null==h?void 0:h.length)||(F.current=!0,Q({text:s}))},[s,Q,h]),(0,r.useEffect)(()=>{var e;null===(e=O.current)||void 0===e||e.scrollIntoView({behavior:"smooth"})},[Z]);let eg=(0,r.useCallback)((e,t,a)=>{if(!e)return;z.current.set(t,e);let r=()=>{if(!B.current.has(t))try{var r,i,o;let l=null===(r=e.getWebContentsId)||void 0===r?void 0:r.call(e);l&&(B.current.add(t),null===(i=window.bangonit)||void 0===i||i.registerTab(n,t,l,a,v),t===k&&(null===(o=window.bangonit)||void 0===o||o.setActiveTab(n,t)))}catch(e){console.error(e)}};r(),e.addEventListener("did-attach",r),e.addEventListener("close",()=>ew.current(t)),e._consoleListenerAttached||(e._consoleListenerAttached=!0,e.addEventListener("console-message",e=>{var t,a,r;null===(a=window.bangonit)||void 0===a||null===(t=a.emitConsoleMessage)||void 0===t||t.call(a,{agentId:n,level:e.level,message:e.message,url:e.sourceId||"",line:e.lineNumber||0}),null===(r=q.current)||void 0===r||r.addConsoleLog(n,e.level,e.message,e.sourceId||"",e.lineNumber||0)}))},[n,k]),eb=e=>"".concat(Math.floor(e/60),":").concat((e%60).toString().padStart(2,"0"));return(0,a.jsxs)("div",{className:"flex h-full w-full bg-zinc-950 overflow-hidden",children:[(0,a.jsxs)("div",{className:"flex-1 flex flex-col border-r border-zinc-800 min-w-0",children:[(0,a.jsx)("div",{className:"flex items-center bg-zinc-900 border-b border-zinc-800 overflow-x-auto",children:x.map(e=>(0,a.jsx)("button",{onClick:()=>ep(e.id),className:"flex items-center gap-1.5 px-3 py-2 text-xs border-r border-zinc-800 min-w-0 max-w-[200px] shrink-0\n ".concat(e.id===k?"bg-zinc-800 text-zinc-200":"text-zinc-500 hover:text-zinc-300 hover:bg-zinc-850"),children:(0,a.jsxs)("span",{className:"truncate",children:[e.isPopup?"↗ ":"",e.title||(e.url&&"about:blank"!==e.url?e.url:"New Tab")]})},e.id))}),(0,a.jsx)("div",{className:"flex items-center gap-2 px-3 py-2 bg-zinc-900 border-b border-zinc-800",children:(0,a.jsx)("div",{className:"flex-1 px-3 py-1.5 bg-zinc-800 border border-zinc-700 rounded-lg text-xs text-zinc-400 truncate",children:T||"about:blank"})}),(0,a.jsxs)("div",{className:"flex-1 relative bg-white overflow-hidden",onWheel:e=>e.stopPropagation(),children:[x.map(e=>e.isPopup?e.id===k&&(0,a.jsxs)("div",{className:"absolute inset-0 flex items-center justify-center bg-zinc-900 text-zinc-400 text-sm z-[1]",children:["Popup window open — ",e.title||e.url]},e.id):(0,a.jsx)("webview",{ref:t=>eg(t,e.id,e.initialUrl),src:"about:blank",partition:"agent-".concat(n),allowpopups:"",style:{width:"100%",height:"100%",position:"absolute",backgroundColor:"white",top:0,left:0,pointerEvents:e.id===k?"auto":"none",zIndex:e.id===k?1:0}},e.id)),!(null===(t=x.find(e=>e.id===k))||void 0===t?void 0:t.isPopup)&&(0,a.jsx)(d,{agentId:n}),!er&&(0,a.jsx)("div",{className:"absolute inset-0 z-10 cursor-not-allowed"})]})]}),(0,a.jsxs)("div",{className:"w-[420px] flex flex-col h-full shrink-0",children:[(0,a.jsxs)("div",{className:"flex items-center px-4 py-3 border-b border-zinc-800",children:[(0,a.jsx)("h2",{className:"text-sm font-medium text-zinc-300",children:l}),(0,a.jsx)("div",{className:"flex-1"})]}),C&&(0,a.jsxs)("div",{className:"px-4 py-2 text-sm border-b flex items-center gap-3 ".concat("pass"===C.result?"bg-green-950/30 border-green-900/50":"bg-red-950/30 border-red-900/50"),children:[(0,a.jsx)("span",{className:"font-medium ".concat("pass"===C.result?"text-green-400":"text-red-400"),children:"pass"===C.result?"PASSED":"FAILED"}),(0,a.jsx)("span",{className:"text-zinc-500 text-xs",children:eb(H)}),C.summary&&(0,a.jsx)("span",{className:"text-zinc-400 text-xs truncate flex-1",children:C.summary})]}),P.length>0&&(0,a.jsx)("div",{className:"text-xs space-y-1 px-4 py-2 border-b border-zinc-800 bg-zinc-900/80 shrink-0 max-h-48 overflow-y-auto",children:P.map((e,t)=>(0,a.jsxs)("div",{className:"flex items-center gap-2 ".concat("completed"===e.status?"text-zinc-500":"text-zinc-300"),children:[(0,a.jsx)("span",{className:"shrink-0",children:"completed"===e.status?"✓":"in_progress"===e.status?(0,a.jsx)("span",{className:"inline-block w-2 h-2 bg-blue-500 rounded-full animate-pulse"}):"○"}),(0,a.jsx)("span",{className:"completed"===e.status?"line-through":"",children:e.content})]},t))}),(0,a.jsxs)("div",{className:"flex-1 overflow-y-auto px-4 py-4 space-y-3",children:[Z.map(e=>(0,a.jsx)(U,{message:e,agentName:l},e.id)),et&&(0,a.jsx)("div",{className:"text-sm px-3 py-2 bg-red-950/30 border border-red-900/50 rounded-lg text-red-400",children:et.message}),(0,a.jsx)("div",{ref:O})]}),(0,a.jsx)("div",{className:"px-4 py-2 border-t border-zinc-800 flex items-center gap-3 shrink-0",children:er?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"inline-block w-2 h-2 rounded-full shrink-0 ".concat("pass"===C.result?"bg-green-500":"bg-red-500")}),(0,a.jsxs)("span",{className:"text-xs font-medium ".concat("pass"===C.result?"text-green-400":"text-red-400"),children:["pass"===C.result?"Passed":"Failed"," in ",eb(H)]}),(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("button",{onClick:()=>{let e=z.current.get(k);e&&(R?e.closeDevTools():e.openDevTools(),M(!R))},className:"text-xs px-2 py-1 rounded border transition-colors ".concat(R?"border-blue-600 text-blue-400 bg-blue-950/30":"border-zinc-700 hover:border-zinc-500 text-zinc-500 hover:text-zinc-300"),title:"Toggle DevTools",children:"DevTools"}),(0,a.jsx)("button",{onClick:()=>{var e,t;null===(t=window.bangonit)||void 0===t||null===(e=t.emitTestRerun)||void 0===e||e.call(t),null==u||u()},className:"text-xs px-3 py-1 rounded border border-zinc-700 hover:border-zinc-500 text-zinc-400 hover:text-zinc-200 transition-colors",children:"Rerun"})]}):ea?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"inline-block w-2 h-2 rounded-full shrink-0 ".concat(E?"bg-amber-500":"bg-blue-500 animate-pulse")}),(0,a.jsxs)("span",{className:"text-xs text-zinc-400",children:[E?"Paused":"Working"," ",eb(H)]}),(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("button",{onClick:()=>{let e=z.current.get(k);e&&(R?e.closeDevTools():e.openDevTools(),M(!R))},className:"text-xs px-2 py-1 rounded border transition-colors ".concat(R?"border-blue-600 text-blue-400 bg-blue-950/30":"border-zinc-700 hover:border-zinc-500 text-zinc-500 hover:text-zinc-300"),title:"Toggle DevTools",children:"DevTools"}),(0,a.jsx)("button",{onClick:()=>S(!E),className:"text-xs px-2 py-1 rounded border border-zinc-700 hover:border-zinc-500 text-zinc-400 hover:text-zinc-200 transition-colors",children:E?"Continue":"Pause"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"inline-block w-2 h-2 bg-zinc-600 rounded-full shrink-0"}),(0,a.jsx)("span",{className:"text-xs text-zinc-500",children:"Queued"})]})})]})]})}function U(e){var t,n;let{message:r,agentName:i}=e;if("user"===r.role){let e=null===(n=r.parts)||void 0===n?void 0:n.find(e=>"text"===e.type);return(0,a.jsxs)("div",{className:"text-sm",children:[(0,a.jsx)("span",{className:"text-xs text-zinc-500 block mb-1",children:"Test Plan"}),(0,a.jsx)("div",{className:"text-zinc-200 prose prose-invert prose-sm max-w-none",children:(0,a.jsx)(l.UG,{remarkPlugins:[s.Z],children:(null==e?void 0:e.text)||""})})]})}return(0,a.jsx)("div",{className:"text-sm space-y-2",children:null===(t=r.parts)||void 0===t?void 0:t.map((e,t)=>{var n,r;if("text"===e.type&&e.text)return(null===(r=e.providerMetadata)||void 0===r?void 0:null===(n=r.anthropic)||void 0===n?void 0:n.type)==="compaction"?null:(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-xs text-zinc-500 block mb-1",children:i}),(0,a.jsx)("div",{className:"text-zinc-300 prose prose-invert prose-sm max-w-none",children:(0,a.jsx)(l.UG,{remarkPlugins:[s.Z],children:e.text})})]},t);if("dynamic-tool"===e.type||"string"==typeof e.type&&e.type.startsWith("tool-")){let n=e.toolName||("string"==typeof e.type?e.type.replace(/^tool-/,""):"");return"todos"===n||"report_result"===n?null:(0,a.jsx)(F,{part:e},t)}return null})})}function F(e){let{part:t}=e,[n,i]=(0,r.useState)(!1),o=t.input||{},l=t.output,s=t.state||"input-available",c=t.toolName||("string"==typeof t.type?t.type.replace(/^tool-/,""):""),u="input-streaming"===s?"":"browser"===c?(()=>{let e=(o.actions||[]).map(e=>{switch(e.action){case"navigate":return"navigate ".concat(e.url||"");case"mouse":{let t=(e.mouseActions||[]).map(e=>"wait"===e.action?"wait ".concat(e.ms,"ms"):"wheel"===e.action?"wheel ".concat(e.ref||"".concat(e.x,",").concat(e.y)):"".concat(e.action," ").concat(e.ref||"".concat(e.x,",").concat(e.y))).join(" → ");return"mouse ".concat(t)}case"type":return'type "'.concat((e.text||"").slice(0,40),'"');case"press":return"press ".concat(e.key||"");case"tabs":return"tabs ".concat(e.tabAction||"").concat(e.tabId?" "+e.tabId:"");default:return e.action||""}});return o.observe&&e.push(o.observe),o.forceFull&&e.push("[full]"),e.join(", ")})():o.command||(Object.keys(o).length>0?JSON.stringify(o):"");return(0,a.jsxs)("div",{className:"text-sm",children:[(0,a.jsxs)("button",{onClick:()=>i(!n),className:"flex items-center gap-2 text-xs px-2 py-1.5 bg-zinc-900 border border-zinc-800 rounded-lg hover:border-zinc-700 transition-colors w-full text-left min-w-0",children:["input-streaming"===s||"input-available"===s?(0,a.jsx)("span",{className:"inline-block w-2 h-2 bg-amber-500 rounded-full animate-pulse shrink-0"}):(0,a.jsx)("span",{className:"text-green-500 shrink-0",children:"✓"}),(0,a.jsx)("span",{className:"text-zinc-400 font-mono truncate",children:u}),(0,a.jsx)("span",{className:"ml-auto transition-transform text-zinc-600 shrink-0 ".concat(n?"rotate-90":""),children:"▶"})]}),n&&(0,a.jsxs)("pre",{className:"mt-1 px-3 py-2 bg-zinc-900/50 rounded-lg border border-zinc-800 text-xs whitespace-pre-wrap overflow-x-auto max-h-60 overflow-y-auto",children:[u&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("span",{className:"text-zinc-300 select-all",children:["$ ",u]}),"\n"]}),null!=l&&(()=>{if("browser"===c&&"string"==typeof l)try{let e=JSON.parse(l);if(void 0!==e.textOutput)return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:"text-zinc-500",children:e.textOutput}),e.imageOutput&&(0,a.jsxs)(a.Fragment,{children:["\n",(0,a.jsx)("span",{className:"changed"===e.imageOutput.type?"text-blue-400":"text-zinc-600",children:"changed"===e.imageOutput.type?"[screenshot: changed]":"[screenshot: unchanged]"})]})]})}catch(e){console.error(e)}return(0,a.jsx)("span",{className:"text-zinc-500",children:"string"==typeof l?l:JSON.stringify(l,null,2)})})()]})]})}let L={0:"debug",1:"log",2:"warn",3:"error"};class B{addEvent(e){this.events.push(e)}setMessages(e,t){let n=Date.now(),a=JSON.parse(JSON.stringify(t));for(let t=0;t<a.length;t++){let r=a[t],i="".concat(e,":").concat(t);if(this.seenParts.has(i)||this.seenParts.set(i,n),r._ts=this.seenParts.get(i),r.parts)for(let a=0;a<r.parts.length;a++){let i="".concat(e,":").concat(t,":").concat(a);this.seenParts.has(i)||this.seenParts.set(i,n),r.parts[a]._ts=this.seenParts.get(i)}}this.messages.set(e,a)}addConsoleLog(e,t,n,a,r){this.consoleLogs.has(e)||this.consoleLogs.set(e,[]),this.consoleLogs.get(e).push({ts:Date.now(),level:L[t]||"log",message:n,url:a,line:r})}toJSON(e,t){return{runId:this.runId,startTime:this.startTime,endTime:Date.now(),agents:e,timeline:[...this.events].sort((e,t)=>e.ts-t.ts),messages:Object.fromEntries(this.messages),consoleLogs:Object.fromEntries(this.consoleLogs),clips:t}}constructor(e){this.events=[],this.messages=new Map,this.consoleLogs=new Map,this.seenParts=new Map,this.runId=e,this.startTime=Date.now()}}function H(){let[e,t]=(0,r.useState)([]),[n,i]=(0,r.useState)({}),[o,l]=(0,r.useState)({}),[s,c]=(0,r.useState)(!1),[u,d]=(0,r.useState)({}),h=(0,r.useRef)(new Map),[p,m]=(0,r.useState)(null),[w,f]=(0,r.useState)(!1),[g,b]=(0,r.useState)(!1),v=(0,r.useRef)(null),x=(0,r.useRef)(new Map);(0,r.useEffect)(()=>{let e={id:crypto.randomUUID(),name:"Test 1",createdAt:Date.now()};t([e]),m(e.id),c(!0)},[]);let y=(0,r.useRef)(e);y.current=e;let k=(0,r.useCallback)(async e=>{var t,n;await (null===(n=window.bangonit)||void 0===n?void 0:null===(t=n.clearPartition)||void 0===t?void 0:t.call(n,e));let a=o[e];a&&(i(t=>({...t,[e]:"running"})),d(t=>({...t,[e]:(t[e]||0)+1})),l(t=>({...t,[e]:{initialPrompt:a.initialPrompt}})))},[o]),I=(0,r.useCallback)((e,t)=>{x.current.set(e,t)},[]),T=(0,r.useRef)(n);T.current=n;let N=(0,r.useCallback)(async(e,t)=>{var n,a,r,i;let o=v.current;if(!o)return;let l=await (null===(a=window.bangonit)||void 0===a?void 0:null===(n=a.getRunDir)||void 0===n?void 0:n.call(a));if(!l)return;let s=[];for(let e of x.current.values())s.push(...e.getClipsMeta());let c={...T.current,[e]:t},u=y.current.map(e=>{let t=c[e.id];return{id:e.id,name:e.name,result:"completed"===t?"pass":"failed"===t?"fail":void 0}}),d=o.toJSON(u,s);await (null===(i=window.bangonit)||void 0===i?void 0:null===(r=i.generateReplayHtml)||void 0===r?void 0:r.call(i,{runDir:l,data:JSON.stringify(d)}))},[]),C=(0,r.useCallback)(async(e,t,n)=>{let a;a="running"===t?"running":"pass"===n?"completed":"fail"===n?"failed":"idle",i(t=>({...t,[e]:a}));let r=!1;if("fail"===n){let t=h.current.get(e);if(t&&t.attempt<t.maxRetries){var o,l;r=!0,t.attempt++,null===(l=window.bangonit)||void 0===l||null===(o=l.emitTestRetry)||void 0===o||o.call(l,{agentId:e,attempt:t.attempt,maxRetries:t.maxRetries}),setTimeout(()=>k(e),1e3)}}if(w&&("pass"===n||"fail"===n)&&!r){let t={...T.current,[e]:a};y.current.every(e=>{let n=t[e.id];return"completed"===n||"failed"===n})&&await N(e,a)}},[k,w,N]),j=(0,r.useCallback)((e,n,a)=>{a&&t(t=>t.map(t=>t.id===e?{...t,name:a}:t)),l(t=>({...t,[e]:{initialPrompt:n}})),i(t=>({...t,[e]:"running"})),m(e)},[]),E=(0,r.useCallback)(()=>{let n=crypto.randomUUID(),a={id:n,name:"Test ".concat(e.length+1),createdAt:Date.now()};t(e=>[...e,a]),m(n)},[e.length]);if((0,r.useEffect)(()=>{var e,n;let a=null===(n=window.bangonit)||void 0===n?void 0:null===(e=n.onTestPlan)||void 0===e?void 0:e.call(n,e=>{b(!0);let{agentIndex:n,testPlan:a,name:r,retries:o,extraPrompt:s,record:c,planDir:u}=e;if(c&&!v.current){let e=new Date().toISOString().replace(/[:.]/g,"-");v.current=new B(e),f(!0)}t(e=>{let t=n+1,a=[...e];for(;a.length<t;)a.push({id:crypto.randomUUID(),name:r||"Test ".concat(a.length+1),createdAt:Date.now()});return r&&(a=a.map((e,t)=>t===n?{...e,name:r}:e)),a}),setTimeout(()=>{t(e=>{let t=e[n];if(!t)return e;let r=s?"".concat(a,"\n\n## Additional Instructions\n").concat(s):a;return l(e=>({...e,[t.id]:{initialPrompt:r,planDir:u}})),i(e=>({...e,[t.id]:"running"})),o&&o>0&&h.current.set(t.id,{maxRetries:o,attempt:0,testPlan:r}),0===n&&m(t.id),e})},100)});return()=>null==a?void 0:a()},[]),(0,r.useEffect)(()=>{var e,t;let n=null===(t=window.bangonit)||void 0===t?void 0:null===(e=t.onFocusAgent)||void 0===e?void 0:e.call(t,e=>{m(e.agentId)});return()=>null==n?void 0:n()},[]),!s)return(0,a.jsx)("div",{className:"flex h-screen bg-zinc-950"});let S=e.find(e=>e.id===p),R=!!p&&!!o[p];return(0,a.jsxs)("div",{className:"flex h-screen bg-zinc-950 overflow-hidden",children:[(0,a.jsxs)("div",{className:"flex flex-col bg-zinc-900 border-r border-zinc-800 shrink-0 w-48 overflow-y-auto",children:[(0,a.jsxs)("div",{className:"flex items-center px-3 py-2 border-b border-zinc-800",children:[(0,a.jsx)("span",{className:"text-xs font-medium text-zinc-500 uppercase tracking-wider",children:"Tests"}),(0,a.jsx)("div",{className:"flex-1"}),(0,a.jsx)("button",{onClick:E,className:"text-zinc-500 hover:text-zinc-300 transition-colors text-lg leading-none",title:"Add test",children:"+"})]}),e.map(e=>{let t=n[e.id];return(0,a.jsx)("button",{onClick:()=>m(e.id),className:"px-3 py-2 text-xs text-left border-b border-zinc-800 transition-colors\n ".concat(e.id===p?"bg-zinc-800 text-zinc-200":"text-zinc-500 hover:text-zinc-300"),children:(0,a.jsxs)("span",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"inline-block w-2 h-2 rounded-full shrink-0 ".concat("running"===t?"bg-blue-500 animate-pulse":"completed"===t?"bg-green-500":"failed"===t?"bg-red-500":"bg-zinc-600")}),(0,a.jsx)("span",{className:"truncate",children:e.name})]})},e.id)})]}),(0,a.jsxs)("div",{className:"flex-1 min-w-0 h-full relative",children:[e.map(e=>o[e.id]?(0,a.jsx)("div",{className:"absolute inset-0 z-0",style:{display:"flex",zIndex:e.id===p?1:0,pointerEvents:e.id===p?"auto":"none"},children:(0,a.jsx)(O,{agentId:e.id,agentName:e.name,initialPrompt:o[e.id].initialPrompt,initialMessages:o[e.id].initialMessages,initialTabs:o[e.id].initialTabs,initialActiveTabId:o[e.id].initialActiveTabId,initialTodos:o[e.id].initialTodos,onStatusChange:C,onRerun:()=>k(e.id),record:w,sessionRecorder:v.current||void 0,onRegisterRecorder:I,planDir:o[e.id].planDir})},"".concat(e.id,"-").concat(u[e.id]||0)):null),S&&!R&&!g&&(0,a.jsx)(W,{agentId:S.id,agentName:S.name,onSubmit:j})]})]})}function W(e){let{agentId:t,onSubmit:n}=e,[i,o]=(0,r.useState)(""),l=(0,r.useRef)(null);(0,r.useEffect)(()=>{var e;null===(e=l.current)||void 0===e||e.focus()},[t]);let s=()=>{let e=i.trim();e&&n(t,e)};return(0,a.jsx)("div",{className:"absolute inset-0 flex items-center justify-center z-10 bg-zinc-950",children:(0,a.jsxs)("div",{className:"w-full max-w-xl px-6",children:[(0,a.jsx)("h2",{className:"text-lg font-medium text-zinc-200 mb-4",children:"What would you like to test?"}),(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("textarea",{ref:l,value:i,onChange:e=>o(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),s())},placeholder:"Describe what to test in plain English...",className:"w-full px-4 py-3 bg-zinc-800 border border-zinc-700 rounded-lg text-sm text-zinc-200 placeholder-zinc-500 resize-none focus:outline-none focus:border-zinc-500 transition-colors",rows:4}),(0,a.jsx)("button",{onClick:s,disabled:!i.trim(),className:"absolute bottom-3 right-3 px-3 py-1.5 bg-blue-600 hover:bg-blue-500 disabled:bg-zinc-700 disabled:text-zinc-500 text-white text-xs font-medium rounded transition-colors",children:"Run"})]}),(0,a.jsx)("p",{className:"text-xs text-zinc-600 mt-2",children:"Press Enter to run. Shift+Enter for a new line."}),(0,a.jsxs)("div",{className:"mt-4",children:[(0,a.jsx)("p",{className:"text-xs text-zinc-600 mb-2",children:"Examples:"}),(0,a.jsx)("div",{className:"flex flex-col gap-1.5",children:["Go to example.com and verify the homepage loads with a heading","Navigate to my-app.com/login, sign in with test@example.com / password123, and verify the dashboard loads","Go to localhost:3000, add an item to the cart, proceed to checkout, and verify the order summary"].map((e,t)=>(0,a.jsx)("button",{onClick:()=>o(e),className:"text-left text-xs text-zinc-500 hover:text-zinc-300 bg-zinc-900 hover:bg-zinc-800 px-3 py-2 rounded border border-zinc-800 transition-colors",children:e},t))})]})]})})}function V(){return(0,a.jsx)(H,{})}}},function(e){e.O(0,[46,793,293,528,744],function(){return e(e.s=6421)}),_N_E=e.O()}]);
|
package/app/webapp/.next/standalone/app/webapp/.next/static/chunks/app/layout-57acb80d8da0067a.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{4143:function(n,e,u){Promise.resolve().then(u.t.bind(u,2625,23))},2625:function(){}},function(n){n.O(0,[387,293,528,744],function(){return n(n.s=4143)}),_N_E=n.O()}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{2200:function(e,n,t){Promise.resolve().then(t.t.bind(t,1815,23)),Promise.resolve().then(t.t.bind(t,5428,23)),Promise.resolve().then(t.t.bind(t,1584,23)),Promise.resolve().then(t.t.bind(t,5092,23)),Promise.resolve().then(t.t.bind(t,3859,23)),Promise.resolve().then(t.t.bind(t,2023,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[293,528],function(){return n(6e3),n(2200)}),_N_E=e.O()}]);
|
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{"DESKTOP_APP_VERSION":"0.1.0"},"webpack":null,"eslint":{"ignoreDuringBuilds":false},"typescript":{"ignoreBuildErrors":false,"tsconfigPath":"tsconfig.json"},"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.js","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"analyticsId":"","images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":60,"formats":["image/webp"],"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"inline","remotePatterns":[],"unoptimized":false},"devIndicators":{"buildActivity":true,"buildActivityPosition":"bottom-right"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"amp":{"canonicalBase":""},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"optimizeFonts":true,"excludeDefaultMomentLocales":true,"serverRuntimeConfig":{},"publicRuntimeConfig":{},"reactProductionProfiling":false,"reactStrictMode":null,"httpAgentOptions":{"keepAlive":true},"outputFileTracing":true,"staticPageGenerationTimeout":60,"swcMinify":true,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"experimental":{"multiZoneDraftMode":false,"prerenderEarlyExit":false,"serverMinification":true,"serverSourceMaps":false,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","middlewarePrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":
|
|
12
|
+
const nextConfig = {"env":{"DESKTOP_APP_VERSION":"0.1.0"},"webpack":null,"eslint":{"ignoreDuringBuilds":false},"typescript":{"ignoreBuildErrors":false,"tsconfigPath":"tsconfig.json"},"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.js","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"analyticsId":"","images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":60,"formats":["image/webp"],"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"inline","remotePatterns":[],"unoptimized":false},"devIndicators":{"buildActivity":true,"buildActivityPosition":"bottom-right"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"amp":{"canonicalBase":""},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"optimizeFonts":true,"excludeDefaultMomentLocales":true,"serverRuntimeConfig":{},"publicRuntimeConfig":{},"reactProductionProfiling":false,"reactStrictMode":null,"httpAgentOptions":{"keepAlive":true},"outputFileTracing":true,"staticPageGenerationTimeout":60,"swcMinify":true,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"experimental":{"multiZoneDraftMode":false,"prerenderEarlyExit":false,"serverMinification":true,"serverSourceMaps":false,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","middlewarePrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":9,"memoryBasedWorkersCount":false,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"outputFileTracingRoot":"/Users/pete/repos/growthgirl","swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"adjustFontFallbacks":false,"adjustFontFallbacksWithSizeAdjust":false,"typedRoutes":false,"instrumentationHook":false,"bundlePagesExternals":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"missingSuspenseWithCSRBailout":true,"optimizeServerReact":true,"useEarlyImport":false,"staleTimes":{"dynamic":30,"static":300},"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"configFileName":"next.config.js"}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bangonit",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
4
4
|
"description": "AI-powered E2E testing tool",
|
|
5
5
|
"bin": {
|
|
6
6
|
"bangonit": "bin/src/cli/bangonit.js",
|
|
@@ -59,6 +59,7 @@
|
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@iarna/toml": "^2.2.5",
|
|
62
|
+
"diff": "^8.0.3",
|
|
62
63
|
"dotenv": "^17.3.1",
|
|
63
64
|
"electron": "^40.8.0",
|
|
64
65
|
"is-ci": "^4.1.0",
|