jat-feedback 3.7.0 → 3.7.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.
@@ -445,7 +445,7 @@ Parameters: ${m}`,inputSchema:record(string(),any()),async execute(_){try{const
445
445
  @keyframes svelte-nv4d5v-voice-spin { to { transform: rotate(360deg); } }.voice-spinner.svelte-nv4d5v {width:16px;height:16px;border:2px solid #374151;border-top-color:#60a5fa;border-radius:50%;
446
446
  animation: svelte-nv4d5v-voice-spin 0.7s linear infinite;flex-shrink:0;}.voice-status-text.svelte-nv4d5v {font-size:12px;color:#9ca3af;margin:0;}.voice-done.svelte-nv4d5v {color:#22c55e;}.voice-done-text.svelte-nv4d5v {color:#22c55e !important;font-weight:500;}.voice-error-icon.svelte-nv4d5v {width:36px;height:36px;border-radius:50%;background:#991b1b;color:white;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:700;}.voice-error-text.svelte-nv4d5v {color:#f87171 !important;}.voice-reset.svelte-nv4d5v {font-size:12px;color:#60a5fa;background:transparent;border:none;cursor:pointer;text-decoration:underline;font-family:inherit;padding:0;}.voice-footer.svelte-nv4d5v {font-size:11px;color:#4b5563;margin:0;line-height:1.5;}.voice-footer.svelte-nv4d5v strong:where(.svelte-nv4d5v) {color:#6b7280;}
447
447
 
448
- /* Voice confirmation UI */.voice-confirm.svelte-nv4d5v {display:flex;flex-direction:column;gap:0.75rem;width:100%;text-align:left;}.voice-confirm-hint.svelte-nv4d5v {font-size:12px;color:#9ca3af;margin:0;line-height:1.4;}.voice-confirm-field.svelte-nv4d5v {display:flex;flex-direction:column;gap:0.25rem;}.voice-confirm-label.svelte-nv4d5v {font-size:11px;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:0.04em;}.voice-confirm-input.svelte-nv4d5v {width:100%;background:#1f2937;border:1px solid #374151;border-radius:6px;color:#e5e7eb;font-size:13px;font-family:inherit;padding:0.5rem 0.625rem;box-sizing:border-box;outline:none;transition:border-color 0.15s;}.voice-confirm-input.svelte-nv4d5v:focus {border-color:#4b6cf7;}.voice-confirm-textarea.svelte-nv4d5v {width:100%;background:#1f2937;border:1px solid #374151;border-radius:6px;color:#e5e7eb;font-size:13px;font-family:inherit;padding:0.5rem 0.625rem;box-sizing:border-box;resize:vertical;outline:none;transition:border-color 0.15s;min-height:80px;}.voice-confirm-textarea.svelte-nv4d5v:focus {border-color:#4b6cf7;}.voice-confirm-actions.svelte-nv4d5v {display:flex;align-items:center;justify-content:space-between;margin-top:0.25rem;}.voice-btn-submit.svelte-nv4d5v {background:#1d4ed8;color:white;padding:0.5rem 1.125rem;font-size:13px;}.voice-btn-submit.svelte-nv4d5v:hover:not(:disabled) {background:#2563eb;}.voice-btn-submit.svelte-nv4d5v:disabled {opacity:0.45;cursor:not-allowed;}.voice-task-nav.svelte-nv4d5v {display:flex;align-items:center;justify-content:space-between;margin-bottom:0.5rem;}.voice-task-dots.svelte-nv4d5v {display:flex;gap:5px;align-items:center;}.voice-task-dot.svelte-nv4d5v {width:7px;height:7px;border-radius:50%;background:#374151;transition:background 0.2s;}.voice-task-dot-active.svelte-nv4d5v {background:#1d4ed8;width:8px;height:8px;}.voice-task-counter.svelte-nv4d5v {font-size:11px;color:#6b7280;font-weight:500;letter-spacing:0.02em;}.voice-btn-skip.svelte-nv4d5v {background:transparent;color:#6b7280;border:1px solid #374151;padding:0.5rem 0.875rem;font-size:13px;}.voice-btn-skip.svelte-nv4d5v:hover {color:#9ca3af;border-color:#4b5563;}`};function FeedbackPanel(d,p){push(p,!0),append_styles(d,$$css$1);const h="3.7.0";let g=prop(p,"endpoint",7),m=prop(p,"project",7),_=prop(p,"isOpen",7,!1),b=prop(p,"userId",7,""),y=prop(p,"userEmail",7,""),w=prop(p,"userName",7,""),x=prop(p,"userRole",7,""),E=prop(p,"orgId",7,""),k=prop(p,"orgName",7,""),S=prop(p,"onclose",7),I=prop(p,"ongrip",7),R=prop(p,"agentProxy",7,""),z=prop(p,"agentModel",7,""),A=prop(p,"agentContext",7,""),C=prop(p,"registeredTools",23,()=>[]),$=prop(p,"supabaseUrl",7,""),N=prop(p,"supabaseAnonKey",7,""),O=prop(p,"taskLinkTemplate",7,""),L=state("new"),j=state(!1),q=state(!1),H=state(!1),le=state(proxy([]));function _e(){if(get(H)){const F=stopRecording();set(le,F,!0),set(H,!1),Zt(`Session recorded (${F.length} events)`,"success")}else startRecording(),set(le,[],!0),set(H,!0),Zt("Recording session...","info")}let ne=state("idle"),re=state(""),ge=state(null),ce=[],be=state(null),ve=state(""),de=state(""),ue=state(proxy([])),T=state(0),M=null,D=null,P=null;function G(){if(M&&(clearTimeout(M),M=null),D){try{D.close()}catch{}D=null}P&&(clearInterval(P),P=null)}function oe(F){G(),set(ue,F.filter(X=>X.title||X.description),!0),get(ue).length===0&&set(ue,[{title:"",description:""}],!0),set(T,0),set(ve,get(ue)[0].title||"",!0),set(de,get(ue)[0].description||"",!0),set(ne,"confirming"),set(re,"")}function we(F="Transcription failed. Try again."){G(),set(ne,"error"),set(re,F,!0)}function ee(){set(ue,get(ue).map((F,X)=>X===get(T)?{title:get(ve),description:get(de)}:F),!0),get(T)<get(ue).length-1?(update(T),set(ve,get(ue)[get(T)].title||"",!0),set(de,get(ue)[get(T)].description||"",!0),set(ne,"confirming")):(set(ne,"submitted"),set(re,""),setTimeout(()=>{set(L,"requests"),Tt()},1500))}function U(){get(T)<get(ue).length-1?(update(T),set(ve,get(ue)[get(T)].title||"",!0),set(de,get(ue)[get(T)].description||"",!0)):Ae()}function ae(F){const Ce=$().replace(/\/$/,"").replace(/^https/,"wss").replace(/^http/,"ws")+`/realtime/v1/websocket?apikey=${N()}&vsn=1.0.0`;let te,ye=null,De=1;function Ye(){return String(De++)}try{te=new WebSocket(Ce)}catch{Q(F);return}D=te,te.onopen=()=>{const st=Ye();te.send(JSON.stringify({topic:"realtime:*",event:"phx_join",payload:{config:{broadcast:{self:!1},presence:{key:""},postgres_changes:[{event:"UPDATE",schema:"public",table:"project_tasks",filter:`id=eq.${F}`}]},access_token:N()},ref:st,join_ref:st})),ye=setInterval(()=>{te.readyState===WebSocket.OPEN&&te.send(JSON.stringify({topic:"phoenix",event:"heartbeat",payload:{},ref:Ye()}))},3e4)},te.onmessage=async st=>{var Ut;let ct;try{ct=JSON.parse(st.data)}catch{return}if(ct.event==="postgres_changes"&&((Ut=ct.payload)!=null&&Ut.data)){const{type:Ke,record:Ne}=ct.payload.data;if(Ke==="UPDATE"&&Ne)if(Ne.status==="open")ye&&clearInterval(ye),oe([{title:Ne.title||"",description:Ne.description||""}]);else if(Ne.status==="voice_split"){ye&&clearInterval(ye);try{const Be=JSON.parse(Ne.description||"{}").taskIds||[];if(Be.length>0){const Je=`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=in.(${Be.join(",")})&select=id,title,description&order=created_at`,vt=await fetch(Je,{headers:{apikey:N(),Authorization:`Bearer ${N()}`}});if(vt.ok){const wt=await vt.json();oe(wt.map(Lt=>({title:Lt.title||"",description:Lt.description||""})));return}}}catch{}oe([{title:Ne.title||"",description:""}])}else Ne.status==="failed"&&(ye&&clearInterval(ye),we("Transcription failed. Try again."))}},te.onerror=()=>{ye&&clearInterval(ye),D=null,Q(F)},te.onclose=()=>{ye&&clearInterval(ye)}}function Q(F){P||(P=setInterval(async()=>{try{let X=null,Ce="",te="",ye=[];if($()&&N()){const De=`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=eq.${F}&select=id,status,title,description`,Ye=await fetch(De,{headers:{apikey:N(),Authorization:`Bearer ${N()}`}});if(Ye.ok){const st=await Ye.json();if(Array.isArray(st)&&st.length>0&&(X=st[0].status,Ce=st[0].title||"",te=st[0].description||"",X==="voice_split"))try{const ct=JSON.parse(te||"{}").taskIds||[];if(ct.length>0){const Ut=`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=in.(${ct.join(",")})&select=id,title,description&order=created_at`,Ke=await fetch(Ut,{headers:{apikey:N(),Authorization:`Bearer ${N()}`}});Ke.ok&&(ye=(await Ke.json()).map(Be=>({title:Be.title||"",description:Be.description||""})))}}catch{}}}else{const De=await fetch(`${g().replace(/\/$/,"")}/api/tasks/voice?id=${encodeURIComponent(F)}`);if(De.ok){const Ye=await De.json();X=Ye.status,Array.isArray(Ye.tasks)&&Ye.tasks.length>0?ye=Ye.tasks:(Ce=Ye.title||"",te=Ye.description||"")}}if(X==="open"||X==="voice_split"){clearInterval(P),P=null;const De=ye.length>0?ye:[{title:Ce,description:te}];oe(De)}else X==="failed"&&(clearInterval(P),P=null,we("Transcription failed. Try again."))}catch{}},3e3))}function Ee(F){M=setTimeout(()=>{G(),set(ne,"error"),set(re,"Transcription timed out (30s). Try again.")},3e4),$()&&N()?ae(F):Q(F)}async function W(){var F;try{const X=await navigator.mediaDevices.getUserMedia({audio:!0}),Ce=MediaRecorder.isTypeSupported("audio/webm;codecs=opus")?"audio/webm;codecs=opus":MediaRecorder.isTypeSupported("audio/webm")?"audio/webm":"audio/ogg",te=new MediaRecorder(X,{mimeType:Ce});ce=[],te.ondataavailable=ye=>{ye.data.size>0&&ce.push(ye.data)},te.onstop=()=>{X.getTracks().forEach(ye=>ye.stop()),me(new Blob(ce,{type:Ce}),Ce)},te.start(500),set(ge,te,!0),set(ne,"recording"),set(re,"")}catch(X){set(ne,"error"),set(re,(F=X.message)!=null&&F.includes("Permission")?"Microphone permission denied":"Could not start recording",!0)}}function J(){get(ge)&&get(ge).state!=="inactive"&&get(ge).stop(),set(ge,null),set(ne,"uploading"),set(re,"")}async function me(F,X){set(ne,"uploading");try{const Ce=X.includes("webm")?"webm":X.includes("ogg")?"ogg":"audio",te=new FormData;te.append("audio",F,`voice-note.${Ce}`),m()&&te.append("project",m()),b()&&te.append("user_id",b());const ye=await fetch(`${g().replace(/\/$/,"")}/api/tasks/voice`,{method:"POST",body:te});if(ye.ok){const Ye=(await ye.json()).id;if(!Ye)throw new Error("No task ID returned from server");set(be,Ye,!0),set(ne,"transcribing"),set(re,""),Ee(Ye)}else{const De=await ye.json().catch(()=>({}));throw new Error(De.error||De.message||`Upload failed (${ye.status})`)}}catch(Ce){set(ne,"error"),set(re,Ce.message||"Failed to upload recording",!0)}finally{ce=[]}}async function he(){if(get(be)){set(ne,"uploading"),set(re,"");try{if($()&&N()){const F=await fetch(`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=eq.${get(be)}`,{method:"PATCH",headers:{apikey:N(),Authorization:`Bearer ${N()}`,"Content-Type":"application/json",Prefer:"return=minimal"},body:JSON.stringify({title:get(ve),description:get(de),status:"open"})});if(!F.ok)throw new Error(`HTTP ${F.status}`)}else{const F=await fetch(`${g().replace(/\/$/,"")}/api/tasks/voice?id=${encodeURIComponent(get(be))}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:get(ve),description:get(de),status:"open"})});if(!F.ok){const X=await F.json().catch(()=>({}));throw new Error(X.error||`HTTP ${F.status}`)}}ee()}catch(F){set(ne,"confirming"),set(re,F.message||"Failed to submit. Please try again.",!0)}}}function Ae(){G(),get(ge)&&get(ge).state!=="inactive"&&get(ge).stop(),set(ge,null),set(ne,"idle"),set(re,""),ce=[],set(be,null),set(ve,""),set(de,""),set(ue,[],!0),set(T,0)}let je=state(proxy([])),Re=state("idle"),nt=state(0),ze=state(!1),V=state(null);function Y(){return get(V)||set(V,new AgentBridge({proxyUrl:R(),model:z()||void 0,maxSteps:20,appContext:A()||void 0,endpoint:g(),project:m(),registeredTools:C(),onMessagesChange:F=>{set(je,F,!0)},onStateChange:(F,X)=>{set(Re,F,!0),set(nt,X,!0)}}),!0),get(V)}function se(){var F;(F=get(V))==null||F.invalidateNotesCache()}user_effect(()=>{get(L)==="agent"&&!get(j)&&set(j,!0)}),user_effect(()=>{get(L)==="notes"&&!get(q)&&set(q,!0)});function fe(F){Y().execute(F)}function ke(){var F;(F=get(V))==null||F.stop()}function ie(F){var X;(X=get(V))==null||X.approve(F)}function Se(F){var X;(X=get(V))==null||X.skip(F)}function $e(F){set(ze,F,!0),get(V)&&(get(V).autoApprove=F)}onDestroy(()=>{var F;(F=get(V))==null||F.dispose(),G(),get(ge)&&get(ge).state!=="inactive"&&get(ge).stop()});let We=state(proxy([])),qe=state(!1),St=state(""),qt=user_derived(()=>get(We).filter(F=>F.status==="completed").length);async function Tt(){set(qe,!0),set(St,"");const F=await fetchReports(g());set(We,F.reports,!0),F.error&&set(St,F.error,!0),set(qe,!1)}user_effect(()=>{g()&&Tt()});let Rt=state(""),pn=state(""),ht=state("bug"),gt=state("medium"),Ve=state(proxy([])),Z=state(proxy([])),pe=state(proxy([])),Te=state(proxy([])),Pe=state(proxy([])),ot=state(void 0);const Ct=["image/png","image/jpeg","image/gif","image/webp","image/svg+xml"];function Mt(){var F;(F=get(ot))==null||F.click()}async function Un(F){const X=F.target,Ce=X.files;if(!(!Ce||Ce.length===0)){for(const te of Ce)try{const ye=await It(te);Ct.includes(te.type)?(set(Ve,[...get(Ve),ye],!0),Zt(`Image added: ${te.name}`,"success")):(set(Z,[...get(Z),{name:te.name,type:te.type||"application/octet-stream",data:ye,size:te.size}],!0),Zt(`File attached: ${te.name}`,"success"))}catch{Zt(`Failed to read: ${te.name}`,"error")}X.value=""}}function It(F){return new Promise((X,Ce)=>{const te=new FileReader;te.onload=()=>X(te.result),te.onerror=()=>Ce(te.error),te.readAsDataURL(F)})}function bt(F){set(Z,get(Z).filter((X,Ce)=>Ce!==F),!0)}function At(F){return F<1024?`${F}B`:F<1024*1024?`${(F/1024).toFixed(1)}KB`:`${(F/(1024*1024)).toFixed(1)}MB`}let K=state(!1),Ft=state(!1),rn=state(!1),en=state(null),Nn=state(!1),tn=state(null),hn=state(""),er=state(void 0),$n=!1;user_effect(()=>{_()&&!$n&&(requestAnimationFrame(()=>{requestAnimationFrame(()=>{var F;(F=get(er))==null||F.focus()})}),get(L)==="new"&&setTimeout(()=>{captureViewportQuick().then(F=>{get(Ve).length===0?set(Ve,[F],!0):set(Ve,[F,...get(Ve).slice(1)],!0)}).catch(()=>{})},300)),$n=_()});let hr=state(""),gr=state("success"),jn=state(!1);function Zt(F,X){set(hr,F,!0),set(gr,X,!0),set(jn,!0),setTimeout(()=>{set(jn,!1)},3e3)}async function vr(){set(Ft,!0);try{const F=await captureViewport();set(hn,F,!0),set(tn,get(Ve).length,!0)}catch(F){console.error("[jat-feedback] Screenshot failed:",F),Zt("Screenshot failed: "+(F instanceof Error?F.message:"unknown error"),"error")}finally{set(Ft,!1)}}function Mn(F){set(Ve,get(Ve).filter((X,Ce)=>Ce!==F),!0)}function En(F){set(hn,get(Ve)[F],!0),set(tn,F,!0)}function Wn(F){get(tn)!==null&&(get(tn)>=get(Ve).length?(set(Ve,[...get(Ve),F],!0),Zt(`Screenshot captured (${get(Ve).length})`,"success")):(set(Ve,get(Ve).map((X,Ce)=>Ce===get(tn)?F:X),!0),Zt("Screenshot updated","success"))),set(tn,null),set(hn,"")}function tr(){get(tn)!==null&&get(tn)>=get(Ve).length&&(set(Ve,[...get(Ve),get(hn)],!0),Zt(`Screenshot captured (${get(Ve).length})`,"success")),set(tn,null),set(hn,"")}function Vn(){set(rn,!0),startElementPicker(F=>{set(pe,[...get(pe),F],!0),set(rn,!1),Zt(`Element captured: <${F.tagName.toLowerCase()}>`,"success")})}function mr(){set(Te,getCapturedLogs(),!0),set(Pe,getCapturedRequests(),!0)}async function _r(F){if(F.preventDefault(),!get(Rt).trim())return;set(K,!0),mr();const X={};if((b()||y()||w()||x())&&(X.reporter={},b()&&(X.reporter.userId=b()),y()&&(X.reporter.email=y()),w()&&(X.reporter.name=w()),x()&&(X.reporter.role=x())),(E()||k())&&(X.organization={},E()&&(X.organization.id=E()),k()&&(X.organization.name=k())),get(H)){const ye=stopRecording();set(le,ye,!0),set(H,!1)}let Ce;if(get(le).length>0){const ye=crypto.randomUUID(),De=await uploadRecording(g(),get(le),ye);De.ok&&De.recording_url&&(Ce=De.recording_url)}const te={title:get(Rt).trim(),description:get(pn).trim(),type:get(ht),priority:get(gt),project:m()||"",page_url:window.location.href,user_agent:navigator.userAgent,console_logs:get(Te).length>0?get(Te):null,network_requests:get(Pe).length>0?get(Pe):null,selected_elements:get(pe).length>0?get(pe):null,recording_events:null,screenshots:get(Ve).length>0?get(Ve):null,attachments:get(Z).length>0?get(Z):null,metadata:Object.keys(X).length>0?X:null,recording_url:Ce||null};try{const ye=await submitReport(g(),te);if(ye.ok){if(te.recording_url){const De={recording_url:te.recording_url,console_logs:te.console_logs,network_requests:te.network_requests};Y().setReportContext(De)}set(en,ye.id,!0),set(Nn,!!te.recording_url),Zt(`Report submitted (${ye.id})`,"success"),zr(),setTimeout(()=>{Tt(),set(L,"requests")},1200)}else enqueue(g(),te),Zt("Queued for retry (endpoint unreachable)","error")}catch{enqueue(g(),te),Zt("Queued for retry (endpoint unreachable)","error")}finally{set(K,!1)}}function zr(){set(Rt,""),set(pn,""),set(ht,"bug"),set(gt,"medium"),set(Ve,[],!0),set(Z,[],!0),set(pe,[],!0),set(Te,[],!0),set(Pe,[],!0),set(le,[],!0),get(H)&&(stopRecording(),set(H,!1))}user_effect(()=>{mr()});function Gn(F){F.stopPropagation()}const Or=[{value:"bug",label:"Bug"},{value:"enhancement",label:"Enhancement"},{value:"other",label:"Other"}],Dr=[{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"critical",label:"Critical"}];function nr(){return get(Ve).length+get(Z).length+get(pe).length}var Lr={get endpoint(){return g()},set endpoint(F){g(F),flushSync()},get project(){return m()},set project(F){m(F),flushSync()},get isOpen(){return _()},set isOpen(F=!1){_(F),flushSync()},get userId(){return b()},set userId(F=""){b(F),flushSync()},get userEmail(){return y()},set userEmail(F=""){y(F),flushSync()},get userName(){return w()},set userName(F=""){w(F),flushSync()},get userRole(){return x()},set userRole(F=""){x(F),flushSync()},get orgId(){return E()},set orgId(F=""){E(F),flushSync()},get orgName(){return k()},set orgName(F=""){k(F),flushSync()},get onclose(){return S()},set onclose(F){S(F),flushSync()},get ongrip(){return I()},set ongrip(F){I(F),flushSync()},get agentProxy(){return R()},set agentProxy(F=""){R(F),flushSync()},get agentModel(){return z()},set agentModel(F=""){z(F),flushSync()},get agentContext(){return A()},set agentContext(F=""){A(F),flushSync()},get registeredTools(){return C()},set registeredTools(F=[]){C(F),flushSync()},get supabaseUrl(){return $()},set supabaseUrl(F=""){$(F),flushSync()},get supabaseAnonKey(){return N()},set supabaseAnonKey(F=""){N(F),flushSync()},get taskLinkTemplate(){return O()},set taskLinkTemplate(F=""){O(F),flushSync()}},br=root$1(),kn=first_child(br),rr=child(kn),yr=child(rr);{var Fr=F=>{var X=root_1$1();delegated("mousedown",X,function(...Ce){var te;(te=I())==null||te.apply(this,Ce)}),append(F,X)};if_block(yr,F=>{I()&&F(Fr)})}var Hn=sibling(yr,2),or=child(Hn);let sr;var zn=sibling(or,2);let wr;var xr=sibling(child(zn),2);{var Pr=F=>{var X=root_2$1(),Ce=child(X,!0);reset(X),template_effect(()=>set_text(Ce,get(qt))),append(F,X)};if_block(xr,F=>{get(qt)>0&&F(Pr)})}reset(zn);var ir=sibling(zn,2);{var ar=F=>{var X=root_3();let Ce;template_effect(()=>Ce=set_class(X,1,"tab svelte-nv4d5v",null,Ce,{active:get(L)==="agent"})),delegated("click",X,()=>{set(L,"agent"),set(j,!0)}),append(F,X)};if_block(ir,F=>{R()&&F(ar)})}var lr=sibling(ir,2);let Er;var kr=sibling(lr,2);let Sr;reset(Hn);var Zr=sibling(Hn,2);reset(rr);var Ie=sibling(rr,2);{var Oe=F=>{var X=root_4(),Ce=child(X),te=sibling(child(Ce),2);remove_input_defaults(te),bind_this(te,xe=>set(er,xe),()=>get(er)),reset(Ce);var ye=sibling(Ce,2),De=sibling(child(ye),2);remove_textarea_child(De),reset(ye);var Ye=sibling(ye,2),st=child(Ye),ct=sibling(child(st),2);each(ct,21,()=>Or,index,(xe,Le)=>{var dt=root_5(),xt=child(dt,!0);reset(dt);var pt={};template_effect(()=>{set_text(xt,get(Le).label),pt!==(pt=get(Le).value)&&(dt.value=(dt.__value=get(Le).value)??"")}),append(xe,dt)}),reset(ct),reset(st);var Ut=sibling(st,2),Ke=sibling(child(Ut),2);each(Ke,21,()=>Dr,index,(xe,Le)=>{var dt=root_6(),xt=child(dt,!0);reset(dt);var pt={};template_effect(()=>{set_text(xt,get(Le).label),pt!==(pt=get(Le).value)&&(dt.value=(dt.__value=get(Le).value)??"")}),append(xe,dt)}),reset(Ke),reset(Ut),reset(Ye);var Ne=sibling(Ye,2),Be=child(Ne),Je=child(Be),vt=child(Je);{var wt=xe=>{var Le=root_7();next(),append(xe,Le)},Lt=xe=>{var Le=root_8(),dt=sibling(first_child(Le),2);{var xt=pt=>{var $t=root_9(),Xt=child($t,!0);reset($t),template_effect(()=>set_text(Xt,get(Ve).length)),append(pt,$t)};if_block(dt,pt=>{get(Ve).length>0&&pt(xt)})}append(xe,Le)};if_block(vt,xe=>{get(Ft)?xe(wt):xe(Lt,!1)})}reset(Je);var zt=sibling(Je,2),mt=sibling(child(zt),2);{var it=xe=>{var Le=text("Click an element...");append(xe,Le)},Ot=xe=>{var Le=root_11(),dt=sibling(first_child(Le));{var xt=pt=>{var $t=root_12(),Xt=child($t,!0);reset($t),template_effect(()=>set_text(Xt,get(pe).length)),append(pt,$t)};if_block(dt,pt=>{get(pe).length>0&&pt(xt)})}append(xe,Le)};if_block(mt,xe=>{get(rn)?xe(it):xe(Ot,!1)})}reset(zt);var _t=sibling(zt,2);let Pt;var Wt=child(_t);{var Yt=xe=>{var Le=root_13();next(),append(xe,Le)},Kt=xe=>{var Le=root_14(),dt=sibling(first_child(Le),2);{var xt=pt=>{var $t=root_15(),Xt=child($t,!0);reset($t),template_effect(()=>set_text(Xt,get(le).length)),append(pt,$t)};if_block(dt,pt=>{get(le).length>0&&pt(xt)})}append(xe,Le)};if_block(Wt,xe=>{get(H)?xe(Yt):xe(Kt,!1)})}reset(_t);var Vt=sibling(_t,2),qn=sibling(child(Vt),2);{var wn=xe=>{var Le=root_16(),dt=child(Le,!0);reset(Le),template_effect(()=>set_text(dt,get(Z).length)),append(xe,Le)};if_block(qn,xe=>{get(Z).length>0&&xe(wn)})}reset(Vt);var Xe=sibling(Vt,2);bind_this(Xe,xe=>set(ot,xe),()=>get(ot)),reset(Be);var ut=sibling(Be,2);ScreenshotPreview(ut,{get screenshots(){return get(Ve)},get capturing(){return get(Ft)},oncapture:vr,onremove:Mn,onedit:En}),reset(Ne);var sn=sibling(Ne,2);{var Cr=xe=>{var Le=root_17();each(Le,21,()=>get(Z),index,(dt,xt,pt)=>{var $t=root_18(),Xt=child($t),Vr=child(Xt);{var cr=an=>{var ur=root_19();append(an,ur)},Gr=user_derived(()=>get(xt).type.includes("pdf")),Hr=an=>{var ur=root_20();append(an,ur)},On=user_derived(()=>get(xt).type.includes("markdown")||get(xt).name.endsWith(".md")),dr=an=>{var ur=root_21();append(an,ur)};if_block(Vr,an=>{get(Gr)?an(cr):get(On)?an(Hr,1):an(dr,!1)})}reset(Xt);var qr=sibling(Xt,2),vo=child(qr,!0);reset(qr);var Yr=sibling(qr,2),mo=child(Yr,!0);reset(Yr);var _o=sibling(Yr,2);reset($t),template_effect(an=>{set_text(vo,get(xt).name),set_text(mo,an)},[()=>At(get(xt).size)]),delegated("click",_o,()=>bt(pt)),append(dt,$t)}),reset(Le),append(xe,Le)};if_block(sn,xe=>{get(Z).length>0&&xe(Cr)})}var Ir=sibling(sn,2);{var Br=xe=>{var Le=root_22();each(Le,21,()=>get(pe),index,(dt,xt,pt)=>{var $t=root_23(),Xt=child($t),Vr=child(Xt);reset(Xt);var cr=sibling(Xt,2),Gr=child(cr,!0);reset(cr);var Hr=sibling(cr,2);reset($t),template_effect((On,dr)=>{set_text(Vr,`<${On??""}>`),set_text(Gr,dr)},[()=>get(xt).tagName.toLowerCase(),()=>{var On;return((On=get(xt).textContent)==null?void 0:On.substring(0,40))||get(xt).selector}]),delegated("click",Hr,()=>{set(pe,get(pe).filter((On,dr)=>dr!==pt),!0)}),append(dt,$t)}),reset(Le),append(xe,Le)};if_block(Ir,xe=>{get(pe).length>0&&xe(Br)})}var Ur=sibling(Ir,2);ConsoleLogList(Ur,{get logs(){return get(Te)}});var Tr=sibling(Ur,2);{var Rr=xe=>{var Le=root_24(),dt=child(Le);reset(Le),template_effect((xt,pt)=>set_text(dt,`${xt??""} attachment${pt??""} will be included`),[nr,()=>nr()>1?"s":""]),append(xe,Le)},uo=user_derived(()=>nr()>0);if_block(Tr,xe=>{get(uo)&&xe(Rr)})}var oo=sibling(Tr,2),jr=child(oo),fo=child(jr);reset(jr);var Wr=sibling(jr,2),Ar=sibling(Wr,2),po=child(Ar);{var ho=xe=>{var Le=root_25();next(),append(xe,Le)},go=xe=>{var Le=text("Submit");append(xe,Le)};if_block(po,xe=>{get(K)?xe(ho):xe(go,!1)})}reset(Ar),reset(oo),reset(X),template_effect(xe=>{te.disabled=get(K),De.disabled=get(K),ct.disabled=get(K),Ke.disabled=get(K),Je.disabled=get(Ft),zt.disabled=get(rn),Pt=set_class(_t,1,"tool-btn svelte-nv4d5v",null,Pt,{"recording-active":get(H)}),_t.disabled=get(K),Vt.disabled=get(K),set_text(fo,`v${h}`),Wr.disabled=get(K),Ar.disabled=xe,set_attribute(Ar,"title",get(H)?"Stop recording first, or click Submit to auto-stop":"")},[()=>get(K)||!get(Rt).trim()]),event("submit",X,_r),bind_value(te,()=>get(Rt),xe=>set(Rt,xe)),bind_value(De,()=>get(pn),xe=>set(pn,xe)),bind_select_value(ct,()=>get(ht),xe=>set(ht,xe)),bind_select_value(Ke,()=>get(gt),xe=>set(gt,xe)),delegated("click",Je,vr),delegated("click",zt,Vn),delegated("click",_t,_e),delegated("click",Vt,Mt),delegated("change",Xe,Un),delegated("click",Wr,function(...xe){var Le;(Le=S())==null||Le.apply(this,xe)}),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Ie,F=>{get(L)==="new"&&F(Oe)})}var Ge=sibling(Ie,2);{var yt=F=>{var X=root_27(),Ce=child(X);{var te=De=>{var Ye=root_28(),st=sibling(child(Ye),4),ct=sibling(st,2);reset(Ye),template_effect(()=>set_attribute(st,"href",`${g()??""}/feedback/replay?id=${get(en)??""}`)),delegated("click",ct,()=>{set(en,null),set(Nn,!1)}),append(De,Ye)};if_block(Ce,De=>{get(en)&&get(Nn)&&De(te)})}var ye=sibling(Ce,2);RequestList(ye,{get endpoint(){return g()},get loading(){return get(qe)},get error(){return get(St)},onreload:Tt,get userId(){return b()},get userName(){return w()},get userEmail(){return y()},get taskLinkTemplate(){return O()},get reports(){return get(We)},set reports(De){set(We,De,!0)}}),reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Ge,F=>{get(L)==="requests"&&F(yt)})}var Nt=sibling(Ge,2);{var tt=F=>{var X=root_29(),Ce=child(X);{let te=user_derived(()=>{var ye;return((ye=get(V))==null?void 0:ye.getMaxSteps())??20});AgentPanel(Ce,{get messages(){return get(je)},get agentState(){return get(Re)},get currentStep(){return get(nt)},get maxSteps(){return get(te)},get autoApprove(){return get(ze)},onsend:fe,onstop:ke,onapprove:ie,onskip:Se,onautoapprovechange:$e})}reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Nt,F=>{get(L)==="agent"&&get(j)&&F(tt)})}var Qe=sibling(Nt,2);{var et=F=>{var X=root_30(),Ce=child(X);NotesPanel(Ce,{get endpoint(){return g()},get project(){return m()},onnoteschanged:se}),reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Qe,F=>{get(L)==="notes"&&get(q)&&F(et)})}var He=sibling(Qe,2);{var Ze=F=>{var X=root_31(),Ce=child(X),te=child(Ce);{var ye=Ne=>{var Be=root_32(),Je=sibling(first_child(Be),2),vt=child(Je);reset(Je),next(2),delegated("click",vt,W),append(Ne,Be)},De=Ne=>{var Be=root_33(),Je=sibling(first_child(Be),2),vt=child(Je);next(2),reset(Je),delegated("click",vt,J),append(Ne,Be)},Ye=Ne=>{var Be=root_34();append(Ne,Be)},st=Ne=>{var Be=root_35();next(2),append(Ne,Be)},ct=Ne=>{var Be=root_36(),Je=child(Be);{var vt=Xe=>{var ut=root_37(),sn=child(ut);each(sn,21,()=>get(ue),index,(Br,Ur,Tr)=>{var Rr=root_38();template_effect(()=>set_class(Rr,1,`voice-task-dot ${Tr===get(T)?"voice-task-dot-active":""}`,"svelte-nv4d5v")),append(Br,Rr)}),reset(sn);var Cr=sibling(sn,2),Ir=child(Cr);reset(Cr),reset(ut),template_effect(()=>set_text(Ir,`Task ${get(T)+1} of ${get(ue).length??""}`)),append(Xe,ut)};if_block(Je,Xe=>{get(ue).length>1&&Xe(vt)})}var wt=sibling(Je,4);{var Lt=Xe=>{var ut=root_39(),sn=child(ut,!0);reset(ut),template_effect(()=>set_text(sn,get(re))),append(Xe,ut)};if_block(wt,Xe=>{get(re)&&Xe(Lt)})}var zt=sibling(wt,2),mt=sibling(child(zt),2);remove_input_defaults(mt),reset(zt);var it=sibling(zt,2),Ot=sibling(child(it),2);remove_textarea_child(Ot),reset(it);var _t=sibling(it,2),Pt=child(_t),Wt=sibling(Pt,2);{var Yt=Xe=>{var ut=root_40();delegated("click",ut,U),append(Xe,ut)};if_block(Wt,Xe=>{get(ue).length>1&&Xe(Yt)})}var Kt=sibling(Wt,2),Vt=child(Kt);{var qn=Xe=>{var ut=text("Submit & next →");append(Xe,ut)},wn=Xe=>{var ut=text("Submit as feedback");append(Xe,ut)};if_block(Vt,Xe=>{get(ue).length>1&&get(T)<get(ue).length-1?Xe(qn):Xe(wn,!1)})}reset(Kt),reset(_t),reset(Be),template_effect(Xe=>Kt.disabled=Xe,[()=>!get(ve).trim()]),bind_value(mt,()=>get(ve),Xe=>set(ve,Xe)),bind_value(Ot,()=>get(de),Xe=>set(de,Xe)),delegated("click",Pt,Ae),delegated("click",Kt,he),append(Ne,Be)},Ut=Ne=>{var Be=root_43();next(2),append(Ne,Be)},Ke=Ne=>{var Be=root_44(),Je=sibling(first_child(Be),2),vt=child(Je,!0);reset(Je);var wt=sibling(Je,2);template_effect(()=>set_text(vt,get(re))),delegated("click",wt,Ae),append(Ne,Be)};if_block(te,Ne=>{get(ne)==="idle"?Ne(ye):get(ne)==="recording"?Ne(De,1):get(ne)==="uploading"?Ne(Ye,2):get(ne)==="transcribing"?Ne(st,3):get(ne)==="confirming"?Ne(ct,4):get(ne)==="submitted"?Ne(Ut,5):get(ne)==="error"&&Ne(Ke,6)})}reset(Ce),reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(He,F=>{get(L)==="voice"&&F(Ze)})}var ft=sibling(He,2);StatusToast(ft,{get message(){return get(hr)},get type(){return get(gr)},get visible(){return get(jn)}}),reset(kn);var Bt=sibling(kn,2);{var rt=F=>{AnnotationEditor(F,{get imageDataUrl(){return get(hn)},onsave:Wn,oncancel:tr})};if_block(Bt,F=>{get(tn)!==null&&F(rt)})}return template_effect(()=>{sr=set_class(or,1,"tab svelte-nv4d5v",null,sr,{active:get(L)==="new"}),wr=set_class(zn,1,"tab svelte-nv4d5v",null,wr,{active:get(L)==="requests"}),Er=set_class(lr,1,"tab svelte-nv4d5v",null,Er,{active:get(L)==="notes"}),Sr=set_class(kr,1,"tab svelte-nv4d5v",null,Sr,{active:get(L)==="voice"})}),delegated("keydown",kn,Gn),delegated("keyup",kn,Gn),event("keypress",kn,Gn),delegated("click",or,()=>set(L,"new")),delegated("click",zn,()=>set(L,"requests")),delegated("click",lr,()=>{set(L,"notes"),set(q,!0)}),delegated("click",kr,()=>set(L,"voice")),delegated("click",Zr,function(...F){var X;(X=S())==null||X.apply(this,F)}),append(d,br),pop(Lr)}delegate(["keydown","keyup","mousedown","click","change"]),create_custom_element(FeedbackPanel,{endpoint:{},project:{},isOpen:{},userId:{},userEmail:{},userName:{},userRole:{},orgId:{},orgName:{},onclose:{},ongrip:{},agentProxy:{},agentModel:{},agentContext:{},registeredTools:{},supabaseUrl:{},supabaseAnonKey:{},taskLinkTemplate:{}},[],[],{mode:"open"});var root_1=from_html("<div><!></div>"),root_2=from_html('<div class="jat-feedback-panel svelte-qpyrvv"><div class="no-endpoint svelte-qpyrvv"><p class="svelte-qpyrvv">No endpoint configured.</p> <p class="svelte-qpyrvv">Add the <code class="svelte-qpyrvv">endpoint</code> attribute:</p> <code class="example svelte-qpyrvv">&lt;jat-feedback endpoint="http://localhost:3333"&gt;</code></div></div>'),root=from_html('<div class="jat-feedback-root svelte-qpyrvv" data-page-agent-not-interactive=""><!> <!></div>');const $$css={hash:"svelte-qpyrvv",code:`.jat-feedback-root.svelte-qpyrvv {position:fixed;z-index:2147483647;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;}.jat-feedback-panel.svelte-qpyrvv {position:absolute;
448
+ /* Voice confirmation UI */.voice-confirm.svelte-nv4d5v {display:flex;flex-direction:column;gap:0.75rem;width:100%;text-align:left;}.voice-confirm-hint.svelte-nv4d5v {font-size:12px;color:#9ca3af;margin:0;line-height:1.4;}.voice-confirm-field.svelte-nv4d5v {display:flex;flex-direction:column;gap:0.25rem;}.voice-confirm-label.svelte-nv4d5v {font-size:11px;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:0.04em;}.voice-confirm-input.svelte-nv4d5v {width:100%;background:#1f2937;border:1px solid #374151;border-radius:6px;color:#e5e7eb;font-size:13px;font-family:inherit;padding:0.5rem 0.625rem;box-sizing:border-box;outline:none;transition:border-color 0.15s;}.voice-confirm-input.svelte-nv4d5v:focus {border-color:#4b6cf7;}.voice-confirm-textarea.svelte-nv4d5v {width:100%;background:#1f2937;border:1px solid #374151;border-radius:6px;color:#e5e7eb;font-size:13px;font-family:inherit;padding:0.5rem 0.625rem;box-sizing:border-box;resize:vertical;outline:none;transition:border-color 0.15s;min-height:80px;}.voice-confirm-textarea.svelte-nv4d5v:focus {border-color:#4b6cf7;}.voice-confirm-actions.svelte-nv4d5v {display:flex;align-items:center;justify-content:space-between;margin-top:0.25rem;}.voice-btn-submit.svelte-nv4d5v {background:#1d4ed8;color:white;padding:0.5rem 1.125rem;font-size:13px;}.voice-btn-submit.svelte-nv4d5v:hover:not(:disabled) {background:#2563eb;}.voice-btn-submit.svelte-nv4d5v:disabled {opacity:0.45;cursor:not-allowed;}.voice-task-nav.svelte-nv4d5v {display:flex;align-items:center;justify-content:space-between;margin-bottom:0.5rem;}.voice-task-dots.svelte-nv4d5v {display:flex;gap:5px;align-items:center;}.voice-task-dot.svelte-nv4d5v {width:7px;height:7px;border-radius:50%;background:#374151;transition:background 0.2s;}.voice-task-dot-active.svelte-nv4d5v {background:#1d4ed8;width:8px;height:8px;}.voice-task-counter.svelte-nv4d5v {font-size:11px;color:#6b7280;font-weight:500;letter-spacing:0.02em;}.voice-btn-skip.svelte-nv4d5v {background:transparent;color:#6b7280;border:1px solid #374151;padding:0.5rem 0.875rem;font-size:13px;}.voice-btn-skip.svelte-nv4d5v:hover {color:#9ca3af;border-color:#4b5563;}`};function FeedbackPanel(d,p){push(p,!0),append_styles(d,$$css$1);const h="3.7.1";let g=prop(p,"endpoint",7),m=prop(p,"project",7),_=prop(p,"isOpen",7,!1),b=prop(p,"userId",7,""),y=prop(p,"userEmail",7,""),w=prop(p,"userName",7,""),x=prop(p,"userRole",7,""),E=prop(p,"orgId",7,""),k=prop(p,"orgName",7,""),S=prop(p,"onclose",7),I=prop(p,"ongrip",7),R=prop(p,"agentProxy",7,""),z=prop(p,"agentModel",7,""),A=prop(p,"agentContext",7,""),C=prop(p,"registeredTools",23,()=>[]),$=prop(p,"supabaseUrl",7,""),N=prop(p,"supabaseAnonKey",7,""),O=prop(p,"taskLinkTemplate",7,""),L=state("new"),j=state(!1),q=state(!1),H=state(!1),le=state(proxy([]));function _e(){if(get(H)){const F=stopRecording();set(le,F,!0),set(H,!1),Zt(`Session recorded (${F.length} events)`,"success")}else startRecording(),set(le,[],!0),set(H,!0),Zt("Recording session...","info")}let ne=state("idle"),re=state(""),ge=state(null),ce=[],be=state(null),ve=state(""),de=state(""),ue=state(proxy([])),T=state(0),M=null,D=null,P=null;function G(){if(M&&(clearTimeout(M),M=null),D){try{D.close()}catch{}D=null}P&&(clearInterval(P),P=null)}function oe(F){G(),set(ue,F.filter(X=>X.title||X.description),!0),get(ue).length===0&&set(ue,[{title:"",description:""}],!0),set(T,0),set(ve,get(ue)[0].title||"",!0),set(de,get(ue)[0].description||"",!0),set(ne,"confirming"),set(re,"")}function we(F="Transcription failed. Try again."){G(),set(ne,"error"),set(re,F,!0)}function ee(){set(ue,get(ue).map((F,X)=>X===get(T)?{title:get(ve),description:get(de)}:F),!0),get(T)<get(ue).length-1?(update(T),set(ve,get(ue)[get(T)].title||"",!0),set(de,get(ue)[get(T)].description||"",!0),set(ne,"confirming")):(set(ne,"submitted"),set(re,""),set(L,"requests"),Tt(),setTimeout(()=>{Ae(),S()()},1500))}function U(){get(T)<get(ue).length-1?(update(T),set(ve,get(ue)[get(T)].title||"",!0),set(de,get(ue)[get(T)].description||"",!0)):Ae()}function ae(F){const Ce=$().replace(/\/$/,"").replace(/^https/,"wss").replace(/^http/,"ws")+`/realtime/v1/websocket?apikey=${N()}&vsn=1.0.0`;let te,ye=null,De=1;function Ye(){return String(De++)}try{te=new WebSocket(Ce)}catch{Q(F);return}D=te,te.onopen=()=>{const st=Ye();te.send(JSON.stringify({topic:"realtime:*",event:"phx_join",payload:{config:{broadcast:{self:!1},presence:{key:""},postgres_changes:[{event:"UPDATE",schema:"public",table:"project_tasks",filter:`id=eq.${F}`}]},access_token:N()},ref:st,join_ref:st})),ye=setInterval(()=>{te.readyState===WebSocket.OPEN&&te.send(JSON.stringify({topic:"phoenix",event:"heartbeat",payload:{},ref:Ye()}))},3e4)},te.onmessage=async st=>{var Ut;let ct;try{ct=JSON.parse(st.data)}catch{return}if(ct.event==="postgres_changes"&&((Ut=ct.payload)!=null&&Ut.data)){const{type:Ke,record:Ne}=ct.payload.data;if(Ke==="UPDATE"&&Ne)if(Ne.status==="open")ye&&clearInterval(ye),oe([{title:Ne.title||"",description:Ne.description||""}]);else if(Ne.status==="voice_split"){ye&&clearInterval(ye);try{const Be=JSON.parse(Ne.description||"{}").taskIds||[];if(Be.length>0){const Je=`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=in.(${Be.join(",")})&select=id,title,description&order=created_at`,vt=await fetch(Je,{headers:{apikey:N(),Authorization:`Bearer ${N()}`}});if(vt.ok){const wt=await vt.json();oe(wt.map(Lt=>({title:Lt.title||"",description:Lt.description||""})));return}}}catch{}oe([{title:Ne.title||"",description:""}])}else Ne.status==="failed"&&(ye&&clearInterval(ye),we("Transcription failed. Try again."))}},te.onerror=()=>{ye&&clearInterval(ye),D=null,Q(F)},te.onclose=()=>{ye&&clearInterval(ye)}}function Q(F){P||(P=setInterval(async()=>{try{let X=null,Ce="",te="",ye=[];if($()&&N()){const De=`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=eq.${F}&select=id,status,title,description`,Ye=await fetch(De,{headers:{apikey:N(),Authorization:`Bearer ${N()}`}});if(Ye.ok){const st=await Ye.json();if(Array.isArray(st)&&st.length>0&&(X=st[0].status,Ce=st[0].title||"",te=st[0].description||"",X==="voice_split"))try{const ct=JSON.parse(te||"{}").taskIds||[];if(ct.length>0){const Ut=`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=in.(${ct.join(",")})&select=id,title,description&order=created_at`,Ke=await fetch(Ut,{headers:{apikey:N(),Authorization:`Bearer ${N()}`}});Ke.ok&&(ye=(await Ke.json()).map(Be=>({title:Be.title||"",description:Be.description||""})))}}catch{}}}else{const De=await fetch(`${g().replace(/\/$/,"")}/api/tasks/voice?id=${encodeURIComponent(F)}`);if(De.ok){const Ye=await De.json();X=Ye.status,Array.isArray(Ye.tasks)&&Ye.tasks.length>0?ye=Ye.tasks:(Ce=Ye.title||"",te=Ye.description||"")}}if(X==="open"||X==="voice_split"){clearInterval(P),P=null;const De=ye.length>0?ye:[{title:Ce,description:te}];oe(De)}else X==="failed"&&(clearInterval(P),P=null,we("Transcription failed. Try again."))}catch{}},3e3))}function Ee(F){M=setTimeout(()=>{G(),set(ne,"error"),set(re,"Transcription timed out (30s). Try again.")},3e4),$()&&N()?ae(F):Q(F)}async function W(){var F;try{const X=await navigator.mediaDevices.getUserMedia({audio:!0}),Ce=MediaRecorder.isTypeSupported("audio/webm;codecs=opus")?"audio/webm;codecs=opus":MediaRecorder.isTypeSupported("audio/webm")?"audio/webm":"audio/ogg",te=new MediaRecorder(X,{mimeType:Ce});ce=[],te.ondataavailable=ye=>{ye.data.size>0&&ce.push(ye.data)},te.onstop=()=>{X.getTracks().forEach(ye=>ye.stop()),me(new Blob(ce,{type:Ce}),Ce)},te.start(500),set(ge,te,!0),set(ne,"recording"),set(re,"")}catch(X){set(ne,"error"),set(re,(F=X.message)!=null&&F.includes("Permission")?"Microphone permission denied":"Could not start recording",!0)}}function J(){get(ge)&&get(ge).state!=="inactive"&&get(ge).stop(),set(ge,null),set(ne,"uploading"),set(re,"")}async function me(F,X){set(ne,"uploading");try{const Ce=X.includes("webm")?"webm":X.includes("ogg")?"ogg":"audio",te=new FormData;te.append("audio",F,`voice-note.${Ce}`),m()&&te.append("project",m()),b()&&te.append("user_id",b());const ye=await fetch(`${g().replace(/\/$/,"")}/api/tasks/voice`,{method:"POST",body:te});if(ye.ok){const Ye=(await ye.json()).id;if(!Ye)throw new Error("No task ID returned from server");set(be,Ye,!0),set(ne,"transcribing"),set(re,""),Ee(Ye)}else{const De=await ye.json().catch(()=>({}));throw new Error(De.error||De.message||`Upload failed (${ye.status})`)}}catch(Ce){set(ne,"error"),set(re,Ce.message||"Failed to upload recording",!0)}finally{ce=[]}}async function he(){if(get(be)){set(ne,"uploading"),set(re,"");try{if($()&&N()){const F=await fetch(`${$().replace(/\/$/,"")}/rest/v1/project_tasks?id=eq.${get(be)}`,{method:"PATCH",headers:{apikey:N(),Authorization:`Bearer ${N()}`,"Content-Type":"application/json",Prefer:"return=minimal"},body:JSON.stringify({title:get(ve),description:get(de),status:"open"})});if(!F.ok)throw new Error(`HTTP ${F.status}`)}else{const F=await fetch(`${g().replace(/\/$/,"")}/api/tasks/voice?id=${encodeURIComponent(get(be))}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:get(ve),description:get(de),status:"open"})});if(!F.ok){const X=await F.json().catch(()=>({}));throw new Error(X.error||`HTTP ${F.status}`)}}ee()}catch(F){set(ne,"confirming"),set(re,F.message||"Failed to submit. Please try again.",!0)}}}function Ae(){G(),get(ge)&&get(ge).state!=="inactive"&&get(ge).stop(),set(ge,null),set(ne,"idle"),set(re,""),ce=[],set(be,null),set(ve,""),set(de,""),set(ue,[],!0),set(T,0)}let je=state(proxy([])),Re=state("idle"),nt=state(0),ze=state(!1),V=state(null);function Y(){return get(V)||set(V,new AgentBridge({proxyUrl:R(),model:z()||void 0,maxSteps:20,appContext:A()||void 0,endpoint:g(),project:m(),registeredTools:C(),onMessagesChange:F=>{set(je,F,!0)},onStateChange:(F,X)=>{set(Re,F,!0),set(nt,X,!0)}}),!0),get(V)}function se(){var F;(F=get(V))==null||F.invalidateNotesCache()}user_effect(()=>{get(L)==="agent"&&!get(j)&&set(j,!0)}),user_effect(()=>{get(L)==="notes"&&!get(q)&&set(q,!0)});function fe(F){Y().execute(F)}function ke(){var F;(F=get(V))==null||F.stop()}function ie(F){var X;(X=get(V))==null||X.approve(F)}function Se(F){var X;(X=get(V))==null||X.skip(F)}function $e(F){set(ze,F,!0),get(V)&&(get(V).autoApprove=F)}onDestroy(()=>{var F;(F=get(V))==null||F.dispose(),G(),get(ge)&&get(ge).state!=="inactive"&&get(ge).stop()});let We=state(proxy([])),qe=state(!1),St=state(""),qt=user_derived(()=>get(We).filter(F=>F.status==="completed").length);async function Tt(){set(qe,!0),set(St,"");const F=await fetchReports(g());set(We,F.reports,!0),F.error&&set(St,F.error,!0),set(qe,!1)}user_effect(()=>{g()&&Tt()});let Rt=state(""),pn=state(""),ht=state("bug"),gt=state("medium"),Ve=state(proxy([])),Z=state(proxy([])),pe=state(proxy([])),Te=state(proxy([])),Pe=state(proxy([])),ot=state(void 0);const Ct=["image/png","image/jpeg","image/gif","image/webp","image/svg+xml"];function Mt(){var F;(F=get(ot))==null||F.click()}async function Un(F){const X=F.target,Ce=X.files;if(!(!Ce||Ce.length===0)){for(const te of Ce)try{const ye=await It(te);Ct.includes(te.type)?(set(Ve,[...get(Ve),ye],!0),Zt(`Image added: ${te.name}`,"success")):(set(Z,[...get(Z),{name:te.name,type:te.type||"application/octet-stream",data:ye,size:te.size}],!0),Zt(`File attached: ${te.name}`,"success"))}catch{Zt(`Failed to read: ${te.name}`,"error")}X.value=""}}function It(F){return new Promise((X,Ce)=>{const te=new FileReader;te.onload=()=>X(te.result),te.onerror=()=>Ce(te.error),te.readAsDataURL(F)})}function bt(F){set(Z,get(Z).filter((X,Ce)=>Ce!==F),!0)}function At(F){return F<1024?`${F}B`:F<1024*1024?`${(F/1024).toFixed(1)}KB`:`${(F/(1024*1024)).toFixed(1)}MB`}let K=state(!1),Ft=state(!1),rn=state(!1),en=state(null),Nn=state(!1),tn=state(null),hn=state(""),er=state(void 0),$n=!1;user_effect(()=>{_()&&!$n&&(requestAnimationFrame(()=>{requestAnimationFrame(()=>{var F;(F=get(er))==null||F.focus()})}),get(L)==="new"&&setTimeout(()=>{captureViewportQuick().then(F=>{get(Ve).length===0?set(Ve,[F],!0):set(Ve,[F,...get(Ve).slice(1)],!0)}).catch(()=>{})},300)),$n=_()});let hr=state(""),gr=state("success"),jn=state(!1);function Zt(F,X){set(hr,F,!0),set(gr,X,!0),set(jn,!0),setTimeout(()=>{set(jn,!1)},3e3)}async function vr(){set(Ft,!0);try{const F=await captureViewport();set(hn,F,!0),set(tn,get(Ve).length,!0)}catch(F){console.error("[jat-feedback] Screenshot failed:",F),Zt("Screenshot failed: "+(F instanceof Error?F.message:"unknown error"),"error")}finally{set(Ft,!1)}}function Mn(F){set(Ve,get(Ve).filter((X,Ce)=>Ce!==F),!0)}function En(F){set(hn,get(Ve)[F],!0),set(tn,F,!0)}function Wn(F){get(tn)!==null&&(get(tn)>=get(Ve).length?(set(Ve,[...get(Ve),F],!0),Zt(`Screenshot captured (${get(Ve).length})`,"success")):(set(Ve,get(Ve).map((X,Ce)=>Ce===get(tn)?F:X),!0),Zt("Screenshot updated","success"))),set(tn,null),set(hn,"")}function tr(){get(tn)!==null&&get(tn)>=get(Ve).length&&(set(Ve,[...get(Ve),get(hn)],!0),Zt(`Screenshot captured (${get(Ve).length})`,"success")),set(tn,null),set(hn,"")}function Vn(){set(rn,!0),startElementPicker(F=>{set(pe,[...get(pe),F],!0),set(rn,!1),Zt(`Element captured: <${F.tagName.toLowerCase()}>`,"success")})}function mr(){set(Te,getCapturedLogs(),!0),set(Pe,getCapturedRequests(),!0)}async function _r(F){if(F.preventDefault(),!get(Rt).trim())return;set(K,!0),mr();const X={};if((b()||y()||w()||x())&&(X.reporter={},b()&&(X.reporter.userId=b()),y()&&(X.reporter.email=y()),w()&&(X.reporter.name=w()),x()&&(X.reporter.role=x())),(E()||k())&&(X.organization={},E()&&(X.organization.id=E()),k()&&(X.organization.name=k())),get(H)){const ye=stopRecording();set(le,ye,!0),set(H,!1)}let Ce;if(get(le).length>0){const ye=crypto.randomUUID(),De=await uploadRecording(g(),get(le),ye);De.ok&&De.recording_url&&(Ce=De.recording_url)}const te={title:get(Rt).trim(),description:get(pn).trim(),type:get(ht),priority:get(gt),project:m()||"",page_url:window.location.href,user_agent:navigator.userAgent,console_logs:get(Te).length>0?get(Te):null,network_requests:get(Pe).length>0?get(Pe):null,selected_elements:get(pe).length>0?get(pe):null,recording_events:null,screenshots:get(Ve).length>0?get(Ve):null,attachments:get(Z).length>0?get(Z):null,metadata:Object.keys(X).length>0?X:null,recording_url:Ce||null};try{const ye=await submitReport(g(),te);if(ye.ok){if(te.recording_url){const De={recording_url:te.recording_url,console_logs:te.console_logs,network_requests:te.network_requests};Y().setReportContext(De)}set(en,ye.id,!0),set(Nn,!!te.recording_url),Zt(`Report submitted (${ye.id})`,"success"),zr(),Tt(),set(L,"requests"),setTimeout(()=>S()(),1200)}else enqueue(g(),te),Zt("Queued for retry (endpoint unreachable)","error")}catch{enqueue(g(),te),Zt("Queued for retry (endpoint unreachable)","error")}finally{set(K,!1)}}function zr(){set(Rt,""),set(pn,""),set(ht,"bug"),set(gt,"medium"),set(Ve,[],!0),set(Z,[],!0),set(pe,[],!0),set(Te,[],!0),set(Pe,[],!0),set(le,[],!0),get(H)&&(stopRecording(),set(H,!1))}user_effect(()=>{mr()});function Gn(F){F.stopPropagation()}const Or=[{value:"bug",label:"Bug"},{value:"enhancement",label:"Enhancement"},{value:"other",label:"Other"}],Dr=[{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"},{value:"critical",label:"Critical"}];function nr(){return get(Ve).length+get(Z).length+get(pe).length}var Lr={get endpoint(){return g()},set endpoint(F){g(F),flushSync()},get project(){return m()},set project(F){m(F),flushSync()},get isOpen(){return _()},set isOpen(F=!1){_(F),flushSync()},get userId(){return b()},set userId(F=""){b(F),flushSync()},get userEmail(){return y()},set userEmail(F=""){y(F),flushSync()},get userName(){return w()},set userName(F=""){w(F),flushSync()},get userRole(){return x()},set userRole(F=""){x(F),flushSync()},get orgId(){return E()},set orgId(F=""){E(F),flushSync()},get orgName(){return k()},set orgName(F=""){k(F),flushSync()},get onclose(){return S()},set onclose(F){S(F),flushSync()},get ongrip(){return I()},set ongrip(F){I(F),flushSync()},get agentProxy(){return R()},set agentProxy(F=""){R(F),flushSync()},get agentModel(){return z()},set agentModel(F=""){z(F),flushSync()},get agentContext(){return A()},set agentContext(F=""){A(F),flushSync()},get registeredTools(){return C()},set registeredTools(F=[]){C(F),flushSync()},get supabaseUrl(){return $()},set supabaseUrl(F=""){$(F),flushSync()},get supabaseAnonKey(){return N()},set supabaseAnonKey(F=""){N(F),flushSync()},get taskLinkTemplate(){return O()},set taskLinkTemplate(F=""){O(F),flushSync()}},br=root$1(),kn=first_child(br),rr=child(kn),yr=child(rr);{var Fr=F=>{var X=root_1$1();delegated("mousedown",X,function(...Ce){var te;(te=I())==null||te.apply(this,Ce)}),append(F,X)};if_block(yr,F=>{I()&&F(Fr)})}var Hn=sibling(yr,2),or=child(Hn);let sr;var zn=sibling(or,2);let wr;var xr=sibling(child(zn),2);{var Pr=F=>{var X=root_2$1(),Ce=child(X,!0);reset(X),template_effect(()=>set_text(Ce,get(qt))),append(F,X)};if_block(xr,F=>{get(qt)>0&&F(Pr)})}reset(zn);var ir=sibling(zn,2);{var ar=F=>{var X=root_3();let Ce;template_effect(()=>Ce=set_class(X,1,"tab svelte-nv4d5v",null,Ce,{active:get(L)==="agent"})),delegated("click",X,()=>{set(L,"agent"),set(j,!0)}),append(F,X)};if_block(ir,F=>{R()&&F(ar)})}var lr=sibling(ir,2);let Er;var kr=sibling(lr,2);let Sr;reset(Hn);var Zr=sibling(Hn,2);reset(rr);var Ie=sibling(rr,2);{var Oe=F=>{var X=root_4(),Ce=child(X),te=sibling(child(Ce),2);remove_input_defaults(te),bind_this(te,xe=>set(er,xe),()=>get(er)),reset(Ce);var ye=sibling(Ce,2),De=sibling(child(ye),2);remove_textarea_child(De),reset(ye);var Ye=sibling(ye,2),st=child(Ye),ct=sibling(child(st),2);each(ct,21,()=>Or,index,(xe,Le)=>{var dt=root_5(),xt=child(dt,!0);reset(dt);var pt={};template_effect(()=>{set_text(xt,get(Le).label),pt!==(pt=get(Le).value)&&(dt.value=(dt.__value=get(Le).value)??"")}),append(xe,dt)}),reset(ct),reset(st);var Ut=sibling(st,2),Ke=sibling(child(Ut),2);each(Ke,21,()=>Dr,index,(xe,Le)=>{var dt=root_6(),xt=child(dt,!0);reset(dt);var pt={};template_effect(()=>{set_text(xt,get(Le).label),pt!==(pt=get(Le).value)&&(dt.value=(dt.__value=get(Le).value)??"")}),append(xe,dt)}),reset(Ke),reset(Ut),reset(Ye);var Ne=sibling(Ye,2),Be=child(Ne),Je=child(Be),vt=child(Je);{var wt=xe=>{var Le=root_7();next(),append(xe,Le)},Lt=xe=>{var Le=root_8(),dt=sibling(first_child(Le),2);{var xt=pt=>{var $t=root_9(),Xt=child($t,!0);reset($t),template_effect(()=>set_text(Xt,get(Ve).length)),append(pt,$t)};if_block(dt,pt=>{get(Ve).length>0&&pt(xt)})}append(xe,Le)};if_block(vt,xe=>{get(Ft)?xe(wt):xe(Lt,!1)})}reset(Je);var zt=sibling(Je,2),mt=sibling(child(zt),2);{var it=xe=>{var Le=text("Click an element...");append(xe,Le)},Ot=xe=>{var Le=root_11(),dt=sibling(first_child(Le));{var xt=pt=>{var $t=root_12(),Xt=child($t,!0);reset($t),template_effect(()=>set_text(Xt,get(pe).length)),append(pt,$t)};if_block(dt,pt=>{get(pe).length>0&&pt(xt)})}append(xe,Le)};if_block(mt,xe=>{get(rn)?xe(it):xe(Ot,!1)})}reset(zt);var _t=sibling(zt,2);let Pt;var Wt=child(_t);{var Yt=xe=>{var Le=root_13();next(),append(xe,Le)},Kt=xe=>{var Le=root_14(),dt=sibling(first_child(Le),2);{var xt=pt=>{var $t=root_15(),Xt=child($t,!0);reset($t),template_effect(()=>set_text(Xt,get(le).length)),append(pt,$t)};if_block(dt,pt=>{get(le).length>0&&pt(xt)})}append(xe,Le)};if_block(Wt,xe=>{get(H)?xe(Yt):xe(Kt,!1)})}reset(_t);var Vt=sibling(_t,2),qn=sibling(child(Vt),2);{var wn=xe=>{var Le=root_16(),dt=child(Le,!0);reset(Le),template_effect(()=>set_text(dt,get(Z).length)),append(xe,Le)};if_block(qn,xe=>{get(Z).length>0&&xe(wn)})}reset(Vt);var Xe=sibling(Vt,2);bind_this(Xe,xe=>set(ot,xe),()=>get(ot)),reset(Be);var ut=sibling(Be,2);ScreenshotPreview(ut,{get screenshots(){return get(Ve)},get capturing(){return get(Ft)},oncapture:vr,onremove:Mn,onedit:En}),reset(Ne);var sn=sibling(Ne,2);{var Cr=xe=>{var Le=root_17();each(Le,21,()=>get(Z),index,(dt,xt,pt)=>{var $t=root_18(),Xt=child($t),Vr=child(Xt);{var cr=an=>{var ur=root_19();append(an,ur)},Gr=user_derived(()=>get(xt).type.includes("pdf")),Hr=an=>{var ur=root_20();append(an,ur)},On=user_derived(()=>get(xt).type.includes("markdown")||get(xt).name.endsWith(".md")),dr=an=>{var ur=root_21();append(an,ur)};if_block(Vr,an=>{get(Gr)?an(cr):get(On)?an(Hr,1):an(dr,!1)})}reset(Xt);var qr=sibling(Xt,2),vo=child(qr,!0);reset(qr);var Yr=sibling(qr,2),mo=child(Yr,!0);reset(Yr);var _o=sibling(Yr,2);reset($t),template_effect(an=>{set_text(vo,get(xt).name),set_text(mo,an)},[()=>At(get(xt).size)]),delegated("click",_o,()=>bt(pt)),append(dt,$t)}),reset(Le),append(xe,Le)};if_block(sn,xe=>{get(Z).length>0&&xe(Cr)})}var Ir=sibling(sn,2);{var Br=xe=>{var Le=root_22();each(Le,21,()=>get(pe),index,(dt,xt,pt)=>{var $t=root_23(),Xt=child($t),Vr=child(Xt);reset(Xt);var cr=sibling(Xt,2),Gr=child(cr,!0);reset(cr);var Hr=sibling(cr,2);reset($t),template_effect((On,dr)=>{set_text(Vr,`<${On??""}>`),set_text(Gr,dr)},[()=>get(xt).tagName.toLowerCase(),()=>{var On;return((On=get(xt).textContent)==null?void 0:On.substring(0,40))||get(xt).selector}]),delegated("click",Hr,()=>{set(pe,get(pe).filter((On,dr)=>dr!==pt),!0)}),append(dt,$t)}),reset(Le),append(xe,Le)};if_block(Ir,xe=>{get(pe).length>0&&xe(Br)})}var Ur=sibling(Ir,2);ConsoleLogList(Ur,{get logs(){return get(Te)}});var Tr=sibling(Ur,2);{var Rr=xe=>{var Le=root_24(),dt=child(Le);reset(Le),template_effect((xt,pt)=>set_text(dt,`${xt??""} attachment${pt??""} will be included`),[nr,()=>nr()>1?"s":""]),append(xe,Le)},uo=user_derived(()=>nr()>0);if_block(Tr,xe=>{get(uo)&&xe(Rr)})}var oo=sibling(Tr,2),jr=child(oo),fo=child(jr);reset(jr);var Wr=sibling(jr,2),Ar=sibling(Wr,2),po=child(Ar);{var ho=xe=>{var Le=root_25();next(),append(xe,Le)},go=xe=>{var Le=text("Submit");append(xe,Le)};if_block(po,xe=>{get(K)?xe(ho):xe(go,!1)})}reset(Ar),reset(oo),reset(X),template_effect(xe=>{te.disabled=get(K),De.disabled=get(K),ct.disabled=get(K),Ke.disabled=get(K),Je.disabled=get(Ft),zt.disabled=get(rn),Pt=set_class(_t,1,"tool-btn svelte-nv4d5v",null,Pt,{"recording-active":get(H)}),_t.disabled=get(K),Vt.disabled=get(K),set_text(fo,`v${h}`),Wr.disabled=get(K),Ar.disabled=xe,set_attribute(Ar,"title",get(H)?"Stop recording first, or click Submit to auto-stop":"")},[()=>get(K)||!get(Rt).trim()]),event("submit",X,_r),bind_value(te,()=>get(Rt),xe=>set(Rt,xe)),bind_value(De,()=>get(pn),xe=>set(pn,xe)),bind_select_value(ct,()=>get(ht),xe=>set(ht,xe)),bind_select_value(Ke,()=>get(gt),xe=>set(gt,xe)),delegated("click",Je,vr),delegated("click",zt,Vn),delegated("click",_t,_e),delegated("click",Vt,Mt),delegated("change",Xe,Un),delegated("click",Wr,function(...xe){var Le;(Le=S())==null||Le.apply(this,xe)}),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Ie,F=>{get(L)==="new"&&F(Oe)})}var Ge=sibling(Ie,2);{var yt=F=>{var X=root_27(),Ce=child(X);{var te=De=>{var Ye=root_28(),st=sibling(child(Ye),4),ct=sibling(st,2);reset(Ye),template_effect(()=>set_attribute(st,"href",`${g()??""}/feedback/replay?id=${get(en)??""}`)),delegated("click",ct,()=>{set(en,null),set(Nn,!1)}),append(De,Ye)};if_block(Ce,De=>{get(en)&&get(Nn)&&De(te)})}var ye=sibling(Ce,2);RequestList(ye,{get endpoint(){return g()},get loading(){return get(qe)},get error(){return get(St)},onreload:Tt,get userId(){return b()},get userName(){return w()},get userEmail(){return y()},get taskLinkTemplate(){return O()},get reports(){return get(We)},set reports(De){set(We,De,!0)}}),reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Ge,F=>{get(L)==="requests"&&F(yt)})}var Nt=sibling(Ge,2);{var tt=F=>{var X=root_29(),Ce=child(X);{let te=user_derived(()=>{var ye;return((ye=get(V))==null?void 0:ye.getMaxSteps())??20});AgentPanel(Ce,{get messages(){return get(je)},get agentState(){return get(Re)},get currentStep(){return get(nt)},get maxSteps(){return get(te)},get autoApprove(){return get(ze)},onsend:fe,onstop:ke,onapprove:ie,onskip:Se,onautoapprovechange:$e})}reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Nt,F=>{get(L)==="agent"&&get(j)&&F(tt)})}var Qe=sibling(Nt,2);{var et=F=>{var X=root_30(),Ce=child(X);NotesPanel(Ce,{get endpoint(){return g()},get project(){return m()},onnoteschanged:se}),reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(Qe,F=>{get(L)==="notes"&&get(q)&&F(et)})}var He=sibling(Qe,2);{var Ze=F=>{var X=root_31(),Ce=child(X),te=child(Ce);{var ye=Ne=>{var Be=root_32(),Je=sibling(first_child(Be),2),vt=child(Je);reset(Je),next(2),delegated("click",vt,W),append(Ne,Be)},De=Ne=>{var Be=root_33(),Je=sibling(first_child(Be),2),vt=child(Je);next(2),reset(Je),delegated("click",vt,J),append(Ne,Be)},Ye=Ne=>{var Be=root_34();append(Ne,Be)},st=Ne=>{var Be=root_35();next(2),append(Ne,Be)},ct=Ne=>{var Be=root_36(),Je=child(Be);{var vt=Xe=>{var ut=root_37(),sn=child(ut);each(sn,21,()=>get(ue),index,(Br,Ur,Tr)=>{var Rr=root_38();template_effect(()=>set_class(Rr,1,`voice-task-dot ${Tr===get(T)?"voice-task-dot-active":""}`,"svelte-nv4d5v")),append(Br,Rr)}),reset(sn);var Cr=sibling(sn,2),Ir=child(Cr);reset(Cr),reset(ut),template_effect(()=>set_text(Ir,`Task ${get(T)+1} of ${get(ue).length??""}`)),append(Xe,ut)};if_block(Je,Xe=>{get(ue).length>1&&Xe(vt)})}var wt=sibling(Je,4);{var Lt=Xe=>{var ut=root_39(),sn=child(ut,!0);reset(ut),template_effect(()=>set_text(sn,get(re))),append(Xe,ut)};if_block(wt,Xe=>{get(re)&&Xe(Lt)})}var zt=sibling(wt,2),mt=sibling(child(zt),2);remove_input_defaults(mt),reset(zt);var it=sibling(zt,2),Ot=sibling(child(it),2);remove_textarea_child(Ot),reset(it);var _t=sibling(it,2),Pt=child(_t),Wt=sibling(Pt,2);{var Yt=Xe=>{var ut=root_40();delegated("click",ut,U),append(Xe,ut)};if_block(Wt,Xe=>{get(ue).length>1&&Xe(Yt)})}var Kt=sibling(Wt,2),Vt=child(Kt);{var qn=Xe=>{var ut=text("Submit & next →");append(Xe,ut)},wn=Xe=>{var ut=text("Submit as feedback");append(Xe,ut)};if_block(Vt,Xe=>{get(ue).length>1&&get(T)<get(ue).length-1?Xe(qn):Xe(wn,!1)})}reset(Kt),reset(_t),reset(Be),template_effect(Xe=>Kt.disabled=Xe,[()=>!get(ve).trim()]),bind_value(mt,()=>get(ve),Xe=>set(ve,Xe)),bind_value(Ot,()=>get(de),Xe=>set(de,Xe)),delegated("click",Pt,Ae),delegated("click",Kt,he),append(Ne,Be)},Ut=Ne=>{var Be=root_43();next(2),append(Ne,Be)},Ke=Ne=>{var Be=root_44(),Je=sibling(first_child(Be),2),vt=child(Je,!0);reset(Je);var wt=sibling(Je,2);template_effect(()=>set_text(vt,get(re))),delegated("click",wt,Ae),append(Ne,Be)};if_block(te,Ne=>{get(ne)==="idle"?Ne(ye):get(ne)==="recording"?Ne(De,1):get(ne)==="uploading"?Ne(Ye,2):get(ne)==="transcribing"?Ne(st,3):get(ne)==="confirming"?Ne(ct,4):get(ne)==="submitted"?Ne(Ut,5):get(ne)==="error"&&Ne(Ke,6)})}reset(Ce),reset(X),transition(3,X,()=>slide,()=>({duration:200})),append(F,X)};if_block(He,F=>{get(L)==="voice"&&F(Ze)})}var ft=sibling(He,2);StatusToast(ft,{get message(){return get(hr)},get type(){return get(gr)},get visible(){return get(jn)}}),reset(kn);var Bt=sibling(kn,2);{var rt=F=>{AnnotationEditor(F,{get imageDataUrl(){return get(hn)},onsave:Wn,oncancel:tr})};if_block(Bt,F=>{get(tn)!==null&&F(rt)})}return template_effect(()=>{sr=set_class(or,1,"tab svelte-nv4d5v",null,sr,{active:get(L)==="new"}),wr=set_class(zn,1,"tab svelte-nv4d5v",null,wr,{active:get(L)==="requests"}),Er=set_class(lr,1,"tab svelte-nv4d5v",null,Er,{active:get(L)==="notes"}),Sr=set_class(kr,1,"tab svelte-nv4d5v",null,Sr,{active:get(L)==="voice"})}),delegated("keydown",kn,Gn),delegated("keyup",kn,Gn),event("keypress",kn,Gn),delegated("click",or,()=>set(L,"new")),delegated("click",zn,()=>set(L,"requests")),delegated("click",lr,()=>{set(L,"notes"),set(q,!0)}),delegated("click",kr,()=>set(L,"voice")),delegated("click",Zr,function(...F){var X;(X=S())==null||X.apply(this,F)}),append(d,br),pop(Lr)}delegate(["keydown","keyup","mousedown","click","change"]),create_custom_element(FeedbackPanel,{endpoint:{},project:{},isOpen:{},userId:{},userEmail:{},userName:{},userRole:{},orgId:{},orgName:{},onclose:{},ongrip:{},agentProxy:{},agentModel:{},agentContext:{},registeredTools:{},supabaseUrl:{},supabaseAnonKey:{},taskLinkTemplate:{}},[],[],{mode:"open"});var root_1=from_html("<div><!></div>"),root_2=from_html('<div class="jat-feedback-panel svelte-qpyrvv"><div class="no-endpoint svelte-qpyrvv"><p class="svelte-qpyrvv">No endpoint configured.</p> <p class="svelte-qpyrvv">Add the <code class="svelte-qpyrvv">endpoint</code> attribute:</p> <code class="example svelte-qpyrvv">&lt;jat-feedback endpoint="http://localhost:3333"&gt;</code></div></div>'),root=from_html('<div class="jat-feedback-root svelte-qpyrvv" data-page-agent-not-interactive=""><!> <!></div>');const $$css={hash:"svelte-qpyrvv",code:`.jat-feedback-root.svelte-qpyrvv {position:fixed;z-index:2147483647;font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;}.jat-feedback-panel.svelte-qpyrvv {position:absolute;
449
449
  animation: svelte-qpyrvv-panel-in 0.2s ease;}.jat-feedback-panel.hidden.svelte-qpyrvv {display:none;}.jat-feedback-panel.dragging.svelte-qpyrvv {pointer-events:none;opacity:0.9;}.no-endpoint.svelte-qpyrvv {width:320px;background:#111827;border:1px solid #374151;border-radius:12px;padding:20px;color:#d1d5db;font-size:13px;box-shadow:0 20px 60px rgba(0,0,0,0.4);}.no-endpoint.svelte-qpyrvv p:where(.svelte-qpyrvv) {margin:0 0 8px;}.no-endpoint.svelte-qpyrvv code:where(.svelte-qpyrvv) {font-family:'SF Mono', 'Fira Code', monospace;font-size:11px;color:#93c5fd;}.no-endpoint.svelte-qpyrvv code.example:where(.svelte-qpyrvv) {display:block;background:#1f2937;padding:8px 10px;border-radius:4px;margin-top:4px;}
450
450
  @keyframes svelte-qpyrvv-panel-in {
451
451
  from { opacity: 0; transform: translateY(8px) scale(0.96); }
@@ -18563,7 +18563,7 @@ const $$css$1 = {
18563
18563
  };
18564
18564
  function FeedbackPanel(d, p) {
18565
18565
  push(p, !0), append_styles(d, $$css$1);
18566
- const h = "3.7.0";
18566
+ const h = "3.7.1";
18567
18567
  let g = prop(p, "endpoint", 7), m = prop(p, "project", 7), _ = prop(p, "isOpen", 7, !1), b = prop(p, "userId", 7, ""), y = prop(p, "userEmail", 7, ""), w = prop(p, "userName", 7, ""), x = prop(p, "userRole", 7, ""), E = prop(p, "orgId", 7, ""), k = prop(p, "orgName", 7, ""), S = prop(p, "onclose", 7), I = prop(p, "ongrip", 7), R = prop(p, "agentProxy", 7, ""), z = prop(p, "agentModel", 7, ""), A = prop(p, "agentContext", 7, ""), C = prop(p, "registeredTools", 23, () => []), $ = prop(p, "supabaseUrl", 7, ""), N = prop(p, "supabaseAnonKey", 7, ""), O = prop(p, "taskLinkTemplate", 7, ""), L = /* @__PURE__ */ state("new"), j = /* @__PURE__ */ state(!1), q = /* @__PURE__ */ state(!1), H = /* @__PURE__ */ state(!1), le = /* @__PURE__ */ state(proxy([]));
18568
18568
  function _e() {
18569
18569
  if (get(H)) {
@@ -18597,9 +18597,9 @@ function FeedbackPanel(d, p) {
18597
18597
  description: get(de)
18598
18598
  } : F),
18599
18599
  !0
18600
- ), get(T) < get(ue).length - 1 ? (update(T), set(ve, get(ue)[get(T)].title || "", !0), set(de, get(ue)[get(T)].description || "", !0), set(ne, "confirming")) : (set(ne, "submitted"), set(re, ""), setTimeout(
18600
+ ), get(T) < get(ue).length - 1 ? (update(T), set(ve, get(ue)[get(T)].title || "", !0), set(de, get(ue)[get(T)].description || "", !0), set(ne, "confirming")) : (set(ne, "submitted"), set(re, ""), set(L, "requests"), St(), setTimeout(
18601
18601
  () => {
18602
- set(L, "requests"), St();
18602
+ Ae(), S()();
18603
18603
  },
18604
18604
  1500
18605
18605
  ));
@@ -19053,12 +19053,7 @@ function FeedbackPanel(d, p) {
19053
19053
  };
19054
19054
  Y().setReportContext(De);
19055
19055
  }
19056
- set(Yt, ye.id, !0), set(wn, !!te.recording_url), Lt(`Report submitted (${ye.id})`, "success"), Ar(), setTimeout(
19057
- () => {
19058
- St(), set(L, "requests");
19059
- },
19060
- 1200
19061
- );
19056
+ set(Yt, ye.id, !0), set(wn, !!te.recording_url), Lt(`Report submitted (${ye.id})`, "success"), Ar(), St(), set(L, "requests"), setTimeout(() => S()(), 1200);
19062
19057
  } else
19063
19058
  enqueue(g(), te), Lt("Queued for retry (endpoint unreachable)", "error");
19064
19059
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jat-feedback",
3
- "version": "3.7.0",
3
+ "version": "3.7.1",
4
4
  "description": "Embeddable feedback widget for bug reports and feature requests. Captures screenshots, console logs, and user context as a web component.",
5
5
  "type": "module",
6
6
  "main": "dist/jat-feedback.js",