@codemem/server 0.38.0 → 0.39.0
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/package.json +2 -2
- package/static/app.js +1 -1
- package/static/app.js.br +0 -0
- package/static/app.js.gz +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codemem/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"drizzle-orm": "^0.45.2",
|
|
20
20
|
"hono": "^4.12.25",
|
|
21
21
|
"limiter": "^3.0.0",
|
|
22
|
-
"@codemem/core": "^0.
|
|
22
|
+
"@codemem/core": "^0.39.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/better-sqlite3": "^7.6.13",
|
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>"+Wt(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}},tr=new QE;function ke(e,t){return tr.parse(e,t)}ke.options=ke.setOptions=function(e){return tr.setOptions(e),ke.defaults=tr.defaults,ig(ke.defaults),ke},ke.getDefaults=dl,ke.defaults=Zn,ke.use=function(...e){return tr.use(...e),ke.defaults=tr.defaults,ig(ke.defaults),ke},ke.walkTokens=function(e,t){return tr.walkTokens(e,t)},ke.parseInline=tr.parseInline,ke.Parser=Rt,ke.parser=Rt.parse,ke.Renderer=Ca,ke.TextRenderer=bl,ke.Lexer=Pt,ke.lexer=Pt.lex,ke.Tokenizer=Sa,ke.Hooks=Ao,ke.parse=ke;var zL=ke.options,qL=ke.setOptions,JL=ke.use,YL=ke.walkTokens,XL=ke.parseInline,QL=ke,ZL=Rt.parse,eO=Pt.lex,ZE={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 eN(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:")}og.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&(eN(e.getAttribute("href")||"")?(e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank")):e.removeAttribute("href"))});function _l(e){const t=ke.parse(String(e||""),{async:!1});return og.sanitize(t,ZE)}function tN(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 o=String(e[r]||"").trim();return o?h("div",{className:"summary-section",key:r},h("div",{className:"summary-section-label"},Hx(r)),h("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:_l(o)}})):null}).filter(Boolean)}function nN(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,o)=>{const i=r.indexOf(":"),a=r.slice(0,i).trim(),s=r.slice(i+1).trim();return!a||!s?null:h("div",{className:"summary-section",key:`${a}-${o}`},h("div",{className:"summary-section-label"},a),h("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:_l(s)}}))}).filter(Boolean);if(n.length)return h("div",{className:"feed-body facts"},n)}return h("div",{className:"feed-body"},h("ul",null,t.map((n,r)=>h("li",{key:`${n}-${r}`},n))))}function Sg(e,t="feed-body"){const n=String(e||"").trim();return n?h("div",{className:t,dangerouslySetInnerHTML:{__html:_l(n)}}):null}function rN(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=a=>{if(!a||typeof a!="object"||Array.isArray(a))return!1;const s=a;return t.some(l=>{const d=s[l];return typeof d=="string"&&d.trim().length>0})},r=e?.summary;if(r&&typeof r=="object"&&!Array.isArray(r)){const a=r.summary;if(n(r))return r;if(n(a))return a}const o=e?.metadata_json;if(n(o))return o;if(o&&n(o.summary))return o.summary;const i=String(e?.body_text||"").trim();if(i.includes("## ")){const a={request:"request",completed:"completed",learned:"learned",investigated:"investigated","next steps":"next_steps",notes:"notes"},s={},l=/(?:^|\n)##\s+([^\n]+)\n([\s\S]*?)(?=\n##\s+|$)/g;for(let d=l.exec(i);d;d=l.exec(i)){const u=a[String(d[1]||"").trim().toLowerCase()],p=String(d[2]||"").trim();u&&p&&(s[u]=p)}if(n(s))return s}return null}function Ta(e,t){return String(e?.kind||"").toLowerCase()==="session_summary"||t?.is_summary===!0?!0:String(t?.source||"").trim().toLowerCase()==="observer_summary"}function oN(e,t){const n=String(e?.kind||"").trim().toLowerCase();return Ta(e,t)?"session_summary":n||"change"}var wl=["Enter"," "],iN=["ArrowDown","PageUp","Home"],Cg=["ArrowUp","PageDown","End"],aN=[...iN,...Cg],sN={ltr:[...wl,"ArrowRight"],rtl:[...wl,"ArrowLeft"]},cN={ltr:["ArrowLeft"],rtl:["ArrowRight"]},Eo="Menu",[No,lN,dN]=vi(Eo),[nr,Tg]=nt(Eo,[dN,vn,br]),Po=vn(),kg=br(),[xg,xn]=nr(Eo),[uN,Ro]=nr(Eo),Ag=e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:o,onOpenChange:i,modal:a=!0}=e,s=Po(t),[l,d]=O(null),u=j(!1),p=rt(i),f=io(o);return G(()=>{const m=()=>{u.current=!0,document.addEventListener("pointerdown",v,{capture:!0,once:!0}),document.addEventListener("pointermove",v,{capture:!0,once:!0})},v=()=>u.current=!1;return document.addEventListener("keydown",m,{capture:!0}),()=>{document.removeEventListener("keydown",m,{capture:!0}),document.removeEventListener("pointerdown",v,{capture:!0}),document.removeEventListener("pointermove",v,{capture:!0})}},[]),c(uo,{...s,children:c(xg,{scope:t,open:n,onOpenChange:p,content:l,onContentChange:d,children:c(uN,{scope:t,onClose:te(()=>p(!1),[p]),isUsingKeyboardRef:u,dir:f,modal:a,children:r})})})};Ag.displayName=Eo;var pN="MenuAnchor",Sl=M((e,t)=>{const{__scopeMenu:n,...r}=e,o=Po(n);return c(po,{...o,...r,ref:t})});Sl.displayName=pN;var Cl="MenuPortal",[fN,Eg]=nr(Cl,{forceMount:void 0}),Ng=e=>{const{__scopeMenu:t,forceMount:n,children:r,container:o}=e,i=xn(Cl,t);return c(fN,{scope:t,forceMount:n,children:c(Ze,{present:n||i.open,children:c(Bn,{asChild:!0,container:o,children:r})})})};Ng.displayName=Cl;var wt="MenuContent",[mN,Tl]=nr(wt),Pg=M((e,t)=>{const n=Eg(wt,e.__scopeMenu),{forceMount:r=n.forceMount,...o}=e,i=xn(wt,e.__scopeMenu),a=Ro(wt,e.__scopeMenu);return c(No.Provider,{scope:e.__scopeMenu,children:c(Ze,{present:r||i.open,children:c(No.Slot,{scope:e.__scopeMenu,children:a.modal?c(hN,{...o,ref:t}):c(gN,{...o,ref:t})})})})}),hN=M((e,t)=>{const n=xn(wt,e.__scopeMenu),r=j(null),o=fe(t,r);return G(()=>{const i=r.current;if(i)return Vi(i)},[]),c(kl,{...e,ref:o,trapFocus:n.open,disableOutsidePointerEvents:n.open,disableOutsideScroll:!0,onFocusOutside:W(e.onFocusOutside,i=>i.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>n.onOpenChange(!1)})}),gN=M((e,t)=>{const n=xn(wt,e.__scopeMenu);return c(kl,{...e,ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>n.onOpenChange(!1)})}),vN=Fn("MenuContent.ScrollLock"),kl=M((e,t)=>{const{__scopeMenu:n,loop:r=!1,trapFocus:o,onOpenAutoFocus:i,onCloseAutoFocus:a,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:p,onInteractOutside:f,onDismiss:m,disableOutsideScroll:v,...g}=e,y=xn(wt,n),_=Ro(wt,n),w=Po(n),C=kg(n),T=lN(n),[x,E]=O(null),L=j(null),F=fe(t,L,y.onContentChange),H=j(0),R=j(""),U=j(0),B=j(null),N=j("right"),P=j(0),X=v?mo:ee,z=v?{as:vN,allowPinchZoom:!0}:void 0,k=I=>{const K=R.current+I,me=T().filter(Te=>!Te.disabled),ue=document.activeElement,ie=me.find(Te=>Te.ref.current===ue)?.textValue,xe=PN(me.map(Te=>Te.textValue),K,ie),Se=me.find(Te=>Te.textValue===xe)?.ref.current;(function Te(Y){R.current=Y,window.clearTimeout(H.current),Y!==""&&(H.current=window.setTimeout(()=>Te(""),1e3))})(K),Se&&setTimeout(()=>Se.focus())};G(()=>()=>window.clearTimeout(H.current),[]),Ni();const D=te(I=>N.current===B.current?.side&&IN(I,B.current?.area),[]);return c(mN,{scope:n,searchRef:R,onItemEnter:te(I=>{D(I)&&I.preventDefault()},[D]),onItemLeave:te(I=>{D(I)||(L.current?.focus(),E(null))},[D]),onTriggerLeave:te(I=>{D(I)&&I.preventDefault()},[D]),pointerGraceTimerRef:U,onPointerGraceIntentChange:te(I=>{B.current=I},[]),children:c(X,{...z,children:c(so,{asChild:!0,trapped:o,onMountAutoFocus:W(i,I=>{I.preventDefault(),L.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:a,children:c(jn,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:d,onPointerDownOutside:u,onFocusOutside:p,onInteractOutside:f,onDismiss:m,children:c(Ys,{asChild:!0,...C,dir:_.dir,orientation:"vertical",loop:r,currentTabStopId:x,onCurrentTabStopIdChange:E,onEntryFocus:W(l,I=>{_.isUsingKeyboardRef.current||I.preventDefault()}),preventScrollOnEntryFocus:!0,children:c(Bi,{role:"menu","aria-orientation":"vertical","data-state":zg(y.open),"data-radix-menu-content":"",dir:_.dir,...w,...g,ref:F,style:{outline:"none",...g.style},onKeyDown:W(g.onKeyDown,I=>{const K=I.target.closest("[data-radix-menu-content]")===I.currentTarget,me=I.ctrlKey||I.altKey||I.metaKey,ue=I.key.length===1;K&&(I.key==="Tab"&&I.preventDefault(),!me&&ue&&k(I.key));const ie=L.current;if(I.target!==ie||!aN.includes(I.key))return;I.preventDefault();const xe=T().filter(Se=>!Se.disabled).map(Se=>Se.ref.current);Cg.includes(I.key)&&xe.reverse(),EN(xe)}),onBlur:W(e.onBlur,I=>{I.currentTarget.contains(I.target)||(window.clearTimeout(H.current),R.current="")}),onPointerMove:W(e.onPointerMove,Do(I=>{const K=I.target,me=P.current!==I.clientX;I.currentTarget.contains(K)&&me&&(N.current=I.clientX>P.current?"right":"left",P.current=I.clientX)}))})})})})})})});Pg.displayName=wt;var yN="MenuGroup",xl=M((e,t)=>{const{__scopeMenu:n,...r}=e;return c(oe.div,{role:"group",...r,ref:t})});xl.displayName=yN;var bN="MenuLabel",Rg=M((e,t)=>{const{__scopeMenu:n,...r}=e;return c(oe.div,{...r,ref:t})});Rg.displayName=bN;var ka="MenuItem",Ig="menu.itemSelect",xa=M((e,t)=>{const{disabled:n=!1,onSelect:r,...o}=e,i=j(null),a=Ro(ka,e.__scopeMenu),s=Tl(ka,e.__scopeMenu),l=fe(t,i),d=j(!1),u=()=>{const p=i.current;if(!n&&p){const f=new CustomEvent(Ig,{bubbles:!0,cancelable:!0});p.addEventListener(Ig,m=>r?.(m),{once:!0}),Rs(p,f),f.defaultPrevented?d.current=!1:a.onClose()}};return c(Dg,{...o,ref:l,disabled:n,onClick:W(e.onClick,u),onPointerDown:p=>{e.onPointerDown?.(p),d.current=!0},onPointerUp:W(e.onPointerUp,p=>{d.current||p.currentTarget?.click()}),onKeyDown:W(e.onKeyDown,p=>{const f=s.searchRef.current!=="";n||f&&p.key===" "||wl.includes(p.key)&&(p.currentTarget.click(),p.preventDefault())})})});xa.displayName=ka;var Dg=M((e,t)=>{const{__scopeMenu:n,disabled:r=!1,textValue:o,...i}=e,a=Tl(ka,n),s=kg(n),l=j(null),d=fe(t,l),[u,p]=O(!1),[f,m]=O("");return G(()=>{const v=l.current;v&&m((v.textContent??"").trim())},[i.children]),c(No.ItemSlot,{scope:n,disabled:r,textValue:o??f,children:c(Xs,{asChild:!0,...s,focusable:!r,children:c(oe.div,{role:"menuitem","data-highlighted":u?"":void 0,"aria-disabled":r||void 0,"data-disabled":r?"":void 0,...i,ref:d,onPointerMove:W(e.onPointerMove,Do(v=>{r?a.onItemLeave(v):(a.onItemEnter(v),v.defaultPrevented||v.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:W(e.onPointerLeave,Do(v=>a.onItemLeave(v))),onFocus:W(e.onFocus,()=>p(!0)),onBlur:W(e.onBlur,()=>p(!1))})})})}),_N="MenuCheckboxItem",Lg=M((e,t)=>{const{checked:n=!1,onCheckedChange:r,...o}=e;return c(jg,{scope:e.__scopeMenu,checked:n,children:c(xa,{role:"menuitemcheckbox","aria-checked":Aa(n)?"mixed":n,...o,ref:t,"data-state":Nl(n),onSelect:W(o.onSelect,()=>r?.(Aa(n)?!0:!n),{checkForDefaultPrevented:!1})})})});Lg.displayName=_N;var Og="MenuRadioGroup",[wN,SN]=nr(Og,{value:void 0,onValueChange:()=>{}}),$g=M((e,t)=>{const{value:n,onValueChange:r,...o}=e,i=rt(r);return c(wN,{scope:e.__scopeMenu,value:n,onValueChange:i,children:c(xl,{...o,ref:t})})});$g.displayName=Og;var Mg="MenuRadioItem",Fg=M((e,t)=>{const{value:n,...r}=e,o=SN(Mg,e.__scopeMenu),i=n===o.value;return c(jg,{scope:e.__scopeMenu,checked:i,children:c(xa,{role:"menuitemradio","aria-checked":i,...r,ref:t,"data-state":Nl(i),onSelect:W(r.onSelect,()=>o.onValueChange?.(n),{checkForDefaultPrevented:!1})})})});Fg.displayName=Mg;var Al="MenuItemIndicator",[jg,CN]=nr(Al,{checked:!1}),Bg=M((e,t)=>{const{__scopeMenu:n,forceMount:r,...o}=e,i=CN(Al,n);return c(Ze,{present:r||Aa(i.checked)||i.checked===!0,children:c(oe.span,{...o,ref:t,"data-state":Nl(i.checked)})})});Bg.displayName=Al;var TN="MenuSeparator",Ug=M((e,t)=>{const{__scopeMenu:n,...r}=e;return c(oe.div,{role:"separator","aria-orientation":"horizontal",...r,ref:t})});Ug.displayName=TN;var kN="MenuArrow",Gg=M((e,t)=>{const{__scopeMenu:n,...r}=e,o=Po(n);return c(Ui,{...o,...r,ref:t})});Gg.displayName=kN;var El="MenuSub",[xN,Hg]=nr(El),AN=e=>{const{__scopeMenu:t,children:n,open:r=!1,onOpenChange:o}=e,i=xn(El,t),a=Po(t),[s,l]=O(null),[d,u]=O(null),p=rt(o);return G(()=>(i.open===!1&&p(!1),()=>p(!1)),[i.open,p]),c(uo,{...a,children:c(xg,{scope:t,open:r,onOpenChange:p,content:d,onContentChange:u,children:c(xN,{scope:t,contentId:ot(),triggerId:ot(),trigger:s,onTriggerChange:l,children:n})})})};AN.displayName=El;var Io="MenuSubTrigger",Vg=M((e,t)=>{const n=xn(Io,e.__scopeMenu),r=Ro(Io,e.__scopeMenu),o=Hg(Io,e.__scopeMenu),i=Tl(Io,e.__scopeMenu),a=j(null),{pointerGraceTimerRef:s,onPointerGraceIntentChange:l}=i,d={__scopeMenu:e.__scopeMenu},u=te(()=>{a.current&&window.clearTimeout(a.current),a.current=null},[]);return G(()=>u,[u]),G(()=>{const p=s.current;return()=>{window.clearTimeout(p),l(null)}},[s,l]),c(Sl,{asChild:!0,...d,children:c(Dg,{id:o.triggerId,"aria-haspopup":"menu","aria-expanded":n.open,"aria-controls":o.contentId,"data-state":zg(n.open),...e,ref:gi(t,o.onTriggerChange),onClick:p=>{e.onClick?.(p),!(e.disabled||p.defaultPrevented)&&(p.currentTarget.focus(),n.open||n.onOpenChange(!0))},onPointerMove:W(e.onPointerMove,Do(p=>{i.onItemEnter(p),!p.defaultPrevented&&!e.disabled&&!n.open&&!a.current&&(i.onPointerGraceIntentChange(null),a.current=window.setTimeout(()=>{n.onOpenChange(!0),u()},100))})),onPointerLeave:W(e.onPointerLeave,Do(p=>{u();const f=n.content?.getBoundingClientRect();if(f){const m=n.content?.dataset.side,v=m==="right",g=v?-5:5,y=f[v?"left":"right"],_=f[v?"right":"left"];i.onPointerGraceIntentChange({area:[{x:p.clientX+g,y:p.clientY},{x:y,y:f.top},{x:_,y:f.top},{x:_,y:f.bottom},{x:y,y:f.bottom}],side:m}),window.clearTimeout(s.current),s.current=window.setTimeout(()=>i.onPointerGraceIntentChange(null),300)}else{if(i.onTriggerLeave(p),p.defaultPrevented)return;i.onPointerGraceIntentChange(null)}})),onKeyDown:W(e.onKeyDown,p=>{const f=i.searchRef.current!=="";e.disabled||f&&p.key===" "||sN[r.dir].includes(p.key)&&(n.onOpenChange(!0),n.content?.focus(),p.preventDefault())})})})});Vg.displayName=Io;var Wg="MenuSubContent",Kg=M((e,t)=>{const n=Eg(wt,e.__scopeMenu),{forceMount:r=n.forceMount,...o}=e,i=xn(wt,e.__scopeMenu),a=Ro(wt,e.__scopeMenu),s=Hg(Wg,e.__scopeMenu),l=j(null),d=fe(t,l);return c(No.Provider,{scope:e.__scopeMenu,children:c(Ze,{present:r||i.open,children:c(No.Slot,{scope:e.__scopeMenu,children:c(kl,{id:s.contentId,"aria-labelledby":s.triggerId,...o,ref:d,align:"start",side:a.dir==="rtl"?"left":"right",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,trapFocus:!1,onOpenAutoFocus:u=>{a.isUsingKeyboardRef.current&&l.current?.focus(),u.preventDefault()},onCloseAutoFocus:u=>u.preventDefault(),onFocusOutside:W(e.onFocusOutside,u=>{u.target!==s.trigger&&i.onOpenChange(!1)}),onEscapeKeyDown:W(e.onEscapeKeyDown,u=>{a.onClose(),u.preventDefault()}),onKeyDown:W(e.onKeyDown,u=>{const p=u.currentTarget.contains(u.target),f=cN[a.dir].includes(u.key);p&&f&&(i.onOpenChange(!1),s.trigger?.focus(),u.preventDefault())})})})})})});Kg.displayName=Wg;function zg(e){return e?"open":"closed"}function Aa(e){return e==="indeterminate"}function Nl(e){return Aa(e)?"indeterminate":e?"checked":"unchecked"}function EN(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}function NN(e,t){return e.map((n,r)=>e[(t+r)%e.length])}function PN(e,t,n){const r=t.length>1&&Array.from(t).every(s=>s===t[0])?t[0]:t,o=n?e.indexOf(n):-1;let i=NN(e,Math.max(o,0));r.length===1&&(i=i.filter(s=>s!==n));const a=i.find(s=>s.toLowerCase().startsWith(r.toLowerCase()));return a!==n?a:void 0}function RN(e,t){const{x:n,y:r}=e;let o=!1;for(let i=0,a=t.length-1;i<t.length;a=i++){const s=t[i],l=t[a],d=s.x,u=s.y,p=l.x,f=l.y;u>r!=f>r&&n<(p-d)*(r-u)/(f-u)+d&&(o=!o)}return o}function IN(e,t){return t?RN({x:e.clientX,y:e.clientY},t):!1}function Do(e){return t=>t.pointerType==="mouse"?e(t):void 0}var DN=Ag,LN=Sl,ON=Ng,$N=Pg,MN=xl,FN=Rg,jN=xa,BN=Lg,UN=$g,GN=Fg,HN=Bg,VN=Ug,WN=Gg,KN=Vg,zN=Kg,Ea="DropdownMenu",[qN,tO]=nt(Ea,[Tg]),st=Tg(),[JN,qg]=qN(Ea),Jg=e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:o,defaultOpen:i,onOpenChange:a,modal:s=!0}=e,l=st(t),d=j(null),[u,p]=_t({prop:o,defaultProp:i??!1,onChange:a,caller:Ea});return c(JN,{scope:t,triggerId:ot(),triggerRef:d,contentId:ot(),open:u,onOpenChange:p,onOpenToggle:te(()=>p(f=>!f),[p]),modal:s,children:c(DN,{...l,open:u,onOpenChange:p,dir:r,modal:s,children:n})})};Jg.displayName=Ea;var Yg="DropdownMenuTrigger",Xg=M((e,t)=>{const{__scopeDropdownMenu:n,disabled:r=!1,...o}=e,i=qg(Yg,n),a=st(n);return c(LN,{asChild:!0,...a,children:c(oe.button,{type:"button",id:i.triggerId,"aria-haspopup":"menu","aria-expanded":i.open,"aria-controls":i.open?i.contentId:void 0,"data-state":i.open?"open":"closed","data-disabled":r?"":void 0,disabled:r,...o,ref:gi(t,i.triggerRef),onPointerDown:W(e.onPointerDown,s=>{!r&&s.button===0&&s.ctrlKey===!1&&(i.onOpenToggle(),i.open||s.preventDefault())}),onKeyDown:W(e.onKeyDown,s=>{r||(["Enter"," "].includes(s.key)&&i.onOpenToggle(),s.key==="ArrowDown"&&i.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(s.key)&&s.preventDefault())})})})});Xg.displayName=Yg;var YN="DropdownMenuPortal",Qg=e=>{const{__scopeDropdownMenu:t,...n}=e,r=st(t);return c(ON,{...r,...n})};Qg.displayName=YN;var Zg="DropdownMenuContent",ev=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=qg(Zg,n),i=st(n),a=j(!1);return c($N,{id:o.contentId,"aria-labelledby":o.triggerId,...i,...r,ref:t,onCloseAutoFocus:W(e.onCloseAutoFocus,s=>{a.current||o.triggerRef.current?.focus(),a.current=!1,s.preventDefault()}),onInteractOutside:W(e.onInteractOutside,s=>{const l=s.detail.originalEvent,d=l.button===0&&l.ctrlKey===!0,u=l.button===2||d;(!o.modal||u)&&(a.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)"}})});ev.displayName=Zg;var XN="DropdownMenuGroup",QN=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(MN,{...o,...r,ref:t})});QN.displayName=XN;var ZN="DropdownMenuLabel",eP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(FN,{...o,...r,ref:t})});eP.displayName=ZN;var tP="DropdownMenuItem",tv=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(jN,{...o,...r,ref:t})});tv.displayName=tP;var nP="DropdownMenuCheckboxItem",rP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(BN,{...o,...r,ref:t})});rP.displayName=nP;var oP="DropdownMenuRadioGroup",iP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(UN,{...o,...r,ref:t})});iP.displayName=oP;var aP="DropdownMenuRadioItem",sP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(GN,{...o,...r,ref:t})});sP.displayName=aP;var cP="DropdownMenuItemIndicator",lP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(HN,{...o,...r,ref:t})});lP.displayName=cP;var dP="DropdownMenuSeparator",uP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(VN,{...o,...r,ref:t})});uP.displayName=dP;var pP="DropdownMenuArrow",fP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(WN,{...o,...r,ref:t})});fP.displayName=pP;var mP="DropdownMenuSubTrigger",hP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(KN,{...o,...r,ref:t})});hP.displayName=mP;var gP="DropdownMenuSubContent",vP=M((e,t)=>{const{__scopeDropdownMenu:n,...r}=e,o=st(n);return c(zN,{...o,...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)"}})});vP.displayName=gP;var yP=Jg,bP=Xg,_P=Qg,wP=ev,nv=tv;function SP({assignProjectDisabled:e,disabled:t,onAssignProject:n,onForget:r,title:o}){return h(yP,null,h(bP,{asChild:!0},h("button",{"aria-label":`Actions for ${o}`,className:"feed-menu-trigger",type:"button"},"⋯")),h(_P,null,h(wP,{align:"end",className:"feed-menu-panel",side:"bottom",sideOffset:4},h(nv,{className:"feed-menu-item",disabled:e,onSelect:()=>n()},e?"Moving…":"Assign to project…"),h(nv,{className:"feed-menu-item danger",disabled:t,onSelect:()=>r()},t?"Forgetting…":"Forget memory"))))}function CP({modes:e,active:t,onSelect:n}){return e.length<=1?null:h("div",{className:"feed-toggle"},e.map(r=>h("button",{key:r.id,className:`toggle-button${r.id===t?" active":""}`,"data-filter":r.id,onClick:()=>n(r.id),type:"button"},r.label)))}function Pl({label:e,variant:t=""}){return h(nl,{variant:"provenance",tone:t||void 0},e)}function TP({tag:e}){const t=Eh(e);return t?h(nl,{variant:"tag",title:String(e)},t):null}function kP({item:e,onReplace:t,onRemove:n,onViewRefresh:r,onReload:o}){const i=da(e?.metadata_json),a=Ta(e,i),s=oN(e,i),l=ut(e),d=e.title||"(untitled)",u=a&&i?.request?i.request:d,p=e.created_at||e.created_at_utc,f=Bx(p),m=la(e.tags||[]),v=la(e.files||[]),g=e.project||"",y=Xx(e),_=String(e.visibility||i?.visibility||"private").trim(),w=String(e.workspace_kind||i?.workspace_kind||"").trim(),C=String(e.origin_source||i?.origin_source||"").trim(),T=String(e.origin_device_id||i?.origin_device_id||"").trim(),x=String(e.trust_state||i?.trust_state||"").trim(),E=m.length?` · ${m.map(le=>Eh(le)).join(", ")}`:"",L=v.length?` · ${Vx(v)}`:"",F=Number(e.id||0),H=F>0?`ID ${F}`:"",[R,U]=O(b.newItemKeys.has(l)),B=a?rN({...e,metadata_json:i}):null,N=a?null:AA({...e,metadata_json:i}),P=N?EA(N):[],X=N?NA(N):"summary",z=b.itemViewState.get(l),[k,D]=O(N&&z&&P.some(le=>le.id===z)?z:X),I=`${l}:${k}`,[K,me]=O(b.itemExpandState.get(I)===!0),[ue,ie]=O(_==="shared"?"shared":"private"),[xe,Se]=O(!1),[Te,Y]=O(!1),[we,ae]=O(!1),Q=B?tN(B):[];G(()=>{N&&(P.some(le=>le.id===k)||D(X))},[k,X,P,N]),G(()=>{b.itemViewState.set(l,k)},[k,l]),G(()=>{const le=`${l}:${k}`;me(b.itemExpandState.get(le)===!0)},[k,l]),G(()=>{ie(_==="shared"?"shared":"private")},[_]),G(()=>{if(!R)return;const le=window.setTimeout(()=>{b.newItemKeys.delete(l),U(!1)},700);return()=>window.clearTimeout(le)},[R,l]);const Ae=ue,ce=Ae==="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.",De=[g?`Project ${g}`:"No project",f].filter(Boolean).join(" · "),se=[w&&w!==_?`Workspace ${w}`:"",C?`From ${C}`:"",T&&y!=="You"?`Device ${T}`:"",x&&x!=="trusted"?Yx(x):""].filter(Boolean).join(" · "),Ye=[`${E}${L}`.trim(),se].filter(Boolean).join(" · "),pt=!!N&&PA(k,N),Xe=[k==="facts"?"feed-body facts":"feed-body",pt&&!K?RA(k).join(" "):""].filter(Boolean).join(" "),cn=a?Q.length?h("div",{className:"feed-body facts"},Q):Sg(String(e.body_text||""))||h("div",{className:"feed-body"}):N?k==="facts"?nN(N.facts)||h("div",{className:Xe}):Sg(k==="narrative"?N.narrative:N.summary,Xe)||h("div",{className:Xe}):h("div",{className:"feed-body"});async function It(le){const re=Ae;ie(le),Se(!0);try{const Be=await K_(F,le);Be?.item&&(t(Be.item),r()),Z(le==="shared"?"Memory will now sync as shared context.":"Memory is private again.")}catch(Be){ie(re),Z(Be instanceof Error?Be.message:"Failed to save visibility.","warning")}finally{Se(!1)}}async function Ct(){const le=String(e.project||"").trim(),re=le,Be=String(u||"this memory").trim(),Rn=Be.length>80?`${Be.slice(0,79).trimEnd()}…`:Be,Qo=le?`Move "${Rn}" from "${le}" 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 "${Rn}". Pick an existing project or type a new name. Every memory in the same session will be reassigned together.`;let ln=[];try{ln=(await Si()).filter(ft=>ft&&ft!==le)}catch{}const lr=await Vc({title:"Assign to project",description:Qo,initialValue:re,placeholder:"Pick one or type a new project name",suggestions:ln,confirmLabel:"Move",cancelLabel:"Cancel",validate:ft=>{const Dn=ft.trim();return Dn?Dn===le?"Already assigned to this project.":null:"Enter a project name."}});if(lr==null)return;const In=lr.trim();if(!(!In||In===le)){ae(!0);try{const ft=await z_(F,In),Dn=Number(ft.moved_memory_count||1);Z(Dn>1?`Moved ${Dn} memories from this session to "${ft.project}".`:`Moved to "${ft.project}".`),await o(),r()}catch(ft){Z(ft instanceof Error?ft.message:"Failed to move memory.","warning")}finally{ae(!1)}}}async function Dt(){const le=String(u||"this memory").trim();if(await Gt({autoFocusAction:"cancel",title:"Forget this memory?",description:`Forgetting "${le.length>80?`${le.slice(0,79).trimEnd()}…`:le}". 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"})){Y(!0);try{await q_(F),n(F),r(),await o(),Z("Memory forgotten and removed from the active feed.")}catch(re){Z(re instanceof Error?re.message:"Failed to forget memory.","warning")}finally{Y(!1)}}}const Qe=s.replace(/_/g," "),Lt=v.length?h("div",{className:"feed-files"},v.map((le,re)=>h("span",{className:"feed-file",key:`${String(le)}-${re}`},String(le)))):null;return h("article",{className:`feed-item ${s}${R?" new-item":""}`.trim(),"data-key":l},h("div",{className:"feed-kind-banner"},h(nl,{variant:"kind",tone:s},Qe)),h("div",{className:"feed-card-body"},h("div",{className:"feed-card-header"},h("div",{className:"feed-header"},h("div",{className:"feed-title title",dangerouslySetInnerHTML:{__html:Sw(u,b.feedQuery)}}),h("div",{className:"feed-card-subtitle small"},De)),h("div",{className:"feed-actions"},N?h(CP,{active:k,modes:P,onSelect:le=>D(le)}):null,h(ha,{label:jx(p),side:"left"},h("div",{className:"small feed-age"},f)),e.owned_by_self&&F>0?h(SP,{assignProjectDisabled:we,disabled:Te,onAssignProject:()=>{Ct()},onForget:()=>{Dt()},title:String(u||"memory")}):null)),h("div",{className:"feed-provenance"},h(Pl,{label:y,variant:y==="You"?"mine":"author"}),h(Pl,{label:_||"private",variant:_||"private"}),H?h(ha,{label:`Memory database id ${F}`,side:"top"},h(Pl,{label:H,variant:"memory-id"})):null),h("div",{className:"feed-meta"},Ye||"No tags, files, or provenance details attached."),cn,h("div",{className:"feed-footer"},h("div",{className:"feed-footer-left"},m.length?h("div",{className:"feed-tags"},m.map((le,re)=>h(TP,{key:`${String(le)}-${re}`,tag:le}))):null,e.owned_by_self&&F>0?h("div",{className:"feed-visibility-controls"},h("select",{"aria-label":`Visibility for ${String(e.title||"memory")}`,className:"feed-visibility-select",disabled:xe,onChange:le=>{It(String(le.currentTarget.value)==="shared"?"shared":"private")},value:Ae},h("option",{value:"private"},"Only me"),h("option",{value:"shared"},"Share with peers")),h("div",{className:"feed-visibility-note"},ce)):null),h("div",{className:"feed-footer-right"},pt?h("button",{className:"feed-expand",onClick:()=>{const le=!K;b.itemExpandState.set(I,le),me(le)},type:"button"},K?"Collapse":"Expand"):null)),Lt))}function xP({index:e}){const t=[["w-85","w-65"],["w-85","w-40"],["w-65","w-85"]],[n,r]=t[e%t.length];return h("div",{className:"feed-skeleton-item","aria-hidden":"true"},h("div",{className:"feed-skeleton-banner"}),h("div",{className:"feed-skeleton-body"},h("div",{className:`feed-skeleton-line ${n}`}),h("div",{className:`feed-skeleton-line ${r}`}),h("div",{className:"feed-skeleton-footer"},h("div",{className:"feed-skeleton-chip w-36"}),h("div",{className:"feed-skeleton-chip w-56"}),h("div",{className:"feed-skeleton-chip"}))))}function AP({items:e,loadingText:t,ops:n}){if(t)return h("div",{className:"feed-skeleton",role:"status","aria-label":t},[0,1,2,3].map(r=>h(xP,{index:r,key:`skeleton-${r}`})));if(!e.length){const r=!!b.feedQuery.trim()||b.feedTypeFilter!=="all"||b.feedScopeFilter!=="all";return h("div",{className:"small feed-empty-state"},h("strong",null,r?"No memories match the current filters.":"No memories yet."),h("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 h(ee,null,e.map(r=>h(kP,{item:r,key:ut(r),onReplace:n.replaceFeedItem,onRemove:n.removeFeedItem,onViewRefresh:()=>n.updateFeedView(!0),onReload:n.loadFeedData})))}function rv({id:e,active:t,options:n,onSelect:r}){return h("div",{className:"feed-toggle",id:e},n.map(({value:o,label:i})=>{const a=o===t;return h("button",{"aria-pressed":a?"true":"false",className:`toggle-button${a?" active":""}`,"data-filter":o,key:o,onClick:()=>r(o),type:"button"},i)}))}function EP({items:e,loadingText:t,ops:n}){const[r,o]=O(!1);return h(ee,null,h("div",{className:"feed-controls"},h("div",{className:"section-meta",id:"feedMeta"},t||IA(e.length,n.hasMorePages())),h("div",{className:"feed-controls-right"},h("input",{className:"feed-search",id:"feedSearch",onInput:i=>{b.feedQuery=String(i.currentTarget.value||""),n.updateFeedView()},placeholder:"Search title, body, tags…",value:b.feedQuery}),h(rv,{active:b.feedScopeFilter,id:"feedScopeToggle",onSelect:i=>{i!==b.feedScopeFilter&&(Ip(i),n.loadFeedData())},options:[{value:"all",label:"All"},{value:"mine",label:"My memories"},{value:"theirs",label:"Other people"}]}),h(rv,{active:b.feedTypeFilter,id:"feedTypeToggle",onSelect:i=>{i!==b.feedTypeFilter&&(Lw(i),n.updateFeedView())},options:[{value:"all",label:"All"},{value:"observations",label:"Observations"},{value:"summaries",label:"Summaries"}]}),h("button",{"aria-controls":"contextInspectorPanel","aria-expanded":r,className:"settings-button feed-inspector-button",onClick:()=>o(i=>!i),type:"button"},r?"Hide Context Inspector":"Context Inspector"))),h(DA,{open:r}),h("div",{className:"feed-list",id:"feedList"},h(AP,{items:e,loadingText:t,ops:n})))}function NP(e){return b.feedTypeFilter==="observations"?e.filter(t=>!Ta(t,da(t?.metadata_json))):b.feedTypeFilter==="summaries"?e.filter(t=>Ta(t,da(t?.metadata_json))):e}function PP(e){const t=Nt(b.feedQuery);return t?e.filter(n=>[Nt(n?.title),Nt(n?.body_text),Nt(n?.kind),la(n?.tags||[]).map(r=>Nt(r)).join(" "),Nt(n?.project)].join(" ").trim().includes(t)):e}function RP(e){const t=e.map(n=>`${Ph(n)}:${n.kind||""}:${n.created_at_utc||n.created_at||""}`);return`${b.feedTypeFilter}|${b.feedScopeFilter}|${b.currentProject}|${Nt(b.feedQuery)}|${t.join("|")}`}var ov="",Lo=0,Oo=0,$o=!0,Mo=!0,Rl=!1,iv=!1,Fo=0,Il="all";function IP(e){ov=e,Il=b.feedScopeFilter,Fo+=1,Lo=0,Oo=0,$o=!0,Mo=!0,b.lastFeedItems=[],b.pendingFeedItems=null,b.lastFeedFilteredCount=0,b.lastFeedSignature="",b.newItemKeys.clear(),b.itemViewState.clear(),b.itemExpandState.clear()}function Dl(){return $o||Mo}function DP(e){const t=ut(e);b.lastFeedItems=b.lastFeedItems.map(n=>ut(n)===t?e:n)}function LP(e){const t=new Set,n=r=>{const o=Number(r.id||r.memory_id||0)!==e;return o||t.add(ut(r)),o};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 o of Array.from(b.itemExpandState.keys()))o.startsWith(`${r}:`)&&b.itemExpandState.delete(o)}}async function OP(){if(Rl||!Dl())return;const e=b.currentProject||"",t=Fo,n=Lo,r=Oo;Rl=!0;try{const[o,i]=await Promise.all([$o?gp(e,{limit:20,offset:n,scope:b.feedScopeFilter}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:n}}),Mo?vp(e,{limit:50,offset:r,scope:b.feedScopeFilter}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:r}})]);if(t!==Fo||e!==(b.currentProject||""))return;const a=i.items||[],s=o.items||[],l=s.filter(u=>!Nh(u));b.lastFeedFilteredCount+=s.length-l.length,Mo=ua(i,a.length,50),$o=ua(o,s.length,20),Oo=pa(i,r+a.length),Lo=pa(o,n+s.length);const d=[...a,...l];b.lastFeedItems=Rh(b.lastFeedItems,d),jo()}finally{Rl=!1}}function av(){b.activeTab==="feed"&&Dl()&&Zx()&&OP()}var $P={replaceFeedItem:DP,removeFeedItem:LP,updateFeedView:e=>jo(e),loadFeedData:()=>sv(),hasMorePages:Dl};function Ll(e,t){const n=document.getElementById("tab-feed");if(!n)return!1;TA(n,h(EP,{items:e,loadingText:t?.loadingText,ops:$P}));const r=globalThis.lucide;return r&&!t?.loadingText&&r.createIcons(),!0}function MP(){Ll([],{loadingText:"Loading selected project..."})}function FP(){CA(),Ll(b.lastFeedItems,b.lastFeedItems.length||b.lastFeedSignature?void 0:{loadingText:"Loading memories…"}),iv||(window.addEventListener("scroll",()=>{av()},{passive:!0}),iv=!0)}function jo(e=!1){if(!document.getElementById("tab-feed"))return;const t=window.scrollY,n=PP(NP(b.lastFeedItems)),r=RP(n),o=e||r!==b.lastFeedSignature;b.lastFeedSignature=r,o&&Ll(n),window.scrollTo({top:t}),av()}async function sv(){const e=b.currentProject||"",t=b.feedScopeFilter!==Il;(e!==ov||t)&&(IP(e),MP());const n=Fo,r=20,o=50,[i,a]=await Promise.all([gp(e,{limit:r,offset:0,scope:b.feedScopeFilter}),vp(e,{limit:o,offset:0,scope:b.feedScopeFilter})]);if(n!==Fo||e!==(b.currentProject||""))return;const s=a.items||[],l=i.items||[],d=l.filter(v=>!Nh(v)),u=l.length-d.length,p=[...s,...d].sort((v,g)=>new Date(g.created_at||0).getTime()-new Date(v.created_at||0).getTime()),f=Qx(b.lastFeedItems,p),m=b.lastFeedItems;if(eA(f,m)&&m.length>0){const v=new Set(m.map(ut));f.forEach(g=>{v.has(ut(g))||b.newItemKeys.add(ut(g))})}b.pendingFeedItems=null,b.lastFeedItems=f,b.lastFeedFilteredCount=Math.max(b.lastFeedFilteredCount,u),Mo=ua(a,s.length,o),$o=ua(i,l.length,r),Oo=Math.max(Oo,pa(a,s.length)),Lo=Math.max(Lo,pa(i,l.length)),Il=b.feedScopeFilter,jo()}function nO(e){return e}function jP({label:e,value:t,detail:n,icon:r,className:o,title:i}){const a=h("div",{class:`stat${o?` ${o}`:""}`,style:i?"cursor: help;":void 0},r?h("i",{"data-lucide":r,class:"stat-icon"}):null,h("div",{class:"stat-content"},h("div",{class:"value"},t),h("div",{class:"label"},e),n?h("div",{class:"small"},n):null));return i?h(ha,{label:i},a):a}function BP({item:e}){let t=null,n=null;const r=e.actionLabel||"Run";async function o(){if(!(!e.action||!t)){t.disabled=!0,t.textContent="Running…";try{await e.action()}catch{}t.disabled=!1,t.textContent=r}}function i(){!e.command||!n||ro(e.command,n)}return h("div",{class:"health-action"},h("div",{class:"health-action-text"},e.label,e.command?h("span",{class:"health-action-command"},e.command):null),h("div",{class:"health-action-buttons"},e.action?h("button",{class:"settings-button",onClick:o,ref:a=>{t=a}},r):null,e.command?h("button",{class:"settings-button health-action-copy",onClick:i,ref:a=>{n=a}},"Copy"):null))}function UP(e){return typeof e=="number"?e.toLocaleString():e==null?"n/a":String(e)}function GP({label:e,value:t,icon:n,tooltip:r}){const o=h("div",{class:"stat",style:r?"cursor: help;":void 0},h("i",{"data-lucide":n,class:"stat-icon"}),h("div",{class:"stat-content"},h("div",{class:"value"},UP(t)),h("div",{class:"label"},e)));return r?h(ha,{label:r},o):o}function cv(e,t){e&&Ve(h(el,null,t.map(n=>h(GP,{...n,key:`${n.label}-${n.icon}`}))),e)}function lv(e,t){e&&Ve(h(ee,null,t),e)}function Ol(){const e=globalThis.lucide;e&&typeof e.createIcons=="function"&&e.createIcons()}function HP(e,t){e&&Ve(h(el,null,t.map(n=>h(jP,{...n,key:n.key??n.label}))),e)}function VP(e,t){if(e){if(!t.length){e.hidden=!0,Ve(null,e);return}e.hidden=!1,Ve(h(ee,null,t.slice(0,3).map((n,r)=>h(BP,{item:n,key:`${n.label}-${r}`}))),e)}}var dv="scope_id_backfill";function uv(){const e=document.getElementById("healthGrid"),t=document.getElementById("healthMeta"),n=document.getElementById("healthActions"),r=document.getElementById("healthDot");if(!e||!t)return;const o=b.lastStatsPayload||{},i=b.lastUsagePayload||{},a=b.lastRawEventsPayload&&typeof b.lastRawEventsPayload=="object"?b.lastRawEventsPayload:{},s=b.lastSyncStatus||{},l=Array.isArray(o.maintenance_jobs)?o.maintenance_jobs:[],d=l.find(se=>se.kind===dv),u=o.reliability||{},p=u.counts||{},f=u.rates||{},m=o.database||{},v=i.totals_filtered||i.totals||i.totals_global||o.usage?.totals||{},g=Array.isArray(i.recent_packs)?i.recent_packs:[],y=g.length?g[0]?.created_at:null,_=g.length?g[0]?.metadata_json||{}:{},w=Number(_?.exact_duplicates_collapsed||0),C=Number(a.pending||0),T=Number(p.errored_batches||0),x=Number(f.flush_success_rate??1),E=Number(f.dropped_event_rate||0),L=Jc(v.tokens_saved,v.tokens_read),F=Gx(L),H=Number(m.tags_coverage||0),R=String(s.daemon_state||"unknown"),U=R==="offline-peers"?"Offline peers":R==="needs_attention"?"Needs attention":R==="rebootstrapping"?"Rebootstrapping":Ah(R),B=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers.length:0,N=R==="disabled"||s.enabled===!1,P=R==="offline-peers",X=!N&&B===0;let z=N?"Disabled":X?"No peers":U;const k=Ir(s.last_sync_at||s.last_sync_at_utc||null),D=Ir(y),I=k!==null&&k>7200,K=k!==null&&k<=300,me=C>=200;let ue=0;const ie=[];C>=1e3?(ue+=40,ie.push("high raw-event backlog")):C>=200&&(ue+=24,ie.push("growing raw-event backlog")),T>0&&C>=200&&(ue+=T>=5?10:6,ie.push("batch errors during backlog pressure")),x<.95&&(ue+=20,ie.push("lower flush success")),E>.02?(ue+=24,ie.push("high dropped-event rate")):E>.005&&(ue+=10,ie.push("non-trivial dropped-event rate")),!N&&!X&&(R==="error"?(ue+=36,ie.push("sync daemon reports errors")):R==="needs_attention"?(ue+=40,ie.push("sync needs manual attention")):R==="stopped"?(ue+=22,ie.push("sync daemon stopped")):R==="degraded"&&!K&&(ue+=20,ie.push("sync daemon degraded")),P?(ue+=4,ie.push("all peers currently offline"),I&&(ue+=4,ie.push("offline peers and sync not recent"))):I?(ue+=26,ie.push("sync looks stale")):k!==null&&k>1800&&(ue+=12,ie.push("sync not recent"))),F!==null&&F<10&&(ue+=8,ie.push("low retrieval reduction")),D!==null&&D>86400&&(ue+=12,ie.push("memory pack activity is old"));let xe="Healthy",Se="status-healthy";ue>=60?(xe="Attention",Se="status-attention"):ue>=25&&(xe="Degraded",Se="status-degraded");const Te=Se==="status-healthy";r&&(r.className=`health-dot ${Se}`,r.title=xe);const Y=`${Number(v.tokens_saved||0).toLocaleString()} saved tokens · ${w.toLocaleString()} deduped in latest pack`,we=C>0?"Queue is actively draining":"Queue is clear",ae=N?"Sync disabled":X?"No peers configured":P?`${B} peers offline · last sync ${Sn(k)} ago`:`${B} peers · last sync ${Sn(k)} ago`;Te&&!N&&!X&&(P?z="Peers offline":R==="degraded"&&K&&(z="Syncing"));const Q=`last pack ${Sn(D)} ago`,Ae=l.map(se=>{const Ye=Number(se.progress?.current||0),pt=typeof se.progress?.total=="number"?se.progress.total:null,Xe=String(se.progress?.unit||"items"),cn=pt&&pt>0?` (${Math.round(100*Ye/pt)}%)`:"",It=pt&&pt>0?`${Ye.toLocaleString()}/${pt.toLocaleString()} ${Xe}${cn}`:`${Ye.toLocaleString()} ${Xe}`,Ct=se.status==="failed",Dt=se.status==="completed",Qe=se.kind===dv,Lt=Ct?"Failed":Dt?"Complete":It,le=Ct?String(se.error||"unknown error").trim():Dt?Qe?`${It} · one-time Sharing-domain upgrade finished`:It:Qe?"One-time upgrade backfill; totals include memories and replication ops":void 0;return{key:String(se.kind||se.title||"background-maintenance"),label:String(se.title||se.kind||"Background maintenance"),value:Lt,detail:le,icon:Ct?"alert-triangle":Dt?"check-circle":"loader",className:Ct?"status-attention":void 0,title:Ct?`Error: ${se.error||"unknown"}`:Dt?`${String(se.title||"Maintenance")} finished`:Qe?`${String(se.title||"Maintenance")} in progress; inspect with codemem maintenance status`:`${String(se.title||"Maintenance")} in progress`}});HP(e,[{key:"overall-health",label:"Overall health",value:xe,detail:`Weighted score ${ue}`,icon:"heart-pulse",className:`health-primary ${Se}`,title:ie.length?`Main signals: ${ie.join(", ")}`:"No major risk signals detected"},...Ae,{key:"pipeline-health",label:"Pipeline health",value:`${C.toLocaleString()} pending`,detail:we,icon:"workflow",title:"Raw-event queue pressure and flush reliability"},{key:"retrieval-impact",label:"Retrieval impact",value:L,detail:Y,icon:"sparkles",title:"Reduction from memory reuse across recent usage"},{key:"sync-health",label:"Sync health",value:z,detail:ae,icon:"refresh-cw",title:"Daemon state and sync recency"},{key:"data-freshness",label:"Data freshness",value:Sn(D),detail:Q,icon:"clock-3",title:"Recency of last memory pack activity"}]);const ce=async()=>{await Us()},De=[];me?(De.push({label:"Pipeline needs attention. Check queue health first.",command:"codemem db raw-events-status"}),De.push({label:"Then retry failed batches for impacted sessions.",command:"codemem db raw-events-retry <opencode_session_id>"})):R==="stopped"?De.push({label:"Sync daemon is stopped. Start the background service.",command:"codemem serve start"}):!N&&!X&&!Te&&(R==="error"||R==="degraded")?(De.push({label:"Sync is unhealthy. Restart and run one immediate pass.",command:"codemem serve restart",action:ce,actionLabel:"Sync now"}),De.push({label:"Then run doctor to see root cause details.",command:"codemem sync doctor"})):!N&&!X&&I&&De.push({label:"Sync is stale. Run one immediate sync pass.",command:"codemem sync once",action:ce,actionLabel:"Sync now"}),H>0&&H<.7&&De.length<2&&De.push({label:"Tag coverage is low. Preview backfill impact.",command:"codemem db backfill-tags --dry-run"}),d&&d.status!=="completed"&&De.length<3&&De.push({label:"Sharing-domain upgrade backfill is expected one-time work. Inspect progress if startup feels busy.",command:"codemem maintenance status"}),VP(n,De),t.textContent=ie.length?`Why this status: ${ie.join(", ")}.`:"Healthy right now. Diagnostics stay available if you want details.",Ol()}function WP(){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 o=n?.totals_filtered||null,i=!!(r&&o),a=(Array.isArray(n?.events)?n.events:[]).find(x=>x.event==="pack")||null,s=Array.isArray(n?.recent_packs)?n.recent_packs:[],l=s.length?s[0]:null,d=l?.metadata_json||{},u=l?.created_at||"",p=Number(a?.count||0),f=Number(l?.tokens_read||0),m=Number(l?.tokens_saved||0),v=Number(d?.exact_duplicates_collapsed||0),g=!!d?.exact_dedupe_enabled,y=Jc(m,f),_=p?`${p} packs`:"No packs yet",w=u?`Last pack: ${Xn(u)}`:"",C=i?"Project":"All projects",T=[{label:"Last pack savings",value:l?`${yo(m)} (${y})`:"n/a",tooltip:l?`Exact: ${m.toLocaleString()} saved`:void 0,icon:"trending-up"},{label:"Last pack size",value:l?yo(f):"n/a",tooltip:l?`Exact: ${f.toLocaleString()} injected`:void 0,icon:"package"},{label:"Last pack deduped",value:l?v.toLocaleString():"n/a",icon:"copy-check"},{label:"Exact dedupe",value:l?g?"On":"Off":"n/a",icon:"shield-check"},{label:"Packs",value:p||0,icon:"archive"}];lv(t,[C,_,w].filter(Boolean).join(" · ")),cv(e,T),Ol()}function KP(){const e=document.getElementById("statsGrid"),t=document.getElementById("metaLine");if(!e)return;const n=b.lastStatsPayload||{},r=b.lastUsagePayload||{},o=b.lastRawEventsPayload&&typeof b.lastRawEventsPayload=="object"?b.lastRawEventsPayload:{},i=n.database||{},a=b.currentProject,s=r?.totals_global||r?.totals||n.usage?.totals||{},l=r?.totals_filtered||null,d=!!(a&&l),u=d?l:s,p=Number(o.sessions||0),f=Number(o.pending||0),m=d?`
|
|
112
112
|
Global: ${Number(s.work_investment_tokens||0).toLocaleString()} invested`:"",v=d?`
|
|
113
113
|
Global: ${Number(s.tokens_read||0).toLocaleString()} read`:"",g=d?`
|
|
114
|
-
Global: ${Number(s.tokens_saved||0).toLocaleString()} saved`:"",y=[{label:d?"Savings (project)":"Savings",value:yo(u.tokens_saved||0),tooltip:`Tokens saved by reusing compressed memories. Exact: ${Number(u.tokens_saved||0).toLocaleString()} saved${g}`,icon:"trending-up"},{label:d?"Injected (project)":"Injected",value:yo(u.tokens_read||0),tooltip:`Tokens injected into context (pack size). Exact: ${Number(u.tokens_read||0).toLocaleString()} injected${v}`,icon:"book-open"},{label:d?"Reduction (project)":"Reduction",value:Jc(u.tokens_saved,u.tokens_read),tooltip:`Percent reduction from reuse. Factor: ${Ux(u.tokens_saved,u.tokens_read)}.`+v+g,icon:"percent"},{label:d?"Work investment (project)":"Work investment",value:yo(u.work_investment_tokens||0),tooltip:`Token cost of unique discovery groups. Exact: ${Number(u.work_investment_tokens||0).toLocaleString()} invested${m}`,icon:"pencil"},{label:"Active memories",value:i.active_memory_items||0,icon:"check-circle"},{label:"Embedding coverage",value:xh(i.vector_coverage),tooltip:"Share of active memories with embeddings",icon:"layers"},{label:"Tag coverage",value:xh(i.tags_coverage),tooltip:"Share of active memories with tags",icon:"tag"}];if(f>0?y.push({label:"Raw events pending",value:f,tooltip:"Pending raw events waiting to be flushed",icon:"activity"}):p>0&&y.push({label:"Raw sessions",value:p,tooltip:"Sessions with pending raw events",icon:"inbox"}),cv(e,y),t){const _=a?` · project: ${a}`:"";lv(t,`DB: ${Wx(i.path||"unknown")} · ${Kx(i.size_bytes||0)}${_}`)}Ol()}async function zP(){const e=b.lastStatsPayload?.identity?.actor_id||null,[t,n,r,o]=await Promise.all([Q_(),Z_(b.currentProject),ew(b.currentProject),tw(b.currentProject)]);b.lastStatsPayload=t||{},b.lastUsagePayload=n||{},b.lastRawEventsPayload=o||{};const i=b.lastStatsPayload?.identity?.actor_id||null;KP(),WP(),uv(),b.activeTab==="feed"&&e!==i&&jo(!0)}var pv=[["","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"]],ct=null,Bo=0,$l=250,Ml=[],Fl=new Set,jl=new Set,Na=new Map,Pa=new Map,rr=new Map,Uo=new Map,Ra=!1,Go=!1;function yt(e){return document.getElementById(e)}function qP(e){return pv.find(([t])=>t===e)?.[1]??e.replaceAll("_"," ")}function JP(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 Fr(e){return e.read_only===!0&&e.read_only_reason==="peer_received"}function fv(e){return e.identity_source!=="unmapped"&&!Fr(e)}function Bl(e){return Fr(e)?"Received from peers":Ia(e.resolved_scope_id)}function YP(e){return Fr(e)?"source-owned project":JP(e.resolution_reason)}function XP(e){if(!e)return"No recent sessions";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function mv(e){return e.git_remote?e.git_remote:e.cwd?e.cwd:e.workspace_identity}function Ul(e){return e.git_remote?`git:${e.git_remote}`:e.project?`project:${e.project}`:`identity:${e.workspace_identity}`}function hv(e){return e.project||e.display_project||mv(e)}function gv(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 QP(){return new Set(b.lastCoordinatorAdminGroups.filter(e=>!e.archived_at).map(e=>String(e.group_id||"").trim()).filter(Boolean))}function ZP(e){return!Go||e.authority_type!=="coordinator"||!e.group_id?!1:!QP().has(String(e.group_id).trim())}function vv(){const e=document.activeElement;return e instanceof HTMLSelectElement&&e.classList.contains("project-domain-select")}function yv(){Ra&&(Ra=!1,ct?.())}async function eR(){try{const e=await no();b.lastCoordinatorAdminStatus=e&&typeof e=="object"?e:null}catch{b.lastCoordinatorAdminStatus=null,b.lastCoordinatorAdminGroups=[],Go=!1;return}if(b.lastCoordinatorAdminStatus?.readiness!=="ready"||!b.lastCoordinatorAdminStatus.has_admin_secret){b.lastCoordinatorAdminGroups=[],Go=!1;return}try{const e=await fp(!1);b.lastCoordinatorAdminGroups=Array.isArray(e?.items)?e.items:[],Go=!0}catch{b.lastCoordinatorAdminGroups=[],Go=!1}}function tR(e){return e.kind==="team_default"}function Gl(e){const t=e.label||"Untitled Space";return tR(e)?`${t} (default)`:t}function nR(e,t){const n=Gl(e);return t.some(r=>r.scope_id!==e.scope_id&&Gl(r)===n)?`${n} · Space ID ${e.scope_id}`:n}function rR(e){const t=gv(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 oR(e){return e?Ml.find(t=>t.scope_id===e)??null:null}function Ia(e){const t=oR(e);return e?t?`${Gl(t)} · ${rR(t)}`:"Unknown Space":"—"}function Hl(){return Ml.filter(e=>e.scope_id!=="legacy-shared-review"&&!ZP(e))}function iR(e){return Hl().some(t=>t.scope_id===e)}function bv(...e){for(const t of e)if(t&&iR(t))return t;return e.find(t=>!!t)??""}function aR(e){const t=gv(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Spaces":"Other Spaces"}function sR(e){return e.group_id?`team:${e.group_id}`:`${e.authority_type||"other"}:${e.kind||"space"}`}function cR(){const e=new Map;for(const t of Hl()){const n=sR(t),r=aR(t),o=e.get(n)??{label:r,scopes:[]};e.set(n,{label:o.label,scopes:[...o.scopes,t]})}return[...e.values()]}function _v(e){for(const t of cR()){const n=document.createElement("optgroup");n.label=t.label;for(const r of t.scopes){const o=document.createElement("option");o.value=r.scope_id,o.textContent=nR(r,t.scopes),n.appendChild(o)}e.appendChild(n)}}function lR(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 Vl(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}),rr.delete(e.workspace_identity),Na.delete(e.workspace_identity),Z("Project Space assignment updated. Device access grants are unchanged."),ct?.()}catch(r){if(r instanceof Ci){rr.set(e.workspace_identity,{requiredGuardrailTokens:r.requiredGuardrailTokens,scopeId:t,warnings:r.guardrailWarnings}),ct?.();return}Z(r instanceof Error?r.message:"Unable to update project Space.","warning")}}async function dR(e,t){const n=e.filter(fv);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}))}),Z(`Updated ${n.length} project identit${n.length===1?"y":"ies"}. Device access grants are unchanged.`),Pa.delete(Ul(n[0])),ct?.()}catch(r){Z(r instanceof Ci?"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 uR(e){if(e.mapping_id!=null)try{await uw(e.mapping_id),rr.delete(e.workspace_identity),Na.delete(e.workspace_identity),Z("Project Space assignment removed. The next fallback now applies."),ct?.()}catch(t){Z(t instanceof Error?t.message:"Unable to remove project Space assignment.","warning")}}async function wv(e,t=!1){try{const n=Uo.get(e.workspace_identity),r=await fw({...t&&n?{confirmation_token:n.confirmationToken}:{},confirmed:t,workspace_identity:e.workspace_identity});Uo.delete(e.workspace_identity),Z(`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.`),ct?.()}catch(n){if(n instanceof _p){Uo.set(e.workspace_identity,{confirmationToken:n.preview.confirmation_token,localOwnedMemoryCount:n.preview.local_owned_memory_count,peerOwnedMemoryCount:n.preview.peer_owned_memory_count}),ct?.();return}Z(n instanceof Error?n.message:"Unable to forget project memories.","warning")}}async function pR(e){if(e.identity_source==="unmapped")return;const t=String(e.project||e.display_project||"").trim();let n=[];try{n=(await Si()).filter(o=>o&&o!==t)}catch{}const r=await Vc({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:o=>{const i=o.trim();return i?i===t?"Already assigned to this project.":null:"Enter a project name."}});if(r!=null)try{const o=await pw({project:r.trim(),workspace_identity:e.workspace_identity});Z(`Changed project to ${o.project} for ${o.moved_session_count} session${o.moved_session_count===1?"":"s"}.`),ct?.()}catch(o){Z(o instanceof Error?o.message:"Unable to change project.","warning")}}function fR(e){const t=document.createElement("div");if(t.className="project-inventory-actions",Fr(e)){const m=document.createElement("div");return m.className="settings-note",m.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(m),t}if(e.identity_source==="unmapped"){const m=document.createElement("div");return m.className="settings-note",m.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(m),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 o=document.createElement("select");o.id=r,o.className="project-domain-select";const i=Hl().some(m=>m.scope_id===e.resolved_scope_id);if(!i&&e.resolved_scope_id){const m=document.createElement("option");m.value=e.resolved_scope_id,m.textContent=`${Ia(e.resolved_scope_id)} — not assignable`,m.disabled=!0,o.appendChild(m)}_v(o),o.value=bv(Na.get(e.workspace_identity),e.suggested_scope_id,e.resolved_scope_id);const a=document.createElement("button");a.className="settings-button",a.type="button",a.textContent=e.suggested_scope_id&&o.value===e.suggested_scope_id?"Confirm suggestion":"Save Space",a.disabled=!o.value||o.value===e.resolved_scope_id&&!i,a.addEventListener("click",()=>{Vl(e,o.value)}),o.addEventListener("change",()=>{Na.set(e.workspace_identity,o.value),rr.delete(e.workspace_identity),t.querySelector(".project-space-guardrail-confirmation")?.remove(),a.textContent="Save Space",a.disabled=!o.value,ct?.()}),o.addEventListener("blur",yv);const s=document.createElement("button");s.className="settings-button",s.type="button",s.textContent="Keep local-only",s.addEventListener("click",()=>{Vl(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",()=>{uR(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",()=>{pR(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",()=>{wv(e)}),t.append(n,o,a,s,l,d,u);const p=rr.get(e.workspace_identity);if(p){const m=document.createElement("div");m.className="settings-note project-guardrail-confirmation project-space-guardrail-confirmation",m.setAttribute("role","alert");const v=document.createElement("strong");v.textContent="Confirmation required before saving this Space.";const g=document.createElement("p");g.textContent="Codemem can save this change after you acknowledge the checks below. Verify the workspace details, then confirm to complete the save.";const y=document.createElement("ul");for(const C of p.warnings){const T=document.createElement("li"),x=document.createElement("strong");x.textContent=`${lR(C)}: `;const E=document.createElement("span");E.textContent=C.message,T.append(x,E),y.appendChild(T)}const _=document.createElement("button");_.className="settings-button",_.type="button",_.textContent="I understand, save Space",_.addEventListener("click",()=>{const C=rr.get(e.workspace_identity);!C||C.scopeId!==o.value||Vl(e,C.scopeId,C.requiredGuardrailTokens)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{rr.delete(e.workspace_identity),ct?.()}),m.append(v,g,y,_,w),t.appendChild(m)}const f=Uo.get(e.workspace_identity);if(f){const m=document.createElement("div");m.className="settings-note project-guardrail-confirmation",m.setAttribute("role","alert");const v=document.createElement("strong");v.textContent="Confirm project memory cleanup.";const g=document.createElement("p");g.textContent=`${f.localOwnedMemoryCount.toLocaleString()} locally owned memor${f.localOwnedMemoryCount===1?"y":"ies"} will be forgotten. ${f.peerOwnedMemoryCount.toLocaleString()} peer-owned memor${f.peerOwnedMemoryCount===1?"y":"ies"} will be left unchanged.`;const y=document.createElement("p");y.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",()=>{wv(e,!0)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{Uo.delete(e.workspace_identity),ct?.()}),m.append(v,g,y,_,w),t.appendChild(m)}return t}function Sv(e){const t=document.createElement("article");t.className="project-inventory-row";const n=document.createElement("div");n.className="project-inventory-row-header";const r=document.createElement("div");r.className="project-inventory-title",r.textContent=e.display_project,n.appendChild(r);const o=document.createElement("div");o.className="project-inventory-domain",o.textContent=Bl(e),n.appendChild(o),t.appendChild(n);const i=document.createElement("div");if(i.className="project-inventory-meta",i.textContent=`${YP(e)} · ${e.identity_source} · ${XP(e.latest_session_at)}`,t.appendChild(i),Fr(e)){const f=document.createElement("div");f.className="settings-note",f.textContent="Received memories keep the source device's project and Space assignment. Local reassignment controls are disabled here to avoid split-brain sync state.",t.appendChild(f)}const a=document.createElement("div");if(a.className="project-inventory-signal mono",a.textContent=mv(e),t.appendChild(a),e.suggested_scope_id&&e.suggested_scope_id!==e.resolved_scope_id){const f=document.createElement("div");f.className="settings-note project-suggestion-note",f.textContent=e.suggestion_reason?`Suggestion: ${e.suggestion_reason}`:`Suggestion: assign this project to ${Ia(e.suggested_scope_id)}.`,t.appendChild(f)}const s=(e.guardrail_warnings??[]).filter(f=>f.severity==="warning");if(s.length>0){const f=document.createElement("div");f.className="settings-note project-attention-note",f.textContent=`Needs attention: ${s.map(m=>m.message).join(" ")}`,t.appendChild(f)}if(e.statuses.length>0){const f=document.createElement("div");f.className="project-inventory-badges";for(const m of e.statuses){const v=document.createElement("span");v.className=`project-status-badge ${m}`,v.textContent=qP(m),f.appendChild(v)}t.appendChild(f)}const l=document.createElement("details");l.className="project-inventory-details",l.open=Fl.has(e.workspace_identity),l.addEventListener("toggle",()=>{l.open?Fl.add(e.workspace_identity):Fl.delete(e.workspace_identity)});const d=document.createElement("summary");d.textContent="Identity and mapping details",l.appendChild(d);const u=document.createElement("dl");u.className="project-detail-grid";const p=[["Workspace identity",e.workspace_identity],["Project",e.project],["CWD",e.cwd],["Git remote",e.git_remote],["Git branch",e.git_branch],["Current Space",Bl(e)],["Suggested Space",e.suggested_scope_id?Ia(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[f,m]of p){const v=document.createElement("dt");v.textContent=f;const g=document.createElement("dd");g.textContent=m==null||m===""?"—":String(m),u.append(v,g)}return l.appendChild(u),l.appendChild(fR(e)),t.appendChild(l),t}function mR(e){const t=[...new Set(e.map(n=>Bl(n)))];return t.length===1?t[0]:"Mixed Spaces"}function hR(e){if(e.length===1)return Sv(e[0]);const t=Ul(e[0]),n=document.createElement("article");n.className="project-inventory-row project-inventory-cluster";const r=document.createElement("div");r.className="project-inventory-row-header";const o=document.createElement("div");o.className="project-inventory-title",o.textContent=hv(e[0]),r.appendChild(o);const i=document.createElement("div");i.className="project-inventory-domain",i.textContent=mR(e),r.appendChild(i),n.appendChild(r);const a=e.reduce((m,v)=>m+(v.memory_count??0),0),s=e.reduce((m,v)=>m+v.session_count,0),l=document.createElement("div");l.className="project-inventory-meta",l.textContent=`${e.length} identities · ${s.toLocaleString()} sessions · ${a.toLocaleString()} memories`,n.appendChild(l);const d=document.createElement("div");d.className="project-inventory-actions";const u=e.filter(fv);if(u.length===0){const m=document.createElement("div");m.className="settings-note",m.textContent=e.every(Fr)?"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.",d.appendChild(m),n.appendChild(d)}else{const m=u.map(T=>({project:T,warnings:(T.guardrail_warnings??[]).filter(x=>x.requires_confirmation)})),v=m.some(({warnings:T})=>T.length>0),g=new Set(u.map(T=>T.suggested_scope_id).filter(T=>!!T)),y=new Set(u.map(T=>T.resolved_scope_id)),_=document.createElement("select");_.className="project-domain-select",_.setAttribute("aria-label",`Space for ${hv(e[0])} group`);const w=document.createElement("option");w.value="",w.textContent="Choose Space…",_.appendChild(w),_v(_),_.value=bv(Pa.get(t));const C=document.createElement("button");if(C.className="settings-button",C.type="button",C.textContent=`Save Space for ${u.length} identit${u.length===1?"y":"ies"}`,C.disabled=!_.value||v,C.addEventListener("click",()=>{dR(u,_.value)}),_.addEventListener("change",()=>{_.value?Pa.set(t,_.value):Pa.delete(t),C.disabled=!_.value||v}),_.addEventListener("blur",yv),d.append(_,C),g.size>1||y.size>1||v){const T=document.createElement("div");if(T.className="settings-note project-attention-note",T.textContent=v?"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.",v){const x=document.createElement("ul");for(const{project:E,warnings:L}of m){if(L.length===0)continue;const F=document.createElement("li"),H=document.createElement("strong");H.textContent=`Blocked identity: ${E.workspace_identity}`;const R=document.createElement("span");R.textContent=` — ${L.map(U=>U.message).join(" ")}`,F.append(H,R),x.appendChild(F)}T.appendChild(x)}d.appendChild(T)}n.appendChild(d)}const p=document.createElement("details");p.className="project-inventory-details",p.open=jl.has(t),p.addEventListener("toggle",()=>{p.open?jl.add(t):jl.delete(t)});const f=document.createElement("summary");f.textContent="Show identities in this project",p.appendChild(f);for(const m of e)p.appendChild(Sv(m));return n.appendChild(p),n}function gR(e){const t=new Map;for(const n of e){const r=Ul(n);t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function Cv(e){const t=yt("projectsInventoryList");if(!t)return;t.textContent="";const n=document.createElement("div");n.className="settings-note",n.textContent=e,t.appendChild(n)}function Tv(){document.getElementById("projectsInventorySkeleton")?.remove()}function kv(e){const t=yt("projectsInventoryMeta"),n=yt("projectsInventoryList");if(!t||!n)return;if(Tv(),n.textContent="",e.projects.length===0)Cv("No projects match those filters.");else for(const i of gR(e.projects))n.appendChild(hR(i));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 r=yt("projectsPrevPage"),o=yt("projectsNextPage");r&&(r.disabled=e.offset===0),o&&(o.disabled=!e.has_more)}function vR(e){eR().then(()=>{vv()||kv(e)})}async function yR(){const e=yt("projectsInventoryMeta"),t=yt("projectsInventoryList");if(!(!e||!t)){if(vv()){Ra=!0;return}Ra=!1,e.textContent="Loading project inventory…";try{const[n,r]=await Promise.all([cw({limit:$l,offset:Bo,q:yt("projectsSearch")?.value.trim()||void 0,status:yt("projectsStatusFilter")?.value||void 0}),sw()]);Ml=r.scopes,kv(n),vR(n)}catch(n){Tv(),e.textContent="Project inventory failed to load.",Cv(n instanceof Error?n.message:"Unable to load project inventory.")}}}function bR(e){ct=e;const t=yt("projectsStatusFilter");if(t&&t.options.length===0)for(const[r,o]of pv){const i=document.createElement("option");i.value=r,i.textContent=o,t.appendChild(i)}const n=()=>{Bo=0,ct?.()};yt("projectsSearch")?.addEventListener("input",n),t?.addEventListener("change",n),yt("projectsPrevPage")?.addEventListener("click",()=>{Bo=Math.max(0,Bo-$l),ct?.()}),yt("projectsNextPage")?.addEventListener("click",()=>{Bo+=$l,ct?.()})}function xv(e,t){const n=e.trim();if(!n)return[];const r=JSON.parse(n);if(!Array.isArray(r)||r.some(i=>typeof i!="string"))throw new Error(`${t.label} must be a JSON string array`);if(!t.normalize&&!t.requireNonEmpty)return r;const o=t.normalize?r.map(i=>i.trim()):r;if(t.requireNonEmpty&&o.some(i=>i.trim()===""))throw new Error(`${t.label} cannot contain empty command tokens`);return o}function _R(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[o,i]of Object.entries(n)){if(typeof o!="string"||!o.trim()||typeof i!="string")throw new Error("observer headers must map string keys to string values");r[o.trim()]=i}return r}var Av="codemem-settings-advanced",wR="gpt-5.1-codex-mini",Ev="claude-4.5-haiku",SR=[{value:"observer",label:"Connection"},{value:"queue",label:"Processing"},{value:"sync",label:"Device Sync"}],CR={claudeCommand:"claude_command",observerProvider:"observer_provider",observerModel:"observer_model",observerTierRoutingEnabled:"observer_tier_routing_enabled",observerSimpleModel:"observer_simple_model",observerSimpleTemperature:"observer_simple_temperature",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"},TR=new Set(["claude_command","observer_base_url","observer_auth_file","observer_auth_command","observer_headers","sync_coordinator_url"]),kR={claudeCommand:"",observerProvider:"",observerModel:"",observerTierRoutingEnabled:!1,observerSimpleModel:"",observerSimpleTemperature:"",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 xR(){try{return globalThis.localStorage?.getItem(Av)==="1"}catch{return!1}}function AR(e){try{globalThis.localStorage?.setItem(Av,e?"1":"0")}catch{}}function sn(e,t){return typeof e=="object"&&e!==null&&Object.hasOwn(e,t)}function Ce(e,t,n){if(sn(t,n))return t[n];if(sn(e,n))return e[n]}function Pe(e){return e==null?"":String(e)}function Da(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 ER(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function NR(e,t){return e===t?!0:JSON.stringify(e)===JSON.stringify(t)}function tt(e){const t=e.trim();return t===""?"":t}function PR(e,t,n){return n?{model:n,source:"Configured"}:e==="claude_sidecar"?{model:Ev,source:"Recommended (local Claude session)"}:t==="anthropic"?{model:Ev,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:wR,source:"Recommended (direct API)"}}function RR(e,t){const n=e??{};switch(t){case"claude_command":{const r=n.claude_command;if(!Array.isArray(r))return[];const o=[];return r.forEach(i=>{if(typeof i!="string")return;const a=i.trim();a&&o.push(a)}),o}case"observer_provider":case"observer_model":case"observer_simple_model":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 tt(Pe(n[t]));case"observer_runtime":return tt(Pe(n.observer_runtime));case"observer_auth_source":return tt(Pe(n.observer_auth_source));case"observer_auth_command":{const r=n.observer_auth_command;return Array.isArray(r)?r.filter(o=>typeof o=="string"):[]}case"observer_headers":{const r=n.observer_headers;if(!r||typeof r!="object"||Array.isArray(r))return{};const o={};return Object.entries(r).forEach(([i,a])=>{typeof i=="string"&&i.trim()&&typeof a=="string"&&(o[i.trim()]=a)}),o}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(!sn(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(!sn(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r>0?r:""}case"observer_auth_cache_ttl_s":{if(!sn(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 Da(n[t]);default:return sn(n,t)?n[t]:""}}function IR(e,t,n){const r={...e};return Object.keys(n).forEach(o=>{sn(r,o)&&(r[o]=RR(t,o))}),r}function DR(e){const{values:t,touchedKeys:n,baseline:r}=e,o=e.allowUntouchedParseErrors===!0;let i=[];try{i=xv(t.claudeCommand,{label:"claude command",normalize:!0,requireNonEmpty:!0})}catch(C){if(!o||n.has("claude_command"))throw C;const T=r.claude_command;i=Array.isArray(T)?T.filter(x=>typeof x=="string").map(x=>x.trim()).filter(x=>x.length>0):[]}let a=[];try{a=xv(t.observerAuthCommand,{label:"observer auth command"})}catch(C){if(!o||n.has("observer_auth_command"))throw C;const T=r.observer_auth_command;a=Array.isArray(T)?T.filter(x=>typeof x=="string"):[]}let s={};try{s=_R(t.observerHeaders)}catch(C){if(!o||n.has("observer_headers"))throw C;const T=r.observer_headers;T&&typeof T=="object"&&!Array.isArray(T)&&Object.entries(T).forEach(([x,E])=>{typeof x=="string"&&x.trim()&&typeof E=="string"&&(s[x]=E)})}const l=t.observerAuthCacheTtlS.trim(),d=t.observerSimpleTemperature.trim(),u=t.observerRichTemperature.trim(),p=t.observerRichMaxOutputTokens.trim(),f=t.rawEventsSweeperIntervalS.trim(),m=l===""?"":Number(l),v=d===""?"":Number(d),g=u===""?"":Number(u),y=p===""?"":Number(p),_=Number(f),w=f===""?"":_;if(l!==""&&!Number.isFinite(m))throw new Error("observer auth cache ttl must be a number");if(d!==""&&(typeof v!="number"||!Number.isFinite(v)||v<0))throw new Error("simple tier temperature must be a non-negative number");if(u!==""&&(typeof g!="number"||!Number.isFinite(g)||g<0))throw new Error("rich tier temperature must be a non-negative number");if(p!==""&&(typeof y!="number"||!Number.isFinite(y)||y<=0||!Number.isInteger(y)))throw new Error("rich tier max output tokens must be a positive integer");if(f!==""&&(!Number.isFinite(_)||_<=0))throw new Error("raw-event sweeper interval must be a positive number");return{claude_command:i,observer_provider:tt(t.observerProvider),observer_model:tt(t.observerModel),observer_tier_routing_enabled:t.observerTierRoutingEnabled,observer_simple_model:tt(t.observerSimpleModel),observer_simple_temperature:v,observer_rich_model:tt(t.observerRichModel),observer_rich_temperature:g,observer_rich_reasoning_effort:tt(t.observerRichReasoningEffort),observer_rich_reasoning_summary:tt(t.observerRichReasoningSummary),observer_rich_max_output_tokens:y,observer_runtime:tt(t.observerRuntime||"api_http")||"api_http",observer_auth_source:tt(t.observerAuthSource||"auto")||"auto",observer_auth_file:tt(t.observerAuthFile),observer_auth_command:a,observer_auth_timeout_ms:Number(t.observerAuthTimeoutMs||0)||"",observer_auth_cache_ttl_s:m,observer_headers:s,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:w,sync_enabled:t.syncEnabled,sync_host:tt(t.syncHost),sync_port:Number(t.syncPort||0)||"",sync_interval_s:Number(t.syncInterval||0)||"",sync_mdns:t.syncMdns,sync_coordinator_url:tt(t.syncCoordinatorUrl),sync_coordinator_group:tt(t.syncCoordinatorGroup),sync_coordinator_timeout_s:Number(t.syncCoordinatorTimeout||0)||"",sync_coordinator_presence_ttl_s:Number(t.syncCoordinatorPresenceTtl||0)||""}}function LR(e){const t=e.config||{},n=e.effective||{},r=Ce(t,n,"observer_headers"),o=r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).filter(([d,u])=>typeof d=="string"&&d.trim()&&typeof u=="string")):{},i=Ce(t,n,"claude_command"),a=Array.isArray(i)?i.filter(d=>typeof d=="string"):[],s=Ce(t,n,"observer_auth_command"),l=Array.isArray(s)?s.filter(d=>typeof d=="string"):[];return{claudeCommand:a.length?JSON.stringify(a,null,2):"",observerProvider:Pe(Ce(t,n,"observer_provider")),observerModel:Pe(Ce(t,n,"observer_model")),observerTierRoutingEnabled:Da(Ce(t,n,"observer_tier_routing_enabled")),observerSimpleModel:Pe(Ce(t,n,"observer_simple_model")),observerSimpleTemperature:Pe(Ce(t,n,"observer_simple_temperature")),observerRichModel:Pe(Ce(t,n,"observer_rich_model")),observerRichTemperature:Pe(Ce(t,n,"observer_rich_temperature")),observerRichReasoningEffort:Pe(Ce(t,n,"observer_rich_reasoning_effort")),observerRichReasoningSummary:Pe(Ce(t,n,"observer_rich_reasoning_summary")),observerRichMaxOutputTokens:Pe(Ce(t,n,"observer_rich_max_output_tokens")),observerRuntime:Pe(Ce(t,n,"observer_runtime"))||"api_http",observerAuthSource:Pe(Ce(t,n,"observer_auth_source"))||"auto",observerAuthFile:Pe(Ce(t,n,"observer_auth_file")),observerAuthCommand:l.length?JSON.stringify(l,null,2):"",observerAuthTimeoutMs:Pe(Ce(t,n,"observer_auth_timeout_ms")),observerAuthCacheTtlS:Pe(Ce(t,n,"observer_auth_cache_ttl_s")),observerHeaders:Object.keys(o).length?JSON.stringify(o,null,2):"",observerMaxChars:Pe(Ce(t,n,"observer_max_chars")),packObservationLimit:Pe(Ce(t,n,"pack_observation_limit")),packSessionLimit:Pe(Ce(t,n,"pack_session_limit")),rawEventsSweeperIntervalS:Pe(Ce(t,n,"raw_events_sweeper_interval_s")),syncEnabled:Da(Ce(t,n,"sync_enabled")),syncHost:Pe(Ce(t,n,"sync_host")),syncPort:Pe(Ce(t,n,"sync_port")),syncInterval:Pe(Ce(t,n,"sync_interval_s")),syncMdns:Da(Ce(t,n,"sync_mdns")),syncCoordinatorUrl:Pe(Ce(t,n,"sync_coordinator_url")),syncCoordinatorGroup:Pe(Ce(t,n,"sync_coordinator_group")),syncCoordinatorTimeout:Pe(Ce(t,n,"sync_coordinator_timeout_s")),syncCoordinatorPresenceTtl:Pe(Ce(t,n,"sync_coordinator_presence_ttl_s"))}}function OR(e,t){if(e.observerTierRoutingEnabled)return"Tiered routing is enabled: simple/rich model selection now lives in Processing.";const n=PR(e.observerRuntime.trim()||"api_http",e.observerProvider.trim(),tt(e.observerModel));return`${["observer_model","observer_provider","observer_runtime"].some(r=>sn(t,r))?"Env override":n.source}: ${n.model}`}function $R(e){return e.observerTierRoutingEnabled?"On: codemem routes simpler batches to a lighter model and richer batches to a higher-quality configuration. Rich-tier OpenAI requests default to the Responses transport, and Claude sidecar runtimes route both tiers through the local Claude 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 MR(e){return e.observerTierRoutingEnabled?"Base model fallback":"Model"}function FR(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 jR(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.1-codex-mini` for Direct API; `claude-4.5-haiku` for Local Claude session."}function BR(e){return!e}function UR(e,t,n){return t.has(e)||n.has(e)}function GR(e){return`${e} is read-only in the viewer for security. Edit the config file or environment instead.`}var V={open:!1,previouslyFocused:null,activeTab:"observer",baseline:{},envOverrides:{},touchedKeys:new Set,shellMounted:!1,protectedKeys:new Set,startPolling:null,refresh:null,showAdvanced:xR(),controller:null,renderState:{effectiveText:"",isSaving:!1,observerStatus:null,overridesVisible:!1,pathText:"Config path: n/a",providers:[],statusText:"Ready",values:{...kR}}};function HR(){V.controller?.hideTooltip()}function or(e){if(V.controller){V.controller.setRenderState(e);return}V.renderState={...V.renderState,...e}}function VR(e){or({values:{...V.renderState.values,...e}})}function WR(e){const t=["observer","queue","sync"].includes(e)?e:"observer";V.activeTab=t,V.controller?.setActiveTab(t)}function La(e,t=!0){b.settingsDirty=e,t&&V.controller?.setDirty(e)}function KR(e){V.showAdvanced=e,V.controller?.setShowAdvanced(e)}function Nv(){return V.open}function zR(e){return UR(e,V.protectedKeys,TR)}function Pv(e={}){return DR({values:V.renderState.values,touchedKeys:V.touchedKeys,baseline:V.baseline,allowUntouchedParseErrors:e.allowUntouchedParseErrors})}function qR(e){or({observerStatus:e&&typeof e=="object"?e:null})}function JR(e){if(!e||typeof e!="object")return;const t=e,n=t.defaults||{},r=t.config||{},o=t.env_overrides&&typeof t.env_overrides=="object"?t.env_overrides:{},i=Array.isArray(t.protected_keys)?t.protected_keys.filter(s=>typeof s=="string"&&s.trim().length>0):[],a=LR(t);V.envOverrides=o,V.protectedKeys=new Set(i),b.configDefaults=n,b.configPath=t.path||"",or({effectiveText:Object.keys(o).length>0?"Some fields are managed by environment settings.":"",overridesVisible:Object.keys(o).length>0,pathText:b.configPath?`Config path: ${b.configPath}`:"Config path: n/a",providers:ER(t.providers),statusText:"No unsaved changes",values:a}),V.touchedKeys=new Set;try{V.baseline=IR(Pv({allowUntouchedParseErrors:!0}),r,o)}catch{V.baseline={}}La(!1)}async function YR(){if(!V.open)try{const[e,t]=await Promise.all([N_(),E_().catch(()=>null)]);JR(e),qR(t)}catch{}}function Wl(e){return String(e||"").replace(/_/g," ")}function Kl(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 XR(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"opencode_run":return"OpenCode sidecar";default:return e||"none"}}function QR(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 ZR(e){if(typeof e!="string"||!e.trim())return"Unknown time";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function eI({status:e}){if(!e)return c("div",{id:"observerStatusBanner",className:"observer-status-banner",hidden:!0});const t=e.active,n=e.available_credentials||{},r=e.latest_failure,o=Object.entries(n).filter(([,i])=>i&&typeof i=="object");return c("div",{id:"observerStatusBanner",className:"observer-status-banner",children:[t?c(ee,{children:[c("div",{className:"status-label",children:"Active observer"}),c("div",{className:"status-active",children:[String(t.provider||"unknown")," → ",String(t.model||"")," via"," ",XR(t.auth?.method||"none")," ",c("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:c("i",{"aria-hidden":"true","data-lucide":t.auth?.token_present===!0?"check":"x"})})]})]}):c(ee,{children:[c("div",{className:"status-label",children:"Observer status"}),c("div",{className:"status-active",children:"Not yet initialized (waiting for first session)"})]}),o.length?c(ee,{children:[c("div",{className:"status-label",children:"Available credentials"}),c("div",{children:o.map(([i,a],s)=>{const l=a,d=Object.values(l).some(Boolean);return c("span",{className:"status-cred",children:[s>0?" · ":null,c("span",{"aria-label":d?"credential available":"no credential",className:d?"cred-ok":"cred-none",role:"img",children:d?c("i",{"aria-hidden":"true","data-lucide":"check"}):"–"})," ",String(i),": ",QR(l)]},i)})})]}):null,r&&typeof r=="object"?c(ee,{children:[c("div",{className:"status-label",children:"Latest processing issue"}),c("div",{className:"status-issue",children:[c("div",{className:"status-issue-message",children:typeof r.error_message=="string"&&r.error_message.trim()?r.error_message.trim():"Raw-event processing failed."}),c("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 ${ZR(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()?c("div",{className:"status-issue-impact",children:r.impact.trim()}):null]})]}):null]})}function Rv(e,t){const n=t.getBoundingClientRect(),r=8,o=8,i=e.offsetWidth,a=e.offsetHeight;let s=n.left+n.width/2-i/2;s=Math.max(r,Math.min(s,globalThis.innerWidth-i-r));let l=n.bottom+o;l+a>globalThis.innerHeight-r&&(l=n.top-a-o),l=Math.max(r,l),e.style.left=`${Math.round(s)}px`,e.style.top=`${Math.round(l)}px`}function Ho(e){return e instanceof Element?e.closest(".help-icon[data-tooltip]"):null}function tI(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 nI(){const e=$e("settingsModal");(tI(e)[0]||e)?.focus()}function rI(){const[e,t]=O({anchor:null,content:"",visible:!1}),n=j(null);return G(()=>{const r=u=>{const p=u.dataset.tooltip?.trim();p&&t({anchor:u,content:p,visible:!0})},o=()=>{t(u=>!u.visible&&!u.anchor&&!u.content?u:{anchor:null,content:"",visible:!1})},i=u=>{const p=Ho(u.target);p&&r(p)},a=u=>{const p=Ho(u.target);if(!p)return;const f=u.relatedTarget;f instanceof Element&&p.contains(f)||o()},s=u=>{const p=Ho(u.target);p&&r(p)},l=u=>{Ho(u.target)&&o()},d=u=>{const p=Ho(u.target);p&&(u.preventDefault(),t(f=>{if(f.anchor===p&&f.visible)return{anchor:null,content:"",visible:!1};const m=p.dataset.tooltip?.trim()||"";return m?{anchor:p,content:m,visible:!0}:f}))};return document.addEventListener("pointerover",i),document.addEventListener("pointerout",a),document.addEventListener("focusin",s),document.addEventListener("focusout",l),document.addEventListener("click",d),()=>{document.removeEventListener("pointerover",i),document.removeEventListener("pointerout",a),document.removeEventListener("focusin",s),document.removeEventListener("focusout",l),document.removeEventListener("click",d)}},[]),mt(()=>{if(!e.visible||!e.anchor||!n.current)return;const r=requestAnimationFrame(()=>{n.current&&e.anchor&&Rv(n.current,e.anchor)});return()=>{cancelAnimationFrame(r)}},[e.anchor,e.content,e.visible]),G(()=>{if(!e.visible||!e.anchor)return;const r=()=>{n.current&&e.anchor&&Rv(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:Ne(()=>typeof document>"u"?null:Zt(c("div",{className:`help-tooltip${e.visible?" visible":""}`,hidden:!e.visible,ref:n,children:e.content}),document.body),[e.content,e.visible]),setTooltip:t}}function oI({DialogContent:e,onClose:t}){const[n,r]=O(V.open),[o,i]=O(["observer","queue","sync"].includes(V.activeTab)?V.activeTab:"observer"),[a,s]=O(b.settingsDirty),[l,d]=O(V.renderState),[u,p]=O(V.showAdvanced),{tooltipPortal:f,setTooltip:m}=rI();V.open=n,V.activeTab=o,b.settingsDirty=a,V.renderState=l,V.showAdvanced=u,G(()=>(V.controller={hideTooltip:()=>{m({anchor:null,content:"",visible:!1})},setActiveTab:g=>{const y=["observer","queue","sync"].includes(g)?g:"observer";V.activeTab=y,i(y)},setDirty:g=>{b.settingsDirty=g,s(g)},setOpen:g=>{V.open=g,r(g)},setRenderState:g=>{const y={...V.renderState,...g};V.renderState=y,d(y)},setShowAdvanced:g=>{V.showAdvanced=g,AR(g),p(g)}},()=>{V.controller&&(V.controller=null)}),[]),G(()=>{n&&globalThis.lucide?.createIcons?.()},[n]);const v=te(()=>{V.startPolling&&V.refresh&&t(V.startPolling,V.refresh)},[t]);return c(ee,{children:[c($m,{ariaDescribedby:"settingsDescription",ariaLabelledby:"settingsTitle",contentClassName:"modal",contentId:"settingsModal",onCloseAutoFocus:g=>{g.preventDefault()},onOpenAutoFocus:g=>{g.preventDefault(),nI()},onOpenChange:g=>{if(g){r(!0);return}v()},open:n,overlayClassName:"modal-backdrop",overlayId:"settingsBackdrop",children:c(e,{})}),f]})}function je({children:e,className:t="field",hidden:n=!1,id:r}){return c("div",{className:t,hidden:n,id:r,children:e})}function Vo({children:e,hidden:t=!1}){return c("div",{className:"settings-note",hidden:t,children:e})}function zl({detail:e,title:t}){return c("div",{className:"settings-section-intro",children:[c("div",{className:"settings-section-intro-title",children:t}),c("div",{className:"small settings-section-intro-detail",children:e})]})}function iI({values:e,observerMaxCharsDefault:t,providerOptions:n,showAuthFile:r,showAuthCommand:o,hiddenUnlessAdvanced:i,onTextInput:a,onSelectValueChange:s,getObserverModelLabel:l,getObserverModelTooltip:d,getObserverModelDescription:u,getObserverModelHint:p,protectedConfigHelp:f,observerStatusBannerSlot:m}){return c(ee,{children:[c(zl,{detail:"Set how codemem reaches your model provider and where it should look for credentials.",title:"Connection and credentials"}),m,c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Connection"}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerProvider",children:"Model provider"}),c("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:"?"})]}),c(an,{ariaLabel:"Model provider",contentClassName:"settings-select-content",id:"observerProvider",itemClassName:"settings-select-item",onValueChange:s("observerProvider"),options:[{label:"auto (default)",value:""},...n],placeholder:"auto (default)",triggerClassName:"settings-select-trigger",value:e.observerProvider,viewportClassName:"settings-select-viewport"}),c("div",{className:"small",children:"Use `auto` unless you need to pin a specific provider."})]}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerModel",children:l()}),c("button",{"aria-label":"About model defaults",className:"help-icon","data-tooltip":d(),type:"button",children:"?"})]}),c(ve,{id:"observerModel",onInput:a("observerModel"),placeholder:"leave empty for default",value:e.observerModel}),c("div",{className:"small",children:u()}),c("div",{className:"small",id:"observerModelHint",children:p()})]}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerRuntime",children:"Connection mode"}),c("button",{"aria-label":"About connection mode",className:"help-icon","data-tooltip":"Direct API uses provider credentials. Local Claude session uses local Claude runtime auth.",type:"button",children:"?"})]}),c(an,{ariaLabel:"Connection mode",contentClassName:"settings-select-content",id:"observerRuntime",itemClassName:"settings-select-item",onValueChange:s("observerRuntime"),options:[{label:"Direct API (default)",value:"api_http"},{label:"Local Claude session",value:"claude_sidecar"}],triggerClassName:"settings-select-trigger",value:e.observerRuntime,viewportClassName:"settings-select-viewport"}),c("div",{className:"small",children:"Switch between provider API credentials and local Claude session auth."})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"claudeCommand",children:"Claude command (JSON argv)"}),c(vo,{disabled:!0,id:"claudeCommand",placeholder:'["claude"]',rows:2,value:e.claudeCommand}),c("div",{className:"small",children:f("claude_command")})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"observerMaxChars",children:"Request size limit (chars)"}),c(ve,{id:"observerMaxChars",min:"1",onInput:a("observerMaxChars"),type:"number",value:e.observerMaxChars}),c("div",{className:"small",id:"observerMaxCharsHint",children:t?`Default: ${t}`:""})]})]}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Authentication"}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerAuthSource",children:"Authentication method"}),c("button",{"aria-label":"About authentication method",className:"help-icon","data-tooltip":"Choose how credentials are resolved: environment, file, command, or none.",type:"button",children:"?"})]}),c(an,{ariaLabel:"Authentication method",contentClassName:"settings-select-content",id:"observerAuthSource",itemClassName:"settings-select-item",onValueChange:s("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"}),c("div",{className:"small",children:"Use `auto` unless you need to force a file or command-based token source."})]}),c(je,{hidden:!r,id:"observerAuthFileField",children:[c("label",{htmlFor:"observerAuthFile",children:"Token file path"}),c(ve,{disabled:!0,id:"observerAuthFile",placeholder:"~/.codemem/work-token.txt",value:e.observerAuthFile}),c("div",{className:"small",children:f("observer_auth_file")})]}),c(je,{hidden:!o,id:"observerAuthCommandField",children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerAuthCommand",children:"Token command"}),c("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:"?"})]}),c(vo,{disabled:!0,id:"observerAuthCommand",placeholder:'["iap-auth", "--audience", "gateway"]',rows:3,value:e.observerAuthCommand}),c("div",{className:"small",children:f("observer_auth_command")})]}),c("div",{className:"small",hidden:!o,id:"observerAuthCommandNote",children:'Command format: JSON string array, e.g. `["iap-auth", "--audience", "gateway"]`.'}),c(Vo,{hidden:i(),children:"These advanced credential overrides only matter when you need custom command timing, cached tokens, or extra request headers."}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"observerAuthTimeoutMs",children:"Token command timeout (ms)"}),c(ve,{id:"observerAuthTimeoutMs",min:"1",onInput:a("observerAuthTimeoutMs"),type:"number",value:e.observerAuthTimeoutMs})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"observerAuthCacheTtlS",children:"Token cache time (s)"}),c(ve,{id:"observerAuthCacheTtlS",min:"0",onInput:a("observerAuthCacheTtlS"),type:"number",value:e.observerAuthCacheTtlS})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerHeaders",children:"Request headers (JSON)"}),c("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:"?"})]}),c(vo,{disabled:!0,id:"observerHeaders",placeholder:'{"Authorization":"Bearer ${auth.token}"}',rows:4,value:e.observerHeaders}),c("div",{className:"small",children:f("observer_headers")})]})]})]})}function Oa({checked:e,className:t,disabled:n=!1,hidden:r=!1,id:o,label:i,onCheckedChange:a}){const s=`${o}Label`;return c("div",{className:t?`field-checkbox settings-switch-row ${t}`:"field-checkbox settings-switch-row",hidden:r,children:[c("label",{className:"settings-switch-copy",htmlFor:o,id:s,children:i}),c(Er,{"aria-labelledby":s,checked:e,className:"settings-switch",disabled:n,id:o,onCheckedChange:a,thumbClassName:"settings-switch-thumb"})]})}function aI({values:e,showTieredRouting:t,hiddenUnlessAdvanced:n,onTextInput:r,onSwitchInput:o,getTieredRoutingHelperText:i}){return c(ee,{children:[c(zl,{detail:"Control how often codemem processes queued work and, if needed, how it routes lighter vs richer model requests.",title:"Processing and routing"}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Processing"}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"rawEventsSweeperIntervalS",children:"Background processing interval (seconds)"}),c("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:"?"})]}),c(ve,{id:"rawEventsSweeperIntervalS",min:"1",onInput:r("rawEventsSweeperIntervalS"),type:"number",value:e.rawEventsSweeperIntervalS}),c("div",{className:"small",children:"How often codemem checks for queued raw events in the background."})]})]}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Tiered observer routing"}),c(Oa,{checked:e.observerTierRoutingEnabled,className:"field",id:"observerTierRoutingEnabled",label:"Enable tiered routing",onCheckedChange:o("observerTierRoutingEnabled")}),c("div",{className:"small",children:i()}),c(Vo,{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."}),c(je,{hidden:!t,children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerSimpleModel",children:"Simple tier model"}),c("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:"?"})]}),c(ve,{id:"observerSimpleModel",onInput:r("observerSimpleModel"),placeholder:"leave empty for default",value:e.observerSimpleModel}),c("div",{className:"small",children:"Used when a batch falls below rich-routing thresholds."})]}),c(je,{hidden:!t,children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerRichModel",children:"Rich tier model"}),c("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:"?"})]}),c(ve,{id:"observerRichModel",onInput:r("observerRichModel"),placeholder:"leave empty for default",value:e.observerRichModel}),c("div",{className:"small",children:"Used when routing detects a richer replay batch."})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerSimpleTemperature",children:"Simple tier temperature"}),c(ve,{id:"observerSimpleTemperature",min:"0",onInput:r("observerSimpleTemperature"),step:"0.1",type:"number",value:e.observerSimpleTemperature})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichTemperature",children:"Rich tier temperature"}),c(ve,{id:"observerRichTemperature",min:"0",onInput:r("observerRichTemperature"),step:"0.1",type:"number",value:e.observerRichTemperature})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichReasoningEffort",children:"Rich tier reasoning effort"}),c(ve,{id:"observerRichReasoningEffort",onInput:r("observerRichReasoningEffort"),placeholder:"leave empty for default",value:e.observerRichReasoningEffort})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichReasoningSummary",children:"Rich tier reasoning summary"}),c(ve,{id:"observerRichReasoningSummary",onInput:r("observerRichReasoningSummary"),placeholder:"leave empty for default",value:e.observerRichReasoningSummary})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichMaxOutputTokens",children:"Rich tier max output tokens"}),c(ve,{id:"observerRichMaxOutputTokens",min:"1",onInput:r("observerRichMaxOutputTokens"),step:"1",type:"number",value:e.observerRichMaxOutputTokens})]})]}),c("div",{className:"settings-group settings-advanced",hidden:n(),children:[c("h3",{className:"settings-group-title",children:"Pack limits"}),c(Vo,{hidden:n(),children:"Most users can keep these defaults. Change them only when you need smaller or larger default context packs."}),c(je,{className:"field settings-advanced",hidden:n(),children:[c("label",{htmlFor:"packObservationLimit",children:"Observation limit"}),c(ve,{id:"packObservationLimit",min:"1",onInput:r("packObservationLimit"),type:"number",value:e.packObservationLimit}),c("div",{className:"small",children:"Default number of observations to include in a pack."})]}),c(je,{className:"field settings-advanced",hidden:n(),children:[c("label",{htmlFor:"packSessionLimit",children:"Session summary limit"}),c(ve,{id:"packSessionLimit",min:"1",onInput:r("packSessionLimit"),type:"number",value:e.packSessionLimit}),c("div",{className:"small",children:"Default number of session summaries to include in a pack."})]})]})]})}function sI({values:e,hiddenUnlessAdvanced:t,onTextInput:n,onSwitchInput:r,protectedConfigHelp:o}){return c(ee,{children:[c(zl,{detail:"Choose whether this device syncs at all, how often it checks peers, and which coordinator group it should join.",title:"Device sync"}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Device Sync"}),c(Oa,{checked:e.syncEnabled,className:"field",id:"syncEnabled",label:"Enable sync",onCheckedChange:r("syncEnabled")}),c("div",{className:"field",children:[c("label",{htmlFor:"syncInterval",children:"Sync interval (seconds)"}),c(ve,{id:"syncInterval",min:"10",onInput:n("syncInterval"),type:"number",value:e.syncInterval}),c("div",{className:"small",children:"How often this device checks for sync work when sync is enabled."})]}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncHost",children:"Sync host"}),c(ve,{id:"syncHost",onInput:n("syncHost"),placeholder:"127.0.0.1",value:e.syncHost})]}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncPort",children:"Sync port"}),c(ve,{id:"syncPort",min:"1",onInput:n("syncPort"),type:"number",value:e.syncPort})]}),c(Oa,{checked:e.syncMdns,className:"field settings-advanced",hidden:t(),id:"syncMdns",label:"Enable mDNS discovery",onCheckedChange:r("syncMdns")}),c("div",{className:"field",children:[c("label",{htmlFor:"syncCoordinatorUrl",children:"Coordinator URL"}),c(ve,{disabled:!0,id:"syncCoordinatorUrl",placeholder:"https://coord.example.com",value:e.syncCoordinatorUrl}),c("div",{className:"small",children:o("sync_coordinator_url")})]}),c("div",{className:"field",children:[c("label",{htmlFor:"syncCoordinatorGroup",children:"Coordinator group"}),c(ve,{id:"syncCoordinatorGroup",onInput:n("syncCoordinatorGroup"),placeholder:"team-alpha",value:e.syncCoordinatorGroup}),c("div",{className:"small",children:"Discovery namespace for peers using the same coordinator."})]}),c("div",{className:"field settings-advanced",hidden:t(),children:c(Vo,{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."})}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncCoordinatorTimeout",children:"Coordinator timeout (seconds)"}),c(ve,{id:"syncCoordinatorTimeout",min:"1",onInput:n("syncCoordinatorTimeout"),type:"number",value:e.syncCoordinatorTimeout})]}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncCoordinatorPresenceTtl",children:"Presence TTL (seconds)"}),c(ve,{id:"syncCoordinatorPresenceTtl",min:"1",onInput:n("syncCoordinatorPresenceTtl"),type:"number",value:e.syncCoordinatorPresenceTtl})]})]})]})}function cI({panelProps:e,activeTab:t,showAdvanced:n,renderState:r,settingsDirty:o,onClose:i,onSave:a,onActiveTabChange:s,onAdvancedToggle:l,observerStatusBannerSlot:d}){const u=!o||r.isSaving;return c("div",{className:"modal-card",onKeyDown:p=>vr(p,{onSubmit:a,disabled:u}),children:[c("div",{className:"modal-header",children:[c("h2",{id:"settingsTitle",children:"Settings"}),c(Fm,{ariaLabel:"Close settings",className:"modal-close-button",onClick:i})]}),c("div",{className:"modal-body",children:[c("div",{className:"small",id:"settingsDescription",children:"Tune how codemem connects, processes work, and syncs with other devices."}),c("div",{className:"settings-advanced-toolbar",children:[c(Oa,{checked:n,id:"settingsAdvancedToggle",label:"Show advanced controls",onCheckedChange:l}),c("button",{"aria-label":"About advanced controls",className:"help-icon","data-tooltip":"Advanced controls include JSON fields, tuning values, and network overrides.",type:"button",children:c("i",{"aria-hidden":"true","data-lucide":"help-circle"})})]}),c(Vo,{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."}),c(Xp,{ariaLabel:"Settings sections",listClassName:"settings-tabs",onValueChange:s,tabs:SR,triggerClassName:"settings-tab",value:t,children:[c(Gn,{className:"settings-panel",forceMount:!0,value:"observer",children:c(iI,{...e,observerStatusBannerSlot:d})}),c(Gn,{className:"settings-panel",forceMount:!0,value:"queue",children:c(aI,{...e})}),c(Gn,{className:"settings-panel",forceMount:!0,value:"sync",children:c(sI,{...e})})]}),c("div",{className:"small mono",id:"settingsPath",children:r.pathText}),c("div",{className:"small",id:"settingsEffective",children:r.effectiveText}),c("div",{className:"settings-note",hidden:!r.overridesVisible,id:"settingsOverrides",children:"Some values are controlled outside this screen and take priority."}),c("div",{className:"settings-note",hidden:n,children:"Advanced controls are hidden right now to keep this screen focused on everyday settings."})]}),c("div",{className:"modal-footer",children:[c("div",{className:"small",id:"settingsStatus",children:r.statusText}),c("button",{className:"settings-save","data-primary-action":"true",disabled:u,id:"settingsSave",onClick:a,type:"button",children:r.isSaving?"Saving…":"Save changes"})]})]})}function lI(e){const{current:t,baseline:n,envOverrides:r,touchedKeys:o,isProtected:i}=e,a={};return Object.entries(t).forEach(([s,l])=>{i(s)||sn(r,s)&&!o.has(s)||NR(l,n[s])||(a[s]=l)}),a}function dI(e){const t=a=>{const s=CR[a];s&&e.getTouchedKeys().add(s)},n=(a,s)=>{t(a),e.updateFormState({[a]:s}),e.setDirty(!0)};return{markFieldTouched:t,updateField:n,onTextInput:a=>s=>{n(a,s.currentTarget.value)},onSelectValueChange:a=>s=>{n(a,s)},onSwitchInput:a=>s=>{n(a,s)}}}function uI(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=>Wl(String(p))):[],o=Array.isArray(n.live_applied_keys)?n.live_applied_keys.map(p=>Wl(String(p))):[],i=Array.isArray(n.restart_required_keys)?n.restart_required_keys.map(p=>Wl(String(p))):[],a=Array.isArray(n.warnings)?n.warnings.filter(p=>typeof p=="string"&&p.trim().length>0):[],s=Array.isArray(n.manual_actions)?n.manual_actions:[],l=n.sync&&typeof n.sync=="object"?n.sync:{},d=[];r.length&&d.push(`Applied now: ${Kl(r)}.`),o.length&&d.push(`Live settings updated: ${Kl(o)}.`),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}.`),i.length&&d.push(`Restart required for ${Kl(i)}. Run: codemem serve restart`),a.forEach(p=>{d.push(p)}),s.forEach(p=>{p&&typeof p.command=="string"&&p.command.trim()&&d.push(`If needed: ${p.command}.`)}),d.length||d.push("Saved.");const u=i.length>0||a.length>0||l.ok===!1;return{message:d.join(" "),type:u?"warning":"success"}}var pI=()=>OR(V.renderState.values,V.envOverrides),fI=()=>$R(V.renderState.values),mI=()=>MR(V.renderState.values),hI=()=>FR(V.renderState.values),gI=()=>jR(V.renderState.values),vI=()=>BR(V.showAdvanced),{onTextInput:yI,onSelectValueChange:bI,onSwitchInput:_I}=dI({getTouchedKeys:()=>V.touchedKeys,getValues:()=>V.renderState.values,updateFormState:VR,setDirty:e=>La(e)});function wI(){const e=V.renderState.observerStatus;return c(eI,{status:e})}function SI(){const e=V.renderState.values,t=String(b.configDefaults?.observer_max_chars||""),n=e.observerAuthSource==="file",r=e.observerAuthSource==="command",o=e.observerTierRoutingEnabled;return c(cI,{panelProps:{values:e,observerMaxCharsDefault:t,providerOptions:Array.from(new Set(V.renderState.providers.concat(e.observerProvider?[e.observerProvider]:[]))).sort((i,a)=>i.localeCompare(a)).map(i=>({label:i,value:i})),showAuthFile:n,showAuthCommand:r,showTieredRouting:o,hiddenUnlessAdvanced:vI,onTextInput:yI,onSelectValueChange:bI,onSwitchInput:_I,getObserverModelLabel:mI,getObserverModelTooltip:hI,getObserverModelDescription:gI,getObserverModelHint:pI,getTieredRoutingHelperText:fI,protectedConfigHelp:GR},activeTab:V.activeTab,showAdvanced:V.showAdvanced,renderState:V.renderState,settingsDirty:b.settingsDirty,onClose:()=>{V.startPolling&&V.refresh&&$a(V.startPolling,V.refresh)},onSave:()=>{V.startPolling&&V.refresh&&xI(V.startPolling,V.refresh)},onActiveTabChange:WR,onAdvancedToggle:KR,observerStatusBannerSlot:c(wI,{})})}function CI(){return c(oI,{DialogContent:SI,onClose:$a})}function TI(){const e=$e("settingsDialogMount");e&&Ve(c(CI,{}),e)}function Iv(){$e("settingsDialogMount")&&(V.shellMounted||(TI(),V.shellMounted=!0))}function kI(e){V.shellMounted||Iv(),V.open=!0,V.previouslyFocused=document.activeElement,e(),V.controller?.setOpen(!0)}function $a(e,t){if(b.settingsDirty&&!globalThis.confirm("Discard unsaved changes?")){V.controller?.setOpen(!0);return}V.open=!1,V.controller?.setOpen(!1),HR(),(V.previouslyFocused&&typeof V.previouslyFocused.focus=="function"?V.previouslyFocused:Hs("settingsButton"))?.focus(),V.previouslyFocused=null,V.touchedKeys=new Set,e(),t()}async function xI(e,t){if(!V.renderState.isSaving){or({isSaving:!0,statusText:"Saving changes…"});try{const n=lI({current:Pv({allowUntouchedParseErrors:!0}),baseline:V.baseline,envOverrides:V.envOverrides,touchedKeys:V.touchedKeys,isProtected:zR});if(Object.keys(n).length===0){or({isSaving:!1,statusText:"No unsaved changes"}),La(!1),$a(e,t);return}const r=uI(await P_(n));or({isSaving:!1,statusText:"Saved changes"}),La(!1),$a(e,t),Z(r.message,r.type)}catch(n){or({isSaving:!1,statusText:`Save failed: ${n instanceof Error?n.message:"unknown error"}`})}}}function AI(e,t,n){V.startPolling=t,V.refresh=n,Iv(),Hs("settingsButton")?.addEventListener("click",()=>kI(e))}function EI(e){e.dataset.syncRenderRoot="preact"}function NI(){const e=document.getElementById("tab-sync");e&&(e.dataset.syncRenderBoundary="preact-hybrid")}function lt(e,t){EI(e),Ve(t,e)}function jr(e){e.dataset.syncRenderRoot==="preact"&&Ve(null,e)}function PI(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 RI(e){return typeof e=="object"&&e!==null}function II(e,t){return b.pairingCommandRaw="",{payloadText:e,hintText:t}}function DI(e){if(!RI(e))return II("Pairing not available","Enable sync and retry.");const t=e,n={...t,addresses:Array.isArray(t.addresses)?t.addresses:[]},r=JSON.stringify(n),o=`echo '${btoa(r)}' | base64 -d | codemem sync pair --accept-file -`;return b.pairingCommandRaw=o,{payloadText:o,hintText:"Copy this command and run it on the other device. Use --include/--exclude to control which projects sync."}}function LI(){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 OI(){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 $I(){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 MI(){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 FI(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 jI({items:e}){return c(ee,{children:e.map((t,n)=>c("div",{class:"stat",children:c("div",{class:"stat-content",children:[c("div",{class:"value",children:t.value}),c("div",{class:"label",children:t.label})]})},`${t.label}-${n}`))})}function BI({attempts:e,note:t}){return c(ee,{children:[t?c("div",{class:"small",children:t}):null,e.map((n,r)=>c("div",{class:"diag-line",children:[c("div",{class:"left",children:[c("div",{children:[n.peerLabel," — ",n.status]}),n.detail?c("div",{class:"small",children:n.detail}):null,n.actionHref&&n.actionLabel?c("a",{class:"small",href:n.actionHref,children:n.actionLabel}):null]}),c("div",{class:"right",children:n.startedAt})]},`${n.startedAt}-${n.peerLabel}-${r}`))]})}function Dv({text:e}){return c(ee,{children:e})}function UI({title:e,detail:t}){return c("div",{class:"sync-empty-state",children:[c("strong",{children:e}),c("span",{children:t})]})}function GI(e,t){if(!t.length){jr(e);return}lt(e,c(jI,{items:t}))}function HI(e,t,n){if(!t.length){jr(e);return}lt(e,c(BI,{attempts:t,note:n}))}function ir(e,t){lt(e,c(UI,{...t}))}function Lv(e,t,n){lt(e,c(Dv,{text:n.payloadText})),t&<(t,c(Dv,{text:n.hintText}))}function Ov({open:e,onOpenChange:t,triggerId:n,triggerClassName:r,closedLabel:o,openLabel:i,contentId:a,contentClassName:s,contentHost:l=null,children:d}){const u=j(null),p=j(null),f=j(!1);mt(()=>{u.current&&(u.current.id=n,u.current.setAttribute("aria-controls",a)),p.current&&(p.current.id=a)},[a,n,e]),G(()=>{if(!e){f.current=!1;return}f.current||(f.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 m=c(Ei,{forceMount:!0,asChild:!0,children:c("div",{ref:p,id:a,className:s,hidden:!e,children:d})});return c(Ai,{open:e,onOpenChange:t,children:[c(nf,{asChild:!0,children:c("button",{ref:u,type:"button",className:r,id:n,"aria-controls":a,children:e?i:o})}),l?Zt(m,l):m]})}function VI({open:e,onOpenChange:t}){return c(Ov,{open:e,onOpenChange:t,triggerId:"syncToggleAdmin",triggerClassName:"sync-toggle-admin",closedLabel:"Set up a new team instead…",openLabel:"Hide team setup",contentId:"syncInvitePanel",children:[c("h3",{className:"settings-group-title",style:{marginTop:"12px"},children:"Create a team"}),c("div",{className:"section-meta",children:"Generate an invite to share with teammates."}),c("div",{className:"actor-create-row",children:[c("label",{htmlFor:"syncInviteGroup",className:"sr-only",children:"Team name"}),c(ve,{className:"peer-scope-input",id:"syncInviteGroup",placeholder:"Team name (e.g. my-team)",type:"text"}),c("label",{htmlFor:"syncInvitePolicy",className:"sr-only",children:"Join policy"}),c("div",{className:"sync-radix-select-host sync-actor-select-host",id:"syncInvitePolicyMount"}),c("div",{className:"sync-ttl-group",children:[c("label",{htmlFor:"syncInviteTtl",children:"Expires in"}),c(ve,{className:"peer-scope-input",defaultValue:"24",id:"syncInviteTtl",min:"1",style:{width:"64px"},type:"number"}),c("span",{children:"hours"})]}),c("button",{className:"settings-button",id:"syncCreateInviteButton",type:"button",children:"Create invite"})]}),c("label",{htmlFor:"syncInviteOutput",className:"sr-only",children:"Generated invite"}),c(vo,{className:"feed-search",id:"syncInviteOutput",placeholder:"Invite will appear here",readOnly:!0,hidden:!0}),c("div",{className:"peer-meta",id:"syncInviteAdminHint"}),c("div",{className:"peer-meta",id:"syncInviteWarnings",hidden:!0})]})}function WI({contentHost:e,open:t,onOpenChange:n}){return c(Ov,{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:[c("div",{className:"peer-title",children:[c("strong",{children:"Pairing command"}),c("div",{className:"peer-actions",children:c("button",{className:"settings-button",id:"pairingCopy",type:"button",children:"Copy command"})})]}),c("div",{className:"pairing-body",children:c("pre",{id:"pairingPayload",style:{userSelect:"all"}})}),c("div",{className:"peer-meta",id:"pairingHint"})]})}function KI(e,t){lt(e,c(VI,{...t}))}function zI(e,t){lt(e,c(WI,{...t}))}function pe(e){return String(e??"").trim()}function qI(e){return pe(e).replace(/\s+/g," ").toLowerCase()}function JI(e){const t=pe(e);return t?t.slice(0,8):"Unnamed device"}function $v(e){return pe(e?.last_error).toLowerCase()}function Mv(e){return e.includes("401")&&e.includes("unauthorized")}function Fv(e){return["timeout","connection refused","unreachable","aborted","all addresses failed"].some(t=>e.includes(t))}var YI={scope_filter:"sharing-domain membership",visibility_filter:"visibility",project_filter:"project filter"};function jv(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 XI(e){const t=jv(e);return!pe(e.device?.device_id)||e.device?.stale||e.hasAmbiguousCoordinatorGroup?!1:e.pairedLocally?t.state==="needs-your-approval":!0}function Bv(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(o=>o&&o.ok===!1),r=t.filter(o=>Math.max(0,Number(o.opsSkipped??0))>0);if(!n.length){if(r.length){const o=r.reduce((a,s)=>a+Math.max(0,Number(s.opsSkipped??0)),0),i=t0(r.map(a=>a.skipped_out??null));return{ok:!0,message:`${o.toLocaleString()} outbound op${o===1?" was":"s were"} filtered: ${i}. 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(o=>Uv(o)==="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(o=>Uv(o)==="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:pe(n[0]?.error)||"Sync failed for at least one device.",warning:!0}}function Uv(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=pe(e.error);return QI(n)?"trust":ZI(n)?"scope":null}function QI(e){const t=e.toLowerCase();return t.includes("401")&&t.includes("unauthorized")}function ZI(e){const t=e.toLowerCase();return!!(t.includes("scope_rejected")||t.includes("missing_scope")||t.includes("stale_epoch")||t.includes("scope_inactive"))}function e0(e){const t=pe(e?.reason);return YI[t]??(t.replaceAll("_"," ")||"sync filters")}function t0(e){const t=new Map;for(const n of e){const r=e0(n),o=Math.max(0,Number(n?.skipped_count??0));o!==0&&t.set(r,(t.get(r)??0)+o)}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 Gv(e){const t=pe(e.localName);if(t)return t;const n=pe(e.coordinatorName);return n||JI(pe(e.deviceId))}function n0(e){const t=pe(e.localName),n=pe(e.coordinatorName);return t||n?!1:!!pe(e.deviceId)}function r0(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 Ma(e){const t=pe(e?.status?.peer_state);if(t==="offline"||t==="stale")return"offline";const n=$v(e);return Mv(n)?"needs-repair":Fv(n)?"offline":e?.has_error||t==="degraded"?"needs-repair":t==="online"||e?.status?.fresh?"connected":"waiting"}function Hv(e){const t=e?.status||{},n=pe(t.peer_state),r=$v(e),o=pe(t.sync_status)==="ok"||pe(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}:Mv(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}:Fv(r)?{state:"offline",badgeLabel:"Offline",description:"This device is saved here, but none of its last known addresses are responding right now.",isWarning:!0}:o||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 o0={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 i0(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[o,i]of Object.entries(t.by_reason??{})){const a=Math.max(0,Number(i??0));if(a===0)continue;const s=o;r.push({reason:s,label:o0[s]??o,count:a})}return r.sort((o,i)=>i.count-o.count||o.label.localeCompare(i.label)),{total:n,badgeLabel:n===1?"1 sync rejection":`${n.toLocaleString()} sync rejections`,reasons:r,lastAt:t.last_at??null}}function Vv(e){return Array.isArray(e)?e.map(t=>pe(t)).filter(t=>!!t):[]}function Wv(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 Fa(e,t){return e?e.replaceAll("_"," "):t}function a0(e){const t=(Array.isArray(e.authorized_scopes)?e.authorized_scopes:[]).map(r=>{const o=pe(r.scope_id),i=pe(r.label);if(!o&&!i)return null;const a=i||"Untitled Space",s=[Fa(pe(r.kind),"user"),Fa(pe(r.authority_type),"local"),`${Fa(pe(r.role),"member")} role`].filter(Boolean).join(" · ");return{scopeId:o||a,label:a,detail:s}}).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 s0(e){const t=(Array.isArray(e.per_scope_sync)?e.per_scope_sync:[]).map(n=>{const r=pe(n.scope_id),o=pe(n.label);if(!r&&!o)return null;const i=o||"Untitled Space",a=pe(n.last_applied_cursor),s=pe(n.last_acked_cursor),l=n.bootstrapped===!0||a?"received":"pending",d=Fa(pe(n.authority_type),"local"),u=Number(n.membership_epoch??0),p=[`Scope id: ${r||"unknown"}`,`${d} authority`,Number.isFinite(u)?`membership epoch ${u}`:null,a?`last applied ${a}`:null,s?`last acknowledged ${s}`:null].filter(f=>!!f).join(" · ");return{scopeId:r||i,label:i,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 c0=["personal","private","home","mine","me"],l0=["oss","open source","opensource","community","public"],d0=["work","client"],u0=["local","legacy","review"];function p0(e){return[e.scope_id,e.label,e.kind,e.authority_type].map(t=>pe(t)??"").join(" ").toLowerCase()}function f0(e){return[e.scope_id,e.label,e.kind].map(t=>pe(t)??"").join(" ").toLowerCase()}function Kv(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ql(e,t){const n=p0(e);return t.some(r=>{const o=Kv(r.toLowerCase());return new RegExp(`(^|[^a-z0-9])${o}([^a-z0-9]|$)`).test(n)})}function zv(e){return ql(e,c0)||ql(e,l0)}function m0(e){const t=f0(e);return u0.some(n=>{const r=Kv(n.toLowerCase());return new RegExp(`(^|[^a-z0-9])${r}([^a-z0-9]|$)`).test(t)})}function h0(e){return!zv(e)&&(!m0(e)||ql(e,d0))}function g0(e){const t=Array.isArray(e.authorized_scopes)?e.authorized_scopes:[];if(!(pe(e.discovered_via_group_id)||pe(e.discovered_via_coordinator_id))||t.length===0)return{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""};const n=t.some(zv),r=t.some(h0);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 v0(e,t){const n=e.map(r=>r.trim()).filter(Boolean);return n.length>0&&!n.includes("*")||t.length>0}function y0(e){const t=Vv(e?.effective_include),n=Vv(e?.effective_exclude),r=e?.inherits_global?"Global defaults":"Device override",o=`Include filter: ${Wv(t,"all projects")}`,i=`Exclude filter: ${Wv(n,"no exclusions")}`,a=v0(t,n);return{hasAdvancedFilters:a,statusLabel:a?"Advanced filters active":"No advanced filters",sourceLabel:r,includeLabel:o,excludeLabel:i,summary:`${r}. ${o}; ${i}.`,note:"Advanced filters only narrow data after Space access; they never grant access to another Space."}}function b0(e){const t=new Map;return(Array.isArray(e)?e:[]).forEach(n=>{const r=pe(n?.display_name),o=pe(n?.actor_id),i=qI(r);if(!r||!o||!i)return;const a=t.get(i)??{displayName:r,actorIds:[],includesLocal:!1};a.actorIds=[...a.actorIds,o],a.includesLocal=a.includesLocal||!!n?.is_local,t.set(i,a)}),[...t.values()].filter(n=>n.actorIds.length>1).sort((n,r)=>n.displayName.localeCompare(r.displayName))}function qv(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.duplicatePeople)?e.duplicatePeople:[],o=new Map;n.forEach(a=>{const s=pe(a?.actor_id);s&&o.set(s,(o.get(s)??0)+1)});const i=new Set;return r.forEach(a=>{a.includesLocal&&a.actorIds.forEach(s=>{const l=t.find(d=>pe(d?.actor_id)===s);!l||l.is_local||(o.get(s)??0)>0||i.add(s)})}),{visibleActors:t.filter(a=>!i.has(pe(a?.actor_id))),hiddenLocalDuplicateCount:i.size}}function _0(e){return e.discovered?.stale?e.peer?Ma(e.peer)!=="connected":!0:!1}function Jv(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 Jl(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 w0(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 S0(e){const t=pe(e?.coordinator_url),n=Array.isArray(e?.groups)?e.groups:[];return t?n.some(r=>pe(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 C0(e,t){const n=new Map,r=o=>{const i=n.get(o)??{deviceId:o,localName:"",coordinatorName:"",peer:null,discovered:null};return n.set(o,i),i};return e.forEach(o=>{const i=pe(o?.peer_device_id);if(!i)return;const a=r(i);a.peer=o,a.localName=pe(o?.name)}),t.forEach(o=>{const i=pe(o?.device_id);if(!i)return;const a=r(i);a.discovered=o,a.coordinatorName=pe(o?.display_name)}),[...n.values()]}function T0(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:[],o=C0(n,r),i=e.duplicatePersonDecisions??{},a=b0(t).filter(l=>!i[[...l.actorIds].sort().join("::")]),s=[];return a.forEach(l=>{s.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})}),o.forEach(l=>{const d=Gv({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId}),u=l.peer?Ma(l.peer):"waiting",p=l.peer?Hv(l.peer):null,f=pe(l.discovered?.fingerprint),m=pe(l.peer?.fingerprint);if(l.peer&&f&&m&&f!==m){s.push(Jv({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 v=p?.description||pe(l.peer?.last_error)||"Sync needs review.";s.push(Jv({id:l.deviceId,name:d,title:p?.state==="needs-repairing"?`${d} needs re-pairing`:`${d} needs review`,summary:v}))}l.peer&&p?.state==="trusted-by-you"&&s.push(Jl({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&&s.push(Jl({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&&s.push(Jl({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&&n0({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId})&&s.push(w0({id:l.deviceId,name:d,summary:"Give this device a friendly name so it is easier to recognize later."}))}),{summary:{connectedDeviceCount:n.filter(l=>Ma(l)==="connected").length,seenOnTeamCount:r.length,offlineTeamDeviceCount:o.filter(l=>_0(l)).length},duplicatePeople:a,attentionItems:s.sort((l,d)=>l.priority-d.priority||l.title.localeCompare(d.title))}}var Yv={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 An(e){const t=document.getElementById(e);t&&t.remove()}var Xv=!1;function k0(e){Xv=e}var Yl=!1;function x0(e){Yl=e}var Xl=!1;function A0(e){Xl=e}var E0=new Set,Ql=new Set,Zl=new Set,Qv="codemem-sync-duplicate-person-decisions";function N0(e){const t=String(e||"").trim();t&&(Ql.add(t),Zl.add(t),E0.add(t))}function ed(e){const t=String(e||"").trim();return!!t&&Ql.has(t)}function P0(e){const t=String(e||"").trim();t&&Ql.delete(t)}function R0(e){const t=String(e||"").trim();return!t||!Zl.has(t)?!1:(Zl.delete(t),!0)}function td(){try{const e=localStorage.getItem(Qv);if(!e)return{};const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Zv(e){try{localStorage.setItem(Qv,JSON.stringify(e))}catch{}}function ey(e){return[...e].map(t=>String(t||"").trim()).filter(Boolean).sort().join("::")}function I0(){return td()}function D0(e,t){const n=ey(e);if(!n)return;const r=td();r[n]=t,Zv(r)}function L0(e){const t=ey(e);if(!t)return;const n=td();delete n[t],Zv(n)}function ty(e){return e.replace(/\b(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}\b/g,"$1.#.#")}function ny(e){const t=String(e||"");return t?ty(t):""}function O0(e){if(!Array.isArray(e))return"";const t=Array.from(new Set(e.filter(Boolean)));return typeof t[0]=="string"?t[0]:""}function $0(e,t){const n=String(e?.relatedPeerDeviceId??"").trim();return n?t.some(r=>String(r?.peer_device_id??"").trim()===n):!1}function ja(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 Ba(e){return!e||typeof e!="object"?"Unknown person":e.is_local?"You":ja(e)}function M0(e){return(Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[]).filter(t=>String(t?.actor_id||"")===e).length}function ry(){return qv({actors:b.lastSyncActors,peers:b.lastSyncPeers,duplicatePeople:b.lastSyncViewModel?.duplicatePeople}).visibleActors}function F0(e=""){const t=[{value:"",label:"No person assigned"}],n=ry(),r=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).find(o=>String(o?.actor_id||"")===e);return(r&&!n.some(o=>String(o?.actor_id||"")===e)?[...n,r]:n).forEach(o=>{const i=String(o?.actor_id||"").trim();i&&t.push({value:i,label:Ba(o)})}),t.filter((o,i,a)=>i===a.findIndex(s=>s.value===o.value))}function oy(e){return ry().filter(t=>String(t?.actor_id||"")!==e)}function j0(e,t){const n=oy(t).find(r=>String(r?.actor_id||"")===e);return!e||!n?"Choose which person should keep these devices.":`Merge into ${Ba(n)}. Assigned devices move now; existing memories keep their current provenance.`}function nd(e,t){if(e){if(e.textContent="",!t.length){e.hidden=!0;return}e.hidden=!1,t.slice(0,2).forEach(n=>{const r=Ti("div","sync-action"),o=Ti("div","sync-action-text");o.textContent=n.label,o.appendChild(Ti("span","sync-action-command",n.command));const i=Ti("button","settings-button sync-action-copy","Copy");i.addEventListener("click",()=>ro(n.command,i)),r.append(o,i),e.appendChild(r)})}}function iy(e,t){return t&&e.error_redacted===!0}function ay(){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){ir(e,$I());return}const r=FI(n,t.slice(0,5).some(o=>o.status==="error"));HI(e,t.slice(0,5).map(o=>{const i=o.started_at||o.started_at_utc||"",a=String(o.peer_device_id||"").trim(),s=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers.find(f=>String(f?.peer_device_id||"")===a):null,l=String(s?.name||"").trim()||(a?a.slice(0,8):"unknown"),d=o.status==="error",u=[],p=oo();if(d&&o.error){const f=String(o.error);u.push(p?ty(f):f),iy(o,p)&&u.push("Turn off Redact in Advanced diagnostics to reveal the full error.")}return!d&&(o.ops_in||o.ops_out)&&u.push(`${o.ops_in??0} in · ${o.ops_out??0} out`),!p&&o.address&&u.push(o.address),{status:o.status||"unknown",peerLabel:l,detail:u.join(" · "),startedAt:i?Xn(i):"",...iy(o,p)?{actionHref:"#sync/diagnostics",actionLabel:"Open Advanced diagnostics Redact setting"}:{}}}),r)}function B0(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncAttempts"),n=document.getElementById("syncMeta"),r=document.getElementById("syncActions");e&&ir(e,OI()),t&&ir(t,MI()),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."),nd(r,[])}function Br(e){const t=Number(e??0);return Number.isFinite(t)?t:0}function U0(e){const t=String(e?.state??"clear"),n=e?.stale_peer_rows??{},r=e?.access_cleanup_ops??{},o=Br(n.would_remove),i=Br(n.ambiguous),a=Br(r.applied),s=Br(r.source_authored);return t==="cleanup_pending"||o>0?`${o} pending removal`:t==="needs_review"||i>0?`${i} needs review`:t==="cleanup_applied"||a>0?`${a} applied`:t==="cleanup_announced"||s>0?`${s} announced`:"Clear"}function sy(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncMeta"),n=document.getElementById("syncActions");if(!e)return;An("syncDiagSkeleton");const r=b.lastSyncStatus;if(!r){ir(e,LI()),nd(n,[]),t&&(t.textContent="Loading advanced sync diagnostics…");return}const o=r.peers||{},i=r.ping||{},a=r.sync||{},s=r.last_sync_at||r.last_sync_at_utc||null,l=i.last_ping_at||r.last_ping_at||PI(o)||null,d=r.last_sync_error||"",u=r.last_ping_error||"",p=Number(r.pending||0),f=String(r.daemon_detail||""),m=String(r.daemon_state||"unknown"),v=r.retention||{},g=r.cleanup_diagnostics,y=g?.stale_peer_rows??{},_=Br(y.would_remove),w=Br(y.ambiguous),C=v.enabled===!0,T=Number(v.last_deleted_ops||0),x=v.last_run_at||null,E=String(v.last_error||""),L=m==="offline-peers"?"Offline peers":m==="needs_attention"?"Needs attention":m==="rebootstrapping"?"Rebootstrapping":Ah(m),F=m==="disabled"||r.enabled===!1,H=Object.keys(o).length,R=!F&&H===0;if(t){const N=F?["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"]:R?["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: ${L}`,`Peers: ${H}`,s?`Last sync: ${Sn(Ir(s))} ago`:"Last sync: never"];m==="offline-peers"&&N.push("All peers are currently offline; sync will resume automatically"),f&&m==="stopped"&&N.push(`Detail: ${f}`),f&&(m==="needs_attention"||m==="rebootstrapping")&&N.push(`Detail: ${f}`),C&&N.push(x?`Retention last ran ${Sn(Ir(x))} ago (approx oldest-first)`:"Retention enabled"),_>0?N.push(`${_.toLocaleString()} stale peer rows pending cleanup`):w>0&&N.push(`${w.toLocaleString()} stale peer rows retained because safe cleanup could not be proven`),t.textContent=N.join(" · ")}const U=F?[{label:"State",value:"Disabled"},{label:"Mode",value:"Optional"},{label:"Pending events",value:p},{label:"Last sync",value:"Not running"}]:R?[{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:L},{label:"Pending events",value:p},{label:"Last sync",value:s?`${Sn(Ir(s))} ago`:"never"},{label:"Last peer ping",value:l?`${Sn(Ir(l))} ago`:"never"},{label:"Retention",value:C?x?`${T.toLocaleString()} ops last run (approx)`:"Enabled":"Disabled"}];!F&&!R&&(d||u)&&U.push({label:[d,u].filter(Boolean).join(" · "),value:"Errors"}),!F&&!R&&a.seconds_since_last&&U.push({label:"Since last sync",value:`${a.seconds_since_last}s`}),!F&&!R&&i.seconds_since_last&&U.push({label:"Since last peer ping",value:`${i.seconds_since_last}s`}),!F&&C&&E&&U.push({label:E,value:"Retention"}),!F&&!R&&g&&U.push({label:"Cleanup",value:U0(g)}),GI(e,U);const B=[];R||m==="offline-peers"||(m==="stopped"?(B.push({label:"Sync daemon is stopped. Start it.",command:"codemem serve start"}),B.push({label:"Run one sync pass now.",command:"codemem sync once"})):m==="needs_attention"?B.push({label:"Sync needs manual attention before reset can continue.",command:"codemem sync doctor"}):m==="rebootstrapping"?B.push({label:"Sync is rebuilding state in the background.",command:"codemem sync status"}):d||u||m==="error"?(B.push({label:"Sync reports errors. Restart now.",command:"codemem serve restart && codemem sync once"}),B.push({label:"Run doctor for the root cause.",command:"codemem sync doctor"})):!F&&!R&&p>0&&B.push({label:"Pending sync work detected. Run one pass now.",command:"codemem sync once"})),!F&&w>0?B.push({label:"Some stale peer rows were retained because cleanup was ambiguous.",command:"codemem sync doctor"}):!F&&_>0&&B.push({label:"Stale peer rows are eligible for cleanup. Run one sync pass now.",command:"codemem sync once"}),nd(n,B)}var G0="syncRedactMount",H0="syncRedactLabel",cy=()=>{};function V0(e){cy=e}var rd=()=>{};function od(){const e=document.getElementById("syncPairingDisclosureMount"),t=document.getElementById("syncPairingPanelMount");if(!e||!t)return;zI(e,{contentHost:t,open:b.syncPairingOpen,onOpenChange:r=>{if($w(r),od(),r){const o=document.getElementById("pairingPayload"),i=document.getElementById("pairingHint");o&&Lv(o,i,{payloadText:"Loading…",hintText:"Fetching pairing payload…"})}rd()}});const n=document.getElementById("pairingCopy");n&&(n.onclick=async()=>{const r=b.pairingCommandRaw;r&&await ro(r,n)})}function id(){od();const e=document.getElementById("pairingPayload"),t=document.getElementById("pairingHint");if(!e)return;Lv(e,t,DI(b.pairingPayloadRaw));const n=document.getElementById("pairingCopy");n&&(n.disabled=!b.pairingCommandRaw)}function ly(){const e=document.getElementById(G0);e&<(e,h(Er,{"aria-labelledby":H0,checked:oo(),className:"sync-redact-switch",id:"syncRedact",onCheckedChange:t=>{Mw(t),ly(),rd(),sy(),cy(),ay(),id()},thumbClassName:"sync-redact-switch-thumb"}))}function W0(e){rd=e,od(),ly()}function K0(e){e.classList.add("sync-shake"),e.addEventListener("animationend",()=>e.classList.remove("sync-shake"),{once:!0})}function Ua(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),K0(e),e.addEventListener("input",()=>Wo(e),{once:!0}),!1}function Wo(e){e.classList.remove("sync-field-error");const t=e.parentElement?.querySelector(".sync-field-hint");t&&t.remove()}function Je(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}function dy({title:e,detail:t}){return c("div",{className:"sync-empty-state",role:"status","aria-live":"polite","aria-atomic":"true",children:[c("strong",{children:e}),c("span",{children:t})]})}function z0(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 q0({actor:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:o}){const i=String(e.actor_id||""),a=ja(e),s=M0(i),l=oy(i),d=l.map(B=>String(B.actor_id||"")).join("|"),[u,p]=O(a),[f,m]=O(!1),[v,g]=O("Rename"),[y,_]=O(!1),[w,C]=O("Merge into selected person"),[T,x]=O(""),[E,L]=O(!1);G(()=>{p(a),m(!1),g("Rename"),_(!1),C("Merge into selected person"),x(""),L(!1)},[i,s,t,a,d]);const F=l.length?j0(T,i):"No other people are available yet. Create another person first if you need to merge duplicates.",H=[{label:"Merge into person",value:""},...l.map(B=>{const N=String(B.actor_id||"");return{label:B.is_local?Ba(B):ja(B),value:N}})];async function R(){const B=u.trim();if(!B)return;m(!0),g("Saving…");let N=!1;try{await n(i,B),N=!0}catch{g("Retry rename")}finally{m(!1),N&&g("Rename")}}async function U(){if(!T)return;const B=l.find(P=>String(P.actor_id||"")===T);if(!B||!await Gt({title:`Merge ${a} into ${ja(B)}?`,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),C("Merging…");let N=!1;try{await r(T,i),N=!0}catch{C("Retry merge")}finally{_(!1),N&&C("Merge into selected person")}}return c("div",{className:"actor-row",children:[c("div",{className:"actor-details",children:[c("div",{className:"actor-title",children:[c("strong",{children:Ba(e)}),c("span",{className:`badge actor-badge${e.is_local?" local":""}`,title:e.is_local?z0(t):void 0,children:e.is_local?"You":`${s} device${s===1?"":"s"}`})]}),e.is_local?null:c("div",{className:"peer-meta",children:[s," assigned device",s===1?"":"s"]})]}),c("div",{className:"actor-actions",children:e.is_local?c("div",{className:"peer-meta",children:"Rename yourself in config"}):c(ee,{children:[c(ve,{"aria-label":`Rename ${a}`,className:"peer-scope-input actor-name-input",disabled:f||y,type:"text",value:u,onInput:B=>p(B.currentTarget.value),onKeyDown:B=>vr(B,{onSubmit:()=>{R()},disabled:f||y||!u.trim()})}),c("button",{type:"button",className:"settings-button","data-primary-action":"true",disabled:f||y,onClick:()=>{R()},children:v}),c("button",{type:"button",className:"settings-button danger",disabled:f||y,onClick:async()=>{await Gt({title:`Remove ${a}?`,description:"This deactivates the person and unassigns their devices. Existing memories keep their current attribution.",confirmLabel:"Remove person",cancelLabel:"Keep",tone:"danger"})&&await o(i)},children:"Remove"}),c("button",{type:"button",className:"settings-button",disabled:f||y,onClick:()=>L(B=>!B),children:E?"Hide duplicate cleanup":"Show duplicate cleanup"}),E?c(ee,{children:[c("div",{className:"peer-meta actor-merge-note",children:"Use this only when combining duplicate people into one."}),c("div",{className:"actor-merge-controls",children:[c(an,{ariaLabel:`Merge ${a} into another person`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:y||l.length===0,itemClassName:"sync-radix-select-item",onValueChange:x,options:H,placeholder:"Merge into person",triggerClassName:"sync-radix-select-trigger sync-actor-select actor-merge-select",value:T,viewportClassName:"sync-radix-select-viewport"}),c("button",{type:"button",className:"settings-button",disabled:y||l.length===0||!T,onClick:()=>{U()},children:w})]}),c("div",{className:"peer-meta actor-merge-note",children:F})]}):null]})})]})}function J0({actors:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:o}){return e.length?c(ee,{children:e.map(i=>{const a=String(i.actor_id||i.display_name||i.is_local||"");return c(q0,{actor:i,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:o},a)})}):c(dy,{detail:"Create a named person here, then assign devices below so team ownership stays readable.",title:"No people set up yet."})}function Y0(e,t){lt(e,c(J0,{...t}))}function X0(e){return e.filter(t=>String(t.origin_device_id||"").trim())}function Q0(e){const t=e.find(n=>String(n.last_seen_at||"").trim());return t?.last_seen_at?`Detected from older synced memories. Latest memory: ${Xn(String(t.last_seen_at).trim())}`:"Detected from older synced memories not yet attached to a current device."}function Z0({devices:e}){return c(ee,{children:Q0(e)})}function eD(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 tD(e){const t=X0(e.devices);if(!t.length){e.panel.hidden=!0,e.onValueChange(""),jr(e.mount),jr(e.meta);return}const n=t.map(eD),r=n.some(o=>o.value===e.value)?e.value:n[0]?.value||"";r!==e.value&&e.onValueChange(r),e.panel.hidden=!1,lt(e.mount,c(an,{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"})),lt(e.meta,c(Z0,{devices:t}))}var nD={online:"Online",offline:"Offline",degraded:"Degraded",attention:"Action required",syncing:"Syncing",unknown:"Status unknown"};function rD({state:e,size:t=8,"aria-label":n}){return c("span",{"aria-label":n??nD[e],className:`presence-pip presence-pip--${e}`,role:"img",style:`--presence-pip-size: ${t}px`})}function ar({feedback:e}){return e?.message?c("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 oD(){return c("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:[c("title",{children:"Chevron"}),c("path",{d:"m9 18 6-6-6-6"})]})}function iD(e){switch(Ma(e)){case"connected":return"online";case"offline":return"offline";case"needs-repair":return"attention";default:return"unknown"}}var Ga=null,uy=0,ad=new Set;function py(e){if(Ga!==e){Ga=e,uy+=1;for(const t of ad)t(uy)}}function aD(){const[,e]=O(0);return G(()=>(ad.add(e),()=>{ad.delete(e)}),[]),Ga}var sD={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 cD(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 lD(){window.location.hash="coordinator-admin"}function sd(e=b.lastCoordinatorAdminStatus){return e?.readiness==="ready"&&e.has_admin_secret===!0}function dD({peer:e,onAssignActor:t,onRemove:n,onRename:r,onSync:o}){const i=String(e.peer_device_id||""),a=e.name||(i?i.slice(0,8):"unknown"),s=e.name||i||a,l=Hv(e),d=sD[r0(e)],u=e.status||{},p=a0(e),f=ed(i),m=f&&p.total===0,v=g0(e),g=i0(e),y=s0(e),_=y0(e.project_scope||{}),w=O0(e.addresses),C=Array.isArray(e.addresses)?Array.from(new Set(e.addresses.filter(Boolean).map(re=>String(re)))):[],T=Number(e.address_count??0),x=Number.isFinite(T)&&T>0?T:0,E=C.length?C.map(re=>oo()?ny(re):re).join(" · "):x>0?`${x} ${x===1?"address":"addresses"} hidden`:"No addresses",L=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.",F=String(u.last_sync_at||u.last_sync_at_utc||""),H=String(u.last_ping_at||u.last_ping_at_utc||""),R=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,U=R0(i),B=j(null),[N,P]=O(a),[X,z]=O(()=>b.syncPeerFeedbackById.get(i)??null),[k,D]=O(!1),[I,K]=O("Save name"),[me,ue]=O(!1),[ie,xe]=O(!1),[Se,Te]=O("Remove device"),[Y,we]=O(String(e.actor_id||"")),[ae,Q]=O(!1),[Ae,ce]=O("Save assignment"),De=Ne(()=>{const re=F0(Y),Be=re.some(Rn=>Rn.value===Y);return Y&&!Be&&re.push({value:Y,label:e.claimed_local_actor?"You":String(e.actor_display_name||"Current assignment")}),re},[e.actor_display_name,e.claimed_local_actor,Y,b.lastSyncActors,b.lastSyncPeers,b.lastSyncViewModel]);G(()=>{f&&p.total>0&&P0(i)},[p.total,i,f]),G(()=>{P(a),z(b.syncPeerFeedbackById.get(i)??null),D(!1),K("Save name"),ue(!1),xe(!1),Te("Remove device"),we(String(e.actor_id||"")),Q(!1),ce("Save assignment")},[a,e.actor_id,i]),G(()=>{!U||!B.current||queueMicrotask(()=>B.current?.scrollIntoView({block:"center",behavior:window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"}))},[U]);async function se(){if(!i)return;const re=N.trim();if(!re){const Be={message:"Enter a friendly name for this device.",tone:"warning"};z(Be),b.syncPeerFeedbackById.set(i,Be),document.querySelector(`[data-device-name-input="${CSS.escape(i)}"]`)?.focus();return}D(!0),K("Saving…");try{const Be=await r(i,re);z(Be),b.syncPeerFeedbackById.set(i,Be),K("Save name")}catch{K("Retry")}finally{D(!1)}}async function Ye(){if(m){const re=sd();if(!await Gt({title:`Sync ${a} before advanced rule review?`,description:re?"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:re?"Review in Teams first":"Cancel"}))return}ue(!0);try{const re=await o(e,w);z(re),re&&b.syncPeerFeedbackById.set(i,re)}finally{ue(!1)}}async function pt(){if(!i||!await Gt({title:`Remove device ${s}?`,description:"This removes the local record for this paired device on this machine.",confirmLabel:"Remove device",cancelLabel:"Keep device",tone:"danger"}))return;xe(!0),Te("Removing…");let re=!1;try{await n(i,s),re=!0}catch{Te("Retry remove")}finally{xe(!1),re&&Te("Remove device")}}async function Xe(){if(i){Q(!0),ce("Saving…");try{const re=await t(i,Y||null);z(re),b.syncPeerFeedbackById.set(i,re),ce("Save assignment")}catch{ce("Retry")}finally{Q(!1)}}}const cn=aD()===i&&i!=="",It=`device-drawer-${i||"unknown"}`,Ct=iD(e),Dt=F?`Sync: ${Xn(F)}`:"Sync: never",Qe=sd(),Lt=`${cn?"Collapse":"Expand"} device ${a}`;return c(Ai,{asChild:!0,open:cn,onOpenChange:re=>{re?py(i):Ga===i&&py(null)},children:c("div",{ref:B,className:"peer-card","data-peer-device-id":i||void 0,children:[c(nf,{asChild:!0,children:c("button",{"aria-label":Lt,className:"device-row-head device-row-head--trigger",type:"button",children:[c(rD,{state:Ct}),c("span",{className:"device-row-name",title:i||void 0,children:a}),d?c("span",{"aria-label":d.label,className:"peer-direction",role:"img",title:d.label,children:d.glyph}):null,c("span",{className:"device-row-chips",children:[c("span",{className:`badge ${l.isWarning?"badge-offline":"badge-online"}`,children:l.badgeLabel}),m?c("span",{className:"badge actor-badge",children:"Review advanced rules"}):null,c("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}),g.badgeLabel?c("span",{className:"badge badge-offline",title:"Inbound ops rejected by the sharing-domain scope gate. Expand for reason codes.",children:g.badgeLabel}):null,v.badgeLabel?c("span",{className:"badge badge-offline",title:"Review whether explicit Space access matches this device's intended role.",children:v.badgeLabel}):null,e.discovered_via_group_id?c("span",{className:"badge actor-badge",title:`Discovered through coordinator group ${e.discovered_via_group_id}`,children:`via ${e.discovered_via_group_id}`}):null]}),c("span",{className:"device-row-meta",children:Dt}),c("span",{"aria-hidden":"true",className:"device-row-chevron",children:c(oD,{})})]})}),c(Ei,{"aria-label":`Device actions for ${a}`,className:"device-row-drawer",id:It,children:[c("div",{className:"peer-actions",children:[c("button",{type:"button",className:"settings-button",disabled:me,onClick:()=>{Ye()},title:w?void 0:"Address details are hidden; sync will target this device by ID.",children:me?"Syncing…":"Sync now"}),c("div",{className:"sync-labeled-field",children:[c("label",{className:"sync-labeled-field-caption",htmlFor:`device-name-${i||"unknown"}`,children:"Device name"}),c(ve,{"aria-label":`Friendly name for ${a}`,className:"peer-scope-input","data-device-name-input":i||void 0,disabled:k,id:`device-name-${i||"unknown"}`,placeholder:"Friendly device name",type:"text",value:N,onInput:re=>P(re.currentTarget.value)})]}),c("button",{type:"button",className:"settings-button",disabled:k,onClick:()=>{se()},children:I}),c("button",{type:"button",className:"settings-button danger",disabled:ie,onClick:()=>{pt()},children:Se})]}),c("div",{className:"peer-scope",children:[U?c("div",{className:"peer-meta",children:Qe?"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."}):m?c("div",{className:"peer-meta",children:"Advanced rule review is still pending for this device."}):null,c("div",{className:"peer-scope-summary",children:"Device details"}),c("div",{className:"peer-addresses",children:E}),R?c("div",{className:"peer-meta",children:R}):null,c("div",{className:"peer-meta",children:[F?`Sync: ${Xn(F)}`:"Sync: never",H?`Ping: ${Xn(H)}`:"Ping: never"].join(" · ")}),c("div",{className:"peer-scope-summary",children:"Space access"}),c("div",{className:"peer-meta",children:p.total>0?"These Spaces are the hard access boundary for this device.":p.emptyMessage}),p.domains.length>0?c("ul",{className:"peer-scope-chips","aria-label":"Authorized Spaces",children:p.domains.map(re=>c("li",{className:"peer-scope-chip",title:re.detail,children:re.label},re.scopeId))}):null,v.isVisible?c("div",{className:"settings-note",role:"status",children:[c("strong",{children:v.title}),c("div",{children:v.message}),c("div",{children:v.detail})]}):null,c("div",{className:"peer-meta",children:_.note}),c("div",{className:"peer-scope-summary",children:"Space sync progress"}),c("div",{className:"peer-meta",children:y.total>0?"Per-Space progress for this device. Open details to see technical identifiers.":y.emptyMessage}),y.rows.length>0?c("ul",{className:"peer-scope-rejections-list","aria-label":"Per-Space sync progress",children:y.rows.map(re=>c("li",{title:re.detail,children:[c("span",{className:"peer-scope-rejection-label",children:re.label}),c("span",{className:`badge ${re.status==="received"?"badge-online":"actor-badge"}`,children:re.badgeLabel})]},re.scopeId))}):null,g.total>0?c("div",{className:"peer-scope-rejections","data-peer-rejection-count":g.total,children:[c("div",{className:"peer-scope-summary",children:"Sharing-rule rejections (24h)"}),c("div",{className:"peer-meta",children:"Inbound ops the local fail-closed gate refused. Diagnostics never expose op payloads."}),c("ul",{className:"peer-scope-rejections-list",children:g.reasons.map(re=>c("li",{children:[c("span",{className:"peer-scope-rejection-label",children:re.label}),c("span",{className:"peer-scope-rejection-count",children:re.count.toLocaleString()})]},re.reason))}),g.lastAt?c("div",{className:"peer-meta",children:["Last rejected ",Xn(g.lastAt)]}):null]}):null,c("div",{className:"peer-scope-summary",children:"Who this device belongs to"}),c("div",{className:"peer-meta",children:L}),e.claimed_local_actor?c("div",{className:"peer-meta",children:cD(e.claimed_local_actor_scope)}):null,c("div",{className:"peer-actor-row",children:[c("div",{className:"sync-radix-select-host sync-actor-select-host",children:c(an,{ariaLabel:`Assigned person for ${a}`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:ae,itemClassName:"sync-radix-select-item",onValueChange:we,options:De,placeholder:"No person assigned yet",triggerClassName:"sync-radix-select-trigger sync-actor-select",value:Y,viewportClassName:"sync-radix-select-viewport"})}),c("button",{type:"button",className:"settings-button",disabled:ae,onClick:()=>{Xe()},children:Ae})]}),c("div",{className:"peer-scope-summary",children:"Advanced sharing rules"}),c("div",{className:"peer-meta",children:[_.statusLabel,". ",_.summary," ",_.note]}),Qe?c("div",{className:"peer-actions",children:c("button",{type:"button",className:"settings-button",onClick:lD,children:"Manage Spaces in Teams"})}):c("div",{className:"peer-meta",children:"Space access is managed in Teams by a coordinator or manager."}),c(ar,{feedback:X})]})]})]})})}function uD(e){const t=b.syncPeersSectionFeedback,n=b.lastSyncStatus,r=n?.daemon_state==="disabled"||n?.enabled===!1;return e.peers.length?c(ee,{children:[c(ar,{feedback:t}),e.peers.map(o=>{const i=String(o.peer_device_id||o.name||"unknown-peer");return c(dD,{peer:o,...e},i)})]}):c(ee,{children:[c(ar,{feedback:t}),c(dy,{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 pD(e,t){lt(e,c(uD,{...t}))}var En=async()=>{},Ha="";function cd(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput");t&&(t.disabled=e),n&&(n.disabled=e)}function fD(e){En=e}function mD(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");if(!e)return;An("syncActorsSkeleton"),cd(!1);const n=qv({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.`)),Y0(e,{actors:r,hiddenLocalDuplicateCount:n.hiddenLocalDuplicateCount,onRename:async(o,i)=>{await yw(o,i),await En()},onMerge:async(o,i)=>{try{await Sp(o,i),Z("People combined. Assigned devices moved to the selected person."),await En()}catch(a){throw Z(Je(a,"Failed to combine people."),"warning"),a}},onDeactivate:async o=>{try{await bw(o),Z("Person removed. Assigned devices have been unassigned."),await En()}catch(i){throw Z(Je(i,"Failed to remove person."),"warning"),i}}})}function hD(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");cd(!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&&ir(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. When the people endpoint responds again, named people will reload here."})}function ld(){const e=document.getElementById("syncPeers");if(!e)return;An("syncPeersSkeleton");const t=b.lastSyncPeers,n=Array.isArray(t)?t:[];$0(b.syncPeersSectionFeedback,n)&&(b.syncPeersSectionFeedback=null),pD(e,{peers:n,onRename:async(r,o)=>{try{return await bp(r,o),await En(),{message:"Device name saved.",tone:"success"}}catch(i){return{message:Je(i,"Failed to save device name."),tone:"warning"}}},onSync:async(r,o)=>{try{const i=String(r?.peer_device_id||""),a=Bv(await Us({address:o,peerDeviceId:i||void 0}));let s;a.ok?i&&ed(i)?s={message:`Triggered sync for ${r?.name||(i?i.slice(0,8):"unknown")}. ${sd()?"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"}:s={message:a.message,tone:"success"}:s={message:a.message,tone:"warning"};try{await En()}catch{s={message:"Sync started, but this view has not refreshed yet. Refresh the page or use Sync now again before retrying.",tone:"warning"}}return s}catch(i){return{message:Je(i,"Failed to trigger sync."),tone:"warning"}}},onRemove:async(r,o)=>{try{await yp(r);const i={message:`Removed peer ${o}.`,tone:"success"};return b.syncPeerFeedbackById.delete(r),b.syncPeersSectionFeedback={...i,relatedPeerDeviceId:r},await En(),i}catch(i){return{message:Je(i,"Failed to remove peer. The local peer entry is still here."),tone:"warning"}}},onAssignActor:async(r,o)=>{try{return await iw(r,o),await En(),{message:o?"Device assignment updated.":"Device assignment cleared.",tone:"success"}}catch(i){return{message:Je(i,"Failed to update device assignment. The current assignment is unchanged."),tone:"warning"}}}})}function gD(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta"),n=document.getElementById("syncPeers");cd(!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&&ir(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&&ir(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 fy(){const e=document.getElementById("syncLegacyClaims"),t=document.getElementById("syncLegacyDeviceSelectMount"),n=document.getElementById("syncLegacyClaimsMeta");!e||!t||!n||tD({devices:Array.isArray(b.lastSyncLegacyDevices)?b.lastSyncLegacyDevices:[],meta:n,mount:t,onValueChange:r=>{r!==Ha&&(Ha=r,fy())},panel:e,value:Ha})}function vD(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput"),r=document.getElementById("syncLegacyClaimButton");n?.addEventListener("keydown",o=>{vr(o,{onSubmit:()=>t?.click(),disabled:!t||t.disabled})}),t?.addEventListener("click",async()=>{if(!t||!n)return;const o=String(n.value||"").trim();if(!o){Ua(n,"Enter a name for the person.");return}Wo(n),t.disabled=!0,n.disabled=!0,t.textContent="Creating…";try{await vw(o),Z("Person created."),n.value="",await e()}catch(i){Z(Je(i,"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 o=String(Ha||"").trim();if(!o||!r||!await Gt({title:`Attach history from ${o}?`,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 i=r.textContent||"Attach device history";r.textContent="Attaching…";try{await _w(o),Z("Old device history attached to you."),await e()}catch(a){Z(Je(a,"Failed to attach old device history."),"warning"),r.textContent="Retry",r.disabled=!1;return}r.textContent=i,r.disabled=!1})}function yD(){return window.location.hash.replace(/^#/,"")==="sync/diagnostics"?"diagnostics":"main"}function my(e=yD()){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 hy=!1;function bD(){hy||(hy=!0,window.addEventListener("hashchange",()=>{my()}))}var Kt={invitePolicy:"auto_admit",loadSyncData:async()=>{}};function _D(e){Kt.loadSyncData=e}var wD=[{value:"auto_admit",label:"Auto-admit"},{value:"approval_required",label:"Approval required"}];function SD(){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 o=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=o}function dd(){const e=document.getElementById("syncAdminDisclosureMount");e&&KI(e,{open:Xv,onOpenChange:t=>{k0(t),dd(),Wa(),ud()}})}function CD(){const e=document.getElementById("syncJoinPanel"),t=document.getElementById("syncJoinSection");!e||!t||e.parentElement!==t&&t.appendChild(e)}function ud(){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 Va(){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 Wa(){const e=document.getElementById("syncInvitePolicyMount");e&<(e,h(an,{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!==Kt.invitePolicy&&(Kt.invitePolicy=n,Wa())},options:wD,triggerClassName:"sync-radix-select-trigger sync-actor-select",value:Kt.invitePolicy,viewportClassName:"sync-radix-select-viewport"}))}function TD(e,t){dd(),Wa();const n=document.getElementById("syncNowButton"),r=document.getElementById("syncCreateInviteButton"),o=document.getElementById("syncInviteGroup"),i=document.getElementById("syncInviteTtl"),a=document.getElementById("syncInviteOutput"),s=document.getElementById("syncJoinButton"),l=document.getElementById("syncJoinInvite");r?.addEventListener("click",async()=>{if(!r||!o||!i||!a||r.disabled)return;const d=o.value.trim(),u=Number(i.value);let p=!0;if(d?Wo(o):p=Ua(o,"Team name is required."),!u||u<1?p=Ua(i,"Must be at least 1 hour."):Wo(i),!!p){r.disabled=!0,r.textContent="Creating…";try{const f=await hp({group_id:d,policy:Kt.invitePolicy,ttl_hours:u||24});b.lastTeamInvite=f,ud(),a.value=String(f.encoded||""),a.hidden=!1,a.focus(),a.select();const m=Array.isArray(f.warnings)?f.warnings:[];Z(m.length?`Invite created. Copy it above and review ${m.length===1?"1 warning":`${m.length} warnings`}.`:"Invite created. Copy the text above and share it with your teammate.",m.length?"warning":"success")}catch(f){Z(Je(f,"Failed to create invite. Check the team name, invite lifetime, and coordinator reachability, then try again."),"warning"),r.textContent="Retry",r.disabled=!1;return}finally{r.disabled&&(r.disabled=!1,r.textContent="Create invite")}}}),l?.addEventListener("keydown",d=>{vr(d,{onSubmit:()=>s?.click(),disabled:!s||s.disabled})}),s?.addEventListener("click",async()=>{if(!s||!l)return;const d=l.value.trim();if(!d){Ua(l,"Paste a team invite or pairing payload.");return}Wo(l),s.disabled=!0,s.textContent="Accepting…";try{const u=await nw(d);b.lastTeamJoin=u;const p=typeof u.type=="string"?u.type:"team_join";let f;if(p==="pair"){const m=String(u.peer_device_id??"").trim();f={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 f={message:u.status==="pending"?"Join request sent. Waiting for admin approval.":"Joined the team.",tone:"success"};b.syncJoinFlowFeedback=f,Va(),l.value="";try{await t()}catch(m){f={message:Je(m,"Accepted the invite, but this view has not refreshed yet."),tone:"warning"},b.syncJoinFlowFeedback=f,Va()}}catch(u){b.syncJoinFlowFeedback={message:Je(u,"Failed to accept. Check that the invite or pairing payload is complete and current, then try again."),tone:"warning"},Va(),s.textContent="Retry",s.disabled=!1;return}finally{s.disabled&&(s.disabled=!1,s.textContent="Accept")}}),n?.addEventListener("click",async()=>{if(n){n.disabled=!0,n.textContent="Syncing…";try{const d=Bv(await Us());Z(d.message,d.warning?"warning":void 0)}catch(d){Z(Je(d,"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 pd({element:e,hidden:t=!1,restoreParent:n=null}){const r=j(null);return mt(()=>{e&&(e.hidden=t)},[e,t]),mt(()=>{const o=r.current;if(!(!o||!e))return e.parentElement!==o&&o.appendChild(e),()=>{!n||e.parentElement!==o||n.appendChild(e)}},[e,n]),c("div",{ref:r})}function kD({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:r}){return c(ee,{children:[c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:["Invite a teammate.",c("span",{className:"sync-action-command",children:"Generate an invite when you want someone else to join this team from their device."})]}),c("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide invite form":"Invite a teammate"})]}),e?c(pd,{element:e,hidden:!t,restoreParent:n}):null]})}function xD(){return c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:["Pair another device.",c("span",{className:"sync-action-command",children:"Copy a pairing command when you want to connect another one of your own devices."})]}),c("button",{type:"button",className:"settings-button sync-action-copy",onClick:e=>ro("codemem sync pair --payload-only",e.currentTarget),children:"Copy pairing command"})]})}function AD({joinPanel:e,joinPanelOpen:t,joinRestoreParent:n,onToggle:r}){return c(ee,{children:[c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:["Accept an invite or pairing.",c("span",{className:"sync-action-command",children:"Paste a team invite to join another team, or a pairing payload to connect another device."})]}),c("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide paste form":"Paste invite or pairing"})]}),e?c(pd,{element:e,hidden:!t,restoreParent:n}):null]})}function ED({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,joinPanel:r,joinPanelOpen:o,joinRestoreParent:i,onToggleInvitePanel:a,onToggleJoinPanel:s,pairedPeerCount:l,presenceStatus:d}){const u=d==="not_enrolled";return c(ee,{children:[u?c(ee,{children:[c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:["Join this device.",c("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?c(pd,{element:r,hidden:!1,restoreParent:i}):null,c("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0}),c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:["This device is not on the team yet.",c("span",{className:"sync-action-command",children:"Use Join this device above, or ask an admin to enroll it first."})]})})]}):c(ee,{children:[c(AD,{joinPanel:r,joinPanelOpen:o,joinRestoreParent:i,onToggle:s}),c("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0})]}),u?null:c(kD,{invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:a}),!l&&d==="posted"?c(xD,{}):null]})}function Ka({count:e,label:t}){return c("div",{className:"sync-section-heading",children:[c("div",{className:"sync-action-text sync-section-label",children:t}),e?c("span",{className:"badge actor-badge sync-section-count",children:e}):null]})}function za({children:e}){return c("div",{className:"section-meta sync-section-note",children:e})}function ND({item:e,onAction:t}){const[n,r]=O(!1);return c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:[e.title,c("span",{className:"sync-action-command",children:e.summary})]}),c("button",{type:"button",className:"settings-button",disabled:n,onClick:async()=>{r(!0);try{await t(e)}finally{r(!1)}},children:e.actionLabel||"Review"})]})}function PD({request:e,onApprove:t,onDeny:n}){const[r,o]=O(null),[i,a]=O(null),[s,l]=O("Approve"),[d,u]=O("Deny");return c("div",{className:"actor-row",children:[c("div",{className:"actor-details",children:c("div",{className:"actor-title",title:e.requestId||void 0,children:e.displayName})}),c("div",{className:"actor-actions",children:[c("button",{type:"button",className:"settings-button","aria-label":`${s} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{o("approve"),l("Approving…");try{a(await t(e)||null),l("Approve")}catch{l("Retry")}finally{o(null)}},children:s}),c("button",{type:"button",className:"settings-button","aria-label":`${d} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{o("deny"),u("Denying…");try{a(await n(e)||null),u("Deny")}catch{u("Retry")}finally{o(null)}},children:d})]}),c(ar,{feedback:i})]})}function RD({row:e,onInspectConflict:t,onRemoveConflict:n,onReview:r}){const[o,i]=O(null),[a,s]=O(null),l=e.actionLabel||"Pair with this device",[d,u]=O(l),[p,f]=O("Remove broken device record");return c("div",{className:"peer-card peer-card--padded","data-discovered-device-id":e.deviceId,children:[c("div",{className:"peer-title",children:[c("strong",{title:e.displayTitle||void 0,children:e.displayName}),c("span",{className:`badge actor-badge${e.availabilityLabel==="Offline"?"":" local"}`,children:e.availabilityLabel}),c("span",{className:"badge actor-badge",children:e.connectionLabel}),e.approvalBadgeLabel?c("span",{className:"badge actor-badge",children:e.approvalBadgeLabel}):null]}),c("div",{className:"peer-meta",children:e.note}),c("div",{className:"peer-actions",children:[e.mode==="accept"?c("button",{type:"button",className:"settings-button","aria-label":`${d} for ${e.displayName}`,disabled:o!==null,onClick:async()=>{i("review"),u("Pairing…"),s({message:`Pairing ${e.displayName}. Keep this page open while the device is approved and refreshed.`,tone:"success"});try{s(await r(e)||null),u(e.actionLabel||l)}catch{s({message:`Pairing ${e.displayName} failed. Try again.`,tone:"warning"}),u("Retry")}finally{i(null)}},children:d}):null,(e.mode==="stale"||e.mode==="ambiguous"||e.mode==="scope-pending"||e.mode==="setup-blocked")&&e.actionMessage?c("div",{className:"peer-meta",children:e.actionMessage}):null,e.mode==="paired"&&e.pairedMessage?c("div",{className:"peer-meta",children:e.pairedMessage}):null,e.mode==="conflict"?c(ee,{children:[c("button",{type:"button",className:"settings-button","aria-label":`Open details for ${e.displayName}`,disabled:o!==null,onClick:()=>t(e),children:"Open device details"}),c("button",{type:"button",className:"settings-button danger","aria-label":`${p} for ${e.displayName}`,disabled:o!==null,onClick:async()=>{i("remove"),f("Removing…");try{s(await n(e)||null),f("Remove broken device record")}catch{f("Retry")}finally{i(null)}},children:p})]}):null]}),c(ar,{feedback:a})]})}function ID(e){const t=e.actionItems.length>0,n=e.actionableCount>e.actionItems.length,r=t||n||e.presenceStatus!=="posted";return c(ee,{children:[r?c(Ka,{label:"Needs attention"}):null,r?c(za,{children:"Start here when something needs review, re-pairing, or approval."}):null,t?e.actionItems.map(o=>c(ND,{item:o,onAction:e.onAttentionAction},o.id)):null,!t&&!n&&e.presenceStatus==="posted"?c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:"No urgent team work right now."})}):null,!t&&n&&e.presenceStatus==="posted"?c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:"More team follow-up is listed below when you are ready."})}):null,!t&&e.presenceStatus==="not_enrolled"?c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:["This device needs team enrollment",c("span",{className:"sync-action-command",children:"Import an invite or ask an admin to enroll it."})]})}):null]})}function DD({children:e}){return e?c(ee,{children:[c(Ka,{label:"Add devices & teammates"}),c(za,{children:"Use these flows when you are enrolling, inviting, or pairing something new."}),e]}):null}function LD({mount:e,rows:t,onInspectConflict:n,onRemoveConflict:r,onReview:o}){return!e||!t.length&&!b.syncDiscoveredFeedback?null:Zt(c(ee,{children:[c(Ka,{count:t.length||void 0,label:"Devices waiting for review"}),c(za,{children:"Review team devices here when they still need trust, re-pairing, or approval on this machine."}),c(ar,{feedback:b.syncDiscoveredFeedback}),t.map(i=>c(RD,{row:i,onInspectConflict:n,onRemoveConflict:r,onReview:o},i.deviceId))]}),e)}function OD({mount:e,requests:t,onApprove:n,onDeny:r}){return!e||!t.length&&!b.syncJoinRequestsFeedback?null:Zt(c(ee,{children:[c(Ka,{count:t.length||void 0,label:"Join requests to review"}),c(za,{children:"Approve or deny requests here before those devices become part of the team."}),c(ar,{feedback:b.syncJoinRequestsFeedback}),t.map(o=>c(PD,{request:o,onApprove:n,onDeny:r},o.requestId))]}),e)}function $D(e){return c(ee,{children:[c(ID,{...e}),c(DD,{children:e.children}),c(OD,{mount:e.joinRequestsMount,requests:e.pendingJoinRequests,onApprove:e.onApproveJoinRequest,onDeny:e.onDenyJoinRequest}),c(LD,{mount:e.discoveredListMount,rows:e.discoveredRows,onInspectConflict:e.onInspectConflict,onRemoveConflict:e.onRemoveConflict,onReview:e.onReviewDiscoveredDevice})]})}function gy(e){e&&(e.textContent="")}function qa(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 MD(){return typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}function Ko(){return MD()?"auto":"smooth"}var vy="syncTeamActionsMount";function FD(e,t,n){if(!t){e.hidden=!0,e.textContent="",e.className="sync-online-badge";return}e.hidden=!1,n==="posted"?(e.className="sync-online-badge",e.textContent="Online"):n==="not_enrolled"?(e.className="sync-online-badge sync-online-offline",e.textContent="Not enrolled"):(e.className="sync-online-badge sync-online-error",e.textContent="Offline")}function yy(e,t){const n=document.getElementById(vy);n&&(jr(n),n.remove()),gy(e),t.forEach(r=>{gy(r)})}function Ja(){const e=document.getElementById("syncTeamMeta"),t=document.getElementById("syncSetupPanel"),n=document.getElementById("syncTeamActions");if(!e||!t||!n)return;dd(),Wa(),ud(),Va(),SD();const r=document.getElementById("syncInvitePanel"),o=document.getElementById("syncAdminSection"),i=document.getElementById("syncJoinPanel"),a=document.getElementById("syncJoinSection"),s=document.getElementById("syncJoinRequests"),l=document.getElementById("syncCoordinatorDiscovered"),d=document.getElementById("syncCoordinatorDiscoveredMeta"),u=document.getElementById("syncCoordinatorDiscoveredList");An("syncTeamSkeleton"),CD();const p=b.lastSyncCoordinator,f=b.lastSyncViewModel||{summary:{connectedDeviceCount:0,seenOnTeamCount:0,offlineTeamDeviceCount:0},duplicatePeople:[],attentionItems:[]},m=N=>{if(N.kind==="possible-duplicate-person"){const k=document.getElementById("syncActorsList");k instanceof HTMLElement&&(k.scrollIntoView({block:"center",behavior:Ko()}),qa(k));return}const P=String(N.deviceId||"").trim();if(!P)return;if(N.kind==="name-device"){const k=document.querySelector(`[data-device-name-input="${CSS.escape(P)}"]`);if(k instanceof HTMLInputElement){k.scrollIntoView({block:"center",behavior:Ko()}),k.focus(),k.select(),qa(k);return}}const X=document.querySelector(`[data-peer-device-id="${CSS.escape(P)}"]`);if(X instanceof HTMLElement){X.scrollIntoView({block:"center",behavior:Ko()}),qa(X);return}const z=document.querySelector(`[data-discovered-device-id="${CSS.escape(P)}"]`);z instanceof HTMLElement&&(z.scrollIntoView({block:"center",behavior:Ko()}),qa(z))},v=async N=>{const P=Array.isArray(N.actorIds)?N.actorIds.map(I=>String(I||"").trim()).filter(Boolean):[],X=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).filter(I=>P.includes(String(I?.actor_id||"").trim()));if(X.length<2){Z("This duplicate review is outdated. Refresh the card and review the remaining people entries.","warning");return}const z=await lx({title:"Review possible duplicate people",summary:N.title.replace(/^Possible duplicate person:\s*/,""),actors:X.map(I=>({actorId:String(I?.actor_id||""),label:String(I?.display_name||I?.actor_id||"Unknown person"),isLocal:!!I?.is_local}))});if(z.action==="different-people"){D0(P,"different-people"),Z("Okay. I will keep these people separate on this device."),await Kt.loadSyncData();return}if(z.action!=="merge")return;const k=X.find(I=>String(I?.actor_id||"")===z.primaryActorId),D=X.find(I=>String(I?.actor_id||"")===z.secondaryActorId);if(!k?.actor_id||!D?.actor_id){Z("Could not determine which people to combine. Refresh People & devices and try the review again.","warning");return}try{await Sp(String(k.actor_id),String(D.actor_id)),L0(P),Z(`Combined duplicate people into ${String(k.display_name||k.actor_id)}.`),await Kt.loadSyncData()}catch(I){try{await Kt.loadSyncData()}catch{}Z(Je(I,"Failed to combine these people."),"warning")}},g=async N=>await Vc({title:"Pair with this device",description:"Choose a friendly name for this device before pairing it on this machine.",initialValue:N,placeholder:"Desk Mini",confirmLabel:"Pair",cancelLabel:"Cancel",validate:P=>P.trim()?null:"Enter a device name to pair this device."}),y=!!p?.configured,_=S0(p);e.textContent=y?`Team: ${(p.groups||[]).join(", ")||"none"}`:_?.message||"Start by joining an existing team or creating one, then connect people and devices.",e.title=y?String(p.coordinator_url||"").trim():"";const w=document.getElementById("syncOnlineBadge");if(w&&FD(w,y,String(p?.presence_status||"")),!y){yy(n,[s,u]),t.hidden=!1,n.hidden=!0,s&&(s.hidden=!0),l&&(l.hidden=!0);return}t.hidden=!0,n.hidden=!1;const C=String(p.presence_status||""),T=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[],x=Array.isArray(f.attentionItems)?f.attentionItems:[],E=(Array.isArray(p.discovered_devices)?p.discovered_devices:[]).map(N=>{const P=String(N.device_id||"").trim(),X=Gv({coordinatorName:String(N.display_name||"").trim(),deviceId:P})||"Discovered device",z=P&&X!==P?P:null,k=String(N.fingerprint||"").trim(),D=(Array.isArray(N.groups)?N.groups.map(Ae=>String(Ae||"").trim()).filter(Boolean):[]).length>1,I=T.find(Ae=>String(Ae?.peer_device_id||"")===P),K=jv({device:N,pairedLocally:!!I}),me=String(I?.fingerprint||"").trim(),ue=!!I&&!!k&&!!me&&me!==k,ie=!_&&XI({device:N,hasAmbiguousCoordinatorGroup:D,pairedLocally:!!I}),xe=Array.isArray(N.addresses)?N.addresses:[],Se=Number(N.address_count??0),Te=Number.isFinite(Se)&&Se>0?Se:0,Y=[xe.length?xe.map(Ae=>oo()?ny(String(Ae||"")):String(Ae||"")).filter(Boolean).join(" · "):Te>0?`${Te} ${N.stale?"last-known":"fresh"} ${Te===1?"address":"addresses"} hidden`:"No fresh addresses"];!xe.length&&z&&Y.push(`device id: ${P}`);let we=null,ae=ie?"accept":"none",Q=null;return ue?ae="conflict":_&&(!I||K.state==="needs-your-approval")?(we=_.message,ae="setup-blocked"):D?(we="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.",ae="ambiguous"):I&&ed(P)?(we="Review this device's Space access and advanced rules in Teams before you sync it.",ae="scope-pending"):I?.last_error?(Y.push(`error: ${String(I.last_error)}`),ie||(ae="paired")):I?.status?.peer_state?(Y.push(`status: ${String(I.status.peer_state)}`),ie||(ae="paired")):!I&&N.stale?(we="Wait for a fresh coordinator presence update, then review this device again here.",ae="stale"):I&&!ie&&(ae="paired"),ae==="paired"&&(Q=K.state==="waiting-for-other-device"?K.description||"Waiting on the other device.":String(I?.last_error||"").toLowerCase().includes("401")&&String(I?.last_error||"").toLowerCase().includes("unauthorized")?"Waiting for the other device to trust this one before sync can work.":null),{actionMessage:we,actionLabel:K.actionLabel||(I?"Review device":"Pair with this device"),approvalBadgeLabel:K.badgeLabel,availabilityLabel:N.stale?"Offline":"Available",connectionLabel:ue?Yv.conflicts:I?Yv.pairedLocally:"Not connected on this device",deviceId:P,displayName:X,displayTitle:z,fingerprint:k,mode:ae,note:Y.join(" · "),pairedMessage:Q}}),L=[],F=E.filter(N=>N.mode!=="paired"&&N.mode!=="none"&&N.mode!=="scope-pending"),H=E.filter(N=>N.mode==="accept"||N.mode==="scope-pending").length,R=x.length+L.length+H,U=(p.groups||[]).join(", ")||"none";e.textContent=C==="posted"?R>0?`Team: ${U}. Start with the next step below, then scan the current team status.`:`Team: ${U}. Team status and device details are below.`:C==="not_enrolled"?`Team: ${U}. Enroll this device first, then return here to review the rest of the team.`:`Team: ${U}. Fix the current sync issue first, then use the rest of this card to verify the team state.`,l&&(l.hidden=F.length===0&&!b.syncDiscoveredFeedback),d&&(d.textContent=F.length?"Pair with a teammate's device to see it appear in People & devices and start syncing.":""),s&&(s.hidden=L.length===0&&!b.syncJoinRequestsFeedback),yy(n,[s,u]);const B=document.createElement("div");B.id=vy,n.appendChild(B),lt(B,h($D,{actionItems:x,actionableCount:R,children:h(ED,{invitePanel:r,invitePanelOpen:Yl,inviteRestoreParent:o,joinPanel:i,joinPanelOpen:Xl,joinRestoreParent:a,onToggleInvitePanel:()=>{r&&(x0(!Yl),Ja())},onToggleJoinPanel:()=>{i&&(A0(!Xl),Ja())},pairedPeerCount:Number(p.paired_peer_count||0),presenceStatus:C}),discoveredListMount:u,discoveredRows:F,joinRequestsMount:s,onApproveJoinRequest:async()=>null,onAttentionAction:async N=>{if(N.kind==="possible-duplicate-person"){await v(N);return}m(N)},onDenyJoinRequest:async()=>null,onInspectConflict:N=>{const P=document.querySelector(`[data-peer-device-id="${CSS.escape(N.deviceId)}"]`);if(P instanceof HTMLElement){P.scrollIntoView({block:"center",behavior:Ko()}),Z(`Opened the conflicting local device record for ${N.displayName}.`,"warning");return}Z("The conflicting local device record is not visible yet. Scroll to People & devices and try again.","warning")},onRemoveConflict:async N=>{if(!await Gt({title:`Remove ${N.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 yp(N.deviceId);const P={message:`Removed the broken local device record for ${N.displayName}. If it is still available, review it again from Next steps or Devices seen on team.`,tone:"success"};return b.syncDiscoveredFeedback=P,await Kt.loadSyncData(),P}catch(P){return{message:Je(P,"Failed to remove the broken local device record. The old local record is still present in People & devices."),tone:"warning"}}},onReviewDiscoveredDevice:async N=>{try{const P=await g(N.displayName);if(!P)return null;const X=await aw(N.deviceId,N.fingerprint),z=String(X?.name||N.displayName||"").trim()||N.displayName;b.pendingAcceptedSyncPeers=[...Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(D=>String(D?.peer_device_id||"").trim()!==N.deviceId):[],{peer_device_id:N.deviceId,name:z,fingerprint:N.fingerprint,addresses:[],claimed_local_actor:!1,status:{peer_state:"degraded"},last_error:"Waiting for the other device to approve this one."}],N0(N.deviceId);let k={message:N.approvalBadgeLabel==="Needs your approval"?`Approved ${N.displayName} on this device. Two-way trust should be ready once both devices refresh.`:`Step 1 complete on this device for ${N.displayName}. Finish onboarding on the other device so both sides trust each other for sync.`,tone:"success"};try{P.trim()!==z.trim()&&(await bp(N.deviceId,P.trim()),b.pendingAcceptedSyncPeers=b.pendingAcceptedSyncPeers.map(D=>String(D?.peer_device_id||"").trim()===N.deviceId?{...D,name:P.trim()}:D),k={message:`Connected ${P.trim()} and saved its name.`,tone:"success"})}catch(D){k={message:Je(D,"Device connected, but naming did not finish."),tone:"warning"}}b.syncDiscoveredFeedback=k;try{await Kt.loadSyncData()}catch(D){k={message:Je(D,"Device connected, but the screen did not refresh yet. Refresh this page before trying the next step."),tone:"warning"},b.syncDiscoveredFeedback=k}return k}catch(P){return{message:Je(P,"Failed to review this device. Wait for a fresh presence update and try again."),tone:"warning"}}},pendingJoinRequests:L,presenceStatus:C}))}function jD(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 Ur(e){const t=e.displayProject.toLowerCase();return t.includes("fatal:")||t.includes("not a git repository")||t==="unknown project"||e.identitySource==="unmapped"}function by(e){return Ur(e)?"Unclear project identity":e.displayProject}function St(e){return(e.reassignableMemoryCount??e.memoryCount)>0}function BD(e,t){return e.suggestedScopeId?` · suggested ${t.find(n=>n.scopeId===e.suggestedScopeId)?.label||"Space"}`:""}function UD(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function GD(e,t){return t.find(n=>n.scopeId===e)?.label||"selected Space"}function HD(e){switch(e){case"coordinator":return"Team Space";case"local":return"Local Space";default:return"Other Space"}}function VD(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 WD(e){return e.gitRemote?e.gitRemote:e.cwd?e.cwd:e.project?e.project:"source identity unavailable"}function KD({group:e}){const t=e.memorySamples??[],n=t.length;return c("details",{className:"legacy-review-samples",children:[c("summary",{children:["Inspect affected memories",n?` (${n} sample${n===1?"":"s"})`:""]}),c("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?c("ul",{className:"legacy-review-sample-list",children:t.map(r=>c("li",{className:"legacy-review-sample",children:[c("div",{className:"legacy-review-sample-title",children:r.title}),c("div",{className:"legacy-review-group-meta",children:[r.kind||"memory"," · ",VD(r.updatedAt??r.createdAt)," ","·"," ",r.ownership==="local"?"local, reassignable":"peer-owned, stays in review"]}),r.bodyPreview?c("div",{className:"legacy-review-sample-body",children:r.bodyPreview}):null,c("div",{className:"legacy-review-group-meta mono",children:WD(r)})]},r.id))}):c("div",{className:"legacy-review-cleanup-note",children:"No samples are available for this group. Refresh Sync and try again before reassigning."})]})}function _y(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${UD(t)}\\b`,"g"),GD(t,n))),r}function zD(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 qD({item:e,onReview:t}){return c("div",{className:"actor-row",children:[c("div",{className:"actor-details",children:[c("div",{className:"actor-title",children:[c("strong",{children:e.peerName}),c("span",{className:"badge actor-badge",children:["person: ",e.actorDisplayName||e.actorId]})]}),c("div",{className:"peer-meta",children:[e.shareableCount," share by default · ",e.privateCount," marked Only me ·"," ",e.scopeLabel]})]}),c("div",{className:"actor-actions",children:c("button",{type:"button",className:"settings-button",onClick:t,children:"Review my memories in Feed"})})]})}function JD({item:e,onReassign:t,onReview:n}){const r=e.groups??[],o=e.targetScopes??[],i=Object.fromEntries(r.map(k=>[k.workspaceIdentity,k.suggestedScopeId??""])),[a,s]=O({}),[l,d]=O({}),[u,p]=O(i),[f,m]=O({}),[v,g]=O("all"),[y,_]=O(""),[w,C]=O(null),T=r.length,x=e.totalGroupCount??T,E=r.filter(Ur).length,L=r.filter(k=>k.suggestedScopeId&&!Ur(k)&&St(k)).length,F=r.filter(k=>f[k.workspaceIdentity]&&St(k)).length,H=r.filter(k=>f[k.workspaceIdentity]&&St(k)&&!!u[k.workspaceIdentity]).length,R=r.filter(k=>{const D=Ur(k);return v==="suggested"&&(!k.suggestedScopeId||D)||v==="cleanup"&&!D||v==="no-suggestion"&&(k.suggestedScopeId||D)||v==="selected"&&!f[k.workspaceIdentity]?!1:!y.trim()||zD(k,o).includes(y.trim().toLowerCase())});async function U(k){const D=u[k.workspaceIdentity]||k.suggestedScopeId||"";if(!(!D||!t||w)){C(k.workspaceIdentity),d(I=>{const K={...I};return delete K[k.workspaceIdentity],K});try{const I=await t(k,D,!!a[k.workspaceIdentity],a[k.workspaceIdentity]?.confirmation_token);s(I?K=>({...K,[k.workspaceIdentity]:I}):K=>{const me={...K};return delete me[k.workspaceIdentity],me})}catch(I){d(K=>({...K,[k.workspaceIdentity]:_y(I,D,o)}))}finally{C(null)}}}function B(k,D){p(I=>({...I,[k.workspaceIdentity]:D})),s(I=>{const K={...I};return delete K[k.workspaceIdentity],K}),d(I=>{const K={...I};return delete K[k.workspaceIdentity],K})}function N(k,D){m(I=>({...I,[k.workspaceIdentity]:D}))}function P(k){m(D=>({...D,...Object.fromEntries(R.filter(St).map(I=>[I.workspaceIdentity,k]))}))}function X(){m(k=>({...k,...Object.fromEntries(r.filter(D=>D.suggestedScopeId&&!Ur(D)&&St(D)).map(D=>[D.workspaceIdentity,!0]))}))}async function z(){if(!t||w||H===0)return;const k=r.filter(D=>f[D.workspaceIdentity]&&St(D)&&!!u[D.workspaceIdentity]);if(!k.every(D=>a[D.workspaceIdentity])){C("bulk");try{for(const D of k){if(a[D.workspaceIdentity])continue;const I=u[D.workspaceIdentity]||D.suggestedScopeId||"";if(I)try{const K=await t(D,I,!1);d(me=>{const ue={...me};return delete ue[D.workspaceIdentity],ue}),K&&s(me=>({...me,[D.workspaceIdentity]:K}))}catch(K){d(me=>({...me,[D.workspaceIdentity]:_y(K,I,o)}))}}}finally{C(null)}}}return c("div",{className:"legacy-review-card",children:[c("div",{className:"legacy-review-header",children:[c("div",{children:[c("div",{className:"actor-title",children:[c("strong",{children:"Legacy shared review"}),c("span",{className:"badge badge-offline",children:"Needs project review"})]}),c("div",{className:"peer-meta legacy-review-summary",children:[x.toLocaleString()," older"," ",x===1?"project needs":"projects need"," a Space. They contain"," ",e.memoryCount.toLocaleString()," older shared memories total; review the projects, not individual memories.",T<x?` Showing ${T.toLocaleString()} projects; open Projects to review the rest.`:""]}),c("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."})]}),c("div",{className:"actor-actions",children:c("button",{type:"button",className:"settings-button",onClick:n,children:"Manage all projects"})})]}),c("div",{className:"legacy-review-toolbar",children:[c("div",{className:"legacy-review-filter-row",children:[["all",`Showing ${T.toLocaleString()}`],["suggested",`Suggested ${L.toLocaleString()}`],["cleanup",`Needs cleanup ${E.toLocaleString()}`],["no-suggestion","No suggestion"],["selected",`Selected ${H.toLocaleString()}`]].map(([k,D])=>c("button",{className:v===k?"settings-button legacy-filter active":"settings-button legacy-filter",onClick:()=>g(k),type:"button",children:D},k))}),c("div",{className:"legacy-review-bulk-row",children:[c("input",{"aria-label":"Search legacy project groups",className:"peer-scope-input legacy-review-search",onInput:k=>_(k.currentTarget.value),placeholder:"Search project, signal, or destination…",value:y}),c("button",{className:"settings-button",onClick:()=>P(!0),type:"button",children:"Select visible"}),c("button",{className:"settings-button",onClick:X,type:"button",children:"Select suggested"}),c("button",{className:"settings-button",onClick:()=>P(!1),type:"button",children:"Clear visible"}),t&&o.length>0?c("button",{className:"settings-save",disabled:w!=null||H===0||r.filter(k=>f[k.workspaceIdentity]&&St(k)&&!!u[k.workspaceIdentity]).every(k=>a[k.workspaceIdentity]),onClick:()=>{z()},type:"button",children:w==="bulk"?"Previewing…":`Preview ${H.toLocaleString()} selected`}):t&&F>0?c("span",{className:"legacy-review-cleanup-note",children:"Add or join a Space before bulk reassignment."}):null,H>0&&r.filter(k=>f[k.workspaceIdentity]&&St(k)&&!!u[k.workspaceIdentity]).every(k=>a[k.workspaceIdentity])?c("span",{className:"legacy-review-cleanup-note",children:"Bulk actions only preview. Confirm each project individually to avoid partial reassignment."}):null]})]}),r.length>0?c("ul",{className:"legacy-review-groups","aria-label":"Legacy shared review project groups",children:R.map(k=>c("li",{className:"legacy-review-group",children:[c("div",{className:"legacy-review-group-main",children:[c("div",{className:"legacy-review-title-wrap",children:[c("input",{"aria-label":`Select ${by(k)}`,checked:!!f[k.workspaceIdentity],className:"cm-checkbox",disabled:!St(k),onChange:D=>N(k,D.currentTarget.checked),type:"checkbox"}),c("div",{children:[c("div",{className:"legacy-review-group-title",children:by(k)}),c("div",{className:"legacy-review-group-meta",children:[jD(k.identitySource),BD(k,o)]}),St(k)?k.peerOwnedMemoryCount?c("div",{className:"legacy-review-cleanup-note",children:[(k.reassignableMemoryCount??k.memoryCount).toLocaleString()," ","local memor",(k.reassignableMemoryCount??k.memoryCount)===1?"y":"ies"," ","can be reassigned; ",k.peerOwnedMemoryCount.toLocaleString()," peer-owned memor",k.peerOwnedMemoryCount===1?"y":"ies"," will stay in review."]}):null:c("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."}),Ur(k)?c("div",{className:"legacy-review-cleanup-note",children:"Inspect or correct the project identity before assigning old shared data to a Space."}):null]})]}),c("span",{className:"legacy-review-count",children:[k.memoryCount.toLocaleString()," memor",k.memoryCount===1?"y":"ies"]})]}),k.suggestionReason?c("div",{className:"legacy-review-reason",children:k.suggestionReason}):null,l[k.workspaceIdentity]?c("div",{className:"legacy-review-confirmation",role:"alert",children:l[k.workspaceIdentity]}):null,a[k.workspaceIdentity]?c("div",{className:"legacy-review-confirmation",role:"alert",children:[a[k.workspaceIdentity].warning," This will reassign"," ",a[k.workspaceIdentity].reassignable_memory_count.toLocaleString()," of"," ",a[k.workspaceIdentity].memory_count.toLocaleString()," memories",a[k.workspaceIdentity].skipped_memory_count?`; ${a[k.workspaceIdentity].skipped_memory_count.toLocaleString()} peer-owned copies will be left unchanged`:"","."]}):null,c(KD,{group:k}),o.length>0&&t&&St(k)?c("label",{className:"legacy-review-target",children:[c("span",{children:"Destination Space"}),c("select",{className:"peer-scope-input",disabled:w!=null,onChange:D=>B(k,D.currentTarget.value),value:u[k.workspaceIdentity]||"",children:[c("option",{value:"",children:"Choose Space…"}),o.map(D=>c("option",{value:D.scopeId,children:[D.label," · ",HD(D.authorityType),D.scopeId===k.suggestedScopeId?" · suggested":""]},D.scopeId))]})]}):null,o.length>0&&t&&St(k)?c("div",{className:"legacy-review-actions",children:c("button",{type:"button",className:"settings-button",disabled:w!=null||!u[k.workspaceIdentity],onClick:()=>{U(k)},children:w===k.workspaceIdentity?a[k.workspaceIdentity]?"Reassigning…":"Previewing…":a[k.workspaceIdentity]?"I understand, reassign memories":"Preview reassignment"})}):null]},k.workspaceIdentity))}):null]})}function YD({items:e,legacyReview:t,onLegacyReassign:n,onLegacyReview:r,onReview:o}){return c(ee,{children:[t?c(JD,{item:t,onReassign:n,onReview:r??o}):null,e.map(i=>c(qD,{item:i,onReview:o},`${i.peerName}:${i.actorId}:${i.scopeLabel}`))]})}function XD(){Ip("mine"),b.feedQuery="",window.location.hash="feed"}function QD(){window.location.hash="projects"}async function ZD(e,t,n,r){try{const o=await mw({...r?{confirmation_token:r}:{},confirmed_old_copies:n,scope_id:t,workspace_identity:e.workspaceIdentity});return b.lastSyncLegacySharedReview=o.legacy_shared_review??null,Z(`Reassigned ${o.reassigned_memory_count.toLocaleString()} legacy review memor${o.reassigned_memory_count===1?"y":"ies"} to ${o.target_scope_label}.`),wy(),null}catch(o){if(o instanceof wp)return o.preview;const i=o instanceof Error?o.message:"Unable to reassign legacy review memories.";throw Z(i,"warning"),new Error(i)}}function wy(){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"),o=Array.isArray(b.lastSyncSharingReview)?b.lastSyncSharingReview:[],i=b.lastSyncLegacySharedReview,a=Math.max(0,Number(i?.memory_count??0)),s=i?.has_data?{groups:Array.isArray(i.groups)?i.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 f=p,m=f.ownership==="peer"?"peer":"local";return{bodyPreview:typeof f.body_preview=="string"?f.body_preview:null,createdAt:typeof f.created_at=="string"?f.created_at:null,cwd:typeof f.cwd=="string"?f.cwd:null,gitRemote:typeof f.git_remote=="string"?f.git_remote:null,id:Number(f.id||0),kind:typeof f.kind=="string"?f.kind:null,ownership:m,project:typeof f.project=="string"?f.project:null,title:String(f.title||`Memory ${Number(f.id||0)}`),updatedAt:typeof f.updated_at=="string"?f.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:a,scopeId:String(i.scope_id||"legacy-shared-review"),totalGroupCount:Number(i.total_group_count||i.groups?.length||0),targetScopes:Array.isArray(i.target_scopes)?i.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(!o.length&&!s){jr(n),e.hidden=!0;return}e.hidden=!1,r&&(r.textContent=s?"Sharing review":"What teammates will receive");const l=b.currentProject?`current project (${b.currentProject})`:"all allowed projects";t.textContent=s?`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.`,lt(n,h(YD,{items:o.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:s,onLegacyReassign:ZD,onLegacyReview:QD,onReview:XD}))}var Ya="",zo=null,fd=0,eL=15e3;function Sy(e){return`project:${e||""}|includeJoinRequests:false`}function tL(e){const t=Sy(e);return!zo||zo.key!==t||Date.now()>=zo.expiresAtMs?null:zo.payload}function nL(e,t){zo={key:Sy(e),expiresAtMs:Date.now()+eL,payload:t}}function rL(e){return!e||typeof e!="object"?e:{...e,join_requests:[]}}function oL(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewList"),n=document.getElementById("syncSharingReviewMeta"),r=document.getElementById("syncLegacyClaims"),o=document.getElementById("syncLegacyClaimsMeta");e&&(e.hidden=!0),t&&(t.textContent=""),n&&(n.textContent=""),r&&(r.hidden=!0),o&&(o.textContent="")}async function qo(){const e=++fd;try{const t=b.currentProject||"",n=!1,r=b.activeTab==="health";let o=!1;const i=!oo();let a;r?(a=tL(t),a||(a=await Bs(i,t,{includeJoinRequests:!1}),o=!0)):(a=await Bs(i,t,{includeJoinRequests:n}),o=!0);let s=null,l=null,d=!1,u=!1;const p=I0();try{s=await rw()}catch{d=!0}try{l=await no()}catch{u=!0}if(e!==fd)return;o&&nL(t,rL(a));const f=JSON.stringify([a,s,l,p]);if(f===Ya)return;Ya=f;const m=a.status&&typeof a.status=="object"?a.status:null;m&&(b.lastSyncStatus=m),Array.isArray(s?.items)?b.lastSyncActors=s.items:b.lastSyncActors=[];const v=Array.isArray(a.peers)?a.peers:[],g=new Set(v.map(_=>String(_?.peer_device_id||"").trim()).filter(Boolean)),y=Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(_=>{const w=String(_?.peer_device_id||"").trim();return w&&!g.has(w)}):[];b.pendingAcceptedSyncPeers=y,b.lastSyncPeers=[...v,...y],b.lastSyncSharingReview=a.sharing_review||[],b.lastSyncLegacySharedReview=a.legacy_shared_review&&typeof a.legacy_shared_review=="object"?a.legacy_shared_review:null,b.lastSyncCoordinator=a.coordinator||null,b.lastCoordinatorAdminStatus=l&&typeof l=="object"?l:null,b.lastSyncJoinRequests=Array.isArray(a.join_requests)?a.join_requests:[],b.lastSyncAttempts=a.attempts||[],b.lastSyncLegacyDevices=a.legacy_devices||[],b.lastSyncDuplicatePersonDecisions=p,b.lastSyncViewModel=T0({actors:b.lastSyncActors,peers:b.lastSyncPeers,coordinator:b.lastSyncCoordinator,duplicatePersonDecisions:b.lastSyncDuplicatePersonDecisions}),sy(),Ja(),mD(),wy(),ld(),fy(),ay(),uv(),d&&hD(),u&&(b.lastCoordinatorAdminStatus=null,Ja())}catch{if(e!==fd)return;Ya="",An("syncTeamSkeleton"),An("syncActorsSkeleton"),An("syncPeersSkeleton"),An("syncDiagSkeleton"),oL(),gD(),B0()}}function iL(){Ya="",b.lastSyncPeers?.length&&ld()}async function aL(){try{b.pairingPayloadRaw=await ow()||null,id()}catch{b.pairingPayloadRaw=null,id()}}function sL(e){NI(),sa(),_D(qo),fD(qo),V0(ld),TD(e,qo),vD(qo),W0(e),my(),bD()}function cL(e,t){const n=$e("runtimeLabel");n&&(n.textContent=t?`v${e} (${t})`:`v${e}`,n.title=t?`codemem ${e} (${t})`:`codemem ${e}`,n.hidden=!1)}async function lL(){try{const e=await X_();if(!e?.version)return;cL(e.version,"83a963e")}catch{}}var md=null,Cy=1500,Ty="codemem-legacy-upgrade-notice-dismissed",Nn=null,zt=!1,hd=!1,Jo=null;function ky(e,t=0){const n=Number(e);return Number.isFinite(n)?Math.max(0,n):t}function xy(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:[],o=ky(n.total_group_count,r.length),i=ky(n.memory_count);return o<=0||i<=0?null:{groupCount:o,memoryCount:i}}function Ay(){try{return localStorage.getItem(Ty)==="1"}catch{return!1}}function Xa(){if(document.getElementById("legacyUpgradeDontShow")?.checked)try{localStorage.setItem(Ty,"1")}catch{}}function Ey(){const e=$e("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 dL(){const e=Ey(),t=$e("legacyUpgradeReviewGroups");(t&&e.includes(t)?t:e[0])?.focus()}function Ny(e){const t=$e("legacyUpgradeModal");if(!t||t.hidden)return;if(e.key==="Escape"){e.preventDefault(),Xa(),Yo(!1);return}if(e.key==="Enter"){const i=$e("legacyUpgradeReviewGroups");vr(e,{onSubmit:()=>i?.click(),disabled:!i||i.disabled});return}if(e.key!=="Tab")return;const n=Ey();if(n.length===0)return;const r=n[0],o=n[n.length-1];if(e.shiftKey&&document.activeElement===r){e.preventDefault(),o.focus();return}!e.shiftKey&&document.activeElement===o&&(e.preventDefault(),r.focus())}function Py(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 Yo(e,t){const n=$e("legacyUpgradeModalBackdrop"),r=$e("legacyUpgradeModal"),o=$e("legacyUpgradeSummary");if(!(!n||!r||!o)){if(t&&(o.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){Jo=document.activeElement,document.addEventListener("keydown",Ny),dL(),Py(!0);return}Py(!1),document.removeEventListener("keydown",Ny),Jo&&document.contains(Jo)&&Jo.focus(),Jo=null}}function Ry(e){!e||hd||Ay()||(hd=!0,Yo(!0,e))}async function uL(){if(!(hd||Ay()))try{Ry(xy(await Bs(!1,"",{includeJoinRequests:!1})))}catch{}}function sr(e,t){const n=$e("viewerReconnectOverlay"),r=$e("viewerReconnectDetail");!n||!r||(n.hidden=!e,r.textContent=t||"Trying again automatically while the viewer comes back.")}async function gd(){try{return await Y_(),!0}catch{return!1}}function pL(){return document.visibilityState!=="hidden"&&!Nv()}function Iy(){if(zt)return;zt=!0,vd(),cr("error","(reconnecting)"),sr(!0,"The viewer server is restarting or temporarily unavailable. Trying again automatically…");const e=async()=>{if(await gd()){if(Nn&&(clearTimeout(Nn),Nn=null),zt=!1,sr(!0,"Viewer responded. Restoring your session…"),pL()){cr("refreshing"),Xo();try{await Qa()}catch{}}else cr("paused",document.visibilityState==="hidden"?"(tab hidden)":"(settings open)");zt||sr(!1);return}sr(!0,"Still reconnecting… the viewer will recover automatically as soon as the server responds."),Nn=setTimeout(e,Cy)};Nn=setTimeout(e,Cy)}function cr(e,t){b.refreshState=e;const n=$e("refreshStatus");if(!n)return;const r=i=>{const a=$e("refreshAnnouncer");!a||md===e||(a.textContent=i,md=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 o=t?` ${t}`:"";n.textContent=`updated ${new Date().toLocaleTimeString()}${o}`,md=null}function vd(){b.refreshTimer&&(clearInterval(b.refreshTimer),b.refreshTimer=null)}function Xo(){b.refreshTimer||(b.refreshTimer=setInterval(()=>Pn(),5e3))}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(vd(),cr("paused","(tab hidden)")):!Nv()&&!zt&&(Xo(),Pn())});function yd(e){const t=new Set(Rp(b.lastCoordinatorAdminStatus));Un.forEach(n=>{const r=$e(`tab-${n}`);r&&(r.hidden=n!==e||!t.has(n))}),Un.forEach(n=>{const r=$e(`tabBtn-${n}`);r&&(r.hidden=!t.has(n),r.classList.toggle("active",n===e&&t.has(n)))})}function bd(e){const t=yr(e,b.lastCoordinatorAdminStatus);Ws(t),yd(t),Pn()}function fL(){Un.forEach(e=>{$e(`tabBtn-${e}`)?.addEventListener("click",()=>bd(e))}),window.addEventListener("hashchange",()=>{const e=Vs();e&&e!==b.activeTab&&bd(e)}),bd(b.activeTab)}async function mL(){try{const e=await Si();b.knownProjects=e,iL();const t=Gs("projectFilter");if(!t)return;t.textContent="";const n=document.createElement("option");n.value="",n.textContent="All Projects",t.appendChild(n),e.forEach(r=>{const o=document.createElement("option");o.value=r,o.textContent=r,t.appendChild(o)})}catch{}}Gs("projectFilter")?.addEventListener("change",()=>{b.currentProject=Gs("projectFilter")?.value||"",jo(!0),Pn()});var _d=null;async function Pn(){zt||(_d&&clearTimeout(_d),_d=setTimeout(()=>Qa(),80))}async function Qa(){if(!zt){if(b.refreshInFlight){b.refreshQueued=!0;return}b.refreshInFlight=!0;try{cr("refreshing");let e=b.activeTab;if(e==="coordinator-admin"){try{const r=await no();b.lastCoordinatorAdminStatus=r&&typeof r=="object"?r:null}catch{b.lastCoordinatorAdminStatus=null}e=b.activeTab,e=yr(e,b.lastCoordinatorAdminStatus),e!==b.activeTab&&(Ws(e),yd(e))}const t=[zP(),YR()];e==="feed"&&t.push(no().then(r=>{b.lastCoordinatorAdminStatus=r&&typeof r=="object"?r:null}).catch(()=>{b.lastCoordinatorAdminStatus=null})),e==="feed"&&t.push(sv()),e==="projects"&&t.push(yR()),(e==="sync"||e==="health")&&t.push(qo()),e==="coordinator-admin"&&t.push(qc()),b.syncPairingOpen&&t.push(aL()),await Promise.all(t),Ry(xy(b.lastSyncLegacySharedReview));const n=yr(b.activeTab,b.lastCoordinatorAdminStatus);n!==b.activeTab&&Ws(n),yd(b.activeTab),cr("idle")}catch{await gd()?cr("error"):Iy()}finally{b.refreshInFlight=!1,b.refreshQueued&&!zt&&(b.refreshQueued=!1,Qa())}}}Fw();var Dy=document.getElementById("toastRoot");Dy&&A_(Dy),jw(Hs("themeToggle")),Op(zs()),fL(),FP(),bR(()=>Pn()),sL(()=>Pn()),Fx(),AI(vd,Xo,()=>Pn()),mL(),$e("viewerReconnectRetry")?.addEventListener("click",async()=>{if(sr(!0,"Checking whether the viewer server is back…"),!await gd()){Iy();return}Nn&&(clearTimeout(Nn),Nn=null),zt=!1,sr(!0,"Viewer responded. Restoring your session…"),Xo();try{await Qa()}catch{}zt||sr(!1)}),$e("legacyUpgradeReviewGroups")?.addEventListener("click",()=>{Xa(),Yo(!1),window.location.hash="sync",setTimeout(()=>document.getElementById("syncSharingReview")?.scrollIntoView({block:"start"}),120)}),$e("legacyUpgradeReviewProjects")?.addEventListener("click",()=>{Xa(),Yo(!1),window.location.hash="projects"}),$e("legacyUpgradeNotNow")?.addEventListener("click",()=>{Xa(),Yo(!1)}),lL(),uL(),Pn(),Xo()})();
|
|
114
|
+
Global: ${Number(s.tokens_saved||0).toLocaleString()} saved`:"",y=[{label:d?"Savings (project)":"Savings",value:yo(u.tokens_saved||0),tooltip:`Tokens saved by reusing compressed memories. Exact: ${Number(u.tokens_saved||0).toLocaleString()} saved${g}`,icon:"trending-up"},{label:d?"Injected (project)":"Injected",value:yo(u.tokens_read||0),tooltip:`Tokens injected into context (pack size). Exact: ${Number(u.tokens_read||0).toLocaleString()} injected${v}`,icon:"book-open"},{label:d?"Reduction (project)":"Reduction",value:Jc(u.tokens_saved,u.tokens_read),tooltip:`Percent reduction from reuse. Factor: ${Ux(u.tokens_saved,u.tokens_read)}.`+v+g,icon:"percent"},{label:d?"Work investment (project)":"Work investment",value:yo(u.work_investment_tokens||0),tooltip:`Token cost of unique discovery groups. Exact: ${Number(u.work_investment_tokens||0).toLocaleString()} invested${m}`,icon:"pencil"},{label:"Active memories",value:i.active_memory_items||0,icon:"check-circle"},{label:"Embedding coverage",value:xh(i.vector_coverage),tooltip:"Share of active memories with embeddings",icon:"layers"},{label:"Tag coverage",value:xh(i.tags_coverage),tooltip:"Share of active memories with tags",icon:"tag"}];if(f>0?y.push({label:"Raw events pending",value:f,tooltip:"Pending raw events waiting to be flushed",icon:"activity"}):p>0&&y.push({label:"Raw sessions",value:p,tooltip:"Sessions with pending raw events",icon:"inbox"}),cv(e,y),t){const _=a?` · project: ${a}`:"";lv(t,`DB: ${Wx(i.path||"unknown")} · ${Kx(i.size_bytes||0)}${_}`)}Ol()}async function zP(){const e=b.lastStatsPayload?.identity?.actor_id||null,[t,n,r,o]=await Promise.all([Q_(),Z_(b.currentProject),ew(b.currentProject),tw(b.currentProject)]);b.lastStatsPayload=t||{},b.lastUsagePayload=n||{},b.lastRawEventsPayload=o||{};const i=b.lastStatsPayload?.identity?.actor_id||null;KP(),WP(),uv(),b.activeTab==="feed"&&e!==i&&jo(!0)}var pv=[["","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"]],ct=null,Bo=0,$l=250,Ml=[],Fl=new Set,jl=new Set,Na=new Map,Pa=new Map,rr=new Map,Uo=new Map,Ra=!1,Go=!1;function yt(e){return document.getElementById(e)}function qP(e){return pv.find(([t])=>t===e)?.[1]??e.replaceAll("_"," ")}function JP(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 Fr(e){return e.read_only===!0&&e.read_only_reason==="peer_received"}function fv(e){return e.identity_source!=="unmapped"&&!Fr(e)}function Bl(e){return Fr(e)?"Received from peers":Ia(e.resolved_scope_id)}function YP(e){return Fr(e)?"source-owned project":JP(e.resolution_reason)}function XP(e){if(!e)return"No recent sessions";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function mv(e){return e.git_remote?e.git_remote:e.cwd?e.cwd:e.workspace_identity}function Ul(e){return e.git_remote?`git:${e.git_remote}`:e.project?`project:${e.project}`:`identity:${e.workspace_identity}`}function hv(e){return e.project||e.display_project||mv(e)}function gv(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 QP(){return new Set(b.lastCoordinatorAdminGroups.filter(e=>!e.archived_at).map(e=>String(e.group_id||"").trim()).filter(Boolean))}function ZP(e){return!Go||e.authority_type!=="coordinator"||!e.group_id?!1:!QP().has(String(e.group_id).trim())}function vv(){const e=document.activeElement;return e instanceof HTMLSelectElement&&e.classList.contains("project-domain-select")}function yv(){Ra&&(Ra=!1,ct?.())}async function eR(){try{const e=await no();b.lastCoordinatorAdminStatus=e&&typeof e=="object"?e:null}catch{b.lastCoordinatorAdminStatus=null,b.lastCoordinatorAdminGroups=[],Go=!1;return}if(b.lastCoordinatorAdminStatus?.readiness!=="ready"||!b.lastCoordinatorAdminStatus.has_admin_secret){b.lastCoordinatorAdminGroups=[],Go=!1;return}try{const e=await fp(!1);b.lastCoordinatorAdminGroups=Array.isArray(e?.items)?e.items:[],Go=!0}catch{b.lastCoordinatorAdminGroups=[],Go=!1}}function tR(e){return e.kind==="team_default"}function Gl(e){const t=e.label||"Untitled Space";return tR(e)?`${t} (default)`:t}function nR(e,t){const n=Gl(e);return t.some(r=>r.scope_id!==e.scope_id&&Gl(r)===n)?`${n} · Space ID ${e.scope_id}`:n}function rR(e){const t=gv(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 oR(e){return e?Ml.find(t=>t.scope_id===e)??null:null}function Ia(e){const t=oR(e);return e?t?`${Gl(t)} · ${rR(t)}`:"Unknown Space":"—"}function Hl(){return Ml.filter(e=>e.scope_id!=="legacy-shared-review"&&!ZP(e))}function iR(e){return Hl().some(t=>t.scope_id===e)}function bv(...e){for(const t of e)if(t&&iR(t))return t;return e.find(t=>!!t)??""}function aR(e){const t=gv(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Spaces":"Other Spaces"}function sR(e){return e.group_id?`team:${e.group_id}`:`${e.authority_type||"other"}:${e.kind||"space"}`}function cR(){const e=new Map;for(const t of Hl()){const n=sR(t),r=aR(t),o=e.get(n)??{label:r,scopes:[]};e.set(n,{label:o.label,scopes:[...o.scopes,t]})}return[...e.values()]}function _v(e){for(const t of cR()){const n=document.createElement("optgroup");n.label=t.label;for(const r of t.scopes){const o=document.createElement("option");o.value=r.scope_id,o.textContent=nR(r,t.scopes),n.appendChild(o)}e.appendChild(n)}}function lR(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 Vl(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}),rr.delete(e.workspace_identity),Na.delete(e.workspace_identity),Z("Project Space assignment updated. Device access grants are unchanged."),ct?.()}catch(r){if(r instanceof Ci){rr.set(e.workspace_identity,{requiredGuardrailTokens:r.requiredGuardrailTokens,scopeId:t,warnings:r.guardrailWarnings}),ct?.();return}Z(r instanceof Error?r.message:"Unable to update project Space.","warning")}}async function dR(e,t){const n=e.filter(fv);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}))}),Z(`Updated ${n.length} project identit${n.length===1?"y":"ies"}. Device access grants are unchanged.`),Pa.delete(Ul(n[0])),ct?.()}catch(r){Z(r instanceof Ci?"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 uR(e){if(e.mapping_id!=null)try{await uw(e.mapping_id),rr.delete(e.workspace_identity),Na.delete(e.workspace_identity),Z("Project Space assignment removed. The next fallback now applies."),ct?.()}catch(t){Z(t instanceof Error?t.message:"Unable to remove project Space assignment.","warning")}}async function wv(e,t=!1){try{const n=Uo.get(e.workspace_identity),r=await fw({...t&&n?{confirmation_token:n.confirmationToken}:{},confirmed:t,workspace_identity:e.workspace_identity});Uo.delete(e.workspace_identity),Z(`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.`),ct?.()}catch(n){if(n instanceof _p){Uo.set(e.workspace_identity,{confirmationToken:n.preview.confirmation_token,localOwnedMemoryCount:n.preview.local_owned_memory_count,peerOwnedMemoryCount:n.preview.peer_owned_memory_count}),ct?.();return}Z(n instanceof Error?n.message:"Unable to forget project memories.","warning")}}async function pR(e){if(e.identity_source==="unmapped")return;const t=String(e.project||e.display_project||"").trim();let n=[];try{n=(await Si()).filter(o=>o&&o!==t)}catch{}const r=await Vc({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:o=>{const i=o.trim();return i?i===t?"Already assigned to this project.":null:"Enter a project name."}});if(r!=null)try{const o=await pw({project:r.trim(),workspace_identity:e.workspace_identity});Z(`Changed project to ${o.project} for ${o.moved_session_count} session${o.moved_session_count===1?"":"s"}.`),ct?.()}catch(o){Z(o instanceof Error?o.message:"Unable to change project.","warning")}}function fR(e){const t=document.createElement("div");if(t.className="project-inventory-actions",Fr(e)){const m=document.createElement("div");return m.className="settings-note",m.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(m),t}if(e.identity_source==="unmapped"){const m=document.createElement("div");return m.className="settings-note",m.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(m),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 o=document.createElement("select");o.id=r,o.className="project-domain-select";const i=Hl().some(m=>m.scope_id===e.resolved_scope_id);if(!i&&e.resolved_scope_id){const m=document.createElement("option");m.value=e.resolved_scope_id,m.textContent=`${Ia(e.resolved_scope_id)} — not assignable`,m.disabled=!0,o.appendChild(m)}_v(o),o.value=bv(Na.get(e.workspace_identity),e.suggested_scope_id,e.resolved_scope_id);const a=document.createElement("button");a.className="settings-button",a.type="button",a.textContent=e.suggested_scope_id&&o.value===e.suggested_scope_id?"Confirm suggestion":"Save Space",a.disabled=!o.value||o.value===e.resolved_scope_id&&!i,a.addEventListener("click",()=>{Vl(e,o.value)}),o.addEventListener("change",()=>{Na.set(e.workspace_identity,o.value),rr.delete(e.workspace_identity),t.querySelector(".project-space-guardrail-confirmation")?.remove(),a.textContent="Save Space",a.disabled=!o.value,ct?.()}),o.addEventListener("blur",yv);const s=document.createElement("button");s.className="settings-button",s.type="button",s.textContent="Keep local-only",s.addEventListener("click",()=>{Vl(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",()=>{uR(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",()=>{pR(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",()=>{wv(e)}),t.append(n,o,a,s,l,d,u);const p=rr.get(e.workspace_identity);if(p){const m=document.createElement("div");m.className="settings-note project-guardrail-confirmation project-space-guardrail-confirmation",m.setAttribute("role","alert");const v=document.createElement("strong");v.textContent="Confirmation required before saving this Space.";const g=document.createElement("p");g.textContent="Codemem can save this change after you acknowledge the checks below. Verify the workspace details, then confirm to complete the save.";const y=document.createElement("ul");for(const C of p.warnings){const T=document.createElement("li"),x=document.createElement("strong");x.textContent=`${lR(C)}: `;const E=document.createElement("span");E.textContent=C.message,T.append(x,E),y.appendChild(T)}const _=document.createElement("button");_.className="settings-button",_.type="button",_.textContent="I understand, save Space",_.addEventListener("click",()=>{const C=rr.get(e.workspace_identity);!C||C.scopeId!==o.value||Vl(e,C.scopeId,C.requiredGuardrailTokens)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{rr.delete(e.workspace_identity),ct?.()}),m.append(v,g,y,_,w),t.appendChild(m)}const f=Uo.get(e.workspace_identity);if(f){const m=document.createElement("div");m.className="settings-note project-guardrail-confirmation",m.setAttribute("role","alert");const v=document.createElement("strong");v.textContent="Confirm project memory cleanup.";const g=document.createElement("p");g.textContent=`${f.localOwnedMemoryCount.toLocaleString()} locally owned memor${f.localOwnedMemoryCount===1?"y":"ies"} will be forgotten. ${f.peerOwnedMemoryCount.toLocaleString()} peer-owned memor${f.peerOwnedMemoryCount===1?"y":"ies"} will be left unchanged.`;const y=document.createElement("p");y.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",()=>{wv(e,!0)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{Uo.delete(e.workspace_identity),ct?.()}),m.append(v,g,y,_,w),t.appendChild(m)}return t}function Sv(e){const t=document.createElement("article");t.className="project-inventory-row";const n=document.createElement("div");n.className="project-inventory-row-header";const r=document.createElement("div");r.className="project-inventory-title",r.textContent=e.display_project,n.appendChild(r);const o=document.createElement("div");o.className="project-inventory-domain",o.textContent=Bl(e),n.appendChild(o),t.appendChild(n);const i=document.createElement("div");if(i.className="project-inventory-meta",i.textContent=`${YP(e)} · ${e.identity_source} · ${XP(e.latest_session_at)}`,t.appendChild(i),Fr(e)){const f=document.createElement("div");f.className="settings-note",f.textContent="Received memories keep the source device's project and Space assignment. Local reassignment controls are disabled here to avoid split-brain sync state.",t.appendChild(f)}const a=document.createElement("div");if(a.className="project-inventory-signal mono",a.textContent=mv(e),t.appendChild(a),e.suggested_scope_id&&e.suggested_scope_id!==e.resolved_scope_id){const f=document.createElement("div");f.className="settings-note project-suggestion-note",f.textContent=e.suggestion_reason?`Suggestion: ${e.suggestion_reason}`:`Suggestion: assign this project to ${Ia(e.suggested_scope_id)}.`,t.appendChild(f)}const s=(e.guardrail_warnings??[]).filter(f=>f.severity==="warning");if(s.length>0){const f=document.createElement("div");f.className="settings-note project-attention-note",f.textContent=`Needs attention: ${s.map(m=>m.message).join(" ")}`,t.appendChild(f)}if(e.statuses.length>0){const f=document.createElement("div");f.className="project-inventory-badges";for(const m of e.statuses){const v=document.createElement("span");v.className=`project-status-badge ${m}`,v.textContent=qP(m),f.appendChild(v)}t.appendChild(f)}const l=document.createElement("details");l.className="project-inventory-details",l.open=Fl.has(e.workspace_identity),l.addEventListener("toggle",()=>{l.open?Fl.add(e.workspace_identity):Fl.delete(e.workspace_identity)});const d=document.createElement("summary");d.textContent="Identity and mapping details",l.appendChild(d);const u=document.createElement("dl");u.className="project-detail-grid";const p=[["Workspace identity",e.workspace_identity],["Project",e.project],["CWD",e.cwd],["Git remote",e.git_remote],["Git branch",e.git_branch],["Current Space",Bl(e)],["Suggested Space",e.suggested_scope_id?Ia(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[f,m]of p){const v=document.createElement("dt");v.textContent=f;const g=document.createElement("dd");g.textContent=m==null||m===""?"—":String(m),u.append(v,g)}return l.appendChild(u),l.appendChild(fR(e)),t.appendChild(l),t}function mR(e){const t=[...new Set(e.map(n=>Bl(n)))];return t.length===1?t[0]:"Mixed Spaces"}function hR(e){if(e.length===1)return Sv(e[0]);const t=Ul(e[0]),n=document.createElement("article");n.className="project-inventory-row project-inventory-cluster";const r=document.createElement("div");r.className="project-inventory-row-header";const o=document.createElement("div");o.className="project-inventory-title",o.textContent=hv(e[0]),r.appendChild(o);const i=document.createElement("div");i.className="project-inventory-domain",i.textContent=mR(e),r.appendChild(i),n.appendChild(r);const a=e.reduce((m,v)=>m+(v.memory_count??0),0),s=e.reduce((m,v)=>m+v.session_count,0),l=document.createElement("div");l.className="project-inventory-meta",l.textContent=`${e.length} identities · ${s.toLocaleString()} sessions · ${a.toLocaleString()} memories`,n.appendChild(l);const d=document.createElement("div");d.className="project-inventory-actions";const u=e.filter(fv);if(u.length===0){const m=document.createElement("div");m.className="settings-note",m.textContent=e.every(Fr)?"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.",d.appendChild(m),n.appendChild(d)}else{const m=u.map(T=>({project:T,warnings:(T.guardrail_warnings??[]).filter(x=>x.requires_confirmation)})),v=m.some(({warnings:T})=>T.length>0),g=new Set(u.map(T=>T.suggested_scope_id).filter(T=>!!T)),y=new Set(u.map(T=>T.resolved_scope_id)),_=document.createElement("select");_.className="project-domain-select",_.setAttribute("aria-label",`Space for ${hv(e[0])} group`);const w=document.createElement("option");w.value="",w.textContent="Choose Space…",_.appendChild(w),_v(_),_.value=bv(Pa.get(t));const C=document.createElement("button");if(C.className="settings-button",C.type="button",C.textContent=`Save Space for ${u.length} identit${u.length===1?"y":"ies"}`,C.disabled=!_.value||v,C.addEventListener("click",()=>{dR(u,_.value)}),_.addEventListener("change",()=>{_.value?Pa.set(t,_.value):Pa.delete(t),C.disabled=!_.value||v}),_.addEventListener("blur",yv),d.append(_,C),g.size>1||y.size>1||v){const T=document.createElement("div");if(T.className="settings-note project-attention-note",T.textContent=v?"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.",v){const x=document.createElement("ul");for(const{project:E,warnings:L}of m){if(L.length===0)continue;const F=document.createElement("li"),H=document.createElement("strong");H.textContent=`Blocked identity: ${E.workspace_identity}`;const R=document.createElement("span");R.textContent=` — ${L.map(U=>U.message).join(" ")}`,F.append(H,R),x.appendChild(F)}T.appendChild(x)}d.appendChild(T)}n.appendChild(d)}const p=document.createElement("details");p.className="project-inventory-details",p.open=jl.has(t),p.addEventListener("toggle",()=>{p.open?jl.add(t):jl.delete(t)});const f=document.createElement("summary");f.textContent="Show identities in this project",p.appendChild(f);for(const m of e)p.appendChild(Sv(m));return n.appendChild(p),n}function gR(e){const t=new Map;for(const n of e){const r=Ul(n);t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function Cv(e){const t=yt("projectsInventoryList");if(!t)return;t.textContent="";const n=document.createElement("div");n.className="settings-note",n.textContent=e,t.appendChild(n)}function Tv(){document.getElementById("projectsInventorySkeleton")?.remove()}function kv(e){const t=yt("projectsInventoryMeta"),n=yt("projectsInventoryList");if(!t||!n)return;if(Tv(),n.textContent="",e.projects.length===0)Cv("No projects match those filters.");else for(const i of gR(e.projects))n.appendChild(hR(i));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 r=yt("projectsPrevPage"),o=yt("projectsNextPage");r&&(r.disabled=e.offset===0),o&&(o.disabled=!e.has_more)}function vR(e){eR().then(()=>{vv()||kv(e)})}async function yR(){const e=yt("projectsInventoryMeta"),t=yt("projectsInventoryList");if(!(!e||!t)){if(vv()){Ra=!0;return}Ra=!1,e.textContent="Loading project inventory…";try{const[n,r]=await Promise.all([cw({limit:$l,offset:Bo,q:yt("projectsSearch")?.value.trim()||void 0,status:yt("projectsStatusFilter")?.value||void 0}),sw()]);Ml=r.scopes,kv(n),vR(n)}catch(n){Tv(),e.textContent="Project inventory failed to load.",Cv(n instanceof Error?n.message:"Unable to load project inventory.")}}}function bR(e){ct=e;const t=yt("projectsStatusFilter");if(t&&t.options.length===0)for(const[r,o]of pv){const i=document.createElement("option");i.value=r,i.textContent=o,t.appendChild(i)}const n=()=>{Bo=0,ct?.()};yt("projectsSearch")?.addEventListener("input",n),t?.addEventListener("change",n),yt("projectsPrevPage")?.addEventListener("click",()=>{Bo=Math.max(0,Bo-$l),ct?.()}),yt("projectsNextPage")?.addEventListener("click",()=>{Bo+=$l,ct?.()})}function xv(e,t){const n=e.trim();if(!n)return[];const r=JSON.parse(n);if(!Array.isArray(r)||r.some(i=>typeof i!="string"))throw new Error(`${t.label} must be a JSON string array`);if(!t.normalize&&!t.requireNonEmpty)return r;const o=t.normalize?r.map(i=>i.trim()):r;if(t.requireNonEmpty&&o.some(i=>i.trim()===""))throw new Error(`${t.label} cannot contain empty command tokens`);return o}function _R(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[o,i]of Object.entries(n)){if(typeof o!="string"||!o.trim()||typeof i!="string")throw new Error("observer headers must map string keys to string values");r[o.trim()]=i}return r}var Av="codemem-settings-advanced",wR="gpt-5.1-codex-mini",Ev="claude-4.5-haiku",SR=[{value:"observer",label:"Connection"},{value:"queue",label:"Processing"},{value:"sync",label:"Device Sync"}],CR={claudeCommand:"claude_command",observerProvider:"observer_provider",observerModel:"observer_model",observerTierRoutingEnabled:"observer_tier_routing_enabled",observerSimpleModel:"observer_simple_model",observerSimpleTemperature:"observer_simple_temperature",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"},TR=new Set(["claude_command","observer_base_url","observer_auth_file","observer_auth_command","observer_headers","sync_coordinator_url"]),kR={claudeCommand:"",observerProvider:"",observerModel:"",observerTierRoutingEnabled:!1,observerSimpleModel:"",observerSimpleTemperature:"",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 xR(){try{return globalThis.localStorage?.getItem(Av)==="1"}catch{return!1}}function AR(e){try{globalThis.localStorage?.setItem(Av,e?"1":"0")}catch{}}function sn(e,t){return typeof e=="object"&&e!==null&&Object.hasOwn(e,t)}function Ce(e,t,n){if(sn(t,n))return t[n];if(sn(e,n))return e[n]}function Pe(e){return e==null?"":String(e)}function Da(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 ER(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function NR(e,t){return e===t?!0:JSON.stringify(e)===JSON.stringify(t)}function tt(e){const t=e.trim();return t===""?"":t}function PR(e,t,n){return n?{model:n,source:"Configured"}:e==="claude_sidecar"?{model:Ev,source:"Recommended (local Claude session)"}:t==="anthropic"?{model:Ev,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:wR,source:"Recommended (direct API)"}}function RR(e,t){const n=e??{};switch(t){case"claude_command":{const r=n.claude_command;if(!Array.isArray(r))return[];const o=[];return r.forEach(i=>{if(typeof i!="string")return;const a=i.trim();a&&o.push(a)}),o}case"observer_provider":case"observer_model":case"observer_simple_model":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 tt(Pe(n[t]));case"observer_runtime":return tt(Pe(n.observer_runtime));case"observer_auth_source":return tt(Pe(n.observer_auth_source));case"observer_auth_command":{const r=n.observer_auth_command;return Array.isArray(r)?r.filter(o=>typeof o=="string"):[]}case"observer_headers":{const r=n.observer_headers;if(!r||typeof r!="object"||Array.isArray(r))return{};const o={};return Object.entries(r).forEach(([i,a])=>{typeof i=="string"&&i.trim()&&typeof a=="string"&&(o[i.trim()]=a)}),o}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(!sn(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(!sn(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r>0?r:""}case"observer_auth_cache_ttl_s":{if(!sn(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 Da(n[t]);default:return sn(n,t)?n[t]:""}}function IR(e,t,n){const r={...e};return Object.keys(n).forEach(o=>{sn(r,o)&&(r[o]=RR(t,o))}),r}function DR(e){const{values:t,touchedKeys:n,baseline:r}=e,o=e.allowUntouchedParseErrors===!0;let i=[];try{i=xv(t.claudeCommand,{label:"claude command",normalize:!0,requireNonEmpty:!0})}catch(C){if(!o||n.has("claude_command"))throw C;const T=r.claude_command;i=Array.isArray(T)?T.filter(x=>typeof x=="string").map(x=>x.trim()).filter(x=>x.length>0):[]}let a=[];try{a=xv(t.observerAuthCommand,{label:"observer auth command"})}catch(C){if(!o||n.has("observer_auth_command"))throw C;const T=r.observer_auth_command;a=Array.isArray(T)?T.filter(x=>typeof x=="string"):[]}let s={};try{s=_R(t.observerHeaders)}catch(C){if(!o||n.has("observer_headers"))throw C;const T=r.observer_headers;T&&typeof T=="object"&&!Array.isArray(T)&&Object.entries(T).forEach(([x,E])=>{typeof x=="string"&&x.trim()&&typeof E=="string"&&(s[x]=E)})}const l=t.observerAuthCacheTtlS.trim(),d=t.observerSimpleTemperature.trim(),u=t.observerRichTemperature.trim(),p=t.observerRichMaxOutputTokens.trim(),f=t.rawEventsSweeperIntervalS.trim(),m=l===""?"":Number(l),v=d===""?"":Number(d),g=u===""?"":Number(u),y=p===""?"":Number(p),_=Number(f),w=f===""?"":_;if(l!==""&&!Number.isFinite(m))throw new Error("observer auth cache ttl must be a number");if(d!==""&&(typeof v!="number"||!Number.isFinite(v)||v<0))throw new Error("simple tier temperature must be a non-negative number");if(u!==""&&(typeof g!="number"||!Number.isFinite(g)||g<0))throw new Error("rich tier temperature must be a non-negative number");if(p!==""&&(typeof y!="number"||!Number.isFinite(y)||y<=0||!Number.isInteger(y)))throw new Error("rich tier max output tokens must be a positive integer");if(f!==""&&(!Number.isFinite(_)||_<=0))throw new Error("raw-event sweeper interval must be a positive number");return{claude_command:i,observer_provider:tt(t.observerProvider),observer_model:tt(t.observerModel),observer_tier_routing_enabled:t.observerTierRoutingEnabled,observer_simple_model:tt(t.observerSimpleModel),observer_simple_temperature:v,observer_rich_model:tt(t.observerRichModel),observer_rich_temperature:g,observer_rich_reasoning_effort:tt(t.observerRichReasoningEffort),observer_rich_reasoning_summary:tt(t.observerRichReasoningSummary),observer_rich_max_output_tokens:y,observer_runtime:tt(t.observerRuntime||"api_http")||"api_http",observer_auth_source:tt(t.observerAuthSource||"auto")||"auto",observer_auth_file:tt(t.observerAuthFile),observer_auth_command:a,observer_auth_timeout_ms:Number(t.observerAuthTimeoutMs||0)||"",observer_auth_cache_ttl_s:m,observer_headers:s,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:w,sync_enabled:t.syncEnabled,sync_host:tt(t.syncHost),sync_port:Number(t.syncPort||0)||"",sync_interval_s:Number(t.syncInterval||0)||"",sync_mdns:t.syncMdns,sync_coordinator_url:tt(t.syncCoordinatorUrl),sync_coordinator_group:tt(t.syncCoordinatorGroup),sync_coordinator_timeout_s:Number(t.syncCoordinatorTimeout||0)||"",sync_coordinator_presence_ttl_s:Number(t.syncCoordinatorPresenceTtl||0)||""}}function LR(e){const t=e.config||{},n=e.effective||{},r=Ce(t,n,"observer_headers"),o=r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).filter(([d,u])=>typeof d=="string"&&d.trim()&&typeof u=="string")):{},i=Ce(t,n,"claude_command"),a=Array.isArray(i)?i.filter(d=>typeof d=="string"):[],s=Ce(t,n,"observer_auth_command"),l=Array.isArray(s)?s.filter(d=>typeof d=="string"):[];return{claudeCommand:a.length?JSON.stringify(a,null,2):"",observerProvider:Pe(Ce(t,n,"observer_provider")),observerModel:Pe(Ce(t,n,"observer_model")),observerTierRoutingEnabled:Da(Ce(t,n,"observer_tier_routing_enabled")),observerSimpleModel:Pe(Ce(t,n,"observer_simple_model")),observerSimpleTemperature:Pe(Ce(t,n,"observer_simple_temperature")),observerRichModel:Pe(Ce(t,n,"observer_rich_model")),observerRichTemperature:Pe(Ce(t,n,"observer_rich_temperature")),observerRichReasoningEffort:Pe(Ce(t,n,"observer_rich_reasoning_effort")),observerRichReasoningSummary:Pe(Ce(t,n,"observer_rich_reasoning_summary")),observerRichMaxOutputTokens:Pe(Ce(t,n,"observer_rich_max_output_tokens")),observerRuntime:Pe(Ce(t,n,"observer_runtime"))||"api_http",observerAuthSource:Pe(Ce(t,n,"observer_auth_source"))||"auto",observerAuthFile:Pe(Ce(t,n,"observer_auth_file")),observerAuthCommand:l.length?JSON.stringify(l,null,2):"",observerAuthTimeoutMs:Pe(Ce(t,n,"observer_auth_timeout_ms")),observerAuthCacheTtlS:Pe(Ce(t,n,"observer_auth_cache_ttl_s")),observerHeaders:Object.keys(o).length?JSON.stringify(o,null,2):"",observerMaxChars:Pe(Ce(t,n,"observer_max_chars")),packObservationLimit:Pe(Ce(t,n,"pack_observation_limit")),packSessionLimit:Pe(Ce(t,n,"pack_session_limit")),rawEventsSweeperIntervalS:Pe(Ce(t,n,"raw_events_sweeper_interval_s")),syncEnabled:Da(Ce(t,n,"sync_enabled")),syncHost:Pe(Ce(t,n,"sync_host")),syncPort:Pe(Ce(t,n,"sync_port")),syncInterval:Pe(Ce(t,n,"sync_interval_s")),syncMdns:Da(Ce(t,n,"sync_mdns")),syncCoordinatorUrl:Pe(Ce(t,n,"sync_coordinator_url")),syncCoordinatorGroup:Pe(Ce(t,n,"sync_coordinator_group")),syncCoordinatorTimeout:Pe(Ce(t,n,"sync_coordinator_timeout_s")),syncCoordinatorPresenceTtl:Pe(Ce(t,n,"sync_coordinator_presence_ttl_s"))}}function OR(e,t){if(e.observerTierRoutingEnabled)return"Tiered routing is enabled: simple/rich model selection now lives in Processing.";const n=PR(e.observerRuntime.trim()||"api_http",e.observerProvider.trim(),tt(e.observerModel));return`${["observer_model","observer_provider","observer_runtime"].some(r=>sn(t,r))?"Env override":n.source}: ${n.model}`}function $R(e){return e.observerTierRoutingEnabled?"On: codemem routes simpler batches to a lighter model and richer batches to a higher-quality configuration. Rich-tier OpenAI requests default to the Responses transport, and Claude sidecar runtimes route both tiers through the local Claude 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 MR(e){return e.observerTierRoutingEnabled?"Base model fallback":"Model"}function FR(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 jR(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.1-codex-mini` for Direct API; `claude-4.5-haiku` for Local Claude session."}function BR(e){return!e}function UR(e,t,n){return t.has(e)||n.has(e)}function GR(e){return`${e} is read-only in the viewer for security. Edit the config file or environment instead.`}var V={open:!1,previouslyFocused:null,activeTab:"observer",baseline:{},envOverrides:{},touchedKeys:new Set,shellMounted:!1,protectedKeys:new Set,startPolling:null,refresh:null,showAdvanced:xR(),controller:null,renderState:{effectiveText:"",isSaving:!1,observerStatus:null,overridesVisible:!1,pathText:"Config path: n/a",providers:[],statusText:"Ready",values:{...kR}}};function HR(){V.controller?.hideTooltip()}function or(e){if(V.controller){V.controller.setRenderState(e);return}V.renderState={...V.renderState,...e}}function VR(e){or({values:{...V.renderState.values,...e}})}function WR(e){const t=["observer","queue","sync"].includes(e)?e:"observer";V.activeTab=t,V.controller?.setActiveTab(t)}function La(e,t=!0){b.settingsDirty=e,t&&V.controller?.setDirty(e)}function KR(e){V.showAdvanced=e,V.controller?.setShowAdvanced(e)}function Nv(){return V.open}function zR(e){return UR(e,V.protectedKeys,TR)}function Pv(e={}){return DR({values:V.renderState.values,touchedKeys:V.touchedKeys,baseline:V.baseline,allowUntouchedParseErrors:e.allowUntouchedParseErrors})}function qR(e){or({observerStatus:e&&typeof e=="object"?e:null})}function JR(e){if(!e||typeof e!="object")return;const t=e,n=t.defaults||{},r=t.config||{},o=t.env_overrides&&typeof t.env_overrides=="object"?t.env_overrides:{},i=Array.isArray(t.protected_keys)?t.protected_keys.filter(s=>typeof s=="string"&&s.trim().length>0):[],a=LR(t);V.envOverrides=o,V.protectedKeys=new Set(i),b.configDefaults=n,b.configPath=t.path||"",or({effectiveText:Object.keys(o).length>0?"Some fields are managed by environment settings.":"",overridesVisible:Object.keys(o).length>0,pathText:b.configPath?`Config path: ${b.configPath}`:"Config path: n/a",providers:ER(t.providers),statusText:"No unsaved changes",values:a}),V.touchedKeys=new Set;try{V.baseline=IR(Pv({allowUntouchedParseErrors:!0}),r,o)}catch{V.baseline={}}La(!1)}async function YR(){if(!V.open)try{const[e,t]=await Promise.all([N_(),E_().catch(()=>null)]);JR(e),qR(t)}catch{}}function Wl(e){return String(e||"").replace(/_/g," ")}function Kl(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 XR(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"opencode_run":return"OpenCode sidecar";default:return e||"none"}}function QR(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 ZR(e){if(typeof e!="string"||!e.trim())return"Unknown time";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function eI({status:e}){if(!e)return c("div",{id:"observerStatusBanner",className:"observer-status-banner",hidden:!0});const t=e.active,n=e.available_credentials||{},r=e.latest_failure,o=Object.entries(n).filter(([,i])=>i&&typeof i=="object");return c("div",{id:"observerStatusBanner",className:"observer-status-banner",children:[t?c(ee,{children:[c("div",{className:"status-label",children:"Active observer"}),c("div",{className:"status-active",children:[String(t.provider||"unknown")," → ",String(t.model||"")," via"," ",XR(t.auth?.method||"none")," ",c("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:c("i",{"aria-hidden":"true","data-lucide":t.auth?.token_present===!0?"check":"x"})})]})]}):c(ee,{children:[c("div",{className:"status-label",children:"Observer status"}),c("div",{className:"status-active",children:"Not yet initialized (waiting for first session)"})]}),o.length?c(ee,{children:[c("div",{className:"status-label",children:"Available credentials"}),c("div",{children:o.map(([i,a],s)=>{const l=a,d=Object.values(l).some(Boolean);return c("span",{className:"status-cred",children:[s>0?" · ":null,c("span",{"aria-label":d?"credential available":"no credential",className:d?"cred-ok":"cred-none",role:"img",children:d?c("i",{"aria-hidden":"true","data-lucide":"check"}):"–"})," ",String(i),": ",QR(l)]},i)})})]}):null,r&&typeof r=="object"?c(ee,{children:[c("div",{className:"status-label",children:"Latest processing issue"}),c("div",{className:"status-issue",children:[c("div",{className:"status-issue-message",children:typeof r.error_message=="string"&&r.error_message.trim()?r.error_message.trim():"Raw-event processing failed."}),c("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 ${ZR(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()?c("div",{className:"status-issue-impact",children:r.impact.trim()}):null]})]}):null]})}function Rv(e,t){const n=t.getBoundingClientRect(),r=8,o=8,i=e.offsetWidth,a=e.offsetHeight;let s=n.left+n.width/2-i/2;s=Math.max(r,Math.min(s,globalThis.innerWidth-i-r));let l=n.bottom+o;l+a>globalThis.innerHeight-r&&(l=n.top-a-o),l=Math.max(r,l),e.style.left=`${Math.round(s)}px`,e.style.top=`${Math.round(l)}px`}function Ho(e){return e instanceof Element?e.closest(".help-icon[data-tooltip]"):null}function tI(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 nI(){const e=$e("settingsModal");(tI(e)[0]||e)?.focus()}function rI(){const[e,t]=O({anchor:null,content:"",visible:!1}),n=j(null);return G(()=>{const r=u=>{const p=u.dataset.tooltip?.trim();p&&t({anchor:u,content:p,visible:!0})},o=()=>{t(u=>!u.visible&&!u.anchor&&!u.content?u:{anchor:null,content:"",visible:!1})},i=u=>{const p=Ho(u.target);p&&r(p)},a=u=>{const p=Ho(u.target);if(!p)return;const f=u.relatedTarget;f instanceof Element&&p.contains(f)||o()},s=u=>{const p=Ho(u.target);p&&r(p)},l=u=>{Ho(u.target)&&o()},d=u=>{const p=Ho(u.target);p&&(u.preventDefault(),t(f=>{if(f.anchor===p&&f.visible)return{anchor:null,content:"",visible:!1};const m=p.dataset.tooltip?.trim()||"";return m?{anchor:p,content:m,visible:!0}:f}))};return document.addEventListener("pointerover",i),document.addEventListener("pointerout",a),document.addEventListener("focusin",s),document.addEventListener("focusout",l),document.addEventListener("click",d),()=>{document.removeEventListener("pointerover",i),document.removeEventListener("pointerout",a),document.removeEventListener("focusin",s),document.removeEventListener("focusout",l),document.removeEventListener("click",d)}},[]),mt(()=>{if(!e.visible||!e.anchor||!n.current)return;const r=requestAnimationFrame(()=>{n.current&&e.anchor&&Rv(n.current,e.anchor)});return()=>{cancelAnimationFrame(r)}},[e.anchor,e.content,e.visible]),G(()=>{if(!e.visible||!e.anchor)return;const r=()=>{n.current&&e.anchor&&Rv(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:Ne(()=>typeof document>"u"?null:Zt(c("div",{className:`help-tooltip${e.visible?" visible":""}`,hidden:!e.visible,ref:n,children:e.content}),document.body),[e.content,e.visible]),setTooltip:t}}function oI({DialogContent:e,onClose:t}){const[n,r]=O(V.open),[o,i]=O(["observer","queue","sync"].includes(V.activeTab)?V.activeTab:"observer"),[a,s]=O(b.settingsDirty),[l,d]=O(V.renderState),[u,p]=O(V.showAdvanced),{tooltipPortal:f,setTooltip:m}=rI();V.open=n,V.activeTab=o,b.settingsDirty=a,V.renderState=l,V.showAdvanced=u,G(()=>(V.controller={hideTooltip:()=>{m({anchor:null,content:"",visible:!1})},setActiveTab:g=>{const y=["observer","queue","sync"].includes(g)?g:"observer";V.activeTab=y,i(y)},setDirty:g=>{b.settingsDirty=g,s(g)},setOpen:g=>{V.open=g,r(g)},setRenderState:g=>{const y={...V.renderState,...g};V.renderState=y,d(y)},setShowAdvanced:g=>{V.showAdvanced=g,AR(g),p(g)}},()=>{V.controller&&(V.controller=null)}),[]),G(()=>{n&&globalThis.lucide?.createIcons?.()},[n]);const v=te(()=>{V.startPolling&&V.refresh&&t(V.startPolling,V.refresh)},[t]);return c(ee,{children:[c($m,{ariaDescribedby:"settingsDescription",ariaLabelledby:"settingsTitle",contentClassName:"modal",contentId:"settingsModal",onCloseAutoFocus:g=>{g.preventDefault()},onOpenAutoFocus:g=>{g.preventDefault(),nI()},onOpenChange:g=>{if(g){r(!0);return}v()},open:n,overlayClassName:"modal-backdrop",overlayId:"settingsBackdrop",children:c(e,{})}),f]})}function je({children:e,className:t="field",hidden:n=!1,id:r}){return c("div",{className:t,hidden:n,id:r,children:e})}function Vo({children:e,hidden:t=!1}){return c("div",{className:"settings-note",hidden:t,children:e})}function zl({detail:e,title:t}){return c("div",{className:"settings-section-intro",children:[c("div",{className:"settings-section-intro-title",children:t}),c("div",{className:"small settings-section-intro-detail",children:e})]})}function iI({values:e,observerMaxCharsDefault:t,providerOptions:n,showAuthFile:r,showAuthCommand:o,hiddenUnlessAdvanced:i,onTextInput:a,onSelectValueChange:s,getObserverModelLabel:l,getObserverModelTooltip:d,getObserverModelDescription:u,getObserverModelHint:p,protectedConfigHelp:f,observerStatusBannerSlot:m}){return c(ee,{children:[c(zl,{detail:"Set how codemem reaches your model provider and where it should look for credentials.",title:"Connection and credentials"}),m,c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Connection"}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerProvider",children:"Model provider"}),c("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:"?"})]}),c(an,{ariaLabel:"Model provider",contentClassName:"settings-select-content",id:"observerProvider",itemClassName:"settings-select-item",onValueChange:s("observerProvider"),options:[{label:"auto (default)",value:""},...n],placeholder:"auto (default)",triggerClassName:"settings-select-trigger",value:e.observerProvider,viewportClassName:"settings-select-viewport"}),c("div",{className:"small",children:"Use `auto` unless you need to pin a specific provider."})]}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerModel",children:l()}),c("button",{"aria-label":"About model defaults",className:"help-icon","data-tooltip":d(),type:"button",children:"?"})]}),c(ve,{id:"observerModel",onInput:a("observerModel"),placeholder:"leave empty for default",value:e.observerModel}),c("div",{className:"small",children:u()}),c("div",{className:"small",id:"observerModelHint",children:p()})]}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerRuntime",children:"Connection mode"}),c("button",{"aria-label":"About connection mode",className:"help-icon","data-tooltip":"Direct API uses provider credentials. Local Claude session uses local Claude runtime auth.",type:"button",children:"?"})]}),c(an,{ariaLabel:"Connection mode",contentClassName:"settings-select-content",id:"observerRuntime",itemClassName:"settings-select-item",onValueChange:s("observerRuntime"),options:[{label:"Direct API (default)",value:"api_http"},{label:"Local Claude session",value:"claude_sidecar"}],triggerClassName:"settings-select-trigger",value:e.observerRuntime,viewportClassName:"settings-select-viewport"}),c("div",{className:"small",children:"Switch between provider API credentials and local Claude session auth."})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"claudeCommand",children:"Claude command (JSON argv)"}),c(vo,{disabled:!0,id:"claudeCommand",placeholder:'["claude"]',rows:2,value:e.claudeCommand}),c("div",{className:"small",children:f("claude_command")})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"observerMaxChars",children:"Request size limit (chars)"}),c(ve,{id:"observerMaxChars",min:"1",onInput:a("observerMaxChars"),type:"number",value:e.observerMaxChars}),c("div",{className:"small",id:"observerMaxCharsHint",children:t?`Default: ${t}`:""})]})]}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Authentication"}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerAuthSource",children:"Authentication method"}),c("button",{"aria-label":"About authentication method",className:"help-icon","data-tooltip":"Choose how credentials are resolved: environment, file, command, or none.",type:"button",children:"?"})]}),c(an,{ariaLabel:"Authentication method",contentClassName:"settings-select-content",id:"observerAuthSource",itemClassName:"settings-select-item",onValueChange:s("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"}),c("div",{className:"small",children:"Use `auto` unless you need to force a file or command-based token source."})]}),c(je,{hidden:!r,id:"observerAuthFileField",children:[c("label",{htmlFor:"observerAuthFile",children:"Token file path"}),c(ve,{disabled:!0,id:"observerAuthFile",placeholder:"~/.codemem/work-token.txt",value:e.observerAuthFile}),c("div",{className:"small",children:f("observer_auth_file")})]}),c(je,{hidden:!o,id:"observerAuthCommandField",children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerAuthCommand",children:"Token command"}),c("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:"?"})]}),c(vo,{disabled:!0,id:"observerAuthCommand",placeholder:'["iap-auth", "--audience", "gateway"]',rows:3,value:e.observerAuthCommand}),c("div",{className:"small",children:f("observer_auth_command")})]}),c("div",{className:"small",hidden:!o,id:"observerAuthCommandNote",children:'Command format: JSON string array, e.g. `["iap-auth", "--audience", "gateway"]`.'}),c(Vo,{hidden:i(),children:"These advanced credential overrides only matter when you need custom command timing, cached tokens, or extra request headers."}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"observerAuthTimeoutMs",children:"Token command timeout (ms)"}),c(ve,{id:"observerAuthTimeoutMs",min:"1",onInput:a("observerAuthTimeoutMs"),type:"number",value:e.observerAuthTimeoutMs})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("label",{htmlFor:"observerAuthCacheTtlS",children:"Token cache time (s)"}),c(ve,{id:"observerAuthCacheTtlS",min:"0",onInput:a("observerAuthCacheTtlS"),type:"number",value:e.observerAuthCacheTtlS})]}),c(je,{className:"field settings-advanced",hidden:i(),children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerHeaders",children:"Request headers (JSON)"}),c("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:"?"})]}),c(vo,{disabled:!0,id:"observerHeaders",placeholder:'{"Authorization":"Bearer ${auth.token}"}',rows:4,value:e.observerHeaders}),c("div",{className:"small",children:f("observer_headers")})]})]})]})}function Oa({checked:e,className:t,disabled:n=!1,hidden:r=!1,id:o,label:i,onCheckedChange:a}){const s=`${o}Label`;return c("div",{className:t?`field-checkbox settings-switch-row ${t}`:"field-checkbox settings-switch-row",hidden:r,children:[c("label",{className:"settings-switch-copy",htmlFor:o,id:s,children:i}),c(Er,{"aria-labelledby":s,checked:e,className:"settings-switch",disabled:n,id:o,onCheckedChange:a,thumbClassName:"settings-switch-thumb"})]})}function aI({values:e,showTieredRouting:t,hiddenUnlessAdvanced:n,onTextInput:r,onSwitchInput:o,getTieredRoutingHelperText:i}){return c(ee,{children:[c(zl,{detail:"Control how often codemem processes queued work and, if needed, how it routes lighter vs richer model requests.",title:"Processing and routing"}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Processing"}),c(je,{children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"rawEventsSweeperIntervalS",children:"Background processing interval (seconds)"}),c("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:"?"})]}),c(ve,{id:"rawEventsSweeperIntervalS",min:"1",onInput:r("rawEventsSweeperIntervalS"),type:"number",value:e.rawEventsSweeperIntervalS}),c("div",{className:"small",children:"How often codemem checks for queued raw events in the background."})]})]}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Tiered observer routing"}),c(Oa,{checked:e.observerTierRoutingEnabled,className:"field",id:"observerTierRoutingEnabled",label:"Enable tiered routing",onCheckedChange:o("observerTierRoutingEnabled")}),c("div",{className:"small",children:i()}),c(Vo,{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."}),c(je,{hidden:!t,children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerSimpleModel",children:"Simple tier model"}),c("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:"?"})]}),c(ve,{id:"observerSimpleModel",onInput:r("observerSimpleModel"),placeholder:"leave empty for default",value:e.observerSimpleModel}),c("div",{className:"small",children:"Used when a batch falls below rich-routing thresholds."})]}),c(je,{hidden:!t,children:[c("div",{className:"field-label",children:[c("label",{htmlFor:"observerRichModel",children:"Rich tier model"}),c("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:"?"})]}),c(ve,{id:"observerRichModel",onInput:r("observerRichModel"),placeholder:"leave empty for default",value:e.observerRichModel}),c("div",{className:"small",children:"Used when routing detects a richer replay batch."})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerSimpleTemperature",children:"Simple tier temperature"}),c(ve,{id:"observerSimpleTemperature",min:"0",onInput:r("observerSimpleTemperature"),step:"0.1",type:"number",value:e.observerSimpleTemperature})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichTemperature",children:"Rich tier temperature"}),c(ve,{id:"observerRichTemperature",min:"0",onInput:r("observerRichTemperature"),step:"0.1",type:"number",value:e.observerRichTemperature})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichReasoningEffort",children:"Rich tier reasoning effort"}),c(ve,{id:"observerRichReasoningEffort",onInput:r("observerRichReasoningEffort"),placeholder:"leave empty for default",value:e.observerRichReasoningEffort})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichReasoningSummary",children:"Rich tier reasoning summary"}),c(ve,{id:"observerRichReasoningSummary",onInput:r("observerRichReasoningSummary"),placeholder:"leave empty for default",value:e.observerRichReasoningSummary})]}),c(je,{className:"field settings-advanced",hidden:!t||n(),children:[c("label",{htmlFor:"observerRichMaxOutputTokens",children:"Rich tier max output tokens"}),c(ve,{id:"observerRichMaxOutputTokens",min:"1",onInput:r("observerRichMaxOutputTokens"),step:"1",type:"number",value:e.observerRichMaxOutputTokens})]})]}),c("div",{className:"settings-group settings-advanced",hidden:n(),children:[c("h3",{className:"settings-group-title",children:"Pack limits"}),c(Vo,{hidden:n(),children:"Most users can keep these defaults. Change them only when you need smaller or larger default context packs."}),c(je,{className:"field settings-advanced",hidden:n(),children:[c("label",{htmlFor:"packObservationLimit",children:"Observation limit"}),c(ve,{id:"packObservationLimit",min:"1",onInput:r("packObservationLimit"),type:"number",value:e.packObservationLimit}),c("div",{className:"small",children:"Default number of observations to include in a pack."})]}),c(je,{className:"field settings-advanced",hidden:n(),children:[c("label",{htmlFor:"packSessionLimit",children:"Session summary limit"}),c(ve,{id:"packSessionLimit",min:"1",onInput:r("packSessionLimit"),type:"number",value:e.packSessionLimit}),c("div",{className:"small",children:"Default number of session summaries to include in a pack."})]})]})]})}function sI({values:e,hiddenUnlessAdvanced:t,onTextInput:n,onSwitchInput:r,protectedConfigHelp:o}){return c(ee,{children:[c(zl,{detail:"Choose whether this device syncs at all, how often it checks peers, and which coordinator group it should join.",title:"Device sync"}),c("div",{className:"settings-group",children:[c("h3",{className:"settings-group-title",children:"Device Sync"}),c(Oa,{checked:e.syncEnabled,className:"field",id:"syncEnabled",label:"Enable sync",onCheckedChange:r("syncEnabled")}),c("div",{className:"field",children:[c("label",{htmlFor:"syncInterval",children:"Sync interval (seconds)"}),c(ve,{id:"syncInterval",min:"10",onInput:n("syncInterval"),type:"number",value:e.syncInterval}),c("div",{className:"small",children:"How often this device checks for sync work when sync is enabled."})]}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncHost",children:"Sync host"}),c(ve,{id:"syncHost",onInput:n("syncHost"),placeholder:"127.0.0.1",value:e.syncHost})]}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncPort",children:"Sync port"}),c(ve,{id:"syncPort",min:"1",onInput:n("syncPort"),type:"number",value:e.syncPort})]}),c(Oa,{checked:e.syncMdns,className:"field settings-advanced",hidden:t(),id:"syncMdns",label:"Enable mDNS discovery",onCheckedChange:r("syncMdns")}),c("div",{className:"field",children:[c("label",{htmlFor:"syncCoordinatorUrl",children:"Coordinator URL"}),c(ve,{disabled:!0,id:"syncCoordinatorUrl",placeholder:"https://coord.example.com",value:e.syncCoordinatorUrl}),c("div",{className:"small",children:o("sync_coordinator_url")})]}),c("div",{className:"field",children:[c("label",{htmlFor:"syncCoordinatorGroup",children:"Coordinator group"}),c(ve,{id:"syncCoordinatorGroup",onInput:n("syncCoordinatorGroup"),placeholder:"team-alpha",value:e.syncCoordinatorGroup}),c("div",{className:"small",children:"Discovery namespace for peers using the same coordinator."})]}),c("div",{className:"field settings-advanced",hidden:t(),children:c(Vo,{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."})}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncCoordinatorTimeout",children:"Coordinator timeout (seconds)"}),c(ve,{id:"syncCoordinatorTimeout",min:"1",onInput:n("syncCoordinatorTimeout"),type:"number",value:e.syncCoordinatorTimeout})]}),c("div",{className:"field settings-advanced",hidden:t(),children:[c("label",{htmlFor:"syncCoordinatorPresenceTtl",children:"Presence TTL (seconds)"}),c(ve,{id:"syncCoordinatorPresenceTtl",min:"1",onInput:n("syncCoordinatorPresenceTtl"),type:"number",value:e.syncCoordinatorPresenceTtl})]})]})]})}function cI({panelProps:e,activeTab:t,showAdvanced:n,renderState:r,settingsDirty:o,onClose:i,onSave:a,onActiveTabChange:s,onAdvancedToggle:l,observerStatusBannerSlot:d}){const u=!o||r.isSaving;return c("div",{className:"modal-card",onKeyDown:p=>vr(p,{onSubmit:a,disabled:u}),children:[c("div",{className:"modal-header",children:[c("h2",{id:"settingsTitle",children:"Settings"}),c(Fm,{ariaLabel:"Close settings",className:"modal-close-button",onClick:i})]}),c("div",{className:"modal-body",children:[c("div",{className:"small",id:"settingsDescription",children:"Tune how codemem connects, processes work, and syncs with other devices."}),c("div",{className:"settings-advanced-toolbar",children:[c(Oa,{checked:n,id:"settingsAdvancedToggle",label:"Show advanced controls",onCheckedChange:l}),c("button",{"aria-label":"About advanced controls",className:"help-icon","data-tooltip":"Advanced controls include JSON fields, tuning values, and network overrides.",type:"button",children:c("i",{"aria-hidden":"true","data-lucide":"help-circle"})})]}),c(Vo,{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."}),c(Xp,{ariaLabel:"Settings sections",listClassName:"settings-tabs",onValueChange:s,tabs:SR,triggerClassName:"settings-tab",value:t,children:[c(Gn,{className:"settings-panel",forceMount:!0,value:"observer",children:c(iI,{...e,observerStatusBannerSlot:d})}),c(Gn,{className:"settings-panel",forceMount:!0,value:"queue",children:c(aI,{...e})}),c(Gn,{className:"settings-panel",forceMount:!0,value:"sync",children:c(sI,{...e})})]}),c("div",{className:"small mono",id:"settingsPath",children:r.pathText}),c("div",{className:"small",id:"settingsEffective",children:r.effectiveText}),c("div",{className:"settings-note",hidden:!r.overridesVisible,id:"settingsOverrides",children:"Some values are controlled outside this screen and take priority."}),c("div",{className:"settings-note",hidden:n,children:"Advanced controls are hidden right now to keep this screen focused on everyday settings."})]}),c("div",{className:"modal-footer",children:[c("div",{className:"small",id:"settingsStatus",children:r.statusText}),c("button",{className:"settings-save","data-primary-action":"true",disabled:u,id:"settingsSave",onClick:a,type:"button",children:r.isSaving?"Saving…":"Save changes"})]})]})}function lI(e){const{current:t,baseline:n,envOverrides:r,touchedKeys:o,isProtected:i}=e,a={};return Object.entries(t).forEach(([s,l])=>{i(s)||sn(r,s)&&!o.has(s)||NR(l,n[s])||(a[s]=l)}),a}function dI(e){const t=a=>{const s=CR[a];s&&e.getTouchedKeys().add(s)},n=(a,s)=>{t(a),e.updateFormState({[a]:s}),e.setDirty(!0)};return{markFieldTouched:t,updateField:n,onTextInput:a=>s=>{n(a,s.currentTarget.value)},onSelectValueChange:a=>s=>{n(a,s)},onSwitchInput:a=>s=>{n(a,s)}}}function uI(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=>Wl(String(p))):[],o=Array.isArray(n.live_applied_keys)?n.live_applied_keys.map(p=>Wl(String(p))):[],i=Array.isArray(n.restart_required_keys)?n.restart_required_keys.map(p=>Wl(String(p))):[],a=Array.isArray(n.warnings)?n.warnings.filter(p=>typeof p=="string"&&p.trim().length>0):[],s=Array.isArray(n.manual_actions)?n.manual_actions:[],l=n.sync&&typeof n.sync=="object"?n.sync:{},d=[];r.length&&d.push(`Applied now: ${Kl(r)}.`),o.length&&d.push(`Live settings updated: ${Kl(o)}.`),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}.`),i.length&&d.push(`Restart required for ${Kl(i)}. Run: codemem serve restart`),a.forEach(p=>{d.push(p)}),s.forEach(p=>{p&&typeof p.command=="string"&&p.command.trim()&&d.push(`If needed: ${p.command}.`)}),d.length||d.push("Saved.");const u=i.length>0||a.length>0||l.ok===!1;return{message:d.join(" "),type:u?"warning":"success"}}var pI=()=>OR(V.renderState.values,V.envOverrides),fI=()=>$R(V.renderState.values),mI=()=>MR(V.renderState.values),hI=()=>FR(V.renderState.values),gI=()=>jR(V.renderState.values),vI=()=>BR(V.showAdvanced),{onTextInput:yI,onSelectValueChange:bI,onSwitchInput:_I}=dI({getTouchedKeys:()=>V.touchedKeys,getValues:()=>V.renderState.values,updateFormState:VR,setDirty:e=>La(e)});function wI(){const e=V.renderState.observerStatus;return c(eI,{status:e})}function SI(){const e=V.renderState.values,t=String(b.configDefaults?.observer_max_chars||""),n=e.observerAuthSource==="file",r=e.observerAuthSource==="command",o=e.observerTierRoutingEnabled;return c(cI,{panelProps:{values:e,observerMaxCharsDefault:t,providerOptions:Array.from(new Set(V.renderState.providers.concat(e.observerProvider?[e.observerProvider]:[]))).sort((i,a)=>i.localeCompare(a)).map(i=>({label:i,value:i})),showAuthFile:n,showAuthCommand:r,showTieredRouting:o,hiddenUnlessAdvanced:vI,onTextInput:yI,onSelectValueChange:bI,onSwitchInput:_I,getObserverModelLabel:mI,getObserverModelTooltip:hI,getObserverModelDescription:gI,getObserverModelHint:pI,getTieredRoutingHelperText:fI,protectedConfigHelp:GR},activeTab:V.activeTab,showAdvanced:V.showAdvanced,renderState:V.renderState,settingsDirty:b.settingsDirty,onClose:()=>{V.startPolling&&V.refresh&&$a(V.startPolling,V.refresh)},onSave:()=>{V.startPolling&&V.refresh&&xI(V.startPolling,V.refresh)},onActiveTabChange:WR,onAdvancedToggle:KR,observerStatusBannerSlot:c(wI,{})})}function CI(){return c(oI,{DialogContent:SI,onClose:$a})}function TI(){const e=$e("settingsDialogMount");e&&Ve(c(CI,{}),e)}function Iv(){$e("settingsDialogMount")&&(V.shellMounted||(TI(),V.shellMounted=!0))}function kI(e){V.shellMounted||Iv(),V.open=!0,V.previouslyFocused=document.activeElement,e(),V.controller?.setOpen(!0)}function $a(e,t){if(b.settingsDirty&&!globalThis.confirm("Discard unsaved changes?")){V.controller?.setOpen(!0);return}V.open=!1,V.controller?.setOpen(!1),HR(),(V.previouslyFocused&&typeof V.previouslyFocused.focus=="function"?V.previouslyFocused:Hs("settingsButton"))?.focus(),V.previouslyFocused=null,V.touchedKeys=new Set,e(),t()}async function xI(e,t){if(!V.renderState.isSaving){or({isSaving:!0,statusText:"Saving changes…"});try{const n=lI({current:Pv({allowUntouchedParseErrors:!0}),baseline:V.baseline,envOverrides:V.envOverrides,touchedKeys:V.touchedKeys,isProtected:zR});if(Object.keys(n).length===0){or({isSaving:!1,statusText:"No unsaved changes"}),La(!1),$a(e,t);return}const r=uI(await P_(n));or({isSaving:!1,statusText:"Saved changes"}),La(!1),$a(e,t),Z(r.message,r.type)}catch(n){or({isSaving:!1,statusText:`Save failed: ${n instanceof Error?n.message:"unknown error"}`})}}}function AI(e,t,n){V.startPolling=t,V.refresh=n,Iv(),Hs("settingsButton")?.addEventListener("click",()=>kI(e))}function EI(e){e.dataset.syncRenderRoot="preact"}function NI(){const e=document.getElementById("tab-sync");e&&(e.dataset.syncRenderBoundary="preact-hybrid")}function lt(e,t){EI(e),Ve(t,e)}function jr(e){e.dataset.syncRenderRoot==="preact"&&Ve(null,e)}function PI(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 RI(e){return typeof e=="object"&&e!==null}function II(e,t){return b.pairingCommandRaw="",{payloadText:e,hintText:t}}function DI(e){if(!RI(e))return II("Pairing not available","Enable sync and retry.");const t=e,n={...t,addresses:Array.isArray(t.addresses)?t.addresses:[]},r=JSON.stringify(n),o=`echo '${btoa(r)}' | base64 -d | codemem sync pair --accept-file -`;return b.pairingCommandRaw=o,{payloadText:o,hintText:"Copy this command and run it on the other device. Use --include/--exclude to control which projects sync."}}function LI(){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 OI(){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 $I(){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 MI(){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 FI(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 jI({items:e}){return c(ee,{children:e.map((t,n)=>c("div",{class:"stat",children:c("div",{class:"stat-content",children:[c("div",{class:"value",children:t.value}),c("div",{class:"label",children:t.label})]})},`${t.label}-${n}`))})}function BI({attempts:e,note:t}){return c(ee,{children:[t?c("div",{class:"small",children:t}):null,e.map((n,r)=>c("div",{class:"diag-line",children:[c("div",{class:"left",children:[c("div",{children:[n.peerLabel," — ",n.status]}),n.detail?c("div",{class:"small",children:n.detail}):null,n.actionHref&&n.actionLabel?c("a",{class:"small",href:n.actionHref,children:n.actionLabel}):null]}),c("div",{class:"right",children:n.startedAt})]},`${n.startedAt}-${n.peerLabel}-${r}`))]})}function Dv({text:e}){return c(ee,{children:e})}function UI({title:e,detail:t}){return c("div",{class:"sync-empty-state",children:[c("strong",{children:e}),c("span",{children:t})]})}function GI(e,t){if(!t.length){jr(e);return}lt(e,c(jI,{items:t}))}function HI(e,t,n){if(!t.length){jr(e);return}lt(e,c(BI,{attempts:t,note:n}))}function ir(e,t){lt(e,c(UI,{...t}))}function Lv(e,t,n){lt(e,c(Dv,{text:n.payloadText})),t&<(t,c(Dv,{text:n.hintText}))}function Ov({open:e,onOpenChange:t,triggerId:n,triggerClassName:r,closedLabel:o,openLabel:i,contentId:a,contentClassName:s,contentHost:l=null,children:d}){const u=j(null),p=j(null),f=j(!1);mt(()=>{u.current&&(u.current.id=n,u.current.setAttribute("aria-controls",a)),p.current&&(p.current.id=a)},[a,n,e]),G(()=>{if(!e){f.current=!1;return}f.current||(f.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 m=c(Ei,{forceMount:!0,asChild:!0,children:c("div",{ref:p,id:a,className:s,hidden:!e,children:d})});return c(Ai,{open:e,onOpenChange:t,children:[c(nf,{asChild:!0,children:c("button",{ref:u,type:"button",className:r,id:n,"aria-controls":a,children:e?i:o})}),l?Zt(m,l):m]})}function VI({open:e,onOpenChange:t}){return c(Ov,{open:e,onOpenChange:t,triggerId:"syncToggleAdmin",triggerClassName:"sync-toggle-admin",closedLabel:"Set up a new team instead…",openLabel:"Hide team setup",contentId:"syncInvitePanel",children:[c("h3",{className:"settings-group-title",style:{marginTop:"12px"},children:"Create a team"}),c("div",{className:"section-meta",children:"Generate an invite to share with teammates."}),c("div",{className:"actor-create-row",children:[c("label",{htmlFor:"syncInviteGroup",className:"sr-only",children:"Team name"}),c(ve,{className:"peer-scope-input",id:"syncInviteGroup",placeholder:"Team name (e.g. my-team)",type:"text"}),c("label",{htmlFor:"syncInvitePolicy",className:"sr-only",children:"Join policy"}),c("div",{className:"sync-radix-select-host sync-actor-select-host",id:"syncInvitePolicyMount"}),c("div",{className:"sync-ttl-group",children:[c("label",{htmlFor:"syncInviteTtl",children:"Expires in"}),c(ve,{className:"peer-scope-input",defaultValue:"24",id:"syncInviteTtl",min:"1",style:{width:"64px"},type:"number"}),c("span",{children:"hours"})]}),c("button",{className:"settings-button",id:"syncCreateInviteButton",type:"button",children:"Create invite"})]}),c("label",{htmlFor:"syncInviteOutput",className:"sr-only",children:"Generated invite"}),c(vo,{className:"feed-search",id:"syncInviteOutput",placeholder:"Invite will appear here",readOnly:!0,hidden:!0}),c("div",{className:"peer-meta",id:"syncInviteAdminHint"}),c("div",{className:"peer-meta",id:"syncInviteWarnings",hidden:!0})]})}function WI({contentHost:e,open:t,onOpenChange:n}){return c(Ov,{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:[c("div",{className:"peer-title",children:[c("strong",{children:"Pairing command"}),c("div",{className:"peer-actions",children:c("button",{className:"settings-button",id:"pairingCopy",type:"button",children:"Copy command"})})]}),c("div",{className:"pairing-body",children:c("pre",{id:"pairingPayload",style:{userSelect:"all"}})}),c("div",{className:"peer-meta",id:"pairingHint"})]})}function KI(e,t){lt(e,c(VI,{...t}))}function zI(e,t){lt(e,c(WI,{...t}))}function pe(e){return String(e??"").trim()}function qI(e){return pe(e).replace(/\s+/g," ").toLowerCase()}function JI(e){const t=pe(e);return t?t.slice(0,8):"Unnamed device"}function $v(e){return pe(e?.last_error).toLowerCase()}function Mv(e){return e.includes("401")&&e.includes("unauthorized")}function Fv(e){return["timeout","connection refused","unreachable","aborted","all addresses failed"].some(t=>e.includes(t))}var YI={scope_filter:"sharing-domain membership",visibility_filter:"visibility",project_filter:"project filter"};function jv(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 XI(e){const t=jv(e);return!pe(e.device?.device_id)||e.device?.stale||e.hasAmbiguousCoordinatorGroup?!1:e.pairedLocally?t.state==="needs-your-approval":!0}function Bv(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(o=>o&&o.ok===!1),r=t.filter(o=>Math.max(0,Number(o.opsSkipped??0))>0);if(!n.length){if(r.length){const o=r.reduce((a,s)=>a+Math.max(0,Number(s.opsSkipped??0)),0),i=t0(r.map(a=>a.skipped_out??null));return{ok:!0,message:`${o.toLocaleString()} outbound op${o===1?" was":"s were"} filtered: ${i}. 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(o=>Uv(o)==="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(o=>Uv(o)==="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:pe(n[0]?.error)||"Sync failed for at least one device.",warning:!0}}function Uv(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=pe(e.error);return QI(n)?"trust":ZI(n)?"scope":null}function QI(e){const t=e.toLowerCase();return t.includes("401")&&t.includes("unauthorized")}function ZI(e){const t=e.toLowerCase();return!!(t.includes("scope_rejected")||t.includes("missing_scope")||t.includes("stale_epoch")||t.includes("scope_inactive"))}function e0(e){const t=pe(e?.reason);return YI[t]??(t.replaceAll("_"," ")||"sync filters")}function t0(e){const t=new Map;for(const n of e){const r=e0(n),o=Math.max(0,Number(n?.skipped_count??0));o!==0&&t.set(r,(t.get(r)??0)+o)}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 Gv(e){const t=pe(e.localName);if(t)return t;const n=pe(e.coordinatorName);return n||JI(pe(e.deviceId))}function n0(e){const t=pe(e.localName),n=pe(e.coordinatorName);return t||n?!1:!!pe(e.deviceId)}function r0(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 Ma(e){const t=pe(e?.status?.peer_state);if(t==="offline"||t==="stale")return"offline";const n=$v(e);return Mv(n)?"needs-repair":Fv(n)?"offline":e?.has_error||t==="degraded"?"needs-repair":t==="online"||e?.status?.fresh?"connected":"waiting"}function Hv(e){const t=e?.status||{},n=pe(t.peer_state),r=$v(e),o=pe(t.sync_status)==="ok"||pe(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}:Mv(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}:Fv(r)?{state:"offline",badgeLabel:"Offline",description:"This device is saved here, but none of its last known addresses are responding right now.",isWarning:!0}:o||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 o0={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 i0(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[o,i]of Object.entries(t.by_reason??{})){const a=Math.max(0,Number(i??0));if(a===0)continue;const s=o;r.push({reason:s,label:o0[s]??o,count:a})}return r.sort((o,i)=>i.count-o.count||o.label.localeCompare(i.label)),{total:n,badgeLabel:n===1?"1 sync rejection":`${n.toLocaleString()} sync rejections`,reasons:r,lastAt:t.last_at??null}}function Vv(e){return Array.isArray(e)?e.map(t=>pe(t)).filter(t=>!!t):[]}function Wv(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 Fa(e,t){return e?e.replaceAll("_"," "):t}function a0(e){const t=(Array.isArray(e.authorized_scopes)?e.authorized_scopes:[]).map(r=>{const o=pe(r.scope_id),i=pe(r.label);if(!o&&!i)return null;const a=i||"Untitled Space",s=[Fa(pe(r.kind),"user"),Fa(pe(r.authority_type),"local"),`${Fa(pe(r.role),"member")} role`].filter(Boolean).join(" · ");return{scopeId:o||a,label:a,detail:s}}).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 s0(e){const t=(Array.isArray(e.per_scope_sync)?e.per_scope_sync:[]).map(n=>{const r=pe(n.scope_id),o=pe(n.label);if(!r&&!o)return null;const i=o||"Untitled Space",a=pe(n.last_applied_cursor),s=pe(n.last_acked_cursor),l=n.bootstrapped===!0||a?"received":"pending",d=Fa(pe(n.authority_type),"local"),u=Number(n.membership_epoch??0),p=[`Scope id: ${r||"unknown"}`,`${d} authority`,Number.isFinite(u)?`membership epoch ${u}`:null,a?`last applied ${a}`:null,s?`last acknowledged ${s}`:null].filter(f=>!!f).join(" · ");return{scopeId:r||i,label:i,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 c0=["personal","private","home","mine","me"],l0=["oss","open source","opensource","community","public"],d0=["work","client"],u0=["local","legacy","review"];function p0(e){return[e.scope_id,e.label,e.kind,e.authority_type].map(t=>pe(t)??"").join(" ").toLowerCase()}function f0(e){return[e.scope_id,e.label,e.kind].map(t=>pe(t)??"").join(" ").toLowerCase()}function Kv(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ql(e,t){const n=p0(e);return t.some(r=>{const o=Kv(r.toLowerCase());return new RegExp(`(^|[^a-z0-9])${o}([^a-z0-9]|$)`).test(n)})}function zv(e){return ql(e,c0)||ql(e,l0)}function m0(e){const t=f0(e);return u0.some(n=>{const r=Kv(n.toLowerCase());return new RegExp(`(^|[^a-z0-9])${r}([^a-z0-9]|$)`).test(t)})}function h0(e){return!zv(e)&&(!m0(e)||ql(e,d0))}function g0(e){const t=Array.isArray(e.authorized_scopes)?e.authorized_scopes:[];if(!(pe(e.discovered_via_group_id)||pe(e.discovered_via_coordinator_id))||t.length===0)return{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""};const n=t.some(zv),r=t.some(h0);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 v0(e,t){const n=e.map(r=>r.trim()).filter(Boolean);return n.length>0&&!n.includes("*")||t.length>0}function y0(e){const t=Vv(e?.effective_include),n=Vv(e?.effective_exclude),r=e?.inherits_global?"Global defaults":"Device override",o=`Include filter: ${Wv(t,"all projects")}`,i=`Exclude filter: ${Wv(n,"no exclusions")}`,a=v0(t,n);return{hasAdvancedFilters:a,statusLabel:a?"Advanced filters active":"No advanced filters",sourceLabel:r,includeLabel:o,excludeLabel:i,summary:`${r}. ${o}; ${i}.`,note:"Advanced filters only narrow data after Space access; they never grant access to another Space."}}function b0(e){const t=new Map;return(Array.isArray(e)?e:[]).forEach(n=>{const r=pe(n?.display_name),o=pe(n?.actor_id),i=qI(r);if(!r||!o||!i)return;const a=t.get(i)??{displayName:r,actorIds:[],includesLocal:!1};a.actorIds=[...a.actorIds,o],a.includesLocal=a.includesLocal||!!n?.is_local,t.set(i,a)}),[...t.values()].filter(n=>n.actorIds.length>1).sort((n,r)=>n.displayName.localeCompare(r.displayName))}function qv(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.duplicatePeople)?e.duplicatePeople:[],o=new Map;n.forEach(a=>{const s=pe(a?.actor_id);s&&o.set(s,(o.get(s)??0)+1)});const i=new Set;return r.forEach(a=>{a.includesLocal&&a.actorIds.forEach(s=>{const l=t.find(d=>pe(d?.actor_id)===s);!l||l.is_local||(o.get(s)??0)>0||i.add(s)})}),{visibleActors:t.filter(a=>!i.has(pe(a?.actor_id))),hiddenLocalDuplicateCount:i.size}}function _0(e){return e.discovered?.stale?e.peer?Ma(e.peer)!=="connected":!0:!1}function Jv(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 Jl(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 w0(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 S0(e){const t=pe(e?.coordinator_url),n=Array.isArray(e?.groups)?e.groups:[];return t?n.some(r=>pe(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 C0(e,t){const n=new Map,r=o=>{const i=n.get(o)??{deviceId:o,localName:"",coordinatorName:"",peer:null,discovered:null};return n.set(o,i),i};return e.forEach(o=>{const i=pe(o?.peer_device_id);if(!i)return;const a=r(i);a.peer=o,a.localName=pe(o?.name)}),t.forEach(o=>{const i=pe(o?.device_id);if(!i)return;const a=r(i);a.discovered=o,a.coordinatorName=pe(o?.display_name)}),[...n.values()]}function T0(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:[],o=C0(n,r),i=e.duplicatePersonDecisions??{},a=b0(t).filter(l=>!i[[...l.actorIds].sort().join("::")]),s=[];return a.forEach(l=>{s.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})}),o.forEach(l=>{const d=Gv({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId}),u=l.peer?Ma(l.peer):"waiting",p=l.peer?Hv(l.peer):null,f=pe(l.discovered?.fingerprint),m=pe(l.peer?.fingerprint);if(l.peer&&f&&m&&f!==m){s.push(Jv({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 v=p?.description||pe(l.peer?.last_error)||"Sync needs review.";s.push(Jv({id:l.deviceId,name:d,title:p?.state==="needs-repairing"?`${d} needs re-pairing`:`${d} needs review`,summary:v}))}l.peer&&p?.state==="trusted-by-you"&&s.push(Jl({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&&s.push(Jl({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&&s.push(Jl({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&&n0({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId})&&s.push(w0({id:l.deviceId,name:d,summary:"Give this device a friendly name so it is easier to recognize later."}))}),{summary:{connectedDeviceCount:n.filter(l=>Ma(l)==="connected").length,seenOnTeamCount:r.length,offlineTeamDeviceCount:o.filter(l=>_0(l)).length},duplicatePeople:a,attentionItems:s.sort((l,d)=>l.priority-d.priority||l.title.localeCompare(d.title))}}var Yv={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 An(e){const t=document.getElementById(e);t&&t.remove()}var Xv=!1;function k0(e){Xv=e}var Yl=!1;function x0(e){Yl=e}var Xl=!1;function A0(e){Xl=e}var E0=new Set,Ql=new Set,Zl=new Set,Qv="codemem-sync-duplicate-person-decisions";function N0(e){const t=String(e||"").trim();t&&(Ql.add(t),Zl.add(t),E0.add(t))}function ed(e){const t=String(e||"").trim();return!!t&&Ql.has(t)}function P0(e){const t=String(e||"").trim();t&&Ql.delete(t)}function R0(e){const t=String(e||"").trim();return!t||!Zl.has(t)?!1:(Zl.delete(t),!0)}function td(){try{const e=localStorage.getItem(Qv);if(!e)return{};const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Zv(e){try{localStorage.setItem(Qv,JSON.stringify(e))}catch{}}function ey(e){return[...e].map(t=>String(t||"").trim()).filter(Boolean).sort().join("::")}function I0(){return td()}function D0(e,t){const n=ey(e);if(!n)return;const r=td();r[n]=t,Zv(r)}function L0(e){const t=ey(e);if(!t)return;const n=td();delete n[t],Zv(n)}function ty(e){return e.replace(/\b(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}\b/g,"$1.#.#")}function ny(e){const t=String(e||"");return t?ty(t):""}function O0(e){if(!Array.isArray(e))return"";const t=Array.from(new Set(e.filter(Boolean)));return typeof t[0]=="string"?t[0]:""}function $0(e,t){const n=String(e?.relatedPeerDeviceId??"").trim();return n?t.some(r=>String(r?.peer_device_id??"").trim()===n):!1}function ja(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 Ba(e){return!e||typeof e!="object"?"Unknown person":e.is_local?"You":ja(e)}function M0(e){return(Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[]).filter(t=>String(t?.actor_id||"")===e).length}function ry(){return qv({actors:b.lastSyncActors,peers:b.lastSyncPeers,duplicatePeople:b.lastSyncViewModel?.duplicatePeople}).visibleActors}function F0(e=""){const t=[{value:"",label:"No person assigned"}],n=ry(),r=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).find(o=>String(o?.actor_id||"")===e);return(r&&!n.some(o=>String(o?.actor_id||"")===e)?[...n,r]:n).forEach(o=>{const i=String(o?.actor_id||"").trim();i&&t.push({value:i,label:Ba(o)})}),t.filter((o,i,a)=>i===a.findIndex(s=>s.value===o.value))}function oy(e){return ry().filter(t=>String(t?.actor_id||"")!==e)}function j0(e,t){const n=oy(t).find(r=>String(r?.actor_id||"")===e);return!e||!n?"Choose which person should keep these devices.":`Merge into ${Ba(n)}. Assigned devices move now; existing memories keep their current provenance.`}function nd(e,t){if(e){if(e.textContent="",!t.length){e.hidden=!0;return}e.hidden=!1,t.slice(0,2).forEach(n=>{const r=Ti("div","sync-action"),o=Ti("div","sync-action-text");o.textContent=n.label,o.appendChild(Ti("span","sync-action-command",n.command));const i=Ti("button","settings-button sync-action-copy","Copy");i.addEventListener("click",()=>ro(n.command,i)),r.append(o,i),e.appendChild(r)})}}function iy(e,t){return t&&e.error_redacted===!0}function ay(){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){ir(e,$I());return}const r=FI(n,t.slice(0,5).some(o=>o.status==="error"));HI(e,t.slice(0,5).map(o=>{const i=o.started_at||o.started_at_utc||"",a=String(o.peer_device_id||"").trim(),s=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers.find(f=>String(f?.peer_device_id||"")===a):null,l=String(s?.name||"").trim()||(a?a.slice(0,8):"unknown"),d=o.status==="error",u=[],p=oo();if(d&&o.error){const f=String(o.error);u.push(p?ty(f):f),iy(o,p)&&u.push("Turn off Redact in Advanced diagnostics to reveal the full error.")}return!d&&(o.ops_in||o.ops_out)&&u.push(`${o.ops_in??0} in · ${o.ops_out??0} out`),!p&&o.address&&u.push(o.address),{status:o.status||"unknown",peerLabel:l,detail:u.join(" · "),startedAt:i?Xn(i):"",...iy(o,p)?{actionHref:"#sync/diagnostics",actionLabel:"Open Advanced diagnostics Redact setting"}:{}}}),r)}function B0(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncAttempts"),n=document.getElementById("syncMeta"),r=document.getElementById("syncActions");e&&ir(e,OI()),t&&ir(t,MI()),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."),nd(r,[])}function Br(e){const t=Number(e??0);return Number.isFinite(t)?t:0}function U0(e){const t=String(e?.state??"clear"),n=e?.stale_peer_rows??{},r=e?.access_cleanup_ops??{},o=Br(n.would_remove),i=Br(n.ambiguous),a=Br(r.applied),s=Br(r.source_authored);return t==="cleanup_pending"||o>0?`${o} pending removal`:t==="needs_review"||i>0?`${i} needs review`:t==="cleanup_applied"||a>0?`${a} applied`:t==="cleanup_announced"||s>0?`${s} announced`:"Clear"}function sy(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncMeta"),n=document.getElementById("syncActions");if(!e)return;An("syncDiagSkeleton");const r=b.lastSyncStatus;if(!r){ir(e,LI()),nd(n,[]),t&&(t.textContent="Loading advanced sync diagnostics…");return}const o=r.peers||{},i=r.ping||{},a=r.sync||{},s=r.last_sync_at||r.last_sync_at_utc||null,l=i.last_ping_at||r.last_ping_at||PI(o)||null,d=r.last_sync_error||"",u=r.last_ping_error||"",p=Number(r.pending||0),f=String(r.daemon_detail||""),m=String(r.daemon_state||"unknown"),v=r.retention||{},g=r.cleanup_diagnostics,y=g?.stale_peer_rows??{},_=Br(y.would_remove),w=Br(y.ambiguous),C=v.enabled===!0,T=Number(v.last_deleted_ops||0),x=v.last_run_at||null,E=String(v.last_error||""),L=m==="offline-peers"?"Offline peers":m==="needs_attention"?"Needs attention":m==="rebootstrapping"?"Rebootstrapping":Ah(m),F=m==="disabled"||r.enabled===!1,H=Object.keys(o).length,R=!F&&H===0;if(t){const N=F?["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"]:R?["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: ${L}`,`Peers: ${H}`,s?`Last sync: ${Sn(Ir(s))} ago`:"Last sync: never"];m==="offline-peers"&&N.push("All peers are currently offline; sync will resume automatically"),f&&m==="stopped"&&N.push(`Detail: ${f}`),f&&(m==="needs_attention"||m==="rebootstrapping")&&N.push(`Detail: ${f}`),C&&N.push(x?`Retention last ran ${Sn(Ir(x))} ago (approx oldest-first)`:"Retention enabled"),_>0?N.push(`${_.toLocaleString()} stale peer rows pending cleanup`):w>0&&N.push(`${w.toLocaleString()} stale peer rows retained because safe cleanup could not be proven`),t.textContent=N.join(" · ")}const U=F?[{label:"State",value:"Disabled"},{label:"Mode",value:"Optional"},{label:"Pending events",value:p},{label:"Last sync",value:"Not running"}]:R?[{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:L},{label:"Pending events",value:p},{label:"Last sync",value:s?`${Sn(Ir(s))} ago`:"never"},{label:"Last peer ping",value:l?`${Sn(Ir(l))} ago`:"never"},{label:"Retention",value:C?x?`${T.toLocaleString()} ops last run (approx)`:"Enabled":"Disabled"}];!F&&!R&&(d||u)&&U.push({label:[d,u].filter(Boolean).join(" · "),value:"Errors"}),!F&&!R&&a.seconds_since_last&&U.push({label:"Since last sync",value:`${a.seconds_since_last}s`}),!F&&!R&&i.seconds_since_last&&U.push({label:"Since last peer ping",value:`${i.seconds_since_last}s`}),!F&&C&&E&&U.push({label:E,value:"Retention"}),!F&&!R&&g&&U.push({label:"Cleanup",value:U0(g)}),GI(e,U);const B=[];R||m==="offline-peers"||(m==="stopped"?(B.push({label:"Sync daemon is stopped. Start it.",command:"codemem serve start"}),B.push({label:"Run one sync pass now.",command:"codemem sync once"})):m==="needs_attention"?B.push({label:"Sync needs manual attention before reset can continue.",command:"codemem sync doctor"}):m==="rebootstrapping"?B.push({label:"Sync is rebuilding state in the background.",command:"codemem sync status"}):d||u||m==="error"?(B.push({label:"Sync reports errors. Restart now.",command:"codemem serve restart && codemem sync once"}),B.push({label:"Run doctor for the root cause.",command:"codemem sync doctor"})):!F&&!R&&p>0&&B.push({label:"Pending sync work detected. Run one pass now.",command:"codemem sync once"})),!F&&w>0?B.push({label:"Some stale peer rows were retained because cleanup was ambiguous.",command:"codemem sync doctor"}):!F&&_>0&&B.push({label:"Stale peer rows are eligible for cleanup. Run one sync pass now.",command:"codemem sync once"}),nd(n,B)}var G0="syncRedactMount",H0="syncRedactLabel",cy=()=>{};function V0(e){cy=e}var rd=()=>{};function od(){const e=document.getElementById("syncPairingDisclosureMount"),t=document.getElementById("syncPairingPanelMount");if(!e||!t)return;zI(e,{contentHost:t,open:b.syncPairingOpen,onOpenChange:r=>{if($w(r),od(),r){const o=document.getElementById("pairingPayload"),i=document.getElementById("pairingHint");o&&Lv(o,i,{payloadText:"Loading…",hintText:"Fetching pairing payload…"})}rd()}});const n=document.getElementById("pairingCopy");n&&(n.onclick=async()=>{const r=b.pairingCommandRaw;r&&await ro(r,n)})}function id(){od();const e=document.getElementById("pairingPayload"),t=document.getElementById("pairingHint");if(!e)return;Lv(e,t,DI(b.pairingPayloadRaw));const n=document.getElementById("pairingCopy");n&&(n.disabled=!b.pairingCommandRaw)}function ly(){const e=document.getElementById(G0);e&<(e,h(Er,{"aria-labelledby":H0,checked:oo(),className:"sync-redact-switch",id:"syncRedact",onCheckedChange:t=>{Mw(t),ly(),rd(),sy(),cy(),ay(),id()},thumbClassName:"sync-redact-switch-thumb"}))}function W0(e){rd=e,od(),ly()}function K0(e){e.classList.add("sync-shake"),e.addEventListener("animationend",()=>e.classList.remove("sync-shake"),{once:!0})}function Ua(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),K0(e),e.addEventListener("input",()=>Wo(e),{once:!0}),!1}function Wo(e){e.classList.remove("sync-field-error");const t=e.parentElement?.querySelector(".sync-field-hint");t&&t.remove()}function Je(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}function dy({title:e,detail:t}){return c("div",{className:"sync-empty-state",role:"status","aria-live":"polite","aria-atomic":"true",children:[c("strong",{children:e}),c("span",{children:t})]})}function z0(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 q0({actor:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:o}){const i=String(e.actor_id||""),a=ja(e),s=M0(i),l=oy(i),d=l.map(B=>String(B.actor_id||"")).join("|"),[u,p]=O(a),[f,m]=O(!1),[v,g]=O("Rename"),[y,_]=O(!1),[w,C]=O("Merge into selected person"),[T,x]=O(""),[E,L]=O(!1);G(()=>{p(a),m(!1),g("Rename"),_(!1),C("Merge into selected person"),x(""),L(!1)},[i,s,t,a,d]);const F=l.length?j0(T,i):"No other people are available yet. Create another person first if you need to merge duplicates.",H=[{label:"Merge into person",value:""},...l.map(B=>{const N=String(B.actor_id||"");return{label:B.is_local?Ba(B):ja(B),value:N}})];async function R(){const B=u.trim();if(!B)return;m(!0),g("Saving…");let N=!1;try{await n(i,B),N=!0}catch{g("Retry rename")}finally{m(!1),N&&g("Rename")}}async function U(){if(!T)return;const B=l.find(P=>String(P.actor_id||"")===T);if(!B||!await Gt({title:`Merge ${a} into ${ja(B)}?`,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),C("Merging…");let N=!1;try{await r(T,i),N=!0}catch{C("Retry merge")}finally{_(!1),N&&C("Merge into selected person")}}return c("div",{className:"actor-row",children:[c("div",{className:"actor-details",children:[c("div",{className:"actor-title",children:[c("strong",{children:Ba(e)}),c("span",{className:`badge actor-badge${e.is_local?" local":""}`,title:e.is_local?z0(t):void 0,children:e.is_local?"You":`${s} device${s===1?"":"s"}`})]}),e.is_local?null:c("div",{className:"peer-meta",children:[s," assigned device",s===1?"":"s"]})]}),c("div",{className:"actor-actions",children:e.is_local?c("div",{className:"peer-meta",children:"Rename yourself in config"}):c(ee,{children:[c(ve,{"aria-label":`Rename ${a}`,className:"peer-scope-input actor-name-input",disabled:f||y,type:"text",value:u,onInput:B=>p(B.currentTarget.value),onKeyDown:B=>vr(B,{onSubmit:()=>{R()},disabled:f||y||!u.trim()})}),c("button",{type:"button",className:"settings-button","data-primary-action":"true",disabled:f||y,onClick:()=>{R()},children:v}),c("button",{type:"button",className:"settings-button danger",disabled:f||y,onClick:async()=>{await Gt({title:`Remove ${a}?`,description:"This deactivates the person and unassigns their devices. Existing memories keep their current attribution.",confirmLabel:"Remove person",cancelLabel:"Keep",tone:"danger"})&&await o(i)},children:"Remove"}),c("button",{type:"button",className:"settings-button",disabled:f||y,onClick:()=>L(B=>!B),children:E?"Hide duplicate cleanup":"Show duplicate cleanup"}),E?c(ee,{children:[c("div",{className:"peer-meta actor-merge-note",children:"Use this only when combining duplicate people into one."}),c("div",{className:"actor-merge-controls",children:[c(an,{ariaLabel:`Merge ${a} into another person`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:y||l.length===0,itemClassName:"sync-radix-select-item",onValueChange:x,options:H,placeholder:"Merge into person",triggerClassName:"sync-radix-select-trigger sync-actor-select actor-merge-select",value:T,viewportClassName:"sync-radix-select-viewport"}),c("button",{type:"button",className:"settings-button",disabled:y||l.length===0||!T,onClick:()=>{U()},children:w})]}),c("div",{className:"peer-meta actor-merge-note",children:F})]}):null]})})]})}function J0({actors:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:o}){return e.length?c(ee,{children:e.map(i=>{const a=String(i.actor_id||i.display_name||i.is_local||"");return c(q0,{actor:i,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:o},a)})}):c(dy,{detail:"Create a named person here, then assign devices below so team ownership stays readable.",title:"No people set up yet."})}function Y0(e,t){lt(e,c(J0,{...t}))}function X0(e){return e.filter(t=>String(t.origin_device_id||"").trim())}function Q0(e){const t=e.find(n=>String(n.last_seen_at||"").trim());return t?.last_seen_at?`Detected from older synced memories. Latest memory: ${Xn(String(t.last_seen_at).trim())}`:"Detected from older synced memories not yet attached to a current device."}function Z0({devices:e}){return c(ee,{children:Q0(e)})}function eD(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 tD(e){const t=X0(e.devices);if(!t.length){e.panel.hidden=!0,e.onValueChange(""),jr(e.mount),jr(e.meta);return}const n=t.map(eD),r=n.some(o=>o.value===e.value)?e.value:n[0]?.value||"";r!==e.value&&e.onValueChange(r),e.panel.hidden=!1,lt(e.mount,c(an,{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"})),lt(e.meta,c(Z0,{devices:t}))}var nD={online:"Online",offline:"Offline",degraded:"Degraded",attention:"Action required",syncing:"Syncing",unknown:"Status unknown"};function rD({state:e,size:t=8,"aria-label":n}){return c("span",{"aria-label":n??nD[e],className:`presence-pip presence-pip--${e}`,role:"img",style:`--presence-pip-size: ${t}px`})}function ar({feedback:e}){return e?.message?c("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 oD(){return c("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:[c("title",{children:"Chevron"}),c("path",{d:"m9 18 6-6-6-6"})]})}function iD(e){switch(Ma(e)){case"connected":return"online";case"offline":return"offline";case"needs-repair":return"attention";default:return"unknown"}}var Ga=null,uy=0,ad=new Set;function py(e){if(Ga!==e){Ga=e,uy+=1;for(const t of ad)t(uy)}}function aD(){const[,e]=O(0);return G(()=>(ad.add(e),()=>{ad.delete(e)}),[]),Ga}var sD={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 cD(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 lD(){window.location.hash="coordinator-admin"}function sd(e=b.lastCoordinatorAdminStatus){return e?.readiness==="ready"&&e.has_admin_secret===!0}function dD({peer:e,onAssignActor:t,onRemove:n,onRename:r,onSync:o}){const i=String(e.peer_device_id||""),a=e.name||(i?i.slice(0,8):"unknown"),s=e.name||i||a,l=Hv(e),d=sD[r0(e)],u=e.status||{},p=a0(e),f=ed(i),m=f&&p.total===0,v=g0(e),g=i0(e),y=s0(e),_=y0(e.project_scope||{}),w=O0(e.addresses),C=Array.isArray(e.addresses)?Array.from(new Set(e.addresses.filter(Boolean).map(re=>String(re)))):[],T=Number(e.address_count??0),x=Number.isFinite(T)&&T>0?T:0,E=C.length?C.map(re=>oo()?ny(re):re).join(" · "):x>0?`${x} ${x===1?"address":"addresses"} hidden`:"No addresses",L=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.",F=String(u.last_sync_at||u.last_sync_at_utc||""),H=String(u.last_ping_at||u.last_ping_at_utc||""),R=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,U=R0(i),B=j(null),[N,P]=O(a),[X,z]=O(()=>b.syncPeerFeedbackById.get(i)??null),[k,D]=O(!1),[I,K]=O("Save name"),[me,ue]=O(!1),[ie,xe]=O(!1),[Se,Te]=O("Remove device"),[Y,we]=O(String(e.actor_id||"")),[ae,Q]=O(!1),[Ae,ce]=O("Save assignment"),De=Ne(()=>{const re=F0(Y),Be=re.some(Rn=>Rn.value===Y);return Y&&!Be&&re.push({value:Y,label:e.claimed_local_actor?"You":String(e.actor_display_name||"Current assignment")}),re},[e.actor_display_name,e.claimed_local_actor,Y,b.lastSyncActors,b.lastSyncPeers,b.lastSyncViewModel]);G(()=>{f&&p.total>0&&P0(i)},[p.total,i,f]),G(()=>{P(a),z(b.syncPeerFeedbackById.get(i)??null),D(!1),K("Save name"),ue(!1),xe(!1),Te("Remove device"),we(String(e.actor_id||"")),Q(!1),ce("Save assignment")},[a,e.actor_id,i]),G(()=>{!U||!B.current||queueMicrotask(()=>B.current?.scrollIntoView({block:"center",behavior:window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"}))},[U]);async function se(){if(!i)return;const re=N.trim();if(!re){const Be={message:"Enter a friendly name for this device.",tone:"warning"};z(Be),b.syncPeerFeedbackById.set(i,Be),document.querySelector(`[data-device-name-input="${CSS.escape(i)}"]`)?.focus();return}D(!0),K("Saving…");try{const Be=await r(i,re);z(Be),b.syncPeerFeedbackById.set(i,Be),K("Save name")}catch{K("Retry")}finally{D(!1)}}async function Ye(){if(m){const re=sd();if(!await Gt({title:`Sync ${a} before advanced rule review?`,description:re?"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:re?"Review in Teams first":"Cancel"}))return}ue(!0);try{const re=await o(e,w);z(re),re&&b.syncPeerFeedbackById.set(i,re)}finally{ue(!1)}}async function pt(){if(!i||!await Gt({title:`Remove device ${s}?`,description:"This removes the local record for this paired device on this machine.",confirmLabel:"Remove device",cancelLabel:"Keep device",tone:"danger"}))return;xe(!0),Te("Removing…");let re=!1;try{await n(i,s),re=!0}catch{Te("Retry remove")}finally{xe(!1),re&&Te("Remove device")}}async function Xe(){if(i){Q(!0),ce("Saving…");try{const re=await t(i,Y||null);z(re),b.syncPeerFeedbackById.set(i,re),ce("Save assignment")}catch{ce("Retry")}finally{Q(!1)}}}const cn=aD()===i&&i!=="",It=`device-drawer-${i||"unknown"}`,Ct=iD(e),Dt=F?`Sync: ${Xn(F)}`:"Sync: never",Qe=sd(),Lt=`${cn?"Collapse":"Expand"} device ${a}`;return c(Ai,{asChild:!0,open:cn,onOpenChange:re=>{re?py(i):Ga===i&&py(null)},children:c("div",{ref:B,className:"peer-card","data-peer-device-id":i||void 0,children:[c(nf,{asChild:!0,children:c("button",{"aria-label":Lt,className:"device-row-head device-row-head--trigger",type:"button",children:[c(rD,{state:Ct}),c("span",{className:"device-row-name",title:i||void 0,children:a}),d?c("span",{"aria-label":d.label,className:"peer-direction",role:"img",title:d.label,children:d.glyph}):null,c("span",{className:"device-row-chips",children:[c("span",{className:`badge ${l.isWarning?"badge-offline":"badge-online"}`,children:l.badgeLabel}),m?c("span",{className:"badge actor-badge",children:"Review advanced rules"}):null,c("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}),g.badgeLabel?c("span",{className:"badge badge-offline",title:"Inbound ops rejected by the sharing-domain scope gate. Expand for reason codes.",children:g.badgeLabel}):null,v.badgeLabel?c("span",{className:"badge badge-offline",title:"Review whether explicit Space access matches this device's intended role.",children:v.badgeLabel}):null,e.discovered_via_group_id?c("span",{className:"badge actor-badge",title:`Discovered through coordinator group ${e.discovered_via_group_id}`,children:`via ${e.discovered_via_group_id}`}):null]}),c("span",{className:"device-row-meta",children:Dt}),c("span",{"aria-hidden":"true",className:"device-row-chevron",children:c(oD,{})})]})}),c(Ei,{"aria-label":`Device actions for ${a}`,className:"device-row-drawer",id:It,children:[c("div",{className:"peer-actions",children:[c("button",{type:"button",className:"settings-button",disabled:me,onClick:()=>{Ye()},title:w?void 0:"Address details are hidden; sync will target this device by ID.",children:me?"Syncing…":"Sync now"}),c("div",{className:"sync-labeled-field",children:[c("label",{className:"sync-labeled-field-caption",htmlFor:`device-name-${i||"unknown"}`,children:"Device name"}),c(ve,{"aria-label":`Friendly name for ${a}`,className:"peer-scope-input","data-device-name-input":i||void 0,disabled:k,id:`device-name-${i||"unknown"}`,placeholder:"Friendly device name",type:"text",value:N,onInput:re=>P(re.currentTarget.value)})]}),c("button",{type:"button",className:"settings-button",disabled:k,onClick:()=>{se()},children:I}),c("button",{type:"button",className:"settings-button danger",disabled:ie,onClick:()=>{pt()},children:Se})]}),c("div",{className:"peer-scope",children:[U?c("div",{className:"peer-meta",children:Qe?"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."}):m?c("div",{className:"peer-meta",children:"Advanced rule review is still pending for this device."}):null,c("div",{className:"peer-scope-summary",children:"Device details"}),c("div",{className:"peer-addresses",children:E}),R?c("div",{className:"peer-meta",children:R}):null,c("div",{className:"peer-meta",children:[F?`Sync: ${Xn(F)}`:"Sync: never",H?`Ping: ${Xn(H)}`:"Ping: never"].join(" · ")}),c("div",{className:"peer-scope-summary",children:"Space access"}),c("div",{className:"peer-meta",children:p.total>0?"These Spaces are the hard access boundary for this device.":p.emptyMessage}),p.domains.length>0?c("ul",{className:"peer-scope-chips","aria-label":"Authorized Spaces",children:p.domains.map(re=>c("li",{className:"peer-scope-chip",title:re.detail,children:re.label},re.scopeId))}):null,v.isVisible?c("div",{className:"settings-note",role:"status",children:[c("strong",{children:v.title}),c("div",{children:v.message}),c("div",{children:v.detail})]}):null,c("div",{className:"peer-meta",children:_.note}),c("div",{className:"peer-scope-summary",children:"Space sync progress"}),c("div",{className:"peer-meta",children:y.total>0?"Per-Space progress for this device. Open details to see technical identifiers.":y.emptyMessage}),y.rows.length>0?c("ul",{className:"peer-scope-rejections-list","aria-label":"Per-Space sync progress",children:y.rows.map(re=>c("li",{title:re.detail,children:[c("span",{className:"peer-scope-rejection-label",children:re.label}),c("span",{className:`badge ${re.status==="received"?"badge-online":"actor-badge"}`,children:re.badgeLabel})]},re.scopeId))}):null,g.total>0?c("div",{className:"peer-scope-rejections","data-peer-rejection-count":g.total,children:[c("div",{className:"peer-scope-summary",children:"Sharing-rule rejections (24h)"}),c("div",{className:"peer-meta",children:"Inbound ops the local fail-closed gate refused. Diagnostics never expose op payloads."}),c("ul",{className:"peer-scope-rejections-list",children:g.reasons.map(re=>c("li",{children:[c("span",{className:"peer-scope-rejection-label",children:re.label}),c("span",{className:"peer-scope-rejection-count",children:re.count.toLocaleString()})]},re.reason))}),g.lastAt?c("div",{className:"peer-meta",children:["Last rejected ",Xn(g.lastAt)]}):null]}):null,c("div",{className:"peer-scope-summary",children:"Who this device belongs to"}),c("div",{className:"peer-meta",children:L}),e.claimed_local_actor?c("div",{className:"peer-meta",children:cD(e.claimed_local_actor_scope)}):null,c("div",{className:"peer-actor-row",children:[c("div",{className:"sync-radix-select-host sync-actor-select-host",children:c(an,{ariaLabel:`Assigned person for ${a}`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:ae,itemClassName:"sync-radix-select-item",onValueChange:we,options:De,placeholder:"No person assigned yet",triggerClassName:"sync-radix-select-trigger sync-actor-select",value:Y,viewportClassName:"sync-radix-select-viewport"})}),c("button",{type:"button",className:"settings-button",disabled:ae,onClick:()=>{Xe()},children:Ae})]}),c("div",{className:"peer-scope-summary",children:"Advanced sharing rules"}),c("div",{className:"peer-meta",children:[_.statusLabel,". ",_.summary," ",_.note]}),Qe?c("div",{className:"peer-actions",children:c("button",{type:"button",className:"settings-button",onClick:lD,children:"Manage Spaces in Teams"})}):c("div",{className:"peer-meta",children:"Space access is managed in Teams by a coordinator or manager."}),c(ar,{feedback:X})]})]})]})})}function uD(e){const t=b.syncPeersSectionFeedback,n=b.lastSyncStatus,r=n?.daemon_state==="disabled"||n?.enabled===!1;return e.peers.length?c(ee,{children:[c(ar,{feedback:t}),e.peers.map(o=>{const i=String(o.peer_device_id||o.name||"unknown-peer");return c(dD,{peer:o,...e},i)})]}):c(ee,{children:[c(ar,{feedback:t}),c(dy,{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 pD(e,t){lt(e,c(uD,{...t}))}var En=async()=>{},Ha="";function cd(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput");t&&(t.disabled=e),n&&(n.disabled=e)}function fD(e){En=e}function mD(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");if(!e)return;An("syncActorsSkeleton"),cd(!1);const n=qv({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.`)),Y0(e,{actors:r,hiddenLocalDuplicateCount:n.hiddenLocalDuplicateCount,onRename:async(o,i)=>{await yw(o,i),await En()},onMerge:async(o,i)=>{try{await Sp(o,i),Z("People combined. Assigned devices moved to the selected person."),await En()}catch(a){throw Z(Je(a,"Failed to combine people."),"warning"),a}},onDeactivate:async o=>{try{await bw(o),Z("Person removed. Assigned devices have been unassigned."),await En()}catch(i){throw Z(Je(i,"Failed to remove person."),"warning"),i}}})}function hD(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");cd(!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&&ir(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. When the people endpoint responds again, named people will reload here."})}function ld(){const e=document.getElementById("syncPeers");if(!e)return;An("syncPeersSkeleton");const t=b.lastSyncPeers,n=Array.isArray(t)?t:[];$0(b.syncPeersSectionFeedback,n)&&(b.syncPeersSectionFeedback=null),pD(e,{peers:n,onRename:async(r,o)=>{try{return await bp(r,o),await En(),{message:"Device name saved.",tone:"success"}}catch(i){return{message:Je(i,"Failed to save device name."),tone:"warning"}}},onSync:async(r,o)=>{try{const i=String(r?.peer_device_id||""),a=Bv(await Us({address:o,peerDeviceId:i||void 0}));let s;a.ok?i&&ed(i)?s={message:`Triggered sync for ${r?.name||(i?i.slice(0,8):"unknown")}. ${sd()?"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"}:s={message:a.message,tone:"success"}:s={message:a.message,tone:"warning"};try{await En()}catch{s={message:"Sync started, but this view has not refreshed yet. Refresh the page or use Sync now again before retrying.",tone:"warning"}}return s}catch(i){return{message:Je(i,"Failed to trigger sync."),tone:"warning"}}},onRemove:async(r,o)=>{try{await yp(r);const i={message:`Removed peer ${o}.`,tone:"success"};return b.syncPeerFeedbackById.delete(r),b.syncPeersSectionFeedback={...i,relatedPeerDeviceId:r},await En(),i}catch(i){return{message:Je(i,"Failed to remove peer. The local peer entry is still here."),tone:"warning"}}},onAssignActor:async(r,o)=>{try{return await iw(r,o),await En(),{message:o?"Device assignment updated.":"Device assignment cleared.",tone:"success"}}catch(i){return{message:Je(i,"Failed to update device assignment. The current assignment is unchanged."),tone:"warning"}}}})}function gD(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta"),n=document.getElementById("syncPeers");cd(!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&&ir(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&&ir(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 fy(){const e=document.getElementById("syncLegacyClaims"),t=document.getElementById("syncLegacyDeviceSelectMount"),n=document.getElementById("syncLegacyClaimsMeta");!e||!t||!n||tD({devices:Array.isArray(b.lastSyncLegacyDevices)?b.lastSyncLegacyDevices:[],meta:n,mount:t,onValueChange:r=>{r!==Ha&&(Ha=r,fy())},panel:e,value:Ha})}function vD(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput"),r=document.getElementById("syncLegacyClaimButton");n?.addEventListener("keydown",o=>{vr(o,{onSubmit:()=>t?.click(),disabled:!t||t.disabled})}),t?.addEventListener("click",async()=>{if(!t||!n)return;const o=String(n.value||"").trim();if(!o){Ua(n,"Enter a name for the person.");return}Wo(n),t.disabled=!0,n.disabled=!0,t.textContent="Creating…";try{await vw(o),Z("Person created."),n.value="",await e()}catch(i){Z(Je(i,"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 o=String(Ha||"").trim();if(!o||!r||!await Gt({title:`Attach history from ${o}?`,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 i=r.textContent||"Attach device history";r.textContent="Attaching…";try{await _w(o),Z("Old device history attached to you."),await e()}catch(a){Z(Je(a,"Failed to attach old device history."),"warning"),r.textContent="Retry",r.disabled=!1;return}r.textContent=i,r.disabled=!1})}function yD(){return window.location.hash.replace(/^#/,"")==="sync/diagnostics"?"diagnostics":"main"}function my(e=yD()){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 hy=!1;function bD(){hy||(hy=!0,window.addEventListener("hashchange",()=>{my()}))}var Kt={invitePolicy:"auto_admit",loadSyncData:async()=>{}};function _D(e){Kt.loadSyncData=e}var wD=[{value:"auto_admit",label:"Auto-admit"},{value:"approval_required",label:"Approval required"}];function SD(){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 o=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=o}function dd(){const e=document.getElementById("syncAdminDisclosureMount");e&&KI(e,{open:Xv,onOpenChange:t=>{k0(t),dd(),Wa(),ud()}})}function CD(){const e=document.getElementById("syncJoinPanel"),t=document.getElementById("syncJoinSection");!e||!t||e.parentElement!==t&&t.appendChild(e)}function ud(){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 Va(){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 Wa(){const e=document.getElementById("syncInvitePolicyMount");e&<(e,h(an,{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!==Kt.invitePolicy&&(Kt.invitePolicy=n,Wa())},options:wD,triggerClassName:"sync-radix-select-trigger sync-actor-select",value:Kt.invitePolicy,viewportClassName:"sync-radix-select-viewport"}))}function TD(e,t){dd(),Wa();const n=document.getElementById("syncNowButton"),r=document.getElementById("syncCreateInviteButton"),o=document.getElementById("syncInviteGroup"),i=document.getElementById("syncInviteTtl"),a=document.getElementById("syncInviteOutput"),s=document.getElementById("syncJoinButton"),l=document.getElementById("syncJoinInvite");r?.addEventListener("click",async()=>{if(!r||!o||!i||!a||r.disabled)return;const d=o.value.trim(),u=Number(i.value);let p=!0;if(d?Wo(o):p=Ua(o,"Team name is required."),!u||u<1?p=Ua(i,"Must be at least 1 hour."):Wo(i),!!p){r.disabled=!0,r.textContent="Creating…";try{const f=await hp({group_id:d,policy:Kt.invitePolicy,ttl_hours:u||24});b.lastTeamInvite=f,ud(),a.value=String(f.encoded||""),a.hidden=!1,a.focus(),a.select();const m=Array.isArray(f.warnings)?f.warnings:[];Z(m.length?`Invite created. Copy it above and review ${m.length===1?"1 warning":`${m.length} warnings`}.`:"Invite created. Copy the text above and share it with your teammate.",m.length?"warning":"success")}catch(f){Z(Je(f,"Failed to create invite. Check the team name, invite lifetime, and coordinator reachability, then try again."),"warning"),r.textContent="Retry",r.disabled=!1;return}finally{r.disabled&&(r.disabled=!1,r.textContent="Create invite")}}}),l?.addEventListener("keydown",d=>{vr(d,{onSubmit:()=>s?.click(),disabled:!s||s.disabled})}),s?.addEventListener("click",async()=>{if(!s||!l)return;const d=l.value.trim();if(!d){Ua(l,"Paste a team invite or pairing payload.");return}Wo(l),s.disabled=!0,s.textContent="Accepting…";try{const u=await nw(d);b.lastTeamJoin=u;const p=typeof u.type=="string"?u.type:"team_join";let f;if(p==="pair"){const m=String(u.peer_device_id??"").trim();f={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 f={message:u.status==="pending"?"Join request sent. Waiting for admin approval.":"Joined the team.",tone:"success"};b.syncJoinFlowFeedback=f,Va(),l.value="";try{await t()}catch(m){f={message:Je(m,"Accepted the invite, but this view has not refreshed yet."),tone:"warning"},b.syncJoinFlowFeedback=f,Va()}}catch(u){b.syncJoinFlowFeedback={message:Je(u,"Failed to accept. Check that the invite or pairing payload is complete and current, then try again."),tone:"warning"},Va(),s.textContent="Retry",s.disabled=!1;return}finally{s.disabled&&(s.disabled=!1,s.textContent="Accept")}}),n?.addEventListener("click",async()=>{if(n){n.disabled=!0,n.textContent="Syncing…";try{const d=Bv(await Us());Z(d.message,d.warning?"warning":void 0)}catch(d){Z(Je(d,"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 pd({element:e,hidden:t=!1,restoreParent:n=null}){const r=j(null);return mt(()=>{e&&(e.hidden=t)},[e,t]),mt(()=>{const o=r.current;if(!(!o||!e))return e.parentElement!==o&&o.appendChild(e),()=>{!n||e.parentElement!==o||n.appendChild(e)}},[e,n]),c("div",{ref:r})}function kD({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:r}){return c(ee,{children:[c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:["Invite a teammate.",c("span",{className:"sync-action-command",children:"Generate an invite when you want someone else to join this team from their device."})]}),c("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide invite form":"Invite a teammate"})]}),e?c(pd,{element:e,hidden:!t,restoreParent:n}):null]})}function xD(){return c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:["Pair another device.",c("span",{className:"sync-action-command",children:"Copy a pairing command when you want to connect another one of your own devices."})]}),c("button",{type:"button",className:"settings-button sync-action-copy",onClick:e=>ro("codemem sync pair --payload-only",e.currentTarget),children:"Copy pairing command"})]})}function AD({joinPanel:e,joinPanelOpen:t,joinRestoreParent:n,onToggle:r}){return c(ee,{children:[c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:["Accept an invite or pairing.",c("span",{className:"sync-action-command",children:"Paste a team invite to join another team, or a pairing payload to connect another device."})]}),c("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide paste form":"Paste invite or pairing"})]}),e?c(pd,{element:e,hidden:!t,restoreParent:n}):null]})}function ED({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,joinPanel:r,joinPanelOpen:o,joinRestoreParent:i,onToggleInvitePanel:a,onToggleJoinPanel:s,pairedPeerCount:l,presenceStatus:d}){const u=d==="not_enrolled";return c(ee,{children:[u?c(ee,{children:[c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:["Join this device.",c("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?c(pd,{element:r,hidden:!1,restoreParent:i}):null,c("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0}),c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:["This device is not on the team yet.",c("span",{className:"sync-action-command",children:"Use Join this device above, or ask an admin to enroll it first."})]})})]}):c(ee,{children:[c(AD,{joinPanel:r,joinPanelOpen:o,joinRestoreParent:i,onToggle:s}),c("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0})]}),u?null:c(kD,{invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:a}),!l&&d==="posted"?c(xD,{}):null]})}function Ka({count:e,label:t}){return c("div",{className:"sync-section-heading",children:[c("div",{className:"sync-action-text sync-section-label",children:t}),e?c("span",{className:"badge actor-badge sync-section-count",children:e}):null]})}function za({children:e}){return c("div",{className:"section-meta sync-section-note",children:e})}function ND({item:e,onAction:t}){const[n,r]=O(!1);return c("div",{className:"sync-action",children:[c("div",{className:"sync-action-text",children:[e.title,c("span",{className:"sync-action-command",children:e.summary})]}),c("button",{type:"button",className:"settings-button",disabled:n,onClick:async()=>{r(!0);try{await t(e)}finally{r(!1)}},children:e.actionLabel||"Review"})]})}function PD({request:e,onApprove:t,onDeny:n}){const[r,o]=O(null),[i,a]=O(null),[s,l]=O("Approve"),[d,u]=O("Deny");return c("div",{className:"actor-row",children:[c("div",{className:"actor-details",children:c("div",{className:"actor-title",title:e.requestId||void 0,children:e.displayName})}),c("div",{className:"actor-actions",children:[c("button",{type:"button",className:"settings-button","aria-label":`${s} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{o("approve"),l("Approving…");try{a(await t(e)||null),l("Approve")}catch{l("Retry")}finally{o(null)}},children:s}),c("button",{type:"button",className:"settings-button","aria-label":`${d} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{o("deny"),u("Denying…");try{a(await n(e)||null),u("Deny")}catch{u("Retry")}finally{o(null)}},children:d})]}),c(ar,{feedback:i})]})}function RD({row:e,onInspectConflict:t,onRemoveConflict:n,onReview:r}){const[o,i]=O(null),[a,s]=O(null),l=e.actionLabel||"Pair with this device",[d,u]=O(l),[p,f]=O("Remove broken device record");return c("div",{className:"peer-card peer-card--padded","data-discovered-device-id":e.deviceId,children:[c("div",{className:"peer-title",children:[c("strong",{title:e.displayTitle||void 0,children:e.displayName}),c("span",{className:`badge actor-badge${e.availabilityLabel==="Offline"?"":" local"}`,children:e.availabilityLabel}),c("span",{className:"badge actor-badge",children:e.connectionLabel}),e.approvalBadgeLabel?c("span",{className:"badge actor-badge",children:e.approvalBadgeLabel}):null]}),c("div",{className:"peer-meta",children:e.note}),c("div",{className:"peer-actions",children:[e.mode==="accept"?c("button",{type:"button",className:"settings-button","aria-label":`${d} for ${e.displayName}`,disabled:o!==null,onClick:async()=>{i("review"),u("Pairing…"),s({message:`Pairing ${e.displayName}. Keep this page open while the device is approved and refreshed.`,tone:"success"});try{s(await r(e)||null),u(e.actionLabel||l)}catch{s({message:`Pairing ${e.displayName} failed. Try again.`,tone:"warning"}),u("Retry")}finally{i(null)}},children:d}):null,(e.mode==="stale"||e.mode==="ambiguous"||e.mode==="scope-pending"||e.mode==="setup-blocked")&&e.actionMessage?c("div",{className:"peer-meta",children:e.actionMessage}):null,e.mode==="paired"&&e.pairedMessage?c("div",{className:"peer-meta",children:e.pairedMessage}):null,e.mode==="conflict"?c(ee,{children:[c("button",{type:"button",className:"settings-button","aria-label":`Open details for ${e.displayName}`,disabled:o!==null,onClick:()=>t(e),children:"Open device details"}),c("button",{type:"button",className:"settings-button danger","aria-label":`${p} for ${e.displayName}`,disabled:o!==null,onClick:async()=>{i("remove"),f("Removing…");try{s(await n(e)||null),f("Remove broken device record")}catch{f("Retry")}finally{i(null)}},children:p})]}):null]}),c(ar,{feedback:a})]})}function ID(e){const t=e.actionItems.length>0,n=e.actionableCount>e.actionItems.length,r=t||n||e.presenceStatus!=="posted";return c(ee,{children:[r?c(Ka,{label:"Needs attention"}):null,r?c(za,{children:"Start here when something needs review, re-pairing, or approval."}):null,t?e.actionItems.map(o=>c(ND,{item:o,onAction:e.onAttentionAction},o.id)):null,!t&&!n&&e.presenceStatus==="posted"?c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:"No urgent team work right now."})}):null,!t&&n&&e.presenceStatus==="posted"?c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:"More team follow-up is listed below when you are ready."})}):null,!t&&e.presenceStatus==="not_enrolled"?c("div",{className:"sync-action",children:c("div",{className:"sync-action-text",children:["This device needs team enrollment",c("span",{className:"sync-action-command",children:"Import an invite or ask an admin to enroll it."})]})}):null]})}function DD({children:e}){return e?c(ee,{children:[c(Ka,{label:"Add devices & teammates"}),c(za,{children:"Use these flows when you are enrolling, inviting, or pairing something new."}),e]}):null}function LD({mount:e,rows:t,onInspectConflict:n,onRemoveConflict:r,onReview:o}){return!e||!t.length&&!b.syncDiscoveredFeedback?null:Zt(c(ee,{children:[c(Ka,{count:t.length||void 0,label:"Devices waiting for review"}),c(za,{children:"Review team devices here when they still need trust, re-pairing, or approval on this machine."}),c(ar,{feedback:b.syncDiscoveredFeedback}),t.map(i=>c(RD,{row:i,onInspectConflict:n,onRemoveConflict:r,onReview:o},i.deviceId))]}),e)}function OD({mount:e,requests:t,onApprove:n,onDeny:r}){return!e||!t.length&&!b.syncJoinRequestsFeedback?null:Zt(c(ee,{children:[c(Ka,{count:t.length||void 0,label:"Join requests to review"}),c(za,{children:"Approve or deny requests here before those devices become part of the team."}),c(ar,{feedback:b.syncJoinRequestsFeedback}),t.map(o=>c(PD,{request:o,onApprove:n,onDeny:r},o.requestId))]}),e)}function $D(e){return c(ee,{children:[c(ID,{...e}),c(DD,{children:e.children}),c(OD,{mount:e.joinRequestsMount,requests:e.pendingJoinRequests,onApprove:e.onApproveJoinRequest,onDeny:e.onDenyJoinRequest}),c(LD,{mount:e.discoveredListMount,rows:e.discoveredRows,onInspectConflict:e.onInspectConflict,onRemoveConflict:e.onRemoveConflict,onReview:e.onReviewDiscoveredDevice})]})}function gy(e){e&&(e.textContent="")}function qa(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 MD(){return typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}function Ko(){return MD()?"auto":"smooth"}var vy="syncTeamActionsMount";function FD(e,t,n){if(!t){e.hidden=!0,e.textContent="",e.className="sync-online-badge";return}e.hidden=!1,n==="posted"?(e.className="sync-online-badge",e.textContent="Online"):n==="not_enrolled"?(e.className="sync-online-badge sync-online-offline",e.textContent="Not enrolled"):(e.className="sync-online-badge sync-online-error",e.textContent="Offline")}function yy(e,t){const n=document.getElementById(vy);n&&(jr(n),n.remove()),gy(e),t.forEach(r=>{gy(r)})}function Ja(){const e=document.getElementById("syncTeamMeta"),t=document.getElementById("syncSetupPanel"),n=document.getElementById("syncTeamActions");if(!e||!t||!n)return;dd(),Wa(),ud(),Va(),SD();const r=document.getElementById("syncInvitePanel"),o=document.getElementById("syncAdminSection"),i=document.getElementById("syncJoinPanel"),a=document.getElementById("syncJoinSection"),s=document.getElementById("syncJoinRequests"),l=document.getElementById("syncCoordinatorDiscovered"),d=document.getElementById("syncCoordinatorDiscoveredMeta"),u=document.getElementById("syncCoordinatorDiscoveredList");An("syncTeamSkeleton"),CD();const p=b.lastSyncCoordinator,f=b.lastSyncViewModel||{summary:{connectedDeviceCount:0,seenOnTeamCount:0,offlineTeamDeviceCount:0},duplicatePeople:[],attentionItems:[]},m=N=>{if(N.kind==="possible-duplicate-person"){const k=document.getElementById("syncActorsList");k instanceof HTMLElement&&(k.scrollIntoView({block:"center",behavior:Ko()}),qa(k));return}const P=String(N.deviceId||"").trim();if(!P)return;if(N.kind==="name-device"){const k=document.querySelector(`[data-device-name-input="${CSS.escape(P)}"]`);if(k instanceof HTMLInputElement){k.scrollIntoView({block:"center",behavior:Ko()}),k.focus(),k.select(),qa(k);return}}const X=document.querySelector(`[data-peer-device-id="${CSS.escape(P)}"]`);if(X instanceof HTMLElement){X.scrollIntoView({block:"center",behavior:Ko()}),qa(X);return}const z=document.querySelector(`[data-discovered-device-id="${CSS.escape(P)}"]`);z instanceof HTMLElement&&(z.scrollIntoView({block:"center",behavior:Ko()}),qa(z))},v=async N=>{const P=Array.isArray(N.actorIds)?N.actorIds.map(I=>String(I||"").trim()).filter(Boolean):[],X=(Array.isArray(b.lastSyncActors)?b.lastSyncActors:[]).filter(I=>P.includes(String(I?.actor_id||"").trim()));if(X.length<2){Z("This duplicate review is outdated. Refresh the card and review the remaining people entries.","warning");return}const z=await lx({title:"Review possible duplicate people",summary:N.title.replace(/^Possible duplicate person:\s*/,""),actors:X.map(I=>({actorId:String(I?.actor_id||""),label:String(I?.display_name||I?.actor_id||"Unknown person"),isLocal:!!I?.is_local}))});if(z.action==="different-people"){D0(P,"different-people"),Z("Okay. I will keep these people separate on this device."),await Kt.loadSyncData();return}if(z.action!=="merge")return;const k=X.find(I=>String(I?.actor_id||"")===z.primaryActorId),D=X.find(I=>String(I?.actor_id||"")===z.secondaryActorId);if(!k?.actor_id||!D?.actor_id){Z("Could not determine which people to combine. Refresh People & devices and try the review again.","warning");return}try{await Sp(String(k.actor_id),String(D.actor_id)),L0(P),Z(`Combined duplicate people into ${String(k.display_name||k.actor_id)}.`),await Kt.loadSyncData()}catch(I){try{await Kt.loadSyncData()}catch{}Z(Je(I,"Failed to combine these people."),"warning")}},g=async N=>await Vc({title:"Pair with this device",description:"Choose a friendly name for this device before pairing it on this machine.",initialValue:N,placeholder:"Desk Mini",confirmLabel:"Pair",cancelLabel:"Cancel",validate:P=>P.trim()?null:"Enter a device name to pair this device."}),y=!!p?.configured,_=S0(p);e.textContent=y?`Team: ${(p.groups||[]).join(", ")||"none"}`:_?.message||"Start by joining an existing team or creating one, then connect people and devices.",e.title=y?String(p.coordinator_url||"").trim():"";const w=document.getElementById("syncOnlineBadge");if(w&&FD(w,y,String(p?.presence_status||"")),!y){yy(n,[s,u]),t.hidden=!1,n.hidden=!0,s&&(s.hidden=!0),l&&(l.hidden=!0);return}t.hidden=!0,n.hidden=!1;const C=String(p.presence_status||""),T=Array.isArray(b.lastSyncPeers)?b.lastSyncPeers:[],x=Array.isArray(f.attentionItems)?f.attentionItems:[],E=(Array.isArray(p.discovered_devices)?p.discovered_devices:[]).map(N=>{const P=String(N.device_id||"").trim(),X=Gv({coordinatorName:String(N.display_name||"").trim(),deviceId:P})||"Discovered device",z=P&&X!==P?P:null,k=String(N.fingerprint||"").trim(),D=(Array.isArray(N.groups)?N.groups.map(Ae=>String(Ae||"").trim()).filter(Boolean):[]).length>1,I=T.find(Ae=>String(Ae?.peer_device_id||"")===P),K=jv({device:N,pairedLocally:!!I}),me=String(I?.fingerprint||"").trim(),ue=!!I&&!!k&&!!me&&me!==k,ie=!_&&XI({device:N,hasAmbiguousCoordinatorGroup:D,pairedLocally:!!I}),xe=Array.isArray(N.addresses)?N.addresses:[],Se=Number(N.address_count??0),Te=Number.isFinite(Se)&&Se>0?Se:0,Y=[xe.length?xe.map(Ae=>oo()?ny(String(Ae||"")):String(Ae||"")).filter(Boolean).join(" · "):Te>0?`${Te} ${N.stale?"last-known":"fresh"} ${Te===1?"address":"addresses"} hidden`:"No fresh addresses"];!xe.length&&z&&Y.push(`device id: ${P}`);let we=null,ae=ie?"accept":"none",Q=null;return ue?ae="conflict":_&&(!I||K.state==="needs-your-approval")?(we=_.message,ae="setup-blocked"):D?(we="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.",ae="ambiguous"):I&&ed(P)?(we="Review this device's Space access and advanced rules in Teams before you sync it.",ae="scope-pending"):I?.last_error?(Y.push(`error: ${String(I.last_error)}`),ie||(ae="paired")):I?.status?.peer_state?(Y.push(`status: ${String(I.status.peer_state)}`),ie||(ae="paired")):!I&&N.stale?(we="Wait for a fresh coordinator presence update, then review this device again here.",ae="stale"):I&&!ie&&(ae="paired"),ae==="paired"&&(Q=K.state==="waiting-for-other-device"?K.description||"Waiting on the other device.":String(I?.last_error||"").toLowerCase().includes("401")&&String(I?.last_error||"").toLowerCase().includes("unauthorized")?"Waiting for the other device to trust this one before sync can work.":null),{actionMessage:we,actionLabel:K.actionLabel||(I?"Review device":"Pair with this device"),approvalBadgeLabel:K.badgeLabel,availabilityLabel:N.stale?"Offline":"Available",connectionLabel:ue?Yv.conflicts:I?Yv.pairedLocally:"Not connected on this device",deviceId:P,displayName:X,displayTitle:z,fingerprint:k,mode:ae,note:Y.join(" · "),pairedMessage:Q}}),L=[],F=E.filter(N=>N.mode!=="paired"&&N.mode!=="none"&&N.mode!=="scope-pending"),H=E.filter(N=>N.mode==="accept"||N.mode==="scope-pending").length,R=x.length+L.length+H,U=(p.groups||[]).join(", ")||"none";e.textContent=C==="posted"?R>0?`Team: ${U}. Start with the next step below, then scan the current team status.`:`Team: ${U}. Team status and device details are below.`:C==="not_enrolled"?`Team: ${U}. Enroll this device first, then return here to review the rest of the team.`:`Team: ${U}. Fix the current sync issue first, then use the rest of this card to verify the team state.`,l&&(l.hidden=F.length===0&&!b.syncDiscoveredFeedback),d&&(d.textContent=F.length?"Pair with a teammate's device to see it appear in People & devices and start syncing.":""),s&&(s.hidden=L.length===0&&!b.syncJoinRequestsFeedback),yy(n,[s,u]);const B=document.createElement("div");B.id=vy,n.appendChild(B),lt(B,h($D,{actionItems:x,actionableCount:R,children:h(ED,{invitePanel:r,invitePanelOpen:Yl,inviteRestoreParent:o,joinPanel:i,joinPanelOpen:Xl,joinRestoreParent:a,onToggleInvitePanel:()=>{r&&(x0(!Yl),Ja())},onToggleJoinPanel:()=>{i&&(A0(!Xl),Ja())},pairedPeerCount:Number(p.paired_peer_count||0),presenceStatus:C}),discoveredListMount:u,discoveredRows:F,joinRequestsMount:s,onApproveJoinRequest:async()=>null,onAttentionAction:async N=>{if(N.kind==="possible-duplicate-person"){await v(N);return}m(N)},onDenyJoinRequest:async()=>null,onInspectConflict:N=>{const P=document.querySelector(`[data-peer-device-id="${CSS.escape(N.deviceId)}"]`);if(P instanceof HTMLElement){P.scrollIntoView({block:"center",behavior:Ko()}),Z(`Opened the conflicting local device record for ${N.displayName}.`,"warning");return}Z("The conflicting local device record is not visible yet. Scroll to People & devices and try again.","warning")},onRemoveConflict:async N=>{if(!await Gt({title:`Remove ${N.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 yp(N.deviceId);const P={message:`Removed the broken local device record for ${N.displayName}. If it is still available, review it again from Next steps or Devices seen on team.`,tone:"success"};return b.syncDiscoveredFeedback=P,await Kt.loadSyncData(),P}catch(P){return{message:Je(P,"Failed to remove the broken local device record. The old local record is still present in People & devices."),tone:"warning"}}},onReviewDiscoveredDevice:async N=>{try{const P=await g(N.displayName);if(!P)return null;const X=await aw(N.deviceId,N.fingerprint),z=String(X?.name||N.displayName||"").trim()||N.displayName;b.pendingAcceptedSyncPeers=[...Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(D=>String(D?.peer_device_id||"").trim()!==N.deviceId):[],{peer_device_id:N.deviceId,name:z,fingerprint:N.fingerprint,addresses:[],claimed_local_actor:!1,status:{peer_state:"degraded"},last_error:"Waiting for the other device to approve this one."}],N0(N.deviceId);let k={message:N.approvalBadgeLabel==="Needs your approval"?`Approved ${N.displayName} on this device. Two-way trust should be ready once both devices refresh.`:`Step 1 complete on this device for ${N.displayName}. Finish onboarding on the other device so both sides trust each other for sync.`,tone:"success"};try{P.trim()!==z.trim()&&(await bp(N.deviceId,P.trim()),b.pendingAcceptedSyncPeers=b.pendingAcceptedSyncPeers.map(D=>String(D?.peer_device_id||"").trim()===N.deviceId?{...D,name:P.trim()}:D),k={message:`Connected ${P.trim()} and saved its name.`,tone:"success"})}catch(D){k={message:Je(D,"Device connected, but naming did not finish."),tone:"warning"}}b.syncDiscoveredFeedback=k;try{await Kt.loadSyncData()}catch(D){k={message:Je(D,"Device connected, but the screen did not refresh yet. Refresh this page before trying the next step."),tone:"warning"},b.syncDiscoveredFeedback=k}return k}catch(P){return{message:Je(P,"Failed to review this device. Wait for a fresh presence update and try again."),tone:"warning"}}},pendingJoinRequests:L,presenceStatus:C}))}function jD(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 Ur(e){const t=e.displayProject.toLowerCase();return t.includes("fatal:")||t.includes("not a git repository")||t==="unknown project"||e.identitySource==="unmapped"}function by(e){return Ur(e)?"Unclear project identity":e.displayProject}function St(e){return(e.reassignableMemoryCount??e.memoryCount)>0}function BD(e,t){return e.suggestedScopeId?` · suggested ${t.find(n=>n.scopeId===e.suggestedScopeId)?.label||"Space"}`:""}function UD(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function GD(e,t){return t.find(n=>n.scopeId===e)?.label||"selected Space"}function HD(e){switch(e){case"coordinator":return"Team Space";case"local":return"Local Space";default:return"Other Space"}}function VD(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 WD(e){return e.gitRemote?e.gitRemote:e.cwd?e.cwd:e.project?e.project:"source identity unavailable"}function KD({group:e}){const t=e.memorySamples??[],n=t.length;return c("details",{className:"legacy-review-samples",children:[c("summary",{children:["Inspect affected memories",n?` (${n} sample${n===1?"":"s"})`:""]}),c("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?c("ul",{className:"legacy-review-sample-list",children:t.map(r=>c("li",{className:"legacy-review-sample",children:[c("div",{className:"legacy-review-sample-title",children:r.title}),c("div",{className:"legacy-review-group-meta",children:[r.kind||"memory"," · ",VD(r.updatedAt??r.createdAt)," ","·"," ",r.ownership==="local"?"local, reassignable":"peer-owned, stays in review"]}),r.bodyPreview?c("div",{className:"legacy-review-sample-body",children:r.bodyPreview}):null,c("div",{className:"legacy-review-group-meta mono",children:WD(r)})]},r.id))}):c("div",{className:"legacy-review-cleanup-note",children:"No samples are available for this group. Refresh Sync and try again before reassigning."})]})}function _y(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${UD(t)}\\b`,"g"),GD(t,n))),r}function zD(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 qD({item:e,onReview:t}){return c("div",{className:"actor-row",children:[c("div",{className:"actor-details",children:[c("div",{className:"actor-title",children:[c("strong",{children:e.peerName}),c("span",{className:"badge actor-badge",children:["person: ",e.actorDisplayName||e.actorId]})]}),c("div",{className:"peer-meta",children:[e.shareableCount," share by default · ",e.privateCount," marked Only me ·"," ",e.scopeLabel]})]}),c("div",{className:"actor-actions",children:c("button",{type:"button",className:"settings-button",onClick:t,children:"Review my memories in Feed"})})]})}function JD({item:e,onReassign:t,onReview:n}){const r=e.groups??[],o=e.targetScopes??[],i=Object.fromEntries(r.map(k=>[k.workspaceIdentity,k.suggestedScopeId??""])),[a,s]=O({}),[l,d]=O({}),[u,p]=O(i),[f,m]=O({}),[v,g]=O("all"),[y,_]=O(""),[w,C]=O(null),T=r.length,x=e.totalGroupCount??T,E=r.filter(Ur).length,L=r.filter(k=>k.suggestedScopeId&&!Ur(k)&&St(k)).length,F=r.filter(k=>f[k.workspaceIdentity]&&St(k)).length,H=r.filter(k=>f[k.workspaceIdentity]&&St(k)&&!!u[k.workspaceIdentity]).length,R=r.filter(k=>{const D=Ur(k);return v==="suggested"&&(!k.suggestedScopeId||D)||v==="cleanup"&&!D||v==="no-suggestion"&&(k.suggestedScopeId||D)||v==="selected"&&!f[k.workspaceIdentity]?!1:!y.trim()||zD(k,o).includes(y.trim().toLowerCase())});async function U(k){const D=u[k.workspaceIdentity]||k.suggestedScopeId||"";if(!(!D||!t||w)){C(k.workspaceIdentity),d(I=>{const K={...I};return delete K[k.workspaceIdentity],K});try{const I=await t(k,D,!!a[k.workspaceIdentity],a[k.workspaceIdentity]?.confirmation_token);s(I?K=>({...K,[k.workspaceIdentity]:I}):K=>{const me={...K};return delete me[k.workspaceIdentity],me})}catch(I){d(K=>({...K,[k.workspaceIdentity]:_y(I,D,o)}))}finally{C(null)}}}function B(k,D){p(I=>({...I,[k.workspaceIdentity]:D})),s(I=>{const K={...I};return delete K[k.workspaceIdentity],K}),d(I=>{const K={...I};return delete K[k.workspaceIdentity],K})}function N(k,D){m(I=>({...I,[k.workspaceIdentity]:D}))}function P(k){m(D=>({...D,...Object.fromEntries(R.filter(St).map(I=>[I.workspaceIdentity,k]))}))}function X(){m(k=>({...k,...Object.fromEntries(r.filter(D=>D.suggestedScopeId&&!Ur(D)&&St(D)).map(D=>[D.workspaceIdentity,!0]))}))}async function z(){if(!t||w||H===0)return;const k=r.filter(D=>f[D.workspaceIdentity]&&St(D)&&!!u[D.workspaceIdentity]);if(!k.every(D=>a[D.workspaceIdentity])){C("bulk");try{for(const D of k){if(a[D.workspaceIdentity])continue;const I=u[D.workspaceIdentity]||D.suggestedScopeId||"";if(I)try{const K=await t(D,I,!1);d(me=>{const ue={...me};return delete ue[D.workspaceIdentity],ue}),K&&s(me=>({...me,[D.workspaceIdentity]:K}))}catch(K){d(me=>({...me,[D.workspaceIdentity]:_y(K,I,o)}))}}}finally{C(null)}}}return c("div",{className:"legacy-review-card",children:[c("div",{className:"legacy-review-header",children:[c("div",{children:[c("div",{className:"actor-title",children:[c("strong",{children:"Legacy shared review"}),c("span",{className:"badge badge-offline",children:"Needs project review"})]}),c("div",{className:"peer-meta legacy-review-summary",children:[x.toLocaleString()," older"," ",x===1?"project needs":"projects need"," a Space. They contain"," ",e.memoryCount.toLocaleString()," older shared memories total; review the projects, not individual memories.",T<x?` Showing ${T.toLocaleString()} projects; open Projects to review the rest.`:""]}),c("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."})]}),c("div",{className:"actor-actions",children:c("button",{type:"button",className:"settings-button",onClick:n,children:"Manage all projects"})})]}),c("div",{className:"legacy-review-toolbar",children:[c("div",{className:"legacy-review-filter-row",children:[["all",`Showing ${T.toLocaleString()}`],["suggested",`Suggested ${L.toLocaleString()}`],["cleanup",`Needs cleanup ${E.toLocaleString()}`],["no-suggestion","No suggestion"],["selected",`Selected ${H.toLocaleString()}`]].map(([k,D])=>c("button",{className:v===k?"settings-button legacy-filter active":"settings-button legacy-filter",onClick:()=>g(k),type:"button",children:D},k))}),c("div",{className:"legacy-review-bulk-row",children:[c("input",{"aria-label":"Search legacy project groups",className:"peer-scope-input legacy-review-search",onInput:k=>_(k.currentTarget.value),placeholder:"Search project, signal, or destination…",value:y}),c("button",{className:"settings-button",onClick:()=>P(!0),type:"button",children:"Select visible"}),c("button",{className:"settings-button",onClick:X,type:"button",children:"Select suggested"}),c("button",{className:"settings-button",onClick:()=>P(!1),type:"button",children:"Clear visible"}),t&&o.length>0?c("button",{className:"settings-save",disabled:w!=null||H===0||r.filter(k=>f[k.workspaceIdentity]&&St(k)&&!!u[k.workspaceIdentity]).every(k=>a[k.workspaceIdentity]),onClick:()=>{z()},type:"button",children:w==="bulk"?"Previewing…":`Preview ${H.toLocaleString()} selected`}):t&&F>0?c("span",{className:"legacy-review-cleanup-note",children:"Add or join a Space before bulk reassignment."}):null,H>0&&r.filter(k=>f[k.workspaceIdentity]&&St(k)&&!!u[k.workspaceIdentity]).every(k=>a[k.workspaceIdentity])?c("span",{className:"legacy-review-cleanup-note",children:"Bulk actions only preview. Confirm each project individually to avoid partial reassignment."}):null]})]}),r.length>0?c("ul",{className:"legacy-review-groups","aria-label":"Legacy shared review project groups",children:R.map(k=>c("li",{className:"legacy-review-group",children:[c("div",{className:"legacy-review-group-main",children:[c("div",{className:"legacy-review-title-wrap",children:[c("input",{"aria-label":`Select ${by(k)}`,checked:!!f[k.workspaceIdentity],className:"cm-checkbox",disabled:!St(k),onChange:D=>N(k,D.currentTarget.checked),type:"checkbox"}),c("div",{children:[c("div",{className:"legacy-review-group-title",children:by(k)}),c("div",{className:"legacy-review-group-meta",children:[jD(k.identitySource),BD(k,o)]}),St(k)?k.peerOwnedMemoryCount?c("div",{className:"legacy-review-cleanup-note",children:[(k.reassignableMemoryCount??k.memoryCount).toLocaleString()," ","local memor",(k.reassignableMemoryCount??k.memoryCount)===1?"y":"ies"," ","can be reassigned; ",k.peerOwnedMemoryCount.toLocaleString()," peer-owned memor",k.peerOwnedMemoryCount===1?"y":"ies"," will stay in review."]}):null:c("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."}),Ur(k)?c("div",{className:"legacy-review-cleanup-note",children:"Inspect or correct the project identity before assigning old shared data to a Space."}):null]})]}),c("span",{className:"legacy-review-count",children:[k.memoryCount.toLocaleString()," memor",k.memoryCount===1?"y":"ies"]})]}),k.suggestionReason?c("div",{className:"legacy-review-reason",children:k.suggestionReason}):null,l[k.workspaceIdentity]?c("div",{className:"legacy-review-confirmation",role:"alert",children:l[k.workspaceIdentity]}):null,a[k.workspaceIdentity]?c("div",{className:"legacy-review-confirmation",role:"alert",children:[a[k.workspaceIdentity].warning," This will reassign"," ",a[k.workspaceIdentity].reassignable_memory_count.toLocaleString()," of"," ",a[k.workspaceIdentity].memory_count.toLocaleString()," memories",a[k.workspaceIdentity].skipped_memory_count?`; ${a[k.workspaceIdentity].skipped_memory_count.toLocaleString()} peer-owned copies will be left unchanged`:"","."]}):null,c(KD,{group:k}),o.length>0&&t&&St(k)?c("label",{className:"legacy-review-target",children:[c("span",{children:"Destination Space"}),c("select",{className:"peer-scope-input",disabled:w!=null,onChange:D=>B(k,D.currentTarget.value),value:u[k.workspaceIdentity]||"",children:[c("option",{value:"",children:"Choose Space…"}),o.map(D=>c("option",{value:D.scopeId,children:[D.label," · ",HD(D.authorityType),D.scopeId===k.suggestedScopeId?" · suggested":""]},D.scopeId))]})]}):null,o.length>0&&t&&St(k)?c("div",{className:"legacy-review-actions",children:c("button",{type:"button",className:"settings-button",disabled:w!=null||!u[k.workspaceIdentity],onClick:()=>{U(k)},children:w===k.workspaceIdentity?a[k.workspaceIdentity]?"Reassigning…":"Previewing…":a[k.workspaceIdentity]?"I understand, reassign memories":"Preview reassignment"})}):null]},k.workspaceIdentity))}):null]})}function YD({items:e,legacyReview:t,onLegacyReassign:n,onLegacyReview:r,onReview:o}){return c(ee,{children:[t?c(JD,{item:t,onReassign:n,onReview:r??o}):null,e.map(i=>c(qD,{item:i,onReview:o},`${i.peerName}:${i.actorId}:${i.scopeLabel}`))]})}function XD(){Ip("mine"),b.feedQuery="",window.location.hash="feed"}function QD(){window.location.hash="projects"}async function ZD(e,t,n,r){try{const o=await mw({...r?{confirmation_token:r}:{},confirmed_old_copies:n,scope_id:t,workspace_identity:e.workspaceIdentity});return b.lastSyncLegacySharedReview=o.legacy_shared_review??null,Z(`Reassigned ${o.reassigned_memory_count.toLocaleString()} legacy review memor${o.reassigned_memory_count===1?"y":"ies"} to ${o.target_scope_label}.`),wy(),null}catch(o){if(o instanceof wp)return o.preview;const i=o instanceof Error?o.message:"Unable to reassign legacy review memories.";throw Z(i,"warning"),new Error(i)}}function wy(){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"),o=Array.isArray(b.lastSyncSharingReview)?b.lastSyncSharingReview:[],i=b.lastSyncLegacySharedReview,a=Math.max(0,Number(i?.memory_count??0)),s=i?.has_data?{groups:Array.isArray(i.groups)?i.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 f=p,m=f.ownership==="peer"?"peer":"local";return{bodyPreview:typeof f.body_preview=="string"?f.body_preview:null,createdAt:typeof f.created_at=="string"?f.created_at:null,cwd:typeof f.cwd=="string"?f.cwd:null,gitRemote:typeof f.git_remote=="string"?f.git_remote:null,id:Number(f.id||0),kind:typeof f.kind=="string"?f.kind:null,ownership:m,project:typeof f.project=="string"?f.project:null,title:String(f.title||`Memory ${Number(f.id||0)}`),updatedAt:typeof f.updated_at=="string"?f.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:a,scopeId:String(i.scope_id||"legacy-shared-review"),totalGroupCount:Number(i.total_group_count||i.groups?.length||0),targetScopes:Array.isArray(i.target_scopes)?i.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(!o.length&&!s){jr(n),e.hidden=!0;return}e.hidden=!1,r&&(r.textContent=s?"Sharing review":"What teammates will receive");const l=b.currentProject?`current project (${b.currentProject})`:"all allowed projects";t.textContent=s?`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.`,lt(n,h(YD,{items:o.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:s,onLegacyReassign:ZD,onLegacyReview:QD,onReview:XD}))}var Ya="",zo=null,fd=0,eL=15e3;function Sy(e){return`project:${e||""}|includeJoinRequests:false`}function tL(e){const t=Sy(e);return!zo||zo.key!==t||Date.now()>=zo.expiresAtMs?null:zo.payload}function nL(e,t){zo={key:Sy(e),expiresAtMs:Date.now()+eL,payload:t}}function rL(e){return!e||typeof e!="object"?e:{...e,join_requests:[]}}function oL(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewList"),n=document.getElementById("syncSharingReviewMeta"),r=document.getElementById("syncLegacyClaims"),o=document.getElementById("syncLegacyClaimsMeta");e&&(e.hidden=!0),t&&(t.textContent=""),n&&(n.textContent=""),r&&(r.hidden=!0),o&&(o.textContent="")}async function qo(){const e=++fd;try{const t=b.currentProject||"",n=!1,r=b.activeTab==="health";let o=!1;const i=!oo();let a;r?(a=tL(t),a||(a=await Bs(i,t,{includeJoinRequests:!1}),o=!0)):(a=await Bs(i,t,{includeJoinRequests:n}),o=!0);let s=null,l=null,d=!1,u=!1;const p=I0();try{s=await rw()}catch{d=!0}try{l=await no()}catch{u=!0}if(e!==fd)return;o&&nL(t,rL(a));const f=JSON.stringify([a,s,l,p]);if(f===Ya)return;Ya=f;const m=a.status&&typeof a.status=="object"?a.status:null;m&&(b.lastSyncStatus=m),Array.isArray(s?.items)?b.lastSyncActors=s.items:b.lastSyncActors=[];const v=Array.isArray(a.peers)?a.peers:[],g=new Set(v.map(_=>String(_?.peer_device_id||"").trim()).filter(Boolean)),y=Array.isArray(b.pendingAcceptedSyncPeers)?b.pendingAcceptedSyncPeers.filter(_=>{const w=String(_?.peer_device_id||"").trim();return w&&!g.has(w)}):[];b.pendingAcceptedSyncPeers=y,b.lastSyncPeers=[...v,...y],b.lastSyncSharingReview=a.sharing_review||[],b.lastSyncLegacySharedReview=a.legacy_shared_review&&typeof a.legacy_shared_review=="object"?a.legacy_shared_review:null,b.lastSyncCoordinator=a.coordinator||null,b.lastCoordinatorAdminStatus=l&&typeof l=="object"?l:null,b.lastSyncJoinRequests=Array.isArray(a.join_requests)?a.join_requests:[],b.lastSyncAttempts=a.attempts||[],b.lastSyncLegacyDevices=a.legacy_devices||[],b.lastSyncDuplicatePersonDecisions=p,b.lastSyncViewModel=T0({actors:b.lastSyncActors,peers:b.lastSyncPeers,coordinator:b.lastSyncCoordinator,duplicatePersonDecisions:b.lastSyncDuplicatePersonDecisions}),sy(),Ja(),mD(),wy(),ld(),fy(),ay(),uv(),d&&hD(),u&&(b.lastCoordinatorAdminStatus=null,Ja())}catch{if(e!==fd)return;Ya="",An("syncTeamSkeleton"),An("syncActorsSkeleton"),An("syncPeersSkeleton"),An("syncDiagSkeleton"),oL(),gD(),B0()}}function iL(){Ya="",b.lastSyncPeers?.length&&ld()}async function aL(){try{b.pairingPayloadRaw=await ow()||null,id()}catch{b.pairingPayloadRaw=null,id()}}function sL(e){NI(),sa(),_D(qo),fD(qo),V0(ld),TD(e,qo),vD(qo),W0(e),my(),bD()}function cL(e,t){const n=$e("runtimeLabel");n&&(n.textContent=t?`v${e} (${t})`:`v${e}`,n.title=t?`codemem ${e} (${t})`:`codemem ${e}`,n.hidden=!1)}async function lL(){try{const e=await X_();if(!e?.version)return;cL(e.version,"88e0b1b")}catch{}}var md=null,Cy=1500,Ty="codemem-legacy-upgrade-notice-dismissed",Nn=null,zt=!1,hd=!1,Jo=null;function ky(e,t=0){const n=Number(e);return Number.isFinite(n)?Math.max(0,n):t}function xy(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:[],o=ky(n.total_group_count,r.length),i=ky(n.memory_count);return o<=0||i<=0?null:{groupCount:o,memoryCount:i}}function Ay(){try{return localStorage.getItem(Ty)==="1"}catch{return!1}}function Xa(){if(document.getElementById("legacyUpgradeDontShow")?.checked)try{localStorage.setItem(Ty,"1")}catch{}}function Ey(){const e=$e("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 dL(){const e=Ey(),t=$e("legacyUpgradeReviewGroups");(t&&e.includes(t)?t:e[0])?.focus()}function Ny(e){const t=$e("legacyUpgradeModal");if(!t||t.hidden)return;if(e.key==="Escape"){e.preventDefault(),Xa(),Yo(!1);return}if(e.key==="Enter"){const i=$e("legacyUpgradeReviewGroups");vr(e,{onSubmit:()=>i?.click(),disabled:!i||i.disabled});return}if(e.key!=="Tab")return;const n=Ey();if(n.length===0)return;const r=n[0],o=n[n.length-1];if(e.shiftKey&&document.activeElement===r){e.preventDefault(),o.focus();return}!e.shiftKey&&document.activeElement===o&&(e.preventDefault(),r.focus())}function Py(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 Yo(e,t){const n=$e("legacyUpgradeModalBackdrop"),r=$e("legacyUpgradeModal"),o=$e("legacyUpgradeSummary");if(!(!n||!r||!o)){if(t&&(o.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){Jo=document.activeElement,document.addEventListener("keydown",Ny),dL(),Py(!0);return}Py(!1),document.removeEventListener("keydown",Ny),Jo&&document.contains(Jo)&&Jo.focus(),Jo=null}}function Ry(e){!e||hd||Ay()||(hd=!0,Yo(!0,e))}async function uL(){if(!(hd||Ay()))try{Ry(xy(await Bs(!1,"",{includeJoinRequests:!1})))}catch{}}function sr(e,t){const n=$e("viewerReconnectOverlay"),r=$e("viewerReconnectDetail");!n||!r||(n.hidden=!e,r.textContent=t||"Trying again automatically while the viewer comes back.")}async function gd(){try{return await Y_(),!0}catch{return!1}}function pL(){return document.visibilityState!=="hidden"&&!Nv()}function Iy(){if(zt)return;zt=!0,vd(),cr("error","(reconnecting)"),sr(!0,"The viewer server is restarting or temporarily unavailable. Trying again automatically…");const e=async()=>{if(await gd()){if(Nn&&(clearTimeout(Nn),Nn=null),zt=!1,sr(!0,"Viewer responded. Restoring your session…"),pL()){cr("refreshing"),Xo();try{await Qa()}catch{}}else cr("paused",document.visibilityState==="hidden"?"(tab hidden)":"(settings open)");zt||sr(!1);return}sr(!0,"Still reconnecting… the viewer will recover automatically as soon as the server responds."),Nn=setTimeout(e,Cy)};Nn=setTimeout(e,Cy)}function cr(e,t){b.refreshState=e;const n=$e("refreshStatus");if(!n)return;const r=i=>{const a=$e("refreshAnnouncer");!a||md===e||(a.textContent=i,md=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 o=t?` ${t}`:"";n.textContent=`updated ${new Date().toLocaleTimeString()}${o}`,md=null}function vd(){b.refreshTimer&&(clearInterval(b.refreshTimer),b.refreshTimer=null)}function Xo(){b.refreshTimer||(b.refreshTimer=setInterval(()=>Pn(),5e3))}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(vd(),cr("paused","(tab hidden)")):!Nv()&&!zt&&(Xo(),Pn())});function yd(e){const t=new Set(Rp(b.lastCoordinatorAdminStatus));Un.forEach(n=>{const r=$e(`tab-${n}`);r&&(r.hidden=n!==e||!t.has(n))}),Un.forEach(n=>{const r=$e(`tabBtn-${n}`);r&&(r.hidden=!t.has(n),r.classList.toggle("active",n===e&&t.has(n)))})}function bd(e){const t=yr(e,b.lastCoordinatorAdminStatus);Ws(t),yd(t),Pn()}function fL(){Un.forEach(e=>{$e(`tabBtn-${e}`)?.addEventListener("click",()=>bd(e))}),window.addEventListener("hashchange",()=>{const e=Vs();e&&e!==b.activeTab&&bd(e)}),bd(b.activeTab)}async function mL(){try{const e=await Si();b.knownProjects=e,iL();const t=Gs("projectFilter");if(!t)return;t.textContent="";const n=document.createElement("option");n.value="",n.textContent="All Projects",t.appendChild(n),e.forEach(r=>{const o=document.createElement("option");o.value=r,o.textContent=r,t.appendChild(o)})}catch{}}Gs("projectFilter")?.addEventListener("change",()=>{b.currentProject=Gs("projectFilter")?.value||"",jo(!0),Pn()});var _d=null;async function Pn(){zt||(_d&&clearTimeout(_d),_d=setTimeout(()=>Qa(),80))}async function Qa(){if(!zt){if(b.refreshInFlight){b.refreshQueued=!0;return}b.refreshInFlight=!0;try{cr("refreshing");let e=b.activeTab;if(e==="coordinator-admin"){try{const r=await no();b.lastCoordinatorAdminStatus=r&&typeof r=="object"?r:null}catch{b.lastCoordinatorAdminStatus=null}e=b.activeTab,e=yr(e,b.lastCoordinatorAdminStatus),e!==b.activeTab&&(Ws(e),yd(e))}const t=[zP(),YR()];e==="feed"&&t.push(no().then(r=>{b.lastCoordinatorAdminStatus=r&&typeof r=="object"?r:null}).catch(()=>{b.lastCoordinatorAdminStatus=null})),e==="feed"&&t.push(sv()),e==="projects"&&t.push(yR()),(e==="sync"||e==="health")&&t.push(qo()),e==="coordinator-admin"&&t.push(qc()),b.syncPairingOpen&&t.push(aL()),await Promise.all(t),Ry(xy(b.lastSyncLegacySharedReview));const n=yr(b.activeTab,b.lastCoordinatorAdminStatus);n!==b.activeTab&&Ws(n),yd(b.activeTab),cr("idle")}catch{await gd()?cr("error"):Iy()}finally{b.refreshInFlight=!1,b.refreshQueued&&!zt&&(b.refreshQueued=!1,Qa())}}}Fw();var Dy=document.getElementById("toastRoot");Dy&&A_(Dy),jw(Hs("themeToggle")),Op(zs()),fL(),FP(),bR(()=>Pn()),sL(()=>Pn()),Fx(),AI(vd,Xo,()=>Pn()),mL(),$e("viewerReconnectRetry")?.addEventListener("click",async()=>{if(sr(!0,"Checking whether the viewer server is back…"),!await gd()){Iy();return}Nn&&(clearTimeout(Nn),Nn=null),zt=!1,sr(!0,"Viewer responded. Restoring your session…"),Xo();try{await Qa()}catch{}zt||sr(!1)}),$e("legacyUpgradeReviewGroups")?.addEventListener("click",()=>{Xa(),Yo(!1),window.location.hash="sync",setTimeout(()=>document.getElementById("syncSharingReview")?.scrollIntoView({block:"start"}),120)}),$e("legacyUpgradeReviewProjects")?.addEventListener("click",()=>{Xa(),Yo(!1),window.location.hash="projects"}),$e("legacyUpgradeNotNow")?.addEventListener("click",()=>{Xa(),Yo(!1)}),lL(),uL(),Pn(),Xo()})();
|
package/static/app.js.br
CHANGED
|
Binary file
|
package/static/app.js.gz
CHANGED
|
Binary file
|