@codemem/server 0.46.0-alpha.1 → 0.46.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/static/app.js CHANGED
@@ -105,6 +105,6 @@ ${this.parser.parse(e)}</blockquote>
105
105
  ${e}</tr>
106
106
  `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
107
107
  `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${yn(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=z_(e);if(i===null)return r;e=i;let a='<a href="'+e+'"';return t&&(a+=' title="'+yn(t)+'"'),a+=">"+r+"</a>",a}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=z_(e);if(i===null)return yn(n);e=i;let a=`<img src="${e}" alt="${yn(n)}"`;return t&&(a+=` title="${yn(t)}"`),a+=">",a}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:yn(e.text)}},af=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},nn=class jm{options;renderer;textRenderer;constructor(t){this.options=t||ni,this.options.renderer=this.options.renderer||new Wc,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new af}static parse(t,n){return new jm(n).parse(t)}static parseInline(t,n){return new jm(n).parseInline(t)}parse(t){this.renderer.parser=this;let n="";for(let r=0;r<t.length;r++){let i=t[r];if(this.options.extensions?.renderers?.[i.type]){let s=i,c=this.options.extensions.renderers[s.type].call({parser:this},s);if(c!==!1||!["space","hr","heading","code","table","blockquote","list","checkbox","html","def","paragraph","text"].includes(s.type)){n+=c||"";continue}}let a=i;switch(a.type){case"space":n+=this.renderer.space(a);break;case"hr":n+=this.renderer.hr(a);break;case"heading":n+=this.renderer.heading(a);break;case"code":n+=this.renderer.code(a);break;case"table":n+=this.renderer.table(a);break;case"blockquote":n+=this.renderer.blockquote(a);break;case"list":n+=this.renderer.list(a);break;case"checkbox":n+=this.renderer.checkbox(a);break;case"html":n+=this.renderer.html(a);break;case"def":n+=this.renderer.def(a);break;case"paragraph":n+=this.renderer.paragraph(a);break;case"text":n+=this.renderer.text(a);break;default:{let s='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(s),"";throw new Error(s)}}}return n}parseInline(t,n=this.renderer){this.renderer.parser=this;let r="";for(let i=0;i<t.length;i++){let a=t[i];if(this.options.extensions?.renderers?.[a.type]){let c=this.options.extensions.renderers[a.type].call({parser:this},a);if(c!==!1||!["escape","html","link","image","checkbox","strong","em","codespan","br","del","text"].includes(a.type)){r+=c||"";continue}}let s=a;switch(s.type){case"escape":r+=n.text(s);break;case"html":r+=n.html(s);break;case"link":r+=n.link(s);break;case"image":r+=n.image(s);break;case"checkbox":r+=n.checkbox(s);break;case"strong":r+=n.strong(s);break;case"em":r+=n.em(s);break;case"codespan":r+=n.codespan(s);break;case"br":r+=n.br(s);break;case"del":r+=n.del(s);break;case"text":r+=n.text(s);break;default:{let c='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(c),"";throw new Error(c)}}}return r}},bo=class{options;block;constructor(e){this.options=e||ni}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?tn.lex:tn.lexInline}provideParser(e=this.block){return e?nn.parse:nn.parseInline}},VO=class{defaults=Yp();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=nn;Renderer=Wc;TextRenderer=af;Lexer=tn;Tokenizer=zc;Hooks=bo;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case"table":{let i=r;for(let a of i.header)n=n.concat(this.walkTokens(a.tokens,t));for(let a of i.rows)for(let s of a)n=n.concat(this.walkTokens(s.tokens,t));break}case"list":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(a=>{let s=i[a].flat(1/0);n=n.concat(this.walkTokens(s,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=t.renderers[i.name];a?t.renderers[i.name]=function(...s){let c=i.renderer.apply(this,s);return c===!1&&(c=a.apply(this,s)),c}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=t[i.level];a?a.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new Wc(this.defaults);for(let a in n.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,c=n.renderer[s],l=i[s];i[s]=(...d)=>{let u=c.apply(i,d);return u===!1&&(u=l.apply(i,d)),u||""}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new zc(this.defaults);for(let a in n.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,c=n.tokenizer[s],l=i[s];i[s]=(...d)=>{let u=c.apply(i,d);return u===!1&&(u=l.apply(i,d)),u}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new bo;for(let a in n.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,c=n.hooks[s],l=i[s];bo.passThroughHooks.has(a)?i[s]=d=>{if(this.defaults.async&&bo.passThroughHooksRespectAsync.has(a))return(async()=>{let p=await c.call(i,d);return l.call(i,p)})();let u=c.call(i,d);return l.call(i,u)}:i[s]=(...d)=>{if(this.defaults.async)return(async()=>{let p=await c.apply(i,d);return p===!1&&(p=await l.apply(i,d)),p})();let u=c.apply(i,d);return u===!1&&(u=l.apply(i,d)),u}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,a=n.walkTokens;r.walkTokens=function(s){let c=[];return c.push(a.call(this,s)),i&&(c=c.concat(i.call(this,s))),c}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return tn.lex(e,t??this.defaults)}parser(e,t){return nn.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let s=i.hooks?await i.hooks.preprocess(t):t,c=await(i.hooks?await i.hooks.provideLexer(e):e?tn.lex:tn.lexInline)(s,i),l=i.hooks?await i.hooks.processAllTokens(c):c;i.walkTokens&&await Promise.all(this.walkTokens(l,i.walkTokens));let d=await(i.hooks?await i.hooks.provideParser(e):e?nn.parse:nn.parseInline)(l,i);return i.hooks?await i.hooks.postprocess(d):d})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let s=(i.hooks?i.hooks.provideLexer(e):e?tn.lex:tn.lexInline)(t,i);i.hooks&&(s=i.hooks.processAllTokens(s)),i.walkTokens&&this.walkTokens(s,i.walkTokens);let c=(i.hooks?i.hooks.provideParser(e):e?nn.parse:nn.parseInline)(s,i);return i.hooks&&(c=i.hooks.postprocess(c)),c}catch(s){return a(s)}}}onError(e,t){return n=>{if(n.message+=`
108
- Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error occurred:</p><pre>"+yn(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}},ii=new VO;function Me(e,t){return ii.parse(e,t)}Me.options=Me.setOptions=function(e){return ii.setOptions(e),Me.defaults=ii.defaults,L_(Me.defaults),Me},Me.getDefaults=Yp,Me.defaults=ni;function KO(...e){return ii.use(...e),Me.defaults=ii.defaults,L_(Me.defaults),Me}Me.use=KO,Me.walkTokens=function(e,t){return ii.walkTokens(e,t)},Me.parseInline=ii.parseInline,Me.Parser=nn,Me.parser=nn.parse,Me.Renderer=Wc,Me.TextRenderer=af,Me.Lexer=tn,Me.lexer=tn.lex,Me.Tokenizer=zc,Me.Hooks=bo,Me.parse=Me;var YH=Me.options,XH=Me.setOptions,QH=Me.walkTokens,ZH=Me.parseInline,eV=nn.parse,tV=tn.lex,zO={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 WO(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:")}D_.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&(WO(e.getAttribute("href")||"")?(e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank")):e.removeAttribute("href"))});function of(e){const t=Me.parse(String(e||""),{async:!1});return D_.sanitize(t,zO)}function JO(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=Object.keys(e);return t.filter(r=>n.includes(r)).map(r=>{const i=String(e[r]||"").trim();return i?g("div",{className:"summary-section",key:r},g("div",{className:"summary-section-label"},k$(r)),g("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:of(i)}})):null}).filter(Boolean)}function YO(e){const t=e.map(n=>String(n||"").trim()).filter(Boolean);if(!t.length)return null;if(t.every(n=>/.+?:\s+.+/.test(n))){const n=t.map((r,i)=>{const a=r.indexOf(":"),s=r.slice(0,a).trim(),c=r.slice(a+1).trim();return!s||!c?null:g("div",{className:"summary-section",key:`${s}-${i}`},g("div",{className:"summary-section-label"},s),g("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:of(c)}}))}).filter(Boolean);if(n.length)return g("div",{className:"feed-body facts"},n)}return g("div",{className:"feed-body"},g("ul",null,t.map((n,r)=>g("li",{key:`${n}-${r}`},n))))}function X_(e,t="feed-body"){const n=String(e||"").trim();return n?g("div",{className:t,dangerouslySetInnerHTML:{__html:of(n)}}):null}function XO(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=s=>{if(!s||typeof s!="object"||Array.isArray(s))return!1;const c=s;return t.some(l=>{const d=c[l];return typeof d=="string"&&d.trim().length>0})},r=e?.summary;if(r&&typeof r=="object"&&!Array.isArray(r)){const s=r.summary;if(n(r))return r;if(n(s))return s}const i=e?.metadata_json;if(n(i))return i;if(i&&n(i.summary))return i.summary;const a=String(e?.body_text||"").trim();if(a.includes("## ")){const s={request:"request",completed:"completed",learned:"learned",investigated:"investigated","next steps":"next_steps",notes:"notes"},c={},l=/(?:^|\n)##\s+([^\n]+)\n([\s\S]*?)(?=\n##\s+|$)/g;for(let d=l.exec(a);d;d=l.exec(a)){const u=s[String(d[1]||"").trim().toLowerCase()],p=String(d[2]||"").trim();u&&p&&(c[u]=p)}if(n(c))return c}return null}function Jc(e,t){return String(e?.kind||"").toLowerCase()==="session_summary"||t?.is_summary===!0?!0:String(t?.source||"").trim().toLowerCase()==="observer_summary"}function QO(e,t){const n=String(e?.kind||"").trim().toLowerCase();return Jc(e,t)?"session_summary":n||"change"}var ZO=Object.defineProperty,He=(e,t)=>ZO(e,"name",{value:t,configurable:!0}),sf=["Enter"," "],eM=["ArrowDown","PageUp","Home"],Q_=["ArrowUp","PageDown","End"],tM=[...eM,...Q_],nV={ltr:[...sf,"ArrowRight"],rtl:[...sf,"ArrowLeft"]},Yc="Menu",[cf,nM,rM]=Ua(Yc),[ai,Z_]=dt(Yc,[rM,ar,Ui]),lf=ar(),ew=Ui(),[iM,_o]=ai(Yc),[aM,df]=ai(Yc),oM=He(e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:i,onOpenChange:a,modal:s=!0}=e,c=lf(t),[l,d]=D(null),u=B(!1),p=ht(a),f=qi(i);return V(()=>{const m=He(()=>{u.current=!0,document.addEventListener("pointerdown",v,{capture:!0,once:!0}),document.addEventListener("pointermove",v,{capture:!0,once:!0})},"handleKeyDown"),v=He(()=>u.current=!1,"handlePointer");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})}},[]),V(()=>{if(!n)return;const m=He(()=>p(!1),"handleBlur");return window.addEventListener("blur",m),()=>window.removeEventListener("blur",m)},[n,p]),o(vc,{...c,children:o(iM,{scope:t,open:n,onOpenChange:p,content:l,onContentChange:d,children:o(aM,{scope:t,onClose:oe(()=>p(!1),[p]),isUsingKeyboardRef:u,dir:f,modal:s,children:r})})})},"Menu"),sM=W(He(function(t,n){const{__scopeMenu:r,...i}=t,a=lf(r);return o(eo,{...a,...i,ref:n})},"MenuAnchor")),tw="MenuPortal",[cM,lM]=ai(tw,{forceMount:void 0}),dM=He(e=>{const{__scopeMenu:t,forceMount:n,children:r,container:i}=e,a=_o(tw,t);return o(cM,{scope:t,forceMount:n,children:o(Pt,{present:n||a.open,children:o(Ti,{asChild:!0,container:i,children:r})})})},"MenuPortal"),mr="MenuContent",[uM,nw]=ai(mr),pM=W(He(function(t,n){const r=lM(mr,t.__scopeMenu),{forceMount:i=r.forceMount,...a}=t,s=_o(mr,t.__scopeMenu),c=df(mr,t.__scopeMenu);return o(cf.Provider,{scope:t.__scopeMenu,children:o(Pt,{present:i||s.open,children:o(cf.Slot,{scope:t.__scopeMenu,children:c.modal?o(fM,{...a,ref:n}):o(mM,{...a,ref:n})})})})},"MenuContent")),fM=W(He(function(t,n){const r=_o(mr,t.__scopeMenu),i=B(null),a=Se(n,i);return V(()=>{const s=i.current;if(s)return ks(s)},[]),o(rw,{...t,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:ne(t.onFocusOutside,s=>s.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)})},"MenuRootContentModal")),mM=W(He(function(t,n){const r=_o(mr,t.__scopeMenu);return o(rw,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)})},"MenuRootContentNonModal")),hM=dn("MenuContent.ScrollLock"),rw=W(He(function(t,n){const{__scopeMenu:r,loop:i=!1,trapFocus:a,onOpenAutoFocus:s,onCloseAutoFocus:c,disableOutsidePointerEvents:l,onEntryFocus:d,onEscapeKeyDown:u,onPointerDownOutside:p,onFocusOutside:f,onInteractOutside:m,onDismiss:v,disableOutsideScroll:b,...h}=t,y=_o(mr,r),w=df(mr,r),_=lf(r),R=ew(r),I=nM(r),[T,A]=D(null),L=B(null),F=Se(n,L,y.onContentChange),N=B(0),j=B(""),x=B(0),U=B(null),q=B("right"),$=B(0),E=b?Ea:z,C=b?{as:hM,allowPinchZoom:!0}:void 0,O=He(G=>{const ee=j.current+G,Z=I().filter(Ne=>!Ne.disabled),ie=document.activeElement,fe=Z.find(Ne=>Ne.ref.current===ie)?.textValue,Ce=lw(Z.map(Ne=>Ne.textValue),ee,fe),Pe=Z.find(Ne=>Ne.textValue===Ce)?.ref.current;He((function Ne(ce){j.current=ce,window.clearTimeout(N.current),ce!==""&&(N.current=window.setTimeout(()=>Ne(""),1e3))}),"updateSearch")(ee),Pe&&setTimeout(()=>Pe.focus())},"handleTypeaheadSearch");V(()=>()=>window.clearTimeout(N.current),[]),Ei();const H=oe(G=>q.current===U.current?.side&&uw(G,U.current?.area),[]);return o(uM,{scope:r,searchRef:j,onItemEnter:oe(G=>{H(G)&&G.preventDefault()},[H]),onItemLeave:oe(G=>{H(G)||(L.current?.focus(),A(null))},[H]),onTriggerLeave:oe(G=>{H(G)&&G.preventDefault()},[H]),pointerGraceTimerRef:x,onPointerGraceIntentChange:oe(G=>{U.current=G},[]),children:o(E,{...C,children:o(vs,{asChild:!0,trapped:a,onMountAutoFocus:ne(s,G=>{G.preventDefault(),L.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:c,children:o(ki,{asChild:!0,disableOutsidePointerEvents:l,onEscapeKeyDown:u,onPointerDownOutside:p,onFocusOutside:f,onInteractOutside:m,onDismiss:v,children:o($u,{asChild:!0,...R,dir:w.dir,orientation:"vertical",loop:i,currentTabStopId:T,onCurrentTabStopIdChange:A,onEntryFocus:ne(d,G=>{w.isUsingKeyboardRef.current||G.preventDefault()}),preventScrollOnEntryFocus:!0,children:o(yc,{role:"menu","aria-orientation":"vertical","data-state":aw(y.open),"data-radix-menu-content":"",dir:w.dir,..._,...h,ref:F,style:{outline:"none",...h.style},onKeyDown:ne(h.onKeyDown,G=>{const ee=G.target.closest("[data-radix-menu-content]")===G.currentTarget,Z=G.ctrlKey||G.altKey||G.metaKey,ie=G.key.length===1;ee&&(G.key==="Tab"&&G.preventDefault(),!Z&&ie&&O(G.key));const fe=L.current;if(G.target!==fe||!tM.includes(G.key))return;G.preventDefault();const Ce=I().filter(Pe=>!Pe.disabled).map(Pe=>Pe.ref.current);Q_.includes(G.key)&&Ce.reverse(),sw(Ce)}),onBlur:ne(t.onBlur,G=>{G.currentTarget.contains(G.target)||(window.clearTimeout(N.current),j.current="")}),onPointerMove:ne(t.onPointerMove,Xc(G=>{const ee=G.target,Z=$.current!==G.clientX;if(G.currentTarget.contains(ee)&&Z){const ie=G.clientX>$.current?"right":"left";q.current=ie,$.current=G.clientX}}))})})})})})})},"MenuContentImpl")),uf="MenuItem",iw="menu.itemSelect",gM=W(He(function(t,n){const{disabled:r=!1,onSelect:i,...a}=t,s=B(null),c=df(uf,t.__scopeMenu),l=nw(uf,t.__scopeMenu),d=Se(n,s),u=B(!1),p=He(()=>{const f=s.current;if(!r&&f){const m=new CustomEvent(iw,{bubbles:!0,cancelable:!0});f.addEventListener(iw,v=>i?.(v),{once:!0}),gs(f,m),m.defaultPrevented?u.current=!1:c.onClose()}},"handleSelect");return o(vM,{...a,ref:d,disabled:r,onClick:ne(t.onClick,p),onPointerDown:f=>{t.onPointerDown?.(f),u.current=!0},onPointerUp:ne(t.onPointerUp,f=>{u.current||f.currentTarget?.click()}),onKeyDown:ne(t.onKeyDown,f=>{r||f.target!==f.currentTarget||l.searchRef.current!==""&&f.key===" "||sf.includes(f.key)&&(f.currentTarget.click(),f.preventDefault())})})},"MenuItem")),vM=W(He(function(t,n){const{__scopeMenu:r,disabled:i=!1,textValue:a,...s}=t,c=nw(uf,r),l=ew(r),d=B(null),u=Se(n,d),[p,f]=D(!1),[m,v]=D("");return V(()=>{const b=d.current;b&&v((b.textContent??"").trim())},[s.children]),o(cf.ItemSlot,{scope:r,disabled:i,textValue:a??m,children:o(ju,{asChild:!0,...l,focusable:!i,children:o(ge.div,{role:"menuitem","data-highlighted":p?"":void 0,"aria-disabled":i||void 0,"data-disabled":i?"":void 0,...s,ref:u,onPointerMove:ne(t.onPointerMove,Xc(b=>{i?c.onItemLeave(b):(c.onItemEnter(b),b.defaultPrevented||b.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:ne(t.onPointerLeave,Xc(b=>c.onItemLeave(b))),onFocus:ne(t.onFocus,()=>f(!0)),onBlur:ne(t.onBlur,()=>f(!1))})})})},"MenuItemImpl")),[rV,iV]=ai("MenuRadioGroup",{value:void 0,onValueChange:He(()=>{},"onValueChange")}),yM="MenuItemIndicator",[aV,oV]=ai(yM,{checked:!1}),bM="MenuSub",[sV,cV]=ai(bM);function aw(e){return e?"open":"closed"}He(aw,"getOpenState");function ow(e){return e==="indeterminate"}He(ow,"isIndeterminate");function _M(e){return ow(e)?"indeterminate":e?"checked":"unchecked"}He(_M,"getCheckedState");function sw(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}He(sw,"focusFirst");function cw(e,t){return e.map((n,r)=>e[(t+r)%e.length])}He(cw,"wrapArray");function lw(e,t,n){const r=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let a=cw(e,Math.max(i,0));r.length===1&&(a=a.filter(c=>c!==n));const s=a.find(c=>c.toLowerCase().startsWith(r.toLowerCase()));return s!==n?s:void 0}He(lw,"getNextMatch");function dw(e,t){const{x:n,y:r}=e;let i=!1;for(let a=0,s=t.length-1;a<t.length;s=a++){const c=t[a],l=t[s],d=c.x,u=c.y,p=l.x,f=l.y;u>r!=f>r&&n<(p-d)*(r-u)/(f-u)+d&&(i=!i)}return i}He(dw,"isPointInPolygon");function uw(e,t){return t?dw({x:e.clientX,y:e.clientY},t):!1}He(uw,"isPointerInGraceArea");function Xc(e){return t=>t.pointerType==="mouse"?e(t):void 0}He(Xc,"whenMouse");var wM=oM,SM=sM,CM=dM,RM=pM,IM=gM,kM=Object.defineProperty,wo=(e,t)=>kM(e,"name",{value:t,configurable:!0}),pf="DropdownMenu",[TM,lV]=dt(pf,[Z_]),So=Z_(),[PM,pw]=TM(pf),NM=wo(e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:i,defaultOpen:a,onOpenChange:s,modal:c=!0}=e,l=So(t),d=B(null),[u,p]=Dt({prop:i,defaultProp:a??!1,onChange:s,caller:pf});return o(PM,{scope:t,triggerId:xt(),triggerRef:d,contentId:xt(),open:u,onOpenChange:p,onOpenToggle:oe(()=>p(f=>!f),[p]),modal:c,children:o(wM,{...l,open:u,onOpenChange:p,dir:r,modal:c,children:n})})},"DropdownMenu"),EM="DropdownMenuTrigger",AM=W(wo(function(t,n){const{__scopeDropdownMenu:r,disabled:i=!1,...a}=t,s=pw(EM,r),c=So(r),l=Se(n,s.triggerRef);return o(SM,{asChild:!0,...c,children:o(ge.button,{type:"button",id:s.triggerId,"aria-haspopup":"menu","aria-expanded":s.open,"aria-controls":s.open?s.contentId:void 0,"data-state":s.open?"open":"closed","data-disabled":i?"":void 0,disabled:i,...a,ref:l,onPointerDown:ne(t.onPointerDown,d=>{!i&&d.button===0&&d.ctrlKey===!1&&(s.onOpenToggle(),s.open||d.preventDefault())}),onKeyDown:ne(t.onKeyDown,d=>{i||(["Enter"," "].includes(d.key)&&s.onOpenToggle(),d.key==="ArrowDown"&&s.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(d.key)&&d.preventDefault())})})})},"DropdownMenuTrigger")),xM=wo(e=>{const{__scopeDropdownMenu:t,...n}=e,r=So(t);return o(CM,{...r,...n})},"DropdownMenuPortal"),DM="DropdownMenuContent",LM=W(wo(function(t,n){const{__scopeDropdownMenu:r,...i}=t,a=pw(DM,r),s=So(r),c=B(!1);return o(RM,{id:a.contentId,"aria-labelledby":a.triggerId,...s,...i,ref:n,onCloseAutoFocus:ne(t.onCloseAutoFocus,l=>{c.current||a.triggerRef.current?.focus(),c.current=!1,l.preventDefault()}),onInteractOutside:ne(t.onInteractOutside,l=>{const d=l.detail.originalEvent,u=d.button===0&&d.ctrlKey===!0,p=d.button===2||u;(!a.modal||p)&&(c.current=!0)}),style:{...t.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)"}})},"DropdownMenuContent")),$M=W(wo(function(t,n){const{__scopeDropdownMenu:r,...i}=t,a=So(r);return o(IM,{...a,...i,ref:n})},"DropdownMenuItem")),jM=NM,OM=AM,MM=xM,FM=LM,fw=$M;function BM({assignProjectDisabled:e,disabled:t,onAssignProject:n,onForget:r,title:i}){return g(jM,null,g(OM,{asChild:!0},g("button",{"aria-label":`Actions for ${i}`,className:"feed-menu-trigger",type:"button"},"⋯")),g(MM,null,g(FM,{align:"end",className:"feed-menu-panel",side:"bottom",sideOffset:4},g(fw,{className:"feed-menu-item",disabled:e,onSelect:()=>n()},e?"Moving…":"Assign to project…"),g(fw,{className:"feed-menu-item danger",disabled:t,onSelect:()=>r()},t?"Forgetting…":"Forget memory"))))}function qM({modes:e,active:t,onSelect:n}){return e.length<=1?null:g("div",{className:"feed-toggle"},e.map(r=>g("button",{key:r.id,className:`toggle-button${r.id===t?" active":""}`,"data-filter":r.id,onClick:()=>n(r.id),type:"button"},r.label)))}function ff({label:e,variant:t=""}){return g(qp,{variant:"provenance",tone:t||void 0},e)}function UM({tag:e}){const t=P$(e);return t?g(qp,{variant:"tag",title:String(e)},t):null}function GM({item:e,onReplace:t,onRemove:n,onViewRefresh:r,onReload:i}){const a=jc(e?.metadata_json),s=Jc(e,a),c=QO(e,a),l=Nt(e),d=e.title||"(untitled)",u=s&&a?.request?a.request:d,p=e.created_at||e.created_at_utc,f=C$(p),m=D$(e),v=$c(e.files||[]),b=e.project||"",h=j$(e),y=O$(e,a),w=String(e.visibility||a?.visibility||"private").trim(),_=String(e.workspace_kind||a?.workspace_kind||"").trim(),R=String(e.origin_source||a?.origin_source||"").trim(),I=String(e.trust_state||a?.trust_state||"").trim(),T=v.length?` · ${T$(v)}`:"",A=Number(e.id||0),L=A>0?`ID ${A}`:"",[F,N]=D(S.newItemKeys.has(l)),j=s?XO({...e,metadata_json:a}):null,x=s?null:fj({...e,metadata_json:a}),U=x?mj(x):[],q=x?hj(x):"summary",$=S.itemViewState.get(l),E=x&&$&&U.some(Re=>Re.id===$)?$:q,[C,O]=D(E),H=`${l}:${C}`,[G,ee]=D(S.itemExpandState.get(H)===!0),[Z,ie]=D(w==="shared"?"shared":"private"),[fe,Ce]=D(!1),[Pe,Ne]=D(!1),[ce,me]=D(!1),J=j?JO(j):[];V(()=>{x&&(U.some(Re=>Re.id===C)||O(q))},[C,q,U,x]),V(()=>{S.itemViewState.set(l,C)},[C,l]),V(()=>{const Re=`${l}:${C}`;ee(S.itemExpandState.get(Re)===!0)},[C,l]),V(()=>{ie(w==="shared"?"shared":"private")},[w]),V(()=>{if(!F)return;const Re=window.setTimeout(()=>{S.newItemKeys.delete(l),N(!1)},700);return()=>window.clearTimeout(Re)},[F,l]);const se=Z,ye=se==="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.",le=[b?`Project ${b}`:"No project",f].filter(Boolean).join(" · "),Ee=[_&&_!==w?`Workspace ${_}`:"",R?`From ${R}`:"",y,I&&I!=="trusted"?$$(I):""].filter(Boolean).join(" · "),re=[T.trim(),Ee].filter(Boolean).join(" · "),Q=x?gj(C,x):!1,we=[C==="facts"?"feed-body facts":"feed-body",C==="narrative"?"narrative":"",Q&&!G?vj(C).join(" "):""].filter(Boolean).join(" "),ae=s?J.length?g("div",{className:"feed-body facts"},J):X_(String(e.body_text||""))||g("div",{className:"feed-body"}):x?C==="facts"?YO(x.facts)||g("div",{className:we}):X_(C==="narrative"?x.narrative:x.summary,we)||g("div",{className:we}):g("div",{className:"feed-body"});async function Fe(Re){const et=se;ie(Re),Ce(!0);try{const tt=await RR(A,Re);tt?.item&&(t(tt.item),r()),X(Re==="shared"?"Memory will now sync as shared context.":"Memory is private again.")}catch(tt){ie(et),X(tt instanceof Error?tt.message:"Failed to save visibility.","warning")}finally{Ce(!1)}}async function Je(){const Re=String(e.project||"").trim(),et=Re,tt=String(u||"this memory").trim(),Cn=tt.length>80?`${tt.slice(0,79).trimEnd()}…`:tt,Yo=Re?`Move "${Cn}" from "${Re}" 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 "${Cn}". Pick an existing project or type a new name. Every memory in the same session will be reassigned together.`;let gi=[];try{gi=(await es()).filter(lt=>lt&&lt!==Re)}catch{}const vi=await Tp({title:"Assign to project",description:Yo,initialValue:et,placeholder:"Pick one or type a new project name",suggestions:gi,confirmLabel:"Move",cancelLabel:"Cancel",validate:lt=>{const Rn=lt.trim();return Rn?Rn===Re?"Already assigned to this project.":null:"Enter a project name."}});if(vi==null)return;const yi=vi.trim();if(!(!yi||yi===Re)){me(!0);try{const lt=await IR(A,yi),Rn=Number(lt.moved_memory_count||1),ga=Rn>1?`Moved ${Rn} memories from this session to "${lt.project}".`:`Moved to "${lt.project}".`;X(ga),await i(),r()}catch(lt){X(lt instanceof Error?lt.message:"Failed to move memory.","warning")}finally{me(!1)}}}async function wn(){const Re=String(u||"this memory").trim(),et=Re.length>80?`${Re.slice(0,79).trimEnd()}…`:Re;if(await vn({autoFocusAction:"cancel",title:"Forget this memory?",description:`Forgetting "${et}". 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"})){Ne(!0);try{await kR(A),n(A),r(),await i(),X("Memory forgotten and removed from the active feed.")}catch(tt){X(tt instanceof Error?tt.message:"Failed to forget memory.","warning")}finally{Ne(!1)}}}const Sn=c.replace(/_/g," "),kr=v.length?g("div",{className:"feed-files"},v.map((Re,et)=>g("span",{className:"feed-file",key:`${String(Re)}-${et}`},String(Re)))):null;return g("article",{className:`feed-item ${c}${F?" new-item":""}`.trim(),"data-key":l},g("div",{className:"feed-kind-banner"},g(qp,{variant:"kind",tone:c},Sn)),g("div",{className:"feed-card-body"},g("div",{className:"feed-card-header"},g("div",{className:"feed-header"},g("div",{className:"feed-title title",dangerouslySetInnerHTML:{__html:YE(u,S.feedQuery)}}),g("div",{className:"feed-card-subtitle small"},le)),g("div",{className:"feed-actions"},x?g(qM,{active:C,modes:U,onSelect:Re=>O(Re)}):null,g(qc,{label:S$(p),side:"left"},g("div",{className:"small feed-age"},f)),e.owned_by_self&&A>0?g(BM,{assignProjectDisabled:ce,disabled:Pe,onAssignProject:()=>{Je()},onForget:()=>{wn()},title:String(u||"memory")}):null)),g("div",{className:"feed-provenance"},g(ff,{label:h,variant:h==="You"?"mine":"author"}),g(ff,{label:w||"private",variant:w||"private"}),L?g(qc,{label:`Memory database id ${A}`,side:"top"},g(ff,{label:L,variant:"memory-id"})):null),re?g("div",{className:"feed-meta"},re):null,ae,g("div",{className:"feed-footer"},g("div",{className:"feed-footer-left"},m.length?g("div",{className:"feed-tags"},m.map((Re,et)=>g(UM,{key:`${String(Re)}-${et}`,tag:Re}))):null,e.owned_by_self&&A>0?g("div",{className:"feed-visibility-controls"},g("select",{"aria-label":`Visibility for ${String(e.title||"memory")}`,className:"feed-visibility-select",disabled:fe,onChange:Re=>{Fe(String(Re.currentTarget.value)==="shared"?"shared":"private")},value:se},g("option",{value:"private"},"Only me"),g("option",{value:"shared"},"Share with peers")),g("div",{className:"feed-visibility-note"},ye)):null),g("div",{className:"feed-footer-right"},Q?g("button",{className:"feed-expand",onClick:()=>{const Re=!G;S.itemExpandState.set(H,Re),ee(Re)},type:"button"},G?"Collapse":"Expand"):null)),kr))}function HM({index:e}){const t=[["w-85","w-65"],["w-85","w-40"],["w-65","w-85"]],[n,r]=t[e%t.length];return g("div",{className:"feed-skeleton-item","aria-hidden":"true"},g("div",{className:"feed-skeleton-banner"}),g("div",{className:"feed-skeleton-body"},g("div",{className:`feed-skeleton-line ${n}`}),g("div",{className:`feed-skeleton-line ${r}`}),g("div",{className:"feed-skeleton-footer"},g("div",{className:"feed-skeleton-chip w-36"}),g("div",{className:"feed-skeleton-chip w-56"}),g("div",{className:"feed-skeleton-chip"}))))}function VM({items:e,loadingText:t,ops:n}){if(t)return g("div",{className:"feed-skeleton",role:"status","aria-label":t},[0,1,2,3].map(r=>g(HM,{index:r,key:`skeleton-${r}`})));if(!e.length){const r=!!S.feedQuery.trim()||S.feedTypeFilter!=="all"||S.feedScopeFilter!=="all";return g("div",{className:"small feed-empty-state"},g("strong",null,r?"No memories match the current filters.":"No memories yet."),g("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 g(z,null,e.map(r=>g(GM,{item:r,key:Nt(r),onReplace:n.replaceFeedItem,onRemove:n.removeFeedItem,onViewRefresh:()=>n.updateFeedView(!0),onReload:n.loadFeedData})))}function mw({id:e,active:t,options:n,onSelect:r}){return g("div",{className:"feed-toggle",id:e},n.map(({value:i,label:a})=>{const s=i===t;return g("button",{"aria-pressed":s?"true":"false",className:`toggle-button${s?" active":""}`,"data-filter":i,key:i,onClick:()=>r(i),type:"button"},a)}))}function KM({text:e}){return g("div",{"aria-live":"polite",className:"section-meta",id:"feedMeta",role:"status"},e)}function zM({query:e,onQuery:t}){return g("input",{"aria-label":"Search memories",className:"feed-search",id:"feedSearch",onInput:n=>{t(String(n.currentTarget.value||""))},placeholder:"Search title, body, tags…",type:"search",value:e})}function WM({errorText:e,items:t,loadingText:n,ops:r}){const[i,a]=D(!1);return g(z,null,g("div",{className:"feed-controls"},g(KM,{text:n||yj(t.length,r.hasMorePages())}),g("div",{className:"feed-controls-right"},g(zM,{query:S.feedQuery,onQuery:r.updateFeedQuery}),g(mw,{active:S.feedScopeFilter,id:"feedScopeToggle",onSelect:s=>{s!==S.feedScopeFilter&&(Iy(s),r.loadFeedData().catch(()=>{}))},options:[{value:"all",label:"All"},{value:"mine",label:"My memories"},{value:"theirs",label:"Other people"}]}),g(mw,{active:S.feedTypeFilter,id:"feedTypeToggle",onSelect:s=>{s!==S.feedTypeFilter&&(oA(s),r.updateFeedView())},options:[{value:"all",label:"All"},{value:"observations",label:"Observations"},{value:"summaries",label:"Summaries"}]}),g("button",{"aria-controls":"contextInspectorPanel","aria-expanded":i,className:"settings-button feed-inspector-button",onClick:()=>a(s=>!s),type:"button"},i?"Hide Context Inspector":"Context Inspector"))),g(bj,{open:i}),g("div",{className:"feed-list",id:"feedList"},g(z,null,e?g("div",{className:"small feed-empty-state",role:"alert"},g("strong",null,e),g("div",null,"Check the viewer connection, then retry the Feed."),g("button",{className:"settings-button",onClick:()=>{r.loadFeedData().catch(()=>{})},type:"button"},"Retry")):null,!e||t.length>0?g(VM,{items:t,loadingText:n,ops:r}):null)))}function JM(e){return S.feedTypeFilter==="observations"?e.filter(t=>!Jc(t,jc(t?.metadata_json))):S.feedTypeFilter==="summaries"?e.filter(t=>Jc(t,jc(t?.metadata_json))):e}function YM(e){const t=e.map(n=>`${r_(n)}:${n.kind||""}:${n.created_at_utc||n.created_at||""}:${String(n.owned_by_self??"")}`);return`${S.feedTypeFilter}|${S.feedScopeFilter}|${S.currentProject}|${S.viewerActorId??""}|${co(S.feedQuery)}|${t.join("|")}`}var hw="",Co=0,Ro=0,ia=!0,aa=!0,Qc=null,XM=0,hr=null,gw=!1,Io=0,mf="all",vw="",ko=null,oa="",dV=250;function yw(e){hw=e,mf=S.feedScopeFilter,vw=S.feedQuery.trim(),oa="",Io+=1,Co=0,Ro=0,ia=!0,aa=!0,S.lastFeedItems=[],S.pendingFeedItems=null,S.lastFeedFilteredCount=0,S.lastFeedSignature="",S.newItemKeys.clear(),S.itemViewState.clear(),S.itemExpandState.clear()}function hf(){return ia||aa}function QM(e){const t=Nt(e);S.lastFeedItems=S.lastFeedItems.map(n=>Nt(n)===t?e:n)}function ZM(e){const t=new Set,n=r=>{const i=Number(r.id||r.memory_id||0)!==e;return i||t.add(Nt(r)),i};S.lastFeedItems=S.lastFeedItems.filter(n),Array.isArray(S.pendingFeedItems)&&(S.pendingFeedItems=S.pendingFeedItems.filter(n));for(const r of t){S.newItemKeys.delete(r),S.itemViewState.delete(r);for(const i of Array.from(S.itemExpandState.keys()))i.startsWith(`${r}:`)&&S.itemExpandState.delete(i)}}async function e1(){if(!hf())return;const e=Io;if(Qc===e)return;const t=S.currentProject||"",n=S.feedQuery.trim(),r=Co,i=Ro;Qc=e;try{const[a,s]=await Promise.all([ia?Km(t,{limit:20,offset:r,scope:S.feedScopeFilter,q:n||void 0}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:r}}),aa?zm(t,{limit:50,offset:i,scope:S.feedScopeFilter,q:n||void 0}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:i}})]);if(e!==Io||t!==(S.currentProject||"")||n!==S.feedQuery.trim())return;const c=s.items||[],l=a.items||[],d=n?l:l.filter(f=>!n_(f));S.lastFeedFilteredCount+=l.length-d.length,aa=Oc(s,c.length,50),ia=Oc(a,l.length,20),Ro=Mc(s,i+c.length),Co=Mc(a,r+l.length);const u=[...c,...d],p=i_(S.lastFeedItems,u);S.lastFeedItems=p,oi()}finally{Qc===e&&(Qc=null)}}function bw(){S.activeTab==="feed"&&(ko||hr||hf()&&F$()&&e1())}var t1={replaceFeedItem:QM,removeFeedItem:ZM,updateFeedView:e=>oi(e),loadFeedData:()=>yf(),updateFeedQuery:e=>r1(e),hasMorePages:hf};function gf(e,t){const n=document.getElementById("tab-feed");if(!n)return!1;dj(n,g(WM,{errorText:t?.errorText,items:e,loadingText:t?.loadingText,ops:t1}));const r=globalThis.lucide;return r&&!t?.loadingText&&r.createIcons(),!0}function vf(e="Loading selected project..."){gf([],{loadingText:e})}function n1(){lj(),gf(S.lastFeedItems,S.lastFeedItems.length||S.lastFeedSignature?void 0:{loadingText:"Loading memories…"}),gw||(window.addEventListener("scroll",()=>{bw()},{passive:!0}),gw=!0)}function r1(e){if(e===S.feedQuery)return;const t=S.feedQuery.trim();S.feedQuery=e,e.trim()!==t&&(yw(S.currentProject||""),vf("Searching memories…"),ko&&clearTimeout(ko),ko=setTimeout(()=>{ko=null,yf().catch(()=>{})},250))}function oi(e=!1){if(!document.getElementById("tab-feed"))return;const t=window.scrollY,n=JM(S.lastFeedItems),r=YM(n),i=e||r!==S.lastFeedSignature;S.lastFeedSignature=r,i&&gf(n,{errorText:oa||void 0}),window.scrollTo({top:t}),bw()}function _w(e,t,n,r){return ww(e,t)&&e===Io&&n===(S.currentProject||"")&&r===S.feedQuery.trim()}function ww(e,t){return hr?.generation===e&&hr.requestId===t}async function yf(e={}){const t=S.currentProject||"",n=S.feedScopeFilter!==mf,r=S.feedQuery.trim(),i=r!==vw;(t!==hw||n||i)&&(yw(t),vf(i?"Searching memories…":void 0));const a=Io,s=++XM;hr={generation:a,requestId:s};const c=!!oa;c&&(oa="",S.lastFeedItems.length>0?oi(!0):vf(r?"Searching memories…":void 0));try{const[u,p]=await Promise.all([Km(t,{limit:20,offset:0,scope:S.feedScopeFilter,q:r||void 0,signal:e.signal}),zm(t,{limit:50,offset:0,scope:S.feedScopeFilter,q:r||void 0,signal:e.signal})]);if(e.signal?.aborted||!_w(a,s,t,r))return;const f=p.items||[],m=u.items||[],v=r?m:m.filter(_=>!n_(_)),b=m.length-v.length,h=[...f,...v].sort((_,R)=>new Date(R.created_at||0).getTime()-new Date(_.created_at||0).getTime()),y=M$(S.lastFeedItems,h),w=S.lastFeedItems;if(B$(y,w)&&w.length>0){const _=new Set(w.map(Nt));y.forEach(R=>{_.has(Nt(R))||S.newItemKeys.add(Nt(R))})}S.pendingFeedItems=null,S.lastFeedItems=y,oa="",S.lastFeedFilteredCount=Math.max(S.lastFeedFilteredCount,b),aa=Oc(p,f.length,50),ia=Oc(u,m.length,20),Ro=Math.max(Ro,Mc(p,f.length)),Co=Math.max(Co,Mc(u,m.length)),mf=S.feedScopeFilter,hr?.generation===a&&hr.requestId===s&&(hr=null),oi(c)}catch(l){if(e.signal?.aborted)return;throw _w(a,s,t,r)&&(ia=!1,aa=!1,oa="Feed unavailable. Refresh and try again.",oi(!0)),l}finally{ww(a,s)&&(hr=null)}}function i1(e){return e.channel==="latest"?"stable":e.channel}function uV(e){return e}function a1(e){const t=new Date(e.periodStart),n=new Date(e.periodEnd),r=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric"}),i=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",year:"numeric"});return t.getFullYear()===n.getFullYear()?[r.format(t),i.format(n)]:[i.format(t),i.format(n)]}function o1(e,t){const n=100*e/t,r=Math.round(n);return n>0&&r===0?"<1%":n<100&&r===100?">99%":`${r}%`}function s1(e){if(e.freshEvaluations===0)return[{label:"Recalls checked",value:0,tooltip:"No automatic recalls were checked for repeated memories in this period.",icon:"activity"},{label:"Not checked",value:e.unmeasuredAttempts,tooltip:`Codemem could not check ${e.unmeasuredAttempts.toLocaleString()} automatic recalls for repeated memories, so savings are unknown.`,icon:"circle-help"}];const t=o1(e.evaluationsWithDuplicates,e.freshEvaluations),n=e.missingRetainedMetadata>0||e.invalidRetainedMetadata>0||e.packMetadataGaps>0;return[{label:"Recalls with repeats",value:t,tooltip:`Codemem removed repeated memories from ${e.evaluationsWithDuplicates.toLocaleString()} of ${e.freshEvaluations.toLocaleString()} automatic recalls.`,icon:"filter"},{label:"Memories skipped",value:e.duplicatesOmitted,tooltip:`Codemem left out ${e.duplicatesOmitted.toLocaleString()} memories that were already in your conversation, out of ${e.candidateItems.toLocaleString()} considered.`,icon:"minus-circle"},{label:"Repeated tokens removed",value:`~${so(e.estimatedTokensAvoided)}`,tooltip:`About ${e.estimatedTokensAvoided.toLocaleString()} tokens were left out because they repeated information already in your conversation.`,icon:"trending-down"},{label:"Recalls checked",value:e.freshEvaluations,tooltip:`Codemem checked ${e.freshEvaluations.toLocaleString()} automatic recalls for repeated memories. ${e.unmeasuredAttempts.toLocaleString()} more could not be checked.${n?" Some results may be incomplete.":""}`,icon:"activity"}]}function c1(e){if(!e||e.availability==="unavailable")return g("p",{class:"section-meta"},"Automatic recall details aren’t available. Update Codemem and refresh this page.");const[t,n]=a1(e);return g(z,null,g("div",{class:"grid-2 automatic-recall-grid"},s1(e).map(r=>g(Sw,{...r,key:`${r.label}-${r.icon}`}))),g("p",{class:"automatic-recall-meta"},g("time",{dateTime:e.periodStart},t),"–",g("time",{dateTime:e.periodEnd},n),` · Based on up to ${e.windowLimit.toLocaleString()} recent automatic recalls across all projects.${e.freshEvaluations===0?" No recalls were checked, so savings are unknown.":""}`))}function l1(e,t){e&&(Ue(g(Bc,null,g("details",{class:"automatic-recall"},g("summary",null,"Automatic recall"),g("section",{"aria-label":"Automatic recall measurements"},c1(Wm(t))))),e),Po())}function d1(e){if(e.install_kind==="repo-dev")return{title:"Running from repository source",detail:`Package metadata version: ${e.current_version}. Registry releases do not describe the checked-out source revision.`,tone:"current"};if(!e.latest_version)return{title:"Update check unavailable",detail:e.error?`Could not check for updates: ${e.error}`:"Could not check for updates.",tone:"unavailable"};if(e.stale)return{title:e.update_available?`Cached update status: Codemem ${e.latest_version} is available`:`Cached update status for Codemem ${e.current_version}`,detail:e.error?`This result is stale because a fresh check failed: ${e.error}`:"This result is cached and may be stale.",tone:"stale"};if(e.update_available)return{title:`Codemem ${e.latest_version} is available`,detail:`Installed version: ${e.current_version}.`,tone:"available"};const t=i1(e);return t?{title:`Codemem ${e.current_version} is up to date`,detail:`You are running the latest ${t} release.`,tone:"current"}:{title:`Unable to compare Codemem ${e.current_version} with ${e.latest_version}`,detail:"The installed version is not on a supported release channel.",tone:"unavailable"}}function u1({status:e}){const t=d1(e),n=e.install_kind==="repo-dev"||e.update_available||e.stale||!e.latest_version||!e.channel;return g("section",{class:`health-update-banner health-update-banner--${t.tone}`,role:"status","aria-atomic":"true","aria-label":"Codemem update status"},g("i",{"aria-hidden":"true","data-lucide":"circle-arrow-up",class:"health-update-icon"}),g("div",{class:"health-update-copy"},g("h2",null,t.title),g("p",null,t.detail),n&&e.recommended_action?g("p",{class:"health-update-guidance"},g("span",{class:"health-update-guidance-label"},"Recommended action"),g("code",null,e.recommended_action)):null))}function p1(e,t){e&&(e.hidden=!t,Ue(t?g(u1,{status:t}):null,e))}function f1({label:e,value:t,detail:n,icon:r,className:i,title:a}){const s=g("div",{class:`stat${i?` ${i}`:""}`,style:a?"cursor: help;":void 0},r?g("i",{"data-lucide":r,class:"stat-icon"}):null,g("div",{class:"stat-content"},g("div",{class:"value"},t),g("div",{class:"label"},e),n?g("div",{class:"small"},n):null));return a?g(qc,{label:a},s):s}function m1({item:e}){let t=null,n=null;const r=e.actionLabel||"Run";async function i(){if(!(!e.action||!t)){t.disabled=!0,t.textContent="Running…";try{await e.action(t)}catch{}t.disabled=!1,t.textContent=r}}function a(){!e.command||!n||Va(e.command,n)}return g("div",{class:"health-action"},g("div",{class:"health-action-text"},e.label,e.command?g("span",{class:"health-action-command"},e.command):null),g("div",{class:"health-action-buttons"},e.action?g("button",{class:"settings-button",onClick:i,ref:s=>{t=s}},r):null,e.command?g("button",{class:"settings-button health-action-copy",onClick:a,ref:s=>{n=s}},"Copy"):null))}function h1(e){return typeof e=="number"?e.toLocaleString():e==null?"n/a":String(e)}function Sw({label:e,value:t,icon:n,tooltip:r}){const i=g("div",{class:"stat",style:r?"cursor: help;":void 0,tabIndex:r?0:void 0},g("i",{"data-lucide":n,class:"stat-icon"}),g("div",{class:"stat-content"},g("div",{class:"value"},h1(t)),g("div",{class:"label"},e)));return r?g(qc,{label:r},i):i}function Cw(e,t){e&&Ue(g(Bc,null,t.map(n=>g(Sw,{...n,key:`${n.label}-${n.icon}`}))),e)}function To(e,t){e&&Ue(g(z,null,t),e)}function Po(){const e=globalThis.lucide;e&&typeof e.createIcons=="function"&&e.createIcons()}function Rw(e,t){e&&Ue(g(Bc,null,t.map(n=>g(f1,{...n,key:n.key??n.label}))),e)}function Iw(e,t){if(e){if(!t.length){e.hidden=!0,Ue(null,e);return}e.hidden=!1,Ue(g(z,null,t.slice(0,3).map((n,r)=>g(m1,{item:n,key:`${n.label}-${r}`}))),e)}}function bf(e,t){let n=e.events_global;return t&&(n=e.events_filtered??e.events),n.find(r=>r.event==="pack")??null}var kw="scope_id_backfill";function Tw(){const e=document.getElementById("healthDot");e&&(e.className="health-dot status-unknown",e.title="Open Health to check status");const t=document.getElementById("metaLine");t&&To(t,"")}function g1(e,t){!t||e.length>=3||e.push({label:"Background maintenance failed. Review recent safe failure evidence.",command:"codemem maintenance status",action:n=>Fr({severity:"error",subsystem:"maintenance",trigger:n}),actionLabel:"View diagnostics"})}function v1(e,t,n){if(t){e.textContent=n.length?`Some Health data is stale. Last known risks: ${n.join(", ")}.`:"Some Health data is stale. Showing the last successful snapshot.";return}if(n.length){e.textContent=`Why this status: ${n.join(", ")}.`;return}e.textContent="Healthy right now. Diagnostics stay available if you want details."}function y1(e,t){return e>=60?{label:"Attention",className:"status-attention"}:e>=25?{label:"Degraded",className:"status-degraded"}:t?{label:"Stale",className:"status-unknown"}:{label:"Healthy",className:"status-healthy"}}function Pw(){const e=document.getElementById("healthGrid"),t=document.getElementById("healthMeta"),n=document.getElementById("healthActions"),r=document.getElementById("healthDot");if(!e||!t)return;p1(document.getElementById("healthUpdateBanner"),S.lastUpdateStatus);const i=On(S.healthStats),a=On(S.healthUsage,S.currentProject),s=On(S.healthRawEvents);if(!i||!a||!s){b1({healthGrid:e,healthMeta:t,healthActions:n,healthDot:r});return}const c=S.lastSyncStatus||{},l=i.maintenance_jobs,d=l.find(re=>re.kind===kw),u=l.some(re=>re.status==="failed"),p=i.database,f=a.recent_packs,m=bf(a,a.events_filtered!=null),v=f.length?f[0]?.created_at:null,b=f.length?f[0]?.metadata_json||{}:{},h=Number(b?.exact_duplicates_collapsed||0),y=s.pending,w=i.reliability?.counts.errored_batches??0,_=i.reliability?.rates.flush_success_rate??1,R=i.reliability?.rates.dropped_event_rate??0,I=m?$p(m.total_tokens_saved,m.total_tokens_read):"n/a",T=I$(I),A=p.tags_coverage,L=String(c.daemon_state||"unknown"),F=L==="offline-peers"?"Offline peers":L==="needs_attention"?"Needs attention":L==="rebootstrapping"?"Rebootstrapping":e_(L),N=Array.isArray(S.lastSyncPeers)?S.lastSyncPeers.length:0,j=L==="disabled"||c.enabled===!1,x=L==="offline-peers",U=!j&&N===0;let q=j?"Disabled":U?"No peers":F;const $=c.last_sync_at||c.last_sync_at_utc||null,E=Zi($),C=Zi(v),O=E!==null&&E>7200,H=E!==null&&E<=300,G=y>=200;let ee=0;const Z=[];y>=1e3?(ee+=40,Z.push("high raw-event backlog")):y>=200&&(ee+=24,Z.push("growing raw-event backlog")),w>0&&y>=200&&(ee+=w>=5?10:6,Z.push("batch errors during backlog pressure")),_<.95&&(ee+=20,Z.push("lower flush success")),R>.02?(ee+=24,Z.push("high dropped-event rate")):R>.005&&(ee+=10,Z.push("non-trivial dropped-event rate")),!j&&!U&&(L==="error"?(ee+=36,Z.push("sync daemon reports errors")):L==="needs_attention"?(ee+=40,Z.push("sync needs manual attention")):L==="stopped"?(ee+=22,Z.push("sync daemon stopped")):L==="degraded"&&!H&&(ee+=20,Z.push("sync daemon degraded")),x?(ee+=4,Z.push("all peers currently offline"),O&&(ee+=4,Z.push("offline peers and sync not recent"))):O?(ee+=26,Z.push("sync looks stale")):E!==null&&E>1800&&(ee+=12,Z.push("sync not recent"))),T!==null&&T<10&&(ee+=8,Z.push("low retrieval reduction")),C!==null&&C>86400&&(ee+=12,Z.push("memory pack activity is old"));const ie=[S.healthStats,S.healthUsage,S.healthRawEvents].some(re=>Qs(re)),{label:fe,className:Ce}=y1(ee,ie),Pe=Ce==="status-healthy";r&&(r.className=`health-dot ${Ce}`,r.title=fe);const Ne=m?`${m.total_tokens_saved.toLocaleString()} estimated saved tokens · ${h.toLocaleString()} deduped in latest pack`:"No pack usage is available",ce=y>0?"Queue is actively draining":"Queue is clear",me=j?"Sync disabled":U?"No peers configured":x?`${N} peers offline · last sync ${ur(E)} ago`:`${N} peers · last sync ${ur(E)} ago`;Pe&&!j&&!U&&(x?q="Peers offline":L==="degraded"&&H&&(q="Syncing"));const J=`last pack ${ur(C)} ago`,se=l.map(re=>{const Q=Number(re.progress?.current||0),we=typeof re.progress?.total=="number"?re.progress.total:null,ae=String(re.progress?.unit||"items"),Fe=we&&we>0?` (${Math.round(100*Q/we)}%)`:"",Je=we&&we>0?`${Q.toLocaleString()}/${we.toLocaleString()} ${ae}${Fe}`:`${Q.toLocaleString()} ${ae}`,wn=re.status==="failed",Sn=re.status==="completed",kr=re.kind===kw,Re=wn?"Failed":Sn?"Complete":Je,et=wn?String(re.error||"unknown error").trim():Sn?kr?`${Je} · one-time Sharing-domain upgrade finished`:Je:kr?"One-time upgrade backfill; totals include memories and replication ops":void 0;return{key:String(re.kind||re.title||"background-maintenance"),label:String(re.title||re.kind||"Background maintenance"),value:Re,detail:et,icon:wn?"alert-triangle":Sn?"check-circle":"loader",className:wn?"status-attention":void 0,title:wn?`Error: ${re.error||"unknown"}`:Sn?`${String(re.title||"Maintenance")} finished`:kr?`${String(re.title||"Maintenance")} in progress; inspect with codemem maintenance status`:`${String(re.title||"Maintenance")} in progress`}}),ye=[{key:"overall-health",label:"Overall health",value:fe,detail:`Weighted score ${ee}`,icon:"heart-pulse",className:`health-primary ${Ce}`,title:Z.length?`Main signals: ${Z.join(", ")}`:"No major risk signals detected"},...se,{key:"pipeline-health",label:"Pipeline health",value:`${y.toLocaleString()} pending`,detail:ce,icon:"workflow",title:"Raw-event queue pressure and flush reliability"},{key:"retrieval-impact",label:"Retrieval impact",value:I,detail:Ne,icon:"sparkles",title:"Reduction from memory reuse across recent usage"},{key:"sync-health",label:"Sync health",value:q,detail:me,icon:"refresh-cw",title:"Daemon state and sync recency"},{key:"data-freshness",label:"Data freshness",value:ur(C),detail:J,icon:"clock-3",title:"Recency of last memory pack activity"}];Rw(e,ye);const le=async()=>{await nd()},Ee=[];G?(Ee.push({label:"Pipeline needs attention. Check queue health first.",command:"codemem db raw-events-status",action:re=>Fr({subsystem:"capture",trigger:re}),actionLabel:"View diagnostics"}),Ee.push({label:"Then retry failed batches for impacted sessions.",command:"codemem db raw-events-retry <opencode_session_id>"})):L==="stopped"?Ee.push({label:"Sync daemon is stopped. Start the background service.",command:"codemem serve start"}):!j&&!U&&!Pe&&(L==="error"||L==="degraded")?(Ee.push({label:"Sync is unhealthy. Restart and run one immediate pass.",command:"codemem serve restart",action:le,actionLabel:"Sync now"}),Ee.push({label:"Then run doctor to see root cause details.",command:"codemem sync doctor"})):!j&&!U&&O&&Ee.push({label:"Sync is stale. Run one immediate sync pass.",command:"codemem sync once",action:le,actionLabel:"Sync now"}),g1(Ee,u),A>0&&A<.7&&Ee.length<2&&Ee.push({label:"Tag coverage is low. Preview backfill impact.",command:"codemem db backfill-tags --dry-run"}),d&&d.status!=="completed"&&Ee.length<3&&Ee.push({label:"Sharing-domain upgrade backfill is expected one-time work. Inspect progress if startup feels busy.",command:"codemem maintenance status"}),Iw(n,Ee),v1(t,ie,Z),Po()}function b1({healthGrid:e,healthMeta:t,healthActions:n,healthDot:r}){const i=[S.healthStats,S.healthUsage,S.healthRawEvents],a=i.some(d=>d.status==="failed"),s=i.some(d=>d.status==="loading");let c="Not loaded",l="Open or refresh Health to load status.";a?(c="Unavailable",l="Some health data failed to load. Refresh Health to try again."):s&&(c="Loading",l="Loading health data…"),Rw(e,[{key:"overall-health",label:"Overall health",value:c,detail:"Health requires stats, usage, and queue data",icon:a?"triangle-alert":"loader",className:"health-primary status-unknown"}]),Iw(n,[]),To(t,l),r&&(r.className="health-dot status-unknown",r.title=c),Po()}function _1(){const e=document.getElementById("sessionGrid"),t=document.getElementById("sessionMeta");if(!e||!t)return;const n=On(S.healthUsage,S.currentProject),r=On(S.healthSession,S.currentProject),{latestPack:i,packCount:a,packLine:s}=w1(n),c=i?.created_at||"",l=c?`Last pack: ${Zr(c)}`:"",d=S.currentProject?"Project":"All projects",u=S1(r,S.healthSession.status==="failed"),p=R1(i,a),f=C1(n,r)?"Showing stale data":"";To(t,[d,s,l,u,f].filter(Boolean).join(" · ")),Cw(e,p),Po()}function w1(e){if(!e)return{latestPack:null,packCount:null,packLine:"Pack totals unavailable"};const t=e.events.find(n=>n.event==="pack")?.count??0;return{latestPack:e.recent_packs[0]??null,packCount:t,packLine:t?`${t} packs`:"No packs yet"}}function S1(e,t){return e?`${e.total.toLocaleString()} stored items`:t?"Stored-item totals unavailable":""}function C1(e,t){return!!e&&Qs(S.healthUsage,S.currentProject)||!!t&&Qs(S.healthSession,S.currentProject)}function R1(e,t){const n=e?.metadata_json||{},r=e?.tokens_read??0,i=e?.tokens_saved??0,a=n.exact_duplicates_collapsed??0,s=$p(i,r);let c="n/a";return e&&(c=n.exact_dedupe_enabled?"On":"Off"),[{label:"Last pack savings",value:e?`${so(i)} (${s})`:"n/a",tooltip:e?`Estimate: ${i.toLocaleString()} saved`:void 0,icon:"trending-up"},{label:"Last pack size",value:e?so(r):"n/a",tooltip:e?`Estimate: ${r.toLocaleString()} injected`:void 0,icon:"package"},{label:"Last pack deduped",value:e?a.toLocaleString():"n/a",icon:"copy-check"},{label:"Exact dedupe",value:c,icon:"shield-check"},{label:"Packs",value:t??"n/a",icon:"archive"}]}function I1(e,t,n){if(t>0){e.push({label:"Raw events pending",value:t,tooltip:"Pending raw events waiting to be flushed",icon:"activity"});return}n>0&&e.push({label:"Raw sessions",value:n,tooltip:"Sessions with pending raw events",icon:"inbox"})}function k1(){const e=document.getElementById("statsGrid"),t=document.getElementById("metaLine");if(!e)return;const n=On(S.healthStats),r=On(S.healthUsage,S.currentProject),i=On(S.healthRawEvents),a=n?.database,s=S.currentProject,c=r?.totals_filtered??null,l=!!(s&&c),d=r?bf(r,!1):null,u=r?bf(r,l):null,p=i?.sessions??0,f=i?.pending??0,m=l&&d?`
108
+ Please report this to https://github.com/markedjs/marked.`,e){let r="<p>An error occurred:</p><pre>"+yn(n.message+"",!0)+"</pre>";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}},ii=new VO;function Me(e,t){return ii.parse(e,t)}Me.options=Me.setOptions=function(e){return ii.setOptions(e),Me.defaults=ii.defaults,L_(Me.defaults),Me},Me.getDefaults=Yp,Me.defaults=ni;function KO(...e){return ii.use(...e),Me.defaults=ii.defaults,L_(Me.defaults),Me}Me.use=KO,Me.walkTokens=function(e,t){return ii.walkTokens(e,t)},Me.parseInline=ii.parseInline,Me.Parser=nn,Me.parser=nn.parse,Me.Renderer=Wc,Me.TextRenderer=af,Me.Lexer=tn,Me.lexer=tn.lex,Me.Tokenizer=zc,Me.Hooks=bo,Me.parse=Me;var YH=Me.options,XH=Me.setOptions,QH=Me.walkTokens,ZH=Me.parseInline,eV=nn.parse,tV=tn.lex,zO={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 WO(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:")}D_.addHook("afterSanitizeAttributes",e=>{e.tagName==="A"&&(WO(e.getAttribute("href")||"")?(e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank")):e.removeAttribute("href"))});function of(e){const t=Me.parse(String(e||""),{async:!1});return D_.sanitize(t,zO)}function JO(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=Object.keys(e);return t.filter(r=>n.includes(r)).map(r=>{const i=String(e[r]||"").trim();return i?g("div",{className:"summary-section",key:r},g("div",{className:"summary-section-label"},k$(r)),g("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:of(i)}})):null}).filter(Boolean)}function YO(e){const t=e.map(n=>String(n||"").trim()).filter(Boolean);if(!t.length)return null;if(t.every(n=>/.+?:\s+.+/.test(n))){const n=t.map((r,i)=>{const a=r.indexOf(":"),s=r.slice(0,a).trim(),c=r.slice(a+1).trim();return!s||!c?null:g("div",{className:"summary-section",key:`${s}-${i}`},g("div",{className:"summary-section-label"},s),g("div",{className:"summary-section-content",dangerouslySetInnerHTML:{__html:of(c)}}))}).filter(Boolean);if(n.length)return g("div",{className:"feed-body facts"},n)}return g("div",{className:"feed-body"},g("ul",null,t.map((n,r)=>g("li",{key:`${n}-${r}`},n))))}function X_(e,t="feed-body"){const n=String(e||"").trim();return n?g("div",{className:t,dangerouslySetInnerHTML:{__html:of(n)}}):null}function XO(e){const t=["request","outcome","plan","completed","learned","investigated","next","next_steps","notes"],n=s=>{if(!s||typeof s!="object"||Array.isArray(s))return!1;const c=s;return t.some(l=>{const d=c[l];return typeof d=="string"&&d.trim().length>0})},r=e?.summary;if(r&&typeof r=="object"&&!Array.isArray(r)){const s=r.summary;if(n(r))return r;if(n(s))return s}const i=e?.metadata_json;if(n(i))return i;if(i&&n(i.summary))return i.summary;const a=String(e?.body_text||"").trim();if(a.includes("## ")){const s={request:"request",completed:"completed",learned:"learned",investigated:"investigated","next steps":"next_steps",notes:"notes"},c={},l=/(?:^|\n)##\s+([^\n]+)\n([\s\S]*?)(?=\n##\s+|$)/g;for(let d=l.exec(a);d;d=l.exec(a)){const u=s[String(d[1]||"").trim().toLowerCase()],p=String(d[2]||"").trim();u&&p&&(c[u]=p)}if(n(c))return c}return null}function Jc(e,t){return String(e?.kind||"").toLowerCase()==="session_summary"||t?.is_summary===!0?!0:String(t?.source||"").trim().toLowerCase()==="observer_summary"}function QO(e,t){const n=String(e?.kind||"").trim().toLowerCase();return Jc(e,t)?"session_summary":n||"change"}var ZO=Object.defineProperty,He=(e,t)=>ZO(e,"name",{value:t,configurable:!0}),sf=["Enter"," "],eM=["ArrowDown","PageUp","Home"],Q_=["ArrowUp","PageDown","End"],tM=[...eM,...Q_],nV={ltr:[...sf,"ArrowRight"],rtl:[...sf,"ArrowLeft"]},Yc="Menu",[cf,nM,rM]=Ua(Yc),[ai,Z_]=dt(Yc,[rM,ar,Ui]),lf=ar(),ew=Ui(),[iM,_o]=ai(Yc),[aM,df]=ai(Yc),oM=He(e=>{const{__scopeMenu:t,open:n=!1,children:r,dir:i,onOpenChange:a,modal:s=!0}=e,c=lf(t),[l,d]=D(null),u=B(!1),p=ht(a),f=qi(i);return V(()=>{const m=He(()=>{u.current=!0,document.addEventListener("pointerdown",v,{capture:!0,once:!0}),document.addEventListener("pointermove",v,{capture:!0,once:!0})},"handleKeyDown"),v=He(()=>u.current=!1,"handlePointer");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})}},[]),V(()=>{if(!n)return;const m=He(()=>p(!1),"handleBlur");return window.addEventListener("blur",m),()=>window.removeEventListener("blur",m)},[n,p]),o(vc,{...c,children:o(iM,{scope:t,open:n,onOpenChange:p,content:l,onContentChange:d,children:o(aM,{scope:t,onClose:oe(()=>p(!1),[p]),isUsingKeyboardRef:u,dir:f,modal:s,children:r})})})},"Menu"),sM=W(He(function(t,n){const{__scopeMenu:r,...i}=t,a=lf(r);return o(eo,{...a,...i,ref:n})},"MenuAnchor")),tw="MenuPortal",[cM,lM]=ai(tw,{forceMount:void 0}),dM=He(e=>{const{__scopeMenu:t,forceMount:n,children:r,container:i}=e,a=_o(tw,t);return o(cM,{scope:t,forceMount:n,children:o(Pt,{present:n||a.open,children:o(Ti,{asChild:!0,container:i,children:r})})})},"MenuPortal"),mr="MenuContent",[uM,nw]=ai(mr),pM=W(He(function(t,n){const r=lM(mr,t.__scopeMenu),{forceMount:i=r.forceMount,...a}=t,s=_o(mr,t.__scopeMenu),c=df(mr,t.__scopeMenu);return o(cf.Provider,{scope:t.__scopeMenu,children:o(Pt,{present:i||s.open,children:o(cf.Slot,{scope:t.__scopeMenu,children:c.modal?o(fM,{...a,ref:n}):o(mM,{...a,ref:n})})})})},"MenuContent")),fM=W(He(function(t,n){const r=_o(mr,t.__scopeMenu),i=B(null),a=Se(n,i);return V(()=>{const s=i.current;if(s)return ks(s)},[]),o(rw,{...t,ref:a,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:ne(t.onFocusOutside,s=>s.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)})},"MenuRootContentModal")),mM=W(He(function(t,n){const r=_o(mr,t.__scopeMenu);return o(rw,{...t,ref:n,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)})},"MenuRootContentNonModal")),hM=dn("MenuContent.ScrollLock"),rw=W(He(function(t,n){const{__scopeMenu:r,loop:i=!1,trapFocus:a,onOpenAutoFocus:s,onCloseAutoFocus:c,disableOutsidePointerEvents:l,onEntryFocus:d,onEscapeKeyDown:u,onPointerDownOutside:p,onFocusOutside:f,onInteractOutside:m,onDismiss:v,disableOutsideScroll:b,...h}=t,y=_o(mr,r),w=df(mr,r),_=lf(r),R=ew(r),I=nM(r),[T,A]=D(null),L=B(null),F=Se(n,L,y.onContentChange),N=B(0),j=B(""),x=B(0),U=B(null),q=B("right"),$=B(0),E=b?Ea:z,C=b?{as:hM,allowPinchZoom:!0}:void 0,O=He(G=>{const ee=j.current+G,Z=I().filter(Ne=>!Ne.disabled),ie=document.activeElement,fe=Z.find(Ne=>Ne.ref.current===ie)?.textValue,Ce=lw(Z.map(Ne=>Ne.textValue),ee,fe),Pe=Z.find(Ne=>Ne.textValue===Ce)?.ref.current;He((function Ne(ce){j.current=ce,window.clearTimeout(N.current),ce!==""&&(N.current=window.setTimeout(()=>Ne(""),1e3))}),"updateSearch")(ee),Pe&&setTimeout(()=>Pe.focus())},"handleTypeaheadSearch");V(()=>()=>window.clearTimeout(N.current),[]),Ei();const H=oe(G=>q.current===U.current?.side&&uw(G,U.current?.area),[]);return o(uM,{scope:r,searchRef:j,onItemEnter:oe(G=>{H(G)&&G.preventDefault()},[H]),onItemLeave:oe(G=>{H(G)||(L.current?.focus(),A(null))},[H]),onTriggerLeave:oe(G=>{H(G)&&G.preventDefault()},[H]),pointerGraceTimerRef:x,onPointerGraceIntentChange:oe(G=>{U.current=G},[]),children:o(E,{...C,children:o(vs,{asChild:!0,trapped:a,onMountAutoFocus:ne(s,G=>{G.preventDefault(),L.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:c,children:o(ki,{asChild:!0,disableOutsidePointerEvents:l,onEscapeKeyDown:u,onPointerDownOutside:p,onFocusOutside:f,onInteractOutside:m,onDismiss:v,children:o($u,{asChild:!0,...R,dir:w.dir,orientation:"vertical",loop:i,currentTabStopId:T,onCurrentTabStopIdChange:A,onEntryFocus:ne(d,G=>{w.isUsingKeyboardRef.current||G.preventDefault()}),preventScrollOnEntryFocus:!0,children:o(yc,{role:"menu","aria-orientation":"vertical","data-state":aw(y.open),"data-radix-menu-content":"",dir:w.dir,..._,...h,ref:F,style:{outline:"none",...h.style},onKeyDown:ne(h.onKeyDown,G=>{const ee=G.target.closest("[data-radix-menu-content]")===G.currentTarget,Z=G.ctrlKey||G.altKey||G.metaKey,ie=G.key.length===1;ee&&(G.key==="Tab"&&G.preventDefault(),!Z&&ie&&O(G.key));const fe=L.current;if(G.target!==fe||!tM.includes(G.key))return;G.preventDefault();const Ce=I().filter(Pe=>!Pe.disabled).map(Pe=>Pe.ref.current);Q_.includes(G.key)&&Ce.reverse(),sw(Ce)}),onBlur:ne(t.onBlur,G=>{G.currentTarget.contains(G.target)||(window.clearTimeout(N.current),j.current="")}),onPointerMove:ne(t.onPointerMove,Xc(G=>{const ee=G.target,Z=$.current!==G.clientX;if(G.currentTarget.contains(ee)&&Z){const ie=G.clientX>$.current?"right":"left";q.current=ie,$.current=G.clientX}}))})})})})})})},"MenuContentImpl")),uf="MenuItem",iw="menu.itemSelect",gM=W(He(function(t,n){const{disabled:r=!1,onSelect:i,...a}=t,s=B(null),c=df(uf,t.__scopeMenu),l=nw(uf,t.__scopeMenu),d=Se(n,s),u=B(!1),p=He(()=>{const f=s.current;if(!r&&f){const m=new CustomEvent(iw,{bubbles:!0,cancelable:!0});f.addEventListener(iw,v=>i?.(v),{once:!0}),gs(f,m),m.defaultPrevented?u.current=!1:c.onClose()}},"handleSelect");return o(vM,{...a,ref:d,disabled:r,onClick:ne(t.onClick,p),onPointerDown:f=>{t.onPointerDown?.(f),u.current=!0},onPointerUp:ne(t.onPointerUp,f=>{u.current||f.currentTarget?.click()}),onKeyDown:ne(t.onKeyDown,f=>{r||f.target!==f.currentTarget||l.searchRef.current!==""&&f.key===" "||sf.includes(f.key)&&(f.currentTarget.click(),f.preventDefault())})})},"MenuItem")),vM=W(He(function(t,n){const{__scopeMenu:r,disabled:i=!1,textValue:a,...s}=t,c=nw(uf,r),l=ew(r),d=B(null),u=Se(n,d),[p,f]=D(!1),[m,v]=D("");return V(()=>{const b=d.current;b&&v((b.textContent??"").trim())},[s.children]),o(cf.ItemSlot,{scope:r,disabled:i,textValue:a??m,children:o(ju,{asChild:!0,...l,focusable:!i,children:o(ge.div,{role:"menuitem","data-highlighted":p?"":void 0,"aria-disabled":i||void 0,"data-disabled":i?"":void 0,...s,ref:u,onPointerMove:ne(t.onPointerMove,Xc(b=>{i?c.onItemLeave(b):(c.onItemEnter(b),b.defaultPrevented||b.currentTarget.focus({preventScroll:!0}))})),onPointerLeave:ne(t.onPointerLeave,Xc(b=>c.onItemLeave(b))),onFocus:ne(t.onFocus,()=>f(!0)),onBlur:ne(t.onBlur,()=>f(!1))})})})},"MenuItemImpl")),[rV,iV]=ai("MenuRadioGroup",{value:void 0,onValueChange:He(()=>{},"onValueChange")}),yM="MenuItemIndicator",[aV,oV]=ai(yM,{checked:!1}),bM="MenuSub",[sV,cV]=ai(bM);function aw(e){return e?"open":"closed"}He(aw,"getOpenState");function ow(e){return e==="indeterminate"}He(ow,"isIndeterminate");function _M(e){return ow(e)?"indeterminate":e?"checked":"unchecked"}He(_M,"getCheckedState");function sw(e){const t=document.activeElement;for(const n of e)if(n===t||(n.focus(),document.activeElement!==t))return}He(sw,"focusFirst");function cw(e,t){return e.map((n,r)=>e[(t+r)%e.length])}He(cw,"wrapArray");function lw(e,t,n){const r=t.length>1&&Array.from(t).every(c=>c===t[0])?t[0]:t,i=n?e.indexOf(n):-1;let a=cw(e,Math.max(i,0));r.length===1&&(a=a.filter(c=>c!==n));const s=a.find(c=>c.toLowerCase().startsWith(r.toLowerCase()));return s!==n?s:void 0}He(lw,"getNextMatch");function dw(e,t){const{x:n,y:r}=e;let i=!1;for(let a=0,s=t.length-1;a<t.length;s=a++){const c=t[a],l=t[s],d=c.x,u=c.y,p=l.x,f=l.y;u>r!=f>r&&n<(p-d)*(r-u)/(f-u)+d&&(i=!i)}return i}He(dw,"isPointInPolygon");function uw(e,t){return t?dw({x:e.clientX,y:e.clientY},t):!1}He(uw,"isPointerInGraceArea");function Xc(e){return t=>t.pointerType==="mouse"?e(t):void 0}He(Xc,"whenMouse");var wM=oM,SM=sM,CM=dM,RM=pM,IM=gM,kM=Object.defineProperty,wo=(e,t)=>kM(e,"name",{value:t,configurable:!0}),pf="DropdownMenu",[TM,lV]=dt(pf,[Z_]),So=Z_(),[PM,pw]=TM(pf),NM=wo(e=>{const{__scopeDropdownMenu:t,children:n,dir:r,open:i,defaultOpen:a,onOpenChange:s,modal:c=!0}=e,l=So(t),d=B(null),[u,p]=Dt({prop:i,defaultProp:a??!1,onChange:s,caller:pf});return o(PM,{scope:t,triggerId:xt(),triggerRef:d,contentId:xt(),open:u,onOpenChange:p,onOpenToggle:oe(()=>p(f=>!f),[p]),modal:c,children:o(wM,{...l,open:u,onOpenChange:p,dir:r,modal:c,children:n})})},"DropdownMenu"),EM="DropdownMenuTrigger",AM=W(wo(function(t,n){const{__scopeDropdownMenu:r,disabled:i=!1,...a}=t,s=pw(EM,r),c=So(r),l=Se(n,s.triggerRef);return o(SM,{asChild:!0,...c,children:o(ge.button,{type:"button",id:s.triggerId,"aria-haspopup":"menu","aria-expanded":s.open,"aria-controls":s.open?s.contentId:void 0,"data-state":s.open?"open":"closed","data-disabled":i?"":void 0,disabled:i,...a,ref:l,onPointerDown:ne(t.onPointerDown,d=>{!i&&d.button===0&&d.ctrlKey===!1&&(s.onOpenToggle(),s.open||d.preventDefault())}),onKeyDown:ne(t.onKeyDown,d=>{i||(["Enter"," "].includes(d.key)&&s.onOpenToggle(),d.key==="ArrowDown"&&s.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(d.key)&&d.preventDefault())})})})},"DropdownMenuTrigger")),xM=wo(e=>{const{__scopeDropdownMenu:t,...n}=e,r=So(t);return o(CM,{...r,...n})},"DropdownMenuPortal"),DM="DropdownMenuContent",LM=W(wo(function(t,n){const{__scopeDropdownMenu:r,...i}=t,a=pw(DM,r),s=So(r),c=B(!1);return o(RM,{id:a.contentId,"aria-labelledby":a.triggerId,...s,...i,ref:n,onCloseAutoFocus:ne(t.onCloseAutoFocus,l=>{c.current||a.triggerRef.current?.focus(),c.current=!1,l.preventDefault()}),onInteractOutside:ne(t.onInteractOutside,l=>{const d=l.detail.originalEvent,u=d.button===0&&d.ctrlKey===!0,p=d.button===2||u;(!a.modal||p)&&(c.current=!0)}),style:{...t.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)"}})},"DropdownMenuContent")),$M=W(wo(function(t,n){const{__scopeDropdownMenu:r,...i}=t,a=So(r);return o(IM,{...a,...i,ref:n})},"DropdownMenuItem")),jM=NM,OM=AM,MM=xM,FM=LM,fw=$M;function BM({assignProjectDisabled:e,disabled:t,onAssignProject:n,onForget:r,title:i}){return g(jM,null,g(OM,{asChild:!0},g("button",{"aria-label":`Actions for ${i}`,className:"feed-menu-trigger",type:"button"},"⋯")),g(MM,null,g(FM,{align:"end",className:"feed-menu-panel",side:"bottom",sideOffset:4},g(fw,{className:"feed-menu-item",disabled:e,onSelect:()=>n()},e?"Moving…":"Assign to project…"),g(fw,{className:"feed-menu-item danger",disabled:t,onSelect:()=>r()},t?"Forgetting…":"Forget memory"))))}function qM({modes:e,active:t,onSelect:n}){return e.length<=1?null:g("div",{className:"feed-toggle"},e.map(r=>g("button",{key:r.id,className:`toggle-button${r.id===t?" active":""}`,"data-filter":r.id,onClick:()=>n(r.id),type:"button"},r.label)))}function ff({label:e,variant:t=""}){return g(qp,{variant:"provenance",tone:t||void 0},e)}function UM({tag:e}){const t=P$(e);return t?g(qp,{variant:"tag",title:String(e)},t):null}function GM({item:e,onReplace:t,onRemove:n,onViewRefresh:r,onReload:i}){const a=jc(e?.metadata_json),s=Jc(e,a),c=QO(e,a),l=Nt(e),d=e.title||"(untitled)",u=s&&a?.request?a.request:d,p=e.created_at||e.created_at_utc,f=C$(p),m=D$(e),v=$c(e.files||[]),b=e.project||"",h=j$(e),y=O$(e,a),w=String(e.visibility||a?.visibility||"private").trim(),_=String(e.workspace_kind||a?.workspace_kind||"").trim(),R=String(e.origin_source||a?.origin_source||"").trim(),I=String(e.trust_state||a?.trust_state||"").trim(),T=v.length?` · ${T$(v)}`:"",A=Number(e.id||0),L=A>0?`ID ${A}`:"",[F,N]=D(S.newItemKeys.has(l)),j=s?XO({...e,metadata_json:a}):null,x=s?null:fj({...e,metadata_json:a}),U=x?mj(x):[],q=x?hj(x):"summary",$=S.itemViewState.get(l),E=x&&$&&U.some(Re=>Re.id===$)?$:q,[C,O]=D(E),H=`${l}:${C}`,[G,ee]=D(S.itemExpandState.get(H)===!0),[Z,ie]=D(w==="shared"?"shared":"private"),[fe,Ce]=D(!1),[Pe,Ne]=D(!1),[ce,me]=D(!1),J=j?JO(j):[];V(()=>{x&&(U.some(Re=>Re.id===C)||O(q))},[C,q,U,x]),V(()=>{S.itemViewState.set(l,C)},[C,l]),V(()=>{const Re=`${l}:${C}`;ee(S.itemExpandState.get(Re)===!0)},[C,l]),V(()=>{ie(w==="shared"?"shared":"private")},[w]),V(()=>{if(!F)return;const Re=window.setTimeout(()=>{S.newItemKeys.delete(l),N(!1)},700);return()=>window.clearTimeout(Re)},[F,l]);const se=Z,ye=se==="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.",le=[b?`Project ${b}`:"No project",f].filter(Boolean).join(" · "),Ee=[_&&_!==w?`Workspace ${_}`:"",R?`From ${R}`:"",y,I&&I!=="trusted"?$$(I):""].filter(Boolean).join(" · "),re=[T.trim(),Ee].filter(Boolean).join(" · "),Q=x?gj(C,x):!1,we=[C==="facts"?"feed-body facts":"feed-body",C==="narrative"?"narrative":"",Q&&!G?vj(C).join(" "):""].filter(Boolean).join(" "),ae=s?J.length?g("div",{className:"feed-body facts"},J):X_(String(e.body_text||""))||g("div",{className:"feed-body"}):x?C==="facts"?YO(x.facts)||g("div",{className:we}):X_(C==="narrative"?x.narrative:x.summary,we)||g("div",{className:we}):g("div",{className:"feed-body"});async function Fe(Re){const et=se;ie(Re),Ce(!0);try{const tt=await RR(A,Re);tt?.item&&(t(tt.item),r()),X(Re==="shared"?"Memory will now sync as shared context.":"Memory is private again.")}catch(tt){ie(et),X(tt instanceof Error?tt.message:"Failed to save visibility.","warning")}finally{Ce(!1)}}async function Je(){const Re=String(e.project||"").trim(),et=Re,tt=String(u||"this memory").trim(),Cn=tt.length>80?`${tt.slice(0,79).trimEnd()}…`:tt,Yo=Re?`Move "${Cn}" from "${Re}" 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 "${Cn}". Pick an existing project or type a new name. Every memory in the same session will be reassigned together.`;let gi=[];try{gi=(await es()).filter(lt=>lt&&lt!==Re)}catch{}const vi=await Tp({title:"Assign to project",description:Yo,initialValue:et,placeholder:"Pick one or type a new project name",suggestions:gi,confirmLabel:"Move",cancelLabel:"Cancel",validate:lt=>{const Rn=lt.trim();return Rn?Rn===Re?"Already assigned to this project.":null:"Enter a project name."}});if(vi==null)return;const yi=vi.trim();if(!(!yi||yi===Re)){me(!0);try{const lt=await IR(A,yi),Rn=Number(lt.moved_memory_count||1),ga=Rn>1?`Moved ${Rn} memories from this session to "${lt.project}".`:`Moved to "${lt.project}".`;X(ga),await i(),r()}catch(lt){X(lt instanceof Error?lt.message:"Failed to move memory.","warning")}finally{me(!1)}}}async function wn(){const Re=String(u||"this memory").trim(),et=Re.length>80?`${Re.slice(0,79).trimEnd()}…`:Re;if(await vn({autoFocusAction:"cancel",title:"Forget this memory?",description:`Forgetting "${et}". 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"})){Ne(!0);try{await kR(A),n(A),r(),await i(),X("Memory forgotten and removed from the active feed.")}catch(tt){X(tt instanceof Error?tt.message:"Failed to forget memory.","warning")}finally{Ne(!1)}}}const Sn=c.replace(/_/g," "),kr=v.length?g("div",{className:"feed-files"},v.map((Re,et)=>g("span",{className:"feed-file",key:`${String(Re)}-${et}`},String(Re)))):null;return g("article",{className:`feed-item ${c}${F?" new-item":""}`.trim(),"data-key":l},g("div",{className:"feed-kind-banner"},g(qp,{variant:"kind",tone:c},Sn)),g("div",{className:"feed-card-body"},g("div",{className:"feed-card-header"},g("div",{className:"feed-header"},g("div",{className:"feed-title title",dangerouslySetInnerHTML:{__html:YE(u,S.feedQuery)}}),g("div",{className:"feed-card-subtitle small"},le)),g("div",{className:"feed-actions"},x?g(qM,{active:C,modes:U,onSelect:Re=>O(Re)}):null,g(qc,{label:S$(p),side:"left"},g("div",{className:"small feed-age"},f)),e.owned_by_self&&A>0?g(BM,{assignProjectDisabled:ce,disabled:Pe,onAssignProject:()=>{Je()},onForget:()=>{wn()},title:String(u||"memory")}):null)),g("div",{className:"feed-provenance"},g(ff,{label:h,variant:h==="You"?"mine":"author"}),g(ff,{label:w||"private",variant:w||"private"}),L?g(qc,{label:`Memory database id ${A}`,side:"top"},g(ff,{label:L,variant:"memory-id"})):null),re?g("div",{className:"feed-meta"},re):null,ae,g("div",{className:"feed-footer"},g("div",{className:"feed-footer-left"},m.length?g("div",{className:"feed-tags"},m.map((Re,et)=>g(UM,{key:`${String(Re)}-${et}`,tag:Re}))):null,e.owned_by_self&&A>0?g("div",{className:"feed-visibility-controls"},g("select",{"aria-label":`Visibility for ${String(e.title||"memory")}`,className:"feed-visibility-select",disabled:fe,onChange:Re=>{Fe(String(Re.currentTarget.value)==="shared"?"shared":"private")},value:se},g("option",{value:"private"},"Only me"),g("option",{value:"shared"},"Share with peers")),g("div",{className:"feed-visibility-note"},ye)):null),g("div",{className:"feed-footer-right"},Q?g("button",{className:"feed-expand",onClick:()=>{const Re=!G;S.itemExpandState.set(H,Re),ee(Re)},type:"button"},G?"Collapse":"Expand"):null)),kr))}function HM({index:e}){const t=[["w-85","w-65"],["w-85","w-40"],["w-65","w-85"]],[n,r]=t[e%t.length];return g("div",{className:"feed-skeleton-item","aria-hidden":"true"},g("div",{className:"feed-skeleton-banner"}),g("div",{className:"feed-skeleton-body"},g("div",{className:`feed-skeleton-line ${n}`}),g("div",{className:`feed-skeleton-line ${r}`}),g("div",{className:"feed-skeleton-footer"},g("div",{className:"feed-skeleton-chip w-36"}),g("div",{className:"feed-skeleton-chip w-56"}),g("div",{className:"feed-skeleton-chip"}))))}function VM({items:e,loadingText:t,ops:n}){if(t)return g("div",{className:"feed-skeleton",role:"status","aria-label":t},[0,1,2,3].map(r=>g(HM,{index:r,key:`skeleton-${r}`})));if(!e.length){const r=!!S.feedQuery.trim()||S.feedTypeFilter!=="all"||S.feedScopeFilter!=="all";return g("div",{className:"small feed-empty-state"},g("strong",null,r?"No memories match the current filters.":"No memories yet."),g("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 g(z,null,e.map(r=>g(GM,{item:r,key:Nt(r),onReplace:n.replaceFeedItem,onRemove:n.removeFeedItem,onViewRefresh:()=>n.updateFeedView(!0),onReload:n.loadFeedData})))}function mw({id:e,active:t,options:n,onSelect:r}){return g("div",{className:"feed-toggle",id:e},n.map(({value:i,label:a})=>{const s=i===t;return g("button",{"aria-pressed":s?"true":"false",className:`toggle-button${s?" active":""}`,"data-filter":i,key:i,onClick:()=>r(i),type:"button"},a)}))}function KM({text:e}){return g("div",{"aria-live":"polite",className:"section-meta",id:"feedMeta",role:"status"},e)}function zM({query:e,onQuery:t}){return g("input",{"aria-label":"Search memories",className:"feed-search",id:"feedSearch",onInput:n=>{t(String(n.currentTarget.value||""))},placeholder:"Search title, body, tags…",type:"search",value:e})}function WM({errorText:e,items:t,loadingText:n,ops:r}){const[i,a]=D(!1);return g(z,null,g("div",{className:"feed-controls"},g(KM,{text:n||yj(t.length,r.hasMorePages())}),g("div",{className:"feed-controls-right"},g(zM,{query:S.feedQuery,onQuery:r.updateFeedQuery}),g(mw,{active:S.feedScopeFilter,id:"feedScopeToggle",onSelect:s=>{s!==S.feedScopeFilter&&(Iy(s),r.loadFeedData().catch(()=>{}))},options:[{value:"all",label:"All"},{value:"mine",label:"My memories"},{value:"theirs",label:"Other people"}]}),g(mw,{active:S.feedTypeFilter,id:"feedTypeToggle",onSelect:s=>{s!==S.feedTypeFilter&&(oA(s),r.updateFeedView())},options:[{value:"all",label:"All"},{value:"observations",label:"Observations"},{value:"summaries",label:"Summaries"}]}),g("button",{"aria-controls":"contextInspectorPanel","aria-expanded":i,className:"settings-button feed-inspector-button",onClick:()=>a(s=>!s),type:"button"},i?"Hide Context Inspector":"Context Inspector"))),g(bj,{open:i}),g("div",{className:"feed-list",id:"feedList"},g(z,null,e?g("div",{className:"small feed-empty-state",role:"alert"},g("strong",null,e),g("div",null,"Check the viewer connection, then retry the Feed."),g("button",{className:"settings-button",onClick:()=>{r.loadFeedData().catch(()=>{})},type:"button"},"Retry")):null,!e||t.length>0?g(VM,{items:t,loadingText:n,ops:r}):null)))}function JM(e){return S.feedTypeFilter==="observations"?e.filter(t=>!Jc(t,jc(t?.metadata_json))):S.feedTypeFilter==="summaries"?e.filter(t=>Jc(t,jc(t?.metadata_json))):e}function YM(e){const t=e.map(n=>`${r_(n)}:${n.kind||""}:${n.created_at_utc||n.created_at||""}:${String(n.owned_by_self??"")}`);return`${S.feedTypeFilter}|${S.feedScopeFilter}|${S.currentProject}|${S.viewerActorId??""}|${co(S.feedQuery)}|${t.join("|")}`}var hw="",Co=0,Ro=0,ia=!0,aa=!0,Qc=null,XM=0,hr=null,gw=!1,Io=0,mf="all",vw="",ko=null,oa="",dV=250;function yw(e){hw=e,mf=S.feedScopeFilter,vw=S.feedQuery.trim(),oa="",Io+=1,Co=0,Ro=0,ia=!0,aa=!0,S.lastFeedItems=[],S.pendingFeedItems=null,S.lastFeedFilteredCount=0,S.lastFeedSignature="",S.newItemKeys.clear(),S.itemViewState.clear(),S.itemExpandState.clear()}function hf(){return ia||aa}function QM(e){const t=Nt(e);S.lastFeedItems=S.lastFeedItems.map(n=>Nt(n)===t?e:n)}function ZM(e){const t=new Set,n=r=>{const i=Number(r.id||r.memory_id||0)!==e;return i||t.add(Nt(r)),i};S.lastFeedItems=S.lastFeedItems.filter(n),Array.isArray(S.pendingFeedItems)&&(S.pendingFeedItems=S.pendingFeedItems.filter(n));for(const r of t){S.newItemKeys.delete(r),S.itemViewState.delete(r);for(const i of Array.from(S.itemExpandState.keys()))i.startsWith(`${r}:`)&&S.itemExpandState.delete(i)}}async function e1(){if(!hf())return;const e=Io;if(Qc===e)return;const t=S.currentProject||"",n=S.feedQuery.trim(),r=Co,i=Ro;Qc=e;try{const[a,s]=await Promise.all([ia?Km(t,{limit:20,offset:r,scope:S.feedScopeFilter,q:n||void 0}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:r}}),aa?zm(t,{limit:50,offset:i,scope:S.feedScopeFilter,q:n||void 0}):Promise.resolve({items:[],pagination:{has_more:!1,next_offset:i}})]);if(e!==Io||t!==(S.currentProject||"")||n!==S.feedQuery.trim())return;const c=s.items||[],l=a.items||[],d=n?l:l.filter(f=>!n_(f));S.lastFeedFilteredCount+=l.length-d.length,aa=Oc(s,c.length,50),ia=Oc(a,l.length,20),Ro=Mc(s,i+c.length),Co=Mc(a,r+l.length);const u=[...c,...d],p=i_(S.lastFeedItems,u);S.lastFeedItems=p,oi()}finally{Qc===e&&(Qc=null)}}function bw(){S.activeTab==="feed"&&(ko||hr||hf()&&F$()&&e1())}var t1={replaceFeedItem:QM,removeFeedItem:ZM,updateFeedView:e=>oi(e),loadFeedData:()=>yf(),updateFeedQuery:e=>r1(e),hasMorePages:hf};function gf(e,t){const n=document.getElementById("tab-feed");if(!n)return!1;dj(n,g(WM,{errorText:t?.errorText,items:e,loadingText:t?.loadingText,ops:t1}));const r=globalThis.lucide;return r&&!t?.loadingText&&r.createIcons(),!0}function vf(e="Loading selected project..."){gf([],{loadingText:e})}function n1(){lj(),gf(S.lastFeedItems,S.lastFeedItems.length||S.lastFeedSignature?void 0:{loadingText:"Loading memories…"}),gw||(window.addEventListener("scroll",()=>{bw()},{passive:!0}),gw=!0)}function r1(e){if(e===S.feedQuery)return;const t=S.feedQuery.trim();S.feedQuery=e,e.trim()!==t&&(yw(S.currentProject||""),vf("Searching memories…"),ko&&clearTimeout(ko),ko=setTimeout(()=>{ko=null,yf().catch(()=>{})},250))}function oi(e=!1){if(!document.getElementById("tab-feed"))return;const t=window.scrollY,n=JM(S.lastFeedItems),r=YM(n),i=e||r!==S.lastFeedSignature;S.lastFeedSignature=r,i&&gf(n,{errorText:oa||void 0}),window.scrollTo({top:t}),bw()}function _w(e,t,n,r){return ww(e,t)&&e===Io&&n===(S.currentProject||"")&&r===S.feedQuery.trim()}function ww(e,t){return hr?.generation===e&&hr.requestId===t}async function yf(e={}){const t=S.currentProject||"",n=S.feedScopeFilter!==mf,r=S.feedQuery.trim(),i=r!==vw;(t!==hw||n||i)&&(yw(t),vf(i?"Searching memories…":void 0));const a=Io,s=++XM;hr={generation:a,requestId:s};const c=!!oa;c&&(oa="",S.lastFeedItems.length>0?oi(!0):vf(r?"Searching memories…":void 0));try{const[u,p]=await Promise.all([Km(t,{limit:20,offset:0,scope:S.feedScopeFilter,q:r||void 0,signal:e.signal}),zm(t,{limit:50,offset:0,scope:S.feedScopeFilter,q:r||void 0,signal:e.signal})]);if(e.signal?.aborted||!_w(a,s,t,r))return;const f=p.items||[],m=u.items||[],v=r?m:m.filter(_=>!n_(_)),b=m.length-v.length,h=[...f,...v].sort((_,R)=>new Date(R.created_at||0).getTime()-new Date(_.created_at||0).getTime()),y=M$(S.lastFeedItems,h),w=S.lastFeedItems;if(B$(y,w)&&w.length>0){const _=new Set(w.map(Nt));y.forEach(R=>{_.has(Nt(R))||S.newItemKeys.add(Nt(R))})}S.pendingFeedItems=null,S.lastFeedItems=y,oa="",S.lastFeedFilteredCount=Math.max(S.lastFeedFilteredCount,b),aa=Oc(p,f.length,50),ia=Oc(u,m.length,20),Ro=Math.max(Ro,Mc(p,f.length)),Co=Math.max(Co,Mc(u,m.length)),mf=S.feedScopeFilter,hr?.generation===a&&hr.requestId===s&&(hr=null),oi(c)}catch(l){if(e.signal?.aborted)return;throw _w(a,s,t,r)&&(ia=!1,aa=!1,oa="Feed unavailable. Refresh and try again.",oi(!0)),l}finally{ww(a,s)&&(hr=null)}}function i1(e){return e.channel==="latest"?"stable":e.channel}function uV(e){return e}function a1(e){const t=new Date(e.periodStart),n=new Date(e.periodEnd),r=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric"}),i=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",year:"numeric"});return t.getFullYear()===n.getFullYear()?[r.format(t),i.format(n)]:[i.format(t),i.format(n)]}function o1(e,t){const n=100*e/t,r=Math.round(n);return n>0&&r===0?"<1%":n<100&&r===100?">99%":`${r}%`}function s1(e){if(e.freshEvaluations===0)return[{label:"Recalls checked",value:0,tooltip:"No automatic recalls were checked for repeated memories in this period.",icon:"activity"},{label:"Not checked",value:e.unmeasuredAttempts,tooltip:`Codemem could not check ${e.unmeasuredAttempts.toLocaleString()} automatic recalls for repeated memories, so savings are unknown.`,icon:"circle-help"}];const t=o1(e.evaluationsWithDuplicates,e.freshEvaluations),n=e.missingRetainedMetadata>0||e.invalidRetainedMetadata>0||e.packMetadataGaps>0;return[{label:"Recalls with repeats",value:t,tooltip:`Codemem removed repeated memories from ${e.evaluationsWithDuplicates.toLocaleString()} of ${e.freshEvaluations.toLocaleString()} automatic recalls.`,icon:"filter"},{label:"Memories skipped",value:e.duplicatesOmitted,tooltip:`Codemem left out ${e.duplicatesOmitted.toLocaleString()} memories that were already in your conversation, out of ${e.candidateItems.toLocaleString()} considered.`,icon:"minus-circle"},{label:"Repeated tokens removed",value:`~${so(e.estimatedTokensAvoided)}`,tooltip:`About ${e.estimatedTokensAvoided.toLocaleString()} tokens were left out because they repeated information already in your conversation.`,icon:"trending-down"},{label:"Recalls checked",value:e.freshEvaluations,tooltip:`Codemem checked ${e.freshEvaluations.toLocaleString()} automatic recalls for repeated memories. ${e.unmeasuredAttempts.toLocaleString()} more could not be checked.${n?" Some results may be incomplete.":""}`,icon:"activity"}]}function c1(e){if(!e||e.availability==="unavailable")return g("p",{class:"section-meta"},"Automatic recall details aren’t available. Update Codemem and refresh this page.");const[t,n]=a1(e);return g(z,null,g("div",{class:"grid-2 automatic-recall-grid"},s1(e).map(r=>g(Sw,{...r,key:`${r.label}-${r.icon}`}))),g("p",{class:"automatic-recall-meta"},g("time",{dateTime:e.periodStart},t),"–",g("time",{dateTime:e.periodEnd},n),` · Based on up to ${e.windowLimit.toLocaleString()} recent automatic recalls across all projects.${e.freshEvaluations===0?" No recalls were checked, so savings are unknown.":""}`))}function l1(e,t){e&&(Ue(g(Bc,null,g("details",{class:"automatic-recall"},g("summary",null,"Automatic recall"),g("section",{"aria-label":"Automatic recall measurements"},c1(Wm(t))))),e),Po())}function d1(e){if(e.install_kind==="repo-dev")return{title:"Running from repository source",detail:`Package metadata version: ${e.current_version}. Registry releases do not describe the checked-out source revision.`,tone:"current"};if(!e.latest_version)return{title:"Update check unavailable",detail:e.error?`Could not check for updates: ${e.error}`:"Could not check for updates.",tone:"unavailable"};if(e.stale)return{title:e.update_available?`Cached update status: Codemem ${e.latest_version} is available`:`Cached update status for Codemem ${e.current_version}`,detail:e.error?`This result is stale because a fresh check failed: ${e.error}`:"This result is cached and may be stale.",tone:"stale"};if(e.update_available)return{title:`Codemem ${e.latest_version} is available`,detail:`Installed version: ${e.current_version}.`,tone:"available"};const t=i1(e);return t?{title:`Codemem ${e.current_version} is up to date`,detail:`You are running the latest ${t} release.`,tone:"current"}:{title:`Unable to compare Codemem ${e.current_version} with ${e.latest_version}`,detail:"The installed version is not on a supported release channel.",tone:"unavailable"}}function u1({status:e}){const t=d1(e),n=e.install_kind==="repo-dev"||e.update_available||e.stale||!e.latest_version||!e.channel;return g("section",{class:`health-update-banner health-update-banner--${t.tone}`,role:"status","aria-atomic":"true","aria-label":"Codemem update status"},g("i",{"aria-hidden":"true","data-lucide":"circle-arrow-up",class:"health-update-icon"}),g("div",{class:"health-update-copy"},g("h2",null,t.title),g("p",null,t.detail),n&&e.recommended_action?g("p",{class:"health-update-guidance"},g("span",{class:"health-update-guidance-label"},"Recommended action"),g("code",null,e.recommended_action)):null))}function p1(e,t){e&&(e.hidden=!t,Ue(t?g(u1,{status:t}):null,e))}function f1({label:e,value:t,detail:n,icon:r,className:i,title:a,loading:s}){const c=g("div",{class:`stat${i?` ${i}`:""}`,style:a?"cursor: help;":void 0},r?g("span",{class:"health-icon-slot",key:`${r}-${s?"loading":"static"}`},g("i",{"aria-hidden":"true","data-lucide":r,class:`stat-icon${s?" health-loading-icon":""}`})):null,g("div",{class:"stat-content"},g("div",{class:"value"},t),g("div",{class:"label"},e),n?g("div",{class:"small"},n):null));return a?g(qc,{label:a},c):c}function m1({item:e}){let t=null,n=null;const r=e.actionLabel||"Run";async function i(){if(!(!e.action||!t)){t.disabled=!0,t.textContent="Running…";try{await e.action(t)}catch{}t.disabled=!1,t.textContent=r}}function a(){!e.command||!n||Va(e.command,n)}return g("div",{class:"health-action"},g("div",{class:"health-action-text"},e.label,e.command?g("span",{class:"health-action-command"},e.command):null),g("div",{class:"health-action-buttons"},e.action?g("button",{class:"settings-button",onClick:i,ref:s=>{t=s}},r):null,e.command?g("button",{class:"settings-button health-action-copy",onClick:a,ref:s=>{n=s}},"Copy"):null))}function h1(e){return typeof e=="number"?e.toLocaleString():e==null?"n/a":String(e)}function Sw({label:e,value:t,icon:n,tooltip:r}){const i=g("div",{class:"stat",style:r?"cursor: help;":void 0,tabIndex:r?0:void 0},g("i",{"data-lucide":n,class:"stat-icon"}),g("div",{class:"stat-content"},g("div",{class:"value"},h1(t)),g("div",{class:"label"},e)));return r?g(qc,{label:r},i):i}function Cw(e,t){e&&Ue(g(Bc,null,t.map(n=>g(Sw,{...n,key:`${n.label}-${n.icon}`}))),e)}function To(e,t){e&&Ue(g(z,null,t),e)}function Po(){const e=globalThis.lucide;e&&typeof e.createIcons=="function"&&e.createIcons()}function Rw(e,t){e&&Ue(g(Bc,null,t.map(n=>g(f1,{...n,key:n.key??n.label}))),e)}function Iw(e,t){if(e){if(!t.length){e.hidden=!0,Ue(null,e);return}e.hidden=!1,Ue(g(z,null,t.slice(0,3).map((n,r)=>g(m1,{item:n,key:`${n.label}-${r}`}))),e)}}function bf(e,t){let n=e.events_global;return t&&(n=e.events_filtered??e.events),n.find(r=>r.event==="pack")??null}var kw="scope_id_backfill";function Tw(){const e=document.getElementById("healthDot");e&&(e.className="health-dot status-unknown",e.title="Open Health to check status");const t=document.getElementById("metaLine");t&&To(t,"")}function g1(e,t){!t||e.length>=3||e.push({label:"Background maintenance failed. Review recent safe failure evidence.",command:"codemem maintenance status",action:n=>Fr({severity:"error",subsystem:"maintenance",trigger:n}),actionLabel:"View diagnostics"})}function v1(e,t,n){let r="Healthy right now. Diagnostics stay available if you want details.";t?r=n.length?`Some Health data is stale. Last known risks: ${n.join(", ")}.`:"Some Health data is stale. Showing the last successful snapshot.":n.length&&(r=`Why this status: ${n.join(", ")}.`),e.textContent!==r&&(e.textContent=r)}function y1(e,t){return e>=60?{label:"Attention",className:"status-attention"}:e>=25?{label:"Degraded",className:"status-degraded"}:t?{label:"Stale",className:"status-unknown"}:{label:"Healthy",className:"status-healthy"}}function Pw(){const e=document.getElementById("healthGrid"),t=document.getElementById("healthMeta"),n=document.getElementById("healthActions"),r=document.getElementById("healthDot");if(!e||!t)return;p1(document.getElementById("healthUpdateBanner"),S.lastUpdateStatus);const i=On(S.healthStats),a=On(S.healthUsage,S.currentProject),s=On(S.healthRawEvents);if(!i||!a||!s){b1({healthGrid:e,healthMeta:t,healthActions:n,healthDot:r});return}const c=S.lastSyncStatus||{},l=i.maintenance_jobs,d=l.find(re=>re.kind===kw),u=l.some(re=>re.status==="failed"),p=i.database,f=a.recent_packs,m=bf(a,a.events_filtered!=null),v=f.length?f[0]?.created_at:null,b=f.length?f[0]?.metadata_json||{}:{},h=Number(b?.exact_duplicates_collapsed||0),y=s.pending,w=i.reliability?.counts.errored_batches??0,_=i.reliability?.rates.flush_success_rate??1,R=i.reliability?.rates.dropped_event_rate??0,I=m?$p(m.total_tokens_saved,m.total_tokens_read):"n/a",T=I$(I),A=p.tags_coverage,L=String(c.daemon_state||"unknown"),F=L==="offline-peers"?"Offline peers":L==="needs_attention"?"Needs attention":L==="rebootstrapping"?"Rebootstrapping":e_(L),N=Array.isArray(S.lastSyncPeers)?S.lastSyncPeers.length:0,j=L==="disabled"||c.enabled===!1,x=L==="offline-peers",U=!j&&N===0;let q=j?"Disabled":U?"No peers":F;const $=c.last_sync_at||c.last_sync_at_utc||null,E=Zi($),C=Zi(v),O=E!==null&&E>7200,H=E!==null&&E<=300,G=y>=200;let ee=0;const Z=[];y>=1e3?(ee+=40,Z.push("high raw-event backlog")):y>=200&&(ee+=24,Z.push("growing raw-event backlog")),w>0&&y>=200&&(ee+=w>=5?10:6,Z.push("batch errors during backlog pressure")),_<.95&&(ee+=20,Z.push("lower flush success")),R>.02?(ee+=24,Z.push("high dropped-event rate")):R>.005&&(ee+=10,Z.push("non-trivial dropped-event rate")),!j&&!U&&(L==="error"?(ee+=36,Z.push("sync daemon reports errors")):L==="needs_attention"?(ee+=40,Z.push("sync needs manual attention")):L==="stopped"?(ee+=22,Z.push("sync daemon stopped")):L==="degraded"&&!H&&(ee+=20,Z.push("sync daemon degraded")),x?(ee+=4,Z.push("all peers currently offline"),O&&(ee+=4,Z.push("offline peers and sync not recent"))):O?(ee+=26,Z.push("sync looks stale")):E!==null&&E>1800&&(ee+=12,Z.push("sync not recent"))),T!==null&&T<10&&(ee+=8,Z.push("low retrieval reduction")),C!==null&&C>86400&&(ee+=12,Z.push("memory pack activity is old"));const ie=[S.healthStats,S.healthUsage,S.healthRawEvents].some(re=>Qs(re)),{label:fe,className:Ce}=y1(ee,ie),Pe=Ce==="status-healthy";r&&(r.className=`health-dot ${Ce}`,r.title=fe);const Ne=m?`${m.total_tokens_saved.toLocaleString()} estimated saved tokens · ${h.toLocaleString()} deduped in latest pack`:"No pack usage is available",ce=y>0?"Queue is actively draining":"Queue is clear",me=j?"Sync disabled":U?"No peers configured":x?`${N} peers offline · last sync ${ur(E)} ago`:`${N} peers · last sync ${ur(E)} ago`;Pe&&!j&&!U&&(x?q="Peers offline":L==="degraded"&&H&&(q="Syncing"));const J=`last pack ${ur(C)} ago`,se=l.map(re=>{const Q=Number(re.progress?.current||0),we=typeof re.progress?.total=="number"?re.progress.total:null,ae=String(re.progress?.unit||"items"),Fe=we&&we>0?` (${Math.round(100*Q/we)}%)`:"",Je=we&&we>0?`${Q.toLocaleString()}/${we.toLocaleString()} ${ae}${Fe}`:`${Q.toLocaleString()} ${ae}`,wn=re.status==="failed",Sn=re.status==="completed",kr=re.kind===kw,Re=wn?"Failed":Sn?"Complete":Je,et=wn?String(re.error||"unknown error").trim():Sn?kr?`${Je} · one-time Sharing-domain upgrade finished`:Je:kr?"One-time upgrade backfill; totals include memories and replication ops":void 0;return{key:String(re.kind||re.title||"background-maintenance"),label:String(re.title||re.kind||"Background maintenance"),value:Re,detail:et,icon:wn?"alert-triangle":Sn?"check-circle":"loader",className:wn?"status-attention":void 0,title:wn?`Error: ${re.error||"unknown"}`:Sn?`${String(re.title||"Maintenance")} finished`:kr?`${String(re.title||"Maintenance")} in progress; inspect with codemem maintenance status`:`${String(re.title||"Maintenance")} in progress`}}),ye=[{key:"overall-health",label:"Overall health",value:fe,detail:`Weighted score ${ee}`,icon:"heart-pulse",className:`health-primary ${Ce}`,title:Z.length?`Main signals: ${Z.join(", ")}`:"No major risk signals detected"},...se,{key:"pipeline-health",label:"Pipeline health",value:`${y.toLocaleString()} pending`,detail:ce,icon:"workflow",title:"Raw-event queue pressure and flush reliability"},{key:"retrieval-impact",label:"Retrieval impact",value:I,detail:Ne,icon:"sparkles",title:"Reduction from memory reuse across recent usage"},{key:"sync-health",label:"Sync health",value:q,detail:me,icon:"refresh-cw",title:"Daemon state and sync recency"},{key:"data-freshness",label:"Data freshness",value:ur(C),detail:J,icon:"clock-3",title:"Recency of last memory pack activity"}];Rw(e,ye);const le=async()=>{await nd()},Ee=[];G?(Ee.push({label:"Pipeline needs attention. Check queue health first.",command:"codemem db raw-events-status",action:re=>Fr({subsystem:"capture",trigger:re}),actionLabel:"View diagnostics"}),Ee.push({label:"Then retry failed batches for impacted sessions.",command:"codemem db raw-events-retry <opencode_session_id>"})):L==="stopped"?Ee.push({label:"Sync daemon is stopped. Start the background service.",command:"codemem serve start"}):!j&&!U&&!Pe&&(L==="error"||L==="degraded")?(Ee.push({label:"Sync is unhealthy. Restart and run one immediate pass.",command:"codemem serve restart",action:le,actionLabel:"Sync now"}),Ee.push({label:"Then run doctor to see root cause details.",command:"codemem sync doctor"})):!j&&!U&&O&&Ee.push({label:"Sync is stale. Run one immediate sync pass.",command:"codemem sync once",action:le,actionLabel:"Sync now"}),g1(Ee,u),A>0&&A<.7&&Ee.length<2&&Ee.push({label:"Tag coverage is low. Preview backfill impact.",command:"codemem db backfill-tags --dry-run"}),d&&d.status!=="completed"&&Ee.length<3&&Ee.push({label:"Sharing-domain upgrade backfill is expected one-time work. Inspect progress if startup feels busy.",command:"codemem maintenance status"}),Iw(n,Ee),v1(t,ie,Z),Po()}function b1({healthGrid:e,healthMeta:t,healthActions:n,healthDot:r}){const i=[S.healthStats,S.healthUsage,S.healthRawEvents],a=i.some(u=>u.status==="failed"),s=i.some(u=>u.status==="loading"),c=s&&!a;let l="Not loaded",d="Open or refresh Health to load status.";a?(l="Unavailable",d="Some health data failed to load. Refresh Health to try again."):s&&(l="Loading",d="Loading health data…"),Rw(e,[{key:"overall-health",label:"Overall health",value:l,detail:"Health requires stats, usage, and queue data",icon:a?"triangle-alert":"loader",className:"health-primary status-unknown",loading:c}]),Iw(n,[]),t.textContent!==d&&To(t,d),r&&(r.className="health-dot status-unknown",r.title=l),Po()}function _1(){const e=document.getElementById("sessionGrid"),t=document.getElementById("sessionMeta");if(!e||!t)return;const n=On(S.healthUsage,S.currentProject),r=On(S.healthSession,S.currentProject),{latestPack:i,packCount:a,packLine:s}=w1(n),c=i?.created_at||"",l=c?`Last pack: ${Zr(c)}`:"",d=S.currentProject?"Project":"All projects",u=S1(r,S.healthSession.status==="failed"),p=R1(i,a),f=C1(n,r)?"Showing stale data":"";To(t,[d,s,l,u,f].filter(Boolean).join(" · ")),Cw(e,p),Po()}function w1(e){if(!e)return{latestPack:null,packCount:null,packLine:"Pack totals unavailable"};const t=e.events.find(n=>n.event==="pack")?.count??0;return{latestPack:e.recent_packs[0]??null,packCount:t,packLine:t?`${t} packs`:"No packs yet"}}function S1(e,t){return e?`${e.total.toLocaleString()} stored items`:t?"Stored-item totals unavailable":""}function C1(e,t){return!!e&&Qs(S.healthUsage,S.currentProject)||!!t&&Qs(S.healthSession,S.currentProject)}function R1(e,t){const n=e?.metadata_json||{},r=e?.tokens_read??0,i=e?.tokens_saved??0,a=n.exact_duplicates_collapsed??0,s=$p(i,r);let c="n/a";return e&&(c=n.exact_dedupe_enabled?"On":"Off"),[{label:"Last pack savings",value:e?`${so(i)} (${s})`:"n/a",tooltip:e?`Estimate: ${i.toLocaleString()} saved`:void 0,icon:"trending-up"},{label:"Last pack size",value:e?so(r):"n/a",tooltip:e?`Estimate: ${r.toLocaleString()} injected`:void 0,icon:"package"},{label:"Last pack deduped",value:e?a.toLocaleString():"n/a",icon:"copy-check"},{label:"Exact dedupe",value:c,icon:"shield-check"},{label:"Packs",value:t??"n/a",icon:"archive"}]}function I1(e,t,n){if(t>0){e.push({label:"Raw events pending",value:t,tooltip:"Pending raw events waiting to be flushed",icon:"activity"});return}n>0&&e.push({label:"Raw sessions",value:n,tooltip:"Sessions with pending raw events",icon:"inbox"})}function k1(){const e=document.getElementById("statsGrid"),t=document.getElementById("metaLine");if(!e)return;const n=On(S.healthStats),r=On(S.healthUsage,S.currentProject),i=On(S.healthRawEvents),a=n?.database,s=S.currentProject,c=r?.totals_filtered??null,l=!!(s&&c),d=r?bf(r,!1):null,u=r?bf(r,l):null,p=i?.sessions??0,f=i?.pending??0,m=l&&d?`
109
109
  Global: ${d.total_tokens_read.toLocaleString()} estimated injected`:"",v=l&&d?`
110
- Global: ${d.total_tokens_saved.toLocaleString()} estimated saved`:"",b=[{label:l?"Savings (project)":"Savings",value:u?so(u.total_tokens_saved):"n/a",tooltip:u?`Estimated tokens saved by reusing compressed memories: ${u.total_tokens_saved.toLocaleString()}${v}`:"Usage data is unavailable",icon:"trending-up"},{label:l?"Injected (project)":"Injected",value:u?so(u.total_tokens_read):"n/a",tooltip:u?`Estimated tokens injected into context (pack size): ${u.total_tokens_read.toLocaleString()}${m}`:"Usage data is unavailable",icon:"book-open"},{label:l?"Reduction (project)":"Reduction",value:u?$p(u.total_tokens_saved,u.total_tokens_read):"n/a",tooltip:u?`Estimated percent reduction from reuse. Factor: ${R$(u.total_tokens_saved,u.total_tokens_read)}.${m}${v}`:"Usage data is unavailable",icon:"percent"},{label:l?"Work investment (project)":"Work investment",value:"n/a",tooltip:"Work-investment data is unavailable",icon:"pencil"},{label:"Active memories",value:a?.active_memory_items??"n/a",icon:"check-circle"},{label:"Embedding coverage",value:a?Zb(a.vector_coverage):"n/a",tooltip:"Share of active memories with embeddings",icon:"layers"},{label:"Tag coverage",value:a?Zb(a.tags_coverage):"n/a",tooltip:"Share of active memories with tags",icon:"tag"}];i&&I1(b,f,p),Cw(e,b),t&&T1(t,a,s),Po()}function T1(e,t,n){if(!t){To(e,P1(S.healthStats,"Database metrics"));return}const r=n?` · project: ${n}`:"",i=Qs(S.healthStats)?" · showing stale data":"",a=N$(t.path);To(e,`DB: ${a} · ${E$(t.size_bytes)}${r}${i}`)}function P1(e,t){return e.status==="loading"?`Loading ${t.toLowerCase()}…`:e.status==="failed"?`${t} failed to load`:`${t} not loaded`}async function N1(e={}){const t=S.viewerActorId,n=await ER(e);e.signal?.aborted||(S.viewerActorId=n.identity.actor_id,t!==S.viewerActorId&&oi(!0))}async function E1(e={}){const t=S.currentProject;S.healthStats=Xs(S.healthStats),S.healthUsage=Xs(S.healthUsage,t),S.healthSession=Xs(S.healthSession,t),S.healthRawEvents=Xs(S.healthRawEvents),Nw();const n=S.activeTab==="health"&&!S.lastUpdateStatus?GI(e).catch(HI):Promise.resolve(S.lastUpdateStatus),[r,i,a,s,c]=await Promise.all([Zc(qR(e)),Zc(UR(t,e)),Zc(GR(t,e)),Zc(HR(t,e)),n]);e.signal?.aborted||(S.healthStats=el(S.healthStats,r),S.healthUsage=el(S.healthUsage,i,t),S.healthSession=el(S.healthSession,a,t),S.healthRawEvents=el(S.healthRawEvents,s),S.lastUpdateStatus=c,Nw())}function Nw(){k1(),l1(document.getElementById("automaticRecallStats"),On(S.healthStats)?.automatic_recall),_1(),Pw()}async function Zc(e){try{return{ok:!0,data:await e}}catch(t){return{ok:!1,error:t instanceof Error?t.message:"Health request failed"}}}function el(e,t,n=""){return"data"in t?QE(t.data,Date.now(),n):ZE(e,t.error)}function _f(e,t){return`legacy-team-setup-item-error-${e}-${t}`}function Ew(e){return[...e].sort((t,n)=>+(n.decision==="unresolved")-+(t.decision==="unresolved"))}function Aw(e){return[...e].sort((t,n)=>+(n.resolution==="unresolved")-+(t.resolution==="unresolved"))}var A1={unresolved:"Needs a decision",included:"Included in this Team",excluded:"Excluded from this Team",removed:"Removed from this Team"};function xw(e,t){return t?e.identityChoices.find(n=>n.identityRef===t)?.displayName??"Unavailable person":null}function x1(e){return e.targetIdentityRef??e.existingIdentityRef??""}function D1({blocked:e,blockedDescriptionId:t,blockedDeviceRefs:n,busy:r,detail:i,device:a,index:s,onAssign:c,onClear:l,onDecision:d}){const u=Dr(),p=`${u}-identity`,f=`${u}-evidence`,m=`${u}-assignment-help`,v=x1(a),b=a.targetIdentityRef??"",[h,y]=D(v);V(()=>y(v),[v]);const w=i.identityChoices.some(O=>O.identityRef===h),_=xw(i,a.existingIdentityRef),R=xw(i,a.suggestedIdentityRef),I=n?.has(a.deviceRef)??!1,T=e||I||r,A=T||!a.actions.assignIdentity.enabled,L=a.actions.assignIdentity.blockedReason==="assignment_evidence_inactive",F=!!h&&!w,N=!a.actions.include.enabled||L||F||!b||h!==b,j=T||N,x=A||!h||L||F||h===b,U=!a.enabled||N,q=e?t:I?_f("device",a.deviceRef):void 0,$=[f,U?m:void 0,q].filter(Boolean).join(" "),E=[f,q].filter(Boolean).join(" "),C=a.decision==="unresolved";return o("fieldset",{"aria-busy":r?"true":"false",className:`legacy-team-device-row${C?" legacy-team-setup-row-needs-attention":""}`,id:`legacy-team-device-row-${s}`,tabIndex:C?-1:void 0,children:[o("legend",{children:a.displayName}),C?o("span",{className:"legacy-team-setup-status",children:"Needs attention"}):null,o("div",{className:"small legacy-team-device-evidence",id:f,children:[o("span",{children:a.enabled?"Current Team device":"Device no longer active on this Team"}),_?o("span",{children:["Current assignment: ",_,a.verifiedEvidenceKind==="active_assignment"?" · verified active assignment":""]}):null,!_&&R?o("span",{children:["Suggested person: ",R]}):null,o("span",{children:["Decision: ",A1[a.decision]]})]}),o("label",{htmlFor:p,children:"Person using this device"}),o("select",{"aria-describedby":$,className:"feed-search legacy-team-device-select",disabled:A,id:p,onChange:O=>y(O.currentTarget.value),value:h,children:[o("option",{value:"",children:"Choose a person"}),h&&!w?o("option",{value:h,children:"Current server assignment"}):null,i.identityChoices.map(O=>o("option",{value:O.identityRef,children:O.displayName},O.identityRef))]}),a.enabled?F?o("p",{className:"small",id:m,children:"This person is no longer available. Choose an available person and save the assignment before including this device."}):L?o("p",{className:"small",id:m,children:"This assignment is inactive. Reconcile this device in Devices or exclude it from this Team."}):!h||!b||h!==b?o("p",{className:"small",id:m,children:h?"Save the selected person assignment before including this device.":"Choose and save a person assignment before including this device."}):null:o("p",{className:"small",id:m,children:"Inactive devices can only be removed from this Team."}),o("div",{className:"legacy-team-device-actions",children:[o("button",{"aria-describedby":$,"aria-disabled":x?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{x||c(a,h)},type:"button",children:"Save assignment"}),a.enabled?o(z,{children:[o("button",{"aria-describedby":$,"aria-disabled":j?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{j||d(a,"included",b)},type:"button",children:"Include"}),o("button",{"aria-describedby":E,"aria-disabled":T||!a.actions.exclude.enabled?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!T&&a.actions.exclude.enabled&&d(a,"excluded")},type:"button",children:"Exclude"})]}):o("button",{"aria-describedby":E,"aria-disabled":T||!a.actions.remove.enabled?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!T&&a.actions.remove.enabled&&d(a,"removed")},type:"button",children:"Remove"}),a.decision!=="unresolved"?o("button",{"aria-describedby":E,"aria-disabled":T||!a.actions.clearDecision.enabled?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!T&&a.actions.clearDecision.enabled&&l(a)},type:"button",children:"Clear decision"}):null]})]})}function L1(e){const t=Ew(e.detail.devices);return o("section",{"aria-labelledby":"legacy-team-setup-step-devices",children:[o("h3",{id:"legacy-team-setup-step-devices",tabIndex:-1,children:"Review devices"}),o("p",{children:[e.detail.unresolvedDeviceCount.toLocaleString()," of"," ",e.detail.candidate.deviceCount.toLocaleString()," Team devices still need a decision."]}),o("div",{className:"legacy-team-device-list",children:t.map((n,r)=>g(D1,{...e,busy:e.busyDeviceRefs.has(n.deviceRef),device:n,index:r,key:n.deviceRef}))})]})}function $1(e,t){return e.resolvedProjectRef?t.get(e.resolvedProjectRef)??"Unavailable Project":null}function j1({blocked:e,blockedDescriptionId:t,blockedProjectRefs:n,busy:r,index:i,onMap:a,presentationName:s,project:c}){const l=Dr(),d=`${l}-mapping`,u=`${l}-help`,p=c.resolvedProjectRef??"",f=Or(c.mappingChoices.map($=>({canonicalId:$.resolvedProjectRef,displayName:$.displayName}))),m=[...new Set(c.mappingChoices.map($=>$.resolvedProjectRef))],v=[...m].sort(($,E)=>$<E?-1:$>E?1:0),b=new Map(v.map(($,E)=>[$,`project-choice-${E+1}`])),h=new Map(c.mappingChoices.map($=>[$.resolvedProjectRef,$])),y=m.flatMap($=>{const E=h.get($);return E?[{...E,label:f.get($)??E.displayName,token:b.get($)??""}]:[]}),w=y.find($=>$.resolvedProjectRef===p)?.token??"",_=JSON.stringify(v),[R,I]=D(w);V(()=>I(w),[w,_]);const T=y.find($=>$.token===R)?.resolvedProjectRef,A=n?.has(c.projectRef)??!1,L=c.actions.map.blockedReason==="mapping_unavailable",F=c.actions.map.enabled&&!R,N=e||A||r||!c.actions.map.enabled,j=N||!T||T===p,x=$1(c,f),U=[L||F?u:void 0,e?t:A?_f("project",c.projectRef):void 0].filter(Boolean).join(" "),q=c.resolution==="unresolved";return o("fieldset",{"aria-busy":r?"true":"false",className:`legacy-team-project-row${q?" legacy-team-setup-row-needs-attention":""}`,id:`legacy-team-project-row-${i}`,tabIndex:q?-1:void 0,children:[o("legend",{children:s}),o("div",{className:"legacy-team-project-row-content",children:[q?o("span",{className:"legacy-team-setup-status",children:"Needs attention"}):null,c.resolution==="deterministic"?o("p",{className:"small",children:"Mapped automatically from matching Project evidence."}):o(z,{children:[o("p",{className:"small",children:x?`Saved mapping: ${x}`:"This Project still needs a mapping."}),o("label",{htmlFor:d,children:"Canonical Project"}),o("select",{"aria-describedby":U||void 0,className:"feed-search legacy-team-project-select",disabled:N,id:d,onChange:$=>I($.currentTarget.value),value:R,children:[o("option",{value:"",children:"Choose a Project"}),y.map($=>o("option",{value:$.token,children:$.label},$.resolvedProjectRef))]}),L?o("p",{className:"small",id:u,children:"No safe Project mapping is available. Refresh after Project evidence changes."}):F?o("p",{className:"small",id:u,children:"Choose and save one of the server-provided Project mappings."}):null,o("button",{"aria-describedby":U||void 0,"aria-disabled":j?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!j&&T&&a(c,T)},type:"button",children:"Save mapping"})]})]})]})}function O1(e){const t=Aw(e.detail.projects),n=Or(t.map(a=>({canonicalId:a.projectRef,displayName:a.displayName}))),r=e.detail.projects.filter(a=>a.resolution==="deterministic").length,i=Math.max(e.detail.candidate.projectCount,e.detail.projects.length,e.detail.unresolvedProjectCount);return o("section",{"aria-labelledby":"legacy-team-setup-step-projects",children:[o("h3",{id:"legacy-team-setup-step-projects",tabIndex:-1,children:"Review Projects"}),o("p",{children:e.detail.unresolvedProjectCount===0?`All ${i.toLocaleString()} Team Projects are mapped.`:`${e.detail.unresolvedProjectCount.toLocaleString()} of ${i.toLocaleString()} Team Projects need attention.`}),r>0?o("p",{className:"small",children:"Review the automatic mappings below before continuing."}):null,o("div",{className:"legacy-team-project-list",children:t.map((a,s)=>o(j1,{blocked:e.blocked,blockedDescriptionId:e.blockedDescriptionId,blockedProjectRefs:e.blockedProjectRefs,busy:e.busyProjectRefs.has(a.projectRef),index:s,onMap:e.onMap,presentationName:n.get(a.projectRef)??a.displayName,project:a},a.projectRef))}),e.detail.unresolvedProjectCount===0?o("div",{className:"legacy-team-setup-next-action",children:[o("p",{className:"small",id:"legacy-team-project-continue-help",children:"Continue to review the exact people, devices, and Projects that will receive access."}),o("button",{"aria-describedby":["legacy-team-project-continue-help",e.blocked?e.blockedDescriptionId:null].filter(Boolean).join(" "),"aria-disabled":e.blocked?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{e.blocked||e.onContinue()},type:"button",children:"Continue to Review"})]}):null]})}var No={add:"Add",update:"Update",remove:"Remove"},M1=10;function ft(e,t,n=`${t}s`){return`${e.toLocaleString()} ${e===1?t:n}`}function wf(e,t,n,r){const i=new Map;for(const a of e){const s=t(a),c=r(a),l=`${c}:${xa(s)}`,d=n(a),u=i.get(l)??{displayName:s,kind:c,projectRefs:new Set,changeCount:0};u.projectRefs.add(d),u.changeCount+=1,i.set(l,u)}return[...i.values()]}function Sf(e,t){return e.kind==="legacy_default_sharing"?`${e.displayName} — default scope`:e.projectRefs.size>1?`${e.displayName} — ${ft(e.projectRefs.size,t)}`:e.displayName}function Eo({empty:e,exactItemName:t,exactItems:n,summaryItems:r,title:i}){const a=!!(r&&r.length<n.length),s=a&&n.length>M1;return o("section",{children:[o("h4",{children:i}),n.length>0?o(z,{children:[a&&r?o("ul",{className:"legacy-team-setup-delta-summary",children:r.map((c,l)=>o("li",{children:c},`${i}-summary-${l}`))}):null,s?o("details",{children:[o("summary",{children:["Show all ",ft(n.length,`exact ${t}`)]}),o(Dw,{items:n,title:i})]}):o(Dw,{items:n,title:i})]}):o("p",{className:"small",children:e})]})}function Dw({items:e,title:t}){return o("ul",{className:"legacy-team-setup-exact-list",children:e.map((n,r)=>o("li",{children:n},`${t}-${r}`))})}function F1({blocked:e,blockedDescriptionId:t,detail:n,finishing:r,onFinish:i}){const a=n.accessDelta,s=JSON.stringify([n.attemptId,n.finishDigest,n.accessDeltaDigest,n.viewerAccessDeltaDigest]),[c,l]=D(null),d=c===s,u=e||!d,p=[d?null:"legacy-team-setup-confirmation-label",e?t:null].filter(Boolean).join(" "),f=a.teamChanges.map(C=>{const O=C.fromDeviceEligibilityMode==="person_all_devices"?"all devices assigned to each person":C.fromDeviceEligibilityMode==="reviewed_allowlist"?"the reviewed device list":"no existing device policy";return`${No[C.change]} ${C.teamDisplayName}: change device access from ${O} to the reviewed device list.`}),m=a.membershipChanges.map(C=>`${No[C.change]} ${C.identityDisplayName} ${C.change==="remove"?"from":"to"} ${C.teamDisplayName}.`),v=Or([...n.projects.map(C=>({canonicalId:C.projectRef,displayName:C.displayName})),...a.projectChanges.map(C=>({canonicalId:C.projectRef,displayName:C.projectDisplayName}))]),b=a.projectChanges.flatMap(C=>[...C.fromResolvedProjectRef&&C.fromResolvedProjectDisplayName?[{canonicalProjectRef:C.fromCanonicalProjectRef,resolvedProjectRef:C.fromResolvedProjectRef,displayName:C.fromResolvedProjectDisplayName}]:[],...C.toResolvedProjectRef&&C.toResolvedProjectDisplayName?[{canonicalProjectRef:C.toCanonicalProjectRef,resolvedProjectRef:C.toResolvedProjectRef,displayName:C.toResolvedProjectDisplayName}]:[]]),h=Or(b.map(C=>({canonicalId:C.canonicalProjectRef??C.resolvedProjectRef,displayName:C.displayName}))),y=new Map(b.map(C=>[C.resolvedProjectRef,h.get(C.canonicalProjectRef??C.resolvedProjectRef)??C.displayName])),w=Or([...n.projects.flatMap(C=>C.canonicalProjectRef?[{canonicalId:C.canonicalProjectRef,displayName:C.displayName}]:[]),...[...a.recipientChanges,...a.deviceAccessChanges].filter(C=>C.canonicalProjectKind==="project").map(C=>({canonicalId:C.canonicalProjectRef,displayName:C.canonicalProjectDisplayName}))]),_=a.projectChanges.map(C=>`${No[C.change]} ${v.get(C.projectRef)??C.projectDisplayName}: ${C.fromResolvedProjectRef?y.get(C.fromResolvedProjectRef)??C.fromResolvedProjectDisplayName??"no Project":"no Project"} to ${C.toResolvedProjectRef?y.get(C.toResolvedProjectRef)??C.toResolvedProjectDisplayName??"no Project":"no Project"}.`),R=a.recipientChanges.map(C=>C.canonicalProjectKind==="legacy_default_sharing"?`${C.change==="remove"?"Stop":"Start"} using legacy default sharing for ${C.recipientDisplayName}.`:`${No[C.change]} ${C.recipientDisplayName} ${C.change==="remove"?"from":"as"} a recipient for ${w.get(C.canonicalProjectRef)??C.canonicalProjectDisplayName}.`),I=a.deviceAccessChanges.map(C=>C.canonicalProjectKind==="legacy_default_sharing"?`${C.deviceDisplayName} ${C.change==="remove"?"stops":"starts"} inheriting legacy default sharing.`:`${No[C.change]} ${C.deviceDisplayName} access ${C.change==="remove"?"from":"to"} ${w.get(C.canonicalProjectRef)??C.canonicalProjectDisplayName}.`),T=a.teamChanges.length+a.membershipChanges.length+a.projectChanges.length+a.recipientChanges.length+a.deviceAccessChanges.length,A=wf(a.projectChanges,C=>C.projectDisplayName,C=>C.projectRef,()=>"project"),L=wf(a.recipientChanges,C=>C.canonicalProjectDisplayName,C=>C.canonicalProjectRef,C=>C.canonicalProjectKind),F=wf(a.deviceAccessChanges,C=>C.canonicalProjectDisplayName,C=>C.canonicalProjectRef,C=>C.canonicalProjectKind),N=n.devices.filter(C=>C.decision==="included").length,j=[ft(a.teamChanges.length,"Team policy change"),ft(a.membershipChanges.length,"membership change"),ft(a.projectChanges.length,"Project change"),ft(a.recipientChanges.length,"recipient change"),ft(a.deviceAccessChanges.length,"device-access change")],x=`${ft(n.projects.length,"Project")} included; ${ft(N,"included device")}.`,U=Math.max(n.candidate.projectCount,n.projects.length),q=new Set(a.deviceAccessChanges.map(C=>C.deviceRef)).size,$=[...a.teamChanges,...a.membershipChanges,...a.projectChanges,...a.recipientChanges,...a.deviceAccessChanges].filter(C=>C.change==="remove").length,E=a.teamChanges.length===0&&a.membershipChanges.length===0&&a.projectChanges.length===0&&a.recipientChanges.length>0&&a.recipientChanges.every(C=>C.change==="remove"&&C.canonicalProjectKind==="legacy_default_sharing")&&a.deviceAccessChanges.every(C=>C.change==="remove"&&C.canonicalProjectKind==="legacy_default_sharing")?`No new access will be added. This removes legacy default sharing for ${n.candidate.displayName}.${q>0?` ${ft(q,"device")} will stop receiving memories shared only through that default.`:""} Project-scoped access is unchanged across ${ft(U,"reviewed Project")}.`:`${ft(T,"server-confirmed access change")} will be applied atomically; ${ft($,"removal")} ${$===1?"is":"are"} included.`;return o("section",{"aria-labelledby":"legacy-team-setup-step-review",children:[o("h3",{id:"legacy-team-setup-step-review",tabIndex:-1,children:"Review and finish"}),o("p",{children:"Review every server-confirmed access change before activating this Team."}),o("section",{"aria-label":"Access review summary",className:"legacy-team-setup-review-summary",children:[o("p",{className:"legacy-team-setup-net-effect",children:[o("strong",{children:"Net effect:"})," ",E]}),o("p",{children:[o("strong",{children:ft(T,"exact access change")})," to review."]}),o("ul",{children:j.map(C=>o("li",{children:C},C))}),o("p",{className:"small",children:["Scope: ",x]})]}),o("div",{className:"legacy-team-setup-delta",children:[o(Eo,{empty:"No Team policy changes.",exactItemName:"Team policy change",exactItems:f,title:"Team policy"}),o(Eo,{empty:"No membership changes.",exactItemName:"membership change",exactItems:m,title:"Memberships"}),o(Eo,{empty:"No Project mapping changes.",exactItemName:"Project change",exactItems:_,summaryItems:A.map(C=>`${Sf(C,"reviewed Project")}, ${ft(C.changeCount,"Project change")}`),title:"Projects"}),o(Eo,{empty:"No recipient changes.",exactItemName:"recipient change",exactItems:R,summaryItems:L.map(C=>`${Sf(C,"canonical Project")}, ${ft(C.changeCount,"recipient change")}`),title:"Recipients"}),o(Eo,{empty:"No device access changes.",exactItemName:"device-access change",exactItems:I,summaryItems:F.map(C=>`${Sf(C,"canonical Project")}, ${ft(C.changeCount,"device-access change")}`),title:"Device access"})]}),o("label",{className:"legacy-team-setup-confirmation",id:"legacy-team-setup-confirmation-label",children:[o("input",{"aria-disabled":e?"true":void 0,"aria-describedby":e?t:void 0,checked:d,onClick:C=>{e&&C.preventDefault()},onChange:C=>{if(e){C.currentTarget.checked=d;return}l(C.currentTarget.checked?s:null)},type:"checkbox"}),o("span",{children:"I reviewed every access change above and approve activating this Team."})]}),r?o("p",{"aria-live":"polite",className:"legacy-team-setup-finish-progress",role:"status",children:[o("span",{"aria-hidden":"true",className:"legacy-team-setup-spinner"}),"Checking the latest Team roster and applying all reviewed changes atomically. No partial changes will be kept if this cannot finish."]}):null,o("button",{"aria-describedby":p||void 0,"aria-disabled":u?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{u||i(n)},type:"button",children:r?"Finishing Team setup…":"Finish Team setup"})]})}function B1(e){let t=null;return async n=>{try{const r=await q1(n,e,()=>t,i=>{t=i});return{status:"success",generation:n.generation,id:n.id,kind:n.kind,view:r}}catch(r){let i,a;try{i=await U1(n,e,r)}catch(s){a=s}return{status:"failure",generation:n.generation,id:n.id,kind:n.kind,cause:r,...a?{recoveryCause:a}:{},...i?{recoveredView:i}:{}}}}}async function q1(e,t,n,r){switch(e.kind){case"load":return e.refresh?t.refreshCandidate(e.candidateRef):t.loadDetail(e.candidateRef);case"assign_device":return t.saveAssignment(e.candidateRef,e.deviceRef,e.input);case"decide_device":return t.saveDecision(e.candidateRef,e.deviceRef,e.input);case"clear_device":return t.clearDecision(e.candidateRef,e.deviceRef,e.input);case"map_project":return t.saveProjectMapping(e.candidateRef,e.projectRef,e.input);case"refresh":return t.refreshCandidate(e.candidateRef);case"finish":await t.finish(e.candidateRef,e.input);return;case"completion_refresh":{const i=n();if(i?.attemptId===e.attemptId&&i.candidateRef===e.candidateRef){await i.promise;return}const a=Promise.resolve().then(()=>t.onCompleted());r({attemptId:e.attemptId,candidateRef:e.candidateRef,promise:a});try{await a}finally{n()?.promise===a&&r(null)}return}default:throw new Error(`Unhandled Team setup effect: ${String(e)}`)}}async function U1(e,t,n){if(e.kind!=="completion_refresh"&&!(!(n instanceof St)||!Cf(n.errorCode))&&!(e.kind==="load"&&(e.refresh||e.completionOnly||n.errorCode!=="team_setup_confirmation_stale")))return t.loadDetail(e.candidateRef)}function Cf(e){return["team_setup_roster_changed","team_setup_assignment_changed","team_setup_conflict","team_setup_confirmation_stale"].includes(e)}function Lw(e,t){return{id:e,targetId:`legacy-team-setup-step-${t}`}}function G1(e,t,n){return jw(e,n>=0?`${t==="devices"?"legacy-team-device-row":"legacy-team-project-row"}-${n}`:`legacy-team-setup-step-${t}`)}function $w(e,t){return jw(e,t.recovery||t.hasError?"legacy-team-setup-retry":`legacy-team-setup-step-${t.step}`)}function jw(e,t){return{id:e,targetId:t}}var Ow="Team setup changed since it was last reviewed. Reload the latest details to continue.",Mw="Team device details are temporarily unavailable. Check the coordinator connection and settings, then refresh.",H1="Team device details were unavailable, so setup was not finished and no changes were applied. Check the coordinator connection and settings, then refresh.",V1="This device's Project history is too large to finish setup here, so no changes were applied. Retry from a device with less history, or contact support.",K1="Team setup completion could not be checked. Check the coordinator connection and settings, then retry.",Fw="Team setup could not be confirmed, and no local changes were applied. Retry to check whether setup completed.",z1="Another device completed this Team with different reviewed details. Retry to load the completed setup.",W1="The completed Team setup could not be verified. Retry, then check the coordinator connection and settings if the problem continues.";function J1(){return{status:"closed",generation:0}}function Rf(e,t){switch(t.type){case"open":return e.status==="open"&&Wn(e)?e:Y1(e.generation+1,t.candidateRef);case"close":return e.status==="open"&&Wn(e)?e:{status:"closed",generation:e.generation+1};case"close_blocked":case"open_blocked":return e.status==="open"?{...e,message:t.message}:e;case"navigate":return X1(e,t.step);case"blocked_navigation":return tl(e,t.step,t.message);case"retry":return Q1(e);case"refresh":return eF(e,"refresh","Refreshing Team setup from the latest server state.");case"assign_device":return If(e,t,"assign_device");case"decide_device":return If(e,t,"decide_device");case"clear_device":return If(e,t,"clear_device");case"map_project":return Z1(e,t);case"finish":return tF(e);case"command_started":return hF(e,t.id,n=>({...n,status:"running"}));case"effect_outcome":return nF(e,t.outcome);case"focus_applied":return e.status==="open"&&e.focus?.id===t.id?{...e,focus:null}:e;default:return t}}function Y1(e,t){return gr({status:"open",generation:e,candidateRef:t,view:null,step:"devices",projectsVisitedAttemptId:null,commands:[],nextCommandId:1,errors:[],message:"",focus:null,nextFocusId:1},{kind:"load",candidateRef:t,refresh:!1,focusOnOutcome:!1})}function X1(e,t){if(e.status!=="open"||e.step==="completed"||t==="completed")return e;if(t==="projects"&&e.view?.unresolvedDeviceCount)return tl(e,"devices","Finish the device decisions before mapping Projects.");if(t==="review"&&e.view?.unresolvedDeviceCount)return tl(e,"devices","Finish the device decisions before reviewing access.");if(t==="review"&&e.view?.unresolvedProjectCount)return tl(e,"projects","Finish the Project mappings before reviewing access.");const n=t==="projects"&&e.view?e.view.attemptId:e.projectsVisitedAttemptId;return{...e,step:t,projectsVisitedAttemptId:n,focus:Lw(e.nextFocusId,t),nextFocusId:e.nextFocusId+1}}function tl(e,t,n){if(e.status!=="open"||e.step==="completed"||!e.view)return e;const r=t==="devices"?Ew(e.view.devices).findIndex(i=>i.decision==="unresolved"):Aw(e.view.projects).findIndex(i=>i.resolution==="unresolved");return{...e,step:t,projectsVisitedAttemptId:t==="projects"?e.view.attemptId:e.projectsVisitedAttemptId,message:n,focus:G1(e.nextFocusId,t,r),nextFocusId:e.nextFocusId+1}}function Q1(e){if(e.status!=="open"||e.step==="completed"||Ao(e)||Wn(e))return e;const t=nl(e)?.retry??e.errors.find(n=>n.retry)?.retry??"load";return gr(e,{kind:"load",candidateRef:e.candidateRef,refresh:t==="refresh",completionOnly:t==="completion",focusOnOutcome:!0})}function If(e,t,n){if(e.status!=="open"||e.step==="completed"||!kf(e.view)||nl(e)||Ao(e)||Wn(e))return e;const r=e.view.devices.find(c=>c.deviceRef===t.deviceRef);if(!r||!(t.type==="assign_device"?r.actions.assignIdentity:t.type==="clear_device"?r.actions.clearDecision:t.decision==="included"?r.actions.include:t.decision==="excluded"?r.actions.exclude:r.actions.remove).enabled)return e;const i={candidateRef:e.candidateRef,deviceRef:t.deviceRef},a=n==="assign_device"&&t.type==="assign_device"?{kind:n,...i,input:{attemptId:e.view.attemptId,targetIdentityRef:t.targetIdentityRef,expectation:r.expectation}}:n==="clear_device"&&t.type==="clear_device"?{kind:n,...i,input:{attemptId:e.view.attemptId}}:t.type==="decide_device"?{kind:"decide_device",...i,input:t.decision==="included"&&t.targetIdentityRef?{attemptId:e.view.attemptId,decision:"included",expectedTargetIdentityRef:t.targetIdentityRef}:{attemptId:e.view.attemptId,decision:t.decision}}:null;if(!a||t.type==="decide_device"&&t.decision==="included"&&!t.targetIdentityRef)return e;const s=t.type==="assign_device"?`Saving the assignment for ${r.displayName}.`:t.type==="clear_device"?`Clearing the decision for ${r.displayName}.`:`Saving the decision for ${r.displayName}.`;return gr(si(e,{kind:"device",itemRef:t.deviceRef}),a,s)}function Z1(e,t){if(e.status!=="open"||e.step==="completed"||!kf(e.view)||nl(e)||Ao(e)||Wn(e))return e;const n=e.view.projects.find(r=>r.projectRef===t.projectRef);return!n?.actions.map.enabled||!n.mappingChoices.some(r=>r.resolvedProjectRef===t.resolvedProjectRef)?e:gr(si(e,{kind:"project",itemRef:t.projectRef}),{kind:"map_project",candidateRef:e.candidateRef,projectRef:t.projectRef,input:{attemptId:e.view.attemptId,resolvedProjectRef:t.resolvedProjectRef}},`Saving the mapping for ${n.displayName}.`)}function eF(e,t,n){return e.status!=="open"||e.step==="completed"||!e.view?.actions.refresh.enabled||Ao(e)||Wn(e)?e:gr(si(e,{kind:"global"}),{kind:t,candidateRef:e.candidateRef},n)}function tF(e){return e.status!=="open"||e.step==="completed"||e.view?.state!=="ready_to_finish"||e.commands.length||e.errors.length>0?e:gr(si(e,{kind:"global"}),{kind:"finish",candidateRef:e.candidateRef,attemptId:e.view.attemptId,input:{attemptId:e.view.attemptId,finishDigest:e.view.finishDigest,confirmedAccessDeltaDigest:e.view.accessDeltaDigest,confirmedViewerAccessDeltaDigest:e.view.viewerAccessDeltaDigest}},"Finishing Team setup.")}function gr(e,t,n=e.message){const r=`${e.generation}:${e.nextCommandId}`;return{...e,commands:[...e.commands,{...t,generation:e.generation,id:r,status:"pending"}],nextCommandId:e.nextCommandId+1,message:n}}function nF(e,t){if(e.status!=="open"||e.generation!==t.generation)return e;const n=e.commands.find(i=>i.id===t.id);if(!n)return e;const r={...e,commands:e.commands.filter(i=>i.id!==t.id)};return n.kind==="load"&&n.completionOnly&&t.status==="success"&&t.view?.state!=="completed"?Bw(r,n,{status:"failure",generation:t.generation,id:t.id,kind:n.kind,cause:new St(409,"team_setup_confirmation_stale")}):t.status==="failure"?Bw(r,n,t):n.kind==="completion_refresh"?{...r,message:"Team setup complete. Sharing and Projects are up to date."}:n.kind==="finish"?iF(r,n.attemptId):t.view?qw({...mF(r,n),message:rF(n,e.view)},t.view,n.kind==="load"&&n.focusOnOutcome):r}function rF(e,t){if(e.kind==="refresh")return"Team setup refreshed.";if(e.kind==="load")return"";if("deviceRef"in e){const n=t?.devices.find(r=>r.deviceRef===e.deviceRef)?.displayName;return n?`${n} saved.`:"Device saved."}if("projectRef"in e){const n=t?.projects.find(r=>r.projectRef===e.projectRef)?.displayName;return n?`${n} saved.`:"Project mapping saved."}return""}function Bw(e,t,n){if(t.kind==="completion_refresh")return{...e,message:"Team setup complete. Sharing or Projects could not be refreshed; use that view's Refresh control."};const r=n.recoveredView?qw(e,n.recoveredView,!1):e;if(n.recoveredView?.state==="completed")return r;const i=aF(t,n.cause,n.recoveryCause),a={...r,errors:[...si(r,i.scope).errors,i],message:""};return t.kind!=="load"||!t.focusOnOutcome?a:{...a,focus:$w(a.nextFocusId,{hasError:!0,recovery:a.view?.state==="unavailable",step:a.step}),nextFocusId:a.nextFocusId+1}}function qw(e,t,n){const r=pF(t,e.projectsVisitedAttemptId===t.attemptId),i=r==="projects"?t.attemptId:e.projectsVisitedAttemptId,a=t.state==="unavailable"?[{scope:{kind:"global"},message:fF(t.unavailableReason),retry:"refresh"}]:t.state==="completed"?[]:e.errors.filter(l=>{if(l.scope.kind==="device"){const d=l.scope.itemRef;return t.devices.some(u=>u.deviceRef===d)}if(l.scope.kind==="project"){const d=l.scope.itemRef;return t.projects.some(u=>u.projectRef===d)}return!1});let s={...e,view:t,step:r,projectsVisitedAttemptId:i,errors:a,message:t.state==="completed"?"Team setup complete. Sharing and Projects are refreshing.":e.message};const c=a.some(l=>l.scope.kind==="global"||l.scope.kind==="load");return(n||r!==e.step)&&(s={...s,focus:$w(s.nextFocusId,{hasError:c,recovery:t.state==="unavailable",step:r}),nextFocusId:s.nextFocusId+1}),t.state==="completed"&&!Vw(s,t.attemptId)&&(s=gr(s,{kind:"completion_refresh",candidateRef:s.candidateRef,attemptId:t.attemptId})),s}function iF(e,t){let n={...e,step:"completed",message:"Team setup complete. Sharing and Projects are refreshing.",focus:Lw(e.nextFocusId,"completed"),nextFocusId:e.nextFocusId+1};return Vw(n,t)||(n=gr(n,{kind:"completion_refresh",candidateRef:n.candidateRef,attemptId:t})),n}function aF(e,t,n){const r=t instanceof St&&Cf(t.errorCode),i=t instanceof St&&t.errorCode==="team_setup_roster_unavailable",{completionCode:a,message:s,terminalRecoveryCode:c}=lF({command:e,cause:t,recoveryCause:n,changed:r,rosterUnavailable:i});return{scope:oF(e,{globalError:r||i||a!==null}),message:s,retry:sF(e,t,n,{changed:r,rosterUnavailable:i,terminalRecovery:c!==null})}}function oF(e,t){return t.globalError?{kind:"global"}:e.kind==="assign_device"||e.kind==="decide_device"||e.kind==="clear_device"?{kind:"device",itemRef:e.deviceRef}:e.kind==="map_project"?{kind:"project",itemRef:e.projectRef}:e.kind==="load"?{kind:"load"}:{kind:"global"}}function sF(e,t,n,r){return t instanceof St&&t.errorCode==="team_setup_confirmation_stale"||n instanceof St&&n.errorCode==="team_setup_confirmation_stale"?e.kind==="load"&&e.refresh?"completion":"refresh":e.kind==="load"&&e.completionOnly?cF(t):r.terminalRecovery?"load":r.changed||r.rosterUnavailable||e.kind==="refresh"||e.kind==="load"&&e.refresh?"refresh":"load"}function cF(e){return e instanceof St&&rl(e.errorCode)!==null?"completion":"refresh"}function lF(e){const{command:t,cause:n,recoveryCause:r,changed:i,rosterUnavailable:a}=e,s=n instanceof St?rl(n.errorCode):null,c=uF(r instanceof St?rl(r.errorCode):null),l=c??s,d=l==="team_setup_completion_unavailable"&&t.kind==="finish"?dF(n):Gw(l);if(c)return{completionCode:l,message:d??Uw(t.kind),terminalRecoveryCode:c};if(i)return{completionCode:l,message:Ow,terminalRecoveryCode:c};if(a){let u=Mw;return t.kind==="finish"&&(u=n instanceof St&&n.reason==="local_candidate_scan_budget_exceeded"?V1:H1),{completionCode:l,message:u,terminalRecoveryCode:c}}return{completionCode:l,message:d??Uw(t.kind),terminalRecoveryCode:c}}function dF(e){return e instanceof St&&e.reason==="coordinator_route_missing"?`${Fw} The coordinator may be running an older version.`:Fw}function uF(e){return e==="team_setup_completion_conflict"||e==="team_setup_completion_invalid"?e:null}function Uw(e){switch(e){case"load":return"Team setup details are temporarily unavailable. Retry to load the latest details.";case"assign_device":case"decide_device":case"clear_device":return"This device change could not be saved. Reload the latest details before trying again.";case"map_project":return"This Project mapping could not be saved. Reload the latest details before trying again.";case"refresh":return"Team setup could not be refreshed. Retry to load the latest server details.";case"finish":return"Team setup could not be finished. Reload the latest details before trying again.";case"completion_refresh":return"Team setup completed, but dependent views could not be refreshed.";default:return e}}function pF(e,t){return e.state==="completed"?"completed":e.unresolvedDeviceCount>0?"devices":!t&&e.projects.length>0||e.unresolvedProjectCount>0?"projects":"review"}function kf(e){return e?.state==="reviewing"||e?.state==="ready_to_finish"}function Wn(e){return e.commands.some(t=>t.kind==="load"&&t.refresh||["refresh","assign_device","decide_device","clear_device","map_project","finish"].includes(t.kind))}function Ao(e){return e.commands.some(t=>["load","refresh","finish"].includes(t.kind))}function nl(e){return e.errors.find(t=>t.scope.kind==="global"||t.scope.kind==="load")??null}function fF(e){if(Cf(e))return Ow;if(e==="team_setup_roster_unavailable")return Mw;const t=Gw(rl(e));return t||(e==="team_setup_incomplete"?"Team setup needs refreshed server details before review can continue.":"Team setup details are temporarily unavailable. Refresh to load the latest server state.")}function rl(e){return e==="team_setup_completion_unavailable"||e==="team_setup_completion_conflict"||e==="team_setup_completion_invalid"?e:null}function Gw(e){return e==="team_setup_completion_unavailable"?K1:e==="team_setup_completion_conflict"?z1:e==="team_setup_completion_invalid"?W1:null}function Hw(e){return e.kind==="global"||e.kind==="load"}function si(e,t){const n=Hw(t);return{...e,errors:e.errors.filter(r=>n?!Hw(r.scope):r.scope.kind!==t.kind?!0:!("itemRef"in t)||!("itemRef"in r.scope)?!1:r.scope.itemRef!==t.itemRef)}}function mF(e,t){return t.kind==="assign_device"||t.kind==="decide_device"||t.kind==="clear_device"?si(e,{kind:"device",itemRef:t.deviceRef}):t.kind==="map_project"?si(e,{kind:"project",itemRef:t.projectRef}):{...e,errors:[]}}function hF(e,t,n){return e.status==="open"?{...e,commands:e.commands.map(r=>r.id===t?n(r):r)}:e}function Vw(e,t){return e.commands.some(n=>n.kind==="completion_refresh"&&n.attemptId===t)}var gF={role:"list"},vF={role:"listitem"};function yF(e){const t=e.session,n=t.view,r=nl(t),i=t.commands.some(_=>_.kind==="load"),a=Ao(t)||Wn(t),s=t.commands.some(_=>_.kind==="finish"),c=n?.state==="unavailable"||r?.retry==="refresh",l=r!=null&&(!n||c),d=!kf(n)||a||!!r,u=[r?"legacy-team-setup-error":null,a?"legacy-team-setup-operation-status":null,n?.state==="unavailable"?"legacy-team-setup-refresh":null].filter(Boolean).join(" ")||void 0,p=n?`Set up ${n.candidate.displayName}`:"Set up Team",f=t.errors.filter(_=>_.scope.kind==="device"||_.scope.kind==="project"),m=f.length>0,v=f.some(_=>_.retry==="refresh"),b=new Set(f.flatMap(_=>_.scope.kind==="device"?[_.scope.itemRef]:[])),h=new Set(f.flatMap(_=>_.scope.kind==="project"?[_.scope.itemRef]:[])),y=new Set(t.commands.flatMap(_=>"deviceRef"in _?[_.deviceRef]:[])),w=new Set(t.commands.flatMap(_=>"projectRef"in _?[_.projectRef]:[]));return o(Ln,{ariaDescribedby:"legacy-team-setup-description",ariaLabelledby:"legacy-team-setup-title",contentClassName:"modal legacy-team-setup-dialog",contentId:"legacyTeamSetupDialog",onCloseAutoFocus:e.onCloseAutoFocus,onOpenAutoFocus:e.onOpenAutoFocus,onOpenChange:_=>{_||e.onClose()},open:!0,overlayClassName:"modal-backdrop",overlayId:"legacyTeamSetupDialogBackdrop",children:o("div",{"aria-busy":a?"true":"false",className:"modal-card legacy-team-setup-card",children:[o("div",{className:"modal-header",children:[o("div",{id:"legacy-team-setup-title",tabIndex:-1,children:o(zd,{children:p})}),o(Lr,{ariaDisabled:a,ariaLabel:`Close ${p}`,onClick:e.onClose})]}),o("div",{className:"modal-body legacy-team-setup-body",children:[o("p",{className:"small",id:"legacy-team-setup-description",children:"Review device ownership and Project access before this Team can be used for sharing."}),i&&!n?o("p",{role:"status",children:"Loading the latest Team setup details…"}):null,r?o("div",{className:"legacy-team-setup-error legacy-team-setup-recovery",id:"legacy-team-setup-global-error",children:[l?o("strong",{children:"Current setup details are unavailable"}):null,o("p",{"aria-live":"assertive",id:"legacy-team-setup-error",role:"alert",children:r.message}),o("button",{"aria-busy":a?"true":void 0,"aria-disabled":a?"true":void 0,className:"settings-button legacy-team-setup-target",id:"legacy-team-setup-retry",onClick:()=>{a||e.onRetry()},type:"button",children:i?r.retry==="refresh"?"Refreshing…":"Retrying…":r.retry==="refresh"?"Retry loading current setup":"Retry"})]}):null,m?o("div",{className:"legacy-team-setup-error",id:"legacy-team-setup-item-errors",children:[f.map(_=>o("p",{"aria-live":"assertive",id:"itemRef"in _.scope?_f(_.scope.kind,_.scope.itemRef):void 0,role:"alert",children:_.message},"itemRef"in _.scope?`${_.scope.kind}:${_.scope.itemRef}`:_.scope.kind)),o("button",{"aria-busy":a?"true":void 0,"aria-disabled":a?"true":void 0,className:"settings-button legacy-team-setup-target",id:"legacy-team-setup-item-retry",onClick:()=>{a||e.onRetry()},type:"button",children:i?v?"Refreshing…":"Retrying…":v?"Refresh Team setup":"Retry"})]}):null,n?o(z,{children:[t.step!=="completed"&&!l?o(bF,{onNavigate:e.onNavigate,step:t.step,unresolvedDeviceCount:n.unresolvedDeviceCount,unresolvedProjectCount:n.unresolvedProjectCount}):null,i?o("p",{"aria-live":"polite",className:"small",id:"legacy-team-setup-refresh-status",role:"status",children:"Refreshing Team setup details…"}):null,o("p",{"aria-live":"polite",className:"small",id:"legacy-team-setup-operation-status",role:"status",children:t.message}),l?null:t.step==="devices"?o(L1,{blocked:d,blockedDescriptionId:u,blockedDeviceRefs:b,busyDeviceRefs:y,detail:n,onAssign:e.onAssign,onClear:e.onClear,onDecision:e.onDecide}):t.step==="projects"?o(O1,{blocked:d,blockedDescriptionId:u,blockedProjectRefs:h,busyProjectRefs:w,detail:n,onContinue:()=>e.onNavigate("review"),onMap:e.onMap}):t.step==="review"&&n.state==="ready_to_finish"?o(F1,{blocked:d||m,blockedDescriptionId:m?"legacy-team-setup-item-errors":u,detail:n,finishing:s,onFinish:e.onFinish}):o(_F,{busy:a,canFinish:n.state==="ready_to_finish",onRefresh:e.onRefresh,recoveryRequired:c,step:t.step})]}):null]}),o("div",{className:"modal-footer legacy-team-setup-actions",children:o("button",{"aria-disabled":a?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:e.onClose,type:"button",children:"Close"})})]})})}function bF(e){const t=e.unresolvedDeviceCount>0,n=e.unresolvedProjectCount>0;return o(z,{children:[o("ol",{...gF,"aria-label":"Team setup steps",className:"legacy-team-setup-steps",children:[{label:"Devices",step:"devices"},{label:"Projects",step:"projects"},{label:"Review",step:"review"}].map((i,a)=>{const s=i.step==="projects"?t:i.step==="review"?t||n:!1,c=s?t?"legacy-team-setup-block-devices":"legacy-team-setup-block-projects":void 0;return g("li",{...vF,className:"legacy-team-setup-step",key:i.step},o("span",{"aria-hidden":"true",className:"legacy-team-setup-step-number",children:a+1}),o("button",{"aria-current":e.step===i.step?"step":void 0,"aria-describedby":c,"aria-disabled":s?"true":void 0,"aria-label":`Step ${a+1}: ${i.label}`,className:"settings-button legacy-team-setup-target",onClick:()=>e.onNavigate(i.step),type:"button",children:i.label}))})}),t?o("p",{className:"small",id:"legacy-team-setup-block-devices",children:"Finish the device decisions before mapping Projects or reviewing access."}):null,n?o("p",{className:"small",id:"legacy-team-setup-block-projects",children:"Finish the Project mappings before reviewing access."}):null]})}function _F(e){return e.step==="completed"?o("section",{"aria-labelledby":"legacy-team-setup-step-completed",children:[o("h3",{id:"legacy-team-setup-step-completed",tabIndex:-1,children:"Team setup complete"}),o("p",{children:"This Team is ready for Project sharing."})]}):e.step!=="review"?null:o("section",{"aria-labelledby":"legacy-team-setup-step-review",children:[o("h3",{id:"legacy-team-setup-step-review",tabIndex:-1,children:"Review and finish"}),o("p",{children:e.canFinish?"The server has confirmed that this Team is ready for final review.":"Final review is waiting for the latest setup details."}),o("p",{className:"small",children:"Next setup action: review the access summary before finishing."}),!e.canFinish&&!e.recoveryRequired?o("button",{"aria-busy":e.busy?"true":void 0,"aria-disabled":e.busy?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{e.busy||e.onRefresh()},type:"button",children:"Refresh Team setup"}):null]})}var wF={clearDecision:mI,finish:vI,loadDetail:uI,onCompleted:()=>{},refreshCandidate:gI,saveAssignment:pI,saveDecision:fI,saveProjectMapping:hI},Tf="codemem:open-legacy-team-setup";function Kw(e){if(!e)return!1;const t={candidateRef:e,handled:!1,returnFocus:document.activeElement instanceof HTMLElement?document.activeElement:null};return window.dispatchEvent(new CustomEvent(Tf,{detail:t})),t.handled}function SF(e){if(!e?.isConnected||e.tabIndex<0||e.matches(":disabled")||e.closest('[hidden], [inert], [aria-hidden="true"]'))return!1;for(let t=e;t;t=t.parentElement){const n=window.getComputedStyle(t);if(n.display==="none"||n.visibility==="hidden"||n.visibility==="collapse")return!1}return!0}function CF({dependencies:e}){const[t,n]=D(J1),r=B(null),i=Ie(()=>B1(e),[e]),a=l=>{n(d=>Rf(d,l))};return Tt(()=>{const l=d=>{const u=d;u.detail.handled=!0,r.current=u.detail.returnFocus,n(p=>p.status==="open"&&Wn(p)?Rf(p,{type:"open_blocked",message:"Wait for the current Team setup change to finish before opening another Team."}):Rf(p,{type:"open",candidateRef:u.detail.candidateRef}))};return window.addEventListener(Tf,l),()=>{window.removeEventListener(Tf,l)}},[]),V(()=>{if(t.status==="open")for(const l of t.commands.filter(d=>d.status==="pending"))a({type:"command_started",id:l.id}),i(l).then(d=>a({type:"effect_outcome",outcome:d}))},[i,t]),V(()=>{if(t.status!=="open"||!t.focus)return;const l=document.getElementById(t.focus.targetId)??document.getElementById("legacy-team-setup-title");l&&(l.focus(),a({type:"focus_applied",id:t.focus.id}))},[t]),t.status==="closed"?null:o(yF,{session:t,onAssign:(l,d)=>a({type:"assign_device",deviceRef:l.deviceRef,targetIdentityRef:d}),onClear:l=>a({type:"clear_device",deviceRef:l.deviceRef}),onClose:()=>{if(Wn(t)){a({type:"close_blocked",message:"Team setup will stay open while this change saves. Close it after saving finishes."});return}a({type:"close"})},onCloseAutoFocus:l=>IF(l,r),onDecide:(l,d,u)=>{if(d==="included"&&!u){a({type:"open_blocked",message:`Save a person assignment before including ${l.displayName}.`});return}a({type:"decide_device",deviceRef:l.deviceRef,decision:d,...u?{targetIdentityRef:u}:{}})},onFinish:()=>a({type:"finish"}),onMap:(l,d)=>a({type:"map_project",projectRef:l.projectRef,resolvedProjectRef:d}),onNavigate:l=>a({type:"navigate",step:l}),onOpenAutoFocus:RF,onRefresh:()=>a({type:"refresh"}),onRetry:()=>a({type:"retry"})})}var RF=e=>{const t=document.getElementById("legacy-team-setup-title");t&&(e.preventDefault(),t.focus())};function IF(e,t){e.preventDefault();const n=document.querySelector('.tab-btn[aria-current="page"]');(SF(t.current)?t.current:n)?.focus(),t.current=null}function kF(e,t={}){const n={...wF,...t};Ue(o(CF,{dependencies:n}),e)}var xo=new WeakMap,Do=new Set,il=new Set,zw=100,vr="";function rn(e,t=""){const n=document.createElement("p");return t&&(n.className=t),n.textContent=e,n}function Ww(e,t){const n=document.createElement("h3");return n.className="recipient-policy-review-heading",n.textContent=`${e} (${t.toLocaleString()})`,n}function TF(e){const t=new Map;for(const n of e){const r=`${n.projectGroup.identity}\0${n.conditionCode}`,i=t.get(r);if(i){i.items.push(n);continue}t.set(r,{key:r,displayName:n.projectGroup.displayName,items:[n]})}return[...t.values()]}function Pf(e,t){return e.options.find(n=>n.decision===t)}function PF(e){const t=e.items[0];return t?Pf(t,t.recommendedDecision)?.label??t.recommendedDecision.replaceAll("_"," "):""}function Jw(e,t){const n=document.createElement("div");n.className="recipient-policy-preview-list";const r=document.createElement("strong");r.textContent=e;const i=document.createElement("ul");for(const a of t){const s=document.createElement("li");s.textContent=a,i.appendChild(s)}return n.append(r,i),n}function Yw(e){return[...new Map(e.map(t=>[t.id,t.label])).values()]}function NF(e){const t=new Map;for(const n of e)for(const r of n.preview.projects){const i=t.get(r.canonicalIdentity)??0;t.set(r.canonicalIdentity,Math.max(i,n.preview.affectedMemoryCount))}return[...t.values()].reduce((n,r)=>n+r,0)}function EF(e,t){const n=e.items.flatMap(l=>{const d=Pf(l,t);return d?[d]:[]}),r=Yw(n.flatMap(l=>l.preview.projects.map(d=>({id:d.canonicalIdentity,label:`${d.displayName} — ${d.canonicalIdentity}`})))),i=Yw(n.flatMap(l=>l.preview.effectiveDevices.map(d=>({id:d.deviceId,label:`${d.displayName} (${d.assignment})`})))),a=NF(n),s=document.createElement("div");s.className="recipient-policy-preview settings-note";const c=document.createElement("strong");return c.textContent=`Affected: ${r.length.toLocaleString()} Project${r.length===1?"":"s"} · ${a.toLocaleString()} memor${a===1?"y":"ies"} · ${i.length.toLocaleString()} device${i.length===1?"":"s"}`,s.append(c,Jw("Projects and paths",r)),i.length>0&&s.appendChild(Jw("Devices",i)),s}function AF(e){return e==="unassigned_effective_device"?"This decision needs Identity or device details. Complete that setup first, then return to this review.":"This decision needs recipient details. Use the Project sharing controls below, then return to this review."}async function xF(e,t){const n=e.items.map(a=>({decision:t,reviewItemId:a.reviewItemId,sourceFingerprint:a.sourceFingerprint}));if(n.length===1)try{return await RI(n[0]),{stale:!1,failed:!1}}catch(a){if(!(a instanceof th))throw a;return il.add(n[0].reviewItemId),{stale:!0,failed:!1}}let r=!1,i=!1;for(let a=0;a<n.length;a+=zw){const s=n.slice(a,a+zw),c=await II(s);for(const l of c.results)l.status==="stale"?(il.add(l.reviewItemId),r=!0):l.status!=="applied"&&(i=!0)}return{stale:r,failed:i}}function Xw(e){return e.items.length>1?"Apply to all worktrees":"Apply decision"}function Nf(e,t){const n=e.items[0];if(!n)return;const r=t.select.value,i=e.items.map(c=>Pf(c,r)),a=i.some(c=>c?.preview.requiresDecisionInput),s=i.some(c=>!c);t.previewMount.replaceChildren(EF(e,r)),t.deferred.textContent=a?AF(n.conditionCode):"",t.deferred.hidden=!a,t.submit.disabled=a||s||Do.has(e.key)}function DF(e,t){if(t.failed)return"Some review items could not be updated. Review the remaining items and try again.";if(t.stale)return"Source state changed. Review the refreshed choices before trying again.";for(const n of e.items)il.delete(n.reviewItemId);return"Decision applied. Review items refreshed."}function Qw(e,t){t.select.disabled=!1,t.submit.textContent=Xw(e),Nf(e,t)}async function LF(e,t,n,r){if(t.submit.disabled||Do.has(e.key))return;const i=t.select.value;Do.add(e.key),t.select.disabled=!0,t.submit.disabled=!0,t.submit.textContent="Applying…",n.textContent="Applying review decision…";try{const a=await xF(e,i);vr=DF(e,a),n.textContent=vr,Do.delete(e.key),(a.failed||a.stale)&&Qw(e,t),await r.onRefresh?.()}catch(a){vr=a instanceof Error?a.message:"Unable to apply decision.",n.textContent=vr,Do.delete(e.key),Qw(e,t);try{await r.onRefresh?.()}catch(s){const c=s instanceof Error?s.message:"Unable to refresh review items.";vr=`${vr} Refresh failed: ${c}`,n.textContent=vr}}}function $F(e,t,n,r){const i=e.items[0];if(!i)throw new Error("Review group must contain at least one item.");const a=document.createElement("div");a.className="project-inventory-actions";const s=document.createElement("label");s.htmlFor=`recipient-policy-decision-${t}`,s.textContent="Decision";const c=document.createElement("select");c.id=s.htmlFor,c.className="project-filter recipient-policy-review-select",c.dataset.reviewControl="decision";for(const f of i.options){const m=document.createElement("option");m.value=f.decision,m.textContent=f.label,c.appendChild(m)}c.value=i.recommendedDecision;const l=document.createElement("button");l.className="settings-button",l.type="button",l.textContent=Xw(e),l.dataset.reviewControl="apply";const d=rn("","settings-note recipient-policy-deferred"),u=document.createElement("div");u.className="recipient-policy-preview-mount",u.setAttribute("aria-live","polite");const p={container:a,deferred:d,previewMount:u,select:c,submit:l};return c.addEventListener("change",()=>Nf(e,p)),l.addEventListener("click",()=>LF(e,p,n,r)),Nf(e,p),a.append(s,c,l),p}function jF(e,t,n,r){const i=e.items[0];if(!i)throw new Error("Review group must contain at least one item.");const a=document.createElement("article");a.className="project-inventory-row recipient-policy-review-item",a.dataset.reviewGroup=e.key;const s=document.createElement("h4");s.className="project-inventory-title",s.textContent=`${e.displayName}: ${i.finding}`;const c=rn(i.reason,"project-inventory-meta"),l=rn(`Recommended: ${PF(e)}`,"settings-note");a.append(s,c,l),e.items.some(u=>il.has(u.reviewItemId))&&a.appendChild(rn("Source state changed while this decision was being reviewed. Review the refreshed choices before trying again.","settings-note project-attention-note"));const d=$F(e,t,n,r);return a.append(d.container,d.deferred,d.previewMount),a}function OF(e,t,n){const r=TF(e.reviewItems),i=document.createElement("section");i.className="recipient-policy-review-section recipient-policy-review-decisions",i.append(Ww("Review findings",r.length),rn("Review each repository before Codemem records how its older sharing state should be represented. Access stays unchanged until you apply a decision.","section-meta"));const a=document.createElement("div");return a.className="project-inventory-list recipient-policy-review-list",r.forEach((s,c)=>{a.appendChild(jF(s,c,t,n))}),i.appendChild(a),i}function MF(e,t){const n=document.createElement("article");n.className="project-inventory-row recipient-policy-blocked-item";const r=document.createElement("div");r.className="project-inventory-row-header";const i=document.createElement("h3");i.className="project-inventory-title",i.textContent=e.finding;const a=document.createElement("span");a.className="project-status-badge needs_attention",a.textContent="Blocked",r.append(i,a);const s=rn(e.repairAction,"settings-note");if(s.id=`recipient-policy-repair-help-${e.blockedItemId}`,n.append(r,rn(e.reason,"project-inventory-meta"),s,rn(`Owner: ${e.ownerLabel}`,"settings-note")),t.onRepair&&(t.isRepairAvailable?.(e.repair)??!0)){const c=document.createElement("button");c.className="settings-button",c.type="button",c.textContent=e.repair.label,c.setAttribute("aria-describedby",s.id),c.addEventListener("click",async()=>{c.disabled=!0;try{await t.onRepair?.(e.repair)}finally{c.disabled=!1}}),n.appendChild(c)}else n.appendChild(rn("Open Projects to repair this item.","settings-note"));return n}function FF(e,t){const n=document.createElement("section");n.className="recipient-policy-review-section recipient-policy-review-blocked",n.append(Ww("Blocked source repairs",e.blockedItems.length),rn("Access has not changed. Repair each source record before Codemem can safely interpret it.","section-meta project-attention-note"));const r=document.createElement("div");r.className="project-inventory-list recipient-policy-review-list";for(const i of e.blockedItems)r.appendChild(MF(i,t));return n.appendChild(r),n}function BF(e){const t=document.activeElement;if(!(t instanceof HTMLElement)||!e.contains(t))return null;const n=t.closest("[data-review-group]")?.dataset.reviewGroup,r=t.dataset.reviewControl;return n&&r?{group:n,control:r}:null}function qF(e,t){if(t){for(const n of e.querySelectorAll("[data-review-group]"))if(n.dataset.reviewGroup===t.group){n.querySelector(`[data-review-control="${t.control}"]`)?.focus();return}}}function UF(e,t,n={}){const r=t.blockedItems.map(u=>n.onRepair&&(n.isRepairAvailable?.(u.repair)??!0)?"1":"0"),i={blockedItems:t.blockedItems,reviewItems:t.reviewItems},a=`review:${r.join("")}:${JSON.stringify(i)}`;if(xo.get(e)===a)return;if(t.reviewItems.length===0&&t.blockedItems.length===0){e.replaceChildren(),e.hidden=!0,xo.set(e,a);return}const s=BF(e);e.hidden=!1;const c=document.createElement("section");c.className="card recipient-policy-review",c.setAttribute("aria-labelledby","recipientPolicyReviewTitle");const l=document.createElement("h2");l.id="recipientPolicyReviewTitle",l.textContent="Sharing review";const d=document.createElement("div");d.className="section-meta recipient-policy-review-status",d.setAttribute("role","status"),d.setAttribute("aria-live","polite"),d.textContent=vr,c.append(l,d),t.reviewItems.length>0&&c.appendChild(OF(t,d,n)),t.blockedItems.length>0&&c.appendChild(FF(t,n)),e.replaceChildren(c),qF(e,s),xo.set(e,a)}function GF(e,t){const n=t instanceof Error?t.message:"Unable to load recipient migration review.",r=`error:${n}`;if(xo.get(e)===r)return;e.hidden=!1;const i=document.createElement("section");i.className="card recipient-policy-review";const a=document.createElement("h2");a.textContent="Sharing review";const s=rn(n,"settings-note project-attention-note");s.setAttribute("role","status"),i.append(a,s),e.replaceChildren(i),xo.set(e,r)}var Zw=[["","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"]],bt=null,Ht=0,al=250,HF=100,Ef=[],ol=new Set,sl=new Set,cl=new Map,ll=new Map,ci=new Map,Lo=new Map,dl=!1,$o=new Map,jo=!1,yr=!1,Af=0,eS=null,Jn=0,Oo=0,sa=null,Mo=null,Vt=new Set,tS=new WeakMap,ul={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},ca=ul,br=!1,xf;function VF(e=!1,t={}){if(!e&&Mo)return Mo;const n=ah(t).then(r=>({ok:!0,summary:r})).catch(()=>({ok:!1}));return Mo=n,n.then(()=>{Mo===n&&(Mo=null)}),n}function Df(e){return VF(e.awaitTeamSetupSummary===!0||e.requireTeamSetupSummary===!0,e)}function Le(e){return document.getElementById(e)}function KF(e){return Zw.find(([t])=>t===e)?.[1]??e.replaceAll("_"," ")}function zF(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 bn(e){return e.read_only===!0&&e.read_only_reason==="peer_received"}function pl(e){return e.identity_source!=="unmapped"&&!bn(e)}function WF(e){const t=$o.get(e.workspace_identity);(!t||bn(t)&&!bn(e))&&$o.set(e.workspace_identity,e)}function Lf(e){return bn(e)?"Received from peers":ml(e.resolved_scope_id)}function JF(e){return bn(e)?"source-owned project":zF(e.resolution_reason)}function YF(e){const t=e.person.display_name;switch(e.lifecycle.state){case"waiting_for_acceptance":return`Invitation sent to ${t}`;case"active":return`Shared with ${t}`;case"waiting_for_device":return`Sharing with ${t}`;case"needs_attention":return`Sharing with ${t} needs attention`;case"revoking":return`Removing sharing with ${t}`;case"revoked":return`Previously shared with ${t}`;case"cancelled":return`Invitation to ${t} cancelled`;default:return`Setting up sharing with ${t}`}}function nS(e){if(!e)return"No recent sessions";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function rS(e){return[...new Set(e.map(t=>t.workspace_identity))].sort()}function li(){const e=Vt.size,t=Le("projectsShareSelected");t&&(t.textContent=e===0?"Share selected":`Share selected (${e})`,t.disabled=e===0||!yr||!br,t.classList.add("project-selection-target"));const n=Le("projectsSelectionStatus");n&&(n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.textContent=`${e.toLocaleString()} Project${e===1?"":"s"} selected.`);for(const r of document.querySelectorAll(".project-selection-checkbox")){const i=tS.get(r)??[],a=i.filter(s=>Vt.has(s)).length;r.checked=i.length>0&&a===i.length,r.indeterminate=a>0&&a<i.length}for(const r of document.querySelectorAll(".project-recipient-action"))r.disabled=!yr||!br}function XF(e){const t=e.every(n=>Vt.has(n));for(const n of e)t?Vt.delete(n):Vt.add(n);li()}function iS(e,t){const n=rS(e),r=document.createElement("label");r.className="project-selection-control project-selection-target";const i=document.createElement("input");i.className="project-selection-checkbox",i.dataset.projectFocusKey=`select:${n.join("|")}`,i.type="checkbox",i.setAttribute("aria-label",t),tS.set(i,n),i.addEventListener("change",()=>XF(n));const a=document.createElement("span");return a.className="sr-only",a.textContent=t,r.append(i,a),r}function QF(e){if(!br)return[];const t=new Set(e),n=new Map(ca.teams.filter(a=>a.status==="active").map(a=>[a.teamId,a.displayName])),r=new Map(ca.identities.filter(a=>a.status==="active"||a.status==="pending").map(a=>[a.identityId,a.displayName])),i=new Map;for(const a of ca.projectRecipients)if(!(a.status!=="active"||!t.has(a.canonicalProjectIdentity)))if(a.recipientKind==="team"){const s=n.get(a.teamId);s&&i.set(`team:${a.teamId}`,{key:`team:${a.teamId}`,kind:"Team",displayName:s})}else{const s=r.get(a.identityId);s&&i.set(`identity:${a.identityId}`,{key:`identity:${a.identityId}`,kind:"Identity",displayName:s})}return[...i.values()].sort((a,s)=>`${a.kind}:${a.displayName}`.localeCompare(`${s.kind}:${s.displayName}`))}function aS(e){const t=document.createElement("div");t.className="project-recipient-summary";const n=QF(e),r=document.createElement("div");if(r.className="project-recipient-status",r.textContent=br?n.length===0?"Not shared with any recipients.":e.length===1?`Shared with ${n.length.toLocaleString()} recipient${n.length===1?"":"s"}.`:`${n.length.toLocaleString()} recipient${n.length===1?"":"s"} across these Project identities.`:"Recipient access is unavailable.",t.appendChild(r),n.length>0){const i=document.createElement("ul");i.className="project-recipient-chips",i.setAttribute("aria-label","Active recipients");for(const a of n){const s=document.createElement("li");s.className=`project-recipient-chip project-recipient-chip-${a.kind.toLowerCase()}`,s.textContent=`${a.kind}: ${a.displayName}`,i.appendChild(s)}t.appendChild(i)}return t}function oS(e,t){const n=document.createElement("button");return n.className="settings-button project-recipient-action project-selection-target",n.type="button",n.disabled=!yr||!br,e.length===1?(n.textContent="Manage recipients",n.setAttribute("aria-label",`Manage recipients for ${t}`),n.dataset.projectFocusKey=`manage:${e[0]}`,n.addEventListener("click",()=>{$a({mode:"project-manage",projectId:e[0]})})):(n.textContent="Share selected",n.setAttribute("aria-label",`Share selected identities for ${t}`),n.dataset.projectFocusKey=`share:${e.join("|")}`,n.addEventListener("click",()=>{for(const r of e)Vt.add(r);li(),$a({mode:"project-add",projectIds:[...e].sort()})})),n}function ZF(e){return e.git_remote?e.git_remote:e.cwd?e.cwd:e.workspace_identity}function $f(e){return e.git_remote?`git:${e.git_remote}`:e.project?`project:${e.project}`:`identity:${e.workspace_identity}`}function jf(e){return e.project||e.display_project||"Unnamed Project"}function sS(e){const t=String(e||"").trim();return t?S.lastProjectCoordinatorAdminGroups.find(n=>String(n.group_id||"").trim()===t&&!n.archived_at)?.display_name||"Team details unavailable":null}function eB(){return new Set(S.lastProjectCoordinatorAdminGroups.filter(e=>!e.archived_at).map(e=>String(e.group_id||"").trim()).filter(Boolean))}function tB(e){return!jo||e.authority_type!=="coordinator"||!e.group_id?!1:!eB().has(String(e.group_id).trim())}function fl(){const e=document.activeElement;return e instanceof HTMLSelectElement&&e.classList.contains("project-domain-select")}function cS(){dl&&(dl=!1,bt?.())}async function nB(){let e;try{const t=await Kl();e=t&&typeof t=="object"?t:null}catch{S.lastProjectCoordinatorAdminGroups=[],jo=!1;return}if(e?.readiness!=="ready"||!e.has_admin_secret){S.lastProjectCoordinatorAdminGroups=[],jo=!1;return}try{const t=await Um(!1);S.lastProjectCoordinatorAdminGroups=Array.isArray(t?.items)?t.items:[],jo=!0}catch{S.lastProjectCoordinatorAdminGroups=[],jo=!1}}function rB(e){return e.kind==="team_default"}function Of(e){const t=e.label||"Untitled Space";return rB(e)?`${t} (default)`:t}function iB(e,t){const n=Of(e);return t.some(r=>r.scope_id!==e.scope_id&&Of(r)===n)?`${n} · Space ID ${e.scope_id}`:n}function aB(e){const t=sS(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 oB(e){return e?Ef.find(t=>t.scope_id===e)??null:null}function ml(e){const t=oB(e);return e?t?`${Of(t)} · ${aB(t)}`:"Unknown Space":"—"}function Mf(){return Ef.filter(e=>e.scope_id!=="legacy-shared-review"&&!tB(e))}function sB(e){return Mf().some(t=>t.scope_id===e)}function lS(...e){for(const t of e)if(t&&sB(t))return t;return e.find(t=>!!t)??""}function cB(e){const t=sS(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Spaces":"Other Spaces"}function lB(e){return e.group_id?`team:${e.group_id}`:`${e.authority_type||"other"}:${e.kind||"space"}`}function dB(){const e=new Map;for(const t of Mf()){const n=lB(t),r=cB(t),i=e.get(n)??{label:r,scopes:[]};e.set(n,{label:i.label,scopes:[...i.scopes,t]})}return[...e.values()]}function dS(e){for(const t of dB()){const n=document.createElement("optgroup");n.label=t.label;for(const r of t.scopes){const i=document.createElement("option");i.value=r.scope_id,i.textContent=iB(r,t.scopes),n.appendChild(i)}e.appendChild(n)}}function uB(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 Ff(e,t,n=[]){try{await AI({...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}),ci.delete(e.workspace_identity),cl.delete(e.workspace_identity),X("Project Space assignment updated. Device access grants are unchanged."),bt?.()}catch(r){if(r instanceof is){ci.set(e.workspace_identity,{requiredGuardrailTokens:r.requiredGuardrailTokens,scopeId:t,warnings:r.guardrailWarnings}),bt?.();return}X(r instanceof Error?r.message:"Unable to update project Space.","warning")}}async function pB(e,t){const n=e.filter(pl);if(n.length!==0)try{await xI({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}))}),X(`Updated ${n.length} project identit${n.length===1?"y":"ies"}. Device access grants are unchanged.`),ll.delete($f(n[0])),bt?.()}catch(r){X(r instanceof is?"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 fB(e){if(e.mapping_id!=null)try{await DI(e.mapping_id),ci.delete(e.workspace_identity),cl.delete(e.workspace_identity),X("Project Space assignment removed. The next fallback now applies."),bt?.()}catch(t){X(t instanceof Error?t.message:"Unable to remove project Space assignment.","warning")}}async function uS(e,t=!1){try{const n=Lo.get(e.workspace_identity),r=await $I({...t&&n?{confirmation_token:n.confirmationToken}:{},confirmed:t,workspace_identity:e.workspace_identity});Lo.delete(e.workspace_identity),X(`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.`),bt?.()}catch(n){if(n instanceof Zm){Lo.set(e.workspace_identity,{confirmationToken:n.preview.confirmation_token,localOwnedMemoryCount:n.preview.local_owned_memory_count,peerOwnedMemoryCount:n.preview.peer_owned_memory_count}),bt?.();return}X(n instanceof Error?n.message:"Unable to forget project memories.","warning")}}async function pS(e){if(e.identity_source==="unmapped")return;const t=String(e.project||e.display_project||"").trim();let n=[];try{n=(await es()).filter(i=>i&&i!==t)}catch{}const r=await Tp({cancelLabel:"Cancel",confirmLabel:"Change project",description:`This will update ${e.session_count} session${e.session_count===1?"":"s"} and ${e.memory_count??0} memor${e.memory_count===1?"y":"ies"} by changing the stored project. Space assignment stays unchanged.`,initialValue:t,placeholder:"Project name",suggestions:n,title:"Change project",validate:i=>{const a=i.trim();return a?a===t?"Already assigned to this project.":null:"Enter a project name."}});if(r!=null)try{const i=await LI({project:r.trim(),workspace_identity:e.workspace_identity});X(`Changed project to ${i.project} for ${i.moved_session_count} session${i.moved_session_count===1?"":"s"}.`),bt?.()}catch(i){X(i instanceof Error?i.message:"Unable to change project.","warning")}}async function mB(e){const t=$o.get(e);if(t&&!bn(t))return{offset:Ht,project:t};try{let n=0,r=0;for(;;){const i=await Sa({limit:al,offset:n,q:e});r+=1;const a=i.projects.find(c=>c.workspace_identity===e&&!bn(c));if(a)return{offset:i.offset,project:a};if(!i.has_more||i.limit<=0)return null;const s=i.offset+i.limit;if(s<=n||r>=HF)return null;n=s}}catch{return null}}function fS(e){const t=[...document.querySelectorAll("[data-project-workspace-identity]")].find(a=>a.dataset.projectWorkspaceIdentity===e&&a.dataset.projectRepairable==="true");if(!t)return!1;const n=t.querySelector(".project-inventory-details");if(!n)return!1;const r=t.closest(".project-inventory-cluster"),i=r?.querySelector(":scope > .project-inventory-details");if(i){i.open=!0;const a=r?.dataset.projectClusterKey;a&&sl.add(a)}return n.open=!0,ol.add(`${t.dataset.projectRepairable}:${e}`),n.scrollIntoView?.({block:"center",behavior:"smooth"}),n.querySelector("summary")?.focus(),!0}async function hB(e){if(fl()){X("Finish the open Space assignment, then try Repair again.","warning");return}const t=Jn,n=Le("projectsSearch")?.value??"",r=Le("projectsStatusFilter")?.value??"",i=Ht,a=await mB(e.projectIdentity);if(Jn!==t||(Le("projectsSearch")?.value??"")!==n||(Le("projectsStatusFilter")?.value??"")!==r||Ht!==i)return;if(fl()){X("Finish the open Space assignment, then try Repair again.","warning");return}if(!a){X("This Project is not visible in the current inventory. Refresh Projects, then try Repair again.","warning");return}const{project:s}=a;if(e.kind==="reassign_project"){if(s.identity_source==="unmapped"||s.session_count===0){X("This Project cannot be reassigned yet because it has no local sessions with stable source evidence.","warning");return}await pS(s);return}if(!fS(s.workspace_identity)){const c=Le("projectsSearch"),l=c?.value??"",d=s.workspace_identity;c&&(c.value=d);const u=Le("projectsStatusFilter"),p=u?.value??"",f="";u&&(u.value=f);const m=Ht;Ht=a.offset;const v=Jn;if(await la(),!fS(s.workspace_identity)){if(Jn!==v||c&&c.value!==d||u&&u.value!==f||Ht!==a.offset)return;c&&(c.value=l),u&&(u.value=p),Ht=m,await la(),X("Project administration could not be opened. Refresh Projects and try again.","warning")}}}function gB(e){const t=Jn,n=(sa?.catch(()=>{})??Promise.resolve()).then(async()=>{if(Jn===t)try{await hB(e)}catch(r){X(r instanceof Error?r.message:"Unable to repair this Project.","warning")}});return sa=n,n.then(()=>{sa===n&&(sa=null)},()=>{sa===n&&(sa=null)}),n}function vB(e){const t=document.createElement("div");if(t.className="project-inventory-actions",pl(e)&&e.memory_count!=null&&e.guardrail_warnings.every(m=>!m.requires_confirmation)){const m=document.createElement("button");m.className="settings-button",m.type="button",m.textContent="Share",m.disabled=!yr,yr||(m.title="The complete project list is unavailable."),m.addEventListener("click",()=>As([e.workspace_identity])),t.appendChild(m)}if(bn(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 i=document.createElement("select");i.id=r,i.className="project-domain-select";const a=Mf().some(m=>m.scope_id===e.resolved_scope_id);if(!a&&e.resolved_scope_id){const m=document.createElement("option");m.value=e.resolved_scope_id,m.textContent=`${ml(e.resolved_scope_id)} — not assignable`,m.disabled=!0,i.appendChild(m)}dS(i),i.value=lS(cl.get(e.workspace_identity),e.suggested_scope_id,e.resolved_scope_id);const s=document.createElement("button");s.className="settings-button",s.type="button",s.textContent=e.suggested_scope_id&&i.value===e.suggested_scope_id?"Confirm suggestion":"Save Space",s.disabled=!i.value||i.value===e.resolved_scope_id&&!a,s.addEventListener("click",()=>{Ff(e,i.value)}),i.addEventListener("change",()=>{cl.set(e.workspace_identity,i.value),ci.delete(e.workspace_identity),t.querySelector(".project-space-guardrail-confirmation")?.remove(),s.textContent="Save Space",s.disabled=!i.value,bt?.()}),i.addEventListener("blur",cS);const c=document.createElement("button");c.className="settings-button",c.type="button",c.textContent="Keep local-only",c.addEventListener("click",()=>{Ff(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",()=>{fB(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",()=>{pS(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",()=>{uS(e)}),t.append(n,i,s,c,l,d,u);const p=ci.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 b=document.createElement("p");b.textContent="Codemem can save this change after you acknowledge the checks below. Verify the workspace details, then confirm to complete the save.";const h=document.createElement("ul");for(const _ of p.warnings){const R=document.createElement("li"),I=document.createElement("strong");I.textContent=`${uB(_)}: `;const T=document.createElement("span");T.textContent=_.message,R.append(I,T),h.appendChild(R)}const y=document.createElement("button");y.className="settings-button",y.type="button",y.textContent="I understand, save Space",y.addEventListener("click",()=>{const _=ci.get(e.workspace_identity);!_||_.scopeId!==i.value||Ff(e,_.scopeId,_.requiredGuardrailTokens)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{ci.delete(e.workspace_identity),bt?.()}),m.append(v,b,h,y,w),t.appendChild(m)}const f=Lo.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 b=document.createElement("p");b.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 h=document.createElement("p");h.textContent="Use this only to clean up wrongly attributed local project inventory; it forgets actual local memories on this device.";const y=document.createElement("button");y.className="settings-button danger",y.type="button",y.textContent="I understand, forget local memories",y.addEventListener("click",()=>{uS(e,!0)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{Lo.delete(e.workspace_identity),bt?.()}),m.append(v,b,h,y,w),t.appendChild(m)}return t}function mS(e){const t=document.createElement("article");t.className="project-inventory-row",t.dataset.projectWorkspaceIdentity=e.workspace_identity,t.dataset.projectRepairable=String(pl(e));const n=`project-title-${e.workspace_identity.replace(/[^a-z0-9_-]/gi,"-")}`;t.setAttribute("aria-labelledby",n);const r=document.createElement("div");r.className="project-inventory-row-header",Ps(e)&&r.appendChild(iS([e],`Select ${e.display_project} for recipient sharing`));const i=document.createElement("h3");i.className="project-inventory-title",i.id=n,i.textContent=e.display_project,r.appendChild(i),Ps(e)&&r.appendChild(oS([e.workspace_identity],e.display_project)),t.appendChild(r);const a=document.createElement("div");a.className="project-inventory-meta",a.textContent=`${(e.memory_count??0).toLocaleString()} memories · ${e.session_count.toLocaleString()} sessions · ${nS(e.latest_session_at)}`,t.appendChild(a),t.appendChild(aS([e.workspace_identity]));const s=document.createElement("div");s.className="project-advanced-administration";const c=document.createElement("div");c.className="project-inventory-domain",c.textContent=Lf(e),s.appendChild(c);const l=document.createElement("div");if(l.className="project-inventory-meta",l.textContent=`${JF(e)} · ${e.identity_source} · ${nS(e.latest_session_at)}`,s.appendChild(l),e.sharing&&e.sharing.length>0){const h=document.createElement("div");h.className="settings-note project-sharing-summary";const y=document.createElement("strong");y.textContent="Project sharing";const w=document.createElement("ul");w.setAttribute("aria-label",`People sharing ${e.display_project}`);for(const _ of e.sharing){const R=document.createElement("li"),I=document.createElement("strong");I.textContent=YF(_);const T=document.createElement("span");T.textContent=` — ${_.lifecycle.label}. ${_.lifecycle.explanation}`,R.append(I,T),w.appendChild(R)}h.append(y,w),s.appendChild(h)}if(bn(e)){const h=document.createElement("div");h.className="settings-note",h.textContent="Received memories keep the source device's project and Space assignment. Local reassignment controls are disabled here to avoid split-brain sync state.",s.appendChild(h)}const d=document.createElement("div");if(d.className="project-inventory-signal mono",d.textContent=ZF(e),s.appendChild(d),e.suggested_scope_id&&e.suggested_scope_id!==e.resolved_scope_id){const h=document.createElement("div");h.className="settings-note project-suggestion-note",h.textContent=e.suggestion_reason?`Suggestion: ${e.suggestion_reason}`:`Suggestion: assign this project to ${ml(e.suggested_scope_id)}.`,s.appendChild(h)}const u=(e.guardrail_warnings??[]).filter(h=>h.severity==="warning");if(u.length>0){const h=document.createElement("div");h.className="settings-note project-attention-note",h.textContent=`Needs attention: ${u.map(y=>y.message).join(" ")}`,s.appendChild(h)}if(e.statuses.length>0){const h=document.createElement("div");h.className="project-inventory-badges";for(const y of e.statuses){const w=document.createElement("span");w.className=`project-status-badge ${y}`,w.textContent=KF(y),h.appendChild(w)}s.appendChild(h)}const p=document.createElement("details");p.className="project-inventory-details";const f=`${t.dataset.projectRepairable}:${e.workspace_identity}`;p.open=ol.has(f),p.addEventListener("toggle",()=>{p.open?ol.add(f):ol.delete(f)});const m=document.createElement("summary");m.dataset.projectFocusKey=`admin:${t.dataset.projectRepairable}:${e.workspace_identity}`,m.textContent=u.length>0?`Advanced Project administration — ${u.length.toLocaleString()} item${u.length===1?"":"s"} need attention`:"Advanced Project administration",p.appendChild(m),p.appendChild(s);const v=document.createElement("dl");v.className="project-detail-grid";const b=[["Workspace identity",e.workspace_identity],["Project",e.project],["CWD",e.cwd],["Git remote",e.git_remote],["Git branch",e.git_branch],["Current Space",Lf(e)],["Suggested Space",e.suggested_scope_id?ml(e.suggested_scope_id):null],["Advanced: current Space ID",e.resolved_scope_id],["Advanced: suggested Space ID",e.suggested_scope_id],["Suggestion reason",e.suggestion_reason],["Sessions",e.session_count],["Memories",e.memory_count??"count unavailable"]];for(const[h,y]of b){const w=document.createElement("dt");w.textContent=h;const _=document.createElement("dd");_.textContent=y==null||y===""?"—":String(y),v.append(w,_)}return p.appendChild(v),p.appendChild(vB(e)),t.appendChild(p),t}function yB(e){const t=[...new Set(e.map(n=>Lf(n)))];return t.length===1?t[0]:"Mixed Spaces"}function bB(e){if(e.length===1)return mS(e[0]);const t=$f(e[0]),n=e.filter(Ps),r=rS(n),i=document.createElement("article");i.className="project-inventory-row project-inventory-cluster",i.dataset.projectClusterKey=t;const a=jf(e[0]),s=`project-cluster-title-${t.replace(/[^a-z0-9_-]/gi,"-")}`;i.setAttribute("aria-labelledby",s);const c=document.createElement("div");c.className="project-inventory-row-header",n.length>0&&c.appendChild(iS(n,`Select all identities for ${jf(e[0])}`));const l=document.createElement("h3");l.className="project-inventory-title",l.id=s,l.textContent=a,c.appendChild(l),r.length>0&&c.appendChild(oS(r,a)),i.appendChild(c);const d=document.createElement("div");d.className="project-advanced-administration";const u=document.createElement("div");u.className="project-inventory-domain",u.textContent=yB(e),d.appendChild(u);const p=e.reduce((_,R)=>_+(R.memory_count??0),0),f=e.reduce((_,R)=>_+R.session_count,0),m=document.createElement("div");m.className="project-inventory-meta",m.textContent=`${e.length} identities · ${f.toLocaleString()} sessions · ${p.toLocaleString()} memories`,i.appendChild(m),i.appendChild(aS(r));const v=document.createElement("div");v.className="project-inventory-actions";const b=e.filter(pl);if(b.length===0){const _=document.createElement("div");_.className="settings-note",_.textContent=e.every(bn)?"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.",v.appendChild(_),d.appendChild(v)}else{const _=b.map(N=>({project:N,warnings:(N.guardrail_warnings??[]).filter(j=>j.requires_confirmation)})),R=_.some(({warnings:N})=>N.length>0),I=new Set(b.map(N=>N.suggested_scope_id).filter(N=>!!N)),T=new Set(b.map(N=>N.resolved_scope_id)),A=document.createElement("select");A.className="project-domain-select",A.setAttribute("aria-label",`Space for ${jf(e[0])} group`);const L=document.createElement("option");L.value="",L.textContent="Choose Space…",A.appendChild(L),dS(A),A.value=lS(ll.get(t));const F=document.createElement("button");if(F.className="settings-button",F.type="button",F.textContent=`Save Space for ${b.length} identit${b.length===1?"y":"ies"}`,F.disabled=!A.value||R,F.addEventListener("click",()=>{pB(b,A.value)}),A.addEventListener("change",()=>{A.value?ll.set(t,A.value):ll.delete(t),F.disabled=!A.value||R}),A.addEventListener("blur",cS),v.append(A,F),I.size>1||T.size>1||R){const N=document.createElement("div");if(N.className="settings-note project-attention-note",N.textContent=R?"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.",R){const j=document.createElement("ul");for(const{project:x,warnings:U}of _){if(U.length===0)continue;const q=document.createElement("li"),$=document.createElement("strong");$.textContent=`Blocked identity: ${x.workspace_identity}`;const E=document.createElement("span");E.textContent=` — ${U.map(C=>C.message).join(" ")}`,q.append($,E),j.appendChild(q)}N.appendChild(j)}v.appendChild(N)}d.appendChild(v)}const h=document.createElement("details");h.className="project-inventory-details",h.open=sl.has(t),h.addEventListener("toggle",()=>{h.open?sl.add(t):sl.delete(t)});const y=document.createElement("summary"),w=e.reduce((_,R)=>_+(R.guardrail_warnings??[]).filter(I=>I.severity==="warning").length,0);y.textContent=w>0?`Advanced Project administration — ${w.toLocaleString()} item${w===1?"":"s"} need attention`:"Advanced Project administration",h.appendChild(y),h.appendChild(d);for(const _ of e)h.appendChild(mS(_));return i.appendChild(h),i}function _B(e){const t=new Map;for(const n of e){const r=$f(n);t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function hS(e){const t=Le("projectsInventoryList");if(!t)return;t.textContent="";const n=document.createElement("div");n.className="settings-note",n.textContent=e,t.appendChild(n)}function gS(){document.getElementById("projectsInventorySkeleton")?.remove()}function vS(e){const t=Le("projectsInventoryMeta"),n=Le("projectsInventoryList");if(!t||!n)return;const r=document.activeElement instanceof HTMLElement?document.activeElement.dataset.projectFocusKey:void 0;gS(),$o.clear();for(const s of e.projects)WF(s);if(n.textContent="",e.projects.length===0)hS("No projects match those filters.");else for(const s of _B(e.projects))n.appendChild(bB(s));t.textContent=e.total===0?"0 project identities found":`${e.total} project identit${e.total===1?"y":"ies"} found · showing ${e.offset+1}-${Math.min(e.offset+e.projects.length,e.total)}`;const i=Le("projectsPrevPage"),a=Le("projectsNextPage");i&&(i.disabled=e.offset===0),a&&(a.disabled=!e.has_more),li(),r&&[...n.querySelectorAll("[data-project-focus-key]")].find(s=>s.dataset.projectFocusKey===r)?.focus()}function wB(e,t){nB().then(()=>{t===Af&&(fl()||vS(e))})}async function SB(e={}){const t=new Map;let n=0;for(;;){const r=await Sa({limit:250,offset:n,signal:e.signal});for(const i of r.projects)t.set(i.workspace_identity,i);if(!r.has_more)break;n+=r.limit}return[...t.values()]}function CB(e){return Sa({limit:al,offset:Ht,q:Le("projectsSearch")?.value.trim()||void 0,status:Le("projectsStatusFilter")?.value||void 0,signal:e.signal})}function yS(e,t,n){const r=Le("recipientPolicyManagementMount");r&&yv(r,Ns(e),t,{loadError:n,onCommitted:i=>{i.status==="applied"&&Vt.clear(),li(),bt?.()}})}function bS(e,t){const n=t?.candidates??[],r=e.querySelector(":scope > .project-team-setup-entry");r?.querySelector(".project-team-setup-status")?.remove();const i=r?.contains(document.activeElement)&&document.activeElement instanceof HTMLButtonElement?document.activeElement.dataset.teamSetupCandidateRef:void 0;if(n.length===0){r?.remove(),e.hidden=e.querySelector(":scope > .project-recipient-policy-review-content")?.hidden!==!1,i&&Le("projectsSearch")?.focus();return}const a=JSON.stringify(n.map(d=>[d.candidateRef,d.displayName]));if(r?.dataset.teamSetupSignature===a){e.hidden=!1;return}r?.remove(),e.hidden=!1;const s=document.createElement("section");s.className="card project-team-setup-entry",s.dataset.teamSetupSignature=a;const c=document.createElement("h2");c.textContent="Finish setting up this Team";const l=document.createElement("p");l.className="section-meta",l.textContent="Tell Codemem who uses each device before using this Team for Project sharing.",s.append(c,l);for(const d of n){const u=document.createElement("div");u.className="project-inventory-actions";const p=document.createElement("strong");if(p.textContent=d.displayName,u.appendChild(p),xf){const f=document.createElement("button");f.setAttribute("aria-label",`Finish setting up ${d.displayName}`),f.className="settings-button",f.type="button",f.textContent="Finish setting up this Team",f.dataset.teamSetupCandidateRef=d.candidateRef,f.addEventListener("click",()=>xf?.(d.candidateRef)),u.appendChild(f)}s.appendChild(u)}if(e.appendChild(s),i){let d=!1;for(const u of s.querySelectorAll("button"))if(u.dataset.teamSetupCandidateRef===i){u.focus(),d=!0;break}d||Le("projectsSearch")?.focus()}}function _S(e){const t=e.querySelector(":scope > .project-team-setup-entry");if(!t)return;let n=t.querySelector(".project-team-setup-status");n||(n=document.createElement("p"),n.className="section-meta project-team-setup-status",n.setAttribute("role","status"),t.appendChild(n)),n.textContent="Team setup status is temporarily unavailable. The previous Team setup status is being shown.",e.hidden=!1}function RB(e){const t=e.querySelector(":scope > .project-recipient-policy-review-content");if(t)return t;const n=document.createElement("div");return n.className="project-recipient-policy-review-content",e.prepend(n),n}function la(e={}){const t=EB(e);return eS=t,t}async function wS(e,t){return e.signal?.aborted?!1:!e.awaitTeamSetupSummary&&!e.requireTeamSetupSummary?eS??!1:(await t,!1)}function hl(e,t){return!t.signal?.aborted&&e===Af}function gl(e){return e.awaitTeamSetupSummary===!0||e.requireTeamSetupSummary===!0}async function IB(e){if(!gl(e))return!0;const t=await Df(e);return e.signal?.aborted?!1:!e.requireTeamSetupSummary||t.ok}async function kB(e){if(dl=!0,!gl(e))return!0;const t=++Oo,n=await Df(e);if(e.signal?.aborted||t!==Oo)return!1;const r=Le("recipientPolicyReviewMount");return n.ok?(r&&bS(r,n.summary),!0):(r&&_S(r),!e.requireTeamSetupSummary)}function TB(e){return gl(e.options)?e.teamSetupSummaryPromise.then(t=>!hl(e.loadGeneration,e.options)||e.entryLoadGeneration!==Oo?!1:e.requiredLoadSucceeded&&(!e.options.requireTeamSetupSummary||t.ok)):e.requiredLoadSucceeded}async function PB(e,t){return gl(e)&&await t,!1}function NB(e){const t=Le("recipientPolicyReviewMount");if(!t)return;const n=RB(t);"review"in e?UF(n,e.review,{isRepairAvailable:r=>!r.projectIdentity.startsWith("unmapped:"),onRefresh:async()=>{await la()},onRepair:gB}):GF(n,e.error),t.hidden=n.hidden&&!t.querySelector(".project-team-setup-entry")}async function EB(e){const t=Le("projectsInventoryMeta"),n=Le("projectsInventoryList");if(!t||!n)return IB(e);if(fl())return kB(e);dl=!1;const r=++Af;yr=!1,br=!1,li(),t.textContent="Loading project inventory…";let i=null;try{const a=++Oo;i=Df(e);const[s,c,l,d,u]=await Promise.all([CB(e),kI(e),SB(e).then(f=>({ok:!0,projects:f})).catch(()=>({ok:!1,projects:[]})),CI(e).then(f=>({ok:!0,review:f})).catch(f=>({ok:!1,error:f})),ed(e).then(f=>({ok:!0,intent:f})).catch(f=>({ok:!1,error:f}))]);if(!hl(r,e))return wS(e,i);if(Ef=c.scopes,yr=l.ok,br=u.ok,ca=u.ok?u.intent:ul,l.ok){const f=new Set(Ns(l.projects).map(m=>m.canonicalProjectIdentity));for(const m of Vt)f.has(m)||Vt.delete(m)}const p=Le("projectShareFlowMount");return p&&Cv(p,l.projects,{inventoryError:!l.ok}),NB(d),yS(l.projects,ca,!l.ok||!u.ok),vS(s),wB(s,r),i.then(f=>{if(!hl(r,e)||a!==Oo)return;const m=Le("recipientPolicyReviewMount");if(m){if(!f.ok){_S(m);return}bS(m,f.summary)}}),TB({entryLoadGeneration:a,loadGeneration:r,options:e,requiredLoadSucceeded:l.ok&&"review"in d&&u.ok,teamSetupSummaryPromise:i})}catch(a){if(!hl(r,e))return wS(e,i);$o.clear(),yr=!1,br=!1,ca=ul;const s=Le("projectShareFlowMount");return s&&Cv(s,[],{inventoryError:!0}),yS([],ul,!0),li(),gS(),t.textContent="Project inventory failed to load.",hS(a instanceof Error?a.message:"Unable to load project inventory."),PB(e,i)}}function AB(e,t={}){bt=e,xf=t.onOpenTeamSetup,Vt.clear();const n=Le("projectsStatusFilter");if(n&&n.options.length===0)for(const[a,s]of Zw){const c=document.createElement("option");c.value=a,c.textContent=s,n.appendChild(c)}const r=()=>{Jn+=1,Ht=0,bt?.()};Le("projectsSearch")?.addEventListener("input",r),n?.addEventListener("change",r),Le("projectsPrevPage")?.addEventListener("click",()=>{Jn+=1,Ht=Math.max(0,Ht-al),bt?.()}),Le("projectsNextPage")?.addEventListener("click",()=>{Jn+=1,Ht+=al,bt?.()});const i=Le("projectsShareSelected");i&&i.dataset.recipientPolicyBound!=="true"&&(i.dataset.recipientPolicyBound="true",i.addEventListener("click",()=>{Vt.size!==0&&$a({mode:"project-add",projectIds:[...Vt].sort()})})),li()}function Bf(e,t){const n=e.trim();if(!n)return[];const r=JSON.parse(n);if(!Array.isArray(r)||r.some(a=>typeof a!="string"))throw new Error(`${t.label} must be a JSON string array`);if(!t.normalize&&!t.requireNonEmpty)return r;const i=t.normalize?r.map(a=>a.trim()):r;if(t.requireNonEmpty&&i.some(a=>a.trim()===""))throw new Error(`${t.label} cannot contain empty command tokens`);return i}function xB(e){const t=e.trim();if(!t)return{};const n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("observer headers must be a JSON object");const r={};for(const[i,a]of Object.entries(n)){if(typeof i!="string"||!i.trim()||typeof a!="string")throw new Error("observer headers must map string keys to string values");r[i.trim()]=a}return r}var SS="codemem-settings-advanced",CS="gpt-5.1-codex-mini",RS="claude-4.5-haiku",DB=[{value:"observer",label:"Connection"},{value:"queue",label:"Processing"},{value:"sync",label:"Device Sync"}],LB={claudeCommand:"claude_command",codexCommand:"codex_command",observerProvider:"observer_provider",observerModel:"observer_model",observerTierRoutingEnabled:"observer_tier_routing_enabled",observerSimpleModel:"observer_simple_model",observerSimpleTemperature:"observer_simple_temperature",observerReasoningEffort:"observer_reasoning_effort",observerReasoningSummary:"observer_reasoning_summary",observerRichModel:"observer_rich_model",observerRichTemperature:"observer_rich_temperature",observerRichReasoningEffort:"observer_rich_reasoning_effort",observerRichReasoningSummary:"observer_rich_reasoning_summary",observerRichMaxOutputTokens:"observer_rich_max_output_tokens",observerRuntime:"observer_runtime",observerAuthSource:"observer_auth_source",observerAuthFile:"observer_auth_file",observerAuthCommand:"observer_auth_command",observerAuthTimeoutMs:"observer_auth_timeout_ms",observerAuthCacheTtlS:"observer_auth_cache_ttl_s",observerHeaders:"observer_headers",observerMaxChars:"observer_max_chars",packObservationLimit:"pack_observation_limit",packSessionLimit:"pack_session_limit",rawEventsSweeperIntervalS:"raw_events_sweeper_interval_s",syncEnabled:"sync_enabled",syncHost:"sync_host",syncPort:"sync_port",syncInterval:"sync_interval_s",syncMdns:"sync_mdns",syncCoordinatorUrl:"sync_coordinator_url",syncCoordinatorGroup:"sync_coordinator_group",syncCoordinatorTimeout:"sync_coordinator_timeout_s",syncCoordinatorPresenceTtl:"sync_coordinator_presence_ttl_s"},$B=new Set(["claude_command","codex_command","observer_base_url","observer_auth_file","observer_auth_command","observer_headers","sync_coordinator_url"]),jB={claudeCommand:"",codexCommand:"",observerProvider:"",observerModel:"",observerTierRoutingEnabled:!1,observerSimpleModel:"",observerSimpleTemperature:"",observerReasoningEffort:"",observerReasoningSummary:"",observerRichModel:"",observerRichTemperature:"",observerRichReasoningEffort:"",observerRichReasoningSummary:"",observerRichMaxOutputTokens:"",observerRuntime:"api_http",observerAuthSource:"auto",observerAuthFile:"",observerAuthCommand:"",observerAuthTimeoutMs:"",observerAuthCacheTtlS:"",observerHeaders:"",observerMaxChars:"",packObservationLimit:"",packSessionLimit:"",rawEventsSweeperIntervalS:"",syncEnabled:!1,syncHost:"",syncPort:"",syncInterval:"",syncMdns:!1,syncCoordinatorUrl:"",syncCoordinatorGroup:"",syncCoordinatorTimeout:"",syncCoordinatorPresenceTtl:""};function OB(){try{return globalThis.localStorage?.getItem(SS)==="1"}catch{return!1}}function MB(e){try{globalThis.localStorage?.setItem(SS,e?"1":"0")}catch{}}function Yn(e,t){return typeof e=="object"&&e!==null&&Object.hasOwn(e,t)}function Ae(e,t,n){if(Yn(t,n))return t[n];if(Yn(e,n))return e[n]}function $e(e){return e==null?"":String(e)}function vl(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 FB(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function BB(e,t){return e===t?!0:JSON.stringify(e)===JSON.stringify(t)}function ct(e){const t=e.trim();return t===""?"":t}function qB(e,t,n){return n?{model:n,source:"Configured"}:e==="claude_sidecar"?{model:RS,source:"Recommended (local Claude session)"}:e==="codex_sidecar"?{model:CS,source:"Recommended (local Codex session)"}:t==="anthropic"?{model:RS,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:CS,source:"Recommended (direct API)"}}function UB(e,t){const n=e??{};switch(t){case"claude_command":{const r=n.claude_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(a=>{if(typeof a!="string")return;const s=a.trim();s&&i.push(s)}),i}case"codex_command":{const r=n.codex_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(a=>{if(typeof a!="string")return;const s=a.trim();s&&i.push(s)}),i}case"observer_provider":case"observer_model":case"observer_simple_model":case"observer_reasoning_effort":case"observer_reasoning_summary":case"observer_rich_model":case"observer_rich_reasoning_effort":case"observer_rich_reasoning_summary":case"observer_auth_file":case"sync_host":case"sync_coordinator_url":case"sync_coordinator_group":return ct($e(n[t]));case"observer_runtime":return ct($e(n.observer_runtime));case"observer_auth_source":return ct($e(n.observer_auth_source));case"observer_auth_command":{const r=n.observer_auth_command;return Array.isArray(r)?r.filter(i=>typeof i=="string"):[]}case"observer_headers":{const r=n.observer_headers;if(!r||typeof r!="object"||Array.isArray(r))return{};const i={};return Object.entries(r).forEach(([a,s])=>{typeof a=="string"&&a.trim()&&typeof s=="string"&&(i[a.trim()]=s)}),i}case"observer_auth_timeout_ms":case"observer_max_chars":case"observer_simple_temperature":case"observer_rich_temperature":case"observer_rich_max_output_tokens":case"pack_observation_limit":case"pack_session_limit":case"raw_events_sweeper_interval_s":case"sync_port":case"sync_interval_s":{if(!Yn(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(!Yn(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r>0?r:""}case"observer_auth_cache_ttl_s":{if(!Yn(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 vl(n[t]);default:return Yn(n,t)?n[t]:""}}function GB(e,t,n){const r={...e};return Object.keys(n).forEach(i=>{Yn(r,i)&&(r[i]=UB(t,i))}),r}function HB(e){const{values:t,touchedKeys:n,baseline:r}=e,i=e.allowUntouchedParseErrors===!0;let a=[];try{a=Bf(t.claudeCommand,{label:"claude command",normalize:!0,requireNonEmpty:!0})}catch(R){if(!i||n.has("claude_command"))throw R;const I=r.claude_command;a=Array.isArray(I)?I.filter(T=>typeof T=="string").map(T=>T.trim()).filter(T=>T.length>0):[]}let s=[];try{s=Bf(t.codexCommand,{label:"codex command",normalize:!0,requireNonEmpty:!0})}catch(R){if(!i||n.has("codex_command"))throw R;const I=r.codex_command;s=Array.isArray(I)?I.filter(T=>typeof T=="string").map(T=>T.trim()).filter(T=>T.length>0):[]}let c=[];try{c=Bf(t.observerAuthCommand,{label:"observer auth command"})}catch(R){if(!i||n.has("observer_auth_command"))throw R;const I=r.observer_auth_command;c=Array.isArray(I)?I.filter(T=>typeof T=="string"):[]}let l={};try{l=xB(t.observerHeaders)}catch(R){if(!i||n.has("observer_headers"))throw R;const I=r.observer_headers;I&&typeof I=="object"&&!Array.isArray(I)&&Object.entries(I).forEach(([T,A])=>{typeof T=="string"&&T.trim()&&typeof A=="string"&&(l[T]=A)})}const d=t.observerAuthCacheTtlS.trim(),u=t.observerSimpleTemperature.trim(),p=t.observerRichTemperature.trim(),f=t.observerRichMaxOutputTokens.trim(),m=t.rawEventsSweeperIntervalS.trim(),v=d===""?"":Number(d),b=u===""?"":Number(u),h=p===""?"":Number(p),y=f===""?"":Number(f),w=Number(m),_=m===""?"":w;if(d!==""&&!Number.isFinite(v))throw new Error("observer auth cache ttl must be a number");if(u!==""&&(typeof b!="number"||!Number.isFinite(b)||b<0))throw new Error("simple tier temperature must be a non-negative number");if(p!==""&&(typeof h!="number"||!Number.isFinite(h)||h<0))throw new Error("rich tier temperature must be a non-negative number");if(f!==""&&(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(m!==""&&(!Number.isFinite(w)||w<=0))throw new Error("raw-event sweeper interval must be a positive number");return{claude_command:a,codex_command:s,observer_provider:ct(t.observerProvider),observer_model:ct(t.observerModel),observer_tier_routing_enabled:t.observerTierRoutingEnabled,observer_simple_model:ct(t.observerSimpleModel),observer_simple_temperature:b,observer_reasoning_effort:ct(t.observerReasoningEffort),observer_reasoning_summary:ct(t.observerReasoningSummary),observer_rich_model:ct(t.observerRichModel),observer_rich_temperature:h,observer_rich_reasoning_effort:ct(t.observerRichReasoningEffort),observer_rich_reasoning_summary:ct(t.observerRichReasoningSummary),observer_rich_max_output_tokens:y,observer_runtime:ct(t.observerRuntime||"api_http")||"api_http",observer_auth_source:ct(t.observerAuthSource||"auto")||"auto",observer_auth_file:ct(t.observerAuthFile),observer_auth_command:c,observer_auth_timeout_ms:Number(t.observerAuthTimeoutMs||0)||"",observer_auth_cache_ttl_s:v,observer_headers:l,observer_max_chars:Number(t.observerMaxChars||0)||"",pack_observation_limit:Number(t.packObservationLimit||0)||"",pack_session_limit:Number(t.packSessionLimit||0)||"",raw_events_sweeper_interval_s:_,sync_enabled:t.syncEnabled,sync_host:ct(t.syncHost),sync_port:Number(t.syncPort||0)||"",sync_interval_s:Number(t.syncInterval||0)||"",sync_mdns:t.syncMdns,sync_coordinator_url:ct(t.syncCoordinatorUrl),sync_coordinator_group:ct(t.syncCoordinatorGroup),sync_coordinator_timeout_s:Number(t.syncCoordinatorTimeout||0)||"",sync_coordinator_presence_ttl_s:Number(t.syncCoordinatorPresenceTtl||0)||""}}function VB(e){const t=e.config||{},n=e.effective||{},r=Ae(t,n,"observer_headers"),i=r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).filter(([p,f])=>typeof p=="string"&&p.trim()&&typeof f=="string")):{},a=Ae(t,n,"claude_command"),s=Array.isArray(a)?a.filter(p=>typeof p=="string"):[],c=Ae(t,n,"codex_command"),l=Array.isArray(c)?c.filter(p=>typeof p=="string"):[],d=Ae(t,n,"observer_auth_command"),u=Array.isArray(d)?d.filter(p=>typeof p=="string"):[];return{claudeCommand:s.length?JSON.stringify(s,null,2):"",codexCommand:l.length?JSON.stringify(l,null,2):"",observerProvider:$e(Ae(t,n,"observer_provider")),observerModel:$e(Ae(t,n,"observer_model")),observerTierRoutingEnabled:vl(Ae(t,n,"observer_tier_routing_enabled")),observerSimpleModel:$e(Ae(t,n,"observer_simple_model")),observerSimpleTemperature:$e(Ae(t,n,"observer_simple_temperature")),observerReasoningEffort:$e(Ae(t,n,"observer_reasoning_effort")),observerReasoningSummary:$e(Ae(t,n,"observer_reasoning_summary")),observerRichModel:$e(Ae(t,n,"observer_rich_model")),observerRichTemperature:$e(Ae(t,n,"observer_rich_temperature")),observerRichReasoningEffort:$e(Ae(t,n,"observer_rich_reasoning_effort")),observerRichReasoningSummary:$e(Ae(t,n,"observer_rich_reasoning_summary")),observerRichMaxOutputTokens:$e(Ae(t,n,"observer_rich_max_output_tokens")),observerRuntime:$e(Ae(t,n,"observer_runtime"))||"api_http",observerAuthSource:$e(Ae(t,n,"observer_auth_source"))||"auto",observerAuthFile:$e(Ae(t,n,"observer_auth_file")),observerAuthCommand:u.length?JSON.stringify(u,null,2):"",observerAuthTimeoutMs:$e(Ae(t,n,"observer_auth_timeout_ms")),observerAuthCacheTtlS:$e(Ae(t,n,"observer_auth_cache_ttl_s")),observerHeaders:Object.keys(i).length?JSON.stringify(i,null,2):"",observerMaxChars:$e(Ae(t,n,"observer_max_chars")),packObservationLimit:$e(Ae(t,n,"pack_observation_limit")),packSessionLimit:$e(Ae(t,n,"pack_session_limit")),rawEventsSweeperIntervalS:$e(Ae(t,n,"raw_events_sweeper_interval_s")),syncEnabled:vl(Ae(t,n,"sync_enabled")),syncHost:$e(Ae(t,n,"sync_host")),syncPort:$e(Ae(t,n,"sync_port")),syncInterval:$e(Ae(t,n,"sync_interval_s")),syncMdns:vl(Ae(t,n,"sync_mdns")),syncCoordinatorUrl:$e(Ae(t,n,"sync_coordinator_url")),syncCoordinatorGroup:$e(Ae(t,n,"sync_coordinator_group")),syncCoordinatorTimeout:$e(Ae(t,n,"sync_coordinator_timeout_s")),syncCoordinatorPresenceTtl:$e(Ae(t,n,"sync_coordinator_presence_ttl_s"))}}function KB(e,t){if(e.observerTierRoutingEnabled)return"Tiered routing is enabled: simple/rich model selection now lives in Processing.";const n=qB(e.observerRuntime.trim()||"api_http",e.observerProvider.trim(),ct(e.observerModel));return`${["observer_model","observer_provider","observer_runtime"].some(r=>Yn(t,r))?"Env override":n.source}: ${n.model}`}function zB(e){return e.observerTierRoutingEnabled?"On: codemem routes simpler batches to Luna and richer batches to Terra with medium reasoning by default. Official OpenAI and OAuth Codex consumer requests always use Responses. The observer_openai_use_responses=false compatibility setting selects chat completions only for an explicitly configured custom OpenAI-compatible base URL. Sidecar runtimes route both tiers through their local CLI.":"Off: codemem uses the base observer settings from the Connection tab for all batches. Explicit user settings always win over built-in routing defaults."}function WB(e){return e.observerTierRoutingEnabled?"Base model fallback":"Model"}function JB(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 YB(e){return e.observerTierRoutingEnabled?"Tiered routing is active. Use this only as a fallback while the Processing tab owns simple/rich model selection and explicit tier settings override built-in defaults.":"Default: `gpt-5.4-mini` for Direct API, `gpt-5.1-codex-mini` for Local Codex session, or `claude-4.5-haiku` for Local Claude session."}function XB(e){return!e}function QB(e,t,n){return t.has(e)||n.has(e)}function ZB(e){return`${e} is read-only in the viewer for security. Edit the config file or environment instead.`}var ve={previouslyFocused:null,baseline:{},envOverrides:{},touchedKeys:new Set,shellMounted:!1,protectedKeys:new Set,startPolling:null,refresh:null,hideTooltip:null},_r=qs({open:!1,activeTab:"observer",dirty:!1,renderState:{effectiveText:"",isSaving:!1,observerStatus:null,overridesVisible:!1,pathText:"Config path: n/a",providers:[],statusText:"Ready",values:{...jB}},showAdvanced:OB()});function Bt(){return _r.value}function Fo(e){_r.value={..._r.value,...e}}function eq(){ve.hideTooltip?.()}function di(e){Fo({renderState:{..._r.value.renderState,...e}})}function tq(e){di({values:{..._r.value.renderState.values,...e}})}function nq(e){Fo({activeTab:["observer","queue","sync"].includes(e)?e:"observer"})}function yl(e){Fo({dirty:e})}function bl(e){Fo({open:e})}function rq(e){MB(e),Fo({showAdvanced:e})}function IS(){return Bt().open}function iq(e){return QB(e,ve.protectedKeys,$B)}function kS(e={}){return HB({values:Bt().renderState.values,touchedKeys:ve.touchedKeys,baseline:ve.baseline,allowUntouchedParseErrors:e.allowUntouchedParseErrors})}function aq(e){di({observerStatus:e&&typeof e=="object"?e:null})}function oq(e){if(!e||typeof e!="object")return;const t=e,n=t.defaults||{},r=t.config||{},i=t.env_overrides&&typeof t.env_overrides=="object"?t.env_overrides:{},a=Array.isArray(t.protected_keys)?t.protected_keys.filter(c=>typeof c=="string"&&c.trim().length>0):[],s=VB(t);ve.envOverrides=i,ve.protectedKeys=new Set(a),S.configDefaults=n,S.configPath=t.path||"",di({effectiveText:Object.keys(i).length>0?"Some fields are managed by environment settings.":"",overridesVisible:Object.keys(i).length>0,pathText:S.configPath?`Config path: ${S.configPath}`:"Config path: n/a",providers:FB(t.providers),statusText:"No unsaved changes",values:s}),ve.touchedKeys=new Set;try{const c=kS({allowUntouchedParseErrors:!0});ve.baseline=GB(c,r,i)}catch{ve.baseline={}}yl(!1)}async function sq(e={}){if(!Bt().open)try{const[t,n]=await Promise.all([cR(e),sR(e).catch(()=>null)]);if(e.signal?.aborted)return;oq(t),aq(n)}catch{}}function qf(e){return String(e||"").replace(/_/g," ")}function Uf(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 cq(e){switch(e){case"anthropic_consumer":return"OAuth (Claude Max/Pro)";case"codex_consumer":return"OAuth (ChatGPT subscription)";case"sdk_client":return"API key";case"claude_sidecar":return"Local Claude session";case"codex_sidecar":return"Local Codex session";case"opencode_run":return"OpenCode sidecar";default:return e||"none"}}function lq(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 dq(e){if(typeof e!="string"||!e.trim())return"Unknown time";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function uq({onOpenDiagnostics:e}){return e?o("button",{className:"settings-button",onClick:()=>e({severity:"error",subsystem:"observer"}),type:"button",children:"View observer diagnostics"}):null}function pq({status:e,onOpenDiagnostics:t}){if(!e)return o("div",{id:"observerStatusBanner",className:"observer-status-banner",hidden:!0});const n=e.active,r=e.available_credentials||{},i=e.latest_failure,a=Object.entries(r).filter(([,s])=>s&&typeof s=="object");return o("div",{id:"observerStatusBanner",className:"observer-status-banner",children:[n?o(z,{children:[o("div",{className:"status-label",children:"Active observer"}),o("div",{className:"status-active",children:[String(n.provider||"unknown")," → ",String(n.model||"")," via"," ",cq(n.auth?.method||"none")," ",o("span",{"aria-label":n.auth?.token_present===!0?"token present":"token missing",className:n.auth?.token_present===!0?"cred-ok":"cred-none",role:"img",children:o("i",{"aria-hidden":"true","data-lucide":n.auth?.token_present===!0?"check":"x"})})]})]}):o(z,{children:[o("div",{className:"status-label",children:"Observer status"}),o("div",{className:"status-active",children:"Not yet initialized (waiting for first session)"})]}),a.length?o(z,{children:[o("div",{className:"status-label",children:"Available credentials"}),o("div",{children:a.map(([s,c],l)=>{const d=c,u=Object.values(d).some(Boolean);return o("span",{className:"status-cred",children:[l>0?" · ":null,o("span",{"aria-label":u?"credential available":"no credential",className:u?"cred-ok":"cred-none",role:"img",children:u?o("i",{"aria-hidden":"true","data-lucide":"check"}):"–"})," ",String(s),": ",lq(d)]},s)})})]}):null,i&&typeof i=="object"?o(z,{children:[o("div",{className:"status-label",children:"Latest processing issue"}),o("div",{className:"status-issue",children:[o("div",{className:"status-issue-message",children:typeof i.error_message=="string"&&i.error_message.trim()?i.error_message.trim():"Raw-event processing failed."}),o("div",{className:"status-issue-meta",children:[[typeof i.observer_provider=="string"?i.observer_provider.trim():"",typeof i.observer_model=="string"&&i.observer_model.trim()?`→ ${i.observer_model.trim()}`:"",typeof i.observer_runtime=="string"&&i.observer_runtime.trim()?`(${i.observer_runtime.trim()})`:""].filter(Boolean).join(" ").replace(/\s+/g," ").trim(),`Last failure ${dq(i.updated_at)}`,typeof i.attempt_count=="number"&&Number.isFinite(i.attempt_count)?`Attempts ${i.attempt_count}`:""].filter(Boolean).join(" · ")}),typeof i.impact=="string"&&i.impact.trim()?o("div",{className:"status-issue-impact",children:i.impact.trim()}):null,o(uq,{onOpenDiagnostics:t})]})]}):null]})}function TS(e,t){const n=t.getBoundingClientRect(),r=8,i=8,a=e.offsetWidth,s=e.offsetHeight;let c=n.left+n.width/2-a/2;c=Math.max(r,Math.min(c,globalThis.innerWidth-a-r));let l=n.bottom+i;l+s>globalThis.innerHeight-r&&(l=n.top-s-i),l=Math.max(r,l),e.style.left=`${Math.round(c)}px`,e.style.top=`${Math.round(l)}px`}function Bo(e){return e instanceof Element?e.closest(".help-icon[data-tooltip]"):null}function fq(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 mq(){const e=Qe("settingsModal");(fq(e)[0]||e)?.focus()}function hq(){const[e,t]=D({anchor:null,content:"",visible:!1}),n=B(null);return V(()=>{const r=u=>{const p=u.dataset.tooltip?.trim();p&&t({anchor:u,content:p,visible:!0})},i=()=>{t(u=>!u.visible&&!u.anchor&&!u.content?u:{anchor:null,content:"",visible:!1})},a=u=>{const p=Bo(u.target);p&&r(p)},s=u=>{const p=Bo(u.target);if(!p)return;const f=u.relatedTarget;f instanceof Element&&p.contains(f)||i()},c=u=>{const p=Bo(u.target);p&&r(p)},l=u=>{Bo(u.target)&&i()},d=u=>{const p=Bo(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",a),document.addEventListener("pointerout",s),document.addEventListener("focusin",c),document.addEventListener("focusout",l),document.addEventListener("click",d),()=>{document.removeEventListener("pointerover",a),document.removeEventListener("pointerout",s),document.removeEventListener("focusin",c),document.removeEventListener("focusout",l),document.removeEventListener("click",d)}},[]),Tt(()=>{if(!e.visible||!e.anchor||!n.current)return;const r=requestAnimationFrame(()=>{n.current&&e.anchor&&TS(n.current,e.anchor)});return()=>{cancelAnimationFrame(r)}},[e.anchor,e.content,e.visible]),V(()=>{if(!e.visible||!e.anchor)return;const r=()=>{n.current&&e.anchor&&TS(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:Ie(()=>typeof document>"u"?null:ln(o("div",{className:`help-tooltip${e.visible?" visible":""}`,hidden:!e.visible,ref:n,children:e.content}),document.body),[e.content,e.visible]),setTooltip:t}}function gq({DialogContent:e,onClose:t}){const{open:n}=_r.value,{tooltipPortal:r,setTooltip:i}=hq();V(()=>{const s=()=>i({anchor:null,content:"",visible:!1});return ve.hideTooltip=s,()=>{ve.hideTooltip===s&&(ve.hideTooltip=null)}},[]),V(()=>{n&&globalThis.lucide?.createIcons?.()},[n]);const a=oe(()=>{ve.startPolling&&ve.refresh&&t(ve.startPolling,ve.refresh)},[t]);return o(z,{children:[o(Ln,{ariaDescribedby:"settingsDescription",ariaLabelledby:"settingsTitle",contentClassName:"modal",contentId:"settingsModal",onCloseAutoFocus:s=>{s.preventDefault()},onOpenAutoFocus:s=>{s.preventDefault(),mq()},onOpenChange:s=>{if(s){bl(!0);return}a()},open:n,overlayClassName:"modal-backdrop",overlayId:"settingsBackdrop",children:o(e,{})}),r]})}function ze({children:e,className:t="field",hidden:n=!1,id:r}){return o("div",{className:t,hidden:n,id:r,children:e})}function qo({children:e,hidden:t=!1}){return o("div",{className:"settings-note",hidden:t,children:e})}function Gf({detail:e,title:t}){return o("div",{className:"settings-section-intro",children:[o("div",{className:"settings-section-intro-title",children:t}),o("div",{className:"small settings-section-intro-detail",children:e})]})}function vq({values:e,observerMaxCharsDefault:t,providerOptions:n,showAuthFile:r,showAuthCommand:i,hiddenUnlessAdvanced:a,onTextInput:s,onSelectValueChange:c,getObserverModelLabel:l,getObserverModelTooltip:d,getObserverModelDescription:u,getObserverModelHint:p,protectedConfigHelp:f,observerStatusBannerSlot:m}){return o(z,{children:[o(Gf,{detail:"Set how codemem reaches your model provider and where it should look for credentials.",title:"Connection and credentials"}),m,o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Connection"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerProvider",children:"Model provider"}),o("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:"?"})]}),o(dr,{ariaLabel:"Model provider",contentClassName:"settings-select-content",id:"observerProvider",itemClassName:"settings-select-item",onValueChange:c("observerProvider"),options:[{label:"auto (default)",value:""},...n],placeholder:"auto (default)",triggerClassName:"settings-select-trigger",value:e.observerProvider,viewportClassName:"settings-select-viewport"}),o("div",{className:"small",children:"Use `auto` unless you need to pin a specific provider."})]}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerModel",children:l()}),o("button",{"aria-label":"About model defaults",className:"help-icon","data-tooltip":d(),type:"button",children:"?"})]}),o(ke,{id:"observerModel",onInput:s("observerModel"),placeholder:"leave empty for default",value:e.observerModel}),o("div",{className:"small",children:u()}),o("div",{className:"small",id:"observerModelHint",children:p()})]}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerRuntime",children:"Connection mode"}),o("button",{"aria-label":"About connection mode",className:"help-icon","data-tooltip":"Direct API uses provider credentials. Local sessions use the selected Claude or Codex CLI login.",type:"button",children:"?"})]}),o(dr,{ariaLabel:"Connection mode",contentClassName:"settings-select-content",id:"observerRuntime",itemClassName:"settings-select-item",onValueChange:c("observerRuntime"),options:[{label:"Direct API (default)",value:"api_http"},{label:"Local Claude session",value:"claude_sidecar"},{label:"Local Codex session",value:"codex_sidecar"}],triggerClassName:"settings-select-trigger",value:e.observerRuntime,viewportClassName:"settings-select-viewport"}),o("div",{className:"small",children:"Switch between provider API credentials and local Claude or Codex CLI auth."})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"codexCommand",children:"Codex command (JSON argv)"}),o(Qi,{disabled:!0,id:"codexCommand",placeholder:'["codex"]',rows:2,value:e.codexCommand}),o("div",{className:"small",children:f("codex_command")})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"claudeCommand",children:"Claude command (JSON argv)"}),o(Qi,{disabled:!0,id:"claudeCommand",placeholder:'["claude"]',rows:2,value:e.claudeCommand}),o("div",{className:"small",children:f("claude_command")})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"observerMaxChars",children:"Request size limit (chars)"}),o(ke,{id:"observerMaxChars",min:"1",onInput:s("observerMaxChars"),type:"number",value:e.observerMaxChars}),o("div",{className:"small",id:"observerMaxCharsHint",children:t?`Default: ${t}`:""})]})]}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Authentication"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerAuthSource",children:"Authentication method"}),o("button",{"aria-label":"About authentication method",className:"help-icon","data-tooltip":"Choose how credentials are resolved: environment, file, command, or none.",type:"button",children:"?"})]}),o(dr,{ariaLabel:"Authentication method",contentClassName:"settings-select-content",id:"observerAuthSource",itemClassName:"settings-select-item",onValueChange:c("observerAuthSource"),options:[{label:"auto (default)",value:"auto"},{label:"env",value:"env"},{label:"file",value:"file"},{label:"command",value:"command"},{label:"none",value:"none"}],triggerClassName:"settings-select-trigger",value:e.observerAuthSource,viewportClassName:"settings-select-viewport"}),o("div",{className:"small",children:"Use `auto` unless you need to force a file or command-based token source."})]}),o(ze,{hidden:!r,id:"observerAuthFileField",children:[o("label",{htmlFor:"observerAuthFile",children:"Token file path"}),o(ke,{disabled:!0,id:"observerAuthFile",placeholder:"~/.codemem/work-token.txt",value:e.observerAuthFile}),o("div",{className:"small",children:f("observer_auth_file")})]}),o(ze,{hidden:!i,id:"observerAuthCommandField",children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerAuthCommand",children:"Token command"}),o("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:"?"})]}),o(Qi,{disabled:!0,id:"observerAuthCommand",placeholder:'["iap-auth", "--audience", "gateway"]',rows:3,value:e.observerAuthCommand}),o("div",{className:"small",children:f("observer_auth_command")})]}),o("div",{className:"small",hidden:!i,id:"observerAuthCommandNote",children:'Command format: JSON string array, e.g. `["iap-auth", "--audience", "gateway"]`.'}),o(qo,{hidden:a(),children:"These advanced credential overrides only matter when you need custom command timing, cached tokens, or extra request headers."}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"observerAuthTimeoutMs",children:"Token command timeout (ms)"}),o(ke,{id:"observerAuthTimeoutMs",min:"1",onInput:s("observerAuthTimeoutMs"),type:"number",value:e.observerAuthTimeoutMs})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"observerAuthCacheTtlS",children:"Token cache time (s)"}),o(ke,{id:"observerAuthCacheTtlS",min:"0",onInput:s("observerAuthCacheTtlS"),type:"number",value:e.observerAuthCacheTtlS})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerHeaders",children:"Request headers (JSON)"}),o("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:"?"})]}),o(Qi,{disabled:!0,id:"observerHeaders",placeholder:'{"Authorization":"Bearer ${auth.token}"}',rows:4,value:e.observerHeaders}),o("div",{className:"small",children:f("observer_headers")})]})]})]})}function _l({checked:e,className:t,disabled:n=!1,hidden:r=!1,id:i,label:a,onCheckedChange:s}){const c=`${i}Label`;return o("div",{className:t?`field-checkbox settings-switch-row ${t}`:"field-checkbox settings-switch-row",hidden:r,children:[o("label",{className:"settings-switch-copy",htmlFor:i,id:c,children:a}),o(Ji,{"aria-labelledby":c,checked:e,className:"settings-switch",disabled:n,id:i,onCheckedChange:s,thumbClassName:"settings-switch-thumb"})]})}function yq({values:e,showTieredRouting:t,hiddenUnlessAdvanced:n,onTextInput:r,onSwitchInput:i,getTieredRoutingHelperText:a}){return o(z,{children:[o(Gf,{detail:"Control how often codemem processes queued work and, if needed, how it routes lighter vs richer model requests.",title:"Processing and routing"}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Processing"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"rawEventsSweeperIntervalS",children:"Background processing interval (seconds)"}),o("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:"?"})]}),o(ke,{id:"rawEventsSweeperIntervalS",min:"1",onInput:r("rawEventsSweeperIntervalS"),type:"number",value:e.rawEventsSweeperIntervalS}),o("div",{className:"small",children:"How often codemem checks for queued raw events in the background."})]})]}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Tiered observer routing"}),o(_l,{checked:e.observerTierRoutingEnabled,className:"field",id:"observerTierRoutingEnabled",label:"Enable tiered routing",onCheckedChange:i("observerTierRoutingEnabled")}),o("div",{className:"small",children:a()}),o(qo,{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."}),o("div",{hidden:!t,children:[o("h4",{children:"Simple tier"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerSimpleModel",children:"Model"}),o("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:"?"})]}),o(ke,{id:"observerSimpleModel",onInput:r("observerSimpleModel"),placeholder:"leave empty for default",value:e.observerSimpleModel}),o("div",{className:"small",children:"Used when a batch falls below rich-routing thresholds."})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerSimpleTemperature",children:"Temperature"}),o(ke,{id:"observerSimpleTemperature",min:"0",onInput:r("observerSimpleTemperature"),step:"0.1",type:"number",value:e.observerSimpleTemperature})]})]}),o("div",{className:"settings-advanced",hidden:!t||n(),children:[o("h4",{children:"Shared reasoning defaults"}),o("div",{className:"small",children:"Applied to OpenAI Responses requests in both tiers unless a rich-tier override is set."}),o(ze,{className:"field settings-advanced",children:[o("label",{htmlFor:"observerReasoningEffort",children:"Reasoning effort"}),o(ke,{id:"observerReasoningEffort",onInput:r("observerReasoningEffort"),placeholder:"leave empty for provider default",value:e.observerReasoningEffort})]}),o(ze,{className:"field settings-advanced",children:[o("label",{htmlFor:"observerReasoningSummary",children:"Reasoning summary"}),o(ke,{id:"observerReasoningSummary",onInput:r("observerReasoningSummary"),placeholder:"leave empty for provider default",value:e.observerReasoningSummary})]})]}),o("div",{hidden:!t,children:[o("h4",{children:"Rich tier"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerRichModel",children:"Model"}),o("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:"?"})]}),o(ke,{id:"observerRichModel",onInput:r("observerRichModel"),placeholder:"leave empty for default",value:e.observerRichModel}),o("div",{className:"small",children:"Used when routing detects a richer replay batch."})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichTemperature",children:"Temperature"}),o(ke,{id:"observerRichTemperature",min:"0",onInput:r("observerRichTemperature"),step:"0.1",type:"number",value:e.observerRichTemperature})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichReasoningEffort",children:"Reasoning effort override"}),o(ke,{id:"observerRichReasoningEffort",onInput:r("observerRichReasoningEffort"),placeholder:"inherits shared reasoning effort",value:e.observerRichReasoningEffort})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichReasoningSummary",children:"Reasoning summary override"}),o(ke,{id:"observerRichReasoningSummary",onInput:r("observerRichReasoningSummary"),placeholder:"inherits shared reasoning summary",value:e.observerRichReasoningSummary})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichMaxOutputTokens",children:"Max output tokens"}),o(ke,{id:"observerRichMaxOutputTokens",min:"1",onInput:r("observerRichMaxOutputTokens"),step:"1",type:"number",value:e.observerRichMaxOutputTokens})]})]})]}),o("div",{className:"settings-group settings-advanced",hidden:n(),children:[o("h3",{className:"settings-group-title",children:"Pack limits"}),o(qo,{hidden:n(),children:"Most users can keep these defaults. Change them only when you need smaller or larger default context packs."}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"packObservationLimit",children:"Observation limit"}),o(ke,{id:"packObservationLimit",min:"1",onInput:r("packObservationLimit"),type:"number",value:e.packObservationLimit}),o("div",{className:"small",children:"Default number of observations to include in a pack."})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"packSessionLimit",children:"Session summary limit"}),o(ke,{id:"packSessionLimit",min:"1",onInput:r("packSessionLimit"),type:"number",value:e.packSessionLimit}),o("div",{className:"small",children:"Default number of session summaries to include in a pack."})]})]})]})}function bq({values:e,hiddenUnlessAdvanced:t,onTextInput:n,onSwitchInput:r,protectedConfigHelp:i}){return o(z,{children:[o(Gf,{detail:"Choose whether this device syncs at all, how often it checks peers, and which coordinator group it should join.",title:"Device sync"}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Device Sync"}),o(_l,{checked:e.syncEnabled,className:"field",id:"syncEnabled",label:"Enable sync",onCheckedChange:r("syncEnabled")}),o("div",{className:"field",children:[o("label",{htmlFor:"syncInterval",children:"Sync interval (seconds)"}),o(ke,{id:"syncInterval",min:"10",onInput:n("syncInterval"),type:"number",value:e.syncInterval}),o("div",{className:"small",children:"How often this device checks for sync work when sync is enabled."})]}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncHost",children:"Sync host"}),o(ke,{id:"syncHost",onInput:n("syncHost"),placeholder:"127.0.0.1",value:e.syncHost})]}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncPort",children:"Sync port"}),o(ke,{id:"syncPort",min:"1",onInput:n("syncPort"),type:"number",value:e.syncPort})]}),o(_l,{checked:e.syncMdns,className:"field settings-advanced",hidden:t(),id:"syncMdns",label:"Enable mDNS discovery",onCheckedChange:r("syncMdns")}),o("div",{className:"field",children:[o("label",{htmlFor:"syncCoordinatorUrl",children:"Coordinator URL"}),o(ke,{disabled:!0,id:"syncCoordinatorUrl",placeholder:"https://coord.example.com",value:e.syncCoordinatorUrl}),o("div",{className:"small",children:i("sync_coordinator_url")})]}),o("div",{className:"field",children:[o("label",{htmlFor:"syncCoordinatorGroup",children:"Coordinator group"}),o(ke,{id:"syncCoordinatorGroup",onInput:n("syncCoordinatorGroup"),placeholder:"team-alpha",value:e.syncCoordinatorGroup}),o("div",{className:"small",children:"Discovery namespace for peers using the same coordinator."})]}),o("div",{className:"field settings-advanced",hidden:t(),children:o(qo,{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."})}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncCoordinatorTimeout",children:"Coordinator timeout (seconds)"}),o(ke,{id:"syncCoordinatorTimeout",min:"1",onInput:n("syncCoordinatorTimeout"),type:"number",value:e.syncCoordinatorTimeout})]}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncCoordinatorPresenceTtl",children:"Presence TTL (seconds)"}),o(ke,{id:"syncCoordinatorPresenceTtl",min:"1",onInput:n("syncCoordinatorPresenceTtl"),type:"number",value:e.syncCoordinatorPresenceTtl})]})]})]})}function _q({panelProps:e,activeTab:t,showAdvanced:n,renderState:r,settingsDirty:i,onClose:a,onSave:s,onActiveTabChange:c,onAdvancedToggle:l,observerStatusBannerSlot:d}){const u=!i||r.isSaving;return o("div",{className:"modal-card",onKeyDown:p=>ro(p,{onSubmit:s,disabled:u}),children:[o("div",{className:"modal-header",children:[o("h2",{id:"settingsTitle",children:"Settings"}),o(Lr,{ariaLabel:"Close settings",className:"modal-close-button",onClick:a})]}),o("div",{className:"modal-body",children:[o("div",{className:"small",id:"settingsDescription",children:"Tune how codemem connects, processes work, and syncs with other devices."}),o("div",{className:"settings-advanced-toolbar",children:[o(_l,{checked:n,id:"settingsAdvancedToggle",label:"Show advanced controls",onCheckedChange:l}),o("button",{"aria-label":"About advanced controls",className:"help-icon","data-tooltip":"Advanced controls include JSON fields, tuning values, and network overrides.",type:"button",children:o("i",{"aria-hidden":"true","data-lucide":"help-circle"})})]}),o(qo,{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."}),o(My,{ariaLabel:"Settings sections",listClassName:"settings-tabs",onValueChange:c,tabs:DB,triggerClassName:"settings-tab",value:t,children:[o(Gr,{className:"settings-panel",forceMount:!0,value:"observer",children:o(vq,{...e,observerStatusBannerSlot:d})}),o(Gr,{className:"settings-panel",forceMount:!0,value:"queue",children:o(yq,{...e})}),o(Gr,{className:"settings-panel",forceMount:!0,value:"sync",children:o(bq,{...e})})]}),o("div",{className:"small mono",id:"settingsPath",children:r.pathText}),o("div",{className:"small",id:"settingsEffective",children:r.effectiveText}),o("div",{className:"settings-note",hidden:!r.overridesVisible,id:"settingsOverrides",children:"Some values are controlled outside this screen and take priority."}),o("div",{className:"settings-note",hidden:n,children:"Advanced controls are hidden right now to keep this screen focused on everyday settings."})]}),o("div",{className:"modal-footer",children:[o("div",{className:"small",id:"settingsStatus",children:r.statusText}),o("button",{className:"settings-save","data-primary-action":"true",disabled:u,id:"settingsSave",onClick:s,type:"button",children:r.isSaving?"Saving…":"Save changes"})]})]})}function wq(e){const{current:t,baseline:n,envOverrides:r,touchedKeys:i,isProtected:a}=e,s={};return Object.entries(t).forEach(([c,l])=>{a(c)||Yn(r,c)&&!i.has(c)||BB(l,n[c])||(s[c]=l)}),s}function Sq(e){const t=s=>{const c=LB[s];c&&e.getTouchedKeys().add(c)},n=(s,c)=>{t(s),e.updateFormState({[s]:c}),e.setDirty(!0)};return{markFieldTouched:t,updateField:n,onTextInput:s=>c=>{n(s,c.currentTarget.value)},onSelectValueChange:s=>c=>{n(s,c)},onSwitchInput:s=>c=>{n(s,c)}}}function Cq(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=>qf(String(p))):[],i=Array.isArray(n.live_applied_keys)?n.live_applied_keys.map(p=>qf(String(p))):[],a=Array.isArray(n.restart_required_keys)?n.restart_required_keys.map(p=>qf(String(p))):[],s=Array.isArray(n.warnings)?n.warnings.filter(p=>typeof p=="string"&&p.trim().length>0):[],c=Array.isArray(n.manual_actions)?n.manual_actions:[],l=n.sync&&typeof n.sync=="object"?n.sync:{},d=[];r.length&&d.push(`Applied now: ${Uf(r)}.`),i.length&&d.push(`Live settings updated: ${Uf(i)}.`),l.attempted&&typeof l.message=="string"&&l.message?d.push(`Sync: ${l.message}.`):Array.isArray(l.affected_keys)&&l.affected_keys.length&&typeof l.reason=="string"&&l.reason&&d.push(`Sync: ${l.reason}.`),a.length&&d.push(`Restart required for ${Uf(a)}. Run: codemem serve restart`),s.forEach(p=>{d.push(p)}),c.forEach(p=>{p&&typeof p.command=="string"&&p.command.trim()&&d.push(`If needed: ${p.command}.`)}),d.length||d.push("Saved.");const u=a.length>0||s.length>0||l.ok===!1;return{message:d.join(" "),type:u?"warning":"success"}}var Rq=()=>KB(Bt().renderState.values,ve.envOverrides),Iq=()=>zB(Bt().renderState.values),kq=()=>WB(Bt().renderState.values),Tq=()=>JB(Bt().renderState.values),Pq=()=>YB(Bt().renderState.values),Nq=()=>XB(Bt().showAdvanced),{onTextInput:Eq,onSelectValueChange:Aq,onSwitchInput:xq}=Sq({getTouchedKeys:()=>ve.touchedKeys,getValues:()=>Bt().renderState.values,updateFormState:tq,setDirty:e=>yl(e)});function Dq(){const e=_r.value.renderState.observerStatus;return o(pq,{status:e,onOpenDiagnostics:Lq})}function Lq(e){if(!ve.startPolling||!ve.refresh||(Uo(ve.startPolling,ve.refresh),Bt().open))return;const t=Js("settingsButton");queueMicrotask(()=>Fr({...e,trigger:t}))}function $q(){const e=_r.value,t=e.renderState.values,n=String(S.configDefaults?.observer_max_chars||""),r=t.observerAuthSource==="file",i=t.observerAuthSource==="command",a=t.observerTierRoutingEnabled,s={values:t,observerMaxCharsDefault:n,providerOptions:Array.from(new Set(e.renderState.providers.concat(t.observerProvider?[t.observerProvider]:[]))).sort((c,l)=>c.localeCompare(l)).map(c=>({label:c,value:c})),showAuthFile:r,showAuthCommand:i,showTieredRouting:a,hiddenUnlessAdvanced:Nq,onTextInput:Eq,onSelectValueChange:Aq,onSwitchInput:xq,getObserverModelLabel:kq,getObserverModelTooltip:Tq,getObserverModelDescription:Pq,getObserverModelHint:Rq,getTieredRoutingHelperText:Iq,protectedConfigHelp:ZB};return o(_q,{panelProps:s,activeTab:e.activeTab,showAdvanced:e.showAdvanced,renderState:e.renderState,settingsDirty:e.dirty,onClose:()=>{ve.startPolling&&ve.refresh&&Uo(ve.startPolling,ve.refresh)},onSave:()=>{ve.startPolling&&ve.refresh&&Fq(ve.startPolling,ve.refresh)},onActiveTabChange:nq,onAdvancedToggle:rq,observerStatusBannerSlot:o(Dq,{})})}function jq(){return o(gq,{DialogContent:$q,onClose:Uo})}function Oq(){const e=Qe("settingsDialogMount");e&&Ue(o(jq,{}),e)}function PS(){Qe("settingsDialogMount")&&(ve.shellMounted||(Oq(),ve.shellMounted=!0))}function Mq(e){ve.shellMounted||PS(),bl(!0),ve.previouslyFocused=document.activeElement,e()}function Uo(e,t){if(Bt().dirty&&!globalThis.confirm("Discard unsaved changes?")){bl(!0);return}bl(!1),eq(),(ve.previouslyFocused&&typeof ve.previouslyFocused.focus=="function"?ve.previouslyFocused:Js("settingsButton"))?.focus(),ve.previouslyFocused=null,ve.touchedKeys=new Set,e(),t()}async function Fq(e,t){if(!Bt().renderState.isSaving){di({isSaving:!0,statusText:"Saving changes…"});try{const n=kS({allowUntouchedParseErrors:!0}),r=wq({current:n,baseline:ve.baseline,envOverrides:ve.envOverrides,touchedKeys:ve.touchedKeys,isProtected:iq});if(Object.keys(r).length===0){di({isSaving:!1,statusText:"No unsaved changes"}),yl(!1),Uo(e,t);return}const i=await lR(r),a=Cq(i);di({isSaving:!1,statusText:"Saved changes"}),yl(!1),Uo(e,t),X(a.message,a.type)}catch(n){const r=n instanceof Error?n.message:"unknown error";di({isSaving:!1,statusText:`Save failed: ${r}`})}}}function Bq(e,t,n){ve.startPolling=t,ve.refresh=n,PS(),Js("settingsButton")?.addEventListener("click",()=>Mq(e))}function qq(e){e.dataset.syncRenderRoot="preact"}function Uq(){const e=document.getElementById("tab-sync");e&&(e.dataset.syncRenderBoundary="preact-hybrid")}function mt(e,t){qq(e),Ue(t,e)}function da(e){e.dataset.syncRenderRoot==="preact"&&Ue(null,e)}function Gq(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 Hq(e){return typeof e=="object"&&e!==null}function Vq(e,t){return S.pairingCommandRaw="",{payloadText:e,hintText:t}}function Kq(e){if(!Hq(e))return Vq("Pairing not available","Enable sync and retry.");const t=e,n={...t,addresses:Array.isArray(t.addresses)?t.addresses:[]},r=JSON.stringify(n),i=`echo '${btoa(r)}' | base64 -d | codemem sync pair --accept-file -`;return S.pairingCommandRaw=i,{payloadText:i,hintText:"Copy this command and run it on the other device. Use --include/--exclude to control which projects sync."}}function zq(){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 Wq(){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 Jq(){const e=S.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 Yq(){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 Xq(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 Qq({items:e}){return o(z,{children:e.map((t,n)=>o("div",{class:"stat",children:o("div",{class:"stat-content",children:[o("div",{class:"value",children:t.value}),o("div",{class:"label",children:t.label})]})},`${t.label}-${n}`))})}function Zq({attempts:e,note:t}){return o(z,{children:[t?o("div",{class:"small",children:t}):null,e.map((n,r)=>o("div",{class:"diag-line",children:[o("div",{class:"left",children:[o("div",{children:[n.peerLabel," — ",n.status]}),n.detail?o("div",{class:"small",children:n.detail}):null,n.actionHref&&n.actionLabel?o("a",{class:"small",href:n.actionHref,children:n.actionLabel}):null,n.action?o("button",{className:"settings-button small",onClick:i=>n.action?.(i.currentTarget),type:"button",children:"View sync diagnostics"}):null]}),o("div",{class:"right",children:n.startedAt})]},`${n.startedAt}-${n.peerLabel}-${r}`))]})}function NS({text:e}){return o(z,{children:e})}function eU({title:e,detail:t}){return o("div",{class:"sync-empty-state",children:[o("strong",{children:e}),o("span",{children:t})]})}function tU(e,t){if(!t.length){da(e);return}mt(e,o(Qq,{items:t}))}function nU(e,t,n){if(!t.length){da(e);return}mt(e,o(Zq,{attempts:t,note:n}))}function ui(e,t){mt(e,o(eU,{...t}))}function ES(e,t,n){mt(e,o(NS,{text:n.payloadText})),t&&mt(t,o(NS,{text:n.hintText}))}function AS({open:e,onOpenChange:t,triggerId:n,triggerClassName:r,closedLabel:i,openLabel:a,contentId:s,contentClassName:c,contentHost:l=null,children:d}){const u=B(null),p=B(null),f=B(!1);Tt(()=>{u.current&&(u.current.id=n,u.current.setAttribute("aria-controls",s)),p.current&&(p.current.id=s)},[s,n,e]),V(()=>{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=o(Xa,{forceMount:!0,asChild:!0,children:o("div",{ref:p,id:s,className:c,hidden:!e,children:d})});return o(Ya,{open:e,onOpenChange:t,children:[o(zu,{asChild:!0,children:o("button",{ref:u,type:"button",className:r,id:n,"aria-controls":s,children:e?a:i})}),l?ln(m,l):m]})}function rU({open:e,onOpenChange:t}){return o(AS,{open:e,onOpenChange:t,triggerId:"syncToggleAdmin",triggerClassName:"sync-toggle-admin",closedLabel:"Set up a new team instead…",openLabel:"Hide team setup",contentId:"syncInvitePanel",children:[o("h3",{className:"settings-group-title",style:{marginTop:"12px"},children:"Create a team"}),o("div",{className:"section-meta",children:"Generate an invite to share with teammates."}),o("div",{className:"actor-create-row",children:[o("label",{htmlFor:"syncInviteGroup",className:"sr-only",children:"Team name"}),o(ke,{className:"peer-scope-input",id:"syncInviteGroup",placeholder:"Team name (e.g. my-team)",type:"text"}),o("label",{htmlFor:"syncInvitePolicy",className:"sr-only",children:"Join policy"}),o("div",{className:"sync-radix-select-host sync-actor-select-host",id:"syncInvitePolicyMount"}),o("div",{className:"sync-ttl-group",children:[o("label",{htmlFor:"syncInviteTtl",children:"Expires in"}),o(ke,{className:"peer-scope-input",defaultValue:"24",id:"syncInviteTtl",min:"1",style:{width:"64px"},type:"number"}),o("span",{children:"hours"})]}),o("button",{className:"settings-button",id:"syncCreateInviteButton",type:"button",children:"Create invite"})]}),o("label",{htmlFor:"syncInviteOutput",className:"sr-only",children:"Generated invite"}),o(Qi,{className:"feed-search",id:"syncInviteOutput",placeholder:"Invite will appear here",readOnly:!0,hidden:!0}),o("div",{className:"peer-meta",id:"syncInviteAdminHint"}),o("div",{className:"peer-meta",id:"syncInviteWarnings",hidden:!0})]})}function iU({contentHost:e,open:t,onOpenChange:n}){return o(AS,{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:[o("div",{className:"peer-title",children:[o("strong",{children:"Pairing command"}),o("div",{className:"peer-actions",children:o("button",{className:"settings-button",id:"pairingCopy",type:"button",children:"Copy command"})})]}),o("div",{className:"pairing-body",children:o("pre",{id:"pairingPayload",style:{userSelect:"all"}})}),o("div",{className:"peer-meta",id:"pairingHint"})]})}function aU(e,t){mt(e,o(rU,{...t}))}function oU(e,t){mt(e,o(iU,{...t}))}function ue(e){return String(e??"").trim()}function sU(e){return ue(e).replace(/\s+/g," ").toLowerCase()}function cU(e){const t=ue(e);return t?t.slice(0,8):"Unnamed device"}function xS(e){return ue(e?.last_error).toLowerCase()}function DS(e){return e.includes("401")&&e.includes("unauthorized")}function LS(e){return["timeout","connection refused","unreachable","aborted","all addresses failed"].some(t=>e.includes(t))}var lU={scope_filter:"sharing-domain membership",visibility_filter:"visibility",project_filter:"project filter"};function $S(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 dU(e){const t=$S(e);return!ue(e.device?.device_id)||e.device?.stale||e.hasAmbiguousCoordinatorGroup?!1:e.pairedLocally?t.state==="needs-your-approval":!0}function jS(e){const t=Array.isArray(e?.items)?e.items:[];if(!t.length)return{ok:!0,message:"Sync pass completed with no eligible devices.",warning:!1};const n=t.filter(i=>i&&i.ok===!1),r=t.filter(i=>Math.max(0,Number(i.opsSkipped??0))>0);if(!n.length){if(r.length){const i=r.reduce((s,c)=>s+Math.max(0,Number(c.opsSkipped??0)),0),a=mU(r.map(s=>s.skipped_out??null));return{ok:!0,message:`${i.toLocaleString()} outbound op${i===1?" was":"s were"} filtered: ${a}. No payload was sent for filtered data.`,warning:!0}}return{ok:!0,message:`Sync pass finished for ${t.length} device${t.length===1?"":"s"}.`,warning:!1}}return n.filter(i=>OS(i)==="trust").length===n.length?{ok:!1,message:"This device no longer has two-way trust with the peer. Pair it again from the other device, or remove the stale local record if it should be gone.",warning:!0}:n.filter(i=>OS(i)==="scope").length===n.length?{ok:!1,message:"Sync ran, but the peer is not authorized for one or more Spaces. Review legacy Space access for this device in Coordinator Administration, 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:ue(n[0]?.error)||"Sync failed for at least one device.",warning:!0}}function OS(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=ue(e.error);return uU(n)?"trust":pU(n)?"scope":null}function uU(e){const t=e.toLowerCase();return t.includes("401")&&t.includes("unauthorized")}function pU(e){const t=e.toLowerCase();return!!(t.includes("scope_rejected")||t.includes("missing_scope")||t.includes("stale_epoch")||t.includes("scope_inactive"))}function fU(e){const t=ue(e?.reason);return lU[t]??(t.replaceAll("_"," ")||"sync filters")}function mU(e){const t=new Map;for(const n of e){const r=fU(n),i=Math.max(0,Number(n?.skipped_count??0));i!==0&&t.set(r,(t.get(r)??0)+i)}return t.size?Array.from(t.entries()).sort((n,r)=>r[1]-n[1]||n[0].localeCompare(r[0])).map(([n,r])=>`${r.toLocaleString()} by ${n}`).join(", "):"sync filters"}function MS(e){const t=ue(e.localName);if(t)return t;const n=ue(e.coordinatorName);return n||cU(ue(e.deviceId))}function hU(e){const t=ue(e.localName),n=ue(e.coordinatorName);return t||n?!1:!!ue(e.deviceId)}function gU(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 Go(e){const t=ue(e?.status?.peer_state);if(t==="offline"||t==="stale")return"offline";const n=xS(e);return DS(n)?"needs-repair":LS(n)?"offline":e?.has_error||t==="degraded"?"needs-repair":t==="online"||e?.status?.fresh?"connected":"waiting"}function ua(e){const t=e?.status||{},n=ue(t.peer_state),r=xS(e),i=ue(t.sync_status)==="ok"||ue(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}:DS(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}:LS(r)?{state:"offline",badgeLabel:"Offline",description:"This device is saved here, but none of its last known addresses are responding right now.",isWarning:!0}:i||n==="online"?{state:"mutual-trust",badgeLabel:"Two-way trust",description:"Both devices trust each other and sync can run in both directions.",isWarning:!1}:e?.has_error||n==="degraded"?{state:"needs-review",badgeLabel:"Needs review",description:"This device has a sync problem that needs review before you trust the current state again.",isWarning:!0}:{state:"trusted-by-you",badgeLabel:"Waiting on other device",description:"This device is already trusted here. Finish setup on the other device before sync can run both ways.",isWarning:!1}}var vU={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 yU(e){const t=e?.scope_rejections,n=Math.max(0,Number(t?.total??0));if(!t||n===0)return{total:0,badgeLabel:null,reasons:[],lastAt:null};const r=[];for(const[i,a]of Object.entries(t.by_reason??{})){const s=Math.max(0,Number(a??0));if(s===0)continue;const c=i;r.push({reason:c,label:vU[c]??i,count:s})}return r.sort((i,a)=>a.count-i.count||i.label.localeCompare(a.label)),{total:n,badgeLabel:n===1?"1 sync rejection":`${n.toLocaleString()} sync rejections`,reasons:r,lastAt:t.last_at??null}}function FS(e){return Array.isArray(e)?e.map(t=>ue(t)).filter(t=>!!t):[]}function BS(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 wl(e,t){return e?e.replaceAll("_"," "):t}function bU(e){const t=(Array.isArray(e.authorized_scopes)?e.authorized_scopes:[]).map(r=>{const i=ue(r.scope_id),a=ue(r.label);if(!i&&!a)return null;const s=a||"Untitled Space",c=[wl(ue(r.kind),"user"),wl(ue(r.authority_type),"local"),`${wl(ue(r.role),"member")} role`].filter(Boolean).join(" · ");return{scopeId:i||s,label:s,detail:c}}).filter(r=>r!=null),n=t.length;return{total:n,badgeLabel:n===1?"1 Space":n>1?`${n} Spaces`:"No Space access",isWarning:n===0,domains:t,emptyMessage:"No Space access grants exist for this device yet. Advanced project filters cannot send data by themselves."}}function qS(e){const t=(Array.isArray(e.per_scope_sync)?e.per_scope_sync:[]).map(n=>{const r=ue(n.scope_id),i=ue(n.label);if(!r&&!i)return null;const a=i||"Untitled Space",s=ue(n.last_applied_cursor),c=ue(n.last_acked_cursor),l=n.bootstrapped===!0||s?"received":"pending",d=wl(ue(n.authority_type),"local"),u=Number(n.membership_epoch??0),p=[`Scope id: ${r||"unknown"}`,`${d} authority`,Number.isFinite(u)?`membership epoch ${u}`:null,s?`last applied ${s}`:null,c?`last acknowledged ${c}`:null].filter(f=>!!f).join(" · ");return{scopeId:r||a,label:a,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 _U=["personal","private","home","mine","me"],wU=["oss","open source","opensource","community","public"],SU=["work","client"],CU=["local","legacy","review"];function RU(e){return[e.scope_id,e.label,e.kind,e.authority_type].map(t=>ue(t)??"").join(" ").toLowerCase()}function IU(e){return[e.scope_id,e.label,e.kind].map(t=>ue(t)??"").join(" ").toLowerCase()}function US(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Hf(e,t){const n=RU(e);return t.some(r=>{const i=US(r.toLowerCase());return new RegExp(`(^|[^a-z0-9])${i}([^a-z0-9]|$)`).test(n)})}function GS(e){return Hf(e,_U)||Hf(e,wU)}function kU(e){const t=IU(e);return CU.some(n=>{const r=US(n.toLowerCase());return new RegExp(`(^|[^a-z0-9])${r}([^a-z0-9]|$)`).test(t)})}function TU(e){return!GS(e)&&(!kU(e)||Hf(e,SU))}function PU(e){const t=Array.isArray(e.authorized_scopes)?e.authorized_scopes:[];if(!(ue(e.discovered_via_group_id)||ue(e.discovered_via_coordinator_id))||t.length===0)return{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""};const n=t.some(GS),r=t.some(TU);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 NU(e,t){const n=e.map(r=>r.trim()).filter(Boolean);return n.length>0&&!n.includes("*")||t.length>0}function EU(e){const t=FS(e?.effective_include),n=FS(e?.effective_exclude),r=e?.inherits_global?"Global defaults":"Device override",i=`Include filter: ${BS(t,"all projects")}`,a=`Exclude filter: ${BS(n,"no exclusions")}`,s=NU(t,n);return{hasAdvancedFilters:s,statusLabel:s?"Advanced filters active":"No advanced filters",sourceLabel:r,includeLabel:i,excludeLabel:a,summary:`${r}. ${i}; ${a}.`,note:"Advanced filters only narrow data after Space access; they never grant access to another Space."}}function AU(e){const t=new Map;return(Array.isArray(e)?e:[]).forEach(n=>{const r=ue(n?.display_name),i=ue(n?.actor_id),a=sU(r);if(!r||!i||!a)return;const s=t.get(a)??{displayName:r,actorIds:[],includesLocal:!1};s.actorIds=[...s.actorIds,i],s.includesLocal=s.includesLocal||!!n?.is_local,t.set(a,s)}),[...t.values()].filter(n=>n.actorIds.length>1).sort((n,r)=>n.displayName.localeCompare(r.displayName))}function HS(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.duplicatePeople)?e.duplicatePeople:[],i=new Map;n.forEach(s=>{const c=ue(s?.actor_id);c&&i.set(c,(i.get(c)??0)+1)});const a=new Set;return r.forEach(s=>{s.includesLocal&&s.actorIds.forEach(c=>{const l=t.find(d=>ue(d?.actor_id)===c);!l||l.is_local||(i.get(c)??0)>0||a.add(c)})}),{visibleActors:t.filter(s=>!a.has(ue(s?.actor_id))),hiddenLocalDuplicateCount:a.size}}var xU=new Set(["pending_setup","waiting_for_acceptance","provisioning","initial_sync","waiting_for_device","revoking"]),DU=new Set(["pending","verifying","waiting"]);function LU(e){return(Array.isArray(e?.groups)?e.groups.map(t=>ue(t)).filter(Boolean):[]).join(", ")||"none"}function $U(e){return ue(e?.projects?.[0]?.display_name)||"the shared Project"}function jU(e,t){return t?.discovered_devices?.some(n=>n.needs_local_approval||n.waiting_for_peer_approval)?!0:e.some(n=>{const r=ua(n).state;return r==="trusted-by-you"||r==="needs-repairing"})}function OU(e,t){return t?.enabled!==!0||t.daemon_state!=="ok"||t.daemon_running===!1?!1:e.some(n=>n.status?.sync_status==="ok"&&ua(n).state==="mutual-trust"&&!qS(n).rows.some(r=>r.status==="pending"))}function MU(e){return e.some(t=>ue(t.status?.peer_state)==="online"&&ua(t).state==="mutual-trust")}function FU(e,t){return t?.daemon_state==="offline-peers"||t?.daemon_state==="stale"||t?.daemon_state==="degraded"?!0:e.some(n=>{const r=ue(n.status?.peer_state),i=ua(n).state;return n.has_error===!0&&i!=="needs-repairing"||i==="offline"||i==="needs-review"||r==="offline"||r==="stale"||r==="degraded"})}function BU(e){if(e?.daemon_running===!1)return!0;const t=e?.daemon_state;return t!==void 0&&t!=="ok"&&t!=="offline-peers"&&t!=="stale"&&t!=="degraded"}function VS(e){const t=e.coordinator,n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.shareOperations)?e.shareOperations:[],i=Array.isArray(e.reconciliation?.items)?e.reconciliation.items:[],a=LU(t);if(e.status?.enabled===!1||t?.sync_enabled===!1)return{state:"disabled",badgeLabel:"Sync off",meta:`Team: ${a}. Coordinator presence does not move Project data while sync is off.`,nextAction:"Open Settings and turn on sync before expecting Team or Project data to update."};if(e.shareOperationsLoadError)return{state:"needs-attention",badgeLabel:"Refresh needed",meta:`Team: ${a}. Device diagnostics are available, but Project sharing status could not be refreshed.`,nextAction:"Refresh Team sync to retry loading Project sharing status."};const s=r.find(p=>p.lifecycle?.state==="needs_attention"),c=i.find(p=>p.state==="needs_attention");if(s)return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${a}. A Project access update stopped and needs a retry.`,nextAction:"Retry the stopped Project access update below."};if(c)return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${a}. Team access needs review before it can continue.`,nextAction:"Open Sharing, review Project access, then sync again."};const l=r.find(p=>{const f=p.lifecycle?.state;return f!==void 0&&xU.has(f)}),d=i.find(p=>{const f=p.state;return f!==void 0&&DU.has(f)});if(l||d){const p=l?$U(l):"the shared Project",f=l?.lifecycle?.primary_action?.kind,m=l?.lifecycle?.state==="revoking";return{state:"pending-setup",badgeLabel:m?"Removal pending":"Setup pending",meta:m?`Team: ${a}. Future access removal for ${p} is still pending.`:`Team: ${a}. Exact-Project setup is still pending and data delivery is not confirmed.`,nextAction:m?`Keep both devices online, then sync again to finish removing future access for ${p}.`:f==="retry_setup"?`Open Project sharing below and retry setup for ${p}.`:f==="copy_invite"?`Copy the invitation for ${p} and send it to the recipient.`:`Keep both devices online, then sync again to finish setup for ${p}.`}}if(BU(e.status))return{state:"needs-attention",badgeLabel:"Sync needs attention",meta:`Team: ${a}. The local sync service is not healthy, so Project data delivery is not confirmed.`,nextAction:"Review the sync status below, restart codemem if needed, then run Sync now again."};if(jU(n,t))return{state:"trust-blocked",badgeLabel:"Pairing needed",meta:`Team: ${a}. A device still needs two-way trust before Project data can sync.`,nextAction:"Review the device below and finish pairing or approval on both devices."};const u=ue(t?.presence_status);return u==="not_enrolled"?{state:"not-enrolled",badgeLabel:"Not enrolled",meta:`Team: ${a}. This device is not enrolled with the coordinator.`,nextAction:"Paste a Team invite below, or ask a Team admin to enroll this device."}:u!=="posted"?{state:"unreachable",badgeLabel:t?.configured?"Unreachable":"Setup needed",meta:t?.configured?`Team: ${a}. The coordinator is not currently reachable and no healthy data-plane sync is confirmed.`:"Configure or join a Team before expecting Project data to sync.",nextAction:t?.configured?"Check the coordinator connection, then refresh Team sync.":"Paste a Team invite below, or set a coordinator URL in Settings → Device Sync."}:FU(n,e.status)?{state:"reachable",badgeLabel:"Check devices",meta:`Team: ${a}. The coordinator is reachable, but one or more paired devices are offline or degraded.`,nextAction:"Bring the paired devices online, check their sync errors, then run Sync now again."}:t?.sync_enabled===!0&&OU(n,e.status)?{state:"healthy",badgeLabel:"Healthy",meta:`Team: ${a}. Sync is enabled and a trusted device has a healthy data-plane connection.`,nextAction:null}:MU(n)?{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${a}. The coordinator and a paired device are reachable, but successful Project sync is not confirmed.`,nextAction:"Run Sync now, then review the device sync status below if delivery is still pending."}:{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${a}. The coordinator is reachable, but healthy Project data sync is not confirmed.`,nextAction:"Pair and approve a device, then run Sync now to confirm data delivery."}}function qU(e){return e.discovered?.stale?e.peer?Go(e.peer)!=="connected":!0:!1}function KS(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 Vf(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 UU(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 GU(e){const t=ue(e?.coordinator_url),n=Array.isArray(e?.groups)?e.groups:[];return t?n.some(r=>ue(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 HU(e,t){const n=new Map,r=i=>{const a=n.get(i)??{deviceId:i,localName:"",coordinatorName:"",peer:null,discovered:null};return n.set(i,a),a};return e.forEach(i=>{const a=ue(i?.peer_device_id);if(!a)return;const s=r(a);s.peer=i,s.localName=ue(i?.name)}),t.forEach(i=>{const a=ue(i?.device_id);if(!a)return;const s=r(a);s.discovered=i,s.coordinatorName=ue(i?.display_name)}),[...n.values()]}function VU(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.coordinator?.discovered_devices)?e.coordinator.discovered_devices:[],i=HU(n,r),a=e.duplicatePersonDecisions??{},s=AU(t).filter(l=>!a[[...l.actorIds].sort().join("::")]),c=[];return s.forEach(l=>{c.push({id:`duplicate:${l.actorIds.join(":")}`,kind:"possible-duplicate-person",priority:l.includesLocal?5:15,title:`Possible duplicate person: ${l.displayName}`,summary:l.includesLocal?"At least one entry is marked as you. Confirm whether these records represent the same person.":"Multiple people share this name. Confirm whether they should stay separate or be combined.",actionLabel:"Go to people",actorIds:l.actorIds})}),i.forEach(l=>{const d=MS({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId}),u=l.peer?Go(l.peer):"waiting",p=l.peer?ua(l.peer):null,f=ue(l.discovered?.fingerprint),m=ue(l.peer?.fingerprint);if(l.peer&&f&&m&&f!==m){c.push(KS({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||ue(l.peer?.last_error)||"Sync needs review.";c.push(KS({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"&&c.push(Vf({id:l.deviceId,key:"other-device-trust",name:d,summary:"You accepted this device. Finish onboarding on the other device so it trusts this one too."})),!l.peer&&l.discovered?.stale&&c.push(Vf({id:l.deviceId,key:"stale-discovery",name:d,summary:"This device is no longer advertising fresh coordinator presence. Wait for it to check in again before connecting it here."})),!l.peer&&Array.isArray(l.discovered?.groups)&&l.discovered.groups.length>1&&c.push(Vf({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&&hU({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId})&&c.push(UU({id:l.deviceId,name:d,summary:"Give this device a friendly name so it is easier to recognize later."}))}),{primaryStatus:VS({status:e.status,coordinator:e.coordinator,peers:n,shareOperations:e.shareOperations,shareOperationsLoadError:e.shareOperationsLoadError,reconciliation:e.reconciliation}),summary:{connectedDeviceCount:n.filter(l=>Go(l)==="connected").length,seenOnTeamCount:r.length,offlineTeamDeviceCount:i.filter(l=>qU(l)).length},duplicatePeople:s,attentionItems:c.sort((l,d)=>l.priority-d.priority||l.title.localeCompare(d.title))}}var zS={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 wr(e){const t=document.getElementById(e);t&&t.remove()}var WS=!1;function KU(e){WS=e}var Kf=!1;function zU(e){Kf=e}var zf=!1;function WU(e){zf=e}var JU=new Set,Wf=new Set,Jf=new Set,JS="codemem-sync-duplicate-person-decisions";function YU(e){const t=String(e||"").trim();t&&(Wf.add(t),Jf.add(t),JU.add(t))}function Yf(e){const t=String(e||"").trim();return!!t&&Wf.has(t)}function XU(e){const t=String(e||"").trim();t&&Wf.delete(t)}function QU(e){const t=String(e||"").trim();return!t||!Jf.has(t)?!1:(Jf.delete(t),!0)}function Xf(){try{const e=localStorage.getItem(JS);if(!e)return{};const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function YS(e){try{localStorage.setItem(JS,JSON.stringify(e))}catch{}}function XS(e){return[...e].map(t=>String(t||"").trim()).filter(Boolean).sort().join("::")}function ZU(){return Xf()}function e2(e,t){const n=XS(e);if(!n)return;const r=Xf();r[n]=t,YS(r)}function t2(e){const t=XS(e);if(!t)return;const n=Xf();delete n[t],YS(n)}function QS(e){return e.replace(/\b(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}\b/g,"$1.#.#")}function ZS(e){const t=String(e||"");return t?QS(t):""}function n2(e){if(!Array.isArray(e))return"";const t=Array.from(new Set(e.filter(Boolean)));return typeof t[0]=="string"?t[0]:""}function r2(e,t){const n=String(e?.relatedPeerDeviceId??"").trim();return n?t.some(r=>String(r?.peer_device_id??"").trim()===n):!1}function Sl(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 Qf(e){return!e||typeof e!="object"?"Unknown person":e.is_local?"You":Sl(e)}function i2(e){return(Array.isArray(S.lastSyncPeers)?S.lastSyncPeers:[]).filter(t=>String(t?.actor_id||"")===e).length}function a2(){return HS({actors:S.lastSyncActors,peers:S.lastSyncPeers,duplicatePeople:S.lastSyncViewModel?.duplicatePeople}).visibleActors}function eC(e){return a2().filter(t=>String(t?.actor_id||"")!==e)}function o2(e,t){const n=eC(t).find(r=>String(r?.actor_id||"")===e);return!e||!n?"Choose which person should keep these devices.":`Merge into ${Qf(n)}. Assigned devices move now; existing memories keep their current provenance.`}function Zf(e,t){if(e){if(e.textContent="",!t.length){e.hidden=!0;return}e.hidden=!1,t.slice(0,2).forEach(n=>{const r=Ws("div","sync-action"),i=Ws("div","sync-action-text");i.textContent=n.label,i.appendChild(Ws("span","sync-action-command",n.command));const a=Ws("button","settings-button sync-action-copy","Copy");a.addEventListener("click",()=>Va(n.command,a)),r.append(i,a),e.appendChild(r)})}}function tC(e,t){return t&&e.error_redacted===!0}function s2(e){return e?{action:t=>Fr({severity:"error",subsystem:"sync",trigger:t})}:{}}function nC(){const e=document.getElementById("syncAttempts");if(!e)return;const t=S.lastSyncAttempts,n=String(S.lastSyncStatus?.daemon_state||"").trim();if(!Array.isArray(t)||!t.length){ui(e,Jq());return}const r=Xq(n,t.slice(0,5).some(a=>a.status==="error")),i=t.slice(0,5).map(a=>{const s=a.started_at||a.started_at_utc||"",c=String(a.peer_device_id||"").trim(),l=Array.isArray(S.lastSyncPeers)?S.lastSyncPeers.find(m=>String(m?.peer_device_id||"")===c):null,d=String(l?.name||"").trim()||(c?c.slice(0,8):"unknown"),u=a.status==="error",p=[],f=za();if(u&&a.error){const m=String(a.error);p.push(f?QS(m):m),tC(a,f)&&p.push("Turn off Redact in Advanced diagnostics to reveal the full error.")}return!u&&(a.ops_in||a.ops_out)&&p.push(`${a.ops_in??0} in · ${a.ops_out??0} out`),!f&&a.address&&p.push(a.address),{status:a.status||"unknown",peerLabel:d,detail:p.join(" · "),startedAt:s?Zr(s):"",...s2(u),...tC(a,f)?{actionHref:"#sync/diagnostics",actionLabel:"Open Advanced diagnostics Redact setting"}:{}}});nU(e,i,r)}function c2(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncAttempts"),n=document.getElementById("syncMeta"),r=document.getElementById("syncActions");e&&ui(e,Wq()),t&&ui(t,Yq()),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."),Zf(r,[])}function pa(e){const t=Number(e??0);return Number.isFinite(t)?t:0}function l2(e){const t=String(e?.state??"clear"),n=e?.stale_peer_rows??{},r=e?.access_cleanup_ops??{},i=pa(n.would_remove),a=pa(n.ambiguous),s=pa(r.applied),c=pa(r.source_authored);return t==="cleanup_pending"||i>0?`${i} pending removal`:t==="needs_review"||a>0?`${a} needs review`:t==="cleanup_applied"||s>0?`${s} applied`:t==="cleanup_announced"||c>0?`${c} announced`:"Clear"}function rC(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncMeta"),n=document.getElementById("syncActions");if(!e)return;wr("syncDiagSkeleton");const r=S.lastSyncStatus;if(!r){ui(e,zq()),Zf(n,[]),t&&(t.textContent="Loading advanced sync diagnostics…");return}const i=r.peers||{},a=r.ping||{},s=r.sync||{},c=r.last_sync_at||r.last_sync_at_utc||null,l=a.last_ping_at||r.last_ping_at||Gq(i)||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||{},b=r.cleanup_diagnostics,h=b?.stale_peer_rows??{},y=pa(h.would_remove),w=pa(h.ambiguous),_=v.enabled===!0,R=Number(v.last_deleted_ops||0),I=v.last_run_at||null,T=String(v.last_error||""),A=m==="offline-peers"?"Offline peers":m==="needs_attention"?"Needs attention":m==="rebootstrapping"?"Rebootstrapping":e_(m),L=m==="disabled"||r.enabled===!1,F=Object.keys(i).length,N=!L&&F===0;if(t){const U=L?["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"]:N?["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: ${A}`,`Peers: ${F}`,c?`Last sync: ${ur(Zi(c))} ago`:"Last sync: never"];m==="offline-peers"&&U.push("All peers are currently offline; sync will resume automatically"),f&&m==="stopped"&&U.push(`Detail: ${f}`),f&&(m==="needs_attention"||m==="rebootstrapping")&&U.push(`Detail: ${f}`),_&&U.push(I?`Retention last ran ${ur(Zi(I))} ago (approx oldest-first)`:"Retention enabled"),y>0?U.push(`${y.toLocaleString()} stale peer rows pending cleanup`):w>0&&U.push(`${w.toLocaleString()} stale peer rows retained because safe cleanup could not be proven`),t.textContent=U.join(" · ")}const j=L?[{label:"State",value:"Disabled"},{label:"Mode",value:"Optional"},{label:"Pending events",value:p},{label:"Last sync",value:"Not running"}]:N?[{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:A},{label:"Pending events",value:p},{label:"Last sync",value:c?`${ur(Zi(c))} ago`:"never"},{label:"Last peer ping",value:l?`${ur(Zi(l))} ago`:"never"},{label:"Retention",value:_?I?`${R.toLocaleString()} ops last run (approx)`:"Enabled":"Disabled"}];!L&&!N&&(d||u)&&j.push({label:[d,u].filter(Boolean).join(" · "),value:"Errors"}),!L&&!N&&s.seconds_since_last&&j.push({label:"Since last sync",value:`${s.seconds_since_last}s`}),!L&&!N&&a.seconds_since_last&&j.push({label:"Since last peer ping",value:`${a.seconds_since_last}s`}),!L&&_&&T&&j.push({label:T,value:"Retention"}),!L&&!N&&b&&j.push({label:"Cleanup",value:l2(b)}),tU(e,j);const x=[];N||m==="offline-peers"||(m==="stopped"?(x.push({label:"Sync daemon is stopped. Start it.",command:"codemem serve start"}),x.push({label:"Run one sync pass now.",command:"codemem sync once"})):m==="needs_attention"?x.push({label:"Sync needs manual attention before reset can continue.",command:"codemem sync doctor"}):m==="rebootstrapping"?x.push({label:"Sync is rebuilding state in the background.",command:"codemem sync status"}):d||u||m==="error"?(x.push({label:"Sync reports errors. Restart now.",command:"codemem serve restart && codemem sync once"}),x.push({label:"Run doctor for the root cause.",command:"codemem sync doctor"})):!L&&!N&&p>0&&x.push({label:"Pending sync work detected. Run one pass now.",command:"codemem sync once"})),!L&&w>0?x.push({label:"Some stale peer rows were retained because cleanup was ambiguous.",command:"codemem sync doctor"}):!L&&y>0&&x.push({label:"Stale peer rows are eligible for cleanup. Run one sync pass now.",command:"codemem sync once"}),Zf(n,x)}var d2="syncRedactMount",u2="syncRedactLabel",iC=()=>{};function p2(e){iC=e}var em=()=>{};function tm(){const e=document.getElementById("syncPairingDisclosureMount"),t=document.getElementById("syncPairingPanelMount");if(!e||!t)return;oU(e,{contentHost:t,open:S.syncPairingOpen,onOpenChange:r=>{if(cA(r),tm(),r){const i=document.getElementById("pairingPayload"),a=document.getElementById("pairingHint");i&&ES(i,a,{payloadText:"Loading…",hintText:"Fetching pairing payload…"})}em()}});const n=document.getElementById("pairingCopy");n&&(n.onclick=async()=>{const r=S.pairingCommandRaw;r&&await Va(r,n)})}function nm(){tm();const e=document.getElementById("pairingPayload"),t=document.getElementById("pairingHint");if(!e)return;ES(e,t,Kq(S.pairingPayloadRaw));const n=document.getElementById("pairingCopy");n&&(n.disabled=!S.pairingCommandRaw)}function aC(){const e=document.getElementById(d2);e&&mt(e,g(Ji,{"aria-labelledby":u2,checked:za(),className:"sync-redact-switch",id:"syncRedact",onCheckedChange:t=>{lA(t),aC(),em(),rC(),iC(),nC(),nm()},thumbClassName:"sync-redact-switch-thumb"}))}function f2(e){em=e,tm(),aC()}function m2(e){e.classList.add("sync-shake"),e.addEventListener("animationend",()=>e.classList.remove("sync-shake"),{once:!0})}function fa(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),m2(e),e.addEventListener("input",()=>Ho(e),{once:!0}),!1}function Ho(e){e.classList.remove("sync-field-error");const t=e.parentElement?.querySelector(".sync-field-hint");t&&t.remove()}function _t(e,t){if(e instanceof Error){const n=e.message;return n.includes("fetch")||n.includes("network")||n.includes("Failed to fetch")?"Network error — check your connection and try again.":n}return t}var pi=new Map,rm=null,h2={operation_device_binding_missing:"The accepted device has not been linked yet.",operation_not_found:"This sharing operation is no longer available.",operation_scope_mismatch:"The invitation no longer matches the reviewed project access.",operation_state_invalid:"The invitation is no longer in a recoverable state.",reassign_capability_required:"A participating device must be updated before setup can continue."};function g2(e){const t=e instanceof Error?e.message:String(e);return h2[t]??"Setup could not be retried. Review diagnostics for details."}function v2(e){const t=new Map;for(const n of e){const r=n.person.actor_id;t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function y2(e){return[...new Map(e.flatMap(t=>t.devices).map(t=>[t.device_id,t])).values()]}function im(e){switch(e){case"waiting_for_acceptance":return"Invitation pending";case"active":return"Sharing";case"revoking":return"Removing sharing";case"revoked":return"Previously shared";case"cancelled":return"Invitation cancelled";default:return"Sharing setup"}}function b2({operation:e,onAdvance:t,onLoadOperation:n,onReload:r,copyText:i}){const[a,s]=D(!1),[c,l]=D(()=>pi.get(e.operation_id)??null),d=B(null),u=e.lifecycle.primary_action;V(()=>{rm!==e.operation_id||!d.current||(rm=null,d.current.focus())},[c?.message,e.operation_id]);async function p(b){s(!0);try{let h=b;if(!h&&n){const w=(await n(e.operation_id)).lifecycle.primary_action;w?.kind==="copy_invite"&&(h=w.invite_link)}if(!h)throw new Error("Invitation is no longer available. Refresh the status.");await(i??(w=>navigator.clipboard.writeText(w)))(h);const y={message:"Invite copied.",tone:"success"};pi.set(e.operation_id,y),l(y)}catch(h){const y={message:h instanceof Error?h.message:"Invite could not be copied.",tone:"warning"};pi.set(e.operation_id,y),l(y)}finally{s(!1)}}async function f(){s(!0);try{const b=await t(e.operation_id),h=b.lifecycle.state==="active"?{message:"Setup complete.",tone:"success"}:b.lifecycle.state==="needs_attention"?{message:"Setup still needs attention.",tone:"warning"}:{message:`Retry started. ${b.lifecycle.label}.`,tone:"success"};pi.set(e.operation_id,h),rm=e.operation_id,l(h),await r()}catch(b){const h={message:g2(b),tone:"warning"};pi.set(e.operation_id,h),l(h),queueMicrotask(()=>d.current?.focus())}finally{s(!1)}}function m(){const b=e.projects.map(h=>h.project_id?.trim()).filter(h=>!!h);if(b.length!==e.projects.length){const h={message:"The original project selection is unavailable. Refresh Projects and try again.",tone:"warning"};pi.set(e.operation_id,h),l(h);return}if(!As(b,e.person.display_name)){const h={message:"Project sharing is unavailable. Refresh Projects and try again.",tone:"warning"};pi.set(e.operation_id,h),l(h)}}function v(){if(u){if(u.kind==="copy_invite"){p(u.invite_link);return}if(u.kind==="retry_setup"){f();return}m()}}return o("section",{"aria-label":`${im(e.lifecycle.state)} operation`,className:"project-share-operation-card",children:[o("div",{className:"peer-scope-summary",children:im(e.lifecycle.state)}),o("ul",{"aria-label":`${im(e.lifecycle.state)} projects`,className:"peer-scope-chips",children:e.projects.map((b,h)=>o("li",{className:"peer-scope-chip",children:b.display_name},`${b.display_name}:${h}`))}),o("div",{className:"peer-scope-summary",children:e.lifecycle.label}),o("div",{className:"peer-meta",role:e.lifecycle.state==="needs_attention"?"alert":void 0,children:e.lifecycle.explanation}),u?o("div",{className:"peer-actions",children:o("button",{"aria-busy":a,className:"settings-button",disabled:a,type:"button",onClick:v,children:a?u.kind==="copy_invite"?"Copying…":"Retrying…":u.label})}):null,c?o("div",{ref:d,className:`settings-note ${c.tone==="warning"?"project-attention-note":""}`,role:"status",tabIndex:-1,children:c.message}):null]})}function _2({operations:e,...t}){const n=e[0].person,r=y2(e);return o("article",{"aria-label":`Project sharing with ${n.display_name}`,className:"peer-card project-share-person-group",children:[o("h3",{className:"device-row-name",children:n.display_name}),r.length>0?o("ul",{"aria-label":`Devices for ${n.display_name}`,className:"peer-scope-rejections-list",children:r.map(i=>o("li",{children:i.display_name},i.device_id))}):null,e.map(i=>o(b2,{operation:i,...t},i.operation_id))]})}function w2(e){return e.operations.length===0?null:o("div",{className:"project-share-person-groups",children:v2(e.operations).map(t=>o(_2,{...e,operations:t},t[0].person.actor_id))})}function S2(e,t){mt(e,o(w2,{...t}))}function oC({title:e,detail:t}){return o("div",{className:"sync-empty-state",role:"status","aria-live":"polite","aria-atomic":"true",children:[o("strong",{children:e}),o("span",{children:t})]})}function C2(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 R2({actor:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){const a=String(e.actor_id||""),s=Sl(e),c=i2(a),l=eC(a),d=l.map(x=>String(x.actor_id||"")).join("|"),[u,p]=D(s),[f,m]=D(!1),[v,b]=D("Rename"),[h,y]=D(!1),[w,_]=D("Merge into selected person"),[R,I]=D(""),[T,A]=D(!1);V(()=>{p(s),m(!1),b("Rename"),y(!1),_("Merge into selected person"),I(""),A(!1)},[a,c,t,s,d]);const L=l.length?o2(R,a):"No other people are available yet. Create another person first if you need to merge duplicates.",F=[{label:"Merge into person",value:""},...l.map(x=>{const U=String(x.actor_id||"");return{label:x.is_local?Qf(x):Sl(x),value:U}})];async function N(){const x=u.trim();if(!x)return;m(!0),b("Saving…");let U=!1;try{await n(a,x),U=!0}catch{b("Retry rename")}finally{m(!1),U&&b("Rename")}}async function j(){if(!R)return;const x=l.find(q=>String(q.actor_id||"")===R);if(!x||!await vn({title:`Merge ${s} into ${Sl(x)}?`,description:"Assigned devices move now, but older memories keep their current stamped provenance for now.",confirmLabel:"Merge people",cancelLabel:"Keep separate",tone:"danger"}))return;y(!0),_("Merging…");let U=!1;try{await r(R,a),U=!0}catch{_("Retry merge")}finally{y(!1),U&&_("Merge into selected person")}}return o("div",{className:"actor-row",children:[o("div",{className:"actor-details",children:[o("div",{className:"actor-title",children:[o("strong",{children:Qf(e)}),o("span",{className:`badge actor-badge${e.is_local?" local":""}`,title:e.is_local?C2(t):void 0,children:e.is_local?"You":`${c} device${c===1?"":"s"}`})]}),e.is_local?null:o("div",{className:"peer-meta",children:[c," assigned device",c===1?"":"s"]})]}),o("div",{className:"actor-actions",children:e.is_local?o("div",{className:"peer-meta",children:"Rename yourself in config"}):o(z,{children:[o(ke,{"aria-label":`Rename ${s}`,className:"peer-scope-input actor-name-input",disabled:f||h,type:"text",value:u,onInput:x=>p(x.currentTarget.value),onKeyDown:x=>ro(x,{onSubmit:()=>{N()},disabled:f||h||!u.trim()})}),o("button",{type:"button",className:"settings-button","data-primary-action":"true",disabled:f||h,onClick:()=>{N()},children:v}),o("button",{type:"button",className:"settings-button danger",disabled:f||h,onClick:async()=>{await vn({title:`Remove ${s}?`,description:"This deactivates the person and unassigns their devices. Existing memories keep their current attribution.",confirmLabel:"Remove person",cancelLabel:"Keep",tone:"danger"})&&await i(a)},children:"Remove"}),o("button",{type:"button",className:"settings-button",disabled:f||h,onClick:()=>A(x=>!x),children:T?"Hide duplicate cleanup":"Show duplicate cleanup"}),T?o(z,{children:[o("div",{className:"peer-meta actor-merge-note",children:"Use this only when combining duplicate people into one."}),o("div",{className:"actor-merge-controls",children:[o(dr,{ariaLabel:`Merge ${s} into another person`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:h||l.length===0,itemClassName:"sync-radix-select-item",onValueChange:I,options:F,placeholder:"Merge into person",triggerClassName:"sync-radix-select-trigger sync-actor-select actor-merge-select",value:R,viewportClassName:"sync-radix-select-viewport"}),o("button",{type:"button",className:"settings-button",disabled:h||l.length===0||!R,onClick:()=>{j()},children:w})]}),o("div",{className:"peer-meta actor-merge-note",children:L})]}):null]})})]})}function I2({actors:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){return e.length?o(z,{children:e.map(a=>{const s=String(a.actor_id||a.display_name||a.is_local||"");return o(R2,{actor:a,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i},s)})}):o(oC,{detail:"Create a named person here for legacy provenance, then confirm device Identity ownership in Devices.",title:"No people set up yet."})}function k2(e,t){mt(e,o(I2,{...t}))}function T2(e){return e.filter(t=>String(t.origin_device_id||"").trim())}function P2(e){const t=e.find(n=>String(n.last_seen_at||"").trim());return t?.last_seen_at?`Detected from older synced memories. Latest memory: ${Zr(String(t.last_seen_at).trim())}`:"Detected from older synced memories not yet attached to a current device."}function N2({devices:e}){return o(z,{children:P2(e)})}function E2(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 A2(e){const t=T2(e.devices);if(!t.length){e.panel.hidden=!0,e.onValueChange(""),da(e.mount),da(e.meta);return}const n=t.map(E2),r=n.some(i=>i.value===e.value)?e.value:n[0]?.value||"";r!==e.value&&e.onValueChange(r),e.panel.hidden=!1,mt(e.mount,o(dr,{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"})),mt(e.meta,o(N2,{devices:t}))}var x2={online:"Online",offline:"Offline",degraded:"Degraded",attention:"Action required",syncing:"Syncing",unknown:"Status unknown"};function D2({state:e,size:t=8,"aria-label":n}){const r=n??x2[e];return o("span",{"aria-label":r,className:`presence-pip presence-pip--${e}`,role:"img",style:`--presence-pip-size: ${t}px`})}function fi({feedback:e}){return e?.message?o("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 L2(){return o("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:[o("title",{children:"Chevron"}),o("path",{d:"m9 18 6-6-6-6"})]})}function $2(e){switch(Go(e)){case"connected":return"online";case"offline":return"offline";case"needs-repair":return"attention";default:return"unknown"}}var Cl=null,sC=0,am=new Set;function cC(e){if(Cl!==e){Cl=e,sC+=1;for(const t of am)t(sC)}}function j2(){const[,e]=D(0);return V(()=>(am.add(e),()=>{am.delete(e)}),[]),Cl}var O2={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 lC(e,t){if(!e)return"the selected Identity";const n=t.find(r=>r.actor_id===e);return String(n?.display_name||n?.actor_display_name||"the selected Identity")}function M2(e,t,n,r=!1,i=!1,a=!1){if(i)return{status:"unavailable",summary:"Authoritative Identity status is unavailable because the inventory is incomplete.",detail:"This installation has more device evidence than Advanced can safely classify. Ownership is not shown from a partial inventory.",actionLabel:"Review Identity inventory in Devices"};if(r||a&&!e)return{status:"unavailable",summary:"Authoritative Identity status is temporarily unavailable.",detail:"Refresh before relying on ownership details. Advanced actor_id values remain suggestions or provenance only.",actionLabel:"Review Identity in Devices"};if(e?.state==="configured")return{status:"configured",summary:`Authoritative Identity: ${lC(e.identityId,n)}.`,detail:"This result comes from an active identity_devices binding. Advanced actor_id values are not authoritative ownership.",actionLabel:"Review or rebind in Devices"};if(e?.state==="pairing_required")return{status:"pairing_required",summary:"Identity setup is blocked until pairing is complete.",detail:"Pairing establishes sync trust; it does not establish device ownership.",actionLabel:"Review setup in Devices"};if(e?.state==="conflicted")return{status:"conflicted",summary:"Identity ownership needs review.",detail:"Conflicting device evidence failed closed. Advanced actor_id values cannot resolve ownership.",actionLabel:"Review conflict in Devices"};const s=e?.suggestedIdentityId??t;return{status:e?.state??"unavailable",summary:s?`Suggested Identity: ${lC(s,n)}.`:"No authoritative Identity binding is configured.",detail:"sync_peers.actor_id is only a suggestion or hint until you confirm an identity_devices binding in Devices.",actionLabel:"Set up Identity in Devices"}}function F2(e){S.pendingDeviceIdentityFocus=e?.trim()||null,window.location.hash="devices"}function B2(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 q2(){window.location.hash="advanced/teams"}function om(e=S.lastSyncCoordinatorAdminStatus){return e?.readiness==="ready"&&e.has_admin_secret===!0}function U2({peer:e,onRemove:t,onRename:n,onSync:r}){const i=String(e.peer_device_id||""),a=e.name||(i?i.slice(0,8):"unknown"),s=e.name||i||a,c=ua(e),l=O2[gU(e)],d=e.status||{},u=bU(e),p=Yf(i),f=p&&u.total===0,m=PU(e),v=yU(e),b=qS(e),h=e.project_scope||{},y=EU(h),w=n2(e.addresses),_=Array.isArray(e.addresses)?Array.from(new Set(e.addresses.filter(Boolean).map(ae=>String(ae)))):[],R=Number(e.address_count??0),I=Number.isFinite(R)&&R>0?R:0,T=_.length?_.map(ae=>za()?ZS(ae):ae).join(" · "):I>0?`${I} ${I===1?"address":"addresses"} hidden`:"No addresses",A=S.lastDeviceIdentityInventory?.items.find(ae=>ae.deviceId===i||ae.evidenceDeviceIds.includes(i)),L=M2(A,String(e.actor_id||"")||null,S.lastSyncActors,S.deviceIdentityInventoryLoadError,S.lastDeviceIdentityInventory?.truncated===!0,S.lastDeviceIdentityInventory?.coordinatorEvidence.availability==="unavailable"),F=String(d.last_sync_at||d.last_sync_at_utc||""),N=String(d.last_ping_at||d.last_ping_at_utc||""),j=e.discovered_via_group_id?`Discovery: seen through coordinator group ${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,x=QU(i),U=B(null),[q,$]=D(a),[E,C]=D(()=>S.syncPeerFeedbackById.get(i)??null),[O,H]=D(!1),[G,ee]=D("Save name"),[Z,ie]=D(!1),[fe,Ce]=D(!1),[Pe,Ne]=D("Remove device");V(()=>{p&&u.total>0&&XU(i)},[u.total,i,p]),V(()=>{$(a),C(S.syncPeerFeedbackById.get(i)??null),H(!1),ee("Save name"),ie(!1),Ce(!1),Ne("Remove device")},[a,e.actor_id,i]),V(()=>{!x||!U.current||queueMicrotask(()=>U.current?.scrollIntoView({block:"center",behavior:window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"}))},[x]);async function ce(){if(!i)return;const ae=q.trim();if(!ae){const Fe={message:"Enter a friendly name for this device.",tone:"warning"};C(Fe),S.syncPeerFeedbackById.set(i,Fe),document.querySelector(`[data-device-name-input="${CSS.escape(i)}"]`)?.focus();return}H(!0),ee("Saving…");try{const Fe=await n(i,ae);C(Fe),S.syncPeerFeedbackById.set(i,Fe),ee("Save name")}catch{ee("Retry")}finally{H(!1)}}async function me(){if(f){const ae=om();if(!await vn({title:`Sync ${a} before advanced rule review?`,description:ae?"This manual sync will use the current legacy Space access and advanced filters until you review them in Coordinator Administration.":"This manual sync will use the current legacy Space access and advanced filters until a coordinator operator reviews them in Coordinator Administration.",confirmLabel:"Sync anyway",cancelLabel:ae?"Review legacy Team/Space setup first":"Cancel"}))return}ie(!0);try{const ae=await r(e,w);C(ae),ae&&S.syncPeerFeedbackById.set(i,ae)}finally{ie(!1)}}async function J(){if(!i||!await vn({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;Ce(!0),Ne("Removing…");let ae=!1;try{await t(i,s),ae=!0}catch{Ne("Retry remove")}finally{Ce(!1),ae&&Ne("Remove device")}}const se=j2()===i&&i!=="",ye=`device-drawer-${i||"unknown"}`,le=$2(e),Ee=F?`Sync: ${Zr(F)}`:"Sync: never",re=om(),Q=`${se?"Collapse":"Expand"} device ${a}`;return o(Ya,{asChild:!0,open:se,onOpenChange:ae=>{ae?cC(i):Cl===i&&cC(null)},children:o("div",{ref:U,className:"peer-card","data-peer-device-id":i||void 0,children:[o(zu,{asChild:!0,children:o("button",{"aria-label":Q,className:"device-row-head device-row-head--trigger",type:"button",children:[o(D2,{state:le}),o("span",{className:"device-row-name",title:i||void 0,children:a}),l?o("span",{"aria-label":l.label,className:"peer-direction",role:"img",title:l.label,children:l.glyph}):null,o("span",{className:"device-row-chips",children:[o("span",{className:`badge ${c.isWarning?"badge-offline":"badge-online"}`,children:c.badgeLabel}),f?o("span",{className:"badge actor-badge",children:"Review advanced rules"}):null,o("span",{className:`badge ${u.isWarning?"badge-offline":"actor-badge"}`,title:"Spaces are the hard access boundary; advanced filters only narrow inside them.",children:u.badgeLabel}),v.badgeLabel?o("span",{className:"badge badge-offline",title:"Inbound ops rejected by the sharing-domain scope gate. Expand for reason codes.",children:v.badgeLabel}):null,m.badgeLabel?o("span",{className:"badge badge-offline",title:"Review whether explicit Space access matches this device's intended role.",children:m.badgeLabel}):null,e.discovered_via_group_id?o("span",{className:"badge actor-badge",title:`Discovered through coordinator group ${e.discovered_via_group_id}`,children:`via ${e.discovered_via_group_id}`}):null]}),o("span",{className:"device-row-meta",children:Ee}),o("span",{"aria-hidden":"true",className:"device-row-chevron",children:o(L2,{})})]})}),o(Xa,{"aria-label":`Device actions for ${a}`,className:"device-row-drawer",id:ye,children:[o("div",{className:"peer-actions",children:[o("button",{type:"button",className:"settings-button",disabled:Z,onClick:()=>{me()},title:w?void 0:"Address details are hidden; sync will target this device by ID.",children:Z?"Syncing…":"Sync now"}),o("div",{className:"sync-labeled-field",children:[o("label",{className:"sync-labeled-field-caption",htmlFor:`device-name-${i||"unknown"}`,children:"Device name"}),o(ke,{"aria-label":`Friendly name for ${a}`,className:"peer-scope-input","data-device-name-input":i||void 0,disabled:O,id:`device-name-${i||"unknown"}`,placeholder:"Friendly device name",type:"text",value:q,onInput:ae=>$(ae.currentTarget.value)})]}),o("button",{type:"button",className:"settings-button",disabled:O,onClick:()=>{ce()},children:G}),o("button",{type:"button",className:"settings-button danger",disabled:fe,onClick:()=>{J()},children:Pe})]}),o("div",{className:"peer-scope",children:[x?o("div",{className:"peer-meta",children:re?"Review this device's legacy Space access and advanced rules in Coordinator Administration if the defaults are too broad.":"A coordinator operator can review this device's legacy Space access and advanced rules in Coordinator Administration if the defaults are too broad."}):f?o("div",{className:"peer-meta",children:"Advanced rule review is still pending for this device."}):null,o("div",{className:"peer-scope-summary",children:"Device details"}),o("div",{className:"peer-addresses",children:T}),j?o("div",{className:"peer-meta",children:j}):null,o("div",{className:"peer-meta",children:[F?`Sync: ${Zr(F)}`:"Sync: never",N?`Ping: ${Zr(N)}`:"Ping: never"].join(" · ")}),o("div",{className:"peer-scope-summary",children:"Space access"}),o("div",{className:"peer-meta",children:u.total>0?"These Spaces are the hard access boundary for this device.":u.emptyMessage}),u.domains.length>0?o("ul",{className:"peer-scope-chips","aria-label":"Authorized Spaces",children:u.domains.map(ae=>o("li",{className:"peer-scope-chip",title:ae.detail,children:ae.label},ae.scopeId))}):null,m.isVisible?o("div",{className:"settings-note",role:"status",children:[o("strong",{children:m.title}),o("div",{children:m.message}),o("div",{children:m.detail})]}):null,o("div",{className:"peer-meta",children:y.note}),o("div",{className:"peer-scope-summary",children:"Space sync progress"}),o("div",{className:"peer-meta",children:b.total>0?"Per-Space progress for this device. Open details to see technical identifiers.":b.emptyMessage}),b.rows.length>0?o("ul",{className:"peer-scope-rejections-list","aria-label":"Per-Space sync progress",children:b.rows.map(ae=>o("li",{title:ae.detail,children:[o("span",{className:"peer-scope-rejection-label",children:ae.label}),o("span",{className:`badge ${ae.status==="received"?"badge-online":"actor-badge"}`,children:ae.badgeLabel})]},ae.scopeId))}):null,v.total>0?o("div",{className:"peer-scope-rejections","data-peer-rejection-count":v.total,children:[o("div",{className:"peer-scope-summary",children:"Sharing-rule rejections (24h)"}),o("div",{className:"peer-meta",children:"Inbound ops the local fail-closed gate refused. Diagnostics never expose op payloads."}),o("ul",{className:"peer-scope-rejections-list",children:v.reasons.map(ae=>o("li",{children:[o("span",{className:"peer-scope-rejection-label",children:ae.label}),o("span",{className:"peer-scope-rejection-count",children:ae.count.toLocaleString()})]},ae.reason))}),v.lastAt?o("div",{className:"peer-meta",children:["Last rejected ",Zr(v.lastAt)]}):null]}):null,o("div",{className:"peer-scope-summary",children:"Authoritative Identity ownership"}),o("div",{className:"peer-meta",children:L.summary}),o("div",{className:"peer-meta",children:L.detail}),e.claimed_local_actor?o("div",{className:"peer-meta",children:B2(e.claimed_local_actor_scope)}):null,o("div",{className:"peer-actor-row",children:o("button",{type:"button",className:"settings-button",onClick:()=>F2(A?.deviceId??i),children:L.actionLabel})}),o("div",{className:"peer-scope-summary",children:"Advanced sharing rules"}),o("div",{className:"peer-meta",children:[y.statusLabel,". ",y.summary," ",y.note]}),re?o("div",{className:"peer-actions",children:o("button",{type:"button",className:"settings-button",onClick:q2,children:"Open Coordinator Administration"})}):o("div",{className:"peer-meta",children:"Legacy Space access is managed in Coordinator Administration by a coordinator operator."}),o(fi,{feedback:E})]})]})]})})}function G2(e){const t=S.syncPeersSectionFeedback,n=S.lastSyncStatus,r=n?.daemon_state==="disabled"||n?.enabled===!1;return e.peers.length?o(z,{children:[o(fi,{feedback:t}),e.peers.map(i=>{const a=String(i.peer_device_id||i.name||"unknown-peer");return o(U2,{peer:i,...e},a)})]}):o(z,{children:[o(fi,{feedback:t}),o(oC,{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 H2(e,t){mt(e,o(G2,{...t}))}var Sr=async()=>{},Rl="";function sm(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput");t&&(t.disabled=e),n&&(n.disabled=e)}function V2(e){Sr=e}function K2(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");if(!e)return;wr("syncActorsSkeleton"),sm(!1);const n=HS({actors:S.lastSyncActors,peers:S.lastSyncPeers,duplicatePeople:S.lastSyncViewModel?.duplicatePeople}),r=n.visibleActors;t&&(t.textContent=r.length?"Manage Identity names here. Confirm authoritative device ownership in Devices.":"No named people yet. Create an Identity here, then confirm device ownership in Devices.",n.hiddenLocalDuplicateCount>0&&(t.textContent+=` ${n.hiddenLocalDuplicateCount} unresolved duplicate ${n.hiddenLocalDuplicateCount===1?"entry is":"entries are"} hidden here until reviewed in Needs attention.`)),k2(e,{actors:r,hiddenLocalDuplicateCount:n.hiddenLocalDuplicateCount,onRename:async(i,a)=>{await BI(i,a),await Sr()},onMerge:async(i,a)=>{try{await fh(i,a),X("People combined. Assigned devices moved to the selected person."),await Sr()}catch(s){throw X(_t(s,"Failed to combine people."),"warning"),s}},onDeactivate:async i=>{try{await qI(i),X("Person removed. Assigned devices have been unassigned."),await Sr()}catch(a){throw X(_t(a,"Failed to remove person."),"warning"),a}}})}function z2(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");sm(!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&&ui(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. When the people endpoint responds again, named people will reload here."})}function W2(){const e=document.getElementById("syncProjectShareOperations");if(!e)return;S2(e,{operations:S.lastShareOperations,onAdvance:n=>EI(n),onLoadOperation:n=>NI(n),onReload:Sr});const t=document.getElementById("syncProjectShareOperationsMeta");t&&(t.textContent=S.shareOperationsLoadError?"Project sharing status could not be refreshed. Existing device diagnostics remain available below.":S.lastShareOperations.length>0?"Project access is grouped by Person. Devices appear after invitation acceptance.":"Share a project from Projects to invite a teammate.")}function cm(){const e=document.getElementById("syncPeers");if(!e)return;wr("syncPeersSkeleton");const t=S.lastSyncPeers,n=Array.isArray(t)?t:[];r2(S.syncPeersSectionFeedback,n)&&(S.syncPeersSectionFeedback=null),H2(e,{peers:n,onRename:async(r,i)=>{try{return await Qm(r,i),await Sr(),{message:"Device name saved.",tone:"success"}}catch(a){return{message:_t(a,"Failed to save device name."),tone:"warning"}}},onSync:async(r,i)=>{try{const a=String(r?.peer_device_id||""),s=await nd({address:i,peerDeviceId:a||void 0}),c=jS(s);let l;c.ok?a&&Yf(a)?l={message:`Triggered sync for ${r?.name||(a?a.slice(0,8):"unknown")}. ${om()?"Review legacy Space access and advanced rules in Coordinator Administration if this device needs tighter sharing.":"A coordinator operator can review legacy Space access and advanced rules in Coordinator Administration if this device needs tighter sharing."}`,tone:"warning"}:l={message:c.message,tone:"success"}:l={message:c.message,tone:"warning"};try{await Sr()}catch{l={message:"Sync started, but this view has not refreshed yet. Refresh the page or use Sync now again before retrying.",tone:"warning"}}return l}catch(a){return{message:_t(a,"Failed to trigger sync."),tone:"warning"}}},onRemove:async(r,i)=>{try{await Xm(r);const a={message:`Removed peer ${i}.`,tone:"success"};return S.syncPeerFeedbackById.delete(r),S.syncPeersSectionFeedback={...a,relatedPeerDeviceId:r},await Sr(),a}catch(a){return{message:_t(a,"Failed to remove peer. The local peer entry is still here."),tone:"warning"}}}})}function J2(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta"),n=document.getElementById("syncPeers");sm(!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&&ui(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&&ui(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, inspect, or re-pair them."})}function dC(){const e=document.getElementById("syncLegacyClaims"),t=document.getElementById("syncLegacyDeviceSelectMount"),n=document.getElementById("syncLegacyClaimsMeta");if(!e||!t||!n)return;const r=Array.isArray(S.lastSyncLegacyDevices)?S.lastSyncLegacyDevices:[];A2({devices:r,meta:n,mount:t,onValueChange:i=>{i!==Rl&&(Rl=i,dC())},panel:e,value:Rl})}function Y2(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput"),r=document.getElementById("syncLegacyClaimButton");n?.addEventListener("keydown",i=>{ro(i,{onSubmit:()=>t?.click(),disabled:!t||t.disabled})}),t?.addEventListener("click",async()=>{if(!t||!n)return;const i=String(n.value||"").trim();if(!i){fa(n,"Enter a name for the person.");return}Ho(n),t.disabled=!0,n.disabled=!0,t.textContent="Creating…";try{await FI(i),X("Person created."),n.value="",await e()}catch(a){X(_t(a,"Failed to create person."),"warning"),t.textContent="Retry",t.disabled=!1,n.disabled=!1;return}t.textContent="Create person",t.disabled=!1,n.disabled=!1}),r?.addEventListener("click",async()=>{const i=String(Rl||"").trim();if(!i||!r||!await vn({title:`Attach history from ${i}?`,description:"This updates legacy provenance so the older device history is attached to you on this device.",confirmLabel:"Attach history",cancelLabel:"Cancel",tone:"danger"}))return;r.disabled=!0;const a=r.textContent||"Attach device history";r.textContent="Attaching…";try{await UI(i),X("Old device history attached to you."),await e()}catch(s){X(_t(s,"Failed to attach old device history."),"warning"),r.textContent="Retry",r.disabled=!1;return}r.textContent=a,r.disabled=!1})}function X2(){return window.location.hash.replace(/^#/,"")==="sync/diagnostics"?"diagnostics":"main"}function lm(e=X2()){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 uC=!1;function Q2(){uC||(uC=!0,window.addEventListener("hashchange",()=>{lm()}))}var _n={invitePolicy:"auto_admit",loadSyncData:async()=>{}};function Z2(e){_n.loadSyncData=e}var eG=[{value:"auto_admit",label:"Auto-admit"},{value:"approval_required",label:"Approval required"}];function tG(){const e=document.getElementById("syncCreateInviteButton"),t=document.getElementById("syncInviteAdminHint");if(!e||!t)return;const n=S.lastSyncCoordinatorAdminStatus?.readiness;if(n==="ready"){e.disabled=!1,t.hidden=!1,t.textContent="Legacy Team/Space setup is ready. Technical controls are in Coordinator Administration.";return}const r=n==="partial"?"Finish legacy Team/Space setup before creating remote invites. Use Coordinator Administration to check what is missing.":"Configure a coordinator URL, group, and admin secret before creating remote invites. Use Coordinator Administration to finish legacy Team/Space setup.";e.disabled=!0,t.hidden=!1,t.textContent=r}function dm(){const e=document.getElementById("syncAdminDisclosureMount");e&&aU(e,{open:WS,onOpenChange:t=>{KU(t),dm(),kl(),um()}})}function nG(){const e=document.getElementById("syncJoinPanel"),t=document.getElementById("syncJoinSection");!e||!t||e.parentElement!==t&&t.appendChild(e)}function um(){const e=document.getElementById("syncInviteOutput"),t=document.getElementById("syncInviteWarnings");if(!e)return;const n=String(S.lastTeamInvite?.encoded||"").trim();if(e.value=n,e.hidden=!n,t){const r=Array.isArray(S.lastTeamInvite?.warnings)?S.lastTeamInvite.warnings:[];t.textContent=r.join(" · "),t.hidden=r.length===0}}function Il(){const e=document.getElementById("syncJoinFeedback");if(!e)return;const t=S.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 kl(){const e=document.getElementById("syncInvitePolicyMount");e&&mt(e,g(dr,{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!==_n.invitePolicy&&(_n.invitePolicy=n,kl())},options:eG,triggerClassName:"sync-radix-select-trigger sync-actor-select",value:_n.invitePolicy,viewportClassName:"sync-radix-select-viewport"}))}function rG(e,t){dm(),kl();const n=document.getElementById("syncNowButton"),r=document.getElementById("syncShareProjectsButton"),i=document.getElementById("syncCreateInviteButton"),a=document.getElementById("syncInviteGroup"),s=document.getElementById("syncInviteTtl"),c=document.getElementById("syncInviteOutput"),l=document.getElementById("syncJoinButton"),d=document.getElementById("syncJoinInvite"),u=document.getElementById("syncProjectInviteReview"),p=document.getElementById("syncProjectInviteContext"),f=document.getElementById("syncProjectInviteReviewHeading"),m=document.getElementById("syncRecipientName"),v=document.getElementById("syncRecipientDeviceName");let b="",h,y=0;r?.addEventListener("click",()=>{As()||X("Project sharing is unavailable. Refresh Projects and try again.","warning")});const w=async(_,R)=>{if(!u||!m||!v)return"other";const I=await Ym(_);if(R!==y||d?.value.trim()!==_)return"stale";if(h=I.kind,I.kind!=="project_share_invite")return"other";const T=(I.projects??[]).map(A=>`${A.display_name} (${A.existing_memory_count} existing ${A.existing_memory_count===1?"memory":"memories"})`).join(", ");return p&&(p.textContent=`${I.inviter_name||"A teammate"} invited you${I.team_name?` through ${I.team_name}`:""} to share ${T||"selected projects"}.`),m.value=Li(I.recipient_name),v.value=Li(I.device_name),u.hidden=!1,b=_,l&&(l.textContent="Accept and start syncing"),f?.focus(),"project"};d?.addEventListener("input",()=>{y+=1,d.value.trim()!==b&&(b="",h=void 0,u&&(u.hidden=!0),l&&(l.textContent="Review invite"))}),i?.addEventListener("click",async()=>{if(!i||!a||!s||!c||i.disabled)return;const _=a.value.trim(),R=Number(s.value);let I=!0;if(_?Ho(a):I=fa(a,"Team name is required."),!R||R<1?I=fa(s,"Must be at least 1 hour."):Ho(s),!!I){i.disabled=!0,i.textContent="Creating…";try{const T=await Vm({group_id:_,policy:_n.invitePolicy,ttl_hours:R||24});S.lastTeamInvite=T,um(),c.value=String(T.encoded||""),c.hidden=!1,c.focus(),c.select();const A=Array.isArray(T.warnings)?T.warnings:[];X(A.length?`Invite created. Copy it above and review ${A.length===1?"1 warning":`${A.length} warnings`}.`:"Invite created. Copy the text above and share it with your teammate.",A.length?"warning":"success")}catch(T){X(_t(T,"Failed to create invite. Check the team name, invite lifetime, and coordinator reachability, then try again."),"warning"),i.textContent="Retry",i.disabled=!1;return}finally{i.disabled&&(i.disabled=!1,i.textContent="Create invite")}}}),d?.addEventListener("keydown",_=>{ro(_,{onSubmit:()=>l?.click(),disabled:!l||l.disabled})}),l?.addEventListener("click",async()=>{if(!l||!d)return;const _=d.value.trim();if(!_){fa(d,"Paste a team invite or pairing payload.");return}if(Ho(d),b!==_){const I=y;try{const T=await w(_,I);if(T==="project"||T==="stale")return}catch{}if(I!==y||d.value.trim()!==_)return;b=_,l.textContent="Accept invite";return}const R=u&&!u.hidden?{recipient_name:m?.value.trim()??"",device_name:v?.value.trim()??""}:void 0;if(R){const I=T=>Li(T)==="";if(I(R.recipient_name)){m&&fa(m,"Enter a human-readable name using 120 characters or fewer.");return}if(I(R.device_name)){v&&fa(v,"Enter a human-readable device name using 120 characters or fewer.");return}}l.disabled=!0,l.textContent="Accepting…";try{const I=await Yl(_,R,h);S.lastTeamJoin=I;const T=I,A=typeof T.type=="string"?T.type:"team_join";let L;if(A==="pair"){const F=String(I.peer_device_id??"").trim();L={message:F?`Paired with device ${F.slice(0,8)}. It will appear in People & devices.`:"Paired the device. It will appear in People & devices.",tone:"success"}}else if(A==="project_share"){const F=T.restart_required===!0||T.setup_state==="pending_inviter"||I.status==="pending_setup",N=typeof T.detail=="string"?T.detail.trim():"";L=F?{message:N||(T.restart_required===!0?"Project invitation accepted. Restart codemem to finish setup.":T.setup_state==="pending_inviter"?"Project invitation accepted. Waiting for the inviter to finish setup.":"Project invitation accepted. Setup is still pending."),tone:"warning"}:{message:"Project invitation accepted.",tone:"success"}}else L={message:I.status==="pending"?"Join request sent. Waiting for admin approval.":"Joined the team.",tone:"success"};S.syncJoinFlowFeedback=L,Il(),d.value="",b="",u&&(u.hidden=!0);try{await t()}catch(F){L={message:_t(F,"Accepted the invite, but this view has not refreshed yet."),tone:"warning"},S.syncJoinFlowFeedback=L,Il()}}catch(I){S.syncJoinFlowFeedback={message:_t(I,"Failed to accept. Check that the invite or pairing payload is complete and current, then try again."),tone:"warning"},Il(),l.textContent="Retry",l.disabled=!1;return}finally{l.disabled&&(l.disabled=!1,l.textContent="Review invite")}}),n?.addEventListener("click",async()=>{if(n){n.disabled=!0,n.textContent="Syncing…";try{const _=await nd(),R=jS(_);X(R.message,R.warning?"warning":void 0)}catch(_){X(_t(_,"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 pm({element:e,hidden:t=!1,restoreParent:n=null}){const r=B(null);return Tt(()=>{e&&(e.hidden=t)},[e,t]),Tt(()=>{const i=r.current;if(!(!i||!e))return e.parentElement!==i&&i.appendChild(e),()=>{!n||e.parentElement!==i||n.appendChild(e)}},[e,n]),o("div",{ref:r})}function iG({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:r}){return o(z,{children:[o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:["Invite a teammate.",o("span",{className:"sync-action-command",children:"Generate an invite when you want someone else to join this team from their device."})]}),o("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide invite form":"Invite a teammate"})]}),e?o(pm,{element:e,hidden:!t,restoreParent:n}):null]})}function aG(){return o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:["Pair another device.",o("span",{className:"sync-action-command",children:"Copy a pairing command when you want to connect another one of your own devices."})]}),o("button",{type:"button",className:"settings-button sync-action-copy",onClick:e=>Va("codemem sync pair --payload-only",e.currentTarget),children:"Copy pairing command"})]})}function oG({joinPanel:e,joinPanelOpen:t,joinRestoreParent:n,onToggle:r}){return o(z,{children:[o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:["Accept an invite or pairing.",o("span",{className:"sync-action-command",children:"Paste a team invite to join another team, or a pairing payload to connect another device."})]}),o("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide paste form":"Paste invite or pairing"})]}),e?o(pm,{element:e,hidden:!t,restoreParent:n}):null]})}function sG({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,joinPanel:r,joinPanelOpen:i,joinRestoreParent:a,onToggleInvitePanel:s,onToggleJoinPanel:c,pairedPeerCount:l,presenceStatus:d}){const u=d==="not_enrolled";return o(z,{children:[u?o(z,{children:[o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:["Join this device.",o("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?o(pm,{element:r,hidden:!1,restoreParent:a}):null,o("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0}),o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:["This device is not on the team yet.",o("span",{className:"sync-action-command",children:"Use Join this device above, or ask an admin to enroll it first."})]})})]}):o(z,{children:[o(oG,{joinPanel:r,joinPanelOpen:i,joinRestoreParent:a,onToggle:c}),o("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0})]}),u?null:o(iG,{invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:s}),!l&&d==="posted"?o(aG,{}):null]})}function Tl({count:e,label:t}){return o("div",{className:"sync-section-heading",children:[o("div",{className:"sync-action-text sync-section-label",children:t}),e?o("span",{className:"badge actor-badge sync-section-count",children:e}):null]})}function Pl({children:e}){return o("div",{className:"section-meta sync-section-note",children:e})}function cG({item:e,onAction:t}){const[n,r]=D(!1);return o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:[e.title,o("span",{className:"sync-action-command",children:e.summary})]}),o("button",{type:"button",className:"settings-button",disabled:n,onClick:async()=>{r(!0);try{await t(e)}finally{r(!1)}},children:e.actionLabel||"Review"})]})}function lG({request:e,onApprove:t,onDeny:n}){const[r,i]=D(null),[a,s]=D(null),[c,l]=D("Approve"),[d,u]=D("Deny");return o("div",{className:"actor-row",children:[o("div",{className:"actor-details",children:o("div",{className:"actor-title",title:e.requestId||void 0,children:e.displayName})}),o("div",{className:"actor-actions",children:[o("button",{type:"button",className:"settings-button","aria-label":`${c} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("approve"),l("Approving…");try{s(await t(e)||null),l("Approve")}catch{l("Retry")}finally{i(null)}},children:c}),o("button",{type:"button",className:"settings-button","aria-label":`${d} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("deny"),u("Denying…");try{s(await n(e)||null),u("Deny")}catch{u("Retry")}finally{i(null)}},children:d})]}),o(fi,{feedback:a})]})}function dG({row:e,onInspectConflict:t,onRemoveConflict:n,onReview:r}){const[i,a]=D(null),[s,c]=D(null),l=e.actionLabel||"Pair with this device",[d,u]=D(l),[p,f]=D("Remove broken device record");return o("div",{className:"peer-card peer-card--padded","data-discovered-device-id":e.deviceId,children:[o("div",{className:"peer-title",children:[o("strong",{title:e.displayTitle||void 0,children:e.displayName}),o("span",{className:`badge actor-badge${e.availabilityLabel==="Offline"?"":" local"}`,children:e.availabilityLabel}),o("span",{className:"badge actor-badge",children:e.connectionLabel}),e.approvalBadgeLabel?o("span",{className:"badge actor-badge",children:e.approvalBadgeLabel}):null]}),o("div",{className:"peer-meta",children:e.note}),o("div",{className:"peer-actions",children:[e.mode==="accept"?o("button",{type:"button",className:"settings-button","aria-label":`${d} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{a("review"),u("Pairing…"),c({message:`Pairing ${e.displayName}. Keep this page open while the device is approved and refreshed.`,tone:"success"});try{const m=await r(e)||null;c(m),u(m?.tone==="warning"?"Retry":e.actionLabel||l)}catch{c({message:`Pairing ${e.displayName} failed. Try again.`,tone:"warning"}),u("Retry")}finally{a(null)}},children:d}):null,(e.mode==="stale"||e.mode==="approval-pending"||e.mode==="ambiguous"||e.mode==="scope-pending"||e.mode==="setup-blocked")&&e.actionMessage?o("div",{className:"peer-meta",children:e.actionMessage}):null,e.mode==="paired"&&e.pairedMessage?o("div",{className:"peer-meta",children:e.pairedMessage}):null,e.mode==="conflict"?o(z,{children:[o("button",{type:"button",className:"settings-button","aria-label":`Open details for ${e.displayName}`,disabled:i!==null,onClick:()=>t(e),children:"Open device details"}),o("button",{type:"button",className:"settings-button danger","aria-label":`${p} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{a("remove"),f("Removing…");try{c(await n(e)||null),f("Remove broken device record")}catch{f("Retry")}finally{a(null)}},children:p})]}):null]}),o(fi,{feedback:s})]})}function uG(e){const t=e.actionItems.length>0,n=e.actionableCount>e.actionItems.length,r=t||n||e.primaryStatus.state!=="healthy";return o(z,{children:[r?o(Tl,{label:"Needs attention"}):null,r?o(Pl,{children:"Start here when something needs review, re-pairing, or approval."}):null,e.primaryStatus.nextAction?o("div",{className:"sync-action","data-primary-sync-state":e.primaryStatus.state,children:o("div",{className:"sync-action-text",children:[e.primaryStatus.badgeLabel,o("span",{className:"sync-action-command",children:e.primaryStatus.nextAction})]})}):null,t?e.actionItems.map(i=>o(cG,{item:i,onAction:e.onAttentionAction},i.id)):null,!t&&!n&&e.primaryStatus.state==="healthy"?o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:"No urgent team work right now."})}):null,!t&&n?o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:"More team follow-up is listed below when you are ready."})}):null]})}function pG({children:e}){return e?o(z,{children:[o(Tl,{label:"Add devices & teammates"}),o(Pl,{children:"Use these flows when you are enrolling, inviting, or pairing something new."}),e]}):null}function fG({mount:e,rows:t,onInspectConflict:n,onRemoveConflict:r,onReview:i}){return!e||!t.length&&!S.syncDiscoveredFeedback?null:ln(o(z,{children:[o(Tl,{count:t.length||void 0,label:"Devices waiting for review"}),o(Pl,{children:"Review team devices here when they still need trust, re-pairing, or approval on this machine."}),o(fi,{feedback:S.syncDiscoveredFeedback}),t.map(a=>o(dG,{row:a,onInspectConflict:n,onRemoveConflict:r,onReview:i},`${a.deviceId}:${a.incomingRequestId}:${a.fingerprint}`))]}),e)}function mG({mount:e,requests:t,onApprove:n,onDeny:r}){return!e||!t.length&&!S.syncJoinRequestsFeedback?null:ln(o(z,{children:[o(Tl,{count:t.length||void 0,label:"Join requests to review"}),o(Pl,{children:"Approve or deny requests here before those devices become part of the team."}),o(fi,{feedback:S.syncJoinRequestsFeedback}),t.map(i=>o(lG,{request:i,onApprove:n,onDeny:r},i.requestId))]}),e)}function pC(e){return o(z,{children:[o(uG,{...e}),o(pG,{children:e.children}),o(mG,{mount:e.joinRequestsMount,requests:e.pendingJoinRequests,onApprove:e.onApproveJoinRequest,onDeny:e.onDenyJoinRequest}),o(fG,{mount:e.discoveredListMount,rows:e.discoveredRows,onInspectConflict:e.onInspectConflict,onRemoveConflict:e.onRemoveConflict,onReview:e.onReviewDiscoveredDevice})]})}function fC(e){e&&(e.textContent="")}function Nl(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 hG(){return typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}function Vo(){return hG()?"auto":"smooth"}var fm="syncTeamActionsMount",gG="Approval sent for this device. This screen may take up to 30 seconds to confirm two-way trust.";function vG(e,t,n=!1){return e.length>1&&(!t||n)}function yG(e,t,n){e.hidden=!1,e.textContent=n.badgeLabel,t.textContent=n.meta,n.state==="healthy"?e.className="sync-online-badge":n.state==="disabled"||n.state==="pending-setup"||n.state==="not-enrolled"||n.state==="reachable"?e.className="sync-online-badge sync-online-offline":e.className="sync-online-badge sync-online-error"}function bG(e,t){const n=document.createElement("div");n.id=fm,e.appendChild(n),mt(n,g(pC,{actionItems:[],actionableCount:0,discoveredListMount:null,discoveredRows:[],joinRequestsMount:null,onApproveJoinRequest:async()=>null,onAttentionAction:async()=>{},onDenyJoinRequest:async()=>null,onInspectConflict:()=>{},onRemoveConflict:async()=>null,onReviewDiscoveredDevice:async()=>null,pendingJoinRequests:[],presenceStatus:"unknown",primaryStatus:t}))}function mC(e,t){const n=document.getElementById(fm);n&&(da(n),n.remove()),fC(e),t.forEach(r=>{fC(r)})}function Ko(){const e=document.getElementById("syncTeamMeta"),t=document.getElementById("syncSetupPanel"),n=document.getElementById("syncTeamActions");if(!e||!t||!n)return;dm(),kl(),um(),Il(),tG();const r=document.getElementById("syncInvitePanel"),i=document.getElementById("syncAdminSection"),a=document.getElementById("syncJoinPanel"),s=document.getElementById("syncJoinSection"),c=document.getElementById("syncJoinRequests"),l=document.getElementById("syncCoordinatorDiscovered"),d=document.getElementById("syncCoordinatorDiscoveredMeta"),u=document.getElementById("syncCoordinatorDiscoveredList");wr("syncTeamSkeleton"),nG();const p=S.lastSyncCoordinator,f=S.lastSyncViewModel||{primaryStatus:VS({status:S.lastSyncStatus,coordinator:p,peers:S.lastSyncPeers,shareOperations:S.lastShareOperations,shareOperationsLoadError:S.shareOperationsLoadError}),summary:{connectedDeviceCount:0,seenOnTeamCount:0,offlineTeamDeviceCount:0},duplicatePeople:[],attentionItems:[]},m=E=>{if(E.kind==="possible-duplicate-person"){const G=document.getElementById("syncActorsList");G instanceof HTMLElement&&(G.scrollIntoView({block:"center",behavior:Vo()}),Nl(G));return}const C=String(E.deviceId||"").trim();if(!C)return;if(E.kind==="name-device"){const G=document.querySelector(`[data-device-name-input="${CSS.escape(C)}"]`);if(G instanceof HTMLInputElement){G.scrollIntoView({block:"center",behavior:Vo()}),G.focus(),G.select(),Nl(G);return}}const O=document.querySelector(`[data-peer-device-id="${CSS.escape(C)}"]`);if(O instanceof HTMLElement){O.scrollIntoView({block:"center",behavior:Vo()}),Nl(O);return}const H=document.querySelector(`[data-discovered-device-id="${CSS.escape(C)}"]`);H instanceof HTMLElement&&(H.scrollIntoView({block:"center",behavior:Vo()}),Nl(H))},v=async E=>{const C=Array.isArray(E.actorIds)?E.actorIds.map(Z=>String(Z||"").trim()).filter(Boolean):[],O=(Array.isArray(S.lastSyncActors)?S.lastSyncActors:[]).filter(Z=>C.includes(String(Z?.actor_id||"").trim()));if(O.length<2){X("This duplicate review is outdated. Refresh the card and review the remaining people entries.","warning");return}const H=await IL({title:"Review possible duplicate people",summary:E.title.replace(/^Possible duplicate person:\s*/,""),actors:O.map(Z=>({actorId:String(Z?.actor_id||""),label:String(Z?.display_name||Z?.actor_id||"Unknown person"),isLocal:!!Z?.is_local}))});if(H.action==="different-people"){e2(C,"different-people"),X("Okay. I will keep these people separate on this device."),await _n.loadSyncData();return}if(H.action!=="merge")return;const G=O.find(Z=>String(Z?.actor_id||"")===H.primaryActorId),ee=O.find(Z=>String(Z?.actor_id||"")===H.secondaryActorId);if(!G?.actor_id||!ee?.actor_id){X("Could not determine which people to combine. Refresh People & devices and try the review again.","warning");return}try{await fh(String(G.actor_id),String(ee.actor_id)),t2(C),X(`Combined duplicate people into ${String(G.display_name||G.actor_id)}.`),await _n.loadSyncData()}catch(Z){try{await _n.loadSyncData()}catch{}X(_t(Z,"Failed to combine these people."),"warning")}},b=async E=>await Tp({title:"Pair with this device",description:"Choose a friendly name for this device before pairing it on this machine.",initialValue:E,placeholder:"Desk Mini",confirmLabel:"Pair",cancelLabel:"Cancel",validate:C=>C.trim()?null:"Enter a device name to pair this device."}),h=!!p?.configured,y=GU(p);e.title=h?String(p.coordinator_url||"").trim():"";const w=document.getElementById("syncOnlineBadge");if(w?yG(w,e,f.primaryStatus):e.textContent=f.primaryStatus.meta,!h){mC(n,[c,u]),t.hidden=!1,n.hidden=!1,bG(n,f.primaryStatus),c&&(c.hidden=!0),l&&(l.hidden=!0);return}t.hidden=!0,n.hidden=!1;const _=String(p.presence_status||""),R=Array.isArray(S.lastSyncPeers)?S.lastSyncPeers:[],I=Array.isArray(f.attentionItems)?f.attentionItems:[],T=Array.isArray(p.discovered_devices)?p.discovered_devices:[],A=String(p.coordinator_url||"").trim(),L=T.map(E=>{const C=String(E.device_id||"").trim(),O=String(E.display_name||"").trim(),H=MS({coordinatorName:O,deviceId:C})||"Discovered device",G=C&&H!==C?C:null,ee=String(E.fingerprint||"").trim(),Z=String(E.incoming_reciprocal_request_id||"").trim(),ie=Array.isArray(E.groups)?E.groups.map(Je=>String(Je||"").trim()).filter(Boolean):[],fe=R.find(Je=>String(Je?.peer_device_id||"")===C),Ce=vG(ie,!!fe,E.needs_local_approval===!0),Pe=$S({device:E,pairedLocally:!!fe}),Ne=String(fe?.fingerprint||"").trim(),ce=!!fe&&!!ee&&!!Ne&&Ne!==ee,me=S.pendingCoordinatorApprovalsByDeviceId.get(C),J=E.needs_local_approval===!0&&me?.coordinatorUrl===A&&me?.incomingRequestId===Z,se=J?"approval-pending":E.needs_local_approval===!0?"needs-local-approval":"not-required",ye=!J&&!y&&dU({device:E,hasAmbiguousCoordinatorGroup:Ce,pairedLocally:!!fe}),le=Array.isArray(E.addresses)?E.addresses:[],Ee=Number(E.address_count??0),re=Number.isFinite(Ee)&&Ee>0?Ee:0,Q=[le.length?le.map(Je=>za()?ZS(String(Je||"")):String(Je||"")).filter(Boolean).join(" · "):re>0?`${re} ${E.stale?"last-known":"fresh"} ${re===1?"address":"addresses"} hidden`:"No fresh addresses"];!le.length&&G&&Q.push(`device id: ${C}`);let we=null,ae=ye?"accept":"none",Fe=null;return ce?ae="conflict":J?(we="Waiting for refreshed coordinator status. You do not need to approve again.",ae="approval-pending"):y&&(!fe||Pe.state==="needs-your-approval")?(we=y.message,ae="setup-blocked"):Ce?(we="This device appears in multiple coordinator groups. Review legacy Team/Space setup before approving it here.",ae="ambiguous"):fe&&Yf(C)?(we="Review this device's legacy Space access and advanced rules in Coordinator Administration before you sync it.",ae="scope-pending"):fe?.last_error?(Q.push(`error: ${String(fe.last_error)}`),ye||(ae="paired")):fe?.status?.peer_state?(Q.push(`status: ${String(fe.status.peer_state)}`),ye||(ae="paired")):!fe&&E.stale?(we="Wait for a fresh coordinator presence update, then review this device again here.",ae="stale"):fe&&!ye&&(ae="paired"),ae==="paired"&&(Fe=Pe.state==="waiting-for-other-device"?Pe.description||"Waiting on the other device.":String(fe?.last_error||"").toLowerCase().includes("401")&&String(fe?.last_error||"").toLowerCase().includes("unauthorized")?"Waiting for the other device to trust this one before sync can work.":null),{actionMessage:we,actionLabel:Pe.actionLabel||(fe?"Review device":"Pair with this device"),approvalBadgeLabel:J?"Approval sent":Pe.badgeLabel,approvalState:se,availabilityLabel:E.stale?"Offline":"Available",connectionLabel:ce?zS.conflicts:fe?zS.pairedLocally:"Not connected on this device",coordinatorUrl:A,deviceId:C,displayName:H,displayTitle:G,fingerprint:ee,groupId:ie[0]??"",incomingRequestId:Z,mode:ae,note:Q.join(" · "),pairedMessage:Fe}}),F=new Set(L.filter(E=>E.approvalState==="approval-pending").map(E=>E.deviceId)),N=I.filter(E=>!E.deviceId||!F.has(E.deviceId)),j=[],x=L.filter(E=>E.mode!=="paired"&&E.mode!=="none"&&E.mode!=="scope-pending"),U=L.filter(E=>E.mode==="accept"||E.mode==="scope-pending").length,q=N.length+j.length+U;l&&(l.hidden=x.length===0&&!S.syncDiscoveredFeedback),d&&(d.textContent=x.length?"Pair with a teammate's device to see it appear in People & devices and start syncing.":""),c&&(c.hidden=j.length===0&&!S.syncJoinRequestsFeedback),mC(n,[c,u]);const $=document.createElement("div");$.id=fm,n.appendChild($),mt($,g(pC,{actionItems:N,actionableCount:q,children:g(sG,{invitePanel:r,invitePanelOpen:Kf,inviteRestoreParent:i,joinPanel:a,joinPanelOpen:zf,joinRestoreParent:s,onToggleInvitePanel:()=>{r&&(zU(!Kf),Ko())},onToggleJoinPanel:()=>{a&&(WU(!zf),Ko())},pairedPeerCount:Number(p.paired_peer_count||0),presenceStatus:_}),discoveredListMount:u,discoveredRows:x,joinRequestsMount:c,onApproveJoinRequest:async()=>null,onAttentionAction:async E=>{if(E.kind==="possible-duplicate-person"){await v(E);return}m(E)},onDenyJoinRequest:async()=>null,onInspectConflict:E=>{const C=document.querySelector(`[data-peer-device-id="${CSS.escape(E.deviceId)}"]`);if(C instanceof HTMLElement){C.scrollIntoView({block:"center",behavior:Vo()}),X(`Opened the conflicting local device record for ${E.displayName}.`,"warning");return}X("The conflicting local device record is not visible yet. Scroll to People & devices and try again.","warning")},onRemoveConflict:async E=>{if(!await vn({title:`Remove ${E.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 Xm(E.deviceId);const C={message:`Removed the broken local device record for ${E.displayName}. If it is still available, review it again from Next steps or Devices seen on team.`,tone:"success"};return S.syncDiscoveredFeedback=C,await _n.loadSyncData(),C}catch(C){return{message:_t(C,"Failed to remove the broken local device record. The old local record is still present in People & devices."),tone:"warning"}}},onReviewDiscoveredDevice:async E=>{try{const C=await b(E.displayName);return C?await _G(E,C):null}catch(C){return{message:_t(C,"Failed to review this device. Wait for a fresh presence update and try again."),tone:"warning"}}},pendingJoinRequests:j,presenceStatus:_,primaryStatus:f.primaryStatus}))}async function _G(e,t){const n=e.approvalState==="needs-local-approval",r=e.deviceId.trim(),i=e.coordinatorUrl.trim(),a=e.groupId.trim(),s=e.incomingRequestId.trim();if(n&&(!r||!i||!a||!s))throw new Error("Device identity is incomplete. Refresh the screen and try approval again.");const c=await QR(e.deviceId,{fingerprint:e.fingerprint,expectedGroupId:a||void 0,expectedIncomingRequestId:n?s:void 0}),l=String(c?.name||e.displayName||"").trim()||e.displayName;n&&S.pendingCoordinatorApprovalsByDeviceId.set(r,{coordinatorUrl:i,incomingRequestId:s});const d=Array.isArray(S.pendingAcceptedSyncPeers)?S.pendingAcceptedSyncPeers.filter(p=>String(p?.peer_device_id||"").trim()!==e.deviceId):[];S.pendingAcceptedSyncPeers=[...d,{peer_device_id:e.deviceId,name:l,fingerprint:e.fingerprint,addresses:[],claimed_local_actor:!1,status:{peer_state:"degraded"},last_error:"Waiting for the other device to approve this one."}],YU(e.deviceId);let u=n?{message:gG,tone:"success"}:{message:`Step 1 complete on this device for ${e.displayName}. Finish onboarding on the other device so both sides trust each other for sync.`,tone:"success"};S.syncDiscoveredFeedback=u,n&&Ko();try{t.trim()!==l.trim()&&(await Qm(e.deviceId,t.trim()),S.pendingAcceptedSyncPeers=S.pendingAcceptedSyncPeers.map(p=>String(p?.peer_device_id||"").trim()===e.deviceId?{...p,name:t.trim()}:p),n||(u={message:`Connected ${t.trim()} and saved its name.`,tone:"success"}))}catch(p){u={message:n?"Approval was sent, but naming did not finish. You do not need to approve again.":_t(p,"Device connected, but naming did not finish."),tone:"warning"}}S.syncDiscoveredFeedback=u;try{await _n.loadSyncData()}catch(p){u={message:n?"Approval was sent. Confirmation may take up to 30 seconds, and you do not need to approve again.":_t(p,"Device connected, but the screen did not refresh yet. Refresh this page before trying the next step."),tone:"warning"},S.syncDiscoveredFeedback=u}return u}function wG(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 ma(e){const t=e.displayProject.toLowerCase();return t.includes("fatal:")||t.includes("not a git repository")||t==="unknown project"||e.identitySource==="unmapped"}function hC(e){return ma(e)?"Unclear project identity":e.displayProject}function Kt(e){return(e.reassignableMemoryCount??e.memoryCount)>0}function SG(e,t){return e.suggestedScopeId?` · suggested ${t.find(n=>n.scopeId===e.suggestedScopeId)?.label||"Space"}`:""}function CG(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function RG(e,t){return t.find(n=>n.scopeId===e)?.label||"selected Space"}function IG(e){switch(e){case"coordinator":return"Team Space";case"local":return"Local Space";default:return"Other Space"}}function kG(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 TG(e){return e.gitRemote?e.gitRemote:e.cwd?e.cwd:e.project?e.project:"source identity unavailable"}function PG({group:e}){const t=e.memorySamples??[],n=t.length;return o("details",{className:"legacy-review-samples",children:[o("summary",{children:["Inspect affected memories",n?` (${n} sample${n===1?"":"s"})`:""]}),o("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?o("ul",{className:"legacy-review-sample-list",children:t.map(r=>o("li",{className:"legacy-review-sample",children:[o("div",{className:"legacy-review-sample-title",children:r.title}),o("div",{className:"legacy-review-group-meta",children:[r.kind||"memory"," · ",kG(r.updatedAt??r.createdAt)," ","·"," ",r.ownership==="local"?"local, reassignable":"peer-owned, stays in review"]}),r.bodyPreview?o("div",{className:"legacy-review-sample-body",children:r.bodyPreview}):null,o("div",{className:"legacy-review-group-meta mono",children:TG(r)})]},r.id))}):o("div",{className:"legacy-review-cleanup-note",children:"No samples are available for this group. Refresh Sync and try again before reassigning."})]})}function gC(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${CG(t)}\\b`,"g"),RG(t,n))),r}function NG(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 EG({item:e,onReview:t}){return o("div",{className:"actor-row",children:[o("div",{className:"actor-details",children:[o("div",{className:"actor-title",children:[o("strong",{children:e.peerName}),o("span",{className:"badge actor-badge",children:["person: ",e.actorDisplayName||e.actorId]})]}),o("div",{className:"peer-meta",children:[e.shareableCount," share by default · ",e.privateCount," marked Only me ·"," ",e.scopeLabel]})]}),o("div",{className:"actor-actions",children:o("button",{type:"button",className:"settings-button",onClick:t,children:"Review my memories in Feed"})})]})}function AG({item:e,onReassign:t,onReview:n}){const r=e.groups??[],i=e.targetScopes??[],a=Object.fromEntries(r.map(C=>[C.workspaceIdentity,C.suggestedScopeId??""])),[s,c]=D({}),[l,d]=D({}),[u,p]=D(a),[f,m]=D({}),[v,b]=D("all"),[h,y]=D(""),[w,_]=D(null),R=r.length,I=e.totalGroupCount??R,T=r.filter(ma).length,A=r.filter(C=>C.suggestedScopeId&&!ma(C)&&Kt(C)).length,L=r.filter(C=>f[C.workspaceIdentity]&&Kt(C)).length,F=r.filter(C=>f[C.workspaceIdentity]&&Kt(C)&&!!u[C.workspaceIdentity]).length,N=r.filter(C=>{const O=ma(C);return v==="suggested"&&(!C.suggestedScopeId||O)||v==="cleanup"&&!O||v==="no-suggestion"&&(C.suggestedScopeId||O)||v==="selected"&&!f[C.workspaceIdentity]?!1:!h.trim()||NG(C,i).includes(h.trim().toLowerCase())});async function j(C){const O=u[C.workspaceIdentity]||C.suggestedScopeId||"";if(!(!O||!t||w)){_(C.workspaceIdentity),d(H=>{const G={...H};return delete G[C.workspaceIdentity],G});try{const H=await t(C,O,!!s[C.workspaceIdentity],s[C.workspaceIdentity]?.confirmation_token);c(H?G=>({...G,[C.workspaceIdentity]:H}):G=>{const ee={...G};return delete ee[C.workspaceIdentity],ee})}catch(H){d(G=>({...G,[C.workspaceIdentity]:gC(H,O,i)}))}finally{_(null)}}}function x(C,O){p(H=>({...H,[C.workspaceIdentity]:O})),c(H=>{const G={...H};return delete G[C.workspaceIdentity],G}),d(H=>{const G={...H};return delete G[C.workspaceIdentity],G})}function U(C,O){m(H=>({...H,[C.workspaceIdentity]:O}))}function q(C){m(O=>({...O,...Object.fromEntries(N.filter(Kt).map(H=>[H.workspaceIdentity,C]))}))}function $(){m(C=>({...C,...Object.fromEntries(r.filter(O=>O.suggestedScopeId&&!ma(O)&&Kt(O)).map(O=>[O.workspaceIdentity,!0]))}))}async function E(){if(!t||w||F===0)return;const C=r.filter(O=>f[O.workspaceIdentity]&&Kt(O)&&!!u[O.workspaceIdentity]);if(!C.every(O=>s[O.workspaceIdentity])){_("bulk");try{for(const O of C){if(s[O.workspaceIdentity])continue;const H=u[O.workspaceIdentity]||O.suggestedScopeId||"";if(H)try{const G=await t(O,H,!1);d(ee=>{const Z={...ee};return delete Z[O.workspaceIdentity],Z}),G&&c(ee=>({...ee,[O.workspaceIdentity]:G}))}catch(G){d(ee=>({...ee,[O.workspaceIdentity]:gC(G,H,i)}))}}}finally{_(null)}}}return o("div",{className:"legacy-review-card",children:[o("div",{className:"legacy-review-header",children:[o("div",{children:[o("div",{className:"actor-title",children:[o("strong",{children:"Legacy shared review"}),o("span",{className:"badge badge-offline",children:"Needs project review"})]}),o("div",{className:"peer-meta legacy-review-summary",children:[I.toLocaleString()," older"," ",I===1?"project needs":"projects need"," a Space. They contain"," ",e.memoryCount.toLocaleString()," older shared memories total; review the projects, not individual memories.",R<I?` Showing ${R.toLocaleString()} projects; open Projects to review the rest.`:""]}),o("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."})]}),o("div",{className:"actor-actions",children:o("button",{type:"button",className:"settings-button",onClick:n,children:"Manage all projects"})})]}),o("div",{className:"legacy-review-toolbar",children:[o("div",{className:"legacy-review-filter-row",children:[["all",`Showing ${R.toLocaleString()}`],["suggested",`Suggested ${A.toLocaleString()}`],["cleanup",`Needs cleanup ${T.toLocaleString()}`],["no-suggestion","No suggestion"],["selected",`Selected ${F.toLocaleString()}`]].map(([C,O])=>o("button",{className:v===C?"settings-button legacy-filter active":"settings-button legacy-filter",onClick:()=>b(C),type:"button",children:O},C))}),o("div",{className:"legacy-review-bulk-row",children:[o("input",{"aria-label":"Search legacy project groups",className:"peer-scope-input legacy-review-search",onInput:C=>y(C.currentTarget.value),placeholder:"Search project, signal, or destination…",value:h}),o("button",{className:"settings-button",onClick:()=>q(!0),type:"button",children:"Select visible"}),o("button",{className:"settings-button",onClick:$,type:"button",children:"Select suggested"}),o("button",{className:"settings-button",onClick:()=>q(!1),type:"button",children:"Clear visible"}),t&&i.length>0?o("button",{className:"settings-save",disabled:w!=null||F===0||r.filter(C=>f[C.workspaceIdentity]&&Kt(C)&&!!u[C.workspaceIdentity]).every(C=>s[C.workspaceIdentity]),onClick:()=>{E()},type:"button",children:w==="bulk"?"Previewing…":`Preview ${F.toLocaleString()} selected`}):t&&L>0?o("span",{className:"legacy-review-cleanup-note",children:"Add or join a Space before bulk reassignment."}):null,F>0&&r.filter(C=>f[C.workspaceIdentity]&&Kt(C)&&!!u[C.workspaceIdentity]).every(C=>s[C.workspaceIdentity])?o("span",{className:"legacy-review-cleanup-note",children:"Bulk actions only preview. Confirm each project individually to avoid partial reassignment."}):null]})]}),r.length>0?o("ul",{className:"legacy-review-groups","aria-label":"Legacy shared review project groups",children:N.map(C=>o("li",{className:"legacy-review-group",children:[o("div",{className:"legacy-review-group-main",children:[o("div",{className:"legacy-review-title-wrap",children:[o("input",{"aria-label":`Select ${hC(C)}`,checked:!!f[C.workspaceIdentity],className:"cm-checkbox",disabled:!Kt(C),onChange:O=>U(C,O.currentTarget.checked),type:"checkbox"}),o("div",{children:[o("div",{className:"legacy-review-group-title",children:hC(C)}),o("div",{className:"legacy-review-group-meta",children:[wG(C.identitySource),SG(C,i)]}),Kt(C)?C.peerOwnedMemoryCount?o("div",{className:"legacy-review-cleanup-note",children:[(C.reassignableMemoryCount??C.memoryCount).toLocaleString()," ","local memor",(C.reassignableMemoryCount??C.memoryCount)===1?"y":"ies"," ","can be reassigned; ",C.peerOwnedMemoryCount.toLocaleString()," peer-owned memor",C.peerOwnedMemoryCount===1?"y":"ies"," will stay in review."]}):null:o("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."}),ma(C)?o("div",{className:"legacy-review-cleanup-note",children:"Inspect or correct the project identity before assigning old shared data to a Space."}):null]})]}),o("span",{className:"legacy-review-count",children:[C.memoryCount.toLocaleString()," memor",C.memoryCount===1?"y":"ies"]})]}),C.suggestionReason?o("div",{className:"legacy-review-reason",children:C.suggestionReason}):null,l[C.workspaceIdentity]?o("div",{className:"legacy-review-confirmation",role:"alert",children:l[C.workspaceIdentity]}):null,s[C.workspaceIdentity]?o("div",{className:"legacy-review-confirmation",role:"alert",children:[s[C.workspaceIdentity].warning," This will reassign"," ",s[C.workspaceIdentity].reassignable_memory_count.toLocaleString()," of"," ",s[C.workspaceIdentity].memory_count.toLocaleString()," memories",s[C.workspaceIdentity].skipped_memory_count?`; ${s[C.workspaceIdentity].skipped_memory_count.toLocaleString()} peer-owned copies will be left unchanged`:"","."]}):null,o(PG,{group:C}),i.length>0&&t&&Kt(C)?o("label",{className:"legacy-review-target",children:[o("span",{children:"Destination Space"}),o("select",{className:"peer-scope-input",disabled:w!=null,onChange:O=>x(C,O.currentTarget.value),value:u[C.workspaceIdentity]||"",children:[o("option",{value:"",children:"Choose Space…"}),i.map(O=>o("option",{value:O.scopeId,children:[O.label," · ",IG(O.authorityType),O.scopeId===C.suggestedScopeId?" · suggested":""]},O.scopeId))]})]}):null,i.length>0&&t&&Kt(C)?o("div",{className:"legacy-review-actions",children:o("button",{type:"button",className:"settings-button",disabled:w!=null||!u[C.workspaceIdentity],onClick:()=>{j(C)},children:w===C.workspaceIdentity?s[C.workspaceIdentity]?"Reassigning…":"Previewing…":s[C.workspaceIdentity]?"I understand, reassign memories":"Preview reassignment"})}):null]},C.workspaceIdentity))}):null]})}function xG({items:e,legacyReview:t,onLegacyReassign:n,onLegacyReview:r,onReview:i}){return o(z,{children:[t?o(AG,{item:t,onReassign:n,onReview:r??i}):null,e.map(a=>o(EG,{item:a,onReview:i},`${a.peerName}:${a.actorId}:${a.scopeLabel}`))]})}function DG(){Iy("mine"),S.feedQuery="",window.location.hash="feed"}function LG(){window.location.hash="projects"}async function $G(e,t,n,r){try{const i=await jI({...r?{confirmation_token:r}:{},confirmed_old_copies:n,scope_id:t,workspace_identity:e.workspaceIdentity});return S.lastSyncLegacySharedReview=i.legacy_shared_review??null,X(`Reassigned ${i.reassigned_memory_count.toLocaleString()} legacy review memor${i.reassigned_memory_count===1?"y":"ies"} to ${i.target_scope_label}.`),vC(),null}catch(i){if(i instanceof eh)return i.preview;const a=i instanceof Error?i.message:"Unable to reassign legacy review memories.";throw X(a,"warning"),new Error(a)}}function vC(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewMeta"),n=document.getElementById("syncSharingReviewList");if(!e||!t||!n)return;const r=e.querySelector(".settings-group-title"),i=Array.isArray(S.lastSyncSharingReview)?S.lastSyncSharingReview:[],a=S.lastSyncLegacySharedReview,s=Math.max(0,Number(a?.memory_count??0)),c=a?.has_data?{groups:Array.isArray(a.groups)?a.groups.map(u=>{const p=u;return{displayProject:String(p.display_project||p.project||"Unknown project"),identitySource:String(p.identity_source||"unknown"),lastUpdatedAt:typeof p.last_updated_at=="string"?p.last_updated_at:null,memoryCount:Number(p.memory_count||0),memorySamples:Array.isArray(p.memory_samples)?p.memory_samples.map(f=>{const m=f,v=m.ownership==="peer"?"peer":"local";return{bodyPreview:typeof m.body_preview=="string"?m.body_preview:null,createdAt:typeof m.created_at=="string"?m.created_at:null,cwd:typeof m.cwd=="string"?m.cwd:null,gitRemote:typeof m.git_remote=="string"?m.git_remote:null,id:Number(m.id||0),kind:typeof m.kind=="string"?m.kind:null,ownership:v,project:typeof m.project=="string"?m.project:null,title:String(m.title||`Memory ${Number(m.id||0)}`),updatedAt:typeof m.updated_at=="string"?m.updated_at:null}}):[],peerOwnedMemoryCount:Number(p.peer_owned_memory_count||0),reassignableMemoryCount:Number(p.reassignable_memory_count||0),suggestedScopeId:typeof p.suggested_scope_id=="string"?p.suggested_scope_id:null,suggestionReason:typeof p.suggestion_reason=="string"?p.suggestion_reason:null,workspaceIdentity:String(p.workspace_identity||p.display_project||"unknown")}}):[],memoryCount:s,scopeId:String(a.scope_id||"legacy-shared-review"),totalGroupCount:Number(a.total_group_count||a.groups?.length||0),targetScopes:Array.isArray(a.target_scopes)?a.target_scopes.map(u=>{const p=u;return{authorityType:String(p.authority_type||"unknown"),label:String(p.label||p.scope_id||"Unknown domain"),scopeId:String(p.scope_id||"")}}).filter(u=>u.scopeId):[]}:null;if(!i.length&&!c){da(n),e.hidden=!0;return}e.hidden=!1,r&&(r.textContent=c?"Sharing review":"What teammates will receive");const l=S.currentProject?`current project (${S.currentProject})`:"all allowed projects";t.textContent=c?`Review conservative upgrade state before promoting historical shared data. Teammates receive memories from ${l} by default once Sharing-domain grants allow it.`:`Teammates receive memories from ${l} by default. Use Only me on a memory when it should stay local.`;const d=i.map(u=>({actorDisplayName:String(u.actor_display_name||u.actor_id||"unknown"),actorId:String(u.actor_id||"unknown"),peerName:String(u.peer_name||u.peer_device_id||"Device"),privateCount:Number(u.private_count||0),scopeLabel:String(u.scope_label||"All allowed projects"),shareableCount:Number(u.shareable_count||0)}));mt(n,g(xG,{items:d,legacyReview:c,onLegacyReassign:$G,onLegacyReview:LG,onReview:DG}))}var El="";function jG(e){if(!e)return;const t=String(e?.coordinator_url||"").trim(),n=!!(e.lookup_error||e.reciprocal_approval_error),r=Array.isArray(e?.discovered_devices)?e.discovered_devices:[],i=new Map;for(const a of r){const s=String(a.device_id||"").trim();s&&i.set(s,[...i.get(s)||[],a])}for(const[a,s]of S.pendingCoordinatorApprovalsByDeviceId){if(s.coordinatorUrl!==t){S.pendingCoordinatorApprovalsByDeviceId.delete(a);continue}if(n)continue;const c=i.get(a);c&&(c.some(l=>String(l.incoming_reciprocal_request_id||"").trim()===s.incomingRequestId&&l.needs_local_approval===!0)||S.pendingCoordinatorApprovalsByDeviceId.delete(a))}}function OG(){return[...S.pendingCoordinatorApprovalsByDeviceId].map(([e,t])=>[e,t.coordinatorUrl,t.incomingRequestId]).sort(([e],[t])=>e.localeCompare(t))}var zo=null,mm=0,hm=null,gm=0,vm=null,MG=15e3;function yC(e){return`project:${e||""}|includeJoinRequests:false`}function FG(e){const t=yC(e);return!zo||zo.key!==t||Date.now()>=zo.expiresAtMs?null:zo.payload}function BG(e,t){zo={key:yC(e),expiresAtMs:Date.now()+MG,payload:t}}function qG(e){return!e||typeof e!="object"?e:{...e,join_requests:[]}}function UG(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewList"),n=document.getElementById("syncSharingReviewMeta"),r=document.getElementById("syncLegacyClaims"),i=document.getElementById("syncLegacyClaimsMeta");e&&(e.hidden=!0),t&&(t.textContent=""),n&&(n.textContent=""),r&&(r.hidden=!0),i&&(i.textContent="")}async function GG(e,t){if(S.activeTab==="health"&&!t.requireFreshSyncStatus){const r=FG(e);if(r)return{payload:r,fetchedFreshSyncStatus:!1}}const n=!za();return{payload:await Jl(n,e,{includeJoinRequests:!1,signal:t.signal}),fetchedFreshSyncStatus:!0}}function HG(e){return e.requiredSurface!=="all"?!0:e.actorLoadError||e.coordinatorAdminLoadError||e.shareOperationsLoadError?!1:!e.requiresDeviceIdentityInventory||!e.deviceIdentityInventoryLoadError}async function VG(e){const t=ZU();let n=null,r=null,i=S.lastDeviceIdentityInventory,a=S.lastShareOperations,s=!1,c=!1,l=S.deviceIdentityInventoryLoadError,d=!1;try{n=await YR({signal:e.signal})}catch{s=!0}try{r=await Kl({signal:e.signal})}catch{c=!0}if(S.activeTab==="advanced"){l=!1;try{i=await td({signal:e.signal})}catch{l=!0}}try{const u=await ph({signal:e.signal});a=Array.isArray(u.items)?u.items:[]}catch{d=!0}return{actorsPayload:n,coordinatorAdminStatus:r,deviceIdentityInventory:i,shareOperations:a,actorLoadError:s,coordinatorAdminLoadError:c,deviceIdentityInventoryLoadError:l,shareOperationsLoadError:d,duplicatePersonDecisions:t}}function Al(e={}){const t=KG(++mm,{requiredSurface:e.requiredSurface??"all",requireFreshSyncStatus:e.requireFreshSyncStatus??!1,signal:e.signal});return hm=t,t}async function KG(e,t){try{const n=S.currentProject||"",{payload:r,fetchedFreshSyncStatus:i}=await GG(n,t);if(t.signal?.aborted)return!1;const{actorsPayload:a,coordinatorAdminStatus:s,deviceIdentityInventory:c,shareOperations:l,actorLoadError:d,coordinatorAdminLoadError:u,deviceIdentityInventoryLoadError:p,shareOperationsLoadError:f,duplicatePersonDecisions:m}=await VG(t);if(e!==mm)return hm??!1;if(t.signal?.aborted)return!1;const v=HG({requiredSurface:t.requiredSurface,actorLoadError:d,coordinatorAdminLoadError:u,shareOperationsLoadError:f,requiresDeviceIdentityInventory:S.activeTab==="advanced",deviceIdentityInventoryLoadError:p});i&&BG(n,qG(r)),jG(r.coordinator);const b=JSON.stringify([r,a,s,c,p,l,f,m,OG()]);if(b===El)return v;El=b;const h=r.status&&typeof r.status=="object"?r.status:null;h&&(S.lastSyncStatus=h),Array.isArray(a?.items)?S.lastSyncActors=a.items:S.lastSyncActors=[];const y=Array.isArray(r.peers)?r.peers:[],w=new Set(y.map(R=>String(R?.peer_device_id||"").trim()).filter(Boolean)),_=Array.isArray(S.pendingAcceptedSyncPeers)?S.pendingAcceptedSyncPeers.filter(R=>{const I=String(R?.peer_device_id||"").trim();return I&&!w.has(I)}):[];return S.pendingAcceptedSyncPeers=_,S.lastSyncPeers=[...y,..._],p||(S.lastDeviceIdentityInventory=c),S.deviceIdentityInventoryLoadError=p,S.lastShareOperations=l,S.shareOperationsLoadError=f,S.lastSyncSharingReview=r.sharing_review||[],S.lastSyncLegacySharedReview=r.legacy_shared_review&&typeof r.legacy_shared_review=="object"?r.legacy_shared_review:null,S.lastSyncCoordinator=r.coordinator||null,S.lastSyncCoordinatorAdminStatus=s&&typeof s=="object"?s:null,S.lastSyncJoinRequests=Array.isArray(r.join_requests)?r.join_requests:[],S.lastSyncAttempts=r.attempts||[],S.lastSyncLegacyDevices=r.legacy_devices||[],S.lastSyncDuplicatePersonDecisions=m,S.lastSyncViewModel=VU({actors:S.lastSyncActors,peers:S.lastSyncPeers,coordinator:S.lastSyncCoordinator,status:h,shareOperations:S.lastShareOperations,shareOperationsLoadError:f,reconciliation:r.recipient_policy_reconciliation,duplicatePersonDecisions:S.lastSyncDuplicatePersonDecisions}),rC(),Ko(),K2(),W2(),vC(),cm(),dC(),nC(),zG(),d&&z2(),u&&(S.lastSyncCoordinatorAdminStatus=null,Ko()),v}catch{return t.signal?.aborted?!1:e!==mm?hm??!1:(El="",S.deviceIdentityInventoryLoadError=!0,wr("syncTeamSkeleton"),wr("syncActorsSkeleton"),wr("syncPeersSkeleton"),wr("syncDiagSkeleton"),UG(),J2(),c2(),!1)}}function zG(){if(S.activeTab==="health"){Pw();return}Tw()}function WG(){El="",S.lastSyncPeers?.length&&cm()}async function xl(){await Al()}function JG(e={}){const t=YG(++gm,e.signal);return vm=t,t}async function YG(e,t){try{const n=await XR(!1,{signal:t});return t?.aborted?!1:e!==gm?vm??!1:(S.pairingPayloadRaw=n||null,nm(),!0)}catch{return t?.aborted?!1:e!==gm?vm??!1:(S.pairingPayloadRaw=null,nm(),!1)}}function XG(e){Uq(),Pc(),Z2(xl),V2(xl),p2(cm),rG(e,xl),Y2(xl),f2(e),lm(),Q2()}function QG(e,t){const n=Qe("runtimeLabel");n&&(n.textContent=t?`v${e} (${t})`:`v${e}`,n.title=t?`codemem ${e} (${t})`:`codemem ${e}`,n.hidden=!1)}async function ZG(){try{const e=await NR();if(!e?.version)return;QG(e.version,"18b9611")}catch{}}var ym=null,bC=1500,Wo=XE(),_C="codemem-legacy-upgrade-notice-dismissed",Cr=null,an=!1,Dl=!1,bm=!1;function wC(e,t=0){const n=Number(e);return Number.isFinite(n)?Math.max(0,n):t}function SC(e){if(!e||typeof e!="object")return null;const t=e.legacy_shared_review??e;if(!t||typeof t!="object")return null;const n=t;if(n.has_data!==!0)return null;const r=Array.isArray(n.groups)?n.groups:[],i=wC(n.total_group_count,r.length),a=wC(n.memory_count);return i<=0||a<=0?null:{groupCount:i,memoryCount:a}}function CC(){try{return localStorage.getItem(_C)==="1"}catch{return!1}}function eH(){if(document.getElementById("legacyUpgradeDontShow")?.checked)try{localStorage.setItem(_C,"1")}catch{}}function tH(e,t){e&&t?nE(t):rE()}function RC(e){!e||bm||CC()||(bm=!0,Uv(()=>tH(!0,e)))}async function nH(){if(!(bm||CC()))try{RC(SC(await Jl(!1,"",{includeJoinRequests:!1})))}catch{}}function mi(e,t){const n=Qe("viewerReconnectOverlay"),r=Qe("viewerReconnectDetail");!n||!r||(n.hidden=!e,r.textContent=t||"Trying again automatically while the viewer comes back.")}async function _m(){try{return await PR(),!0}catch{return!1}}function wm(){return document.visibilityState!=="hidden"&&!IS()}function IC(){return`${S.activeTab}:${S.advancedSection}:${S.syncPairingOpen}`}function rH(e){S.refreshQueued||e.surface!==IC()||!e.refreshSucceeded||!Dl||an||(Dl=!1,au("connection_restored"))}function kC(){if(an)return;an=!0,Dl=!0,au("connection_lost"),Sm(),Uv(),Rr("error","(reconnecting)"),mi(!0,"The viewer server is restarting or temporarily unavailable. Trying again automatically…");const e=async()=>{if(await _m()){if(Cr&&(clearTimeout(Cr),Cr=null),an=!1,mi(!0,"Viewer responded. Restoring your session…"),wm()){Rr("refreshing"),Jo();try{await $l()}catch{}}else Rr("paused",document.visibilityState==="hidden"?"(tab hidden)":"(settings open)");an||mi(!1);return}mi(!0,"Still reconnecting… the viewer will recover automatically as soon as the server responds."),Cr=setTimeout(e,bC)};Cr=setTimeout(e,bC)}function Rr(e,t){S.refreshState=e;const n=Qe("refreshStatus");if(!n)return;n.dataset.refreshState=e;const r=a=>{const s=Qe("refreshAnnouncer");!s||ym===e||(s.textContent=a,ym=e)};if(e==="refreshing"){n.textContent="refreshing…";return}if(e==="paused"){n.textContent="paused",r("Auto refresh paused.");return}if(e==="error"&&t==="(reconnecting)"){n.textContent="reconnecting…",r("Viewer reconnecting.");return}if(e==="error"){n.textContent="refresh failed",r("Refresh failed.");return}const i=t?` ${t}`:"";n.textContent=`updated ${new Date().toLocaleTimeString()}${i}`,ym=null}function Sm(){Wo.cancel(),ha&&(clearTimeout(ha),ha=null),S.refreshQueued=!1,S.refreshTimer&&(clearInterval(S.refreshTimer),S.refreshTimer=null)}function iH(){Sm(),Rr("paused")}function Jo(){S.refreshTimer||(S.refreshTimer=setInterval(()=>Ir(),5e3))}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(Sm(),Rr("paused","(tab hidden)")):!IS()&&!an&&(Jo(),Ir())});function TC(){const e=S.advancedSection==="sync",t=Qe("advancedSyncContent"),n=Qe("advancedTeamsContent");t&&(t.hidden=!e),n&&(n.hidden=e);const r=Qe("advancedSyncButton"),i=Qe("advancedTeamsButton");r?.setAttribute("aria-pressed",String(e)),i?.setAttribute("aria-pressed",String(!e)),queueMicrotask(()=>{const a=window.location.hash.replace(/^#/,"");lm(a==="sync/diagnostics"||a==="advanced/sync/diagnostics"?"diagnostics":"main")})}var aH=pA();function PC(e){const t=new Set(tA(S.lastCoordinatorAdminStatus));qr.forEach(r=>{const i=Qe(`tab-${r}`);i&&(i.hidden=r!==e||!t.has(r))}),qr.forEach(r=>{const i=Qe(`tabBtn-${r}`);if(!i)return;i.hidden=!t.has(r);const a=r===e&&t.has(r);i.classList.toggle("active",a),a?i.setAttribute("aria-current","page"):i.removeAttribute("aria-current")});const n=Qe(`tabBtn-${e}`);n&&aH(n),TC()}function hi(e,t={}){Wo.cancel();const n=Ka(e,S.lastCoordinatorAdminStatus);n==="advanced"&&Tu(t.advancedSection??ku()??S.advancedSection),Ry(n,t.canonicalHash?{canonicalHash:!0}:{}),PC(n),Ir()}function oH(){qr.forEach(e=>{Qe(`tabBtn-${e}`)?.addEventListener("click",()=>hi(e,e==="advanced"?{canonicalHash:!0,advancedSection:"sync"}:{canonicalHash:!0}))}),Qe("advancedSyncButton")?.addEventListener("click",()=>Tu("sync",!0)),Qe("advancedTeamsButton")?.addEventListener("click",()=>{Tu("teams",!0),TC(),queueMicrotask(()=>document.getElementById("coordinatorAdminLegacyNoticeTitle")?.focus())}),Qe("coordinatorAdminOpenSharing")?.addEventListener("click",()=>{hi("sharing",{canonicalHash:!0}),queueMicrotask(()=>document.getElementById("tabBtn-sharing")?.focus())}),window.addEventListener("hashchange",()=>{const e=Iu();if(e){const t=ku();hi(e,t?{advancedSection:t}:{}),e==="advanced"&&t==="teams"&&queueMicrotask(()=>document.getElementById("coordinatorAdminLegacyNoticeTitle")?.focus())}}),hi(S.activeTab)}async function sH(){try{const e=await es();S.knownProjects=e,WG();const t=Cu("projectFilter");if(!t)return;t.textContent="";const n=document.createElement("option");n.value="",n.textContent="All Projects",t.appendChild(n),e.forEach(r=>{const i=document.createElement("option");i.value=r,i.textContent=r,t.appendChild(i)})}catch{}}function cH(e){S.pendingDeviceIdentityFocus=e?.trim()||null,hi("devices",{canonicalHash:!0})}var Ll=zP({},{onOpenTeamSetup:Kw,onReviewDevices:cH}),NC={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},Cm=0,Rm=null,zt=null;async function lH(e={}){const t=[];let n=0;for(;;){const r=await Sa({limit:250,offset:n,signal:e.signal});if(t.push(...r.projects),!r.has_more)break;n+=r.limit}return Ns(t)}function dH(){const e=new Map,t={unknown:0,offline:1,available:2},n=(r,i)=>{!r||t[i]<=t[e.get(r)??"unknown"]||e.set(r,i)};for(const r of S.lastSyncCoordinator?.discovered_devices??[])n(String(r.device_id??"").trim(),r.stale?"offline":"available");for(const r of S.lastSyncPeers){const i=String(r.peer_device_id??"").trim(),a=Go(r);n(i,a==="connected"||a==="available"?"available":a==="offline"?"offline":"unknown")}return[...e].map(([r,i])=>({deviceId:r,state:i}))}function uH(){return S.lastSyncPeers.flatMap(e=>{const t=String(e.peer_device_id??"").trim();return t?[{deviceId:t,runtimeVersion:e.runtime_version??null,runtimeVersionObservedAt:e.runtime_version_observed_at??null}]:[]})}function EC(e){if(e==="advanced_sync"){hi("advanced",{advancedSection:"sync"}),queueMicrotask(()=>document.getElementById("tabBtn-advanced")?.focus());return}hi(e,{canonicalHash:!0}),queueMicrotask(()=>document.getElementById(`tabBtn-${e}`)?.focus())}function AC(e={}){const t=document.getElementById("devicesMount");if(!t)return Promise.resolve(!0);const n=pH(t,++Cm,e);return Rm=n,n}async function xC(){const[e,t]=await Promise.all([AC(),Ll()]);return e&&t}async function pH(e,t,n){zt||Lc(e,NC,{version:1,items:[]},[],[],{loading:!0});try{const[r,i,a,s,c]=await Promise.all([lH(n),ed(n),yI(n),td(n).then(p=>({inventory:p,unavailable:!1})).catch(()=>({inventory:zt?.inventory,unavailable:!0})),Al({requiredSurface:"devices",signal:n.signal})]);if(n.signal?.aborted)return!1;if(t!==Cm)return Rm??!1;const l=dH(),d=uH(),u=mh(S.lastSyncStatus);return!s.unavailable&&s.inventory&&(S.lastDeviceIdentityInventory=s.inventory),S.deviceIdentityInventoryLoadError=s.unavailable,Lc(e,i,a,r,l,{inventory:s.inventory,inventoryUnavailable:s.unavailable,coordinatorEnrollmentIssueCount:u,onCommitted:xC,onNavigate:EC,peerRuntimeMetadata:d}),zt={projects:r,intent:i,reconciliation:a,availability:l,peerRuntimeMetadata:d,inventory:s.inventory,inventoryUnavailable:s.unavailable,coordinatorEnrollmentIssueCount:u},c}catch{return n.signal?.aborted?!1:t!==Cm?Rm??!1:(zt?Lc(e,zt.intent,zt.reconciliation,zt.projects,zt.availability,{coordinatorEnrollmentIssueCount:zt.coordinatorEnrollmentIssueCount,inventory:zt.inventory,inventoryUnavailable:zt.inventoryUnavailable,onCommitted:xC,onNavigate:EC,peerRuntimeMetadata:zt.peerRuntimeMetadata,refreshError:!0}):Lc(e,NC,{version:1,items:[]},[],[],{loadError:!0}),!1)}}Cu("projectFilter")?.addEventListener("change",()=>{Wo.cancel(),S.currentProject=Cu("projectFilter")?.value||"",oi(!0),Ir()});var ha=null;async function fH(e){await Promise.all([N1({signal:e.signal}),sq({signal:e.signal}),YN().catch(()=>{})])}function mH(e,t,n,r){if(t!=="health"&&Tw(),t==="feed"){const s=n$();e.push(Wb(s,{signal:r.signal}),yf({signal:r.signal}))}if(t==="projects"&&e.push(la({awaitTeamSetupSummary:!0,signal:r.signal}).then(n)),t==="sharing"&&e.push(Ll({awaitTeamSetupSummary:!0,signal:r.signal}).then(n)),t==="devices"&&e.push(AC({signal:r.signal}).then(n)),t==="health"&&e.push(E1({signal:r.signal}),Al({requiredSurface:"health",requireFreshSyncStatus:Dl,signal:r.signal}).then(n)),t==="advanced"&&S.advancedSection==="sync"&&e.push(Al({signal:r.signal}).then(n)),t==="advanced"&&S.advancedSection==="teams"&&e.push(Ac({signal:r.signal}).then(n)),!S.syncPairingOpen)return;const i=t==="advanced"&&S.advancedSection==="sync",a=JG({signal:r.signal});e.push(i?a.then(n):a)}async function Ir(){an||(ha&&clearTimeout(ha),ha=setTimeout(()=>$l(),80))}async function hH(e,t){if(!t.isCurrent()&&!Bm(e))return;const n=await _m();t.isOwned()&&(n?Rr("error"):kC())}function gH(e){Wo.finish(e),S.refreshInFlight=!1,!(!S.refreshQueued||an||!wm())&&(S.refreshQueued=!1,$l())}async function $l(){if(an||!wm())return;if(S.refreshInFlight){S.refreshQueued=!0;return}S.refreshInFlight=!0;const e=Wo.begin();try{Rr("refreshing");const t=S.activeTab,n=IC(),r=[fH(e)];let i=!0;if(mH(r,t,s=>{i=i&&s},e),await Zo(Promise.all(r),e.signal),!e.isCurrent()){if(Bm(e.signal.reason))throw e.signal.reason;return}RC(SC(S.lastSyncLegacySharedReview));const a=Ka(S.activeTab,S.lastCoordinatorAdminStatus);a!==S.activeTab&&Ry(a),PC(S.activeTab),Rr(i?"idle":"error"),rH({refreshSucceeded:i,surface:n})}catch(t){await hH(t,e)}finally{gH(e)}}dA();var DC=document.getElementById("toastRoot");DC&&WE(DC);var LC=document.getElementById("diagnosticsDrawerMount");LC&&JN(LC);var $C=document.getElementById("legacyTeamSetupMount");$C&&kF($C,{onCompleted:async()=>{let e,t;const n={requireTeamSetupSummary:!0};if(S.activeTab==="sharing"?(t=await la(n),e=await Ll(n)):(e=await Ll(n),t=await la(n)),!e||!t)throw new Error("team_setup_refresh_failed")}});var jC=document.getElementById("legacyUpgradeDialogMount");jC&&tE(jC,{onDismiss:eH,onReviewGroups:()=>{window.location.hash="sync",setTimeout(()=>document.getElementById("syncSharingReview")?.scrollIntoView({block:"start"}),120)},onReviewProjects:()=>{window.location.hash="projects"}}),fA(Js("themeToggle")),Py(Nu()),oH(),n1(),XN(),AB(()=>Ir(),{onOpenTeamSetup:Kw}),XG(()=>Ir()),l$(),Bq(iH,Jo,()=>Ir()),sH(),Qe("viewerReconnectRetry")?.addEventListener("click",async()=>{if(au("reconnect_requested"),mi(!0,"Checking whether the viewer server is back…"),!await _m()){kC();return}Cr&&(clearTimeout(Cr),Cr=null),an=!1,mi(!0,"Viewer responded. Restoring your session…"),Jo();try{await $l()}catch{}an||mi(!1)}),ZG(),nH(),Ir(),Jo()})();
110
+ Global: ${d.total_tokens_saved.toLocaleString()} estimated saved`:"",b=[{label:l?"Savings (project)":"Savings",value:u?so(u.total_tokens_saved):"n/a",tooltip:u?`Estimated tokens saved by reusing compressed memories: ${u.total_tokens_saved.toLocaleString()}${v}`:"Usage data is unavailable",icon:"trending-up"},{label:l?"Injected (project)":"Injected",value:u?so(u.total_tokens_read):"n/a",tooltip:u?`Estimated tokens injected into context (pack size): ${u.total_tokens_read.toLocaleString()}${m}`:"Usage data is unavailable",icon:"book-open"},{label:l?"Reduction (project)":"Reduction",value:u?$p(u.total_tokens_saved,u.total_tokens_read):"n/a",tooltip:u?`Estimated percent reduction from reuse. Factor: ${R$(u.total_tokens_saved,u.total_tokens_read)}.${m}${v}`:"Usage data is unavailable",icon:"percent"},{label:l?"Work investment (project)":"Work investment",value:"n/a",tooltip:"Work-investment data is unavailable",icon:"pencil"},{label:"Active memories",value:a?.active_memory_items??"n/a",icon:"check-circle"},{label:"Embedding coverage",value:a?Zb(a.vector_coverage):"n/a",tooltip:"Share of active memories with embeddings",icon:"layers"},{label:"Tag coverage",value:a?Zb(a.tags_coverage):"n/a",tooltip:"Share of active memories with tags",icon:"tag"}];i&&I1(b,f,p),Cw(e,b),t&&T1(t,a,s),Po()}function T1(e,t,n){if(!t){To(e,P1(S.healthStats,"Database metrics"));return}const r=n?` · project: ${n}`:"",i=Qs(S.healthStats)?" · showing stale data":"",a=N$(t.path);To(e,`DB: ${a} · ${E$(t.size_bytes)}${r}${i}`)}function P1(e,t){return e.status==="loading"?`Loading ${t.toLowerCase()}…`:e.status==="failed"?`${t} failed to load`:`${t} not loaded`}async function N1(e={}){const t=S.viewerActorId,n=await ER(e);e.signal?.aborted||(S.viewerActorId=n.identity.actor_id,t!==S.viewerActorId&&oi(!0))}async function E1(e={}){const t=S.currentProject;S.healthStats=Xs(S.healthStats),S.healthUsage=Xs(S.healthUsage,t),S.healthSession=Xs(S.healthSession,t),S.healthRawEvents=Xs(S.healthRawEvents),Nw();const n=S.activeTab==="health"&&!S.lastUpdateStatus?GI(e).catch(HI):Promise.resolve(S.lastUpdateStatus),[r,i,a,s,c]=await Promise.all([Zc(qR(e)),Zc(UR(t,e)),Zc(GR(t,e)),Zc(HR(t,e)),n]);e.signal?.aborted||(S.healthStats=el(S.healthStats,r),S.healthUsage=el(S.healthUsage,i,t),S.healthSession=el(S.healthSession,a,t),S.healthRawEvents=el(S.healthRawEvents,s),S.lastUpdateStatus=c,Nw())}function Nw(){k1(),l1(document.getElementById("automaticRecallStats"),On(S.healthStats)?.automatic_recall),_1(),Pw()}async function Zc(e){try{return{ok:!0,data:await e}}catch(t){return{ok:!1,error:t instanceof Error?t.message:"Health request failed"}}}function el(e,t,n=""){return"data"in t?QE(t.data,Date.now(),n):ZE(e,t.error)}function _f(e,t){return`legacy-team-setup-item-error-${e}-${t}`}function Ew(e){return[...e].sort((t,n)=>+(n.decision==="unresolved")-+(t.decision==="unresolved"))}function Aw(e){return[...e].sort((t,n)=>+(n.resolution==="unresolved")-+(t.resolution==="unresolved"))}var A1={unresolved:"Needs a decision",included:"Included in this Team",excluded:"Excluded from this Team",removed:"Removed from this Team"};function xw(e,t){return t?e.identityChoices.find(n=>n.identityRef===t)?.displayName??"Unavailable person":null}function x1(e){return e.targetIdentityRef??e.existingIdentityRef??""}function D1({blocked:e,blockedDescriptionId:t,blockedDeviceRefs:n,busy:r,detail:i,device:a,index:s,onAssign:c,onClear:l,onDecision:d}){const u=Dr(),p=`${u}-identity`,f=`${u}-evidence`,m=`${u}-assignment-help`,v=x1(a),b=a.targetIdentityRef??"",[h,y]=D(v);V(()=>y(v),[v]);const w=i.identityChoices.some(O=>O.identityRef===h),_=xw(i,a.existingIdentityRef),R=xw(i,a.suggestedIdentityRef),I=n?.has(a.deviceRef)??!1,T=e||I||r,A=T||!a.actions.assignIdentity.enabled,L=a.actions.assignIdentity.blockedReason==="assignment_evidence_inactive",F=!!h&&!w,N=!a.actions.include.enabled||L||F||!b||h!==b,j=T||N,x=A||!h||L||F||h===b,U=!a.enabled||N,q=e?t:I?_f("device",a.deviceRef):void 0,$=[f,U?m:void 0,q].filter(Boolean).join(" "),E=[f,q].filter(Boolean).join(" "),C=a.decision==="unresolved";return o("fieldset",{"aria-busy":r?"true":"false",className:`legacy-team-device-row${C?" legacy-team-setup-row-needs-attention":""}`,id:`legacy-team-device-row-${s}`,tabIndex:C?-1:void 0,children:[o("legend",{children:a.displayName}),C?o("span",{className:"legacy-team-setup-status",children:"Needs attention"}):null,o("div",{className:"small legacy-team-device-evidence",id:f,children:[o("span",{children:a.enabled?"Current Team device":"Device no longer active on this Team"}),_?o("span",{children:["Current assignment: ",_,a.verifiedEvidenceKind==="active_assignment"?" · verified active assignment":""]}):null,!_&&R?o("span",{children:["Suggested person: ",R]}):null,o("span",{children:["Decision: ",A1[a.decision]]})]}),o("label",{htmlFor:p,children:"Person using this device"}),o("select",{"aria-describedby":$,className:"feed-search legacy-team-device-select",disabled:A,id:p,onChange:O=>y(O.currentTarget.value),value:h,children:[o("option",{value:"",children:"Choose a person"}),h&&!w?o("option",{value:h,children:"Current server assignment"}):null,i.identityChoices.map(O=>o("option",{value:O.identityRef,children:O.displayName},O.identityRef))]}),a.enabled?F?o("p",{className:"small",id:m,children:"This person is no longer available. Choose an available person and save the assignment before including this device."}):L?o("p",{className:"small",id:m,children:"This assignment is inactive. Reconcile this device in Devices or exclude it from this Team."}):!h||!b||h!==b?o("p",{className:"small",id:m,children:h?"Save the selected person assignment before including this device.":"Choose and save a person assignment before including this device."}):null:o("p",{className:"small",id:m,children:"Inactive devices can only be removed from this Team."}),o("div",{className:"legacy-team-device-actions",children:[o("button",{"aria-describedby":$,"aria-disabled":x?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{x||c(a,h)},type:"button",children:"Save assignment"}),a.enabled?o(z,{children:[o("button",{"aria-describedby":$,"aria-disabled":j?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{j||d(a,"included",b)},type:"button",children:"Include"}),o("button",{"aria-describedby":E,"aria-disabled":T||!a.actions.exclude.enabled?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!T&&a.actions.exclude.enabled&&d(a,"excluded")},type:"button",children:"Exclude"})]}):o("button",{"aria-describedby":E,"aria-disabled":T||!a.actions.remove.enabled?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!T&&a.actions.remove.enabled&&d(a,"removed")},type:"button",children:"Remove"}),a.decision!=="unresolved"?o("button",{"aria-describedby":E,"aria-disabled":T||!a.actions.clearDecision.enabled?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!T&&a.actions.clearDecision.enabled&&l(a)},type:"button",children:"Clear decision"}):null]})]})}function L1(e){const t=Ew(e.detail.devices);return o("section",{"aria-labelledby":"legacy-team-setup-step-devices",children:[o("h3",{id:"legacy-team-setup-step-devices",tabIndex:-1,children:"Review devices"}),o("p",{children:[e.detail.unresolvedDeviceCount.toLocaleString()," of"," ",e.detail.candidate.deviceCount.toLocaleString()," Team devices still need a decision."]}),o("div",{className:"legacy-team-device-list",children:t.map((n,r)=>g(D1,{...e,busy:e.busyDeviceRefs.has(n.deviceRef),device:n,index:r,key:n.deviceRef}))})]})}function $1(e,t){return e.resolvedProjectRef?t.get(e.resolvedProjectRef)??"Unavailable Project":null}function j1({blocked:e,blockedDescriptionId:t,blockedProjectRefs:n,busy:r,index:i,onMap:a,presentationName:s,project:c}){const l=Dr(),d=`${l}-mapping`,u=`${l}-help`,p=c.resolvedProjectRef??"",f=Or(c.mappingChoices.map($=>({canonicalId:$.resolvedProjectRef,displayName:$.displayName}))),m=[...new Set(c.mappingChoices.map($=>$.resolvedProjectRef))],v=[...m].sort(($,E)=>$<E?-1:$>E?1:0),b=new Map(v.map(($,E)=>[$,`project-choice-${E+1}`])),h=new Map(c.mappingChoices.map($=>[$.resolvedProjectRef,$])),y=m.flatMap($=>{const E=h.get($);return E?[{...E,label:f.get($)??E.displayName,token:b.get($)??""}]:[]}),w=y.find($=>$.resolvedProjectRef===p)?.token??"",_=JSON.stringify(v),[R,I]=D(w);V(()=>I(w),[w,_]);const T=y.find($=>$.token===R)?.resolvedProjectRef,A=n?.has(c.projectRef)??!1,L=c.actions.map.blockedReason==="mapping_unavailable",F=c.actions.map.enabled&&!R,N=e||A||r||!c.actions.map.enabled,j=N||!T||T===p,x=$1(c,f),U=[L||F?u:void 0,e?t:A?_f("project",c.projectRef):void 0].filter(Boolean).join(" "),q=c.resolution==="unresolved";return o("fieldset",{"aria-busy":r?"true":"false",className:`legacy-team-project-row${q?" legacy-team-setup-row-needs-attention":""}`,id:`legacy-team-project-row-${i}`,tabIndex:q?-1:void 0,children:[o("legend",{children:s}),o("div",{className:"legacy-team-project-row-content",children:[q?o("span",{className:"legacy-team-setup-status",children:"Needs attention"}):null,c.resolution==="deterministic"?o("p",{className:"small",children:"Mapped automatically from matching Project evidence."}):o(z,{children:[o("p",{className:"small",children:x?`Saved mapping: ${x}`:"This Project still needs a mapping."}),o("label",{htmlFor:d,children:"Canonical Project"}),o("select",{"aria-describedby":U||void 0,className:"feed-search legacy-team-project-select",disabled:N,id:d,onChange:$=>I($.currentTarget.value),value:R,children:[o("option",{value:"",children:"Choose a Project"}),y.map($=>o("option",{value:$.token,children:$.label},$.resolvedProjectRef))]}),L?o("p",{className:"small",id:u,children:"No safe Project mapping is available. Refresh after Project evidence changes."}):F?o("p",{className:"small",id:u,children:"Choose and save one of the server-provided Project mappings."}):null,o("button",{"aria-describedby":U||void 0,"aria-disabled":j?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{!j&&T&&a(c,T)},type:"button",children:"Save mapping"})]})]})]})}function O1(e){const t=Aw(e.detail.projects),n=Or(t.map(a=>({canonicalId:a.projectRef,displayName:a.displayName}))),r=e.detail.projects.filter(a=>a.resolution==="deterministic").length,i=Math.max(e.detail.candidate.projectCount,e.detail.projects.length,e.detail.unresolvedProjectCount);return o("section",{"aria-labelledby":"legacy-team-setup-step-projects",children:[o("h3",{id:"legacy-team-setup-step-projects",tabIndex:-1,children:"Review Projects"}),o("p",{children:e.detail.unresolvedProjectCount===0?`All ${i.toLocaleString()} Team Projects are mapped.`:`${e.detail.unresolvedProjectCount.toLocaleString()} of ${i.toLocaleString()} Team Projects need attention.`}),r>0?o("p",{className:"small",children:"Review the automatic mappings below before continuing."}):null,o("div",{className:"legacy-team-project-list",children:t.map((a,s)=>o(j1,{blocked:e.blocked,blockedDescriptionId:e.blockedDescriptionId,blockedProjectRefs:e.blockedProjectRefs,busy:e.busyProjectRefs.has(a.projectRef),index:s,onMap:e.onMap,presentationName:n.get(a.projectRef)??a.displayName,project:a},a.projectRef))}),e.detail.unresolvedProjectCount===0?o("div",{className:"legacy-team-setup-next-action",children:[o("p",{className:"small",id:"legacy-team-project-continue-help",children:"Continue to review the exact people, devices, and Projects that will receive access."}),o("button",{"aria-describedby":["legacy-team-project-continue-help",e.blocked?e.blockedDescriptionId:null].filter(Boolean).join(" "),"aria-disabled":e.blocked?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{e.blocked||e.onContinue()},type:"button",children:"Continue to Review"})]}):null]})}var No={add:"Add",update:"Update",remove:"Remove"},M1=10;function ft(e,t,n=`${t}s`){return`${e.toLocaleString()} ${e===1?t:n}`}function wf(e,t,n,r){const i=new Map;for(const a of e){const s=t(a),c=r(a),l=`${c}:${xa(s)}`,d=n(a),u=i.get(l)??{displayName:s,kind:c,projectRefs:new Set,changeCount:0};u.projectRefs.add(d),u.changeCount+=1,i.set(l,u)}return[...i.values()]}function Sf(e,t){return e.kind==="legacy_default_sharing"?`${e.displayName} — default scope`:e.projectRefs.size>1?`${e.displayName} — ${ft(e.projectRefs.size,t)}`:e.displayName}function Eo({empty:e,exactItemName:t,exactItems:n,summaryItems:r,title:i}){const a=!!(r&&r.length<n.length),s=a&&n.length>M1;return o("section",{children:[o("h4",{children:i}),n.length>0?o(z,{children:[a&&r?o("ul",{className:"legacy-team-setup-delta-summary",children:r.map((c,l)=>o("li",{children:c},`${i}-summary-${l}`))}):null,s?o("details",{children:[o("summary",{children:["Show all ",ft(n.length,`exact ${t}`)]}),o(Dw,{items:n,title:i})]}):o(Dw,{items:n,title:i})]}):o("p",{className:"small",children:e})]})}function Dw({items:e,title:t}){return o("ul",{className:"legacy-team-setup-exact-list",children:e.map((n,r)=>o("li",{children:n},`${t}-${r}`))})}function F1({blocked:e,blockedDescriptionId:t,detail:n,finishing:r,onFinish:i}){const a=n.accessDelta,s=JSON.stringify([n.attemptId,n.finishDigest,n.accessDeltaDigest,n.viewerAccessDeltaDigest]),[c,l]=D(null),d=c===s,u=e||!d,p=[d?null:"legacy-team-setup-confirmation-label",e?t:null].filter(Boolean).join(" "),f=a.teamChanges.map(C=>{const O=C.fromDeviceEligibilityMode==="person_all_devices"?"all devices assigned to each person":C.fromDeviceEligibilityMode==="reviewed_allowlist"?"the reviewed device list":"no existing device policy";return`${No[C.change]} ${C.teamDisplayName}: change device access from ${O} to the reviewed device list.`}),m=a.membershipChanges.map(C=>`${No[C.change]} ${C.identityDisplayName} ${C.change==="remove"?"from":"to"} ${C.teamDisplayName}.`),v=Or([...n.projects.map(C=>({canonicalId:C.projectRef,displayName:C.displayName})),...a.projectChanges.map(C=>({canonicalId:C.projectRef,displayName:C.projectDisplayName}))]),b=a.projectChanges.flatMap(C=>[...C.fromResolvedProjectRef&&C.fromResolvedProjectDisplayName?[{canonicalProjectRef:C.fromCanonicalProjectRef,resolvedProjectRef:C.fromResolvedProjectRef,displayName:C.fromResolvedProjectDisplayName}]:[],...C.toResolvedProjectRef&&C.toResolvedProjectDisplayName?[{canonicalProjectRef:C.toCanonicalProjectRef,resolvedProjectRef:C.toResolvedProjectRef,displayName:C.toResolvedProjectDisplayName}]:[]]),h=Or(b.map(C=>({canonicalId:C.canonicalProjectRef??C.resolvedProjectRef,displayName:C.displayName}))),y=new Map(b.map(C=>[C.resolvedProjectRef,h.get(C.canonicalProjectRef??C.resolvedProjectRef)??C.displayName])),w=Or([...n.projects.flatMap(C=>C.canonicalProjectRef?[{canonicalId:C.canonicalProjectRef,displayName:C.displayName}]:[]),...[...a.recipientChanges,...a.deviceAccessChanges].filter(C=>C.canonicalProjectKind==="project").map(C=>({canonicalId:C.canonicalProjectRef,displayName:C.canonicalProjectDisplayName}))]),_=a.projectChanges.map(C=>`${No[C.change]} ${v.get(C.projectRef)??C.projectDisplayName}: ${C.fromResolvedProjectRef?y.get(C.fromResolvedProjectRef)??C.fromResolvedProjectDisplayName??"no Project":"no Project"} to ${C.toResolvedProjectRef?y.get(C.toResolvedProjectRef)??C.toResolvedProjectDisplayName??"no Project":"no Project"}.`),R=a.recipientChanges.map(C=>C.canonicalProjectKind==="legacy_default_sharing"?`${C.change==="remove"?"Stop":"Start"} using legacy default sharing for ${C.recipientDisplayName}.`:`${No[C.change]} ${C.recipientDisplayName} ${C.change==="remove"?"from":"as"} a recipient for ${w.get(C.canonicalProjectRef)??C.canonicalProjectDisplayName}.`),I=a.deviceAccessChanges.map(C=>C.canonicalProjectKind==="legacy_default_sharing"?`${C.deviceDisplayName} ${C.change==="remove"?"stops":"starts"} inheriting legacy default sharing.`:`${No[C.change]} ${C.deviceDisplayName} access ${C.change==="remove"?"from":"to"} ${w.get(C.canonicalProjectRef)??C.canonicalProjectDisplayName}.`),T=a.teamChanges.length+a.membershipChanges.length+a.projectChanges.length+a.recipientChanges.length+a.deviceAccessChanges.length,A=wf(a.projectChanges,C=>C.projectDisplayName,C=>C.projectRef,()=>"project"),L=wf(a.recipientChanges,C=>C.canonicalProjectDisplayName,C=>C.canonicalProjectRef,C=>C.canonicalProjectKind),F=wf(a.deviceAccessChanges,C=>C.canonicalProjectDisplayName,C=>C.canonicalProjectRef,C=>C.canonicalProjectKind),N=n.devices.filter(C=>C.decision==="included").length,j=[ft(a.teamChanges.length,"Team policy change"),ft(a.membershipChanges.length,"membership change"),ft(a.projectChanges.length,"Project change"),ft(a.recipientChanges.length,"recipient change"),ft(a.deviceAccessChanges.length,"device-access change")],x=`${ft(n.projects.length,"Project")} included; ${ft(N,"included device")}.`,U=Math.max(n.candidate.projectCount,n.projects.length),q=new Set(a.deviceAccessChanges.map(C=>C.deviceRef)).size,$=[...a.teamChanges,...a.membershipChanges,...a.projectChanges,...a.recipientChanges,...a.deviceAccessChanges].filter(C=>C.change==="remove").length,E=a.teamChanges.length===0&&a.membershipChanges.length===0&&a.projectChanges.length===0&&a.recipientChanges.length>0&&a.recipientChanges.every(C=>C.change==="remove"&&C.canonicalProjectKind==="legacy_default_sharing")&&a.deviceAccessChanges.every(C=>C.change==="remove"&&C.canonicalProjectKind==="legacy_default_sharing")?`No new access will be added. This removes legacy default sharing for ${n.candidate.displayName}.${q>0?` ${ft(q,"device")} will stop receiving memories shared only through that default.`:""} Project-scoped access is unchanged across ${ft(U,"reviewed Project")}.`:`${ft(T,"server-confirmed access change")} will be applied atomically; ${ft($,"removal")} ${$===1?"is":"are"} included.`;return o("section",{"aria-labelledby":"legacy-team-setup-step-review",children:[o("h3",{id:"legacy-team-setup-step-review",tabIndex:-1,children:"Review and finish"}),o("p",{children:"Review every server-confirmed access change before activating this Team."}),o("section",{"aria-label":"Access review summary",className:"legacy-team-setup-review-summary",children:[o("p",{className:"legacy-team-setup-net-effect",children:[o("strong",{children:"Net effect:"})," ",E]}),o("p",{children:[o("strong",{children:ft(T,"exact access change")})," to review."]}),o("ul",{children:j.map(C=>o("li",{children:C},C))}),o("p",{className:"small",children:["Scope: ",x]})]}),o("div",{className:"legacy-team-setup-delta",children:[o(Eo,{empty:"No Team policy changes.",exactItemName:"Team policy change",exactItems:f,title:"Team policy"}),o(Eo,{empty:"No membership changes.",exactItemName:"membership change",exactItems:m,title:"Memberships"}),o(Eo,{empty:"No Project mapping changes.",exactItemName:"Project change",exactItems:_,summaryItems:A.map(C=>`${Sf(C,"reviewed Project")}, ${ft(C.changeCount,"Project change")}`),title:"Projects"}),o(Eo,{empty:"No recipient changes.",exactItemName:"recipient change",exactItems:R,summaryItems:L.map(C=>`${Sf(C,"canonical Project")}, ${ft(C.changeCount,"recipient change")}`),title:"Recipients"}),o(Eo,{empty:"No device access changes.",exactItemName:"device-access change",exactItems:I,summaryItems:F.map(C=>`${Sf(C,"canonical Project")}, ${ft(C.changeCount,"device-access change")}`),title:"Device access"})]}),o("label",{className:"legacy-team-setup-confirmation",id:"legacy-team-setup-confirmation-label",children:[o("input",{"aria-disabled":e?"true":void 0,"aria-describedby":e?t:void 0,checked:d,onClick:C=>{e&&C.preventDefault()},onChange:C=>{if(e){C.currentTarget.checked=d;return}l(C.currentTarget.checked?s:null)},type:"checkbox"}),o("span",{children:"I reviewed every access change above and approve activating this Team."})]}),r?o("p",{"aria-live":"polite",className:"legacy-team-setup-finish-progress",role:"status",children:[o("span",{"aria-hidden":"true",className:"legacy-team-setup-spinner"}),"Checking the latest Team roster and applying all reviewed changes atomically. No partial changes will be kept if this cannot finish."]}):null,o("button",{"aria-describedby":p||void 0,"aria-disabled":u?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{u||i(n)},type:"button",children:r?"Finishing Team setup…":"Finish Team setup"})]})}function B1(e){let t=null;return async n=>{try{const r=await q1(n,e,()=>t,i=>{t=i});return{status:"success",generation:n.generation,id:n.id,kind:n.kind,view:r}}catch(r){let i,a;try{i=await U1(n,e,r)}catch(s){a=s}return{status:"failure",generation:n.generation,id:n.id,kind:n.kind,cause:r,...a?{recoveryCause:a}:{},...i?{recoveredView:i}:{}}}}}async function q1(e,t,n,r){switch(e.kind){case"load":return e.refresh?t.refreshCandidate(e.candidateRef):t.loadDetail(e.candidateRef);case"assign_device":return t.saveAssignment(e.candidateRef,e.deviceRef,e.input);case"decide_device":return t.saveDecision(e.candidateRef,e.deviceRef,e.input);case"clear_device":return t.clearDecision(e.candidateRef,e.deviceRef,e.input);case"map_project":return t.saveProjectMapping(e.candidateRef,e.projectRef,e.input);case"refresh":return t.refreshCandidate(e.candidateRef);case"finish":await t.finish(e.candidateRef,e.input);return;case"completion_refresh":{const i=n();if(i?.attemptId===e.attemptId&&i.candidateRef===e.candidateRef){await i.promise;return}const a=Promise.resolve().then(()=>t.onCompleted());r({attemptId:e.attemptId,candidateRef:e.candidateRef,promise:a});try{await a}finally{n()?.promise===a&&r(null)}return}default:throw new Error(`Unhandled Team setup effect: ${String(e)}`)}}async function U1(e,t,n){if(e.kind!=="completion_refresh"&&!(!(n instanceof St)||!Cf(n.errorCode))&&!(e.kind==="load"&&(e.refresh||e.completionOnly||n.errorCode!=="team_setup_confirmation_stale")))return t.loadDetail(e.candidateRef)}function Cf(e){return["team_setup_roster_changed","team_setup_assignment_changed","team_setup_conflict","team_setup_confirmation_stale"].includes(e)}function Lw(e,t){return{id:e,targetId:`legacy-team-setup-step-${t}`}}function G1(e,t,n){return jw(e,n>=0?`${t==="devices"?"legacy-team-device-row":"legacy-team-project-row"}-${n}`:`legacy-team-setup-step-${t}`)}function $w(e,t){return jw(e,t.recovery||t.hasError?"legacy-team-setup-retry":`legacy-team-setup-step-${t.step}`)}function jw(e,t){return{id:e,targetId:t}}var Ow="Team setup changed since it was last reviewed. Reload the latest details to continue.",Mw="Team device details are temporarily unavailable. Check the coordinator connection and settings, then refresh.",H1="Team device details were unavailable, so setup was not finished and no changes were applied. Check the coordinator connection and settings, then refresh.",V1="This device's Project history is too large to finish setup here, so no changes were applied. Retry from a device with less history, or contact support.",K1="Team setup completion could not be checked. Check the coordinator connection and settings, then retry.",Fw="Team setup could not be confirmed, and no local changes were applied. Retry to check whether setup completed.",z1="Another device completed this Team with different reviewed details. Retry to load the completed setup.",W1="The completed Team setup could not be verified. Retry, then check the coordinator connection and settings if the problem continues.";function J1(){return{status:"closed",generation:0}}function Rf(e,t){switch(t.type){case"open":return e.status==="open"&&Wn(e)?e:Y1(e.generation+1,t.candidateRef);case"close":return e.status==="open"&&Wn(e)?e:{status:"closed",generation:e.generation+1};case"close_blocked":case"open_blocked":return e.status==="open"?{...e,message:t.message}:e;case"navigate":return X1(e,t.step);case"blocked_navigation":return tl(e,t.step,t.message);case"retry":return Q1(e);case"refresh":return eF(e,"refresh","Refreshing Team setup from the latest server state.");case"assign_device":return If(e,t,"assign_device");case"decide_device":return If(e,t,"decide_device");case"clear_device":return If(e,t,"clear_device");case"map_project":return Z1(e,t);case"finish":return tF(e);case"command_started":return hF(e,t.id,n=>({...n,status:"running"}));case"effect_outcome":return nF(e,t.outcome);case"focus_applied":return e.status==="open"&&e.focus?.id===t.id?{...e,focus:null}:e;default:return t}}function Y1(e,t){return gr({status:"open",generation:e,candidateRef:t,view:null,step:"devices",projectsVisitedAttemptId:null,commands:[],nextCommandId:1,errors:[],message:"",focus:null,nextFocusId:1},{kind:"load",candidateRef:t,refresh:!1,focusOnOutcome:!1})}function X1(e,t){if(e.status!=="open"||e.step==="completed"||t==="completed")return e;if(t==="projects"&&e.view?.unresolvedDeviceCount)return tl(e,"devices","Finish the device decisions before mapping Projects.");if(t==="review"&&e.view?.unresolvedDeviceCount)return tl(e,"devices","Finish the device decisions before reviewing access.");if(t==="review"&&e.view?.unresolvedProjectCount)return tl(e,"projects","Finish the Project mappings before reviewing access.");const n=t==="projects"&&e.view?e.view.attemptId:e.projectsVisitedAttemptId;return{...e,step:t,projectsVisitedAttemptId:n,focus:Lw(e.nextFocusId,t),nextFocusId:e.nextFocusId+1}}function tl(e,t,n){if(e.status!=="open"||e.step==="completed"||!e.view)return e;const r=t==="devices"?Ew(e.view.devices).findIndex(i=>i.decision==="unresolved"):Aw(e.view.projects).findIndex(i=>i.resolution==="unresolved");return{...e,step:t,projectsVisitedAttemptId:t==="projects"?e.view.attemptId:e.projectsVisitedAttemptId,message:n,focus:G1(e.nextFocusId,t,r),nextFocusId:e.nextFocusId+1}}function Q1(e){if(e.status!=="open"||e.step==="completed"||Ao(e)||Wn(e))return e;const t=nl(e)?.retry??e.errors.find(n=>n.retry)?.retry??"load";return gr(e,{kind:"load",candidateRef:e.candidateRef,refresh:t==="refresh",completionOnly:t==="completion",focusOnOutcome:!0})}function If(e,t,n){if(e.status!=="open"||e.step==="completed"||!kf(e.view)||nl(e)||Ao(e)||Wn(e))return e;const r=e.view.devices.find(c=>c.deviceRef===t.deviceRef);if(!r||!(t.type==="assign_device"?r.actions.assignIdentity:t.type==="clear_device"?r.actions.clearDecision:t.decision==="included"?r.actions.include:t.decision==="excluded"?r.actions.exclude:r.actions.remove).enabled)return e;const i={candidateRef:e.candidateRef,deviceRef:t.deviceRef},a=n==="assign_device"&&t.type==="assign_device"?{kind:n,...i,input:{attemptId:e.view.attemptId,targetIdentityRef:t.targetIdentityRef,expectation:r.expectation}}:n==="clear_device"&&t.type==="clear_device"?{kind:n,...i,input:{attemptId:e.view.attemptId}}:t.type==="decide_device"?{kind:"decide_device",...i,input:t.decision==="included"&&t.targetIdentityRef?{attemptId:e.view.attemptId,decision:"included",expectedTargetIdentityRef:t.targetIdentityRef}:{attemptId:e.view.attemptId,decision:t.decision}}:null;if(!a||t.type==="decide_device"&&t.decision==="included"&&!t.targetIdentityRef)return e;const s=t.type==="assign_device"?`Saving the assignment for ${r.displayName}.`:t.type==="clear_device"?`Clearing the decision for ${r.displayName}.`:`Saving the decision for ${r.displayName}.`;return gr(si(e,{kind:"device",itemRef:t.deviceRef}),a,s)}function Z1(e,t){if(e.status!=="open"||e.step==="completed"||!kf(e.view)||nl(e)||Ao(e)||Wn(e))return e;const n=e.view.projects.find(r=>r.projectRef===t.projectRef);return!n?.actions.map.enabled||!n.mappingChoices.some(r=>r.resolvedProjectRef===t.resolvedProjectRef)?e:gr(si(e,{kind:"project",itemRef:t.projectRef}),{kind:"map_project",candidateRef:e.candidateRef,projectRef:t.projectRef,input:{attemptId:e.view.attemptId,resolvedProjectRef:t.resolvedProjectRef}},`Saving the mapping for ${n.displayName}.`)}function eF(e,t,n){return e.status!=="open"||e.step==="completed"||!e.view?.actions.refresh.enabled||Ao(e)||Wn(e)?e:gr(si(e,{kind:"global"}),{kind:t,candidateRef:e.candidateRef},n)}function tF(e){return e.status!=="open"||e.step==="completed"||e.view?.state!=="ready_to_finish"||e.commands.length||e.errors.length>0?e:gr(si(e,{kind:"global"}),{kind:"finish",candidateRef:e.candidateRef,attemptId:e.view.attemptId,input:{attemptId:e.view.attemptId,finishDigest:e.view.finishDigest,confirmedAccessDeltaDigest:e.view.accessDeltaDigest,confirmedViewerAccessDeltaDigest:e.view.viewerAccessDeltaDigest}},"Finishing Team setup.")}function gr(e,t,n=e.message){const r=`${e.generation}:${e.nextCommandId}`;return{...e,commands:[...e.commands,{...t,generation:e.generation,id:r,status:"pending"}],nextCommandId:e.nextCommandId+1,message:n}}function nF(e,t){if(e.status!=="open"||e.generation!==t.generation)return e;const n=e.commands.find(i=>i.id===t.id);if(!n)return e;const r={...e,commands:e.commands.filter(i=>i.id!==t.id)};return n.kind==="load"&&n.completionOnly&&t.status==="success"&&t.view?.state!=="completed"?Bw(r,n,{status:"failure",generation:t.generation,id:t.id,kind:n.kind,cause:new St(409,"team_setup_confirmation_stale")}):t.status==="failure"?Bw(r,n,t):n.kind==="completion_refresh"?{...r,message:"Team setup complete. Sharing and Projects are up to date."}:n.kind==="finish"?iF(r,n.attemptId):t.view?qw({...mF(r,n),message:rF(n,e.view)},t.view,n.kind==="load"&&n.focusOnOutcome):r}function rF(e,t){if(e.kind==="refresh")return"Team setup refreshed.";if(e.kind==="load")return"";if("deviceRef"in e){const n=t?.devices.find(r=>r.deviceRef===e.deviceRef)?.displayName;return n?`${n} saved.`:"Device saved."}if("projectRef"in e){const n=t?.projects.find(r=>r.projectRef===e.projectRef)?.displayName;return n?`${n} saved.`:"Project mapping saved."}return""}function Bw(e,t,n){if(t.kind==="completion_refresh")return{...e,message:"Team setup complete. Sharing or Projects could not be refreshed; use that view's Refresh control."};const r=n.recoveredView?qw(e,n.recoveredView,!1):e;if(n.recoveredView?.state==="completed")return r;const i=aF(t,n.cause,n.recoveryCause),a={...r,errors:[...si(r,i.scope).errors,i],message:""};return t.kind!=="load"||!t.focusOnOutcome?a:{...a,focus:$w(a.nextFocusId,{hasError:!0,recovery:a.view?.state==="unavailable",step:a.step}),nextFocusId:a.nextFocusId+1}}function qw(e,t,n){const r=pF(t,e.projectsVisitedAttemptId===t.attemptId),i=r==="projects"?t.attemptId:e.projectsVisitedAttemptId,a=t.state==="unavailable"?[{scope:{kind:"global"},message:fF(t.unavailableReason),retry:"refresh"}]:t.state==="completed"?[]:e.errors.filter(l=>{if(l.scope.kind==="device"){const d=l.scope.itemRef;return t.devices.some(u=>u.deviceRef===d)}if(l.scope.kind==="project"){const d=l.scope.itemRef;return t.projects.some(u=>u.projectRef===d)}return!1});let s={...e,view:t,step:r,projectsVisitedAttemptId:i,errors:a,message:t.state==="completed"?"Team setup complete. Sharing and Projects are refreshing.":e.message};const c=a.some(l=>l.scope.kind==="global"||l.scope.kind==="load");return(n||r!==e.step)&&(s={...s,focus:$w(s.nextFocusId,{hasError:c,recovery:t.state==="unavailable",step:r}),nextFocusId:s.nextFocusId+1}),t.state==="completed"&&!Vw(s,t.attemptId)&&(s=gr(s,{kind:"completion_refresh",candidateRef:s.candidateRef,attemptId:t.attemptId})),s}function iF(e,t){let n={...e,step:"completed",message:"Team setup complete. Sharing and Projects are refreshing.",focus:Lw(e.nextFocusId,"completed"),nextFocusId:e.nextFocusId+1};return Vw(n,t)||(n=gr(n,{kind:"completion_refresh",candidateRef:n.candidateRef,attemptId:t})),n}function aF(e,t,n){const r=t instanceof St&&Cf(t.errorCode),i=t instanceof St&&t.errorCode==="team_setup_roster_unavailable",{completionCode:a,message:s,terminalRecoveryCode:c}=lF({command:e,cause:t,recoveryCause:n,changed:r,rosterUnavailable:i});return{scope:oF(e,{globalError:r||i||a!==null}),message:s,retry:sF(e,t,n,{changed:r,rosterUnavailable:i,terminalRecovery:c!==null})}}function oF(e,t){return t.globalError?{kind:"global"}:e.kind==="assign_device"||e.kind==="decide_device"||e.kind==="clear_device"?{kind:"device",itemRef:e.deviceRef}:e.kind==="map_project"?{kind:"project",itemRef:e.projectRef}:e.kind==="load"?{kind:"load"}:{kind:"global"}}function sF(e,t,n,r){return t instanceof St&&t.errorCode==="team_setup_confirmation_stale"||n instanceof St&&n.errorCode==="team_setup_confirmation_stale"?e.kind==="load"&&e.refresh?"completion":"refresh":e.kind==="load"&&e.completionOnly?cF(t):r.terminalRecovery?"load":r.changed||r.rosterUnavailable||e.kind==="refresh"||e.kind==="load"&&e.refresh?"refresh":"load"}function cF(e){return e instanceof St&&rl(e.errorCode)!==null?"completion":"refresh"}function lF(e){const{command:t,cause:n,recoveryCause:r,changed:i,rosterUnavailable:a}=e,s=n instanceof St?rl(n.errorCode):null,c=uF(r instanceof St?rl(r.errorCode):null),l=c??s,d=l==="team_setup_completion_unavailable"&&t.kind==="finish"?dF(n):Gw(l);if(c)return{completionCode:l,message:d??Uw(t.kind),terminalRecoveryCode:c};if(i)return{completionCode:l,message:Ow,terminalRecoveryCode:c};if(a){let u=Mw;return t.kind==="finish"&&(u=n instanceof St&&n.reason==="local_candidate_scan_budget_exceeded"?V1:H1),{completionCode:l,message:u,terminalRecoveryCode:c}}return{completionCode:l,message:d??Uw(t.kind),terminalRecoveryCode:c}}function dF(e){return e instanceof St&&e.reason==="coordinator_route_missing"?`${Fw} The coordinator may be running an older version.`:Fw}function uF(e){return e==="team_setup_completion_conflict"||e==="team_setup_completion_invalid"?e:null}function Uw(e){switch(e){case"load":return"Team setup details are temporarily unavailable. Retry to load the latest details.";case"assign_device":case"decide_device":case"clear_device":return"This device change could not be saved. Reload the latest details before trying again.";case"map_project":return"This Project mapping could not be saved. Reload the latest details before trying again.";case"refresh":return"Team setup could not be refreshed. Retry to load the latest server details.";case"finish":return"Team setup could not be finished. Reload the latest details before trying again.";case"completion_refresh":return"Team setup completed, but dependent views could not be refreshed.";default:return e}}function pF(e,t){return e.state==="completed"?"completed":e.unresolvedDeviceCount>0?"devices":!t&&e.projects.length>0||e.unresolvedProjectCount>0?"projects":"review"}function kf(e){return e?.state==="reviewing"||e?.state==="ready_to_finish"}function Wn(e){return e.commands.some(t=>t.kind==="load"&&t.refresh||["refresh","assign_device","decide_device","clear_device","map_project","finish"].includes(t.kind))}function Ao(e){return e.commands.some(t=>["load","refresh","finish"].includes(t.kind))}function nl(e){return e.errors.find(t=>t.scope.kind==="global"||t.scope.kind==="load")??null}function fF(e){if(Cf(e))return Ow;if(e==="team_setup_roster_unavailable")return Mw;const t=Gw(rl(e));return t||(e==="team_setup_incomplete"?"Team setup needs refreshed server details before review can continue.":"Team setup details are temporarily unavailable. Refresh to load the latest server state.")}function rl(e){return e==="team_setup_completion_unavailable"||e==="team_setup_completion_conflict"||e==="team_setup_completion_invalid"?e:null}function Gw(e){return e==="team_setup_completion_unavailable"?K1:e==="team_setup_completion_conflict"?z1:e==="team_setup_completion_invalid"?W1:null}function Hw(e){return e.kind==="global"||e.kind==="load"}function si(e,t){const n=Hw(t);return{...e,errors:e.errors.filter(r=>n?!Hw(r.scope):r.scope.kind!==t.kind?!0:!("itemRef"in t)||!("itemRef"in r.scope)?!1:r.scope.itemRef!==t.itemRef)}}function mF(e,t){return t.kind==="assign_device"||t.kind==="decide_device"||t.kind==="clear_device"?si(e,{kind:"device",itemRef:t.deviceRef}):t.kind==="map_project"?si(e,{kind:"project",itemRef:t.projectRef}):{...e,errors:[]}}function hF(e,t,n){return e.status==="open"?{...e,commands:e.commands.map(r=>r.id===t?n(r):r)}:e}function Vw(e,t){return e.commands.some(n=>n.kind==="completion_refresh"&&n.attemptId===t)}var gF={role:"list"},vF={role:"listitem"};function yF(e){const t=e.session,n=t.view,r=nl(t),i=t.commands.some(_=>_.kind==="load"),a=Ao(t)||Wn(t),s=t.commands.some(_=>_.kind==="finish"),c=n?.state==="unavailable"||r?.retry==="refresh",l=r!=null&&(!n||c),d=!kf(n)||a||!!r,u=[r?"legacy-team-setup-error":null,a?"legacy-team-setup-operation-status":null,n?.state==="unavailable"?"legacy-team-setup-refresh":null].filter(Boolean).join(" ")||void 0,p=n?`Set up ${n.candidate.displayName}`:"Set up Team",f=t.errors.filter(_=>_.scope.kind==="device"||_.scope.kind==="project"),m=f.length>0,v=f.some(_=>_.retry==="refresh"),b=new Set(f.flatMap(_=>_.scope.kind==="device"?[_.scope.itemRef]:[])),h=new Set(f.flatMap(_=>_.scope.kind==="project"?[_.scope.itemRef]:[])),y=new Set(t.commands.flatMap(_=>"deviceRef"in _?[_.deviceRef]:[])),w=new Set(t.commands.flatMap(_=>"projectRef"in _?[_.projectRef]:[]));return o(Ln,{ariaDescribedby:"legacy-team-setup-description",ariaLabelledby:"legacy-team-setup-title",contentClassName:"modal legacy-team-setup-dialog",contentId:"legacyTeamSetupDialog",onCloseAutoFocus:e.onCloseAutoFocus,onOpenAutoFocus:e.onOpenAutoFocus,onOpenChange:_=>{_||e.onClose()},open:!0,overlayClassName:"modal-backdrop",overlayId:"legacyTeamSetupDialogBackdrop",children:o("div",{"aria-busy":a?"true":"false",className:"modal-card legacy-team-setup-card",children:[o("div",{className:"modal-header",children:[o("div",{id:"legacy-team-setup-title",tabIndex:-1,children:o(zd,{children:p})}),o(Lr,{ariaDisabled:a,ariaLabel:`Close ${p}`,onClick:e.onClose})]}),o("div",{className:"modal-body legacy-team-setup-body",children:[o("p",{className:"small",id:"legacy-team-setup-description",children:"Review device ownership and Project access before this Team can be used for sharing."}),i&&!n?o("p",{role:"status",children:"Loading the latest Team setup details…"}):null,r?o("div",{className:"legacy-team-setup-error legacy-team-setup-recovery",id:"legacy-team-setup-global-error",children:[l?o("strong",{children:"Current setup details are unavailable"}):null,o("p",{"aria-live":"assertive",id:"legacy-team-setup-error",role:"alert",children:r.message}),o("button",{"aria-busy":a?"true":void 0,"aria-disabled":a?"true":void 0,className:"settings-button legacy-team-setup-target",id:"legacy-team-setup-retry",onClick:()=>{a||e.onRetry()},type:"button",children:i?r.retry==="refresh"?"Refreshing…":"Retrying…":r.retry==="refresh"?"Retry loading current setup":"Retry"})]}):null,m?o("div",{className:"legacy-team-setup-error",id:"legacy-team-setup-item-errors",children:[f.map(_=>o("p",{"aria-live":"assertive",id:"itemRef"in _.scope?_f(_.scope.kind,_.scope.itemRef):void 0,role:"alert",children:_.message},"itemRef"in _.scope?`${_.scope.kind}:${_.scope.itemRef}`:_.scope.kind)),o("button",{"aria-busy":a?"true":void 0,"aria-disabled":a?"true":void 0,className:"settings-button legacy-team-setup-target",id:"legacy-team-setup-item-retry",onClick:()=>{a||e.onRetry()},type:"button",children:i?v?"Refreshing…":"Retrying…":v?"Refresh Team setup":"Retry"})]}):null,n?o(z,{children:[t.step!=="completed"&&!l?o(bF,{onNavigate:e.onNavigate,step:t.step,unresolvedDeviceCount:n.unresolvedDeviceCount,unresolvedProjectCount:n.unresolvedProjectCount}):null,i?o("p",{"aria-live":"polite",className:"small",id:"legacy-team-setup-refresh-status",role:"status",children:"Refreshing Team setup details…"}):null,o("p",{"aria-live":"polite",className:"small",id:"legacy-team-setup-operation-status",role:"status",children:t.message}),l?null:t.step==="devices"?o(L1,{blocked:d,blockedDescriptionId:u,blockedDeviceRefs:b,busyDeviceRefs:y,detail:n,onAssign:e.onAssign,onClear:e.onClear,onDecision:e.onDecide}):t.step==="projects"?o(O1,{blocked:d,blockedDescriptionId:u,blockedProjectRefs:h,busyProjectRefs:w,detail:n,onContinue:()=>e.onNavigate("review"),onMap:e.onMap}):t.step==="review"&&n.state==="ready_to_finish"?o(F1,{blocked:d||m,blockedDescriptionId:m?"legacy-team-setup-item-errors":u,detail:n,finishing:s,onFinish:e.onFinish}):o(_F,{busy:a,canFinish:n.state==="ready_to_finish",onRefresh:e.onRefresh,recoveryRequired:c,step:t.step})]}):null]}),o("div",{className:"modal-footer legacy-team-setup-actions",children:o("button",{"aria-disabled":a?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:e.onClose,type:"button",children:"Close"})})]})})}function bF(e){const t=e.unresolvedDeviceCount>0,n=e.unresolvedProjectCount>0;return o(z,{children:[o("ol",{...gF,"aria-label":"Team setup steps",className:"legacy-team-setup-steps",children:[{label:"Devices",step:"devices"},{label:"Projects",step:"projects"},{label:"Review",step:"review"}].map((i,a)=>{const s=i.step==="projects"?t:i.step==="review"?t||n:!1,c=s?t?"legacy-team-setup-block-devices":"legacy-team-setup-block-projects":void 0;return g("li",{...vF,className:"legacy-team-setup-step",key:i.step},o("span",{"aria-hidden":"true",className:"legacy-team-setup-step-number",children:a+1}),o("button",{"aria-current":e.step===i.step?"step":void 0,"aria-describedby":c,"aria-disabled":s?"true":void 0,"aria-label":`Step ${a+1}: ${i.label}`,className:"settings-button legacy-team-setup-target",onClick:()=>e.onNavigate(i.step),type:"button",children:i.label}))})}),t?o("p",{className:"small",id:"legacy-team-setup-block-devices",children:"Finish the device decisions before mapping Projects or reviewing access."}):null,n?o("p",{className:"small",id:"legacy-team-setup-block-projects",children:"Finish the Project mappings before reviewing access."}):null]})}function _F(e){return e.step==="completed"?o("section",{"aria-labelledby":"legacy-team-setup-step-completed",children:[o("h3",{id:"legacy-team-setup-step-completed",tabIndex:-1,children:"Team setup complete"}),o("p",{children:"This Team is ready for Project sharing."})]}):e.step!=="review"?null:o("section",{"aria-labelledby":"legacy-team-setup-step-review",children:[o("h3",{id:"legacy-team-setup-step-review",tabIndex:-1,children:"Review and finish"}),o("p",{children:e.canFinish?"The server has confirmed that this Team is ready for final review.":"Final review is waiting for the latest setup details."}),o("p",{className:"small",children:"Next setup action: review the access summary before finishing."}),!e.canFinish&&!e.recoveryRequired?o("button",{"aria-busy":e.busy?"true":void 0,"aria-disabled":e.busy?"true":void 0,className:"settings-button legacy-team-setup-target",onClick:()=>{e.busy||e.onRefresh()},type:"button",children:"Refresh Team setup"}):null]})}var wF={clearDecision:mI,finish:vI,loadDetail:uI,onCompleted:()=>{},refreshCandidate:gI,saveAssignment:pI,saveDecision:fI,saveProjectMapping:hI},Tf="codemem:open-legacy-team-setup";function Kw(e){if(!e)return!1;const t={candidateRef:e,handled:!1,returnFocus:document.activeElement instanceof HTMLElement?document.activeElement:null};return window.dispatchEvent(new CustomEvent(Tf,{detail:t})),t.handled}function SF(e){if(!e?.isConnected||e.tabIndex<0||e.matches(":disabled")||e.closest('[hidden], [inert], [aria-hidden="true"]'))return!1;for(let t=e;t;t=t.parentElement){const n=window.getComputedStyle(t);if(n.display==="none"||n.visibility==="hidden"||n.visibility==="collapse")return!1}return!0}function CF({dependencies:e}){const[t,n]=D(J1),r=B(null),i=Ie(()=>B1(e),[e]),a=l=>{n(d=>Rf(d,l))};return Tt(()=>{const l=d=>{const u=d;u.detail.handled=!0,r.current=u.detail.returnFocus,n(p=>p.status==="open"&&Wn(p)?Rf(p,{type:"open_blocked",message:"Wait for the current Team setup change to finish before opening another Team."}):Rf(p,{type:"open",candidateRef:u.detail.candidateRef}))};return window.addEventListener(Tf,l),()=>{window.removeEventListener(Tf,l)}},[]),V(()=>{if(t.status==="open")for(const l of t.commands.filter(d=>d.status==="pending"))a({type:"command_started",id:l.id}),i(l).then(d=>a({type:"effect_outcome",outcome:d}))},[i,t]),V(()=>{if(t.status!=="open"||!t.focus)return;const l=document.getElementById(t.focus.targetId)??document.getElementById("legacy-team-setup-title");l&&(l.focus(),a({type:"focus_applied",id:t.focus.id}))},[t]),t.status==="closed"?null:o(yF,{session:t,onAssign:(l,d)=>a({type:"assign_device",deviceRef:l.deviceRef,targetIdentityRef:d}),onClear:l=>a({type:"clear_device",deviceRef:l.deviceRef}),onClose:()=>{if(Wn(t)){a({type:"close_blocked",message:"Team setup will stay open while this change saves. Close it after saving finishes."});return}a({type:"close"})},onCloseAutoFocus:l=>IF(l,r),onDecide:(l,d,u)=>{if(d==="included"&&!u){a({type:"open_blocked",message:`Save a person assignment before including ${l.displayName}.`});return}a({type:"decide_device",deviceRef:l.deviceRef,decision:d,...u?{targetIdentityRef:u}:{}})},onFinish:()=>a({type:"finish"}),onMap:(l,d)=>a({type:"map_project",projectRef:l.projectRef,resolvedProjectRef:d}),onNavigate:l=>a({type:"navigate",step:l}),onOpenAutoFocus:RF,onRefresh:()=>a({type:"refresh"}),onRetry:()=>a({type:"retry"})})}var RF=e=>{const t=document.getElementById("legacy-team-setup-title");t&&(e.preventDefault(),t.focus())};function IF(e,t){e.preventDefault();const n=document.querySelector('.tab-btn[aria-current="page"]');(SF(t.current)?t.current:n)?.focus(),t.current=null}function kF(e,t={}){const n={...wF,...t};Ue(o(CF,{dependencies:n}),e)}var xo=new WeakMap,Do=new Set,il=new Set,zw=100,vr="";function rn(e,t=""){const n=document.createElement("p");return t&&(n.className=t),n.textContent=e,n}function Ww(e,t){const n=document.createElement("h3");return n.className="recipient-policy-review-heading",n.textContent=`${e} (${t.toLocaleString()})`,n}function TF(e){const t=new Map;for(const n of e){const r=`${n.projectGroup.identity}\0${n.conditionCode}`,i=t.get(r);if(i){i.items.push(n);continue}t.set(r,{key:r,displayName:n.projectGroup.displayName,items:[n]})}return[...t.values()]}function Pf(e,t){return e.options.find(n=>n.decision===t)}function PF(e){const t=e.items[0];return t?Pf(t,t.recommendedDecision)?.label??t.recommendedDecision.replaceAll("_"," "):""}function Jw(e,t){const n=document.createElement("div");n.className="recipient-policy-preview-list";const r=document.createElement("strong");r.textContent=e;const i=document.createElement("ul");for(const a of t){const s=document.createElement("li");s.textContent=a,i.appendChild(s)}return n.append(r,i),n}function Yw(e){return[...new Map(e.map(t=>[t.id,t.label])).values()]}function NF(e){const t=new Map;for(const n of e)for(const r of n.preview.projects){const i=t.get(r.canonicalIdentity)??0;t.set(r.canonicalIdentity,Math.max(i,n.preview.affectedMemoryCount))}return[...t.values()].reduce((n,r)=>n+r,0)}function EF(e,t){const n=e.items.flatMap(l=>{const d=Pf(l,t);return d?[d]:[]}),r=Yw(n.flatMap(l=>l.preview.projects.map(d=>({id:d.canonicalIdentity,label:`${d.displayName} — ${d.canonicalIdentity}`})))),i=Yw(n.flatMap(l=>l.preview.effectiveDevices.map(d=>({id:d.deviceId,label:`${d.displayName} (${d.assignment})`})))),a=NF(n),s=document.createElement("div");s.className="recipient-policy-preview settings-note";const c=document.createElement("strong");return c.textContent=`Affected: ${r.length.toLocaleString()} Project${r.length===1?"":"s"} · ${a.toLocaleString()} memor${a===1?"y":"ies"} · ${i.length.toLocaleString()} device${i.length===1?"":"s"}`,s.append(c,Jw("Projects and paths",r)),i.length>0&&s.appendChild(Jw("Devices",i)),s}function AF(e){return e==="unassigned_effective_device"?"This decision needs Identity or device details. Complete that setup first, then return to this review.":"This decision needs recipient details. Use the Project sharing controls below, then return to this review."}async function xF(e,t){const n=e.items.map(a=>({decision:t,reviewItemId:a.reviewItemId,sourceFingerprint:a.sourceFingerprint}));if(n.length===1)try{return await RI(n[0]),{stale:!1,failed:!1}}catch(a){if(!(a instanceof th))throw a;return il.add(n[0].reviewItemId),{stale:!0,failed:!1}}let r=!1,i=!1;for(let a=0;a<n.length;a+=zw){const s=n.slice(a,a+zw),c=await II(s);for(const l of c.results)l.status==="stale"?(il.add(l.reviewItemId),r=!0):l.status!=="applied"&&(i=!0)}return{stale:r,failed:i}}function Xw(e){return e.items.length>1?"Apply to all worktrees":"Apply decision"}function Nf(e,t){const n=e.items[0];if(!n)return;const r=t.select.value,i=e.items.map(c=>Pf(c,r)),a=i.some(c=>c?.preview.requiresDecisionInput),s=i.some(c=>!c);t.previewMount.replaceChildren(EF(e,r)),t.deferred.textContent=a?AF(n.conditionCode):"",t.deferred.hidden=!a,t.submit.disabled=a||s||Do.has(e.key)}function DF(e,t){if(t.failed)return"Some review items could not be updated. Review the remaining items and try again.";if(t.stale)return"Source state changed. Review the refreshed choices before trying again.";for(const n of e.items)il.delete(n.reviewItemId);return"Decision applied. Review items refreshed."}function Qw(e,t){t.select.disabled=!1,t.submit.textContent=Xw(e),Nf(e,t)}async function LF(e,t,n,r){if(t.submit.disabled||Do.has(e.key))return;const i=t.select.value;Do.add(e.key),t.select.disabled=!0,t.submit.disabled=!0,t.submit.textContent="Applying…",n.textContent="Applying review decision…";try{const a=await xF(e,i);vr=DF(e,a),n.textContent=vr,Do.delete(e.key),(a.failed||a.stale)&&Qw(e,t),await r.onRefresh?.()}catch(a){vr=a instanceof Error?a.message:"Unable to apply decision.",n.textContent=vr,Do.delete(e.key),Qw(e,t);try{await r.onRefresh?.()}catch(s){const c=s instanceof Error?s.message:"Unable to refresh review items.";vr=`${vr} Refresh failed: ${c}`,n.textContent=vr}}}function $F(e,t,n,r){const i=e.items[0];if(!i)throw new Error("Review group must contain at least one item.");const a=document.createElement("div");a.className="project-inventory-actions";const s=document.createElement("label");s.htmlFor=`recipient-policy-decision-${t}`,s.textContent="Decision";const c=document.createElement("select");c.id=s.htmlFor,c.className="project-filter recipient-policy-review-select",c.dataset.reviewControl="decision";for(const f of i.options){const m=document.createElement("option");m.value=f.decision,m.textContent=f.label,c.appendChild(m)}c.value=i.recommendedDecision;const l=document.createElement("button");l.className="settings-button",l.type="button",l.textContent=Xw(e),l.dataset.reviewControl="apply";const d=rn("","settings-note recipient-policy-deferred"),u=document.createElement("div");u.className="recipient-policy-preview-mount",u.setAttribute("aria-live","polite");const p={container:a,deferred:d,previewMount:u,select:c,submit:l};return c.addEventListener("change",()=>Nf(e,p)),l.addEventListener("click",()=>LF(e,p,n,r)),Nf(e,p),a.append(s,c,l),p}function jF(e,t,n,r){const i=e.items[0];if(!i)throw new Error("Review group must contain at least one item.");const a=document.createElement("article");a.className="project-inventory-row recipient-policy-review-item",a.dataset.reviewGroup=e.key;const s=document.createElement("h4");s.className="project-inventory-title",s.textContent=`${e.displayName}: ${i.finding}`;const c=rn(i.reason,"project-inventory-meta"),l=rn(`Recommended: ${PF(e)}`,"settings-note");a.append(s,c,l),e.items.some(u=>il.has(u.reviewItemId))&&a.appendChild(rn("Source state changed while this decision was being reviewed. Review the refreshed choices before trying again.","settings-note project-attention-note"));const d=$F(e,t,n,r);return a.append(d.container,d.deferred,d.previewMount),a}function OF(e,t,n){const r=TF(e.reviewItems),i=document.createElement("section");i.className="recipient-policy-review-section recipient-policy-review-decisions",i.append(Ww("Review findings",r.length),rn("Review each repository before Codemem records how its older sharing state should be represented. Access stays unchanged until you apply a decision.","section-meta"));const a=document.createElement("div");return a.className="project-inventory-list recipient-policy-review-list",r.forEach((s,c)=>{a.appendChild(jF(s,c,t,n))}),i.appendChild(a),i}function MF(e,t){const n=document.createElement("article");n.className="project-inventory-row recipient-policy-blocked-item";const r=document.createElement("div");r.className="project-inventory-row-header";const i=document.createElement("h3");i.className="project-inventory-title",i.textContent=e.finding;const a=document.createElement("span");a.className="project-status-badge needs_attention",a.textContent="Blocked",r.append(i,a);const s=rn(e.repairAction,"settings-note");if(s.id=`recipient-policy-repair-help-${e.blockedItemId}`,n.append(r,rn(e.reason,"project-inventory-meta"),s,rn(`Owner: ${e.ownerLabel}`,"settings-note")),t.onRepair&&(t.isRepairAvailable?.(e.repair)??!0)){const c=document.createElement("button");c.className="settings-button",c.type="button",c.textContent=e.repair.label,c.setAttribute("aria-describedby",s.id),c.addEventListener("click",async()=>{c.disabled=!0;try{await t.onRepair?.(e.repair)}finally{c.disabled=!1}}),n.appendChild(c)}else n.appendChild(rn("Open Projects to repair this item.","settings-note"));return n}function FF(e,t){const n=document.createElement("section");n.className="recipient-policy-review-section recipient-policy-review-blocked",n.append(Ww("Blocked source repairs",e.blockedItems.length),rn("Access has not changed. Repair each source record before Codemem can safely interpret it.","section-meta project-attention-note"));const r=document.createElement("div");r.className="project-inventory-list recipient-policy-review-list";for(const i of e.blockedItems)r.appendChild(MF(i,t));return n.appendChild(r),n}function BF(e){const t=document.activeElement;if(!(t instanceof HTMLElement)||!e.contains(t))return null;const n=t.closest("[data-review-group]")?.dataset.reviewGroup,r=t.dataset.reviewControl;return n&&r?{group:n,control:r}:null}function qF(e,t){if(t){for(const n of e.querySelectorAll("[data-review-group]"))if(n.dataset.reviewGroup===t.group){n.querySelector(`[data-review-control="${t.control}"]`)?.focus();return}}}function UF(e,t,n={}){const r=t.blockedItems.map(u=>n.onRepair&&(n.isRepairAvailable?.(u.repair)??!0)?"1":"0"),i={blockedItems:t.blockedItems,reviewItems:t.reviewItems},a=`review:${r.join("")}:${JSON.stringify(i)}`;if(xo.get(e)===a)return;if(t.reviewItems.length===0&&t.blockedItems.length===0){e.replaceChildren(),e.hidden=!0,xo.set(e,a);return}const s=BF(e);e.hidden=!1;const c=document.createElement("section");c.className="card recipient-policy-review",c.setAttribute("aria-labelledby","recipientPolicyReviewTitle");const l=document.createElement("h2");l.id="recipientPolicyReviewTitle",l.textContent="Sharing review";const d=document.createElement("div");d.className="section-meta recipient-policy-review-status",d.setAttribute("role","status"),d.setAttribute("aria-live","polite"),d.textContent=vr,c.append(l,d),t.reviewItems.length>0&&c.appendChild(OF(t,d,n)),t.blockedItems.length>0&&c.appendChild(FF(t,n)),e.replaceChildren(c),qF(e,s),xo.set(e,a)}function GF(e,t){const n=t instanceof Error?t.message:"Unable to load recipient migration review.",r=`error:${n}`;if(xo.get(e)===r)return;e.hidden=!1;const i=document.createElement("section");i.className="card recipient-policy-review";const a=document.createElement("h2");a.textContent="Sharing review";const s=rn(n,"settings-note project-attention-note");s.setAttribute("role","status"),i.append(a,s),e.replaceChildren(i),xo.set(e,r)}var Zw=[["","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"]],bt=null,Ht=0,al=250,HF=100,Ef=[],ol=new Set,sl=new Set,cl=new Map,ll=new Map,ci=new Map,Lo=new Map,dl=!1,$o=new Map,jo=!1,yr=!1,Af=0,eS=null,Jn=0,Oo=0,sa=null,Mo=null,Vt=new Set,tS=new WeakMap,ul={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},ca=ul,br=!1,xf;function VF(e=!1,t={}){if(!e&&Mo)return Mo;const n=ah(t).then(r=>({ok:!0,summary:r})).catch(()=>({ok:!1}));return Mo=n,n.then(()=>{Mo===n&&(Mo=null)}),n}function Df(e){return VF(e.awaitTeamSetupSummary===!0||e.requireTeamSetupSummary===!0,e)}function Le(e){return document.getElementById(e)}function KF(e){return Zw.find(([t])=>t===e)?.[1]??e.replaceAll("_"," ")}function zF(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 bn(e){return e.read_only===!0&&e.read_only_reason==="peer_received"}function pl(e){return e.identity_source!=="unmapped"&&!bn(e)}function WF(e){const t=$o.get(e.workspace_identity);(!t||bn(t)&&!bn(e))&&$o.set(e.workspace_identity,e)}function Lf(e){return bn(e)?"Received from peers":ml(e.resolved_scope_id)}function JF(e){return bn(e)?"source-owned project":zF(e.resolution_reason)}function YF(e){const t=e.person.display_name;switch(e.lifecycle.state){case"waiting_for_acceptance":return`Invitation sent to ${t}`;case"active":return`Shared with ${t}`;case"waiting_for_device":return`Sharing with ${t}`;case"needs_attention":return`Sharing with ${t} needs attention`;case"revoking":return`Removing sharing with ${t}`;case"revoked":return`Previously shared with ${t}`;case"cancelled":return`Invitation to ${t} cancelled`;default:return`Setting up sharing with ${t}`}}function nS(e){if(!e)return"No recent sessions";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function rS(e){return[...new Set(e.map(t=>t.workspace_identity))].sort()}function li(){const e=Vt.size,t=Le("projectsShareSelected");t&&(t.textContent=e===0?"Share selected":`Share selected (${e})`,t.disabled=e===0||!yr||!br,t.classList.add("project-selection-target"));const n=Le("projectsSelectionStatus");n&&(n.setAttribute("role","status"),n.setAttribute("aria-live","polite"),n.textContent=`${e.toLocaleString()} Project${e===1?"":"s"} selected.`);for(const r of document.querySelectorAll(".project-selection-checkbox")){const i=tS.get(r)??[],a=i.filter(s=>Vt.has(s)).length;r.checked=i.length>0&&a===i.length,r.indeterminate=a>0&&a<i.length}for(const r of document.querySelectorAll(".project-recipient-action"))r.disabled=!yr||!br}function XF(e){const t=e.every(n=>Vt.has(n));for(const n of e)t?Vt.delete(n):Vt.add(n);li()}function iS(e,t){const n=rS(e),r=document.createElement("label");r.className="project-selection-control project-selection-target";const i=document.createElement("input");i.className="project-selection-checkbox",i.dataset.projectFocusKey=`select:${n.join("|")}`,i.type="checkbox",i.setAttribute("aria-label",t),tS.set(i,n),i.addEventListener("change",()=>XF(n));const a=document.createElement("span");return a.className="sr-only",a.textContent=t,r.append(i,a),r}function QF(e){if(!br)return[];const t=new Set(e),n=new Map(ca.teams.filter(a=>a.status==="active").map(a=>[a.teamId,a.displayName])),r=new Map(ca.identities.filter(a=>a.status==="active"||a.status==="pending").map(a=>[a.identityId,a.displayName])),i=new Map;for(const a of ca.projectRecipients)if(!(a.status!=="active"||!t.has(a.canonicalProjectIdentity)))if(a.recipientKind==="team"){const s=n.get(a.teamId);s&&i.set(`team:${a.teamId}`,{key:`team:${a.teamId}`,kind:"Team",displayName:s})}else{const s=r.get(a.identityId);s&&i.set(`identity:${a.identityId}`,{key:`identity:${a.identityId}`,kind:"Identity",displayName:s})}return[...i.values()].sort((a,s)=>`${a.kind}:${a.displayName}`.localeCompare(`${s.kind}:${s.displayName}`))}function aS(e){const t=document.createElement("div");t.className="project-recipient-summary";const n=QF(e),r=document.createElement("div");if(r.className="project-recipient-status",r.textContent=br?n.length===0?"Not shared with any recipients.":e.length===1?`Shared with ${n.length.toLocaleString()} recipient${n.length===1?"":"s"}.`:`${n.length.toLocaleString()} recipient${n.length===1?"":"s"} across these Project identities.`:"Recipient access is unavailable.",t.appendChild(r),n.length>0){const i=document.createElement("ul");i.className="project-recipient-chips",i.setAttribute("aria-label","Active recipients");for(const a of n){const s=document.createElement("li");s.className=`project-recipient-chip project-recipient-chip-${a.kind.toLowerCase()}`,s.textContent=`${a.kind}: ${a.displayName}`,i.appendChild(s)}t.appendChild(i)}return t}function oS(e,t){const n=document.createElement("button");return n.className="settings-button project-recipient-action project-selection-target",n.type="button",n.disabled=!yr||!br,e.length===1?(n.textContent="Manage recipients",n.setAttribute("aria-label",`Manage recipients for ${t}`),n.dataset.projectFocusKey=`manage:${e[0]}`,n.addEventListener("click",()=>{$a({mode:"project-manage",projectId:e[0]})})):(n.textContent="Share selected",n.setAttribute("aria-label",`Share selected identities for ${t}`),n.dataset.projectFocusKey=`share:${e.join("|")}`,n.addEventListener("click",()=>{for(const r of e)Vt.add(r);li(),$a({mode:"project-add",projectIds:[...e].sort()})})),n}function ZF(e){return e.git_remote?e.git_remote:e.cwd?e.cwd:e.workspace_identity}function $f(e){return e.git_remote?`git:${e.git_remote}`:e.project?`project:${e.project}`:`identity:${e.workspace_identity}`}function jf(e){return e.project||e.display_project||"Unnamed Project"}function sS(e){const t=String(e||"").trim();return t?S.lastProjectCoordinatorAdminGroups.find(n=>String(n.group_id||"").trim()===t&&!n.archived_at)?.display_name||"Team details unavailable":null}function eB(){return new Set(S.lastProjectCoordinatorAdminGroups.filter(e=>!e.archived_at).map(e=>String(e.group_id||"").trim()).filter(Boolean))}function tB(e){return!jo||e.authority_type!=="coordinator"||!e.group_id?!1:!eB().has(String(e.group_id).trim())}function fl(){const e=document.activeElement;return e instanceof HTMLSelectElement&&e.classList.contains("project-domain-select")}function cS(){dl&&(dl=!1,bt?.())}async function nB(){let e;try{const t=await Kl();e=t&&typeof t=="object"?t:null}catch{S.lastProjectCoordinatorAdminGroups=[],jo=!1;return}if(e?.readiness!=="ready"||!e.has_admin_secret){S.lastProjectCoordinatorAdminGroups=[],jo=!1;return}try{const t=await Um(!1);S.lastProjectCoordinatorAdminGroups=Array.isArray(t?.items)?t.items:[],jo=!0}catch{S.lastProjectCoordinatorAdminGroups=[],jo=!1}}function rB(e){return e.kind==="team_default"}function Of(e){const t=e.label||"Untitled Space";return rB(e)?`${t} (default)`:t}function iB(e,t){const n=Of(e);return t.some(r=>r.scope_id!==e.scope_id&&Of(r)===n)?`${n} · Space ID ${e.scope_id}`:n}function aB(e){const t=sS(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 oB(e){return e?Ef.find(t=>t.scope_id===e)??null:null}function ml(e){const t=oB(e);return e?t?`${Of(t)} · ${aB(t)}`:"Unknown Space":"—"}function Mf(){return Ef.filter(e=>e.scope_id!=="legacy-shared-review"&&!tB(e))}function sB(e){return Mf().some(t=>t.scope_id===e)}function lS(...e){for(const t of e)if(t&&sB(t))return t;return e.find(t=>!!t)??""}function cB(e){const t=sS(e.group_id);return t?`Team: ${t}`:e.authority_type==="local"?"Local device":e.authority_type==="coordinator"?"Coordinator Spaces":"Other Spaces"}function lB(e){return e.group_id?`team:${e.group_id}`:`${e.authority_type||"other"}:${e.kind||"space"}`}function dB(){const e=new Map;for(const t of Mf()){const n=lB(t),r=cB(t),i=e.get(n)??{label:r,scopes:[]};e.set(n,{label:i.label,scopes:[...i.scopes,t]})}return[...e.values()]}function dS(e){for(const t of dB()){const n=document.createElement("optgroup");n.label=t.label;for(const r of t.scopes){const i=document.createElement("option");i.value=r.scope_id,i.textContent=iB(r,t.scopes),n.appendChild(i)}e.appendChild(n)}}function uB(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 Ff(e,t,n=[]){try{await AI({...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}),ci.delete(e.workspace_identity),cl.delete(e.workspace_identity),X("Project Space assignment updated. Device access grants are unchanged."),bt?.()}catch(r){if(r instanceof is){ci.set(e.workspace_identity,{requiredGuardrailTokens:r.requiredGuardrailTokens,scopeId:t,warnings:r.guardrailWarnings}),bt?.();return}X(r instanceof Error?r.message:"Unable to update project Space.","warning")}}async function pB(e,t){const n=e.filter(pl);if(n.length!==0)try{await xI({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}))}),X(`Updated ${n.length} project identit${n.length===1?"y":"ies"}. Device access grants are unchanged.`),ll.delete($f(n[0])),bt?.()}catch(r){X(r instanceof is?"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 fB(e){if(e.mapping_id!=null)try{await DI(e.mapping_id),ci.delete(e.workspace_identity),cl.delete(e.workspace_identity),X("Project Space assignment removed. The next fallback now applies."),bt?.()}catch(t){X(t instanceof Error?t.message:"Unable to remove project Space assignment.","warning")}}async function uS(e,t=!1){try{const n=Lo.get(e.workspace_identity),r=await $I({...t&&n?{confirmation_token:n.confirmationToken}:{},confirmed:t,workspace_identity:e.workspace_identity});Lo.delete(e.workspace_identity),X(`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.`),bt?.()}catch(n){if(n instanceof Zm){Lo.set(e.workspace_identity,{confirmationToken:n.preview.confirmation_token,localOwnedMemoryCount:n.preview.local_owned_memory_count,peerOwnedMemoryCount:n.preview.peer_owned_memory_count}),bt?.();return}X(n instanceof Error?n.message:"Unable to forget project memories.","warning")}}async function pS(e){if(e.identity_source==="unmapped")return;const t=String(e.project||e.display_project||"").trim();let n=[];try{n=(await es()).filter(i=>i&&i!==t)}catch{}const r=await Tp({cancelLabel:"Cancel",confirmLabel:"Change project",description:`This will update ${e.session_count} session${e.session_count===1?"":"s"} and ${e.memory_count??0} memor${e.memory_count===1?"y":"ies"} by changing the stored project. Space assignment stays unchanged.`,initialValue:t,placeholder:"Project name",suggestions:n,title:"Change project",validate:i=>{const a=i.trim();return a?a===t?"Already assigned to this project.":null:"Enter a project name."}});if(r!=null)try{const i=await LI({project:r.trim(),workspace_identity:e.workspace_identity});X(`Changed project to ${i.project} for ${i.moved_session_count} session${i.moved_session_count===1?"":"s"}.`),bt?.()}catch(i){X(i instanceof Error?i.message:"Unable to change project.","warning")}}async function mB(e){const t=$o.get(e);if(t&&!bn(t))return{offset:Ht,project:t};try{let n=0,r=0;for(;;){const i=await Sa({limit:al,offset:n,q:e});r+=1;const a=i.projects.find(c=>c.workspace_identity===e&&!bn(c));if(a)return{offset:i.offset,project:a};if(!i.has_more||i.limit<=0)return null;const s=i.offset+i.limit;if(s<=n||r>=HF)return null;n=s}}catch{return null}}function fS(e){const t=[...document.querySelectorAll("[data-project-workspace-identity]")].find(a=>a.dataset.projectWorkspaceIdentity===e&&a.dataset.projectRepairable==="true");if(!t)return!1;const n=t.querySelector(".project-inventory-details");if(!n)return!1;const r=t.closest(".project-inventory-cluster"),i=r?.querySelector(":scope > .project-inventory-details");if(i){i.open=!0;const a=r?.dataset.projectClusterKey;a&&sl.add(a)}return n.open=!0,ol.add(`${t.dataset.projectRepairable}:${e}`),n.scrollIntoView?.({block:"center",behavior:"smooth"}),n.querySelector("summary")?.focus(),!0}async function hB(e){if(fl()){X("Finish the open Space assignment, then try Repair again.","warning");return}const t=Jn,n=Le("projectsSearch")?.value??"",r=Le("projectsStatusFilter")?.value??"",i=Ht,a=await mB(e.projectIdentity);if(Jn!==t||(Le("projectsSearch")?.value??"")!==n||(Le("projectsStatusFilter")?.value??"")!==r||Ht!==i)return;if(fl()){X("Finish the open Space assignment, then try Repair again.","warning");return}if(!a){X("This Project is not visible in the current inventory. Refresh Projects, then try Repair again.","warning");return}const{project:s}=a;if(e.kind==="reassign_project"){if(s.identity_source==="unmapped"||s.session_count===0){X("This Project cannot be reassigned yet because it has no local sessions with stable source evidence.","warning");return}await pS(s);return}if(!fS(s.workspace_identity)){const c=Le("projectsSearch"),l=c?.value??"",d=s.workspace_identity;c&&(c.value=d);const u=Le("projectsStatusFilter"),p=u?.value??"",f="";u&&(u.value=f);const m=Ht;Ht=a.offset;const v=Jn;if(await la(),!fS(s.workspace_identity)){if(Jn!==v||c&&c.value!==d||u&&u.value!==f||Ht!==a.offset)return;c&&(c.value=l),u&&(u.value=p),Ht=m,await la(),X("Project administration could not be opened. Refresh Projects and try again.","warning")}}}function gB(e){const t=Jn,n=(sa?.catch(()=>{})??Promise.resolve()).then(async()=>{if(Jn===t)try{await hB(e)}catch(r){X(r instanceof Error?r.message:"Unable to repair this Project.","warning")}});return sa=n,n.then(()=>{sa===n&&(sa=null)},()=>{sa===n&&(sa=null)}),n}function vB(e){const t=document.createElement("div");if(t.className="project-inventory-actions",pl(e)&&e.memory_count!=null&&e.guardrail_warnings.every(m=>!m.requires_confirmation)){const m=document.createElement("button");m.className="settings-button",m.type="button",m.textContent="Share",m.disabled=!yr,yr||(m.title="The complete project list is unavailable."),m.addEventListener("click",()=>As([e.workspace_identity])),t.appendChild(m)}if(bn(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 i=document.createElement("select");i.id=r,i.className="project-domain-select";const a=Mf().some(m=>m.scope_id===e.resolved_scope_id);if(!a&&e.resolved_scope_id){const m=document.createElement("option");m.value=e.resolved_scope_id,m.textContent=`${ml(e.resolved_scope_id)} — not assignable`,m.disabled=!0,i.appendChild(m)}dS(i),i.value=lS(cl.get(e.workspace_identity),e.suggested_scope_id,e.resolved_scope_id);const s=document.createElement("button");s.className="settings-button",s.type="button",s.textContent=e.suggested_scope_id&&i.value===e.suggested_scope_id?"Confirm suggestion":"Save Space",s.disabled=!i.value||i.value===e.resolved_scope_id&&!a,s.addEventListener("click",()=>{Ff(e,i.value)}),i.addEventListener("change",()=>{cl.set(e.workspace_identity,i.value),ci.delete(e.workspace_identity),t.querySelector(".project-space-guardrail-confirmation")?.remove(),s.textContent="Save Space",s.disabled=!i.value,bt?.()}),i.addEventListener("blur",cS);const c=document.createElement("button");c.className="settings-button",c.type="button",c.textContent="Keep local-only",c.addEventListener("click",()=>{Ff(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",()=>{fB(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",()=>{pS(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",()=>{uS(e)}),t.append(n,i,s,c,l,d,u);const p=ci.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 b=document.createElement("p");b.textContent="Codemem can save this change after you acknowledge the checks below. Verify the workspace details, then confirm to complete the save.";const h=document.createElement("ul");for(const _ of p.warnings){const R=document.createElement("li"),I=document.createElement("strong");I.textContent=`${uB(_)}: `;const T=document.createElement("span");T.textContent=_.message,R.append(I,T),h.appendChild(R)}const y=document.createElement("button");y.className="settings-button",y.type="button",y.textContent="I understand, save Space",y.addEventListener("click",()=>{const _=ci.get(e.workspace_identity);!_||_.scopeId!==i.value||Ff(e,_.scopeId,_.requiredGuardrailTokens)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{ci.delete(e.workspace_identity),bt?.()}),m.append(v,b,h,y,w),t.appendChild(m)}const f=Lo.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 b=document.createElement("p");b.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 h=document.createElement("p");h.textContent="Use this only to clean up wrongly attributed local project inventory; it forgets actual local memories on this device.";const y=document.createElement("button");y.className="settings-button danger",y.type="button",y.textContent="I understand, forget local memories",y.addEventListener("click",()=>{uS(e,!0)});const w=document.createElement("button");w.className="settings-button",w.type="button",w.textContent="Cancel",w.addEventListener("click",()=>{Lo.delete(e.workspace_identity),bt?.()}),m.append(v,b,h,y,w),t.appendChild(m)}return t}function mS(e){const t=document.createElement("article");t.className="project-inventory-row",t.dataset.projectWorkspaceIdentity=e.workspace_identity,t.dataset.projectRepairable=String(pl(e));const n=`project-title-${e.workspace_identity.replace(/[^a-z0-9_-]/gi,"-")}`;t.setAttribute("aria-labelledby",n);const r=document.createElement("div");r.className="project-inventory-row-header",Ps(e)&&r.appendChild(iS([e],`Select ${e.display_project} for recipient sharing`));const i=document.createElement("h3");i.className="project-inventory-title",i.id=n,i.textContent=e.display_project,r.appendChild(i),Ps(e)&&r.appendChild(oS([e.workspace_identity],e.display_project)),t.appendChild(r);const a=document.createElement("div");a.className="project-inventory-meta",a.textContent=`${(e.memory_count??0).toLocaleString()} memories · ${e.session_count.toLocaleString()} sessions · ${nS(e.latest_session_at)}`,t.appendChild(a),t.appendChild(aS([e.workspace_identity]));const s=document.createElement("div");s.className="project-advanced-administration";const c=document.createElement("div");c.className="project-inventory-domain",c.textContent=Lf(e),s.appendChild(c);const l=document.createElement("div");if(l.className="project-inventory-meta",l.textContent=`${JF(e)} · ${e.identity_source} · ${nS(e.latest_session_at)}`,s.appendChild(l),e.sharing&&e.sharing.length>0){const h=document.createElement("div");h.className="settings-note project-sharing-summary";const y=document.createElement("strong");y.textContent="Project sharing";const w=document.createElement("ul");w.setAttribute("aria-label",`People sharing ${e.display_project}`);for(const _ of e.sharing){const R=document.createElement("li"),I=document.createElement("strong");I.textContent=YF(_);const T=document.createElement("span");T.textContent=` — ${_.lifecycle.label}. ${_.lifecycle.explanation}`,R.append(I,T),w.appendChild(R)}h.append(y,w),s.appendChild(h)}if(bn(e)){const h=document.createElement("div");h.className="settings-note",h.textContent="Received memories keep the source device's project and Space assignment. Local reassignment controls are disabled here to avoid split-brain sync state.",s.appendChild(h)}const d=document.createElement("div");if(d.className="project-inventory-signal mono",d.textContent=ZF(e),s.appendChild(d),e.suggested_scope_id&&e.suggested_scope_id!==e.resolved_scope_id){const h=document.createElement("div");h.className="settings-note project-suggestion-note",h.textContent=e.suggestion_reason?`Suggestion: ${e.suggestion_reason}`:`Suggestion: assign this project to ${ml(e.suggested_scope_id)}.`,s.appendChild(h)}const u=(e.guardrail_warnings??[]).filter(h=>h.severity==="warning");if(u.length>0){const h=document.createElement("div");h.className="settings-note project-attention-note",h.textContent=`Needs attention: ${u.map(y=>y.message).join(" ")}`,s.appendChild(h)}if(e.statuses.length>0){const h=document.createElement("div");h.className="project-inventory-badges";for(const y of e.statuses){const w=document.createElement("span");w.className=`project-status-badge ${y}`,w.textContent=KF(y),h.appendChild(w)}s.appendChild(h)}const p=document.createElement("details");p.className="project-inventory-details";const f=`${t.dataset.projectRepairable}:${e.workspace_identity}`;p.open=ol.has(f),p.addEventListener("toggle",()=>{p.open?ol.add(f):ol.delete(f)});const m=document.createElement("summary");m.dataset.projectFocusKey=`admin:${t.dataset.projectRepairable}:${e.workspace_identity}`,m.textContent=u.length>0?`Advanced Project administration — ${u.length.toLocaleString()} item${u.length===1?"":"s"} need attention`:"Advanced Project administration",p.appendChild(m),p.appendChild(s);const v=document.createElement("dl");v.className="project-detail-grid";const b=[["Workspace identity",e.workspace_identity],["Project",e.project],["CWD",e.cwd],["Git remote",e.git_remote],["Git branch",e.git_branch],["Current Space",Lf(e)],["Suggested Space",e.suggested_scope_id?ml(e.suggested_scope_id):null],["Advanced: current Space ID",e.resolved_scope_id],["Advanced: suggested Space ID",e.suggested_scope_id],["Suggestion reason",e.suggestion_reason],["Sessions",e.session_count],["Memories",e.memory_count??"count unavailable"]];for(const[h,y]of b){const w=document.createElement("dt");w.textContent=h;const _=document.createElement("dd");_.textContent=y==null||y===""?"—":String(y),v.append(w,_)}return p.appendChild(v),p.appendChild(vB(e)),t.appendChild(p),t}function yB(e){const t=[...new Set(e.map(n=>Lf(n)))];return t.length===1?t[0]:"Mixed Spaces"}function bB(e){if(e.length===1)return mS(e[0]);const t=$f(e[0]),n=e.filter(Ps),r=rS(n),i=document.createElement("article");i.className="project-inventory-row project-inventory-cluster",i.dataset.projectClusterKey=t;const a=jf(e[0]),s=`project-cluster-title-${t.replace(/[^a-z0-9_-]/gi,"-")}`;i.setAttribute("aria-labelledby",s);const c=document.createElement("div");c.className="project-inventory-row-header",n.length>0&&c.appendChild(iS(n,`Select all identities for ${jf(e[0])}`));const l=document.createElement("h3");l.className="project-inventory-title",l.id=s,l.textContent=a,c.appendChild(l),r.length>0&&c.appendChild(oS(r,a)),i.appendChild(c);const d=document.createElement("div");d.className="project-advanced-administration";const u=document.createElement("div");u.className="project-inventory-domain",u.textContent=yB(e),d.appendChild(u);const p=e.reduce((_,R)=>_+(R.memory_count??0),0),f=e.reduce((_,R)=>_+R.session_count,0),m=document.createElement("div");m.className="project-inventory-meta",m.textContent=`${e.length} identities · ${f.toLocaleString()} sessions · ${p.toLocaleString()} memories`,i.appendChild(m),i.appendChild(aS(r));const v=document.createElement("div");v.className="project-inventory-actions";const b=e.filter(pl);if(b.length===0){const _=document.createElement("div");_.className="settings-note",_.textContent=e.every(bn)?"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.",v.appendChild(_),d.appendChild(v)}else{const _=b.map(N=>({project:N,warnings:(N.guardrail_warnings??[]).filter(j=>j.requires_confirmation)})),R=_.some(({warnings:N})=>N.length>0),I=new Set(b.map(N=>N.suggested_scope_id).filter(N=>!!N)),T=new Set(b.map(N=>N.resolved_scope_id)),A=document.createElement("select");A.className="project-domain-select",A.setAttribute("aria-label",`Space for ${jf(e[0])} group`);const L=document.createElement("option");L.value="",L.textContent="Choose Space…",A.appendChild(L),dS(A),A.value=lS(ll.get(t));const F=document.createElement("button");if(F.className="settings-button",F.type="button",F.textContent=`Save Space for ${b.length} identit${b.length===1?"y":"ies"}`,F.disabled=!A.value||R,F.addEventListener("click",()=>{pB(b,A.value)}),A.addEventListener("change",()=>{A.value?ll.set(t,A.value):ll.delete(t),F.disabled=!A.value||R}),A.addEventListener("blur",cS),v.append(A,F),I.size>1||T.size>1||R){const N=document.createElement("div");if(N.className="settings-note project-attention-note",N.textContent=R?"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.",R){const j=document.createElement("ul");for(const{project:x,warnings:U}of _){if(U.length===0)continue;const q=document.createElement("li"),$=document.createElement("strong");$.textContent=`Blocked identity: ${x.workspace_identity}`;const E=document.createElement("span");E.textContent=` — ${U.map(C=>C.message).join(" ")}`,q.append($,E),j.appendChild(q)}N.appendChild(j)}v.appendChild(N)}d.appendChild(v)}const h=document.createElement("details");h.className="project-inventory-details",h.open=sl.has(t),h.addEventListener("toggle",()=>{h.open?sl.add(t):sl.delete(t)});const y=document.createElement("summary"),w=e.reduce((_,R)=>_+(R.guardrail_warnings??[]).filter(I=>I.severity==="warning").length,0);y.textContent=w>0?`Advanced Project administration — ${w.toLocaleString()} item${w===1?"":"s"} need attention`:"Advanced Project administration",h.appendChild(y),h.appendChild(d);for(const _ of e)h.appendChild(mS(_));return i.appendChild(h),i}function _B(e){const t=new Map;for(const n of e){const r=$f(n);t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function hS(e){const t=Le("projectsInventoryList");if(!t)return;t.textContent="";const n=document.createElement("div");n.className="settings-note",n.textContent=e,t.appendChild(n)}function gS(){document.getElementById("projectsInventorySkeleton")?.remove()}function vS(e){const t=Le("projectsInventoryMeta"),n=Le("projectsInventoryList");if(!t||!n)return;const r=document.activeElement instanceof HTMLElement?document.activeElement.dataset.projectFocusKey:void 0;gS(),$o.clear();for(const s of e.projects)WF(s);if(n.textContent="",e.projects.length===0)hS("No projects match those filters.");else for(const s of _B(e.projects))n.appendChild(bB(s));t.textContent=e.total===0?"0 project identities found":`${e.total} project identit${e.total===1?"y":"ies"} found · showing ${e.offset+1}-${Math.min(e.offset+e.projects.length,e.total)}`;const i=Le("projectsPrevPage"),a=Le("projectsNextPage");i&&(i.disabled=e.offset===0),a&&(a.disabled=!e.has_more),li(),r&&[...n.querySelectorAll("[data-project-focus-key]")].find(s=>s.dataset.projectFocusKey===r)?.focus()}function wB(e,t){nB().then(()=>{t===Af&&(fl()||vS(e))})}async function SB(e={}){const t=new Map;let n=0;for(;;){const r=await Sa({limit:250,offset:n,signal:e.signal});for(const i of r.projects)t.set(i.workspace_identity,i);if(!r.has_more)break;n+=r.limit}return[...t.values()]}function CB(e){return Sa({limit:al,offset:Ht,q:Le("projectsSearch")?.value.trim()||void 0,status:Le("projectsStatusFilter")?.value||void 0,signal:e.signal})}function yS(e,t,n){const r=Le("recipientPolicyManagementMount");r&&yv(r,Ns(e),t,{loadError:n,onCommitted:i=>{i.status==="applied"&&Vt.clear(),li(),bt?.()}})}function bS(e,t){const n=t?.candidates??[],r=e.querySelector(":scope > .project-team-setup-entry");r?.querySelector(".project-team-setup-status")?.remove();const i=r?.contains(document.activeElement)&&document.activeElement instanceof HTMLButtonElement?document.activeElement.dataset.teamSetupCandidateRef:void 0;if(n.length===0){r?.remove(),e.hidden=e.querySelector(":scope > .project-recipient-policy-review-content")?.hidden!==!1,i&&Le("projectsSearch")?.focus();return}const a=JSON.stringify(n.map(d=>[d.candidateRef,d.displayName]));if(r?.dataset.teamSetupSignature===a){e.hidden=!1;return}r?.remove(),e.hidden=!1;const s=document.createElement("section");s.className="card project-team-setup-entry",s.dataset.teamSetupSignature=a;const c=document.createElement("h2");c.textContent="Finish setting up this Team";const l=document.createElement("p");l.className="section-meta",l.textContent="Tell Codemem who uses each device before using this Team for Project sharing.",s.append(c,l);for(const d of n){const u=document.createElement("div");u.className="project-inventory-actions";const p=document.createElement("strong");if(p.textContent=d.displayName,u.appendChild(p),xf){const f=document.createElement("button");f.setAttribute("aria-label",`Finish setting up ${d.displayName}`),f.className="settings-button",f.type="button",f.textContent="Finish setting up this Team",f.dataset.teamSetupCandidateRef=d.candidateRef,f.addEventListener("click",()=>xf?.(d.candidateRef)),u.appendChild(f)}s.appendChild(u)}if(e.appendChild(s),i){let d=!1;for(const u of s.querySelectorAll("button"))if(u.dataset.teamSetupCandidateRef===i){u.focus(),d=!0;break}d||Le("projectsSearch")?.focus()}}function _S(e){const t=e.querySelector(":scope > .project-team-setup-entry");if(!t)return;let n=t.querySelector(".project-team-setup-status");n||(n=document.createElement("p"),n.className="section-meta project-team-setup-status",n.setAttribute("role","status"),t.appendChild(n)),n.textContent="Team setup status is temporarily unavailable. The previous Team setup status is being shown.",e.hidden=!1}function RB(e){const t=e.querySelector(":scope > .project-recipient-policy-review-content");if(t)return t;const n=document.createElement("div");return n.className="project-recipient-policy-review-content",e.prepend(n),n}function la(e={}){const t=EB(e);return eS=t,t}async function wS(e,t){return e.signal?.aborted?!1:!e.awaitTeamSetupSummary&&!e.requireTeamSetupSummary?eS??!1:(await t,!1)}function hl(e,t){return!t.signal?.aborted&&e===Af}function gl(e){return e.awaitTeamSetupSummary===!0||e.requireTeamSetupSummary===!0}async function IB(e){if(!gl(e))return!0;const t=await Df(e);return e.signal?.aborted?!1:!e.requireTeamSetupSummary||t.ok}async function kB(e){if(dl=!0,!gl(e))return!0;const t=++Oo,n=await Df(e);if(e.signal?.aborted||t!==Oo)return!1;const r=Le("recipientPolicyReviewMount");return n.ok?(r&&bS(r,n.summary),!0):(r&&_S(r),!e.requireTeamSetupSummary)}function TB(e){return gl(e.options)?e.teamSetupSummaryPromise.then(t=>!hl(e.loadGeneration,e.options)||e.entryLoadGeneration!==Oo?!1:e.requiredLoadSucceeded&&(!e.options.requireTeamSetupSummary||t.ok)):e.requiredLoadSucceeded}async function PB(e,t){return gl(e)&&await t,!1}function NB(e){const t=Le("recipientPolicyReviewMount");if(!t)return;const n=RB(t);"review"in e?UF(n,e.review,{isRepairAvailable:r=>!r.projectIdentity.startsWith("unmapped:"),onRefresh:async()=>{await la()},onRepair:gB}):GF(n,e.error),t.hidden=n.hidden&&!t.querySelector(".project-team-setup-entry")}async function EB(e){const t=Le("projectsInventoryMeta"),n=Le("projectsInventoryList");if(!t||!n)return IB(e);if(fl())return kB(e);dl=!1;const r=++Af;yr=!1,br=!1,li(),t.textContent="Loading project inventory…";let i=null;try{const a=++Oo;i=Df(e);const[s,c,l,d,u]=await Promise.all([CB(e),kI(e),SB(e).then(f=>({ok:!0,projects:f})).catch(()=>({ok:!1,projects:[]})),CI(e).then(f=>({ok:!0,review:f})).catch(f=>({ok:!1,error:f})),ed(e).then(f=>({ok:!0,intent:f})).catch(f=>({ok:!1,error:f}))]);if(!hl(r,e))return wS(e,i);if(Ef=c.scopes,yr=l.ok,br=u.ok,ca=u.ok?u.intent:ul,l.ok){const f=new Set(Ns(l.projects).map(m=>m.canonicalProjectIdentity));for(const m of Vt)f.has(m)||Vt.delete(m)}const p=Le("projectShareFlowMount");return p&&Cv(p,l.projects,{inventoryError:!l.ok}),NB(d),yS(l.projects,ca,!l.ok||!u.ok),vS(s),wB(s,r),i.then(f=>{if(!hl(r,e)||a!==Oo)return;const m=Le("recipientPolicyReviewMount");if(m){if(!f.ok){_S(m);return}bS(m,f.summary)}}),TB({entryLoadGeneration:a,loadGeneration:r,options:e,requiredLoadSucceeded:l.ok&&"review"in d&&u.ok,teamSetupSummaryPromise:i})}catch(a){if(!hl(r,e))return wS(e,i);$o.clear(),yr=!1,br=!1,ca=ul;const s=Le("projectShareFlowMount");return s&&Cv(s,[],{inventoryError:!0}),yS([],ul,!0),li(),gS(),t.textContent="Project inventory failed to load.",hS(a instanceof Error?a.message:"Unable to load project inventory."),PB(e,i)}}function AB(e,t={}){bt=e,xf=t.onOpenTeamSetup,Vt.clear();const n=Le("projectsStatusFilter");if(n&&n.options.length===0)for(const[a,s]of Zw){const c=document.createElement("option");c.value=a,c.textContent=s,n.appendChild(c)}const r=()=>{Jn+=1,Ht=0,bt?.()};Le("projectsSearch")?.addEventListener("input",r),n?.addEventListener("change",r),Le("projectsPrevPage")?.addEventListener("click",()=>{Jn+=1,Ht=Math.max(0,Ht-al),bt?.()}),Le("projectsNextPage")?.addEventListener("click",()=>{Jn+=1,Ht+=al,bt?.()});const i=Le("projectsShareSelected");i&&i.dataset.recipientPolicyBound!=="true"&&(i.dataset.recipientPolicyBound="true",i.addEventListener("click",()=>{Vt.size!==0&&$a({mode:"project-add",projectIds:[...Vt].sort()})})),li()}function Bf(e,t){const n=e.trim();if(!n)return[];const r=JSON.parse(n);if(!Array.isArray(r)||r.some(a=>typeof a!="string"))throw new Error(`${t.label} must be a JSON string array`);if(!t.normalize&&!t.requireNonEmpty)return r;const i=t.normalize?r.map(a=>a.trim()):r;if(t.requireNonEmpty&&i.some(a=>a.trim()===""))throw new Error(`${t.label} cannot contain empty command tokens`);return i}function xB(e){const t=e.trim();if(!t)return{};const n=JSON.parse(t);if(!n||typeof n!="object"||Array.isArray(n))throw new Error("observer headers must be a JSON object");const r={};for(const[i,a]of Object.entries(n)){if(typeof i!="string"||!i.trim()||typeof a!="string")throw new Error("observer headers must map string keys to string values");r[i.trim()]=a}return r}var SS="codemem-settings-advanced",CS="gpt-5.1-codex-mini",RS="claude-4.5-haiku",DB=[{value:"observer",label:"Connection"},{value:"queue",label:"Processing"},{value:"sync",label:"Device Sync"}],LB={claudeCommand:"claude_command",codexCommand:"codex_command",observerProvider:"observer_provider",observerModel:"observer_model",observerTierRoutingEnabled:"observer_tier_routing_enabled",observerSimpleModel:"observer_simple_model",observerSimpleTemperature:"observer_simple_temperature",observerReasoningEffort:"observer_reasoning_effort",observerReasoningSummary:"observer_reasoning_summary",observerRichModel:"observer_rich_model",observerRichTemperature:"observer_rich_temperature",observerRichReasoningEffort:"observer_rich_reasoning_effort",observerRichReasoningSummary:"observer_rich_reasoning_summary",observerRichMaxOutputTokens:"observer_rich_max_output_tokens",observerRuntime:"observer_runtime",observerAuthSource:"observer_auth_source",observerAuthFile:"observer_auth_file",observerAuthCommand:"observer_auth_command",observerAuthTimeoutMs:"observer_auth_timeout_ms",observerAuthCacheTtlS:"observer_auth_cache_ttl_s",observerHeaders:"observer_headers",observerMaxChars:"observer_max_chars",packObservationLimit:"pack_observation_limit",packSessionLimit:"pack_session_limit",rawEventsSweeperIntervalS:"raw_events_sweeper_interval_s",syncEnabled:"sync_enabled",syncHost:"sync_host",syncPort:"sync_port",syncInterval:"sync_interval_s",syncMdns:"sync_mdns",syncCoordinatorUrl:"sync_coordinator_url",syncCoordinatorGroup:"sync_coordinator_group",syncCoordinatorTimeout:"sync_coordinator_timeout_s",syncCoordinatorPresenceTtl:"sync_coordinator_presence_ttl_s"},$B=new Set(["claude_command","codex_command","observer_base_url","observer_auth_file","observer_auth_command","observer_headers","sync_coordinator_url"]),jB={claudeCommand:"",codexCommand:"",observerProvider:"",observerModel:"",observerTierRoutingEnabled:!1,observerSimpleModel:"",observerSimpleTemperature:"",observerReasoningEffort:"",observerReasoningSummary:"",observerRichModel:"",observerRichTemperature:"",observerRichReasoningEffort:"",observerRichReasoningSummary:"",observerRichMaxOutputTokens:"",observerRuntime:"api_http",observerAuthSource:"auto",observerAuthFile:"",observerAuthCommand:"",observerAuthTimeoutMs:"",observerAuthCacheTtlS:"",observerHeaders:"",observerMaxChars:"",packObservationLimit:"",packSessionLimit:"",rawEventsSweeperIntervalS:"",syncEnabled:!1,syncHost:"",syncPort:"",syncInterval:"",syncMdns:!1,syncCoordinatorUrl:"",syncCoordinatorGroup:"",syncCoordinatorTimeout:"",syncCoordinatorPresenceTtl:""};function OB(){try{return globalThis.localStorage?.getItem(SS)==="1"}catch{return!1}}function MB(e){try{globalThis.localStorage?.setItem(SS,e?"1":"0")}catch{}}function Yn(e,t){return typeof e=="object"&&e!==null&&Object.hasOwn(e,t)}function Ae(e,t,n){if(Yn(t,n))return t[n];if(Yn(e,n))return e[n]}function $e(e){return e==null?"":String(e)}function vl(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 FB(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}function BB(e,t){return e===t?!0:JSON.stringify(e)===JSON.stringify(t)}function ct(e){const t=e.trim();return t===""?"":t}function qB(e,t,n){return n?{model:n,source:"Configured"}:e==="claude_sidecar"?{model:RS,source:"Recommended (local Claude session)"}:e==="codex_sidecar"?{model:CS,source:"Recommended (local Codex session)"}:t==="anthropic"?{model:RS,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:CS,source:"Recommended (direct API)"}}function UB(e,t){const n=e??{};switch(t){case"claude_command":{const r=n.claude_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(a=>{if(typeof a!="string")return;const s=a.trim();s&&i.push(s)}),i}case"codex_command":{const r=n.codex_command;if(!Array.isArray(r))return[];const i=[];return r.forEach(a=>{if(typeof a!="string")return;const s=a.trim();s&&i.push(s)}),i}case"observer_provider":case"observer_model":case"observer_simple_model":case"observer_reasoning_effort":case"observer_reasoning_summary":case"observer_rich_model":case"observer_rich_reasoning_effort":case"observer_rich_reasoning_summary":case"observer_auth_file":case"sync_host":case"sync_coordinator_url":case"sync_coordinator_group":return ct($e(n[t]));case"observer_runtime":return ct($e(n.observer_runtime));case"observer_auth_source":return ct($e(n.observer_auth_source));case"observer_auth_command":{const r=n.observer_auth_command;return Array.isArray(r)?r.filter(i=>typeof i=="string"):[]}case"observer_headers":{const r=n.observer_headers;if(!r||typeof r!="object"||Array.isArray(r))return{};const i={};return Object.entries(r).forEach(([a,s])=>{typeof a=="string"&&a.trim()&&typeof s=="string"&&(i[a.trim()]=s)}),i}case"observer_auth_timeout_ms":case"observer_max_chars":case"observer_simple_temperature":case"observer_rich_temperature":case"observer_rich_max_output_tokens":case"pack_observation_limit":case"pack_session_limit":case"raw_events_sweeper_interval_s":case"sync_port":case"sync_interval_s":{if(!Yn(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(!Yn(n,t))return"";const r=Number(n[t]);return Number.isFinite(r)&&r>0?r:""}case"observer_auth_cache_ttl_s":{if(!Yn(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 vl(n[t]);default:return Yn(n,t)?n[t]:""}}function GB(e,t,n){const r={...e};return Object.keys(n).forEach(i=>{Yn(r,i)&&(r[i]=UB(t,i))}),r}function HB(e){const{values:t,touchedKeys:n,baseline:r}=e,i=e.allowUntouchedParseErrors===!0;let a=[];try{a=Bf(t.claudeCommand,{label:"claude command",normalize:!0,requireNonEmpty:!0})}catch(R){if(!i||n.has("claude_command"))throw R;const I=r.claude_command;a=Array.isArray(I)?I.filter(T=>typeof T=="string").map(T=>T.trim()).filter(T=>T.length>0):[]}let s=[];try{s=Bf(t.codexCommand,{label:"codex command",normalize:!0,requireNonEmpty:!0})}catch(R){if(!i||n.has("codex_command"))throw R;const I=r.codex_command;s=Array.isArray(I)?I.filter(T=>typeof T=="string").map(T=>T.trim()).filter(T=>T.length>0):[]}let c=[];try{c=Bf(t.observerAuthCommand,{label:"observer auth command"})}catch(R){if(!i||n.has("observer_auth_command"))throw R;const I=r.observer_auth_command;c=Array.isArray(I)?I.filter(T=>typeof T=="string"):[]}let l={};try{l=xB(t.observerHeaders)}catch(R){if(!i||n.has("observer_headers"))throw R;const I=r.observer_headers;I&&typeof I=="object"&&!Array.isArray(I)&&Object.entries(I).forEach(([T,A])=>{typeof T=="string"&&T.trim()&&typeof A=="string"&&(l[T]=A)})}const d=t.observerAuthCacheTtlS.trim(),u=t.observerSimpleTemperature.trim(),p=t.observerRichTemperature.trim(),f=t.observerRichMaxOutputTokens.trim(),m=t.rawEventsSweeperIntervalS.trim(),v=d===""?"":Number(d),b=u===""?"":Number(u),h=p===""?"":Number(p),y=f===""?"":Number(f),w=Number(m),_=m===""?"":w;if(d!==""&&!Number.isFinite(v))throw new Error("observer auth cache ttl must be a number");if(u!==""&&(typeof b!="number"||!Number.isFinite(b)||b<0))throw new Error("simple tier temperature must be a non-negative number");if(p!==""&&(typeof h!="number"||!Number.isFinite(h)||h<0))throw new Error("rich tier temperature must be a non-negative number");if(f!==""&&(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(m!==""&&(!Number.isFinite(w)||w<=0))throw new Error("raw-event sweeper interval must be a positive number");return{claude_command:a,codex_command:s,observer_provider:ct(t.observerProvider),observer_model:ct(t.observerModel),observer_tier_routing_enabled:t.observerTierRoutingEnabled,observer_simple_model:ct(t.observerSimpleModel),observer_simple_temperature:b,observer_reasoning_effort:ct(t.observerReasoningEffort),observer_reasoning_summary:ct(t.observerReasoningSummary),observer_rich_model:ct(t.observerRichModel),observer_rich_temperature:h,observer_rich_reasoning_effort:ct(t.observerRichReasoningEffort),observer_rich_reasoning_summary:ct(t.observerRichReasoningSummary),observer_rich_max_output_tokens:y,observer_runtime:ct(t.observerRuntime||"api_http")||"api_http",observer_auth_source:ct(t.observerAuthSource||"auto")||"auto",observer_auth_file:ct(t.observerAuthFile),observer_auth_command:c,observer_auth_timeout_ms:Number(t.observerAuthTimeoutMs||0)||"",observer_auth_cache_ttl_s:v,observer_headers:l,observer_max_chars:Number(t.observerMaxChars||0)||"",pack_observation_limit:Number(t.packObservationLimit||0)||"",pack_session_limit:Number(t.packSessionLimit||0)||"",raw_events_sweeper_interval_s:_,sync_enabled:t.syncEnabled,sync_host:ct(t.syncHost),sync_port:Number(t.syncPort||0)||"",sync_interval_s:Number(t.syncInterval||0)||"",sync_mdns:t.syncMdns,sync_coordinator_url:ct(t.syncCoordinatorUrl),sync_coordinator_group:ct(t.syncCoordinatorGroup),sync_coordinator_timeout_s:Number(t.syncCoordinatorTimeout||0)||"",sync_coordinator_presence_ttl_s:Number(t.syncCoordinatorPresenceTtl||0)||""}}function VB(e){const t=e.config||{},n=e.effective||{},r=Ae(t,n,"observer_headers"),i=r&&typeof r=="object"&&!Array.isArray(r)?Object.fromEntries(Object.entries(r).filter(([p,f])=>typeof p=="string"&&p.trim()&&typeof f=="string")):{},a=Ae(t,n,"claude_command"),s=Array.isArray(a)?a.filter(p=>typeof p=="string"):[],c=Ae(t,n,"codex_command"),l=Array.isArray(c)?c.filter(p=>typeof p=="string"):[],d=Ae(t,n,"observer_auth_command"),u=Array.isArray(d)?d.filter(p=>typeof p=="string"):[];return{claudeCommand:s.length?JSON.stringify(s,null,2):"",codexCommand:l.length?JSON.stringify(l,null,2):"",observerProvider:$e(Ae(t,n,"observer_provider")),observerModel:$e(Ae(t,n,"observer_model")),observerTierRoutingEnabled:vl(Ae(t,n,"observer_tier_routing_enabled")),observerSimpleModel:$e(Ae(t,n,"observer_simple_model")),observerSimpleTemperature:$e(Ae(t,n,"observer_simple_temperature")),observerReasoningEffort:$e(Ae(t,n,"observer_reasoning_effort")),observerReasoningSummary:$e(Ae(t,n,"observer_reasoning_summary")),observerRichModel:$e(Ae(t,n,"observer_rich_model")),observerRichTemperature:$e(Ae(t,n,"observer_rich_temperature")),observerRichReasoningEffort:$e(Ae(t,n,"observer_rich_reasoning_effort")),observerRichReasoningSummary:$e(Ae(t,n,"observer_rich_reasoning_summary")),observerRichMaxOutputTokens:$e(Ae(t,n,"observer_rich_max_output_tokens")),observerRuntime:$e(Ae(t,n,"observer_runtime"))||"api_http",observerAuthSource:$e(Ae(t,n,"observer_auth_source"))||"auto",observerAuthFile:$e(Ae(t,n,"observer_auth_file")),observerAuthCommand:u.length?JSON.stringify(u,null,2):"",observerAuthTimeoutMs:$e(Ae(t,n,"observer_auth_timeout_ms")),observerAuthCacheTtlS:$e(Ae(t,n,"observer_auth_cache_ttl_s")),observerHeaders:Object.keys(i).length?JSON.stringify(i,null,2):"",observerMaxChars:$e(Ae(t,n,"observer_max_chars")),packObservationLimit:$e(Ae(t,n,"pack_observation_limit")),packSessionLimit:$e(Ae(t,n,"pack_session_limit")),rawEventsSweeperIntervalS:$e(Ae(t,n,"raw_events_sweeper_interval_s")),syncEnabled:vl(Ae(t,n,"sync_enabled")),syncHost:$e(Ae(t,n,"sync_host")),syncPort:$e(Ae(t,n,"sync_port")),syncInterval:$e(Ae(t,n,"sync_interval_s")),syncMdns:vl(Ae(t,n,"sync_mdns")),syncCoordinatorUrl:$e(Ae(t,n,"sync_coordinator_url")),syncCoordinatorGroup:$e(Ae(t,n,"sync_coordinator_group")),syncCoordinatorTimeout:$e(Ae(t,n,"sync_coordinator_timeout_s")),syncCoordinatorPresenceTtl:$e(Ae(t,n,"sync_coordinator_presence_ttl_s"))}}function KB(e,t){if(e.observerTierRoutingEnabled)return"Tiered routing is enabled: simple/rich model selection now lives in Processing.";const n=qB(e.observerRuntime.trim()||"api_http",e.observerProvider.trim(),ct(e.observerModel));return`${["observer_model","observer_provider","observer_runtime"].some(r=>Yn(t,r))?"Env override":n.source}: ${n.model}`}function zB(e){return e.observerTierRoutingEnabled?"On: codemem routes simpler batches to Luna and richer batches to Terra with medium reasoning by default. Official OpenAI and OAuth Codex consumer requests always use Responses. The observer_openai_use_responses=false compatibility setting selects chat completions only for an explicitly configured custom OpenAI-compatible base URL. Sidecar runtimes route both tiers through their local CLI.":"Off: codemem uses the base observer settings from the Connection tab for all batches. Explicit user settings always win over built-in routing defaults."}function WB(e){return e.observerTierRoutingEnabled?"Base model fallback":"Model"}function JB(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 YB(e){return e.observerTierRoutingEnabled?"Tiered routing is active. Use this only as a fallback while the Processing tab owns simple/rich model selection and explicit tier settings override built-in defaults.":"Default: `gpt-5.4-mini` for Direct API, `gpt-5.1-codex-mini` for Local Codex session, or `claude-4.5-haiku` for Local Claude session."}function XB(e){return!e}function QB(e,t,n){return t.has(e)||n.has(e)}function ZB(e){return`${e} is read-only in the viewer for security. Edit the config file or environment instead.`}var ve={previouslyFocused:null,baseline:{},envOverrides:{},touchedKeys:new Set,shellMounted:!1,protectedKeys:new Set,startPolling:null,refresh:null,hideTooltip:null},_r=qs({open:!1,activeTab:"observer",dirty:!1,renderState:{effectiveText:"",isSaving:!1,observerStatus:null,overridesVisible:!1,pathText:"Config path: n/a",providers:[],statusText:"Ready",values:{...jB}},showAdvanced:OB()});function Bt(){return _r.value}function Fo(e){_r.value={..._r.value,...e}}function eq(){ve.hideTooltip?.()}function di(e){Fo({renderState:{..._r.value.renderState,...e}})}function tq(e){di({values:{..._r.value.renderState.values,...e}})}function nq(e){Fo({activeTab:["observer","queue","sync"].includes(e)?e:"observer"})}function yl(e){Fo({dirty:e})}function bl(e){Fo({open:e})}function rq(e){MB(e),Fo({showAdvanced:e})}function IS(){return Bt().open}function iq(e){return QB(e,ve.protectedKeys,$B)}function kS(e={}){return HB({values:Bt().renderState.values,touchedKeys:ve.touchedKeys,baseline:ve.baseline,allowUntouchedParseErrors:e.allowUntouchedParseErrors})}function aq(e){di({observerStatus:e&&typeof e=="object"?e:null})}function oq(e){if(!e||typeof e!="object")return;const t=e,n=t.defaults||{},r=t.config||{},i=t.env_overrides&&typeof t.env_overrides=="object"?t.env_overrides:{},a=Array.isArray(t.protected_keys)?t.protected_keys.filter(c=>typeof c=="string"&&c.trim().length>0):[],s=VB(t);ve.envOverrides=i,ve.protectedKeys=new Set(a),S.configDefaults=n,S.configPath=t.path||"",di({effectiveText:Object.keys(i).length>0?"Some fields are managed by environment settings.":"",overridesVisible:Object.keys(i).length>0,pathText:S.configPath?`Config path: ${S.configPath}`:"Config path: n/a",providers:FB(t.providers),statusText:"No unsaved changes",values:s}),ve.touchedKeys=new Set;try{const c=kS({allowUntouchedParseErrors:!0});ve.baseline=GB(c,r,i)}catch{ve.baseline={}}yl(!1)}async function sq(e={}){if(!Bt().open)try{const[t,n]=await Promise.all([cR(e),sR(e).catch(()=>null)]);if(e.signal?.aborted)return;oq(t),aq(n)}catch{}}function qf(e){return String(e||"").replace(/_/g," ")}function Uf(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 cq(e){switch(e){case"anthropic_consumer":return"OAuth (Claude Max/Pro)";case"codex_consumer":return"OAuth (ChatGPT subscription)";case"sdk_client":return"API key";case"claude_sidecar":return"Local Claude session";case"codex_sidecar":return"Local Codex session";case"opencode_run":return"OpenCode sidecar";default:return e||"none"}}function lq(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 dq(e){if(typeof e!="string"||!e.trim())return"Unknown time";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function uq({onOpenDiagnostics:e}){return e?o("button",{className:"settings-button",onClick:()=>e({severity:"error",subsystem:"observer"}),type:"button",children:"View observer diagnostics"}):null}function pq({status:e,onOpenDiagnostics:t}){if(!e)return o("div",{id:"observerStatusBanner",className:"observer-status-banner",hidden:!0});const n=e.active,r=e.available_credentials||{},i=e.latest_failure,a=Object.entries(r).filter(([,s])=>s&&typeof s=="object");return o("div",{id:"observerStatusBanner",className:"observer-status-banner",children:[n?o(z,{children:[o("div",{className:"status-label",children:"Active observer"}),o("div",{className:"status-active",children:[String(n.provider||"unknown")," → ",String(n.model||"")," via"," ",cq(n.auth?.method||"none")," ",o("span",{"aria-label":n.auth?.token_present===!0?"token present":"token missing",className:n.auth?.token_present===!0?"cred-ok":"cred-none",role:"img",children:o("i",{"aria-hidden":"true","data-lucide":n.auth?.token_present===!0?"check":"x"})})]})]}):o(z,{children:[o("div",{className:"status-label",children:"Observer status"}),o("div",{className:"status-active",children:"Not yet initialized (waiting for first session)"})]}),a.length?o(z,{children:[o("div",{className:"status-label",children:"Available credentials"}),o("div",{children:a.map(([s,c],l)=>{const d=c,u=Object.values(d).some(Boolean);return o("span",{className:"status-cred",children:[l>0?" · ":null,o("span",{"aria-label":u?"credential available":"no credential",className:u?"cred-ok":"cred-none",role:"img",children:u?o("i",{"aria-hidden":"true","data-lucide":"check"}):"–"})," ",String(s),": ",lq(d)]},s)})})]}):null,i&&typeof i=="object"?o(z,{children:[o("div",{className:"status-label",children:"Latest processing issue"}),o("div",{className:"status-issue",children:[o("div",{className:"status-issue-message",children:typeof i.error_message=="string"&&i.error_message.trim()?i.error_message.trim():"Raw-event processing failed."}),o("div",{className:"status-issue-meta",children:[[typeof i.observer_provider=="string"?i.observer_provider.trim():"",typeof i.observer_model=="string"&&i.observer_model.trim()?`→ ${i.observer_model.trim()}`:"",typeof i.observer_runtime=="string"&&i.observer_runtime.trim()?`(${i.observer_runtime.trim()})`:""].filter(Boolean).join(" ").replace(/\s+/g," ").trim(),`Last failure ${dq(i.updated_at)}`,typeof i.attempt_count=="number"&&Number.isFinite(i.attempt_count)?`Attempts ${i.attempt_count}`:""].filter(Boolean).join(" · ")}),typeof i.impact=="string"&&i.impact.trim()?o("div",{className:"status-issue-impact",children:i.impact.trim()}):null,o(uq,{onOpenDiagnostics:t})]})]}):null]})}function TS(e,t){const n=t.getBoundingClientRect(),r=8,i=8,a=e.offsetWidth,s=e.offsetHeight;let c=n.left+n.width/2-a/2;c=Math.max(r,Math.min(c,globalThis.innerWidth-a-r));let l=n.bottom+i;l+s>globalThis.innerHeight-r&&(l=n.top-s-i),l=Math.max(r,l),e.style.left=`${Math.round(c)}px`,e.style.top=`${Math.round(l)}px`}function Bo(e){return e instanceof Element?e.closest(".help-icon[data-tooltip]"):null}function fq(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 mq(){const e=Qe("settingsModal");(fq(e)[0]||e)?.focus()}function hq(){const[e,t]=D({anchor:null,content:"",visible:!1}),n=B(null);return V(()=>{const r=u=>{const p=u.dataset.tooltip?.trim();p&&t({anchor:u,content:p,visible:!0})},i=()=>{t(u=>!u.visible&&!u.anchor&&!u.content?u:{anchor:null,content:"",visible:!1})},a=u=>{const p=Bo(u.target);p&&r(p)},s=u=>{const p=Bo(u.target);if(!p)return;const f=u.relatedTarget;f instanceof Element&&p.contains(f)||i()},c=u=>{const p=Bo(u.target);p&&r(p)},l=u=>{Bo(u.target)&&i()},d=u=>{const p=Bo(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",a),document.addEventListener("pointerout",s),document.addEventListener("focusin",c),document.addEventListener("focusout",l),document.addEventListener("click",d),()=>{document.removeEventListener("pointerover",a),document.removeEventListener("pointerout",s),document.removeEventListener("focusin",c),document.removeEventListener("focusout",l),document.removeEventListener("click",d)}},[]),Tt(()=>{if(!e.visible||!e.anchor||!n.current)return;const r=requestAnimationFrame(()=>{n.current&&e.anchor&&TS(n.current,e.anchor)});return()=>{cancelAnimationFrame(r)}},[e.anchor,e.content,e.visible]),V(()=>{if(!e.visible||!e.anchor)return;const r=()=>{n.current&&e.anchor&&TS(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:Ie(()=>typeof document>"u"?null:ln(o("div",{className:`help-tooltip${e.visible?" visible":""}`,hidden:!e.visible,ref:n,children:e.content}),document.body),[e.content,e.visible]),setTooltip:t}}function gq({DialogContent:e,onClose:t}){const{open:n}=_r.value,{tooltipPortal:r,setTooltip:i}=hq();V(()=>{const s=()=>i({anchor:null,content:"",visible:!1});return ve.hideTooltip=s,()=>{ve.hideTooltip===s&&(ve.hideTooltip=null)}},[]),V(()=>{n&&globalThis.lucide?.createIcons?.()},[n]);const a=oe(()=>{ve.startPolling&&ve.refresh&&t(ve.startPolling,ve.refresh)},[t]);return o(z,{children:[o(Ln,{ariaDescribedby:"settingsDescription",ariaLabelledby:"settingsTitle",contentClassName:"modal",contentId:"settingsModal",onCloseAutoFocus:s=>{s.preventDefault()},onOpenAutoFocus:s=>{s.preventDefault(),mq()},onOpenChange:s=>{if(s){bl(!0);return}a()},open:n,overlayClassName:"modal-backdrop",overlayId:"settingsBackdrop",children:o(e,{})}),r]})}function ze({children:e,className:t="field",hidden:n=!1,id:r}){return o("div",{className:t,hidden:n,id:r,children:e})}function qo({children:e,hidden:t=!1}){return o("div",{className:"settings-note",hidden:t,children:e})}function Gf({detail:e,title:t}){return o("div",{className:"settings-section-intro",children:[o("div",{className:"settings-section-intro-title",children:t}),o("div",{className:"small settings-section-intro-detail",children:e})]})}function vq({values:e,observerMaxCharsDefault:t,providerOptions:n,showAuthFile:r,showAuthCommand:i,hiddenUnlessAdvanced:a,onTextInput:s,onSelectValueChange:c,getObserverModelLabel:l,getObserverModelTooltip:d,getObserverModelDescription:u,getObserverModelHint:p,protectedConfigHelp:f,observerStatusBannerSlot:m}){return o(z,{children:[o(Gf,{detail:"Set how codemem reaches your model provider and where it should look for credentials.",title:"Connection and credentials"}),m,o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Connection"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerProvider",children:"Model provider"}),o("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:"?"})]}),o(dr,{ariaLabel:"Model provider",contentClassName:"settings-select-content",id:"observerProvider",itemClassName:"settings-select-item",onValueChange:c("observerProvider"),options:[{label:"auto (default)",value:""},...n],placeholder:"auto (default)",triggerClassName:"settings-select-trigger",value:e.observerProvider,viewportClassName:"settings-select-viewport"}),o("div",{className:"small",children:"Use `auto` unless you need to pin a specific provider."})]}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerModel",children:l()}),o("button",{"aria-label":"About model defaults",className:"help-icon","data-tooltip":d(),type:"button",children:"?"})]}),o(ke,{id:"observerModel",onInput:s("observerModel"),placeholder:"leave empty for default",value:e.observerModel}),o("div",{className:"small",children:u()}),o("div",{className:"small",id:"observerModelHint",children:p()})]}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerRuntime",children:"Connection mode"}),o("button",{"aria-label":"About connection mode",className:"help-icon","data-tooltip":"Direct API uses provider credentials. Local sessions use the selected Claude or Codex CLI login.",type:"button",children:"?"})]}),o(dr,{ariaLabel:"Connection mode",contentClassName:"settings-select-content",id:"observerRuntime",itemClassName:"settings-select-item",onValueChange:c("observerRuntime"),options:[{label:"Direct API (default)",value:"api_http"},{label:"Local Claude session",value:"claude_sidecar"},{label:"Local Codex session",value:"codex_sidecar"}],triggerClassName:"settings-select-trigger",value:e.observerRuntime,viewportClassName:"settings-select-viewport"}),o("div",{className:"small",children:"Switch between provider API credentials and local Claude or Codex CLI auth."})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"codexCommand",children:"Codex command (JSON argv)"}),o(Qi,{disabled:!0,id:"codexCommand",placeholder:'["codex"]',rows:2,value:e.codexCommand}),o("div",{className:"small",children:f("codex_command")})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"claudeCommand",children:"Claude command (JSON argv)"}),o(Qi,{disabled:!0,id:"claudeCommand",placeholder:'["claude"]',rows:2,value:e.claudeCommand}),o("div",{className:"small",children:f("claude_command")})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"observerMaxChars",children:"Request size limit (chars)"}),o(ke,{id:"observerMaxChars",min:"1",onInput:s("observerMaxChars"),type:"number",value:e.observerMaxChars}),o("div",{className:"small",id:"observerMaxCharsHint",children:t?`Default: ${t}`:""})]})]}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Authentication"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerAuthSource",children:"Authentication method"}),o("button",{"aria-label":"About authentication method",className:"help-icon","data-tooltip":"Choose how credentials are resolved: environment, file, command, or none.",type:"button",children:"?"})]}),o(dr,{ariaLabel:"Authentication method",contentClassName:"settings-select-content",id:"observerAuthSource",itemClassName:"settings-select-item",onValueChange:c("observerAuthSource"),options:[{label:"auto (default)",value:"auto"},{label:"env",value:"env"},{label:"file",value:"file"},{label:"command",value:"command"},{label:"none",value:"none"}],triggerClassName:"settings-select-trigger",value:e.observerAuthSource,viewportClassName:"settings-select-viewport"}),o("div",{className:"small",children:"Use `auto` unless you need to force a file or command-based token source."})]}),o(ze,{hidden:!r,id:"observerAuthFileField",children:[o("label",{htmlFor:"observerAuthFile",children:"Token file path"}),o(ke,{disabled:!0,id:"observerAuthFile",placeholder:"~/.codemem/work-token.txt",value:e.observerAuthFile}),o("div",{className:"small",children:f("observer_auth_file")})]}),o(ze,{hidden:!i,id:"observerAuthCommandField",children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerAuthCommand",children:"Token command"}),o("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:"?"})]}),o(Qi,{disabled:!0,id:"observerAuthCommand",placeholder:'["iap-auth", "--audience", "gateway"]',rows:3,value:e.observerAuthCommand}),o("div",{className:"small",children:f("observer_auth_command")})]}),o("div",{className:"small",hidden:!i,id:"observerAuthCommandNote",children:'Command format: JSON string array, e.g. `["iap-auth", "--audience", "gateway"]`.'}),o(qo,{hidden:a(),children:"These advanced credential overrides only matter when you need custom command timing, cached tokens, or extra request headers."}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"observerAuthTimeoutMs",children:"Token command timeout (ms)"}),o(ke,{id:"observerAuthTimeoutMs",min:"1",onInput:s("observerAuthTimeoutMs"),type:"number",value:e.observerAuthTimeoutMs})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("label",{htmlFor:"observerAuthCacheTtlS",children:"Token cache time (s)"}),o(ke,{id:"observerAuthCacheTtlS",min:"0",onInput:s("observerAuthCacheTtlS"),type:"number",value:e.observerAuthCacheTtlS})]}),o(ze,{className:"field settings-advanced",hidden:a(),children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerHeaders",children:"Request headers (JSON)"}),o("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:"?"})]}),o(Qi,{disabled:!0,id:"observerHeaders",placeholder:'{"Authorization":"Bearer ${auth.token}"}',rows:4,value:e.observerHeaders}),o("div",{className:"small",children:f("observer_headers")})]})]})]})}function _l({checked:e,className:t,disabled:n=!1,hidden:r=!1,id:i,label:a,onCheckedChange:s}){const c=`${i}Label`;return o("div",{className:t?`field-checkbox settings-switch-row ${t}`:"field-checkbox settings-switch-row",hidden:r,children:[o("label",{className:"settings-switch-copy",htmlFor:i,id:c,children:a}),o(Ji,{"aria-labelledby":c,checked:e,className:"settings-switch",disabled:n,id:i,onCheckedChange:s,thumbClassName:"settings-switch-thumb"})]})}function yq({values:e,showTieredRouting:t,hiddenUnlessAdvanced:n,onTextInput:r,onSwitchInput:i,getTieredRoutingHelperText:a}){return o(z,{children:[o(Gf,{detail:"Control how often codemem processes queued work and, if needed, how it routes lighter vs richer model requests.",title:"Processing and routing"}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Processing"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"rawEventsSweeperIntervalS",children:"Background processing interval (seconds)"}),o("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:"?"})]}),o(ke,{id:"rawEventsSweeperIntervalS",min:"1",onInput:r("rawEventsSweeperIntervalS"),type:"number",value:e.rawEventsSweeperIntervalS}),o("div",{className:"small",children:"How often codemem checks for queued raw events in the background."})]})]}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Tiered observer routing"}),o(_l,{checked:e.observerTierRoutingEnabled,className:"field",id:"observerTierRoutingEnabled",label:"Enable tiered routing",onCheckedChange:i("observerTierRoutingEnabled")}),o("div",{className:"small",children:a()}),o(qo,{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."}),o("div",{hidden:!t,children:[o("h4",{children:"Simple tier"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerSimpleModel",children:"Model"}),o("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:"?"})]}),o(ke,{id:"observerSimpleModel",onInput:r("observerSimpleModel"),placeholder:"leave empty for default",value:e.observerSimpleModel}),o("div",{className:"small",children:"Used when a batch falls below rich-routing thresholds."})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerSimpleTemperature",children:"Temperature"}),o(ke,{id:"observerSimpleTemperature",min:"0",onInput:r("observerSimpleTemperature"),step:"0.1",type:"number",value:e.observerSimpleTemperature})]})]}),o("div",{className:"settings-advanced",hidden:!t||n(),children:[o("h4",{children:"Shared reasoning defaults"}),o("div",{className:"small",children:"Applied to OpenAI Responses requests in both tiers unless a rich-tier override is set."}),o(ze,{className:"field settings-advanced",children:[o("label",{htmlFor:"observerReasoningEffort",children:"Reasoning effort"}),o(ke,{id:"observerReasoningEffort",onInput:r("observerReasoningEffort"),placeholder:"leave empty for provider default",value:e.observerReasoningEffort})]}),o(ze,{className:"field settings-advanced",children:[o("label",{htmlFor:"observerReasoningSummary",children:"Reasoning summary"}),o(ke,{id:"observerReasoningSummary",onInput:r("observerReasoningSummary"),placeholder:"leave empty for provider default",value:e.observerReasoningSummary})]})]}),o("div",{hidden:!t,children:[o("h4",{children:"Rich tier"}),o(ze,{children:[o("div",{className:"field-label",children:[o("label",{htmlFor:"observerRichModel",children:"Model"}),o("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:"?"})]}),o(ke,{id:"observerRichModel",onInput:r("observerRichModel"),placeholder:"leave empty for default",value:e.observerRichModel}),o("div",{className:"small",children:"Used when routing detects a richer replay batch."})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichTemperature",children:"Temperature"}),o(ke,{id:"observerRichTemperature",min:"0",onInput:r("observerRichTemperature"),step:"0.1",type:"number",value:e.observerRichTemperature})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichReasoningEffort",children:"Reasoning effort override"}),o(ke,{id:"observerRichReasoningEffort",onInput:r("observerRichReasoningEffort"),placeholder:"inherits shared reasoning effort",value:e.observerRichReasoningEffort})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichReasoningSummary",children:"Reasoning summary override"}),o(ke,{id:"observerRichReasoningSummary",onInput:r("observerRichReasoningSummary"),placeholder:"inherits shared reasoning summary",value:e.observerRichReasoningSummary})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"observerRichMaxOutputTokens",children:"Max output tokens"}),o(ke,{id:"observerRichMaxOutputTokens",min:"1",onInput:r("observerRichMaxOutputTokens"),step:"1",type:"number",value:e.observerRichMaxOutputTokens})]})]})]}),o("div",{className:"settings-group settings-advanced",hidden:n(),children:[o("h3",{className:"settings-group-title",children:"Pack limits"}),o(qo,{hidden:n(),children:"Most users can keep these defaults. Change them only when you need smaller or larger default context packs."}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"packObservationLimit",children:"Observation limit"}),o(ke,{id:"packObservationLimit",min:"1",onInput:r("packObservationLimit"),type:"number",value:e.packObservationLimit}),o("div",{className:"small",children:"Default number of observations to include in a pack."})]}),o(ze,{className:"field settings-advanced",hidden:n(),children:[o("label",{htmlFor:"packSessionLimit",children:"Session summary limit"}),o(ke,{id:"packSessionLimit",min:"1",onInput:r("packSessionLimit"),type:"number",value:e.packSessionLimit}),o("div",{className:"small",children:"Default number of session summaries to include in a pack."})]})]})]})}function bq({values:e,hiddenUnlessAdvanced:t,onTextInput:n,onSwitchInput:r,protectedConfigHelp:i}){return o(z,{children:[o(Gf,{detail:"Choose whether this device syncs at all, how often it checks peers, and which coordinator group it should join.",title:"Device sync"}),o("div",{className:"settings-group",children:[o("h3",{className:"settings-group-title",children:"Device Sync"}),o(_l,{checked:e.syncEnabled,className:"field",id:"syncEnabled",label:"Enable sync",onCheckedChange:r("syncEnabled")}),o("div",{className:"field",children:[o("label",{htmlFor:"syncInterval",children:"Sync interval (seconds)"}),o(ke,{id:"syncInterval",min:"10",onInput:n("syncInterval"),type:"number",value:e.syncInterval}),o("div",{className:"small",children:"How often this device checks for sync work when sync is enabled."})]}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncHost",children:"Sync host"}),o(ke,{id:"syncHost",onInput:n("syncHost"),placeholder:"127.0.0.1",value:e.syncHost})]}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncPort",children:"Sync port"}),o(ke,{id:"syncPort",min:"1",onInput:n("syncPort"),type:"number",value:e.syncPort})]}),o(_l,{checked:e.syncMdns,className:"field settings-advanced",hidden:t(),id:"syncMdns",label:"Enable mDNS discovery",onCheckedChange:r("syncMdns")}),o("div",{className:"field",children:[o("label",{htmlFor:"syncCoordinatorUrl",children:"Coordinator URL"}),o(ke,{disabled:!0,id:"syncCoordinatorUrl",placeholder:"https://coord.example.com",value:e.syncCoordinatorUrl}),o("div",{className:"small",children:i("sync_coordinator_url")})]}),o("div",{className:"field",children:[o("label",{htmlFor:"syncCoordinatorGroup",children:"Coordinator group"}),o(ke,{id:"syncCoordinatorGroup",onInput:n("syncCoordinatorGroup"),placeholder:"team-alpha",value:e.syncCoordinatorGroup}),o("div",{className:"small",children:"Discovery namespace for peers using the same coordinator."})]}),o("div",{className:"field settings-advanced",hidden:t(),children:o(qo,{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."})}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncCoordinatorTimeout",children:"Coordinator timeout (seconds)"}),o(ke,{id:"syncCoordinatorTimeout",min:"1",onInput:n("syncCoordinatorTimeout"),type:"number",value:e.syncCoordinatorTimeout})]}),o("div",{className:"field settings-advanced",hidden:t(),children:[o("label",{htmlFor:"syncCoordinatorPresenceTtl",children:"Presence TTL (seconds)"}),o(ke,{id:"syncCoordinatorPresenceTtl",min:"1",onInput:n("syncCoordinatorPresenceTtl"),type:"number",value:e.syncCoordinatorPresenceTtl})]})]})]})}function _q({panelProps:e,activeTab:t,showAdvanced:n,renderState:r,settingsDirty:i,onClose:a,onSave:s,onActiveTabChange:c,onAdvancedToggle:l,observerStatusBannerSlot:d}){const u=!i||r.isSaving;return o("div",{className:"modal-card",onKeyDown:p=>ro(p,{onSubmit:s,disabled:u}),children:[o("div",{className:"modal-header",children:[o("h2",{id:"settingsTitle",children:"Settings"}),o(Lr,{ariaLabel:"Close settings",className:"modal-close-button",onClick:a})]}),o("div",{className:"modal-body",children:[o("div",{className:"small",id:"settingsDescription",children:"Tune how codemem connects, processes work, and syncs with other devices."}),o("div",{className:"settings-advanced-toolbar",children:[o(_l,{checked:n,id:"settingsAdvancedToggle",label:"Show advanced controls",onCheckedChange:l}),o("button",{"aria-label":"About advanced controls",className:"help-icon","data-tooltip":"Advanced controls include JSON fields, tuning values, and network overrides.",type:"button",children:o("i",{"aria-hidden":"true","data-lucide":"help-circle"})})]}),o(qo,{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."}),o(My,{ariaLabel:"Settings sections",listClassName:"settings-tabs",onValueChange:c,tabs:DB,triggerClassName:"settings-tab",value:t,children:[o(Gr,{className:"settings-panel",forceMount:!0,value:"observer",children:o(vq,{...e,observerStatusBannerSlot:d})}),o(Gr,{className:"settings-panel",forceMount:!0,value:"queue",children:o(yq,{...e})}),o(Gr,{className:"settings-panel",forceMount:!0,value:"sync",children:o(bq,{...e})})]}),o("div",{className:"small mono",id:"settingsPath",children:r.pathText}),o("div",{className:"small",id:"settingsEffective",children:r.effectiveText}),o("div",{className:"settings-note",hidden:!r.overridesVisible,id:"settingsOverrides",children:"Some values are controlled outside this screen and take priority."}),o("div",{className:"settings-note",hidden:n,children:"Advanced controls are hidden right now to keep this screen focused on everyday settings."})]}),o("div",{className:"modal-footer",children:[o("div",{className:"small",id:"settingsStatus",children:r.statusText}),o("button",{className:"settings-save","data-primary-action":"true",disabled:u,id:"settingsSave",onClick:s,type:"button",children:r.isSaving?"Saving…":"Save changes"})]})]})}function wq(e){const{current:t,baseline:n,envOverrides:r,touchedKeys:i,isProtected:a}=e,s={};return Object.entries(t).forEach(([c,l])=>{a(c)||Yn(r,c)&&!i.has(c)||BB(l,n[c])||(s[c]=l)}),s}function Sq(e){const t=s=>{const c=LB[s];c&&e.getTouchedKeys().add(c)},n=(s,c)=>{t(s),e.updateFormState({[s]:c}),e.setDirty(!0)};return{markFieldTouched:t,updateField:n,onTextInput:s=>c=>{n(s,c.currentTarget.value)},onSelectValueChange:s=>c=>{n(s,c)},onSwitchInput:s=>c=>{n(s,c)}}}function Cq(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=>qf(String(p))):[],i=Array.isArray(n.live_applied_keys)?n.live_applied_keys.map(p=>qf(String(p))):[],a=Array.isArray(n.restart_required_keys)?n.restart_required_keys.map(p=>qf(String(p))):[],s=Array.isArray(n.warnings)?n.warnings.filter(p=>typeof p=="string"&&p.trim().length>0):[],c=Array.isArray(n.manual_actions)?n.manual_actions:[],l=n.sync&&typeof n.sync=="object"?n.sync:{},d=[];r.length&&d.push(`Applied now: ${Uf(r)}.`),i.length&&d.push(`Live settings updated: ${Uf(i)}.`),l.attempted&&typeof l.message=="string"&&l.message?d.push(`Sync: ${l.message}.`):Array.isArray(l.affected_keys)&&l.affected_keys.length&&typeof l.reason=="string"&&l.reason&&d.push(`Sync: ${l.reason}.`),a.length&&d.push(`Restart required for ${Uf(a)}. Run: codemem serve restart`),s.forEach(p=>{d.push(p)}),c.forEach(p=>{p&&typeof p.command=="string"&&p.command.trim()&&d.push(`If needed: ${p.command}.`)}),d.length||d.push("Saved.");const u=a.length>0||s.length>0||l.ok===!1;return{message:d.join(" "),type:u?"warning":"success"}}var Rq=()=>KB(Bt().renderState.values,ve.envOverrides),Iq=()=>zB(Bt().renderState.values),kq=()=>WB(Bt().renderState.values),Tq=()=>JB(Bt().renderState.values),Pq=()=>YB(Bt().renderState.values),Nq=()=>XB(Bt().showAdvanced),{onTextInput:Eq,onSelectValueChange:Aq,onSwitchInput:xq}=Sq({getTouchedKeys:()=>ve.touchedKeys,getValues:()=>Bt().renderState.values,updateFormState:tq,setDirty:e=>yl(e)});function Dq(){const e=_r.value.renderState.observerStatus;return o(pq,{status:e,onOpenDiagnostics:Lq})}function Lq(e){if(!ve.startPolling||!ve.refresh||(Uo(ve.startPolling,ve.refresh),Bt().open))return;const t=Js("settingsButton");queueMicrotask(()=>Fr({...e,trigger:t}))}function $q(){const e=_r.value,t=e.renderState.values,n=String(S.configDefaults?.observer_max_chars||""),r=t.observerAuthSource==="file",i=t.observerAuthSource==="command",a=t.observerTierRoutingEnabled,s={values:t,observerMaxCharsDefault:n,providerOptions:Array.from(new Set(e.renderState.providers.concat(t.observerProvider?[t.observerProvider]:[]))).sort((c,l)=>c.localeCompare(l)).map(c=>({label:c,value:c})),showAuthFile:r,showAuthCommand:i,showTieredRouting:a,hiddenUnlessAdvanced:Nq,onTextInput:Eq,onSelectValueChange:Aq,onSwitchInput:xq,getObserverModelLabel:kq,getObserverModelTooltip:Tq,getObserverModelDescription:Pq,getObserverModelHint:Rq,getTieredRoutingHelperText:Iq,protectedConfigHelp:ZB};return o(_q,{panelProps:s,activeTab:e.activeTab,showAdvanced:e.showAdvanced,renderState:e.renderState,settingsDirty:e.dirty,onClose:()=>{ve.startPolling&&ve.refresh&&Uo(ve.startPolling,ve.refresh)},onSave:()=>{ve.startPolling&&ve.refresh&&Fq(ve.startPolling,ve.refresh)},onActiveTabChange:nq,onAdvancedToggle:rq,observerStatusBannerSlot:o(Dq,{})})}function jq(){return o(gq,{DialogContent:$q,onClose:Uo})}function Oq(){const e=Qe("settingsDialogMount");e&&Ue(o(jq,{}),e)}function PS(){Qe("settingsDialogMount")&&(ve.shellMounted||(Oq(),ve.shellMounted=!0))}function Mq(e){ve.shellMounted||PS(),bl(!0),ve.previouslyFocused=document.activeElement,e()}function Uo(e,t){if(Bt().dirty&&!globalThis.confirm("Discard unsaved changes?")){bl(!0);return}bl(!1),eq(),(ve.previouslyFocused&&typeof ve.previouslyFocused.focus=="function"?ve.previouslyFocused:Js("settingsButton"))?.focus(),ve.previouslyFocused=null,ve.touchedKeys=new Set,e(),t()}async function Fq(e,t){if(!Bt().renderState.isSaving){di({isSaving:!0,statusText:"Saving changes…"});try{const n=kS({allowUntouchedParseErrors:!0}),r=wq({current:n,baseline:ve.baseline,envOverrides:ve.envOverrides,touchedKeys:ve.touchedKeys,isProtected:iq});if(Object.keys(r).length===0){di({isSaving:!1,statusText:"No unsaved changes"}),yl(!1),Uo(e,t);return}const i=await lR(r),a=Cq(i);di({isSaving:!1,statusText:"Saved changes"}),yl(!1),Uo(e,t),X(a.message,a.type)}catch(n){const r=n instanceof Error?n.message:"unknown error";di({isSaving:!1,statusText:`Save failed: ${r}`})}}}function Bq(e,t,n){ve.startPolling=t,ve.refresh=n,PS(),Js("settingsButton")?.addEventListener("click",()=>Mq(e))}function qq(e){e.dataset.syncRenderRoot="preact"}function Uq(){const e=document.getElementById("tab-sync");e&&(e.dataset.syncRenderBoundary="preact-hybrid")}function mt(e,t){qq(e),Ue(t,e)}function da(e){e.dataset.syncRenderRoot==="preact"&&Ue(null,e)}function Gq(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 Hq(e){return typeof e=="object"&&e!==null}function Vq(e,t){return S.pairingCommandRaw="",{payloadText:e,hintText:t}}function Kq(e){if(!Hq(e))return Vq("Pairing not available","Enable sync and retry.");const t=e,n={...t,addresses:Array.isArray(t.addresses)?t.addresses:[]},r=JSON.stringify(n),i=`echo '${btoa(r)}' | base64 -d | codemem sync pair --accept-file -`;return S.pairingCommandRaw=i,{payloadText:i,hintText:"Copy this command and run it on the other device. Use --include/--exclude to control which projects sync."}}function zq(){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 Wq(){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 Jq(){const e=S.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 Yq(){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 Xq(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 Qq({items:e}){return o(z,{children:e.map((t,n)=>o("div",{class:"stat",children:o("div",{class:"stat-content",children:[o("div",{class:"value",children:t.value}),o("div",{class:"label",children:t.label})]})},`${t.label}-${n}`))})}function Zq({attempts:e,note:t}){return o(z,{children:[t?o("div",{class:"small",children:t}):null,e.map((n,r)=>o("div",{class:"diag-line",children:[o("div",{class:"left",children:[o("div",{children:[n.peerLabel," — ",n.status]}),n.detail?o("div",{class:"small",children:n.detail}):null,n.actionHref&&n.actionLabel?o("a",{class:"small",href:n.actionHref,children:n.actionLabel}):null,n.action?o("button",{className:"settings-button small",onClick:i=>n.action?.(i.currentTarget),type:"button",children:"View sync diagnostics"}):null]}),o("div",{class:"right",children:n.startedAt})]},`${n.startedAt}-${n.peerLabel}-${r}`))]})}function NS({text:e}){return o(z,{children:e})}function eU({title:e,detail:t}){return o("div",{class:"sync-empty-state",children:[o("strong",{children:e}),o("span",{children:t})]})}function tU(e,t){if(!t.length){da(e);return}mt(e,o(Qq,{items:t}))}function nU(e,t,n){if(!t.length){da(e);return}mt(e,o(Zq,{attempts:t,note:n}))}function ui(e,t){mt(e,o(eU,{...t}))}function ES(e,t,n){mt(e,o(NS,{text:n.payloadText})),t&&mt(t,o(NS,{text:n.hintText}))}function AS({open:e,onOpenChange:t,triggerId:n,triggerClassName:r,closedLabel:i,openLabel:a,contentId:s,contentClassName:c,contentHost:l=null,children:d}){const u=B(null),p=B(null),f=B(!1);Tt(()=>{u.current&&(u.current.id=n,u.current.setAttribute("aria-controls",s)),p.current&&(p.current.id=s)},[s,n,e]),V(()=>{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=o(Xa,{forceMount:!0,asChild:!0,children:o("div",{ref:p,id:s,className:c,hidden:!e,children:d})});return o(Ya,{open:e,onOpenChange:t,children:[o(zu,{asChild:!0,children:o("button",{ref:u,type:"button",className:r,id:n,"aria-controls":s,children:e?a:i})}),l?ln(m,l):m]})}function rU({open:e,onOpenChange:t}){return o(AS,{open:e,onOpenChange:t,triggerId:"syncToggleAdmin",triggerClassName:"sync-toggle-admin",closedLabel:"Set up a new team instead…",openLabel:"Hide team setup",contentId:"syncInvitePanel",children:[o("h3",{className:"settings-group-title",style:{marginTop:"12px"},children:"Create a team"}),o("div",{className:"section-meta",children:"Generate an invite to share with teammates."}),o("div",{className:"actor-create-row",children:[o("label",{htmlFor:"syncInviteGroup",className:"sr-only",children:"Team name"}),o(ke,{className:"peer-scope-input",id:"syncInviteGroup",placeholder:"Team name (e.g. my-team)",type:"text"}),o("label",{htmlFor:"syncInvitePolicy",className:"sr-only",children:"Join policy"}),o("div",{className:"sync-radix-select-host sync-actor-select-host",id:"syncInvitePolicyMount"}),o("div",{className:"sync-ttl-group",children:[o("label",{htmlFor:"syncInviteTtl",children:"Expires in"}),o(ke,{className:"peer-scope-input",defaultValue:"24",id:"syncInviteTtl",min:"1",style:{width:"64px"},type:"number"}),o("span",{children:"hours"})]}),o("button",{className:"settings-button",id:"syncCreateInviteButton",type:"button",children:"Create invite"})]}),o("label",{htmlFor:"syncInviteOutput",className:"sr-only",children:"Generated invite"}),o(Qi,{className:"feed-search",id:"syncInviteOutput",placeholder:"Invite will appear here",readOnly:!0,hidden:!0}),o("div",{className:"peer-meta",id:"syncInviteAdminHint"}),o("div",{className:"peer-meta",id:"syncInviteWarnings",hidden:!0})]})}function iU({contentHost:e,open:t,onOpenChange:n}){return o(AS,{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:[o("div",{className:"peer-title",children:[o("strong",{children:"Pairing command"}),o("div",{className:"peer-actions",children:o("button",{className:"settings-button",id:"pairingCopy",type:"button",children:"Copy command"})})]}),o("div",{className:"pairing-body",children:o("pre",{id:"pairingPayload",style:{userSelect:"all"}})}),o("div",{className:"peer-meta",id:"pairingHint"})]})}function aU(e,t){mt(e,o(rU,{...t}))}function oU(e,t){mt(e,o(iU,{...t}))}function ue(e){return String(e??"").trim()}function sU(e){return ue(e).replace(/\s+/g," ").toLowerCase()}function cU(e){const t=ue(e);return t?t.slice(0,8):"Unnamed device"}function xS(e){return ue(e?.last_error).toLowerCase()}function DS(e){return e.includes("401")&&e.includes("unauthorized")}function LS(e){return["timeout","connection refused","unreachable","aborted","all addresses failed"].some(t=>e.includes(t))}var lU={scope_filter:"sharing-domain membership",visibility_filter:"visibility",project_filter:"project filter"};function $S(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 dU(e){const t=$S(e);return!ue(e.device?.device_id)||e.device?.stale||e.hasAmbiguousCoordinatorGroup?!1:e.pairedLocally?t.state==="needs-your-approval":!0}function jS(e){const t=Array.isArray(e?.items)?e.items:[];if(!t.length)return{ok:!0,message:"Sync pass completed with no eligible devices.",warning:!1};const n=t.filter(i=>i&&i.ok===!1),r=t.filter(i=>Math.max(0,Number(i.opsSkipped??0))>0);if(!n.length){if(r.length){const i=r.reduce((s,c)=>s+Math.max(0,Number(c.opsSkipped??0)),0),a=mU(r.map(s=>s.skipped_out??null));return{ok:!0,message:`${i.toLocaleString()} outbound op${i===1?" was":"s were"} filtered: ${a}. No payload was sent for filtered data.`,warning:!0}}return{ok:!0,message:`Sync pass finished for ${t.length} device${t.length===1?"":"s"}.`,warning:!1}}return n.filter(i=>OS(i)==="trust").length===n.length?{ok:!1,message:"This device no longer has two-way trust with the peer. Pair it again from the other device, or remove the stale local record if it should be gone.",warning:!0}:n.filter(i=>OS(i)==="scope").length===n.length?{ok:!1,message:"Sync ran, but the peer is not authorized for one or more Spaces. Review legacy Space access for this device in Coordinator Administration, 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:ue(n[0]?.error)||"Sync failed for at least one device.",warning:!0}}function OS(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=ue(e.error);return uU(n)?"trust":pU(n)?"scope":null}function uU(e){const t=e.toLowerCase();return t.includes("401")&&t.includes("unauthorized")}function pU(e){const t=e.toLowerCase();return!!(t.includes("scope_rejected")||t.includes("missing_scope")||t.includes("stale_epoch")||t.includes("scope_inactive"))}function fU(e){const t=ue(e?.reason);return lU[t]??(t.replaceAll("_"," ")||"sync filters")}function mU(e){const t=new Map;for(const n of e){const r=fU(n),i=Math.max(0,Number(n?.skipped_count??0));i!==0&&t.set(r,(t.get(r)??0)+i)}return t.size?Array.from(t.entries()).sort((n,r)=>r[1]-n[1]||n[0].localeCompare(r[0])).map(([n,r])=>`${r.toLocaleString()} by ${n}`).join(", "):"sync filters"}function MS(e){const t=ue(e.localName);if(t)return t;const n=ue(e.coordinatorName);return n||cU(ue(e.deviceId))}function hU(e){const t=ue(e.localName),n=ue(e.coordinatorName);return t||n?!1:!!ue(e.deviceId)}function gU(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 Go(e){const t=ue(e?.status?.peer_state);if(t==="offline"||t==="stale")return"offline";const n=xS(e);return DS(n)?"needs-repair":LS(n)?"offline":e?.has_error||t==="degraded"?"needs-repair":t==="online"||e?.status?.fresh?"connected":"waiting"}function ua(e){const t=e?.status||{},n=ue(t.peer_state),r=xS(e),i=ue(t.sync_status)==="ok"||ue(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}:DS(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}:LS(r)?{state:"offline",badgeLabel:"Offline",description:"This device is saved here, but none of its last known addresses are responding right now.",isWarning:!0}:i||n==="online"?{state:"mutual-trust",badgeLabel:"Two-way trust",description:"Both devices trust each other and sync can run in both directions.",isWarning:!1}:e?.has_error||n==="degraded"?{state:"needs-review",badgeLabel:"Needs review",description:"This device has a sync problem that needs review before you trust the current state again.",isWarning:!0}:{state:"trusted-by-you",badgeLabel:"Waiting on other device",description:"This device is already trusted here. Finish setup on the other device before sync can run both ways.",isWarning:!1}}var vU={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 yU(e){const t=e?.scope_rejections,n=Math.max(0,Number(t?.total??0));if(!t||n===0)return{total:0,badgeLabel:null,reasons:[],lastAt:null};const r=[];for(const[i,a]of Object.entries(t.by_reason??{})){const s=Math.max(0,Number(a??0));if(s===0)continue;const c=i;r.push({reason:c,label:vU[c]??i,count:s})}return r.sort((i,a)=>a.count-i.count||i.label.localeCompare(a.label)),{total:n,badgeLabel:n===1?"1 sync rejection":`${n.toLocaleString()} sync rejections`,reasons:r,lastAt:t.last_at??null}}function FS(e){return Array.isArray(e)?e.map(t=>ue(t)).filter(t=>!!t):[]}function BS(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 wl(e,t){return e?e.replaceAll("_"," "):t}function bU(e){const t=(Array.isArray(e.authorized_scopes)?e.authorized_scopes:[]).map(r=>{const i=ue(r.scope_id),a=ue(r.label);if(!i&&!a)return null;const s=a||"Untitled Space",c=[wl(ue(r.kind),"user"),wl(ue(r.authority_type),"local"),`${wl(ue(r.role),"member")} role`].filter(Boolean).join(" · ");return{scopeId:i||s,label:s,detail:c}}).filter(r=>r!=null),n=t.length;return{total:n,badgeLabel:n===1?"1 Space":n>1?`${n} Spaces`:"No Space access",isWarning:n===0,domains:t,emptyMessage:"No Space access grants exist for this device yet. Advanced project filters cannot send data by themselves."}}function qS(e){const t=(Array.isArray(e.per_scope_sync)?e.per_scope_sync:[]).map(n=>{const r=ue(n.scope_id),i=ue(n.label);if(!r&&!i)return null;const a=i||"Untitled Space",s=ue(n.last_applied_cursor),c=ue(n.last_acked_cursor),l=n.bootstrapped===!0||s?"received":"pending",d=wl(ue(n.authority_type),"local"),u=Number(n.membership_epoch??0),p=[`Scope id: ${r||"unknown"}`,`${d} authority`,Number.isFinite(u)?`membership epoch ${u}`:null,s?`last applied ${s}`:null,c?`last acknowledged ${c}`:null].filter(f=>!!f).join(" · ");return{scopeId:r||a,label:a,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 _U=["personal","private","home","mine","me"],wU=["oss","open source","opensource","community","public"],SU=["work","client"],CU=["local","legacy","review"];function RU(e){return[e.scope_id,e.label,e.kind,e.authority_type].map(t=>ue(t)??"").join(" ").toLowerCase()}function IU(e){return[e.scope_id,e.label,e.kind].map(t=>ue(t)??"").join(" ").toLowerCase()}function US(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Hf(e,t){const n=RU(e);return t.some(r=>{const i=US(r.toLowerCase());return new RegExp(`(^|[^a-z0-9])${i}([^a-z0-9]|$)`).test(n)})}function GS(e){return Hf(e,_U)||Hf(e,wU)}function kU(e){const t=IU(e);return CU.some(n=>{const r=US(n.toLowerCase());return new RegExp(`(^|[^a-z0-9])${r}([^a-z0-9]|$)`).test(t)})}function TU(e){return!GS(e)&&(!kU(e)||Hf(e,SU))}function PU(e){const t=Array.isArray(e.authorized_scopes)?e.authorized_scopes:[];if(!(ue(e.discovered_via_group_id)||ue(e.discovered_via_coordinator_id))||t.length===0)return{badgeLabel:null,detail:"",isVisible:!1,message:"",title:""};const n=t.some(GS),r=t.some(TU);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 NU(e,t){const n=e.map(r=>r.trim()).filter(Boolean);return n.length>0&&!n.includes("*")||t.length>0}function EU(e){const t=FS(e?.effective_include),n=FS(e?.effective_exclude),r=e?.inherits_global?"Global defaults":"Device override",i=`Include filter: ${BS(t,"all projects")}`,a=`Exclude filter: ${BS(n,"no exclusions")}`,s=NU(t,n);return{hasAdvancedFilters:s,statusLabel:s?"Advanced filters active":"No advanced filters",sourceLabel:r,includeLabel:i,excludeLabel:a,summary:`${r}. ${i}; ${a}.`,note:"Advanced filters only narrow data after Space access; they never grant access to another Space."}}function AU(e){const t=new Map;return(Array.isArray(e)?e:[]).forEach(n=>{const r=ue(n?.display_name),i=ue(n?.actor_id),a=sU(r);if(!r||!i||!a)return;const s=t.get(a)??{displayName:r,actorIds:[],includesLocal:!1};s.actorIds=[...s.actorIds,i],s.includesLocal=s.includesLocal||!!n?.is_local,t.set(a,s)}),[...t.values()].filter(n=>n.actorIds.length>1).sort((n,r)=>n.displayName.localeCompare(r.displayName))}function HS(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.duplicatePeople)?e.duplicatePeople:[],i=new Map;n.forEach(s=>{const c=ue(s?.actor_id);c&&i.set(c,(i.get(c)??0)+1)});const a=new Set;return r.forEach(s=>{s.includesLocal&&s.actorIds.forEach(c=>{const l=t.find(d=>ue(d?.actor_id)===c);!l||l.is_local||(i.get(c)??0)>0||a.add(c)})}),{visibleActors:t.filter(s=>!a.has(ue(s?.actor_id))),hiddenLocalDuplicateCount:a.size}}var xU=new Set(["pending_setup","waiting_for_acceptance","provisioning","initial_sync","waiting_for_device","revoking"]),DU=new Set(["pending","verifying","waiting"]);function LU(e){return(Array.isArray(e?.groups)?e.groups.map(t=>ue(t)).filter(Boolean):[]).join(", ")||"none"}function $U(e){return ue(e?.projects?.[0]?.display_name)||"the shared Project"}function jU(e,t){return t?.discovered_devices?.some(n=>n.needs_local_approval||n.waiting_for_peer_approval)?!0:e.some(n=>{const r=ua(n).state;return r==="trusted-by-you"||r==="needs-repairing"})}function OU(e,t){return t?.enabled!==!0||t.daemon_state!=="ok"||t.daemon_running===!1?!1:e.some(n=>n.status?.sync_status==="ok"&&ua(n).state==="mutual-trust"&&!qS(n).rows.some(r=>r.status==="pending"))}function MU(e){return e.some(t=>ue(t.status?.peer_state)==="online"&&ua(t).state==="mutual-trust")}function FU(e,t){return t?.daemon_state==="offline-peers"||t?.daemon_state==="stale"||t?.daemon_state==="degraded"?!0:e.some(n=>{const r=ue(n.status?.peer_state),i=ua(n).state;return n.has_error===!0&&i!=="needs-repairing"||i==="offline"||i==="needs-review"||r==="offline"||r==="stale"||r==="degraded"})}function BU(e){if(e?.daemon_running===!1)return!0;const t=e?.daemon_state;return t!==void 0&&t!=="ok"&&t!=="offline-peers"&&t!=="stale"&&t!=="degraded"}function VS(e){const t=e.coordinator,n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.shareOperations)?e.shareOperations:[],i=Array.isArray(e.reconciliation?.items)?e.reconciliation.items:[],a=LU(t);if(e.status?.enabled===!1||t?.sync_enabled===!1)return{state:"disabled",badgeLabel:"Sync off",meta:`Team: ${a}. Coordinator presence does not move Project data while sync is off.`,nextAction:"Open Settings and turn on sync before expecting Team or Project data to update."};if(e.shareOperationsLoadError)return{state:"needs-attention",badgeLabel:"Refresh needed",meta:`Team: ${a}. Device diagnostics are available, but Project sharing status could not be refreshed.`,nextAction:"Refresh Team sync to retry loading Project sharing status."};const s=r.find(p=>p.lifecycle?.state==="needs_attention"),c=i.find(p=>p.state==="needs_attention");if(s)return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${a}. A Project access update stopped and needs a retry.`,nextAction:"Retry the stopped Project access update below."};if(c)return{state:"needs-attention",badgeLabel:"Needs attention",meta:`Team: ${a}. Team access needs review before it can continue.`,nextAction:"Open Sharing, review Project access, then sync again."};const l=r.find(p=>{const f=p.lifecycle?.state;return f!==void 0&&xU.has(f)}),d=i.find(p=>{const f=p.state;return f!==void 0&&DU.has(f)});if(l||d){const p=l?$U(l):"the shared Project",f=l?.lifecycle?.primary_action?.kind,m=l?.lifecycle?.state==="revoking";return{state:"pending-setup",badgeLabel:m?"Removal pending":"Setup pending",meta:m?`Team: ${a}. Future access removal for ${p} is still pending.`:`Team: ${a}. Exact-Project setup is still pending and data delivery is not confirmed.`,nextAction:m?`Keep both devices online, then sync again to finish removing future access for ${p}.`:f==="retry_setup"?`Open Project sharing below and retry setup for ${p}.`:f==="copy_invite"?`Copy the invitation for ${p} and send it to the recipient.`:`Keep both devices online, then sync again to finish setup for ${p}.`}}if(BU(e.status))return{state:"needs-attention",badgeLabel:"Sync needs attention",meta:`Team: ${a}. The local sync service is not healthy, so Project data delivery is not confirmed.`,nextAction:"Review the sync status below, restart codemem if needed, then run Sync now again."};if(jU(n,t))return{state:"trust-blocked",badgeLabel:"Pairing needed",meta:`Team: ${a}. A device still needs two-way trust before Project data can sync.`,nextAction:"Review the device below and finish pairing or approval on both devices."};const u=ue(t?.presence_status);return u==="not_enrolled"?{state:"not-enrolled",badgeLabel:"Not enrolled",meta:`Team: ${a}. This device is not enrolled with the coordinator.`,nextAction:"Paste a Team invite below, or ask a Team admin to enroll this device."}:u!=="posted"?{state:"unreachable",badgeLabel:t?.configured?"Unreachable":"Setup needed",meta:t?.configured?`Team: ${a}. The coordinator is not currently reachable and no healthy data-plane sync is confirmed.`:"Configure or join a Team before expecting Project data to sync.",nextAction:t?.configured?"Check the coordinator connection, then refresh Team sync.":"Paste a Team invite below, or set a coordinator URL in Settings → Device Sync."}:FU(n,e.status)?{state:"reachable",badgeLabel:"Check devices",meta:`Team: ${a}. The coordinator is reachable, but one or more paired devices are offline or degraded.`,nextAction:"Bring the paired devices online, check their sync errors, then run Sync now again."}:t?.sync_enabled===!0&&OU(n,e.status)?{state:"healthy",badgeLabel:"Healthy",meta:`Team: ${a}. Sync is enabled and a trusted device has a healthy data-plane connection.`,nextAction:null}:MU(n)?{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${a}. The coordinator and a paired device are reachable, but successful Project sync is not confirmed.`,nextAction:"Run Sync now, then review the device sync status below if delivery is still pending."}:{state:"reachable",badgeLabel:"Reachable",meta:`Team: ${a}. The coordinator is reachable, but healthy Project data sync is not confirmed.`,nextAction:"Pair and approve a device, then run Sync now to confirm data delivery."}}function qU(e){return e.discovered?.stale?e.peer?Go(e.peer)!=="connected":!0:!1}function KS(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 Vf(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 UU(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 GU(e){const t=ue(e?.coordinator_url),n=Array.isArray(e?.groups)?e.groups:[];return t?n.some(r=>ue(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 HU(e,t){const n=new Map,r=i=>{const a=n.get(i)??{deviceId:i,localName:"",coordinatorName:"",peer:null,discovered:null};return n.set(i,a),a};return e.forEach(i=>{const a=ue(i?.peer_device_id);if(!a)return;const s=r(a);s.peer=i,s.localName=ue(i?.name)}),t.forEach(i=>{const a=ue(i?.device_id);if(!a)return;const s=r(a);s.discovered=i,s.coordinatorName=ue(i?.display_name)}),[...n.values()]}function VU(e){const t=Array.isArray(e.actors)?e.actors:[],n=Array.isArray(e.peers)?e.peers:[],r=Array.isArray(e.coordinator?.discovered_devices)?e.coordinator.discovered_devices:[],i=HU(n,r),a=e.duplicatePersonDecisions??{},s=AU(t).filter(l=>!a[[...l.actorIds].sort().join("::")]),c=[];return s.forEach(l=>{c.push({id:`duplicate:${l.actorIds.join(":")}`,kind:"possible-duplicate-person",priority:l.includesLocal?5:15,title:`Possible duplicate person: ${l.displayName}`,summary:l.includesLocal?"At least one entry is marked as you. Confirm whether these records represent the same person.":"Multiple people share this name. Confirm whether they should stay separate or be combined.",actionLabel:"Go to people",actorIds:l.actorIds})}),i.forEach(l=>{const d=MS({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId}),u=l.peer?Go(l.peer):"waiting",p=l.peer?ua(l.peer):null,f=ue(l.discovered?.fingerprint),m=ue(l.peer?.fingerprint);if(l.peer&&f&&m&&f!==m){c.push(KS({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||ue(l.peer?.last_error)||"Sync needs review.";c.push(KS({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"&&c.push(Vf({id:l.deviceId,key:"other-device-trust",name:d,summary:"You accepted this device. Finish onboarding on the other device so it trusts this one too."})),!l.peer&&l.discovered?.stale&&c.push(Vf({id:l.deviceId,key:"stale-discovery",name:d,summary:"This device is no longer advertising fresh coordinator presence. Wait for it to check in again before connecting it here."})),!l.peer&&Array.isArray(l.discovered?.groups)&&l.discovered.groups.length>1&&c.push(Vf({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&&hU({localName:l.localName,coordinatorName:l.coordinatorName,deviceId:l.deviceId})&&c.push(UU({id:l.deviceId,name:d,summary:"Give this device a friendly name so it is easier to recognize later."}))}),{primaryStatus:VS({status:e.status,coordinator:e.coordinator,peers:n,shareOperations:e.shareOperations,shareOperationsLoadError:e.shareOperationsLoadError,reconciliation:e.reconciliation}),summary:{connectedDeviceCount:n.filter(l=>Go(l)==="connected").length,seenOnTeamCount:r.length,offlineTeamDeviceCount:i.filter(l=>qU(l)).length},duplicatePeople:s,attentionItems:c.sort((l,d)=>l.priority-d.priority||l.title.localeCompare(d.title))}}var zS={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 wr(e){const t=document.getElementById(e);t&&t.remove()}var WS=!1;function KU(e){WS=e}var Kf=!1;function zU(e){Kf=e}var zf=!1;function WU(e){zf=e}var JU=new Set,Wf=new Set,Jf=new Set,JS="codemem-sync-duplicate-person-decisions";function YU(e){const t=String(e||"").trim();t&&(Wf.add(t),Jf.add(t),JU.add(t))}function Yf(e){const t=String(e||"").trim();return!!t&&Wf.has(t)}function XU(e){const t=String(e||"").trim();t&&Wf.delete(t)}function QU(e){const t=String(e||"").trim();return!t||!Jf.has(t)?!1:(Jf.delete(t),!0)}function Xf(){try{const e=localStorage.getItem(JS);if(!e)return{};const t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function YS(e){try{localStorage.setItem(JS,JSON.stringify(e))}catch{}}function XS(e){return[...e].map(t=>String(t||"").trim()).filter(Boolean).sort().join("::")}function ZU(){return Xf()}function e2(e,t){const n=XS(e);if(!n)return;const r=Xf();r[n]=t,YS(r)}function t2(e){const t=XS(e);if(!t)return;const n=Xf();delete n[t],YS(n)}function QS(e){return e.replace(/\b(\d{1,3}\.\d{1,3})\.\d{1,3}\.\d{1,3}\b/g,"$1.#.#")}function ZS(e){const t=String(e||"");return t?QS(t):""}function n2(e){if(!Array.isArray(e))return"";const t=Array.from(new Set(e.filter(Boolean)));return typeof t[0]=="string"?t[0]:""}function r2(e,t){const n=String(e?.relatedPeerDeviceId??"").trim();return n?t.some(r=>String(r?.peer_device_id??"").trim()===n):!1}function Sl(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 Qf(e){return!e||typeof e!="object"?"Unknown person":e.is_local?"You":Sl(e)}function i2(e){return(Array.isArray(S.lastSyncPeers)?S.lastSyncPeers:[]).filter(t=>String(t?.actor_id||"")===e).length}function a2(){return HS({actors:S.lastSyncActors,peers:S.lastSyncPeers,duplicatePeople:S.lastSyncViewModel?.duplicatePeople}).visibleActors}function eC(e){return a2().filter(t=>String(t?.actor_id||"")!==e)}function o2(e,t){const n=eC(t).find(r=>String(r?.actor_id||"")===e);return!e||!n?"Choose which person should keep these devices.":`Merge into ${Qf(n)}. Assigned devices move now; existing memories keep their current provenance.`}function Zf(e,t){if(e){if(e.textContent="",!t.length){e.hidden=!0;return}e.hidden=!1,t.slice(0,2).forEach(n=>{const r=Ws("div","sync-action"),i=Ws("div","sync-action-text");i.textContent=n.label,i.appendChild(Ws("span","sync-action-command",n.command));const a=Ws("button","settings-button sync-action-copy","Copy");a.addEventListener("click",()=>Va(n.command,a)),r.append(i,a),e.appendChild(r)})}}function tC(e,t){return t&&e.error_redacted===!0}function s2(e){return e?{action:t=>Fr({severity:"error",subsystem:"sync",trigger:t})}:{}}function nC(){const e=document.getElementById("syncAttempts");if(!e)return;const t=S.lastSyncAttempts,n=String(S.lastSyncStatus?.daemon_state||"").trim();if(!Array.isArray(t)||!t.length){ui(e,Jq());return}const r=Xq(n,t.slice(0,5).some(a=>a.status==="error")),i=t.slice(0,5).map(a=>{const s=a.started_at||a.started_at_utc||"",c=String(a.peer_device_id||"").trim(),l=Array.isArray(S.lastSyncPeers)?S.lastSyncPeers.find(m=>String(m?.peer_device_id||"")===c):null,d=String(l?.name||"").trim()||(c?c.slice(0,8):"unknown"),u=a.status==="error",p=[],f=za();if(u&&a.error){const m=String(a.error);p.push(f?QS(m):m),tC(a,f)&&p.push("Turn off Redact in Advanced diagnostics to reveal the full error.")}return!u&&(a.ops_in||a.ops_out)&&p.push(`${a.ops_in??0} in · ${a.ops_out??0} out`),!f&&a.address&&p.push(a.address),{status:a.status||"unknown",peerLabel:d,detail:p.join(" · "),startedAt:s?Zr(s):"",...s2(u),...tC(a,f)?{actionHref:"#sync/diagnostics",actionLabel:"Open Advanced diagnostics Redact setting"}:{}}});nU(e,i,r)}function c2(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncAttempts"),n=document.getElementById("syncMeta"),r=document.getElementById("syncActions");e&&ui(e,Wq()),t&&ui(t,Yq()),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."),Zf(r,[])}function pa(e){const t=Number(e??0);return Number.isFinite(t)?t:0}function l2(e){const t=String(e?.state??"clear"),n=e?.stale_peer_rows??{},r=e?.access_cleanup_ops??{},i=pa(n.would_remove),a=pa(n.ambiguous),s=pa(r.applied),c=pa(r.source_authored);return t==="cleanup_pending"||i>0?`${i} pending removal`:t==="needs_review"||a>0?`${a} needs review`:t==="cleanup_applied"||s>0?`${s} applied`:t==="cleanup_announced"||c>0?`${c} announced`:"Clear"}function rC(){const e=document.getElementById("syncStatusGrid"),t=document.getElementById("syncMeta"),n=document.getElementById("syncActions");if(!e)return;wr("syncDiagSkeleton");const r=S.lastSyncStatus;if(!r){ui(e,zq()),Zf(n,[]),t&&(t.textContent="Loading advanced sync diagnostics…");return}const i=r.peers||{},a=r.ping||{},s=r.sync||{},c=r.last_sync_at||r.last_sync_at_utc||null,l=a.last_ping_at||r.last_ping_at||Gq(i)||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||{},b=r.cleanup_diagnostics,h=b?.stale_peer_rows??{},y=pa(h.would_remove),w=pa(h.ambiguous),_=v.enabled===!0,R=Number(v.last_deleted_ops||0),I=v.last_run_at||null,T=String(v.last_error||""),A=m==="offline-peers"?"Offline peers":m==="needs_attention"?"Needs attention":m==="rebootstrapping"?"Rebootstrapping":e_(m),L=m==="disabled"||r.enabled===!1,F=Object.keys(i).length,N=!L&&F===0;if(t){const U=L?["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"]:N?["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: ${A}`,`Peers: ${F}`,c?`Last sync: ${ur(Zi(c))} ago`:"Last sync: never"];m==="offline-peers"&&U.push("All peers are currently offline; sync will resume automatically"),f&&m==="stopped"&&U.push(`Detail: ${f}`),f&&(m==="needs_attention"||m==="rebootstrapping")&&U.push(`Detail: ${f}`),_&&U.push(I?`Retention last ran ${ur(Zi(I))} ago (approx oldest-first)`:"Retention enabled"),y>0?U.push(`${y.toLocaleString()} stale peer rows pending cleanup`):w>0&&U.push(`${w.toLocaleString()} stale peer rows retained because safe cleanup could not be proven`),t.textContent=U.join(" · ")}const j=L?[{label:"State",value:"Disabled"},{label:"Mode",value:"Optional"},{label:"Pending events",value:p},{label:"Last sync",value:"Not running"}]:N?[{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:A},{label:"Pending events",value:p},{label:"Last sync",value:c?`${ur(Zi(c))} ago`:"never"},{label:"Last peer ping",value:l?`${ur(Zi(l))} ago`:"never"},{label:"Retention",value:_?I?`${R.toLocaleString()} ops last run (approx)`:"Enabled":"Disabled"}];!L&&!N&&(d||u)&&j.push({label:[d,u].filter(Boolean).join(" · "),value:"Errors"}),!L&&!N&&s.seconds_since_last&&j.push({label:"Since last sync",value:`${s.seconds_since_last}s`}),!L&&!N&&a.seconds_since_last&&j.push({label:"Since last peer ping",value:`${a.seconds_since_last}s`}),!L&&_&&T&&j.push({label:T,value:"Retention"}),!L&&!N&&b&&j.push({label:"Cleanup",value:l2(b)}),tU(e,j);const x=[];N||m==="offline-peers"||(m==="stopped"?(x.push({label:"Sync daemon is stopped. Start it.",command:"codemem serve start"}),x.push({label:"Run one sync pass now.",command:"codemem sync once"})):m==="needs_attention"?x.push({label:"Sync needs manual attention before reset can continue.",command:"codemem sync doctor"}):m==="rebootstrapping"?x.push({label:"Sync is rebuilding state in the background.",command:"codemem sync status"}):d||u||m==="error"?(x.push({label:"Sync reports errors. Restart now.",command:"codemem serve restart && codemem sync once"}),x.push({label:"Run doctor for the root cause.",command:"codemem sync doctor"})):!L&&!N&&p>0&&x.push({label:"Pending sync work detected. Run one pass now.",command:"codemem sync once"})),!L&&w>0?x.push({label:"Some stale peer rows were retained because cleanup was ambiguous.",command:"codemem sync doctor"}):!L&&y>0&&x.push({label:"Stale peer rows are eligible for cleanup. Run one sync pass now.",command:"codemem sync once"}),Zf(n,x)}var d2="syncRedactMount",u2="syncRedactLabel",iC=()=>{};function p2(e){iC=e}var em=()=>{};function tm(){const e=document.getElementById("syncPairingDisclosureMount"),t=document.getElementById("syncPairingPanelMount");if(!e||!t)return;oU(e,{contentHost:t,open:S.syncPairingOpen,onOpenChange:r=>{if(cA(r),tm(),r){const i=document.getElementById("pairingPayload"),a=document.getElementById("pairingHint");i&&ES(i,a,{payloadText:"Loading…",hintText:"Fetching pairing payload…"})}em()}});const n=document.getElementById("pairingCopy");n&&(n.onclick=async()=>{const r=S.pairingCommandRaw;r&&await Va(r,n)})}function nm(){tm();const e=document.getElementById("pairingPayload"),t=document.getElementById("pairingHint");if(!e)return;ES(e,t,Kq(S.pairingPayloadRaw));const n=document.getElementById("pairingCopy");n&&(n.disabled=!S.pairingCommandRaw)}function aC(){const e=document.getElementById(d2);e&&mt(e,g(Ji,{"aria-labelledby":u2,checked:za(),className:"sync-redact-switch",id:"syncRedact",onCheckedChange:t=>{lA(t),aC(),em(),rC(),iC(),nC(),nm()},thumbClassName:"sync-redact-switch-thumb"}))}function f2(e){em=e,tm(),aC()}function m2(e){e.classList.add("sync-shake"),e.addEventListener("animationend",()=>e.classList.remove("sync-shake"),{once:!0})}function fa(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),m2(e),e.addEventListener("input",()=>Ho(e),{once:!0}),!1}function Ho(e){e.classList.remove("sync-field-error");const t=e.parentElement?.querySelector(".sync-field-hint");t&&t.remove()}function _t(e,t){if(e instanceof Error){const n=e.message;return n.includes("fetch")||n.includes("network")||n.includes("Failed to fetch")?"Network error — check your connection and try again.":n}return t}var pi=new Map,rm=null,h2={operation_device_binding_missing:"The accepted device has not been linked yet.",operation_not_found:"This sharing operation is no longer available.",operation_scope_mismatch:"The invitation no longer matches the reviewed project access.",operation_state_invalid:"The invitation is no longer in a recoverable state.",reassign_capability_required:"A participating device must be updated before setup can continue."};function g2(e){const t=e instanceof Error?e.message:String(e);return h2[t]??"Setup could not be retried. Review diagnostics for details."}function v2(e){const t=new Map;for(const n of e){const r=n.person.actor_id;t.set(r,[...t.get(r)??[],n])}return[...t.values()]}function y2(e){return[...new Map(e.flatMap(t=>t.devices).map(t=>[t.device_id,t])).values()]}function im(e){switch(e){case"waiting_for_acceptance":return"Invitation pending";case"active":return"Sharing";case"revoking":return"Removing sharing";case"revoked":return"Previously shared";case"cancelled":return"Invitation cancelled";default:return"Sharing setup"}}function b2({operation:e,onAdvance:t,onLoadOperation:n,onReload:r,copyText:i}){const[a,s]=D(!1),[c,l]=D(()=>pi.get(e.operation_id)??null),d=B(null),u=e.lifecycle.primary_action;V(()=>{rm!==e.operation_id||!d.current||(rm=null,d.current.focus())},[c?.message,e.operation_id]);async function p(b){s(!0);try{let h=b;if(!h&&n){const w=(await n(e.operation_id)).lifecycle.primary_action;w?.kind==="copy_invite"&&(h=w.invite_link)}if(!h)throw new Error("Invitation is no longer available. Refresh the status.");await(i??(w=>navigator.clipboard.writeText(w)))(h);const y={message:"Invite copied.",tone:"success"};pi.set(e.operation_id,y),l(y)}catch(h){const y={message:h instanceof Error?h.message:"Invite could not be copied.",tone:"warning"};pi.set(e.operation_id,y),l(y)}finally{s(!1)}}async function f(){s(!0);try{const b=await t(e.operation_id),h=b.lifecycle.state==="active"?{message:"Setup complete.",tone:"success"}:b.lifecycle.state==="needs_attention"?{message:"Setup still needs attention.",tone:"warning"}:{message:`Retry started. ${b.lifecycle.label}.`,tone:"success"};pi.set(e.operation_id,h),rm=e.operation_id,l(h),await r()}catch(b){const h={message:g2(b),tone:"warning"};pi.set(e.operation_id,h),l(h),queueMicrotask(()=>d.current?.focus())}finally{s(!1)}}function m(){const b=e.projects.map(h=>h.project_id?.trim()).filter(h=>!!h);if(b.length!==e.projects.length){const h={message:"The original project selection is unavailable. Refresh Projects and try again.",tone:"warning"};pi.set(e.operation_id,h),l(h);return}if(!As(b,e.person.display_name)){const h={message:"Project sharing is unavailable. Refresh Projects and try again.",tone:"warning"};pi.set(e.operation_id,h),l(h)}}function v(){if(u){if(u.kind==="copy_invite"){p(u.invite_link);return}if(u.kind==="retry_setup"){f();return}m()}}return o("section",{"aria-label":`${im(e.lifecycle.state)} operation`,className:"project-share-operation-card",children:[o("div",{className:"peer-scope-summary",children:im(e.lifecycle.state)}),o("ul",{"aria-label":`${im(e.lifecycle.state)} projects`,className:"peer-scope-chips",children:e.projects.map((b,h)=>o("li",{className:"peer-scope-chip",children:b.display_name},`${b.display_name}:${h}`))}),o("div",{className:"peer-scope-summary",children:e.lifecycle.label}),o("div",{className:"peer-meta",role:e.lifecycle.state==="needs_attention"?"alert":void 0,children:e.lifecycle.explanation}),u?o("div",{className:"peer-actions",children:o("button",{"aria-busy":a,className:"settings-button",disabled:a,type:"button",onClick:v,children:a?u.kind==="copy_invite"?"Copying…":"Retrying…":u.label})}):null,c?o("div",{ref:d,className:`settings-note ${c.tone==="warning"?"project-attention-note":""}`,role:"status",tabIndex:-1,children:c.message}):null]})}function _2({operations:e,...t}){const n=e[0].person,r=y2(e);return o("article",{"aria-label":`Project sharing with ${n.display_name}`,className:"peer-card project-share-person-group",children:[o("h3",{className:"device-row-name",children:n.display_name}),r.length>0?o("ul",{"aria-label":`Devices for ${n.display_name}`,className:"peer-scope-rejections-list",children:r.map(i=>o("li",{children:i.display_name},i.device_id))}):null,e.map(i=>o(b2,{operation:i,...t},i.operation_id))]})}function w2(e){return e.operations.length===0?null:o("div",{className:"project-share-person-groups",children:v2(e.operations).map(t=>o(_2,{...e,operations:t},t[0].person.actor_id))})}function S2(e,t){mt(e,o(w2,{...t}))}function oC({title:e,detail:t}){return o("div",{className:"sync-empty-state",role:"status","aria-live":"polite","aria-atomic":"true",children:[o("strong",{children:e}),o("span",{children:t})]})}function C2(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 R2({actor:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){const a=String(e.actor_id||""),s=Sl(e),c=i2(a),l=eC(a),d=l.map(x=>String(x.actor_id||"")).join("|"),[u,p]=D(s),[f,m]=D(!1),[v,b]=D("Rename"),[h,y]=D(!1),[w,_]=D("Merge into selected person"),[R,I]=D(""),[T,A]=D(!1);V(()=>{p(s),m(!1),b("Rename"),y(!1),_("Merge into selected person"),I(""),A(!1)},[a,c,t,s,d]);const L=l.length?o2(R,a):"No other people are available yet. Create another person first if you need to merge duplicates.",F=[{label:"Merge into person",value:""},...l.map(x=>{const U=String(x.actor_id||"");return{label:x.is_local?Qf(x):Sl(x),value:U}})];async function N(){const x=u.trim();if(!x)return;m(!0),b("Saving…");let U=!1;try{await n(a,x),U=!0}catch{b("Retry rename")}finally{m(!1),U&&b("Rename")}}async function j(){if(!R)return;const x=l.find(q=>String(q.actor_id||"")===R);if(!x||!await vn({title:`Merge ${s} into ${Sl(x)}?`,description:"Assigned devices move now, but older memories keep their current stamped provenance for now.",confirmLabel:"Merge people",cancelLabel:"Keep separate",tone:"danger"}))return;y(!0),_("Merging…");let U=!1;try{await r(R,a),U=!0}catch{_("Retry merge")}finally{y(!1),U&&_("Merge into selected person")}}return o("div",{className:"actor-row",children:[o("div",{className:"actor-details",children:[o("div",{className:"actor-title",children:[o("strong",{children:Qf(e)}),o("span",{className:`badge actor-badge${e.is_local?" local":""}`,title:e.is_local?C2(t):void 0,children:e.is_local?"You":`${c} device${c===1?"":"s"}`})]}),e.is_local?null:o("div",{className:"peer-meta",children:[c," assigned device",c===1?"":"s"]})]}),o("div",{className:"actor-actions",children:e.is_local?o("div",{className:"peer-meta",children:"Rename yourself in config"}):o(z,{children:[o(ke,{"aria-label":`Rename ${s}`,className:"peer-scope-input actor-name-input",disabled:f||h,type:"text",value:u,onInput:x=>p(x.currentTarget.value),onKeyDown:x=>ro(x,{onSubmit:()=>{N()},disabled:f||h||!u.trim()})}),o("button",{type:"button",className:"settings-button","data-primary-action":"true",disabled:f||h,onClick:()=>{N()},children:v}),o("button",{type:"button",className:"settings-button danger",disabled:f||h,onClick:async()=>{await vn({title:`Remove ${s}?`,description:"This deactivates the person and unassigns their devices. Existing memories keep their current attribution.",confirmLabel:"Remove person",cancelLabel:"Keep",tone:"danger"})&&await i(a)},children:"Remove"}),o("button",{type:"button",className:"settings-button",disabled:f||h,onClick:()=>A(x=>!x),children:T?"Hide duplicate cleanup":"Show duplicate cleanup"}),T?o(z,{children:[o("div",{className:"peer-meta actor-merge-note",children:"Use this only when combining duplicate people into one."}),o("div",{className:"actor-merge-controls",children:[o(dr,{ariaLabel:`Merge ${s} into another person`,contentClassName:"sync-radix-select-content sync-actor-select-content",disabled:h||l.length===0,itemClassName:"sync-radix-select-item",onValueChange:I,options:F,placeholder:"Merge into person",triggerClassName:"sync-radix-select-trigger sync-actor-select actor-merge-select",value:R,viewportClassName:"sync-radix-select-viewport"}),o("button",{type:"button",className:"settings-button",disabled:h||l.length===0||!R,onClick:()=>{j()},children:w})]}),o("div",{className:"peer-meta actor-merge-note",children:L})]}):null]})})]})}function I2({actors:e,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i}){return e.length?o(z,{children:e.map(a=>{const s=String(a.actor_id||a.display_name||a.is_local||"");return o(R2,{actor:a,hiddenLocalDuplicateCount:t,onRename:n,onMerge:r,onDeactivate:i},s)})}):o(oC,{detail:"Create a named person here for legacy provenance, then confirm device Identity ownership in Devices.",title:"No people set up yet."})}function k2(e,t){mt(e,o(I2,{...t}))}function T2(e){return e.filter(t=>String(t.origin_device_id||"").trim())}function P2(e){const t=e.find(n=>String(n.last_seen_at||"").trim());return t?.last_seen_at?`Detected from older synced memories. Latest memory: ${Zr(String(t.last_seen_at).trim())}`:"Detected from older synced memories not yet attached to a current device."}function N2({devices:e}){return o(z,{children:P2(e)})}function E2(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 A2(e){const t=T2(e.devices);if(!t.length){e.panel.hidden=!0,e.onValueChange(""),da(e.mount),da(e.meta);return}const n=t.map(E2),r=n.some(i=>i.value===e.value)?e.value:n[0]?.value||"";r!==e.value&&e.onValueChange(r),e.panel.hidden=!1,mt(e.mount,o(dr,{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"})),mt(e.meta,o(N2,{devices:t}))}var x2={online:"Online",offline:"Offline",degraded:"Degraded",attention:"Action required",syncing:"Syncing",unknown:"Status unknown"};function D2({state:e,size:t=8,"aria-label":n}){const r=n??x2[e];return o("span",{"aria-label":r,className:`presence-pip presence-pip--${e}`,role:"img",style:`--presence-pip-size: ${t}px`})}function fi({feedback:e}){return e?.message?o("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 L2(){return o("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:[o("title",{children:"Chevron"}),o("path",{d:"m9 18 6-6-6-6"})]})}function $2(e){switch(Go(e)){case"connected":return"online";case"offline":return"offline";case"needs-repair":return"attention";default:return"unknown"}}var Cl=null,sC=0,am=new Set;function cC(e){if(Cl!==e){Cl=e,sC+=1;for(const t of am)t(sC)}}function j2(){const[,e]=D(0);return V(()=>(am.add(e),()=>{am.delete(e)}),[]),Cl}var O2={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 lC(e,t){if(!e)return"the selected Identity";const n=t.find(r=>r.actor_id===e);return String(n?.display_name||n?.actor_display_name||"the selected Identity")}function M2(e,t,n,r=!1,i=!1,a=!1){if(i)return{status:"unavailable",summary:"Authoritative Identity status is unavailable because the inventory is incomplete.",detail:"This installation has more device evidence than Advanced can safely classify. Ownership is not shown from a partial inventory.",actionLabel:"Review Identity inventory in Devices"};if(r||a&&!e)return{status:"unavailable",summary:"Authoritative Identity status is temporarily unavailable.",detail:"Refresh before relying on ownership details. Advanced actor_id values remain suggestions or provenance only.",actionLabel:"Review Identity in Devices"};if(e?.state==="configured")return{status:"configured",summary:`Authoritative Identity: ${lC(e.identityId,n)}.`,detail:"This result comes from an active identity_devices binding. Advanced actor_id values are not authoritative ownership.",actionLabel:"Review or rebind in Devices"};if(e?.state==="pairing_required")return{status:"pairing_required",summary:"Identity setup is blocked until pairing is complete.",detail:"Pairing establishes sync trust; it does not establish device ownership.",actionLabel:"Review setup in Devices"};if(e?.state==="conflicted")return{status:"conflicted",summary:"Identity ownership needs review.",detail:"Conflicting device evidence failed closed. Advanced actor_id values cannot resolve ownership.",actionLabel:"Review conflict in Devices"};const s=e?.suggestedIdentityId??t;return{status:e?.state??"unavailable",summary:s?`Suggested Identity: ${lC(s,n)}.`:"No authoritative Identity binding is configured.",detail:"sync_peers.actor_id is only a suggestion or hint until you confirm an identity_devices binding in Devices.",actionLabel:"Set up Identity in Devices"}}function F2(e){S.pendingDeviceIdentityFocus=e?.trim()||null,window.location.hash="devices"}function B2(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 q2(){window.location.hash="advanced/teams"}function om(e=S.lastSyncCoordinatorAdminStatus){return e?.readiness==="ready"&&e.has_admin_secret===!0}function U2({peer:e,onRemove:t,onRename:n,onSync:r}){const i=String(e.peer_device_id||""),a=e.name||(i?i.slice(0,8):"unknown"),s=e.name||i||a,c=ua(e),l=O2[gU(e)],d=e.status||{},u=bU(e),p=Yf(i),f=p&&u.total===0,m=PU(e),v=yU(e),b=qS(e),h=e.project_scope||{},y=EU(h),w=n2(e.addresses),_=Array.isArray(e.addresses)?Array.from(new Set(e.addresses.filter(Boolean).map(ae=>String(ae)))):[],R=Number(e.address_count??0),I=Number.isFinite(R)&&R>0?R:0,T=_.length?_.map(ae=>za()?ZS(ae):ae).join(" · "):I>0?`${I} ${I===1?"address":"addresses"} hidden`:"No addresses",A=S.lastDeviceIdentityInventory?.items.find(ae=>ae.deviceId===i||ae.evidenceDeviceIds.includes(i)),L=M2(A,String(e.actor_id||"")||null,S.lastSyncActors,S.deviceIdentityInventoryLoadError,S.lastDeviceIdentityInventory?.truncated===!0,S.lastDeviceIdentityInventory?.coordinatorEvidence.availability==="unavailable"),F=String(d.last_sync_at||d.last_sync_at_utc||""),N=String(d.last_ping_at||d.last_ping_at_utc||""),j=e.discovered_via_group_id?`Discovery: seen through coordinator group ${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,x=QU(i),U=B(null),[q,$]=D(a),[E,C]=D(()=>S.syncPeerFeedbackById.get(i)??null),[O,H]=D(!1),[G,ee]=D("Save name"),[Z,ie]=D(!1),[fe,Ce]=D(!1),[Pe,Ne]=D("Remove device");V(()=>{p&&u.total>0&&XU(i)},[u.total,i,p]),V(()=>{$(a),C(S.syncPeerFeedbackById.get(i)??null),H(!1),ee("Save name"),ie(!1),Ce(!1),Ne("Remove device")},[a,e.actor_id,i]),V(()=>{!x||!U.current||queueMicrotask(()=>U.current?.scrollIntoView({block:"center",behavior:window.matchMedia("(prefers-reduced-motion: reduce)").matches?"auto":"smooth"}))},[x]);async function ce(){if(!i)return;const ae=q.trim();if(!ae){const Fe={message:"Enter a friendly name for this device.",tone:"warning"};C(Fe),S.syncPeerFeedbackById.set(i,Fe),document.querySelector(`[data-device-name-input="${CSS.escape(i)}"]`)?.focus();return}H(!0),ee("Saving…");try{const Fe=await n(i,ae);C(Fe),S.syncPeerFeedbackById.set(i,Fe),ee("Save name")}catch{ee("Retry")}finally{H(!1)}}async function me(){if(f){const ae=om();if(!await vn({title:`Sync ${a} before advanced rule review?`,description:ae?"This manual sync will use the current legacy Space access and advanced filters until you review them in Coordinator Administration.":"This manual sync will use the current legacy Space access and advanced filters until a coordinator operator reviews them in Coordinator Administration.",confirmLabel:"Sync anyway",cancelLabel:ae?"Review legacy Team/Space setup first":"Cancel"}))return}ie(!0);try{const ae=await r(e,w);C(ae),ae&&S.syncPeerFeedbackById.set(i,ae)}finally{ie(!1)}}async function J(){if(!i||!await vn({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;Ce(!0),Ne("Removing…");let ae=!1;try{await t(i,s),ae=!0}catch{Ne("Retry remove")}finally{Ce(!1),ae&&Ne("Remove device")}}const se=j2()===i&&i!=="",ye=`device-drawer-${i||"unknown"}`,le=$2(e),Ee=F?`Sync: ${Zr(F)}`:"Sync: never",re=om(),Q=`${se?"Collapse":"Expand"} device ${a}`;return o(Ya,{asChild:!0,open:se,onOpenChange:ae=>{ae?cC(i):Cl===i&&cC(null)},children:o("div",{ref:U,className:"peer-card","data-peer-device-id":i||void 0,children:[o(zu,{asChild:!0,children:o("button",{"aria-label":Q,className:"device-row-head device-row-head--trigger",type:"button",children:[o(D2,{state:le}),o("span",{className:"device-row-name",title:i||void 0,children:a}),l?o("span",{"aria-label":l.label,className:"peer-direction",role:"img",title:l.label,children:l.glyph}):null,o("span",{className:"device-row-chips",children:[o("span",{className:`badge ${c.isWarning?"badge-offline":"badge-online"}`,children:c.badgeLabel}),f?o("span",{className:"badge actor-badge",children:"Review advanced rules"}):null,o("span",{className:`badge ${u.isWarning?"badge-offline":"actor-badge"}`,title:"Spaces are the hard access boundary; advanced filters only narrow inside them.",children:u.badgeLabel}),v.badgeLabel?o("span",{className:"badge badge-offline",title:"Inbound ops rejected by the sharing-domain scope gate. Expand for reason codes.",children:v.badgeLabel}):null,m.badgeLabel?o("span",{className:"badge badge-offline",title:"Review whether explicit Space access matches this device's intended role.",children:m.badgeLabel}):null,e.discovered_via_group_id?o("span",{className:"badge actor-badge",title:`Discovered through coordinator group ${e.discovered_via_group_id}`,children:`via ${e.discovered_via_group_id}`}):null]}),o("span",{className:"device-row-meta",children:Ee}),o("span",{"aria-hidden":"true",className:"device-row-chevron",children:o(L2,{})})]})}),o(Xa,{"aria-label":`Device actions for ${a}`,className:"device-row-drawer",id:ye,children:[o("div",{className:"peer-actions",children:[o("button",{type:"button",className:"settings-button",disabled:Z,onClick:()=>{me()},title:w?void 0:"Address details are hidden; sync will target this device by ID.",children:Z?"Syncing…":"Sync now"}),o("div",{className:"sync-labeled-field",children:[o("label",{className:"sync-labeled-field-caption",htmlFor:`device-name-${i||"unknown"}`,children:"Device name"}),o(ke,{"aria-label":`Friendly name for ${a}`,className:"peer-scope-input","data-device-name-input":i||void 0,disabled:O,id:`device-name-${i||"unknown"}`,placeholder:"Friendly device name",type:"text",value:q,onInput:ae=>$(ae.currentTarget.value)})]}),o("button",{type:"button",className:"settings-button",disabled:O,onClick:()=>{ce()},children:G}),o("button",{type:"button",className:"settings-button danger",disabled:fe,onClick:()=>{J()},children:Pe})]}),o("div",{className:"peer-scope",children:[x?o("div",{className:"peer-meta",children:re?"Review this device's legacy Space access and advanced rules in Coordinator Administration if the defaults are too broad.":"A coordinator operator can review this device's legacy Space access and advanced rules in Coordinator Administration if the defaults are too broad."}):f?o("div",{className:"peer-meta",children:"Advanced rule review is still pending for this device."}):null,o("div",{className:"peer-scope-summary",children:"Device details"}),o("div",{className:"peer-addresses",children:T}),j?o("div",{className:"peer-meta",children:j}):null,o("div",{className:"peer-meta",children:[F?`Sync: ${Zr(F)}`:"Sync: never",N?`Ping: ${Zr(N)}`:"Ping: never"].join(" · ")}),o("div",{className:"peer-scope-summary",children:"Space access"}),o("div",{className:"peer-meta",children:u.total>0?"These Spaces are the hard access boundary for this device.":u.emptyMessage}),u.domains.length>0?o("ul",{className:"peer-scope-chips","aria-label":"Authorized Spaces",children:u.domains.map(ae=>o("li",{className:"peer-scope-chip",title:ae.detail,children:ae.label},ae.scopeId))}):null,m.isVisible?o("div",{className:"settings-note",role:"status",children:[o("strong",{children:m.title}),o("div",{children:m.message}),o("div",{children:m.detail})]}):null,o("div",{className:"peer-meta",children:y.note}),o("div",{className:"peer-scope-summary",children:"Space sync progress"}),o("div",{className:"peer-meta",children:b.total>0?"Per-Space progress for this device. Open details to see technical identifiers.":b.emptyMessage}),b.rows.length>0?o("ul",{className:"peer-scope-rejections-list","aria-label":"Per-Space sync progress",children:b.rows.map(ae=>o("li",{title:ae.detail,children:[o("span",{className:"peer-scope-rejection-label",children:ae.label}),o("span",{className:`badge ${ae.status==="received"?"badge-online":"actor-badge"}`,children:ae.badgeLabel})]},ae.scopeId))}):null,v.total>0?o("div",{className:"peer-scope-rejections","data-peer-rejection-count":v.total,children:[o("div",{className:"peer-scope-summary",children:"Sharing-rule rejections (24h)"}),o("div",{className:"peer-meta",children:"Inbound ops the local fail-closed gate refused. Diagnostics never expose op payloads."}),o("ul",{className:"peer-scope-rejections-list",children:v.reasons.map(ae=>o("li",{children:[o("span",{className:"peer-scope-rejection-label",children:ae.label}),o("span",{className:"peer-scope-rejection-count",children:ae.count.toLocaleString()})]},ae.reason))}),v.lastAt?o("div",{className:"peer-meta",children:["Last rejected ",Zr(v.lastAt)]}):null]}):null,o("div",{className:"peer-scope-summary",children:"Authoritative Identity ownership"}),o("div",{className:"peer-meta",children:L.summary}),o("div",{className:"peer-meta",children:L.detail}),e.claimed_local_actor?o("div",{className:"peer-meta",children:B2(e.claimed_local_actor_scope)}):null,o("div",{className:"peer-actor-row",children:o("button",{type:"button",className:"settings-button",onClick:()=>F2(A?.deviceId??i),children:L.actionLabel})}),o("div",{className:"peer-scope-summary",children:"Advanced sharing rules"}),o("div",{className:"peer-meta",children:[y.statusLabel,". ",y.summary," ",y.note]}),re?o("div",{className:"peer-actions",children:o("button",{type:"button",className:"settings-button",onClick:q2,children:"Open Coordinator Administration"})}):o("div",{className:"peer-meta",children:"Legacy Space access is managed in Coordinator Administration by a coordinator operator."}),o(fi,{feedback:E})]})]})]})})}function G2(e){const t=S.syncPeersSectionFeedback,n=S.lastSyncStatus,r=n?.daemon_state==="disabled"||n?.enabled===!1;return e.peers.length?o(z,{children:[o(fi,{feedback:t}),e.peers.map(i=>{const a=String(i.peer_device_id||i.name||"unknown-peer");return o(U2,{peer:i,...e},a)})]}):o(z,{children:[o(fi,{feedback:t}),o(oC,{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 H2(e,t){mt(e,o(G2,{...t}))}var Sr=async()=>{},Rl="";function sm(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput");t&&(t.disabled=e),n&&(n.disabled=e)}function V2(e){Sr=e}function K2(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");if(!e)return;wr("syncActorsSkeleton"),sm(!1);const n=HS({actors:S.lastSyncActors,peers:S.lastSyncPeers,duplicatePeople:S.lastSyncViewModel?.duplicatePeople}),r=n.visibleActors;t&&(t.textContent=r.length?"Manage Identity names here. Confirm authoritative device ownership in Devices.":"No named people yet. Create an Identity here, then confirm device ownership in Devices.",n.hiddenLocalDuplicateCount>0&&(t.textContent+=` ${n.hiddenLocalDuplicateCount} unresolved duplicate ${n.hiddenLocalDuplicateCount===1?"entry is":"entries are"} hidden here until reviewed in Needs attention.`)),k2(e,{actors:r,hiddenLocalDuplicateCount:n.hiddenLocalDuplicateCount,onRename:async(i,a)=>{await BI(i,a),await Sr()},onMerge:async(i,a)=>{try{await fh(i,a),X("People combined. Assigned devices moved to the selected person."),await Sr()}catch(s){throw X(_t(s,"Failed to combine people."),"warning"),s}},onDeactivate:async i=>{try{await qI(i),X("Person removed. Assigned devices have been unassigned."),await Sr()}catch(a){throw X(_t(a,"Failed to remove person."),"warning"),a}}})}function z2(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta");sm(!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&&ui(e,{title:"People unavailable right now.",detail:"Refresh this page to retry. When the people endpoint responds again, named people will reload here."})}function W2(){const e=document.getElementById("syncProjectShareOperations");if(!e)return;S2(e,{operations:S.lastShareOperations,onAdvance:n=>EI(n),onLoadOperation:n=>NI(n),onReload:Sr});const t=document.getElementById("syncProjectShareOperationsMeta");t&&(t.textContent=S.shareOperationsLoadError?"Project sharing status could not be refreshed. Existing device diagnostics remain available below.":S.lastShareOperations.length>0?"Project access is grouped by Person. Devices appear after invitation acceptance.":"Share a project from Projects to invite a teammate.")}function cm(){const e=document.getElementById("syncPeers");if(!e)return;wr("syncPeersSkeleton");const t=S.lastSyncPeers,n=Array.isArray(t)?t:[];r2(S.syncPeersSectionFeedback,n)&&(S.syncPeersSectionFeedback=null),H2(e,{peers:n,onRename:async(r,i)=>{try{return await Qm(r,i),await Sr(),{message:"Device name saved.",tone:"success"}}catch(a){return{message:_t(a,"Failed to save device name."),tone:"warning"}}},onSync:async(r,i)=>{try{const a=String(r?.peer_device_id||""),s=await nd({address:i,peerDeviceId:a||void 0}),c=jS(s);let l;c.ok?a&&Yf(a)?l={message:`Triggered sync for ${r?.name||(a?a.slice(0,8):"unknown")}. ${om()?"Review legacy Space access and advanced rules in Coordinator Administration if this device needs tighter sharing.":"A coordinator operator can review legacy Space access and advanced rules in Coordinator Administration if this device needs tighter sharing."}`,tone:"warning"}:l={message:c.message,tone:"success"}:l={message:c.message,tone:"warning"};try{await Sr()}catch{l={message:"Sync started, but this view has not refreshed yet. Refresh the page or use Sync now again before retrying.",tone:"warning"}}return l}catch(a){return{message:_t(a,"Failed to trigger sync."),tone:"warning"}}},onRemove:async(r,i)=>{try{await Xm(r);const a={message:`Removed peer ${i}.`,tone:"success"};return S.syncPeerFeedbackById.delete(r),S.syncPeersSectionFeedback={...a,relatedPeerDeviceId:r},await Sr(),a}catch(a){return{message:_t(a,"Failed to remove peer. The local peer entry is still here."),tone:"warning"}}}})}function J2(){const e=document.getElementById("syncActorsList"),t=document.getElementById("syncActorsMeta"),n=document.getElementById("syncPeers");sm(!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&&ui(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&&ui(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, inspect, or re-pair them."})}function dC(){const e=document.getElementById("syncLegacyClaims"),t=document.getElementById("syncLegacyDeviceSelectMount"),n=document.getElementById("syncLegacyClaimsMeta");if(!e||!t||!n)return;const r=Array.isArray(S.lastSyncLegacyDevices)?S.lastSyncLegacyDevices:[];A2({devices:r,meta:n,mount:t,onValueChange:i=>{i!==Rl&&(Rl=i,dC())},panel:e,value:Rl})}function Y2(e){const t=document.getElementById("syncActorCreateButton"),n=document.getElementById("syncActorCreateInput"),r=document.getElementById("syncLegacyClaimButton");n?.addEventListener("keydown",i=>{ro(i,{onSubmit:()=>t?.click(),disabled:!t||t.disabled})}),t?.addEventListener("click",async()=>{if(!t||!n)return;const i=String(n.value||"").trim();if(!i){fa(n,"Enter a name for the person.");return}Ho(n),t.disabled=!0,n.disabled=!0,t.textContent="Creating…";try{await FI(i),X("Person created."),n.value="",await e()}catch(a){X(_t(a,"Failed to create person."),"warning"),t.textContent="Retry",t.disabled=!1,n.disabled=!1;return}t.textContent="Create person",t.disabled=!1,n.disabled=!1}),r?.addEventListener("click",async()=>{const i=String(Rl||"").trim();if(!i||!r||!await vn({title:`Attach history from ${i}?`,description:"This updates legacy provenance so the older device history is attached to you on this device.",confirmLabel:"Attach history",cancelLabel:"Cancel",tone:"danger"}))return;r.disabled=!0;const a=r.textContent||"Attach device history";r.textContent="Attaching…";try{await UI(i),X("Old device history attached to you."),await e()}catch(s){X(_t(s,"Failed to attach old device history."),"warning"),r.textContent="Retry",r.disabled=!1;return}r.textContent=a,r.disabled=!1})}function X2(){return window.location.hash.replace(/^#/,"")==="sync/diagnostics"?"diagnostics":"main"}function lm(e=X2()){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 uC=!1;function Q2(){uC||(uC=!0,window.addEventListener("hashchange",()=>{lm()}))}var _n={invitePolicy:"auto_admit",loadSyncData:async()=>{}};function Z2(e){_n.loadSyncData=e}var eG=[{value:"auto_admit",label:"Auto-admit"},{value:"approval_required",label:"Approval required"}];function tG(){const e=document.getElementById("syncCreateInviteButton"),t=document.getElementById("syncInviteAdminHint");if(!e||!t)return;const n=S.lastSyncCoordinatorAdminStatus?.readiness;if(n==="ready"){e.disabled=!1,t.hidden=!1,t.textContent="Legacy Team/Space setup is ready. Technical controls are in Coordinator Administration.";return}const r=n==="partial"?"Finish legacy Team/Space setup before creating remote invites. Use Coordinator Administration to check what is missing.":"Configure a coordinator URL, group, and admin secret before creating remote invites. Use Coordinator Administration to finish legacy Team/Space setup.";e.disabled=!0,t.hidden=!1,t.textContent=r}function dm(){const e=document.getElementById("syncAdminDisclosureMount");e&&aU(e,{open:WS,onOpenChange:t=>{KU(t),dm(),kl(),um()}})}function nG(){const e=document.getElementById("syncJoinPanel"),t=document.getElementById("syncJoinSection");!e||!t||e.parentElement!==t&&t.appendChild(e)}function um(){const e=document.getElementById("syncInviteOutput"),t=document.getElementById("syncInviteWarnings");if(!e)return;const n=String(S.lastTeamInvite?.encoded||"").trim();if(e.value=n,e.hidden=!n,t){const r=Array.isArray(S.lastTeamInvite?.warnings)?S.lastTeamInvite.warnings:[];t.textContent=r.join(" · "),t.hidden=r.length===0}}function Il(){const e=document.getElementById("syncJoinFeedback");if(!e)return;const t=S.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 kl(){const e=document.getElementById("syncInvitePolicyMount");e&&mt(e,g(dr,{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!==_n.invitePolicy&&(_n.invitePolicy=n,kl())},options:eG,triggerClassName:"sync-radix-select-trigger sync-actor-select",value:_n.invitePolicy,viewportClassName:"sync-radix-select-viewport"}))}function rG(e,t){dm(),kl();const n=document.getElementById("syncNowButton"),r=document.getElementById("syncShareProjectsButton"),i=document.getElementById("syncCreateInviteButton"),a=document.getElementById("syncInviteGroup"),s=document.getElementById("syncInviteTtl"),c=document.getElementById("syncInviteOutput"),l=document.getElementById("syncJoinButton"),d=document.getElementById("syncJoinInvite"),u=document.getElementById("syncProjectInviteReview"),p=document.getElementById("syncProjectInviteContext"),f=document.getElementById("syncProjectInviteReviewHeading"),m=document.getElementById("syncRecipientName"),v=document.getElementById("syncRecipientDeviceName");let b="",h,y=0;r?.addEventListener("click",()=>{As()||X("Project sharing is unavailable. Refresh Projects and try again.","warning")});const w=async(_,R)=>{if(!u||!m||!v)return"other";const I=await Ym(_);if(R!==y||d?.value.trim()!==_)return"stale";if(h=I.kind,I.kind!=="project_share_invite")return"other";const T=(I.projects??[]).map(A=>`${A.display_name} (${A.existing_memory_count} existing ${A.existing_memory_count===1?"memory":"memories"})`).join(", ");return p&&(p.textContent=`${I.inviter_name||"A teammate"} invited you${I.team_name?` through ${I.team_name}`:""} to share ${T||"selected projects"}.`),m.value=Li(I.recipient_name),v.value=Li(I.device_name),u.hidden=!1,b=_,l&&(l.textContent="Accept and start syncing"),f?.focus(),"project"};d?.addEventListener("input",()=>{y+=1,d.value.trim()!==b&&(b="",h=void 0,u&&(u.hidden=!0),l&&(l.textContent="Review invite"))}),i?.addEventListener("click",async()=>{if(!i||!a||!s||!c||i.disabled)return;const _=a.value.trim(),R=Number(s.value);let I=!0;if(_?Ho(a):I=fa(a,"Team name is required."),!R||R<1?I=fa(s,"Must be at least 1 hour."):Ho(s),!!I){i.disabled=!0,i.textContent="Creating…";try{const T=await Vm({group_id:_,policy:_n.invitePolicy,ttl_hours:R||24});S.lastTeamInvite=T,um(),c.value=String(T.encoded||""),c.hidden=!1,c.focus(),c.select();const A=Array.isArray(T.warnings)?T.warnings:[];X(A.length?`Invite created. Copy it above and review ${A.length===1?"1 warning":`${A.length} warnings`}.`:"Invite created. Copy the text above and share it with your teammate.",A.length?"warning":"success")}catch(T){X(_t(T,"Failed to create invite. Check the team name, invite lifetime, and coordinator reachability, then try again."),"warning"),i.textContent="Retry",i.disabled=!1;return}finally{i.disabled&&(i.disabled=!1,i.textContent="Create invite")}}}),d?.addEventListener("keydown",_=>{ro(_,{onSubmit:()=>l?.click(),disabled:!l||l.disabled})}),l?.addEventListener("click",async()=>{if(!l||!d)return;const _=d.value.trim();if(!_){fa(d,"Paste a team invite or pairing payload.");return}if(Ho(d),b!==_){const I=y;try{const T=await w(_,I);if(T==="project"||T==="stale")return}catch{}if(I!==y||d.value.trim()!==_)return;b=_,l.textContent="Accept invite";return}const R=u&&!u.hidden?{recipient_name:m?.value.trim()??"",device_name:v?.value.trim()??""}:void 0;if(R){const I=T=>Li(T)==="";if(I(R.recipient_name)){m&&fa(m,"Enter a human-readable name using 120 characters or fewer.");return}if(I(R.device_name)){v&&fa(v,"Enter a human-readable device name using 120 characters or fewer.");return}}l.disabled=!0,l.textContent="Accepting…";try{const I=await Yl(_,R,h);S.lastTeamJoin=I;const T=I,A=typeof T.type=="string"?T.type:"team_join";let L;if(A==="pair"){const F=String(I.peer_device_id??"").trim();L={message:F?`Paired with device ${F.slice(0,8)}. It will appear in People & devices.`:"Paired the device. It will appear in People & devices.",tone:"success"}}else if(A==="project_share"){const F=T.restart_required===!0||T.setup_state==="pending_inviter"||I.status==="pending_setup",N=typeof T.detail=="string"?T.detail.trim():"";L=F?{message:N||(T.restart_required===!0?"Project invitation accepted. Restart codemem to finish setup.":T.setup_state==="pending_inviter"?"Project invitation accepted. Waiting for the inviter to finish setup.":"Project invitation accepted. Setup is still pending."),tone:"warning"}:{message:"Project invitation accepted.",tone:"success"}}else L={message:I.status==="pending"?"Join request sent. Waiting for admin approval.":"Joined the team.",tone:"success"};S.syncJoinFlowFeedback=L,Il(),d.value="",b="",u&&(u.hidden=!0);try{await t()}catch(F){L={message:_t(F,"Accepted the invite, but this view has not refreshed yet."),tone:"warning"},S.syncJoinFlowFeedback=L,Il()}}catch(I){S.syncJoinFlowFeedback={message:_t(I,"Failed to accept. Check that the invite or pairing payload is complete and current, then try again."),tone:"warning"},Il(),l.textContent="Retry",l.disabled=!1;return}finally{l.disabled&&(l.disabled=!1,l.textContent="Review invite")}}),n?.addEventListener("click",async()=>{if(n){n.disabled=!0,n.textContent="Syncing…";try{const _=await nd(),R=jS(_);X(R.message,R.warning?"warning":void 0)}catch(_){X(_t(_,"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 pm({element:e,hidden:t=!1,restoreParent:n=null}){const r=B(null);return Tt(()=>{e&&(e.hidden=t)},[e,t]),Tt(()=>{const i=r.current;if(!(!i||!e))return e.parentElement!==i&&i.appendChild(e),()=>{!n||e.parentElement!==i||n.appendChild(e)}},[e,n]),o("div",{ref:r})}function iG({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:r}){return o(z,{children:[o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:["Invite a teammate.",o("span",{className:"sync-action-command",children:"Generate an invite when you want someone else to join this team from their device."})]}),o("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide invite form":"Invite a teammate"})]}),e?o(pm,{element:e,hidden:!t,restoreParent:n}):null]})}function aG(){return o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:["Pair another device.",o("span",{className:"sync-action-command",children:"Copy a pairing command when you want to connect another one of your own devices."})]}),o("button",{type:"button",className:"settings-button sync-action-copy",onClick:e=>Va("codemem sync pair --payload-only",e.currentTarget),children:"Copy pairing command"})]})}function oG({joinPanel:e,joinPanelOpen:t,joinRestoreParent:n,onToggle:r}){return o(z,{children:[o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:["Accept an invite or pairing.",o("span",{className:"sync-action-command",children:"Paste a team invite to join another team, or a pairing payload to connect another device."})]}),o("button",{type:"button",className:"settings-button",onClick:r,children:t?"Hide paste form":"Paste invite or pairing"})]}),e?o(pm,{element:e,hidden:!t,restoreParent:n}):null]})}function sG({invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,joinPanel:r,joinPanelOpen:i,joinRestoreParent:a,onToggleInvitePanel:s,onToggleJoinPanel:c,pairedPeerCount:l,presenceStatus:d}){const u=d==="not_enrolled";return o(z,{children:[u?o(z,{children:[o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:["Join this device.",o("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?o(pm,{element:r,hidden:!1,restoreParent:a}):null,o("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0}),o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:["This device is not on the team yet.",o("span",{className:"sync-action-command",children:"Use Join this device above, or ask an admin to enroll it first."})]})})]}):o(z,{children:[o(oG,{joinPanel:r,joinPanelOpen:i,joinRestoreParent:a,onToggle:c}),o("div",{className:"peer-meta",id:"syncJoinFeedback",hidden:!0})]}),u?null:o(iG,{invitePanel:e,invitePanelOpen:t,inviteRestoreParent:n,onToggle:s}),!l&&d==="posted"?o(aG,{}):null]})}function Tl({count:e,label:t}){return o("div",{className:"sync-section-heading",children:[o("div",{className:"sync-action-text sync-section-label",children:t}),e?o("span",{className:"badge actor-badge sync-section-count",children:e}):null]})}function Pl({children:e}){return o("div",{className:"section-meta sync-section-note",children:e})}function cG({item:e,onAction:t}){const[n,r]=D(!1);return o("div",{className:"sync-action",children:[o("div",{className:"sync-action-text",children:[e.title,o("span",{className:"sync-action-command",children:e.summary})]}),o("button",{type:"button",className:"settings-button",disabled:n,onClick:async()=>{r(!0);try{await t(e)}finally{r(!1)}},children:e.actionLabel||"Review"})]})}function lG({request:e,onApprove:t,onDeny:n}){const[r,i]=D(null),[a,s]=D(null),[c,l]=D("Approve"),[d,u]=D("Deny");return o("div",{className:"actor-row",children:[o("div",{className:"actor-details",children:o("div",{className:"actor-title",title:e.requestId||void 0,children:e.displayName})}),o("div",{className:"actor-actions",children:[o("button",{type:"button",className:"settings-button","aria-label":`${c} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("approve"),l("Approving…");try{s(await t(e)||null),l("Approve")}catch{l("Retry")}finally{i(null)}},children:c}),o("button",{type:"button",className:"settings-button","aria-label":`${d} join request from ${e.displayName}`,disabled:r!==null,onClick:async()=>{i("deny"),u("Denying…");try{s(await n(e)||null),u("Deny")}catch{u("Retry")}finally{i(null)}},children:d})]}),o(fi,{feedback:a})]})}function dG({row:e,onInspectConflict:t,onRemoveConflict:n,onReview:r}){const[i,a]=D(null),[s,c]=D(null),l=e.actionLabel||"Pair with this device",[d,u]=D(l),[p,f]=D("Remove broken device record");return o("div",{className:"peer-card peer-card--padded","data-discovered-device-id":e.deviceId,children:[o("div",{className:"peer-title",children:[o("strong",{title:e.displayTitle||void 0,children:e.displayName}),o("span",{className:`badge actor-badge${e.availabilityLabel==="Offline"?"":" local"}`,children:e.availabilityLabel}),o("span",{className:"badge actor-badge",children:e.connectionLabel}),e.approvalBadgeLabel?o("span",{className:"badge actor-badge",children:e.approvalBadgeLabel}):null]}),o("div",{className:"peer-meta",children:e.note}),o("div",{className:"peer-actions",children:[e.mode==="accept"?o("button",{type:"button",className:"settings-button","aria-label":`${d} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{a("review"),u("Pairing…"),c({message:`Pairing ${e.displayName}. Keep this page open while the device is approved and refreshed.`,tone:"success"});try{const m=await r(e)||null;c(m),u(m?.tone==="warning"?"Retry":e.actionLabel||l)}catch{c({message:`Pairing ${e.displayName} failed. Try again.`,tone:"warning"}),u("Retry")}finally{a(null)}},children:d}):null,(e.mode==="stale"||e.mode==="approval-pending"||e.mode==="ambiguous"||e.mode==="scope-pending"||e.mode==="setup-blocked")&&e.actionMessage?o("div",{className:"peer-meta",children:e.actionMessage}):null,e.mode==="paired"&&e.pairedMessage?o("div",{className:"peer-meta",children:e.pairedMessage}):null,e.mode==="conflict"?o(z,{children:[o("button",{type:"button",className:"settings-button","aria-label":`Open details for ${e.displayName}`,disabled:i!==null,onClick:()=>t(e),children:"Open device details"}),o("button",{type:"button",className:"settings-button danger","aria-label":`${p} for ${e.displayName}`,disabled:i!==null,onClick:async()=>{a("remove"),f("Removing…");try{c(await n(e)||null),f("Remove broken device record")}catch{f("Retry")}finally{a(null)}},children:p})]}):null]}),o(fi,{feedback:s})]})}function uG(e){const t=e.actionItems.length>0,n=e.actionableCount>e.actionItems.length,r=t||n||e.primaryStatus.state!=="healthy";return o(z,{children:[r?o(Tl,{label:"Needs attention"}):null,r?o(Pl,{children:"Start here when something needs review, re-pairing, or approval."}):null,e.primaryStatus.nextAction?o("div",{className:"sync-action","data-primary-sync-state":e.primaryStatus.state,children:o("div",{className:"sync-action-text",children:[e.primaryStatus.badgeLabel,o("span",{className:"sync-action-command",children:e.primaryStatus.nextAction})]})}):null,t?e.actionItems.map(i=>o(cG,{item:i,onAction:e.onAttentionAction},i.id)):null,!t&&!n&&e.primaryStatus.state==="healthy"?o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:"No urgent team work right now."})}):null,!t&&n?o("div",{className:"sync-action",children:o("div",{className:"sync-action-text",children:"More team follow-up is listed below when you are ready."})}):null]})}function pG({children:e}){return e?o(z,{children:[o(Tl,{label:"Add devices & teammates"}),o(Pl,{children:"Use these flows when you are enrolling, inviting, or pairing something new."}),e]}):null}function fG({mount:e,rows:t,onInspectConflict:n,onRemoveConflict:r,onReview:i}){return!e||!t.length&&!S.syncDiscoveredFeedback?null:ln(o(z,{children:[o(Tl,{count:t.length||void 0,label:"Devices waiting for review"}),o(Pl,{children:"Review team devices here when they still need trust, re-pairing, or approval on this machine."}),o(fi,{feedback:S.syncDiscoveredFeedback}),t.map(a=>o(dG,{row:a,onInspectConflict:n,onRemoveConflict:r,onReview:i},`${a.deviceId}:${a.incomingRequestId}:${a.fingerprint}`))]}),e)}function mG({mount:e,requests:t,onApprove:n,onDeny:r}){return!e||!t.length&&!S.syncJoinRequestsFeedback?null:ln(o(z,{children:[o(Tl,{count:t.length||void 0,label:"Join requests to review"}),o(Pl,{children:"Approve or deny requests here before those devices become part of the team."}),o(fi,{feedback:S.syncJoinRequestsFeedback}),t.map(i=>o(lG,{request:i,onApprove:n,onDeny:r},i.requestId))]}),e)}function pC(e){return o(z,{children:[o(uG,{...e}),o(pG,{children:e.children}),o(mG,{mount:e.joinRequestsMount,requests:e.pendingJoinRequests,onApprove:e.onApproveJoinRequest,onDeny:e.onDenyJoinRequest}),o(fG,{mount:e.discoveredListMount,rows:e.discoveredRows,onInspectConflict:e.onInspectConflict,onRemoveConflict:e.onRemoveConflict,onReview:e.onReviewDiscoveredDevice})]})}function fC(e){e&&(e.textContent="")}function Nl(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 hG(){return typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}function Vo(){return hG()?"auto":"smooth"}var fm="syncTeamActionsMount",gG="Approval sent for this device. This screen may take up to 30 seconds to confirm two-way trust.";function vG(e,t,n=!1){return e.length>1&&(!t||n)}function yG(e,t,n){e.hidden=!1,e.textContent=n.badgeLabel,t.textContent=n.meta,n.state==="healthy"?e.className="sync-online-badge":n.state==="disabled"||n.state==="pending-setup"||n.state==="not-enrolled"||n.state==="reachable"?e.className="sync-online-badge sync-online-offline":e.className="sync-online-badge sync-online-error"}function bG(e,t){const n=document.createElement("div");n.id=fm,e.appendChild(n),mt(n,g(pC,{actionItems:[],actionableCount:0,discoveredListMount:null,discoveredRows:[],joinRequestsMount:null,onApproveJoinRequest:async()=>null,onAttentionAction:async()=>{},onDenyJoinRequest:async()=>null,onInspectConflict:()=>{},onRemoveConflict:async()=>null,onReviewDiscoveredDevice:async()=>null,pendingJoinRequests:[],presenceStatus:"unknown",primaryStatus:t}))}function mC(e,t){const n=document.getElementById(fm);n&&(da(n),n.remove()),fC(e),t.forEach(r=>{fC(r)})}function Ko(){const e=document.getElementById("syncTeamMeta"),t=document.getElementById("syncSetupPanel"),n=document.getElementById("syncTeamActions");if(!e||!t||!n)return;dm(),kl(),um(),Il(),tG();const r=document.getElementById("syncInvitePanel"),i=document.getElementById("syncAdminSection"),a=document.getElementById("syncJoinPanel"),s=document.getElementById("syncJoinSection"),c=document.getElementById("syncJoinRequests"),l=document.getElementById("syncCoordinatorDiscovered"),d=document.getElementById("syncCoordinatorDiscoveredMeta"),u=document.getElementById("syncCoordinatorDiscoveredList");wr("syncTeamSkeleton"),nG();const p=S.lastSyncCoordinator,f=S.lastSyncViewModel||{primaryStatus:VS({status:S.lastSyncStatus,coordinator:p,peers:S.lastSyncPeers,shareOperations:S.lastShareOperations,shareOperationsLoadError:S.shareOperationsLoadError}),summary:{connectedDeviceCount:0,seenOnTeamCount:0,offlineTeamDeviceCount:0},duplicatePeople:[],attentionItems:[]},m=E=>{if(E.kind==="possible-duplicate-person"){const G=document.getElementById("syncActorsList");G instanceof HTMLElement&&(G.scrollIntoView({block:"center",behavior:Vo()}),Nl(G));return}const C=String(E.deviceId||"").trim();if(!C)return;if(E.kind==="name-device"){const G=document.querySelector(`[data-device-name-input="${CSS.escape(C)}"]`);if(G instanceof HTMLInputElement){G.scrollIntoView({block:"center",behavior:Vo()}),G.focus(),G.select(),Nl(G);return}}const O=document.querySelector(`[data-peer-device-id="${CSS.escape(C)}"]`);if(O instanceof HTMLElement){O.scrollIntoView({block:"center",behavior:Vo()}),Nl(O);return}const H=document.querySelector(`[data-discovered-device-id="${CSS.escape(C)}"]`);H instanceof HTMLElement&&(H.scrollIntoView({block:"center",behavior:Vo()}),Nl(H))},v=async E=>{const C=Array.isArray(E.actorIds)?E.actorIds.map(Z=>String(Z||"").trim()).filter(Boolean):[],O=(Array.isArray(S.lastSyncActors)?S.lastSyncActors:[]).filter(Z=>C.includes(String(Z?.actor_id||"").trim()));if(O.length<2){X("This duplicate review is outdated. Refresh the card and review the remaining people entries.","warning");return}const H=await IL({title:"Review possible duplicate people",summary:E.title.replace(/^Possible duplicate person:\s*/,""),actors:O.map(Z=>({actorId:String(Z?.actor_id||""),label:String(Z?.display_name||Z?.actor_id||"Unknown person"),isLocal:!!Z?.is_local}))});if(H.action==="different-people"){e2(C,"different-people"),X("Okay. I will keep these people separate on this device."),await _n.loadSyncData();return}if(H.action!=="merge")return;const G=O.find(Z=>String(Z?.actor_id||"")===H.primaryActorId),ee=O.find(Z=>String(Z?.actor_id||"")===H.secondaryActorId);if(!G?.actor_id||!ee?.actor_id){X("Could not determine which people to combine. Refresh People & devices and try the review again.","warning");return}try{await fh(String(G.actor_id),String(ee.actor_id)),t2(C),X(`Combined duplicate people into ${String(G.display_name||G.actor_id)}.`),await _n.loadSyncData()}catch(Z){try{await _n.loadSyncData()}catch{}X(_t(Z,"Failed to combine these people."),"warning")}},b=async E=>await Tp({title:"Pair with this device",description:"Choose a friendly name for this device before pairing it on this machine.",initialValue:E,placeholder:"Desk Mini",confirmLabel:"Pair",cancelLabel:"Cancel",validate:C=>C.trim()?null:"Enter a device name to pair this device."}),h=!!p?.configured,y=GU(p);e.title=h?String(p.coordinator_url||"").trim():"";const w=document.getElementById("syncOnlineBadge");if(w?yG(w,e,f.primaryStatus):e.textContent=f.primaryStatus.meta,!h){mC(n,[c,u]),t.hidden=!1,n.hidden=!1,bG(n,f.primaryStatus),c&&(c.hidden=!0),l&&(l.hidden=!0);return}t.hidden=!0,n.hidden=!1;const _=String(p.presence_status||""),R=Array.isArray(S.lastSyncPeers)?S.lastSyncPeers:[],I=Array.isArray(f.attentionItems)?f.attentionItems:[],T=Array.isArray(p.discovered_devices)?p.discovered_devices:[],A=String(p.coordinator_url||"").trim(),L=T.map(E=>{const C=String(E.device_id||"").trim(),O=String(E.display_name||"").trim(),H=MS({coordinatorName:O,deviceId:C})||"Discovered device",G=C&&H!==C?C:null,ee=String(E.fingerprint||"").trim(),Z=String(E.incoming_reciprocal_request_id||"").trim(),ie=Array.isArray(E.groups)?E.groups.map(Je=>String(Je||"").trim()).filter(Boolean):[],fe=R.find(Je=>String(Je?.peer_device_id||"")===C),Ce=vG(ie,!!fe,E.needs_local_approval===!0),Pe=$S({device:E,pairedLocally:!!fe}),Ne=String(fe?.fingerprint||"").trim(),ce=!!fe&&!!ee&&!!Ne&&Ne!==ee,me=S.pendingCoordinatorApprovalsByDeviceId.get(C),J=E.needs_local_approval===!0&&me?.coordinatorUrl===A&&me?.incomingRequestId===Z,se=J?"approval-pending":E.needs_local_approval===!0?"needs-local-approval":"not-required",ye=!J&&!y&&dU({device:E,hasAmbiguousCoordinatorGroup:Ce,pairedLocally:!!fe}),le=Array.isArray(E.addresses)?E.addresses:[],Ee=Number(E.address_count??0),re=Number.isFinite(Ee)&&Ee>0?Ee:0,Q=[le.length?le.map(Je=>za()?ZS(String(Je||"")):String(Je||"")).filter(Boolean).join(" · "):re>0?`${re} ${E.stale?"last-known":"fresh"} ${re===1?"address":"addresses"} hidden`:"No fresh addresses"];!le.length&&G&&Q.push(`device id: ${C}`);let we=null,ae=ye?"accept":"none",Fe=null;return ce?ae="conflict":J?(we="Waiting for refreshed coordinator status. You do not need to approve again.",ae="approval-pending"):y&&(!fe||Pe.state==="needs-your-approval")?(we=y.message,ae="setup-blocked"):Ce?(we="This device appears in multiple coordinator groups. Review legacy Team/Space setup before approving it here.",ae="ambiguous"):fe&&Yf(C)?(we="Review this device's legacy Space access and advanced rules in Coordinator Administration before you sync it.",ae="scope-pending"):fe?.last_error?(Q.push(`error: ${String(fe.last_error)}`),ye||(ae="paired")):fe?.status?.peer_state?(Q.push(`status: ${String(fe.status.peer_state)}`),ye||(ae="paired")):!fe&&E.stale?(we="Wait for a fresh coordinator presence update, then review this device again here.",ae="stale"):fe&&!ye&&(ae="paired"),ae==="paired"&&(Fe=Pe.state==="waiting-for-other-device"?Pe.description||"Waiting on the other device.":String(fe?.last_error||"").toLowerCase().includes("401")&&String(fe?.last_error||"").toLowerCase().includes("unauthorized")?"Waiting for the other device to trust this one before sync can work.":null),{actionMessage:we,actionLabel:Pe.actionLabel||(fe?"Review device":"Pair with this device"),approvalBadgeLabel:J?"Approval sent":Pe.badgeLabel,approvalState:se,availabilityLabel:E.stale?"Offline":"Available",connectionLabel:ce?zS.conflicts:fe?zS.pairedLocally:"Not connected on this device",coordinatorUrl:A,deviceId:C,displayName:H,displayTitle:G,fingerprint:ee,groupId:ie[0]??"",incomingRequestId:Z,mode:ae,note:Q.join(" · "),pairedMessage:Fe}}),F=new Set(L.filter(E=>E.approvalState==="approval-pending").map(E=>E.deviceId)),N=I.filter(E=>!E.deviceId||!F.has(E.deviceId)),j=[],x=L.filter(E=>E.mode!=="paired"&&E.mode!=="none"&&E.mode!=="scope-pending"),U=L.filter(E=>E.mode==="accept"||E.mode==="scope-pending").length,q=N.length+j.length+U;l&&(l.hidden=x.length===0&&!S.syncDiscoveredFeedback),d&&(d.textContent=x.length?"Pair with a teammate's device to see it appear in People & devices and start syncing.":""),c&&(c.hidden=j.length===0&&!S.syncJoinRequestsFeedback),mC(n,[c,u]);const $=document.createElement("div");$.id=fm,n.appendChild($),mt($,g(pC,{actionItems:N,actionableCount:q,children:g(sG,{invitePanel:r,invitePanelOpen:Kf,inviteRestoreParent:i,joinPanel:a,joinPanelOpen:zf,joinRestoreParent:s,onToggleInvitePanel:()=>{r&&(zU(!Kf),Ko())},onToggleJoinPanel:()=>{a&&(WU(!zf),Ko())},pairedPeerCount:Number(p.paired_peer_count||0),presenceStatus:_}),discoveredListMount:u,discoveredRows:x,joinRequestsMount:c,onApproveJoinRequest:async()=>null,onAttentionAction:async E=>{if(E.kind==="possible-duplicate-person"){await v(E);return}m(E)},onDenyJoinRequest:async()=>null,onInspectConflict:E=>{const C=document.querySelector(`[data-peer-device-id="${CSS.escape(E.deviceId)}"]`);if(C instanceof HTMLElement){C.scrollIntoView({block:"center",behavior:Vo()}),X(`Opened the conflicting local device record for ${E.displayName}.`,"warning");return}X("The conflicting local device record is not visible yet. Scroll to People & devices and try again.","warning")},onRemoveConflict:async E=>{if(!await vn({title:`Remove ${E.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 Xm(E.deviceId);const C={message:`Removed the broken local device record for ${E.displayName}. If it is still available, review it again from Next steps or Devices seen on team.`,tone:"success"};return S.syncDiscoveredFeedback=C,await _n.loadSyncData(),C}catch(C){return{message:_t(C,"Failed to remove the broken local device record. The old local record is still present in People & devices."),tone:"warning"}}},onReviewDiscoveredDevice:async E=>{try{const C=await b(E.displayName);return C?await _G(E,C):null}catch(C){return{message:_t(C,"Failed to review this device. Wait for a fresh presence update and try again."),tone:"warning"}}},pendingJoinRequests:j,presenceStatus:_,primaryStatus:f.primaryStatus}))}async function _G(e,t){const n=e.approvalState==="needs-local-approval",r=e.deviceId.trim(),i=e.coordinatorUrl.trim(),a=e.groupId.trim(),s=e.incomingRequestId.trim();if(n&&(!r||!i||!a||!s))throw new Error("Device identity is incomplete. Refresh the screen and try approval again.");const c=await QR(e.deviceId,{fingerprint:e.fingerprint,expectedGroupId:a||void 0,expectedIncomingRequestId:n?s:void 0}),l=String(c?.name||e.displayName||"").trim()||e.displayName;n&&S.pendingCoordinatorApprovalsByDeviceId.set(r,{coordinatorUrl:i,incomingRequestId:s});const d=Array.isArray(S.pendingAcceptedSyncPeers)?S.pendingAcceptedSyncPeers.filter(p=>String(p?.peer_device_id||"").trim()!==e.deviceId):[];S.pendingAcceptedSyncPeers=[...d,{peer_device_id:e.deviceId,name:l,fingerprint:e.fingerprint,addresses:[],claimed_local_actor:!1,status:{peer_state:"degraded"},last_error:"Waiting for the other device to approve this one."}],YU(e.deviceId);let u=n?{message:gG,tone:"success"}:{message:`Step 1 complete on this device for ${e.displayName}. Finish onboarding on the other device so both sides trust each other for sync.`,tone:"success"};S.syncDiscoveredFeedback=u,n&&Ko();try{t.trim()!==l.trim()&&(await Qm(e.deviceId,t.trim()),S.pendingAcceptedSyncPeers=S.pendingAcceptedSyncPeers.map(p=>String(p?.peer_device_id||"").trim()===e.deviceId?{...p,name:t.trim()}:p),n||(u={message:`Connected ${t.trim()} and saved its name.`,tone:"success"}))}catch(p){u={message:n?"Approval was sent, but naming did not finish. You do not need to approve again.":_t(p,"Device connected, but naming did not finish."),tone:"warning"}}S.syncDiscoveredFeedback=u;try{await _n.loadSyncData()}catch(p){u={message:n?"Approval was sent. Confirmation may take up to 30 seconds, and you do not need to approve again.":_t(p,"Device connected, but the screen did not refresh yet. Refresh this page before trying the next step."),tone:"warning"},S.syncDiscoveredFeedback=u}return u}function wG(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 ma(e){const t=e.displayProject.toLowerCase();return t.includes("fatal:")||t.includes("not a git repository")||t==="unknown project"||e.identitySource==="unmapped"}function hC(e){return ma(e)?"Unclear project identity":e.displayProject}function Kt(e){return(e.reassignableMemoryCount??e.memoryCount)>0}function SG(e,t){return e.suggestedScopeId?` · suggested ${t.find(n=>n.scopeId===e.suggestedScopeId)?.label||"Space"}`:""}function CG(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function RG(e,t){return t.find(n=>n.scopeId===e)?.label||"selected Space"}function IG(e){switch(e){case"coordinator":return"Team Space";case"local":return"Local Space";default:return"Other Space"}}function kG(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 TG(e){return e.gitRemote?e.gitRemote:e.cwd?e.cwd:e.project?e.project:"source identity unavailable"}function PG({group:e}){const t=e.memorySamples??[],n=t.length;return o("details",{className:"legacy-review-samples",children:[o("summary",{children:["Inspect affected memories",n?` (${n} sample${n===1?"":"s"})`:""]}),o("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?o("ul",{className:"legacy-review-sample-list",children:t.map(r=>o("li",{className:"legacy-review-sample",children:[o("div",{className:"legacy-review-sample-title",children:r.title}),o("div",{className:"legacy-review-group-meta",children:[r.kind||"memory"," · ",kG(r.updatedAt??r.createdAt)," ","·"," ",r.ownership==="local"?"local, reassignable":"peer-owned, stays in review"]}),r.bodyPreview?o("div",{className:"legacy-review-sample-body",children:r.bodyPreview}):null,o("div",{className:"legacy-review-group-meta mono",children:TG(r)})]},r.id))}):o("div",{className:"legacy-review-cleanup-note",children:"No samples are available for this group. Refresh Sync and try again before reassigning."})]})}function gC(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${CG(t)}\\b`,"g"),RG(t,n))),r}function NG(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 EG({item:e,onReview:t}){return o("div",{className:"actor-row",children:[o("div",{className:"actor-details",children:[o("div",{className:"actor-title",children:[o("strong",{children:e.peerName}),o("span",{className:"badge actor-badge",children:["person: ",e.actorDisplayName||e.actorId]})]}),o("div",{className:"peer-meta",children:[e.shareableCount," share by default · ",e.privateCount," marked Only me ·"," ",e.scopeLabel]})]}),o("div",{className:"actor-actions",children:o("button",{type:"button",className:"settings-button",onClick:t,children:"Review my memories in Feed"})})]})}function AG({item:e,onReassign:t,onReview:n}){const r=e.groups??[],i=e.targetScopes??[],a=Object.fromEntries(r.map(C=>[C.workspaceIdentity,C.suggestedScopeId??""])),[s,c]=D({}),[l,d]=D({}),[u,p]=D(a),[f,m]=D({}),[v,b]=D("all"),[h,y]=D(""),[w,_]=D(null),R=r.length,I=e.totalGroupCount??R,T=r.filter(ma).length,A=r.filter(C=>C.suggestedScopeId&&!ma(C)&&Kt(C)).length,L=r.filter(C=>f[C.workspaceIdentity]&&Kt(C)).length,F=r.filter(C=>f[C.workspaceIdentity]&&Kt(C)&&!!u[C.workspaceIdentity]).length,N=r.filter(C=>{const O=ma(C);return v==="suggested"&&(!C.suggestedScopeId||O)||v==="cleanup"&&!O||v==="no-suggestion"&&(C.suggestedScopeId||O)||v==="selected"&&!f[C.workspaceIdentity]?!1:!h.trim()||NG(C,i).includes(h.trim().toLowerCase())});async function j(C){const O=u[C.workspaceIdentity]||C.suggestedScopeId||"";if(!(!O||!t||w)){_(C.workspaceIdentity),d(H=>{const G={...H};return delete G[C.workspaceIdentity],G});try{const H=await t(C,O,!!s[C.workspaceIdentity],s[C.workspaceIdentity]?.confirmation_token);c(H?G=>({...G,[C.workspaceIdentity]:H}):G=>{const ee={...G};return delete ee[C.workspaceIdentity],ee})}catch(H){d(G=>({...G,[C.workspaceIdentity]:gC(H,O,i)}))}finally{_(null)}}}function x(C,O){p(H=>({...H,[C.workspaceIdentity]:O})),c(H=>{const G={...H};return delete G[C.workspaceIdentity],G}),d(H=>{const G={...H};return delete G[C.workspaceIdentity],G})}function U(C,O){m(H=>({...H,[C.workspaceIdentity]:O}))}function q(C){m(O=>({...O,...Object.fromEntries(N.filter(Kt).map(H=>[H.workspaceIdentity,C]))}))}function $(){m(C=>({...C,...Object.fromEntries(r.filter(O=>O.suggestedScopeId&&!ma(O)&&Kt(O)).map(O=>[O.workspaceIdentity,!0]))}))}async function E(){if(!t||w||F===0)return;const C=r.filter(O=>f[O.workspaceIdentity]&&Kt(O)&&!!u[O.workspaceIdentity]);if(!C.every(O=>s[O.workspaceIdentity])){_("bulk");try{for(const O of C){if(s[O.workspaceIdentity])continue;const H=u[O.workspaceIdentity]||O.suggestedScopeId||"";if(H)try{const G=await t(O,H,!1);d(ee=>{const Z={...ee};return delete Z[O.workspaceIdentity],Z}),G&&c(ee=>({...ee,[O.workspaceIdentity]:G}))}catch(G){d(ee=>({...ee,[O.workspaceIdentity]:gC(G,H,i)}))}}}finally{_(null)}}}return o("div",{className:"legacy-review-card",children:[o("div",{className:"legacy-review-header",children:[o("div",{children:[o("div",{className:"actor-title",children:[o("strong",{children:"Legacy shared review"}),o("span",{className:"badge badge-offline",children:"Needs project review"})]}),o("div",{className:"peer-meta legacy-review-summary",children:[I.toLocaleString()," older"," ",I===1?"project needs":"projects need"," a Space. They contain"," ",e.memoryCount.toLocaleString()," older shared memories total; review the projects, not individual memories.",R<I?` Showing ${R.toLocaleString()} projects; open Projects to review the rest.`:""]}),o("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."})]}),o("div",{className:"actor-actions",children:o("button",{type:"button",className:"settings-button",onClick:n,children:"Manage all projects"})})]}),o("div",{className:"legacy-review-toolbar",children:[o("div",{className:"legacy-review-filter-row",children:[["all",`Showing ${R.toLocaleString()}`],["suggested",`Suggested ${A.toLocaleString()}`],["cleanup",`Needs cleanup ${T.toLocaleString()}`],["no-suggestion","No suggestion"],["selected",`Selected ${F.toLocaleString()}`]].map(([C,O])=>o("button",{className:v===C?"settings-button legacy-filter active":"settings-button legacy-filter",onClick:()=>b(C),type:"button",children:O},C))}),o("div",{className:"legacy-review-bulk-row",children:[o("input",{"aria-label":"Search legacy project groups",className:"peer-scope-input legacy-review-search",onInput:C=>y(C.currentTarget.value),placeholder:"Search project, signal, or destination…",value:h}),o("button",{className:"settings-button",onClick:()=>q(!0),type:"button",children:"Select visible"}),o("button",{className:"settings-button",onClick:$,type:"button",children:"Select suggested"}),o("button",{className:"settings-button",onClick:()=>q(!1),type:"button",children:"Clear visible"}),t&&i.length>0?o("button",{className:"settings-save",disabled:w!=null||F===0||r.filter(C=>f[C.workspaceIdentity]&&Kt(C)&&!!u[C.workspaceIdentity]).every(C=>s[C.workspaceIdentity]),onClick:()=>{E()},type:"button",children:w==="bulk"?"Previewing…":`Preview ${F.toLocaleString()} selected`}):t&&L>0?o("span",{className:"legacy-review-cleanup-note",children:"Add or join a Space before bulk reassignment."}):null,F>0&&r.filter(C=>f[C.workspaceIdentity]&&Kt(C)&&!!u[C.workspaceIdentity]).every(C=>s[C.workspaceIdentity])?o("span",{className:"legacy-review-cleanup-note",children:"Bulk actions only preview. Confirm each project individually to avoid partial reassignment."}):null]})]}),r.length>0?o("ul",{className:"legacy-review-groups","aria-label":"Legacy shared review project groups",children:N.map(C=>o("li",{className:"legacy-review-group",children:[o("div",{className:"legacy-review-group-main",children:[o("div",{className:"legacy-review-title-wrap",children:[o("input",{"aria-label":`Select ${hC(C)}`,checked:!!f[C.workspaceIdentity],className:"cm-checkbox",disabled:!Kt(C),onChange:O=>U(C,O.currentTarget.checked),type:"checkbox"}),o("div",{children:[o("div",{className:"legacy-review-group-title",children:hC(C)}),o("div",{className:"legacy-review-group-meta",children:[wG(C.identitySource),SG(C,i)]}),Kt(C)?C.peerOwnedMemoryCount?o("div",{className:"legacy-review-cleanup-note",children:[(C.reassignableMemoryCount??C.memoryCount).toLocaleString()," ","local memor",(C.reassignableMemoryCount??C.memoryCount)===1?"y":"ies"," ","can be reassigned; ",C.peerOwnedMemoryCount.toLocaleString()," peer-owned memor",C.peerOwnedMemoryCount===1?"y":"ies"," will stay in review."]}):null:o("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."}),ma(C)?o("div",{className:"legacy-review-cleanup-note",children:"Inspect or correct the project identity before assigning old shared data to a Space."}):null]})]}),o("span",{className:"legacy-review-count",children:[C.memoryCount.toLocaleString()," memor",C.memoryCount===1?"y":"ies"]})]}),C.suggestionReason?o("div",{className:"legacy-review-reason",children:C.suggestionReason}):null,l[C.workspaceIdentity]?o("div",{className:"legacy-review-confirmation",role:"alert",children:l[C.workspaceIdentity]}):null,s[C.workspaceIdentity]?o("div",{className:"legacy-review-confirmation",role:"alert",children:[s[C.workspaceIdentity].warning," This will reassign"," ",s[C.workspaceIdentity].reassignable_memory_count.toLocaleString()," of"," ",s[C.workspaceIdentity].memory_count.toLocaleString()," memories",s[C.workspaceIdentity].skipped_memory_count?`; ${s[C.workspaceIdentity].skipped_memory_count.toLocaleString()} peer-owned copies will be left unchanged`:"","."]}):null,o(PG,{group:C}),i.length>0&&t&&Kt(C)?o("label",{className:"legacy-review-target",children:[o("span",{children:"Destination Space"}),o("select",{className:"peer-scope-input",disabled:w!=null,onChange:O=>x(C,O.currentTarget.value),value:u[C.workspaceIdentity]||"",children:[o("option",{value:"",children:"Choose Space…"}),i.map(O=>o("option",{value:O.scopeId,children:[O.label," · ",IG(O.authorityType),O.scopeId===C.suggestedScopeId?" · suggested":""]},O.scopeId))]})]}):null,i.length>0&&t&&Kt(C)?o("div",{className:"legacy-review-actions",children:o("button",{type:"button",className:"settings-button",disabled:w!=null||!u[C.workspaceIdentity],onClick:()=>{j(C)},children:w===C.workspaceIdentity?s[C.workspaceIdentity]?"Reassigning…":"Previewing…":s[C.workspaceIdentity]?"I understand, reassign memories":"Preview reassignment"})}):null]},C.workspaceIdentity))}):null]})}function xG({items:e,legacyReview:t,onLegacyReassign:n,onLegacyReview:r,onReview:i}){return o(z,{children:[t?o(AG,{item:t,onReassign:n,onReview:r??i}):null,e.map(a=>o(EG,{item:a,onReview:i},`${a.peerName}:${a.actorId}:${a.scopeLabel}`))]})}function DG(){Iy("mine"),S.feedQuery="",window.location.hash="feed"}function LG(){window.location.hash="projects"}async function $G(e,t,n,r){try{const i=await jI({...r?{confirmation_token:r}:{},confirmed_old_copies:n,scope_id:t,workspace_identity:e.workspaceIdentity});return S.lastSyncLegacySharedReview=i.legacy_shared_review??null,X(`Reassigned ${i.reassigned_memory_count.toLocaleString()} legacy review memor${i.reassigned_memory_count===1?"y":"ies"} to ${i.target_scope_label}.`),vC(),null}catch(i){if(i instanceof eh)return i.preview;const a=i instanceof Error?i.message:"Unable to reassign legacy review memories.";throw X(a,"warning"),new Error(a)}}function vC(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewMeta"),n=document.getElementById("syncSharingReviewList");if(!e||!t||!n)return;const r=e.querySelector(".settings-group-title"),i=Array.isArray(S.lastSyncSharingReview)?S.lastSyncSharingReview:[],a=S.lastSyncLegacySharedReview,s=Math.max(0,Number(a?.memory_count??0)),c=a?.has_data?{groups:Array.isArray(a.groups)?a.groups.map(u=>{const p=u;return{displayProject:String(p.display_project||p.project||"Unknown project"),identitySource:String(p.identity_source||"unknown"),lastUpdatedAt:typeof p.last_updated_at=="string"?p.last_updated_at:null,memoryCount:Number(p.memory_count||0),memorySamples:Array.isArray(p.memory_samples)?p.memory_samples.map(f=>{const m=f,v=m.ownership==="peer"?"peer":"local";return{bodyPreview:typeof m.body_preview=="string"?m.body_preview:null,createdAt:typeof m.created_at=="string"?m.created_at:null,cwd:typeof m.cwd=="string"?m.cwd:null,gitRemote:typeof m.git_remote=="string"?m.git_remote:null,id:Number(m.id||0),kind:typeof m.kind=="string"?m.kind:null,ownership:v,project:typeof m.project=="string"?m.project:null,title:String(m.title||`Memory ${Number(m.id||0)}`),updatedAt:typeof m.updated_at=="string"?m.updated_at:null}}):[],peerOwnedMemoryCount:Number(p.peer_owned_memory_count||0),reassignableMemoryCount:Number(p.reassignable_memory_count||0),suggestedScopeId:typeof p.suggested_scope_id=="string"?p.suggested_scope_id:null,suggestionReason:typeof p.suggestion_reason=="string"?p.suggestion_reason:null,workspaceIdentity:String(p.workspace_identity||p.display_project||"unknown")}}):[],memoryCount:s,scopeId:String(a.scope_id||"legacy-shared-review"),totalGroupCount:Number(a.total_group_count||a.groups?.length||0),targetScopes:Array.isArray(a.target_scopes)?a.target_scopes.map(u=>{const p=u;return{authorityType:String(p.authority_type||"unknown"),label:String(p.label||p.scope_id||"Unknown domain"),scopeId:String(p.scope_id||"")}}).filter(u=>u.scopeId):[]}:null;if(!i.length&&!c){da(n),e.hidden=!0;return}e.hidden=!1,r&&(r.textContent=c?"Sharing review":"What teammates will receive");const l=S.currentProject?`current project (${S.currentProject})`:"all allowed projects";t.textContent=c?`Review conservative upgrade state before promoting historical shared data. Teammates receive memories from ${l} by default once Sharing-domain grants allow it.`:`Teammates receive memories from ${l} by default. Use Only me on a memory when it should stay local.`;const d=i.map(u=>({actorDisplayName:String(u.actor_display_name||u.actor_id||"unknown"),actorId:String(u.actor_id||"unknown"),peerName:String(u.peer_name||u.peer_device_id||"Device"),privateCount:Number(u.private_count||0),scopeLabel:String(u.scope_label||"All allowed projects"),shareableCount:Number(u.shareable_count||0)}));mt(n,g(xG,{items:d,legacyReview:c,onLegacyReassign:$G,onLegacyReview:LG,onReview:DG}))}var El="";function jG(e){if(!e)return;const t=String(e?.coordinator_url||"").trim(),n=!!(e.lookup_error||e.reciprocal_approval_error),r=Array.isArray(e?.discovered_devices)?e.discovered_devices:[],i=new Map;for(const a of r){const s=String(a.device_id||"").trim();s&&i.set(s,[...i.get(s)||[],a])}for(const[a,s]of S.pendingCoordinatorApprovalsByDeviceId){if(s.coordinatorUrl!==t){S.pendingCoordinatorApprovalsByDeviceId.delete(a);continue}if(n)continue;const c=i.get(a);c&&(c.some(l=>String(l.incoming_reciprocal_request_id||"").trim()===s.incomingRequestId&&l.needs_local_approval===!0)||S.pendingCoordinatorApprovalsByDeviceId.delete(a))}}function OG(){return[...S.pendingCoordinatorApprovalsByDeviceId].map(([e,t])=>[e,t.coordinatorUrl,t.incomingRequestId]).sort(([e],[t])=>e.localeCompare(t))}var zo=null,mm=0,hm=null,gm=0,vm=null,MG=15e3;function yC(e){return`project:${e||""}|includeJoinRequests:false`}function FG(e){const t=yC(e);return!zo||zo.key!==t||Date.now()>=zo.expiresAtMs?null:zo.payload}function BG(e,t){zo={key:yC(e),expiresAtMs:Date.now()+MG,payload:t}}function qG(e){return!e||typeof e!="object"?e:{...e,join_requests:[]}}function UG(){const e=document.getElementById("syncSharingReview"),t=document.getElementById("syncSharingReviewList"),n=document.getElementById("syncSharingReviewMeta"),r=document.getElementById("syncLegacyClaims"),i=document.getElementById("syncLegacyClaimsMeta");e&&(e.hidden=!0),t&&(t.textContent=""),n&&(n.textContent=""),r&&(r.hidden=!0),i&&(i.textContent="")}async function GG(e,t){if(S.activeTab==="health"&&!t.requireFreshSyncStatus){const r=FG(e);if(r)return{payload:r,fetchedFreshSyncStatus:!1}}const n=!za();return{payload:await Jl(n,e,{includeJoinRequests:!1,signal:t.signal}),fetchedFreshSyncStatus:!0}}function HG(e){return e.requiredSurface!=="all"?!0:e.actorLoadError||e.coordinatorAdminLoadError||e.shareOperationsLoadError?!1:!e.requiresDeviceIdentityInventory||!e.deviceIdentityInventoryLoadError}async function VG(e){const t=ZU();let n=null,r=null,i=S.lastDeviceIdentityInventory,a=S.lastShareOperations,s=!1,c=!1,l=S.deviceIdentityInventoryLoadError,d=!1;try{n=await YR({signal:e.signal})}catch{s=!0}try{r=await Kl({signal:e.signal})}catch{c=!0}if(S.activeTab==="advanced"){l=!1;try{i=await td({signal:e.signal})}catch{l=!0}}try{const u=await ph({signal:e.signal});a=Array.isArray(u.items)?u.items:[]}catch{d=!0}return{actorsPayload:n,coordinatorAdminStatus:r,deviceIdentityInventory:i,shareOperations:a,actorLoadError:s,coordinatorAdminLoadError:c,deviceIdentityInventoryLoadError:l,shareOperationsLoadError:d,duplicatePersonDecisions:t}}function Al(e={}){const t=KG(++mm,{requiredSurface:e.requiredSurface??"all",requireFreshSyncStatus:e.requireFreshSyncStatus??!1,signal:e.signal});return hm=t,t}async function KG(e,t){try{const n=S.currentProject||"",{payload:r,fetchedFreshSyncStatus:i}=await GG(n,t);if(t.signal?.aborted)return!1;const{actorsPayload:a,coordinatorAdminStatus:s,deviceIdentityInventory:c,shareOperations:l,actorLoadError:d,coordinatorAdminLoadError:u,deviceIdentityInventoryLoadError:p,shareOperationsLoadError:f,duplicatePersonDecisions:m}=await VG(t);if(e!==mm)return hm??!1;if(t.signal?.aborted)return!1;const v=HG({requiredSurface:t.requiredSurface,actorLoadError:d,coordinatorAdminLoadError:u,shareOperationsLoadError:f,requiresDeviceIdentityInventory:S.activeTab==="advanced",deviceIdentityInventoryLoadError:p});i&&BG(n,qG(r)),jG(r.coordinator);const b=JSON.stringify([r,a,s,c,p,l,f,m,OG()]);if(b===El)return v;El=b;const h=r.status&&typeof r.status=="object"?r.status:null;h&&(S.lastSyncStatus=h),Array.isArray(a?.items)?S.lastSyncActors=a.items:S.lastSyncActors=[];const y=Array.isArray(r.peers)?r.peers:[],w=new Set(y.map(R=>String(R?.peer_device_id||"").trim()).filter(Boolean)),_=Array.isArray(S.pendingAcceptedSyncPeers)?S.pendingAcceptedSyncPeers.filter(R=>{const I=String(R?.peer_device_id||"").trim();return I&&!w.has(I)}):[];return S.pendingAcceptedSyncPeers=_,S.lastSyncPeers=[...y,..._],p||(S.lastDeviceIdentityInventory=c),S.deviceIdentityInventoryLoadError=p,S.lastShareOperations=l,S.shareOperationsLoadError=f,S.lastSyncSharingReview=r.sharing_review||[],S.lastSyncLegacySharedReview=r.legacy_shared_review&&typeof r.legacy_shared_review=="object"?r.legacy_shared_review:null,S.lastSyncCoordinator=r.coordinator||null,S.lastSyncCoordinatorAdminStatus=s&&typeof s=="object"?s:null,S.lastSyncJoinRequests=Array.isArray(r.join_requests)?r.join_requests:[],S.lastSyncAttempts=r.attempts||[],S.lastSyncLegacyDevices=r.legacy_devices||[],S.lastSyncDuplicatePersonDecisions=m,S.lastSyncViewModel=VU({actors:S.lastSyncActors,peers:S.lastSyncPeers,coordinator:S.lastSyncCoordinator,status:h,shareOperations:S.lastShareOperations,shareOperationsLoadError:f,reconciliation:r.recipient_policy_reconciliation,duplicatePersonDecisions:S.lastSyncDuplicatePersonDecisions}),rC(),Ko(),K2(),W2(),vC(),cm(),dC(),nC(),zG(),d&&z2(),u&&(S.lastSyncCoordinatorAdminStatus=null,Ko()),v}catch{return t.signal?.aborted?!1:e!==mm?hm??!1:(El="",S.deviceIdentityInventoryLoadError=!0,wr("syncTeamSkeleton"),wr("syncActorsSkeleton"),wr("syncPeersSkeleton"),wr("syncDiagSkeleton"),UG(),J2(),c2(),!1)}}function zG(){if(S.activeTab==="health"){Pw();return}Tw()}function WG(){El="",S.lastSyncPeers?.length&&cm()}async function xl(){await Al()}function JG(e={}){const t=YG(++gm,e.signal);return vm=t,t}async function YG(e,t){try{const n=await XR(!1,{signal:t});return t?.aborted?!1:e!==gm?vm??!1:(S.pairingPayloadRaw=n||null,nm(),!0)}catch{return t?.aborted?!1:e!==gm?vm??!1:(S.pairingPayloadRaw=null,nm(),!1)}}function XG(e){Uq(),Pc(),Z2(xl),V2(xl),p2(cm),rG(e,xl),Y2(xl),f2(e),lm(),Q2()}function QG(e,t){const n=Qe("runtimeLabel");n&&(n.textContent=t?`v${e} (${t})`:`v${e}`,n.title=t?`codemem ${e} (${t})`:`codemem ${e}`,n.hidden=!1)}async function ZG(){try{const e=await NR();if(!e?.version)return;QG(e.version,"f2d4052")}catch{}}var ym=null,bC=1500,Wo=XE(),_C="codemem-legacy-upgrade-notice-dismissed",Cr=null,an=!1,Dl=!1,bm=!1;function wC(e,t=0){const n=Number(e);return Number.isFinite(n)?Math.max(0,n):t}function SC(e){if(!e||typeof e!="object")return null;const t=e.legacy_shared_review??e;if(!t||typeof t!="object")return null;const n=t;if(n.has_data!==!0)return null;const r=Array.isArray(n.groups)?n.groups:[],i=wC(n.total_group_count,r.length),a=wC(n.memory_count);return i<=0||a<=0?null:{groupCount:i,memoryCount:a}}function CC(){try{return localStorage.getItem(_C)==="1"}catch{return!1}}function eH(){if(document.getElementById("legacyUpgradeDontShow")?.checked)try{localStorage.setItem(_C,"1")}catch{}}function tH(e,t){e&&t?nE(t):rE()}function RC(e){!e||bm||CC()||(bm=!0,Uv(()=>tH(!0,e)))}async function nH(){if(!(bm||CC()))try{RC(SC(await Jl(!1,"",{includeJoinRequests:!1})))}catch{}}function mi(e,t){const n=Qe("viewerReconnectOverlay"),r=Qe("viewerReconnectDetail");!n||!r||(n.hidden=!e,r.textContent=t||"Trying again automatically while the viewer comes back.")}async function _m(){try{return await PR(),!0}catch{return!1}}function wm(){return document.visibilityState!=="hidden"&&!IS()}function IC(){return`${S.activeTab}:${S.advancedSection}:${S.syncPairingOpen}`}function rH(e){S.refreshQueued||e.surface!==IC()||!e.refreshSucceeded||!Dl||an||(Dl=!1,au("connection_restored"))}function kC(){if(an)return;an=!0,Dl=!0,au("connection_lost"),Sm(),Uv(),Rr("error","(reconnecting)"),mi(!0,"The viewer server is restarting or temporarily unavailable. Trying again automatically…");const e=async()=>{if(await _m()){if(Cr&&(clearTimeout(Cr),Cr=null),an=!1,mi(!0,"Viewer responded. Restoring your session…"),wm()){Rr("refreshing"),Jo();try{await $l()}catch{}}else Rr("paused",document.visibilityState==="hidden"?"(tab hidden)":"(settings open)");an||mi(!1);return}mi(!0,"Still reconnecting… the viewer will recover automatically as soon as the server responds."),Cr=setTimeout(e,bC)};Cr=setTimeout(e,bC)}function Rr(e,t){S.refreshState=e;const n=Qe("refreshStatus");if(!n)return;n.dataset.refreshState=e;const r=a=>{const s=Qe("refreshAnnouncer");!s||ym===e||(s.textContent=a,ym=e)};if(e==="refreshing"){n.textContent="refreshing…";return}if(e==="paused"){n.textContent="paused",r("Auto refresh paused.");return}if(e==="error"&&t==="(reconnecting)"){n.textContent="reconnecting…",r("Viewer reconnecting.");return}if(e==="error"){n.textContent="refresh failed",r("Refresh failed.");return}const i=t?` ${t}`:"";n.textContent=`updated ${new Date().toLocaleTimeString()}${i}`,ym=null}function Sm(){Wo.cancel(),ha&&(clearTimeout(ha),ha=null),S.refreshQueued=!1,S.refreshTimer&&(clearInterval(S.refreshTimer),S.refreshTimer=null)}function iH(){Sm(),Rr("paused")}function Jo(){S.refreshTimer||(S.refreshTimer=setInterval(()=>Ir(),5e3))}document.addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"?(Sm(),Rr("paused","(tab hidden)")):!IS()&&!an&&(Jo(),Ir())});function TC(){const e=S.advancedSection==="sync",t=Qe("advancedSyncContent"),n=Qe("advancedTeamsContent");t&&(t.hidden=!e),n&&(n.hidden=e);const r=Qe("advancedSyncButton"),i=Qe("advancedTeamsButton");r?.setAttribute("aria-pressed",String(e)),i?.setAttribute("aria-pressed",String(!e)),queueMicrotask(()=>{const a=window.location.hash.replace(/^#/,"");lm(a==="sync/diagnostics"||a==="advanced/sync/diagnostics"?"diagnostics":"main")})}var aH=pA();function PC(e){const t=new Set(tA(S.lastCoordinatorAdminStatus));qr.forEach(r=>{const i=Qe(`tab-${r}`);i&&(i.hidden=r!==e||!t.has(r))}),qr.forEach(r=>{const i=Qe(`tabBtn-${r}`);if(!i)return;i.hidden=!t.has(r);const a=r===e&&t.has(r);i.classList.toggle("active",a),a?i.setAttribute("aria-current","page"):i.removeAttribute("aria-current")});const n=Qe(`tabBtn-${e}`);n&&aH(n),TC()}function hi(e,t={}){Wo.cancel();const n=Ka(e,S.lastCoordinatorAdminStatus);n==="advanced"&&Tu(t.advancedSection??ku()??S.advancedSection),Ry(n,t.canonicalHash?{canonicalHash:!0}:{}),PC(n),Ir()}function oH(){qr.forEach(e=>{Qe(`tabBtn-${e}`)?.addEventListener("click",()=>hi(e,e==="advanced"?{canonicalHash:!0,advancedSection:"sync"}:{canonicalHash:!0}))}),Qe("advancedSyncButton")?.addEventListener("click",()=>Tu("sync",!0)),Qe("advancedTeamsButton")?.addEventListener("click",()=>{Tu("teams",!0),TC(),queueMicrotask(()=>document.getElementById("coordinatorAdminLegacyNoticeTitle")?.focus())}),Qe("coordinatorAdminOpenSharing")?.addEventListener("click",()=>{hi("sharing",{canonicalHash:!0}),queueMicrotask(()=>document.getElementById("tabBtn-sharing")?.focus())}),window.addEventListener("hashchange",()=>{const e=Iu();if(e){const t=ku();hi(e,t?{advancedSection:t}:{}),e==="advanced"&&t==="teams"&&queueMicrotask(()=>document.getElementById("coordinatorAdminLegacyNoticeTitle")?.focus())}}),hi(S.activeTab)}async function sH(){try{const e=await es();S.knownProjects=e,WG();const t=Cu("projectFilter");if(!t)return;t.textContent="";const n=document.createElement("option");n.value="",n.textContent="All Projects",t.appendChild(n),e.forEach(r=>{const i=document.createElement("option");i.value=r,i.textContent=r,t.appendChild(i)})}catch{}}function cH(e){S.pendingDeviceIdentityFocus=e?.trim()||null,hi("devices",{canonicalHash:!0})}var Ll=zP({},{onOpenTeamSetup:Kw,onReviewDevices:cH}),NC={version:1,identities:[],teams:[],teamMemberships:[],identityDevices:[],projectRecipients:[]},Cm=0,Rm=null,zt=null;async function lH(e={}){const t=[];let n=0;for(;;){const r=await Sa({limit:250,offset:n,signal:e.signal});if(t.push(...r.projects),!r.has_more)break;n+=r.limit}return Ns(t)}function dH(){const e=new Map,t={unknown:0,offline:1,available:2},n=(r,i)=>{!r||t[i]<=t[e.get(r)??"unknown"]||e.set(r,i)};for(const r of S.lastSyncCoordinator?.discovered_devices??[])n(String(r.device_id??"").trim(),r.stale?"offline":"available");for(const r of S.lastSyncPeers){const i=String(r.peer_device_id??"").trim(),a=Go(r);n(i,a==="connected"||a==="available"?"available":a==="offline"?"offline":"unknown")}return[...e].map(([r,i])=>({deviceId:r,state:i}))}function uH(){return S.lastSyncPeers.flatMap(e=>{const t=String(e.peer_device_id??"").trim();return t?[{deviceId:t,runtimeVersion:e.runtime_version??null,runtimeVersionObservedAt:e.runtime_version_observed_at??null}]:[]})}function EC(e){if(e==="advanced_sync"){hi("advanced",{advancedSection:"sync"}),queueMicrotask(()=>document.getElementById("tabBtn-advanced")?.focus());return}hi(e,{canonicalHash:!0}),queueMicrotask(()=>document.getElementById(`tabBtn-${e}`)?.focus())}function AC(e={}){const t=document.getElementById("devicesMount");if(!t)return Promise.resolve(!0);const n=pH(t,++Cm,e);return Rm=n,n}async function xC(){const[e,t]=await Promise.all([AC(),Ll()]);return e&&t}async function pH(e,t,n){zt||Lc(e,NC,{version:1,items:[]},[],[],{loading:!0});try{const[r,i,a,s,c]=await Promise.all([lH(n),ed(n),yI(n),td(n).then(p=>({inventory:p,unavailable:!1})).catch(()=>({inventory:zt?.inventory,unavailable:!0})),Al({requiredSurface:"devices",signal:n.signal})]);if(n.signal?.aborted)return!1;if(t!==Cm)return Rm??!1;const l=dH(),d=uH(),u=mh(S.lastSyncStatus);return!s.unavailable&&s.inventory&&(S.lastDeviceIdentityInventory=s.inventory),S.deviceIdentityInventoryLoadError=s.unavailable,Lc(e,i,a,r,l,{inventory:s.inventory,inventoryUnavailable:s.unavailable,coordinatorEnrollmentIssueCount:u,onCommitted:xC,onNavigate:EC,peerRuntimeMetadata:d}),zt={projects:r,intent:i,reconciliation:a,availability:l,peerRuntimeMetadata:d,inventory:s.inventory,inventoryUnavailable:s.unavailable,coordinatorEnrollmentIssueCount:u},c}catch{return n.signal?.aborted?!1:t!==Cm?Rm??!1:(zt?Lc(e,zt.intent,zt.reconciliation,zt.projects,zt.availability,{coordinatorEnrollmentIssueCount:zt.coordinatorEnrollmentIssueCount,inventory:zt.inventory,inventoryUnavailable:zt.inventoryUnavailable,onCommitted:xC,onNavigate:EC,peerRuntimeMetadata:zt.peerRuntimeMetadata,refreshError:!0}):Lc(e,NC,{version:1,items:[]},[],[],{loadError:!0}),!1)}}Cu("projectFilter")?.addEventListener("change",()=>{Wo.cancel(),S.currentProject=Cu("projectFilter")?.value||"",oi(!0),Ir()});var ha=null;async function fH(e){await Promise.all([N1({signal:e.signal}),sq({signal:e.signal}),YN().catch(()=>{})])}function mH(e,t,n,r){if(t!=="health"&&Tw(),t==="feed"){const s=n$();e.push(Wb(s,{signal:r.signal}),yf({signal:r.signal}))}if(t==="projects"&&e.push(la({awaitTeamSetupSummary:!0,signal:r.signal}).then(n)),t==="sharing"&&e.push(Ll({awaitTeamSetupSummary:!0,signal:r.signal}).then(n)),t==="devices"&&e.push(AC({signal:r.signal}).then(n)),t==="health"&&e.push(E1({signal:r.signal}),Al({requiredSurface:"health",requireFreshSyncStatus:Dl,signal:r.signal}).then(n)),t==="advanced"&&S.advancedSection==="sync"&&e.push(Al({signal:r.signal}).then(n)),t==="advanced"&&S.advancedSection==="teams"&&e.push(Ac({signal:r.signal}).then(n)),!S.syncPairingOpen)return;const i=t==="advanced"&&S.advancedSection==="sync",a=JG({signal:r.signal});e.push(i?a.then(n):a)}async function Ir(){an||(ha&&clearTimeout(ha),ha=setTimeout(()=>$l(),80))}async function hH(e,t){if(!t.isCurrent()&&!Bm(e))return;const n=await _m();t.isOwned()&&(n?Rr("error"):kC())}function gH(e){Wo.finish(e),S.refreshInFlight=!1,!(!S.refreshQueued||an||!wm())&&(S.refreshQueued=!1,$l())}async function $l(){if(an||!wm())return;if(S.refreshInFlight){S.refreshQueued=!0;return}S.refreshInFlight=!0;const e=Wo.begin();try{Rr("refreshing");const t=S.activeTab,n=IC(),r=[fH(e)];let i=!0;if(mH(r,t,s=>{i=i&&s},e),await Zo(Promise.all(r),e.signal),!e.isCurrent()){if(Bm(e.signal.reason))throw e.signal.reason;return}RC(SC(S.lastSyncLegacySharedReview));const a=Ka(S.activeTab,S.lastCoordinatorAdminStatus);a!==S.activeTab&&Ry(a),PC(S.activeTab),Rr(i?"idle":"error"),rH({refreshSucceeded:i,surface:n})}catch(t){await hH(t,e)}finally{gH(e)}}dA();var DC=document.getElementById("toastRoot");DC&&WE(DC);var LC=document.getElementById("diagnosticsDrawerMount");LC&&JN(LC);var $C=document.getElementById("legacyTeamSetupMount");$C&&kF($C,{onCompleted:async()=>{let e,t;const n={requireTeamSetupSummary:!0};if(S.activeTab==="sharing"?(t=await la(n),e=await Ll(n)):(e=await Ll(n),t=await la(n)),!e||!t)throw new Error("team_setup_refresh_failed")}});var jC=document.getElementById("legacyUpgradeDialogMount");jC&&tE(jC,{onDismiss:eH,onReviewGroups:()=>{window.location.hash="sync",setTimeout(()=>document.getElementById("syncSharingReview")?.scrollIntoView({block:"start"}),120)},onReviewProjects:()=>{window.location.hash="projects"}}),fA(Js("themeToggle")),Py(Nu()),oH(),n1(),XN(),AB(()=>Ir(),{onOpenTeamSetup:Kw}),XG(()=>Ir()),l$(),Bq(iH,Jo,()=>Ir()),sH(),Qe("viewerReconnectRetry")?.addEventListener("click",async()=>{if(au("reconnect_requested"),mi(!0,"Checking whether the viewer server is back…"),!await _m()){kC();return}Cr&&(clearTimeout(Cr),Cr=null),an=!1,mi(!0,"Viewer responded. Restoring your session…"),Jo();try{await $l()}catch{}an||mi(!1)}),ZG(),nH(),Ir(),Jo()})();