diff --git a/internal/webapp/e2e_serve_test.go b/internal/webapp/e2e_serve_test.go index 7cea327..e9b4187 100644 --- a/internal/webapp/e2e_serve_test.go +++ b/internal/webapp/e2e_serve_test.go @@ -56,7 +56,10 @@ func TestE2EServe(t *testing.T) { if err != nil { t.Fatal(err) } - srv := &Server{Root: be, Projects: db, Device: webDevice, Refresh: 0, Upload: UploadConfig{Enabled: true}} + // Volume is deliberately the lowercase storage basename, so hub.spec.ts's + // "#vault-name reads BearDrive" assertion actually catches a brand that + // falls back to storage instead of the product name. + srv := &Server{Root: be, Projects: db, Device: webDevice, Refresh: 0, Volume: "beardrive", Upload: UploadConfig{Enabled: true}} seedE2E(t, state, filepath.Join(state, "storage", p.ID), p.ID) diff --git a/internal/webapp/frontend/src/apps/HubApp.tsx b/internal/webapp/frontend/src/apps/HubApp.tsx index bf1344e..9332ce9 100644 --- a/internal/webapp/frontend/src/apps/HubApp.tsx +++ b/internal/webapp/frontend/src/apps/HubApp.tsx @@ -52,7 +52,7 @@ export default function HubApp({ config }: { config: ServerConfig }) { useEffect(() => { document.title = current ? current.name + " — BearDrive" - : config.brand || config.volume || "BearDrive"; + : config.brand || "BearDrive"; }, [current, config]); if (joinToken) { @@ -68,7 +68,7 @@ export default function HubApp({ config }: { config: ServerConfig }) { ); } - const brand = config.brand || config.volume || "BearDrive"; + const brand = config.brand || "BearDrive"; const org = (current && orgs?.find((o) => o.id === current.org)) || null; // Insights (embedded on the project home and behind the ⋯ menu) is for // hub admins and owners of the project's org. diff --git a/internal/webapp/server.go b/internal/webapp/server.go index 77ccb76..a453aa8 100644 --- a/internal/webapp/server.go +++ b/internal/webapp/server.go @@ -455,9 +455,9 @@ func (s *Server) handleConfig(w http.ResponseWriter, r *http.Request) { if b, ok := s.Auth.(Brander); ok { brand = b.Branding() } - if brand == "" { - brand = s.Volume - } + // No fallback: the volume is a storage basename, not a brand. An + // unconfigured brand stays empty and each app picks its own default + // (hub: "BearDrive", volume mode: the folder name). out := map[string]any{ "mode": mode, "volume": s.Volume, diff --git a/internal/webapp/server_test.go b/internal/webapp/server_test.go index 32bdcdf..24b8bb6 100644 --- a/internal/webapp/server_test.go +++ b/internal/webapp/server_test.go @@ -210,6 +210,48 @@ func TestFrontendServed(t *testing.T) { } } +// The brand is the product/self-hoster name, never the storage basename: +// a hub whose bucket is "beardrive" must not report that as its brand. +func TestConfigBrandNeverLeaksVolume(t *testing.T) { + srv, _, _ := newHub(t, true, nil) + srv.Volume = "beardrive" + + var cfg struct { + Volume string `json:"volume"` + Brand string `json:"brand"` + } + read := func() { + t.Helper() + rec := do(t, srv.Handler(), "GET", "/api/config", nil) + if rec.Code != 200 { + t.Fatalf("config: %d %s", rec.Code, rec.Body) + } + if err := json.Unmarshal(rec.Body.Bytes(), &cfg); err != nil { + t.Fatal(err) + } + } + + read() + if cfg.Brand != "" { + t.Errorf("unconfigured brand = %q, want empty (the frontend defaults it)", cfg.Brand) + } + if cfg.Volume != "beardrive" { + t.Errorf("volume = %q, want beardrive (VolumeApp reads this key)", cfg.Volume) + } + + auth, err := OpenBuiltinAuth(filepath.Join(t.TempDir(), "auth.json"), false, nil) + if err != nil { + t.Fatal(err) + } + auth.Brand = "Acme Docs" + srv.Auth = auth + + read() + if cfg.Brand != "Acme Docs" { + t.Errorf("configured brand = %q, want Acme Docs", cfg.Brand) + } +} + func TestExpandWikilinks(t *testing.T) { got := string(expandWikilinks([]byte("a [[x y]] b [[u|v]] c [[no"))) want := "a [x y](wiki:x%20y) b [v](wiki:u) c [[no" diff --git a/internal/webapp/static/assets/index-C2CHlQCN.js b/internal/webapp/static/assets/index-Vwh6tzvU.js similarity index 99% rename from internal/webapp/static/assets/index-C2CHlQCN.js rename to internal/webapp/static/assets/index-Vwh6tzvU.js index c604b70..74a5320 100644 --- a/internal/webapp/static/assets/index-C2CHlQCN.js +++ b/internal/webapp/static/assets/index-Vwh6tzvU.js @@ -118,4 +118,4 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs. bdrive skill install --agent `+e.agent+` bdrive login `+window.location.origin+` bdrive init --project `+n.id+` -bdrive hooks install --agent `+e.agent}function J8(){try{return localStorage.getItem("bdrive-guide-agent")||"claude"}catch{return"claude"}}function dC({project:e}){const[n,r]=x.useState(J8),i=Qh.find(l=>l.key===n)||Qh[0],s=Y8(i,e);return g.jsxs("div",{className:"guide",children:[g.jsxs("h1",{className:"in-title gd-head",children:[g.jsx("span",{className:"proj-mark","aria-hidden":"true",style:{background:ol(e.name)},children:g.jsx(Ta,{name:e.icon})}),e.name]}),e.description&&g.jsx("p",{className:"in-desc",children:e.description}),g.jsx("p",{className:"dl-sub",children:"Mount this project as a folder on any machine and connect your coding agent: files sync both ways in the background, every change is journaled with who made it, and agent reads feed Insights."}),g.jsx("div",{className:"gd-tabs",children:Qh.map(l=>g.jsx("button",{className:"gd-tab"+(l.key===i.key?" active":""),"data-key":l.key,onClick:()=>{r(l.key);try{localStorage.setItem("bdrive-guide-agent",l.key)}catch{}},children:l.label},l.key))}),g.jsxs("div",{className:"gd-body",children:[s.map((l,u)=>g.jsxs("div",{className:"gd-step"+(s.length>1?"":" gd-solo"),children:[g.jsxs("div",{className:"gd-step-head",children:[s.length>1&&g.jsx("span",{className:"gd-num",children:u+1}),g.jsx("span",{className:"gd-step-title",children:l.title})]}),l.desc&&g.jsx("p",{className:"gd-desc",children:l.desc}),l.code&&g.jsx(Fx,{code:l.code}),l.extra&&g.jsx("p",{className:"gd-desc gd-extra",children:l.extra})]},u)),i.agent&&g.jsxs("details",{className:"gd-manual",children:[g.jsx("summary",{children:"Or run it yourself"}),g.jsx("p",{className:"gd-desc",children:"Same result, in the folder you want the files. Don't skip the last line — the hooks are what keep every turn starting from the latest state."}),g.jsx(Fx,{code:X8(i,e)})]}),g.jsx("p",{className:"gd-done",children:"That's it — the folder now syncs on its own. Every agent turn starts from the latest state, edits appear here (and on every teammate's mount) within seconds, and what your agents read shows up in Insights."})]})]})}function Fx({code:e}){const[n,r]=x.useState("Copy");return g.jsxs("pre",{className:"gd-code",children:[g.jsx("code",{children:e}),g.jsx("button",{className:"gd-copy",onClick:async()=>{r(await rl(e)?"Copied":"Copy failed"),setTimeout(()=>r("Copy"),1400)},children:n})]})}const W8=vl({invite:Ma().trim().refine(e=>/join\/([0-9a-f]+)/.test(e)||/^[0-9a-f]{8,}$/.test(e),{message:"That doesn't look like an invite link."})}),eI=vl({name:Ma().trim().min(1,"Give the project a name.").max(60,"Keep it under 60 characters.")});function tI({authEnabled:e,onCreate:n}){const r=Ws({resolver:nl(W8),defaultValues:{invite:""}}),i=Ws({resolver:nl(eI),defaultValues:{name:""}});return g.jsxs("div",{className:"onboard",children:[g.jsx("h1",{children:"Welcome to BearDrive"}),g.jsx("p",{children:"You're signed in, but you're not part of any project yet."}),e&&g.jsxs("div",{className:"ob-card",children:[g.jsx("h3",{children:"Have an invite link?"}),g.jsx("p",{children:"A teammate can send you a join link. Paste it here:"}),g.jsxs("form",{className:"ob-row",onSubmit:r.handleSubmit(({invite:s})=>{const l=s.match(/join\/([0-9a-f]+)/)||s.match(/^([0-9a-f]{8,})$/);location.href="/join/"+l[1]}),children:[g.jsx("input",{id:"ob-invite",type:"text",placeholder:"https://…/join/…",autoComplete:"off",...r.register("invite")}),g.jsx($t,{id:"ob-join",variant:"primary",type:"submit",children:"Join"})]}),r.formState.errors.invite&&g.jsx("p",{className:"field-err",children:r.formState.errors.invite.message})]}),g.jsxs("div",{className:"ob-card",children:[g.jsx("h3",{children:"Or start a new project"}),g.jsx("p",{children:"Create a shared space for your team's files."}),g.jsxs("form",{className:"ob-row",onSubmit:i.handleSubmit(({name:s})=>n(s)),children:[g.jsx("input",{id:"ob-name",type:"text",placeholder:"Project name, e.g. wiki",autoComplete:"off",...i.register("name")}),g.jsx($t,{id:"ob-create",variant:"primary",type:"submit",children:"Create"})]}),i.formState.errors.name&&g.jsx("p",{className:"field-err",children:i.formState.errors.name.message})]})]})}function nI(e,n=!0){const r=jn({queryKey:["tree",e],queryFn:()=>Fn(e+"tree"),enabled:n,refetchInterval:15e3}),i=x.useMemo(()=>{const s=[],l=new Map,u=d=>{for(const m of d.children||[])m.dir?(l.set(m.path,m),u(m)):s.push(m)};return r.data&&u(r.data),{flatFiles:s,dirIndex:l}},[r.data]);return{tree:r.data,...i,loaded:!!r.data}}function rI(e,n){return jn({queryKey:["heat",e],queryFn:()=>Fn(e+"heat?days=30"),enabled:n,staleTime:6e4,refetchInterval:6e4}).data?.entries??null}function oI(e,n,r){return jn({queryKey:["history",e,"prefix",n,20],queryFn:()=>Fn(e+"history?prefix="+encodeURIComponent(n)+"&n=20"),enabled:r,staleTime:15e3}).data?.entries??null}function Px(e,n,r){if(!e)return null;if(!r)return e[n]||null;const i={human:0,agent:0,share:0};for(const[s,l]of Object.entries(e))s.startsWith(n+"/")&&(i.human+=l.human||0,i.agent+=l.agent||0,i.share+=l.share||0);return i.human||i.agent||i.share?i:null}function il(e){return(e.human||0)+(e.agent||0)+(e.share||0)}function nu(e){const n=il(e);if(!n)return"";let r=n+(n===1?" read":" reads");return e.agent&&(r+=" ("+e.agent+" agent)"),r}function iI(e){const n=il(e);return n?n<3?1:n<10?2:n<30?3:4:0}function aI(e,n,r){const i=new Array(e);return new Proxy(i,{get(s,l,u){if(typeof l=="string"){const d=l.charCodeAt(0);if(d>=48&&d<=57){const m=+l;if(Number.isInteger(m)&&m>=0&&mi[y]!==h))&&(i=d,s=n(...d),r?.onChange&&!(l&&r.skipInitialOnChange)&&r.onChange(s),l=!1),s}return u.updateDeps=d=>{i=d},u}function Ux(e,n){if(e===void 0)throw new Error("Unexpected undefined");return e}const sI=(e,n)=>Math.abs(e-n)<1.01,lI=(e,n,r)=>{let i;return function(...s){e.clearTimeout(i),i=e.setTimeout(()=>n.apply(this,s),r)}};let Ds;const Xh=()=>{if(Ds!==void 0)return Ds;if(typeof navigator>"u")return Ds=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Ds=!0;const e=navigator.maxTouchPoints;return Ds=navigator.platform==="MacIntel"&&e!==void 0&&e>0},Hx=e=>{const{offsetWidth:n,offsetHeight:r}=e;return{width:n,height:r}},cI=e=>e,uI=e=>{const n=Math.max(e.startIndex-e.overscan,0),i=Math.min(e.endIndex+e.overscan,e.count-1)-n+1,s=new Array(i);for(let l=0;l{const r=e.scrollElement;if(!r)return;const i=e.targetWindow;if(!i)return;const s=u=>{const{width:d,height:m}=u;n({width:Math.round(d),height:Math.round(m)})};if(s(Hx(r)),!i.ResizeObserver)return()=>{};const l=new i.ResizeObserver(u=>{const d=()=>{const m=u[0];if(m?.borderBoxSize){const h=m.borderBoxSize[0];if(h){s({width:h.inlineSize,height:h.blockSize});return}}s(Hx(r))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(d):d()});return l.observe(r,{box:"border-box"}),()=>{l.unobserve(r)}},wu={passive:!0},fI=typeof window>"u"?!0:"onscrollend"in window,hI=(e,n,r)=>{const i=e.scrollElement;if(!i)return;const s=e.targetWindow;if(!s)return;const l=e.options.useScrollendEvent&&fI;let u=0;const d=l?null:lI(s,()=>n(u,!1),e.options.isScrollingResetDelay),m=v=>()=>{u=r(i),d?.(),n(u,v)},h=m(!0),y=m(!1);return i.addEventListener("scroll",h,wu),l&&i.addEventListener("scrollend",y,wu),()=>{i.removeEventListener("scroll",h),l&&i.removeEventListener("scrollend",y)}},mI=(e,n)=>hI(e,n,r=>{const{horizontal:i,isRtl:s}=e.options;return i?r.scrollLeft*(s&&-1||1):r.scrollTop}),pI=(e,n,r)=>{if(r.options.useCachedMeasurements){const i=r.indexFromElement(e),s=r.options.getItemKey(i);return r.itemSizeCache.get(s)??r.options.estimateSize(i)}if(n?.borderBoxSize){const i=n.borderBoxSize[0];if(i)return Math.round(i[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const i=r.indexFromElement(e),s=r.options.getItemKey(i),l=r.itemSizeCache.get(s);if(l!==void 0)return l}return e[r.options.horizontal?"offsetWidth":"offsetHeight"]},gI=(e,{adjustments:n=0,behavior:r},i)=>{var s,l;(l=(s=i.scrollElement)==null?void 0:s.scrollTo)==null||l.call(s,{[i.options.horizontal?"left":"top"]:e+n,behavior:r})},vI=gI;class yI{constructor(n){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var r,i,s;return((s=(i=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:i.now)==null?void 0:s.call(i))??Date.now()},this.observer=(()=>{let r=null;const i=()=>r||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:r=new this.targetWindow.ResizeObserver(s=>{s.forEach(l=>{const u=()=>{const d=l.target,m=this.indexFromElement(d);if(!d.isConnected){this.observer.unobserve(d);for(const[h,y]of this.elementsCache)if(y===d){this.elementsCache.delete(h);break}return}this.shouldMeasureDuringScroll(m)&&this.resizeItem(m,this.options.measureElement(d,l,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(u):u()})}));return{disconnect:()=>{var s;(s=i())==null||s.disconnect(),r=null},observe:s=>{var l;return(l=i())==null?void 0:l.observe(s,{box:"border-box"})},unobserve:s=>{var l;return(l=i())==null?void 0:l.unobserve(s)}}})(),this.range=null,this.setOptions=r=>{var i,s;const l={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:cI,rangeExtractor:uI,onChange:()=>{},measureElement:pI,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,anchorTo:"start",followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate",useCachedMeasurements:!1};for(const b in r){const S=r[b];S!==void 0&&(l[b]=S)}const u=this.options;let d=null,m=null,h=!1;if(u!==void 0&&u.enabled&&l.enabled&&l.anchorTo==="end"&&this.scrollElement!==null){const b=u.count,S=l.count,_=this.getMeasurements(),C=b>0?((i=_[0])==null?void 0:i.key)??u.getItemKey(0):null,E=b>0?((s=_[b-1])==null?void 0:s.key)??u.getItemKey(b-1):null;if(S!==b||b>0&&S>0&&(l.getItemKey(0)!==C||l.getItemKey(S-1)!==E)){h=!0;const M=b>0?this.getVirtualItemForOffset(this.getScrollOffset())??_[0]:null;M&&(d=[M.key,this.getScrollOffset()-M.start]);const k=l.followOnAppend===!0?"auto":l.followOnAppend||null;k&&S>b&&this.isAtEnd(u.scrollEndThreshold)&&(b===0||l.getItemKey(S-1)!==E)&&(m=k)}}this.options=l,h&&(this.pendingMin=0,this.itemSizeCacheVersion++);let y=!1,v=0;if(d&&this.scrollOffset!==null){const[b,S]=d,_=this.getMeasurements(),{count:C,getItemKey:E}=this.options;let T=0;for(;T{var i,s;(s=(i=this.options).onChange)==null||s.call(i,this,r)},this.maybeNotify=ba(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),r=>{this.notify(r)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(r=>r()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var r;const i=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==i){if(this.cleanup(),!i){this.maybeNotify();return}if(this.scrollElement=i,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((r=this.scrollElement)==null?void 0:r.window)??null,this.elementsCache.forEach(l=>{this.observer.observe(l)}),this.unsubs.push(this.options.observeElementRect(this,l=>{this.scrollRect=l,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(l,u)=>{if(u&&this._intendedScrollOffset===null&&l===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(l-this._intendedScrollOffset)<1.5&&(l=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;const d=this.getScrollOffset();this.scrollDirection=u?d===l?this.scrollDirection:d{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},d=()=>{this._iosTouching=!1,!(!Xh()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};l.addEventListener("touchstart",u,wu),l.addEventListener("touchend",d,wu),this.unsubs.push(()=>{l.removeEventListener("touchstart",u),l.removeEventListener("touchend",d),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}const s=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,s&&this.scrollElement&&this.options.enabled){const[l,u,d,m]=s;l!==null&&!d&&(Xh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?m!==0&&(this._iosDeferredAdjustment+=m):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),d&&this.scrollToEnd({behavior:d})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const r=this.getScrollOffset(),i=this.getMaxScrollOffset();if(r<0||r>i)return;const s=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(r,{adjustments:this.scrollAdjustments+=s,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=ba(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(r,i,s,l,u,d,m,h)=>(this.prevLanes!==void 0&&this.prevLanes!==d&&(this.lanesChangedFlag=!0),this.prevLanes=d,this.pendingMin=null,{count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:u,lanes:d,laneAssignmentMode:m,gap:h}),{key:!1}),this.getMeasurements=ba(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:u,lanes:d,laneAssignmentMode:m,gap:h},y)=>{const v=this.itemSizeCache;if(!u)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>r)for(const T of this.laneAssignments.keys())T>=r&&this.laneAssignments.delete(T);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(T=>{this.itemSizeCache.set(T.key,T.size)}));const b=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===r&&(this.lanesSettling=!1),d===1){const T=r*2;let O=this._flatMeasurements;if(!O||O.length0&&L.set(O.subarray(0,b*2)),O=L,this._flatMeasurements=O}let M;if(b===0)M=i+s;else{const L=b-1;M=O[L*2]+O[L*2+1]+h}for(let L=b;L1){k=M;const ve=_[k],de=ve!==void 0?S[ve]:void 0;L=de?de.end+h:i+s}else if(E===d){let ve=0,de=C[0],le=_[0];for(let ae=1;aethis.options.debug}),this.calculateRange=ba(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,i,s,l)=>r.length===0||i===0?(this.range=null,null):(this.range=xI(r,i,s,l,l===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=ba(()=>{let r=null,i=null;const s=this.calculateRange();return s&&(r=s.startIndex,i=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,i]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,i]},(r,i,s,l,u)=>l===null||u===null?[]:r({startIndex:l,endIndex:u,overscan:i,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=r=>{const i=this.options.indexAttribute,s=r.getAttribute(i);return s?parseInt(s,10):(console.warn(`Missing attribute name '${i}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var i;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const s=this.scrollState.index??((i=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:i.index);if(s!==void 0&&this.range){const l=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),u=Math.max(0,s-l),d=Math.min(this.options.count-1,s+l);return r>=u&&r<=d}return!0},this.measureElement=r=>{if(!r){this.elementsCache.forEach((u,d)=>{u.isConnected||(this.observer.unobserve(u),this.elementsCache.delete(d))});return}const i=this.indexFromElement(r),s=this.options.getItemKey(i),l=this.elementsCache.get(s);l!==r&&(l&&this.observer.unobserve(l),this.observer.observe(r),this.elementsCache.set(s,r)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(i)&&this.resizeItem(i,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,i)=>{var s,l;if(r<0||r>=this.options.count)return;let u,d,m;const h=this._flatMeasurements;if(this.options.lanes===1&&h!==null)m=this.options.getItemKey(r),d=h[r*2],u=h[r*2+1];else{const b=this.measurementsCache[r];if(!b)return;m=b.key,d=b.start,u=b.size}const y=this.itemSizeCache.get(m)??u,v=i-y;if(v!==0){const b=this.options.anchorTo==="end"&&((s=this.scrollState)==null?void 0:s.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,S=b?this.getTotalSize():0,_=((l=this.scrollState)==null?void 0:l.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[r]??{index:r,key:m,start:d,size:u,end:d+u,lane:0},v,this):d[this.getVirtualIndexes(),this.getMeasurements()],(r,i)=>{const s=[];for(let l=0,u=r.length;lthis.options.debug}),this.getVirtualItemForOffset=r=>{const i=this.getMeasurements();if(i.length===0)return;const s=this._flatMeasurements,l=this.options.lanes===1&&s!=null,u=fC(0,i.length-1,l?d=>s[d*2]:d=>Ux(i[d]).start,r);return Ux(i[u])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const r=this.scrollElement.document.documentElement;return this.options.horizontal?r.scrollWidth-this.scrollElement.innerWidth:r.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(r=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=r,this.getOffsetForAlignment=(r,i,s=0)=>{if(!this.scrollElement)return 0;const l=this.getSize(),u=this.getScrollOffset();i==="auto"&&(i=r>=u+l?"end":"start"),i==="center"?r+=(s-l)/2:i==="end"&&(r-=l);const d=this.getMaxScrollOffset();return Math.max(Math.min(d,r),0)},this.getOffsetForIndex=(r,i="auto")=>{r=Math.max(0,Math.min(r,this.options.count-1));const s=this.getSize(),l=this.getScrollOffset(),u=this.measurementsCache[r];if(!u)return;if(i==="auto")if(u.end>=l+s-this.options.scrollPaddingEnd)i="end";else if(u.start<=l+this.options.scrollPaddingStart)i="start";else return[l,i];if(i==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),i];const d=i==="end"?u.end+this.options.scrollPaddingEnd:u.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(d,i,u.size),i]},this.scrollToOffset=(r,{align:i="start",behavior:s="auto"}={})=>{const l=this.getOffsetForAlignment(r,i),u=this.now();this.scrollState={index:null,align:i,behavior:s,startedAt:u,lastTargetOffset:l,stableFrames:0},this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:i="auto",behavior:s="auto"}={})=>{r=Math.max(0,Math.min(r,this.options.count-1));const l=this.getOffsetForIndex(r,i);if(!l)return;const[u,d]=l,m=this.now();this.scrollState={index:r,align:d,behavior:s,startedAt:m,lastTargetOffset:u,stableFrames:0},this._scrollToOffset(u,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollBy=(r,{behavior:i="auto"}={})=>{const s=this.getScrollOffset()+r,l=this.now();this.scrollState={index:null,align:"start",behavior:i,startedAt:l,lastTargetOffset:s,stableFrames:0},this._scrollToOffset(s,{adjustments:void 0,behavior:i}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:r="auto"}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:"end",behavior:r});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:r})},this.getTotalSize=()=>{var r;const i=this.getMeasurements();let s;if(i.length===0)s=this.options.paddingStart;else if(this.options.lanes===1){const l=i.length-1,u=this._flatMeasurements;u!=null?s=u[l*2]+u[l*2+1]:s=((r=i[l])==null?void 0:r.end)??0}else{const l=Array(this.options.lanes).fill(null);let u=i.length-1;for(;u>=0&&l.some(d=>d===null);){const d=i[u];l[d.lane]===null&&(l[d.lane]=d.end),u--}s=Math.max(...l.filter(d=>d!==null))}return Math.max(s-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const r=[];if(this.itemSizeCache.size===0)return r;const i=this.getMeasurements();for(const s of i)s&&this.itemSizeCache.has(s.key)&&r.push({index:s.index,key:s.key,start:s.start,size:s.size,end:s.end,lane:s.lane});return r},this._scrollToOffset=(r,{adjustments:i,behavior:s})=>{this._intendedScrollOffset=r+(i??0),this.options.scrollToFn(r,{behavior:s,adjustments:i},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(n)}applyScrollAdjustment(n,r){n!==0&&(Xh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=n:(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=n,behavior:r}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollAdjustments=0)))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const i=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,s=i?i[0]:this.scrollState.lastTargetOffset,l=1,u=s!==this.scrollState.lastTargetOffset;if(!u&&sI(s,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=l){this.getScrollOffset()!==s&&this._scrollToOffset(s,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,u){const d=this.getSize()||600,m=Math.abs(s-this.getScrollOffset()),h=this.scrollState.behavior==="smooth"&&m>d;this.scrollState.lastTargetOffset=s,h||(this.scrollState.behavior="auto"),this._scrollToOffset(s,{adjustments:void 0,behavior:h?"smooth":"auto"})}this.scheduleScrollReconcile()}}const fC=(e,n,r,i)=>{for(;e<=n;){const s=(e+n)/2|0,l=r(s);if(li)n=s-1;else return s}return e>0?e-1:0};function bI(e,n,r){let i=0;for(;i<=n;){const s=(i+n)/2|0,l=e[s*2];if(lr)n=s-1;else return s}return i>0?i-1:0}function xI(e,n,r,i,s){const l=e.length-1;if(e.length<=i)return{startIndex:0,endIndex:l};if(i===1&&s!==null){const h=bI(s,l,r);let y=h;const v=r+n;for(;ye[h].start,r),m=d;if(i===1)for(;m1){const h=Array(i).fill(0);for(;mv=0&&y.some(v=>v>=r);){const v=e[d];y[v.lane]=v.start,d--}d=Math.max(0,d-d%i),m=Math.min(l,m+(i-1-m%i))}return{startIndex:d,endIndex:m}}const Jh=typeof document<"u"?x.useLayoutEffect:x.useEffect;function SI({useFlushSync:e=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...i}){const s=x.useReducer(h=>h+1,0)[1],l=x.useRef({enabled:n,mode:r,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});l.current.enabled=n,l.current.mode=r;const u=h=>{const y=l.current;if(!y.enabled||!y.container)return;const v=h.getTotalSize();if(v!==y.lastSize){y.lastSize=v;const T=h.options.horizontal?"width":"height";y.container.style[T]=`${v}px`}const b=!!h.options.horizontal,S=y.mode==="transform",_=b?"left":"top",C=h.options.scrollMargin,E=h.getVirtualItems();for(const T of E){const O=T.start-C,M=h.elementsCache.get(T.key);M&&y.lastPositions.get(M)!==O&&(y.lastPositions.set(M,O),S?M.style.transform=b?`translate3d(${O}px, 0, 0)`:`translate3d(0, ${O}px, 0)`:M.style[_]=`${O}px`)}},d={...i,onChange:(h,y)=>{var v;const b=l.current;let S=!0;if(b.enabled){u(h);const _=h.range,C=b.prevRange;S=!C||C.isScrolling!==h.isScrolling||C.startIndex!==_?.startIndex||C.endIndex!==_?.endIndex,S&&(b.prevRange=_?{startIndex:_.startIndex,endIndex:_.endIndex,isScrolling:h.isScrolling}:null)}S&&(e&&y?xi.flushSync(s):s()),(v=i.onChange)==null||v.call(i,h,y)}},[m]=x.useState(()=>{const h=new yI(d);return Object.assign(h,{containerRef:y=>{const v=l.current;if(v.container=y,v.lastSize=null,y&&v.enabled){const b=h.getTotalSize();v.lastSize=b;const S=h.options.horizontal?"width":"height";y.style[S]=`${b}px`}}})});return m.setOptions(d),Jh(()=>m._didMount(),[]),Jh(()=>m._willUpdate()),Jh(()=>{u(m)}),m}function wI(e){return SI({observeElementRect:dI,observeElementOffset:mI,scrollToFn:vI,...e})}function _I(e,n){const r=[],i=(s,l)=>{for(const u of s)r.push({node:u,depth:l}),u.dir&&n.has(u.path)&&i(u.children||[],l+1)};return i(e?.children||[],0),r}function CI(e){const{root:n,expanded:r,onToggle:i,currentPath:s,listingShowing:l,onOpen:u}=e,d=x.useRef(null),m=x.useMemo(()=>_I(n,r),[n,r]),h=wI({count:m.length,getScrollElement:()=>d.current,estimateSize:()=>window.matchMedia("(max-width: 768px)").matches?44:28,overscan:12,getItemKey:y=>m[y].node.path});return x.useEffect(()=>{if(!s)return;const y=m.findIndex(v=>v.node.path===s);y>=0&&h.scrollToIndex(y,{align:"auto"})},[s,m]),g.jsx("nav",{id:"tree","aria-label":"Files",ref:d,children:g.jsx("div",{style:{height:h.getTotalSize(),position:"relative"},children:h.getVirtualItems().map(y=>{const{node:v,depth:b}=m[y.index],S=v.dir?r.has(v.path):!1,_=()=>{if(v.dir&&s===v.path&&l){i(v.path);return}u(v.path),v.dir||fr()};return g.jsxs("div",{className:"row "+(v.dir?"dir":"file")+(s===v.path?" active":"")+(v.dir&&!S?" collapsed":""),"data-path":v.path,tabIndex:0,role:"button",title:v.name,"aria-expanded":v.dir?S:void 0,style:{position:"absolute",top:0,left:0,right:0,transform:`translateY(${y.start}px)`,paddingLeft:8+b*13},onClick:_,onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),_())},children:[Array.from({length:b},(C,E)=>g.jsx("span",{className:"tguide",style:{left:8+E*13+5},"aria-hidden":"true"},E)),g.jsx("span",{className:"chev",onClick:C=>{v.dir&&(C.stopPropagation(),i(v.path))},children:g.jsx(Yt,{name:"chevd"})}),g.jsx("span",{className:"ticon",children:g.jsx(Yt,{name:v.dir?"folder":"doc"})}),g.jsx("span",{className:"label",children:v.name})]},y.key)})})})}function EI(e){const n=e.split("/"),r=[];let i="";for(let s=0;s{i=i?i+"/"+s:s;const u=i,d=l===r.length-1;return g.jsxs("span",{children:[l>0&&g.jsx("span",{className:"crumb-sep",children:"/"}),d?g.jsx("span",{children:s}):g.jsx("span",{className:"crumb-seg",title:u,onClick:()=>n(u),children:s})]},u)})})}const TI={add:"plus",edit:"edit",delete:"x"},OI={add:"added",edit:"edited",delete:"deleted"};function hC({entry:e,onOpen:n}){const[r,i]=x.useState(!1),s=e.kind==="put"?"edit":e.kind,l=e.user_name?`${e.user_name} <${e.user}>`:e.user||e.author||"unknown",u=[e.device.name||e.device.id,e.device.os,e.device.ip].filter(Boolean).join(" · "),d=s!=="delete",m=h=>{h.target.tagName!=="A"&&d&&n(e.path)};return g.jsxs("div",{className:"hentry "+s+(d?" clickable":""),tabIndex:d?0:void 0,role:d?"button":void 0,onClick:m,onKeyDown:h=>{d&&(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),n(e.path))},children:[g.jsxs("div",{className:"hline",children:[g.jsx("span",{className:"hkind",children:g.jsx(Yt,{name:TI[s]||"dot"})}),g.jsx("span",{className:"hpath",children:e.path}),g.jsx("span",{className:"htag",children:OI[s]||s}),g.jsx("span",{className:"htime",children:new Date(e.time).toLocaleString()})]}),g.jsxs("div",{className:"hmeta",children:[g.jsx("span",{className:"hwho",children:l}),g.jsx("span",{className:"hdev",children:u}),g.jsx("span",{className:"hsize",children:e.size?tC(e.size):""})]}),e.note&&g.jsx("div",{className:"hnote"+(r?" open":""),tabIndex:0,role:"button",title:r?"Collapse note":"Show full note","aria-expanded":r,onClick:h=>{h.stopPropagation(),h.target.tagName!=="A"&&i(!r)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),h.stopPropagation(),i(!r))},children:e.note.split(/(https?:\/\/\S+)/).map((h,y)=>/^https?:\/\//.test(h)?g.jsx("a",{href:h,target:"_blank",rel:"noopener",children:h},y):h)})]})}function MI(e){const{node:n,heatMap:r,onOpen:i}=e,s=(n.children||[]).slice().sort((h,y)=>Number(y.dir||!1)-Number(h.dir||!1)||h.name.localeCompare(y.name)),l=s.filter(h=>h.dir).length,u=s.length-l,d=[];l&&d.push(l+(l===1?" folder":" folders")),u&&d.push(u+(u===1?" file":" files"));const m=Px(r,n.path,!0);return m&&d.push(nu(m)+" in 30 days"),g.jsxs("div",{className:"dirlist",children:[g.jsxs("h1",{className:"dl-title",children:[g.jsx("span",{className:"dl-title-icon",children:g.jsx(Yt,{name:"folder"})}),g.jsx("span",{children:n.name})]}),g.jsx("p",{className:"dl-sub",children:d.join(" · ")||"Empty folder"}),s.length===0?g.jsx("div",{className:"dl-empty",children:"Nothing in this folder yet."}):g.jsx("div",{className:"dl-items",children:s.map(h=>{let y="";if(h.dir){const b=(h.children||[]).length;y=b+(b===1?" item":" items")}else y=[h.size?tC(h.size):"",h.time?new Date(h.time).toLocaleDateString():""].filter(Boolean).join(" · ");const v=Px(r,h.path,!!h.dir);return v&&(y=nu(v)+(y?" · "+y:"")),g.jsxs("div",{className:"dl-row",tabIndex:0,role:"button",title:h.path,onClick:()=>i(h.path),onKeyDown:b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),i(h.path))},children:[g.jsx("span",{className:"ticon",children:g.jsx(Yt,{name:h.dir?"folder":"doc"})}),g.jsx("span",{className:"dl-name",children:h.name}),v&&g.jsx("span",{className:"heatdot lvl"+iI(v),title:nu(v)+" in 30 days"}),g.jsx("span",{className:"dl-meta",children:y})]},h.path)})}),e.hub&&g.jsx(AI,{apiBase:e.apiBase,prefix:n.path+"/",onOpen:i,onFullHistory:()=>e.onFullHistory(n.path+"/"),onRendered:e.onRendered})]})}function AI(e){const n=oI(e.apiBase,e.prefix,!0),{onRendered:r}=e;return x.useEffect(()=>{n&&n.length&&r&&r()},[n,r]),!n||n.length===0?null:g.jsxs("div",{className:"dl-history",children:[g.jsx("h3",{className:"dl-h3",children:"Recent changes"}),g.jsx("div",{className:"history dl-hlist",children:n.map((i,s)=>g.jsx(hC,{entry:i,onOpen:e.onOpen},s))}),g.jsx("button",{className:"ai-btn dl-more",onClick:e.onFullHistory,children:"Full history"})]})}function jI(e){const{apiBase:n,path:r,onMeta:i}=e,s=n+"file?path="+encodeURIComponent(r);return x.useEffect(()=>()=>i(""),[r,i]),T8.test(r)?g.jsx(zI,{...e}):eC.test(r)?g.jsx("iframe",{className:"htmlview",sandbox:"allow-scripts",src:s,title:r,onLoad:e.onRendered}):O8.test(r)?g.jsx(kI,{src:s,alt:r,onRendered:e.onRendered}):M8.test(r)?g.jsx(LI,{...e,fileURL:s}):g.jsxs("div",{className:"filecard",children:[g.jsx("div",{className:"name",children:r.split("/").pop()}),g.jsx("p",{children:"No preview for this file type."}),g.jsx("a",{className:"btn",download:!0,href:n+"download?path="+encodeURIComponent(r),children:"Download"})]})}function zI(e){const{apiBase:n,path:r,heatMap:i,flatFiles:s,onOpenFile:l,onMeta:u,onRendered:d}=e,{data:m,error:h}=jn({queryKey:["render",n,r],queryFn:()=>Fn(n+"render?path="+encodeURIComponent(r))}),y=x.useMemo(()=>m?DI(m.html,r,n):"",[m,r,n]);return x.useEffect(()=>{if(!m)return;const v=[];m.author&&v.push(m.author+(m.device?" on "+m.device:"")),m.time&&v.push(new Date(m.time).toLocaleString());const b=i&&i[m.path];b&&il(b)&&v.push(nu(b)+" / 30d"),u(v.join(" · ")),d?.()},[m,i,u,d]),h?g.jsxs("div",{className:"empty",children:["Could not load file: ",h.message]}):m?g.jsx("div",{dangerouslySetInnerHTML:{__html:y},onClick:v=>NI(v,r,s,l)}):null}function NI(e,n,r,i){const s=e.target.closest("a");if(!s||!e.currentTarget.contains(s))return;const l=s.getAttribute("href")||"",u=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"";l.startsWith("wiki:")?(e.preventDefault(),II(decodeURIComponent(l.slice(5)),r,i)):/^([a-z]+:|\/|#)/i.test(l)||(e.preventDefault(),i(nC(u,decodeURIComponent(l))))}function DI(e,n,r){const i=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"",s=u=>r+"file?path="+encodeURIComponent(u),l=new DOMParser().parseFromString(e,"text/html");for(const u of l.querySelectorAll("img")){const d=u.getAttribute("src")||"";/^([a-z]+:|\/)/i.test(d)||u.setAttribute("src",s(nC(i,d)))}for(const u of l.querySelectorAll("a")){const d=u.getAttribute("href")||"";/^https?:/i.test(d)&&(u.setAttribute("target","_blank"),u.setAttribute("rel","noopener"))}return l.body.innerHTML}function kI({src:e,alt:n,onRendered:r}){return g.jsx("img",{src:e,alt:n,onLoad:r})}function LI(e){const{path:n,fileURL:r,onRendered:i}=e,{data:s,error:l}=jn({queryKey:["text",r],queryFn:async()=>{const u=await fetch(r);if(!u.ok)throw new Error(await u.text());return u.text()}});return x.useEffect(()=>{s!=null&&i?.()},[s,i]),l?g.jsxs("div",{className:"empty",children:["Could not load file: ",l.message]}):s==null?null:g.jsx("pre",{className:"plain",children:s},n)}function II(e,n,r){const i=e.toLowerCase(),s=n.find(l=>l.path.toLowerCase()===i||l.path.toLowerCase()===i+".md")||n.find(l=>{const u=l.name.toLowerCase();return u===i||u===i+".md"});s&&r(s.path)}function $I({url:e,copied:n,onClose:r}){const i=e.split("/s/")[1];return g.jsx(zp,{open:!0,onOpenChange:s=>!s&&r(),children:g.jsxs(Np,{className:"modal",showCloseButton:!1,children:[g.jsx(Bu,{asChild:!0,children:g.jsx("h3",{children:"Public link created"})}),g.jsxs("p",{children:[g.jsx("b",{children:"Anyone with this link can view this file"})," — no account needed. It always shows the latest version until you revoke it."]}),g.jsx("div",{className:"modal-url",children:e}),g.jsxs("div",{className:"modal-actions",children:[g.jsx($t,{variant:"primary",onClick:()=>rl(e).then(s=>We(s?"Copied.":"Select and copy the link above.")),children:n?"Copied ✓":"Copy link"}),g.jsx($t,{variant:"subtle",onClick:()=>window.open(e,"_blank"),children:"Open"}),g.jsx($t,{variant:"subtle",className:"ai-del",onClick:async()=>{try{await zo("DELETE","/api/shares/"+i),We("Link revoked — it no longer works."),r()}catch(s){We(s.message,!0)}},children:"Revoke"}),g.jsx($t,{variant:"subtle",onClick:r,children:"Done"})]})]})})}var Bx=1,VI=.9,FI=.8,PI=.17,Wh=.1,em=.999,UI=.9999,HI=.99,BI=/[\\\/_+.#"@\[\(\{&]/,qI=/[\\\/_+.#"@\[\(\{&]/g,GI=/[\s-]/,mC=/[\s-]/g;function Fm(e,n,r,i,s,l,u){if(l===n.length)return s===e.length?Bx:HI;var d=`${s},${l}`;if(u[d]!==void 0)return u[d];for(var m=i.charAt(l),h=r.indexOf(m,s),y=0,v,b,S,_;h>=0;)v=Fm(e,n,r,i,h+1,l+1,u),v>y&&(h===s?v*=Bx:BI.test(e.charAt(h-1))?(v*=FI,S=e.slice(s,h-1).match(qI),S&&s>0&&(v*=Math.pow(em,S.length))):GI.test(e.charAt(h-1))?(v*=VI,_=e.slice(s,h-1).match(mC),_&&s>0&&(v*=Math.pow(em,_.length))):(v*=PI,s>0&&(v*=Math.pow(em,h-s))),e.charAt(h)!==n.charAt(l)&&(v*=UI)),(vv&&(v=b*Wh)),v>y&&(y=v),h=r.indexOf(m,h+1);return u[d]=y,y}function qx(e){return e.toLowerCase().replace(mC," ")}function ZI(e,n,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,Fm(e,n,qx(e),qx(n),0,0,{})}var ks='[cmdk-group=""]',tm='[cmdk-group-items=""]',KI='[cmdk-group-heading=""]',pC='[cmdk-item=""]',Gx=`${pC}:not([aria-disabled="true"])`,Pm="cmdk-item-select",xa="data-value",YI=(e,n,r)=>ZI(e,n,r),gC=x.createContext(void 0),yl=()=>x.useContext(gC),vC=x.createContext(void 0),Wp=()=>x.useContext(vC),yC=x.createContext(void 0),bC=x.forwardRef((e,n)=>{let r=Sa(()=>{var j,U;return{search:"",value:(U=(j=e.value)!=null?j:e.defaultValue)!=null?U:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),i=Sa(()=>new Set),s=Sa(()=>new Map),l=Sa(()=>new Map),u=Sa(()=>new Set),d=xC(e),{label:m,children:h,value:y,onValueChange:v,filter:b,shouldFilter:S,loop:_,disablePointerSelection:C=!1,vimBindings:E=!0,...T}=e,O=hn(),M=hn(),k=hn(),L=x.useRef(null),q=a$();bi(()=>{if(y!==void 0){let j=y.trim();r.current.value=j,H.emit()}},[y]),bi(()=>{q(6,ae)},[]);let H=x.useMemo(()=>({subscribe:j=>(u.current.add(j),()=>u.current.delete(j)),snapshot:()=>r.current,setState:(j,U,Q)=>{var Z,re,ee,ge;if(!Object.is(r.current[j],U)){if(r.current[j]=U,j==="search")le(),ve(),q(1,de);else if(j==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let be=document.getElementById(k);be?be.focus():(Z=document.getElementById(O))==null||Z.focus()}if(q(7,()=>{var be;r.current.selectedItemId=(be=me())==null?void 0:be.id,H.emit()}),Q||q(5,ae),((re=d.current)==null?void 0:re.value)!==void 0){let be=U??"";(ge=(ee=d.current).onValueChange)==null||ge.call(ee,be);return}}H.emit()}},emit:()=>{u.current.forEach(j=>j())}}),[]),$=x.useMemo(()=>({value:(j,U,Q)=>{var Z;U!==((Z=l.current.get(j))==null?void 0:Z.value)&&(l.current.set(j,{value:U,keywords:Q}),r.current.filtered.items.set(j,he(U,Q)),q(2,()=>{ve(),H.emit()}))},item:(j,U)=>(i.current.add(j),U&&(s.current.has(U)?s.current.get(U).add(j):s.current.set(U,new Set([j]))),q(3,()=>{le(),ve(),r.current.value||de(),H.emit()}),()=>{l.current.delete(j),i.current.delete(j),r.current.filtered.items.delete(j);let Q=me();q(4,()=>{le(),Q?.getAttribute("id")===j&&de(),H.emit()})}),group:j=>(s.current.has(j)||s.current.set(j,new Set),()=>{l.current.delete(j),s.current.delete(j)}),filter:()=>d.current.shouldFilter,label:m||e["aria-label"],getDisablePointerSelection:()=>d.current.disablePointerSelection,listId:O,inputId:k,labelId:M,listInnerRef:L}),[]);function he(j,U){var Q,Z;let re=(Z=(Q=d.current)==null?void 0:Q.filter)!=null?Z:YI;return j?re(j,r.current.search,U):0}function ve(){if(!r.current.search||d.current.shouldFilter===!1)return;let j=r.current.filtered.items,U=[];r.current.filtered.groups.forEach(Z=>{let re=s.current.get(Z),ee=0;re.forEach(ge=>{let be=j.get(ge);ee=Math.max(be,ee)}),U.push([Z,ee])});let Q=L.current;ye().sort((Z,re)=>{var ee,ge;let be=Z.getAttribute("id"),De=re.getAttribute("id");return((ee=j.get(De))!=null?ee:0)-((ge=j.get(be))!=null?ge:0)}).forEach(Z=>{let re=Z.closest(tm);re?re.appendChild(Z.parentElement===re?Z:Z.closest(`${tm} > *`)):Q.appendChild(Z.parentElement===Q?Z:Z.closest(`${tm} > *`))}),U.sort((Z,re)=>re[1]-Z[1]).forEach(Z=>{var re;let ee=(re=L.current)==null?void 0:re.querySelector(`${ks}[${xa}="${encodeURIComponent(Z[0])}"]`);ee?.parentElement.appendChild(ee)})}function de(){let j=ye().find(Q=>Q.getAttribute("aria-disabled")!=="true"),U=j?.getAttribute(xa);H.setState("value",U||void 0)}function le(){var j,U,Q,Z;if(!r.current.search||d.current.shouldFilter===!1){r.current.filtered.count=i.current.size;return}r.current.filtered.groups=new Set;let re=0;for(let ee of i.current){let ge=(U=(j=l.current.get(ee))==null?void 0:j.value)!=null?U:"",be=(Z=(Q=l.current.get(ee))==null?void 0:Q.keywords)!=null?Z:[],De=he(ge,be);r.current.filtered.items.set(ee,De),De>0&&re++}for(let[ee,ge]of s.current)for(let be of ge)if(r.current.filtered.items.get(be)>0){r.current.filtered.groups.add(ee);break}r.current.filtered.count=re}function ae(){var j,U,Q;let Z=me();Z&&(((j=Z.parentElement)==null?void 0:j.firstChild)===Z&&((Q=(U=Z.closest(ks))==null?void 0:U.querySelector(KI))==null||Q.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function me(){var j;return(j=L.current)==null?void 0:j.querySelector(`${pC}[aria-selected="true"]`)}function ye(){var j;return Array.from(((j=L.current)==null?void 0:j.querySelectorAll(Gx))||[])}function D(j){let U=ye()[j];U&&H.setState("value",U.getAttribute(xa))}function Y(j){var U;let Q=me(),Z=ye(),re=Z.findIndex(ge=>ge===Q),ee=Z[re+j];(U=d.current)!=null&&U.loop&&(ee=re+j<0?Z[Z.length-1]:re+j===Z.length?Z[0]:Z[re+j]),ee&&H.setState("value",ee.getAttribute(xa))}function ne(j){let U=me(),Q=U?.closest(ks),Z;for(;Q&&!Z;)Q=j>0?o$(Q,ks):i$(Q,ks),Z=Q?.querySelector(Gx);Z?H.setState("value",Z.getAttribute(xa)):Y(j)}let J=()=>D(ye().length-1),W=j=>{j.preventDefault(),j.metaKey?J():j.altKey?ne(1):Y(1)},z=j=>{j.preventDefault(),j.metaKey?D(0):j.altKey?ne(-1):Y(-1)};return x.createElement($e.div,{ref:n,tabIndex:-1,...T,"cmdk-root":"",onKeyDown:j=>{var U;(U=T.onKeyDown)==null||U.call(T,j);let Q=j.nativeEvent.isComposing||j.keyCode===229;if(!(j.defaultPrevented||Q))switch(j.key){case"n":case"j":{E&&j.ctrlKey&&W(j);break}case"ArrowDown":{W(j);break}case"p":case"k":{E&&j.ctrlKey&&z(j);break}case"ArrowUp":{z(j);break}case"Home":{j.preventDefault(),D(0);break}case"End":{j.preventDefault(),J();break}case"Enter":{j.preventDefault();let Z=me();if(Z){let re=new Event(Pm);Z.dispatchEvent(re)}}}}},x.createElement("label",{"cmdk-label":"",htmlFor:$.inputId,id:$.labelId,style:l$},m),rd(e,j=>x.createElement(vC.Provider,{value:H},x.createElement(gC.Provider,{value:$},j))))}),QI=x.forwardRef((e,n)=>{var r,i;let s=hn(),l=x.useRef(null),u=x.useContext(yC),d=yl(),m=xC(e),h=(i=(r=m.current)==null?void 0:r.forceMount)!=null?i:u?.forceMount;bi(()=>{if(!h)return d.item(s,u?.id)},[h]);let y=SC(s,l,[e.value,e.children,l],e.keywords),v=Wp(),b=Io(q=>q.value&&q.value===y.current),S=Io(q=>h||d.filter()===!1?!0:q.search?q.filtered.items.get(s)>0:!0);x.useEffect(()=>{let q=l.current;if(!(!q||e.disabled))return q.addEventListener(Pm,_),()=>q.removeEventListener(Pm,_)},[S,e.onSelect,e.disabled]);function _(){var q,H;C(),(H=(q=m.current).onSelect)==null||H.call(q,y.current)}function C(){v.setState("value",y.current,!0)}if(!S)return null;let{disabled:E,value:T,onSelect:O,forceMount:M,keywords:k,...L}=e;return x.createElement($e.div,{ref:ja(l,n),...L,id:s,"cmdk-item":"",role:"option","aria-disabled":!!E,"aria-selected":!!b,"data-disabled":!!E,"data-selected":!!b,onPointerMove:E||d.getDisablePointerSelection()?void 0:C,onClick:E?void 0:_},e.children)}),XI=x.forwardRef((e,n)=>{let{heading:r,children:i,forceMount:s,...l}=e,u=hn(),d=x.useRef(null),m=x.useRef(null),h=hn(),y=yl(),v=Io(S=>s||y.filter()===!1?!0:S.search?S.filtered.groups.has(u):!0);bi(()=>y.group(u),[]),SC(u,d,[e.value,e.heading,m]);let b=x.useMemo(()=>({id:u,forceMount:s}),[s]);return x.createElement($e.div,{ref:ja(d,n),...l,"cmdk-group":"",role:"presentation",hidden:v?void 0:!0},r&&x.createElement("div",{ref:m,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),rd(e,S=>x.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},x.createElement(yC.Provider,{value:b},S))))}),JI=x.forwardRef((e,n)=>{let{alwaysRender:r,...i}=e,s=x.useRef(null),l=Io(u=>!u.search);return!r&&!l?null:x.createElement($e.div,{ref:ja(s,n),...i,"cmdk-separator":"",role:"separator"})}),WI=x.forwardRef((e,n)=>{let{onValueChange:r,...i}=e,s=e.value!=null,l=Wp(),u=Io(h=>h.search),d=Io(h=>h.selectedItemId),m=yl();return x.useEffect(()=>{e.value!=null&&l.setState("search",e.value)},[e.value]),x.createElement($e.input,{ref:n,...i,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":m.listId,"aria-labelledby":m.labelId,"aria-activedescendant":d,id:m.inputId,type:"text",value:s?e.value:u,onChange:h=>{s||l.setState("search",h.target.value),r?.(h.target.value)}})}),e$=x.forwardRef((e,n)=>{let{children:r,label:i="Suggestions",...s}=e,l=x.useRef(null),u=x.useRef(null),d=Io(h=>h.selectedItemId),m=yl();return x.useEffect(()=>{if(u.current&&l.current){let h=u.current,y=l.current,v,b=new ResizeObserver(()=>{v=requestAnimationFrame(()=>{let S=h.offsetHeight;y.style.setProperty("--cmdk-list-height",S.toFixed(1)+"px")})});return b.observe(h),()=>{cancelAnimationFrame(v),b.unobserve(h)}}},[]),x.createElement($e.div,{ref:ja(l,n),...s,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":d,"aria-label":i,id:m.listId},rd(e,h=>x.createElement("div",{ref:ja(u,m.listInnerRef),"cmdk-list-sizer":""},h)))}),t$=x.forwardRef((e,n)=>{let{open:r,onOpenChange:i,overlayClassName:s,contentClassName:l,container:u,...d}=e;return x.createElement(Wm,{open:r,onOpenChange:i},x.createElement(tp,{container:u},x.createElement(np,{"cmdk-overlay":"",className:s}),x.createElement(rp,{"aria-label":e.label,"cmdk-dialog":"",className:l},x.createElement(bC,{ref:n,...d}))))}),n$=x.forwardRef((e,n)=>Io(r=>r.filtered.count===0)?x.createElement($e.div,{ref:n,...e,"cmdk-empty":"",role:"presentation"}):null),r$=x.forwardRef((e,n)=>{let{progress:r,children:i,label:s="Loading...",...l}=e;return x.createElement($e.div,{ref:n,...l,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":s},rd(e,u=>x.createElement("div",{"aria-hidden":!0},u)))}),nd=Object.assign(bC,{List:e$,Item:QI,Input:WI,Group:XI,Separator:JI,Dialog:t$,Empty:n$,Loading:r$});function o$(e,n){let r=e.nextElementSibling;for(;r;){if(r.matches(n))return r;r=r.nextElementSibling}}function i$(e,n){let r=e.previousElementSibling;for(;r;){if(r.matches(n))return r;r=r.previousElementSibling}}function xC(e){let n=x.useRef(e);return bi(()=>{n.current=e}),n}var bi=typeof window>"u"?x.useEffect:x.useLayoutEffect;function Sa(e){let n=x.useRef();return n.current===void 0&&(n.current=e()),n}function Io(e){let n=Wp(),r=()=>e(n.snapshot());return x.useSyncExternalStore(n.subscribe,r,r)}function SC(e,n,r,i=[]){let s=x.useRef(),l=yl();return bi(()=>{var u;let d=(()=>{var h;for(let y of r){if(typeof y=="string")return y.trim();if(typeof y=="object"&&"current"in y)return y.current?(h=y.current.textContent)==null?void 0:h.trim():s.current}})(),m=i.map(h=>h.trim());l.value(e,d,m),(u=n.current)==null||u.setAttribute(xa,d),s.current=d}),s}var a$=()=>{let[e,n]=x.useState(),r=Sa(()=>new Map);return bi(()=>{r.current.forEach(i=>i()),r.current=new Map},[e]),(i,s)=>{r.current.set(i,s),n({})}};function s$(e){let n=e.type;return typeof n=="function"?n(e.props):"render"in n?n.render(e.props):e}function rd({asChild:e,children:n},r){return e&&x.isValidElement(n)?x.cloneElement(s$(n),{ref:n.ref},r(n.props.children)):r(n)}var l$={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function c$({className:e,...n}){return g.jsx(nd,{"data-slot":"command",className:et("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",e),...n})}function u$({className:e,...n}){return g.jsxs("div",{"data-slot":"command-input-wrapper",className:"flex h-9 items-center gap-2 border-b px-3",children:[g.jsx(G1,{className:"size-4 shrink-0 opacity-50"}),g.jsx(nd.Input,{"data-slot":"command-input",className:et("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",e),...n})]})}function d$({className:e,...n}){return g.jsx(nd.List,{"data-slot":"command-list",className:et("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",e),...n})}function f$({className:e,...n}){return g.jsx(nd.Item,{"data-slot":"command-item",className:et("relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",e),...n})}function Zx(e,n){if(!e)return{score:0,hits:[]};const r=e.toLowerCase(),i=n.toLowerCase();let s=0,l=0,u=0;const d=[];for(let m=0;m3&&i.endsWith("ies")?s=i.slice(0,-3)+"y":i.length>3&&i.endsWith("es")?s=i.slice(0,-2):i.length>2&&i.endsWith("s")&&(s=i.slice(0,-1)),s?Zx(s,n):null}function m$({text:e,hits:n}){const r=[];let i=0;return n.forEach((s,l)=>{s>i&&r.push(e.slice(i,s)),r.push(g.jsx("b",{children:e[s]},l)),i=s+1}),r.push(e.slice(i)),g.jsx("span",{className:"plabel",children:r})}function p$({open:e,onClose:n,candidates:r}){const[i,s]=x.useState(""),l=x.useMemo(()=>{if(!e)return[];const d=[];for(const m of r()){const h=h$(i,m.label);h&&d.push({...m,score:h.score,hits:h.hits})}return d.sort((m,h)=>h.score-m.score),d.slice(0,40)},[e,i,r]);x.useEffect(()=>{e&&s("")},[e]);const u=d=>{n(),d.run()};return g.jsx(zp,{open:e,onOpenChange:d=>!d&&n(),children:g.jsxs(Np,{id:"palette",className:"palette",showCloseButton:!1,"aria-describedby":void 0,children:[g.jsx(Bu,{className:"sr-only",children:"Search and quick actions"}),g.jsxs(c$,{shouldFilter:!1,loop:!0,children:[g.jsxs("div",{id:"palette-inputwrap",children:[g.jsx(Yt,{name:"search"}),g.jsx(u$,{id:"palette-input",placeholder:"Search file names, projects, actions…",autoComplete:"off",spellCheck:!1,value:i,onValueChange:s})]}),g.jsx(d$,{id:"palette-results",children:l.length===0?g.jsx("div",{className:"pempty",children:"No matches — search covers file names, projects, and actions"}):l.map(d=>g.jsxs(f$,{value:d.kind+":"+d.label,onSelect:()=>u(d),children:[g.jsx("span",{className:"picon",children:g.jsx(Yt,{name:d.icon})}),g.jsx(m$,{text:d.label,hits:d.hits}),g.jsx("span",{className:"pkind",children:d.kind})]},d.kind+":"+d.label))}),g.jsx("footer",{id:"palette-hint",children:"↑↓ navigate · ⏎ select · esc close"})]})]})})}const Vs=3,wa=30;function g$(e,n){return jn({queryKey:["heatDevices",e],queryFn:()=>Fn(e+"heat?by=device&days=30"),enabled:n,retry:!1,staleTime:6e4}).data?.devices??null}function Kx(e){const[n,r]=x.useState("all"),{flatFiles:i,heatMap:s,devices:l,scope:u}=e,d=b=>!u||b===u||b.startsWith(u+"/"),m=u?i.filter(b=>d(b.path)):i,h=l&&u?l.map(b=>{const S={};for(const[_,C]of Object.entries(b.folders||{}))d(_)&&(S[_]=C);return{...b,folders:S}}).filter(b=>Object.keys(b.folders).length>0):l,y=Date.now(),v=m.map(b=>{const S=s&&s[b.path]||{},_=b.time?Math.max(0,(y-new Date(b.time).getTime())/864e5):0,C=n==="all"?il(S):S[n]||0;return{path:b.path,reads:C,agent:S.agent||0,total:il(S),days:_,danger:C>=Vs&&_>=wa}});return g.jsxs("div",{className:"insights",children:[g.jsxs("h1",{className:"in-title",children:["Knowledge insights",u?g.jsxs("span",{className:"in-scope",children:[" · ",u]}):null]}),g.jsx("p",{className:"dl-sub",children:u?`Reads over the last 30 days × freshness, for ${u} and everything in it.`:"Reads over the last 30 days × how long since each file changed. Hot but stale knowledge — read a lot, maintained by nobody — is the danger zone."}),g.jsx("div",{className:"in-lens",children:["all","human","agent"].map(b=>g.jsx("button",{className:"in-lens-btn"+(b===n?" active":""),onClick:()=>r(b),children:b==="all"?"All reads":b==="human"?"Human reads":"Agent reads"},b))}),g.jsx("h3",{className:"dl-h3",children:"Map — cell size = reads, color = freshness"}),g.jsx(y$,{pts:v,onOpenFile:e.onOpenFile,onOpenFolder:e.onOpenFolder,isFolder:e.isFolder}),g.jsx("h3",{className:"dl-h3",children:"Reads × freshness"}),g.jsx(b$,{pts:v,onOpenFile:e.onOpenFile}),g.jsx("h3",{className:"dl-h3",children:"Hot path — top files by reads"}),g.jsx(x$,{pts:v,lens:n,onOpenFile:e.onOpenFile}),h&&h.length>0&&g.jsxs(g.Fragment,{children:[g.jsx("h3",{className:"dl-h3",children:"Agent coverage — which agents read which areas"}),g.jsx(S$,{devices:h})]})]})}function v$(e){const n=[[76,195,138],[232,196,84],[224,93,93]],r=Math.min(1,Math.max(0,e/300))*(n.length-1),i=Math.min(n.length-2,Math.floor(r)),s=r-i,l=n[i].map((u,d)=>Math.round(u+(n[i+1][d]-u)*s));return`rgb(${l[0]},${l[1]},${l[2]})`}function Yx(e,n,r,i,s){const l=e.reduce((h,y)=>h+y.value,0);if(!l||i<=0||s<=0)return[];const u=e.slice().sort((h,y)=>y.value-h.value).map(h=>({it:h,a:h.value/l*i*s})),d=(h,y)=>{const b=h.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of h){const C=_.a/b;S=Math.max(S,C/b,b/C)}return S},m=[];for(;u.length;){const h=i>=s,y=h?s:i,v=[u.shift()];for(;u.length&&d(v.concat(u[0]),y)<=d(v,y);)v.push(u.shift());const b=v.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of v){const C=_.a/b;h?m.push({item:_.it,x:n,y:r+S,w:b,h:C}):m.push({item:_.it,x:n+S,y:r,w:C,h:b}),S+=C}h?(n+=b,i-=b):(r+=b,s-=b)}return m}const nm=15;function y$({pts:e,onOpenFile:n,onOpenFolder:r,isFolder:i}){const u=new Map;for(const m of e){const h=m.path.includes("/")?m.path.split("/")[0]:"/";let y=u.get(h);y||u.set(h,y={name:h,files:[],value:0}),y.files.push(m),y.value+=m.reads+1}const d=[];for(const m of Yx([...u.values()],0,0,720,480)){const h=m.item,y=h.name==="/"?"":h.name;if(d.push(g.jsx("rect",{x:m.x+1,y:m.y+1,width:Math.max(0,m.w-2),height:Math.max(0,m.h-2),rx:3,className:"in-tm-group","data-dir":y},"g"+h.name)),m.w>46&&m.h>nm+10){let b=h.name==="/"?"(root)":h.name;const S=Math.floor((m.w-8)/6);b.length>S&&(b=b.slice(0,Math.max(1,S-1))+"…"),d.push(g.jsx("text",{x:m.x+5,y:m.y+12,className:"in-tm-glabel","data-dir":y,children:b},"gl"+h.name))}const v=Yx(h.files.map(b=>({...b,name:b.path.split("/").pop(),value:b.reads+1})),m.x+2,m.y+nm,Math.max(0,m.w-4),Math.max(0,m.h-nm-2));for(const b of v)if(d.push(g.jsx("rect",{x:b.x+.6,y:b.y+.6,width:Math.max(.4,b.w-1.2),height:Math.max(.4,b.h-1.2),rx:1.5,fill:v$(b.item.days),className:"in-tm-cell","data-path":b.item.path,children:g.jsx("title",{children:`${b.item.path} — ${b.item.reads} read${b.item.reads===1?"":"s"}/30d · changed ${Math.round(b.item.days)}d ago`})},b.item.path)),b.w>54&&b.h>16){const S=Math.floor((b.w-8)/6);let _=(b.item.danger?"⚠ ":"")+b.item.name;_.length>S&&(_=_.slice(0,Math.max(1,S-1))+"…"),S>=5&&d.push(g.jsx("text",{x:b.x+4.5,y:b.y+12.5,className:"in-tm-label","data-path":b.item.path,children:_},"l"+b.item.path))}}return g.jsx("svg",{viewBox:"0 0 720 480",className:"in-chart in-treemap",onClick:m=>{const h=m.target.closest("[data-path], [data-dir]");if(!h)return;const y=h.getAttribute("data-path");if(y)return n(y);const v=h.getAttribute("data-dir");v&&i(v)&&r(v)},children:d})}function b$({pts:e,onOpenFile:n}){const s={l:44,r:16,t:20,b:34},l=Math.max(wa*2,...e.map(v=>v.days)),u=Math.max(Vs*2,...e.map(v=>v.reads)),d=v=>Math.log10(v+1)/Math.log10(l+1),m=v=>Math.log10(v+1)/Math.log10(u+1),h=v=>s.l+d(v)*(720-s.l-s.r),y=v=>360-s.b-m(v)*(360-s.t-s.b);return g.jsxs("svg",{viewBox:"0 0 720 360",className:"in-chart",children:[g.jsx("rect",{x:h(wa),y:s.t,width:720-s.r-h(wa),height:y(Vs)-s.t,className:"in-danger-zone"}),g.jsx("line",{x1:h(wa),y1:s.t,x2:h(wa),y2:360-s.b,className:"in-threshold"}),g.jsx("line",{x1:s.l,y1:y(Vs),x2:720-s.r,y2:y(Vs),className:"in-threshold"}),g.jsx("line",{x1:s.l,y1:360-s.b,x2:720-s.r,y2:360-s.b,className:"in-axis"}),g.jsx("line",{x1:s.l,y1:s.t,x2:s.l,y2:360-s.b,className:"in-axis"}),g.jsx("text",{x:(s.l+720-s.r)/2,y:352,className:"in-label",children:"days since last change →"}),g.jsx("text",{x:12,y:(s.t+360-s.b)/2,className:"in-label",transform:`rotate(-90 12 ${(s.t+360-s.b)/2})`,children:"reads / 30d →"}),g.jsx("text",{x:720-s.r-6,y:s.t+14,className:"in-quad in-quad-danger",textAnchor:"end",children:"hot + stale"}),g.jsx("text",{x:s.l+6,y:s.t+14,className:"in-quad",children:"hot + fresh"}),g.jsx("text",{x:720-s.r-6,y:360-s.b-8,className:"in-quad",textAnchor:"end",children:"cold + stale"}),g.jsx("text",{x:720-s.r-6,y:s.t+28,className:"in-label",textAnchor:"end",children:"dot size = agent share of reads"}),e.map(v=>{const b=v.total?(v.agent||0)/v.total:0;return g.jsx("circle",{cx:Number(h(v.days).toFixed(1)),cy:Number(y(v.reads).toFixed(1)),r:Number((3+4*b).toFixed(1)),className:"in-pt"+(v.danger?" danger":v.reads?"":" cold"),onClick:()=>n(v.path),children:g.jsx("title",{children:`${v.path} — ${v.reads} read${v.reads===1?"":"s"} / 30d · changed ${Math.round(v.days)}d ago`})},v.path)})]})}function x$({pts:e,lens:n,onOpenFile:r}){const i=e.filter(l=>l.reads>0).sort((l,u)=>u.reads-l.reads||u.days-l.days).slice(0,20);if(!i.length)return g.jsx("div",{className:"dl-empty",children:"No reads in the window yet."});const s=i[0].reads;return g.jsxs(g.Fragment,{children:[g.jsx("div",{className:"in-hotpath",children:i.map(l=>{const u=n==="agent"?1:n==="human"?0:l.total?l.agent/l.total:0,d=l.reads/s*100;return g.jsxs("div",{className:"in-hp-row",tabIndex:0,role:"button",title:l.danger?`${l.reads} read${l.reads===1?"":"s"}/30d · unchanged ${Math.round(l.days)}d — review this file`:l.path,onClick:()=>r(l.path),onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),r(l.path))},children:[g.jsx("span",{className:"in-hp-name"+(l.danger?" danger":""),children:l.path+(l.danger?" ⚠":"")}),g.jsxs("span",{className:"in-hp-bar",children:[g.jsx("span",{className:"in-hp-agent",style:{width:(d*u).toFixed(1)+"%"}}),g.jsx("span",{className:"in-hp-human",style:{width:(d*(1-u)).toFixed(1)+"%"}})]}),g.jsx("span",{className:"in-hp-count",children:l.reads})]},l.path)})}),g.jsxs("p",{className:"in-legend",children:[g.jsx("span",{className:"in-sw agent"})," agent reads ",g.jsx("span",{className:"in-sw human"})," human reads"]})]})}function S$({devices:e}){const n=new Map;for(const b of e)for(const[S,_]of Object.entries(b.folders||{}))n.set(S,(n.get(S)||0)+_);const r=[...n.entries()].sort((b,S)=>S[1]-b[1]).slice(0,12).map(b=>b[0]),i=e.slice(0,12),s=140,l=6,u=Math.min(76,Math.max(34,(720-s-8)/r.length)),d=26,m=720,h=l+i.length*d+58,y=Math.max(1,...i.flatMap(b=>r.map(S=>(b.folders||{})[S]||0))),v=b=>{const S=[23,25,31],_=[245,166,35],C=S.map((E,T)=>Math.round(E+(_[T]-E)*b));return`rgb(${C[0]},${C[1]},${C[2]})`};return g.jsxs("svg",{viewBox:`0 0 ${m} ${h}`,className:"in-chart in-matrix",children:[i.map((b,S)=>{let _=b.name||b.id||"";return _.length>20&&(_=_.slice(0,19)+"…"),g.jsxs("g",{children:[g.jsx("text",{x:s-8,y:l+S*d+17,textAnchor:"end",className:"in-label",children:_}),r.map((C,E)=>{const T=(b.folders||{})[C]||0;return g.jsx("rect",{x:s+E*u,y:l+S*d,width:u-4,height:d-4,rx:3,fill:v(Math.sqrt(T/y)),children:g.jsx("title",{children:`${b.name||b.id} × ${C||"(root)"}: ${T} read${T===1?"":"s"}/30d`})},C)})]},b.id||S)}),r.map((b,S)=>{const _=s+S*u+(u-4)/2,C=l+i.length*d+14;return g.jsx("text",{x:_,y:C,className:"in-label",textAnchor:"end",transform:`rotate(-28 ${_} ${C})`,children:b||"(root)"},b)})]})}function w$(e){const{apiBase:n,target:r,isFolder:i,onMeta:s,onRendered:l}=e,u=r?i(r)?{prefix:r+"/"}:{path:r}:{prefix:""},d="path"in u&&u.path!==void 0?"path="+encodeURIComponent(u.path):"prefix="+encodeURIComponent(u.prefix??""),{data:m,error:h}=jn({queryKey:["history",n,d,200],queryFn:()=>Fn(n+"history?"+d+"&n=200"),staleTime:15e3});if(x.useEffect(()=>{h&&s("History unavailable: "+h.message)},[h,s]),x.useEffect(()=>{m&&l?.()},[m,l]),!m)return null;const y=m.entries||[];return g.jsxs("div",{className:"history",children:[y.length===0&&g.jsx("div",{className:"empty",children:"No history yet."}),y.map((v,b)=>g.jsx(hC,{entry:v,onOpen:e.onOpen},b))]})}function _$(e,n){return e?n(e)?e+"/ (folder)":e:"all changes"}function wC(e){const{config:n,apiBase:r,route:i,hub:s,project:l}=e,u=Ip(),d=sl(),{tree:m,flatFiles:h,dirIndex:y,loaded:v}=nI(r,!s||!!l),b=rI(r,s&&!!l&&!!n.reads?.enabled),S=s&&!!l&&!i.path&&!i.view,_=!!e.canInsights&&(i.view==="insights"||S),C=g$(r,_);x.useEffect(()=>{_&&d.invalidateQueries({queryKey:["heat",r]})},[_,r,d]);const E=i.path,T=E||(i.view==="insights"||i.view==="history")&&i.viewTarget||"",O=!!E&&y.has(E),M=!!E&&v&&!O&&h.some(Fe=>Fe.path===E),k=!!E&&v&&!O&&!M,L=O&&!i.view,[q,H]=x.useState(()=>new Set),$=x.useRef(!0);x.useEffect(()=>{if(!m||!$.current)return;$.current=!1;const Fe=(m.children||[]).filter(Ne=>Ne.dir);Fe.length===1&&H(Ne=>new Set(Ne).add(Fe[0].path))},[m]),x.useEffect(()=>{!T||!v||H(Fe=>{const Ne=new Set(Fe);for(const Je of EI(T))Ne.add(Je);return y.has(T)&&Ne.add(T),Ne})},[T,v,y]);const he=x.useCallback(Fe=>{H(Ne=>{const Je=new Set(Ne);return Je.has(Fe)?Je.delete(Fe):Je.add(Fe),Je})},[]),ve=x.useRef(null),de=x.useRef(new Map),le=x.useRef({key:"",want:0,attempts:0});x.useEffect(()=>{le.current={key:u,want:Vk()==="POP"?de.current.get(u)??0:0,attempts:0}},[u]);const ae=x.useCallback(()=>{const Fe=ve.current,Ne=le.current;!Fe||Ne.key!==u||Ne.attempts>=3||(Ne.attempts++,Fe.scrollTo({top:Ne.want,behavior:"instant"}))},[u]),me=x.useCallback(()=>{ve.current&&de.current.set(u,ve.current.scrollTop)},[u]),ye=x.useCallback(Fe=>{fn($k(Fe,l?.id)),fr()},[l?.id]),D=x.useCallback(Fe=>fn(_a("history",l?.id,Fe)),[l?.id]),[Y,ne]=x.useState(""),[J,W]=x.useState(null),[z,j]=x.useState(!1),[U,Q]=x.useState(!1);x.useEffect(()=>Wz(()=>Q(!0)),[]);const Z=x.useRef(null),re=e.panel??null,ee=!re&&s&&!!l&&M,ge=!re&&s&&!!l,be=!re&&M,De=!re&&(M||s&&!!l&&O),Ve=r+"download?path="+encodeURIComponent(E),Ue=x.useCallback(async()=>{try{const Fe=await fetch(r+"shares",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:E})});if(!Fe.ok)throw new Error(await Fe.text());const Ne=await Fe.json(),Je=await rl(Ne.url);W({url:Ne.url,copied:Je})}catch(Fe){We("Share failed: "+Fe.message,!0)}},[r,E]),lt=x.useCallback(()=>{if(!E)return D("");D(O?E+"/":E)},[E,O,D]);x.useEffect(()=>{const Fe=Ne=>{(Ne.metaKey||Ne.ctrlKey)&&Ne.key.toLowerCase()==="k"&&(Ne.preventDefault(),Q(Je=>!Je))};return window.addEventListener("keydown",Fe),()=>window.removeEventListener("keydown",Fe)},[]);const Xe=x.useCallback(()=>{const Fe=[],Ne=(Je,zt,eo,or)=>Fe.push({icon:Je,label:zt,kind:eo,run:or});if(s&&l&&E&&(M&&Ne("share","Share: "+E,"action",Ue),Ne("hist","History: "+E,"action",lt),M&&Ne("download","Download: "+E,"action",()=>Z.current?.click())),s&&l&&Ne("hist","History: whole project","action",()=>D("")),s)for(const Je of e.projects||[])(!l||Je.id!==l.id)&&Ne("folder","Switch to project: "+Je.name,"project",()=>fn("/"+Je.id));n.auth?.enabled&&Ne("power","Sign out","action",()=>window.location.href="/auth/logout");for(const Je of y.keys())Ne("folder",Je,"folder",()=>ye(Je));for(const Je of h)Ne("doc",Je.path,"file",()=>ye(Je.path));return Fe},[s,l,E,M,n.auth?.enabled,y,h,e.projects,Ue,lt,D,ye]);x.useEffect(()=>{if(!z)return;const Fe=()=>j(!1);return document.addEventListener("click",Fe),()=>document.removeEventListener("click",Fe)},[z]);const Xt=x.useCallback(Fe=>y.has(Fe),[y]);let mn="app",qt,Pt;re?Pt=re.body:i.view==="insights"?Pt=e.canInsights?g.jsx(Kx,{flatFiles:h,heatMap:b,devices:C,scope:i.viewTarget||"",onOpenFile:ye,onOpenFolder:ye,isFolder:Xt}):g.jsx("div",{className:"empty",children:"Insights is for hub admins and org owners."}):i.view==="history"?Pt=g.jsx(w$,{apiBase:r,target:i.viewTarget||"",isFolder:Xt,onOpen:ye,onMeta:ne,onRendered:ae}):E?v?k?Pt=g.jsxs("div",{className:"notfound",children:[g.jsx("h1",{children:"Couldn't find that"}),g.jsxs("p",{children:[g.jsx("code",{children:E})," isn't in this project right now."]}),g.jsx("p",{className:"nf-sub",children:"If it was just created, it may still be uploading or syncing from a teammate's device — this page checks again automatically every few seconds, so refresh or come back in a moment."}),g.jsx("button",{className:"pbtn",onClick:()=>d.invalidateQueries({queryKey:["tree",r]}),children:"Check again"})]}):O?Pt=g.jsx(MI,{node:y.get(E),heatMap:b,hub:s&&!!l,apiBase:r,onOpen:ye,onFullHistory:D,onRendered:ae}):(mn=eC.test(E)?"wide":"read",qt="markdown",Pt=g.jsx(jI,{apiBase:r,path:E,heatMap:b,flatFiles:h,onOpenFile:ye,onMeta:ne,onRendered:ae})):Pt=g.jsx("div",{className:"empty",children:"Loading…"}):S?Pt=g.jsxs(g.Fragment,{children:[g.jsx(dC,{project:l}),e.canInsights&&g.jsx("div",{className:"home-insights",children:g.jsx(Kx,{flatFiles:h,heatMap:b,devices:C,onOpenFile:ye,onOpenFolder:ye,isFolder:Xt})})]}):Pt=g.jsx("div",{className:"empty",children:"Select a file to read it."});const Ut=re?re.crumb:E?g.jsx(RI,{path:E,onOpenFolder:ye}):i.view==="insights"?"Insights — "+(i.viewTarget||l?.name||""):i.view==="history"?"History — "+_$(i.viewTarget||"",Xt):S?l.name:null,rr=g.jsx(Js,{crumb:Ut,meta:Y,actions:g.jsxs(g.Fragment,{children:[ee&&g.jsx($t,{id:"share-btn",variant:"toolbar",className:"icon-only",title:"Share","aria-label":"Share",onClick:Ue,children:g.jsx(Yt,{name:"share"})}),ge&&!E&&!i.view&&g.jsxs($t,{id:"history-btn",variant:"toolbar",onClick:lt,children:[g.jsx(Yt,{name:"hist"})," ",g.jsx("span",{className:"lbl",children:"History"})]}),be&&g.jsx("a",{id:"download",hidden:!0,download:!0,href:Ve,ref:Z,children:"Download"}),De&&g.jsx($t,{id:"more-btn",variant:"toolbar",className:"icon-only",title:"More actions","aria-label":"More actions",onClick:Fe=>{Fe.stopPropagation(),j(!z)},children:g.jsx(Yt,{name:"dots"})}),z&&g.jsxs("div",{id:"more-menu",role:"menu",children:[ge&&g.jsx("button",{className:"more-item",onClick:lt,children:"History"}),be&&g.jsx("button",{className:"more-item",onClick:()=>Z.current?.click(),children:"Download"}),e.canInsights&&g.jsx("button",{className:"more-item",onClick:()=>{e.onClosePanel?.(),fn(_a("insights",l?.id,E))},children:"Insights"})]})]})});return g.jsxs(g.Fragment,{children:[g.jsx(Xs,{vault:e.sidebar.vault,projectsNav:e.sidebar.projectsNav,orgBar:e.sidebar.orgBar,tree:g.jsx(CI,{root:m,expanded:q,onToggle:he,currentPath:T,listingShowing:L,onOpen:ye}),topbar:rr,contentRef:ve,onContentScroll:me,children:g.jsx(hu,{width:mn,className:qt,children:Pt})}),J&&g.jsx($I,{url:J.url,copied:J.copied,onClose:()=>W(null)}),g.jsx(p$,{open:U,onClose:()=>Q(!1),candidates:Xe})]})}function C$({config:e}){const n=Ip(),r=kp(),[i,s]=x.useState(null),[l,u]=x.useState(null);x.useEffect(()=>u(null),[n]);const d=x.useMemo(()=>{const $=n.match(/^\/join\/([0-9a-f]+)\/?$/);return $?$[1]:null},[n]),{data:m}=kk(!d),{data:h}=Lk(!d),y=!!e.auth.admin,{data:v}=t_(y),b=x.useMemo(()=>r_(n,"hub"),[n]),S=x.useMemo(()=>m&&(m.find($=>$.id===b.project)||i&&m.find($=>$.org===i)||m[0])||null,[m,b.project,i]);if(x.useEffect(()=>{document.title=S?S.name+" — BearDrive":e.brand||e.volume||"BearDrive"},[S,e]),d)return g.jsx(E$,{token:d,onDone:async $=>{s($),await r(),fn("/",{replace:!0})}});const _=e.brand||e.volume||"BearDrive",C=S&&h?.find($=>$.id===S.org)||null,E=y||(C?C.role==="owner":!1),T=g.jsx(Hu,{name:_,onHome:()=>fn("/"),search:!!S}),O=e.me?g.jsx(H8,{me:e.me,org:C,orgActive:!!b.org,admin:y?{pending:v?.length||0,onClick:()=>{u({kind:"hub"}),fr()}}:void 0}):void 0;if(!m||!h)return g.jsx(Xs,{vault:T,topbar:g.jsx(Js,{}),children:g.jsx(hu,{children:g.jsx("div",{className:"empty",children:"Loading…"})})});if(!S)return g.jsx(Xs,{vault:T,projectsNav:g.jsx(Vx,{projects:m}),orgBar:O,topbar:g.jsx(Js,{}),children:g.jsx(hu,{children:g.jsx(tI,{authEnabled:e.auth.enabled,onCreate:async $=>{if(!$){We("Give the project a name.",!0);return}try{const he=await Aa("/api/projects",{name:$});await r(),fn("/"+he.project.id),We(`Created “${he.project.name}”.`)}catch(he){We("Could not create the project: "+he.message,!0)}}})})});const M=l?.kind==="hub"?{crumb:"Signup & access",body:g.jsx(k8,{})}:null,k=b.org?h.find($=>$.id===b.org):null,q=b.org&&!k?{crumb:"Organization",body:g.jsxs("div",{className:"empty",children:[g.jsx("h3",{children:"Organization not found"}),g.jsx("p",{children:"This organization doesn't exist, or you're no longer a member."}),g.jsx("p",{children:g.jsxs("a",{...i_("/"+S.id),children:["Back to ",S.name]})})]})}:k?{crumb:"Organization",body:g.jsx(j8,{org:k,projects:m,myEmail:e.me?.email||""})}:null,H=b.view==="settings"?{crumb:"Project settings",body:g.jsx(K8,{project:S,org:C,onDeleted:async()=>{await r(),fn("/")}})}:b.view==="install"?{crumb:"Installation",body:g.jsx(dC,{project:S})}:null;return!b.org&&b.project!==S.id?g.jsx(Fk,{to:"/"+S.id}):g.jsx(wC,{config:e,apiBase:"/api/p/"+S.id+"/",route:b,hub:!0,project:S,projects:m,canInsights:E,sidebar:{vault:T,projectsNav:g.jsx(Vx,{projects:m,currentId:S.id,menu:{active:l?null:b.view==="insights"&&!b.viewTarget?"dashboard":b.view==="install"?"install":b.view==="history"&&!b.viewTarget?"history":b.view==="settings"?"settings":null,onDashboard:()=>{u(null),fn(_a("insights",S.id)),fr()},onInstall:()=>{u(null),fn(_a("install",S.id)),fr()},onHistory:()=>{u(null),fn(_a("history",S.id)),fr()},onSettings:()=>{u(null),fn(_a("settings",S.id)),fr()}}}),orgBar:O},panel:M||q||H,onClosePanel:()=>u(null)},S.id)}function E$({token:e,onDone:n}){return x.useEffect(()=>{let r=!1;return Aa("/api/invites/"+e).then(i=>{r||(We(`Welcome — you joined the “${i.org.name}” team. Opening its projects…`),n(i.org.id))}).catch(i=>{r||String(i.message).includes("signing in")||(We("Could not accept the invite: "+i.message,!0),n(null))}),()=>{r=!0}},[e]),g.jsx(Xs,{vault:g.jsx(Hu,{name:"BearDrive"}),topbar:g.jsx(Js,{}),children:g.jsx(hu,{children:g.jsx("div",{className:"empty",children:"Joining…"})})})}function R$({config:e}){const n=Ip(),r=e.volume||"BearDrive";x.useEffect(()=>{document.title=e.brand||r},[e,r]);const i=x.useMemo(()=>r_(n,"volume"),[n]);return g.jsx(wC,{config:e,apiBase:"/api/",route:i,hub:!1,sidebar:{vault:g.jsx(Hu,{name:r,showSignout:e.auth.enabled,search:!0})}})}function T$(){const{data:e}=M2();return g.jsxs(Yz,{delayDuration:150,children:[e?e.mode==="hub"?g.jsx(C$,{config:e}):g.jsx(R$,{config:e}):g.jsx(Xs,{vault:g.jsx(Hu,{name:"…",showSignout:!1}),topbar:g.jsx(Js,{}),children:g.jsx("div",{className:"empty",children:"Loading…"})}),g.jsx(Tk,{}),g.jsx(zk,{})]})}const O$=new p2({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});HR.createRoot(document.getElementById("root")).render(g.jsx(x.StrictMode,{children:g.jsx(g2,{client:O$,children:g.jsx(T$,{})})})); +bdrive hooks install --agent `+e.agent}function J8(){try{return localStorage.getItem("bdrive-guide-agent")||"claude"}catch{return"claude"}}function dC({project:e}){const[n,r]=x.useState(J8),i=Qh.find(l=>l.key===n)||Qh[0],s=Y8(i,e);return g.jsxs("div",{className:"guide",children:[g.jsxs("h1",{className:"in-title gd-head",children:[g.jsx("span",{className:"proj-mark","aria-hidden":"true",style:{background:ol(e.name)},children:g.jsx(Ta,{name:e.icon})}),e.name]}),e.description&&g.jsx("p",{className:"in-desc",children:e.description}),g.jsx("p",{className:"dl-sub",children:"Mount this project as a folder on any machine and connect your coding agent: files sync both ways in the background, every change is journaled with who made it, and agent reads feed Insights."}),g.jsx("div",{className:"gd-tabs",children:Qh.map(l=>g.jsx("button",{className:"gd-tab"+(l.key===i.key?" active":""),"data-key":l.key,onClick:()=>{r(l.key);try{localStorage.setItem("bdrive-guide-agent",l.key)}catch{}},children:l.label},l.key))}),g.jsxs("div",{className:"gd-body",children:[s.map((l,u)=>g.jsxs("div",{className:"gd-step"+(s.length>1?"":" gd-solo"),children:[g.jsxs("div",{className:"gd-step-head",children:[s.length>1&&g.jsx("span",{className:"gd-num",children:u+1}),g.jsx("span",{className:"gd-step-title",children:l.title})]}),l.desc&&g.jsx("p",{className:"gd-desc",children:l.desc}),l.code&&g.jsx(Fx,{code:l.code}),l.extra&&g.jsx("p",{className:"gd-desc gd-extra",children:l.extra})]},u)),i.agent&&g.jsxs("details",{className:"gd-manual",children:[g.jsx("summary",{children:"Or run it yourself"}),g.jsx("p",{className:"gd-desc",children:"Same result, in the folder you want the files. Don't skip the last line — the hooks are what keep every turn starting from the latest state."}),g.jsx(Fx,{code:X8(i,e)})]}),g.jsx("p",{className:"gd-done",children:"That's it — the folder now syncs on its own. Every agent turn starts from the latest state, edits appear here (and on every teammate's mount) within seconds, and what your agents read shows up in Insights."})]})]})}function Fx({code:e}){const[n,r]=x.useState("Copy");return g.jsxs("pre",{className:"gd-code",children:[g.jsx("code",{children:e}),g.jsx("button",{className:"gd-copy",onClick:async()=>{r(await rl(e)?"Copied":"Copy failed"),setTimeout(()=>r("Copy"),1400)},children:n})]})}const W8=vl({invite:Ma().trim().refine(e=>/join\/([0-9a-f]+)/.test(e)||/^[0-9a-f]{8,}$/.test(e),{message:"That doesn't look like an invite link."})}),eI=vl({name:Ma().trim().min(1,"Give the project a name.").max(60,"Keep it under 60 characters.")});function tI({authEnabled:e,onCreate:n}){const r=Ws({resolver:nl(W8),defaultValues:{invite:""}}),i=Ws({resolver:nl(eI),defaultValues:{name:""}});return g.jsxs("div",{className:"onboard",children:[g.jsx("h1",{children:"Welcome to BearDrive"}),g.jsx("p",{children:"You're signed in, but you're not part of any project yet."}),e&&g.jsxs("div",{className:"ob-card",children:[g.jsx("h3",{children:"Have an invite link?"}),g.jsx("p",{children:"A teammate can send you a join link. Paste it here:"}),g.jsxs("form",{className:"ob-row",onSubmit:r.handleSubmit(({invite:s})=>{const l=s.match(/join\/([0-9a-f]+)/)||s.match(/^([0-9a-f]{8,})$/);location.href="/join/"+l[1]}),children:[g.jsx("input",{id:"ob-invite",type:"text",placeholder:"https://…/join/…",autoComplete:"off",...r.register("invite")}),g.jsx($t,{id:"ob-join",variant:"primary",type:"submit",children:"Join"})]}),r.formState.errors.invite&&g.jsx("p",{className:"field-err",children:r.formState.errors.invite.message})]}),g.jsxs("div",{className:"ob-card",children:[g.jsx("h3",{children:"Or start a new project"}),g.jsx("p",{children:"Create a shared space for your team's files."}),g.jsxs("form",{className:"ob-row",onSubmit:i.handleSubmit(({name:s})=>n(s)),children:[g.jsx("input",{id:"ob-name",type:"text",placeholder:"Project name, e.g. wiki",autoComplete:"off",...i.register("name")}),g.jsx($t,{id:"ob-create",variant:"primary",type:"submit",children:"Create"})]}),i.formState.errors.name&&g.jsx("p",{className:"field-err",children:i.formState.errors.name.message})]})]})}function nI(e,n=!0){const r=jn({queryKey:["tree",e],queryFn:()=>Fn(e+"tree"),enabled:n,refetchInterval:15e3}),i=x.useMemo(()=>{const s=[],l=new Map,u=d=>{for(const m of d.children||[])m.dir?(l.set(m.path,m),u(m)):s.push(m)};return r.data&&u(r.data),{flatFiles:s,dirIndex:l}},[r.data]);return{tree:r.data,...i,loaded:!!r.data}}function rI(e,n){return jn({queryKey:["heat",e],queryFn:()=>Fn(e+"heat?days=30"),enabled:n,staleTime:6e4,refetchInterval:6e4}).data?.entries??null}function oI(e,n,r){return jn({queryKey:["history",e,"prefix",n,20],queryFn:()=>Fn(e+"history?prefix="+encodeURIComponent(n)+"&n=20"),enabled:r,staleTime:15e3}).data?.entries??null}function Px(e,n,r){if(!e)return null;if(!r)return e[n]||null;const i={human:0,agent:0,share:0};for(const[s,l]of Object.entries(e))s.startsWith(n+"/")&&(i.human+=l.human||0,i.agent+=l.agent||0,i.share+=l.share||0);return i.human||i.agent||i.share?i:null}function il(e){return(e.human||0)+(e.agent||0)+(e.share||0)}function nu(e){const n=il(e);if(!n)return"";let r=n+(n===1?" read":" reads");return e.agent&&(r+=" ("+e.agent+" agent)"),r}function iI(e){const n=il(e);return n?n<3?1:n<10?2:n<30?3:4:0}function aI(e,n,r){const i=new Array(e);return new Proxy(i,{get(s,l,u){if(typeof l=="string"){const d=l.charCodeAt(0);if(d>=48&&d<=57){const m=+l;if(Number.isInteger(m)&&m>=0&&mi[y]!==h))&&(i=d,s=n(...d),r?.onChange&&!(l&&r.skipInitialOnChange)&&r.onChange(s),l=!1),s}return u.updateDeps=d=>{i=d},u}function Ux(e,n){if(e===void 0)throw new Error("Unexpected undefined");return e}const sI=(e,n)=>Math.abs(e-n)<1.01,lI=(e,n,r)=>{let i;return function(...s){e.clearTimeout(i),i=e.setTimeout(()=>n.apply(this,s),r)}};let Ds;const Xh=()=>{if(Ds!==void 0)return Ds;if(typeof navigator>"u")return Ds=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Ds=!0;const e=navigator.maxTouchPoints;return Ds=navigator.platform==="MacIntel"&&e!==void 0&&e>0},Hx=e=>{const{offsetWidth:n,offsetHeight:r}=e;return{width:n,height:r}},cI=e=>e,uI=e=>{const n=Math.max(e.startIndex-e.overscan,0),i=Math.min(e.endIndex+e.overscan,e.count-1)-n+1,s=new Array(i);for(let l=0;l{const r=e.scrollElement;if(!r)return;const i=e.targetWindow;if(!i)return;const s=u=>{const{width:d,height:m}=u;n({width:Math.round(d),height:Math.round(m)})};if(s(Hx(r)),!i.ResizeObserver)return()=>{};const l=new i.ResizeObserver(u=>{const d=()=>{const m=u[0];if(m?.borderBoxSize){const h=m.borderBoxSize[0];if(h){s({width:h.inlineSize,height:h.blockSize});return}}s(Hx(r))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(d):d()});return l.observe(r,{box:"border-box"}),()=>{l.unobserve(r)}},wu={passive:!0},fI=typeof window>"u"?!0:"onscrollend"in window,hI=(e,n,r)=>{const i=e.scrollElement;if(!i)return;const s=e.targetWindow;if(!s)return;const l=e.options.useScrollendEvent&&fI;let u=0;const d=l?null:lI(s,()=>n(u,!1),e.options.isScrollingResetDelay),m=v=>()=>{u=r(i),d?.(),n(u,v)},h=m(!0),y=m(!1);return i.addEventListener("scroll",h,wu),l&&i.addEventListener("scrollend",y,wu),()=>{i.removeEventListener("scroll",h),l&&i.removeEventListener("scrollend",y)}},mI=(e,n)=>hI(e,n,r=>{const{horizontal:i,isRtl:s}=e.options;return i?r.scrollLeft*(s&&-1||1):r.scrollTop}),pI=(e,n,r)=>{if(r.options.useCachedMeasurements){const i=r.indexFromElement(e),s=r.options.getItemKey(i);return r.itemSizeCache.get(s)??r.options.estimateSize(i)}if(n?.borderBoxSize){const i=n.borderBoxSize[0];if(i)return Math.round(i[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const i=r.indexFromElement(e),s=r.options.getItemKey(i),l=r.itemSizeCache.get(s);if(l!==void 0)return l}return e[r.options.horizontal?"offsetWidth":"offsetHeight"]},gI=(e,{adjustments:n=0,behavior:r},i)=>{var s,l;(l=(s=i.scrollElement)==null?void 0:s.scrollTo)==null||l.call(s,{[i.options.horizontal?"left":"top"]:e+n,behavior:r})},vI=gI;class yI{constructor(n){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.scrollState=null,this.measurementsCache=[],this._flatMeasurements=null,this.itemSizeCache=new Map,this.itemSizeCacheVersion=0,this.laneAssignments=new Map,this.pendingMin=null,this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.pendingScrollAnchor=null,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._intendedScrollOffset=null,this.elementsCache=new Map,this.now=()=>{var r,i,s;return((s=(i=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:i.now)==null?void 0:s.call(i))??Date.now()},this.observer=(()=>{let r=null;const i=()=>r||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:r=new this.targetWindow.ResizeObserver(s=>{s.forEach(l=>{const u=()=>{const d=l.target,m=this.indexFromElement(d);if(!d.isConnected){this.observer.unobserve(d);for(const[h,y]of this.elementsCache)if(y===d){this.elementsCache.delete(h);break}return}this.shouldMeasureDuringScroll(m)&&this.resizeItem(m,this.options.measureElement(d,l,this))};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(u):u()})}));return{disconnect:()=>{var s;(s=i())==null||s.disconnect(),r=null},observe:s=>{var l;return(l=i())==null?void 0:l.observe(s,{box:"border-box"})},unobserve:s=>{var l;return(l=i())==null?void 0:l.unobserve(s)}}})(),this.range=null,this.setOptions=r=>{var i,s;const l={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:cI,rangeExtractor:uI,onChange:()=>{},measureElement:pI,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,anchorTo:"start",followOnAppend:!1,scrollEndThreshold:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,laneAssignmentMode:"estimate",useCachedMeasurements:!1};for(const b in r){const S=r[b];S!==void 0&&(l[b]=S)}const u=this.options;let d=null,m=null,h=!1;if(u!==void 0&&u.enabled&&l.enabled&&l.anchorTo==="end"&&this.scrollElement!==null){const b=u.count,S=l.count,_=this.getMeasurements(),C=b>0?((i=_[0])==null?void 0:i.key)??u.getItemKey(0):null,E=b>0?((s=_[b-1])==null?void 0:s.key)??u.getItemKey(b-1):null;if(S!==b||b>0&&S>0&&(l.getItemKey(0)!==C||l.getItemKey(S-1)!==E)){h=!0;const M=b>0?this.getVirtualItemForOffset(this.getScrollOffset())??_[0]:null;M&&(d=[M.key,this.getScrollOffset()-M.start]);const k=l.followOnAppend===!0?"auto":l.followOnAppend||null;k&&S>b&&this.isAtEnd(u.scrollEndThreshold)&&(b===0||l.getItemKey(S-1)!==E)&&(m=k)}}this.options=l,h&&(this.pendingMin=0,this.itemSizeCacheVersion++);let y=!1,v=0;if(d&&this.scrollOffset!==null){const[b,S]=d,_=this.getMeasurements(),{count:C,getItemKey:E}=this.options;let T=0;for(;T{var i,s;(s=(i=this.options).onChange)==null||s.call(i,this,r)},this.maybeNotify=ba(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),r=>{this.notify(r)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(r=>r()),this.unsubs=[],this.observer.disconnect(),this.rafId!=null&&this.targetWindow&&(this.targetWindow.cancelAnimationFrame(this.rafId),this.rafId=null),this.scrollState=null,this._iosDeferredAdjustment=0,this._iosTouching=!1,this._iosJustTouchEnded=!1,this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var r;const i=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==i){if(this.cleanup(),!i){this.maybeNotify();return}if(this.scrollElement=i,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((r=this.scrollElement)==null?void 0:r.window)??null,this.elementsCache.forEach(l=>{this.observer.observe(l)}),this.unsubs.push(this.options.observeElementRect(this,l=>{this.scrollRect=l,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(l,u)=>{if(u&&this._intendedScrollOffset===null&&l===this.scrollOffset)return;this._intendedScrollOffset!==null&&Math.abs(l-this._intendedScrollOffset)<1.5&&(l=this._intendedScrollOffset),this._intendedScrollOffset=null,this.scrollAdjustments=0;const d=this.getScrollOffset();this.scrollDirection=u?d===l?this.scrollDirection:d{this._iosTouching=!0,this._iosJustTouchEnded=!1,this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)},d=()=>{this._iosTouching=!1,!(!Xh()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};l.addEventListener("touchstart",u,wu),l.addEventListener("touchend",d,wu),this.unsubs.push(()=>{l.removeEventListener("touchstart",u),l.removeEventListener("touchend",d),this._iosTouchEndTimerId!==null&&this.targetWindow!=null&&(this.targetWindow.clearTimeout(this._iosTouchEndTimerId),this._iosTouchEndTimerId=null)})}this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}const s=this.pendingScrollAnchor;if(this.pendingScrollAnchor=null,s&&this.scrollElement&&this.options.enabled){const[l,u,d,m]=s;l!==null&&!d&&(Xh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?m!==0&&(this._iosDeferredAdjustment+=m):this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})),d&&this.scrollToEnd({behavior:d})}},this._flushIosDeferredIfReady=()=>{if(this._iosDeferredAdjustment===0||this.isScrolling||this._iosTouching||this._iosJustTouchEnded)return;const r=this.getScrollOffset(),i=this.getMaxScrollOffset();if(r<0||r>i)return;const s=this._iosDeferredAdjustment;this._iosDeferredAdjustment=0,this._scrollToOffset(r,{adjustments:this.scrollAdjustments+=s,behavior:void 0})},this.rafId=null,this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getMeasurementOptions=ba(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes,this.options.laneAssignmentMode,this.options.gap],(r,i,s,l,u,d,m,h)=>(this.prevLanes!==void 0&&this.prevLanes!==d&&(this.lanesChangedFlag=!0),this.prevLanes=d,this.pendingMin=null,{count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:u,lanes:d,laneAssignmentMode:m,gap:h}),{key:!1}),this.getMeasurements=ba(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:i,scrollMargin:s,getItemKey:l,enabled:u,lanes:d,laneAssignmentMode:m,gap:h},y)=>{const v=this.itemSizeCache;if(!u)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>r)for(const T of this.laneAssignments.keys())T>=r&&this.laneAssignments.delete(T);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMin=null),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(T=>{this.itemSizeCache.set(T.key,T.size)}));const b=this.lanesSettling?0:this.pendingMin??0;if(this.pendingMin=null,this.lanesSettling&&this.measurementsCache.length===r&&(this.lanesSettling=!1),d===1){const T=r*2;let O=this._flatMeasurements;if(!O||O.length0&&L.set(O.subarray(0,b*2)),O=L,this._flatMeasurements=O}let M;if(b===0)M=i+s;else{const L=b-1;M=O[L*2]+O[L*2+1]+h}for(let L=b;L1){k=M;const ve=_[k],de=ve!==void 0?S[ve]:void 0;L=de?de.end+h:i+s}else if(E===d){let ve=0,de=C[0],le=_[0];for(let ae=1;aethis.options.debug}),this.calculateRange=ba(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,i,s,l)=>r.length===0||i===0?(this.range=null,null):(this.range=xI(r,i,s,l,l===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=ba(()=>{let r=null,i=null;const s=this.calculateRange();return s&&(r=s.startIndex,i=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,i]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,i]},(r,i,s,l,u)=>l===null||u===null?[]:r({startIndex:l,endIndex:u,overscan:i,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=r=>{const i=this.options.indexAttribute,s=r.getAttribute(i);return s?parseInt(s,10):(console.warn(`Missing attribute name '${i}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var i;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const s=this.scrollState.index??((i=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:i.index);if(s!==void 0&&this.range){const l=Math.max(this.options.overscan,Math.ceil((this.range.endIndex-this.range.startIndex)/2)),u=Math.max(0,s-l),d=Math.min(this.options.count-1,s+l);return r>=u&&r<=d}return!0},this.measureElement=r=>{if(!r){this.elementsCache.forEach((u,d)=>{u.isConnected||(this.observer.unobserve(u),this.elementsCache.delete(d))});return}const i=this.indexFromElement(r),s=this.options.getItemKey(i),l=this.elementsCache.get(s);l!==r&&(l&&this.observer.unobserve(l),this.observer.observe(r),this.elementsCache.set(s,r)),(!this.isScrolling||this.scrollState)&&this.shouldMeasureDuringScroll(i)&&this.resizeItem(i,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,i)=>{var s,l;if(r<0||r>=this.options.count)return;let u,d,m;const h=this._flatMeasurements;if(this.options.lanes===1&&h!==null)m=this.options.getItemKey(r),d=h[r*2],u=h[r*2+1];else{const b=this.measurementsCache[r];if(!b)return;m=b.key,d=b.start,u=b.size}const y=this.itemSizeCache.get(m)??u,v=i-y;if(v!==0){const b=this.options.anchorTo==="end"&&((s=this.scrollState)==null?void 0:s.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,S=b?this.getTotalSize():0,_=((l=this.scrollState)==null?void 0:l.behavior)!=="smooth"&&(this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(this.measurementsCache[r]??{index:r,key:m,start:d,size:u,end:d+u,lane:0},v,this):d[this.getVirtualIndexes(),this.getMeasurements()],(r,i)=>{const s=[];for(let l=0,u=r.length;lthis.options.debug}),this.getVirtualItemForOffset=r=>{const i=this.getMeasurements();if(i.length===0)return;const s=this._flatMeasurements,l=this.options.lanes===1&&s!=null,u=fC(0,i.length-1,l?d=>s[d*2]:d=>Ux(i[d]).start,r);return Ux(i[u])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const r=this.scrollElement.document.documentElement;return this.options.horizontal?r.scrollWidth-this.scrollElement.innerWidth:r.scrollHeight-this.scrollElement.innerHeight}},this.getVirtualDistanceFromEnd=()=>Math.max(this.getTotalSize()-this.getSize()-this.getScrollOffset(),0),this.getDistanceFromEnd=()=>Math.max(this.getMaxScrollOffset()-this.getScrollOffset(),0),this.isAtEnd=(r=this.options.scrollEndThreshold)=>this.getDistanceFromEnd()<=r,this.getOffsetForAlignment=(r,i,s=0)=>{if(!this.scrollElement)return 0;const l=this.getSize(),u=this.getScrollOffset();i==="auto"&&(i=r>=u+l?"end":"start"),i==="center"?r+=(s-l)/2:i==="end"&&(r-=l);const d=this.getMaxScrollOffset();return Math.max(Math.min(d,r),0)},this.getOffsetForIndex=(r,i="auto")=>{r=Math.max(0,Math.min(r,this.options.count-1));const s=this.getSize(),l=this.getScrollOffset(),u=this.measurementsCache[r];if(!u)return;if(i==="auto")if(u.end>=l+s-this.options.scrollPaddingEnd)i="end";else if(u.start<=l+this.options.scrollPaddingStart)i="start";else return[l,i];if(i==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),i];const d=i==="end"?u.end+this.options.scrollPaddingEnd:u.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(d,i,u.size),i]},this.scrollToOffset=(r,{align:i="start",behavior:s="auto"}={})=>{const l=this.getOffsetForAlignment(r,i),u=this.now();this.scrollState={index:null,align:i,behavior:s,startedAt:u,lastTargetOffset:l,stableFrames:0},this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:i="auto",behavior:s="auto"}={})=>{r=Math.max(0,Math.min(r,this.options.count-1));const l=this.getOffsetForIndex(r,i);if(!l)return;const[u,d]=l,m=this.now();this.scrollState={index:r,align:d,behavior:s,startedAt:m,lastTargetOffset:u,stableFrames:0},this._scrollToOffset(u,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollBy=(r,{behavior:i="auto"}={})=>{const s=this.getScrollOffset()+r,l=this.now();this.scrollState={index:null,align:"start",behavior:i,startedAt:l,lastTargetOffset:s,stableFrames:0},this._scrollToOffset(s,{adjustments:void 0,behavior:i}),this.scheduleScrollReconcile()},this.scrollToEnd=({behavior:r="auto"}={})=>{if(this.options.count>0){this.scrollToIndex(this.options.count-1,{align:"end",behavior:r});return}this.scrollToOffset(Math.max(this.getTotalSize()-this.getSize(),0),{behavior:r})},this.getTotalSize=()=>{var r;const i=this.getMeasurements();let s;if(i.length===0)s=this.options.paddingStart;else if(this.options.lanes===1){const l=i.length-1,u=this._flatMeasurements;u!=null?s=u[l*2]+u[l*2+1]:s=((r=i[l])==null?void 0:r.end)??0}else{const l=Array(this.options.lanes).fill(null);let u=i.length-1;for(;u>=0&&l.some(d=>d===null);){const d=i[u];l[d.lane]===null&&(l[d.lane]=d.end),u--}s=Math.max(...l.filter(d=>d!==null))}return Math.max(s-this.options.scrollMargin+this.options.paddingEnd,0)},this.takeSnapshot=()=>{const r=[];if(this.itemSizeCache.size===0)return r;const i=this.getMeasurements();for(const s of i)s&&this.itemSizeCache.has(s.key)&&r.push({index:s.index,key:s.key,start:s.start,size:s.size,end:s.end,lane:s.lane});return r},this._scrollToOffset=(r,{adjustments:i,behavior:s})=>{this._intendedScrollOffset=r+(i??0),this.options.scrollToFn(r,{behavior:s,adjustments:i},this)},this.measure=()=>{this.pendingMin=null,this.itemSizeCache.clear(),this.laneAssignments.clear(),this.itemSizeCacheVersion++,this.notify(!1)},this.setOptions(n)}applyScrollAdjustment(n,r){n!==0&&(Xh()&&(this.isScrolling||this._iosTouching||this._iosJustTouchEnded)?this._iosDeferredAdjustment+=n:(this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=n,behavior:r}),this.scrollOffset!==null&&(this.scrollOffset+=this.scrollAdjustments,this.scrollAdjustments=0)))}scheduleScrollReconcile(){if(!this.targetWindow){this.scrollState=null;return}this.rafId==null&&(this.rafId=this.targetWindow.requestAnimationFrame(()=>{this.rafId=null,this.reconcileScroll()}))}reconcileScroll(){if(!this.scrollState||!this.scrollElement)return;if(this.now()-this.scrollState.startedAt>5e3){this.scrollState=null;return}const i=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,s=i?i[0]:this.scrollState.lastTargetOffset,l=1,u=s!==this.scrollState.lastTargetOffset;if(!u&&sI(s,this.getScrollOffset())){if(this.scrollState.stableFrames++,this.scrollState.stableFrames>=l){this.getScrollOffset()!==s&&this._scrollToOffset(s,{adjustments:void 0,behavior:"auto"}),this.scrollState=null;return}}else if(this.scrollState.stableFrames=0,u){const d=this.getSize()||600,m=Math.abs(s-this.getScrollOffset()),h=this.scrollState.behavior==="smooth"&&m>d;this.scrollState.lastTargetOffset=s,h||(this.scrollState.behavior="auto"),this._scrollToOffset(s,{adjustments:void 0,behavior:h?"smooth":"auto"})}this.scheduleScrollReconcile()}}const fC=(e,n,r,i)=>{for(;e<=n;){const s=(e+n)/2|0,l=r(s);if(li)n=s-1;else return s}return e>0?e-1:0};function bI(e,n,r){let i=0;for(;i<=n;){const s=(i+n)/2|0,l=e[s*2];if(lr)n=s-1;else return s}return i>0?i-1:0}function xI(e,n,r,i,s){const l=e.length-1;if(e.length<=i)return{startIndex:0,endIndex:l};if(i===1&&s!==null){const h=bI(s,l,r);let y=h;const v=r+n;for(;ye[h].start,r),m=d;if(i===1)for(;m1){const h=Array(i).fill(0);for(;mv=0&&y.some(v=>v>=r);){const v=e[d];y[v.lane]=v.start,d--}d=Math.max(0,d-d%i),m=Math.min(l,m+(i-1-m%i))}return{startIndex:d,endIndex:m}}const Jh=typeof document<"u"?x.useLayoutEffect:x.useEffect;function SI({useFlushSync:e=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...i}){const s=x.useReducer(h=>h+1,0)[1],l=x.useRef({enabled:n,mode:r,container:null,lastSize:null,lastPositions:new WeakMap,prevRange:null});l.current.enabled=n,l.current.mode=r;const u=h=>{const y=l.current;if(!y.enabled||!y.container)return;const v=h.getTotalSize();if(v!==y.lastSize){y.lastSize=v;const T=h.options.horizontal?"width":"height";y.container.style[T]=`${v}px`}const b=!!h.options.horizontal,S=y.mode==="transform",_=b?"left":"top",C=h.options.scrollMargin,E=h.getVirtualItems();for(const T of E){const O=T.start-C,M=h.elementsCache.get(T.key);M&&y.lastPositions.get(M)!==O&&(y.lastPositions.set(M,O),S?M.style.transform=b?`translate3d(${O}px, 0, 0)`:`translate3d(0, ${O}px, 0)`:M.style[_]=`${O}px`)}},d={...i,onChange:(h,y)=>{var v;const b=l.current;let S=!0;if(b.enabled){u(h);const _=h.range,C=b.prevRange;S=!C||C.isScrolling!==h.isScrolling||C.startIndex!==_?.startIndex||C.endIndex!==_?.endIndex,S&&(b.prevRange=_?{startIndex:_.startIndex,endIndex:_.endIndex,isScrolling:h.isScrolling}:null)}S&&(e&&y?xi.flushSync(s):s()),(v=i.onChange)==null||v.call(i,h,y)}},[m]=x.useState(()=>{const h=new yI(d);return Object.assign(h,{containerRef:y=>{const v=l.current;if(v.container=y,v.lastSize=null,y&&v.enabled){const b=h.getTotalSize();v.lastSize=b;const S=h.options.horizontal?"width":"height";y.style[S]=`${b}px`}}})});return m.setOptions(d),Jh(()=>m._didMount(),[]),Jh(()=>m._willUpdate()),Jh(()=>{u(m)}),m}function wI(e){return SI({observeElementRect:dI,observeElementOffset:mI,scrollToFn:vI,...e})}function _I(e,n){const r=[],i=(s,l)=>{for(const u of s)r.push({node:u,depth:l}),u.dir&&n.has(u.path)&&i(u.children||[],l+1)};return i(e?.children||[],0),r}function CI(e){const{root:n,expanded:r,onToggle:i,currentPath:s,listingShowing:l,onOpen:u}=e,d=x.useRef(null),m=x.useMemo(()=>_I(n,r),[n,r]),h=wI({count:m.length,getScrollElement:()=>d.current,estimateSize:()=>window.matchMedia("(max-width: 768px)").matches?44:28,overscan:12,getItemKey:y=>m[y].node.path});return x.useEffect(()=>{if(!s)return;const y=m.findIndex(v=>v.node.path===s);y>=0&&h.scrollToIndex(y,{align:"auto"})},[s,m]),g.jsx("nav",{id:"tree","aria-label":"Files",ref:d,children:g.jsx("div",{style:{height:h.getTotalSize(),position:"relative"},children:h.getVirtualItems().map(y=>{const{node:v,depth:b}=m[y.index],S=v.dir?r.has(v.path):!1,_=()=>{if(v.dir&&s===v.path&&l){i(v.path);return}u(v.path),v.dir||fr()};return g.jsxs("div",{className:"row "+(v.dir?"dir":"file")+(s===v.path?" active":"")+(v.dir&&!S?" collapsed":""),"data-path":v.path,tabIndex:0,role:"button",title:v.name,"aria-expanded":v.dir?S:void 0,style:{position:"absolute",top:0,left:0,right:0,transform:`translateY(${y.start}px)`,paddingLeft:8+b*13},onClick:_,onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),_())},children:[Array.from({length:b},(C,E)=>g.jsx("span",{className:"tguide",style:{left:8+E*13+5},"aria-hidden":"true"},E)),g.jsx("span",{className:"chev",onClick:C=>{v.dir&&(C.stopPropagation(),i(v.path))},children:g.jsx(Yt,{name:"chevd"})}),g.jsx("span",{className:"ticon",children:g.jsx(Yt,{name:v.dir?"folder":"doc"})}),g.jsx("span",{className:"label",children:v.name})]},y.key)})})})}function EI(e){const n=e.split("/"),r=[];let i="";for(let s=0;s{i=i?i+"/"+s:s;const u=i,d=l===r.length-1;return g.jsxs("span",{children:[l>0&&g.jsx("span",{className:"crumb-sep",children:"/"}),d?g.jsx("span",{children:s}):g.jsx("span",{className:"crumb-seg",title:u,onClick:()=>n(u),children:s})]},u)})})}const TI={add:"plus",edit:"edit",delete:"x"},OI={add:"added",edit:"edited",delete:"deleted"};function hC({entry:e,onOpen:n}){const[r,i]=x.useState(!1),s=e.kind==="put"?"edit":e.kind,l=e.user_name?`${e.user_name} <${e.user}>`:e.user||e.author||"unknown",u=[e.device.name||e.device.id,e.device.os,e.device.ip].filter(Boolean).join(" · "),d=s!=="delete",m=h=>{h.target.tagName!=="A"&&d&&n(e.path)};return g.jsxs("div",{className:"hentry "+s+(d?" clickable":""),tabIndex:d?0:void 0,role:d?"button":void 0,onClick:m,onKeyDown:h=>{d&&(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),n(e.path))},children:[g.jsxs("div",{className:"hline",children:[g.jsx("span",{className:"hkind",children:g.jsx(Yt,{name:TI[s]||"dot"})}),g.jsx("span",{className:"hpath",children:e.path}),g.jsx("span",{className:"htag",children:OI[s]||s}),g.jsx("span",{className:"htime",children:new Date(e.time).toLocaleString()})]}),g.jsxs("div",{className:"hmeta",children:[g.jsx("span",{className:"hwho",children:l}),g.jsx("span",{className:"hdev",children:u}),g.jsx("span",{className:"hsize",children:e.size?tC(e.size):""})]}),e.note&&g.jsx("div",{className:"hnote"+(r?" open":""),tabIndex:0,role:"button",title:r?"Collapse note":"Show full note","aria-expanded":r,onClick:h=>{h.stopPropagation(),h.target.tagName!=="A"&&i(!r)},onKeyDown:h=>{(h.key==="Enter"||h.key===" ")&&(h.preventDefault(),h.stopPropagation(),i(!r))},children:e.note.split(/(https?:\/\/\S+)/).map((h,y)=>/^https?:\/\//.test(h)?g.jsx("a",{href:h,target:"_blank",rel:"noopener",children:h},y):h)})]})}function MI(e){const{node:n,heatMap:r,onOpen:i}=e,s=(n.children||[]).slice().sort((h,y)=>Number(y.dir||!1)-Number(h.dir||!1)||h.name.localeCompare(y.name)),l=s.filter(h=>h.dir).length,u=s.length-l,d=[];l&&d.push(l+(l===1?" folder":" folders")),u&&d.push(u+(u===1?" file":" files"));const m=Px(r,n.path,!0);return m&&d.push(nu(m)+" in 30 days"),g.jsxs("div",{className:"dirlist",children:[g.jsxs("h1",{className:"dl-title",children:[g.jsx("span",{className:"dl-title-icon",children:g.jsx(Yt,{name:"folder"})}),g.jsx("span",{children:n.name})]}),g.jsx("p",{className:"dl-sub",children:d.join(" · ")||"Empty folder"}),s.length===0?g.jsx("div",{className:"dl-empty",children:"Nothing in this folder yet."}):g.jsx("div",{className:"dl-items",children:s.map(h=>{let y="";if(h.dir){const b=(h.children||[]).length;y=b+(b===1?" item":" items")}else y=[h.size?tC(h.size):"",h.time?new Date(h.time).toLocaleDateString():""].filter(Boolean).join(" · ");const v=Px(r,h.path,!!h.dir);return v&&(y=nu(v)+(y?" · "+y:"")),g.jsxs("div",{className:"dl-row",tabIndex:0,role:"button",title:h.path,onClick:()=>i(h.path),onKeyDown:b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),i(h.path))},children:[g.jsx("span",{className:"ticon",children:g.jsx(Yt,{name:h.dir?"folder":"doc"})}),g.jsx("span",{className:"dl-name",children:h.name}),v&&g.jsx("span",{className:"heatdot lvl"+iI(v),title:nu(v)+" in 30 days"}),g.jsx("span",{className:"dl-meta",children:y})]},h.path)})}),e.hub&&g.jsx(AI,{apiBase:e.apiBase,prefix:n.path+"/",onOpen:i,onFullHistory:()=>e.onFullHistory(n.path+"/"),onRendered:e.onRendered})]})}function AI(e){const n=oI(e.apiBase,e.prefix,!0),{onRendered:r}=e;return x.useEffect(()=>{n&&n.length&&r&&r()},[n,r]),!n||n.length===0?null:g.jsxs("div",{className:"dl-history",children:[g.jsx("h3",{className:"dl-h3",children:"Recent changes"}),g.jsx("div",{className:"history dl-hlist",children:n.map((i,s)=>g.jsx(hC,{entry:i,onOpen:e.onOpen},s))}),g.jsx("button",{className:"ai-btn dl-more",onClick:e.onFullHistory,children:"Full history"})]})}function jI(e){const{apiBase:n,path:r,onMeta:i}=e,s=n+"file?path="+encodeURIComponent(r);return x.useEffect(()=>()=>i(""),[r,i]),T8.test(r)?g.jsx(zI,{...e}):eC.test(r)?g.jsx("iframe",{className:"htmlview",sandbox:"allow-scripts",src:s,title:r,onLoad:e.onRendered}):O8.test(r)?g.jsx(kI,{src:s,alt:r,onRendered:e.onRendered}):M8.test(r)?g.jsx(LI,{...e,fileURL:s}):g.jsxs("div",{className:"filecard",children:[g.jsx("div",{className:"name",children:r.split("/").pop()}),g.jsx("p",{children:"No preview for this file type."}),g.jsx("a",{className:"btn",download:!0,href:n+"download?path="+encodeURIComponent(r),children:"Download"})]})}function zI(e){const{apiBase:n,path:r,heatMap:i,flatFiles:s,onOpenFile:l,onMeta:u,onRendered:d}=e,{data:m,error:h}=jn({queryKey:["render",n,r],queryFn:()=>Fn(n+"render?path="+encodeURIComponent(r))}),y=x.useMemo(()=>m?DI(m.html,r,n):"",[m,r,n]);return x.useEffect(()=>{if(!m)return;const v=[];m.author&&v.push(m.author+(m.device?" on "+m.device:"")),m.time&&v.push(new Date(m.time).toLocaleString());const b=i&&i[m.path];b&&il(b)&&v.push(nu(b)+" / 30d"),u(v.join(" · ")),d?.()},[m,i,u,d]),h?g.jsxs("div",{className:"empty",children:["Could not load file: ",h.message]}):m?g.jsx("div",{dangerouslySetInnerHTML:{__html:y},onClick:v=>NI(v,r,s,l)}):null}function NI(e,n,r,i){const s=e.target.closest("a");if(!s||!e.currentTarget.contains(s))return;const l=s.getAttribute("href")||"",u=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"";l.startsWith("wiki:")?(e.preventDefault(),II(decodeURIComponent(l.slice(5)),r,i)):/^([a-z]+:|\/|#)/i.test(l)||(e.preventDefault(),i(nC(u,decodeURIComponent(l))))}function DI(e,n,r){const i=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"",s=u=>r+"file?path="+encodeURIComponent(u),l=new DOMParser().parseFromString(e,"text/html");for(const u of l.querySelectorAll("img")){const d=u.getAttribute("src")||"";/^([a-z]+:|\/)/i.test(d)||u.setAttribute("src",s(nC(i,d)))}for(const u of l.querySelectorAll("a")){const d=u.getAttribute("href")||"";/^https?:/i.test(d)&&(u.setAttribute("target","_blank"),u.setAttribute("rel","noopener"))}return l.body.innerHTML}function kI({src:e,alt:n,onRendered:r}){return g.jsx("img",{src:e,alt:n,onLoad:r})}function LI(e){const{path:n,fileURL:r,onRendered:i}=e,{data:s,error:l}=jn({queryKey:["text",r],queryFn:async()=>{const u=await fetch(r);if(!u.ok)throw new Error(await u.text());return u.text()}});return x.useEffect(()=>{s!=null&&i?.()},[s,i]),l?g.jsxs("div",{className:"empty",children:["Could not load file: ",l.message]}):s==null?null:g.jsx("pre",{className:"plain",children:s},n)}function II(e,n,r){const i=e.toLowerCase(),s=n.find(l=>l.path.toLowerCase()===i||l.path.toLowerCase()===i+".md")||n.find(l=>{const u=l.name.toLowerCase();return u===i||u===i+".md"});s&&r(s.path)}function $I({url:e,copied:n,onClose:r}){const i=e.split("/s/")[1];return g.jsx(zp,{open:!0,onOpenChange:s=>!s&&r(),children:g.jsxs(Np,{className:"modal",showCloseButton:!1,children:[g.jsx(Bu,{asChild:!0,children:g.jsx("h3",{children:"Public link created"})}),g.jsxs("p",{children:[g.jsx("b",{children:"Anyone with this link can view this file"})," — no account needed. It always shows the latest version until you revoke it."]}),g.jsx("div",{className:"modal-url",children:e}),g.jsxs("div",{className:"modal-actions",children:[g.jsx($t,{variant:"primary",onClick:()=>rl(e).then(s=>We(s?"Copied.":"Select and copy the link above.")),children:n?"Copied ✓":"Copy link"}),g.jsx($t,{variant:"subtle",onClick:()=>window.open(e,"_blank"),children:"Open"}),g.jsx($t,{variant:"subtle",className:"ai-del",onClick:async()=>{try{await zo("DELETE","/api/shares/"+i),We("Link revoked — it no longer works."),r()}catch(s){We(s.message,!0)}},children:"Revoke"}),g.jsx($t,{variant:"subtle",onClick:r,children:"Done"})]})]})})}var Bx=1,VI=.9,FI=.8,PI=.17,Wh=.1,em=.999,UI=.9999,HI=.99,BI=/[\\\/_+.#"@\[\(\{&]/,qI=/[\\\/_+.#"@\[\(\{&]/g,GI=/[\s-]/,mC=/[\s-]/g;function Fm(e,n,r,i,s,l,u){if(l===n.length)return s===e.length?Bx:HI;var d=`${s},${l}`;if(u[d]!==void 0)return u[d];for(var m=i.charAt(l),h=r.indexOf(m,s),y=0,v,b,S,_;h>=0;)v=Fm(e,n,r,i,h+1,l+1,u),v>y&&(h===s?v*=Bx:BI.test(e.charAt(h-1))?(v*=FI,S=e.slice(s,h-1).match(qI),S&&s>0&&(v*=Math.pow(em,S.length))):GI.test(e.charAt(h-1))?(v*=VI,_=e.slice(s,h-1).match(mC),_&&s>0&&(v*=Math.pow(em,_.length))):(v*=PI,s>0&&(v*=Math.pow(em,h-s))),e.charAt(h)!==n.charAt(l)&&(v*=UI)),(vv&&(v=b*Wh)),v>y&&(y=v),h=r.indexOf(m,h+1);return u[d]=y,y}function qx(e){return e.toLowerCase().replace(mC," ")}function ZI(e,n,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,Fm(e,n,qx(e),qx(n),0,0,{})}var ks='[cmdk-group=""]',tm='[cmdk-group-items=""]',KI='[cmdk-group-heading=""]',pC='[cmdk-item=""]',Gx=`${pC}:not([aria-disabled="true"])`,Pm="cmdk-item-select",xa="data-value",YI=(e,n,r)=>ZI(e,n,r),gC=x.createContext(void 0),yl=()=>x.useContext(gC),vC=x.createContext(void 0),Wp=()=>x.useContext(vC),yC=x.createContext(void 0),bC=x.forwardRef((e,n)=>{let r=Sa(()=>{var j,U;return{search:"",value:(U=(j=e.value)!=null?j:e.defaultValue)!=null?U:"",selectedItemId:void 0,filtered:{count:0,items:new Map,groups:new Set}}}),i=Sa(()=>new Set),s=Sa(()=>new Map),l=Sa(()=>new Map),u=Sa(()=>new Set),d=xC(e),{label:m,children:h,value:y,onValueChange:v,filter:b,shouldFilter:S,loop:_,disablePointerSelection:C=!1,vimBindings:E=!0,...T}=e,O=hn(),M=hn(),k=hn(),L=x.useRef(null),q=a$();bi(()=>{if(y!==void 0){let j=y.trim();r.current.value=j,H.emit()}},[y]),bi(()=>{q(6,ae)},[]);let H=x.useMemo(()=>({subscribe:j=>(u.current.add(j),()=>u.current.delete(j)),snapshot:()=>r.current,setState:(j,U,Q)=>{var Z,re,ee,ge;if(!Object.is(r.current[j],U)){if(r.current[j]=U,j==="search")le(),ve(),q(1,de);else if(j==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let be=document.getElementById(k);be?be.focus():(Z=document.getElementById(O))==null||Z.focus()}if(q(7,()=>{var be;r.current.selectedItemId=(be=me())==null?void 0:be.id,H.emit()}),Q||q(5,ae),((re=d.current)==null?void 0:re.value)!==void 0){let be=U??"";(ge=(ee=d.current).onValueChange)==null||ge.call(ee,be);return}}H.emit()}},emit:()=>{u.current.forEach(j=>j())}}),[]),$=x.useMemo(()=>({value:(j,U,Q)=>{var Z;U!==((Z=l.current.get(j))==null?void 0:Z.value)&&(l.current.set(j,{value:U,keywords:Q}),r.current.filtered.items.set(j,he(U,Q)),q(2,()=>{ve(),H.emit()}))},item:(j,U)=>(i.current.add(j),U&&(s.current.has(U)?s.current.get(U).add(j):s.current.set(U,new Set([j]))),q(3,()=>{le(),ve(),r.current.value||de(),H.emit()}),()=>{l.current.delete(j),i.current.delete(j),r.current.filtered.items.delete(j);let Q=me();q(4,()=>{le(),Q?.getAttribute("id")===j&&de(),H.emit()})}),group:j=>(s.current.has(j)||s.current.set(j,new Set),()=>{l.current.delete(j),s.current.delete(j)}),filter:()=>d.current.shouldFilter,label:m||e["aria-label"],getDisablePointerSelection:()=>d.current.disablePointerSelection,listId:O,inputId:k,labelId:M,listInnerRef:L}),[]);function he(j,U){var Q,Z;let re=(Z=(Q=d.current)==null?void 0:Q.filter)!=null?Z:YI;return j?re(j,r.current.search,U):0}function ve(){if(!r.current.search||d.current.shouldFilter===!1)return;let j=r.current.filtered.items,U=[];r.current.filtered.groups.forEach(Z=>{let re=s.current.get(Z),ee=0;re.forEach(ge=>{let be=j.get(ge);ee=Math.max(be,ee)}),U.push([Z,ee])});let Q=L.current;ye().sort((Z,re)=>{var ee,ge;let be=Z.getAttribute("id"),De=re.getAttribute("id");return((ee=j.get(De))!=null?ee:0)-((ge=j.get(be))!=null?ge:0)}).forEach(Z=>{let re=Z.closest(tm);re?re.appendChild(Z.parentElement===re?Z:Z.closest(`${tm} > *`)):Q.appendChild(Z.parentElement===Q?Z:Z.closest(`${tm} > *`))}),U.sort((Z,re)=>re[1]-Z[1]).forEach(Z=>{var re;let ee=(re=L.current)==null?void 0:re.querySelector(`${ks}[${xa}="${encodeURIComponent(Z[0])}"]`);ee?.parentElement.appendChild(ee)})}function de(){let j=ye().find(Q=>Q.getAttribute("aria-disabled")!=="true"),U=j?.getAttribute(xa);H.setState("value",U||void 0)}function le(){var j,U,Q,Z;if(!r.current.search||d.current.shouldFilter===!1){r.current.filtered.count=i.current.size;return}r.current.filtered.groups=new Set;let re=0;for(let ee of i.current){let ge=(U=(j=l.current.get(ee))==null?void 0:j.value)!=null?U:"",be=(Z=(Q=l.current.get(ee))==null?void 0:Q.keywords)!=null?Z:[],De=he(ge,be);r.current.filtered.items.set(ee,De),De>0&&re++}for(let[ee,ge]of s.current)for(let be of ge)if(r.current.filtered.items.get(be)>0){r.current.filtered.groups.add(ee);break}r.current.filtered.count=re}function ae(){var j,U,Q;let Z=me();Z&&(((j=Z.parentElement)==null?void 0:j.firstChild)===Z&&((Q=(U=Z.closest(ks))==null?void 0:U.querySelector(KI))==null||Q.scrollIntoView({block:"nearest"})),Z.scrollIntoView({block:"nearest"}))}function me(){var j;return(j=L.current)==null?void 0:j.querySelector(`${pC}[aria-selected="true"]`)}function ye(){var j;return Array.from(((j=L.current)==null?void 0:j.querySelectorAll(Gx))||[])}function D(j){let U=ye()[j];U&&H.setState("value",U.getAttribute(xa))}function Y(j){var U;let Q=me(),Z=ye(),re=Z.findIndex(ge=>ge===Q),ee=Z[re+j];(U=d.current)!=null&&U.loop&&(ee=re+j<0?Z[Z.length-1]:re+j===Z.length?Z[0]:Z[re+j]),ee&&H.setState("value",ee.getAttribute(xa))}function ne(j){let U=me(),Q=U?.closest(ks),Z;for(;Q&&!Z;)Q=j>0?o$(Q,ks):i$(Q,ks),Z=Q?.querySelector(Gx);Z?H.setState("value",Z.getAttribute(xa)):Y(j)}let J=()=>D(ye().length-1),W=j=>{j.preventDefault(),j.metaKey?J():j.altKey?ne(1):Y(1)},z=j=>{j.preventDefault(),j.metaKey?D(0):j.altKey?ne(-1):Y(-1)};return x.createElement($e.div,{ref:n,tabIndex:-1,...T,"cmdk-root":"",onKeyDown:j=>{var U;(U=T.onKeyDown)==null||U.call(T,j);let Q=j.nativeEvent.isComposing||j.keyCode===229;if(!(j.defaultPrevented||Q))switch(j.key){case"n":case"j":{E&&j.ctrlKey&&W(j);break}case"ArrowDown":{W(j);break}case"p":case"k":{E&&j.ctrlKey&&z(j);break}case"ArrowUp":{z(j);break}case"Home":{j.preventDefault(),D(0);break}case"End":{j.preventDefault(),J();break}case"Enter":{j.preventDefault();let Z=me();if(Z){let re=new Event(Pm);Z.dispatchEvent(re)}}}}},x.createElement("label",{"cmdk-label":"",htmlFor:$.inputId,id:$.labelId,style:l$},m),rd(e,j=>x.createElement(vC.Provider,{value:H},x.createElement(gC.Provider,{value:$},j))))}),QI=x.forwardRef((e,n)=>{var r,i;let s=hn(),l=x.useRef(null),u=x.useContext(yC),d=yl(),m=xC(e),h=(i=(r=m.current)==null?void 0:r.forceMount)!=null?i:u?.forceMount;bi(()=>{if(!h)return d.item(s,u?.id)},[h]);let y=SC(s,l,[e.value,e.children,l],e.keywords),v=Wp(),b=Io(q=>q.value&&q.value===y.current),S=Io(q=>h||d.filter()===!1?!0:q.search?q.filtered.items.get(s)>0:!0);x.useEffect(()=>{let q=l.current;if(!(!q||e.disabled))return q.addEventListener(Pm,_),()=>q.removeEventListener(Pm,_)},[S,e.onSelect,e.disabled]);function _(){var q,H;C(),(H=(q=m.current).onSelect)==null||H.call(q,y.current)}function C(){v.setState("value",y.current,!0)}if(!S)return null;let{disabled:E,value:T,onSelect:O,forceMount:M,keywords:k,...L}=e;return x.createElement($e.div,{ref:ja(l,n),...L,id:s,"cmdk-item":"",role:"option","aria-disabled":!!E,"aria-selected":!!b,"data-disabled":!!E,"data-selected":!!b,onPointerMove:E||d.getDisablePointerSelection()?void 0:C,onClick:E?void 0:_},e.children)}),XI=x.forwardRef((e,n)=>{let{heading:r,children:i,forceMount:s,...l}=e,u=hn(),d=x.useRef(null),m=x.useRef(null),h=hn(),y=yl(),v=Io(S=>s||y.filter()===!1?!0:S.search?S.filtered.groups.has(u):!0);bi(()=>y.group(u),[]),SC(u,d,[e.value,e.heading,m]);let b=x.useMemo(()=>({id:u,forceMount:s}),[s]);return x.createElement($e.div,{ref:ja(d,n),...l,"cmdk-group":"",role:"presentation",hidden:v?void 0:!0},r&&x.createElement("div",{ref:m,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),rd(e,S=>x.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},x.createElement(yC.Provider,{value:b},S))))}),JI=x.forwardRef((e,n)=>{let{alwaysRender:r,...i}=e,s=x.useRef(null),l=Io(u=>!u.search);return!r&&!l?null:x.createElement($e.div,{ref:ja(s,n),...i,"cmdk-separator":"",role:"separator"})}),WI=x.forwardRef((e,n)=>{let{onValueChange:r,...i}=e,s=e.value!=null,l=Wp(),u=Io(h=>h.search),d=Io(h=>h.selectedItemId),m=yl();return x.useEffect(()=>{e.value!=null&&l.setState("search",e.value)},[e.value]),x.createElement($e.input,{ref:n,...i,"cmdk-input":"",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-autocomplete":"list",role:"combobox","aria-expanded":!0,"aria-controls":m.listId,"aria-labelledby":m.labelId,"aria-activedescendant":d,id:m.inputId,type:"text",value:s?e.value:u,onChange:h=>{s||l.setState("search",h.target.value),r?.(h.target.value)}})}),e$=x.forwardRef((e,n)=>{let{children:r,label:i="Suggestions",...s}=e,l=x.useRef(null),u=x.useRef(null),d=Io(h=>h.selectedItemId),m=yl();return x.useEffect(()=>{if(u.current&&l.current){let h=u.current,y=l.current,v,b=new ResizeObserver(()=>{v=requestAnimationFrame(()=>{let S=h.offsetHeight;y.style.setProperty("--cmdk-list-height",S.toFixed(1)+"px")})});return b.observe(h),()=>{cancelAnimationFrame(v),b.unobserve(h)}}},[]),x.createElement($e.div,{ref:ja(l,n),...s,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":d,"aria-label":i,id:m.listId},rd(e,h=>x.createElement("div",{ref:ja(u,m.listInnerRef),"cmdk-list-sizer":""},h)))}),t$=x.forwardRef((e,n)=>{let{open:r,onOpenChange:i,overlayClassName:s,contentClassName:l,container:u,...d}=e;return x.createElement(Wm,{open:r,onOpenChange:i},x.createElement(tp,{container:u},x.createElement(np,{"cmdk-overlay":"",className:s}),x.createElement(rp,{"aria-label":e.label,"cmdk-dialog":"",className:l},x.createElement(bC,{ref:n,...d}))))}),n$=x.forwardRef((e,n)=>Io(r=>r.filtered.count===0)?x.createElement($e.div,{ref:n,...e,"cmdk-empty":"",role:"presentation"}):null),r$=x.forwardRef((e,n)=>{let{progress:r,children:i,label:s="Loading...",...l}=e;return x.createElement($e.div,{ref:n,...l,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":s},rd(e,u=>x.createElement("div",{"aria-hidden":!0},u)))}),nd=Object.assign(bC,{List:e$,Item:QI,Input:WI,Group:XI,Separator:JI,Dialog:t$,Empty:n$,Loading:r$});function o$(e,n){let r=e.nextElementSibling;for(;r;){if(r.matches(n))return r;r=r.nextElementSibling}}function i$(e,n){let r=e.previousElementSibling;for(;r;){if(r.matches(n))return r;r=r.previousElementSibling}}function xC(e){let n=x.useRef(e);return bi(()=>{n.current=e}),n}var bi=typeof window>"u"?x.useEffect:x.useLayoutEffect;function Sa(e){let n=x.useRef();return n.current===void 0&&(n.current=e()),n}function Io(e){let n=Wp(),r=()=>e(n.snapshot());return x.useSyncExternalStore(n.subscribe,r,r)}function SC(e,n,r,i=[]){let s=x.useRef(),l=yl();return bi(()=>{var u;let d=(()=>{var h;for(let y of r){if(typeof y=="string")return y.trim();if(typeof y=="object"&&"current"in y)return y.current?(h=y.current.textContent)==null?void 0:h.trim():s.current}})(),m=i.map(h=>h.trim());l.value(e,d,m),(u=n.current)==null||u.setAttribute(xa,d),s.current=d}),s}var a$=()=>{let[e,n]=x.useState(),r=Sa(()=>new Map);return bi(()=>{r.current.forEach(i=>i()),r.current=new Map},[e]),(i,s)=>{r.current.set(i,s),n({})}};function s$(e){let n=e.type;return typeof n=="function"?n(e.props):"render"in n?n.render(e.props):e}function rd({asChild:e,children:n},r){return e&&x.isValidElement(n)?x.cloneElement(s$(n),{ref:n.ref},r(n.props.children)):r(n)}var l$={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function c$({className:e,...n}){return g.jsx(nd,{"data-slot":"command",className:et("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",e),...n})}function u$({className:e,...n}){return g.jsxs("div",{"data-slot":"command-input-wrapper",className:"flex h-9 items-center gap-2 border-b px-3",children:[g.jsx(G1,{className:"size-4 shrink-0 opacity-50"}),g.jsx(nd.Input,{"data-slot":"command-input",className:et("flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",e),...n})]})}function d$({className:e,...n}){return g.jsx(nd.List,{"data-slot":"command-list",className:et("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",e),...n})}function f$({className:e,...n}){return g.jsx(nd.Item,{"data-slot":"command-item",className:et("relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",e),...n})}function Zx(e,n){if(!e)return{score:0,hits:[]};const r=e.toLowerCase(),i=n.toLowerCase();let s=0,l=0,u=0;const d=[];for(let m=0;m3&&i.endsWith("ies")?s=i.slice(0,-3)+"y":i.length>3&&i.endsWith("es")?s=i.slice(0,-2):i.length>2&&i.endsWith("s")&&(s=i.slice(0,-1)),s?Zx(s,n):null}function m$({text:e,hits:n}){const r=[];let i=0;return n.forEach((s,l)=>{s>i&&r.push(e.slice(i,s)),r.push(g.jsx("b",{children:e[s]},l)),i=s+1}),r.push(e.slice(i)),g.jsx("span",{className:"plabel",children:r})}function p$({open:e,onClose:n,candidates:r}){const[i,s]=x.useState(""),l=x.useMemo(()=>{if(!e)return[];const d=[];for(const m of r()){const h=h$(i,m.label);h&&d.push({...m,score:h.score,hits:h.hits})}return d.sort((m,h)=>h.score-m.score),d.slice(0,40)},[e,i,r]);x.useEffect(()=>{e&&s("")},[e]);const u=d=>{n(),d.run()};return g.jsx(zp,{open:e,onOpenChange:d=>!d&&n(),children:g.jsxs(Np,{id:"palette",className:"palette",showCloseButton:!1,"aria-describedby":void 0,children:[g.jsx(Bu,{className:"sr-only",children:"Search and quick actions"}),g.jsxs(c$,{shouldFilter:!1,loop:!0,children:[g.jsxs("div",{id:"palette-inputwrap",children:[g.jsx(Yt,{name:"search"}),g.jsx(u$,{id:"palette-input",placeholder:"Search file names, projects, actions…",autoComplete:"off",spellCheck:!1,value:i,onValueChange:s})]}),g.jsx(d$,{id:"palette-results",children:l.length===0?g.jsx("div",{className:"pempty",children:"No matches — search covers file names, projects, and actions"}):l.map(d=>g.jsxs(f$,{value:d.kind+":"+d.label,onSelect:()=>u(d),children:[g.jsx("span",{className:"picon",children:g.jsx(Yt,{name:d.icon})}),g.jsx(m$,{text:d.label,hits:d.hits}),g.jsx("span",{className:"pkind",children:d.kind})]},d.kind+":"+d.label))}),g.jsx("footer",{id:"palette-hint",children:"↑↓ navigate · ⏎ select · esc close"})]})]})})}const Vs=3,wa=30;function g$(e,n){return jn({queryKey:["heatDevices",e],queryFn:()=>Fn(e+"heat?by=device&days=30"),enabled:n,retry:!1,staleTime:6e4}).data?.devices??null}function Kx(e){const[n,r]=x.useState("all"),{flatFiles:i,heatMap:s,devices:l,scope:u}=e,d=b=>!u||b===u||b.startsWith(u+"/"),m=u?i.filter(b=>d(b.path)):i,h=l&&u?l.map(b=>{const S={};for(const[_,C]of Object.entries(b.folders||{}))d(_)&&(S[_]=C);return{...b,folders:S}}).filter(b=>Object.keys(b.folders).length>0):l,y=Date.now(),v=m.map(b=>{const S=s&&s[b.path]||{},_=b.time?Math.max(0,(y-new Date(b.time).getTime())/864e5):0,C=n==="all"?il(S):S[n]||0;return{path:b.path,reads:C,agent:S.agent||0,total:il(S),days:_,danger:C>=Vs&&_>=wa}});return g.jsxs("div",{className:"insights",children:[g.jsxs("h1",{className:"in-title",children:["Knowledge insights",u?g.jsxs("span",{className:"in-scope",children:[" · ",u]}):null]}),g.jsx("p",{className:"dl-sub",children:u?`Reads over the last 30 days × freshness, for ${u} and everything in it.`:"Reads over the last 30 days × how long since each file changed. Hot but stale knowledge — read a lot, maintained by nobody — is the danger zone."}),g.jsx("div",{className:"in-lens",children:["all","human","agent"].map(b=>g.jsx("button",{className:"in-lens-btn"+(b===n?" active":""),onClick:()=>r(b),children:b==="all"?"All reads":b==="human"?"Human reads":"Agent reads"},b))}),g.jsx("h3",{className:"dl-h3",children:"Map — cell size = reads, color = freshness"}),g.jsx(y$,{pts:v,onOpenFile:e.onOpenFile,onOpenFolder:e.onOpenFolder,isFolder:e.isFolder}),g.jsx("h3",{className:"dl-h3",children:"Reads × freshness"}),g.jsx(b$,{pts:v,onOpenFile:e.onOpenFile}),g.jsx("h3",{className:"dl-h3",children:"Hot path — top files by reads"}),g.jsx(x$,{pts:v,lens:n,onOpenFile:e.onOpenFile}),h&&h.length>0&&g.jsxs(g.Fragment,{children:[g.jsx("h3",{className:"dl-h3",children:"Agent coverage — which agents read which areas"}),g.jsx(S$,{devices:h})]})]})}function v$(e){const n=[[76,195,138],[232,196,84],[224,93,93]],r=Math.min(1,Math.max(0,e/300))*(n.length-1),i=Math.min(n.length-2,Math.floor(r)),s=r-i,l=n[i].map((u,d)=>Math.round(u+(n[i+1][d]-u)*s));return`rgb(${l[0]},${l[1]},${l[2]})`}function Yx(e,n,r,i,s){const l=e.reduce((h,y)=>h+y.value,0);if(!l||i<=0||s<=0)return[];const u=e.slice().sort((h,y)=>y.value-h.value).map(h=>({it:h,a:h.value/l*i*s})),d=(h,y)=>{const b=h.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of h){const C=_.a/b;S=Math.max(S,C/b,b/C)}return S},m=[];for(;u.length;){const h=i>=s,y=h?s:i,v=[u.shift()];for(;u.length&&d(v.concat(u[0]),y)<=d(v,y);)v.push(u.shift());const b=v.reduce((_,C)=>_+C.a,0)/y;let S=0;for(const _ of v){const C=_.a/b;h?m.push({item:_.it,x:n,y:r+S,w:b,h:C}):m.push({item:_.it,x:n+S,y:r,w:C,h:b}),S+=C}h?(n+=b,i-=b):(r+=b,s-=b)}return m}const nm=15;function y$({pts:e,onOpenFile:n,onOpenFolder:r,isFolder:i}){const u=new Map;for(const m of e){const h=m.path.includes("/")?m.path.split("/")[0]:"/";let y=u.get(h);y||u.set(h,y={name:h,files:[],value:0}),y.files.push(m),y.value+=m.reads+1}const d=[];for(const m of Yx([...u.values()],0,0,720,480)){const h=m.item,y=h.name==="/"?"":h.name;if(d.push(g.jsx("rect",{x:m.x+1,y:m.y+1,width:Math.max(0,m.w-2),height:Math.max(0,m.h-2),rx:3,className:"in-tm-group","data-dir":y},"g"+h.name)),m.w>46&&m.h>nm+10){let b=h.name==="/"?"(root)":h.name;const S=Math.floor((m.w-8)/6);b.length>S&&(b=b.slice(0,Math.max(1,S-1))+"…"),d.push(g.jsx("text",{x:m.x+5,y:m.y+12,className:"in-tm-glabel","data-dir":y,children:b},"gl"+h.name))}const v=Yx(h.files.map(b=>({...b,name:b.path.split("/").pop(),value:b.reads+1})),m.x+2,m.y+nm,Math.max(0,m.w-4),Math.max(0,m.h-nm-2));for(const b of v)if(d.push(g.jsx("rect",{x:b.x+.6,y:b.y+.6,width:Math.max(.4,b.w-1.2),height:Math.max(.4,b.h-1.2),rx:1.5,fill:v$(b.item.days),className:"in-tm-cell","data-path":b.item.path,children:g.jsx("title",{children:`${b.item.path} — ${b.item.reads} read${b.item.reads===1?"":"s"}/30d · changed ${Math.round(b.item.days)}d ago`})},b.item.path)),b.w>54&&b.h>16){const S=Math.floor((b.w-8)/6);let _=(b.item.danger?"⚠ ":"")+b.item.name;_.length>S&&(_=_.slice(0,Math.max(1,S-1))+"…"),S>=5&&d.push(g.jsx("text",{x:b.x+4.5,y:b.y+12.5,className:"in-tm-label","data-path":b.item.path,children:_},"l"+b.item.path))}}return g.jsx("svg",{viewBox:"0 0 720 480",className:"in-chart in-treemap",onClick:m=>{const h=m.target.closest("[data-path], [data-dir]");if(!h)return;const y=h.getAttribute("data-path");if(y)return n(y);const v=h.getAttribute("data-dir");v&&i(v)&&r(v)},children:d})}function b$({pts:e,onOpenFile:n}){const s={l:44,r:16,t:20,b:34},l=Math.max(wa*2,...e.map(v=>v.days)),u=Math.max(Vs*2,...e.map(v=>v.reads)),d=v=>Math.log10(v+1)/Math.log10(l+1),m=v=>Math.log10(v+1)/Math.log10(u+1),h=v=>s.l+d(v)*(720-s.l-s.r),y=v=>360-s.b-m(v)*(360-s.t-s.b);return g.jsxs("svg",{viewBox:"0 0 720 360",className:"in-chart",children:[g.jsx("rect",{x:h(wa),y:s.t,width:720-s.r-h(wa),height:y(Vs)-s.t,className:"in-danger-zone"}),g.jsx("line",{x1:h(wa),y1:s.t,x2:h(wa),y2:360-s.b,className:"in-threshold"}),g.jsx("line",{x1:s.l,y1:y(Vs),x2:720-s.r,y2:y(Vs),className:"in-threshold"}),g.jsx("line",{x1:s.l,y1:360-s.b,x2:720-s.r,y2:360-s.b,className:"in-axis"}),g.jsx("line",{x1:s.l,y1:s.t,x2:s.l,y2:360-s.b,className:"in-axis"}),g.jsx("text",{x:(s.l+720-s.r)/2,y:352,className:"in-label",children:"days since last change →"}),g.jsx("text",{x:12,y:(s.t+360-s.b)/2,className:"in-label",transform:`rotate(-90 12 ${(s.t+360-s.b)/2})`,children:"reads / 30d →"}),g.jsx("text",{x:720-s.r-6,y:s.t+14,className:"in-quad in-quad-danger",textAnchor:"end",children:"hot + stale"}),g.jsx("text",{x:s.l+6,y:s.t+14,className:"in-quad",children:"hot + fresh"}),g.jsx("text",{x:720-s.r-6,y:360-s.b-8,className:"in-quad",textAnchor:"end",children:"cold + stale"}),g.jsx("text",{x:720-s.r-6,y:s.t+28,className:"in-label",textAnchor:"end",children:"dot size = agent share of reads"}),e.map(v=>{const b=v.total?(v.agent||0)/v.total:0;return g.jsx("circle",{cx:Number(h(v.days).toFixed(1)),cy:Number(y(v.reads).toFixed(1)),r:Number((3+4*b).toFixed(1)),className:"in-pt"+(v.danger?" danger":v.reads?"":" cold"),onClick:()=>n(v.path),children:g.jsx("title",{children:`${v.path} — ${v.reads} read${v.reads===1?"":"s"} / 30d · changed ${Math.round(v.days)}d ago`})},v.path)})]})}function x$({pts:e,lens:n,onOpenFile:r}){const i=e.filter(l=>l.reads>0).sort((l,u)=>u.reads-l.reads||u.days-l.days).slice(0,20);if(!i.length)return g.jsx("div",{className:"dl-empty",children:"No reads in the window yet."});const s=i[0].reads;return g.jsxs(g.Fragment,{children:[g.jsx("div",{className:"in-hotpath",children:i.map(l=>{const u=n==="agent"?1:n==="human"?0:l.total?l.agent/l.total:0,d=l.reads/s*100;return g.jsxs("div",{className:"in-hp-row",tabIndex:0,role:"button",title:l.danger?`${l.reads} read${l.reads===1?"":"s"}/30d · unchanged ${Math.round(l.days)}d — review this file`:l.path,onClick:()=>r(l.path),onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),r(l.path))},children:[g.jsx("span",{className:"in-hp-name"+(l.danger?" danger":""),children:l.path+(l.danger?" ⚠":"")}),g.jsxs("span",{className:"in-hp-bar",children:[g.jsx("span",{className:"in-hp-agent",style:{width:(d*u).toFixed(1)+"%"}}),g.jsx("span",{className:"in-hp-human",style:{width:(d*(1-u)).toFixed(1)+"%"}})]}),g.jsx("span",{className:"in-hp-count",children:l.reads})]},l.path)})}),g.jsxs("p",{className:"in-legend",children:[g.jsx("span",{className:"in-sw agent"})," agent reads ",g.jsx("span",{className:"in-sw human"})," human reads"]})]})}function S$({devices:e}){const n=new Map;for(const b of e)for(const[S,_]of Object.entries(b.folders||{}))n.set(S,(n.get(S)||0)+_);const r=[...n.entries()].sort((b,S)=>S[1]-b[1]).slice(0,12).map(b=>b[0]),i=e.slice(0,12),s=140,l=6,u=Math.min(76,Math.max(34,(720-s-8)/r.length)),d=26,m=720,h=l+i.length*d+58,y=Math.max(1,...i.flatMap(b=>r.map(S=>(b.folders||{})[S]||0))),v=b=>{const S=[23,25,31],_=[245,166,35],C=S.map((E,T)=>Math.round(E+(_[T]-E)*b));return`rgb(${C[0]},${C[1]},${C[2]})`};return g.jsxs("svg",{viewBox:`0 0 ${m} ${h}`,className:"in-chart in-matrix",children:[i.map((b,S)=>{let _=b.name||b.id||"";return _.length>20&&(_=_.slice(0,19)+"…"),g.jsxs("g",{children:[g.jsx("text",{x:s-8,y:l+S*d+17,textAnchor:"end",className:"in-label",children:_}),r.map((C,E)=>{const T=(b.folders||{})[C]||0;return g.jsx("rect",{x:s+E*u,y:l+S*d,width:u-4,height:d-4,rx:3,fill:v(Math.sqrt(T/y)),children:g.jsx("title",{children:`${b.name||b.id} × ${C||"(root)"}: ${T} read${T===1?"":"s"}/30d`})},C)})]},b.id||S)}),r.map((b,S)=>{const _=s+S*u+(u-4)/2,C=l+i.length*d+14;return g.jsx("text",{x:_,y:C,className:"in-label",textAnchor:"end",transform:`rotate(-28 ${_} ${C})`,children:b||"(root)"},b)})]})}function w$(e){const{apiBase:n,target:r,isFolder:i,onMeta:s,onRendered:l}=e,u=r?i(r)?{prefix:r+"/"}:{path:r}:{prefix:""},d="path"in u&&u.path!==void 0?"path="+encodeURIComponent(u.path):"prefix="+encodeURIComponent(u.prefix??""),{data:m,error:h}=jn({queryKey:["history",n,d,200],queryFn:()=>Fn(n+"history?"+d+"&n=200"),staleTime:15e3});if(x.useEffect(()=>{h&&s("History unavailable: "+h.message)},[h,s]),x.useEffect(()=>{m&&l?.()},[m,l]),!m)return null;const y=m.entries||[];return g.jsxs("div",{className:"history",children:[y.length===0&&g.jsx("div",{className:"empty",children:"No history yet."}),y.map((v,b)=>g.jsx(hC,{entry:v,onOpen:e.onOpen},b))]})}function _$(e,n){return e?n(e)?e+"/ (folder)":e:"all changes"}function wC(e){const{config:n,apiBase:r,route:i,hub:s,project:l}=e,u=Ip(),d=sl(),{tree:m,flatFiles:h,dirIndex:y,loaded:v}=nI(r,!s||!!l),b=rI(r,s&&!!l&&!!n.reads?.enabled),S=s&&!!l&&!i.path&&!i.view,_=!!e.canInsights&&(i.view==="insights"||S),C=g$(r,_);x.useEffect(()=>{_&&d.invalidateQueries({queryKey:["heat",r]})},[_,r,d]);const E=i.path,T=E||(i.view==="insights"||i.view==="history")&&i.viewTarget||"",O=!!E&&y.has(E),M=!!E&&v&&!O&&h.some(Fe=>Fe.path===E),k=!!E&&v&&!O&&!M,L=O&&!i.view,[q,H]=x.useState(()=>new Set),$=x.useRef(!0);x.useEffect(()=>{if(!m||!$.current)return;$.current=!1;const Fe=(m.children||[]).filter(Ne=>Ne.dir);Fe.length===1&&H(Ne=>new Set(Ne).add(Fe[0].path))},[m]),x.useEffect(()=>{!T||!v||H(Fe=>{const Ne=new Set(Fe);for(const Je of EI(T))Ne.add(Je);return y.has(T)&&Ne.add(T),Ne})},[T,v,y]);const he=x.useCallback(Fe=>{H(Ne=>{const Je=new Set(Ne);return Je.has(Fe)?Je.delete(Fe):Je.add(Fe),Je})},[]),ve=x.useRef(null),de=x.useRef(new Map),le=x.useRef({key:"",want:0,attempts:0});x.useEffect(()=>{le.current={key:u,want:Vk()==="POP"?de.current.get(u)??0:0,attempts:0}},[u]);const ae=x.useCallback(()=>{const Fe=ve.current,Ne=le.current;!Fe||Ne.key!==u||Ne.attempts>=3||(Ne.attempts++,Fe.scrollTo({top:Ne.want,behavior:"instant"}))},[u]),me=x.useCallback(()=>{ve.current&&de.current.set(u,ve.current.scrollTop)},[u]),ye=x.useCallback(Fe=>{fn($k(Fe,l?.id)),fr()},[l?.id]),D=x.useCallback(Fe=>fn(_a("history",l?.id,Fe)),[l?.id]),[Y,ne]=x.useState(""),[J,W]=x.useState(null),[z,j]=x.useState(!1),[U,Q]=x.useState(!1);x.useEffect(()=>Wz(()=>Q(!0)),[]);const Z=x.useRef(null),re=e.panel??null,ee=!re&&s&&!!l&&M,ge=!re&&s&&!!l,be=!re&&M,De=!re&&(M||s&&!!l&&O),Ve=r+"download?path="+encodeURIComponent(E),Ue=x.useCallback(async()=>{try{const Fe=await fetch(r+"shares",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:E})});if(!Fe.ok)throw new Error(await Fe.text());const Ne=await Fe.json(),Je=await rl(Ne.url);W({url:Ne.url,copied:Je})}catch(Fe){We("Share failed: "+Fe.message,!0)}},[r,E]),lt=x.useCallback(()=>{if(!E)return D("");D(O?E+"/":E)},[E,O,D]);x.useEffect(()=>{const Fe=Ne=>{(Ne.metaKey||Ne.ctrlKey)&&Ne.key.toLowerCase()==="k"&&(Ne.preventDefault(),Q(Je=>!Je))};return window.addEventListener("keydown",Fe),()=>window.removeEventListener("keydown",Fe)},[]);const Xe=x.useCallback(()=>{const Fe=[],Ne=(Je,zt,eo,or)=>Fe.push({icon:Je,label:zt,kind:eo,run:or});if(s&&l&&E&&(M&&Ne("share","Share: "+E,"action",Ue),Ne("hist","History: "+E,"action",lt),M&&Ne("download","Download: "+E,"action",()=>Z.current?.click())),s&&l&&Ne("hist","History: whole project","action",()=>D("")),s)for(const Je of e.projects||[])(!l||Je.id!==l.id)&&Ne("folder","Switch to project: "+Je.name,"project",()=>fn("/"+Je.id));n.auth?.enabled&&Ne("power","Sign out","action",()=>window.location.href="/auth/logout");for(const Je of y.keys())Ne("folder",Je,"folder",()=>ye(Je));for(const Je of h)Ne("doc",Je.path,"file",()=>ye(Je.path));return Fe},[s,l,E,M,n.auth?.enabled,y,h,e.projects,Ue,lt,D,ye]);x.useEffect(()=>{if(!z)return;const Fe=()=>j(!1);return document.addEventListener("click",Fe),()=>document.removeEventListener("click",Fe)},[z]);const Xt=x.useCallback(Fe=>y.has(Fe),[y]);let mn="app",qt,Pt;re?Pt=re.body:i.view==="insights"?Pt=e.canInsights?g.jsx(Kx,{flatFiles:h,heatMap:b,devices:C,scope:i.viewTarget||"",onOpenFile:ye,onOpenFolder:ye,isFolder:Xt}):g.jsx("div",{className:"empty",children:"Insights is for hub admins and org owners."}):i.view==="history"?Pt=g.jsx(w$,{apiBase:r,target:i.viewTarget||"",isFolder:Xt,onOpen:ye,onMeta:ne,onRendered:ae}):E?v?k?Pt=g.jsxs("div",{className:"notfound",children:[g.jsx("h1",{children:"Couldn't find that"}),g.jsxs("p",{children:[g.jsx("code",{children:E})," isn't in this project right now."]}),g.jsx("p",{className:"nf-sub",children:"If it was just created, it may still be uploading or syncing from a teammate's device — this page checks again automatically every few seconds, so refresh or come back in a moment."}),g.jsx("button",{className:"pbtn",onClick:()=>d.invalidateQueries({queryKey:["tree",r]}),children:"Check again"})]}):O?Pt=g.jsx(MI,{node:y.get(E),heatMap:b,hub:s&&!!l,apiBase:r,onOpen:ye,onFullHistory:D,onRendered:ae}):(mn=eC.test(E)?"wide":"read",qt="markdown",Pt=g.jsx(jI,{apiBase:r,path:E,heatMap:b,flatFiles:h,onOpenFile:ye,onMeta:ne,onRendered:ae})):Pt=g.jsx("div",{className:"empty",children:"Loading…"}):S?Pt=g.jsxs(g.Fragment,{children:[g.jsx(dC,{project:l}),e.canInsights&&g.jsx("div",{className:"home-insights",children:g.jsx(Kx,{flatFiles:h,heatMap:b,devices:C,onOpenFile:ye,onOpenFolder:ye,isFolder:Xt})})]}):Pt=g.jsx("div",{className:"empty",children:"Select a file to read it."});const Ut=re?re.crumb:E?g.jsx(RI,{path:E,onOpenFolder:ye}):i.view==="insights"?"Insights — "+(i.viewTarget||l?.name||""):i.view==="history"?"History — "+_$(i.viewTarget||"",Xt):S?l.name:null,rr=g.jsx(Js,{crumb:Ut,meta:Y,actions:g.jsxs(g.Fragment,{children:[ee&&g.jsx($t,{id:"share-btn",variant:"toolbar",className:"icon-only",title:"Share","aria-label":"Share",onClick:Ue,children:g.jsx(Yt,{name:"share"})}),ge&&!E&&!i.view&&g.jsxs($t,{id:"history-btn",variant:"toolbar",onClick:lt,children:[g.jsx(Yt,{name:"hist"})," ",g.jsx("span",{className:"lbl",children:"History"})]}),be&&g.jsx("a",{id:"download",hidden:!0,download:!0,href:Ve,ref:Z,children:"Download"}),De&&g.jsx($t,{id:"more-btn",variant:"toolbar",className:"icon-only",title:"More actions","aria-label":"More actions",onClick:Fe=>{Fe.stopPropagation(),j(!z)},children:g.jsx(Yt,{name:"dots"})}),z&&g.jsxs("div",{id:"more-menu",role:"menu",children:[ge&&g.jsx("button",{className:"more-item",onClick:lt,children:"History"}),be&&g.jsx("button",{className:"more-item",onClick:()=>Z.current?.click(),children:"Download"}),e.canInsights&&g.jsx("button",{className:"more-item",onClick:()=>{e.onClosePanel?.(),fn(_a("insights",l?.id,E))},children:"Insights"})]})]})});return g.jsxs(g.Fragment,{children:[g.jsx(Xs,{vault:e.sidebar.vault,projectsNav:e.sidebar.projectsNav,orgBar:e.sidebar.orgBar,tree:g.jsx(CI,{root:m,expanded:q,onToggle:he,currentPath:T,listingShowing:L,onOpen:ye}),topbar:rr,contentRef:ve,onContentScroll:me,children:g.jsx(hu,{width:mn,className:qt,children:Pt})}),J&&g.jsx($I,{url:J.url,copied:J.copied,onClose:()=>W(null)}),g.jsx(p$,{open:U,onClose:()=>Q(!1),candidates:Xe})]})}function C$({config:e}){const n=Ip(),r=kp(),[i,s]=x.useState(null),[l,u]=x.useState(null);x.useEffect(()=>u(null),[n]);const d=x.useMemo(()=>{const $=n.match(/^\/join\/([0-9a-f]+)\/?$/);return $?$[1]:null},[n]),{data:m}=kk(!d),{data:h}=Lk(!d),y=!!e.auth.admin,{data:v}=t_(y),b=x.useMemo(()=>r_(n,"hub"),[n]),S=x.useMemo(()=>m&&(m.find($=>$.id===b.project)||i&&m.find($=>$.org===i)||m[0])||null,[m,b.project,i]);if(x.useEffect(()=>{document.title=S?S.name+" — BearDrive":e.brand||"BearDrive"},[S,e]),d)return g.jsx(E$,{token:d,onDone:async $=>{s($),await r(),fn("/",{replace:!0})}});const _=e.brand||"BearDrive",C=S&&h?.find($=>$.id===S.org)||null,E=y||(C?C.role==="owner":!1),T=g.jsx(Hu,{name:_,onHome:()=>fn("/"),search:!!S}),O=e.me?g.jsx(H8,{me:e.me,org:C,orgActive:!!b.org,admin:y?{pending:v?.length||0,onClick:()=>{u({kind:"hub"}),fr()}}:void 0}):void 0;if(!m||!h)return g.jsx(Xs,{vault:T,topbar:g.jsx(Js,{}),children:g.jsx(hu,{children:g.jsx("div",{className:"empty",children:"Loading…"})})});if(!S)return g.jsx(Xs,{vault:T,projectsNav:g.jsx(Vx,{projects:m}),orgBar:O,topbar:g.jsx(Js,{}),children:g.jsx(hu,{children:g.jsx(tI,{authEnabled:e.auth.enabled,onCreate:async $=>{if(!$){We("Give the project a name.",!0);return}try{const he=await Aa("/api/projects",{name:$});await r(),fn("/"+he.project.id),We(`Created “${he.project.name}”.`)}catch(he){We("Could not create the project: "+he.message,!0)}}})})});const M=l?.kind==="hub"?{crumb:"Signup & access",body:g.jsx(k8,{})}:null,k=b.org?h.find($=>$.id===b.org):null,q=b.org&&!k?{crumb:"Organization",body:g.jsxs("div",{className:"empty",children:[g.jsx("h3",{children:"Organization not found"}),g.jsx("p",{children:"This organization doesn't exist, or you're no longer a member."}),g.jsx("p",{children:g.jsxs("a",{...i_("/"+S.id),children:["Back to ",S.name]})})]})}:k?{crumb:"Organization",body:g.jsx(j8,{org:k,projects:m,myEmail:e.me?.email||""})}:null,H=b.view==="settings"?{crumb:"Project settings",body:g.jsx(K8,{project:S,org:C,onDeleted:async()=>{await r(),fn("/")}})}:b.view==="install"?{crumb:"Installation",body:g.jsx(dC,{project:S})}:null;return!b.org&&b.project!==S.id?g.jsx(Fk,{to:"/"+S.id}):g.jsx(wC,{config:e,apiBase:"/api/p/"+S.id+"/",route:b,hub:!0,project:S,projects:m,canInsights:E,sidebar:{vault:T,projectsNav:g.jsx(Vx,{projects:m,currentId:S.id,menu:{active:l?null:b.view==="insights"&&!b.viewTarget?"dashboard":b.view==="install"?"install":b.view==="history"&&!b.viewTarget?"history":b.view==="settings"?"settings":null,onDashboard:()=>{u(null),fn(_a("insights",S.id)),fr()},onInstall:()=>{u(null),fn(_a("install",S.id)),fr()},onHistory:()=>{u(null),fn(_a("history",S.id)),fr()},onSettings:()=>{u(null),fn(_a("settings",S.id)),fr()}}}),orgBar:O},panel:M||q||H,onClosePanel:()=>u(null)},S.id)}function E$({token:e,onDone:n}){return x.useEffect(()=>{let r=!1;return Aa("/api/invites/"+e).then(i=>{r||(We(`Welcome — you joined the “${i.org.name}” team. Opening its projects…`),n(i.org.id))}).catch(i=>{r||String(i.message).includes("signing in")||(We("Could not accept the invite: "+i.message,!0),n(null))}),()=>{r=!0}},[e]),g.jsx(Xs,{vault:g.jsx(Hu,{name:"BearDrive"}),topbar:g.jsx(Js,{}),children:g.jsx(hu,{children:g.jsx("div",{className:"empty",children:"Joining…"})})})}function R$({config:e}){const n=Ip(),r=e.volume||"BearDrive";x.useEffect(()=>{document.title=e.brand||r},[e,r]);const i=x.useMemo(()=>r_(n,"volume"),[n]);return g.jsx(wC,{config:e,apiBase:"/api/",route:i,hub:!1,sidebar:{vault:g.jsx(Hu,{name:r,showSignout:e.auth.enabled,search:!0})}})}function T$(){const{data:e}=M2();return g.jsxs(Yz,{delayDuration:150,children:[e?e.mode==="hub"?g.jsx(C$,{config:e}):g.jsx(R$,{config:e}):g.jsx(Xs,{vault:g.jsx(Hu,{name:"…",showSignout:!1}),topbar:g.jsx(Js,{}),children:g.jsx("div",{className:"empty",children:"Loading…"})}),g.jsx(Tk,{}),g.jsx(zk,{})]})}const O$=new p2({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});HR.createRoot(document.getElementById("root")).render(g.jsx(x.StrictMode,{children:g.jsx(g2,{client:O$,children:g.jsx(T$,{})})})); diff --git a/internal/webapp/static/index.html b/internal/webapp/static/index.html index 9e506f0..5b9418b 100644 --- a/internal/webapp/static/index.html +++ b/internal/webapp/static/index.html @@ -5,7 +5,7 @@ BearDrive - +