@codemem/server 0.40.1 → 0.40.2

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/static/app.js CHANGED
@@ -111,4 +111,4 @@ ${e}</tr>
111
111
  Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error occurred:</p><pre>"+qt(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}},sr=new vI;function Pe(e,t){return sr.parse(e,t)}Pe.options=Pe.setOptions=function(e){return sr.setOptions(e),Pe.defaults=sr.defaults,bv(Pe.defaults),Pe},Pe.getDefaults=Zl,Pe.defaults=or,Pe.use=function(...e){return sr.use(...e),Pe.defaults=sr.defaults,bv(Pe.defaults),Pe},Pe.walkTokens=function(e,t){return sr.walkTokens(e,t)},Pe.parseInline=sr.parseInline,Pe.Parser=Dt,Pe.parser=Dt.parse,Pe.Renderer=ns,Pe.TextRenderer=cd,Pe.Lexer=Rt,Pe.lexer=Rt.lex,Pe.Tokenizer=ts,Pe.Hooks=zi,Pe.parse=Pe;var BO=Pe.options,UO=Pe.setOptions,GO=Pe.use,HO=Pe.walkTokens,KO=Pe.parseInline,WO=Pe,VO=Dt.parse,qO=Rt.lex,yI={ALLOWED_TAGS:["p","br","strong","em","code","pre","ul","ol","li","blockquote","a","h1","h2","h3","h4","h5","h6","hr"],ALLOWED_ATTR:["href","title"],ALLOW_DATA_ATTR:!1};function bI(e){const t=String(e||"").trim();if(!t)return!1;if(t.startsWith("#")||t.startsWith("/"))return!0;const n=t.toLowerCase();return n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")}yv.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&(bI(e.getAttribute("href")||"")?(e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank")):e.removeAttribute("href"))});function ld(e){const t=Pe.parse(String(e||""),{async:!1});return yv.sanitize(t,yI)}function _I(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=Object.keys(e);return t.filter(r=>n.includes(r)).map(r=>{const i=String(e[r]||"").trim();return i?y("div",{className:"summary-section",key:r},y("div",{className:"summary-section-label"},cA(r)),y("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:ld(i)}})):null}).filter(Boolean)}function wI(e){const t=e.map(n=>String(n||"").trim()).filter(Boolean);if(!t.length)return null;if(t.every(n=>/.+?:\s+.+/.test(n))){const n=t.map((r,i)=>{const o=r.indexOf(":"),s=r.slice(0,o).trim(),c=r.slice(o+1).trim();return!s||!c?null:y("div",{className:"summary-section",key:`${s}-${i}`},y("div",{className:"summary-section-label"},s),y("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:ld(c)}}))}).filter(Boolean);if(n.length)return y("div",{className:"feed-body facts"},n)}return y("div",{className:"feed-body"},y("ul",null,t.map((n,r)=>y("li",{key:`${n}-${r}`},n))))}function Mv(e,t="feed-body"){const n=String(e||"").trim();return n?y("div",{className:t,dangerouslySetInnerHTML:{__html:ld(n)}}):null}function SI(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=s=>{if(!s||typeof s!="object"||Array.isArray(s))return!1;const c=s;return t.some(l=>{const d=c[l];return typeof d=="string"&&d.trim().length>0})},r=e?.summary;if(r&&typeof r=="object"&&!Array.isArray(r)){const s=r.summary;if(n(r))return r;if(n(s))return s}const i=e?.metadata_json;if(n(i))return i;if(i&&n(i.summary))return i.summary;const o=String(e?.body_text||"").trim();if(o.includes("## ")){const s={request:"request",completed:"completed",learned:"learned",investigated:"investigated","next steps":"next_steps",notes:"notes"},c={},l=/(?:^|\n)##\s+([^\n]+)\n([\s\S]*?)(?=\n##\s+|$)/g;for(let d=l.exec(o);d;d=l.exec(o)){const u=s[String(d[1]||"").trim().toLowerCase()],p=String(d[2]||"").trim();u&&p&&(c[u]=p)}if(n(c))return c}return null}function rs(e,t){return String(e?.kind||"").toLowerCase()==="session_summary"||t?.is_summary===!0?!0:String(t?.source||"").trim().toLowerCase()==="observer_summary"}function CI(e,t){const n=String(e?.kind||"").trim().toLowerCase();return rs(e,t)?"session_summary":n||"change"}var dd=["Enter"," "],TI=["ArrowDown","PageUp","Home"],Ov=["ArrowUp","PageDown","End"],kI=[...TI,...Ov],NI={ltr:[...dd,"ArrowRight"],rtl:[...dd,"ArrowLeft"]},xI={ltr:["ArrowLeft"],rtl:["ArrowRight"]},Ji="Menu",[Yi,PI,AI]=la(Ji),[cr,jv]=st(Ji,[AI,wn,Dr]),Xi=wn(),Fv=Dr(),[Bv,En]=cr(Ji),[EI,Qi]=cr(Ji),Uv=e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:i,onOpenChange:o,modal:s=!0}=e,c=Xi(t),[l,d]=I(null),u=B(!1),p=lt(o),m=Ii(i);return K(()=>{const f=()=>{u.current=!0,document.addEventListener("pointerdown",g,{capture:!0,once:!0}),document.addEventListener("pointermove",g,{capture:!0,once:!0})},g=()=>u.current=!1;return document.addEventListener("keydown",f,{capture:!0}),()=>{document.removeEventListener("keydown",f,{capture:!0}),document.removeEventListener("pointerdown",g,{capture:!0}),document.removeEventListener("pointermove",g,{capture:!0})}},[]),a($i,{...c,children:a(Bv,{scope:t,open:n,onOpenChange:p,content:l,onContentChange:d,children:a(EI,{scope:t,onClose:re(()=>p(!1),[p]),isUsingKeyboardRef:u,dir:m,modal:s,children:r})})})};Uv.displayName=Ji;var II="MenuAnchor",ud=F((e,t)=>{const{__scopeMenu:n,...r}=e,i=Xi(n);return a(Mi,{...i,...r,ref:t})});ud.displayName=II;var pd="MenuPortal",[RI,Gv]=cr(pd,{forceMount:void 0}),Hv=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:i}=e,o=En(pd,t);return a(RI,{scope:t,forceMount:n,children:a(rt,{present:n||o.open,children:a(Kn,{asChild:!0,container:i,children:r})})})};Hv.displayName=pd;var St="MenuContent",[DI,md]=cr(St),Kv=F((e,t)=>{const n=Gv(St,e.__scopeMenu),{forceMount:r=n.forceMount,...i}=e,o=En(St,e.__scopeMenu),s=Qi(St,e.__scopeMenu);return a(Yi.Provider,{scope:e.__scopeMenu,children:a(rt,{present:r||o.open,children:a(Yi.Slot,{scope:e.__scopeMenu,children:s.modal?a(LI,{...i,ref:t}):a($I,{...i,ref:t})})})})}),LI=F((e,t)=>{const n=En(St,e.__scopeMenu),r=B(null),i=we(t,r);return K(()=>{const o=r.current;if(o)return zo(o)},[]),a(fd,{...e,ref:i,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:z(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})}),$I=F((e,t)=>{const n=En(St,e.__scopeMenu);return a(fd,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})}),MI=Gn("MenuContent.ScrollLock"),fd=F((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:i,onOpenAutoFocus:o,onCloseAutoFocus:s,disableOutsidePointerEvents:c,onEntryFocus:l,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:p,onInteractOutside:m,onDismiss:f,disableOutsideScroll:g,...h}=e,v=En(St,n),_=Qi(St,n),w=Xi(n),S=Fv(n),T=PI(n),[k,P]=I(null),E=B(null),M=we(t,E,v.onContentChange),U=B(0),x=B(""),G=B(0),A=B(null),$=B("right"),L=B(0),J=g?yi:te,H=g?{as:MI,allowPinchZoom:!0}:void 0,N=j=>{const V=x.current+j,ge=T().filter(fe=>!fe.disabled),le=document.activeElement,ce=ge.find(fe=>fe.ref.current===le)?.textValue,be=JI(ge.map(fe=>fe.textValue),V,ce),Y=ge.find(fe=>fe.textValue===be)?.ref.current;(function fe(X){x.current=X,window.clearTimeout(U.current),X!==""&&(U.current=window.setTimeout(()=>fe(""),1e3))})(V),Y&&setTimeout(()=>Y.focus())};K(()=>()=>window.clearTimeout(U.current),[]),Bo();const R=re(j=>$.current===A.current?.side&&XI(j,A.current?.area),[]);return a(DI,{scope:n,searchRef:x,onItemEnter:re(j=>{R(j)&&j.preventDefault()},[R]),onItemLeave:re(j=>{R(j)||(E.current?.focus(),P(null))},[R]),onTriggerLeave:re(j=>{R(j)&&j.preventDefault()},[R]),pointerGraceTimerRef:G,onPointerGraceIntentChange:re(j=>{A.current=j},[]),children:a(J,{...H,children:a(gi,{asChild:!0,trapped:i,onMountAutoFocus:z(o,j=>{j.preventDefault(),E.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:s,children:a(Hn,{asChild:!0,disableOutsidePointerEvents:c,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:p,onInteractOutside:m,onDismiss:f,children:a(zc,{asChild:!0,...S,dir:_.dir,orientation:"vertical",loop:r,currentTabStopId:k,onCurrentTabStopIdChange:P,onEntryFocus:z(l,j=>{_.isUsingKeyboardRef.current||j.preventDefault()}),preventScrollOnEntryFocus:!0,children:a(Pa,{role:"menu","aria-orientation":"vertical","data-state":sy(v.open),"data-radix-menu-content":"",dir:_.dir,...w,...h,ref:M,style:{outline:"none",...h.style},onKeyDown:z(h.onKeyDown,j=>{const V=j.target.closest("[data-radix-menu-content]")===j.currentTarget,ge=j.ctrlKey||j.altKey||j.metaKey,le=j.key.length===1;V&&(j.key==="Tab"&&j.preventDefault(),!ge&&le&&N(j.key));const ce=E.current;if(j.target!==ce||!kI.includes(j.key))return;j.preventDefault();const be=T().filter(Y=>!Y.disabled).map(Y=>Y.ref.current);Ov.includes(j.key)&&be.reverse(),qI(be)}),onBlur:z(e.onBlur,j=>{j.currentTarget.contains(j.target)||(window.clearTimeout(U.current),x.current="")}),onPointerMove:z(e.onPointerMove,eo(j=>{const V=j.target,ge=L.current!==j.clientX;j.currentTarget.contains(V)&&ge&&($.current=j.clientX>L.current?"right":"left",L.current=j.clientX)}))})})})})})})});Kv.displayName=St;var OI="MenuGroup",hd=F((e,t)=>{const{__scopeMenu:n,...r}=e;return a(se.div,{role:"group",...r,ref:t})});hd.displayName=OI;var jI="MenuLabel",Wv=F((e,t)=>{const{__scopeMenu:n,...r}=e;return a(se.div,{...r,ref:t})});Wv.displayName=jI;var is="MenuItem",Vv="menu.itemSelect",os=F((e,t)=>{const{disabled:n=!1,onSelect:r,...i}=e,o=B(null),s=Qi(is,e.__scopeMenu),c=md(is,e.__scopeMenu),l=we(t,o),d=B(!1),u=()=>{const p=o.current;if(!n&&p){const m=new CustomEvent(Vv,{bubbles:!0,cancelable:!0});p.addEventListener(Vv,f=>r?.(f),{once:!0}),dc(p,m),m.defaultPrevented?d.current=!1:s.onClose()}};return a(qv,{...i,ref:l,disabled:n,onClick:z(e.onClick,u),onPointerDown:p=>{e.onPointerDown?.(p),d.current=!0},onPointerUp:z(e.onPointerUp,p=>{d.current||p.currentTarget?.click()}),onKeyDown:z(e.onKeyDown,p=>{const m=c.searchRef.current!=="";n||m&&p.key===" "||dd.includes(p.key)&&(p.currentTarget.click(),p.preventDefault())})})});os.displayName=is;var qv=F((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:i,...o}=e,s=md(is,n),c=Fv(n),l=B(null),d=we(t,l),[u,p]=I(!1),[m,f]=I("");return K(()=>{const g=l.current;g&&f((g.textContent??"").trim())},[o.children]),a(Yi.ItemSlot,{scope:n,disabled:r,textValue:i??m,children:a(Jc,{asChild:!0,...c,focusable:!r,children:a(se.div,{role:"menuitem","data-highlighted":u?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0,...o,ref:d,onPointerMove:z(e.onPointerMove,eo(g=>{r?s.onItemLeave(g):(s.onItemEnter(g),g.defaultPrevented||g.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:z(e.onPointerLeave,eo(g=>s.onItemLeave(g))),onFocus:z(e.onFocus,()=>p(!0)),onBlur:z(e.onBlur,()=>p(!1))})})})}),FI="MenuCheckboxItem",zv=F((e,t)=>{const{checked:n=!1,onCheckedChange:r,...i}=e;return a(Zv,{scope:e.__scopeMenu,checked:n,children:a(os,{role:"menuitemcheckbox","aria-checked":as(n)?"mixed":n,...i,ref:t,"data-state":yd(n),onSelect:z(i.onSelect,()=>r?.(as(n)?!0:!n),{checkForDefaultPrevented:!1})})})});zv.displayName=FI;var Jv="MenuRadioGroup",[BI,UI]=cr(Jv,{value:void 0,onValueChange:()=>{}}),Yv=F((e,t)=>{const{value:n,onValueChange:r,...i}=e,o=lt(r);return a(BI,{scope:e.__scopeMenu,value:n,onValueChange:o,children:a(hd,{...i,ref:t})})});Yv.displayName=Jv;var Xv="MenuRadioItem",Qv=F((e,t)=>{const{value:n,...r}=e,i=UI(Xv,e.__scopeMenu),o=n===i.value;return a(Zv,{scope:e.__scopeMenu,checked:o,children:a(os,{role:"menuitemradio","aria-checked":o,...r,ref:t,"data-state":yd(o),onSelect:z(r.onSelect,()=>i.onValueChange?.(n),{checkForDefaultPrevented:!1})})})});Qv.displayName=Xv;var gd="MenuItemIndicator",[Zv,GI]=cr(gd,{checked:!1}),ey=F((e,t)=>{const{__scopeMenu:n,forceMount:r,...i}=e,o=GI(gd,n);return a(rt,{present:r||as(o.checked)||o.checked===!0,children:a(se.span,{...i,ref:t,"data-state":yd(o.checked)})})});ey.displayName=gd;var HI="MenuSeparator",ty=F((e,t)=>{const{__scopeMenu:n,...r}=e;return a(se.div,{role:"separator","aria-orientation":"horizontal",...r,ref:t})});ty.displayName=HI;var KI="MenuArrow",ny=F((e,t)=>{const{__scopeMenu:n,...r}=e,i=Xi(n);return a(Aa,{...i,...r,ref:t})});ny.displayName=KI;var vd="MenuSub",[WI,ry]=cr(vd),VI=e=>{const{__scopeMenu:t,children:n,open:r=!1,onOpenChange:i}=e,o=En(vd,t),s=Xi(t),[c,l]=I(null),[d,u]=I(null),p=lt(i);return K(()=>(o.open===!1&&p(!1),()=>p(!1)),[o.open,p]),a($i,{...s,children:a(Bv,{scope:t,open:r,onOpenChange:p,content:d,onContentChange:u,children:a(WI,{scope:t,contentId:ct(),triggerId:ct(),trigger:c,onTriggerChange:l,children:n})})})};VI.displayName=vd;var Zi="MenuSubTrigger",iy=F((e,t)=>{const n=En(Zi,e.__scopeMenu),r=Qi(Zi,e.__scopeMenu),i=ry(Zi,e.__scopeMenu),o=md(Zi,e.__scopeMenu),s=B(null),{pointerGraceTimerRef:c,onPointerGraceIntentChange:l}=o,d={__scopeMenu:e.__scopeMenu},u=re(()=>{s.current&&window.clearTimeout(s.current),s.current=null},[]);return K(()=>u,[u]),K(()=>{const p=c.current;return()=>{window.clearTimeout(p),l(null)}},[c,l]),a(ud,{asChild:!0,...d,children:a(qv,{id:i.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":i.contentId,"data-state":sy(n.open),...e,ref:jo(t,i.onTriggerChange),onClick:p=>{e.onClick?.(p),!(e.disabled||p.defaultPrevented)&&(p.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:z(e.onPointerMove,eo(p=>{o.onItemEnter(p),!p.defaultPrevented&&!e.disabled&&!n.open&&!s.current&&(o.onPointerGraceIntentChange(null),s.current=window.setTimeout(()=>{n.onOpenChange(!0),u()},100))})),onPointerLeave:z(e.onPointerLeave,eo(p=>{u();const m=n.content?.getBoundingClientRect();if(m){const f=n.content?.dataset.side,g=f==="right",h=g?-5:5,v=m[g?"left":"right"],_=m[g?"right":"left"];o.onPointerGraceIntentChange({area:[{x:p.clientX+h,y:p.clientY},{x:v,y:m.top},{x:_,y:m.top},{x:_,y:m.bottom},{x:v,y:m.bottom}],side:f}),window.clearTimeout(c.current),c.current=window.setTimeout(()=>o.onPointerGraceIntentChange(null),300)}else{if(o.onTriggerLeave(p),p.defaultPrevented)return;o.onPointerGraceIntentChange(null)}})),onKeyDown:z(e.onKeyDown,p=>{const m=o.searchRef.current!=="";e.disabled||m&&p.key===" "||NI[r.dir].includes(p.key)&&(n.onOpenChange(!0),n.content?.focus(),p.preventDefault())})})})});iy.displayName=Zi;var oy="MenuSubContent",ay=F((e,t)=>{const n=Gv(St,e.__scopeMenu),{forceMount:r=n.forceMount,...i}=e,o=En(St,e.__scopeMenu),s=Qi(St,e.__scopeMenu),c=ry(oy,e.__scopeMenu),l=B(null),d=we(t,l);return a(Yi.Provider,{scope:e.__scopeMenu,children:a(rt,{present:r||o.open,children:a(Yi.Slot,{scope:e.__scopeMenu,children:a(fd,{id:c.contentId,"aria-labelledby":c.triggerId,...i,ref:d,align:"start",side:s.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:u=>{s.isUsingKeyboardRef.current&&l.current?.focus(),u.preventDefault()},onCloseAutoFocus:u=>u.preventDefault(),onFocusOutside:z(e.onFocusOutside,u=>{u.target!==c.trigger&&o.onOpenChange(!1)}),onEscapeKeyDown:z(e.onEscapeKeyDown,u=>{s.onClose(),u.preventDefault()}),onKeyDown:z(e.onKeyDown,u=>{const p=u.currentTarget.contains(u.target),m=xI[s.dir].includes(u.key);p&&m&&(o.onOpenChange(!1),c.trigger?.focus(),u.preventDefault())})})})})})});ay.displayName=oy;function sy(e){return e?"open":"closed"}function as(e){return e==="indeterminate"}function yd(e){return as(e)?"indeterminate":e?"checked":"unchecked"}function qI(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function zI(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function JI(e,t,n){const r=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let o=zI(e,Math.max(i,0));r.length===1&&(o=o.filter(c=>c!==n));const s=o.find(c=>c.toLowerCase().startsWith(r.toLowerCase()));return s!==n?s:void 0}function YI(e,t){const{x:n,y:r}=e;let i=!1;for(let o=0,s=t.length-1;o<t.length;s=o++){const c=t[o],l=t[s],d=c.x,u=c.y,p=l.x,m=l.y;u>r!=m>r&&n<(p-d)*(r-u)/(m-u)+d&&(i=!i)}return i}function XI(e,t){return t?YI({x:e.clientX,y:e.clientY},t):!1}function eo(e){return t=>t.pointerType==="mouse"?e(t):void 0}var QI=Uv,ZI=ud,eR=Hv,tR=Kv,nR=hd,rR=Wv,iR=os,oR=zv,aR=Yv,sR=Qv,cR=ey,lR=ty,dR=ny,uR=iy,pR=ay,ss="DropdownMenu",[mR,zO]=st(ss,[jv]),pt=jv(),[fR,cy]=mR(ss),ly=e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:i,defaultOpen:o,onOpenChange:s,modal:c=!0}=e,l=pt(t),d=B(null),[u,p]=wt({prop:i,defaultProp:o??!1,onChange:s,caller:ss});return a(fR,{scope:t,triggerId:ct(),triggerRef:d,contentId:ct(),open:u,onOpenChange:p,onOpenToggle:re(()=>p(m=>!m),[p]),modal:c,children:a(QI,{...l,open:u,onOpenChange:p,dir:r,modal:c,children:n})})};ly.displayName=ss;var dy="DropdownMenuTrigger",uy=F((e,t)=>{const{__scopeDropdownMenu:n,disabled:r=!1,...i}=e,o=cy(dy,n),s=pt(n);return a(ZI,{asChild:!0,...s,children:a(se.button,{type:"button",id:o.triggerId,"aria-haspopup":"menu","aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":o.open?"open":"closed","data-disabled":r?"":void 0,disabled:r,...i,ref:jo(t,o.triggerRef),onPointerDown:z(e.onPointerDown,c=>{!r&&c.button===0&&c.ctrlKey===!1&&(o.onOpenToggle(),o.open||c.preventDefault())}),onKeyDown:z(e.onKeyDown,c=>{r||(["Enter"," "].includes(c.key)&&o.onOpenToggle(),c.key==="ArrowDown"&&o.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(c.key)&&c.preventDefault())})})})});uy.displayName=dy;var hR="DropdownMenuPortal",py=e=>{const{__scopeDropdownMenu:t,...n}=e,r=pt(t);return a(eR,{...r,...n})};py.displayName=hR;var my="DropdownMenuContent",fy=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=cy(my,n),o=pt(n),s=B(!1);return a(tR,{id:i.contentId,"aria-labelledby":i.triggerId,...o,...r,ref:t,onCloseAutoFocus:z(e.onCloseAutoFocus,c=>{s.current||i.triggerRef.current?.focus(),s.current=!1,c.preventDefault()}),onInteractOutside:z(e.onInteractOutside,c=>{const l=c.detail.originalEvent,d=l.button===0&&l.ctrlKey===!0,u=l.button===2||d;(!i.modal||u)&&(s.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});fy.displayName=my;var gR="DropdownMenuGroup",vR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(nR,{...i,...r,ref:t})});vR.displayName=gR;var yR="DropdownMenuLabel",bR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(rR,{...i,...r,ref:t})});bR.displayName=yR;var _R="DropdownMenuItem",hy=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(iR,{...i,...r,ref:t})});hy.displayName=_R;var wR="DropdownMenuCheckboxItem",SR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(oR,{...i,...r,ref:t})});SR.displayName=wR;var CR="DropdownMenuRadioGroup",TR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(aR,{...i,...r,ref:t})});TR.displayName=CR;var kR="DropdownMenuRadioItem",NR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(sR,{...i,...r,ref:t})});NR.displayName=kR;var xR="DropdownMenuItemIndicator",PR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(cR,{...i,...r,ref:t})});PR.displayName=xR;var AR="DropdownMenuSeparator",ER=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(lR,{...i,...r,ref:t})});ER.displayName=AR;var IR="DropdownMenuArrow",RR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(dR,{...i,...r,ref:t})});RR.displayName=IR;var DR="DropdownMenuSubTrigger",LR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(uR,{...i,...r,ref:t})});LR.displayName=DR;var $R="DropdownMenuSubContent",MR=F((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,i=pt(n);return a(pR,{...i,...r,ref:t,style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}})});MR.displayName=$R;var OR=ly,jR=uy,FR=py,BR=fy,gy=hy;function UR({assignProjectDisabled:e,disabled:t,onAssignProject:n,onForget:r,title:i}){return y(OR,null,y(jR,{asChild:!0},y("button",{"aria-label":`Actions for ${i}`,className:"feed-menu-trigger",type:"button"},"⋯")),y(FR,null,y(BR,{align:"end",className:"feed-menu-panel",side:"bottom",sideOffset:4},y(gy,{className:"feed-menu-item",disabled:e,onSelect:()=>n()},e?"Moving…":"Assign to project…"),y(gy,{className:"feed-menu-item danger",disabled:t,onSelect:()=>r()},t?"Forgetting…":"Forget memory"))))}function GR({modes:e,active:t,onSelect:n}){return e.length<=1?null:y("div",{className:"feed-toggle"},e.map(r=>y("button",{key:r.id,className:`toggle-button${r.id===t?" active":""}`,"data-filter":r.id,onClick:()=>n(r.id),type:"button"},r.label)))}function bd({label:e,variant:t=""}){return y(Wl,{variant:"provenance",tone:t||void 0},e)}function HR({tag:e}){const t=Gg(e);return t?y(Wl,{variant:"tag",title:String(e)},t):null}function KR({item:e,onReplace:t,onRemove:n,onViewRefresh:r,onReload:i}){const o=Ha(e?.metadata_json),s=rs(e,o),c=CI(e,o),l=ft(e),d=e.title||"(untitled)",u=s&&o?.request?o.request:d,p=e.created_at||e.created_at_utc,m=oA(p),f=Ga(e.tags||[]),g=Ga(e.files||[]),h=e.project||"",v=gA(e),_=String(e.visibility||o?.visibility||"private").trim(),w=String(e.workspace_kind||o?.workspace_kind||"").trim(),S=String(e.origin_source||o?.origin_source||"").trim(),T=String(e.origin_device_id||o?.origin_device_id||"").trim(),k=String(e.trust_state||o?.trust_state||"").trim(),P=f.length?` · ${f.map(pe=>Gg(pe)).join(", ")}`:"",E=g.length?` · ${lA(g)}`:"",M=Number(e.id||0),U=M>0?`ID ${M}`:"",[x,G]=I(b.newItemKeys.has(l)),A=s?SI({...e,metadata_json:o}):null,$=s?null:VA({...e,metadata_json:o}),L=$?qA($):[],J=$?zA($):"summary",H=b.itemViewState.get(l),[N,R]=I($&&H&&L.some(pe=>pe.id===H)?H:J),j=`${l}:${N}`,[V,ge]=I(b.itemExpandState.get(j)===!0),[le,ce]=I(_==="shared"?"shared":"private"),[be,Y]=I(!1),[fe,X]=I(!1),[_e,he]=I(!1),Q=A?_I(A):[];K(()=>{$&&(L.some(pe=>pe.id===N)||R(J))},[N,J,L,$]),K(()=>{b.itemViewState.set(l,N)},[N,l]),K(()=>{const pe=`${l}:${N}`;ge(b.itemExpandState.get(pe)===!0)},[N,l]),K(()=>{ce(_==="shared"?"shared":"private")},[_]),K(()=>{if(!x)return;const pe=window.setTimeout(()=>{b.newItemKeys.delete(l),G(!1)},700);return()=>window.clearTimeout(pe)},[x,l]);const $e=le,ue=$e==="shared"?"This memory can sync to peers allowed by your project filters.":"This memory stays on this device unless a matching local assignment allows it to sync.",W=[h?`Project ${h}`:"No project",m].filter(Boolean).join(" · "),oe=[w&&w!==_?`Workspace ${w}`:"",S?`From ${S}`:"",T&&v!=="You"?`Device ${T}`:"",k&&k!=="trusted"?hA(k):""].filter(Boolean).join(" · "),We=[`${P}${E}`.trim(),oe].filter(Boolean).join(" · "),Me=!!$&&JA(N,$),tt=[N==="facts"?"feed-body facts":"feed-body",Me&&!V?YA(N).join(" "):""].filter(Boolean).join(" "),un=s?Q.length?y("div",{className:"feed-body facts"},Q):Mv(String(e.body_text||""))||y("div",{className:"feed-body"}):$?N==="facts"?wI($.facts)||y("div",{className:tt}):Mv(N==="narrative"?$.narrative:$.summary,tt)||y("div",{className:tt}):y("div",{className:"feed-body"});async function Lt(pe){const ae=$e;ce(pe),Y(!0);try{const Ge=await j_(M,pe);Ge?.item&&(t(Ge.item),r()),ne(pe==="shared"?"Memory will now sync as shared context.":"Memory is private again.")}catch(Ge){ce(ae),ne(Ge instanceof Error?Ge.message:"Failed to save visibility.","warning")}finally{Y(!1)}}async function kt(){const pe=String(e.project||"").trim(),ae=pe,Ge=String(u||"this memory").trim(),Mn=Ge.length>80?`${Ge.slice(0,79).trimEnd()}…`:Ge,wo=pe?`Move "${Mn}" from "${pe}" to another project. Pick an existing project or type a new name. Every memory in the same session will be reassigned together.`:`Assign a project to "${Mn}". Pick an existing project or type a new name. Every memory in the same session will be reassigned together.`;let pn=[];try{pn=(await ko()).filter(ht=>ht&&ht!==pe)}catch{}const yr=await Il({title:"Assign to project",description:wo,initialValue:ae,placeholder:"Pick one or type a new project name",suggestions:pn,confirmLabel:"Move",cancelLabel:"Cancel",validate:ht=>{const jn=ht.trim();return jn?jn===pe?"Already assigned to this project.":null:"Enter a project name."}});if(yr==null)return;const On=yr.trim();if(!(!On||On===pe)){he(!0);try{const ht=await F_(M,On),jn=Number(ht.moved_memory_count||1);ne(jn>1?`Moved ${jn} memories from this session to "${ht.project}".`:`Moved to "${ht.project}".`),await i(),r()}catch(ht){ne(ht instanceof Error?ht.message:"Failed to move memory.","warning")}finally{he(!1)}}}async function $t(){const pe=String(u||"this memory").trim();if(await Kt({autoFocusAction:"cancel",title:"Forget this memory?",description:`Forgetting "${pe.length>80?`${pe.slice(0,79).trimEnd()}…`:pe}". This removes the memory from active results. The underlying record remains soft-deleted for audit and sync safety.`,confirmLabel:"Forget memory",cancelLabel:"Keep memory",tone:"danger"})){X(!0);try{await B_(M),n(M),r(),await i(),ne("Memory forgotten and removed from the active feed.")}catch(ae){ne(ae instanceof Error?ae.message:"Failed to forget memory.","warning")}finally{X(!1)}}}const nt=c.replace(/_/g," "),Mt=g.length?y("div",{className:"feed-files"},g.map((pe,ae)=>y("span",{className:"feed-file",key:`${String(pe)}-${ae}`},String(pe)))):null;return y("article",{className:`feed-item ${c}${x?" new-item":""}`.trim(),"data-key":l},y("div",{className:"feed-kind-banner"},y(Wl,{variant:"kind",tone:c},nt)),y("div",{className:"feed-card-body"},y("div",{className:"feed-card-header"},y("div",{className:"feed-header"},y("div",{className:"feed-title title",dangerouslySetInnerHTML:{__html:KT(u,b.feedQuery)}}),y("div",{className:"feed-card-subtitle small"},W)),y("div",{className:"feed-actions"},$?y(GR,{active:N,modes:L,onSelect:pe=>R(pe)}):null,y(za,{label:iA(p),side:"left"},y("div",{className:"small feed-age"},m)),e.owned_by_self&&M>0?y(UR,{assignProjectDisabled:_e,disabled:fe,onAssignProject:()=>{kt()},onForget:()=>{$t()},title:String(u||"memory")}):null)),y("div",{className:"feed-provenance"},y(bd,{label:v,variant:v==="You"?"mine":"author"}),y(bd,{label:_||"private",variant:_||"private"}),U?y(za,{label:`Memory database id ${M}`,side:"top"},y(bd,{label:U,variant:"memory-id"})):null),y("div",{className:"feed-meta"},We||"No tags, files, or provenance details attached."),un,y("div",{className:"feed-footer"},y("div",{className:"feed-footer-left"},f.length?y("div",{className:"feed-tags"},f.map((pe,ae)=>y(HR,{key:`${String(pe)}-${ae}`,tag:pe}))):null,e.owned_by_self&&M>0?y("div",{className:"feed-visibility-controls"},y("select",{"aria-label":`Visibility for ${String(e.title||"memory")}`,className:"feed-visibility-select",disabled:be,onChange:pe=>{Lt(String(pe.currentTarget.value)==="shared"?"shared":"private")},value:$e},y("option",{value:"private"},"Only me"),y("option",{value:"shared"},"Share with peers")),y("div",{className:"feed-visibility-note"},ue)):null),y("div",{className:"feed-footer-right"},Me?y("button",{className:"feed-expand",onClick:()=>{const pe=!V;b.itemExpandState.set(j,pe),ge(pe)},type:"button"},V?"Collapse":"Expand"):null)),Mt))}function WR({index:e}){const t=[["w-85","w-65"],["w-85","w-40"],["w-65","w-85"]],[n,r]=t[e%t.length];return y("div",{className:"feed-skeleton-item","aria-hidden":"true"},y("div",{className:"feed-skeleton-banner"}),y("div",{className:"feed-skeleton-body"},y("div",{className:`feed-skeleton-line ${n}`}),y("div",{className:`feed-skeleton-line ${r}`}),y("div",{className:"feed-skeleton-footer"},y("div",{className:"feed-skeleton-chip w-36"}),y("div",{className:"feed-skeleton-chip w-56"}),y("div",{className:"feed-skeleton-chip"}))))}function VR({items:e,loadingText:t,ops:n}){if(t)return y("div",{className:"feed-skeleton",role:"status","aria-label":t},[0,1,2,3].map(r=>y(WR,{index:r,key:`skeleton-${r}`})));if(!e.length){const r=!!b.feedQuery.trim()||b.feedTypeFilter!=="all"||b.feedScopeFilter!=="all";return y("div",{className:"small feed-empty-state"},y("strong",null,r?"No memories match the current filters.":"No memories yet."),y("div",null,r?"Try clearing filters, changing the scope, or using a broader search.":"Memories and session summaries will appear here once codemem has something worth keeping."))}return y(te,null,e.map(r=>y(KR,{item:r,key:ft(r),onReplace:n.replaceFeedItem,onRemove:n.removeFeedItem,onViewRefresh:()=>n.updateFeedView(!0),onReload:n.loadFeedData})))}function vy({id:e,active:t,options:n,onSelect:r}){return y("div",{className:"feed-toggle",id:e},n.map(({value:i,label:o})=>{const s=i===t;return y("button",{"aria-pressed":s?"true":"false",className:`toggle-button${s?" active":""}`,"data-filter":i,key:i,onClick:()=>r(i),type:"button"},o)}))}function qR({items:e,loadingText:t,ops:n}){const[r,i]=I(!1);return y(te,null,y("div",{className:"feed-controls"},y("div",{className:"section-meta",id:"feedMeta"},t||XA(e.length,n.hasMorePages())),y("div",{className:"feed-controls-right"},y("input",{className:"feed-search",id:"feedSearch",onInput:o=>{b.feedQuery=String(o.currentTarget.value||""),n.updateFeedView()},placeholder:"Search title, body, tags…",value:b.feedQuery}),y(vy,{active:b.feedScopeFilter,id:"feedScopeToggle",onSelect:o=>{o!==b.feedScopeFilter&&(kf(o),n.loadFeedData())},options:[{value:"all",label:"All"},{value:"mine",label:"My memories"},{value:"theirs",label:"Other people"}]}),y(vy,{active:b.feedTypeFilter,id:"feedTypeToggle",onSelect:o=>{o!==b.feedTypeFilter&&(rk(o),n.updateFeedView())},options:[{value:"all",label:"All"},{value:"observations",label:"Observations"},{value:"summaries",label:"Summaries"}]}),y("button",{"aria-controls":"contextInspectorPanel","aria-expanded":r,className:"settings-button feed-inspector-button",onClick:()=>i(o=>!o),type:"button"},r?"Hide Context Inspector":"Context Inspector"))),y(QA,{open:r}),y("div",{className:"feed-list",id:"feedList"},y(VR,{items:e,loadingText:t,ops:n})))}function zR(e){return b.feedTypeFilter==="observations"?e.filter(t=>!rs(t,Ha(t?.metadata_json))):b.feedTypeFilter==="summaries"?e.filter(t=>rs(t,Ha(t?.metadata_json))):e}function JR(e){const t=It(b.feedQuery);return t?e.filter(n=>[It(n?.title),It(n?.body_text),It(n?.kind),Ga(n?.tags||[]).map(r=>It(r)).join(" "),It(n?.project)].join(" ").trim().includes(t)):e}function YR(e){const t=e.map(n=>`${Kg(n)}:${n.kind||""}:${n.created_at_utc||n.created_at||""}`);return`${b.feedTypeFilter}|${b.feedScopeFilter}|${b.currentProject}|${It(b.feedQuery)}|${t.join("|")}`}var yy="",to=0,no=0,ro=!0,io=!0,_d=!1,by=!1,oo=0,wd="all";function XR(e){yy=e,wd=b.feedScopeFilter,oo+=1,to=0,no=0,ro=!0,io=!0,b.lastFeedItems=[],b.pendingFeedItems=null,b.lastFeedFilteredCount=0,b.lastFeedSignature="",b.newItemKeys.clear(),b.itemViewState.clear(),b.itemExpandState.clear()}function Sd(){return ro||io}function QR(e){const t=ft(e);b.lastFeedItems=b.lastFeedItems.map(n=>ft(n)===t?e:n)}function ZR(e){const t=new Set,n=r=>{const i=Number(r.id||r.memory_id||0)!==e;return i||t.add(ft(r)),i};b.lastFeedItems=b.lastFeedItems.filter(n),Array.isArray(b.pendingFeedItems)&&(b.pendingFeedItems=b.pendingFeedItems.filter(n));for(const r of t){b.newItemKeys.delete(r),b.itemViewState.delete(r);for(const i of Array.from(b.itemExpandState.keys()))i.startsWith(`${r}:`)&&b.itemExpandState.delete(i)}}async function e0(){if(_d||!Sd())return;const e=b.currentProject||"",t=oo,n=to,r=no;_d=!0;try{const[i,o]=await Promise.all([ro?Lu(e,{limit:20,offset:n,scope:b.feedScopeFilter}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:n}}),io?$u(e,{limit:50,offset:r,scope:b.feedScopeFilter}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:r}})]);if(t!==oo||e!==(b.currentProject||""))return;const s=o.items||[],c=i.items||[],l=c.filter(u=>!Hg(u));b.lastFeedFilteredCount+=c.length-l.length,io=Ka(o,s.length,50),ro=Ka(i,c.length,20),no=Wa(o,r+s.length),to=Wa(i,n+c.length);const d=[...s,...l];b.lastFeedItems=Wg(b.lastFeedItems,d),ao()}finally{_d=!1}}function _y(){b.activeTab==="feed"&&Sd()&&yA()&&e0()}var t0={replaceFeedItem:QR,removeFeedItem:ZR,updateFeedView:e=>ao(e),loadFeedData:()=>wy(),hasMorePages:Sd};function Cd(e,t){const n=document.getElementById("tab-feed");if(!n)return!1;HA(n,y(qR,{items:e,loadingText:t?.loadingText,ops:t0}));const r=globalThis.lucide;return r&&!t?.loadingText&&r.createIcons(),!0}function n0(){Cd([],{loadingText:"Loading selected project..."})}function r0(){GA(),Cd(b.lastFeedItems,b.lastFeedItems.length||b.lastFeedSignature?void 0:{loadingText:"Loading memories…"}),by||(window.addEventListener("scroll",()=>{_y()},{passive:!0}),by=!0)}function ao(e=!1){if(!document.getElementById("tab-feed"))return;const t=window.scrollY,n=JR(zR(b.lastFeedItems)),r=YR(n),i=e||r!==b.lastFeedSignature;b.lastFeedSignature=r,i&&Cd(n),window.scrollTo({top:t}),_y()}async function wy(){const e=b.currentProject||"",t=b.feedScopeFilter!==wd;(e!==yy||t)&&(XR(e),n0());const n=oo,r=20,i=50,[o,s]=await Promise.all([Lu(e,{limit:r,offset:0,scope:b.feedScopeFilter}),$u(e,{limit:i,offset:0,scope:b.feedScopeFilter})]);if(n!==oo||e!==(b.currentProject||""))return;const c=s.items||[],l=o.items||[],d=l.filter(g=>!Hg(g)),u=l.length-d.length,p=[...c,...d].sort((g,h)=>new Date(h.created_at||0).getTime()-new Date(g.created_at||0).getTime()),m=vA(b.lastFeedItems,p),f=b.lastFeedItems;if(bA(m,f)&&f.length>0){const g=new Set(f.map(ft));m.forEach(h=>{g.has(ft(h))||b.newItemKeys.add(ft(h))})}b.pendingFeedItems=null,b.lastFeedItems=m,b.lastFeedFilteredCount=Math.max(b.lastFeedFilteredCount,u),io=Ka(s,c.length,i),ro=Ka(o,l.length,r),no=Math.max(no,Wa(s,c.length)),to=Math.max(to,Wa(o,l.length)),wd=b.feedScopeFilter,ao()}function JO(e){return e}function i0({label:e,value:t,detail:n,icon:r,className:i,title:o}){const s=y("div",{class:`stat${i?` ${i}`:""}`,style:o?"cursor: help;":void 0},r?y("i",{"data-lucide":r,class:"stat-icon"}):null,y("div",{class:"stat-content"},y("div",{class:"value"},t),y("div",{class:"label"},e),n?y("div",{class:"small"},n):null));return o?y(za,{label:o},s):s}function o0({item:e}){let t=null,n=null;const r=e.actionLabel||"Run";async function i(){if(!(!e.action||!t)){t.disabled=!0,t.textContent="Running…";try{await e.action()}catch{}t.disabled=!1,t.textContent=r}}function o(){!e.command||!n||Pi(e.command,n)}return y("div",{class:"health-action"},y("div",{class:"health-action-text"},e.label,e.command?y("span",{class:"health-action-command"},e.command):null),y("div",{class:"health-action-buttons"},e.action?y("button",{class:"settings-button",onClick:i,ref:s=>{t=s}},r):null,e.command?y("button",{class:"settings-button health-action-copy",onClick:o,ref:s=>{n=s}},"Copy"):null))}function a0(e){return typeof e=="number"?e.toLocaleString():e==null?"n/a":String(e)}function s0({label:e,value:t,icon:n,tooltip:r}){const i=y("div",{class:"stat",style:r?"cursor: help;":void 0},y("i",{"data-lucide":n,class:"stat-icon"}),y("div",{class:"stat-content"},y("div",{class:"value"},a0(t)),y("div",{class:"label"},e)));return r?y(za,{label:r},i):i}function Sy(e,t){e&&Ue(y(Hl,null,t.map(n=>y(s0,{...n,key:`${n.label}-${n.icon}`}))),e)}function Cy(e,t){e&&Ue(y(te,null,t),e)}function Td(){const e=globalThis.lucide;e&&typeof e.createIcons=="function"&&e.createIcons()}function c0(e,t){e&&Ue(y(Hl,null,t.map(n=>y(i0,{...n,key:n.key??n.label}))),e)}function l0(e,t){if(e){if(!t.length){e.hidden=!0,Ue(null,e);return}e.hidden=!1,Ue(y(te,null,t.slice(0,3).map((n,r)=>y(o0,{item:n,key:`${n.label}-${r}`}))),e)}}var Ty="scope_id_backfill";function ky(){const e=document.getElementById("healthGrid"),t=document.getElementById("healthMeta"),n=document.getElementById("healthActions"),r=document.getElementById("healthDot");if(!e||!t)return;const i=b.lastStatsPayload||{},o=b.lastUsagePayload||{},s=b.lastRawEventsPayload&&typeof b.lastRawEventsPayload=="object"?b.lastRawEventsPayload:{},c=b.lastSyncStatus||{},l=Array.isArray(i.maintenance_jobs)?i.maintenance_jobs:[],d=l.find(oe=>oe.kind===Ty),u=i.reliability||{},p=u.counts||{},m=u.rates||{},f=i.database||{},g=o.totals_filtered||o.totals||o.totals_global||i.usage?.totals||{},h=Array.isArray(o.recent_packs)?o.recent_packs:[],v=h.length?h[0]?.created_at:null,_=h.length?h[0]?.metadata_json||{}:{},w=Number(_?.exact_duplicates_collapsed||0),S=Number(s.pending||0),T=Number(p.errored_batches||0),k=Number(m.flush_success_rate??1),P=Number(m.dropped_event_rate||0),E=jl(g.tokens_saved,g.tokens_read),M=sA(E),U=Number(f.tags_coverage||0),x=String(c.daemon_state||"unknown"),G=x==="offline-peers"?"Offline peers":x==="needs_attention"?"Needs attention":x==="rebootstrapping"?"Rebootstrapping":Ug(x),A=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers.length:0,$=x==="disabled"||c.enabled===!1,L=x==="offline-peers",J=!$&&A===0;let H=$?"Disabled":J?"No peers":G;const N=Kr(c.last_sync_at||c.last_sync_at_utc||null),R=Kr(v),j=N!==null&&N>7200,V=N!==null&&N<=300,ge=S>=200;let le=0;const ce=[];S>=1e3?(le+=40,ce.push("high raw-event backlog")):S>=200&&(le+=24,ce.push("growing raw-event backlog")),T>0&&S>=200&&(le+=T>=5?10:6,ce.push("batch errors during backlog pressure")),k<.95&&(le+=20,ce.push("lower flush success")),P>.02?(le+=24,ce.push("high dropped-event rate")):P>.005&&(le+=10,ce.push("non-trivial dropped-event rate")),!$&&!J&&(x==="error"?(le+=36,ce.push("sync daemon reports errors")):x==="needs_attention"?(le+=40,ce.push("sync needs manual attention")):x==="stopped"?(le+=22,ce.push("sync daemon stopped")):x==="degraded"&&!V&&(le+=20,ce.push("sync daemon degraded")),L?(le+=4,ce.push("all peers currently offline"),j&&(le+=4,ce.push("offline peers and sync not recent"))):j?(le+=26,ce.push("sync looks stale")):N!==null&&N>1800&&(le+=12,ce.push("sync not recent"))),M!==null&&M<10&&(le+=8,ce.push("low retrieval reduction")),R!==null&&R>86400&&(le+=12,ce.push("memory pack activity is old"));let be="Healthy",Y="status-healthy";le>=60?(be="Attention",Y="status-attention"):le>=25&&(be="Degraded",Y="status-degraded");const fe=Y==="status-healthy";r&&(r.className=`health-dot ${Y}`,r.title=be);const X=`${Number(g.tokens_saved||0).toLocaleString()} saved tokens · ${w.toLocaleString()} deduped in latest pack`,_e=S>0?"Queue is actively draining":"Queue is clear",he=$?"Sync disabled":J?"No peers configured":L?`${A} peers offline · last sync ${Nn(N)} ago`:`${A} peers · last sync ${Nn(N)} ago`;fe&&!$&&!J&&(L?H="Peers offline":x==="degraded"&&V&&(H="Syncing"));const Q=`last pack ${Nn(R)} ago`,$e=l.map(oe=>{const We=Number(oe.progress?.current||0),Me=typeof oe.progress?.total=="number"?oe.progress.total:null,tt=String(oe.progress?.unit||"items"),un=Me&&Me>0?` (${Math.round(100*We/Me)}%)`:"",Lt=Me&&Me>0?`${We.toLocaleString()}/${Me.toLocaleString()} ${tt}${un}`:`${We.toLocaleString()} ${tt}`,kt=oe.status==="failed",$t=oe.status==="completed",nt=oe.kind===Ty,Mt=kt?"Failed":$t?"Complete":Lt,pe=kt?String(oe.error||"unknown error").trim():$t?nt?`${Lt} · one-time Sharing-domain upgrade finished`:Lt:nt?"One-time upgrade backfill; totals include memories and replication ops":void 0;return{key:String(oe.kind||oe.title||"background-maintenance"),label:String(oe.title||oe.kind||"Background maintenance"),value:Mt,detail:pe,icon:kt?"alert-triangle":$t?"check-circle":"loader",className:kt?"status-attention":void 0,title:kt?`Error: ${oe.error||"unknown"}`:$t?`${String(oe.title||"Maintenance")} finished`:nt?`${String(oe.title||"Maintenance")} in progress; inspect with codemem maintenance status`:`${String(oe.title||"Maintenance")} in progress`}});c0(e,[{key:"overall-health",label:"Overall health",value:be,detail:`Weighted score ${le}`,icon:"heart-pulse",className:`health-primary ${Y}`,title:ce.length?`Main signals: ${ce.join(", ")}`:"No major risk signals detected"},...$e,{key:"pipeline-health",label:"Pipeline health",value:`${S.toLocaleString()} pending`,detail:_e,icon:"workflow",title:"Raw-event queue pressure and flush reliability"},{key:"retrieval-impact",label:"Retrieval impact",value:E,detail:X,icon:"sparkles",title:"Reduction from memory reuse across recent usage"},{key:"sync-health",label:"Sync health",value:H,detail:he,icon:"refresh-cw",title:"Daemon state and sync recency"},{key:"data-freshness",label:"Data freshness",value:Nn(R),detail:Q,icon:"clock-3",title:"Recency of last memory pack activity"}]);const ue=async()=>{await Gs()},W=[];ge?(W.push({label:"Pipeline needs attention. Check queue health first.",command:"codemem db raw-events-status"}),W.push({label:"Then retry failed batches for impacted sessions.",command:"codemem db raw-events-retry <opencode_session_id>"})):x==="stopped"?W.push({label:"Sync daemon is stopped. Start the background service.",command:"codemem serve start"}):!$&&!J&&!fe&&(x==="error"||x==="degraded")?(W.push({label:"Sync is unhealthy. Restart and run one immediate pass.",command:"codemem serve restart",action:ue,actionLabel:"Sync now"}),W.push({label:"Then run doctor to see root cause details.",command:"codemem sync doctor"})):!$&&!J&&j&&W.push({label:"Sync is stale. Run one immediate sync pass.",command:"codemem sync once",action:ue,actionLabel:"Sync now"}),U>0&&U<.7&&W.length<2&&W.push({label:"Tag coverage is low. Preview backfill impact.",command:"codemem db backfill-tags --dry-run"}),d&&d.status!=="completed"&&W.length<3&&W.push({label:"Sharing-domain upgrade backfill is expected one-time work. Inspect progress if startup feels busy.",command:"codemem maintenance status"}),l0(n,W),t.textContent=ce.length?`Why this status: ${ce.join(", ")}.`:"Healthy right now. Diagnostics stay available if you want details.",Td()}function d0(){const e=document.getElementById("sessionGrid"),t=document.getElementById("sessionMeta");if(!e||!t)return;const n=b.lastUsagePayload||{},r=b.currentProject;n?.totals_global||n?.totals;const i=n?.totals_filtered||null,o=!!(r&&i),s=(Array.isArray(n?.events)?n.events:[]).find(k=>k.event==="pack")||null,c=Array.isArray(n?.recent_packs)?n.recent_packs:[],l=c.length?c[0]:null,d=l?.metadata_json||{},u=l?.created_at||"",p=Number(s?.count||0),m=Number(l?.tokens_read||0),f=Number(l?.tokens_saved||0),g=Number(d?.exact_duplicates_collapsed||0),h=!!d?.exact_dedupe_enabled,v=jl(f,m),_=p?`${p} packs`:"No packs yet",w=u?`Last pack: ${rr(u)}`:"",S=o?"Project":"All projects",T=[{label:"Last pack savings",value:l?`${Fi(f)} (${v})`:"n/a",tooltip:l?`Exact: ${f.toLocaleString()} saved`:void 0,icon:"trending-up"},{label:"Last pack size",value:l?Fi(m):"n/a",tooltip:l?`Exact: ${m.toLocaleString()} injected`:void 0,icon:"package"},{label:"Last pack deduped",value:l?g.toLocaleString():"n/a",icon:"copy-check"},{label:"Exact dedupe",value:l?h?"On":"Off":"n/a",icon:"shield-check"},{label:"Packs",value:p||0,icon:"archive"}];Cy(t,[S,_,w].filter(Boolean).join(" · ")),Sy(e,T),Td()}function u0(){const e=document.getElementById("statsGrid"),t=document.getElementById("metaLine");if(!e)return;const n=b.lastStatsPayload||{},r=b.lastUsagePayload||{},i=b.lastRawEventsPayload&&typeof b.lastRawEventsPayload=="object"?b.lastRawEventsPayload:{},o=n.database||{},s=b.currentProject,c=r?.totals_global||r?.totals||n.usage?.totals||{},l=r?.totals_filtered||null,d=!!(s&&l),u=d?l:c,p=Number(i.sessions||0),m=Number(i.pending||0),f=d?`
112
112
  Global: ${Number(c.work_investment_tokens||0).toLocaleString()} invested`:"",g=d?`
113
113
  Global: ${Number(c.tokens_read||0).toLocaleString()} read`:"",h=d?`
114
- Global: ${Number(c.tokens_saved||0).toLocaleString()} saved`:"",v=[{label:d?"Savings (project)":"Savings",value:Fi(u.tokens_saved||0),tooltip:`Tokens saved by reusing compressed memories. Exact: ${Number(u.tokens_saved||0).toLocaleString()} saved${h}`,icon:"trending-up"},{label:d?"Injected (project)":"Injected",value:Fi(u.tokens_read||0),tooltip:`Tokens injected into context (pack size). Exact: ${Number(u.tokens_read||0).toLocaleString()} injected${g}`,icon:"book-open"},{label:d?"Reduction (project)":"Reduction",value:jl(u.tokens_saved,u.tokens_read),tooltip:`Percent reduction from reuse. Factor: ${aA(u.tokens_saved,u.tokens_read)}.`+g+h,icon:"percent"},{label:d?"Work investment (project)":"Work investment",value:Fi(u.work_investment_tokens||0),tooltip:`Token cost of unique discovery groups. Exact: ${Number(u.work_investment_tokens||0).toLocaleString()} invested${f}`,icon:"pencil"},{label:"Active memories",value:o.active_memory_items||0,icon:"check-circle"},{label:"Embedding coverage",value:Bg(o.vector_coverage),tooltip:"Share of active memories with embeddings",icon:"layers"},{label:"Tag coverage",value:Bg(o.tags_coverage),tooltip:"Share of active memories with tags",icon:"tag"}];if(m>0?v.push({label:"Raw events pending",value:m,tooltip:"Pending raw events waiting to be flushed",icon:"activity"}):p>0&&v.push({label:"Raw sessions",value:p,tooltip:"Sessions with pending raw events",icon:"inbox"}),Sy(e,v),t){const _=s?` · project: ${s}`:"";Cy(t,`DB: ${dA(o.path||"unknown")} · ${uA(o.size_bytes||0)}${_}`)}Td()}async function p0(){const e=b.lastStatsPayload?.identity?.actor_id||null,[t,n,r,i]=await Promise.all([K_(),W_(b.currentProject),V_(b.currentProject),q_(b.currentProject)]);b.lastStatsPayload=t||{},b.lastUsagePayload=n||{},b.lastRawEventsPayload=i||{};const o=b.lastStatsPayload?.identity?.actor_id||null;u0(),d0(),ky(),b.activeTab==="feed"&&e!==o&&ao(!0)}var so=new WeakMap;function lr(e,t=""){const n=document.createElement("p");return t&&(n.className=t),n.textContent=e,n}function m0(e){const t=document.createElement("article");t.className="project-inventory-row recipient-policy-blocked-item";const n=document.createElement("div");n.className="project-inventory-row-header";const r=document.createElement("h3");r.className="project-inventory-title",r.textContent=e.finding;const i=document.createElement("span");return i.className="project-status-badge needs_attention",i.textContent="Blocked",n.append(r,i),t.append(n,lr(e.reason,"project-inventory-meta"),lr(`Owner: ${e.ownerLabel}`,"settings-note"),lr(`Repair: ${e.repairAction}`,"settings-note")),t}function f0(e,t){const n=`review:${JSON.stringify(t)}`;if(so.get(e)===n)return;if(!t.continuity&&t.blockedItems.length===0){e.replaceChildren(),e.hidden=!0,so.set(e,n);return}e.hidden=!1;const r=document.createElement("section");r.className="card recipient-policy-review",r.setAttribute("aria-labelledby","recipientPolicyReviewTitle");const i=document.createElement("h2");if(i.id="recipientPolicyReviewTitle",i.textContent=t.continuity?"Existing sharing kept as-is":"Sharing needs repair",r.appendChild(i),t.continuity){const o=lr("No action is required for this update. Codemem did not change your existing Team or local sharing configuration.","section-meta"),s=t.continuity.findingCount,c=lr(`${s.toLocaleString()} older sharing finding${s===1?" was":"s were"} not changed because Codemem could not safely translate ${s===1?"it":"them"} automatically.`,"settings-note");c.setAttribute("role","status"),c.setAttribute("aria-live","polite"),r.append(o,c)}if(t.blockedItems.length>0){const o=lr("Codemem did not change access for these items, but their current availability cannot be confirmed until these source-state problems are repaired.","section-meta project-attention-note"),s=document.createElement("h3");s.className="recipient-policy-blocked-heading",s.textContent="Needs repair";const c=document.createElement("div");c.className="project-inventory-list recipient-policy-review-list";for(const l of t.blockedItems)c.appendChild(m0(l));r.append(o,s,c)}e.replaceChildren(r),so.set(e,n)}function h0(e,t){const n=t instanceof Error?t.message:"Unable to load recipient migration review.",r=`error:${n}`;if(so.get(e)===r)return;e.hidden=!1;const i=document.createElement("section");i.className="card recipient-policy-review";const o=document.createElement("h2");o.textContent="Recipient migration review";const s=lr(n,"settings-note project-attention-note");s.setAttribute("role","status"),i.append(o,s),e.replaceChildren(i),so.set(e,r)}var Ny=[["","All projects"],["needs_attention","Needs review"],["suggested","Has suggestion"],["local_only","Stays on this device"],["received","Received from peers"],["explicitly_mapped","Already assigned"],["legacy_review","Older shared data"],["unmapped","Missing project identity"]],at=null,co=0,kd=250,Nd=[],xd=new Set,Pd=new Set,cs=new Map,ls=new Map,dr=new Map,lo=new Map,ds=!1,uo=!1,In=!1,us=0,Ct=new Set,xy=new WeakMap,ps={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},Yr=ps,Rn=!1;function Ke(e){return document.getElementById(e)}function g0(e){return Ny.find(([t])=>t===e)?.[1]??e.replaceAll("_"," ")}function v0(e){switch(e){case"exact_mapping":return"assigned to a Space";case"pattern_mapping":return"assigned by matching rule";case"explicit_override":return"manually assigned";default:return"stays on this device"}}function Xr(e){return e.read_only===!0&&e.read_only_reason==="peer_received"}function Ad(e){return e.identity_source!=="unmapped"&&!Xr(e)}function Ed(e){return Xr(e)?"Received from peers":ms(e.resolved_scope_id)}function y0(e){return Xr(e)?"source-owned project":v0(e.resolution_reason)}function b0(e){const t=e.person.display_name;switch(e.lifecycle.state){case"waiting_for_acceptance":return`Invitation sent to ${t}`;case"active":return`Shared with ${t}`;case"waiting_for_device":return`Sharing with ${t}`;case"needs_attention":return`Sharing with ${t} needs attention`;case"revoking":return`Removing sharing with ${t}`;case"revoked":return`Previously shared with ${t}`;case"cancelled":return`Invitation to ${t} cancelled`;default:return`Setting up sharing with ${t}`}}function Py(e){if(!e)return"No recent sessions";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function Ay(e){return[...new Set(e.map(t=>t.workspace_identity))].sort()}function ur(){const e=Ct.size,t=Ke("projectsShareSelected");t&&(t.textContent=e===0?"Share selected":`Share selected (${e})`,t.disabled=e===0||!In||!Rn,t.classList.add("project-selection-target"));const n=Ke("projectsSelectionStatus");n&&(n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.textContent=`${e.toLocaleString()} Project${e===1?"":"s"} selected.`);for(const r of document.querySelectorAll(".project-selection-checkbox")){const i=xy.get(r)??[],o=i.filter(s=>Ct.has(s)).length;r.checked=i.length>0&&o===i.length,r.indeterminate=o>0&&o<i.length}for(const r of document.querySelectorAll(".project-recipient-action"))r.disabled=!In||!Rn}function _0(e){const t=e.every(n=>Ct.has(n));for(const n of e)t?Ct.delete(n):Ct.add(n);ur()}function Ey(e,t){const n=Ay(e),r=document.createElement("label");r.className="project-selection-control project-selection-target";const i=document.createElement("input");i.className="project-selection-checkbox",i.dataset.projectFocusKey=`select:${n.join("|")}`,i.type="checkbox",i.setAttribute("aria-label",t),xy.set(i,n),i.addEventListener("change",()=>_0(n));const o=document.createElement("span");return o.className="sr-only",o.textContent=t,r.append(i,o),r}function w0(e){if(!Rn)return[];const t=new Set(e),n=new Map(Yr.teams.filter(o=>o.status==="active").map(o=>[o.teamId,o.displayName])),r=new Map(Yr.identities.filter(o=>o.status==="active"||o.status==="pending").map(o=>[o.identityId,o.displayName])),i=new Map;for(const o of Yr.projectRecipients)if(!(o.status!=="active"||!t.has(o.canonicalProjectIdentity)))if(o.recipientKind==="team"){const s=n.get(o.teamId);s&&i.set(`team:${o.teamId}`,{key:`team:${o.teamId}`,kind:"Team",displayName:s})}else{const s=r.get(o.identityId);s&&i.set(`identity:${o.identityId}`,{key:`identity:${o.identityId}`,kind:"Identity",displayName:s})}return[...i.values()].sort((o,s)=>`${o.kind}:${o.displayName}`.localeCompare(`${s.kind}:${s.displayName}`))}function Iy(e){const t=document.createElement("div");t.className="project-recipient-summary";const n=w0(e),r=document.createElement("div");if(r.className="project-recipient-status",r.textContent=Rn?n.length===0?"Not shared with any recipients.":e.length===1?`Shared with ${n.length.toLocaleString()} recipient${n.length===1?"":"s"}.`:`${n.length.toLocaleString()} recipient${n.length===1?"":"s"} across these Project identities.`:"Recipient access is unavailable.",t.appendChild(r),n.length>0){const i=document.createElement("ul");i.className="project-recipient-chips",i.setAttribute("aria-label","Active recipients");for(const o of n){const s=document.createElement("li");s.className=`project-recipient-chip project-recipient-chip-${o.kind.toLowerCase()}`,s.textContent=`${o.kind}: ${o.displayName}`,i.appendChild(s)}t.appendChild(i)}return t}function Ry(e,t){const n=document.createElement("button");return n.className="settings-button project-recipient-action project-selection-target",n.type="button",n.disabled=!In||!Rn,e.length===1?(n.textContent="Manage recipients",n.setAttribute("aria-label",`Manage recipients for ${t}`),n.dataset.projectFocusKey=`manage:${e[0]}`,n.addEventListener("click",()=>{Si({mode:"project-manage",projectId:e[0]})})):(n.textContent="Share selected",n.setAttribute("aria-label",`Share selected identities for ${t}`),n.dataset.projectFocusKey=`share:${e.join("|")}`,n.addEventListener("click",()=>{for(const r of e)Ct.add(r);ur(),Si({mode:"project-add",projectIds:[...e].sort()})})),n}function S0(e){return e.git_remote?e.git_remote:e.cwd?e.cwd:e.workspace_identity}function Id(e){return e.git_remote?`git:${e.git_remote}`:e.project?`project:${e.project}`:`identity:${e.workspace_identity}`}function Rd(e){return e.project||e.display_project||"Unnamed Project"}function Dy(e){const t=String(e||"").trim();return t?b.lastCoordinatorAdminGroups.find(n=>String(n.group_id||"").trim()===t&&!n.archived_at)?.display_name||"Team details unavailable":null}function C0(){return new Set(b.lastCoordinatorAdminGroups.filter(e=>!e.archived_at).map(e=>String(e.group_id||"").trim()).filter(Boolean))}function T0(e){return!uo||e.authority_type!=="coordinator"||!e.group_id?!1:!C0().has(String(e.group_id).trim())}function Ly(){const e=document.activeElement;return e instanceof HTMLSelectElement&&e.classList.contains("project-domain-select")}function $y(){ds&&(ds=!1,at?.())}async function k0(){try{const e=await To();b.lastCoordinatorAdminStatus=e&&typeof e=="object"?e:null}catch{b.lastCoordinatorAdminStatus=null,b.lastCoordinatorAdminGroups=[],uo=!1;return}if(b.lastCoordinatorAdminStatus?.readiness!=="ready"||!b.lastCoordinatorAdminStatus.has_admin_secret){b.lastCoordinatorAdminGroups=[],uo=!1;return}try{const e=await Iu(!1);b.lastCoordinatorAdminGroups=Array.isArray(e?.items)?e.items:[],uo=!0}catch{b.lastCoordinatorAdminGroups=[],uo=!1}}function N0(e){return e.kind==="team_default"}function Dd(e){const t=e.label||"Untitled Space";return N0(e)?`${t} (default)`:t}function x0(e,t){const n=Dd(e);return t.some(r=>r.scope_id!==e.scope_id&&Dd(r)===n)?`${n} · Space ID ${e.scope_id}`:n}function P0(e){const t=Dy(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Space":`${e.authority_type||"Other"} Space`}function A0(e){return e?Nd.find(t=>t.scope_id===e)??null:null}function ms(e){const t=A0(e);return e?t?`${Dd(t)} · ${P0(t)}`:"Unknown Space":"—"}function Ld(){return Nd.filter(e=>e.scope_id!=="legacy-shared-review"&&!T0(e))}function E0(e){return Ld().some(t=>t.scope_id===e)}function My(...e){for(const t of e)if(t&&E0(t))return t;return e.find(t=>!!t)??""}function I0(e){const t=Dy(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Spaces":"Other Spaces"}function R0(e){return e.group_id?`team:${e.group_id}`:`${e.authority_type||"other"}:${e.kind||"space"}`}function D0(){const e=new Map;for(const t of Ld()){const n=R0(t),r=I0(t),i=e.get(n)??{label:r,scopes:[]};e.set(n,{label:i.label,scopes:[...i.scopes,t]})}return[...e.values()]}function Oy(e){for(const t of D0()){const n=document.createElement("optgroup");n.label=t.label;for(const r of t.scopes){const i=document.createElement("option");i.value=r.scope_id,i.textContent=x0(r,t.scopes),n.appendChild(i)}e.appendChild(n)}}function L0(e){switch(e.code){case"unknown_project_local_only":return"Current behavior";case"basename_collision_review":return"Name collision";case"scope_reassignment_old_copies":return"Previous copies";case"broad_org_domain_pattern":case"home_directory_org_domain_pattern":return"Broad mapping";default:return"Review item"}}async function $d(e,t,n=[]){try{await lw({...e.mapping_id&&e.resolution_reason==="exact_mapping"?{id:e.mapping_id}:{},...n.length>0?{confirmed_guardrail_tokens:n}:{},project_pattern:e.display_project,scope_id:t,workspace_identity:e.workspace_identity}),dr.delete(e.workspace_identity),cs.delete(e.workspace_identity),ne("Project Space assignment updated. Device access grants are unchanged."),at?.()}catch(r){if(r instanceof No){dr.set(e.workspace_identity,{requiredGuardrailTokens:r.requiredGuardrailTokens,scopeId:t,warnings:r.guardrailWarnings}),at?.();return}ne(r instanceof Error?r.message:"Unable to update project Space.","warning")}}async function $0(e,t){const n=e.filter(Ad);if(n.length!==0)try{await dw({mappings:n.map(r=>({...r.mapping_id&&r.resolution_reason==="exact_mapping"?{id:r.mapping_id}:{},project_pattern:r.display_project,scope_id:t,workspace_identity:r.workspace_identity}))}),ne(`Updated ${n.length} project identit${n.length===1?"y":"ies"}. Device access grants are unchanged.`),ls.delete(Id(n[0])),at?.()}catch(r){ne(r instanceof No?"One or more identities in this group need review before bulk assignment. Expand the group and save those identities directly.":r instanceof Error?r.message:"Unable to update project Spaces.","warning")}}async function M0(e){if(e.mapping_id!=null)try{await uw(e.mapping_id),dr.delete(e.workspace_identity),cs.delete(e.workspace_identity),ne("Project Space assignment removed. The next fallback now applies."),at?.()}catch(t){ne(t instanceof Error?t.message:"Unable to remove project Space assignment.","warning")}}async function jy(e,t=!1){try{const n=lo.get(e.workspace_identity),r=await mw({...t&&n?{confirmation_token:n.confirmationToken}:{},confirmed:t,workspace_identity:e.workspace_identity});lo.delete(e.workspace_identity),ne(`Forgot ${r.forgotten_memory_count.toLocaleString()} local memor${r.forgotten_memory_count===1?"y":"ies"}. ${r.peer_owned_memory_count.toLocaleString()} peer-owned memor${r.peer_owned_memory_count===1?"y was":"ies were"} left unchanged.`),at?.()}catch(n){if(n instanceof Fu){lo.set(e.workspace_identity,{confirmationToken:n.preview.confirmation_token,localOwnedMemoryCount:n.preview.local_owned_memory_count,peerOwnedMemoryCount:n.preview.peer_owned_memory_count}),at?.();return}ne(n instanceof Error?n.message:"Unable to forget project memories.","warning")}}async function O0(e){if(e.identity_source==="unmapped")return;const t=String(e.project||e.display_project||"").trim();let n=[];try{n=(await ko()).filter(i=>i&&i!==t)}catch{}const r=await Il({cancelLabel:"Cancel",confirmLabel:"Change project",description:`This will update ${e.session_count} session${e.session_count===1?"":"s"} and ${e.memory_count??0} memor${e.memory_count===1?"y":"ies"} by changing the stored project. Space assignment stays unchanged.`,initialValue:t,placeholder:"Project name",suggestions:n,title:"Change project",validate:i=>{const o=i.trim();return o?o===t?"Already assigned to this project.":null:"Enter a project name."}});if(r!=null)try{const i=await pw({project:r.trim(),workspace_identity:e.workspace_identity});ne(`Changed project to ${i.project} for ${i.moved_session_count} session${i.moved_session_count===1?"":"s"}.`),at?.()}catch(i){ne(i instanceof Error?i.message:"Unable to change project.","warning")}}function j0(e){const t=document.createElement("div");if(t.className="project-inventory-actions",Ad(e)&&e.memory_count!=null&&e.guardrail_warnings.every(f=>!f.requires_confirmation)){const f=document.createElement("button");f.className="settings-button",f.type="button",f.textContent="Share",f.disabled=!In,In||(f.title="The complete project list is unavailable."),f.addEventListener("click",()=>ea([e.workspace_identity])),t.appendChild(f)}if(Xr(e)){const f=document.createElement("div");return f.className="settings-note",f.textContent="This project was received from a peer. Change its project or Space on the source device; this node keeps the received identity read-only.",t.appendChild(f),t}if(e.identity_source==="unmapped"){const f=document.createElement("div");return f.className="settings-note",f.textContent="This project is missing a stable path, git remote, or workspace id. It stays Local only until it has a stable identity.",t.appendChild(f),t}const n=document.createElement("label");n.className="sr-only";const r=`project-domain-${e.workspace_identity.replace(/[^a-z0-9_-]/gi,"-")}`;n.htmlFor=r,n.textContent=`Space for ${e.display_project}`;const i=document.createElement("select");i.id=r,i.className="project-domain-select";const o=Ld().some(f=>f.scope_id===e.resolved_scope_id);if(!o&&e.resolved_scope_id){const f=document.createElement("option");f.value=e.resolved_scope_id,f.textContent=`${ms(e.resolved_scope_id)} — not assignable`,f.disabled=!0,i.appendChild(f)}Oy(i),i.value=My(cs.get(e.workspace_identity),e.suggested_scope_id,e.resolved_scope_id);const s=document.createElement("button");s.className="settings-button",s.type="button",s.textContent=e.suggested_scope_id&&i.value===e.suggested_scope_id?"Confirm suggestion":"Save Space",s.disabled=!i.value||i.value===e.resolved_scope_id&&!o,s.addEventListener("click",()=>{$d(e,i.value)}),i.addEventListener("change",()=>{cs.set(e.workspace_identity,i.value),dr.delete(e.workspace_identity),t.querySelector(".project-space-guardrail-confirmation")?.remove(),s.textContent="Save Space",s.disabled=!i.value,at?.()}),i.addEventListener("blur",$y);const c=document.createElement("button");c.className="settings-button",c.type="button",c.textContent="Keep local-only",c.addEventListener("click",()=>{$d(e,"local-default")});const l=document.createElement("button");l.className="settings-button",l.type="button",l.textContent="Remove mapping",l.disabled=e.mapping_id==null||e.resolution_reason!=="exact_mapping",l.addEventListener("click",()=>{M0(e)});const d=document.createElement("button");d.className="settings-button",d.type="button",d.textContent="Change project…",d.disabled=e.session_count===0,d.disabled&&(d.title="No sessions are available to reassign for this saved mapping."),d.addEventListener("click",()=>{O0(e)});const u=document.createElement("button");u.className="settings-button danger",u.type="button",u.textContent="Forget local memories…",u.disabled=(e.memory_count??0)===0,u.addEventListener("click",()=>{jy(e)}),t.append(n,i,s,c,l,d,u);const p=dr.get(e.workspace_identity);if(p){const f=document.createElement("div");f.className="settings-note project-guardrail-confirmation project-space-guardrail-confirmation",f.setAttribute("role","alert");const g=document.createElement("strong");g.textContent="Confirmation required before saving this Space.";const h=document.createElement("p");h.textContent="Codemem can save this change after you acknowledge the checks below. Verify the workspace details, then confirm to complete the save.";const v=document.createElement("ul");for(const S of p.warnings){const T=document.createElement("li"),k=document.createElement("strong");k.textContent=`${L0(S)}: `;const P=document.createElement("span");P.textContent=S.message,T.append(k,P),v.appendChild(T)}const _=document.createElement("button");_.className="settings-button",_.type="button",_.textContent="I understand, save Space",_.addEventListener("click",()=>{const S=dr.get(e.workspace_identity);!S||S.scopeId!==i.value||$d(e,S.scopeId,S.requiredGuardrailTokens)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{dr.delete(e.workspace_identity),at?.()}),f.append(g,h,v,_,w),t.appendChild(f)}const m=lo.get(e.workspace_identity);if(m){const f=document.createElement("div");f.className="settings-note project-guardrail-confirmation",f.setAttribute("role","alert");const g=document.createElement("strong");g.textContent="Confirm project memory cleanup.";const h=document.createElement("p");h.textContent=`${m.localOwnedMemoryCount.toLocaleString()} locally owned memor${m.localOwnedMemoryCount===1?"y":"ies"} will be forgotten. ${m.peerOwnedMemoryCount.toLocaleString()} peer-owned memor${m.peerOwnedMemoryCount===1?"y":"ies"} will be left unchanged.`;const v=document.createElement("p");v.textContent="Use this only to clean up wrongly attributed local project inventory; it forgets actual local memories on this device.";const _=document.createElement("button");_.className="settings-button danger",_.type="button",_.textContent="I understand, forget local memories",_.addEventListener("click",()=>{jy(e,!0)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{lo.delete(e.workspace_identity),at?.()}),f.append(g,h,v,_,w),t.appendChild(f)}return t}function Fy(e){const t=document.createElement("article");t.className="project-inventory-row";const n=`project-title-${e.workspace_identity.replace(/[^a-z0-9_-]/gi,"-")}`;t.setAttribute("aria-labelledby",n);const r=document.createElement("div");r.className="project-inventory-row-header",Qo(e)&&r.appendChild(Ey([e],`Select ${e.display_project} for recipient sharing`));const i=document.createElement("h3");i.className="project-inventory-title",i.id=n,i.textContent=e.display_project,r.appendChild(i),Qo(e)&&r.appendChild(Ry([e.workspace_identity],e.display_project)),t.appendChild(r);const o=document.createElement("div");o.className="project-inventory-meta",o.textContent=`${(e.memory_count??0).toLocaleString()} memories · ${e.session_count.toLocaleString()} sessions · ${Py(e.latest_session_at)}`,t.appendChild(o),t.appendChild(Iy([e.workspace_identity]));const s=document.createElement("div");s.className="project-advanced-administration";const c=document.createElement("div");c.className="project-inventory-domain",c.textContent=Ed(e),s.appendChild(c);const l=document.createElement("div");if(l.className="project-inventory-meta",l.textContent=`${y0(e)} · ${e.identity_source} · ${Py(e.latest_session_at)}`,s.appendChild(l),e.sharing&&e.sharing.length>0){const h=document.createElement("div");h.className="settings-note project-sharing-summary";const v=document.createElement("strong");v.textContent="Project sharing";const _=document.createElement("ul");_.setAttribute("aria-label",`People sharing ${e.display_project}`);for(const w of e.sharing){const S=document.createElement("li"),T=document.createElement("strong");T.textContent=b0(w);const k=document.createElement("span");k.textContent=` — ${w.lifecycle.label}. ${w.lifecycle.explanation}`,S.append(T,k),_.appendChild(S)}h.append(v,_),s.appendChild(h)}if(Xr(e)){const h=document.createElement("div");h.className="settings-note",h.textContent="Received memories keep the source device's project and Space assignment. Local reassignment controls are disabled here to avoid split-brain sync state.",s.appendChild(h)}const d=document.createElement("div");if(d.className="project-inventory-signal mono",d.textContent=S0(e),s.appendChild(d),e.suggested_scope_id&&e.suggested_scope_id!==e.resolved_scope_id){const h=document.createElement("div");h.className="settings-note project-suggestion-note",h.textContent=e.suggestion_reason?`Suggestion: ${e.suggestion_reason}`:`Suggestion: assign this project to ${ms(e.suggested_scope_id)}.`,s.appendChild(h)}const u=(e.guardrail_warnings??[]).filter(h=>h.severity==="warning");if(u.length>0){const h=document.createElement("div");h.className="settings-note project-attention-note",h.textContent=`Needs attention: ${u.map(v=>v.message).join(" ")}`,s.appendChild(h)}if(e.statuses.length>0){const h=document.createElement("div");h.className="project-inventory-badges";for(const v of e.statuses){const _=document.createElement("span");_.className=`project-status-badge ${v}`,_.textContent=g0(v),h.appendChild(_)}s.appendChild(h)}const p=document.createElement("details");p.className="project-inventory-details",p.open=xd.has(e.workspace_identity),p.addEventListener("toggle",()=>{p.open?xd.add(e.workspace_identity):xd.delete(e.workspace_identity)});const m=document.createElement("summary");m.textContent=u.length>0?`Advanced Project administration — ${u.length.toLocaleString()} item${u.length===1?"":"s"} need attention`:"Advanced Project administration",p.appendChild(m),p.appendChild(s);const f=document.createElement("dl");f.className="project-detail-grid";const g=[["Workspace identity",e.workspace_identity],["Project",e.project],["CWD",e.cwd],["Git remote",e.git_remote],["Git branch",e.git_branch],["Current Space",Ed(e)],["Suggested Space",e.suggested_scope_id?ms(e.suggested_scope_id):null],["Advanced: current Space ID",e.resolved_scope_id],["Advanced: suggested Space ID",e.suggested_scope_id],["Suggestion reason",e.suggestion_reason],["Sessions",e.session_count],["Memories",e.memory_count??"count unavailable"]];for(const[h,v]of g){const _=document.createElement("dt");_.textContent=h;const w=document.createElement("dd");w.textContent=v==null||v===""?"—":String(v),f.append(_,w)}return p.appendChild(f),p.appendChild(j0(e)),t.appendChild(p),t}function F0(e){const t=[...new Set(e.map(n=>Ed(n)))];return t.length===1?t[0]:"Mixed Spaces"}function B0(e){if(e.length===1)return Fy(e[0]);const t=Id(e[0]),n=e.filter(Qo),r=Ay(n),i=document.createElement("article");i.className="project-inventory-row project-inventory-cluster";const o=Rd(e[0]),s=`project-cluster-title-${t.replace(/[^a-z0-9_-]/gi,"-")}`;i.setAttribute("aria-labelledby",s);const c=document.createElement("div");c.className="project-inventory-row-header",n.length>0&&c.appendChild(Ey(n,`Select all identities for ${Rd(e[0])}`));const l=document.createElement("h3");l.className="project-inventory-title",l.id=s,l.textContent=o,c.appendChild(l),r.length>0&&c.appendChild(Ry(r,o)),i.appendChild(c);const d=document.createElement("div");d.className="project-advanced-administration";const u=document.createElement("div");u.className="project-inventory-domain",u.textContent=F0(e),d.appendChild(u);const p=e.reduce((S,T)=>S+(T.memory_count??0),0),m=e.reduce((S,T)=>S+T.session_count,0),f=document.createElement("div");f.className="project-inventory-meta",f.textContent=`${e.length} identities · ${m.toLocaleString()} sessions · ${p.toLocaleString()} memories`,i.appendChild(f),i.appendChild(Iy(r));const g=document.createElement("div");g.className="project-inventory-actions";const h=e.filter(Ad);if(h.length===0){const S=document.createElement("div");S.className="settings-note",S.textContent=e.every(Xr)?"These project identities were received from peers. Change project or Space assignments on their source devices.":"These project identities cannot be bulk assigned until they have stable local identities. Expand each identity for details.",g.appendChild(S),d.appendChild(g)}else{const S=h.map(x=>({project:x,warnings:(x.guardrail_warnings??[]).filter(G=>G.requires_confirmation)})),T=S.some(({warnings:x})=>x.length>0),k=new Set(h.map(x=>x.suggested_scope_id).filter(x=>!!x)),P=new Set(h.map(x=>x.resolved_scope_id)),E=document.createElement("select");E.className="project-domain-select",E.setAttribute("aria-label",`Space for ${Rd(e[0])} group`);const M=document.createElement("option");M.value="",M.textContent="Choose Space…",E.appendChild(M),Oy(E),E.value=My(ls.get(t));const U=document.createElement("button");if(U.className="settings-button",U.type="button",U.textContent=`Save Space for ${h.length} identit${h.length===1?"y":"ies"}`,U.disabled=!E.value||T,U.addEventListener("click",()=>{$0(h,E.value)}),E.addEventListener("change",()=>{E.value?ls.set(t,E.value):ls.delete(t),U.disabled=!E.value||T}),E.addEventListener("blur",$y),g.append(E,U),k.size>1||P.size>1||T){const x=document.createElement("div");if(x.className="settings-note project-attention-note",x.textContent=T?"One or more identities in this group need individual review before bulk assignment.":"This group has mixed suggestions or current Spaces. Choose a Space explicitly before bulk assignment.",T){const G=document.createElement("ul");for(const{project:A,warnings:$}of S){if($.length===0)continue;const L=document.createElement("li"),J=document.createElement("strong");J.textContent=`Blocked identity: ${A.workspace_identity}`;const H=document.createElement("span");H.textContent=` — ${$.map(N=>N.message).join(" ")}`,L.append(J,H),G.appendChild(L)}x.appendChild(G)}g.appendChild(x)}d.appendChild(g)}const v=document.createElement("details");v.className="project-inventory-details",v.open=Pd.has(t),v.addEventListener("toggle",()=>{v.open?Pd.add(t):Pd.delete(t)});const _=document.createElement("summary"),w=e.reduce((S,T)=>S+(T.guardrail_warnings??[]).filter(k=>k.severity==="warning").length,0);_.textContent=w>0?`Advanced Project administration — ${w.toLocaleString()} item${w===1?"":"s"} need attention`:"Advanced Project administration",v.appendChild(_),v.appendChild(d);for(const S of e)v.appendChild(Fy(S));return i.appendChild(v),i}function U0(e){const t=new Map;for(const n of e){const r=Id(n);t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function By(e){const t=Ke("projectsInventoryList");if(!t)return;t.textContent="";const n=document.createElement("div");n.className="settings-note",n.textContent=e,t.appendChild(n)}function Uy(){document.getElementById("projectsInventorySkeleton")?.remove()}function Gy(e){const t=Ke("projectsInventoryMeta"),n=Ke("projectsInventoryList");if(!t||!n)return;const r=document.activeElement instanceof HTMLElement?document.activeElement.dataset.projectFocusKey:void 0;if(Uy(),n.textContent="",e.projects.length===0)By("No projects match those filters.");else for(const s of U0(e.projects))n.appendChild(B0(s));t.textContent=e.total===0?"0 project identities found":`${e.total} project identit${e.total===1?"y":"ies"} found · showing ${e.offset+1}-${Math.min(e.offset+e.projects.length,e.total)}`;const i=Ke("projectsPrevPage"),o=Ke("projectsNextPage");i&&(i.disabled=e.offset===0),o&&(o.disabled=!e.has_more),ur(),r&&[...n.querySelectorAll("[data-project-focus-key]")].find(s=>s.dataset.projectFocusKey===r)?.focus()}function G0(e,t){k0().then(()=>{t===us&&(Ly()||Gy(e))})}async function H0(){const e=new Map;let t=0;for(;;){const n=await xo({limit:250,offset:t});for(const r of n.projects)e.set(r.workspace_identity,r);if(!n.has_more)break;t+=n.limit}return[...e.values()]}function Hy(e,t,n){const r=Ke("recipientPolicyManagementMount");r&&Mm(r,Zo(e),t,{loadError:n,onCommitted:i=>{i.status==="applied"&&Ct.clear(),ur(),at?.()}})}async function K0(){const e=Ke("projectsInventoryMeta"),t=Ke("projectsInventoryList");if(!e||!t)return;if(Ly()){ds=!0;return}ds=!1;const n=++us;In=!1,Rn=!1,ur(),e.textContent="Loading project inventory…";try{const[r,i,o,s,c]=await Promise.all([xo({limit:kd,offset:co,q:Ke("projectsSearch")?.value.trim()||void 0,status:Ke("projectsStatusFilter")?.value||void 0}),iw(),H0().then(u=>({ok:!0,projects:u})).catch(()=>({ok:!1,projects:[]})),rw().then(u=>({ok:!0,review:u})).catch(u=>({ok:!1,error:u})),Us().then(u=>({ok:!0,intent:u})).catch(u=>({ok:!1,error:u}))]);if(n!==us)return;if(Nd=i.scopes,In=o.ok,Rn=c.ok,Yr=c.ok?c.intent:ps,o.ok){const u=new Set(Zo(o.projects).map(p=>p.canonicalProjectIdentity));for(const p of Ct)u.has(p)||Ct.delete(p)}const l=Ke("projectShareFlowMount");l&&Fm(l,o.projects,{inventoryError:!o.ok});const d=Ke("recipientPolicyReviewMount");d&&("review"in s?f0(d,s.review):h0(d,s.error)),Hy(o.projects,Yr,!o.ok||!c.ok),Gy(r),G0(r,n)}catch(r){if(n!==us)return;In=!1,Rn=!1,Yr=ps;const i=Ke("projectShareFlowMount");i&&Fm(i,[],{inventoryError:!0}),Hy([],ps,!0),ur(),Uy(),e.textContent="Project inventory failed to load.",By(r instanceof Error?r.message:"Unable to load project inventory.")}}function W0(e){at=e,Ct.clear();const t=Ke("projectsStatusFilter");if(t&&t.options.length===0)for(const[i,o]of Ny){const s=document.createElement("option");s.value=i,s.textContent=o,t.appendChild(s)}const n=()=>{co=0,at?.()};Ke("projectsSearch")?.addEventListener("input",n),t?.addEventListener("change",n),Ke("projectsPrevPage")?.addEventListener("click",()=>{co=Math.max(0,co-kd),at?.()}),Ke("projectsNextPage")?.addEventListener("click",()=>{co+=kd,at?.()});const r=Ke("projectsShareSelected");r&&r.dataset.recipientPolicyBound!=="true"&&(r.dataset.recipientPolicyBound="true",r.addEventListener("click",()=>{Ct.size!==0&&Si({mode:"project-add",projectIds:[...Ct].sort()})})),ur()}function Md(e,t){const n=e.trim();if(!n)return[];const r=JSON.parse(n);if(!Array.isArray(r)||r.some(o=>typeof o!="string"))throw new Error(`${t.label} must be a JSON string array`);if(!t.normalize&&!t.requireNonEmpty)return r;const i=t.normalize?r.map(o=>o.trim()):r;if(t.requireNonEmpty&&i.some(o=>o.trim()===""))throw new Error(`${t.label} cannot contain empty command tokens`);return i}function V0(e){const t=e.trim();if(!t)return{};const n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("observer headers must be a JSON object");const r={};for(const[i,o]of Object.entries(n)){if(typeof i!="string"||!i.trim()||typeof o!="string")throw new Error("observer headers must map string keys to string values");r[i.trim()]=o}return r}var Ky="codemem-settings-advanced",Wy="gpt-5.1-codex-mini",Vy="claude-4.5-haiku",q0=[{value:"observer",label:"Connection"},{value:"queue",label:"Processing"},{value:"sync",label:"Device Sync"}],z0={claudeCommand:"claude_command",codexCommand:"codex_command",observerProvider:"observer_provider",observerModel:"observer_model",observerTierRoutingEnabled:"observer_tier_routing_enabled",observerSimpleModel:"observer_simple_model",observerSimpleTemperature:"observer_simple_temperature",observerReasoningEffort:"observer_reasoning_effort",observerReasoningSummary:"observer_reasoning_summary",observerRichModel:"observer_rich_model",observerRichTemperature:"observer_rich_temperature",observerRichReasoningEffort:"observer_rich_reasoning_effort",observerRichReasoningSummary:"observer_rich_reasoning_summary",observerRichMaxOutputTokens:"observer_rich_max_output_tokens",observerRuntime:"observer_runtime",observerAuthSource:"observer_auth_source",observerAuthFile:"observer_auth_file",observerAuthCommand:"observer_auth_command",observerAuthTimeoutMs:"observer_auth_timeout_ms",observerAuthCacheTtlS:"observer_auth_cache_ttl_s",observerHeaders:"observer_headers",observerMaxChars:"observer_max_chars",packObservationLimit:"pack_observation_limit",packSessionLimit:"pack_session_limit",rawEventsSweeperIntervalS:"raw_events_sweeper_interval_s",syncEnabled:"sync_enabled",syncHost:"sync_host",syncPort:"sync_port",syncInterval:"sync_interval_s",syncMdns:"sync_mdns",syncCoordinatorUrl:"sync_coordinator_url",syncCoordinatorGroup:"sync_coordinator_group",syncCoordinatorTimeout:"sync_coordinator_timeout_s",syncCoordinatorPresenceTtl:"sync_coordinator_presence_ttl_s"},J0=new Set(["claude_command","codex_command","observer_base_url","observer_auth_file","observer_auth_command","observer_headers","sync_coordinator_url"]),Y0={claudeCommand:"",codexCommand:"",observerProvider:"",observerModel:"",observerTierRoutingEnabled:!1,observerSimpleModel:"",observerSimpleTemperature:"",observerReasoningEffort:"",observerReasoningSummary:"",observerRichModel:"",observerRichTemperature:"",observerRichReasoningEffort:"",observerRichReasoningSummary:"",observerRichMaxOutputTokens:"",observerRuntime:"api_http",observerAuthSource:"auto",observerAuthFile:"",observerAuthCommand:"",observerAuthTimeoutMs:"",observerAuthCacheTtlS:"",observerHeaders:"",observerMaxChars:"",packObservationLimit:"",packSessionLimit:"",rawEventsSweeperIntervalS:"",syncEnabled:!1,syncHost:"",syncPort:"",syncInterval:"",syncMdns:!1,syncCoordinatorUrl:"",syncCoordinatorGroup:"",syncCoordinatorTimeout:"",syncCoordinatorPresenceTtl:""};function X0(){try{return globalThis.localStorage?.getItem(Ky)==="1"}catch{return!1}}function Q0(e){try{globalThis.localStorage?.setItem(Ky,e?"1":"0")}catch{}}function ln(e,t){return typeof e=="object"&&e!==null&&Object.hasOwn(e,t)}function Ne(e,t,n){if(ln(t,n))return t[n];if(ln(e,n))return e[n]}function Ae(e){return e==null?"":String(e)}function fs(e){if(typeof e=="boolean")return e;if(typeof e=="number")return e!==0;if(typeof e=="string"){const t=e.trim().toLowerCase();if(!t||["0","false","no","off"].includes(t))return!1;if(["1","true","yes","on"].includes(t))return!0}return!!e}function Z0(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function eD(e,t){return e===t?!0:JSON.stringify(e)===JSON.stringify(t)}function ze(e){const t=e.trim();return t===""?"":t}function tD(e,t,n){return n?{model:n,source:"Configured"}:e==="claude_sidecar"?{model:Vy,source:"Recommended (local Claude session)"}:e==="codex_sidecar"?{model:Wy,source:"Recommended (local Codex session)"}:t==="anthropic"?{model:Vy,source:"Recommended (Anthropic provider)"}:t==="opencode"?{model:"opencode/gpt-5.1-codex-mini",source:"Recommended (OpenCode Zen provider)"}:t&&t!=="openai"?{model:"provider default",source:"Recommended (provider default)"}:{model:Wy,source:"Recommended (direct API)"}}function nD(e,t){const n=e??{};switch(t){case"claude_command":{const r=n.claude_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(o=>{if(typeof o!="string")return;const s=o.trim();s&&i.push(s)}),i}case"codex_command":{const r=n.codex_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(o=>{if(typeof o!="string")return;const s=o.trim();s&&i.push(s)}),i}case"observer_provider":case"observer_model":case"observer_simple_model":case"observer_reasoning_effort":case"observer_reasoning_summary":case"observer_rich_model":case"observer_rich_reasoning_effort":case"observer_rich_reasoning_summary":case"observer_auth_file":case"sync_host":case"sync_coordinator_url":case"sync_coordinator_group":return ze(Ae(n[t]));case"observer_runtime":return ze(Ae(n.observer_runtime));case"observer_auth_source":return ze(Ae(n.observer_auth_source));case"observer_auth_command":{const r=n.observer_auth_command;return Array.isArray(r)?r.filter(i=>typeof i=="string"):[]}case"observer_headers":{const r=n.observer_headers;if(!r||typeof r!="object"||Array.isArray(r))return{};const i={};return Object.entries(r).forEach(([o,s])=>{typeof o=="string"&&o.trim()&&typeof s=="string"&&(i[o.trim()]=s)}),i}case"observer_auth_timeout_ms":case"observer_max_chars":case"observer_simple_temperature":case"observer_rich_temperature":case"observer_rich_max_output_tokens":case"pack_observation_limit":case"pack_session_limit":case"raw_events_sweeper_interval_s":case"sync_port":case"sync_interval_s":{if(!ln(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r!==0?r:""}case"sync_coordinator_timeout_s":case"sync_coordinator_presence_ttl_s":{if(!ln(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r>0?r:""}case"observer_auth_cache_ttl_s":{if(!ln(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)?r:""}case"sync_enabled":case"sync_mdns":case"observer_tier_routing_enabled":return fs(n[t]);default:return ln(n,t)?n[t]:""}}function rD(e,t,n){const r={...e};return Object.keys(n).forEach(i=>{ln(r,i)&&(r[i]=nD(t,i))}),r}function iD(e){const{values:t,touchedKeys:n,baseline:r}=e,i=e.allowUntouchedParseErrors===!0;let o=[];try{o=Md(t.claudeCommand,{label:"claude command",normalize:!0,requireNonEmpty:!0})}catch(T){if(!i||n.has("claude_command"))throw T;const k=r.claude_command;o=Array.isArray(k)?k.filter(P=>typeof P=="string").map(P=>P.trim()).filter(P=>P.length>0):[]}let s=[];try{s=Md(t.codexCommand,{label:"codex command",normalize:!0,requireNonEmpty:!0})}catch(T){if(!i||n.has("codex_command"))throw T;const k=r.codex_command;s=Array.isArray(k)?k.filter(P=>typeof P=="string").map(P=>P.trim()).filter(P=>P.length>0):[]}let c=[];try{c=Md(t.observerAuthCommand,{label:"observer auth command"})}catch(T){if(!i||n.has("observer_auth_command"))throw T;const k=r.observer_auth_command;c=Array.isArray(k)?k.filter(P=>typeof P=="string"):[]}let l={};try{l=V0(t.observerHeaders)}catch(T){if(!i||n.has("observer_headers"))throw T;const k=r.observer_headers;k&&typeof k=="object"&&!Array.isArray(k)&&Object.entries(k).forEach(([P,E])=>{typeof P=="string"&&P.trim()&&typeof E=="string"&&(l[P]=E)})}const d=t.observerAuthCacheTtlS.trim(),u=t.observerSimpleTemperature.trim(),p=t.observerRichTemperature.trim(),m=t.observerRichMaxOutputTokens.trim(),f=t.rawEventsSweeperIntervalS.trim(),g=d===""?"":Number(d),h=u===""?"":Number(u),v=p===""?"":Number(p),_=m===""?"":Number(m),w=Number(f),S=f===""?"":w;if(d!==""&&!Number.isFinite(g))throw new Error("observer auth cache ttl must be a number");if(u!==""&&(typeof h!="number"||!Number.isFinite(h)||h<0))throw new Error("simple tier temperature must be a non-negative number");if(p!==""&&(typeof v!="number"||!Number.isFinite(v)||v<0))throw new Error("rich tier temperature must be a non-negative number");if(m!==""&&(typeof _!="number"||!Number.isFinite(_)||_<=0||!Number.isInteger(_)))throw new Error("rich tier max output tokens must be a positive integer");if(f!==""&&(!Number.isFinite(w)||w<=0))throw new Error("raw-event sweeper interval must be a positive number");return{claude_command:o,codex_command:s,observer_provider:ze(t.observerProvider),observer_model:ze(t.observerModel),observer_tier_routing_enabled:t.observerTierRoutingEnabled,observer_simple_model:ze(t.observerSimpleModel),observer_simple_temperature:h,observer_reasoning_effort:ze(t.observerReasoningEffort),observer_reasoning_summary:ze(t.observerReasoningSummary),observer_rich_model:ze(t.observerRichModel),observer_rich_temperature:v,observer_rich_reasoning_effort:ze(t.observerRichReasoningEffort),observer_rich_reasoning_summary:ze(t.observerRichReasoningSummary),observer_rich_max_output_tokens:_,observer_runtime:ze(t.observerRuntime||"api_http")||"api_http",observer_auth_source:ze(t.observerAuthSource||"auto")||"auto",observer_auth_file:ze(t.observerAuthFile),observer_auth_command:c,observer_auth_timeout_ms:Number(t.observerAuthTimeoutMs||0)||"",observer_auth_cache_ttl_s:g,observer_headers:l,observer_max_chars:Number(t.observerMaxChars||0)||"",pack_observation_limit:Number(t.packObservationLimit||0)||"",pack_session_limit:Number(t.packSessionLimit||0)||"",raw_events_sweeper_interval_s:S,sync_enabled:t.syncEnabled,sync_host:ze(t.syncHost),sync_port:Number(t.syncPort||0)||"",sync_interval_s:Number(t.syncInterval||0)||"",sync_mdns:t.syncMdns,sync_coordinator_url:ze(t.syncCoordinatorUrl),sync_coordinator_group:ze(t.syncCoordinatorGroup),sync_coordinator_timeout_s:Number(t.syncCoordinatorTimeout||0)||"",sync_coordinator_presence_ttl_s:Number(t.syncCoordinatorPresenceTtl||0)||""}}function oD(e){const t=e.config||{},n=e.effective||{},r=Ne(t,n,"observer_headers"),i=r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).filter(([p,m])=>typeof p=="string"&&p.trim()&&typeof m=="string")):{},o=Ne(t,n,"claude_command"),s=Array.isArray(o)?o.filter(p=>typeof p=="string"):[],c=Ne(t,n,"codex_command"),l=Array.isArray(c)?c.filter(p=>typeof p=="string"):[],d=Ne(t,n,"observer_auth_command"),u=Array.isArray(d)?d.filter(p=>typeof p=="string"):[];return{claudeCommand:s.length?JSON.stringify(s,null,2):"",codexCommand:l.length?JSON.stringify(l,null,2):"",observerProvider:Ae(Ne(t,n,"observer_provider")),observerModel:Ae(Ne(t,n,"observer_model")),observerTierRoutingEnabled:fs(Ne(t,n,"observer_tier_routing_enabled")),observerSimpleModel:Ae(Ne(t,n,"observer_simple_model")),observerSimpleTemperature:Ae(Ne(t,n,"observer_simple_temperature")),observerReasoningEffort:Ae(Ne(t,n,"observer_reasoning_effort")),observerReasoningSummary:Ae(Ne(t,n,"observer_reasoning_summary")),observerRichModel:Ae(Ne(t,n,"observer_rich_model")),observerRichTemperature:Ae(Ne(t,n,"observer_rich_temperature")),observerRichReasoningEffort:Ae(Ne(t,n,"observer_rich_reasoning_effort")),observerRichReasoningSummary:Ae(Ne(t,n,"observer_rich_reasoning_summary")),observerRichMaxOutputTokens:Ae(Ne(t,n,"observer_rich_max_output_tokens")),observerRuntime:Ae(Ne(t,n,"observer_runtime"))||"api_http",observerAuthSource:Ae(Ne(t,n,"observer_auth_source"))||"auto",observerAuthFile:Ae(Ne(t,n,"observer_auth_file")),observerAuthCommand:u.length?JSON.stringify(u,null,2):"",observerAuthTimeoutMs:Ae(Ne(t,n,"observer_auth_timeout_ms")),observerAuthCacheTtlS:Ae(Ne(t,n,"observer_auth_cache_ttl_s")),observerHeaders:Object.keys(i).length?JSON.stringify(i,null,2):"",observerMaxChars:Ae(Ne(t,n,"observer_max_chars")),packObservationLimit:Ae(Ne(t,n,"pack_observation_limit")),packSessionLimit:Ae(Ne(t,n,"pack_session_limit")),rawEventsSweeperIntervalS:Ae(Ne(t,n,"raw_events_sweeper_interval_s")),syncEnabled:fs(Ne(t,n,"sync_enabled")),syncHost:Ae(Ne(t,n,"sync_host")),syncPort:Ae(Ne(t,n,"sync_port")),syncInterval:Ae(Ne(t,n,"sync_interval_s")),syncMdns:fs(Ne(t,n,"sync_mdns")),syncCoordinatorUrl:Ae(Ne(t,n,"sync_coordinator_url")),syncCoordinatorGroup:Ae(Ne(t,n,"sync_coordinator_group")),syncCoordinatorTimeout:Ae(Ne(t,n,"sync_coordinator_timeout_s")),syncCoordinatorPresenceTtl:Ae(Ne(t,n,"sync_coordinator_presence_ttl_s"))}}function aD(e,t){if(e.observerTierRoutingEnabled)return"Tiered routing is enabled: simple/rich model selection now lives in Processing.";const n=tD(e.observerRuntime.trim()||"api_http",e.observerProvider.trim(),ze(e.observerModel));return`${["observer_model","observer_provider","observer_runtime"].some(r=>ln(t,r))?"Env override":n.source}: ${n.model}`}function sD(e){return e.observerTierRoutingEnabled?"On: codemem routes simpler batches to Luna and richer batches to Terra with medium reasoning by default. Official OpenAI and OAuth Codex consumer requests always use Responses. The observer_openai_use_responses=false compatibility setting selects chat completions only for an explicitly configured custom OpenAI-compatible base URL. Sidecar runtimes route both tiers through their local CLI.":"Off: codemem uses the base observer settings from the Connection tab for all batches. Explicit user settings always win over built-in routing defaults."}function cD(e){return e.observerTierRoutingEnabled?"Base model fallback":"Model"}function lD(e){return e.observerTierRoutingEnabled?"Tiered routing is enabled, so Processing controls the simple/rich models. This base model is only a fallback, and explicit settings override built-in defaults.":"Leave blank to use a recommended model for your selected mode/provider."}function dD(e){return e.observerTierRoutingEnabled?"Tiered routing is active. Use this only as a fallback while the Processing tab owns simple/rich model selection and explicit tier settings override built-in defaults.":"Default: `gpt-5.4-mini` for Direct API, `gpt-5.1-codex-mini` for Local Codex session, or `claude-4.5-haiku` for Local Claude session."}function uD(e){return!e}function pD(e,t,n){return t.has(e)||n.has(e)}function mD(e){return`${e} is read-only in the viewer for security. Edit the config file or environment instead.`}var q={open:!1,previouslyFocused:null,activeTab:"observer",baseline:{},envOverrides:{},touchedKeys:new Set,shellMounted:!1,protectedKeys:new Set,startPolling:null,refresh:null,showAdvanced:X0(),controller:null,renderState:{effectiveText:"",isSaving:!1,observerStatus:null,overridesVisible:!1,pathText:"Config path: n/a",providers:[],statusText:"Ready",values:{...Y0}}};function fD(){q.controller?.hideTooltip()}function pr(e){if(q.controller){q.controller.setRenderState(e);return}q.renderState={...q.renderState,...e}}function hD(e){pr({values:{...q.renderState.values,...e}})}function gD(e){const t=["observer","queue","sync"].includes(e)?e:"observer";q.activeTab=t,q.controller?.setActiveTab(t)}function hs(e,t=!0){b.settingsDirty=e,t&&q.controller?.setDirty(e)}function vD(e){q.showAdvanced=e,q.controller?.setShowAdvanced(e)}function qy(){return q.open}function yD(e){return pD(e,q.protectedKeys,J0)}function zy(e={}){return iD({values:q.renderState.values,touchedKeys:q.touchedKeys,baseline:q.baseline,allowUntouchedParseErrors:e.allowUntouchedParseErrors})}function bD(e){pr({observerStatus:e&&typeof e=="object"?e:null})}function _D(e){if(!e||typeof e!="object")return;const t=e,n=t.defaults||{},r=t.config||{},i=t.env_overrides&&typeof t.env_overrides=="object"?t.env_overrides:{},o=Array.isArray(t.protected_keys)?t.protected_keys.filter(c=>typeof c=="string"&&c.trim().length>0):[],s=oD(t);q.envOverrides=i,q.protectedKeys=new Set(o),b.configDefaults=n,b.configPath=t.path||"",pr({effectiveText:Object.keys(i).length>0?"Some fields are managed by environment settings.":"",overridesVisible:Object.keys(i).length>0,pathText:b.configPath?`Config path: ${b.configPath}`:"Config path: n/a",providers:Z0(t.providers),statusText:"No unsaved changes",values:s}),q.touchedKeys=new Set;try{q.baseline=rD(zy({allowUntouchedParseErrors:!0}),r,i)}catch{q.baseline={}}hs(!1)}async function wD(){if(!q.open)try{const[e,t]=await Promise.all([w_(),__().catch(()=>null)]);_D(e),bD(t)}catch{}}function Od(e){return String(e||"").replace(/_/g," ")}function jd(e){const t=e.filter(n=>typeof n=="string"&&n.trim());return t.length===0?"":t.length===1?t[0]:t.length===2?`${t[0]} and ${t[1]}`:`${t.slice(0,-1).join(", ")}, and ${t[t.length-1]}`}function SD(e){switch(e){case"anthropic_consumer":return"OAuth (Claude Max/Pro)";case"codex_consumer":return"OAuth (ChatGPT subscription)";case"sdk_client":return"API key";case"claude_sidecar":return"Local Claude session";case"codex_sidecar":return"Local Codex session";case"opencode_run":return"OpenCode sidecar";default:return e||"none"}}function CD(e){const t=[];return e.oauth&&t.push("OAuth"),e.api_key&&t.push("API key"),e.env_var&&t.push("env var"),t.length?t.join(", "):"none"}function TD(e){if(typeof e!="string"||!e.trim())return"Unknown time";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function kD({status:e}){if(!e)return a("div",{id:"observerStatusBanner",className:"observer-status-banner",hidden:!0});const t=e.active,n=e.available_credentials||{},r=e.latest_failure,i=Object.entries(n).filter(([,o])=>o&&typeof o=="object");return a("div",{id:"observerStatusBanner",className:"observer-status-banner",children:[t?a(te,{children:[a("div",{className:"status-label",children:"Active observer"}),a("div",{className:"status-active",children:[String(t.provider||"unknown")," → ",String(t.model||"")," via"," ",SD(t.auth?.method||"none")," ",a("span",{"aria-label":t.auth?.token_present===!0?"token present":"token missing",className:t.auth?.token_present===!0?"cred-ok":"cred-none",role:"img",children:a("i",{"aria-hidden":"true","data-lucide":t.auth?.token_present===!0?"check":"x"})})]})]}):a(te,{children:[a("div",{className:"status-label",children:"Observer status"}),a("div",{className:"status-active",children:"Not yet initialized (waiting for first session)"})]}),i.length?a(te,{children:[a("div",{className:"status-label",children:"Available credentials"}),a("div",{children:i.map(([o,s],c)=>{const l=s,d=Object.values(l).some(Boolean);return a("span",{className:"status-cred",children:[c>0?" · ":null,a("span",{"aria-label":d?"credential available":"no credential",className:d?"cred-ok":"cred-none",role:"img",children:d?a("i",{"aria-hidden":"true","data-lucide":"check"}):"–"})," ",String(o),": ",CD(l)]},o)})})]}):null,r&&typeof r=="object"?a(te,{children:[a("div",{className:"status-label",children:"Latest processing issue"}),a("div",{className:"status-issue",children:[a("div",{className:"status-issue-message",children:typeof r.error_message=="string"&&r.error_message.trim()?r.error_message.trim():"Raw-event processing failed."}),a("div",{className:"status-issue-meta",children:[[typeof r.observer_provider=="string"?r.observer_provider.trim():"",typeof r.observer_model=="string"&&r.observer_model.trim()?`→ ${r.observer_model.trim()}`:"",typeof r.observer_runtime=="string"&&r.observer_runtime.trim()?`(${r.observer_runtime.trim()})`:""].filter(Boolean).join(" ").replace(/\s+/g," ").trim(),`Last failure ${TD(r.updated_at)}`,typeof r.attempt_count=="number"&&Number.isFinite(r.attempt_count)?`Attempts ${r.attempt_count}`:""].filter(Boolean).join(" · ")}),typeof r.impact=="string"&&r.impact.trim()?a("div",{className:"status-issue-impact",children:r.impact.trim()}):null]})]}):null]})}function Jy(e,t){const n=t.getBoundingClientRect(),r=8,i=8,o=e.offsetWidth,s=e.offsetHeight;let c=n.left+n.width/2-o/2;c=Math.max(r,Math.min(c,globalThis.innerWidth-o-r));let l=n.bottom+i;l+s>globalThis.innerHeight-r&&(l=n.top-s-i),l=Math.max(r,l),e.style.left=`${Math.round(c)}px`,e.style.top=`${Math.round(l)}px`}function po(e){return e instanceof Element?e.closest(".help-icon[data-tooltip]"):null}function ND(e){if(!e)return[];const t=["button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[href]",'[tabindex]:not([tabindex="-1"])'].join(",");return Array.from(e.querySelectorAll(t)).filter(n=>{const r=n;return!r.hidden&&r.offsetParent!==null})}function xD(){const e=Ie("settingsModal");(ND(e)[0]||e)?.focus()}function PD(){const[e,t]=I({anchor:null,content:"",visible:!1}),n=B(null);return K(()=>{const r=u=>{const p=u.dataset.tooltip?.trim();p&&t({anchor:u,content:p,visible:!0})},i=()=>{t(u=>!u.visible&&!u.anchor&&!u.content?u:{anchor:null,content:"",visible:!1})},o=u=>{const p=po(u.target);p&&r(p)},s=u=>{const p=po(u.target);if(!p)return;const m=u.relatedTarget;m instanceof Element&&p.contains(m)||i()},c=u=>{const p=po(u.target);p&&r(p)},l=u=>{po(u.target)&&i()},d=u=>{const p=po(u.target);p&&(u.preventDefault(),t(m=>{if(m.anchor===p&&m.visible)return{anchor:null,content:"",visible:!1};const f=p.dataset.tooltip?.trim()||"";return f?{anchor:p,content:f,visible:!0}:m}))};return document.addEventListener("pointerover",o),document.addEventListener("pointerout",s),document.addEventListener("focusin",c),document.addEventListener("focusout",l),document.addEventListener("click",d),()=>{document.removeEventListener("pointerover",o),document.removeEventListener("pointerout",s),document.removeEventListener("focusin",c),document.removeEventListener("focusout",l),document.removeEventListener("click",d)}},[]),gt(()=>{if(!e.visible||!e.anchor||!n.current)return;const r=requestAnimationFrame(()=>{n.current&&e.anchor&&Jy(n.current,e.anchor)});return()=>{cancelAnimationFrame(r)}},[e.anchor,e.content,e.visible]),K(()=>{if(!e.visible||!e.anchor)return;const r=()=>{n.current&&e.anchor&&Jy(n.current,e.anchor)};return globalThis.addEventListener("resize",r),document.addEventListener("scroll",r,!0),()=>{globalThis.removeEventListener("resize",r),document.removeEventListener("scroll",r,!0)}},[e.anchor,e.visible]),{tooltipPortal:xe(()=>typeof document>"u"?null:en(a("div",{className:`help-tooltip${e.visible?" visible":""}`,hidden:!e.visible,ref:n,children:e.content}),document.body),[e.content,e.visible]),setTooltip:t}}function AD({DialogContent:e,onClose:t}){const[n,r]=I(q.open),[i,o]=I(["observer","queue","sync"].includes(q.activeTab)?q.activeTab:"observer"),[s,c]=I(b.settingsDirty),[l,d]=I(q.renderState),[u,p]=I(q.showAdvanced),{tooltipPortal:m,setTooltip:f}=PD();q.open=n,q.activeTab=i,b.settingsDirty=s,q.renderState=l,q.showAdvanced=u,K(()=>(q.controller={hideTooltip:()=>{f({anchor:null,content:"",visible:!1})},setActiveTab:h=>{const v=["observer","queue","sync"].includes(h)?h:"observer";q.activeTab=v,o(v)},setDirty:h=>{b.settingsDirty=h,c(h)},setOpen:h=>{q.open=h,r(h)},setRenderState:h=>{const v={...q.renderState,...h};q.renderState=v,d(v)},setShowAdvanced:h=>{q.showAdvanced=h,Q0(h),p(h)}},()=>{q.controller&&(q.controller=null)}),[]),K(()=>{n&&globalThis.lucide?.createIcons?.()},[n]);const g=re(()=>{q.startPolling&&q.refresh&&t(q.startPolling,q.refresh)},[t]);return a(te,{children:[a(bi,{ariaDescribedby:"settingsDescription",ariaLabelledby:"settingsTitle",contentClassName:"modal",contentId:"settingsModal",onCloseAutoFocus:h=>{h.preventDefault()},onOpenAutoFocus:h=>{h.preventDefault(),xD()},onOpenChange:h=>{if(h){r(!0);return}g()},open:n,overlayClassName:"modal-backdrop",overlayId:"settingsBackdrop",children:a(e,{})}),m]})}function je({children:e,className:t="field",hidden:n=!1,id:r}){return a("div",{className:t,hidden:n,id:r,children:e})}function mo({children:e,hidden:t=!1}){return a("div",{className:"settings-note",hidden:t,children:e})}function Fd({detail:e,title:t}){return a("div",{className:"settings-section-intro",children:[a("div",{className:"settings-section-intro-title",children:t}),a("div",{className:"small settings-section-intro-detail",children:e})]})}function ED({values:e,observerMaxCharsDefault:t,providerOptions:n,showAuthFile:r,showAuthCommand:i,hiddenUnlessAdvanced:o,onTextInput:s,onSelectValueChange:c,getObserverModelLabel:l,getObserverModelTooltip:d,getObserverModelDescription:u,getObserverModelHint:p,protectedConfigHelp:m,observerStatusBannerSlot:f}){return a(te,{children:[a(Fd,{detail:"Set how codemem reaches your model provider and where it should look for credentials.",title:"Connection and credentials"}),f,a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Connection"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerProvider",children:"Model provider"}),a("button",{"aria-label":"About model provider",className:"help-icon","data-tooltip":"Choose where model requests are sent. Use auto for recommended defaults.",type:"button",children:"?"})]}),a(cn,{ariaLabel:"Model provider",contentClassName:"settings-select-content",id:"observerProvider",itemClassName:"settings-select-item",onValueChange:c("observerProvider"),options:[{label:"auto (default)",value:""},...n],placeholder:"auto (default)",triggerClassName:"settings-select-trigger",value:e.observerProvider,viewportClassName:"settings-select-viewport"}),a("div",{className:"small",children:"Use `auto` unless you need to pin a specific provider."})]}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerModel",children:l()}),a("button",{"aria-label":"About model defaults",className:"help-icon","data-tooltip":d(),type:"button",children:"?"})]}),a(Se,{id:"observerModel",onInput:s("observerModel"),placeholder:"leave empty for default",value:e.observerModel}),a("div",{className:"small",children:u()}),a("div",{className:"small",id:"observerModelHint",children:p()})]}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerRuntime",children:"Connection mode"}),a("button",{"aria-label":"About connection mode",className:"help-icon","data-tooltip":"Direct API uses provider credentials. Local sessions use the selected Claude or Codex CLI login.",type:"button",children:"?"})]}),a(cn,{ariaLabel:"Connection mode",contentClassName:"settings-select-content",id:"observerRuntime",itemClassName:"settings-select-item",onValueChange:c("observerRuntime"),options:[{label:"Direct API (default)",value:"api_http"},{label:"Local Claude session",value:"claude_sidecar"},{label:"Local Codex session",value:"codex_sidecar"}],triggerClassName:"settings-select-trigger",value:e.observerRuntime,viewportClassName:"settings-select-viewport"}),a("div",{className:"small",children:"Switch between provider API credentials and local Claude or Codex CLI auth."})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"codexCommand",children:"Codex command (JSON argv)"}),a(Hr,{disabled:!0,id:"codexCommand",placeholder:'["codex"]',rows:2,value:e.codexCommand}),a("div",{className:"small",children:m("codex_command")})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"claudeCommand",children:"Claude command (JSON argv)"}),a(Hr,{disabled:!0,id:"claudeCommand",placeholder:'["claude"]',rows:2,value:e.claudeCommand}),a("div",{className:"small",children:m("claude_command")})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"observerMaxChars",children:"Request size limit (chars)"}),a(Se,{id:"observerMaxChars",min:"1",onInput:s("observerMaxChars"),type:"number",value:e.observerMaxChars}),a("div",{className:"small",id:"observerMaxCharsHint",children:t?`Default: ${t}`:""})]})]}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Authentication"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerAuthSource",children:"Authentication method"}),a("button",{"aria-label":"About authentication method",className:"help-icon","data-tooltip":"Choose how credentials are resolved: environment, file, command, or none.",type:"button",children:"?"})]}),a(cn,{ariaLabel:"Authentication method",contentClassName:"settings-select-content",id:"observerAuthSource",itemClassName:"settings-select-item",onValueChange:c("observerAuthSource"),options:[{label:"auto (default)",value:"auto"},{label:"env",value:"env"},{label:"file",value:"file"},{label:"command",value:"command"},{label:"none",value:"none"}],triggerClassName:"settings-select-trigger",value:e.observerAuthSource,viewportClassName:"settings-select-viewport"}),a("div",{className:"small",children:"Use `auto` unless you need to force a file or command-based token source."})]}),a(je,{hidden:!r,id:"observerAuthFileField",children:[a("label",{htmlFor:"observerAuthFile",children:"Token file path"}),a(Se,{disabled:!0,id:"observerAuthFile",placeholder:"~/.codemem/work-token.txt",value:e.observerAuthFile}),a("div",{className:"small",children:m("observer_auth_file")})]}),a(je,{hidden:!i,id:"observerAuthCommandField",children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerAuthCommand",children:"Token command"}),a("button",{"aria-label":"About token command",className:"help-icon","data-tooltip":"Runs this command and uses stdout as the token. JSON argv only, no shell parsing.",type:"button",children:"?"})]}),a(Hr,{disabled:!0,id:"observerAuthCommand",placeholder:'["iap-auth", "--audience", "gateway"]',rows:3,value:e.observerAuthCommand}),a("div",{className:"small",children:m("observer_auth_command")})]}),a("div",{className:"small",hidden:!i,id:"observerAuthCommandNote",children:'Command format: JSON string array, e.g. `["iap-auth", "--audience", "gateway"]`.'}),a(mo,{hidden:o(),children:"These advanced credential overrides only matter when you need custom command timing, cached tokens, or extra request headers."}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"observerAuthTimeoutMs",children:"Token command timeout (ms)"}),a(Se,{id:"observerAuthTimeoutMs",min:"1",onInput:s("observerAuthTimeoutMs"),type:"number",value:e.observerAuthTimeoutMs})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"observerAuthCacheTtlS",children:"Token cache time (s)"}),a(Se,{id:"observerAuthCacheTtlS",min:"0",onInput:s("observerAuthCacheTtlS"),type:"number",value:e.observerAuthCacheTtlS})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerHeaders",children:"Request headers (JSON)"}),a("button",{"aria-label":"About request headers",className:"help-icon","data-tooltip":"Optional extra headers. Supports templates like ${auth.token}, ${auth.type}, ${auth.source}.",type:"button",children:"?"})]}),a(Hr,{disabled:!0,id:"observerHeaders",placeholder:'{"Authorization":"Bearer ${auth.token}"}',rows:4,value:e.observerHeaders}),a("div",{className:"small",children:m("observer_headers")})]})]})]})}function gs({checked:e,className:t,disabled:n=!1,hidden:r=!1,id:i,label:o,onCheckedChange:s}){const c=`${i}Label`;return a("div",{className:t?`field-checkbox settings-switch-row ${t}`:"field-checkbox settings-switch-row",hidden:r,children:[a("label",{className:"settings-switch-copy",htmlFor:i,id:c,children:o}),a(Fr,{"aria-labelledby":c,checked:e,className:"settings-switch",disabled:n,id:i,onCheckedChange:s,thumbClassName:"settings-switch-thumb"})]})}function ID({values:e,showTieredRouting:t,hiddenUnlessAdvanced:n,onTextInput:r,onSwitchInput:i,getTieredRoutingHelperText:o}){return a(te,{children:[a(Fd,{detail:"Control how often codemem processes queued work and, if needed, how it routes lighter vs richer model requests.",title:"Processing and routing"}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Processing"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"rawEventsSweeperIntervalS",children:"Background processing interval (seconds)"}),a("button",{"aria-label":"About background processing interval",className:"help-icon","data-tooltip":"How often codemem checks for queued events to process in the background.",type:"button",children:"?"})]}),a(Se,{id:"rawEventsSweeperIntervalS",min:"1",onInput:r("rawEventsSweeperIntervalS"),type:"number",value:e.rawEventsSweeperIntervalS}),a("div",{className:"small",children:"How often codemem checks for queued raw events in the background."})]})]}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Tiered observer routing"}),a(gs,{checked:e.observerTierRoutingEnabled,className:"field",id:"observerTierRoutingEnabled",label:"Enable tiered routing",onCheckedChange:i("observerTierRoutingEnabled")}),a("div",{className:"small",children:o()}),a(mo,{hidden:!t||n(),children:"These advanced routing values are only useful when you are tuning model cost, latency, or output quality for a known workload. If a selected path cannot honor the requested tier settings, codemem falls back visibly instead of silently pretending it worked."}),a("div",{hidden:!t,children:[a("h4",{children:"Simple tier"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerSimpleModel",children:"Model"}),a("button",{"aria-label":"About simple tier model",className:"help-icon","data-tooltip":"Used for lighter replay batches. Leave blank to keep codemem's routing defaults. Explicit simple-tier values override the built-in defaults.",type:"button",children:"?"})]}),a(Se,{id:"observerSimpleModel",onInput:r("observerSimpleModel"),placeholder:"leave empty for default",value:e.observerSimpleModel}),a("div",{className:"small",children:"Used when a batch falls below rich-routing thresholds."})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerSimpleTemperature",children:"Temperature"}),a(Se,{id:"observerSimpleTemperature",min:"0",onInput:r("observerSimpleTemperature"),step:"0.1",type:"number",value:e.observerSimpleTemperature})]})]}),a("div",{className:"settings-advanced",hidden:!t||n(),children:[a("h4",{children:"Shared reasoning defaults"}),a("div",{className:"small",children:"Applied to OpenAI Responses requests in both tiers unless a rich-tier override is set."}),a(je,{className:"field settings-advanced",children:[a("label",{htmlFor:"observerReasoningEffort",children:"Reasoning effort"}),a(Se,{id:"observerReasoningEffort",onInput:r("observerReasoningEffort"),placeholder:"leave empty for provider default",value:e.observerReasoningEffort})]}),a(je,{className:"field settings-advanced",children:[a("label",{htmlFor:"observerReasoningSummary",children:"Reasoning summary"}),a(Se,{id:"observerReasoningSummary",onInput:r("observerReasoningSummary"),placeholder:"leave empty for provider default",value:e.observerReasoningSummary})]})]}),a("div",{hidden:!t,children:[a("h4",{children:"Rich tier"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerRichModel",children:"Model"}),a("button",{"aria-label":"About rich tier model",className:"help-icon","data-tooltip":"Used for larger or more complex replay batches. Leave blank to keep codemem's rich-tier defaults. Explicit rich-tier values override the built-in defaults.",type:"button",children:"?"})]}),a(Se,{id:"observerRichModel",onInput:r("observerRichModel"),placeholder:"leave empty for default",value:e.observerRichModel}),a("div",{className:"small",children:"Used when routing detects a richer replay batch."})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichTemperature",children:"Temperature"}),a(Se,{id:"observerRichTemperature",min:"0",onInput:r("observerRichTemperature"),step:"0.1",type:"number",value:e.observerRichTemperature})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichReasoningEffort",children:"Reasoning effort override"}),a(Se,{id:"observerRichReasoningEffort",onInput:r("observerRichReasoningEffort"),placeholder:"inherits shared reasoning effort",value:e.observerRichReasoningEffort})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichReasoningSummary",children:"Reasoning summary override"}),a(Se,{id:"observerRichReasoningSummary",onInput:r("observerRichReasoningSummary"),placeholder:"inherits shared reasoning summary",value:e.observerRichReasoningSummary})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichMaxOutputTokens",children:"Max output tokens"}),a(Se,{id:"observerRichMaxOutputTokens",min:"1",onInput:r("observerRichMaxOutputTokens"),step:"1",type:"number",value:e.observerRichMaxOutputTokens})]})]})]}),a("div",{className:"settings-group settings-advanced",hidden:n(),children:[a("h3",{className:"settings-group-title",children:"Pack limits"}),a(mo,{hidden:n(),children:"Most users can keep these defaults. Change them only when you need smaller or larger default context packs."}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"packObservationLimit",children:"Observation limit"}),a(Se,{id:"packObservationLimit",min:"1",onInput:r("packObservationLimit"),type:"number",value:e.packObservationLimit}),a("div",{className:"small",children:"Default number of observations to include in a pack."})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"packSessionLimit",children:"Session summary limit"}),a(Se,{id:"packSessionLimit",min:"1",onInput:r("packSessionLimit"),type:"number",value:e.packSessionLimit}),a("div",{className:"small",children:"Default number of session summaries to include in a pack."})]})]})]})}function RD({values:e,hiddenUnlessAdvanced:t,onTextInput:n,onSwitchInput:r,protectedConfigHelp:i}){return a(te,{children:[a(Fd,{detail:"Choose whether this device syncs at all, how often it checks peers, and which coordinator group it should join.",title:"Device sync"}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Device Sync"}),a(gs,{checked:e.syncEnabled,className:"field",id:"syncEnabled",label:"Enable sync",onCheckedChange:r("syncEnabled")}),a("div",{className:"field",children:[a("label",{htmlFor:"syncInterval",children:"Sync interval (seconds)"}),a(Se,{id:"syncInterval",min:"10",onInput:n("syncInterval"),type:"number",value:e.syncInterval}),a("div",{className:"small",children:"How often this device checks for sync work when sync is enabled."})]}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncHost",children:"Sync host"}),a(Se,{id:"syncHost",onInput:n("syncHost"),placeholder:"127.0.0.1",value:e.syncHost})]}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncPort",children:"Sync port"}),a(Se,{id:"syncPort",min:"1",onInput:n("syncPort"),type:"number",value:e.syncPort})]}),a(gs,{checked:e.syncMdns,className:"field settings-advanced",hidden:t(),id:"syncMdns",label:"Enable mDNS discovery",onCheckedChange:r("syncMdns")}),a("div",{className:"field",children:[a("label",{htmlFor:"syncCoordinatorUrl",children:"Coordinator URL"}),a(Se,{disabled:!0,id:"syncCoordinatorUrl",placeholder:"https://coord.example.com",value:e.syncCoordinatorUrl}),a("div",{className:"small",children:i("sync_coordinator_url")})]}),a("div",{className:"field",children:[a("label",{htmlFor:"syncCoordinatorGroup",children:"Coordinator group"}),a(Se,{id:"syncCoordinatorGroup",onInput:n("syncCoordinatorGroup"),placeholder:"team-alpha",value:e.syncCoordinatorGroup}),a("div",{className:"small",children:"Discovery namespace for peers using the same coordinator."})]}),a("div",{className:"field settings-advanced",hidden:t(),children:a(mo,{hidden:t(),children:"These network overrides are for unusual local-network setups. Leave them alone unless you know this device needs non-default sync discovery or coordinator timing."})}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncCoordinatorTimeout",children:"Coordinator timeout (seconds)"}),a(Se,{id:"syncCoordinatorTimeout",min:"1",onInput:n("syncCoordinatorTimeout"),type:"number",value:e.syncCoordinatorTimeout})]}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncCoordinatorPresenceTtl",children:"Presence TTL (seconds)"}),a(Se,{id:"syncCoordinatorPresenceTtl",min:"1",onInput:n("syncCoordinatorPresenceTtl"),type:"number",value:e.syncCoordinatorPresenceTtl})]})]})]})}function DD({panelProps:e,activeTab:t,showAdvanced:n,renderState:r,settingsDirty:i,onClose:o,onSave:s,onActiveTabChange:c,onAdvancedToggle:l,observerStatusBannerSlot:d}){const u=!i||r.isSaving;return a("div",{className:"modal-card",onKeyDown:p=>Rr(p,{onSubmit:s,disabled:u}),children:[a("div",{className:"modal-header",children:[a("h2",{id:"settingsTitle",children:"Settings"}),a($o,{ariaLabel:"Close settings",className:"modal-close-button",onClick:o})]}),a("div",{className:"modal-body",children:[a("div",{className:"small",id:"settingsDescription",children:"Tune how codemem connects, processes work, and syncs with other devices."}),a("div",{className:"settings-advanced-toolbar",children:[a(gs,{checked:n,id:"settingsAdvancedToggle",label:"Show advanced controls",onCheckedChange:l}),a("button",{"aria-label":"About advanced controls",className:"help-icon","data-tooltip":"Advanced controls include JSON fields, tuning values, and network overrides.",type:"button",children:a("i",{"aria-hidden":"true","data-lucide":"help-circle"})})]}),a(mo,{hidden:!n,children:"Advanced controls are visible. Leave JSON fields, tuning values, and network overrides alone unless you are debugging or matching a known deployment setup."}),a(Kf,{ariaLabel:"Settings sections",listClassName:"settings-tabs",onValueChange:c,tabs:q0,triggerClassName:"settings-tab",value:t,children:[a(Jn,{className:"settings-panel",forceMount:!0,value:"observer",children:a(ED,{...e,observerStatusBannerSlot:d})}),a(Jn,{className:"settings-panel",forceMount:!0,value:"queue",children:a(ID,{...e})}),a(Jn,{className:"settings-panel",forceMount:!0,value:"sync",children:a(RD,{...e})})]}),a("div",{className:"small mono",id:"settingsPath",children:r.pathText}),a("div",{className:"small",id:"settingsEffective",children:r.effectiveText}),a("div",{className:"settings-note",hidden:!r.overridesVisible,id:"settingsOverrides",children:"Some values are controlled outside this screen and take priority."}),a("div",{className:"settings-note",hidden:n,children:"Advanced controls are hidden right now to keep this screen focused on everyday settings."})]}),a("div",{className:"modal-footer",children:[a("div",{className:"small",id:"settingsStatus",children:r.statusText}),a("button",{className:"settings-save","data-primary-action":"true",disabled:u,id:"settingsSave",onClick:s,type:"button",children:r.isSaving?"Saving…":"Save changes"})]})]})}function LD(e){const{current:t,baseline:n,envOverrides:r,touchedKeys:i,isProtected:o}=e,s={};return Object.entries(t).forEach(([c,l])=>{o(c)||ln(r,c)&&!i.has(c)||eD(l,n[c])||(s[c]=l)}),s}function $D(e){const t=s=>{const c=z0[s];c&&e.getTouchedKeys().add(c)},n=(s,c)=>{t(s),e.updateFormState({[s]:c}),e.setDirty(!0)};return{markFieldTouched:t,updateField:n,onTextInput:s=>c=>{n(s,c.currentTarget.value)},onSelectValueChange:s=>c=>{n(s,c)},onSwitchInput:s=>c=>{n(s,c)}}}function MD(e){const t=e?.effects,n=t&&typeof t=="object"&&!Array.isArray(t)?t:{},r=Array.isArray(n.hot_reloaded_keys)?n.hot_reloaded_keys.map(p=>Od(String(p))):[],i=Array.isArray(n.live_applied_keys)?n.live_applied_keys.map(p=>Od(String(p))):[],o=Array.isArray(n.restart_required_keys)?n.restart_required_keys.map(p=>Od(String(p))):[],s=Array.isArray(n.warnings)?n.warnings.filter(p=>typeof p=="string"&&p.trim().length>0):[],c=Array.isArray(n.manual_actions)?n.manual_actions:[],l=n.sync&&typeof n.sync=="object"?n.sync:{},d=[];r.length&&d.push(`Applied now: ${jd(r)}.`),i.length&&d.push(`Live settings updated: ${jd(i)}.`),l.attempted&&typeof l.message=="string"&&l.message?d.push(`Sync: ${l.message}.`):Array.isArray(l.affected_keys)&&l.affected_keys.length&&typeof l.reason=="string"&&l.reason&&d.push(`Sync: ${l.reason}.`),o.length&&d.push(`Restart required for ${jd(o)}. Run: codemem serve restart`),s.forEach(p=>{d.push(p)}),c.forEach(p=>{p&&typeof p.command=="string"&&p.command.trim()&&d.push(`If needed: ${p.command}.`)}),d.length||d.push("Saved.");const u=o.length>0||s.length>0||l.ok===!1;return{message:d.join(" "),type:u?"warning":"success"}}var OD=()=>aD(q.renderState.values,q.envOverrides),jD=()=>sD(q.renderState.values),FD=()=>cD(q.renderState.values),BD=()=>lD(q.renderState.values),UD=()=>dD(q.renderState.values),GD=()=>uD(q.showAdvanced),{onTextInput:HD,onSelectValueChange:KD,onSwitchInput:WD}=$D({getTouchedKeys:()=>q.touchedKeys,getValues:()=>q.renderState.values,updateFormState:hD,setDirty:e=>hs(e)});function VD(){const e=q.renderState.observerStatus;return a(kD,{status:e})}function qD(){const e=q.renderState.values,t=String(b.configDefaults?.observer_max_chars||""),n=e.observerAuthSource==="file",r=e.observerAuthSource==="command",i=e.observerTierRoutingEnabled;return a(DD,{panelProps:{values:e,observerMaxCharsDefault:t,providerOptions:Array.from(new Set(q.renderState.providers.concat(e.observerProvider?[e.observerProvider]:[]))).sort((o,s)=>o.localeCompare(s)).map(o=>({label:o,value:o})),showAuthFile:n,showAuthCommand:r,showTieredRouting:i,hiddenUnlessAdvanced:GD,onTextInput:HD,onSelectValueChange:KD,onSwitchInput:WD,getObserverModelLabel:FD,getObserverModelTooltip:BD,getObserverModelDescription:UD,getObserverModelHint:OD,getTieredRoutingHelperText:jD,protectedConfigHelp:mD},activeTab:q.activeTab,showAdvanced:q.showAdvanced,renderState:q.renderState,settingsDirty:b.settingsDirty,onClose:()=>{q.startPolling&&q.refresh&&vs(q.startPolling,q.refresh)},onSave:()=>{q.startPolling&&q.refresh&&XD(q.startPolling,q.refresh)},onActiveTabChange:gD,onAdvancedToggle:vD,observerStatusBannerSlot:a(VD,{})})}function zD(){return a(AD,{DialogContent:qD,onClose:vs})}function JD(){const e=Ie("settingsDialogMount");e&&Ue(a(zD,{}),e)}function Yy(){Ie("settingsDialogMount")&&(q.shellMounted||(JD(),q.shellMounted=!0))}function YD(e){q.shellMounted||Yy(),q.open=!0,q.previouslyFocused=document.activeElement,e(),q.controller?.setOpen(!0)}function vs(e,t){if(b.settingsDirty&&!globalThis.confirm("Discard unsaved changes?")){q.controller?.setOpen(!0);return}q.open=!1,q.controller?.setOpen(!1),fD(),(q.previouslyFocused&&typeof q.previouslyFocused.focus=="function"?q.previouslyFocused:Fc("settingsButton"))?.focus(),q.previouslyFocused=null,q.touchedKeys=new Set,e(),t()}async function XD(e,t){if(!q.renderState.isSaving){pr({isSaving:!0,statusText:"Saving changes…"});try{const n=LD({current:zy({allowUntouchedParseErrors:!0}),baseline:q.baseline,envOverrides:q.envOverrides,touchedKeys:q.touchedKeys,isProtected:yD});if(Object.keys(n).length===0){pr({isSaving:!1,statusText:"No unsaved changes"}),hs(!1),vs(e,t);return}const r=MD(await S_(n));pr({isSaving:!1,statusText:"Saved changes"}),hs(!1),vs(e,t),ne(r.message,r.type)}catch(n){pr({isSaving:!1,statusText:`Save failed: ${n instanceof Error?n.message:"unknown error"}`})}}}function QD(e,t,n){q.startPolling=t,q.refresh=n,Yy(),Fc("settingsButton")?.addEventListener("click",()=>YD(e))}function ZD(e){e.dataset.syncRenderRoot="preact"}function eL(){const e=document.getElementById("tab-sync");e&&(e.dataset.syncRenderBoundary="preact-hybrid")}function Ze(e,t){ZD(e),Ue(t,e)}function Qr(e){e.dataset.syncRenderRoot==="preact"&&Ue(null,e)}function tL(e){const t=Object.values(e||{}).map(n=>!n||typeof n!="object"?"":String(n.last_ping_at||"").trim()).filter(Boolean).sort();return t[t.length-1]??null}function nL(e){return typeof e=="object"&&e!==null}function rL(e,t){return b.pairingCommandRaw="",{payloadText:e,hintText:t}}function iL(e){if(!nL(e))return rL("Pairing not available","Enable sync and retry.");const t=e,n={...t,addresses:Array.isArray(t.addresses)?t.addresses:[]},r=JSON.stringify(n),i=`echo '${btoa(r)}' | base64 -d | codemem sync pair --accept-file -`;return b.pairingCommandRaw=i,{payloadText:i,hintText:"Copy this command and run it on the other device. Use --include/--exclude to control which projects sync."}}function oL(){return{title:"Diagnostics still loading.",detail:"Wait a moment for local sync status. If it stays blank, refresh the page or check whether sync is enabled on this device."}}function aL(){return{title:"Diagnostics unavailable right now.",detail:"The viewer could not load sync status. Refresh this page, or check that the local codemem sync service is reachable before retrying."}}function sL(){const e=b.lastSyncStatus;return{title:"No recent sync attempts yet.",detail:e?.daemon_state==="disabled"||e?.enabled===!1?"Turn on sync in Settings → Device Sync first. Recent attempts will appear here after this device can actually run sync work.":"Trigger a sync pass or pair another device to generate activity here when you need low-level troubleshooting."}}function cL(){return{title:"Recent attempts unavailable right now.",detail:"Attempt history could not be loaded because sync diagnostics failed. Refresh the page after local sync status is reachable again."}}function lL(e,t){return e==="offline-peers"&&t?"Some recent failures may have happened before all peers went offline. Sync will resume automatically when a peer becomes reachable.":""}function dL({items:e}){return a(te,{children:e.map((t,n)=>a("div",{class:"stat",children:a("div",{class:"stat-content",children:[a("div",{class:"value",children:t.value}),a("div",{class:"label",children:t.label})]})},`${t.label}-${n}`))})}function uL({attempts:e,note:t}){return a(te,{children:[t?a("div",{class:"small",children:t}):null,e.map((n,r)=>a("div",{class:"diag-line",children:[a("div",{class:"left",children:[a("div",{children:[n.peerLabel," — ",n.status]}),n.detail?a("div",{class:"small",children:n.detail}):null,n.actionHref&&n.actionLabel?a("a",{class:"small",href:n.actionHref,children:n.actionLabel}):null]}),a("div",{class:"right",children:n.startedAt})]},`${n.startedAt}-${n.peerLabel}-${r}`))]})}function Xy({text:e}){return a(te,{children:e})}function pL({title:e,detail:t}){return a("div",{class:"sync-empty-state",children:[a("strong",{children:e}),a("span",{children:t})]})}function mL(e,t){if(!t.length){Qr(e);return}Ze(e,a(dL,{items:t}))}function fL(e,t,n){if(!t.length){Qr(e);return}Ze(e,a(uL,{attempts:t,note:n}))}function mr(e,t){Ze(e,a(pL,{...t}))}function Qy(e,t,n){Ze(e,a(Xy,{text:n.payloadText})),t&&Ze(t,a(Xy,{text:n.hintText}))}function Zy({open:e,onOpenChange:t,triggerId:n,triggerClassName:r,closedLabel:i,openLabel:o,contentId:s,contentClassName:c,contentHost:l=null,children:d}){const u=B(null),p=B(null),m=B(!1);gt(()=>{u.current&&(u.current.id=n,u.current.setAttribute("aria-controls",s)),p.current&&(p.current.id=s)},[s,n,e]),K(()=>{if(!e){m.current=!1;return}m.current||(m.current=!0,queueMicrotask(()=>{p.current?.querySelector('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus()}))},[e]);const f=a(va,{forceMount:!0,asChild:!0,children:a("div",{ref:p,id:s,className:c,hidden:!e,children:d})});return a(ga,{open:e,onOpenChange:t,children:[a(Jf,{asChild:!0,children:a("button",{ref:u,type:"button",className:r,id:n,"aria-controls":s,children:e?o:i})}),l?en(f,l):f]})}function hL({open:e,onOpenChange:t}){return a(Zy,{open:e,onOpenChange:t,triggerId:"syncToggleAdmin",triggerClassName:"sync-toggle-admin",closedLabel:"Set up a new team instead…",openLabel:"Hide team setup",contentId:"syncInvitePanel",children:[a("h3",{className:"settings-group-title",style:{marginTop:"12px"},children:"Create a team"}),a("div",{className:"section-meta",children:"Generate an invite to share with teammates."}),a("div",{className:"actor-create-row",children:[a("label",{htmlFor:"syncInviteGroup",className:"sr-only",children:"Team name"}),a(Se,{className:"peer-scope-input",id:"syncInviteGroup",placeholder:"Team name (e.g. my-team)",type:"text"}),a("label",{htmlFor:"syncInvitePolicy",className:"sr-only",children:"Join policy"}),a("div",{className:"sync-radix-select-host sync-actor-select-host",id:"syncInvitePolicyMount"}),a("div",{className:"sync-ttl-group",children:[a("label",{htmlFor:"syncInviteTtl",children:"Expires in"}),a(Se,{className:"peer-scope-input",defaultValue:"24",id:"syncInviteTtl",min:"1",style:{width:"64px"},type:"number"}),a("span",{children:"hours"})]}),a("button",{className:"settings-button",id:"syncCreateInviteButton",type:"button",children:"Create invite"})]}),a("label",{htmlFor:"syncInviteOutput",className:"sr-only",children:"Generated invite"}),a(Hr,{className:"feed-search",id:"syncInviteOutput",placeholder:"Invite will appear here",readOnly:!0,hidden:!0}),a("div",{className:"peer-meta",id:"syncInviteAdminHint"}),a("div",{className:"peer-meta",id:"syncInviteWarnings",hidden:!0})]})}function gL({contentHost:e,open:t,onOpenChange:n}){return a(Zy,{open:t,onOpenChange:n,triggerId:"syncPairingToggle",triggerClassName:"settings-button",closedLabel:"Show pairing command",openLabel:"Hide pairing command",contentId:"syncPairing",contentClassName:"pairing-card",contentHost:e,children:[a("div",{className:"peer-title",children:[a("strong",{children:"Pairing command"}),a("div",{className:"peer-actions",children:a("button",{className:"settings-button",id:"pairingCopy",type:"button",children:"Copy command"})})]}),a("div",{className:"pairing-body",children:a("pre",{id:"pairingPayload",style:{userSelect:"all"}})}),a("div",{className:"peer-meta",id:"pairingHint"})]})}function vL(e,t){Ze(e,a(hL,{...t}))}function yL(e,t){Ze(e,a(gL,{...t}))}function de(e){return String(e??"").trim()}function bL(e){return de(e).replace(/\s+/g," ").toLowerCase()}function _L(e){const t=de(e);return t?t.slice(0,8):"Unnamed device"}function eb(e){return de(e?.last_error).toLowerCase()}function tb(e){return e.includes("401")&&e.includes("unauthorized")}function nb(e){return["timeout","connection refused","unreachable","aborted","all addresses failed"].some(t=>e.includes(t))}var wL={scope_filter:"sharing-domain membership",visibility_filter:"visibility",project_filter:"project filter"};function rb(e){return e.device?.needs_local_approval?{state:"needs-your-approval",badgeLabel:"Needs your approval",description:"Another device already approved this pairing. Approve it here to finish the connection on both sides.",actionLabel:"Approve on this device"}:e.device?.waiting_for_peer_approval?{state:"waiting-for-other-device",badgeLabel:"Waiting on other device",description:"You already approved this pairing here. The other device still needs to approve this one before sync can work both ways.",actionLabel:null}:{state:"none",badgeLabel:null,description:null,actionLabel:null}}function SL(e){const t=rb(e);return!de(e.device?.device_id)||e.device?.stale||e.hasAmbiguousCoordinatorGroup?!1:e.pairedLocally?t.state==="needs-your-approval":!0}function ib(e){const t=Array.isArray(e?.items)?e.items:[];if(!t.length)return{ok:!0,message:"Sync pass completed with no eligible devices.",warning:!1};const n=t.filter(i=>i&&i.ok===!1),r=t.filter(i=>Math.max(0,Number(i.opsSkipped??0))>0);if(!n.length){if(r.length){const i=r.reduce((s,c)=>s+Math.max(0,Number(c.opsSkipped??0)),0),o=NL(r.map(s=>s.skipped_out??null));return{ok:!0,message:`${i.toLocaleString()} outbound op${i===1?" was":"s were"} filtered: ${o}. No payload was sent for filtered data.`,warning:!0}}return{ok:!0,message:`Sync pass finished for ${t.length} device${t.length===1?"":"s"}.`,warning:!1}}return n.filter(i=>ob(i)==="trust").length===n.length?{ok:!1,message:"This device no longer has two-way trust with the peer. Pair it again from the other device, or remove the stale local record if it should be gone.",warning:!0}:n.filter(i=>ob(i)==="scope").length===n.length?{ok:!1,message:"Sync ran, but the peer is not authorized for one or more Spaces. Review Space access for this device in Teams, then sync again.",warning:!0}:n.length<t.length?{ok:!1,message:`${n.length} of ${t.length} device sync attempts failed. Open the affected device cards for the specific errors.`,warning:!0}:{ok:!1,message:de(n[0]?.error)||"Sync failed for at least one device.",warning:!0}}function ob(e){if(e.failureCategory)return e.failureCategory;const t=Array.isArray(e.perScopeResults)?e.perScopeResults.filter(r=>r&&r.ok===!1).map(r=>r.failureCategory).filter(r=>!!r):[];if(t.length)return new Set(t).size===1?t[0]:"other";const n=de(e.error);return CL(n)?"trust":TL(n)?"scope":null}function CL(e){const t=e.toLowerCase();return t.includes("401")&&t.includes("unauthorized")}function TL(e){const t=e.toLowerCase();return!!(t.includes("scope_rejected")||t.includes("missing_scope")||t.includes("stale_epoch")||t.includes("scope_inactive"))}function kL(e){const t=de(e?.reason);return wL[t]??(t.replaceAll("_"," ")||"sync filters")}function NL(e){const t=new Map;for(const n of e){const r=kL(n),i=Math.max(0,Number(n?.skipped_count??0));i!==0&&t.set(r,(t.get(r)??0)+i)}return t.size?Array.from(t.entries()).sort((n,r)=>r[1]-n[1]||n[0].localeCompare(r[0])).map(([n,r])=>`${r.toLocaleString()} by ${n}`).join(", "):"sync filters"}function ab(e){const t=de(e.localName);if(t)return t;const n=de(e.coordinatorName);return n||_L(de(e.deviceId))}function xL(e){const t=de(e.localName),n=de(e.coordinatorName);return t||n?!1:!!de(e.deviceId)}function PL(e){const t=Math.max(0,Number(e?.recent_ops?.in??0)),n=Math.max(0,Number(e?.recent_ops?.out??0));return t>0&&n>0?"bidirectional":n>0?"publishing":t>0?"subscribed":"none"}function fo(e){const t=de(e?.status?.peer_state);if(t==="offline"||t==="stale")return"offline";const n=eb(e);return tb(n)?"needs-repair":nb(n)?"offline":e?.has_error||t==="degraded"?"needs-repair":t==="online"||e?.status?.fresh?"connected":"waiting"}function Zr(e){const t=e?.status||{},n=de(t.peer_state),r=eb(e),i=de(t.sync_status)==="ok"||de(t.ping_status)==="ok";return n==="offline"||n==="stale"?{state:"offline",badgeLabel:"Offline",description:"This device was paired before, but it is offline right now.",isWarning:!0}:tb(r)?{state:"needs-repairing",badgeLabel:"Needs re-pairing",description:"This device no longer accepts this one. Pair again from the other device, or remove this local record if it no longer belongs here.",isWarning:!0}:nb(r)?{state:"offline",badgeLabel:"Offline",description:"This device is saved here, but none of its last known addresses are responding right now.",isWarning:!0}:i||n==="online"?{state:"mutual-trust",badgeLabel:"Two-way trust",description:"Both devices trust each other and sync can run in both directions.",isWarning:!1}:e?.has_error||n==="degraded"?{state:"needs-review",badgeLabel:"Needs review",description:"This device has a sync problem that needs review before you trust the current state again.",isWarning:!0}:{state:"trusted-by-you",badgeLabel:"Waiting on other device",description:"This device is already trusted here. Finish setup on the other device before sync can run both ways.",isWarning:!1}}var AL={missing_scope:"Missing scope id",sender_not_member:"Sender not a scope member",receiver_not_member:"Receiver not a scope member",stale_epoch:"Stale or revoked membership",scope_mismatch:"Scope mismatch",visibility_filter:"Visibility filter",project_filter:"Project filter"};function EL(e){const t=e?.scope_rejections,n=Math.max(0,Number(t?.total??0));if(!t||n===0)return{total:0,badgeLabel:null,reasons:[],lastAt:null};const r=[];for(const[i,o]of Object.entries(t.by_reason??{})){const s=Math.max(0,Number(o??0));if(s===0)continue;const c=i;r.push({reason:c,label:AL[c]??i,count:s})}return r.sort((i,o)=>o.count-i.count||i.label.localeCompare(o.label)),{total:n,badgeLabel:n===1?"1 sync rejection":`${n.toLocaleString()} sync rejections`,reasons:r,lastAt:t.last_at??null}}function sb(e){return Array.isArray(e)?e.map(t=>de(t)).filter(t=>!!t):[]}function cb(e,t){if(e.length===0)return t;const n=e.slice(0,3).join(", "),r=e.length-3;return r>0?`${n} +${r.toLocaleString()} more`:n}function ys(e,t){return e?e.replaceAll("_"," "):t}function IL(e){const t=(Array.isArray(e.authorized_scopes)?e.authorized_scopes:[]).map(r=>{const i=de(r.scope_id),o=de(r.label);if(!i&&!o)return null;const s=o||"Untitled Space",c=[ys(de(r.kind),"user"),ys(de(r.authority_type),"local"),`${ys(de(r.role),"member")} role`].filter(Boolean).join(" · ");return{scopeId:i||s,label:s,detail:c}}).filter(r=>r!=null),n=t.length;return{total:n,badgeLabel:n===1?"1 Space":n>1?`${n} Spaces`:"No Space access",isWarning:n===0,domains:t,emptyMessage:"No Space access grants exist for this device yet. Advanced project filters cannot send data by themselves."}}function lb(e){const t=(Array.isArray(e.per_scope_sync)?e.per_scope_sync:[]).map(n=>{const r=de(n.scope_id),i=de(n.label);if(!r&&!i)return null;const o=i||"Untitled Space",s=de(n.last_applied_cursor),c=de(n.last_acked_cursor),l=n.bootstrapped===!0||s?"received":"pending",d=ys(de(n.authority_type),"local"),u=Number(n.membership_epoch??0),p=[`Scope id: ${r||"unknown"}`,`${d} authority`,Number.isFinite(u)?`membership epoch ${u}`:null,s?`last applied ${s}`:null,c?`last acknowledged ${c}`:null].filter(m=>!!m).join(" · ");return{scopeId:r||o,label:o,status:l,badgeLabel:l==="received"?"Received":"Pending",detail:p}}).filter(n=>n!=null);return{total:t.length,rows:t,emptyMessage:"No per-Space sync progress is available yet. Run sync after both devices have Space access."}}var RL=["personal","private","home","mine","me"],DL=["oss","open source","opensource","community","public"],LL=["work","client"],$L=["local","legacy","review"];function ML(e){return[e.scope_id,e.label,e.kind,e.authority_type].map(t=>de(t)??"").join(" ").toLowerCase()}function OL(e){return[e.scope_id,e.label,e.kind].map(t=>de(t)??"").join(" ").toLowerCase()}function db(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Bd(e,t){const n=ML(e);return t.some(r=>{const i=db(r.toLowerCase());return new RegExp(`(^|[^a-z0-9])${i}([^a-z0-9]|$)`).test(n)})}function ub(e){return Bd(e,RL)||Bd(e,DL)}function jL(e){const t=OL(e);return $L.some(n=>{const r=db(n.toLowerCase());return new RegExp(`(^|[^a-z0-9])${r}([^a-z0-9]|$)`).test(t)})}function FL(e){return!ub(e)&&(!jL(e)||Bd(e,LL))}function BL(e){const t=Array.isArray(e.authorized_scopes)?e.authorized_scopes:[];if(!(de(e.discovered_via_group_id)||de(e.discovered_via_coordinator_id))||t.length===0)return{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""};const n=t.some(ub),r=t.some(FL);return!n||r?{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""}:{badgeLabel:"Review Space fit",detail:"Team discovery helps find the device, and advanced project filters only narrow already-authorized Spaces. Neither one grants missing work/client Space access.",isVisible:!0,message:"This Team-discovered device has personal or OSS Space access, but no separate work/client-like Space access. If this device is meant for work/client sync, grant that Space explicitly before treating sync as validated.",title:"Check this device's Space access"}}function UL(e,t){const n=e.map(r=>r.trim()).filter(Boolean);return n.length>0&&!n.includes("*")||t.length>0}function GL(e){const t=sb(e?.effective_include),n=sb(e?.effective_exclude),r=e?.inherits_global?"Global defaults":"Device override",i=`Include filter: ${cb(t,"all projects")}`,o=`Exclude filter: ${cb(n,"no exclusions")}`,s=UL(t,n);return{hasAdvancedFilters:s,statusLabel:s?"Advanced filters active":"No advanced filters",sourceLabel:r,includeLabel:i,excludeLabel:o,summary:`${r}. ${i}; ${o}.`,note:"Advanced filters only narrow data after Space access; they never grant access to another Space."}}function HL(e){const t=new Map;return(Array.isArray(e)?e:[]).forEach(n=>{const r=de(n?.display_name),i=de(n?.actor_id),o=bL(r);if(!r||!i||!o)return;const s=t.get(o)??{displayName:r,actorIds:[],includesLocal:!1};s.actorIds=[...s.actorIds,i],s.includesLocal=s.includesLocal||!!n?.is_local,t.set(o,s)}),[...t.values()].filter(n=>n.actorIds.length>1).sort((n,r)=>n.displayName.localeCompare(r.displayName))}function pb(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.duplicatePeople)?e.duplicatePeople:[],i=new Map;n.forEach(s=>{const c=de(s?.actor_id);c&&i.set(c,(i.get(c)??0)+1)});const o=new Set;return r.forEach(s=>{s.includesLocal&&s.actorIds.forEach(c=>{const l=t.find(d=>de(d?.actor_id)===c);!l||l.is_local||(i.get(c)??0)>0||o.add(c)})}),{visibleActors:t.filter(s=>!o.has(de(s?.actor_id))),hiddenLocalDuplicateCount:o.size}}var KL=new Set(["pending_setup","waiting_for_acceptance","provisioning","initial_sync","waiting_for_device","revoking"]),WL=new Set(["pending","verifying","waiting"]);function VL(e){return(Array.isArray(e?.groups)?e.groups.map(t=>de(t)).filter(Boolean):[]).join(", ")||"none"}function mb(e){return de(e?.projects?.[0]?.display_name)||"the shared Project"}function qL(e){const t=e?.items?.find(n=>n.state!=="active");return de(t?.canonicalProjectIdentity)||"the shared Project"}function zL(e,t){return t?.discovered_devices?.some(n=>n.needs_local_approval||n.waiting_for_peer_approval)?!0:e.some(n=>{const r=Zr(n).state;return r==="trusted-by-you"||r==="needs-repairing"})}function JL(e,t){return t?.enabled!==!0||t.daemon_state!=="ok"||t.daemon_running===!1?!1:e.some(n=>n.status?.sync_status==="ok"&&Zr(n).state==="mutual-trust"&&!lb(n).rows.some(r=>r.status==="pending"))}function YL(e){return e.some(t=>de(t.status?.peer_state)==="online"&&Zr(t).state==="mutual-trust")}function XL(e,t){return t?.daemon_state==="offline-peers"||t?.daemon_state==="stale"||t?.daemon_state==="degraded"?!0:e.some(n=>{const r=de(n.status?.peer_state),i=Zr(n).state;return n.has_error===!0&&i!=="needs-repairing"||i==="offline"||i==="needs-review"||r==="offline"||r==="stale"||r==="degraded"})}function QL(e){if(e?.daemon_running===!1)return!0;const t=e?.daemon_state;return t!==void 0&&t!=="ok"&&t!=="offline-peers"&&t!=="stale"&&t!=="degraded"}function fb(e){const t=e.coordinator,n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.shareOperations)?e.shareOperations:[],i=Array.isArray(e.reconciliation?.items)?e.reconciliation.items:[],o=VL(t);if(e.status?.enabled===!1||t?.sync_enabled===!1)return{state:"disabled",badgeLabel:"Sync off",meta:`Team: ${o}. Coordinator presence does not move Project data while sync is off.`,nextAction:"Open Settings and turn on sync before expecting Team or Project data to update."};if(e.shareOperationsLoadError)return{state:"needs-attention",badgeLabel:"Refresh needed",meta:`Team: ${o}. Device diagnostics are available, but Project sharing status could not be refreshed.`,nextAction:"Refresh Team sync to retry loading Project sharing status."};const s=r.find(p=>p.lifecycle?.state==="needs_attention"),c=i.find(p=>p.state==="needs_attention");if(s){const p=mb(s);return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${o}. Exact-Project setup has not converged, so coordinator presence is not a healthy sync signal.`,nextAction:`Open Project sharing below and retry setup for ${p}.`}}if(c)return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${o}. Recipient access has not converged, so coordinator presence is not a healthy sync signal.`,nextAction:"Open Sharing and use Manage projects for the affected recipient, then run Sync now again."};const l=r.find(p=>{const m=p.lifecycle?.state;return m!==void 0&&KL.has(m)}),d=i.find(p=>{const m=p.state;return m!==void 0&&WL.has(m)});if(l||d){const p=l?mb(l):qL(e.reconciliation??void 0),m=l?.lifecycle?.primary_action?.kind,f=l?.lifecycle?.state==="revoking";return{state:"pending-setup",badgeLabel:f?"Removal pending":"Setup pending",meta:f?`Team: ${o}. Future access removal for ${p} is still pending.`:`Team: ${o}. Exact-Project setup is still pending and data delivery is not confirmed.`,nextAction:f?`Keep both devices online, then sync again to finish removing future access for ${p}.`:m==="retry_setup"?`Open Project sharing below and retry setup for ${p}.`:m==="copy_invite"?`Copy the invitation for ${p} and send it to the recipient.`:`Keep both devices online, then sync again to finish setup for ${p}.`}}if(QL(e.status))return{state:"needs-attention",badgeLabel:"Sync needs attention",meta:`Team: ${o}. The local sync service is not healthy, so Project data delivery is not confirmed.`,nextAction:"Review the sync status below, restart codemem if needed, then run Sync now again."};if(zL(n,t))return{state:"trust-blocked",badgeLabel:"Pairing needed",meta:`Team: ${o}. A device still needs two-way trust before Project data can sync.`,nextAction:"Review the device below and finish pairing or approval on both devices."};const u=de(t?.presence_status);return u==="not_enrolled"?{state:"not-enrolled",badgeLabel:"Not enrolled",meta:`Team: ${o}. This device is not enrolled with the coordinator.`,nextAction:"Paste a Team invite below, or ask a Team admin to enroll this device."}:u!=="posted"?{state:"unreachable",badgeLabel:t?.configured?"Unreachable":"Setup needed",meta:t?.configured?`Team: ${o}. The coordinator is not currently reachable and no healthy data-plane sync is confirmed.`:"Configure or join a Team before expecting Project data to sync.",nextAction:t?.configured?"Check the coordinator connection, then refresh Team sync.":"Paste a Team invite below, or configure a coordinator in Advanced settings."}:XL(n,e.status)?{state:"reachable",badgeLabel:"Check devices",meta:`Team: ${o}. The coordinator is reachable, but one or more paired devices are offline or degraded.`,nextAction:"Bring the paired devices online, check their sync errors, then run Sync now again."}:t?.sync_enabled===!0&&JL(n,e.status)?{state:"healthy",badgeLabel:"Healthy",meta:`Team: ${o}. Sync is enabled and a trusted device has a healthy data-plane connection.`,nextAction:null}:YL(n)?{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${o}. The coordinator and a paired device are reachable, but successful Project sync is not confirmed.`,nextAction:"Run Sync now, then review the device sync status below if delivery is still pending."}:{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${o}. The coordinator is reachable, but healthy Project data sync is not confirmed.`,nextAction:"Pair and approve a device, then run Sync now to confirm data delivery."}}function ZL(e){return e.discovered?.stale?e.peer?fo(e.peer)!=="connected":!0:!1}function hb(e){return{id:`repair:${e.id}`,kind:"device-needs-repair",priority:10,title:e.title||`${e.name} needs attention`,summary:e.summary,actionLabel:"Open device",deviceId:e.id}}function Ud(e){return{id:`review:${e.id}:${e.key||"default"}`,kind:"review-team-device",priority:20,title:`${e.name} is available to review`,summary:e.summary,actionLabel:"Open device",deviceId:e.id}}function e$(e){return{id:`name:${e.id}`,kind:"name-device",priority:30,title:`Name ${e.name}`,summary:e.summary,actionLabel:"Go to name field",deviceId:e.id}}function t$(e){const t=de(e?.coordinator_url),n=Array.isArray(e?.groups)?e.groups:[];return t?n.some(r=>de(r))?e?.sync_enabled===!1?{reason:"sync_disabled",message:"Enable sync before pairing team devices."}:null:{reason:"coordinator_groups_empty",message:"Join or configure a team before pairing team devices."}:{reason:"coordinator_url_missing",message:"Configure a coordinator URL before pairing team devices."}}function n$(e,t){const n=new Map,r=i=>{const o=n.get(i)??{deviceId:i,localName:"",coordinatorName:"",peer:null,discovered:null};return n.set(i,o),o};return e.forEach(i=>{const o=de(i?.peer_device_id);if(!o)return;const s=r(o);s.peer=i,s.localName=de(i?.name)}),t.forEach(i=>{const o=de(i?.device_id);if(!o)return;const s=r(o);s.discovered=i,s.coordinatorName=de(i?.display_name)}),[...n.values()]}function r$(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.coordinator?.discovered_devices)?e.coordinator.discovered_devices:[],i=n$(n,r),o=e.duplicatePersonDecisions??{},s=HL(t).filter(l=>!o[[...l.actorIds].sort().join("::")]),c=[];return s.forEach(l=>{c.push({id:`duplicate:${l.actorIds.join(":")}`,kind:"possible-duplicate-person",priority:l.includesLocal?5:15,title:`Possible duplicate person: ${l.displayName}`,summary:l.includesLocal?"At least one entry is marked as you. Confirm whether these records represent the same person.":"Multiple people share this name. Confirm whether they should stay separate or be combined.",actionLabel:"Go to people",actorIds:l.actorIds})}),i.forEach(l=>{const d=ab({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId}),u=l.peer?fo(l.peer):"waiting",p=l.peer?Zr(l.peer):null,m=de(l.discovered?.fingerprint),f=de(l.peer?.fingerprint);if(l.peer&&m&&f&&m!==f){c.push(hb({id:l.deviceId,name:d,title:`${d} needs review`,summary:"This device identity changed. Remove the older local record before reconnecting it."}));return}if(l.peer&&u==="needs-repair"){const g=p?.description||de(l.peer?.last_error)||"Sync needs review.";c.push(hb({id:l.deviceId,name:d,title:p?.state==="needs-repairing"?`${d} needs re-pairing`:`${d} needs review`,summary:g}))}l.peer&&p?.state==="trusted-by-you"&&c.push(Ud({id:l.deviceId,key:"other-device-trust",name:d,summary:"You accepted this device. Finish onboarding on the other device so it trusts this one too."})),!l.peer&&l.discovered?.stale&&c.push(Ud({id:l.deviceId,key:"stale-discovery",name:d,summary:"This device is no longer advertising fresh coordinator presence. Wait for it to check in again before connecting it here."})),!l.peer&&Array.isArray(l.discovered?.groups)&&l.discovered.groups.length>1&&c.push(Ud({id:l.deviceId,key:"ambiguous-groups",name:d,summary:"This device appears in multiple coordinator groups. Review the team setup before approving it here."})),l.peer&&xL({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId})&&c.push(e$({id:l.deviceId,name:d,summary:"Give this device a friendly name so it is easier to recognize later."}))}),{primaryStatus:fb({status:e.status,coordinator:e.coordinator,peers:n,shareOperations:e.shareOperations,shareOperationsLoadError:e.shareOperationsLoadError,reconciliation:e.reconciliation}),summary:{connectedDeviceCount:n.filter(l=>fo(l)==="connected").length,seenOnTeamCount:r.length,offlineTeamDeviceCount:i.filter(l=>ZL(l)).length},duplicatePeople:s,attentionItems:c.sort((l,d)=>l.priority-d.priority||l.title.localeCompare(d.title))}}var gb={actor:"person",actors:"people",actorAssignment:"person assignment",localActor:"you",peer:"device",peers:"devices",pairedLocally:"Connected on this device",discovered:"Seen on team",conflicts:"Needs review"};function Dn(e){const t=document.getElementById(e);t&&t.remove()}var vb=!1;function i$(e){vb=e}var Gd=!1;function o$(e){Gd=e}var Hd=!1;function a$(e){Hd=e}var s$=new Set,Kd=new Set,Wd=new Set,yb="codemem-sync-duplicate-person-decisions";function c$(e){const t=String(e||"").trim();t&&(Kd.add(t),Wd.add(t),s$.add(t))}function Vd(e){const t=String(e||"").trim();return!!t&&Kd.has(t)}function l$(e){const t=String(e||"").trim();t&&Kd.delete(t)}function d$(e){const t=String(e||"").trim();return!t||!Wd.has(t)?!1:(Wd.delete(t),!0)}function qd(){try{const e=localStorage.getItem(yb);if(!e)return{};const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function bb(e){try{localStorage.setItem(yb,JSON.stringify(e))}catch{}}function _b(e){return[...e].map(t=>String(t||"").trim()).filter(Boolean).sort().join("::")}function u$(){return qd()}function p$(e,t){const n=_b(e);if(!n)return;const r=qd();r[n]=t,bb(r)}function m$(e){const t=_b(e);if(!t)return;const n=qd();delete n[t],bb(n)}function wb(e){return e.replace(/\b(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}\b/g,"$1.#.#")}function Sb(e){const t=String(e||"");return t?wb(t):""}function f$(e){if(!Array.isArray(e))return"";const t=Array.from(new Set(e.filter(Boolean)));return typeof t[0]=="string"?t[0]:""}function h$(e,t){const n=String(e?.relatedPeerDeviceId??"").trim();return n?t.some(r=>String(r?.peer_device_id??"").trim()===n):!1}function bs(e){if(!e||typeof e!="object")return"Unknown person";const t=String(e.display_name||"").trim();return t||String(e.actor_id||"Unknown person")}function _s(e){return!e||typeof e!="object"?"Unknown person":e.is_local?"You":bs(e)}function g$(e){return(Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[]).filter(t=>String(t?.actor_id||"")===e).length}function Cb(){return pb({actors:b.lastSyncActors,peers:b.lastSyncPeers,duplicatePeople:b.lastSyncViewModel?.duplicatePeople}).visibleActors}function v$(e=""){const t=[{value:"",label:"No person assigned"}],n=Cb(),r=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).find(i=>String(i?.actor_id||"")===e);return(r&&!n.some(i=>String(i?.actor_id||"")===e)?[...n,r]:n).forEach(i=>{const o=String(i?.actor_id||"").trim();o&&t.push({value:o,label:_s(i)})}),t.filter((i,o,s)=>o===s.findIndex(c=>c.value===i.value))}function Tb(e){return Cb().filter(t=>String(t?.actor_id||"")!==e)}function y$(e,t){const n=Tb(t).find(r=>String(r?.actor_id||"")===e);return!e||!n?"Choose which person should keep these devices.":`Merge into ${_s(n)}. Assigned devices move now; existing memories keep their current provenance.`}function zd(e,t){if(e){if(e.textContent="",!t.length){e.hidden=!0;return}e.hidden=!1,t.slice(0,2).forEach(n=>{const r=ma("div","sync-action"),i=ma("div","sync-action-text");i.textContent=n.label,i.appendChild(ma("span","sync-action-command",n.command));const o=ma("button","settings-button sync-action-copy","Copy");o.addEventListener("click",()=>Pi(n.command,o)),r.append(i,o),e.appendChild(r)})}}function kb(e,t){return t&&e.error_redacted===!0}function Nb(){const e=document.getElementById("syncAttempts");if(!e)return;const t=b.lastSyncAttempts,n=String(b.lastSyncStatus?.daemon_state||"").trim();if(!Array.isArray(t)||!t.length){mr(e,sL());return}const r=lL(n,t.slice(0,5).some(i=>i.status==="error"));fL(e,t.slice(0,5).map(i=>{const o=i.started_at||i.started_at_utc||"",s=String(i.peer_device_id||"").trim(),c=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers.find(m=>String(m?.peer_device_id||"")===s):null,l=String(c?.name||"").trim()||(s?s.slice(0,8):"unknown"),d=i.status==="error",u=[],p=Ei();if(d&&i.error){const m=String(i.error);u.push(p?wb(m):m),kb(i,p)&&u.push("Turn off Redact in Advanced diagnostics to reveal the full error.")}return!d&&(i.ops_in||i.ops_out)&&u.push(`${i.ops_in??0} in · ${i.ops_out??0} out`),!p&&i.address&&u.push(i.address),{status:i.status||"unknown",peerLabel:l,detail:u.join(" · "),startedAt:o?rr(o):"",...kb(i,p)?{actionHref:"#sync/diagnostics",actionLabel:"Open Advanced diagnostics Redact setting"}:{}}}),r)}function b$(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncAttempts"),n=document.getElementById("syncMeta"),r=document.getElementById("syncActions");e&&mr(e,aL()),t&&mr(t,cL()),n&&(n.textContent="Advanced diagnostics are unavailable right now. Refresh the page first. If that still fails, verify the local sync service and retry once it responds again."),zd(r,[])}function ei(e){const t=Number(e??0);return Number.isFinite(t)?t:0}function _$(e){const t=String(e?.state??"clear"),n=e?.stale_peer_rows??{},r=e?.access_cleanup_ops??{},i=ei(n.would_remove),o=ei(n.ambiguous),s=ei(r.applied),c=ei(r.source_authored);return t==="cleanup_pending"||i>0?`${i} pending removal`:t==="needs_review"||o>0?`${o} needs review`:t==="cleanup_applied"||s>0?`${s} applied`:t==="cleanup_announced"||c>0?`${c} announced`:"Clear"}function xb(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncMeta"),n=document.getElementById("syncActions");if(!e)return;Dn("syncDiagSkeleton");const r=b.lastSyncStatus;if(!r){mr(e,oL()),zd(n,[]),t&&(t.textContent="Loading advanced sync diagnostics…");return}const i=r.peers||{},o=r.ping||{},s=r.sync||{},c=r.last_sync_at||r.last_sync_at_utc||null,l=o.last_ping_at||r.last_ping_at||tL(i)||null,d=r.last_sync_error||"",u=r.last_ping_error||"",p=Number(r.pending||0),m=String(r.daemon_detail||""),f=String(r.daemon_state||"unknown"),g=r.retention||{},h=r.cleanup_diagnostics,v=h?.stale_peer_rows??{},_=ei(v.would_remove),w=ei(v.ambiguous),S=g.enabled===!0,T=Number(g.last_deleted_ops||0),k=g.last_run_at||null,P=String(g.last_error||""),E=f==="offline-peers"?"Offline peers":f==="needs_attention"?"Needs attention":f==="rebootstrapping"?"Rebootstrapping":Ug(f),M=f==="disabled"||r.enabled===!1,U=Object.keys(i).length,x=!M&&U===0;if(t){const $=M?["Advanced sync is off on this device","Turn on sync in Settings → Device Sync when you want pairing payloads, peer status, and recent attempt details here"]:x?["Advanced sync is ready but idle","Use Show pairing command under People & devices to connect another device, then this panel will start showing live peer status and recent attempts"]:[`Advanced state: ${E}`,`Peers: ${U}`,c?`Last sync: ${Nn(Kr(c))} ago`:"Last sync: never"];f==="offline-peers"&&$.push("All peers are currently offline; sync will resume automatically"),m&&f==="stopped"&&$.push(`Detail: ${m}`),m&&(f==="needs_attention"||f==="rebootstrapping")&&$.push(`Detail: ${m}`),S&&$.push(k?`Retention last ran ${Nn(Kr(k))} ago (approx oldest-first)`:"Retention enabled"),_>0?$.push(`${_.toLocaleString()} stale peer rows pending cleanup`):w>0&&$.push(`${w.toLocaleString()} stale peer rows retained because safe cleanup could not be proven`),t.textContent=$.join(" · ")}const G=M?[{label:"State",value:"Disabled"},{label:"Mode",value:"Optional"},{label:"Pending events",value:p},{label:"Last sync",value:"Not running"}]:x?[{label:"State",value:"No peers"},{label:"Mode",value:"Ready to pair"},{label:"Pending events",value:p},{label:"Last sync",value:"Waiting for first peer"}]:[{label:"State",value:E},{label:"Pending events",value:p},{label:"Last sync",value:c?`${Nn(Kr(c))} ago`:"never"},{label:"Last peer ping",value:l?`${Nn(Kr(l))} ago`:"never"},{label:"Retention",value:S?k?`${T.toLocaleString()} ops last run (approx)`:"Enabled":"Disabled"}];!M&&!x&&(d||u)&&G.push({label:[d,u].filter(Boolean).join(" · "),value:"Errors"}),!M&&!x&&s.seconds_since_last&&G.push({label:"Since last sync",value:`${s.seconds_since_last}s`}),!M&&!x&&o.seconds_since_last&&G.push({label:"Since last peer ping",value:`${o.seconds_since_last}s`}),!M&&S&&P&&G.push({label:P,value:"Retention"}),!M&&!x&&h&&G.push({label:"Cleanup",value:_$(h)}),mL(e,G);const A=[];x||f==="offline-peers"||(f==="stopped"?(A.push({label:"Sync daemon is stopped. Start it.",command:"codemem serve start"}),A.push({label:"Run one sync pass now.",command:"codemem sync once"})):f==="needs_attention"?A.push({label:"Sync needs manual attention before reset can continue.",command:"codemem sync doctor"}):f==="rebootstrapping"?A.push({label:"Sync is rebuilding state in the background.",command:"codemem sync status"}):d||u||f==="error"?(A.push({label:"Sync reports errors. Restart now.",command:"codemem serve restart && codemem sync once"}),A.push({label:"Run doctor for the root cause.",command:"codemem sync doctor"})):!M&&!x&&p>0&&A.push({label:"Pending sync work detected. Run one pass now.",command:"codemem sync once"})),!M&&w>0?A.push({label:"Some stale peer rows were retained because cleanup was ambiguous.",command:"codemem sync doctor"}):!M&&_>0&&A.push({label:"Stale peer rows are eligible for cleanup. Run one sync pass now.",command:"codemem sync once"}),zd(n,A)}var w$="syncRedactMount",S$="syncRedactLabel",Pb=()=>{};function C$(e){Pb=e}var Jd=()=>{};function Yd(){const e=document.getElementById("syncPairingDisclosureMount"),t=document.getElementById("syncPairingPanelMount");if(!e||!t)return;yL(e,{contentHost:t,open:b.syncPairingOpen,onOpenChange:r=>{if(ok(r),Yd(),r){const i=document.getElementById("pairingPayload"),o=document.getElementById("pairingHint");i&&Qy(i,o,{payloadText:"Loading…",hintText:"Fetching pairing payload…"})}Jd()}});const n=document.getElementById("pairingCopy");n&&(n.onclick=async()=>{const r=b.pairingCommandRaw;r&&await Pi(r,n)})}function Xd(){Yd();const e=document.getElementById("pairingPayload"),t=document.getElementById("pairingHint");if(!e)return;Qy(e,t,iL(b.pairingPayloadRaw));const n=document.getElementById("pairingCopy");n&&(n.disabled=!b.pairingCommandRaw)}function Ab(){const e=document.getElementById(w$);e&&Ze(e,y(Fr,{"aria-labelledby":S$,checked:Ei(),className:"sync-redact-switch",id:"syncRedact",onCheckedChange:t=>{ak(t),Ab(),Jd(),xb(),Pb(),Nb(),Xd()},thumbClassName:"sync-redact-switch-thumb"}))}function T$(e){Jd=e,Yd(),Ab()}function k$(e){e.classList.add("sync-shake"),e.addEventListener("animationend",()=>e.classList.remove("sync-shake"),{once:!0})}function ti(e,t){e.classList.add("sync-field-error");const n=e.parentElement?.querySelector(".sync-field-hint");n&&n.remove();const r=document.createElement("div");return r.className="sync-field-hint",r.textContent=t,e.insertAdjacentElement("afterend",r),k$(e),e.addEventListener("input",()=>ho(e),{once:!0}),!1}function ho(e){e.classList.remove("sync-field-error");const t=e.parentElement?.querySelector(".sync-field-hint");t&&t.remove()}function et(e,t){if(e instanceof Error){const n=e.message;return n.includes("fetch")||n.includes("network")||n.includes("Failed to fetch")?"Network error — check your connection and try again.":n}return t}var fr=new Map,Qd=null,N$={operation_device_binding_missing:"The accepted device has not been linked yet.",operation_not_found:"This sharing operation is no longer available.",operation_scope_mismatch:"The invitation no longer matches the reviewed project access.",operation_state_invalid:"The invitation is no longer in a recoverable state.",reassign_capability_required:"A participating device must be updated before setup can continue."};function x$(e){return N$[e instanceof Error?e.message:String(e)]??"Setup could not be retried. Review diagnostics for details."}function P$(e){const t=new Map;for(const n of e){const r=n.person.actor_id;t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function A$(e){return[...new Map(e.flatMap(t=>t.devices).map(t=>[t.device_id,t])).values()]}function Zd(e){switch(e){case"waiting_for_acceptance":return"Invitation pending";case"active":return"Sharing";case"revoking":return"Removing sharing";case"revoked":return"Previously shared";case"cancelled":return"Invitation cancelled";default:return"Sharing setup"}}function E$({operation:e,onAdvance:t,onLoadOperation:n,onReload:r,copyText:i}){const[o,s]=I(!1),[c,l]=I(()=>fr.get(e.operation_id)??null),d=B(null),u=e.lifecycle.primary_action;K(()=>{Qd!==e.operation_id||!d.current||(Qd=null,d.current.focus())},[c?.message,e.operation_id]);async function p(h){s(!0);try{let v=h;if(!v&&n){const w=(await n(e.operation_id)).lifecycle.primary_action;w?.kind==="copy_invite"&&(v=w.invite_link)}if(!v)throw new Error("Invitation is no longer available. Refresh the status.");await(i??(w=>navigator.clipboard.writeText(w)))(v);const _={message:"Invite copied.",tone:"success"};fr.set(e.operation_id,_),l(_)}catch(v){const _={message:v instanceof Error?v.message:"Invite could not be copied.",tone:"warning"};fr.set(e.operation_id,_),l(_)}finally{s(!1)}}async function m(){s(!0);try{const h=await t(e.operation_id),v=h.lifecycle.state==="active"?{message:"Setup complete.",tone:"success"}:h.lifecycle.state==="needs_attention"?{message:"Setup still needs attention.",tone:"warning"}:{message:`Retry started. ${h.lifecycle.label}.`,tone:"success"};fr.set(e.operation_id,v),Qd=e.operation_id,l(v),await r()}catch(h){const v={message:x$(h),tone:"warning"};fr.set(e.operation_id,v),l(v),queueMicrotask(()=>d.current?.focus())}finally{s(!1)}}function f(){const h=e.projects.map(v=>v.project_id?.trim()).filter(v=>!!v);if(h.length!==e.projects.length){const v={message:"The original project selection is unavailable. Refresh Projects and try again.",tone:"warning"};fr.set(e.operation_id,v),l(v);return}if(!ea(h,e.person.display_name)){const v={message:"Project sharing is unavailable. Refresh Projects and try again.",tone:"warning"};fr.set(e.operation_id,v),l(v)}}function g(){if(u){if(u.kind==="copy_invite"){p(u.invite_link);return}if(u.kind==="retry_setup"){m();return}f()}}return a("section",{"aria-label":`${Zd(e.lifecycle.state)} operation`,className:"project-share-operation-card",children:[a("div",{className:"peer-scope-summary",children:Zd(e.lifecycle.state)}),a("ul",{"aria-label":`${Zd(e.lifecycle.state)} projects`,className:"peer-scope-chips",children:e.projects.map((h,v)=>a("li",{className:"peer-scope-chip",children:h.display_name},`${h.display_name}:${v}`))}),a("div",{className:"peer-scope-summary",children:e.lifecycle.label}),a("div",{className:"peer-meta",role:e.lifecycle.state==="needs_attention"?"alert":void 0,children:e.lifecycle.explanation}),u?a("div",{className:"peer-actions",children:a("button",{"aria-busy":o,className:"settings-button",disabled:o,type:"button",onClick:g,children:o?u.kind==="copy_invite"?"Copying…":"Retrying…":u.label})}):null,c?a("div",{ref:d,className:`settings-note ${c.tone==="warning"?"project-attention-note":""}`,role:"status",tabIndex:-1,children:c.message}):null]})}function I$({operations:e,...t}){const n=e[0].person,r=A$(e);return a("article",{"aria-label":`Project sharing with ${n.display_name}`,className:"peer-card project-share-person-group",children:[a("h3",{className:"device-row-name",children:n.display_name}),r.length>0?a("ul",{"aria-label":`Devices for ${n.display_name}`,className:"peer-scope-rejections-list",children:r.map(i=>a("li",{children:i.display_name},i.device_id))}):null,e.map(i=>a(E$,{operation:i,...t},i.operation_id))]})}function R$(e){return e.operations.length===0?null:a("div",{className:"project-share-person-groups",children:P$(e.operations).map(t=>a(I$,{...e,operations:t},t[0].person.actor_id))})}function D$(e,t){Ze(e,a(R$,{...t}))}function Eb({title:e,detail:t}){return a("div",{className:"sync-empty-state",role:"status","aria-live":"polite","aria-atomic":"true",children:[a("strong",{children:e}),a("span",{children:t})]})}function L$(e){return e<=0?"Represents you across your own devices.":`Represents you across your own devices. ${e} unresolved duplicate ${e===1?"entry is":"entries are"} hidden until reviewed in Needs attention.`}function $$({actor:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){const o=String(e.actor_id||""),s=bs(e),c=g$(o),l=Tb(o),d=l.map(A=>String(A.actor_id||"")).join("|"),[u,p]=I(s),[m,f]=I(!1),[g,h]=I("Rename"),[v,_]=I(!1),[w,S]=I("Merge into selected person"),[T,k]=I(""),[P,E]=I(!1);K(()=>{p(s),f(!1),h("Rename"),_(!1),S("Merge into selected person"),k(""),E(!1)},[o,c,t,s,d]);const M=l.length?y$(T,o):"No other people are available yet. Create another person first if you need to merge duplicates.",U=[{label:"Merge into person",value:""},...l.map(A=>{const $=String(A.actor_id||"");return{label:A.is_local?_s(A):bs(A),value:$}})];async function x(){const A=u.trim();if(!A)return;f(!0),h("Saving…");let $=!1;try{await n(o,A),$=!0}catch{h("Retry rename")}finally{f(!1),$&&h("Rename")}}async function G(){if(!T)return;const A=l.find(L=>String(L.actor_id||"")===T);if(!A||!await Kt({title:`Merge ${s} into ${bs(A)}?`,description:"Assigned devices move now, but older memories keep their current stamped provenance for now.",confirmLabel:"Merge people",cancelLabel:"Keep separate",tone:"danger"}))return;_(!0),S("Merging…");let $=!1;try{await r(T,o),$=!0}catch{S("Retry merge")}finally{_(!1),$&&S("Merge into selected person")}}return a("div",{className:"actor-row",children:[a("div",{className:"actor-details",children:[a("div",{className:"actor-title",children:[a("strong",{children:_s(e)}),a("span",{className:`badge actor-badge${e.is_local?" local":""}`,title:e.is_local?L$(t):void 0,children:e.is_local?"You":`${c} device${c===1?"":"s"}`})]}),e.is_local?null:a("div",{className:"peer-meta",children:[c," assigned device",c===1?"":"s"]})]}),a("div",{className:"actor-actions",children:e.is_local?a("div",{className:"peer-meta",children:"Rename yourself in config"}):a(te,{children:[a(Se,{"aria-label":`Rename ${s}`,className:"peer-scope-input actor-name-input",disabled:m||v,type:"text",value:u,onInput:A=>p(A.currentTarget.value),onKeyDown:A=>Rr(A,{onSubmit:()=>{x()},disabled:m||v||!u.trim()})}),a("button",{type:"button",className:"settings-button","data-primary-action":"true",disabled:m||v,onClick:()=>{x()},children:g}),a("button",{type:"button",className:"settings-button danger",disabled:m||v,onClick:async()=>{await Kt({title:`Remove ${s}?`,description:"This deactivates the person and unassigns their devices. Existing memories keep their current attribution.",confirmLabel:"Remove person",cancelLabel:"Keep",tone:"danger"})&&await i(o)},children:"Remove"}),a("button",{type:"button",className:"settings-button",disabled:m||v,onClick:()=>E(A=>!A),children:P?"Hide duplicate cleanup":"Show duplicate cleanup"}),P?a(te,{children:[a("div",{className:"peer-meta actor-merge-note",children:"Use this only when combining duplicate people into one."}),a("div",{className:"actor-merge-controls",children:[a(cn,{ariaLabel:`Merge ${s} into another person`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:v||l.length===0,itemClassName:"sync-radix-select-item",onValueChange:k,options:U,placeholder:"Merge into person",triggerClassName:"sync-radix-select-trigger sync-actor-select actor-merge-select",value:T,viewportClassName:"sync-radix-select-viewport"}),a("button",{type:"button",className:"settings-button",disabled:v||l.length===0||!T,onClick:()=>{G()},children:w})]}),a("div",{className:"peer-meta actor-merge-note",children:M})]}):null]})})]})}function M$({actors:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){return e.length?a(te,{children:e.map(o=>{const s=String(o.actor_id||o.display_name||o.is_local||"");return a($$,{actor:o,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i},s)})}):a(Eb,{detail:"Create a named person here, then assign devices below so team ownership stays readable.",title:"No people set up yet."})}function O$(e,t){Ze(e,a(M$,{...t}))}function j$(e){return e.filter(t=>String(t.origin_device_id||"").trim())}function F$(e){const t=e.find(n=>String(n.last_seen_at||"").trim());return t?.last_seen_at?`Detected from older synced memories. Latest memory: ${rr(String(t.last_seen_at).trim())}`:"Detected from older synced memories not yet attached to a current device."}function B$({devices:e}){return a(te,{children:F$(e)})}function U$(e){const t=String(e.origin_device_id||"").trim(),n=Number(e.memory_count||0);return{label:n>0?`${t} (${n} memories)`:t,value:t}}function G$(e){const t=j$(e.devices);if(!t.length){e.panel.hidden=!0,e.onValueChange(""),Qr(e.mount),Qr(e.meta);return}const n=t.map(U$),r=n.some(i=>i.value===e.value)?e.value:n[0]?.value||"";r!==e.value&&e.onValueChange(r),e.panel.hidden=!1,Ze(e.mount,a(cn,{ariaLabel:"Legacy device",contentClassName:"sync-radix-select-content sync-legacy-select-content",id:"syncLegacyDeviceSelect",itemClassName:"sync-radix-select-item",onValueChange:e.onValueChange,options:n,triggerClassName:"sync-radix-select-trigger sync-legacy-select",value:r,viewportClassName:"sync-radix-select-viewport"})),Ze(e.meta,a(B$,{devices:t}))}var H$={online:"Online",offline:"Offline",degraded:"Degraded",attention:"Action required",syncing:"Syncing",unknown:"Status unknown"};function K$({state:e,size:t=8,"aria-label":n}){return a("span",{"aria-label":n??H$[e],className:`presence-pip presence-pip--${e}`,role:"img",style:`--presence-pip-size: ${t}px`})}function hr({feedback:e}){return e?.message?a("div",{className:`sync-inline-feedback ${e.tone}`,role:e.tone==="warning"?"alert":"status","aria-live":e.tone==="warning"?"assertive":"polite","aria-atomic":"true",children:e.message}):null}function W$(){return a("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:[a("title",{children:"Chevron"}),a("path",{d:"m9 18 6-6-6-6"})]})}function V$(e){switch(fo(e)){case"connected":return"online";case"offline":return"offline";case"needs-repair":return"attention";default:return"unknown"}}var ws=null,Ib=0,eu=new Set;function Rb(e){if(ws!==e){ws=e,Ib+=1;for(const t of eu)t(Ib)}}function q$(){const[,e]=I(0);return K(()=>(eu.add(e),()=>{eu.delete(e)}),[]),ws}var z$={bidirectional:{glyph:"↕",label:"Bidirectional sync in the last 24 hours"},publishing:{glyph:"↑",label:"Publishing only in the last 24 hours"},subscribed:{glyph:"↓",label:"Subscribed only in the last 24 hours"},none:null};function J$(e){return e?e.authorized?"Private same-person sync is limited to your personal Space. Team and org Spaces do not carry your private memories.":"Private same-person sync is blocked until this device is granted an allowed personal Space.":"Private same-person sync is limited to an allowed personal Space; team or org Spaces do not carry your private memories."}function Y$(){window.location.hash="coordinator-admin"}function tu(e=b.lastCoordinatorAdminStatus){return e?.readiness==="ready"&&e.has_admin_secret===!0}function X$({peer:e,onAssignActor:t,onRemove:n,onRename:r,onSync:i}){const o=String(e.peer_device_id||""),s=e.name||(o?o.slice(0,8):"unknown"),c=e.name||o||s,l=Zr(e),d=z$[PL(e)],u=e.status||{},p=IL(e),m=Vd(o),f=m&&p.total===0,g=BL(e),h=EL(e),v=lb(e),_=GL(e.project_scope||{}),w=f$(e.addresses),S=Array.isArray(e.addresses)?Array.from(new Set(e.addresses.filter(Boolean).map(ae=>String(ae)))):[],T=Number(e.address_count??0),k=Number.isFinite(T)&&T>0?T:0,P=S.length?S.map(ae=>Ei()?Sb(ae):ae).join(" · "):k>0?`${k} ${k===1?"address":"addresses"} hidden`:"No addresses",E=e.actor_display_name?`This device belongs to ${e.claimed_local_actor?"you":String(e.actor_display_name)}.`:"This device is not assigned to anyone yet.",M=String(u.last_sync_at||u.last_sync_at_utc||""),U=String(u.last_ping_at||u.last_ping_at_utc||""),x=e.discovered_via_group_id?`Discovery: seen through Team ${e.discovered_via_group_id}. Discovery helps find devices; Space access above decides data access.`:e.discovered_via_coordinator_id?`Discovery: seen through coordinator ${e.discovered_via_coordinator_id}. Discovery helps find devices; Space access above decides data access.`:null,G=d$(o),A=B(null),[$,L]=I(s),[J,H]=I(()=>b.syncPeerFeedbackById.get(o)??null),[N,R]=I(!1),[j,V]=I("Save name"),[ge,le]=I(!1),[ce,be]=I(!1),[Y,fe]=I("Remove device"),[X,_e]=I(String(e.actor_id||"")),[he,Q]=I(!1),[$e,ue]=I("Save assignment"),W=xe(()=>{const ae=v$(X),Ge=ae.some(Mn=>Mn.value===X);return X&&!Ge&&ae.push({value:X,label:e.claimed_local_actor?"You":String(e.actor_display_name||"Current assignment")}),ae},[e.actor_display_name,e.claimed_local_actor,X,b.lastSyncActors,b.lastSyncPeers,b.lastSyncViewModel]);K(()=>{m&&p.total>0&&l$(o)},[p.total,o,m]),K(()=>{L(s),H(b.syncPeerFeedbackById.get(o)??null),R(!1),V("Save name"),le(!1),be(!1),fe("Remove device"),_e(String(e.actor_id||"")),Q(!1),ue("Save assignment")},[s,e.actor_id,o]),K(()=>{!G||!A.current||queueMicrotask(()=>A.current?.scrollIntoView({block:"center",behavior:window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"}))},[G]);async function oe(){if(!o)return;const ae=$.trim();if(!ae){const Ge={message:"Enter a friendly name for this device.",tone:"warning"};H(Ge),b.syncPeerFeedbackById.set(o,Ge),document.querySelector(`[data-device-name-input="${CSS.escape(o)}"]`)?.focus();return}R(!0),V("Saving…");try{const Ge=await r(o,ae);H(Ge),b.syncPeerFeedbackById.set(o,Ge),V("Save name")}catch{V("Retry")}finally{R(!1)}}async function We(){if(f){const ae=tu();if(!await Kt({title:`Sync ${s} before advanced rule review?`,description:ae?"This manual sync will use the current Space access and advanced filters until you review them in Teams.":"This manual sync will use the current Space access and advanced filters until a coordinator or manager reviews them in Teams.",confirmLabel:"Sync anyway",cancelLabel:ae?"Review in Teams first":"Cancel"}))return}le(!0);try{const ae=await i(e,w);H(ae),ae&&b.syncPeerFeedbackById.set(o,ae)}finally{le(!1)}}async function Me(){if(!o||!await Kt({title:`Remove device ${c}?`,description:"This removes the local record for this paired device on this machine.",confirmLabel:"Remove device",cancelLabel:"Keep device",tone:"danger"}))return;be(!0),fe("Removing…");let ae=!1;try{await n(o,c),ae=!0}catch{fe("Retry remove")}finally{be(!1),ae&&fe("Remove device")}}async function tt(){if(o){Q(!0),ue("Saving…");try{const ae=await t(o,X||null);H(ae),b.syncPeerFeedbackById.set(o,ae),ue("Save assignment")}catch{ue("Retry")}finally{Q(!1)}}}const un=q$()===o&&o!=="",Lt=`device-drawer-${o||"unknown"}`,kt=V$(e),$t=M?`Sync: ${rr(M)}`:"Sync: never",nt=tu(),Mt=`${un?"Collapse":"Expand"} device ${s}`;return a(ga,{asChild:!0,open:un,onOpenChange:ae=>{ae?Rb(o):ws===o&&Rb(null)},children:a("div",{ref:A,className:"peer-card","data-peer-device-id":o||void 0,children:[a(Jf,{asChild:!0,children:a("button",{"aria-label":Mt,className:"device-row-head device-row-head--trigger",type:"button",children:[a(K$,{state:kt}),a("span",{className:"device-row-name",title:o||void 0,children:s}),d?a("span",{"aria-label":d.label,className:"peer-direction",role:"img",title:d.label,children:d.glyph}):null,a("span",{className:"device-row-chips",children:[a("span",{className:`badge ${l.isWarning?"badge-offline":"badge-online"}`,children:l.badgeLabel}),f?a("span",{className:"badge actor-badge",children:"Review advanced rules"}):null,a("span",{className:`badge ${p.isWarning?"badge-offline":"actor-badge"}`,title:"Spaces are the hard access boundary; advanced filters only narrow inside them.",children:p.badgeLabel}),h.badgeLabel?a("span",{className:"badge badge-offline",title:"Inbound ops rejected by the sharing-domain scope gate. Expand for reason codes.",children:h.badgeLabel}):null,g.badgeLabel?a("span",{className:"badge badge-offline",title:"Review whether explicit Space access matches this device's intended role.",children:g.badgeLabel}):null,e.discovered_via_group_id?a("span",{className:"badge actor-badge",title:`Discovered through coordinator group ${e.discovered_via_group_id}`,children:`via ${e.discovered_via_group_id}`}):null]}),a("span",{className:"device-row-meta",children:$t}),a("span",{"aria-hidden":"true",className:"device-row-chevron",children:a(W$,{})})]})}),a(va,{"aria-label":`Device actions for ${s}`,className:"device-row-drawer",id:Lt,children:[a("div",{className:"peer-actions",children:[a("button",{type:"button",className:"settings-button",disabled:ge,onClick:()=>{We()},title:w?void 0:"Address details are hidden; sync will target this device by ID.",children:ge?"Syncing…":"Sync now"}),a("div",{className:"sync-labeled-field",children:[a("label",{className:"sync-labeled-field-caption",htmlFor:`device-name-${o||"unknown"}`,children:"Device name"}),a(Se,{"aria-label":`Friendly name for ${s}`,className:"peer-scope-input","data-device-name-input":o||void 0,disabled:N,id:`device-name-${o||"unknown"}`,placeholder:"Friendly device name",type:"text",value:$,onInput:ae=>L(ae.currentTarget.value)})]}),a("button",{type:"button",className:"settings-button",disabled:N,onClick:()=>{oe()},children:j}),a("button",{type:"button",className:"settings-button danger",disabled:ce,onClick:()=>{Me()},children:Y})]}),a("div",{className:"peer-scope",children:[G?a("div",{className:"peer-meta",children:nt?"Review this device's Space access and advanced rules in Teams if the defaults are too broad.":"A coordinator or manager can review this device's Space access and advanced rules in Teams if the defaults are too broad."}):f?a("div",{className:"peer-meta",children:"Advanced rule review is still pending for this device."}):null,a("div",{className:"peer-scope-summary",children:"Device details"}),a("div",{className:"peer-addresses",children:P}),x?a("div",{className:"peer-meta",children:x}):null,a("div",{className:"peer-meta",children:[M?`Sync: ${rr(M)}`:"Sync: never",U?`Ping: ${rr(U)}`:"Ping: never"].join(" · ")}),a("div",{className:"peer-scope-summary",children:"Space access"}),a("div",{className:"peer-meta",children:p.total>0?"These Spaces are the hard access boundary for this device.":p.emptyMessage}),p.domains.length>0?a("ul",{className:"peer-scope-chips","aria-label":"Authorized Spaces",children:p.domains.map(ae=>a("li",{className:"peer-scope-chip",title:ae.detail,children:ae.label},ae.scopeId))}):null,g.isVisible?a("div",{className:"settings-note",role:"status",children:[a("strong",{children:g.title}),a("div",{children:g.message}),a("div",{children:g.detail})]}):null,a("div",{className:"peer-meta",children:_.note}),a("div",{className:"peer-scope-summary",children:"Space sync progress"}),a("div",{className:"peer-meta",children:v.total>0?"Per-Space progress for this device. Open details to see technical identifiers.":v.emptyMessage}),v.rows.length>0?a("ul",{className:"peer-scope-rejections-list","aria-label":"Per-Space sync progress",children:v.rows.map(ae=>a("li",{title:ae.detail,children:[a("span",{className:"peer-scope-rejection-label",children:ae.label}),a("span",{className:`badge ${ae.status==="received"?"badge-online":"actor-badge"}`,children:ae.badgeLabel})]},ae.scopeId))}):null,h.total>0?a("div",{className:"peer-scope-rejections","data-peer-rejection-count":h.total,children:[a("div",{className:"peer-scope-summary",children:"Sharing-rule rejections (24h)"}),a("div",{className:"peer-meta",children:"Inbound ops the local fail-closed gate refused. Diagnostics never expose op payloads."}),a("ul",{className:"peer-scope-rejections-list",children:h.reasons.map(ae=>a("li",{children:[a("span",{className:"peer-scope-rejection-label",children:ae.label}),a("span",{className:"peer-scope-rejection-count",children:ae.count.toLocaleString()})]},ae.reason))}),h.lastAt?a("div",{className:"peer-meta",children:["Last rejected ",rr(h.lastAt)]}):null]}):null,a("div",{className:"peer-scope-summary",children:"Who this device belongs to"}),a("div",{className:"peer-meta",children:E}),e.claimed_local_actor?a("div",{className:"peer-meta",children:J$(e.claimed_local_actor_scope)}):null,a("div",{className:"peer-actor-row",children:[a("div",{className:"sync-radix-select-host sync-actor-select-host",children:a(cn,{ariaLabel:`Assigned person for ${s}`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:he,itemClassName:"sync-radix-select-item",onValueChange:_e,options:W,placeholder:"No person assigned yet",triggerClassName:"sync-radix-select-trigger sync-actor-select",value:X,viewportClassName:"sync-radix-select-viewport"})}),a("button",{type:"button",className:"settings-button",disabled:he,onClick:()=>{tt()},children:$e})]}),a("div",{className:"peer-scope-summary",children:"Advanced sharing rules"}),a("div",{className:"peer-meta",children:[_.statusLabel,". ",_.summary," ",_.note]}),nt?a("div",{className:"peer-actions",children:a("button",{type:"button",className:"settings-button",onClick:Y$,children:"Manage Spaces in Teams"})}):a("div",{className:"peer-meta",children:"Space access is managed in Teams by a coordinator or manager."}),a(hr,{feedback:J})]})]})]})})}function Q$(e){const t=b.syncPeersSectionFeedback,n=b.lastSyncStatus,r=n?.daemon_state==="disabled"||n?.enabled===!1;return e.peers.length?a(te,{children:[a(hr,{feedback:t}),e.peers.map(i=>{const o=String(i.peer_device_id||i.name||"unknown-peer");return a(X$,{peer:i,...e},o)})]}):a(te,{children:[a(hr,{feedback:t}),a(Eb,{detail:r?"Turn on sync in Settings → Device Sync first. Then use Invite a teammate or Paste an invite above to connect another device.":"Use Invite a teammate above to share a join code, or Paste an invite to enroll this device on an existing team.",title:"No teammates yet"})]})}function Z$(e,t){Ze(e,a(Q$,{...t}))}var dn=async()=>{},Ss="";function nu(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput");t&&(t.disabled=e),n&&(n.disabled=e)}function eM(e){dn=e}function tM(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");if(!e)return;Dn("syncActorsSkeleton"),nu(!1);const n=pb({actors:b.lastSyncActors,peers:b.lastSyncPeers,duplicatePeople:b.lastSyncViewModel?.duplicatePeople}),r=n.visibleActors;t&&(t.textContent=r.length?"Manage people here, then assign devices below.":"No named people yet. Create a person here, then assign devices below so sync ownership is easier to review.",n.hiddenLocalDuplicateCount>0&&(t.textContent+=` ${n.hiddenLocalDuplicateCount} unresolved duplicate ${n.hiddenLocalDuplicateCount===1?"entry is":"entries are"} hidden here until reviewed in Needs attention.`)),O$(e,{actors:r,hiddenLocalDuplicateCount:n.hiddenLocalDuplicateCount,onRename:async(i,o)=>{await yw(i,o),await dn()},onMerge:async(i,o)=>{try{await Wu(i,o),ne("People combined. Assigned devices moved to the selected person."),await dn()}catch(s){throw ne(et(s,"Failed to combine people."),"warning"),s}},onDeactivate:async i=>{try{await bw(i),ne("Person removed. Assigned devices have been unassigned."),await dn()}catch(o){throw ne(et(o,"Failed to remove person."),"warning"),o}}})}function nM(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");nu(!0),t&&(t.textContent="People controls are temporarily unavailable. Refresh this page to retry. Device status and sync health are still available below while this recovers."),e&&mr(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. When the people endpoint responds again, named people will reload here."})}function rM(){const e=document.getElementById("syncProjectShareOperations");if(!e)return;D$(e,{operations:b.lastShareOperations,onAdvance:n=>cw(n),onLoadOperation:n=>sw(n),onReload:dn});const t=document.getElementById("syncProjectShareOperationsMeta");t&&(t.textContent=b.shareOperationsLoadError?"Project sharing status could not be refreshed. Existing device diagnostics remain available below.":b.lastShareOperations.length>0?"Project access is grouped by Person. Devices appear after invitation acceptance.":"Share a project from Projects to invite a teammate.")}function ru(){const e=document.getElementById("syncPeers");if(!e)return;Dn("syncPeersSkeleton");const t=b.lastSyncPeers,n=Array.isArray(t)?t:[];h$(b.syncPeersSectionFeedback,n)&&(b.syncPeersSectionFeedback=null),Z$(e,{peers:n,onRename:async(r,i)=>{try{return await ju(r,i),await dn(),{message:"Device name saved.",tone:"success"}}catch(o){return{message:et(o,"Failed to save device name."),tone:"warning"}}},onSync:async(r,i)=>{try{const o=String(r?.peer_device_id||""),s=ib(await Gs({address:i,peerDeviceId:o||void 0}));let c;s.ok?o&&Vd(o)?c={message:`Triggered sync for ${r?.name||(o?o.slice(0,8):"unknown")}. ${tu()?"Review Space access and advanced rules in Teams if this device needs tighter sharing.":"A coordinator or manager can review Space access and advanced rules in Teams if this device needs tighter sharing."}`,tone:"warning"}:c={message:s.message,tone:"success"}:c={message:s.message,tone:"warning"};try{await dn()}catch{c={message:"Sync started, but this view has not refreshed yet. Refresh the page or use Sync now again before retrying.",tone:"warning"}}return c}catch(o){return{message:et(o,"Failed to trigger sync."),tone:"warning"}}},onRemove:async(r,i)=>{try{await Ou(r);const o={message:`Removed peer ${i}.`,tone:"success"};return b.syncPeerFeedbackById.delete(r),b.syncPeersSectionFeedback={...o,relatedPeerDeviceId:r},await dn(),o}catch(o){return{message:et(o,"Failed to remove peer. The local peer entry is still here."),tone:"warning"}}},onAssignActor:async(r,i)=>{try{return await Y_(r,i),await dn(),{message:i?"Device assignment updated.":"Device assignment cleared.",tone:"success"}}catch(o){return{message:et(o,"Failed to update device assignment. The current assignment is unchanged."),tone:"warning"}}}})}function iM(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta"),n=document.getElementById("syncPeers");nu(!0),t&&(t.textContent="People and device details are unavailable right now. Refresh this page to retry once local sync status is reachable again."),e&&mr(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. Named people will reload here once the local sync status endpoint responds again."}),n&&mr(n,{title:"Devices unavailable right now.",detail:"Refresh this page to retry. When sync is reachable again, paired devices will reload here so you can rename, assign, or re-pair them."})}function Db(){const e=document.getElementById("syncLegacyClaims"),t=document.getElementById("syncLegacyDeviceSelectMount"),n=document.getElementById("syncLegacyClaimsMeta");!e||!t||!n||G$({devices:Array.isArray(b.lastSyncLegacyDevices)?b.lastSyncLegacyDevices:[],meta:n,mount:t,onValueChange:r=>{r!==Ss&&(Ss=r,Db())},panel:e,value:Ss})}function oM(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput"),r=document.getElementById("syncLegacyClaimButton");n?.addEventListener("keydown",i=>{Rr(i,{onSubmit:()=>t?.click(),disabled:!t||t.disabled})}),t?.addEventListener("click",async()=>{if(!t||!n)return;const i=String(n.value||"").trim();if(!i){ti(n,"Enter a name for the person.");return}ho(n),t.disabled=!0,n.disabled=!0,t.textContent="Creating…";try{await vw(i),ne("Person created."),n.value="",await e()}catch(o){ne(et(o,"Failed to create person."),"warning"),t.textContent="Retry",t.disabled=!1,n.disabled=!1;return}t.textContent="Create person",t.disabled=!1,n.disabled=!1}),r?.addEventListener("click",async()=>{const i=String(Ss||"").trim();if(!i||!r||!await Kt({title:`Attach history from ${i}?`,description:"This updates legacy provenance so the older device history is attached to you on this device.",confirmLabel:"Attach history",cancelLabel:"Cancel",tone:"danger"}))return;r.disabled=!0;const o=r.textContent||"Attach device history";r.textContent="Attaching…";try{await _w(i),ne("Old device history attached to you."),await e()}catch(s){ne(et(s,"Failed to attach old device history."),"warning"),r.textContent="Retry",r.disabled=!1;return}r.textContent=o,r.disabled=!1})}function aM(){return window.location.hash.replace(/^#/,"")==="sync/diagnostics"?"diagnostics":"main"}function iu(e=aM()){const t=document.getElementById("syncMainView"),n=document.getElementById("syncDiagnosticsView");!t||!n||(e==="diagnostics"?(t.hidden=!0,n.hidden=!1):(t.hidden=!1,n.hidden=!0))}var Lb=!1;function sM(){Lb||(Lb=!0,window.addEventListener("hashchange",()=>{iu()}))}var zt={invitePolicy:"auto_admit",loadSyncData:async()=>{}};function cM(e){zt.loadSyncData=e}var lM=[{value:"auto_admit",label:"Auto-admit"},{value:"approval_required",label:"Approval required"}];function dM(){const e=document.getElementById("syncCreateInviteButton"),t=document.getElementById("syncInviteAdminHint");if(!e||!t)return;const n=b.lastCoordinatorAdminStatus?.readiness,r=String(b.lastCoordinatorAdminStatus?.active_group||"").trim();if(n==="ready"){e.disabled=!1,t.hidden=!1,t.textContent=r?`Teams is ready for ${r}. Advanced admin tools now live in Teams.`:"Teams is ready. Advanced admin tools now live in Teams.";return}const i=n==="partial"?"Finish Teams setup before creating remote invites. Use Teams to check what is missing.":"Configure a coordinator URL, Team, and admin secret before creating remote invites. Use Teams to finish setup.";e.disabled=!0,t.hidden=!1,t.textContent=i}function ou(){const e=document.getElementById("syncAdminDisclosureMount");e&&vL(e,{open:vb,onOpenChange:t=>{i$(t),ou(),Ts(),au()}})}function uM(){const e=document.getElementById("syncJoinPanel"),t=document.getElementById("syncJoinSection");!e||!t||e.parentElement!==t&&t.appendChild(e)}function au(){const e=document.getElementById("syncInviteOutput"),t=document.getElementById("syncInviteWarnings");if(!e)return;const n=String(b.lastTeamInvite?.encoded||"").trim();if(e.value=n,e.hidden=!n,t){const r=Array.isArray(b.lastTeamInvite?.warnings)?b.lastTeamInvite.warnings:[];t.textContent=r.join(" · "),t.hidden=r.length===0}}function Cs(){const e=document.getElementById("syncJoinFeedback");if(!e)return;const t=b.syncJoinFlowFeedback;e.textContent=t?.message||"",e.hidden=!t?.message,e.setAttribute("role",t?.tone==="warning"?"alert":"status"),e.setAttribute("aria-live",t?.tone==="warning"?"assertive":"polite"),e.className=`peer-meta${t?` ${t.tone==="warning"?"sync-inline-feedback warning":"sync-inline-feedback success"}`:""}`}function Ts(){const e=document.getElementById("syncInvitePolicyMount");e&&Ze(e,y(cn,{ariaLabel:"Join policy",contentClassName:"sync-radix-select-content sync-actor-select-content",id:"syncInvitePolicy",itemClassName:"sync-radix-select-item",onValueChange:t=>{const n=t==="approval_required"?"approval_required":"auto_admit";n!==zt.invitePolicy&&(zt.invitePolicy=n,Ts())},options:lM,triggerClassName:"sync-radix-select-trigger sync-actor-select",value:zt.invitePolicy,viewportClassName:"sync-radix-select-viewport"}))}function pM(e,t){ou(),Ts();const n=document.getElementById("syncNowButton"),r=document.getElementById("syncShareProjectsButton"),i=document.getElementById("syncCreateInviteButton"),o=document.getElementById("syncInviteGroup"),s=document.getElementById("syncInviteTtl"),c=document.getElementById("syncInviteOutput"),l=document.getElementById("syncJoinButton"),d=document.getElementById("syncJoinInvite"),u=document.getElementById("syncProjectInviteReview"),p=document.getElementById("syncProjectInviteContext"),m=document.getElementById("syncProjectInviteReviewHeading"),f=document.getElementById("syncRecipientName"),g=document.getElementById("syncRecipientDeviceName");let h="",v=0;r?.addEventListener("click",()=>{ea()||ne("Project sharing is unavailable. Refresh Projects and try again.","warning")});const _=async(w,S)=>{if(!u||!f||!g)return"other";const T=await Mu(w);if(S!==v||d?.value.trim()!==w)return"stale";if(T.kind!=="project_share_invite")return"other";const k=(T.projects??[]).map(P=>`${P.display_name} (${P.existing_memory_count} existing ${P.existing_memory_count===1?"memory":"memories"})`).join(", ");return p&&(p.textContent=`${T.inviter_name||"A teammate"} invited you${T.team_name?` through ${T.team_name}`:""} to share ${k||"selected projects"}.`),f.value=T.recipient_name??"",g.value=T.device_name??"",u.hidden=!1,h=w,l&&(l.textContent="Accept and start syncing"),m?.focus(),"project"};d?.addEventListener("input",()=>{v+=1,d.value.trim()!==h&&(h="",u&&(u.hidden=!0),l&&(l.textContent="Review invite"))}),i?.addEventListener("click",async()=>{if(!i||!o||!s||!c||i.disabled)return;const w=o.value.trim(),S=Number(s.value);let T=!0;if(w?ho(o):T=ti(o,"Team name is required."),!S||S<1?T=ti(s,"Must be at least 1 hour."):ho(s),!!T){i.disabled=!0,i.textContent="Creating…";try{const k=await Du({group_id:w,policy:zt.invitePolicy,ttl_hours:S||24});b.lastTeamInvite=k,au(),c.value=String(k.encoded||""),c.hidden=!1,c.focus(),c.select();const P=Array.isArray(k.warnings)?k.warnings:[];ne(P.length?`Invite created. Copy it above and review ${P.length===1?"1 warning":`${P.length} warnings`}.`:"Invite created. Copy the text above and share it with your teammate.",P.length?"warning":"success")}catch(k){ne(et(k,"Failed to create invite. Check the team name, invite lifetime, and coordinator reachability, then try again."),"warning"),i.textContent="Retry",i.disabled=!1;return}finally{i.disabled&&(i.disabled=!1,i.textContent="Create invite")}}}),d?.addEventListener("keydown",w=>{Rr(w,{onSubmit:()=>l?.click(),disabled:!l||l.disabled})}),l?.addEventListener("click",async()=>{if(!l||!d)return;const w=d.value.trim();if(!w){ti(d,"Paste a team invite or pairing payload.");return}if(ho(d),h!==w){const T=v;try{const k=await _(w,T);if(k==="project"||k==="stale")return}catch{}if(T!==v||d.value.trim()!==w)return;h=w,l.textContent="Accept invite";return}const S=u&&!u.hidden?{recipient_name:f?.value.trim()??"",device_name:g?.value.trim()??""}:void 0;if(S){const T=k=>!k||[...k].length>120||[...k].some(P=>/[\p{Cc}\p{Cf}]/u.test(P));if(T(S.recipient_name)){f&&ti(f,"Enter a valid name using 120 characters or fewer.");return}if(T(S.device_name)){g&&ti(g,"Enter a valid device name using 120 characters or fewer.");return}}l.disabled=!0,l.textContent="Accepting…";try{const T=await Fs(w,S);b.lastTeamJoin=T;const k=T,P=typeof k.type=="string"?k.type:"team_join";let E;if(P==="pair"){const M=String(T.peer_device_id??"").trim();E={message:M?`Paired with device ${M.slice(0,8)}. It will appear in People & devices.`:"Paired the device. It will appear in People & devices.",tone:"success"}}else if(P==="project_share"){const M=k.restart_required===!0||k.setup_state==="pending_inviter"||T.status==="pending_setup",U=typeof k.detail=="string"?k.detail.trim():"";E=M?{message:U||(k.restart_required===!0?"Project invitation accepted. Restart codemem to finish setup.":k.setup_state==="pending_inviter"?"Project invitation accepted. Waiting for the inviter to finish setup.":"Project invitation accepted. Setup is still pending."),tone:"warning"}:{message:"Project invitation accepted.",tone:"success"}}else E={message:T.status==="pending"?"Join request sent. Waiting for admin approval.":"Joined the team.",tone:"success"};b.syncJoinFlowFeedback=E,Cs(),d.value="",h="",u&&(u.hidden=!0);try{await t()}catch(M){E={message:et(M,"Accepted the invite, but this view has not refreshed yet."),tone:"warning"},b.syncJoinFlowFeedback=E,Cs()}}catch(T){b.syncJoinFlowFeedback={message:et(T,"Failed to accept. Check that the invite or pairing payload is complete and current, then try again."),tone:"warning"},Cs(),l.textContent="Retry",l.disabled=!1;return}finally{l.disabled&&(l.disabled=!1,l.textContent="Review invite")}}),n?.addEventListener("click",async()=>{if(n){n.disabled=!0,n.textContent="Syncing…";try{const w=ib(await Gs());ne(w.message,w.warning?"warning":void 0)}catch(w){ne(et(w,"Failed to start sync. Retry once, then run codemem sync doctor if the problem keeps coming back."),"warning"),n.textContent="Retry",n.disabled=!1;return}n.disabled=!1,n.textContent="Sync now",e()}})}function su({element:e,hidden:t=!1,restoreParent:n=null}){const r=B(null);return gt(()=>{e&&(e.hidden=t)},[e,t]),gt(()=>{const i=r.current;if(!(!i||!e))return e.parentElement!==i&&i.appendChild(e),()=>{!n||e.parentElement!==i||n.appendChild(e)}},[e,n]),a("div",{ref:r})}function mM({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:r}){return a(te,{children:[a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:["Invite a teammate.",a("span",{className:"sync-action-command",children:"Generate an invite when you want someone else to join this team from their device."})]}),a("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide invite form":"Invite a teammate"})]}),e?a(su,{element:e,hidden:!t,restoreParent:n}):null]})}function fM(){return a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:["Pair another device.",a("span",{className:"sync-action-command",children:"Copy a pairing command when you want to connect another one of your own devices."})]}),a("button",{type:"button",className:"settings-button sync-action-copy",onClick:e=>Pi("codemem sync pair --payload-only",e.currentTarget),children:"Copy pairing command"})]})}function hM({joinPanel:e,joinPanelOpen:t,joinRestoreParent:n,onToggle:r}){return a(te,{children:[a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:["Accept an invite or pairing.",a("span",{className:"sync-action-command",children:"Paste a team invite to join another team, or a pairing payload to connect another device."})]}),a("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide paste form":"Paste invite or pairing"})]}),e?a(su,{element:e,hidden:!t,restoreParent:n}):null]})}function gM({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,joinPanel:r,joinPanelOpen:i,joinRestoreParent:o,onToggleInvitePanel:s,onToggleJoinPanel:c,pairedPeerCount:l,presenceStatus:d}){const u=d==="not_enrolled";return a(te,{children:[u?a(te,{children:[a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:["Join this device.",a("span",{className:"sync-action-command",children:"Paste a team invite or pairing payload below to join an existing team or connect another of your devices."})]})}),r?a(su,{element:r,hidden:!1,restoreParent:o}):null,a("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0}),a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:["This device is not on the team yet.",a("span",{className:"sync-action-command",children:"Use Join this device above, or ask an admin to enroll it first."})]})})]}):a(te,{children:[a(hM,{joinPanel:r,joinPanelOpen:i,joinRestoreParent:o,onToggle:c}),a("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0})]}),u?null:a(mM,{invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:s}),!l&&d==="posted"?a(fM,{}):null]})}function ks({count:e,label:t}){return a("div",{className:"sync-section-heading",children:[a("div",{className:"sync-action-text sync-section-label",children:t}),e?a("span",{className:"badge actor-badge sync-section-count",children:e}):null]})}function Ns({children:e}){return a("div",{className:"section-meta sync-section-note",children:e})}function vM({item:e,onAction:t}){const[n,r]=I(!1);return a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:[e.title,a("span",{className:"sync-action-command",children:e.summary})]}),a("button",{type:"button",className:"settings-button",disabled:n,onClick:async()=>{r(!0);try{await t(e)}finally{r(!1)}},children:e.actionLabel||"Review"})]})}function yM({request:e,onApprove:t,onDeny:n}){const[r,i]=I(null),[o,s]=I(null),[c,l]=I("Approve"),[d,u]=I("Deny");return a("div",{className:"actor-row",children:[a("div",{className:"actor-details",children:a("div",{className:"actor-title",title:e.requestId||void 0,children:e.displayName})}),a("div",{className:"actor-actions",children:[a("button",{type:"button",className:"settings-button","aria-label":`${c} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("approve"),l("Approving…");try{s(await t(e)||null),l("Approve")}catch{l("Retry")}finally{i(null)}},children:c}),a("button",{type:"button",className:"settings-button","aria-label":`${d} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("deny"),u("Denying…");try{s(await n(e)||null),u("Deny")}catch{u("Retry")}finally{i(null)}},children:d})]}),a(hr,{feedback:o})]})}function bM({row:e,onInspectConflict:t,onRemoveConflict:n,onReview:r}){const[i,o]=I(null),[s,c]=I(null),l=e.actionLabel||"Pair with this device",[d,u]=I(l),[p,m]=I("Remove broken device record");return a("div",{className:"peer-card peer-card--padded","data-discovered-device-id":e.deviceId,children:[a("div",{className:"peer-title",children:[a("strong",{title:e.displayTitle||void 0,children:e.displayName}),a("span",{className:`badge actor-badge${e.availabilityLabel==="Offline"?"":" local"}`,children:e.availabilityLabel}),a("span",{className:"badge actor-badge",children:e.connectionLabel}),e.approvalBadgeLabel?a("span",{className:"badge actor-badge",children:e.approvalBadgeLabel}):null]}),a("div",{className:"peer-meta",children:e.note}),a("div",{className:"peer-actions",children:[e.mode==="accept"?a("button",{type:"button",className:"settings-button","aria-label":`${d} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{o("review"),u("Pairing…"),c({message:`Pairing ${e.displayName}. Keep this page open while the device is approved and refreshed.`,tone:"success"});try{c(await r(e)||null),u(e.actionLabel||l)}catch{c({message:`Pairing ${e.displayName} failed. Try again.`,tone:"warning"}),u("Retry")}finally{o(null)}},children:d}):null,(e.mode==="stale"||e.mode==="ambiguous"||e.mode==="scope-pending"||e.mode==="setup-blocked")&&e.actionMessage?a("div",{className:"peer-meta",children:e.actionMessage}):null,e.mode==="paired"&&e.pairedMessage?a("div",{className:"peer-meta",children:e.pairedMessage}):null,e.mode==="conflict"?a(te,{children:[a("button",{type:"button",className:"settings-button","aria-label":`Open details for ${e.displayName}`,disabled:i!==null,onClick:()=>t(e),children:"Open device details"}),a("button",{type:"button",className:"settings-button danger","aria-label":`${p} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{o("remove"),m("Removing…");try{c(await n(e)||null),m("Remove broken device record")}catch{m("Retry")}finally{o(null)}},children:p})]}):null]}),a(hr,{feedback:s})]})}function _M(e){const t=e.actionItems.length>0,n=e.actionableCount>e.actionItems.length,r=t||n||e.primaryStatus.state!=="healthy";return a(te,{children:[r?a(ks,{label:"Needs attention"}):null,r?a(Ns,{children:"Start here when something needs review, re-pairing, or approval."}):null,e.primaryStatus.nextAction?a("div",{className:"sync-action","data-primary-sync-state":e.primaryStatus.state,children:a("div",{className:"sync-action-text",children:[e.primaryStatus.badgeLabel,a("span",{className:"sync-action-command",children:e.primaryStatus.nextAction})]})}):null,t?e.actionItems.map(i=>a(vM,{item:i,onAction:e.onAttentionAction},i.id)):null,!t&&!n&&e.primaryStatus.state==="healthy"?a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:"No urgent team work right now."})}):null,!t&&n?a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:"More team follow-up is listed below when you are ready."})}):null]})}function wM({children:e}){return e?a(te,{children:[a(ks,{label:"Add devices & teammates"}),a(Ns,{children:"Use these flows when you are enrolling, inviting, or pairing something new."}),e]}):null}function SM({mount:e,rows:t,onInspectConflict:n,onRemoveConflict:r,onReview:i}){return!e||!t.length&&!b.syncDiscoveredFeedback?null:en(a(te,{children:[a(ks,{count:t.length||void 0,label:"Devices waiting for review"}),a(Ns,{children:"Review team devices here when they still need trust, re-pairing, or approval on this machine."}),a(hr,{feedback:b.syncDiscoveredFeedback}),t.map(o=>a(bM,{row:o,onInspectConflict:n,onRemoveConflict:r,onReview:i},o.deviceId))]}),e)}function CM({mount:e,requests:t,onApprove:n,onDeny:r}){return!e||!t.length&&!b.syncJoinRequestsFeedback?null:en(a(te,{children:[a(ks,{count:t.length||void 0,label:"Join requests to review"}),a(Ns,{children:"Approve or deny requests here before those devices become part of the team."}),a(hr,{feedback:b.syncJoinRequestsFeedback}),t.map(i=>a(yM,{request:i,onApprove:n,onDeny:r},i.requestId))]}),e)}function $b(e){return a(te,{children:[a(_M,{...e}),a(wM,{children:e.children}),a(CM,{mount:e.joinRequestsMount,requests:e.pendingJoinRequests,onApprove:e.onApproveJoinRequest,onDeny:e.onDenyJoinRequest}),a(SM,{mount:e.discoveredListMount,rows:e.discoveredRows,onInspectConflict:e.onInspectConflict,onRemoveConflict:e.onRemoveConflict,onReview:e.onReviewDiscoveredDevice})]})}function Mb(e){e&&(e.textContent="")}function xs(e){e instanceof HTMLElement&&(e.classList.remove("sync-attention-target"),e.offsetWidth,e.classList.add("sync-attention-target"),window.setTimeout(()=>e.classList.remove("sync-attention-target"),900))}function TM(){return typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}function go(){return TM()?"auto":"smooth"}var cu="syncTeamActionsMount";function kM(e,t,n){e.hidden=!1,e.textContent=n.badgeLabel,t.textContent=n.meta,n.state==="healthy"?e.className="sync-online-badge":n.state==="disabled"||n.state==="pending-setup"||n.state==="not-enrolled"||n.state==="reachable"?e.className="sync-online-badge sync-online-offline":e.className="sync-online-badge sync-online-error"}function NM(e,t){const n=document.createElement("div");n.id=cu,e.appendChild(n),Ze(n,y($b,{actionItems:[],actionableCount:0,discoveredListMount:null,discoveredRows:[],joinRequestsMount:null,onApproveJoinRequest:async()=>null,onAttentionAction:async()=>{},onDenyJoinRequest:async()=>null,onInspectConflict:()=>{},onRemoveConflict:async()=>null,onReviewDiscoveredDevice:async()=>null,pendingJoinRequests:[],presenceStatus:"unknown",primaryStatus:t}))}function Ob(e,t){const n=document.getElementById(cu);n&&(Qr(n),n.remove()),Mb(e),t.forEach(r=>{Mb(r)})}function Ps(){const e=document.getElementById("syncTeamMeta"),t=document.getElementById("syncSetupPanel"),n=document.getElementById("syncTeamActions");if(!e||!t||!n)return;ou(),Ts(),au(),Cs(),dM();const r=document.getElementById("syncInvitePanel"),i=document.getElementById("syncAdminSection"),o=document.getElementById("syncJoinPanel"),s=document.getElementById("syncJoinSection"),c=document.getElementById("syncJoinRequests"),l=document.getElementById("syncCoordinatorDiscovered"),d=document.getElementById("syncCoordinatorDiscoveredMeta"),u=document.getElementById("syncCoordinatorDiscoveredList");Dn("syncTeamSkeleton"),uM();const p=b.lastSyncCoordinator,m=b.lastSyncViewModel||{primaryStatus:fb({status:b.lastSyncStatus,coordinator:p,peers:b.lastSyncPeers,shareOperations:b.lastShareOperations,shareOperationsLoadError:b.shareOperationsLoadError}),summary:{connectedDeviceCount:0,seenOnTeamCount:0,offlineTeamDeviceCount:0},duplicatePeople:[],attentionItems:[]},f=A=>{if(A.kind==="possible-duplicate-person"){const H=document.getElementById("syncActorsList");H instanceof HTMLElement&&(H.scrollIntoView({block:"center",behavior:go()}),xs(H));return}const $=String(A.deviceId||"").trim();if(!$)return;if(A.kind==="name-device"){const H=document.querySelector(`[data-device-name-input="${CSS.escape($)}"]`);if(H instanceof HTMLInputElement){H.scrollIntoView({block:"center",behavior:go()}),H.focus(),H.select(),xs(H);return}}const L=document.querySelector(`[data-peer-device-id="${CSS.escape($)}"]`);if(L instanceof HTMLElement){L.scrollIntoView({block:"center",behavior:go()}),xs(L);return}const J=document.querySelector(`[data-discovered-device-id="${CSS.escape($)}"]`);J instanceof HTMLElement&&(J.scrollIntoView({block:"center",behavior:go()}),xs(J))},g=async A=>{const $=Array.isArray(A.actorIds)?A.actorIds.map(R=>String(R||"").trim()).filter(Boolean):[],L=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).filter(R=>$.includes(String(R?.actor_id||"").trim()));if(L.length<2){ne("This duplicate review is outdated. Refresh the card and review the remaining people entries.","warning");return}const J=await wP({title:"Review possible duplicate people",summary:A.title.replace(/^Possible duplicate person:\s*/,""),actors:L.map(R=>({actorId:String(R?.actor_id||""),label:String(R?.display_name||R?.actor_id||"Unknown person"),isLocal:!!R?.is_local}))});if(J.action==="different-people"){p$($,"different-people"),ne("Okay. I will keep these people separate on this device."),await zt.loadSyncData();return}if(J.action!=="merge")return;const H=L.find(R=>String(R?.actor_id||"")===J.primaryActorId),N=L.find(R=>String(R?.actor_id||"")===J.secondaryActorId);if(!H?.actor_id||!N?.actor_id){ne("Could not determine which people to combine. Refresh People & devices and try the review again.","warning");return}try{await Wu(String(H.actor_id),String(N.actor_id)),m$($),ne(`Combined duplicate people into ${String(H.display_name||H.actor_id)}.`),await zt.loadSyncData()}catch(R){try{await zt.loadSyncData()}catch{}ne(et(R,"Failed to combine these people."),"warning")}},h=async A=>await Il({title:"Pair with this device",description:"Choose a friendly name for this device before pairing it on this machine.",initialValue:A,placeholder:"Desk Mini",confirmLabel:"Pair",cancelLabel:"Cancel",validate:$=>$.trim()?null:"Enter a device name to pair this device."}),v=!!p?.configured,_=t$(p);e.title=v?String(p.coordinator_url||"").trim():"";const w=document.getElementById("syncOnlineBadge");if(w?kM(w,e,m.primaryStatus):e.textContent=m.primaryStatus.meta,!v){Ob(n,[c,u]),t.hidden=!1,n.hidden=!1,NM(n,m.primaryStatus),c&&(c.hidden=!0),l&&(l.hidden=!0);return}t.hidden=!0,n.hidden=!1;const S=String(p.presence_status||""),T=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[],k=Array.isArray(m.attentionItems)?m.attentionItems:[],P=(Array.isArray(p.discovered_devices)?p.discovered_devices:[]).map(A=>{const $=String(A.device_id||"").trim(),L=ab({coordinatorName:String(A.display_name||"").trim(),deviceId:$})||"Discovered device",J=$&&L!==$?$:null,H=String(A.fingerprint||"").trim(),N=(Array.isArray(A.groups)?A.groups.map(Q=>String(Q||"").trim()).filter(Boolean):[]).length>1,R=T.find(Q=>String(Q?.peer_device_id||"")===$),j=rb({device:A,pairedLocally:!!R}),V=String(R?.fingerprint||"").trim(),ge=!!R&&!!H&&!!V&&V!==H,le=!_&&SL({device:A,hasAmbiguousCoordinatorGroup:N,pairedLocally:!!R}),ce=Array.isArray(A.addresses)?A.addresses:[],be=Number(A.address_count??0),Y=Number.isFinite(be)&&be>0?be:0,fe=[ce.length?ce.map(Q=>Ei()?Sb(String(Q||"")):String(Q||"")).filter(Boolean).join(" · "):Y>0?`${Y} ${A.stale?"last-known":"fresh"} ${Y===1?"address":"addresses"} hidden`:"No fresh addresses"];!ce.length&&J&&fe.push(`device id: ${$}`);let X=null,_e=le?"accept":"none",he=null;return ge?_e="conflict":_&&(!R||j.state==="needs-your-approval")?(X=_.message,_e="setup-blocked"):N?(X="This device appears in multiple coordinator groups. Review team setup first or ask an admin to clean up the duplicate enrollment before approving it here.",_e="ambiguous"):R&&Vd($)?(X="Review this device's Space access and advanced rules in Teams before you sync it.",_e="scope-pending"):R?.last_error?(fe.push(`error: ${String(R.last_error)}`),le||(_e="paired")):R?.status?.peer_state?(fe.push(`status: ${String(R.status.peer_state)}`),le||(_e="paired")):!R&&A.stale?(X="Wait for a fresh coordinator presence update, then review this device again here.",_e="stale"):R&&!le&&(_e="paired"),_e==="paired"&&(he=j.state==="waiting-for-other-device"?j.description||"Waiting on the other device.":String(R?.last_error||"").toLowerCase().includes("401")&&String(R?.last_error||"").toLowerCase().includes("unauthorized")?"Waiting for the other device to trust this one before sync can work.":null),{actionMessage:X,actionLabel:j.actionLabel||(R?"Review device":"Pair with this device"),approvalBadgeLabel:j.badgeLabel,availabilityLabel:A.stale?"Offline":"Available",connectionLabel:ge?gb.conflicts:R?gb.pairedLocally:"Not connected on this device",deviceId:$,displayName:L,displayTitle:J,fingerprint:H,mode:_e,note:fe.join(" · "),pairedMessage:he}}),E=[],M=P.filter(A=>A.mode!=="paired"&&A.mode!=="none"&&A.mode!=="scope-pending"),U=P.filter(A=>A.mode==="accept"||A.mode==="scope-pending").length,x=k.length+E.length+U;l&&(l.hidden=M.length===0&&!b.syncDiscoveredFeedback),d&&(d.textContent=M.length?"Pair with a teammate's device to see it appear in People & devices and start syncing.":""),c&&(c.hidden=E.length===0&&!b.syncJoinRequestsFeedback),Ob(n,[c,u]);const G=document.createElement("div");G.id=cu,n.appendChild(G),Ze(G,y($b,{actionItems:k,actionableCount:x,children:y(gM,{invitePanel:r,invitePanelOpen:Gd,inviteRestoreParent:i,joinPanel:o,joinPanelOpen:Hd,joinRestoreParent:s,onToggleInvitePanel:()=>{r&&(o$(!Gd),Ps())},onToggleJoinPanel:()=>{o&&(a$(!Hd),Ps())},pairedPeerCount:Number(p.paired_peer_count||0),presenceStatus:S}),discoveredListMount:u,discoveredRows:M,joinRequestsMount:c,onApproveJoinRequest:async()=>null,onAttentionAction:async A=>{if(A.kind==="possible-duplicate-person"){await g(A);return}f(A)},onDenyJoinRequest:async()=>null,onInspectConflict:A=>{const $=document.querySelector(`[data-peer-device-id="${CSS.escape(A.deviceId)}"]`);if($ instanceof HTMLElement){$.scrollIntoView({block:"center",behavior:go()}),ne(`Opened the conflicting local device record for ${A.displayName}.`,"warning");return}ne("The conflicting local device record is not visible yet. Scroll to People & devices and try again.","warning")},onRemoveConflict:async A=>{if(!await Kt({title:`Remove ${A.displayName}?`,description:"This deletes the broken local device record. You can review this device again after the screen refreshes.",confirmLabel:"Remove device record",cancelLabel:"Keep device record",tone:"danger"}))return null;try{await Ou(A.deviceId);const $={message:`Removed the broken local device record for ${A.displayName}. If it is still available, review it again from Next steps or Devices seen on team.`,tone:"success"};return b.syncDiscoveredFeedback=$,await zt.loadSyncData(),$}catch($){return{message:et($,"Failed to remove the broken local device record. The old local record is still present in People & devices."),tone:"warning"}}},onReviewDiscoveredDevice:async A=>{try{const $=await h(A.displayName);if(!$)return null;const L=await X_(A.deviceId,A.fingerprint),J=String(L?.name||A.displayName||"").trim()||A.displayName;b.pendingAcceptedSyncPeers=[...Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(N=>String(N?.peer_device_id||"").trim()!==A.deviceId):[],{peer_device_id:A.deviceId,name:J,fingerprint:A.fingerprint,addresses:[],claimed_local_actor:!1,status:{peer_state:"degraded"},last_error:"Waiting for the other device to approve this one."}],c$(A.deviceId);let H={message:A.approvalBadgeLabel==="Needs your approval"?`Approved ${A.displayName} on this device. Two-way trust should be ready once both devices refresh.`:`Step 1 complete on this device for ${A.displayName}. Finish onboarding on the other device so both sides trust each other for sync.`,tone:"success"};try{$.trim()!==J.trim()&&(await ju(A.deviceId,$.trim()),b.pendingAcceptedSyncPeers=b.pendingAcceptedSyncPeers.map(N=>String(N?.peer_device_id||"").trim()===A.deviceId?{...N,name:$.trim()}:N),H={message:`Connected ${$.trim()} and saved its name.`,tone:"success"})}catch(N){H={message:et(N,"Device connected, but naming did not finish."),tone:"warning"}}b.syncDiscoveredFeedback=H;try{await zt.loadSyncData()}catch(N){H={message:et(N,"Device connected, but the screen did not refresh yet. Refresh this page before trying the next step."),tone:"warning"},b.syncDiscoveredFeedback=H}return H}catch($){return{message:et($,"Failed to review this device. Wait for a fresh presence update and try again."),tone:"warning"}}},pendingJoinRequests:E,presenceStatus:S,primaryStatus:m.primaryStatus}))}function xM(e){switch(e){case"cwd":return"Matched by folder";case"git_remote":return"Matched by git remote";case"workspace_id":return"Matched by workspace";case"project":return"Matched by project name";case"unmapped":return"Missing project identity";default:return`Matched by ${e.replace(/_/g," ")}`}}function ni(e){const t=e.displayProject.toLowerCase();return t.includes("fatal:")||t.includes("not a git repository")||t==="unknown project"||e.identitySource==="unmapped"}function jb(e){return ni(e)?"Unclear project identity":e.displayProject}function Tt(e){return(e.reassignableMemoryCount??e.memoryCount)>0}function PM(e,t){return e.suggestedScopeId?` · suggested ${t.find(n=>n.scopeId===e.suggestedScopeId)?.label||"Space"}`:""}function AM(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function EM(e,t){return t.find(n=>n.scopeId===e)?.label||"selected Space"}function IM(e){switch(e){case"coordinator":return"Team Space";case"local":return"Local Space";default:return"Other Space"}}function RM(e){if(!e)return"date unavailable";const t=new Date(e);return Number.isNaN(t.getTime())?e:new Intl.DateTimeFormat("en-US",{day:"numeric",month:"short",timeZone:"UTC",year:"numeric"}).format(t)}function DM(e){return e.gitRemote?e.gitRemote:e.cwd?e.cwd:e.project?e.project:"source identity unavailable"}function LM({group:e}){const t=e.memorySamples??[],n=t.length;return a("details",{className:"legacy-review-samples",children:[a("summary",{children:["Inspect affected memories",n?` (${n} sample${n===1?"":"s"})`:""]}),a("div",{className:"legacy-review-cleanup-note",children:"Showing representative memories from this project group before reassignment. Local memories can be reassigned; peer-owned memories stay in review on this device."}),t.length>0?a("ul",{className:"legacy-review-sample-list",children:t.map(r=>a("li",{className:"legacy-review-sample",children:[a("div",{className:"legacy-review-sample-title",children:r.title}),a("div",{className:"legacy-review-group-meta",children:[r.kind||"memory"," · ",RM(r.updatedAt??r.createdAt)," ","·"," ",r.ownership==="local"?"local, reassignable":"peer-owned, stays in review"]}),r.bodyPreview?a("div",{className:"legacy-review-sample-body",children:r.bodyPreview}):null,a("div",{className:"legacy-review-group-meta mono",children:DM(r)})]},r.id))}):a("div",{className:"legacy-review-cleanup-note",children:"No samples are available for this group. Refresh Sync and try again before reassigning."})]})}function Fb(e,t,n){let r=(e instanceof Error?e.message:"Unable to reassign legacy review memories.").replace(/sharing domain/gi,"Space");return t&&(r=r.replace(new RegExp(`\\b${AM(t)}\\b`,"g"),EM(t,n))),r}function $M(e,t){const n=e.suggestedScopeId?t.find(r=>r.scopeId===e.suggestedScopeId)?.label:"";return[e.displayProject,e.identitySource,e.suggestedScopeId??"",n??"",e.suggestionReason??"",e.workspaceIdentity].join(" ").toLowerCase()}function MM({item:e,onReview:t}){return a("div",{className:"actor-row",children:[a("div",{className:"actor-details",children:[a("div",{className:"actor-title",children:[a("strong",{children:e.peerName}),a("span",{className:"badge actor-badge",children:["person: ",e.actorDisplayName||e.actorId]})]}),a("div",{className:"peer-meta",children:[e.shareableCount," share by default · ",e.privateCount," marked Only me ·"," ",e.scopeLabel]})]}),a("div",{className:"actor-actions",children:a("button",{type:"button",className:"settings-button",onClick:t,children:"Review my memories in Feed"})})]})}function OM({item:e,onReassign:t,onReview:n}){const r=e.groups??[],i=e.targetScopes??[],o=Object.fromEntries(r.map(N=>[N.workspaceIdentity,N.suggestedScopeId??""])),[s,c]=I({}),[l,d]=I({}),[u,p]=I(o),[m,f]=I({}),[g,h]=I("all"),[v,_]=I(""),[w,S]=I(null),T=r.length,k=e.totalGroupCount??T,P=r.filter(ni).length,E=r.filter(N=>N.suggestedScopeId&&!ni(N)&&Tt(N)).length,M=r.filter(N=>m[N.workspaceIdentity]&&Tt(N)).length,U=r.filter(N=>m[N.workspaceIdentity]&&Tt(N)&&!!u[N.workspaceIdentity]).length,x=r.filter(N=>{const R=ni(N);return g==="suggested"&&(!N.suggestedScopeId||R)||g==="cleanup"&&!R||g==="no-suggestion"&&(N.suggestedScopeId||R)||g==="selected"&&!m[N.workspaceIdentity]?!1:!v.trim()||$M(N,i).includes(v.trim().toLowerCase())});async function G(N){const R=u[N.workspaceIdentity]||N.suggestedScopeId||"";if(!(!R||!t||w)){S(N.workspaceIdentity),d(j=>{const V={...j};return delete V[N.workspaceIdentity],V});try{const j=await t(N,R,!!s[N.workspaceIdentity],s[N.workspaceIdentity]?.confirmation_token);c(j?V=>({...V,[N.workspaceIdentity]:j}):V=>{const ge={...V};return delete ge[N.workspaceIdentity],ge})}catch(j){d(V=>({...V,[N.workspaceIdentity]:Fb(j,R,i)}))}finally{S(null)}}}function A(N,R){p(j=>({...j,[N.workspaceIdentity]:R})),c(j=>{const V={...j};return delete V[N.workspaceIdentity],V}),d(j=>{const V={...j};return delete V[N.workspaceIdentity],V})}function $(N,R){f(j=>({...j,[N.workspaceIdentity]:R}))}function L(N){f(R=>({...R,...Object.fromEntries(x.filter(Tt).map(j=>[j.workspaceIdentity,N]))}))}function J(){f(N=>({...N,...Object.fromEntries(r.filter(R=>R.suggestedScopeId&&!ni(R)&&Tt(R)).map(R=>[R.workspaceIdentity,!0]))}))}async function H(){if(!t||w||U===0)return;const N=r.filter(R=>m[R.workspaceIdentity]&&Tt(R)&&!!u[R.workspaceIdentity]);if(!N.every(R=>s[R.workspaceIdentity])){S("bulk");try{for(const R of N){if(s[R.workspaceIdentity])continue;const j=u[R.workspaceIdentity]||R.suggestedScopeId||"";if(j)try{const V=await t(R,j,!1);d(ge=>{const le={...ge};return delete le[R.workspaceIdentity],le}),V&&c(ge=>({...ge,[R.workspaceIdentity]:V}))}catch(V){d(ge=>({...ge,[R.workspaceIdentity]:Fb(V,j,i)}))}}}finally{S(null)}}}return a("div",{className:"legacy-review-card",children:[a("div",{className:"legacy-review-header",children:[a("div",{children:[a("div",{className:"actor-title",children:[a("strong",{children:"Legacy shared review"}),a("span",{className:"badge badge-offline",children:"Needs project review"})]}),a("div",{className:"peer-meta legacy-review-summary",children:[k.toLocaleString()," older"," ",k===1?"project needs":"projects need"," a Space. They contain"," ",e.memoryCount.toLocaleString()," older shared memories total; review the projects, not individual memories.",T<k?` Showing ${T.toLocaleString()} projects; open Projects to review the rest.`:""]}),a("div",{className:"peer-meta legacy-review-warning",children:"Fix peer-owned projects on their source device. Reassignment updates future sync authorization; online compatible peers should converge after syncing, but offline devices, backups, copied databases, malicious peers, or old versions may retain old copies."})]}),a("div",{className:"actor-actions",children:a("button",{type:"button",className:"settings-button",onClick:n,children:"Manage all projects"})})]}),a("div",{className:"legacy-review-toolbar",children:[a("div",{className:"legacy-review-filter-row",children:[["all",`Showing ${T.toLocaleString()}`],["suggested",`Suggested ${E.toLocaleString()}`],["cleanup",`Needs cleanup ${P.toLocaleString()}`],["no-suggestion","No suggestion"],["selected",`Selected ${U.toLocaleString()}`]].map(([N,R])=>a("button",{className:g===N?"settings-button legacy-filter active":"settings-button legacy-filter",onClick:()=>h(N),type:"button",children:R},N))}),a("div",{className:"legacy-review-bulk-row",children:[a("input",{"aria-label":"Search legacy project groups",className:"peer-scope-input legacy-review-search",onInput:N=>_(N.currentTarget.value),placeholder:"Search project, signal, or destination…",value:v}),a("button",{className:"settings-button",onClick:()=>L(!0),type:"button",children:"Select visible"}),a("button",{className:"settings-button",onClick:J,type:"button",children:"Select suggested"}),a("button",{className:"settings-button",onClick:()=>L(!1),type:"button",children:"Clear visible"}),t&&i.length>0?a("button",{className:"settings-save",disabled:w!=null||U===0||r.filter(N=>m[N.workspaceIdentity]&&Tt(N)&&!!u[N.workspaceIdentity]).every(N=>s[N.workspaceIdentity]),onClick:()=>{H()},type:"button",children:w==="bulk"?"Previewing…":`Preview ${U.toLocaleString()} selected`}):t&&M>0?a("span",{className:"legacy-review-cleanup-note",children:"Add or join a Space before bulk reassignment."}):null,U>0&&r.filter(N=>m[N.workspaceIdentity]&&Tt(N)&&!!u[N.workspaceIdentity]).every(N=>s[N.workspaceIdentity])?a("span",{className:"legacy-review-cleanup-note",children:"Bulk actions only preview. Confirm each project individually to avoid partial reassignment."}):null]})]}),r.length>0?a("ul",{className:"legacy-review-groups","aria-label":"Legacy shared review project groups",children:x.map(N=>a("li",{className:"legacy-review-group",children:[a("div",{className:"legacy-review-group-main",children:[a("div",{className:"legacy-review-title-wrap",children:[a("input",{"aria-label":`Select ${jb(N)}`,checked:!!m[N.workspaceIdentity],className:"cm-checkbox",disabled:!Tt(N),onChange:R=>$(N,R.currentTarget.checked),type:"checkbox"}),a("div",{children:[a("div",{className:"legacy-review-group-title",children:jb(N)}),a("div",{className:"legacy-review-group-meta",children:[xM(N.identitySource),PM(N,i)]}),Tt(N)?N.peerOwnedMemoryCount?a("div",{className:"legacy-review-cleanup-note",children:[(N.reassignableMemoryCount??N.memoryCount).toLocaleString()," ","local memor",(N.reassignableMemoryCount??N.memoryCount)===1?"y":"ies"," ","can be reassigned; ",N.peerOwnedMemoryCount.toLocaleString()," peer-owned memor",N.peerOwnedMemoryCount===1?"y":"ies"," will stay in review."]}):null:a("div",{className:"legacy-review-cleanup-note",children:"Peer-owned only. These older memories were received from another device, so this device cannot reassign them to a Space. Assign this project to a Space on the source device; after sync, this review should clear here."}),ni(N)?a("div",{className:"legacy-review-cleanup-note",children:"Inspect or correct the project identity before assigning old shared data to a Space."}):null]})]}),a("span",{className:"legacy-review-count",children:[N.memoryCount.toLocaleString()," memor",N.memoryCount===1?"y":"ies"]})]}),N.suggestionReason?a("div",{className:"legacy-review-reason",children:N.suggestionReason}):null,l[N.workspaceIdentity]?a("div",{className:"legacy-review-confirmation",role:"alert",children:l[N.workspaceIdentity]}):null,s[N.workspaceIdentity]?a("div",{className:"legacy-review-confirmation",role:"alert",children:[s[N.workspaceIdentity].warning," This will reassign"," ",s[N.workspaceIdentity].reassignable_memory_count.toLocaleString()," of"," ",s[N.workspaceIdentity].memory_count.toLocaleString()," memories",s[N.workspaceIdentity].skipped_memory_count?`; ${s[N.workspaceIdentity].skipped_memory_count.toLocaleString()} peer-owned copies will be left unchanged`:"","."]}):null,a(LM,{group:N}),i.length>0&&t&&Tt(N)?a("label",{className:"legacy-review-target",children:[a("span",{children:"Destination Space"}),a("select",{className:"peer-scope-input",disabled:w!=null,onChange:R=>A(N,R.currentTarget.value),value:u[N.workspaceIdentity]||"",children:[a("option",{value:"",children:"Choose Space…"}),i.map(R=>a("option",{value:R.scopeId,children:[R.label," · ",IM(R.authorityType),R.scopeId===N.suggestedScopeId?" · suggested":""]},R.scopeId))]})]}):null,i.length>0&&t&&Tt(N)?a("div",{className:"legacy-review-actions",children:a("button",{type:"button",className:"settings-button",disabled:w!=null||!u[N.workspaceIdentity],onClick:()=>{G(N)},children:w===N.workspaceIdentity?s[N.workspaceIdentity]?"Reassigning…":"Previewing…":s[N.workspaceIdentity]?"I understand, reassign memories":"Preview reassignment"})}):null]},N.workspaceIdentity))}):null]})}function jM({items:e,legacyReview:t,onLegacyReassign:n,onLegacyReview:r,onReview:i}){return a(te,{children:[t?a(OM,{item:t,onReassign:n,onReview:r??i}):null,e.map(o=>a(MM,{item:o,onReview:i},`${o.peerName}:${o.actorId}:${o.scopeLabel}`))]})}function FM(){kf("mine"),b.feedQuery="",window.location.hash="feed"}function BM(){window.location.hash="projects"}async function UM(e,t,n,r){try{const i=await fw({...r?{confirmation_token:r}:{},confirmed_old_copies:n,scope_id:t,workspace_identity:e.workspaceIdentity});return b.lastSyncLegacySharedReview=i.legacy_shared_review??null,ne(`Reassigned ${i.reassigned_memory_count.toLocaleString()} legacy review memor${i.reassigned_memory_count===1?"y":"ies"} to ${i.target_scope_label}.`),Bb(),null}catch(i){if(i instanceof Bu)return i.preview;const o=i instanceof Error?i.message:"Unable to reassign legacy review memories.";throw ne(o,"warning"),new Error(o)}}function Bb(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewMeta"),n=document.getElementById("syncSharingReviewList");if(!e||!t||!n)return;const r=e.querySelector(".settings-group-title"),i=Array.isArray(b.lastSyncSharingReview)?b.lastSyncSharingReview:[],o=b.lastSyncLegacySharedReview,s=Math.max(0,Number(o?.memory_count??0)),c=o?.has_data?{groups:Array.isArray(o.groups)?o.groups.map(d=>{const u=d;return{displayProject:String(u.display_project||u.project||"Unknown project"),identitySource:String(u.identity_source||"unknown"),lastUpdatedAt:typeof u.last_updated_at=="string"?u.last_updated_at:null,memoryCount:Number(u.memory_count||0),memorySamples:Array.isArray(u.memory_samples)?u.memory_samples.map(p=>{const m=p,f=m.ownership==="peer"?"peer":"local";return{bodyPreview:typeof m.body_preview=="string"?m.body_preview:null,createdAt:typeof m.created_at=="string"?m.created_at:null,cwd:typeof m.cwd=="string"?m.cwd:null,gitRemote:typeof m.git_remote=="string"?m.git_remote:null,id:Number(m.id||0),kind:typeof m.kind=="string"?m.kind:null,ownership:f,project:typeof m.project=="string"?m.project:null,title:String(m.title||`Memory ${Number(m.id||0)}`),updatedAt:typeof m.updated_at=="string"?m.updated_at:null}}):[],peerOwnedMemoryCount:Number(u.peer_owned_memory_count||0),reassignableMemoryCount:Number(u.reassignable_memory_count||0),suggestedScopeId:typeof u.suggested_scope_id=="string"?u.suggested_scope_id:null,suggestionReason:typeof u.suggestion_reason=="string"?u.suggestion_reason:null,workspaceIdentity:String(u.workspace_identity||u.display_project||"unknown")}}):[],memoryCount:s,scopeId:String(o.scope_id||"legacy-shared-review"),totalGroupCount:Number(o.total_group_count||o.groups?.length||0),targetScopes:Array.isArray(o.target_scopes)?o.target_scopes.map(d=>{const u=d;return{authorityType:String(u.authority_type||"unknown"),label:String(u.label||u.scope_id||"Unknown domain"),scopeId:String(u.scope_id||"")}}).filter(d=>d.scopeId):[]}:null;if(!i.length&&!c){Qr(n),e.hidden=!0;return}e.hidden=!1,r&&(r.textContent=c?"Sharing review":"What teammates will receive");const l=b.currentProject?`current project (${b.currentProject})`:"all allowed projects";t.textContent=c?`Review conservative upgrade state before promoting historical shared data. Teammates receive memories from ${l} by default once Sharing-domain grants allow it.`:`Teammates receive memories from ${l} by default. Use Only me on a memory when it should stay local.`,Ze(n,y(jM,{items:i.map(d=>({actorDisplayName:String(d.actor_display_name||d.actor_id||"unknown"),actorId:String(d.actor_id||"unknown"),peerName:String(d.peer_name||d.peer_device_id||"Device"),privateCount:Number(d.private_count||0),scopeLabel:String(d.scope_label||"All allowed projects"),shareableCount:Number(d.shareable_count||0)})),legacyReview:c,onLegacyReassign:UM,onLegacyReview:BM,onReview:FM}))}var As="",vo=null,lu=0,GM=15e3;function Ub(e){return`project:${e||""}|includeJoinRequests:false`}function HM(e){const t=Ub(e);return!vo||vo.key!==t||Date.now()>=vo.expiresAtMs?null:vo.payload}function KM(e,t){vo={key:Ub(e),expiresAtMs:Date.now()+GM,payload:t}}function WM(e){return!e||typeof e!="object"?e:{...e,join_requests:[]}}function VM(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewList"),n=document.getElementById("syncSharingReviewMeta"),r=document.getElementById("syncLegacyClaims"),i=document.getElementById("syncLegacyClaimsMeta");e&&(e.hidden=!0),t&&(t.textContent=""),n&&(n.textContent=""),r&&(r.hidden=!0),i&&(i.textContent="")}async function ri(){const e=++lu;try{const t=b.currentProject||"",n=!1,r=b.activeTab==="health";let i=!1;const o=!Ei();let s;r?(s=HM(t),s||(s=await js(o,t,{includeJoinRequests:!1}),i=!0)):(s=await js(o,t,{includeJoinRequests:n}),i=!0);let c=null,l=null,d=b.lastShareOperations,u=!1,p=!1,m=!1;const f=u$();try{c=await z_()}catch{u=!0}try{l=await To()}catch{p=!0}try{const S=await Ku();d=Array.isArray(S.items)?S.items:[]}catch{m=!0}if(e!==lu)return;i&&KM(t,WM(s));const g=JSON.stringify([s,c,l,d,m,f]);if(g===As)return;As=g;const h=s.status&&typeof s.status=="object"?s.status:null;h&&(b.lastSyncStatus=h),Array.isArray(c?.items)?b.lastSyncActors=c.items:b.lastSyncActors=[];const v=Array.isArray(s.peers)?s.peers:[],_=new Set(v.map(S=>String(S?.peer_device_id||"").trim()).filter(Boolean)),w=Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(S=>{const T=String(S?.peer_device_id||"").trim();return T&&!_.has(T)}):[];b.pendingAcceptedSyncPeers=w,b.lastSyncPeers=[...v,...w],b.lastShareOperations=d,b.shareOperationsLoadError=m,b.lastSyncSharingReview=s.sharing_review||[],b.lastSyncLegacySharedReview=s.legacy_shared_review&&typeof s.legacy_shared_review=="object"?s.legacy_shared_review:null,b.lastSyncCoordinator=s.coordinator||null,b.lastCoordinatorAdminStatus=l&&typeof l=="object"?l:null,b.lastSyncJoinRequests=Array.isArray(s.join_requests)?s.join_requests:[],b.lastSyncAttempts=s.attempts||[],b.lastSyncLegacyDevices=s.legacy_devices||[],b.lastSyncDuplicatePersonDecisions=f,b.lastSyncViewModel=r$({actors:b.lastSyncActors,peers:b.lastSyncPeers,coordinator:b.lastSyncCoordinator,status:h,shareOperations:b.lastShareOperations,shareOperationsLoadError:m,reconciliation:s.recipient_policy_reconciliation,duplicatePersonDecisions:b.lastSyncDuplicatePersonDecisions}),xb(),Ps(),tM(),rM(),Bb(),ru(),Db(),Nb(),ky(),u&&nM(),p&&(b.lastCoordinatorAdminStatus=null,Ps())}catch{if(e!==lu)return;As="",Dn("syncTeamSkeleton"),Dn("syncActorsSkeleton"),Dn("syncPeersSkeleton"),Dn("syncDiagSkeleton"),VM(),iM(),b$()}}function qM(){As="",b.lastSyncPeers?.length&&ru()}async function zM(){try{b.pairingPayloadRaw=await J_()||null,Xd()}catch{b.pairingPayloadRaw=null,Xd()}}function JM(e){eL(),Fa(),cM(ri),eM(ri),C$(ru),pM(e,ri),oM(ri),T$(e),iu(),sM()}function YM(e,t){const n=Ie("runtimeLabel");n&&(n.textContent=t?`v${e} (${t})`:`v${e}`,n.title=t?`codemem ${e} (${t})`:`codemem ${e}`,n.hidden=!1)}async function XM(){try{const e=await H_();if(!e?.version)return;YM(e.version,"59b51ff")}catch{}}var du=null,Gb=1500,Hb="codemem-legacy-upgrade-notice-dismissed",Ln=null,Jt=!1,uu=!1,yo=null;function Kb(e,t=0){const n=Number(e);return Number.isFinite(n)?Math.max(0,n):t}function Wb(e){if(!e||typeof e!="object")return null;const t=e.legacy_shared_review??e;if(!t||typeof t!="object")return null;const n=t;if(n.has_data!==!0)return null;const r=Array.isArray(n.groups)?n.groups:[],i=Kb(n.total_group_count,r.length),o=Kb(n.memory_count);return i<=0||o<=0?null:{groupCount:i,memoryCount:o}}function Vb(){try{return localStorage.getItem(Hb)==="1"}catch{return!1}}function Es(){if(document.getElementById("legacyUpgradeDontShow")?.checked)try{localStorage.setItem(Hb,"1")}catch{}}function qb(){const e=Ie("legacyUpgradeModal");return!e||e.hidden?[]:Array.from(e.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(t=>!t.hidden&&t.offsetParent!==null)}function QM(){const e=qb(),t=Ie("legacyUpgradeReviewGroups");(t&&e.includes(t)?t:e[0])?.focus()}function zb(e){const t=Ie("legacyUpgradeModal");if(!t||t.hidden)return;if(e.key==="Escape"){e.preventDefault(),Es(),bo(!1);return}if(e.key==="Enter"){const o=Ie("legacyUpgradeReviewGroups");Rr(e,{onSubmit:()=>o?.click(),disabled:!o||o.disabled});return}if(e.key!=="Tab")return;const n=qb();if(n.length===0)return;const r=n[0],i=n[n.length-1];if(e.shiftKey&&document.activeElement===r){e.preventDefault(),i.focus();return}!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),r.focus())}function Jb(e){for(const t of document.querySelectorAll("header, .tab-bar, .tab-panel, #toastRoot, #viewerReconnectOverlay, #settingsDialogMount"))t.id==="viewerReconnectOverlay"&&t.hidden||(t.inert=e,e?t.setAttribute("aria-hidden","true"):t.removeAttribute("aria-hidden"))}function bo(e,t){const n=Ie("legacyUpgradeModalBackdrop"),r=Ie("legacyUpgradeModal"),i=Ie("legacyUpgradeSummary");if(!(!n||!r||!i)){if(t&&(i.textContent=`${t.groupCount.toLocaleString()} older ${t.groupCount===1?"project needs":"projects need"} a Sharing domain. They contain ${t.memoryCount.toLocaleString()} older shared memories total; you will review the projects, not individual memories.`),n.hidden=!e,r.hidden=!e,e){yo=document.activeElement,document.addEventListener("keydown",zb),QM(),Jb(!0);return}Jb(!1),document.removeEventListener("keydown",zb),yo&&document.contains(yo)&&yo.focus(),yo=null}}function Yb(e){!e||uu||Vb()||(uu=!0,bo(!0,e))}async function ZM(){if(!(uu||Vb()))try{Yb(Wb(await js(!1,"",{includeJoinRequests:!1})))}catch{}}function gr(e,t){const n=Ie("viewerReconnectOverlay"),r=Ie("viewerReconnectDetail");!n||!r||(n.hidden=!e,r.textContent=t||"Trying again automatically while the viewer comes back.")}async function pu(){try{return await G_(),!0}catch{return!1}}function eO(){return document.visibilityState!=="hidden"&&!qy()}function Xb(){if(Jt)return;Jt=!0,mu(),vr("error","(reconnecting)"),gr(!0,"The viewer server is restarting or temporarily unavailable. Trying again automatically…");const e=async()=>{if(await pu()){if(Ln&&(clearTimeout(Ln),Ln=null),Jt=!1,gr(!0,"Viewer responded. Restoring your session…"),eO()){vr("refreshing"),_o();try{await Rs()}catch{}}else vr("paused",document.visibilityState==="hidden"?"(tab hidden)":"(settings open)");Jt||gr(!1);return}gr(!0,"Still reconnecting… the viewer will recover automatically as soon as the server responds."),Ln=setTimeout(e,Gb)};Ln=setTimeout(e,Gb)}function vr(e,t){b.refreshState=e;const n=Ie("refreshStatus");if(!n)return;const r=o=>{const s=Ie("refreshAnnouncer");!s||du===e||(s.textContent=o,du=e)};if(e==="refreshing"){n.textContent="refreshing…";return}if(e==="paused"){n.textContent="paused",r("Auto refresh paused.");return}if(e==="error"&&t==="(reconnecting)"){n.textContent="reconnecting…",r("Viewer reconnecting.");return}if(e==="error"){n.textContent="refresh failed",r("Refresh failed.");return}const i=t?` ${t}`:"";n.textContent=`updated ${new Date().toLocaleTimeString()}${i}`,du=null}function mu(){b.refreshTimer&&(clearInterval(b.refreshTimer),b.refreshTimer=null)}function _o(){b.refreshTimer||(b.refreshTimer=setInterval(()=>$n(),5e3))}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(mu(),vr("paused","(tab hidden)")):!qy()&&!Jt&&(_o(),$n())});function tO(){const e=b.advancedSection==="sync",t=Ie("advancedSyncContent"),n=Ie("advancedTeamsContent");t&&(t.hidden=!e),n&&(n.hidden=e);const r=Ie("advancedSyncButton"),i=Ie("advancedTeamsButton");r?.setAttribute("aria-pressed",String(e)),i?.setAttribute("aria-pressed",String(!e)),queueMicrotask(()=>{const o=window.location.hash.replace(/^#/,"");iu(o==="sync/diagnostics"||o==="advanced/sync/diagnostics"?"diagnostics":"main")})}function Qb(e){const t=new Set(QT(b.lastCoordinatorAdminStatus));zn.forEach(n=>{const r=Ie(`tab-${n}`);r&&(r.hidden=n!==e||!t.has(n))}),zn.forEach(n=>{const r=Ie(`tabBtn-${n}`);if(!r)return;r.hidden=!t.has(n);const i=n===e&&t.has(n);r.classList.toggle("active",i),i?r.setAttribute("aria-current","page"):r.removeAttribute("aria-current")}),tO()}function Is(e,t={}){const n=Ai(e,b.lastCoordinatorAdminStatus);n==="advanced"&&Hc(t.advancedSection??Gc()??b.advancedSection),Tf(n,t.canonicalHash?{canonicalHash:!0}:{}),Qb(n),$n()}function nO(){zn.forEach(e=>{Ie(`tabBtn-${e}`)?.addEventListener("click",()=>Is(e,e==="advanced"?{canonicalHash:!0,advancedSection:"sync"}:{canonicalHash:!0}))}),Ie("advancedSyncButton")?.addEventListener("click",()=>Hc("sync",!0)),Ie("advancedTeamsButton")?.addEventListener("click",()=>Hc("teams",!0)),window.addEventListener("hashchange",()=>{const e=Uc();if(e){const t=Gc();Is(e,t?{advancedSection:t}:{})}}),Is(b.activeTab)}async function rO(){try{const e=await ko();b.knownProjects=e,qM();const t=jc("projectFilter");if(!t)return;t.textContent="";const n=document.createElement("option");n.value="",n.textContent="All Projects",t.appendChild(n),e.forEach(r=>{const i=document.createElement("option");i.value=r,i.textContent=r,t.appendChild(i)})}catch{}}var iO=nT(),Zb={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},e_=!1,ii=null;async function oO(){const e=[];let t=0;for(;;){const n=await xo({limit:250,offset:t});if(e.push(...n.projects),!n.has_more)break;t+=n.limit}return Zo(e)}function aO(){const e=new Map,t={unknown:0,offline:1,available:2},n=(r,i)=>{!r||t[i]<=t[e.get(r)??"unknown"]||e.set(r,i)};for(const r of b.lastSyncCoordinator?.discovered_devices??[])n(String(r.device_id??"").trim(),r.stale?"offline":"available");for(const r of b.lastSyncPeers){const i=String(r.peer_device_id??"").trim(),o=fo(r);n(i,o==="connected"||o==="available"?"available":o==="offline"?"offline":"unknown")}return[...e].map(([r,i])=>({deviceId:r,state:i}))}function t_(e){Is(e,{canonicalHash:!0}),queueMicrotask(()=>document.getElementById(`tabBtn-${e}`)?.focus())}async function sO(){const e=document.getElementById("devicesMount");if(!e)return!0;e_||Ua(e,Zb,{version:1,items:[]},[],[],{loading:!0});try{const[t,n,r]=await Promise.all([oO(),Us(),Q_(),ri()]),i=aO();return Ua(e,n,r,t,i,{onNavigate:t_}),ii={projects:t,intent:n,reconciliation:r,availability:i},e_=!0,!0}catch{return ii?Ua(e,ii.intent,ii.reconciliation,ii.projects,ii.availability,{onNavigate:t_,refreshError:!0}):Ua(e,Zb,{version:1,items:[]},[],[],{loadError:!0}),!1}}jc("projectFilter")?.addEventListener("change",()=>{b.currentProject=jc("projectFilter")?.value||"",ao(!0),$n()});var fu=null;async function $n(){Jt||(fu&&clearTimeout(fu),fu=setTimeout(()=>Rs(),80))}async function Rs(){if(!Jt){if(b.refreshInFlight){b.refreshQueued=!0;return}b.refreshInFlight=!0;try{vr("refreshing");const e=b.activeTab,t=[p0(),wD()];let n=!0;e==="feed"&&t.push(To().then(i=>{b.lastCoordinatorAdminStatus=i&&typeof i=="object"?i:null}).catch(()=>{b.lastCoordinatorAdminStatus=null})),e==="feed"&&t.push(wy()),e==="projects"&&t.push(K0()),e==="sharing"&&t.push(iO()),e==="devices"&&t.push(sO().then(i=>{n=i})),(e==="advanced"&&b.advancedSection==="sync"||e==="health")&&t.push(ri()),e==="advanced"&&b.advancedSection==="teams"&&t.push($l()),b.syncPairingOpen&&t.push(zM()),await Promise.all(t),Yb(Wb(b.lastSyncLegacySharedReview));const r=Ai(b.activeTab,b.lastCoordinatorAdminStatus);r!==b.activeTab&&Tf(r),Qb(b.activeTab),vr(n?"idle":"error")}catch{await pu()?vr("error"):Xb()}finally{b.refreshInFlight=!1,b.refreshQueued&&!Jt&&(b.refreshQueued=!1,Rs())}}}sk();var n_=document.getElementById("toastRoot");n_&&GT(n_),ck(Fc("themeToggle")),Pf(Wc()),nO(),r0(),W0(()=>$n()),JM(()=>$n()),YP(),QD(mu,_o,()=>$n()),rO(),Ie("viewerReconnectRetry")?.addEventListener("click",async()=>{if(gr(!0,"Checking whether the viewer server is back…"),!await pu()){Xb();return}Ln&&(clearTimeout(Ln),Ln=null),Jt=!1,gr(!0,"Viewer responded. Restoring your session…"),_o();try{await Rs()}catch{}Jt||gr(!1)}),Ie("legacyUpgradeReviewGroups")?.addEventListener("click",()=>{Es(),bo(!1),window.location.hash="sync",setTimeout(()=>document.getElementById("syncSharingReview")?.scrollIntoView({block:"start"}),120)}),Ie("legacyUpgradeReviewProjects")?.addEventListener("click",()=>{Es(),bo(!1),window.location.hash="projects"}),Ie("legacyUpgradeNotNow")?.addEventListener("click",()=>{Es(),bo(!1)}),XM(),ZM(),$n(),_o()})();
114
+ Global: ${Number(c.tokens_saved||0).toLocaleString()} saved`:"",v=[{label:d?"Savings (project)":"Savings",value:Fi(u.tokens_saved||0),tooltip:`Tokens saved by reusing compressed memories. Exact: ${Number(u.tokens_saved||0).toLocaleString()} saved${h}`,icon:"trending-up"},{label:d?"Injected (project)":"Injected",value:Fi(u.tokens_read||0),tooltip:`Tokens injected into context (pack size). Exact: ${Number(u.tokens_read||0).toLocaleString()} injected${g}`,icon:"book-open"},{label:d?"Reduction (project)":"Reduction",value:jl(u.tokens_saved,u.tokens_read),tooltip:`Percent reduction from reuse. Factor: ${aA(u.tokens_saved,u.tokens_read)}.`+g+h,icon:"percent"},{label:d?"Work investment (project)":"Work investment",value:Fi(u.work_investment_tokens||0),tooltip:`Token cost of unique discovery groups. Exact: ${Number(u.work_investment_tokens||0).toLocaleString()} invested${f}`,icon:"pencil"},{label:"Active memories",value:o.active_memory_items||0,icon:"check-circle"},{label:"Embedding coverage",value:Bg(o.vector_coverage),tooltip:"Share of active memories with embeddings",icon:"layers"},{label:"Tag coverage",value:Bg(o.tags_coverage),tooltip:"Share of active memories with tags",icon:"tag"}];if(m>0?v.push({label:"Raw events pending",value:m,tooltip:"Pending raw events waiting to be flushed",icon:"activity"}):p>0&&v.push({label:"Raw sessions",value:p,tooltip:"Sessions with pending raw events",icon:"inbox"}),Sy(e,v),t){const _=s?` · project: ${s}`:"";Cy(t,`DB: ${dA(o.path||"unknown")} · ${uA(o.size_bytes||0)}${_}`)}Td()}async function p0(){const e=b.lastStatsPayload?.identity?.actor_id||null,[t,n,r,i]=await Promise.all([K_(),W_(b.currentProject),V_(b.currentProject),q_(b.currentProject)]);b.lastStatsPayload=t||{},b.lastUsagePayload=n||{},b.lastRawEventsPayload=i||{};const o=b.lastStatsPayload?.identity?.actor_id||null;u0(),d0(),ky(),b.activeTab==="feed"&&e!==o&&ao(!0)}var so=new WeakMap;function lr(e,t=""){const n=document.createElement("p");return t&&(n.className=t),n.textContent=e,n}function m0(e){const t=document.createElement("article");t.className="project-inventory-row recipient-policy-blocked-item";const n=document.createElement("div");n.className="project-inventory-row-header";const r=document.createElement("h3");r.className="project-inventory-title",r.textContent=e.finding;const i=document.createElement("span");return i.className="project-status-badge needs_attention",i.textContent="Blocked",n.append(r,i),t.append(n,lr(e.reason,"project-inventory-meta"),lr(`Owner: ${e.ownerLabel}`,"settings-note"),lr(`Repair: ${e.repairAction}`,"settings-note")),t}function f0(e,t){const n=`review:${JSON.stringify(t)}`;if(so.get(e)===n)return;if(!t.continuity&&t.blockedItems.length===0){e.replaceChildren(),e.hidden=!0,so.set(e,n);return}e.hidden=!1;const r=document.createElement("section");r.className="card recipient-policy-review",r.setAttribute("aria-labelledby","recipientPolicyReviewTitle");const i=document.createElement("h2");if(i.id="recipientPolicyReviewTitle",i.textContent=t.blockedItems.length>0?"Sharing needs repair":"Existing sharing kept as-is",r.appendChild(i),t.continuity){const o=t.continuity.findingCount,s=lr(`${o.toLocaleString()} older sharing finding${o===1?" was":"s were"} not changed because Codemem could not safely translate ${o===1?"it":"them"} automatically.`,"settings-note");s.setAttribute("role","status"),s.setAttribute("aria-live","polite"),t.blockedItems.length===0&&r.appendChild(lr("No action is required for this update. Codemem did not change your existing Team or local sharing configuration.","section-meta")),r.appendChild(s)}if(t.blockedItems.length>0){const o=lr("Codemem did not change access for these items, but their current availability cannot be confirmed until these source-state problems are repaired.","section-meta project-attention-note"),s=document.createElement("h3");s.className="recipient-policy-blocked-heading",s.textContent="Needs repair";const c=document.createElement("div");c.className="project-inventory-list recipient-policy-review-list";for(const l of t.blockedItems)c.appendChild(m0(l));r.append(o,s,c)}e.replaceChildren(r),so.set(e,n)}function h0(e,t){const n=t instanceof Error?t.message:"Unable to load recipient migration review.",r=`error:${n}`;if(so.get(e)===r)return;e.hidden=!1;const i=document.createElement("section");i.className="card recipient-policy-review";const o=document.createElement("h2");o.textContent="Recipient migration review";const s=lr(n,"settings-note project-attention-note");s.setAttribute("role","status"),i.append(o,s),e.replaceChildren(i),so.set(e,r)}var Ny=[["","All projects"],["needs_attention","Needs review"],["suggested","Has suggestion"],["local_only","Stays on this device"],["received","Received from peers"],["explicitly_mapped","Already assigned"],["legacy_review","Older shared data"],["unmapped","Missing project identity"]],at=null,co=0,kd=250,Nd=[],xd=new Set,Pd=new Set,cs=new Map,ls=new Map,dr=new Map,lo=new Map,ds=!1,uo=!1,In=!1,us=0,Ct=new Set,xy=new WeakMap,ps={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},Yr=ps,Rn=!1;function Ke(e){return document.getElementById(e)}function g0(e){return Ny.find(([t])=>t===e)?.[1]??e.replaceAll("_"," ")}function v0(e){switch(e){case"exact_mapping":return"assigned to a Space";case"pattern_mapping":return"assigned by matching rule";case"explicit_override":return"manually assigned";default:return"stays on this device"}}function Xr(e){return e.read_only===!0&&e.read_only_reason==="peer_received"}function Ad(e){return e.identity_source!=="unmapped"&&!Xr(e)}function Ed(e){return Xr(e)?"Received from peers":ms(e.resolved_scope_id)}function y0(e){return Xr(e)?"source-owned project":v0(e.resolution_reason)}function b0(e){const t=e.person.display_name;switch(e.lifecycle.state){case"waiting_for_acceptance":return`Invitation sent to ${t}`;case"active":return`Shared with ${t}`;case"waiting_for_device":return`Sharing with ${t}`;case"needs_attention":return`Sharing with ${t} needs attention`;case"revoking":return`Removing sharing with ${t}`;case"revoked":return`Previously shared with ${t}`;case"cancelled":return`Invitation to ${t} cancelled`;default:return`Setting up sharing with ${t}`}}function Py(e){if(!e)return"No recent sessions";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function Ay(e){return[...new Set(e.map(t=>t.workspace_identity))].sort()}function ur(){const e=Ct.size,t=Ke("projectsShareSelected");t&&(t.textContent=e===0?"Share selected":`Share selected (${e})`,t.disabled=e===0||!In||!Rn,t.classList.add("project-selection-target"));const n=Ke("projectsSelectionStatus");n&&(n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.textContent=`${e.toLocaleString()} Project${e===1?"":"s"} selected.`);for(const r of document.querySelectorAll(".project-selection-checkbox")){const i=xy.get(r)??[],o=i.filter(s=>Ct.has(s)).length;r.checked=i.length>0&&o===i.length,r.indeterminate=o>0&&o<i.length}for(const r of document.querySelectorAll(".project-recipient-action"))r.disabled=!In||!Rn}function _0(e){const t=e.every(n=>Ct.has(n));for(const n of e)t?Ct.delete(n):Ct.add(n);ur()}function Ey(e,t){const n=Ay(e),r=document.createElement("label");r.className="project-selection-control project-selection-target";const i=document.createElement("input");i.className="project-selection-checkbox",i.dataset.projectFocusKey=`select:${n.join("|")}`,i.type="checkbox",i.setAttribute("aria-label",t),xy.set(i,n),i.addEventListener("change",()=>_0(n));const o=document.createElement("span");return o.className="sr-only",o.textContent=t,r.append(i,o),r}function w0(e){if(!Rn)return[];const t=new Set(e),n=new Map(Yr.teams.filter(o=>o.status==="active").map(o=>[o.teamId,o.displayName])),r=new Map(Yr.identities.filter(o=>o.status==="active"||o.status==="pending").map(o=>[o.identityId,o.displayName])),i=new Map;for(const o of Yr.projectRecipients)if(!(o.status!=="active"||!t.has(o.canonicalProjectIdentity)))if(o.recipientKind==="team"){const s=n.get(o.teamId);s&&i.set(`team:${o.teamId}`,{key:`team:${o.teamId}`,kind:"Team",displayName:s})}else{const s=r.get(o.identityId);s&&i.set(`identity:${o.identityId}`,{key:`identity:${o.identityId}`,kind:"Identity",displayName:s})}return[...i.values()].sort((o,s)=>`${o.kind}:${o.displayName}`.localeCompare(`${s.kind}:${s.displayName}`))}function Iy(e){const t=document.createElement("div");t.className="project-recipient-summary";const n=w0(e),r=document.createElement("div");if(r.className="project-recipient-status",r.textContent=Rn?n.length===0?"Not shared with any recipients.":e.length===1?`Shared with ${n.length.toLocaleString()} recipient${n.length===1?"":"s"}.`:`${n.length.toLocaleString()} recipient${n.length===1?"":"s"} across these Project identities.`:"Recipient access is unavailable.",t.appendChild(r),n.length>0){const i=document.createElement("ul");i.className="project-recipient-chips",i.setAttribute("aria-label","Active recipients");for(const o of n){const s=document.createElement("li");s.className=`project-recipient-chip project-recipient-chip-${o.kind.toLowerCase()}`,s.textContent=`${o.kind}: ${o.displayName}`,i.appendChild(s)}t.appendChild(i)}return t}function Ry(e,t){const n=document.createElement("button");return n.className="settings-button project-recipient-action project-selection-target",n.type="button",n.disabled=!In||!Rn,e.length===1?(n.textContent="Manage recipients",n.setAttribute("aria-label",`Manage recipients for ${t}`),n.dataset.projectFocusKey=`manage:${e[0]}`,n.addEventListener("click",()=>{Si({mode:"project-manage",projectId:e[0]})})):(n.textContent="Share selected",n.setAttribute("aria-label",`Share selected identities for ${t}`),n.dataset.projectFocusKey=`share:${e.join("|")}`,n.addEventListener("click",()=>{for(const r of e)Ct.add(r);ur(),Si({mode:"project-add",projectIds:[...e].sort()})})),n}function S0(e){return e.git_remote?e.git_remote:e.cwd?e.cwd:e.workspace_identity}function Id(e){return e.git_remote?`git:${e.git_remote}`:e.project?`project:${e.project}`:`identity:${e.workspace_identity}`}function Rd(e){return e.project||e.display_project||"Unnamed Project"}function Dy(e){const t=String(e||"").trim();return t?b.lastCoordinatorAdminGroups.find(n=>String(n.group_id||"").trim()===t&&!n.archived_at)?.display_name||"Team details unavailable":null}function C0(){return new Set(b.lastCoordinatorAdminGroups.filter(e=>!e.archived_at).map(e=>String(e.group_id||"").trim()).filter(Boolean))}function T0(e){return!uo||e.authority_type!=="coordinator"||!e.group_id?!1:!C0().has(String(e.group_id).trim())}function Ly(){const e=document.activeElement;return e instanceof HTMLSelectElement&&e.classList.contains("project-domain-select")}function $y(){ds&&(ds=!1,at?.())}async function k0(){try{const e=await To();b.lastCoordinatorAdminStatus=e&&typeof e=="object"?e:null}catch{b.lastCoordinatorAdminStatus=null,b.lastCoordinatorAdminGroups=[],uo=!1;return}if(b.lastCoordinatorAdminStatus?.readiness!=="ready"||!b.lastCoordinatorAdminStatus.has_admin_secret){b.lastCoordinatorAdminGroups=[],uo=!1;return}try{const e=await Iu(!1);b.lastCoordinatorAdminGroups=Array.isArray(e?.items)?e.items:[],uo=!0}catch{b.lastCoordinatorAdminGroups=[],uo=!1}}function N0(e){return e.kind==="team_default"}function Dd(e){const t=e.label||"Untitled Space";return N0(e)?`${t} (default)`:t}function x0(e,t){const n=Dd(e);return t.some(r=>r.scope_id!==e.scope_id&&Dd(r)===n)?`${n} · Space ID ${e.scope_id}`:n}function P0(e){const t=Dy(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Space":`${e.authority_type||"Other"} Space`}function A0(e){return e?Nd.find(t=>t.scope_id===e)??null:null}function ms(e){const t=A0(e);return e?t?`${Dd(t)} · ${P0(t)}`:"Unknown Space":"—"}function Ld(){return Nd.filter(e=>e.scope_id!=="legacy-shared-review"&&!T0(e))}function E0(e){return Ld().some(t=>t.scope_id===e)}function My(...e){for(const t of e)if(t&&E0(t))return t;return e.find(t=>!!t)??""}function I0(e){const t=Dy(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Spaces":"Other Spaces"}function R0(e){return e.group_id?`team:${e.group_id}`:`${e.authority_type||"other"}:${e.kind||"space"}`}function D0(){const e=new Map;for(const t of Ld()){const n=R0(t),r=I0(t),i=e.get(n)??{label:r,scopes:[]};e.set(n,{label:i.label,scopes:[...i.scopes,t]})}return[...e.values()]}function Oy(e){for(const t of D0()){const n=document.createElement("optgroup");n.label=t.label;for(const r of t.scopes){const i=document.createElement("option");i.value=r.scope_id,i.textContent=x0(r,t.scopes),n.appendChild(i)}e.appendChild(n)}}function L0(e){switch(e.code){case"unknown_project_local_only":return"Current behavior";case"basename_collision_review":return"Name collision";case"scope_reassignment_old_copies":return"Previous copies";case"broad_org_domain_pattern":case"home_directory_org_domain_pattern":return"Broad mapping";default:return"Review item"}}async function $d(e,t,n=[]){try{await lw({...e.mapping_id&&e.resolution_reason==="exact_mapping"?{id:e.mapping_id}:{},...n.length>0?{confirmed_guardrail_tokens:n}:{},project_pattern:e.display_project,scope_id:t,workspace_identity:e.workspace_identity}),dr.delete(e.workspace_identity),cs.delete(e.workspace_identity),ne("Project Space assignment updated. Device access grants are unchanged."),at?.()}catch(r){if(r instanceof No){dr.set(e.workspace_identity,{requiredGuardrailTokens:r.requiredGuardrailTokens,scopeId:t,warnings:r.guardrailWarnings}),at?.();return}ne(r instanceof Error?r.message:"Unable to update project Space.","warning")}}async function $0(e,t){const n=e.filter(Ad);if(n.length!==0)try{await dw({mappings:n.map(r=>({...r.mapping_id&&r.resolution_reason==="exact_mapping"?{id:r.mapping_id}:{},project_pattern:r.display_project,scope_id:t,workspace_identity:r.workspace_identity}))}),ne(`Updated ${n.length} project identit${n.length===1?"y":"ies"}. Device access grants are unchanged.`),ls.delete(Id(n[0])),at?.()}catch(r){ne(r instanceof No?"One or more identities in this group need review before bulk assignment. Expand the group and save those identities directly.":r instanceof Error?r.message:"Unable to update project Spaces.","warning")}}async function M0(e){if(e.mapping_id!=null)try{await uw(e.mapping_id),dr.delete(e.workspace_identity),cs.delete(e.workspace_identity),ne("Project Space assignment removed. The next fallback now applies."),at?.()}catch(t){ne(t instanceof Error?t.message:"Unable to remove project Space assignment.","warning")}}async function jy(e,t=!1){try{const n=lo.get(e.workspace_identity),r=await mw({...t&&n?{confirmation_token:n.confirmationToken}:{},confirmed:t,workspace_identity:e.workspace_identity});lo.delete(e.workspace_identity),ne(`Forgot ${r.forgotten_memory_count.toLocaleString()} local memor${r.forgotten_memory_count===1?"y":"ies"}. ${r.peer_owned_memory_count.toLocaleString()} peer-owned memor${r.peer_owned_memory_count===1?"y was":"ies were"} left unchanged.`),at?.()}catch(n){if(n instanceof Fu){lo.set(e.workspace_identity,{confirmationToken:n.preview.confirmation_token,localOwnedMemoryCount:n.preview.local_owned_memory_count,peerOwnedMemoryCount:n.preview.peer_owned_memory_count}),at?.();return}ne(n instanceof Error?n.message:"Unable to forget project memories.","warning")}}async function O0(e){if(e.identity_source==="unmapped")return;const t=String(e.project||e.display_project||"").trim();let n=[];try{n=(await ko()).filter(i=>i&&i!==t)}catch{}const r=await Il({cancelLabel:"Cancel",confirmLabel:"Change project",description:`This will update ${e.session_count} session${e.session_count===1?"":"s"} and ${e.memory_count??0} memor${e.memory_count===1?"y":"ies"} by changing the stored project. Space assignment stays unchanged.`,initialValue:t,placeholder:"Project name",suggestions:n,title:"Change project",validate:i=>{const o=i.trim();return o?o===t?"Already assigned to this project.":null:"Enter a project name."}});if(r!=null)try{const i=await pw({project:r.trim(),workspace_identity:e.workspace_identity});ne(`Changed project to ${i.project} for ${i.moved_session_count} session${i.moved_session_count===1?"":"s"}.`),at?.()}catch(i){ne(i instanceof Error?i.message:"Unable to change project.","warning")}}function j0(e){const t=document.createElement("div");if(t.className="project-inventory-actions",Ad(e)&&e.memory_count!=null&&e.guardrail_warnings.every(f=>!f.requires_confirmation)){const f=document.createElement("button");f.className="settings-button",f.type="button",f.textContent="Share",f.disabled=!In,In||(f.title="The complete project list is unavailable."),f.addEventListener("click",()=>ea([e.workspace_identity])),t.appendChild(f)}if(Xr(e)){const f=document.createElement("div");return f.className="settings-note",f.textContent="This project was received from a peer. Change its project or Space on the source device; this node keeps the received identity read-only.",t.appendChild(f),t}if(e.identity_source==="unmapped"){const f=document.createElement("div");return f.className="settings-note",f.textContent="This project is missing a stable path, git remote, or workspace id. It stays Local only until it has a stable identity.",t.appendChild(f),t}const n=document.createElement("label");n.className="sr-only";const r=`project-domain-${e.workspace_identity.replace(/[^a-z0-9_-]/gi,"-")}`;n.htmlFor=r,n.textContent=`Space for ${e.display_project}`;const i=document.createElement("select");i.id=r,i.className="project-domain-select";const o=Ld().some(f=>f.scope_id===e.resolved_scope_id);if(!o&&e.resolved_scope_id){const f=document.createElement("option");f.value=e.resolved_scope_id,f.textContent=`${ms(e.resolved_scope_id)} — not assignable`,f.disabled=!0,i.appendChild(f)}Oy(i),i.value=My(cs.get(e.workspace_identity),e.suggested_scope_id,e.resolved_scope_id);const s=document.createElement("button");s.className="settings-button",s.type="button",s.textContent=e.suggested_scope_id&&i.value===e.suggested_scope_id?"Confirm suggestion":"Save Space",s.disabled=!i.value||i.value===e.resolved_scope_id&&!o,s.addEventListener("click",()=>{$d(e,i.value)}),i.addEventListener("change",()=>{cs.set(e.workspace_identity,i.value),dr.delete(e.workspace_identity),t.querySelector(".project-space-guardrail-confirmation")?.remove(),s.textContent="Save Space",s.disabled=!i.value,at?.()}),i.addEventListener("blur",$y);const c=document.createElement("button");c.className="settings-button",c.type="button",c.textContent="Keep local-only",c.addEventListener("click",()=>{$d(e,"local-default")});const l=document.createElement("button");l.className="settings-button",l.type="button",l.textContent="Remove mapping",l.disabled=e.mapping_id==null||e.resolution_reason!=="exact_mapping",l.addEventListener("click",()=>{M0(e)});const d=document.createElement("button");d.className="settings-button",d.type="button",d.textContent="Change project…",d.disabled=e.session_count===0,d.disabled&&(d.title="No sessions are available to reassign for this saved mapping."),d.addEventListener("click",()=>{O0(e)});const u=document.createElement("button");u.className="settings-button danger",u.type="button",u.textContent="Forget local memories…",u.disabled=(e.memory_count??0)===0,u.addEventListener("click",()=>{jy(e)}),t.append(n,i,s,c,l,d,u);const p=dr.get(e.workspace_identity);if(p){const f=document.createElement("div");f.className="settings-note project-guardrail-confirmation project-space-guardrail-confirmation",f.setAttribute("role","alert");const g=document.createElement("strong");g.textContent="Confirmation required before saving this Space.";const h=document.createElement("p");h.textContent="Codemem can save this change after you acknowledge the checks below. Verify the workspace details, then confirm to complete the save.";const v=document.createElement("ul");for(const S of p.warnings){const T=document.createElement("li"),k=document.createElement("strong");k.textContent=`${L0(S)}: `;const P=document.createElement("span");P.textContent=S.message,T.append(k,P),v.appendChild(T)}const _=document.createElement("button");_.className="settings-button",_.type="button",_.textContent="I understand, save Space",_.addEventListener("click",()=>{const S=dr.get(e.workspace_identity);!S||S.scopeId!==i.value||$d(e,S.scopeId,S.requiredGuardrailTokens)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{dr.delete(e.workspace_identity),at?.()}),f.append(g,h,v,_,w),t.appendChild(f)}const m=lo.get(e.workspace_identity);if(m){const f=document.createElement("div");f.className="settings-note project-guardrail-confirmation",f.setAttribute("role","alert");const g=document.createElement("strong");g.textContent="Confirm project memory cleanup.";const h=document.createElement("p");h.textContent=`${m.localOwnedMemoryCount.toLocaleString()} locally owned memor${m.localOwnedMemoryCount===1?"y":"ies"} will be forgotten. ${m.peerOwnedMemoryCount.toLocaleString()} peer-owned memor${m.peerOwnedMemoryCount===1?"y":"ies"} will be left unchanged.`;const v=document.createElement("p");v.textContent="Use this only to clean up wrongly attributed local project inventory; it forgets actual local memories on this device.";const _=document.createElement("button");_.className="settings-button danger",_.type="button",_.textContent="I understand, forget local memories",_.addEventListener("click",()=>{jy(e,!0)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{lo.delete(e.workspace_identity),at?.()}),f.append(g,h,v,_,w),t.appendChild(f)}return t}function Fy(e){const t=document.createElement("article");t.className="project-inventory-row";const n=`project-title-${e.workspace_identity.replace(/[^a-z0-9_-]/gi,"-")}`;t.setAttribute("aria-labelledby",n);const r=document.createElement("div");r.className="project-inventory-row-header",Qo(e)&&r.appendChild(Ey([e],`Select ${e.display_project} for recipient sharing`));const i=document.createElement("h3");i.className="project-inventory-title",i.id=n,i.textContent=e.display_project,r.appendChild(i),Qo(e)&&r.appendChild(Ry([e.workspace_identity],e.display_project)),t.appendChild(r);const o=document.createElement("div");o.className="project-inventory-meta",o.textContent=`${(e.memory_count??0).toLocaleString()} memories · ${e.session_count.toLocaleString()} sessions · ${Py(e.latest_session_at)}`,t.appendChild(o),t.appendChild(Iy([e.workspace_identity]));const s=document.createElement("div");s.className="project-advanced-administration";const c=document.createElement("div");c.className="project-inventory-domain",c.textContent=Ed(e),s.appendChild(c);const l=document.createElement("div");if(l.className="project-inventory-meta",l.textContent=`${y0(e)} · ${e.identity_source} · ${Py(e.latest_session_at)}`,s.appendChild(l),e.sharing&&e.sharing.length>0){const h=document.createElement("div");h.className="settings-note project-sharing-summary";const v=document.createElement("strong");v.textContent="Project sharing";const _=document.createElement("ul");_.setAttribute("aria-label",`People sharing ${e.display_project}`);for(const w of e.sharing){const S=document.createElement("li"),T=document.createElement("strong");T.textContent=b0(w);const k=document.createElement("span");k.textContent=` — ${w.lifecycle.label}. ${w.lifecycle.explanation}`,S.append(T,k),_.appendChild(S)}h.append(v,_),s.appendChild(h)}if(Xr(e)){const h=document.createElement("div");h.className="settings-note",h.textContent="Received memories keep the source device's project and Space assignment. Local reassignment controls are disabled here to avoid split-brain sync state.",s.appendChild(h)}const d=document.createElement("div");if(d.className="project-inventory-signal mono",d.textContent=S0(e),s.appendChild(d),e.suggested_scope_id&&e.suggested_scope_id!==e.resolved_scope_id){const h=document.createElement("div");h.className="settings-note project-suggestion-note",h.textContent=e.suggestion_reason?`Suggestion: ${e.suggestion_reason}`:`Suggestion: assign this project to ${ms(e.suggested_scope_id)}.`,s.appendChild(h)}const u=(e.guardrail_warnings??[]).filter(h=>h.severity==="warning");if(u.length>0){const h=document.createElement("div");h.className="settings-note project-attention-note",h.textContent=`Needs attention: ${u.map(v=>v.message).join(" ")}`,s.appendChild(h)}if(e.statuses.length>0){const h=document.createElement("div");h.className="project-inventory-badges";for(const v of e.statuses){const _=document.createElement("span");_.className=`project-status-badge ${v}`,_.textContent=g0(v),h.appendChild(_)}s.appendChild(h)}const p=document.createElement("details");p.className="project-inventory-details",p.open=xd.has(e.workspace_identity),p.addEventListener("toggle",()=>{p.open?xd.add(e.workspace_identity):xd.delete(e.workspace_identity)});const m=document.createElement("summary");m.textContent=u.length>0?`Advanced Project administration — ${u.length.toLocaleString()} item${u.length===1?"":"s"} need attention`:"Advanced Project administration",p.appendChild(m),p.appendChild(s);const f=document.createElement("dl");f.className="project-detail-grid";const g=[["Workspace identity",e.workspace_identity],["Project",e.project],["CWD",e.cwd],["Git remote",e.git_remote],["Git branch",e.git_branch],["Current Space",Ed(e)],["Suggested Space",e.suggested_scope_id?ms(e.suggested_scope_id):null],["Advanced: current Space ID",e.resolved_scope_id],["Advanced: suggested Space ID",e.suggested_scope_id],["Suggestion reason",e.suggestion_reason],["Sessions",e.session_count],["Memories",e.memory_count??"count unavailable"]];for(const[h,v]of g){const _=document.createElement("dt");_.textContent=h;const w=document.createElement("dd");w.textContent=v==null||v===""?"—":String(v),f.append(_,w)}return p.appendChild(f),p.appendChild(j0(e)),t.appendChild(p),t}function F0(e){const t=[...new Set(e.map(n=>Ed(n)))];return t.length===1?t[0]:"Mixed Spaces"}function B0(e){if(e.length===1)return Fy(e[0]);const t=Id(e[0]),n=e.filter(Qo),r=Ay(n),i=document.createElement("article");i.className="project-inventory-row project-inventory-cluster";const o=Rd(e[0]),s=`project-cluster-title-${t.replace(/[^a-z0-9_-]/gi,"-")}`;i.setAttribute("aria-labelledby",s);const c=document.createElement("div");c.className="project-inventory-row-header",n.length>0&&c.appendChild(Ey(n,`Select all identities for ${Rd(e[0])}`));const l=document.createElement("h3");l.className="project-inventory-title",l.id=s,l.textContent=o,c.appendChild(l),r.length>0&&c.appendChild(Ry(r,o)),i.appendChild(c);const d=document.createElement("div");d.className="project-advanced-administration";const u=document.createElement("div");u.className="project-inventory-domain",u.textContent=F0(e),d.appendChild(u);const p=e.reduce((S,T)=>S+(T.memory_count??0),0),m=e.reduce((S,T)=>S+T.session_count,0),f=document.createElement("div");f.className="project-inventory-meta",f.textContent=`${e.length} identities · ${m.toLocaleString()} sessions · ${p.toLocaleString()} memories`,i.appendChild(f),i.appendChild(Iy(r));const g=document.createElement("div");g.className="project-inventory-actions";const h=e.filter(Ad);if(h.length===0){const S=document.createElement("div");S.className="settings-note",S.textContent=e.every(Xr)?"These project identities were received from peers. Change project or Space assignments on their source devices.":"These project identities cannot be bulk assigned until they have stable local identities. Expand each identity for details.",g.appendChild(S),d.appendChild(g)}else{const S=h.map(x=>({project:x,warnings:(x.guardrail_warnings??[]).filter(G=>G.requires_confirmation)})),T=S.some(({warnings:x})=>x.length>0),k=new Set(h.map(x=>x.suggested_scope_id).filter(x=>!!x)),P=new Set(h.map(x=>x.resolved_scope_id)),E=document.createElement("select");E.className="project-domain-select",E.setAttribute("aria-label",`Space for ${Rd(e[0])} group`);const M=document.createElement("option");M.value="",M.textContent="Choose Space…",E.appendChild(M),Oy(E),E.value=My(ls.get(t));const U=document.createElement("button");if(U.className="settings-button",U.type="button",U.textContent=`Save Space for ${h.length} identit${h.length===1?"y":"ies"}`,U.disabled=!E.value||T,U.addEventListener("click",()=>{$0(h,E.value)}),E.addEventListener("change",()=>{E.value?ls.set(t,E.value):ls.delete(t),U.disabled=!E.value||T}),E.addEventListener("blur",$y),g.append(E,U),k.size>1||P.size>1||T){const x=document.createElement("div");if(x.className="settings-note project-attention-note",x.textContent=T?"One or more identities in this group need individual review before bulk assignment.":"This group has mixed suggestions or current Spaces. Choose a Space explicitly before bulk assignment.",T){const G=document.createElement("ul");for(const{project:A,warnings:$}of S){if($.length===0)continue;const L=document.createElement("li"),J=document.createElement("strong");J.textContent=`Blocked identity: ${A.workspace_identity}`;const H=document.createElement("span");H.textContent=` — ${$.map(N=>N.message).join(" ")}`,L.append(J,H),G.appendChild(L)}x.appendChild(G)}g.appendChild(x)}d.appendChild(g)}const v=document.createElement("details");v.className="project-inventory-details",v.open=Pd.has(t),v.addEventListener("toggle",()=>{v.open?Pd.add(t):Pd.delete(t)});const _=document.createElement("summary"),w=e.reduce((S,T)=>S+(T.guardrail_warnings??[]).filter(k=>k.severity==="warning").length,0);_.textContent=w>0?`Advanced Project administration — ${w.toLocaleString()} item${w===1?"":"s"} need attention`:"Advanced Project administration",v.appendChild(_),v.appendChild(d);for(const S of e)v.appendChild(Fy(S));return i.appendChild(v),i}function U0(e){const t=new Map;for(const n of e){const r=Id(n);t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function By(e){const t=Ke("projectsInventoryList");if(!t)return;t.textContent="";const n=document.createElement("div");n.className="settings-note",n.textContent=e,t.appendChild(n)}function Uy(){document.getElementById("projectsInventorySkeleton")?.remove()}function Gy(e){const t=Ke("projectsInventoryMeta"),n=Ke("projectsInventoryList");if(!t||!n)return;const r=document.activeElement instanceof HTMLElement?document.activeElement.dataset.projectFocusKey:void 0;if(Uy(),n.textContent="",e.projects.length===0)By("No projects match those filters.");else for(const s of U0(e.projects))n.appendChild(B0(s));t.textContent=e.total===0?"0 project identities found":`${e.total} project identit${e.total===1?"y":"ies"} found · showing ${e.offset+1}-${Math.min(e.offset+e.projects.length,e.total)}`;const i=Ke("projectsPrevPage"),o=Ke("projectsNextPage");i&&(i.disabled=e.offset===0),o&&(o.disabled=!e.has_more),ur(),r&&[...n.querySelectorAll("[data-project-focus-key]")].find(s=>s.dataset.projectFocusKey===r)?.focus()}function G0(e,t){k0().then(()=>{t===us&&(Ly()||Gy(e))})}async function H0(){const e=new Map;let t=0;for(;;){const n=await xo({limit:250,offset:t});for(const r of n.projects)e.set(r.workspace_identity,r);if(!n.has_more)break;t+=n.limit}return[...e.values()]}function Hy(e,t,n){const r=Ke("recipientPolicyManagementMount");r&&Mm(r,Zo(e),t,{loadError:n,onCommitted:i=>{i.status==="applied"&&Ct.clear(),ur(),at?.()}})}async function K0(){const e=Ke("projectsInventoryMeta"),t=Ke("projectsInventoryList");if(!e||!t)return;if(Ly()){ds=!0;return}ds=!1;const n=++us;In=!1,Rn=!1,ur(),e.textContent="Loading project inventory…";try{const[r,i,o,s,c]=await Promise.all([xo({limit:kd,offset:co,q:Ke("projectsSearch")?.value.trim()||void 0,status:Ke("projectsStatusFilter")?.value||void 0}),iw(),H0().then(u=>({ok:!0,projects:u})).catch(()=>({ok:!1,projects:[]})),rw().then(u=>({ok:!0,review:u})).catch(u=>({ok:!1,error:u})),Us().then(u=>({ok:!0,intent:u})).catch(u=>({ok:!1,error:u}))]);if(n!==us)return;if(Nd=i.scopes,In=o.ok,Rn=c.ok,Yr=c.ok?c.intent:ps,o.ok){const u=new Set(Zo(o.projects).map(p=>p.canonicalProjectIdentity));for(const p of Ct)u.has(p)||Ct.delete(p)}const l=Ke("projectShareFlowMount");l&&Fm(l,o.projects,{inventoryError:!o.ok});const d=Ke("recipientPolicyReviewMount");d&&("review"in s?f0(d,s.review):h0(d,s.error)),Hy(o.projects,Yr,!o.ok||!c.ok),Gy(r),G0(r,n)}catch(r){if(n!==us)return;In=!1,Rn=!1,Yr=ps;const i=Ke("projectShareFlowMount");i&&Fm(i,[],{inventoryError:!0}),Hy([],ps,!0),ur(),Uy(),e.textContent="Project inventory failed to load.",By(r instanceof Error?r.message:"Unable to load project inventory.")}}function W0(e){at=e,Ct.clear();const t=Ke("projectsStatusFilter");if(t&&t.options.length===0)for(const[i,o]of Ny){const s=document.createElement("option");s.value=i,s.textContent=o,t.appendChild(s)}const n=()=>{co=0,at?.()};Ke("projectsSearch")?.addEventListener("input",n),t?.addEventListener("change",n),Ke("projectsPrevPage")?.addEventListener("click",()=>{co=Math.max(0,co-kd),at?.()}),Ke("projectsNextPage")?.addEventListener("click",()=>{co+=kd,at?.()});const r=Ke("projectsShareSelected");r&&r.dataset.recipientPolicyBound!=="true"&&(r.dataset.recipientPolicyBound="true",r.addEventListener("click",()=>{Ct.size!==0&&Si({mode:"project-add",projectIds:[...Ct].sort()})})),ur()}function Md(e,t){const n=e.trim();if(!n)return[];const r=JSON.parse(n);if(!Array.isArray(r)||r.some(o=>typeof o!="string"))throw new Error(`${t.label} must be a JSON string array`);if(!t.normalize&&!t.requireNonEmpty)return r;const i=t.normalize?r.map(o=>o.trim()):r;if(t.requireNonEmpty&&i.some(o=>o.trim()===""))throw new Error(`${t.label} cannot contain empty command tokens`);return i}function V0(e){const t=e.trim();if(!t)return{};const n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("observer headers must be a JSON object");const r={};for(const[i,o]of Object.entries(n)){if(typeof i!="string"||!i.trim()||typeof o!="string")throw new Error("observer headers must map string keys to string values");r[i.trim()]=o}return r}var Ky="codemem-settings-advanced",Wy="gpt-5.1-codex-mini",Vy="claude-4.5-haiku",q0=[{value:"observer",label:"Connection"},{value:"queue",label:"Processing"},{value:"sync",label:"Device Sync"}],z0={claudeCommand:"claude_command",codexCommand:"codex_command",observerProvider:"observer_provider",observerModel:"observer_model",observerTierRoutingEnabled:"observer_tier_routing_enabled",observerSimpleModel:"observer_simple_model",observerSimpleTemperature:"observer_simple_temperature",observerReasoningEffort:"observer_reasoning_effort",observerReasoningSummary:"observer_reasoning_summary",observerRichModel:"observer_rich_model",observerRichTemperature:"observer_rich_temperature",observerRichReasoningEffort:"observer_rich_reasoning_effort",observerRichReasoningSummary:"observer_rich_reasoning_summary",observerRichMaxOutputTokens:"observer_rich_max_output_tokens",observerRuntime:"observer_runtime",observerAuthSource:"observer_auth_source",observerAuthFile:"observer_auth_file",observerAuthCommand:"observer_auth_command",observerAuthTimeoutMs:"observer_auth_timeout_ms",observerAuthCacheTtlS:"observer_auth_cache_ttl_s",observerHeaders:"observer_headers",observerMaxChars:"observer_max_chars",packObservationLimit:"pack_observation_limit",packSessionLimit:"pack_session_limit",rawEventsSweeperIntervalS:"raw_events_sweeper_interval_s",syncEnabled:"sync_enabled",syncHost:"sync_host",syncPort:"sync_port",syncInterval:"sync_interval_s",syncMdns:"sync_mdns",syncCoordinatorUrl:"sync_coordinator_url",syncCoordinatorGroup:"sync_coordinator_group",syncCoordinatorTimeout:"sync_coordinator_timeout_s",syncCoordinatorPresenceTtl:"sync_coordinator_presence_ttl_s"},J0=new Set(["claude_command","codex_command","observer_base_url","observer_auth_file","observer_auth_command","observer_headers","sync_coordinator_url"]),Y0={claudeCommand:"",codexCommand:"",observerProvider:"",observerModel:"",observerTierRoutingEnabled:!1,observerSimpleModel:"",observerSimpleTemperature:"",observerReasoningEffort:"",observerReasoningSummary:"",observerRichModel:"",observerRichTemperature:"",observerRichReasoningEffort:"",observerRichReasoningSummary:"",observerRichMaxOutputTokens:"",observerRuntime:"api_http",observerAuthSource:"auto",observerAuthFile:"",observerAuthCommand:"",observerAuthTimeoutMs:"",observerAuthCacheTtlS:"",observerHeaders:"",observerMaxChars:"",packObservationLimit:"",packSessionLimit:"",rawEventsSweeperIntervalS:"",syncEnabled:!1,syncHost:"",syncPort:"",syncInterval:"",syncMdns:!1,syncCoordinatorUrl:"",syncCoordinatorGroup:"",syncCoordinatorTimeout:"",syncCoordinatorPresenceTtl:""};function X0(){try{return globalThis.localStorage?.getItem(Ky)==="1"}catch{return!1}}function Q0(e){try{globalThis.localStorage?.setItem(Ky,e?"1":"0")}catch{}}function ln(e,t){return typeof e=="object"&&e!==null&&Object.hasOwn(e,t)}function Ne(e,t,n){if(ln(t,n))return t[n];if(ln(e,n))return e[n]}function Ae(e){return e==null?"":String(e)}function fs(e){if(typeof e=="boolean")return e;if(typeof e=="number")return e!==0;if(typeof e=="string"){const t=e.trim().toLowerCase();if(!t||["0","false","no","off"].includes(t))return!1;if(["1","true","yes","on"].includes(t))return!0}return!!e}function Z0(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function eD(e,t){return e===t?!0:JSON.stringify(e)===JSON.stringify(t)}function ze(e){const t=e.trim();return t===""?"":t}function tD(e,t,n){return n?{model:n,source:"Configured"}:e==="claude_sidecar"?{model:Vy,source:"Recommended (local Claude session)"}:e==="codex_sidecar"?{model:Wy,source:"Recommended (local Codex session)"}:t==="anthropic"?{model:Vy,source:"Recommended (Anthropic provider)"}:t==="opencode"?{model:"opencode/gpt-5.1-codex-mini",source:"Recommended (OpenCode Zen provider)"}:t&&t!=="openai"?{model:"provider default",source:"Recommended (provider default)"}:{model:Wy,source:"Recommended (direct API)"}}function nD(e,t){const n=e??{};switch(t){case"claude_command":{const r=n.claude_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(o=>{if(typeof o!="string")return;const s=o.trim();s&&i.push(s)}),i}case"codex_command":{const r=n.codex_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(o=>{if(typeof o!="string")return;const s=o.trim();s&&i.push(s)}),i}case"observer_provider":case"observer_model":case"observer_simple_model":case"observer_reasoning_effort":case"observer_reasoning_summary":case"observer_rich_model":case"observer_rich_reasoning_effort":case"observer_rich_reasoning_summary":case"observer_auth_file":case"sync_host":case"sync_coordinator_url":case"sync_coordinator_group":return ze(Ae(n[t]));case"observer_runtime":return ze(Ae(n.observer_runtime));case"observer_auth_source":return ze(Ae(n.observer_auth_source));case"observer_auth_command":{const r=n.observer_auth_command;return Array.isArray(r)?r.filter(i=>typeof i=="string"):[]}case"observer_headers":{const r=n.observer_headers;if(!r||typeof r!="object"||Array.isArray(r))return{};const i={};return Object.entries(r).forEach(([o,s])=>{typeof o=="string"&&o.trim()&&typeof s=="string"&&(i[o.trim()]=s)}),i}case"observer_auth_timeout_ms":case"observer_max_chars":case"observer_simple_temperature":case"observer_rich_temperature":case"observer_rich_max_output_tokens":case"pack_observation_limit":case"pack_session_limit":case"raw_events_sweeper_interval_s":case"sync_port":case"sync_interval_s":{if(!ln(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r!==0?r:""}case"sync_coordinator_timeout_s":case"sync_coordinator_presence_ttl_s":{if(!ln(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r>0?r:""}case"observer_auth_cache_ttl_s":{if(!ln(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)?r:""}case"sync_enabled":case"sync_mdns":case"observer_tier_routing_enabled":return fs(n[t]);default:return ln(n,t)?n[t]:""}}function rD(e,t,n){const r={...e};return Object.keys(n).forEach(i=>{ln(r,i)&&(r[i]=nD(t,i))}),r}function iD(e){const{values:t,touchedKeys:n,baseline:r}=e,i=e.allowUntouchedParseErrors===!0;let o=[];try{o=Md(t.claudeCommand,{label:"claude command",normalize:!0,requireNonEmpty:!0})}catch(T){if(!i||n.has("claude_command"))throw T;const k=r.claude_command;o=Array.isArray(k)?k.filter(P=>typeof P=="string").map(P=>P.trim()).filter(P=>P.length>0):[]}let s=[];try{s=Md(t.codexCommand,{label:"codex command",normalize:!0,requireNonEmpty:!0})}catch(T){if(!i||n.has("codex_command"))throw T;const k=r.codex_command;s=Array.isArray(k)?k.filter(P=>typeof P=="string").map(P=>P.trim()).filter(P=>P.length>0):[]}let c=[];try{c=Md(t.observerAuthCommand,{label:"observer auth command"})}catch(T){if(!i||n.has("observer_auth_command"))throw T;const k=r.observer_auth_command;c=Array.isArray(k)?k.filter(P=>typeof P=="string"):[]}let l={};try{l=V0(t.observerHeaders)}catch(T){if(!i||n.has("observer_headers"))throw T;const k=r.observer_headers;k&&typeof k=="object"&&!Array.isArray(k)&&Object.entries(k).forEach(([P,E])=>{typeof P=="string"&&P.trim()&&typeof E=="string"&&(l[P]=E)})}const d=t.observerAuthCacheTtlS.trim(),u=t.observerSimpleTemperature.trim(),p=t.observerRichTemperature.trim(),m=t.observerRichMaxOutputTokens.trim(),f=t.rawEventsSweeperIntervalS.trim(),g=d===""?"":Number(d),h=u===""?"":Number(u),v=p===""?"":Number(p),_=m===""?"":Number(m),w=Number(f),S=f===""?"":w;if(d!==""&&!Number.isFinite(g))throw new Error("observer auth cache ttl must be a number");if(u!==""&&(typeof h!="number"||!Number.isFinite(h)||h<0))throw new Error("simple tier temperature must be a non-negative number");if(p!==""&&(typeof v!="number"||!Number.isFinite(v)||v<0))throw new Error("rich tier temperature must be a non-negative number");if(m!==""&&(typeof _!="number"||!Number.isFinite(_)||_<=0||!Number.isInteger(_)))throw new Error("rich tier max output tokens must be a positive integer");if(f!==""&&(!Number.isFinite(w)||w<=0))throw new Error("raw-event sweeper interval must be a positive number");return{claude_command:o,codex_command:s,observer_provider:ze(t.observerProvider),observer_model:ze(t.observerModel),observer_tier_routing_enabled:t.observerTierRoutingEnabled,observer_simple_model:ze(t.observerSimpleModel),observer_simple_temperature:h,observer_reasoning_effort:ze(t.observerReasoningEffort),observer_reasoning_summary:ze(t.observerReasoningSummary),observer_rich_model:ze(t.observerRichModel),observer_rich_temperature:v,observer_rich_reasoning_effort:ze(t.observerRichReasoningEffort),observer_rich_reasoning_summary:ze(t.observerRichReasoningSummary),observer_rich_max_output_tokens:_,observer_runtime:ze(t.observerRuntime||"api_http")||"api_http",observer_auth_source:ze(t.observerAuthSource||"auto")||"auto",observer_auth_file:ze(t.observerAuthFile),observer_auth_command:c,observer_auth_timeout_ms:Number(t.observerAuthTimeoutMs||0)||"",observer_auth_cache_ttl_s:g,observer_headers:l,observer_max_chars:Number(t.observerMaxChars||0)||"",pack_observation_limit:Number(t.packObservationLimit||0)||"",pack_session_limit:Number(t.packSessionLimit||0)||"",raw_events_sweeper_interval_s:S,sync_enabled:t.syncEnabled,sync_host:ze(t.syncHost),sync_port:Number(t.syncPort||0)||"",sync_interval_s:Number(t.syncInterval||0)||"",sync_mdns:t.syncMdns,sync_coordinator_url:ze(t.syncCoordinatorUrl),sync_coordinator_group:ze(t.syncCoordinatorGroup),sync_coordinator_timeout_s:Number(t.syncCoordinatorTimeout||0)||"",sync_coordinator_presence_ttl_s:Number(t.syncCoordinatorPresenceTtl||0)||""}}function oD(e){const t=e.config||{},n=e.effective||{},r=Ne(t,n,"observer_headers"),i=r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).filter(([p,m])=>typeof p=="string"&&p.trim()&&typeof m=="string")):{},o=Ne(t,n,"claude_command"),s=Array.isArray(o)?o.filter(p=>typeof p=="string"):[],c=Ne(t,n,"codex_command"),l=Array.isArray(c)?c.filter(p=>typeof p=="string"):[],d=Ne(t,n,"observer_auth_command"),u=Array.isArray(d)?d.filter(p=>typeof p=="string"):[];return{claudeCommand:s.length?JSON.stringify(s,null,2):"",codexCommand:l.length?JSON.stringify(l,null,2):"",observerProvider:Ae(Ne(t,n,"observer_provider")),observerModel:Ae(Ne(t,n,"observer_model")),observerTierRoutingEnabled:fs(Ne(t,n,"observer_tier_routing_enabled")),observerSimpleModel:Ae(Ne(t,n,"observer_simple_model")),observerSimpleTemperature:Ae(Ne(t,n,"observer_simple_temperature")),observerReasoningEffort:Ae(Ne(t,n,"observer_reasoning_effort")),observerReasoningSummary:Ae(Ne(t,n,"observer_reasoning_summary")),observerRichModel:Ae(Ne(t,n,"observer_rich_model")),observerRichTemperature:Ae(Ne(t,n,"observer_rich_temperature")),observerRichReasoningEffort:Ae(Ne(t,n,"observer_rich_reasoning_effort")),observerRichReasoningSummary:Ae(Ne(t,n,"observer_rich_reasoning_summary")),observerRichMaxOutputTokens:Ae(Ne(t,n,"observer_rich_max_output_tokens")),observerRuntime:Ae(Ne(t,n,"observer_runtime"))||"api_http",observerAuthSource:Ae(Ne(t,n,"observer_auth_source"))||"auto",observerAuthFile:Ae(Ne(t,n,"observer_auth_file")),observerAuthCommand:u.length?JSON.stringify(u,null,2):"",observerAuthTimeoutMs:Ae(Ne(t,n,"observer_auth_timeout_ms")),observerAuthCacheTtlS:Ae(Ne(t,n,"observer_auth_cache_ttl_s")),observerHeaders:Object.keys(i).length?JSON.stringify(i,null,2):"",observerMaxChars:Ae(Ne(t,n,"observer_max_chars")),packObservationLimit:Ae(Ne(t,n,"pack_observation_limit")),packSessionLimit:Ae(Ne(t,n,"pack_session_limit")),rawEventsSweeperIntervalS:Ae(Ne(t,n,"raw_events_sweeper_interval_s")),syncEnabled:fs(Ne(t,n,"sync_enabled")),syncHost:Ae(Ne(t,n,"sync_host")),syncPort:Ae(Ne(t,n,"sync_port")),syncInterval:Ae(Ne(t,n,"sync_interval_s")),syncMdns:fs(Ne(t,n,"sync_mdns")),syncCoordinatorUrl:Ae(Ne(t,n,"sync_coordinator_url")),syncCoordinatorGroup:Ae(Ne(t,n,"sync_coordinator_group")),syncCoordinatorTimeout:Ae(Ne(t,n,"sync_coordinator_timeout_s")),syncCoordinatorPresenceTtl:Ae(Ne(t,n,"sync_coordinator_presence_ttl_s"))}}function aD(e,t){if(e.observerTierRoutingEnabled)return"Tiered routing is enabled: simple/rich model selection now lives in Processing.";const n=tD(e.observerRuntime.trim()||"api_http",e.observerProvider.trim(),ze(e.observerModel));return`${["observer_model","observer_provider","observer_runtime"].some(r=>ln(t,r))?"Env override":n.source}: ${n.model}`}function sD(e){return e.observerTierRoutingEnabled?"On: codemem routes simpler batches to Luna and richer batches to Terra with medium reasoning by default. Official OpenAI and OAuth Codex consumer requests always use Responses. The observer_openai_use_responses=false compatibility setting selects chat completions only for an explicitly configured custom OpenAI-compatible base URL. Sidecar runtimes route both tiers through their local CLI.":"Off: codemem uses the base observer settings from the Connection tab for all batches. Explicit user settings always win over built-in routing defaults."}function cD(e){return e.observerTierRoutingEnabled?"Base model fallback":"Model"}function lD(e){return e.observerTierRoutingEnabled?"Tiered routing is enabled, so Processing controls the simple/rich models. This base model is only a fallback, and explicit settings override built-in defaults.":"Leave blank to use a recommended model for your selected mode/provider."}function dD(e){return e.observerTierRoutingEnabled?"Tiered routing is active. Use this only as a fallback while the Processing tab owns simple/rich model selection and explicit tier settings override built-in defaults.":"Default: `gpt-5.4-mini` for Direct API, `gpt-5.1-codex-mini` for Local Codex session, or `claude-4.5-haiku` for Local Claude session."}function uD(e){return!e}function pD(e,t,n){return t.has(e)||n.has(e)}function mD(e){return`${e} is read-only in the viewer for security. Edit the config file or environment instead.`}var q={open:!1,previouslyFocused:null,activeTab:"observer",baseline:{},envOverrides:{},touchedKeys:new Set,shellMounted:!1,protectedKeys:new Set,startPolling:null,refresh:null,showAdvanced:X0(),controller:null,renderState:{effectiveText:"",isSaving:!1,observerStatus:null,overridesVisible:!1,pathText:"Config path: n/a",providers:[],statusText:"Ready",values:{...Y0}}};function fD(){q.controller?.hideTooltip()}function pr(e){if(q.controller){q.controller.setRenderState(e);return}q.renderState={...q.renderState,...e}}function hD(e){pr({values:{...q.renderState.values,...e}})}function gD(e){const t=["observer","queue","sync"].includes(e)?e:"observer";q.activeTab=t,q.controller?.setActiveTab(t)}function hs(e,t=!0){b.settingsDirty=e,t&&q.controller?.setDirty(e)}function vD(e){q.showAdvanced=e,q.controller?.setShowAdvanced(e)}function qy(){return q.open}function yD(e){return pD(e,q.protectedKeys,J0)}function zy(e={}){return iD({values:q.renderState.values,touchedKeys:q.touchedKeys,baseline:q.baseline,allowUntouchedParseErrors:e.allowUntouchedParseErrors})}function bD(e){pr({observerStatus:e&&typeof e=="object"?e:null})}function _D(e){if(!e||typeof e!="object")return;const t=e,n=t.defaults||{},r=t.config||{},i=t.env_overrides&&typeof t.env_overrides=="object"?t.env_overrides:{},o=Array.isArray(t.protected_keys)?t.protected_keys.filter(c=>typeof c=="string"&&c.trim().length>0):[],s=oD(t);q.envOverrides=i,q.protectedKeys=new Set(o),b.configDefaults=n,b.configPath=t.path||"",pr({effectiveText:Object.keys(i).length>0?"Some fields are managed by environment settings.":"",overridesVisible:Object.keys(i).length>0,pathText:b.configPath?`Config path: ${b.configPath}`:"Config path: n/a",providers:Z0(t.providers),statusText:"No unsaved changes",values:s}),q.touchedKeys=new Set;try{q.baseline=rD(zy({allowUntouchedParseErrors:!0}),r,i)}catch{q.baseline={}}hs(!1)}async function wD(){if(!q.open)try{const[e,t]=await Promise.all([w_(),__().catch(()=>null)]);_D(e),bD(t)}catch{}}function Od(e){return String(e||"").replace(/_/g," ")}function jd(e){const t=e.filter(n=>typeof n=="string"&&n.trim());return t.length===0?"":t.length===1?t[0]:t.length===2?`${t[0]} and ${t[1]}`:`${t.slice(0,-1).join(", ")}, and ${t[t.length-1]}`}function SD(e){switch(e){case"anthropic_consumer":return"OAuth (Claude Max/Pro)";case"codex_consumer":return"OAuth (ChatGPT subscription)";case"sdk_client":return"API key";case"claude_sidecar":return"Local Claude session";case"codex_sidecar":return"Local Codex session";case"opencode_run":return"OpenCode sidecar";default:return e||"none"}}function CD(e){const t=[];return e.oauth&&t.push("OAuth"),e.api_key&&t.push("API key"),e.env_var&&t.push("env var"),t.length?t.join(", "):"none"}function TD(e){if(typeof e!="string"||!e.trim())return"Unknown time";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function kD({status:e}){if(!e)return a("div",{id:"observerStatusBanner",className:"observer-status-banner",hidden:!0});const t=e.active,n=e.available_credentials||{},r=e.latest_failure,i=Object.entries(n).filter(([,o])=>o&&typeof o=="object");return a("div",{id:"observerStatusBanner",className:"observer-status-banner",children:[t?a(te,{children:[a("div",{className:"status-label",children:"Active observer"}),a("div",{className:"status-active",children:[String(t.provider||"unknown")," → ",String(t.model||"")," via"," ",SD(t.auth?.method||"none")," ",a("span",{"aria-label":t.auth?.token_present===!0?"token present":"token missing",className:t.auth?.token_present===!0?"cred-ok":"cred-none",role:"img",children:a("i",{"aria-hidden":"true","data-lucide":t.auth?.token_present===!0?"check":"x"})})]})]}):a(te,{children:[a("div",{className:"status-label",children:"Observer status"}),a("div",{className:"status-active",children:"Not yet initialized (waiting for first session)"})]}),i.length?a(te,{children:[a("div",{className:"status-label",children:"Available credentials"}),a("div",{children:i.map(([o,s],c)=>{const l=s,d=Object.values(l).some(Boolean);return a("span",{className:"status-cred",children:[c>0?" · ":null,a("span",{"aria-label":d?"credential available":"no credential",className:d?"cred-ok":"cred-none",role:"img",children:d?a("i",{"aria-hidden":"true","data-lucide":"check"}):"–"})," ",String(o),": ",CD(l)]},o)})})]}):null,r&&typeof r=="object"?a(te,{children:[a("div",{className:"status-label",children:"Latest processing issue"}),a("div",{className:"status-issue",children:[a("div",{className:"status-issue-message",children:typeof r.error_message=="string"&&r.error_message.trim()?r.error_message.trim():"Raw-event processing failed."}),a("div",{className:"status-issue-meta",children:[[typeof r.observer_provider=="string"?r.observer_provider.trim():"",typeof r.observer_model=="string"&&r.observer_model.trim()?`→ ${r.observer_model.trim()}`:"",typeof r.observer_runtime=="string"&&r.observer_runtime.trim()?`(${r.observer_runtime.trim()})`:""].filter(Boolean).join(" ").replace(/\s+/g," ").trim(),`Last failure ${TD(r.updated_at)}`,typeof r.attempt_count=="number"&&Number.isFinite(r.attempt_count)?`Attempts ${r.attempt_count}`:""].filter(Boolean).join(" · ")}),typeof r.impact=="string"&&r.impact.trim()?a("div",{className:"status-issue-impact",children:r.impact.trim()}):null]})]}):null]})}function Jy(e,t){const n=t.getBoundingClientRect(),r=8,i=8,o=e.offsetWidth,s=e.offsetHeight;let c=n.left+n.width/2-o/2;c=Math.max(r,Math.min(c,globalThis.innerWidth-o-r));let l=n.bottom+i;l+s>globalThis.innerHeight-r&&(l=n.top-s-i),l=Math.max(r,l),e.style.left=`${Math.round(c)}px`,e.style.top=`${Math.round(l)}px`}function po(e){return e instanceof Element?e.closest(".help-icon[data-tooltip]"):null}function ND(e){if(!e)return[];const t=["button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[href]",'[tabindex]:not([tabindex="-1"])'].join(",");return Array.from(e.querySelectorAll(t)).filter(n=>{const r=n;return!r.hidden&&r.offsetParent!==null})}function xD(){const e=Ie("settingsModal");(ND(e)[0]||e)?.focus()}function PD(){const[e,t]=I({anchor:null,content:"",visible:!1}),n=B(null);return K(()=>{const r=u=>{const p=u.dataset.tooltip?.trim();p&&t({anchor:u,content:p,visible:!0})},i=()=>{t(u=>!u.visible&&!u.anchor&&!u.content?u:{anchor:null,content:"",visible:!1})},o=u=>{const p=po(u.target);p&&r(p)},s=u=>{const p=po(u.target);if(!p)return;const m=u.relatedTarget;m instanceof Element&&p.contains(m)||i()},c=u=>{const p=po(u.target);p&&r(p)},l=u=>{po(u.target)&&i()},d=u=>{const p=po(u.target);p&&(u.preventDefault(),t(m=>{if(m.anchor===p&&m.visible)return{anchor:null,content:"",visible:!1};const f=p.dataset.tooltip?.trim()||"";return f?{anchor:p,content:f,visible:!0}:m}))};return document.addEventListener("pointerover",o),document.addEventListener("pointerout",s),document.addEventListener("focusin",c),document.addEventListener("focusout",l),document.addEventListener("click",d),()=>{document.removeEventListener("pointerover",o),document.removeEventListener("pointerout",s),document.removeEventListener("focusin",c),document.removeEventListener("focusout",l),document.removeEventListener("click",d)}},[]),gt(()=>{if(!e.visible||!e.anchor||!n.current)return;const r=requestAnimationFrame(()=>{n.current&&e.anchor&&Jy(n.current,e.anchor)});return()=>{cancelAnimationFrame(r)}},[e.anchor,e.content,e.visible]),K(()=>{if(!e.visible||!e.anchor)return;const r=()=>{n.current&&e.anchor&&Jy(n.current,e.anchor)};return globalThis.addEventListener("resize",r),document.addEventListener("scroll",r,!0),()=>{globalThis.removeEventListener("resize",r),document.removeEventListener("scroll",r,!0)}},[e.anchor,e.visible]),{tooltipPortal:xe(()=>typeof document>"u"?null:en(a("div",{className:`help-tooltip${e.visible?" visible":""}`,hidden:!e.visible,ref:n,children:e.content}),document.body),[e.content,e.visible]),setTooltip:t}}function AD({DialogContent:e,onClose:t}){const[n,r]=I(q.open),[i,o]=I(["observer","queue","sync"].includes(q.activeTab)?q.activeTab:"observer"),[s,c]=I(b.settingsDirty),[l,d]=I(q.renderState),[u,p]=I(q.showAdvanced),{tooltipPortal:m,setTooltip:f}=PD();q.open=n,q.activeTab=i,b.settingsDirty=s,q.renderState=l,q.showAdvanced=u,K(()=>(q.controller={hideTooltip:()=>{f({anchor:null,content:"",visible:!1})},setActiveTab:h=>{const v=["observer","queue","sync"].includes(h)?h:"observer";q.activeTab=v,o(v)},setDirty:h=>{b.settingsDirty=h,c(h)},setOpen:h=>{q.open=h,r(h)},setRenderState:h=>{const v={...q.renderState,...h};q.renderState=v,d(v)},setShowAdvanced:h=>{q.showAdvanced=h,Q0(h),p(h)}},()=>{q.controller&&(q.controller=null)}),[]),K(()=>{n&&globalThis.lucide?.createIcons?.()},[n]);const g=re(()=>{q.startPolling&&q.refresh&&t(q.startPolling,q.refresh)},[t]);return a(te,{children:[a(bi,{ariaDescribedby:"settingsDescription",ariaLabelledby:"settingsTitle",contentClassName:"modal",contentId:"settingsModal",onCloseAutoFocus:h=>{h.preventDefault()},onOpenAutoFocus:h=>{h.preventDefault(),xD()},onOpenChange:h=>{if(h){r(!0);return}g()},open:n,overlayClassName:"modal-backdrop",overlayId:"settingsBackdrop",children:a(e,{})}),m]})}function je({children:e,className:t="field",hidden:n=!1,id:r}){return a("div",{className:t,hidden:n,id:r,children:e})}function mo({children:e,hidden:t=!1}){return a("div",{className:"settings-note",hidden:t,children:e})}function Fd({detail:e,title:t}){return a("div",{className:"settings-section-intro",children:[a("div",{className:"settings-section-intro-title",children:t}),a("div",{className:"small settings-section-intro-detail",children:e})]})}function ED({values:e,observerMaxCharsDefault:t,providerOptions:n,showAuthFile:r,showAuthCommand:i,hiddenUnlessAdvanced:o,onTextInput:s,onSelectValueChange:c,getObserverModelLabel:l,getObserverModelTooltip:d,getObserverModelDescription:u,getObserverModelHint:p,protectedConfigHelp:m,observerStatusBannerSlot:f}){return a(te,{children:[a(Fd,{detail:"Set how codemem reaches your model provider and where it should look for credentials.",title:"Connection and credentials"}),f,a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Connection"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerProvider",children:"Model provider"}),a("button",{"aria-label":"About model provider",className:"help-icon","data-tooltip":"Choose where model requests are sent. Use auto for recommended defaults.",type:"button",children:"?"})]}),a(cn,{ariaLabel:"Model provider",contentClassName:"settings-select-content",id:"observerProvider",itemClassName:"settings-select-item",onValueChange:c("observerProvider"),options:[{label:"auto (default)",value:""},...n],placeholder:"auto (default)",triggerClassName:"settings-select-trigger",value:e.observerProvider,viewportClassName:"settings-select-viewport"}),a("div",{className:"small",children:"Use `auto` unless you need to pin a specific provider."})]}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerModel",children:l()}),a("button",{"aria-label":"About model defaults",className:"help-icon","data-tooltip":d(),type:"button",children:"?"})]}),a(Se,{id:"observerModel",onInput:s("observerModel"),placeholder:"leave empty for default",value:e.observerModel}),a("div",{className:"small",children:u()}),a("div",{className:"small",id:"observerModelHint",children:p()})]}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerRuntime",children:"Connection mode"}),a("button",{"aria-label":"About connection mode",className:"help-icon","data-tooltip":"Direct API uses provider credentials. Local sessions use the selected Claude or Codex CLI login.",type:"button",children:"?"})]}),a(cn,{ariaLabel:"Connection mode",contentClassName:"settings-select-content",id:"observerRuntime",itemClassName:"settings-select-item",onValueChange:c("observerRuntime"),options:[{label:"Direct API (default)",value:"api_http"},{label:"Local Claude session",value:"claude_sidecar"},{label:"Local Codex session",value:"codex_sidecar"}],triggerClassName:"settings-select-trigger",value:e.observerRuntime,viewportClassName:"settings-select-viewport"}),a("div",{className:"small",children:"Switch between provider API credentials and local Claude or Codex CLI auth."})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"codexCommand",children:"Codex command (JSON argv)"}),a(Hr,{disabled:!0,id:"codexCommand",placeholder:'["codex"]',rows:2,value:e.codexCommand}),a("div",{className:"small",children:m("codex_command")})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"claudeCommand",children:"Claude command (JSON argv)"}),a(Hr,{disabled:!0,id:"claudeCommand",placeholder:'["claude"]',rows:2,value:e.claudeCommand}),a("div",{className:"small",children:m("claude_command")})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"observerMaxChars",children:"Request size limit (chars)"}),a(Se,{id:"observerMaxChars",min:"1",onInput:s("observerMaxChars"),type:"number",value:e.observerMaxChars}),a("div",{className:"small",id:"observerMaxCharsHint",children:t?`Default: ${t}`:""})]})]}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Authentication"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerAuthSource",children:"Authentication method"}),a("button",{"aria-label":"About authentication method",className:"help-icon","data-tooltip":"Choose how credentials are resolved: environment, file, command, or none.",type:"button",children:"?"})]}),a(cn,{ariaLabel:"Authentication method",contentClassName:"settings-select-content",id:"observerAuthSource",itemClassName:"settings-select-item",onValueChange:c("observerAuthSource"),options:[{label:"auto (default)",value:"auto"},{label:"env",value:"env"},{label:"file",value:"file"},{label:"command",value:"command"},{label:"none",value:"none"}],triggerClassName:"settings-select-trigger",value:e.observerAuthSource,viewportClassName:"settings-select-viewport"}),a("div",{className:"small",children:"Use `auto` unless you need to force a file or command-based token source."})]}),a(je,{hidden:!r,id:"observerAuthFileField",children:[a("label",{htmlFor:"observerAuthFile",children:"Token file path"}),a(Se,{disabled:!0,id:"observerAuthFile",placeholder:"~/.codemem/work-token.txt",value:e.observerAuthFile}),a("div",{className:"small",children:m("observer_auth_file")})]}),a(je,{hidden:!i,id:"observerAuthCommandField",children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerAuthCommand",children:"Token command"}),a("button",{"aria-label":"About token command",className:"help-icon","data-tooltip":"Runs this command and uses stdout as the token. JSON argv only, no shell parsing.",type:"button",children:"?"})]}),a(Hr,{disabled:!0,id:"observerAuthCommand",placeholder:'["iap-auth", "--audience", "gateway"]',rows:3,value:e.observerAuthCommand}),a("div",{className:"small",children:m("observer_auth_command")})]}),a("div",{className:"small",hidden:!i,id:"observerAuthCommandNote",children:'Command format: JSON string array, e.g. `["iap-auth", "--audience", "gateway"]`.'}),a(mo,{hidden:o(),children:"These advanced credential overrides only matter when you need custom command timing, cached tokens, or extra request headers."}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"observerAuthTimeoutMs",children:"Token command timeout (ms)"}),a(Se,{id:"observerAuthTimeoutMs",min:"1",onInput:s("observerAuthTimeoutMs"),type:"number",value:e.observerAuthTimeoutMs})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("label",{htmlFor:"observerAuthCacheTtlS",children:"Token cache time (s)"}),a(Se,{id:"observerAuthCacheTtlS",min:"0",onInput:s("observerAuthCacheTtlS"),type:"number",value:e.observerAuthCacheTtlS})]}),a(je,{className:"field settings-advanced",hidden:o(),children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerHeaders",children:"Request headers (JSON)"}),a("button",{"aria-label":"About request headers",className:"help-icon","data-tooltip":"Optional extra headers. Supports templates like ${auth.token}, ${auth.type}, ${auth.source}.",type:"button",children:"?"})]}),a(Hr,{disabled:!0,id:"observerHeaders",placeholder:'{"Authorization":"Bearer ${auth.token}"}',rows:4,value:e.observerHeaders}),a("div",{className:"small",children:m("observer_headers")})]})]})]})}function gs({checked:e,className:t,disabled:n=!1,hidden:r=!1,id:i,label:o,onCheckedChange:s}){const c=`${i}Label`;return a("div",{className:t?`field-checkbox settings-switch-row ${t}`:"field-checkbox settings-switch-row",hidden:r,children:[a("label",{className:"settings-switch-copy",htmlFor:i,id:c,children:o}),a(Fr,{"aria-labelledby":c,checked:e,className:"settings-switch",disabled:n,id:i,onCheckedChange:s,thumbClassName:"settings-switch-thumb"})]})}function ID({values:e,showTieredRouting:t,hiddenUnlessAdvanced:n,onTextInput:r,onSwitchInput:i,getTieredRoutingHelperText:o}){return a(te,{children:[a(Fd,{detail:"Control how often codemem processes queued work and, if needed, how it routes lighter vs richer model requests.",title:"Processing and routing"}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Processing"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"rawEventsSweeperIntervalS",children:"Background processing interval (seconds)"}),a("button",{"aria-label":"About background processing interval",className:"help-icon","data-tooltip":"How often codemem checks for queued events to process in the background.",type:"button",children:"?"})]}),a(Se,{id:"rawEventsSweeperIntervalS",min:"1",onInput:r("rawEventsSweeperIntervalS"),type:"number",value:e.rawEventsSweeperIntervalS}),a("div",{className:"small",children:"How often codemem checks for queued raw events in the background."})]})]}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Tiered observer routing"}),a(gs,{checked:e.observerTierRoutingEnabled,className:"field",id:"observerTierRoutingEnabled",label:"Enable tiered routing",onCheckedChange:i("observerTierRoutingEnabled")}),a("div",{className:"small",children:o()}),a(mo,{hidden:!t||n(),children:"These advanced routing values are only useful when you are tuning model cost, latency, or output quality for a known workload. If a selected path cannot honor the requested tier settings, codemem falls back visibly instead of silently pretending it worked."}),a("div",{hidden:!t,children:[a("h4",{children:"Simple tier"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerSimpleModel",children:"Model"}),a("button",{"aria-label":"About simple tier model",className:"help-icon","data-tooltip":"Used for lighter replay batches. Leave blank to keep codemem's routing defaults. Explicit simple-tier values override the built-in defaults.",type:"button",children:"?"})]}),a(Se,{id:"observerSimpleModel",onInput:r("observerSimpleModel"),placeholder:"leave empty for default",value:e.observerSimpleModel}),a("div",{className:"small",children:"Used when a batch falls below rich-routing thresholds."})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerSimpleTemperature",children:"Temperature"}),a(Se,{id:"observerSimpleTemperature",min:"0",onInput:r("observerSimpleTemperature"),step:"0.1",type:"number",value:e.observerSimpleTemperature})]})]}),a("div",{className:"settings-advanced",hidden:!t||n(),children:[a("h4",{children:"Shared reasoning defaults"}),a("div",{className:"small",children:"Applied to OpenAI Responses requests in both tiers unless a rich-tier override is set."}),a(je,{className:"field settings-advanced",children:[a("label",{htmlFor:"observerReasoningEffort",children:"Reasoning effort"}),a(Se,{id:"observerReasoningEffort",onInput:r("observerReasoningEffort"),placeholder:"leave empty for provider default",value:e.observerReasoningEffort})]}),a(je,{className:"field settings-advanced",children:[a("label",{htmlFor:"observerReasoningSummary",children:"Reasoning summary"}),a(Se,{id:"observerReasoningSummary",onInput:r("observerReasoningSummary"),placeholder:"leave empty for provider default",value:e.observerReasoningSummary})]})]}),a("div",{hidden:!t,children:[a("h4",{children:"Rich tier"}),a(je,{children:[a("div",{className:"field-label",children:[a("label",{htmlFor:"observerRichModel",children:"Model"}),a("button",{"aria-label":"About rich tier model",className:"help-icon","data-tooltip":"Used for larger or more complex replay batches. Leave blank to keep codemem's rich-tier defaults. Explicit rich-tier values override the built-in defaults.",type:"button",children:"?"})]}),a(Se,{id:"observerRichModel",onInput:r("observerRichModel"),placeholder:"leave empty for default",value:e.observerRichModel}),a("div",{className:"small",children:"Used when routing detects a richer replay batch."})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichTemperature",children:"Temperature"}),a(Se,{id:"observerRichTemperature",min:"0",onInput:r("observerRichTemperature"),step:"0.1",type:"number",value:e.observerRichTemperature})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichReasoningEffort",children:"Reasoning effort override"}),a(Se,{id:"observerRichReasoningEffort",onInput:r("observerRichReasoningEffort"),placeholder:"inherits shared reasoning effort",value:e.observerRichReasoningEffort})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichReasoningSummary",children:"Reasoning summary override"}),a(Se,{id:"observerRichReasoningSummary",onInput:r("observerRichReasoningSummary"),placeholder:"inherits shared reasoning summary",value:e.observerRichReasoningSummary})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"observerRichMaxOutputTokens",children:"Max output tokens"}),a(Se,{id:"observerRichMaxOutputTokens",min:"1",onInput:r("observerRichMaxOutputTokens"),step:"1",type:"number",value:e.observerRichMaxOutputTokens})]})]})]}),a("div",{className:"settings-group settings-advanced",hidden:n(),children:[a("h3",{className:"settings-group-title",children:"Pack limits"}),a(mo,{hidden:n(),children:"Most users can keep these defaults. Change them only when you need smaller or larger default context packs."}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"packObservationLimit",children:"Observation limit"}),a(Se,{id:"packObservationLimit",min:"1",onInput:r("packObservationLimit"),type:"number",value:e.packObservationLimit}),a("div",{className:"small",children:"Default number of observations to include in a pack."})]}),a(je,{className:"field settings-advanced",hidden:n(),children:[a("label",{htmlFor:"packSessionLimit",children:"Session summary limit"}),a(Se,{id:"packSessionLimit",min:"1",onInput:r("packSessionLimit"),type:"number",value:e.packSessionLimit}),a("div",{className:"small",children:"Default number of session summaries to include in a pack."})]})]})]})}function RD({values:e,hiddenUnlessAdvanced:t,onTextInput:n,onSwitchInput:r,protectedConfigHelp:i}){return a(te,{children:[a(Fd,{detail:"Choose whether this device syncs at all, how often it checks peers, and which coordinator group it should join.",title:"Device sync"}),a("div",{className:"settings-group",children:[a("h3",{className:"settings-group-title",children:"Device Sync"}),a(gs,{checked:e.syncEnabled,className:"field",id:"syncEnabled",label:"Enable sync",onCheckedChange:r("syncEnabled")}),a("div",{className:"field",children:[a("label",{htmlFor:"syncInterval",children:"Sync interval (seconds)"}),a(Se,{id:"syncInterval",min:"10",onInput:n("syncInterval"),type:"number",value:e.syncInterval}),a("div",{className:"small",children:"How often this device checks for sync work when sync is enabled."})]}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncHost",children:"Sync host"}),a(Se,{id:"syncHost",onInput:n("syncHost"),placeholder:"127.0.0.1",value:e.syncHost})]}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncPort",children:"Sync port"}),a(Se,{id:"syncPort",min:"1",onInput:n("syncPort"),type:"number",value:e.syncPort})]}),a(gs,{checked:e.syncMdns,className:"field settings-advanced",hidden:t(),id:"syncMdns",label:"Enable mDNS discovery",onCheckedChange:r("syncMdns")}),a("div",{className:"field",children:[a("label",{htmlFor:"syncCoordinatorUrl",children:"Coordinator URL"}),a(Se,{disabled:!0,id:"syncCoordinatorUrl",placeholder:"https://coord.example.com",value:e.syncCoordinatorUrl}),a("div",{className:"small",children:i("sync_coordinator_url")})]}),a("div",{className:"field",children:[a("label",{htmlFor:"syncCoordinatorGroup",children:"Coordinator group"}),a(Se,{id:"syncCoordinatorGroup",onInput:n("syncCoordinatorGroup"),placeholder:"team-alpha",value:e.syncCoordinatorGroup}),a("div",{className:"small",children:"Discovery namespace for peers using the same coordinator."})]}),a("div",{className:"field settings-advanced",hidden:t(),children:a(mo,{hidden:t(),children:"These network overrides are for unusual local-network setups. Leave them alone unless you know this device needs non-default sync discovery or coordinator timing."})}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncCoordinatorTimeout",children:"Coordinator timeout (seconds)"}),a(Se,{id:"syncCoordinatorTimeout",min:"1",onInput:n("syncCoordinatorTimeout"),type:"number",value:e.syncCoordinatorTimeout})]}),a("div",{className:"field settings-advanced",hidden:t(),children:[a("label",{htmlFor:"syncCoordinatorPresenceTtl",children:"Presence TTL (seconds)"}),a(Se,{id:"syncCoordinatorPresenceTtl",min:"1",onInput:n("syncCoordinatorPresenceTtl"),type:"number",value:e.syncCoordinatorPresenceTtl})]})]})]})}function DD({panelProps:e,activeTab:t,showAdvanced:n,renderState:r,settingsDirty:i,onClose:o,onSave:s,onActiveTabChange:c,onAdvancedToggle:l,observerStatusBannerSlot:d}){const u=!i||r.isSaving;return a("div",{className:"modal-card",onKeyDown:p=>Rr(p,{onSubmit:s,disabled:u}),children:[a("div",{className:"modal-header",children:[a("h2",{id:"settingsTitle",children:"Settings"}),a($o,{ariaLabel:"Close settings",className:"modal-close-button",onClick:o})]}),a("div",{className:"modal-body",children:[a("div",{className:"small",id:"settingsDescription",children:"Tune how codemem connects, processes work, and syncs with other devices."}),a("div",{className:"settings-advanced-toolbar",children:[a(gs,{checked:n,id:"settingsAdvancedToggle",label:"Show advanced controls",onCheckedChange:l}),a("button",{"aria-label":"About advanced controls",className:"help-icon","data-tooltip":"Advanced controls include JSON fields, tuning values, and network overrides.",type:"button",children:a("i",{"aria-hidden":"true","data-lucide":"help-circle"})})]}),a(mo,{hidden:!n,children:"Advanced controls are visible. Leave JSON fields, tuning values, and network overrides alone unless you are debugging or matching a known deployment setup."}),a(Kf,{ariaLabel:"Settings sections",listClassName:"settings-tabs",onValueChange:c,tabs:q0,triggerClassName:"settings-tab",value:t,children:[a(Jn,{className:"settings-panel",forceMount:!0,value:"observer",children:a(ED,{...e,observerStatusBannerSlot:d})}),a(Jn,{className:"settings-panel",forceMount:!0,value:"queue",children:a(ID,{...e})}),a(Jn,{className:"settings-panel",forceMount:!0,value:"sync",children:a(RD,{...e})})]}),a("div",{className:"small mono",id:"settingsPath",children:r.pathText}),a("div",{className:"small",id:"settingsEffective",children:r.effectiveText}),a("div",{className:"settings-note",hidden:!r.overridesVisible,id:"settingsOverrides",children:"Some values are controlled outside this screen and take priority."}),a("div",{className:"settings-note",hidden:n,children:"Advanced controls are hidden right now to keep this screen focused on everyday settings."})]}),a("div",{className:"modal-footer",children:[a("div",{className:"small",id:"settingsStatus",children:r.statusText}),a("button",{className:"settings-save","data-primary-action":"true",disabled:u,id:"settingsSave",onClick:s,type:"button",children:r.isSaving?"Saving…":"Save changes"})]})]})}function LD(e){const{current:t,baseline:n,envOverrides:r,touchedKeys:i,isProtected:o}=e,s={};return Object.entries(t).forEach(([c,l])=>{o(c)||ln(r,c)&&!i.has(c)||eD(l,n[c])||(s[c]=l)}),s}function $D(e){const t=s=>{const c=z0[s];c&&e.getTouchedKeys().add(c)},n=(s,c)=>{t(s),e.updateFormState({[s]:c}),e.setDirty(!0)};return{markFieldTouched:t,updateField:n,onTextInput:s=>c=>{n(s,c.currentTarget.value)},onSelectValueChange:s=>c=>{n(s,c)},onSwitchInput:s=>c=>{n(s,c)}}}function MD(e){const t=e?.effects,n=t&&typeof t=="object"&&!Array.isArray(t)?t:{},r=Array.isArray(n.hot_reloaded_keys)?n.hot_reloaded_keys.map(p=>Od(String(p))):[],i=Array.isArray(n.live_applied_keys)?n.live_applied_keys.map(p=>Od(String(p))):[],o=Array.isArray(n.restart_required_keys)?n.restart_required_keys.map(p=>Od(String(p))):[],s=Array.isArray(n.warnings)?n.warnings.filter(p=>typeof p=="string"&&p.trim().length>0):[],c=Array.isArray(n.manual_actions)?n.manual_actions:[],l=n.sync&&typeof n.sync=="object"?n.sync:{},d=[];r.length&&d.push(`Applied now: ${jd(r)}.`),i.length&&d.push(`Live settings updated: ${jd(i)}.`),l.attempted&&typeof l.message=="string"&&l.message?d.push(`Sync: ${l.message}.`):Array.isArray(l.affected_keys)&&l.affected_keys.length&&typeof l.reason=="string"&&l.reason&&d.push(`Sync: ${l.reason}.`),o.length&&d.push(`Restart required for ${jd(o)}. Run: codemem serve restart`),s.forEach(p=>{d.push(p)}),c.forEach(p=>{p&&typeof p.command=="string"&&p.command.trim()&&d.push(`If needed: ${p.command}.`)}),d.length||d.push("Saved.");const u=o.length>0||s.length>0||l.ok===!1;return{message:d.join(" "),type:u?"warning":"success"}}var OD=()=>aD(q.renderState.values,q.envOverrides),jD=()=>sD(q.renderState.values),FD=()=>cD(q.renderState.values),BD=()=>lD(q.renderState.values),UD=()=>dD(q.renderState.values),GD=()=>uD(q.showAdvanced),{onTextInput:HD,onSelectValueChange:KD,onSwitchInput:WD}=$D({getTouchedKeys:()=>q.touchedKeys,getValues:()=>q.renderState.values,updateFormState:hD,setDirty:e=>hs(e)});function VD(){const e=q.renderState.observerStatus;return a(kD,{status:e})}function qD(){const e=q.renderState.values,t=String(b.configDefaults?.observer_max_chars||""),n=e.observerAuthSource==="file",r=e.observerAuthSource==="command",i=e.observerTierRoutingEnabled;return a(DD,{panelProps:{values:e,observerMaxCharsDefault:t,providerOptions:Array.from(new Set(q.renderState.providers.concat(e.observerProvider?[e.observerProvider]:[]))).sort((o,s)=>o.localeCompare(s)).map(o=>({label:o,value:o})),showAuthFile:n,showAuthCommand:r,showTieredRouting:i,hiddenUnlessAdvanced:GD,onTextInput:HD,onSelectValueChange:KD,onSwitchInput:WD,getObserverModelLabel:FD,getObserverModelTooltip:BD,getObserverModelDescription:UD,getObserverModelHint:OD,getTieredRoutingHelperText:jD,protectedConfigHelp:mD},activeTab:q.activeTab,showAdvanced:q.showAdvanced,renderState:q.renderState,settingsDirty:b.settingsDirty,onClose:()=>{q.startPolling&&q.refresh&&vs(q.startPolling,q.refresh)},onSave:()=>{q.startPolling&&q.refresh&&XD(q.startPolling,q.refresh)},onActiveTabChange:gD,onAdvancedToggle:vD,observerStatusBannerSlot:a(VD,{})})}function zD(){return a(AD,{DialogContent:qD,onClose:vs})}function JD(){const e=Ie("settingsDialogMount");e&&Ue(a(zD,{}),e)}function Yy(){Ie("settingsDialogMount")&&(q.shellMounted||(JD(),q.shellMounted=!0))}function YD(e){q.shellMounted||Yy(),q.open=!0,q.previouslyFocused=document.activeElement,e(),q.controller?.setOpen(!0)}function vs(e,t){if(b.settingsDirty&&!globalThis.confirm("Discard unsaved changes?")){q.controller?.setOpen(!0);return}q.open=!1,q.controller?.setOpen(!1),fD(),(q.previouslyFocused&&typeof q.previouslyFocused.focus=="function"?q.previouslyFocused:Fc("settingsButton"))?.focus(),q.previouslyFocused=null,q.touchedKeys=new Set,e(),t()}async function XD(e,t){if(!q.renderState.isSaving){pr({isSaving:!0,statusText:"Saving changes…"});try{const n=LD({current:zy({allowUntouchedParseErrors:!0}),baseline:q.baseline,envOverrides:q.envOverrides,touchedKeys:q.touchedKeys,isProtected:yD});if(Object.keys(n).length===0){pr({isSaving:!1,statusText:"No unsaved changes"}),hs(!1),vs(e,t);return}const r=MD(await S_(n));pr({isSaving:!1,statusText:"Saved changes"}),hs(!1),vs(e,t),ne(r.message,r.type)}catch(n){pr({isSaving:!1,statusText:`Save failed: ${n instanceof Error?n.message:"unknown error"}`})}}}function QD(e,t,n){q.startPolling=t,q.refresh=n,Yy(),Fc("settingsButton")?.addEventListener("click",()=>YD(e))}function ZD(e){e.dataset.syncRenderRoot="preact"}function eL(){const e=document.getElementById("tab-sync");e&&(e.dataset.syncRenderBoundary="preact-hybrid")}function Ze(e,t){ZD(e),Ue(t,e)}function Qr(e){e.dataset.syncRenderRoot==="preact"&&Ue(null,e)}function tL(e){const t=Object.values(e||{}).map(n=>!n||typeof n!="object"?"":String(n.last_ping_at||"").trim()).filter(Boolean).sort();return t[t.length-1]??null}function nL(e){return typeof e=="object"&&e!==null}function rL(e,t){return b.pairingCommandRaw="",{payloadText:e,hintText:t}}function iL(e){if(!nL(e))return rL("Pairing not available","Enable sync and retry.");const t=e,n={...t,addresses:Array.isArray(t.addresses)?t.addresses:[]},r=JSON.stringify(n),i=`echo '${btoa(r)}' | base64 -d | codemem sync pair --accept-file -`;return b.pairingCommandRaw=i,{payloadText:i,hintText:"Copy this command and run it on the other device. Use --include/--exclude to control which projects sync."}}function oL(){return{title:"Diagnostics still loading.",detail:"Wait a moment for local sync status. If it stays blank, refresh the page or check whether sync is enabled on this device."}}function aL(){return{title:"Diagnostics unavailable right now.",detail:"The viewer could not load sync status. Refresh this page, or check that the local codemem sync service is reachable before retrying."}}function sL(){const e=b.lastSyncStatus;return{title:"No recent sync attempts yet.",detail:e?.daemon_state==="disabled"||e?.enabled===!1?"Turn on sync in Settings → Device Sync first. Recent attempts will appear here after this device can actually run sync work.":"Trigger a sync pass or pair another device to generate activity here when you need low-level troubleshooting."}}function cL(){return{title:"Recent attempts unavailable right now.",detail:"Attempt history could not be loaded because sync diagnostics failed. Refresh the page after local sync status is reachable again."}}function lL(e,t){return e==="offline-peers"&&t?"Some recent failures may have happened before all peers went offline. Sync will resume automatically when a peer becomes reachable.":""}function dL({items:e}){return a(te,{children:e.map((t,n)=>a("div",{class:"stat",children:a("div",{class:"stat-content",children:[a("div",{class:"value",children:t.value}),a("div",{class:"label",children:t.label})]})},`${t.label}-${n}`))})}function uL({attempts:e,note:t}){return a(te,{children:[t?a("div",{class:"small",children:t}):null,e.map((n,r)=>a("div",{class:"diag-line",children:[a("div",{class:"left",children:[a("div",{children:[n.peerLabel," — ",n.status]}),n.detail?a("div",{class:"small",children:n.detail}):null,n.actionHref&&n.actionLabel?a("a",{class:"small",href:n.actionHref,children:n.actionLabel}):null]}),a("div",{class:"right",children:n.startedAt})]},`${n.startedAt}-${n.peerLabel}-${r}`))]})}function Xy({text:e}){return a(te,{children:e})}function pL({title:e,detail:t}){return a("div",{class:"sync-empty-state",children:[a("strong",{children:e}),a("span",{children:t})]})}function mL(e,t){if(!t.length){Qr(e);return}Ze(e,a(dL,{items:t}))}function fL(e,t,n){if(!t.length){Qr(e);return}Ze(e,a(uL,{attempts:t,note:n}))}function mr(e,t){Ze(e,a(pL,{...t}))}function Qy(e,t,n){Ze(e,a(Xy,{text:n.payloadText})),t&&Ze(t,a(Xy,{text:n.hintText}))}function Zy({open:e,onOpenChange:t,triggerId:n,triggerClassName:r,closedLabel:i,openLabel:o,contentId:s,contentClassName:c,contentHost:l=null,children:d}){const u=B(null),p=B(null),m=B(!1);gt(()=>{u.current&&(u.current.id=n,u.current.setAttribute("aria-controls",s)),p.current&&(p.current.id=s)},[s,n,e]),K(()=>{if(!e){m.current=!1;return}m.current||(m.current=!0,queueMicrotask(()=>{p.current?.querySelector('button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])')?.focus()}))},[e]);const f=a(va,{forceMount:!0,asChild:!0,children:a("div",{ref:p,id:s,className:c,hidden:!e,children:d})});return a(ga,{open:e,onOpenChange:t,children:[a(Jf,{asChild:!0,children:a("button",{ref:u,type:"button",className:r,id:n,"aria-controls":s,children:e?o:i})}),l?en(f,l):f]})}function hL({open:e,onOpenChange:t}){return a(Zy,{open:e,onOpenChange:t,triggerId:"syncToggleAdmin",triggerClassName:"sync-toggle-admin",closedLabel:"Set up a new team instead…",openLabel:"Hide team setup",contentId:"syncInvitePanel",children:[a("h3",{className:"settings-group-title",style:{marginTop:"12px"},children:"Create a team"}),a("div",{className:"section-meta",children:"Generate an invite to share with teammates."}),a("div",{className:"actor-create-row",children:[a("label",{htmlFor:"syncInviteGroup",className:"sr-only",children:"Team name"}),a(Se,{className:"peer-scope-input",id:"syncInviteGroup",placeholder:"Team name (e.g. my-team)",type:"text"}),a("label",{htmlFor:"syncInvitePolicy",className:"sr-only",children:"Join policy"}),a("div",{className:"sync-radix-select-host sync-actor-select-host",id:"syncInvitePolicyMount"}),a("div",{className:"sync-ttl-group",children:[a("label",{htmlFor:"syncInviteTtl",children:"Expires in"}),a(Se,{className:"peer-scope-input",defaultValue:"24",id:"syncInviteTtl",min:"1",style:{width:"64px"},type:"number"}),a("span",{children:"hours"})]}),a("button",{className:"settings-button",id:"syncCreateInviteButton",type:"button",children:"Create invite"})]}),a("label",{htmlFor:"syncInviteOutput",className:"sr-only",children:"Generated invite"}),a(Hr,{className:"feed-search",id:"syncInviteOutput",placeholder:"Invite will appear here",readOnly:!0,hidden:!0}),a("div",{className:"peer-meta",id:"syncInviteAdminHint"}),a("div",{className:"peer-meta",id:"syncInviteWarnings",hidden:!0})]})}function gL({contentHost:e,open:t,onOpenChange:n}){return a(Zy,{open:t,onOpenChange:n,triggerId:"syncPairingToggle",triggerClassName:"settings-button",closedLabel:"Show pairing command",openLabel:"Hide pairing command",contentId:"syncPairing",contentClassName:"pairing-card",contentHost:e,children:[a("div",{className:"peer-title",children:[a("strong",{children:"Pairing command"}),a("div",{className:"peer-actions",children:a("button",{className:"settings-button",id:"pairingCopy",type:"button",children:"Copy command"})})]}),a("div",{className:"pairing-body",children:a("pre",{id:"pairingPayload",style:{userSelect:"all"}})}),a("div",{className:"peer-meta",id:"pairingHint"})]})}function vL(e,t){Ze(e,a(hL,{...t}))}function yL(e,t){Ze(e,a(gL,{...t}))}function de(e){return String(e??"").trim()}function bL(e){return de(e).replace(/\s+/g," ").toLowerCase()}function _L(e){const t=de(e);return t?t.slice(0,8):"Unnamed device"}function eb(e){return de(e?.last_error).toLowerCase()}function tb(e){return e.includes("401")&&e.includes("unauthorized")}function nb(e){return["timeout","connection refused","unreachable","aborted","all addresses failed"].some(t=>e.includes(t))}var wL={scope_filter:"sharing-domain membership",visibility_filter:"visibility",project_filter:"project filter"};function rb(e){return e.device?.needs_local_approval?{state:"needs-your-approval",badgeLabel:"Needs your approval",description:"Another device already approved this pairing. Approve it here to finish the connection on both sides.",actionLabel:"Approve on this device"}:e.device?.waiting_for_peer_approval?{state:"waiting-for-other-device",badgeLabel:"Waiting on other device",description:"You already approved this pairing here. The other device still needs to approve this one before sync can work both ways.",actionLabel:null}:{state:"none",badgeLabel:null,description:null,actionLabel:null}}function SL(e){const t=rb(e);return!de(e.device?.device_id)||e.device?.stale||e.hasAmbiguousCoordinatorGroup?!1:e.pairedLocally?t.state==="needs-your-approval":!0}function ib(e){const t=Array.isArray(e?.items)?e.items:[];if(!t.length)return{ok:!0,message:"Sync pass completed with no eligible devices.",warning:!1};const n=t.filter(i=>i&&i.ok===!1),r=t.filter(i=>Math.max(0,Number(i.opsSkipped??0))>0);if(!n.length){if(r.length){const i=r.reduce((s,c)=>s+Math.max(0,Number(c.opsSkipped??0)),0),o=NL(r.map(s=>s.skipped_out??null));return{ok:!0,message:`${i.toLocaleString()} outbound op${i===1?" was":"s were"} filtered: ${o}. No payload was sent for filtered data.`,warning:!0}}return{ok:!0,message:`Sync pass finished for ${t.length} device${t.length===1?"":"s"}.`,warning:!1}}return n.filter(i=>ob(i)==="trust").length===n.length?{ok:!1,message:"This device no longer has two-way trust with the peer. Pair it again from the other device, or remove the stale local record if it should be gone.",warning:!0}:n.filter(i=>ob(i)==="scope").length===n.length?{ok:!1,message:"Sync ran, but the peer is not authorized for one or more Spaces. Review Space access for this device in Teams, then sync again.",warning:!0}:n.length<t.length?{ok:!1,message:`${n.length} of ${t.length} device sync attempts failed. Open the affected device cards for the specific errors.`,warning:!0}:{ok:!1,message:de(n[0]?.error)||"Sync failed for at least one device.",warning:!0}}function ob(e){if(e.failureCategory)return e.failureCategory;const t=Array.isArray(e.perScopeResults)?e.perScopeResults.filter(r=>r&&r.ok===!1).map(r=>r.failureCategory).filter(r=>!!r):[];if(t.length)return new Set(t).size===1?t[0]:"other";const n=de(e.error);return CL(n)?"trust":TL(n)?"scope":null}function CL(e){const t=e.toLowerCase();return t.includes("401")&&t.includes("unauthorized")}function TL(e){const t=e.toLowerCase();return!!(t.includes("scope_rejected")||t.includes("missing_scope")||t.includes("stale_epoch")||t.includes("scope_inactive"))}function kL(e){const t=de(e?.reason);return wL[t]??(t.replaceAll("_"," ")||"sync filters")}function NL(e){const t=new Map;for(const n of e){const r=kL(n),i=Math.max(0,Number(n?.skipped_count??0));i!==0&&t.set(r,(t.get(r)??0)+i)}return t.size?Array.from(t.entries()).sort((n,r)=>r[1]-n[1]||n[0].localeCompare(r[0])).map(([n,r])=>`${r.toLocaleString()} by ${n}`).join(", "):"sync filters"}function ab(e){const t=de(e.localName);if(t)return t;const n=de(e.coordinatorName);return n||_L(de(e.deviceId))}function xL(e){const t=de(e.localName),n=de(e.coordinatorName);return t||n?!1:!!de(e.deviceId)}function PL(e){const t=Math.max(0,Number(e?.recent_ops?.in??0)),n=Math.max(0,Number(e?.recent_ops?.out??0));return t>0&&n>0?"bidirectional":n>0?"publishing":t>0?"subscribed":"none"}function fo(e){const t=de(e?.status?.peer_state);if(t==="offline"||t==="stale")return"offline";const n=eb(e);return tb(n)?"needs-repair":nb(n)?"offline":e?.has_error||t==="degraded"?"needs-repair":t==="online"||e?.status?.fresh?"connected":"waiting"}function Zr(e){const t=e?.status||{},n=de(t.peer_state),r=eb(e),i=de(t.sync_status)==="ok"||de(t.ping_status)==="ok";return n==="offline"||n==="stale"?{state:"offline",badgeLabel:"Offline",description:"This device was paired before, but it is offline right now.",isWarning:!0}:tb(r)?{state:"needs-repairing",badgeLabel:"Needs re-pairing",description:"This device no longer accepts this one. Pair again from the other device, or remove this local record if it no longer belongs here.",isWarning:!0}:nb(r)?{state:"offline",badgeLabel:"Offline",description:"This device is saved here, but none of its last known addresses are responding right now.",isWarning:!0}:i||n==="online"?{state:"mutual-trust",badgeLabel:"Two-way trust",description:"Both devices trust each other and sync can run in both directions.",isWarning:!1}:e?.has_error||n==="degraded"?{state:"needs-review",badgeLabel:"Needs review",description:"This device has a sync problem that needs review before you trust the current state again.",isWarning:!0}:{state:"trusted-by-you",badgeLabel:"Waiting on other device",description:"This device is already trusted here. Finish setup on the other device before sync can run both ways.",isWarning:!1}}var AL={missing_scope:"Missing scope id",sender_not_member:"Sender not a scope member",receiver_not_member:"Receiver not a scope member",stale_epoch:"Stale or revoked membership",scope_mismatch:"Scope mismatch",visibility_filter:"Visibility filter",project_filter:"Project filter"};function EL(e){const t=e?.scope_rejections,n=Math.max(0,Number(t?.total??0));if(!t||n===0)return{total:0,badgeLabel:null,reasons:[],lastAt:null};const r=[];for(const[i,o]of Object.entries(t.by_reason??{})){const s=Math.max(0,Number(o??0));if(s===0)continue;const c=i;r.push({reason:c,label:AL[c]??i,count:s})}return r.sort((i,o)=>o.count-i.count||i.label.localeCompare(o.label)),{total:n,badgeLabel:n===1?"1 sync rejection":`${n.toLocaleString()} sync rejections`,reasons:r,lastAt:t.last_at??null}}function sb(e){return Array.isArray(e)?e.map(t=>de(t)).filter(t=>!!t):[]}function cb(e,t){if(e.length===0)return t;const n=e.slice(0,3).join(", "),r=e.length-3;return r>0?`${n} +${r.toLocaleString()} more`:n}function ys(e,t){return e?e.replaceAll("_"," "):t}function IL(e){const t=(Array.isArray(e.authorized_scopes)?e.authorized_scopes:[]).map(r=>{const i=de(r.scope_id),o=de(r.label);if(!i&&!o)return null;const s=o||"Untitled Space",c=[ys(de(r.kind),"user"),ys(de(r.authority_type),"local"),`${ys(de(r.role),"member")} role`].filter(Boolean).join(" · ");return{scopeId:i||s,label:s,detail:c}}).filter(r=>r!=null),n=t.length;return{total:n,badgeLabel:n===1?"1 Space":n>1?`${n} Spaces`:"No Space access",isWarning:n===0,domains:t,emptyMessage:"No Space access grants exist for this device yet. Advanced project filters cannot send data by themselves."}}function lb(e){const t=(Array.isArray(e.per_scope_sync)?e.per_scope_sync:[]).map(n=>{const r=de(n.scope_id),i=de(n.label);if(!r&&!i)return null;const o=i||"Untitled Space",s=de(n.last_applied_cursor),c=de(n.last_acked_cursor),l=n.bootstrapped===!0||s?"received":"pending",d=ys(de(n.authority_type),"local"),u=Number(n.membership_epoch??0),p=[`Scope id: ${r||"unknown"}`,`${d} authority`,Number.isFinite(u)?`membership epoch ${u}`:null,s?`last applied ${s}`:null,c?`last acknowledged ${c}`:null].filter(m=>!!m).join(" · ");return{scopeId:r||o,label:o,status:l,badgeLabel:l==="received"?"Received":"Pending",detail:p}}).filter(n=>n!=null);return{total:t.length,rows:t,emptyMessage:"No per-Space sync progress is available yet. Run sync after both devices have Space access."}}var RL=["personal","private","home","mine","me"],DL=["oss","open source","opensource","community","public"],LL=["work","client"],$L=["local","legacy","review"];function ML(e){return[e.scope_id,e.label,e.kind,e.authority_type].map(t=>de(t)??"").join(" ").toLowerCase()}function OL(e){return[e.scope_id,e.label,e.kind].map(t=>de(t)??"").join(" ").toLowerCase()}function db(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Bd(e,t){const n=ML(e);return t.some(r=>{const i=db(r.toLowerCase());return new RegExp(`(^|[^a-z0-9])${i}([^a-z0-9]|$)`).test(n)})}function ub(e){return Bd(e,RL)||Bd(e,DL)}function jL(e){const t=OL(e);return $L.some(n=>{const r=db(n.toLowerCase());return new RegExp(`(^|[^a-z0-9])${r}([^a-z0-9]|$)`).test(t)})}function FL(e){return!ub(e)&&(!jL(e)||Bd(e,LL))}function BL(e){const t=Array.isArray(e.authorized_scopes)?e.authorized_scopes:[];if(!(de(e.discovered_via_group_id)||de(e.discovered_via_coordinator_id))||t.length===0)return{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""};const n=t.some(ub),r=t.some(FL);return!n||r?{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""}:{badgeLabel:"Review Space fit",detail:"Team discovery helps find the device, and advanced project filters only narrow already-authorized Spaces. Neither one grants missing work/client Space access.",isVisible:!0,message:"This Team-discovered device has personal or OSS Space access, but no separate work/client-like Space access. If this device is meant for work/client sync, grant that Space explicitly before treating sync as validated.",title:"Check this device's Space access"}}function UL(e,t){const n=e.map(r=>r.trim()).filter(Boolean);return n.length>0&&!n.includes("*")||t.length>0}function GL(e){const t=sb(e?.effective_include),n=sb(e?.effective_exclude),r=e?.inherits_global?"Global defaults":"Device override",i=`Include filter: ${cb(t,"all projects")}`,o=`Exclude filter: ${cb(n,"no exclusions")}`,s=UL(t,n);return{hasAdvancedFilters:s,statusLabel:s?"Advanced filters active":"No advanced filters",sourceLabel:r,includeLabel:i,excludeLabel:o,summary:`${r}. ${i}; ${o}.`,note:"Advanced filters only narrow data after Space access; they never grant access to another Space."}}function HL(e){const t=new Map;return(Array.isArray(e)?e:[]).forEach(n=>{const r=de(n?.display_name),i=de(n?.actor_id),o=bL(r);if(!r||!i||!o)return;const s=t.get(o)??{displayName:r,actorIds:[],includesLocal:!1};s.actorIds=[...s.actorIds,i],s.includesLocal=s.includesLocal||!!n?.is_local,t.set(o,s)}),[...t.values()].filter(n=>n.actorIds.length>1).sort((n,r)=>n.displayName.localeCompare(r.displayName))}function pb(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.duplicatePeople)?e.duplicatePeople:[],i=new Map;n.forEach(s=>{const c=de(s?.actor_id);c&&i.set(c,(i.get(c)??0)+1)});const o=new Set;return r.forEach(s=>{s.includesLocal&&s.actorIds.forEach(c=>{const l=t.find(d=>de(d?.actor_id)===c);!l||l.is_local||(i.get(c)??0)>0||o.add(c)})}),{visibleActors:t.filter(s=>!o.has(de(s?.actor_id))),hiddenLocalDuplicateCount:o.size}}var KL=new Set(["pending_setup","waiting_for_acceptance","provisioning","initial_sync","waiting_for_device","revoking"]),WL=new Set(["pending","verifying","waiting"]);function VL(e){return(Array.isArray(e?.groups)?e.groups.map(t=>de(t)).filter(Boolean):[]).join(", ")||"none"}function mb(e){return de(e?.projects?.[0]?.display_name)||"the shared Project"}function qL(e){const t=e?.items?.find(n=>n.state!=="active");return de(t?.canonicalProjectIdentity)||"the shared Project"}function zL(e,t){return t?.discovered_devices?.some(n=>n.needs_local_approval||n.waiting_for_peer_approval)?!0:e.some(n=>{const r=Zr(n).state;return r==="trusted-by-you"||r==="needs-repairing"})}function JL(e,t){return t?.enabled!==!0||t.daemon_state!=="ok"||t.daemon_running===!1?!1:e.some(n=>n.status?.sync_status==="ok"&&Zr(n).state==="mutual-trust"&&!lb(n).rows.some(r=>r.status==="pending"))}function YL(e){return e.some(t=>de(t.status?.peer_state)==="online"&&Zr(t).state==="mutual-trust")}function XL(e,t){return t?.daemon_state==="offline-peers"||t?.daemon_state==="stale"||t?.daemon_state==="degraded"?!0:e.some(n=>{const r=de(n.status?.peer_state),i=Zr(n).state;return n.has_error===!0&&i!=="needs-repairing"||i==="offline"||i==="needs-review"||r==="offline"||r==="stale"||r==="degraded"})}function QL(e){if(e?.daemon_running===!1)return!0;const t=e?.daemon_state;return t!==void 0&&t!=="ok"&&t!=="offline-peers"&&t!=="stale"&&t!=="degraded"}function fb(e){const t=e.coordinator,n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.shareOperations)?e.shareOperations:[],i=Array.isArray(e.reconciliation?.items)?e.reconciliation.items:[],o=VL(t);if(e.status?.enabled===!1||t?.sync_enabled===!1)return{state:"disabled",badgeLabel:"Sync off",meta:`Team: ${o}. Coordinator presence does not move Project data while sync is off.`,nextAction:"Open Settings and turn on sync before expecting Team or Project data to update."};if(e.shareOperationsLoadError)return{state:"needs-attention",badgeLabel:"Refresh needed",meta:`Team: ${o}. Device diagnostics are available, but Project sharing status could not be refreshed.`,nextAction:"Refresh Team sync to retry loading Project sharing status."};const s=r.find(p=>p.lifecycle?.state==="needs_attention"),c=i.find(p=>p.state==="needs_attention");if(s){const p=mb(s);return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${o}. Exact-Project setup has not converged, so coordinator presence is not a healthy sync signal.`,nextAction:`Open Project sharing below and retry setup for ${p}.`}}if(c)return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${o}. Recipient access has not converged, so coordinator presence is not a healthy sync signal.`,nextAction:"Open Sharing and use Manage projects for the affected recipient, then run Sync now again."};const l=r.find(p=>{const m=p.lifecycle?.state;return m!==void 0&&KL.has(m)}),d=i.find(p=>{const m=p.state;return m!==void 0&&WL.has(m)});if(l||d){const p=l?mb(l):qL(e.reconciliation??void 0),m=l?.lifecycle?.primary_action?.kind,f=l?.lifecycle?.state==="revoking";return{state:"pending-setup",badgeLabel:f?"Removal pending":"Setup pending",meta:f?`Team: ${o}. Future access removal for ${p} is still pending.`:`Team: ${o}. Exact-Project setup is still pending and data delivery is not confirmed.`,nextAction:f?`Keep both devices online, then sync again to finish removing future access for ${p}.`:m==="retry_setup"?`Open Project sharing below and retry setup for ${p}.`:m==="copy_invite"?`Copy the invitation for ${p} and send it to the recipient.`:`Keep both devices online, then sync again to finish setup for ${p}.`}}if(QL(e.status))return{state:"needs-attention",badgeLabel:"Sync needs attention",meta:`Team: ${o}. The local sync service is not healthy, so Project data delivery is not confirmed.`,nextAction:"Review the sync status below, restart codemem if needed, then run Sync now again."};if(zL(n,t))return{state:"trust-blocked",badgeLabel:"Pairing needed",meta:`Team: ${o}. A device still needs two-way trust before Project data can sync.`,nextAction:"Review the device below and finish pairing or approval on both devices."};const u=de(t?.presence_status);return u==="not_enrolled"?{state:"not-enrolled",badgeLabel:"Not enrolled",meta:`Team: ${o}. This device is not enrolled with the coordinator.`,nextAction:"Paste a Team invite below, or ask a Team admin to enroll this device."}:u!=="posted"?{state:"unreachable",badgeLabel:t?.configured?"Unreachable":"Setup needed",meta:t?.configured?`Team: ${o}. The coordinator is not currently reachable and no healthy data-plane sync is confirmed.`:"Configure or join a Team before expecting Project data to sync.",nextAction:t?.configured?"Check the coordinator connection, then refresh Team sync.":"Paste a Team invite below, or configure a coordinator in Advanced settings."}:XL(n,e.status)?{state:"reachable",badgeLabel:"Check devices",meta:`Team: ${o}. The coordinator is reachable, but one or more paired devices are offline or degraded.`,nextAction:"Bring the paired devices online, check their sync errors, then run Sync now again."}:t?.sync_enabled===!0&&JL(n,e.status)?{state:"healthy",badgeLabel:"Healthy",meta:`Team: ${o}. Sync is enabled and a trusted device has a healthy data-plane connection.`,nextAction:null}:YL(n)?{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${o}. The coordinator and a paired device are reachable, but successful Project sync is not confirmed.`,nextAction:"Run Sync now, then review the device sync status below if delivery is still pending."}:{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${o}. The coordinator is reachable, but healthy Project data sync is not confirmed.`,nextAction:"Pair and approve a device, then run Sync now to confirm data delivery."}}function ZL(e){return e.discovered?.stale?e.peer?fo(e.peer)!=="connected":!0:!1}function hb(e){return{id:`repair:${e.id}`,kind:"device-needs-repair",priority:10,title:e.title||`${e.name} needs attention`,summary:e.summary,actionLabel:"Open device",deviceId:e.id}}function Ud(e){return{id:`review:${e.id}:${e.key||"default"}`,kind:"review-team-device",priority:20,title:`${e.name} is available to review`,summary:e.summary,actionLabel:"Open device",deviceId:e.id}}function e$(e){return{id:`name:${e.id}`,kind:"name-device",priority:30,title:`Name ${e.name}`,summary:e.summary,actionLabel:"Go to name field",deviceId:e.id}}function t$(e){const t=de(e?.coordinator_url),n=Array.isArray(e?.groups)?e.groups:[];return t?n.some(r=>de(r))?e?.sync_enabled===!1?{reason:"sync_disabled",message:"Enable sync before pairing team devices."}:null:{reason:"coordinator_groups_empty",message:"Join or configure a team before pairing team devices."}:{reason:"coordinator_url_missing",message:"Configure a coordinator URL before pairing team devices."}}function n$(e,t){const n=new Map,r=i=>{const o=n.get(i)??{deviceId:i,localName:"",coordinatorName:"",peer:null,discovered:null};return n.set(i,o),o};return e.forEach(i=>{const o=de(i?.peer_device_id);if(!o)return;const s=r(o);s.peer=i,s.localName=de(i?.name)}),t.forEach(i=>{const o=de(i?.device_id);if(!o)return;const s=r(o);s.discovered=i,s.coordinatorName=de(i?.display_name)}),[...n.values()]}function r$(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.coordinator?.discovered_devices)?e.coordinator.discovered_devices:[],i=n$(n,r),o=e.duplicatePersonDecisions??{},s=HL(t).filter(l=>!o[[...l.actorIds].sort().join("::")]),c=[];return s.forEach(l=>{c.push({id:`duplicate:${l.actorIds.join(":")}`,kind:"possible-duplicate-person",priority:l.includesLocal?5:15,title:`Possible duplicate person: ${l.displayName}`,summary:l.includesLocal?"At least one entry is marked as you. Confirm whether these records represent the same person.":"Multiple people share this name. Confirm whether they should stay separate or be combined.",actionLabel:"Go to people",actorIds:l.actorIds})}),i.forEach(l=>{const d=ab({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId}),u=l.peer?fo(l.peer):"waiting",p=l.peer?Zr(l.peer):null,m=de(l.discovered?.fingerprint),f=de(l.peer?.fingerprint);if(l.peer&&m&&f&&m!==f){c.push(hb({id:l.deviceId,name:d,title:`${d} needs review`,summary:"This device identity changed. Remove the older local record before reconnecting it."}));return}if(l.peer&&u==="needs-repair"){const g=p?.description||de(l.peer?.last_error)||"Sync needs review.";c.push(hb({id:l.deviceId,name:d,title:p?.state==="needs-repairing"?`${d} needs re-pairing`:`${d} needs review`,summary:g}))}l.peer&&p?.state==="trusted-by-you"&&c.push(Ud({id:l.deviceId,key:"other-device-trust",name:d,summary:"You accepted this device. Finish onboarding on the other device so it trusts this one too."})),!l.peer&&l.discovered?.stale&&c.push(Ud({id:l.deviceId,key:"stale-discovery",name:d,summary:"This device is no longer advertising fresh coordinator presence. Wait for it to check in again before connecting it here."})),!l.peer&&Array.isArray(l.discovered?.groups)&&l.discovered.groups.length>1&&c.push(Ud({id:l.deviceId,key:"ambiguous-groups",name:d,summary:"This device appears in multiple coordinator groups. Review the team setup before approving it here."})),l.peer&&xL({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId})&&c.push(e$({id:l.deviceId,name:d,summary:"Give this device a friendly name so it is easier to recognize later."}))}),{primaryStatus:fb({status:e.status,coordinator:e.coordinator,peers:n,shareOperations:e.shareOperations,shareOperationsLoadError:e.shareOperationsLoadError,reconciliation:e.reconciliation}),summary:{connectedDeviceCount:n.filter(l=>fo(l)==="connected").length,seenOnTeamCount:r.length,offlineTeamDeviceCount:i.filter(l=>ZL(l)).length},duplicatePeople:s,attentionItems:c.sort((l,d)=>l.priority-d.priority||l.title.localeCompare(d.title))}}var gb={actor:"person",actors:"people",actorAssignment:"person assignment",localActor:"you",peer:"device",peers:"devices",pairedLocally:"Connected on this device",discovered:"Seen on team",conflicts:"Needs review"};function Dn(e){const t=document.getElementById(e);t&&t.remove()}var vb=!1;function i$(e){vb=e}var Gd=!1;function o$(e){Gd=e}var Hd=!1;function a$(e){Hd=e}var s$=new Set,Kd=new Set,Wd=new Set,yb="codemem-sync-duplicate-person-decisions";function c$(e){const t=String(e||"").trim();t&&(Kd.add(t),Wd.add(t),s$.add(t))}function Vd(e){const t=String(e||"").trim();return!!t&&Kd.has(t)}function l$(e){const t=String(e||"").trim();t&&Kd.delete(t)}function d$(e){const t=String(e||"").trim();return!t||!Wd.has(t)?!1:(Wd.delete(t),!0)}function qd(){try{const e=localStorage.getItem(yb);if(!e)return{};const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function bb(e){try{localStorage.setItem(yb,JSON.stringify(e))}catch{}}function _b(e){return[...e].map(t=>String(t||"").trim()).filter(Boolean).sort().join("::")}function u$(){return qd()}function p$(e,t){const n=_b(e);if(!n)return;const r=qd();r[n]=t,bb(r)}function m$(e){const t=_b(e);if(!t)return;const n=qd();delete n[t],bb(n)}function wb(e){return e.replace(/\b(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}\b/g,"$1.#.#")}function Sb(e){const t=String(e||"");return t?wb(t):""}function f$(e){if(!Array.isArray(e))return"";const t=Array.from(new Set(e.filter(Boolean)));return typeof t[0]=="string"?t[0]:""}function h$(e,t){const n=String(e?.relatedPeerDeviceId??"").trim();return n?t.some(r=>String(r?.peer_device_id??"").trim()===n):!1}function bs(e){if(!e||typeof e!="object")return"Unknown person";const t=String(e.display_name||"").trim();return t||String(e.actor_id||"Unknown person")}function _s(e){return!e||typeof e!="object"?"Unknown person":e.is_local?"You":bs(e)}function g$(e){return(Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[]).filter(t=>String(t?.actor_id||"")===e).length}function Cb(){return pb({actors:b.lastSyncActors,peers:b.lastSyncPeers,duplicatePeople:b.lastSyncViewModel?.duplicatePeople}).visibleActors}function v$(e=""){const t=[{value:"",label:"No person assigned"}],n=Cb(),r=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).find(i=>String(i?.actor_id||"")===e);return(r&&!n.some(i=>String(i?.actor_id||"")===e)?[...n,r]:n).forEach(i=>{const o=String(i?.actor_id||"").trim();o&&t.push({value:o,label:_s(i)})}),t.filter((i,o,s)=>o===s.findIndex(c=>c.value===i.value))}function Tb(e){return Cb().filter(t=>String(t?.actor_id||"")!==e)}function y$(e,t){const n=Tb(t).find(r=>String(r?.actor_id||"")===e);return!e||!n?"Choose which person should keep these devices.":`Merge into ${_s(n)}. Assigned devices move now; existing memories keep their current provenance.`}function zd(e,t){if(e){if(e.textContent="",!t.length){e.hidden=!0;return}e.hidden=!1,t.slice(0,2).forEach(n=>{const r=ma("div","sync-action"),i=ma("div","sync-action-text");i.textContent=n.label,i.appendChild(ma("span","sync-action-command",n.command));const o=ma("button","settings-button sync-action-copy","Copy");o.addEventListener("click",()=>Pi(n.command,o)),r.append(i,o),e.appendChild(r)})}}function kb(e,t){return t&&e.error_redacted===!0}function Nb(){const e=document.getElementById("syncAttempts");if(!e)return;const t=b.lastSyncAttempts,n=String(b.lastSyncStatus?.daemon_state||"").trim();if(!Array.isArray(t)||!t.length){mr(e,sL());return}const r=lL(n,t.slice(0,5).some(i=>i.status==="error"));fL(e,t.slice(0,5).map(i=>{const o=i.started_at||i.started_at_utc||"",s=String(i.peer_device_id||"").trim(),c=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers.find(m=>String(m?.peer_device_id||"")===s):null,l=String(c?.name||"").trim()||(s?s.slice(0,8):"unknown"),d=i.status==="error",u=[],p=Ei();if(d&&i.error){const m=String(i.error);u.push(p?wb(m):m),kb(i,p)&&u.push("Turn off Redact in Advanced diagnostics to reveal the full error.")}return!d&&(i.ops_in||i.ops_out)&&u.push(`${i.ops_in??0} in · ${i.ops_out??0} out`),!p&&i.address&&u.push(i.address),{status:i.status||"unknown",peerLabel:l,detail:u.join(" · "),startedAt:o?rr(o):"",...kb(i,p)?{actionHref:"#sync/diagnostics",actionLabel:"Open Advanced diagnostics Redact setting"}:{}}}),r)}function b$(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncAttempts"),n=document.getElementById("syncMeta"),r=document.getElementById("syncActions");e&&mr(e,aL()),t&&mr(t,cL()),n&&(n.textContent="Advanced diagnostics are unavailable right now. Refresh the page first. If that still fails, verify the local sync service and retry once it responds again."),zd(r,[])}function ei(e){const t=Number(e??0);return Number.isFinite(t)?t:0}function _$(e){const t=String(e?.state??"clear"),n=e?.stale_peer_rows??{},r=e?.access_cleanup_ops??{},i=ei(n.would_remove),o=ei(n.ambiguous),s=ei(r.applied),c=ei(r.source_authored);return t==="cleanup_pending"||i>0?`${i} pending removal`:t==="needs_review"||o>0?`${o} needs review`:t==="cleanup_applied"||s>0?`${s} applied`:t==="cleanup_announced"||c>0?`${c} announced`:"Clear"}function xb(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncMeta"),n=document.getElementById("syncActions");if(!e)return;Dn("syncDiagSkeleton");const r=b.lastSyncStatus;if(!r){mr(e,oL()),zd(n,[]),t&&(t.textContent="Loading advanced sync diagnostics…");return}const i=r.peers||{},o=r.ping||{},s=r.sync||{},c=r.last_sync_at||r.last_sync_at_utc||null,l=o.last_ping_at||r.last_ping_at||tL(i)||null,d=r.last_sync_error||"",u=r.last_ping_error||"",p=Number(r.pending||0),m=String(r.daemon_detail||""),f=String(r.daemon_state||"unknown"),g=r.retention||{},h=r.cleanup_diagnostics,v=h?.stale_peer_rows??{},_=ei(v.would_remove),w=ei(v.ambiguous),S=g.enabled===!0,T=Number(g.last_deleted_ops||0),k=g.last_run_at||null,P=String(g.last_error||""),E=f==="offline-peers"?"Offline peers":f==="needs_attention"?"Needs attention":f==="rebootstrapping"?"Rebootstrapping":Ug(f),M=f==="disabled"||r.enabled===!1,U=Object.keys(i).length,x=!M&&U===0;if(t){const $=M?["Advanced sync is off on this device","Turn on sync in Settings → Device Sync when you want pairing payloads, peer status, and recent attempt details here"]:x?["Advanced sync is ready but idle","Use Show pairing command under People & devices to connect another device, then this panel will start showing live peer status and recent attempts"]:[`Advanced state: ${E}`,`Peers: ${U}`,c?`Last sync: ${Nn(Kr(c))} ago`:"Last sync: never"];f==="offline-peers"&&$.push("All peers are currently offline; sync will resume automatically"),m&&f==="stopped"&&$.push(`Detail: ${m}`),m&&(f==="needs_attention"||f==="rebootstrapping")&&$.push(`Detail: ${m}`),S&&$.push(k?`Retention last ran ${Nn(Kr(k))} ago (approx oldest-first)`:"Retention enabled"),_>0?$.push(`${_.toLocaleString()} stale peer rows pending cleanup`):w>0&&$.push(`${w.toLocaleString()} stale peer rows retained because safe cleanup could not be proven`),t.textContent=$.join(" · ")}const G=M?[{label:"State",value:"Disabled"},{label:"Mode",value:"Optional"},{label:"Pending events",value:p},{label:"Last sync",value:"Not running"}]:x?[{label:"State",value:"No peers"},{label:"Mode",value:"Ready to pair"},{label:"Pending events",value:p},{label:"Last sync",value:"Waiting for first peer"}]:[{label:"State",value:E},{label:"Pending events",value:p},{label:"Last sync",value:c?`${Nn(Kr(c))} ago`:"never"},{label:"Last peer ping",value:l?`${Nn(Kr(l))} ago`:"never"},{label:"Retention",value:S?k?`${T.toLocaleString()} ops last run (approx)`:"Enabled":"Disabled"}];!M&&!x&&(d||u)&&G.push({label:[d,u].filter(Boolean).join(" · "),value:"Errors"}),!M&&!x&&s.seconds_since_last&&G.push({label:"Since last sync",value:`${s.seconds_since_last}s`}),!M&&!x&&o.seconds_since_last&&G.push({label:"Since last peer ping",value:`${o.seconds_since_last}s`}),!M&&S&&P&&G.push({label:P,value:"Retention"}),!M&&!x&&h&&G.push({label:"Cleanup",value:_$(h)}),mL(e,G);const A=[];x||f==="offline-peers"||(f==="stopped"?(A.push({label:"Sync daemon is stopped. Start it.",command:"codemem serve start"}),A.push({label:"Run one sync pass now.",command:"codemem sync once"})):f==="needs_attention"?A.push({label:"Sync needs manual attention before reset can continue.",command:"codemem sync doctor"}):f==="rebootstrapping"?A.push({label:"Sync is rebuilding state in the background.",command:"codemem sync status"}):d||u||f==="error"?(A.push({label:"Sync reports errors. Restart now.",command:"codemem serve restart && codemem sync once"}),A.push({label:"Run doctor for the root cause.",command:"codemem sync doctor"})):!M&&!x&&p>0&&A.push({label:"Pending sync work detected. Run one pass now.",command:"codemem sync once"})),!M&&w>0?A.push({label:"Some stale peer rows were retained because cleanup was ambiguous.",command:"codemem sync doctor"}):!M&&_>0&&A.push({label:"Stale peer rows are eligible for cleanup. Run one sync pass now.",command:"codemem sync once"}),zd(n,A)}var w$="syncRedactMount",S$="syncRedactLabel",Pb=()=>{};function C$(e){Pb=e}var Jd=()=>{};function Yd(){const e=document.getElementById("syncPairingDisclosureMount"),t=document.getElementById("syncPairingPanelMount");if(!e||!t)return;yL(e,{contentHost:t,open:b.syncPairingOpen,onOpenChange:r=>{if(ok(r),Yd(),r){const i=document.getElementById("pairingPayload"),o=document.getElementById("pairingHint");i&&Qy(i,o,{payloadText:"Loading…",hintText:"Fetching pairing payload…"})}Jd()}});const n=document.getElementById("pairingCopy");n&&(n.onclick=async()=>{const r=b.pairingCommandRaw;r&&await Pi(r,n)})}function Xd(){Yd();const e=document.getElementById("pairingPayload"),t=document.getElementById("pairingHint");if(!e)return;Qy(e,t,iL(b.pairingPayloadRaw));const n=document.getElementById("pairingCopy");n&&(n.disabled=!b.pairingCommandRaw)}function Ab(){const e=document.getElementById(w$);e&&Ze(e,y(Fr,{"aria-labelledby":S$,checked:Ei(),className:"sync-redact-switch",id:"syncRedact",onCheckedChange:t=>{ak(t),Ab(),Jd(),xb(),Pb(),Nb(),Xd()},thumbClassName:"sync-redact-switch-thumb"}))}function T$(e){Jd=e,Yd(),Ab()}function k$(e){e.classList.add("sync-shake"),e.addEventListener("animationend",()=>e.classList.remove("sync-shake"),{once:!0})}function ti(e,t){e.classList.add("sync-field-error");const n=e.parentElement?.querySelector(".sync-field-hint");n&&n.remove();const r=document.createElement("div");return r.className="sync-field-hint",r.textContent=t,e.insertAdjacentElement("afterend",r),k$(e),e.addEventListener("input",()=>ho(e),{once:!0}),!1}function ho(e){e.classList.remove("sync-field-error");const t=e.parentElement?.querySelector(".sync-field-hint");t&&t.remove()}function et(e,t){if(e instanceof Error){const n=e.message;return n.includes("fetch")||n.includes("network")||n.includes("Failed to fetch")?"Network error — check your connection and try again.":n}return t}var fr=new Map,Qd=null,N$={operation_device_binding_missing:"The accepted device has not been linked yet.",operation_not_found:"This sharing operation is no longer available.",operation_scope_mismatch:"The invitation no longer matches the reviewed project access.",operation_state_invalid:"The invitation is no longer in a recoverable state.",reassign_capability_required:"A participating device must be updated before setup can continue."};function x$(e){return N$[e instanceof Error?e.message:String(e)]??"Setup could not be retried. Review diagnostics for details."}function P$(e){const t=new Map;for(const n of e){const r=n.person.actor_id;t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function A$(e){return[...new Map(e.flatMap(t=>t.devices).map(t=>[t.device_id,t])).values()]}function Zd(e){switch(e){case"waiting_for_acceptance":return"Invitation pending";case"active":return"Sharing";case"revoking":return"Removing sharing";case"revoked":return"Previously shared";case"cancelled":return"Invitation cancelled";default:return"Sharing setup"}}function E$({operation:e,onAdvance:t,onLoadOperation:n,onReload:r,copyText:i}){const[o,s]=I(!1),[c,l]=I(()=>fr.get(e.operation_id)??null),d=B(null),u=e.lifecycle.primary_action;K(()=>{Qd!==e.operation_id||!d.current||(Qd=null,d.current.focus())},[c?.message,e.operation_id]);async function p(h){s(!0);try{let v=h;if(!v&&n){const w=(await n(e.operation_id)).lifecycle.primary_action;w?.kind==="copy_invite"&&(v=w.invite_link)}if(!v)throw new Error("Invitation is no longer available. Refresh the status.");await(i??(w=>navigator.clipboard.writeText(w)))(v);const _={message:"Invite copied.",tone:"success"};fr.set(e.operation_id,_),l(_)}catch(v){const _={message:v instanceof Error?v.message:"Invite could not be copied.",tone:"warning"};fr.set(e.operation_id,_),l(_)}finally{s(!1)}}async function m(){s(!0);try{const h=await t(e.operation_id),v=h.lifecycle.state==="active"?{message:"Setup complete.",tone:"success"}:h.lifecycle.state==="needs_attention"?{message:"Setup still needs attention.",tone:"warning"}:{message:`Retry started. ${h.lifecycle.label}.`,tone:"success"};fr.set(e.operation_id,v),Qd=e.operation_id,l(v),await r()}catch(h){const v={message:x$(h),tone:"warning"};fr.set(e.operation_id,v),l(v),queueMicrotask(()=>d.current?.focus())}finally{s(!1)}}function f(){const h=e.projects.map(v=>v.project_id?.trim()).filter(v=>!!v);if(h.length!==e.projects.length){const v={message:"The original project selection is unavailable. Refresh Projects and try again.",tone:"warning"};fr.set(e.operation_id,v),l(v);return}if(!ea(h,e.person.display_name)){const v={message:"Project sharing is unavailable. Refresh Projects and try again.",tone:"warning"};fr.set(e.operation_id,v),l(v)}}function g(){if(u){if(u.kind==="copy_invite"){p(u.invite_link);return}if(u.kind==="retry_setup"){m();return}f()}}return a("section",{"aria-label":`${Zd(e.lifecycle.state)} operation`,className:"project-share-operation-card",children:[a("div",{className:"peer-scope-summary",children:Zd(e.lifecycle.state)}),a("ul",{"aria-label":`${Zd(e.lifecycle.state)} projects`,className:"peer-scope-chips",children:e.projects.map((h,v)=>a("li",{className:"peer-scope-chip",children:h.display_name},`${h.display_name}:${v}`))}),a("div",{className:"peer-scope-summary",children:e.lifecycle.label}),a("div",{className:"peer-meta",role:e.lifecycle.state==="needs_attention"?"alert":void 0,children:e.lifecycle.explanation}),u?a("div",{className:"peer-actions",children:a("button",{"aria-busy":o,className:"settings-button",disabled:o,type:"button",onClick:g,children:o?u.kind==="copy_invite"?"Copying…":"Retrying…":u.label})}):null,c?a("div",{ref:d,className:`settings-note ${c.tone==="warning"?"project-attention-note":""}`,role:"status",tabIndex:-1,children:c.message}):null]})}function I$({operations:e,...t}){const n=e[0].person,r=A$(e);return a("article",{"aria-label":`Project sharing with ${n.display_name}`,className:"peer-card project-share-person-group",children:[a("h3",{className:"device-row-name",children:n.display_name}),r.length>0?a("ul",{"aria-label":`Devices for ${n.display_name}`,className:"peer-scope-rejections-list",children:r.map(i=>a("li",{children:i.display_name},i.device_id))}):null,e.map(i=>a(E$,{operation:i,...t},i.operation_id))]})}function R$(e){return e.operations.length===0?null:a("div",{className:"project-share-person-groups",children:P$(e.operations).map(t=>a(I$,{...e,operations:t},t[0].person.actor_id))})}function D$(e,t){Ze(e,a(R$,{...t}))}function Eb({title:e,detail:t}){return a("div",{className:"sync-empty-state",role:"status","aria-live":"polite","aria-atomic":"true",children:[a("strong",{children:e}),a("span",{children:t})]})}function L$(e){return e<=0?"Represents you across your own devices.":`Represents you across your own devices. ${e} unresolved duplicate ${e===1?"entry is":"entries are"} hidden until reviewed in Needs attention.`}function $$({actor:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){const o=String(e.actor_id||""),s=bs(e),c=g$(o),l=Tb(o),d=l.map(A=>String(A.actor_id||"")).join("|"),[u,p]=I(s),[m,f]=I(!1),[g,h]=I("Rename"),[v,_]=I(!1),[w,S]=I("Merge into selected person"),[T,k]=I(""),[P,E]=I(!1);K(()=>{p(s),f(!1),h("Rename"),_(!1),S("Merge into selected person"),k(""),E(!1)},[o,c,t,s,d]);const M=l.length?y$(T,o):"No other people are available yet. Create another person first if you need to merge duplicates.",U=[{label:"Merge into person",value:""},...l.map(A=>{const $=String(A.actor_id||"");return{label:A.is_local?_s(A):bs(A),value:$}})];async function x(){const A=u.trim();if(!A)return;f(!0),h("Saving…");let $=!1;try{await n(o,A),$=!0}catch{h("Retry rename")}finally{f(!1),$&&h("Rename")}}async function G(){if(!T)return;const A=l.find(L=>String(L.actor_id||"")===T);if(!A||!await Kt({title:`Merge ${s} into ${bs(A)}?`,description:"Assigned devices move now, but older memories keep their current stamped provenance for now.",confirmLabel:"Merge people",cancelLabel:"Keep separate",tone:"danger"}))return;_(!0),S("Merging…");let $=!1;try{await r(T,o),$=!0}catch{S("Retry merge")}finally{_(!1),$&&S("Merge into selected person")}}return a("div",{className:"actor-row",children:[a("div",{className:"actor-details",children:[a("div",{className:"actor-title",children:[a("strong",{children:_s(e)}),a("span",{className:`badge actor-badge${e.is_local?" local":""}`,title:e.is_local?L$(t):void 0,children:e.is_local?"You":`${c} device${c===1?"":"s"}`})]}),e.is_local?null:a("div",{className:"peer-meta",children:[c," assigned device",c===1?"":"s"]})]}),a("div",{className:"actor-actions",children:e.is_local?a("div",{className:"peer-meta",children:"Rename yourself in config"}):a(te,{children:[a(Se,{"aria-label":`Rename ${s}`,className:"peer-scope-input actor-name-input",disabled:m||v,type:"text",value:u,onInput:A=>p(A.currentTarget.value),onKeyDown:A=>Rr(A,{onSubmit:()=>{x()},disabled:m||v||!u.trim()})}),a("button",{type:"button",className:"settings-button","data-primary-action":"true",disabled:m||v,onClick:()=>{x()},children:g}),a("button",{type:"button",className:"settings-button danger",disabled:m||v,onClick:async()=>{await Kt({title:`Remove ${s}?`,description:"This deactivates the person and unassigns their devices. Existing memories keep their current attribution.",confirmLabel:"Remove person",cancelLabel:"Keep",tone:"danger"})&&await i(o)},children:"Remove"}),a("button",{type:"button",className:"settings-button",disabled:m||v,onClick:()=>E(A=>!A),children:P?"Hide duplicate cleanup":"Show duplicate cleanup"}),P?a(te,{children:[a("div",{className:"peer-meta actor-merge-note",children:"Use this only when combining duplicate people into one."}),a("div",{className:"actor-merge-controls",children:[a(cn,{ariaLabel:`Merge ${s} into another person`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:v||l.length===0,itemClassName:"sync-radix-select-item",onValueChange:k,options:U,placeholder:"Merge into person",triggerClassName:"sync-radix-select-trigger sync-actor-select actor-merge-select",value:T,viewportClassName:"sync-radix-select-viewport"}),a("button",{type:"button",className:"settings-button",disabled:v||l.length===0||!T,onClick:()=>{G()},children:w})]}),a("div",{className:"peer-meta actor-merge-note",children:M})]}):null]})})]})}function M$({actors:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){return e.length?a(te,{children:e.map(o=>{const s=String(o.actor_id||o.display_name||o.is_local||"");return a($$,{actor:o,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i},s)})}):a(Eb,{detail:"Create a named person here, then assign devices below so team ownership stays readable.",title:"No people set up yet."})}function O$(e,t){Ze(e,a(M$,{...t}))}function j$(e){return e.filter(t=>String(t.origin_device_id||"").trim())}function F$(e){const t=e.find(n=>String(n.last_seen_at||"").trim());return t?.last_seen_at?`Detected from older synced memories. Latest memory: ${rr(String(t.last_seen_at).trim())}`:"Detected from older synced memories not yet attached to a current device."}function B$({devices:e}){return a(te,{children:F$(e)})}function U$(e){const t=String(e.origin_device_id||"").trim(),n=Number(e.memory_count||0);return{label:n>0?`${t} (${n} memories)`:t,value:t}}function G$(e){const t=j$(e.devices);if(!t.length){e.panel.hidden=!0,e.onValueChange(""),Qr(e.mount),Qr(e.meta);return}const n=t.map(U$),r=n.some(i=>i.value===e.value)?e.value:n[0]?.value||"";r!==e.value&&e.onValueChange(r),e.panel.hidden=!1,Ze(e.mount,a(cn,{ariaLabel:"Legacy device",contentClassName:"sync-radix-select-content sync-legacy-select-content",id:"syncLegacyDeviceSelect",itemClassName:"sync-radix-select-item",onValueChange:e.onValueChange,options:n,triggerClassName:"sync-radix-select-trigger sync-legacy-select",value:r,viewportClassName:"sync-radix-select-viewport"})),Ze(e.meta,a(B$,{devices:t}))}var H$={online:"Online",offline:"Offline",degraded:"Degraded",attention:"Action required",syncing:"Syncing",unknown:"Status unknown"};function K$({state:e,size:t=8,"aria-label":n}){return a("span",{"aria-label":n??H$[e],className:`presence-pip presence-pip--${e}`,role:"img",style:`--presence-pip-size: ${t}px`})}function hr({feedback:e}){return e?.message?a("div",{className:`sync-inline-feedback ${e.tone}`,role:e.tone==="warning"?"alert":"status","aria-live":e.tone==="warning"?"assertive":"polite","aria-atomic":"true",children:e.message}):null}function W$(){return a("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:[a("title",{children:"Chevron"}),a("path",{d:"m9 18 6-6-6-6"})]})}function V$(e){switch(fo(e)){case"connected":return"online";case"offline":return"offline";case"needs-repair":return"attention";default:return"unknown"}}var ws=null,Ib=0,eu=new Set;function Rb(e){if(ws!==e){ws=e,Ib+=1;for(const t of eu)t(Ib)}}function q$(){const[,e]=I(0);return K(()=>(eu.add(e),()=>{eu.delete(e)}),[]),ws}var z$={bidirectional:{glyph:"↕",label:"Bidirectional sync in the last 24 hours"},publishing:{glyph:"↑",label:"Publishing only in the last 24 hours"},subscribed:{glyph:"↓",label:"Subscribed only in the last 24 hours"},none:null};function J$(e){return e?e.authorized?"Private same-person sync is limited to your personal Space. Team and org Spaces do not carry your private memories.":"Private same-person sync is blocked until this device is granted an allowed personal Space.":"Private same-person sync is limited to an allowed personal Space; team or org Spaces do not carry your private memories."}function Y$(){window.location.hash="coordinator-admin"}function tu(e=b.lastCoordinatorAdminStatus){return e?.readiness==="ready"&&e.has_admin_secret===!0}function X$({peer:e,onAssignActor:t,onRemove:n,onRename:r,onSync:i}){const o=String(e.peer_device_id||""),s=e.name||(o?o.slice(0,8):"unknown"),c=e.name||o||s,l=Zr(e),d=z$[PL(e)],u=e.status||{},p=IL(e),m=Vd(o),f=m&&p.total===0,g=BL(e),h=EL(e),v=lb(e),_=GL(e.project_scope||{}),w=f$(e.addresses),S=Array.isArray(e.addresses)?Array.from(new Set(e.addresses.filter(Boolean).map(ae=>String(ae)))):[],T=Number(e.address_count??0),k=Number.isFinite(T)&&T>0?T:0,P=S.length?S.map(ae=>Ei()?Sb(ae):ae).join(" · "):k>0?`${k} ${k===1?"address":"addresses"} hidden`:"No addresses",E=e.actor_display_name?`This device belongs to ${e.claimed_local_actor?"you":String(e.actor_display_name)}.`:"This device is not assigned to anyone yet.",M=String(u.last_sync_at||u.last_sync_at_utc||""),U=String(u.last_ping_at||u.last_ping_at_utc||""),x=e.discovered_via_group_id?`Discovery: seen through Team ${e.discovered_via_group_id}. Discovery helps find devices; Space access above decides data access.`:e.discovered_via_coordinator_id?`Discovery: seen through coordinator ${e.discovered_via_coordinator_id}. Discovery helps find devices; Space access above decides data access.`:null,G=d$(o),A=B(null),[$,L]=I(s),[J,H]=I(()=>b.syncPeerFeedbackById.get(o)??null),[N,R]=I(!1),[j,V]=I("Save name"),[ge,le]=I(!1),[ce,be]=I(!1),[Y,fe]=I("Remove device"),[X,_e]=I(String(e.actor_id||"")),[he,Q]=I(!1),[$e,ue]=I("Save assignment"),W=xe(()=>{const ae=v$(X),Ge=ae.some(Mn=>Mn.value===X);return X&&!Ge&&ae.push({value:X,label:e.claimed_local_actor?"You":String(e.actor_display_name||"Current assignment")}),ae},[e.actor_display_name,e.claimed_local_actor,X,b.lastSyncActors,b.lastSyncPeers,b.lastSyncViewModel]);K(()=>{m&&p.total>0&&l$(o)},[p.total,o,m]),K(()=>{L(s),H(b.syncPeerFeedbackById.get(o)??null),R(!1),V("Save name"),le(!1),be(!1),fe("Remove device"),_e(String(e.actor_id||"")),Q(!1),ue("Save assignment")},[s,e.actor_id,o]),K(()=>{!G||!A.current||queueMicrotask(()=>A.current?.scrollIntoView({block:"center",behavior:window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"}))},[G]);async function oe(){if(!o)return;const ae=$.trim();if(!ae){const Ge={message:"Enter a friendly name for this device.",tone:"warning"};H(Ge),b.syncPeerFeedbackById.set(o,Ge),document.querySelector(`[data-device-name-input="${CSS.escape(o)}"]`)?.focus();return}R(!0),V("Saving…");try{const Ge=await r(o,ae);H(Ge),b.syncPeerFeedbackById.set(o,Ge),V("Save name")}catch{V("Retry")}finally{R(!1)}}async function We(){if(f){const ae=tu();if(!await Kt({title:`Sync ${s} before advanced rule review?`,description:ae?"This manual sync will use the current Space access and advanced filters until you review them in Teams.":"This manual sync will use the current Space access and advanced filters until a coordinator or manager reviews them in Teams.",confirmLabel:"Sync anyway",cancelLabel:ae?"Review in Teams first":"Cancel"}))return}le(!0);try{const ae=await i(e,w);H(ae),ae&&b.syncPeerFeedbackById.set(o,ae)}finally{le(!1)}}async function Me(){if(!o||!await Kt({title:`Remove device ${c}?`,description:"This removes the local record for this paired device on this machine.",confirmLabel:"Remove device",cancelLabel:"Keep device",tone:"danger"}))return;be(!0),fe("Removing…");let ae=!1;try{await n(o,c),ae=!0}catch{fe("Retry remove")}finally{be(!1),ae&&fe("Remove device")}}async function tt(){if(o){Q(!0),ue("Saving…");try{const ae=await t(o,X||null);H(ae),b.syncPeerFeedbackById.set(o,ae),ue("Save assignment")}catch{ue("Retry")}finally{Q(!1)}}}const un=q$()===o&&o!=="",Lt=`device-drawer-${o||"unknown"}`,kt=V$(e),$t=M?`Sync: ${rr(M)}`:"Sync: never",nt=tu(),Mt=`${un?"Collapse":"Expand"} device ${s}`;return a(ga,{asChild:!0,open:un,onOpenChange:ae=>{ae?Rb(o):ws===o&&Rb(null)},children:a("div",{ref:A,className:"peer-card","data-peer-device-id":o||void 0,children:[a(Jf,{asChild:!0,children:a("button",{"aria-label":Mt,className:"device-row-head device-row-head--trigger",type:"button",children:[a(K$,{state:kt}),a("span",{className:"device-row-name",title:o||void 0,children:s}),d?a("span",{"aria-label":d.label,className:"peer-direction",role:"img",title:d.label,children:d.glyph}):null,a("span",{className:"device-row-chips",children:[a("span",{className:`badge ${l.isWarning?"badge-offline":"badge-online"}`,children:l.badgeLabel}),f?a("span",{className:"badge actor-badge",children:"Review advanced rules"}):null,a("span",{className:`badge ${p.isWarning?"badge-offline":"actor-badge"}`,title:"Spaces are the hard access boundary; advanced filters only narrow inside them.",children:p.badgeLabel}),h.badgeLabel?a("span",{className:"badge badge-offline",title:"Inbound ops rejected by the sharing-domain scope gate. Expand for reason codes.",children:h.badgeLabel}):null,g.badgeLabel?a("span",{className:"badge badge-offline",title:"Review whether explicit Space access matches this device's intended role.",children:g.badgeLabel}):null,e.discovered_via_group_id?a("span",{className:"badge actor-badge",title:`Discovered through coordinator group ${e.discovered_via_group_id}`,children:`via ${e.discovered_via_group_id}`}):null]}),a("span",{className:"device-row-meta",children:$t}),a("span",{"aria-hidden":"true",className:"device-row-chevron",children:a(W$,{})})]})}),a(va,{"aria-label":`Device actions for ${s}`,className:"device-row-drawer",id:Lt,children:[a("div",{className:"peer-actions",children:[a("button",{type:"button",className:"settings-button",disabled:ge,onClick:()=>{We()},title:w?void 0:"Address details are hidden; sync will target this device by ID.",children:ge?"Syncing…":"Sync now"}),a("div",{className:"sync-labeled-field",children:[a("label",{className:"sync-labeled-field-caption",htmlFor:`device-name-${o||"unknown"}`,children:"Device name"}),a(Se,{"aria-label":`Friendly name for ${s}`,className:"peer-scope-input","data-device-name-input":o||void 0,disabled:N,id:`device-name-${o||"unknown"}`,placeholder:"Friendly device name",type:"text",value:$,onInput:ae=>L(ae.currentTarget.value)})]}),a("button",{type:"button",className:"settings-button",disabled:N,onClick:()=>{oe()},children:j}),a("button",{type:"button",className:"settings-button danger",disabled:ce,onClick:()=>{Me()},children:Y})]}),a("div",{className:"peer-scope",children:[G?a("div",{className:"peer-meta",children:nt?"Review this device's Space access and advanced rules in Teams if the defaults are too broad.":"A coordinator or manager can review this device's Space access and advanced rules in Teams if the defaults are too broad."}):f?a("div",{className:"peer-meta",children:"Advanced rule review is still pending for this device."}):null,a("div",{className:"peer-scope-summary",children:"Device details"}),a("div",{className:"peer-addresses",children:P}),x?a("div",{className:"peer-meta",children:x}):null,a("div",{className:"peer-meta",children:[M?`Sync: ${rr(M)}`:"Sync: never",U?`Ping: ${rr(U)}`:"Ping: never"].join(" · ")}),a("div",{className:"peer-scope-summary",children:"Space access"}),a("div",{className:"peer-meta",children:p.total>0?"These Spaces are the hard access boundary for this device.":p.emptyMessage}),p.domains.length>0?a("ul",{className:"peer-scope-chips","aria-label":"Authorized Spaces",children:p.domains.map(ae=>a("li",{className:"peer-scope-chip",title:ae.detail,children:ae.label},ae.scopeId))}):null,g.isVisible?a("div",{className:"settings-note",role:"status",children:[a("strong",{children:g.title}),a("div",{children:g.message}),a("div",{children:g.detail})]}):null,a("div",{className:"peer-meta",children:_.note}),a("div",{className:"peer-scope-summary",children:"Space sync progress"}),a("div",{className:"peer-meta",children:v.total>0?"Per-Space progress for this device. Open details to see technical identifiers.":v.emptyMessage}),v.rows.length>0?a("ul",{className:"peer-scope-rejections-list","aria-label":"Per-Space sync progress",children:v.rows.map(ae=>a("li",{title:ae.detail,children:[a("span",{className:"peer-scope-rejection-label",children:ae.label}),a("span",{className:`badge ${ae.status==="received"?"badge-online":"actor-badge"}`,children:ae.badgeLabel})]},ae.scopeId))}):null,h.total>0?a("div",{className:"peer-scope-rejections","data-peer-rejection-count":h.total,children:[a("div",{className:"peer-scope-summary",children:"Sharing-rule rejections (24h)"}),a("div",{className:"peer-meta",children:"Inbound ops the local fail-closed gate refused. Diagnostics never expose op payloads."}),a("ul",{className:"peer-scope-rejections-list",children:h.reasons.map(ae=>a("li",{children:[a("span",{className:"peer-scope-rejection-label",children:ae.label}),a("span",{className:"peer-scope-rejection-count",children:ae.count.toLocaleString()})]},ae.reason))}),h.lastAt?a("div",{className:"peer-meta",children:["Last rejected ",rr(h.lastAt)]}):null]}):null,a("div",{className:"peer-scope-summary",children:"Who this device belongs to"}),a("div",{className:"peer-meta",children:E}),e.claimed_local_actor?a("div",{className:"peer-meta",children:J$(e.claimed_local_actor_scope)}):null,a("div",{className:"peer-actor-row",children:[a("div",{className:"sync-radix-select-host sync-actor-select-host",children:a(cn,{ariaLabel:`Assigned person for ${s}`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:he,itemClassName:"sync-radix-select-item",onValueChange:_e,options:W,placeholder:"No person assigned yet",triggerClassName:"sync-radix-select-trigger sync-actor-select",value:X,viewportClassName:"sync-radix-select-viewport"})}),a("button",{type:"button",className:"settings-button",disabled:he,onClick:()=>{tt()},children:$e})]}),a("div",{className:"peer-scope-summary",children:"Advanced sharing rules"}),a("div",{className:"peer-meta",children:[_.statusLabel,". ",_.summary," ",_.note]}),nt?a("div",{className:"peer-actions",children:a("button",{type:"button",className:"settings-button",onClick:Y$,children:"Manage Spaces in Teams"})}):a("div",{className:"peer-meta",children:"Space access is managed in Teams by a coordinator or manager."}),a(hr,{feedback:J})]})]})]})})}function Q$(e){const t=b.syncPeersSectionFeedback,n=b.lastSyncStatus,r=n?.daemon_state==="disabled"||n?.enabled===!1;return e.peers.length?a(te,{children:[a(hr,{feedback:t}),e.peers.map(i=>{const o=String(i.peer_device_id||i.name||"unknown-peer");return a(X$,{peer:i,...e},o)})]}):a(te,{children:[a(hr,{feedback:t}),a(Eb,{detail:r?"Turn on sync in Settings → Device Sync first. Then use Invite a teammate or Paste an invite above to connect another device.":"Use Invite a teammate above to share a join code, or Paste an invite to enroll this device on an existing team.",title:"No teammates yet"})]})}function Z$(e,t){Ze(e,a(Q$,{...t}))}var dn=async()=>{},Ss="";function nu(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput");t&&(t.disabled=e),n&&(n.disabled=e)}function eM(e){dn=e}function tM(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");if(!e)return;Dn("syncActorsSkeleton"),nu(!1);const n=pb({actors:b.lastSyncActors,peers:b.lastSyncPeers,duplicatePeople:b.lastSyncViewModel?.duplicatePeople}),r=n.visibleActors;t&&(t.textContent=r.length?"Manage people here, then assign devices below.":"No named people yet. Create a person here, then assign devices below so sync ownership is easier to review.",n.hiddenLocalDuplicateCount>0&&(t.textContent+=` ${n.hiddenLocalDuplicateCount} unresolved duplicate ${n.hiddenLocalDuplicateCount===1?"entry is":"entries are"} hidden here until reviewed in Needs attention.`)),O$(e,{actors:r,hiddenLocalDuplicateCount:n.hiddenLocalDuplicateCount,onRename:async(i,o)=>{await yw(i,o),await dn()},onMerge:async(i,o)=>{try{await Wu(i,o),ne("People combined. Assigned devices moved to the selected person."),await dn()}catch(s){throw ne(et(s,"Failed to combine people."),"warning"),s}},onDeactivate:async i=>{try{await bw(i),ne("Person removed. Assigned devices have been unassigned."),await dn()}catch(o){throw ne(et(o,"Failed to remove person."),"warning"),o}}})}function nM(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");nu(!0),t&&(t.textContent="People controls are temporarily unavailable. Refresh this page to retry. Device status and sync health are still available below while this recovers."),e&&mr(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. When the people endpoint responds again, named people will reload here."})}function rM(){const e=document.getElementById("syncProjectShareOperations");if(!e)return;D$(e,{operations:b.lastShareOperations,onAdvance:n=>cw(n),onLoadOperation:n=>sw(n),onReload:dn});const t=document.getElementById("syncProjectShareOperationsMeta");t&&(t.textContent=b.shareOperationsLoadError?"Project sharing status could not be refreshed. Existing device diagnostics remain available below.":b.lastShareOperations.length>0?"Project access is grouped by Person. Devices appear after invitation acceptance.":"Share a project from Projects to invite a teammate.")}function ru(){const e=document.getElementById("syncPeers");if(!e)return;Dn("syncPeersSkeleton");const t=b.lastSyncPeers,n=Array.isArray(t)?t:[];h$(b.syncPeersSectionFeedback,n)&&(b.syncPeersSectionFeedback=null),Z$(e,{peers:n,onRename:async(r,i)=>{try{return await ju(r,i),await dn(),{message:"Device name saved.",tone:"success"}}catch(o){return{message:et(o,"Failed to save device name."),tone:"warning"}}},onSync:async(r,i)=>{try{const o=String(r?.peer_device_id||""),s=ib(await Gs({address:i,peerDeviceId:o||void 0}));let c;s.ok?o&&Vd(o)?c={message:`Triggered sync for ${r?.name||(o?o.slice(0,8):"unknown")}. ${tu()?"Review Space access and advanced rules in Teams if this device needs tighter sharing.":"A coordinator or manager can review Space access and advanced rules in Teams if this device needs tighter sharing."}`,tone:"warning"}:c={message:s.message,tone:"success"}:c={message:s.message,tone:"warning"};try{await dn()}catch{c={message:"Sync started, but this view has not refreshed yet. Refresh the page or use Sync now again before retrying.",tone:"warning"}}return c}catch(o){return{message:et(o,"Failed to trigger sync."),tone:"warning"}}},onRemove:async(r,i)=>{try{await Ou(r);const o={message:`Removed peer ${i}.`,tone:"success"};return b.syncPeerFeedbackById.delete(r),b.syncPeersSectionFeedback={...o,relatedPeerDeviceId:r},await dn(),o}catch(o){return{message:et(o,"Failed to remove peer. The local peer entry is still here."),tone:"warning"}}},onAssignActor:async(r,i)=>{try{return await Y_(r,i),await dn(),{message:i?"Device assignment updated.":"Device assignment cleared.",tone:"success"}}catch(o){return{message:et(o,"Failed to update device assignment. The current assignment is unchanged."),tone:"warning"}}}})}function iM(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta"),n=document.getElementById("syncPeers");nu(!0),t&&(t.textContent="People and device details are unavailable right now. Refresh this page to retry once local sync status is reachable again."),e&&mr(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. Named people will reload here once the local sync status endpoint responds again."}),n&&mr(n,{title:"Devices unavailable right now.",detail:"Refresh this page to retry. When sync is reachable again, paired devices will reload here so you can rename, assign, or re-pair them."})}function Db(){const e=document.getElementById("syncLegacyClaims"),t=document.getElementById("syncLegacyDeviceSelectMount"),n=document.getElementById("syncLegacyClaimsMeta");!e||!t||!n||G$({devices:Array.isArray(b.lastSyncLegacyDevices)?b.lastSyncLegacyDevices:[],meta:n,mount:t,onValueChange:r=>{r!==Ss&&(Ss=r,Db())},panel:e,value:Ss})}function oM(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput"),r=document.getElementById("syncLegacyClaimButton");n?.addEventListener("keydown",i=>{Rr(i,{onSubmit:()=>t?.click(),disabled:!t||t.disabled})}),t?.addEventListener("click",async()=>{if(!t||!n)return;const i=String(n.value||"").trim();if(!i){ti(n,"Enter a name for the person.");return}ho(n),t.disabled=!0,n.disabled=!0,t.textContent="Creating…";try{await vw(i),ne("Person created."),n.value="",await e()}catch(o){ne(et(o,"Failed to create person."),"warning"),t.textContent="Retry",t.disabled=!1,n.disabled=!1;return}t.textContent="Create person",t.disabled=!1,n.disabled=!1}),r?.addEventListener("click",async()=>{const i=String(Ss||"").trim();if(!i||!r||!await Kt({title:`Attach history from ${i}?`,description:"This updates legacy provenance so the older device history is attached to you on this device.",confirmLabel:"Attach history",cancelLabel:"Cancel",tone:"danger"}))return;r.disabled=!0;const o=r.textContent||"Attach device history";r.textContent="Attaching…";try{await _w(i),ne("Old device history attached to you."),await e()}catch(s){ne(et(s,"Failed to attach old device history."),"warning"),r.textContent="Retry",r.disabled=!1;return}r.textContent=o,r.disabled=!1})}function aM(){return window.location.hash.replace(/^#/,"")==="sync/diagnostics"?"diagnostics":"main"}function iu(e=aM()){const t=document.getElementById("syncMainView"),n=document.getElementById("syncDiagnosticsView");!t||!n||(e==="diagnostics"?(t.hidden=!0,n.hidden=!1):(t.hidden=!1,n.hidden=!0))}var Lb=!1;function sM(){Lb||(Lb=!0,window.addEventListener("hashchange",()=>{iu()}))}var zt={invitePolicy:"auto_admit",loadSyncData:async()=>{}};function cM(e){zt.loadSyncData=e}var lM=[{value:"auto_admit",label:"Auto-admit"},{value:"approval_required",label:"Approval required"}];function dM(){const e=document.getElementById("syncCreateInviteButton"),t=document.getElementById("syncInviteAdminHint");if(!e||!t)return;const n=b.lastCoordinatorAdminStatus?.readiness,r=String(b.lastCoordinatorAdminStatus?.active_group||"").trim();if(n==="ready"){e.disabled=!1,t.hidden=!1,t.textContent=r?`Teams is ready for ${r}. Advanced admin tools now live in Teams.`:"Teams is ready. Advanced admin tools now live in Teams.";return}const i=n==="partial"?"Finish Teams setup before creating remote invites. Use Teams to check what is missing.":"Configure a coordinator URL, Team, and admin secret before creating remote invites. Use Teams to finish setup.";e.disabled=!0,t.hidden=!1,t.textContent=i}function ou(){const e=document.getElementById("syncAdminDisclosureMount");e&&vL(e,{open:vb,onOpenChange:t=>{i$(t),ou(),Ts(),au()}})}function uM(){const e=document.getElementById("syncJoinPanel"),t=document.getElementById("syncJoinSection");!e||!t||e.parentElement!==t&&t.appendChild(e)}function au(){const e=document.getElementById("syncInviteOutput"),t=document.getElementById("syncInviteWarnings");if(!e)return;const n=String(b.lastTeamInvite?.encoded||"").trim();if(e.value=n,e.hidden=!n,t){const r=Array.isArray(b.lastTeamInvite?.warnings)?b.lastTeamInvite.warnings:[];t.textContent=r.join(" · "),t.hidden=r.length===0}}function Cs(){const e=document.getElementById("syncJoinFeedback");if(!e)return;const t=b.syncJoinFlowFeedback;e.textContent=t?.message||"",e.hidden=!t?.message,e.setAttribute("role",t?.tone==="warning"?"alert":"status"),e.setAttribute("aria-live",t?.tone==="warning"?"assertive":"polite"),e.className=`peer-meta${t?` ${t.tone==="warning"?"sync-inline-feedback warning":"sync-inline-feedback success"}`:""}`}function Ts(){const e=document.getElementById("syncInvitePolicyMount");e&&Ze(e,y(cn,{ariaLabel:"Join policy",contentClassName:"sync-radix-select-content sync-actor-select-content",id:"syncInvitePolicy",itemClassName:"sync-radix-select-item",onValueChange:t=>{const n=t==="approval_required"?"approval_required":"auto_admit";n!==zt.invitePolicy&&(zt.invitePolicy=n,Ts())},options:lM,triggerClassName:"sync-radix-select-trigger sync-actor-select",value:zt.invitePolicy,viewportClassName:"sync-radix-select-viewport"}))}function pM(e,t){ou(),Ts();const n=document.getElementById("syncNowButton"),r=document.getElementById("syncShareProjectsButton"),i=document.getElementById("syncCreateInviteButton"),o=document.getElementById("syncInviteGroup"),s=document.getElementById("syncInviteTtl"),c=document.getElementById("syncInviteOutput"),l=document.getElementById("syncJoinButton"),d=document.getElementById("syncJoinInvite"),u=document.getElementById("syncProjectInviteReview"),p=document.getElementById("syncProjectInviteContext"),m=document.getElementById("syncProjectInviteReviewHeading"),f=document.getElementById("syncRecipientName"),g=document.getElementById("syncRecipientDeviceName");let h="",v=0;r?.addEventListener("click",()=>{ea()||ne("Project sharing is unavailable. Refresh Projects and try again.","warning")});const _=async(w,S)=>{if(!u||!f||!g)return"other";const T=await Mu(w);if(S!==v||d?.value.trim()!==w)return"stale";if(T.kind!=="project_share_invite")return"other";const k=(T.projects??[]).map(P=>`${P.display_name} (${P.existing_memory_count} existing ${P.existing_memory_count===1?"memory":"memories"})`).join(", ");return p&&(p.textContent=`${T.inviter_name||"A teammate"} invited you${T.team_name?` through ${T.team_name}`:""} to share ${k||"selected projects"}.`),f.value=T.recipient_name??"",g.value=T.device_name??"",u.hidden=!1,h=w,l&&(l.textContent="Accept and start syncing"),m?.focus(),"project"};d?.addEventListener("input",()=>{v+=1,d.value.trim()!==h&&(h="",u&&(u.hidden=!0),l&&(l.textContent="Review invite"))}),i?.addEventListener("click",async()=>{if(!i||!o||!s||!c||i.disabled)return;const w=o.value.trim(),S=Number(s.value);let T=!0;if(w?ho(o):T=ti(o,"Team name is required."),!S||S<1?T=ti(s,"Must be at least 1 hour."):ho(s),!!T){i.disabled=!0,i.textContent="Creating…";try{const k=await Du({group_id:w,policy:zt.invitePolicy,ttl_hours:S||24});b.lastTeamInvite=k,au(),c.value=String(k.encoded||""),c.hidden=!1,c.focus(),c.select();const P=Array.isArray(k.warnings)?k.warnings:[];ne(P.length?`Invite created. Copy it above and review ${P.length===1?"1 warning":`${P.length} warnings`}.`:"Invite created. Copy the text above and share it with your teammate.",P.length?"warning":"success")}catch(k){ne(et(k,"Failed to create invite. Check the team name, invite lifetime, and coordinator reachability, then try again."),"warning"),i.textContent="Retry",i.disabled=!1;return}finally{i.disabled&&(i.disabled=!1,i.textContent="Create invite")}}}),d?.addEventListener("keydown",w=>{Rr(w,{onSubmit:()=>l?.click(),disabled:!l||l.disabled})}),l?.addEventListener("click",async()=>{if(!l||!d)return;const w=d.value.trim();if(!w){ti(d,"Paste a team invite or pairing payload.");return}if(ho(d),h!==w){const T=v;try{const k=await _(w,T);if(k==="project"||k==="stale")return}catch{}if(T!==v||d.value.trim()!==w)return;h=w,l.textContent="Accept invite";return}const S=u&&!u.hidden?{recipient_name:f?.value.trim()??"",device_name:g?.value.trim()??""}:void 0;if(S){const T=k=>!k||[...k].length>120||[...k].some(P=>/[\p{Cc}\p{Cf}]/u.test(P));if(T(S.recipient_name)){f&&ti(f,"Enter a valid name using 120 characters or fewer.");return}if(T(S.device_name)){g&&ti(g,"Enter a valid device name using 120 characters or fewer.");return}}l.disabled=!0,l.textContent="Accepting…";try{const T=await Fs(w,S);b.lastTeamJoin=T;const k=T,P=typeof k.type=="string"?k.type:"team_join";let E;if(P==="pair"){const M=String(T.peer_device_id??"").trim();E={message:M?`Paired with device ${M.slice(0,8)}. It will appear in People & devices.`:"Paired the device. It will appear in People & devices.",tone:"success"}}else if(P==="project_share"){const M=k.restart_required===!0||k.setup_state==="pending_inviter"||T.status==="pending_setup",U=typeof k.detail=="string"?k.detail.trim():"";E=M?{message:U||(k.restart_required===!0?"Project invitation accepted. Restart codemem to finish setup.":k.setup_state==="pending_inviter"?"Project invitation accepted. Waiting for the inviter to finish setup.":"Project invitation accepted. Setup is still pending."),tone:"warning"}:{message:"Project invitation accepted.",tone:"success"}}else E={message:T.status==="pending"?"Join request sent. Waiting for admin approval.":"Joined the team.",tone:"success"};b.syncJoinFlowFeedback=E,Cs(),d.value="",h="",u&&(u.hidden=!0);try{await t()}catch(M){E={message:et(M,"Accepted the invite, but this view has not refreshed yet."),tone:"warning"},b.syncJoinFlowFeedback=E,Cs()}}catch(T){b.syncJoinFlowFeedback={message:et(T,"Failed to accept. Check that the invite or pairing payload is complete and current, then try again."),tone:"warning"},Cs(),l.textContent="Retry",l.disabled=!1;return}finally{l.disabled&&(l.disabled=!1,l.textContent="Review invite")}}),n?.addEventListener("click",async()=>{if(n){n.disabled=!0,n.textContent="Syncing…";try{const w=ib(await Gs());ne(w.message,w.warning?"warning":void 0)}catch(w){ne(et(w,"Failed to start sync. Retry once, then run codemem sync doctor if the problem keeps coming back."),"warning"),n.textContent="Retry",n.disabled=!1;return}n.disabled=!1,n.textContent="Sync now",e()}})}function su({element:e,hidden:t=!1,restoreParent:n=null}){const r=B(null);return gt(()=>{e&&(e.hidden=t)},[e,t]),gt(()=>{const i=r.current;if(!(!i||!e))return e.parentElement!==i&&i.appendChild(e),()=>{!n||e.parentElement!==i||n.appendChild(e)}},[e,n]),a("div",{ref:r})}function mM({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:r}){return a(te,{children:[a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:["Invite a teammate.",a("span",{className:"sync-action-command",children:"Generate an invite when you want someone else to join this team from their device."})]}),a("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide invite form":"Invite a teammate"})]}),e?a(su,{element:e,hidden:!t,restoreParent:n}):null]})}function fM(){return a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:["Pair another device.",a("span",{className:"sync-action-command",children:"Copy a pairing command when you want to connect another one of your own devices."})]}),a("button",{type:"button",className:"settings-button sync-action-copy",onClick:e=>Pi("codemem sync pair --payload-only",e.currentTarget),children:"Copy pairing command"})]})}function hM({joinPanel:e,joinPanelOpen:t,joinRestoreParent:n,onToggle:r}){return a(te,{children:[a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:["Accept an invite or pairing.",a("span",{className:"sync-action-command",children:"Paste a team invite to join another team, or a pairing payload to connect another device."})]}),a("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide paste form":"Paste invite or pairing"})]}),e?a(su,{element:e,hidden:!t,restoreParent:n}):null]})}function gM({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,joinPanel:r,joinPanelOpen:i,joinRestoreParent:o,onToggleInvitePanel:s,onToggleJoinPanel:c,pairedPeerCount:l,presenceStatus:d}){const u=d==="not_enrolled";return a(te,{children:[u?a(te,{children:[a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:["Join this device.",a("span",{className:"sync-action-command",children:"Paste a team invite or pairing payload below to join an existing team or connect another of your devices."})]})}),r?a(su,{element:r,hidden:!1,restoreParent:o}):null,a("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0}),a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:["This device is not on the team yet.",a("span",{className:"sync-action-command",children:"Use Join this device above, or ask an admin to enroll it first."})]})})]}):a(te,{children:[a(hM,{joinPanel:r,joinPanelOpen:i,joinRestoreParent:o,onToggle:c}),a("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0})]}),u?null:a(mM,{invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:s}),!l&&d==="posted"?a(fM,{}):null]})}function ks({count:e,label:t}){return a("div",{className:"sync-section-heading",children:[a("div",{className:"sync-action-text sync-section-label",children:t}),e?a("span",{className:"badge actor-badge sync-section-count",children:e}):null]})}function Ns({children:e}){return a("div",{className:"section-meta sync-section-note",children:e})}function vM({item:e,onAction:t}){const[n,r]=I(!1);return a("div",{className:"sync-action",children:[a("div",{className:"sync-action-text",children:[e.title,a("span",{className:"sync-action-command",children:e.summary})]}),a("button",{type:"button",className:"settings-button",disabled:n,onClick:async()=>{r(!0);try{await t(e)}finally{r(!1)}},children:e.actionLabel||"Review"})]})}function yM({request:e,onApprove:t,onDeny:n}){const[r,i]=I(null),[o,s]=I(null),[c,l]=I("Approve"),[d,u]=I("Deny");return a("div",{className:"actor-row",children:[a("div",{className:"actor-details",children:a("div",{className:"actor-title",title:e.requestId||void 0,children:e.displayName})}),a("div",{className:"actor-actions",children:[a("button",{type:"button",className:"settings-button","aria-label":`${c} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("approve"),l("Approving…");try{s(await t(e)||null),l("Approve")}catch{l("Retry")}finally{i(null)}},children:c}),a("button",{type:"button",className:"settings-button","aria-label":`${d} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("deny"),u("Denying…");try{s(await n(e)||null),u("Deny")}catch{u("Retry")}finally{i(null)}},children:d})]}),a(hr,{feedback:o})]})}function bM({row:e,onInspectConflict:t,onRemoveConflict:n,onReview:r}){const[i,o]=I(null),[s,c]=I(null),l=e.actionLabel||"Pair with this device",[d,u]=I(l),[p,m]=I("Remove broken device record");return a("div",{className:"peer-card peer-card--padded","data-discovered-device-id":e.deviceId,children:[a("div",{className:"peer-title",children:[a("strong",{title:e.displayTitle||void 0,children:e.displayName}),a("span",{className:`badge actor-badge${e.availabilityLabel==="Offline"?"":" local"}`,children:e.availabilityLabel}),a("span",{className:"badge actor-badge",children:e.connectionLabel}),e.approvalBadgeLabel?a("span",{className:"badge actor-badge",children:e.approvalBadgeLabel}):null]}),a("div",{className:"peer-meta",children:e.note}),a("div",{className:"peer-actions",children:[e.mode==="accept"?a("button",{type:"button",className:"settings-button","aria-label":`${d} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{o("review"),u("Pairing…"),c({message:`Pairing ${e.displayName}. Keep this page open while the device is approved and refreshed.`,tone:"success"});try{c(await r(e)||null),u(e.actionLabel||l)}catch{c({message:`Pairing ${e.displayName} failed. Try again.`,tone:"warning"}),u("Retry")}finally{o(null)}},children:d}):null,(e.mode==="stale"||e.mode==="ambiguous"||e.mode==="scope-pending"||e.mode==="setup-blocked")&&e.actionMessage?a("div",{className:"peer-meta",children:e.actionMessage}):null,e.mode==="paired"&&e.pairedMessage?a("div",{className:"peer-meta",children:e.pairedMessage}):null,e.mode==="conflict"?a(te,{children:[a("button",{type:"button",className:"settings-button","aria-label":`Open details for ${e.displayName}`,disabled:i!==null,onClick:()=>t(e),children:"Open device details"}),a("button",{type:"button",className:"settings-button danger","aria-label":`${p} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{o("remove"),m("Removing…");try{c(await n(e)||null),m("Remove broken device record")}catch{m("Retry")}finally{o(null)}},children:p})]}):null]}),a(hr,{feedback:s})]})}function _M(e){const t=e.actionItems.length>0,n=e.actionableCount>e.actionItems.length,r=t||n||e.primaryStatus.state!=="healthy";return a(te,{children:[r?a(ks,{label:"Needs attention"}):null,r?a(Ns,{children:"Start here when something needs review, re-pairing, or approval."}):null,e.primaryStatus.nextAction?a("div",{className:"sync-action","data-primary-sync-state":e.primaryStatus.state,children:a("div",{className:"sync-action-text",children:[e.primaryStatus.badgeLabel,a("span",{className:"sync-action-command",children:e.primaryStatus.nextAction})]})}):null,t?e.actionItems.map(i=>a(vM,{item:i,onAction:e.onAttentionAction},i.id)):null,!t&&!n&&e.primaryStatus.state==="healthy"?a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:"No urgent team work right now."})}):null,!t&&n?a("div",{className:"sync-action",children:a("div",{className:"sync-action-text",children:"More team follow-up is listed below when you are ready."})}):null]})}function wM({children:e}){return e?a(te,{children:[a(ks,{label:"Add devices & teammates"}),a(Ns,{children:"Use these flows when you are enrolling, inviting, or pairing something new."}),e]}):null}function SM({mount:e,rows:t,onInspectConflict:n,onRemoveConflict:r,onReview:i}){return!e||!t.length&&!b.syncDiscoveredFeedback?null:en(a(te,{children:[a(ks,{count:t.length||void 0,label:"Devices waiting for review"}),a(Ns,{children:"Review team devices here when they still need trust, re-pairing, or approval on this machine."}),a(hr,{feedback:b.syncDiscoveredFeedback}),t.map(o=>a(bM,{row:o,onInspectConflict:n,onRemoveConflict:r,onReview:i},o.deviceId))]}),e)}function CM({mount:e,requests:t,onApprove:n,onDeny:r}){return!e||!t.length&&!b.syncJoinRequestsFeedback?null:en(a(te,{children:[a(ks,{count:t.length||void 0,label:"Join requests to review"}),a(Ns,{children:"Approve or deny requests here before those devices become part of the team."}),a(hr,{feedback:b.syncJoinRequestsFeedback}),t.map(i=>a(yM,{request:i,onApprove:n,onDeny:r},i.requestId))]}),e)}function $b(e){return a(te,{children:[a(_M,{...e}),a(wM,{children:e.children}),a(CM,{mount:e.joinRequestsMount,requests:e.pendingJoinRequests,onApprove:e.onApproveJoinRequest,onDeny:e.onDenyJoinRequest}),a(SM,{mount:e.discoveredListMount,rows:e.discoveredRows,onInspectConflict:e.onInspectConflict,onRemoveConflict:e.onRemoveConflict,onReview:e.onReviewDiscoveredDevice})]})}function Mb(e){e&&(e.textContent="")}function xs(e){e instanceof HTMLElement&&(e.classList.remove("sync-attention-target"),e.offsetWidth,e.classList.add("sync-attention-target"),window.setTimeout(()=>e.classList.remove("sync-attention-target"),900))}function TM(){return typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}function go(){return TM()?"auto":"smooth"}var cu="syncTeamActionsMount";function kM(e,t,n){e.hidden=!1,e.textContent=n.badgeLabel,t.textContent=n.meta,n.state==="healthy"?e.className="sync-online-badge":n.state==="disabled"||n.state==="pending-setup"||n.state==="not-enrolled"||n.state==="reachable"?e.className="sync-online-badge sync-online-offline":e.className="sync-online-badge sync-online-error"}function NM(e,t){const n=document.createElement("div");n.id=cu,e.appendChild(n),Ze(n,y($b,{actionItems:[],actionableCount:0,discoveredListMount:null,discoveredRows:[],joinRequestsMount:null,onApproveJoinRequest:async()=>null,onAttentionAction:async()=>{},onDenyJoinRequest:async()=>null,onInspectConflict:()=>{},onRemoveConflict:async()=>null,onReviewDiscoveredDevice:async()=>null,pendingJoinRequests:[],presenceStatus:"unknown",primaryStatus:t}))}function Ob(e,t){const n=document.getElementById(cu);n&&(Qr(n),n.remove()),Mb(e),t.forEach(r=>{Mb(r)})}function Ps(){const e=document.getElementById("syncTeamMeta"),t=document.getElementById("syncSetupPanel"),n=document.getElementById("syncTeamActions");if(!e||!t||!n)return;ou(),Ts(),au(),Cs(),dM();const r=document.getElementById("syncInvitePanel"),i=document.getElementById("syncAdminSection"),o=document.getElementById("syncJoinPanel"),s=document.getElementById("syncJoinSection"),c=document.getElementById("syncJoinRequests"),l=document.getElementById("syncCoordinatorDiscovered"),d=document.getElementById("syncCoordinatorDiscoveredMeta"),u=document.getElementById("syncCoordinatorDiscoveredList");Dn("syncTeamSkeleton"),uM();const p=b.lastSyncCoordinator,m=b.lastSyncViewModel||{primaryStatus:fb({status:b.lastSyncStatus,coordinator:p,peers:b.lastSyncPeers,shareOperations:b.lastShareOperations,shareOperationsLoadError:b.shareOperationsLoadError}),summary:{connectedDeviceCount:0,seenOnTeamCount:0,offlineTeamDeviceCount:0},duplicatePeople:[],attentionItems:[]},f=A=>{if(A.kind==="possible-duplicate-person"){const H=document.getElementById("syncActorsList");H instanceof HTMLElement&&(H.scrollIntoView({block:"center",behavior:go()}),xs(H));return}const $=String(A.deviceId||"").trim();if(!$)return;if(A.kind==="name-device"){const H=document.querySelector(`[data-device-name-input="${CSS.escape($)}"]`);if(H instanceof HTMLInputElement){H.scrollIntoView({block:"center",behavior:go()}),H.focus(),H.select(),xs(H);return}}const L=document.querySelector(`[data-peer-device-id="${CSS.escape($)}"]`);if(L instanceof HTMLElement){L.scrollIntoView({block:"center",behavior:go()}),xs(L);return}const J=document.querySelector(`[data-discovered-device-id="${CSS.escape($)}"]`);J instanceof HTMLElement&&(J.scrollIntoView({block:"center",behavior:go()}),xs(J))},g=async A=>{const $=Array.isArray(A.actorIds)?A.actorIds.map(R=>String(R||"").trim()).filter(Boolean):[],L=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).filter(R=>$.includes(String(R?.actor_id||"").trim()));if(L.length<2){ne("This duplicate review is outdated. Refresh the card and review the remaining people entries.","warning");return}const J=await wP({title:"Review possible duplicate people",summary:A.title.replace(/^Possible duplicate person:\s*/,""),actors:L.map(R=>({actorId:String(R?.actor_id||""),label:String(R?.display_name||R?.actor_id||"Unknown person"),isLocal:!!R?.is_local}))});if(J.action==="different-people"){p$($,"different-people"),ne("Okay. I will keep these people separate on this device."),await zt.loadSyncData();return}if(J.action!=="merge")return;const H=L.find(R=>String(R?.actor_id||"")===J.primaryActorId),N=L.find(R=>String(R?.actor_id||"")===J.secondaryActorId);if(!H?.actor_id||!N?.actor_id){ne("Could not determine which people to combine. Refresh People & devices and try the review again.","warning");return}try{await Wu(String(H.actor_id),String(N.actor_id)),m$($),ne(`Combined duplicate people into ${String(H.display_name||H.actor_id)}.`),await zt.loadSyncData()}catch(R){try{await zt.loadSyncData()}catch{}ne(et(R,"Failed to combine these people."),"warning")}},h=async A=>await Il({title:"Pair with this device",description:"Choose a friendly name for this device before pairing it on this machine.",initialValue:A,placeholder:"Desk Mini",confirmLabel:"Pair",cancelLabel:"Cancel",validate:$=>$.trim()?null:"Enter a device name to pair this device."}),v=!!p?.configured,_=t$(p);e.title=v?String(p.coordinator_url||"").trim():"";const w=document.getElementById("syncOnlineBadge");if(w?kM(w,e,m.primaryStatus):e.textContent=m.primaryStatus.meta,!v){Ob(n,[c,u]),t.hidden=!1,n.hidden=!1,NM(n,m.primaryStatus),c&&(c.hidden=!0),l&&(l.hidden=!0);return}t.hidden=!0,n.hidden=!1;const S=String(p.presence_status||""),T=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[],k=Array.isArray(m.attentionItems)?m.attentionItems:[],P=(Array.isArray(p.discovered_devices)?p.discovered_devices:[]).map(A=>{const $=String(A.device_id||"").trim(),L=ab({coordinatorName:String(A.display_name||"").trim(),deviceId:$})||"Discovered device",J=$&&L!==$?$:null,H=String(A.fingerprint||"").trim(),N=(Array.isArray(A.groups)?A.groups.map(Q=>String(Q||"").trim()).filter(Boolean):[]).length>1,R=T.find(Q=>String(Q?.peer_device_id||"")===$),j=rb({device:A,pairedLocally:!!R}),V=String(R?.fingerprint||"").trim(),ge=!!R&&!!H&&!!V&&V!==H,le=!_&&SL({device:A,hasAmbiguousCoordinatorGroup:N,pairedLocally:!!R}),ce=Array.isArray(A.addresses)?A.addresses:[],be=Number(A.address_count??0),Y=Number.isFinite(be)&&be>0?be:0,fe=[ce.length?ce.map(Q=>Ei()?Sb(String(Q||"")):String(Q||"")).filter(Boolean).join(" · "):Y>0?`${Y} ${A.stale?"last-known":"fresh"} ${Y===1?"address":"addresses"} hidden`:"No fresh addresses"];!ce.length&&J&&fe.push(`device id: ${$}`);let X=null,_e=le?"accept":"none",he=null;return ge?_e="conflict":_&&(!R||j.state==="needs-your-approval")?(X=_.message,_e="setup-blocked"):N?(X="This device appears in multiple coordinator groups. Review team setup first or ask an admin to clean up the duplicate enrollment before approving it here.",_e="ambiguous"):R&&Vd($)?(X="Review this device's Space access and advanced rules in Teams before you sync it.",_e="scope-pending"):R?.last_error?(fe.push(`error: ${String(R.last_error)}`),le||(_e="paired")):R?.status?.peer_state?(fe.push(`status: ${String(R.status.peer_state)}`),le||(_e="paired")):!R&&A.stale?(X="Wait for a fresh coordinator presence update, then review this device again here.",_e="stale"):R&&!le&&(_e="paired"),_e==="paired"&&(he=j.state==="waiting-for-other-device"?j.description||"Waiting on the other device.":String(R?.last_error||"").toLowerCase().includes("401")&&String(R?.last_error||"").toLowerCase().includes("unauthorized")?"Waiting for the other device to trust this one before sync can work.":null),{actionMessage:X,actionLabel:j.actionLabel||(R?"Review device":"Pair with this device"),approvalBadgeLabel:j.badgeLabel,availabilityLabel:A.stale?"Offline":"Available",connectionLabel:ge?gb.conflicts:R?gb.pairedLocally:"Not connected on this device",deviceId:$,displayName:L,displayTitle:J,fingerprint:H,mode:_e,note:fe.join(" · "),pairedMessage:he}}),E=[],M=P.filter(A=>A.mode!=="paired"&&A.mode!=="none"&&A.mode!=="scope-pending"),U=P.filter(A=>A.mode==="accept"||A.mode==="scope-pending").length,x=k.length+E.length+U;l&&(l.hidden=M.length===0&&!b.syncDiscoveredFeedback),d&&(d.textContent=M.length?"Pair with a teammate's device to see it appear in People & devices and start syncing.":""),c&&(c.hidden=E.length===0&&!b.syncJoinRequestsFeedback),Ob(n,[c,u]);const G=document.createElement("div");G.id=cu,n.appendChild(G),Ze(G,y($b,{actionItems:k,actionableCount:x,children:y(gM,{invitePanel:r,invitePanelOpen:Gd,inviteRestoreParent:i,joinPanel:o,joinPanelOpen:Hd,joinRestoreParent:s,onToggleInvitePanel:()=>{r&&(o$(!Gd),Ps())},onToggleJoinPanel:()=>{o&&(a$(!Hd),Ps())},pairedPeerCount:Number(p.paired_peer_count||0),presenceStatus:S}),discoveredListMount:u,discoveredRows:M,joinRequestsMount:c,onApproveJoinRequest:async()=>null,onAttentionAction:async A=>{if(A.kind==="possible-duplicate-person"){await g(A);return}f(A)},onDenyJoinRequest:async()=>null,onInspectConflict:A=>{const $=document.querySelector(`[data-peer-device-id="${CSS.escape(A.deviceId)}"]`);if($ instanceof HTMLElement){$.scrollIntoView({block:"center",behavior:go()}),ne(`Opened the conflicting local device record for ${A.displayName}.`,"warning");return}ne("The conflicting local device record is not visible yet. Scroll to People & devices and try again.","warning")},onRemoveConflict:async A=>{if(!await Kt({title:`Remove ${A.displayName}?`,description:"This deletes the broken local device record. You can review this device again after the screen refreshes.",confirmLabel:"Remove device record",cancelLabel:"Keep device record",tone:"danger"}))return null;try{await Ou(A.deviceId);const $={message:`Removed the broken local device record for ${A.displayName}. If it is still available, review it again from Next steps or Devices seen on team.`,tone:"success"};return b.syncDiscoveredFeedback=$,await zt.loadSyncData(),$}catch($){return{message:et($,"Failed to remove the broken local device record. The old local record is still present in People & devices."),tone:"warning"}}},onReviewDiscoveredDevice:async A=>{try{const $=await h(A.displayName);if(!$)return null;const L=await X_(A.deviceId,A.fingerprint),J=String(L?.name||A.displayName||"").trim()||A.displayName;b.pendingAcceptedSyncPeers=[...Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(N=>String(N?.peer_device_id||"").trim()!==A.deviceId):[],{peer_device_id:A.deviceId,name:J,fingerprint:A.fingerprint,addresses:[],claimed_local_actor:!1,status:{peer_state:"degraded"},last_error:"Waiting for the other device to approve this one."}],c$(A.deviceId);let H={message:A.approvalBadgeLabel==="Needs your approval"?`Approved ${A.displayName} on this device. Two-way trust should be ready once both devices refresh.`:`Step 1 complete on this device for ${A.displayName}. Finish onboarding on the other device so both sides trust each other for sync.`,tone:"success"};try{$.trim()!==J.trim()&&(await ju(A.deviceId,$.trim()),b.pendingAcceptedSyncPeers=b.pendingAcceptedSyncPeers.map(N=>String(N?.peer_device_id||"").trim()===A.deviceId?{...N,name:$.trim()}:N),H={message:`Connected ${$.trim()} and saved its name.`,tone:"success"})}catch(N){H={message:et(N,"Device connected, but naming did not finish."),tone:"warning"}}b.syncDiscoveredFeedback=H;try{await zt.loadSyncData()}catch(N){H={message:et(N,"Device connected, but the screen did not refresh yet. Refresh this page before trying the next step."),tone:"warning"},b.syncDiscoveredFeedback=H}return H}catch($){return{message:et($,"Failed to review this device. Wait for a fresh presence update and try again."),tone:"warning"}}},pendingJoinRequests:E,presenceStatus:S,primaryStatus:m.primaryStatus}))}function xM(e){switch(e){case"cwd":return"Matched by folder";case"git_remote":return"Matched by git remote";case"workspace_id":return"Matched by workspace";case"project":return"Matched by project name";case"unmapped":return"Missing project identity";default:return`Matched by ${e.replace(/_/g," ")}`}}function ni(e){const t=e.displayProject.toLowerCase();return t.includes("fatal:")||t.includes("not a git repository")||t==="unknown project"||e.identitySource==="unmapped"}function jb(e){return ni(e)?"Unclear project identity":e.displayProject}function Tt(e){return(e.reassignableMemoryCount??e.memoryCount)>0}function PM(e,t){return e.suggestedScopeId?` · suggested ${t.find(n=>n.scopeId===e.suggestedScopeId)?.label||"Space"}`:""}function AM(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function EM(e,t){return t.find(n=>n.scopeId===e)?.label||"selected Space"}function IM(e){switch(e){case"coordinator":return"Team Space";case"local":return"Local Space";default:return"Other Space"}}function RM(e){if(!e)return"date unavailable";const t=new Date(e);return Number.isNaN(t.getTime())?e:new Intl.DateTimeFormat("en-US",{day:"numeric",month:"short",timeZone:"UTC",year:"numeric"}).format(t)}function DM(e){return e.gitRemote?e.gitRemote:e.cwd?e.cwd:e.project?e.project:"source identity unavailable"}function LM({group:e}){const t=e.memorySamples??[],n=t.length;return a("details",{className:"legacy-review-samples",children:[a("summary",{children:["Inspect affected memories",n?` (${n} sample${n===1?"":"s"})`:""]}),a("div",{className:"legacy-review-cleanup-note",children:"Showing representative memories from this project group before reassignment. Local memories can be reassigned; peer-owned memories stay in review on this device."}),t.length>0?a("ul",{className:"legacy-review-sample-list",children:t.map(r=>a("li",{className:"legacy-review-sample",children:[a("div",{className:"legacy-review-sample-title",children:r.title}),a("div",{className:"legacy-review-group-meta",children:[r.kind||"memory"," · ",RM(r.updatedAt??r.createdAt)," ","·"," ",r.ownership==="local"?"local, reassignable":"peer-owned, stays in review"]}),r.bodyPreview?a("div",{className:"legacy-review-sample-body",children:r.bodyPreview}):null,a("div",{className:"legacy-review-group-meta mono",children:DM(r)})]},r.id))}):a("div",{className:"legacy-review-cleanup-note",children:"No samples are available for this group. Refresh Sync and try again before reassigning."})]})}function Fb(e,t,n){let r=(e instanceof Error?e.message:"Unable to reassign legacy review memories.").replace(/sharing domain/gi,"Space");return t&&(r=r.replace(new RegExp(`\\b${AM(t)}\\b`,"g"),EM(t,n))),r}function $M(e,t){const n=e.suggestedScopeId?t.find(r=>r.scopeId===e.suggestedScopeId)?.label:"";return[e.displayProject,e.identitySource,e.suggestedScopeId??"",n??"",e.suggestionReason??"",e.workspaceIdentity].join(" ").toLowerCase()}function MM({item:e,onReview:t}){return a("div",{className:"actor-row",children:[a("div",{className:"actor-details",children:[a("div",{className:"actor-title",children:[a("strong",{children:e.peerName}),a("span",{className:"badge actor-badge",children:["person: ",e.actorDisplayName||e.actorId]})]}),a("div",{className:"peer-meta",children:[e.shareableCount," share by default · ",e.privateCount," marked Only me ·"," ",e.scopeLabel]})]}),a("div",{className:"actor-actions",children:a("button",{type:"button",className:"settings-button",onClick:t,children:"Review my memories in Feed"})})]})}function OM({item:e,onReassign:t,onReview:n}){const r=e.groups??[],i=e.targetScopes??[],o=Object.fromEntries(r.map(N=>[N.workspaceIdentity,N.suggestedScopeId??""])),[s,c]=I({}),[l,d]=I({}),[u,p]=I(o),[m,f]=I({}),[g,h]=I("all"),[v,_]=I(""),[w,S]=I(null),T=r.length,k=e.totalGroupCount??T,P=r.filter(ni).length,E=r.filter(N=>N.suggestedScopeId&&!ni(N)&&Tt(N)).length,M=r.filter(N=>m[N.workspaceIdentity]&&Tt(N)).length,U=r.filter(N=>m[N.workspaceIdentity]&&Tt(N)&&!!u[N.workspaceIdentity]).length,x=r.filter(N=>{const R=ni(N);return g==="suggested"&&(!N.suggestedScopeId||R)||g==="cleanup"&&!R||g==="no-suggestion"&&(N.suggestedScopeId||R)||g==="selected"&&!m[N.workspaceIdentity]?!1:!v.trim()||$M(N,i).includes(v.trim().toLowerCase())});async function G(N){const R=u[N.workspaceIdentity]||N.suggestedScopeId||"";if(!(!R||!t||w)){S(N.workspaceIdentity),d(j=>{const V={...j};return delete V[N.workspaceIdentity],V});try{const j=await t(N,R,!!s[N.workspaceIdentity],s[N.workspaceIdentity]?.confirmation_token);c(j?V=>({...V,[N.workspaceIdentity]:j}):V=>{const ge={...V};return delete ge[N.workspaceIdentity],ge})}catch(j){d(V=>({...V,[N.workspaceIdentity]:Fb(j,R,i)}))}finally{S(null)}}}function A(N,R){p(j=>({...j,[N.workspaceIdentity]:R})),c(j=>{const V={...j};return delete V[N.workspaceIdentity],V}),d(j=>{const V={...j};return delete V[N.workspaceIdentity],V})}function $(N,R){f(j=>({...j,[N.workspaceIdentity]:R}))}function L(N){f(R=>({...R,...Object.fromEntries(x.filter(Tt).map(j=>[j.workspaceIdentity,N]))}))}function J(){f(N=>({...N,...Object.fromEntries(r.filter(R=>R.suggestedScopeId&&!ni(R)&&Tt(R)).map(R=>[R.workspaceIdentity,!0]))}))}async function H(){if(!t||w||U===0)return;const N=r.filter(R=>m[R.workspaceIdentity]&&Tt(R)&&!!u[R.workspaceIdentity]);if(!N.every(R=>s[R.workspaceIdentity])){S("bulk");try{for(const R of N){if(s[R.workspaceIdentity])continue;const j=u[R.workspaceIdentity]||R.suggestedScopeId||"";if(j)try{const V=await t(R,j,!1);d(ge=>{const le={...ge};return delete le[R.workspaceIdentity],le}),V&&c(ge=>({...ge,[R.workspaceIdentity]:V}))}catch(V){d(ge=>({...ge,[R.workspaceIdentity]:Fb(V,j,i)}))}}}finally{S(null)}}}return a("div",{className:"legacy-review-card",children:[a("div",{className:"legacy-review-header",children:[a("div",{children:[a("div",{className:"actor-title",children:[a("strong",{children:"Legacy shared review"}),a("span",{className:"badge badge-offline",children:"Needs project review"})]}),a("div",{className:"peer-meta legacy-review-summary",children:[k.toLocaleString()," older"," ",k===1?"project needs":"projects need"," a Space. They contain"," ",e.memoryCount.toLocaleString()," older shared memories total; review the projects, not individual memories.",T<k?` Showing ${T.toLocaleString()} projects; open Projects to review the rest.`:""]}),a("div",{className:"peer-meta legacy-review-warning",children:"Fix peer-owned projects on their source device. Reassignment updates future sync authorization; online compatible peers should converge after syncing, but offline devices, backups, copied databases, malicious peers, or old versions may retain old copies."})]}),a("div",{className:"actor-actions",children:a("button",{type:"button",className:"settings-button",onClick:n,children:"Manage all projects"})})]}),a("div",{className:"legacy-review-toolbar",children:[a("div",{className:"legacy-review-filter-row",children:[["all",`Showing ${T.toLocaleString()}`],["suggested",`Suggested ${E.toLocaleString()}`],["cleanup",`Needs cleanup ${P.toLocaleString()}`],["no-suggestion","No suggestion"],["selected",`Selected ${U.toLocaleString()}`]].map(([N,R])=>a("button",{className:g===N?"settings-button legacy-filter active":"settings-button legacy-filter",onClick:()=>h(N),type:"button",children:R},N))}),a("div",{className:"legacy-review-bulk-row",children:[a("input",{"aria-label":"Search legacy project groups",className:"peer-scope-input legacy-review-search",onInput:N=>_(N.currentTarget.value),placeholder:"Search project, signal, or destination…",value:v}),a("button",{className:"settings-button",onClick:()=>L(!0),type:"button",children:"Select visible"}),a("button",{className:"settings-button",onClick:J,type:"button",children:"Select suggested"}),a("button",{className:"settings-button",onClick:()=>L(!1),type:"button",children:"Clear visible"}),t&&i.length>0?a("button",{className:"settings-save",disabled:w!=null||U===0||r.filter(N=>m[N.workspaceIdentity]&&Tt(N)&&!!u[N.workspaceIdentity]).every(N=>s[N.workspaceIdentity]),onClick:()=>{H()},type:"button",children:w==="bulk"?"Previewing…":`Preview ${U.toLocaleString()} selected`}):t&&M>0?a("span",{className:"legacy-review-cleanup-note",children:"Add or join a Space before bulk reassignment."}):null,U>0&&r.filter(N=>m[N.workspaceIdentity]&&Tt(N)&&!!u[N.workspaceIdentity]).every(N=>s[N.workspaceIdentity])?a("span",{className:"legacy-review-cleanup-note",children:"Bulk actions only preview. Confirm each project individually to avoid partial reassignment."}):null]})]}),r.length>0?a("ul",{className:"legacy-review-groups","aria-label":"Legacy shared review project groups",children:x.map(N=>a("li",{className:"legacy-review-group",children:[a("div",{className:"legacy-review-group-main",children:[a("div",{className:"legacy-review-title-wrap",children:[a("input",{"aria-label":`Select ${jb(N)}`,checked:!!m[N.workspaceIdentity],className:"cm-checkbox",disabled:!Tt(N),onChange:R=>$(N,R.currentTarget.checked),type:"checkbox"}),a("div",{children:[a("div",{className:"legacy-review-group-title",children:jb(N)}),a("div",{className:"legacy-review-group-meta",children:[xM(N.identitySource),PM(N,i)]}),Tt(N)?N.peerOwnedMemoryCount?a("div",{className:"legacy-review-cleanup-note",children:[(N.reassignableMemoryCount??N.memoryCount).toLocaleString()," ","local memor",(N.reassignableMemoryCount??N.memoryCount)===1?"y":"ies"," ","can be reassigned; ",N.peerOwnedMemoryCount.toLocaleString()," peer-owned memor",N.peerOwnedMemoryCount===1?"y":"ies"," will stay in review."]}):null:a("div",{className:"legacy-review-cleanup-note",children:"Peer-owned only. These older memories were received from another device, so this device cannot reassign them to a Space. Assign this project to a Space on the source device; after sync, this review should clear here."}),ni(N)?a("div",{className:"legacy-review-cleanup-note",children:"Inspect or correct the project identity before assigning old shared data to a Space."}):null]})]}),a("span",{className:"legacy-review-count",children:[N.memoryCount.toLocaleString()," memor",N.memoryCount===1?"y":"ies"]})]}),N.suggestionReason?a("div",{className:"legacy-review-reason",children:N.suggestionReason}):null,l[N.workspaceIdentity]?a("div",{className:"legacy-review-confirmation",role:"alert",children:l[N.workspaceIdentity]}):null,s[N.workspaceIdentity]?a("div",{className:"legacy-review-confirmation",role:"alert",children:[s[N.workspaceIdentity].warning," This will reassign"," ",s[N.workspaceIdentity].reassignable_memory_count.toLocaleString()," of"," ",s[N.workspaceIdentity].memory_count.toLocaleString()," memories",s[N.workspaceIdentity].skipped_memory_count?`; ${s[N.workspaceIdentity].skipped_memory_count.toLocaleString()} peer-owned copies will be left unchanged`:"","."]}):null,a(LM,{group:N}),i.length>0&&t&&Tt(N)?a("label",{className:"legacy-review-target",children:[a("span",{children:"Destination Space"}),a("select",{className:"peer-scope-input",disabled:w!=null,onChange:R=>A(N,R.currentTarget.value),value:u[N.workspaceIdentity]||"",children:[a("option",{value:"",children:"Choose Space…"}),i.map(R=>a("option",{value:R.scopeId,children:[R.label," · ",IM(R.authorityType),R.scopeId===N.suggestedScopeId?" · suggested":""]},R.scopeId))]})]}):null,i.length>0&&t&&Tt(N)?a("div",{className:"legacy-review-actions",children:a("button",{type:"button",className:"settings-button",disabled:w!=null||!u[N.workspaceIdentity],onClick:()=>{G(N)},children:w===N.workspaceIdentity?s[N.workspaceIdentity]?"Reassigning…":"Previewing…":s[N.workspaceIdentity]?"I understand, reassign memories":"Preview reassignment"})}):null]},N.workspaceIdentity))}):null]})}function jM({items:e,legacyReview:t,onLegacyReassign:n,onLegacyReview:r,onReview:i}){return a(te,{children:[t?a(OM,{item:t,onReassign:n,onReview:r??i}):null,e.map(o=>a(MM,{item:o,onReview:i},`${o.peerName}:${o.actorId}:${o.scopeLabel}`))]})}function FM(){kf("mine"),b.feedQuery="",window.location.hash="feed"}function BM(){window.location.hash="projects"}async function UM(e,t,n,r){try{const i=await fw({...r?{confirmation_token:r}:{},confirmed_old_copies:n,scope_id:t,workspace_identity:e.workspaceIdentity});return b.lastSyncLegacySharedReview=i.legacy_shared_review??null,ne(`Reassigned ${i.reassigned_memory_count.toLocaleString()} legacy review memor${i.reassigned_memory_count===1?"y":"ies"} to ${i.target_scope_label}.`),Bb(),null}catch(i){if(i instanceof Bu)return i.preview;const o=i instanceof Error?i.message:"Unable to reassign legacy review memories.";throw ne(o,"warning"),new Error(o)}}function Bb(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewMeta"),n=document.getElementById("syncSharingReviewList");if(!e||!t||!n)return;const r=e.querySelector(".settings-group-title"),i=Array.isArray(b.lastSyncSharingReview)?b.lastSyncSharingReview:[],o=b.lastSyncLegacySharedReview,s=Math.max(0,Number(o?.memory_count??0)),c=o?.has_data?{groups:Array.isArray(o.groups)?o.groups.map(d=>{const u=d;return{displayProject:String(u.display_project||u.project||"Unknown project"),identitySource:String(u.identity_source||"unknown"),lastUpdatedAt:typeof u.last_updated_at=="string"?u.last_updated_at:null,memoryCount:Number(u.memory_count||0),memorySamples:Array.isArray(u.memory_samples)?u.memory_samples.map(p=>{const m=p,f=m.ownership==="peer"?"peer":"local";return{bodyPreview:typeof m.body_preview=="string"?m.body_preview:null,createdAt:typeof m.created_at=="string"?m.created_at:null,cwd:typeof m.cwd=="string"?m.cwd:null,gitRemote:typeof m.git_remote=="string"?m.git_remote:null,id:Number(m.id||0),kind:typeof m.kind=="string"?m.kind:null,ownership:f,project:typeof m.project=="string"?m.project:null,title:String(m.title||`Memory ${Number(m.id||0)}`),updatedAt:typeof m.updated_at=="string"?m.updated_at:null}}):[],peerOwnedMemoryCount:Number(u.peer_owned_memory_count||0),reassignableMemoryCount:Number(u.reassignable_memory_count||0),suggestedScopeId:typeof u.suggested_scope_id=="string"?u.suggested_scope_id:null,suggestionReason:typeof u.suggestion_reason=="string"?u.suggestion_reason:null,workspaceIdentity:String(u.workspace_identity||u.display_project||"unknown")}}):[],memoryCount:s,scopeId:String(o.scope_id||"legacy-shared-review"),totalGroupCount:Number(o.total_group_count||o.groups?.length||0),targetScopes:Array.isArray(o.target_scopes)?o.target_scopes.map(d=>{const u=d;return{authorityType:String(u.authority_type||"unknown"),label:String(u.label||u.scope_id||"Unknown domain"),scopeId:String(u.scope_id||"")}}).filter(d=>d.scopeId):[]}:null;if(!i.length&&!c){Qr(n),e.hidden=!0;return}e.hidden=!1,r&&(r.textContent=c?"Sharing review":"What teammates will receive");const l=b.currentProject?`current project (${b.currentProject})`:"all allowed projects";t.textContent=c?`Review conservative upgrade state before promoting historical shared data. Teammates receive memories from ${l} by default once Sharing-domain grants allow it.`:`Teammates receive memories from ${l} by default. Use Only me on a memory when it should stay local.`,Ze(n,y(jM,{items:i.map(d=>({actorDisplayName:String(d.actor_display_name||d.actor_id||"unknown"),actorId:String(d.actor_id||"unknown"),peerName:String(d.peer_name||d.peer_device_id||"Device"),privateCount:Number(d.private_count||0),scopeLabel:String(d.scope_label||"All allowed projects"),shareableCount:Number(d.shareable_count||0)})),legacyReview:c,onLegacyReassign:UM,onLegacyReview:BM,onReview:FM}))}var As="",vo=null,lu=0,GM=15e3;function Ub(e){return`project:${e||""}|includeJoinRequests:false`}function HM(e){const t=Ub(e);return!vo||vo.key!==t||Date.now()>=vo.expiresAtMs?null:vo.payload}function KM(e,t){vo={key:Ub(e),expiresAtMs:Date.now()+GM,payload:t}}function WM(e){return!e||typeof e!="object"?e:{...e,join_requests:[]}}function VM(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewList"),n=document.getElementById("syncSharingReviewMeta"),r=document.getElementById("syncLegacyClaims"),i=document.getElementById("syncLegacyClaimsMeta");e&&(e.hidden=!0),t&&(t.textContent=""),n&&(n.textContent=""),r&&(r.hidden=!0),i&&(i.textContent="")}async function ri(){const e=++lu;try{const t=b.currentProject||"",n=!1,r=b.activeTab==="health";let i=!1;const o=!Ei();let s;r?(s=HM(t),s||(s=await js(o,t,{includeJoinRequests:!1}),i=!0)):(s=await js(o,t,{includeJoinRequests:n}),i=!0);let c=null,l=null,d=b.lastShareOperations,u=!1,p=!1,m=!1;const f=u$();try{c=await z_()}catch{u=!0}try{l=await To()}catch{p=!0}try{const S=await Ku();d=Array.isArray(S.items)?S.items:[]}catch{m=!0}if(e!==lu)return;i&&KM(t,WM(s));const g=JSON.stringify([s,c,l,d,m,f]);if(g===As)return;As=g;const h=s.status&&typeof s.status=="object"?s.status:null;h&&(b.lastSyncStatus=h),Array.isArray(c?.items)?b.lastSyncActors=c.items:b.lastSyncActors=[];const v=Array.isArray(s.peers)?s.peers:[],_=new Set(v.map(S=>String(S?.peer_device_id||"").trim()).filter(Boolean)),w=Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(S=>{const T=String(S?.peer_device_id||"").trim();return T&&!_.has(T)}):[];b.pendingAcceptedSyncPeers=w,b.lastSyncPeers=[...v,...w],b.lastShareOperations=d,b.shareOperationsLoadError=m,b.lastSyncSharingReview=s.sharing_review||[],b.lastSyncLegacySharedReview=s.legacy_shared_review&&typeof s.legacy_shared_review=="object"?s.legacy_shared_review:null,b.lastSyncCoordinator=s.coordinator||null,b.lastCoordinatorAdminStatus=l&&typeof l=="object"?l:null,b.lastSyncJoinRequests=Array.isArray(s.join_requests)?s.join_requests:[],b.lastSyncAttempts=s.attempts||[],b.lastSyncLegacyDevices=s.legacy_devices||[],b.lastSyncDuplicatePersonDecisions=f,b.lastSyncViewModel=r$({actors:b.lastSyncActors,peers:b.lastSyncPeers,coordinator:b.lastSyncCoordinator,status:h,shareOperations:b.lastShareOperations,shareOperationsLoadError:m,reconciliation:s.recipient_policy_reconciliation,duplicatePersonDecisions:b.lastSyncDuplicatePersonDecisions}),xb(),Ps(),tM(),rM(),Bb(),ru(),Db(),Nb(),ky(),u&&nM(),p&&(b.lastCoordinatorAdminStatus=null,Ps())}catch{if(e!==lu)return;As="",Dn("syncTeamSkeleton"),Dn("syncActorsSkeleton"),Dn("syncPeersSkeleton"),Dn("syncDiagSkeleton"),VM(),iM(),b$()}}function qM(){As="",b.lastSyncPeers?.length&&ru()}async function zM(){try{b.pairingPayloadRaw=await J_()||null,Xd()}catch{b.pairingPayloadRaw=null,Xd()}}function JM(e){eL(),Fa(),cM(ri),eM(ri),C$(ru),pM(e,ri),oM(ri),T$(e),iu(),sM()}function YM(e,t){const n=Ie("runtimeLabel");n&&(n.textContent=t?`v${e} (${t})`:`v${e}`,n.title=t?`codemem ${e} (${t})`:`codemem ${e}`,n.hidden=!1)}async function XM(){try{const e=await H_();if(!e?.version)return;YM(e.version,"6b3c3d4")}catch{}}var du=null,Gb=1500,Hb="codemem-legacy-upgrade-notice-dismissed",Ln=null,Jt=!1,uu=!1,yo=null;function Kb(e,t=0){const n=Number(e);return Number.isFinite(n)?Math.max(0,n):t}function Wb(e){if(!e||typeof e!="object")return null;const t=e.legacy_shared_review??e;if(!t||typeof t!="object")return null;const n=t;if(n.has_data!==!0)return null;const r=Array.isArray(n.groups)?n.groups:[],i=Kb(n.total_group_count,r.length),o=Kb(n.memory_count);return i<=0||o<=0?null:{groupCount:i,memoryCount:o}}function Vb(){try{return localStorage.getItem(Hb)==="1"}catch{return!1}}function Es(){if(document.getElementById("legacyUpgradeDontShow")?.checked)try{localStorage.setItem(Hb,"1")}catch{}}function qb(){const e=Ie("legacyUpgradeModal");return!e||e.hidden?[]:Array.from(e.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')).filter(t=>!t.hidden&&t.offsetParent!==null)}function QM(){const e=qb(),t=Ie("legacyUpgradeReviewGroups");(t&&e.includes(t)?t:e[0])?.focus()}function zb(e){const t=Ie("legacyUpgradeModal");if(!t||t.hidden)return;if(e.key==="Escape"){e.preventDefault(),Es(),bo(!1);return}if(e.key==="Enter"){const o=Ie("legacyUpgradeReviewGroups");Rr(e,{onSubmit:()=>o?.click(),disabled:!o||o.disabled});return}if(e.key!=="Tab")return;const n=qb();if(n.length===0)return;const r=n[0],i=n[n.length-1];if(e.shiftKey&&document.activeElement===r){e.preventDefault(),i.focus();return}!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),r.focus())}function Jb(e){for(const t of document.querySelectorAll("header, .tab-bar, .tab-panel, #toastRoot, #viewerReconnectOverlay, #settingsDialogMount"))t.id==="viewerReconnectOverlay"&&t.hidden||(t.inert=e,e?t.setAttribute("aria-hidden","true"):t.removeAttribute("aria-hidden"))}function bo(e,t){const n=Ie("legacyUpgradeModalBackdrop"),r=Ie("legacyUpgradeModal"),i=Ie("legacyUpgradeSummary");if(!(!n||!r||!i)){if(t&&(i.textContent=`${t.groupCount.toLocaleString()} older ${t.groupCount===1?"project needs":"projects need"} a Sharing domain. They contain ${t.memoryCount.toLocaleString()} older shared memories total; you will review the projects, not individual memories.`),n.hidden=!e,r.hidden=!e,e){yo=document.activeElement,document.addEventListener("keydown",zb),QM(),Jb(!0);return}Jb(!1),document.removeEventListener("keydown",zb),yo&&document.contains(yo)&&yo.focus(),yo=null}}function Yb(e){!e||uu||Vb()||(uu=!0,bo(!0,e))}async function ZM(){if(!(uu||Vb()))try{Yb(Wb(await js(!1,"",{includeJoinRequests:!1})))}catch{}}function gr(e,t){const n=Ie("viewerReconnectOverlay"),r=Ie("viewerReconnectDetail");!n||!r||(n.hidden=!e,r.textContent=t||"Trying again automatically while the viewer comes back.")}async function pu(){try{return await G_(),!0}catch{return!1}}function eO(){return document.visibilityState!=="hidden"&&!qy()}function Xb(){if(Jt)return;Jt=!0,mu(),vr("error","(reconnecting)"),gr(!0,"The viewer server is restarting or temporarily unavailable. Trying again automatically…");const e=async()=>{if(await pu()){if(Ln&&(clearTimeout(Ln),Ln=null),Jt=!1,gr(!0,"Viewer responded. Restoring your session…"),eO()){vr("refreshing"),_o();try{await Rs()}catch{}}else vr("paused",document.visibilityState==="hidden"?"(tab hidden)":"(settings open)");Jt||gr(!1);return}gr(!0,"Still reconnecting… the viewer will recover automatically as soon as the server responds."),Ln=setTimeout(e,Gb)};Ln=setTimeout(e,Gb)}function vr(e,t){b.refreshState=e;const n=Ie("refreshStatus");if(!n)return;const r=o=>{const s=Ie("refreshAnnouncer");!s||du===e||(s.textContent=o,du=e)};if(e==="refreshing"){n.textContent="refreshing…";return}if(e==="paused"){n.textContent="paused",r("Auto refresh paused.");return}if(e==="error"&&t==="(reconnecting)"){n.textContent="reconnecting…",r("Viewer reconnecting.");return}if(e==="error"){n.textContent="refresh failed",r("Refresh failed.");return}const i=t?` ${t}`:"";n.textContent=`updated ${new Date().toLocaleTimeString()}${i}`,du=null}function mu(){b.refreshTimer&&(clearInterval(b.refreshTimer),b.refreshTimer=null)}function _o(){b.refreshTimer||(b.refreshTimer=setInterval(()=>$n(),5e3))}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(mu(),vr("paused","(tab hidden)")):!qy()&&!Jt&&(_o(),$n())});function tO(){const e=b.advancedSection==="sync",t=Ie("advancedSyncContent"),n=Ie("advancedTeamsContent");t&&(t.hidden=!e),n&&(n.hidden=e);const r=Ie("advancedSyncButton"),i=Ie("advancedTeamsButton");r?.setAttribute("aria-pressed",String(e)),i?.setAttribute("aria-pressed",String(!e)),queueMicrotask(()=>{const o=window.location.hash.replace(/^#/,"");iu(o==="sync/diagnostics"||o==="advanced/sync/diagnostics"?"diagnostics":"main")})}function Qb(e){const t=new Set(QT(b.lastCoordinatorAdminStatus));zn.forEach(n=>{const r=Ie(`tab-${n}`);r&&(r.hidden=n!==e||!t.has(n))}),zn.forEach(n=>{const r=Ie(`tabBtn-${n}`);if(!r)return;r.hidden=!t.has(n);const i=n===e&&t.has(n);r.classList.toggle("active",i),i?r.setAttribute("aria-current","page"):r.removeAttribute("aria-current")}),tO()}function Is(e,t={}){const n=Ai(e,b.lastCoordinatorAdminStatus);n==="advanced"&&Hc(t.advancedSection??Gc()??b.advancedSection),Tf(n,t.canonicalHash?{canonicalHash:!0}:{}),Qb(n),$n()}function nO(){zn.forEach(e=>{Ie(`tabBtn-${e}`)?.addEventListener("click",()=>Is(e,e==="advanced"?{canonicalHash:!0,advancedSection:"sync"}:{canonicalHash:!0}))}),Ie("advancedSyncButton")?.addEventListener("click",()=>Hc("sync",!0)),Ie("advancedTeamsButton")?.addEventListener("click",()=>Hc("teams",!0)),window.addEventListener("hashchange",()=>{const e=Uc();if(e){const t=Gc();Is(e,t?{advancedSection:t}:{})}}),Is(b.activeTab)}async function rO(){try{const e=await ko();b.knownProjects=e,qM();const t=jc("projectFilter");if(!t)return;t.textContent="";const n=document.createElement("option");n.value="",n.textContent="All Projects",t.appendChild(n),e.forEach(r=>{const i=document.createElement("option");i.value=r,i.textContent=r,t.appendChild(i)})}catch{}}var iO=nT(),Zb={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},e_=!1,ii=null;async function oO(){const e=[];let t=0;for(;;){const n=await xo({limit:250,offset:t});if(e.push(...n.projects),!n.has_more)break;t+=n.limit}return Zo(e)}function aO(){const e=new Map,t={unknown:0,offline:1,available:2},n=(r,i)=>{!r||t[i]<=t[e.get(r)??"unknown"]||e.set(r,i)};for(const r of b.lastSyncCoordinator?.discovered_devices??[])n(String(r.device_id??"").trim(),r.stale?"offline":"available");for(const r of b.lastSyncPeers){const i=String(r.peer_device_id??"").trim(),o=fo(r);n(i,o==="connected"||o==="available"?"available":o==="offline"?"offline":"unknown")}return[...e].map(([r,i])=>({deviceId:r,state:i}))}function t_(e){Is(e,{canonicalHash:!0}),queueMicrotask(()=>document.getElementById(`tabBtn-${e}`)?.focus())}async function sO(){const e=document.getElementById("devicesMount");if(!e)return!0;e_||Ua(e,Zb,{version:1,items:[]},[],[],{loading:!0});try{const[t,n,r]=await Promise.all([oO(),Us(),Q_(),ri()]),i=aO();return Ua(e,n,r,t,i,{onNavigate:t_}),ii={projects:t,intent:n,reconciliation:r,availability:i},e_=!0,!0}catch{return ii?Ua(e,ii.intent,ii.reconciliation,ii.projects,ii.availability,{onNavigate:t_,refreshError:!0}):Ua(e,Zb,{version:1,items:[]},[],[],{loadError:!0}),!1}}jc("projectFilter")?.addEventListener("change",()=>{b.currentProject=jc("projectFilter")?.value||"",ao(!0),$n()});var fu=null;async function $n(){Jt||(fu&&clearTimeout(fu),fu=setTimeout(()=>Rs(),80))}async function Rs(){if(!Jt){if(b.refreshInFlight){b.refreshQueued=!0;return}b.refreshInFlight=!0;try{vr("refreshing");const e=b.activeTab,t=[p0(),wD()];let n=!0;e==="feed"&&t.push(To().then(i=>{b.lastCoordinatorAdminStatus=i&&typeof i=="object"?i:null}).catch(()=>{b.lastCoordinatorAdminStatus=null})),e==="feed"&&t.push(wy()),e==="projects"&&t.push(K0()),e==="sharing"&&t.push(iO()),e==="devices"&&t.push(sO().then(i=>{n=i})),(e==="advanced"&&b.advancedSection==="sync"||e==="health")&&t.push(ri()),e==="advanced"&&b.advancedSection==="teams"&&t.push($l()),b.syncPairingOpen&&t.push(zM()),await Promise.all(t),Yb(Wb(b.lastSyncLegacySharedReview));const r=Ai(b.activeTab,b.lastCoordinatorAdminStatus);r!==b.activeTab&&Tf(r),Qb(b.activeTab),vr(n?"idle":"error")}catch{await pu()?vr("error"):Xb()}finally{b.refreshInFlight=!1,b.refreshQueued&&!Jt&&(b.refreshQueued=!1,Rs())}}}sk();var n_=document.getElementById("toastRoot");n_&&GT(n_),ck(Fc("themeToggle")),Pf(Wc()),nO(),r0(),W0(()=>$n()),JM(()=>$n()),YP(),QD(mu,_o,()=>$n()),rO(),Ie("viewerReconnectRetry")?.addEventListener("click",async()=>{if(gr(!0,"Checking whether the viewer server is back…"),!await pu()){Xb();return}Ln&&(clearTimeout(Ln),Ln=null),Jt=!1,gr(!0,"Viewer responded. Restoring your session…"),_o();try{await Rs()}catch{}Jt||gr(!1)}),Ie("legacyUpgradeReviewGroups")?.addEventListener("click",()=>{Es(),bo(!1),window.location.hash="sync",setTimeout(()=>document.getElementById("syncSharingReview")?.scrollIntoView({block:"start"}),120)}),Ie("legacyUpgradeReviewProjects")?.addEventListener("click",()=>{Es(),bo(!1),window.location.hash="projects"}),Ie("legacyUpgradeNotNow")?.addEventListener("click",()=>{Es(),bo(!1)}),XM(),ZM(),$n(),_o()})();