diff --git a/internal/webapp/frontend/src/hooks/useBrowse.ts b/internal/webapp/frontend/src/hooks/useBrowse.ts
index 2bac1bc..f25d017 100644
--- a/internal/webapp/frontend/src/hooks/useBrowse.ts
+++ b/internal/webapp/frontend/src/hooks/useBrowse.ts
@@ -82,12 +82,21 @@ export function heatTotal(e: HeatEntry): number {
return (e.human || 0) + (e.agent || 0) + (e.share || 0);
}
+/* The total mixes three kinds of reader with independent debounces: your own
+ revisits fold into one visit, but an agent or a share-link hit on the
+ same file still moves the number. Break it out whenever more than people
+ are reading, so a count that changed while you watched says who it
+ counted — an unexplained total reads as a double-count. */
export function heatText(e: HeatEntry): string {
const total = heatTotal(e);
if (!total) return "";
- let s = total + (total === 1 ? " read" : " reads");
- if (e.agent) s += " (" + e.agent + " agent)";
- return s;
+ const s = total + (total === 1 ? " read" : " reads");
+ if (!e.agent && !e.share) return s;
+ const parts: string[] = [];
+ if (e.human) parts.push(e.human + " human");
+ if (e.agent) parts.push(e.agent + " agent");
+ if (e.share) parts.push(e.share + " shared");
+ return s + " (" + parts.join(", ") + ")";
}
/* Dot intensity 1–4, log-ish steps: 1–2, 3–9, 10–29, 30+ reads. */
diff --git a/internal/webapp/reads_test.go b/internal/webapp/reads_test.go
index 2fe60d3..818df47 100644
--- a/internal/webapp/reads_test.go
+++ b/internal/webapp/reads_test.go
@@ -57,6 +57,16 @@ func TestReadLedgerDebounce(t *testing.T) {
if heat["a.md"].LastRead.IsZero() {
t.Fatal("last_read not set")
}
+ // …and once the window has passed, the same actor counts again: the
+ // debounce collapses a visit, it does not stop counting (BEA-15).
+ visit := ReadStatKey{Project: "p-1", Path: "a.md", Kind: ReadKindHuman, Actor: "alice@x.io"}
+ l.mu.Lock()
+ l.seen[visit] = l.seen[visit].Add(-readDebounce - time.Minute)
+ l.mu.Unlock()
+ l.Record("p-1", "a.md", ReadKindHuman, "alice@x.io")
+ if e := l.Heat("p-1", "", time.Time{})["a.md"]; e.Human != 3 || e.Readers != 2 {
+ t.Fatalf("a.md after the window = %+v, want human 3, readers 2", e)
+ }
}
func TestReadLedgerWindow(t *testing.T) {
@@ -298,3 +308,121 @@ func TestHeatByDevice(t *testing.T) {
t.Fatalf("invalid by: %d, want 400", rec.Code)
}
}
+
+// readsHub builds an authenticated hub with one project owned by alice and
+// two seeded files: the markdown the viewer renders, and an HTML file the
+// viewer shows inside a sandboxed iframe.
+func readsHub(t *testing.T) (http.Handler, *Server, Project, map[string]*http.Cookie) {
+ t.Helper()
+ srv, _, root := newHub(t, true, nil)
+ auth, err := OpenBuiltinAuth(filepath.Join(t.TempDir(), "auth.json"), true, nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ srv.Auth = auth
+ orgs, err := OpenOrgDB(filepath.Join(t.TempDir(), "orgs.json"))
+ if err != nil {
+ t.Fatal(err)
+ }
+ srv.Dir = LocalDirectory{OrgDB: orgs}
+ srv.Reads, err = OpenReadLedger(filepath.Join(t.TempDir(), "reads.json"), 0)
+ if err != nil {
+ t.Fatal(err)
+ }
+ h := srv.Handler()
+ cookies := map[string]*http.Cookie{
+ "alice": signupAndSession(t, h, "alice@x.io", "Alice", "password1"),
+ "bob": signupAndSession(t, h, "bob@x.io", "Bob", "password1"),
+ }
+ rec := doAs(t, h, "POST", "/api/projects", map[string]string{"name": "wiki"}, cookies["alice"])
+ if rec.Code != 200 {
+ t.Fatalf("create project: %d %s", rec.Code, rec.Body)
+ }
+ var out struct {
+ Project Project `json:"project"`
+ }
+ json.Unmarshal(rec.Body.Bytes(), &out)
+ if err := orgs.AddMember(out.Project.Org, "bob@x.io", RoleMember); err != nil {
+ t.Fatal(err)
+ }
+ f := newFakeRemoteAt(t, filepath.Join(root, out.Project.ID))
+ f.putAs("dev1", "alice@x.io", "Alice", "guide.md", "# guide")
+ f.putAs("dev1", "alice@x.io", "Alice", "page.html", "
hi
")
+ return h, srv, out.Project, cookies
+}
+
+func humanHeat(t *testing.T, h http.Handler, p Project, c *http.Cookie, path string) HeatEntry {
+ t.Helper()
+ rec := doAs(t, h, "GET", "/api/p/"+p.ID+"/heat?days=30", nil, c)
+ if rec.Code != 200 {
+ t.Fatalf("heat: %d %s", rec.Code, rec.Body)
+ }
+ var out struct {
+ Entries map[string]HeatEntry `json:"entries"`
+ }
+ if err := json.Unmarshal(rec.Body.Bytes(), &out); err != nil {
+ t.Fatal(err)
+ }
+ return out.Entries[path]
+}
+
+// TestReadCountsOnePageOpenOnce is the BEA-15 regression: one signed-in
+// person opening one file, however many requests the page open makes and
+// whichever handler serves them, is exactly one read.
+func TestReadCountsOnePageOpenOnce(t *testing.T) {
+ h, _, p, c := readsHub(t)
+ base := "/api/p/" + p.ID + "/"
+
+ // A markdown page open is a /render; reopening it five times in a
+ // session is one visit.
+ for range 5 {
+ if rec := doAs(t, h, "GET", base+"render?path=guide.md", nil, c["alice"]); rec.Code != 200 {
+ t.Fatalf("render: %d %s", rec.Code, rec.Body)
+ }
+ }
+ // The ⋯ menu's Download and a raw view hit the same file by other handlers.
+ doAs(t, h, "GET", base+"file?path=guide.md", nil, c["alice"])
+ doAs(t, h, "GET", base+"download?path=guide.md", nil, c["alice"])
+ if e := humanHeat(t, h, p, c["alice"], "guide.md"); e.Human != 1 || e.Readers != 1 {
+ t.Fatalf("guide.md after one person's session = %+v, want human 1, readers 1", e)
+ }
+
+ // A second person opening it once adds exactly one, and one more reader.
+ doAs(t, h, "GET", base+"render?path=guide.md", nil, c["bob"])
+ if e := humanHeat(t, h, p, c["alice"], "guide.md"); e.Human != 2 || e.Readers != 2 {
+ t.Fatalf("guide.md after bob = %+v, want human 2, readers 2", e)
+ }
+
+ // An HTML file is served into a sandboxed iframe, which fetches it as an
+ // opaque origin — no session cookie. That fetch is a subresource of an
+ // already-counted page open, not a second reader.
+ doAs(t, h, "GET", base+"file?path=page.html", nil, c["alice"])
+ do(t, h, "GET", base+"file?path=page.html", nil) // the sandboxed iframe
+ if e := humanHeat(t, h, p, c["alice"], "page.html"); e.Human != 1 || e.Readers != 1 {
+ t.Fatalf("page.html = %+v, want human 1, readers 1 (sandboxed fetch is not a reader)", e)
+ }
+
+ // Spelunking through history is not consumption: neither the feed nor an
+ // old version fetched from it counts.
+ rec := doAs(t, h, "GET", base+"history?path=guide.md", nil, c["bob"])
+ var hist struct {
+ Entries []struct {
+ Blob string `json:"blob"`
+ } `json:"entries"`
+ }
+ if err := json.Unmarshal(rec.Body.Bytes(), &hist); err != nil || len(hist.Entries) == 0 {
+ t.Fatalf("history: %d %s (%v)", rec.Code, rec.Body, err)
+ }
+ doAs(t, h, "GET", base+"blob?sha="+hist.Entries[0].Blob, nil, c["bob"])
+ if e := humanHeat(t, h, p, c["alice"], "guide.md"); e.Human != 2 {
+ t.Fatalf("guide.md after history spelunking = %+v, want human still 2", e)
+ }
+
+ // The privacy line: counts leave the server, identities never do.
+ rec = doAs(t, h, "GET", base+"heat?days=30", nil, c["alice"])
+ for _, leak := range []string{"alice@x.io", "bob@x.io", "dev1", "actor"} {
+ if strings.Contains(rec.Body.String(), leak) {
+ t.Fatalf("heat leaked %q: %s", leak, rec.Body)
+ }
+ }
+}
diff --git a/internal/webapp/static/assets/index-Bbj9qBED.js b/internal/webapp/static/assets/index-D5c5wxeV.js
similarity index 96%
rename from internal/webapp/static/assets/index-Bbj9qBED.js
rename to internal/webapp/static/assets/index-D5c5wxeV.js
index ade8144..b19a810 100644
--- a/internal/webapp/static/assets/index-Bbj9qBED.js
+++ b/internal/webapp/static/assets/index-D5c5wxeV.js
@@ -118,5 +118,5 @@ bdrive skill install
bdrive login `+n+`
bdrive init --project `+e.id+`
bdrive hooks install`;return p.jsxs("div",{className:"guide",children:[p.jsxs("h1",{className:"in-title gd-head",children:[p.jsx("span",{className:"proj-mark","aria-hidden":"true",style:{background:cl(e.name)},children:p.jsx(Da,{name:e.icon})}),e.name]}),e.description&&p.jsx("p",{className:"in-desc",children:e.description}),p.jsxs("div",{className:"gd-body",children:[p.jsx("p",{className:"gd-desc",children:"Paste into your coding agent — Claude Code, Cowork, Codex, Gemini CLI, Hermes — in the folder where you want the files:"}),p.jsx(Hm,{code:r}),p.jsx("p",{className:"gd-desc",children:"The agent installs the CLI, signs this machine in, and registers the sync hooks — asking before anything it changes."}),p.jsxs("details",{className:"gd-manual",children:[p.jsx("summary",{children:"What exactly happens"}),p.jsxs("ul",{className:"gd-desc gd-list",children:[p.jsx("li",{children:"Sign-in uses a device code you approve in this browser — the folder itself never holds credentials."}),p.jsx("li",{children:"Sync hooks pull the latest before every agent turn, push edits seconds after they happen, and stamp each change with the session that made it; agent reads feed Insights."}),p.jsx("li",{children:"The beardrive skill (and on Claude Code, the plugin — shared with Cowork) is installed for later sessions, so from then on you can just ask."}),p.jsx("li",{children:"Codex asks once to trust the project's hooks layer — answer yes, or run /hooks."})]})]}),p.jsxs("details",{className:"gd-manual",children:[p.jsx("summary",{children:"Or run it yourself"}),p.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."}),p.jsx(Hm,{code:o}),p.jsx("p",{className:"gd-desc",children:p.jsx("a",{href:"https://docs.beardrive.ai/manual/install/",target:"_blank",rel:"noreferrer",children:"Full manual setup guide →"})})]})]})]})}function Hm({code:e}){const[n,r]=w.useState("Copy");return p.jsxs("pre",{className:"gd-code",children:[p.jsx("code",{children:e}),p.jsx("button",{className:"gd-copy",onClick:async()=>{r(await ll(e)?"Copied":"Copy failed"),setTimeout(()=>r("Copy"),1400)},children:n})]})}function h$(){return p.jsxs("div",{className:"onboard",children:[p.jsx("h1",{children:"Welcome to BearDrive"}),p.jsx("p",{children:"You're signed in, but you're not part of any project yet."}),p.jsxs("div",{className:"ob-card",children:[p.jsx("h3",{children:"Connect a new drive to your project"}),p.jsx("p",{children:"Paste into your coding agent — Claude Code, Cowork, Codex, Gemini CLI, Hermes — in the folder where you want the files. It creates the project and starts syncing:"}),p.jsx(Hm,{code:"Follow "+SC+`
-to connect this folder to a new BearDrive project on `+window.location.origin+"."}),p.jsx("p",{className:"ob-alt",children:p.jsx("a",{href:"https://docs.beardrive.ai/manual/setup-by-hand/",target:"_blank",rel:"noreferrer",children:"Or start a project manually →"})})]})]})}function m$(e,n=!0){const r=Yt({queryKey:["tree",e],queryFn:()=>fn(e+"tree"),enabled:n,refetchInterval:15e3}),o=w.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,...o,loaded:!!r.data}}function p$(e,n){return Yt({queryKey:["heat",e],queryFn:()=>fn(e+"heat?days=30"),enabled:n,staleTime:6e4,refetchInterval:6e4}).data?.entries??null}function g$(e,n,r){return Yt({queryKey:["history",e,"prefix",n,20],queryFn:()=>fn(e+"history?prefix="+encodeURIComponent(n)+"&n=20"),enabled:r,staleTime:15e3}).data?.entries??null}function Xx(e,n,r){if(!e)return null;if(!r)return e[n]||null;const o={human:0,agent:0,share:0};for(const[s,l]of Object.entries(e))s.startsWith(n+"/")&&(o.human+=l.human||0,o.agent+=l.agent||0,o.share+=l.share||0);return o.human||o.agent||o.share?o:null}function ul(e){return(e.human||0)+(e.agent||0)+(e.share||0)}function Bs(e){const n=ul(e);if(!n)return"";let r=n+(n===1?" read":" reads");return e.agent&&(r+=" ("+e.agent+" agent)"),r}function v$(e){const n=ul(e);return n?n<3?1:n<10?2:n<30?3:4:0}function y$(e,n,r){const o=new Array(e);return new Proxy(o,{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&&mo[y]!==h))&&(o=d,s=n(...d),r?.onChange&&!(l&&r.skipInitialOnChange)&&r.onChange(s),l=!1),s}return u.updateDeps=d=>{o=d},u}function Jx(e,n){if(e===void 0)throw new Error("Unexpected undefined");return e}const b$=(e,n)=>Math.abs(e-n)<1.01,x$=(e,n,r)=>{let o;return function(...s){e.clearTimeout(o),o=e.setTimeout(()=>n.apply(this,s),r)}};let Vs;const Jh=()=>{if(Vs!==void 0)return Vs;if(typeof navigator>"u")return Vs=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Vs=!0;const e=navigator.maxTouchPoints;return Vs=navigator.platform==="MacIntel"&&e!==void 0&&e>0},Wx=e=>{const{offsetWidth:n,offsetHeight:r}=e;return{width:n,height:r}},w$=e=>e,S$=e=>{const n=Math.max(e.startIndex-e.overscan,0),o=Math.min(e.endIndex+e.overscan,e.count-1)-n+1,s=new Array(o);for(let l=0;l{const r=e.scrollElement;if(!r)return;const o=e.targetWindow;if(!o)return;const s=u=>{const{width:d,height:m}=u;n({width:Math.round(d),height:Math.round(m)})};if(s(Wx(r)),!o.ResizeObserver)return()=>{};const l=new o.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(Wx(r))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(d):d()});return l.observe(r,{box:"border-box"}),()=>{l.unobserve(r)}},Eu={passive:!0},C$=typeof window>"u"?!0:"onscrollend"in window,E$=(e,n,r)=>{const o=e.scrollElement;if(!o)return;const s=e.targetWindow;if(!s)return;const l=e.options.useScrollendEvent&&C$;let u=0;const d=l?null:x$(s,()=>n(u,!1),e.options.isScrollingResetDelay),m=v=>()=>{u=r(o),d?.(),n(u,v)},h=m(!0),y=m(!1);return o.addEventListener("scroll",h,Eu),l&&o.addEventListener("scrollend",y,Eu),()=>{o.removeEventListener("scroll",h),l&&o.removeEventListener("scrollend",y)}},R$=(e,n)=>E$(e,n,r=>{const{horizontal:o,isRtl:s}=e.options;return o?r.scrollLeft*(s&&-1||1):r.scrollTop}),T$=(e,n,r)=>{if(r.options.useCachedMeasurements){const o=r.indexFromElement(e),s=r.options.getItemKey(o);return r.itemSizeCache.get(s)??r.options.estimateSize(o)}if(n?.borderBoxSize){const o=n.borderBoxSize[0];if(o)return Math.round(o[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const o=r.indexFromElement(e),s=r.options.getItemKey(o),l=r.itemSizeCache.get(s);if(l!==void 0)return l}return e[r.options.horizontal?"offsetWidth":"offsetHeight"]},O$=(e,{adjustments:n=0,behavior:r},o)=>{var s,l;(l=(s=o.scrollElement)==null?void 0:s.scrollTo)==null||l.call(s,{[o.options.horizontal?"left":"top"]:e+n,behavior:r})},M$=O$;class A${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,o,s;return((s=(o=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:o.now)==null?void 0:s.call(o))??Date.now()},this.observer=(()=>{let r=null;const o=()=>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=o())==null||s.disconnect(),r=null},observe:s=>{var l;return(l=o())==null?void 0:l.observe(s,{box:"border-box"})},unobserve:s=>{var l;return(l=o())==null?void 0:l.unobserve(s)}}})(),this.range=null,this.setOptions=r=>{var o,s;const l={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:w$,rangeExtractor:S$,onChange:()=>{},measureElement:T$,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 x=r[b];x!==void 0&&(l[b]=x)}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,x=l.count,_=this.getMeasurements(),C=b>0?((o=_[0])==null?void 0:o.key)??u.getItemKey(0):null,E=b>0?((s=_[b-1])==null?void 0:s.key)??u.getItemKey(b-1):null;if(x!==b||b>0&&x>0&&(l.getItemKey(0)!==C||l.getItemKey(x-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&&x>b&&this.isAtEnd(u.scrollEndThreshold)&&(b===0||l.getItemKey(x-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,x]=d,_=this.getMeasurements(),{count:C,getItemKey:E}=this.options;let T=0;for(;T{var o,s;(s=(o=this.options).onChange)==null||s.call(o,this,r)},this.maybeNotify=Ea(()=>(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 o=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==o){if(this.cleanup(),!o){this.maybeNotify();return}if(this.scrollElement=o,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,!(!Jh()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};l.addEventListener("touchstart",u,Eu),l.addEventListener("touchend",d,Eu),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&&(Jh()&&(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(),o=this.getMaxScrollOffset();if(r<0||r>o)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=Ea(()=>[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,o,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:o,scrollMargin:s,getItemKey:l,enabled:u,lanes:d,laneAssignmentMode:m,gap:h}),{key:!1}),this.getMeasurements=Ea(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:o,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=o+s;else{const L=b-1;M=O[L*2]+O[L*2+1]+h}for(let L=b;L1){k=M;const ye=_[k],de=ye!==void 0?x[ye]:void 0;L=de?de.end+h:o+s}else if(E===d){let ye=0,de=C[0],le=_[0];for(let se=1;sethis.options.debug}),this.calculateRange=Ea(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,o,s,l)=>r.length===0||o===0?(this.range=null,null):(this.range=N$(r,o,s,l,l===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=Ea(()=>{let r=null,o=null;const s=this.calculateRange();return s&&(r=s.startIndex,o=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,o]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,o]},(r,o,s,l,u)=>l===null||u===null?[]:r({startIndex:l,endIndex:u,overscan:o,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=r=>{const o=this.options.indexAttribute,s=r.getAttribute(o);return s?parseInt(s,10):(console.warn(`Missing attribute name '${o}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var o;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const s=this.scrollState.index??((o=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:o.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 o=this.indexFromElement(r),s=this.options.getItemKey(o),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(o)&&this.resizeItem(o,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,o)=>{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=o-y;if(v!==0){const b=this.options.anchorTo==="end"&&((s=this.scrollState)==null?void 0:s.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,x=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,o)=>{const s=[];for(let l=0,u=r.length;lthis.options.debug}),this.getVirtualItemForOffset=r=>{const o=this.getMeasurements();if(o.length===0)return;const s=this._flatMeasurements,l=this.options.lanes===1&&s!=null,u=CC(0,o.length-1,l?d=>s[d*2]:d=>Jx(o[d]).start,r);return Jx(o[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,o,s=0)=>{if(!this.scrollElement)return 0;const l=this.getSize(),u=this.getScrollOffset();o==="auto"&&(o=r>=u+l?"end":"start"),o==="center"?r+=(s-l)/2:o==="end"&&(r-=l);const d=this.getMaxScrollOffset();return Math.max(Math.min(d,r),0)},this.getOffsetForIndex=(r,o="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(o==="auto")if(u.end>=l+s-this.options.scrollPaddingEnd)o="end";else if(u.start<=l+this.options.scrollPaddingStart)o="start";else return[l,o];if(o==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),o];const d=o==="end"?u.end+this.options.scrollPaddingEnd:u.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(d,o,u.size),o]},this.scrollToOffset=(r,{align:o="start",behavior:s="auto"}={})=>{const l=this.getOffsetForAlignment(r,o),u=this.now();this.scrollState={index:null,align:o,behavior:s,startedAt:u,lastTargetOffset:l,stableFrames:0},this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:o="auto",behavior:s="auto"}={})=>{r=Math.max(0,Math.min(r,this.options.count-1));const l=this.getOffsetForIndex(r,o);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:o="auto"}={})=>{const s=this.getScrollOffset()+r,l=this.now();this.scrollState={index:null,align:"start",behavior:o,startedAt:l,lastTargetOffset:s,stableFrames:0},this._scrollToOffset(s,{adjustments:void 0,behavior:o}),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 o=this.getMeasurements();let s;if(o.length===0)s=this.options.paddingStart;else if(this.options.lanes===1){const l=o.length-1,u=this._flatMeasurements;u!=null?s=u[l*2]+u[l*2+1]:s=((r=o[l])==null?void 0:r.end)??0}else{const l=Array(this.options.lanes).fill(null);let u=o.length-1;for(;u>=0&&l.some(d=>d===null);){const d=o[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 o=this.getMeasurements();for(const s of o)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:o,behavior:s})=>{this._intendedScrollOffset=r+(o??0),this.options.scrollToFn(r,{behavior:s,adjustments:o},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&&(Jh()&&(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 o=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,s=o?o[0]:this.scrollState.lastTargetOffset,l=1,u=s!==this.scrollState.lastTargetOffset;if(!u&&b$(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 CC=(e,n,r,o)=>{for(;e<=n;){const s=(e+n)/2|0,l=r(s);if(lo)n=s-1;else return s}return e>0?e-1:0};function j$(e,n,r){let o=0;for(;o<=n;){const s=(o+n)/2|0,l=e[s*2];if(lr)n=s-1;else return s}return o>0?o-1:0}function N$(e,n,r,o,s){const l=e.length-1;if(e.length<=o)return{startIndex:0,endIndex:l};if(o===1&&s!==null){const h=j$(s,l,r);let y=h;const v=r+n;for(;ye[h].start,r),m=d;if(o===1)for(;m1){const h=Array(o).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%o),m=Math.min(l,m+(o-1-m%o))}return{startIndex:d,endIndex:m}}const Wh=typeof document<"u"?w.useLayoutEffect:w.useEffect;function D$({useFlushSync:e=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...o}){const s=w.useReducer(h=>h+1,0)[1],l=w.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,x=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),x?M.style.transform=b?`translate3d(${O}px, 0, 0)`:`translate3d(0, ${O}px, 0)`:M.style[_]=`${O}px`)}},d={...o,onChange:(h,y)=>{var v;const b=l.current;let x=!0;if(b.enabled){u(h);const _=h.range,C=b.prevRange;x=!C||C.isScrolling!==h.isScrolling||C.startIndex!==_?.startIndex||C.endIndex!==_?.endIndex,x&&(b.prevRange=_?{startIndex:_.startIndex,endIndex:_.endIndex,isScrolling:h.isScrolling}:null)}x&&(e&&y?To.flushSync(s):s()),(v=o.onChange)==null||v.call(o,h,y)}},[m]=w.useState(()=>{const h=new A$(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 x=h.options.horizontal?"width":"height";y.style[x]=`${b}px`}}})});return m.setOptions(d),Wh(()=>m._didMount(),[]),Wh(()=>m._willUpdate()),Wh(()=>{u(m)}),m}function z$(e){return D$({observeElementRect:_$,observeElementOffset:R$,scrollToFn:M$,...e})}function k$(e,n){const r=[],o=(s,l)=>{for(const u of s)r.push({node:u,depth:l}),u.dir&&n.has(u.path)&&o(u.children||[],l+1)};return o(e?.children||[],0),r}function L$(e){const{root:n,expanded:r,onToggle:o,currentPath:s,listingShowing:l,onOpen:u}=e,d=w.useRef(null),m=w.useMemo(()=>k$(n,r),[n,r]),h=z$({count:m.length,getScrollElement:()=>d.current,estimateSize:()=>window.matchMedia("(max-width: 768px)").matches?44:28,overscan:12,getItemKey:y=>m[y].node.path});return w.useEffect(()=>{if(!s)return;const y=m.findIndex(v=>v.node.path===s);y>=0&&h.scrollToIndex(y,{align:"auto"})},[s,m]),p.jsx("nav",{id:"tree","aria-label":"Files",ref:d,children:p.jsx("div",{style:{height:h.getTotalSize(),position:"relative"},children:h.getVirtualItems().map(y=>{const{node:v,depth:b}=m[y.index],x=v.dir?r.has(v.path):!1,_=()=>{if(v.dir&&s===v.path&&l){o(v.path);return}u(v.path),v.dir||fr()};return p.jsxs("div",{className:"row "+(v.dir?"dir":"file")+(s===v.path?" active":"")+(v.dir&&!x?" collapsed":""),"data-path":v.path,tabIndex:0,role:"button",title:v.name,"aria-expanded":v.dir?x: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)=>p.jsx("span",{className:"tguide",style:{left:8+E*13+5},"aria-hidden":"true"},E)),p.jsx("span",{className:"chev",onClick:C=>{v.dir&&(C.stopPropagation(),o(v.path))},children:p.jsx(Dt,{name:"chevd"})}),p.jsx("span",{className:"ticon",children:p.jsx(Dt,{name:v.dir?"folder":"doc"})}),p.jsx("span",{className:"label",children:v.name})]},y.key)})})})}function $$(e){const n=e.split("/"),r=[];let o="";for(let s=0;s{o=o?o+"/"+s:s;const u=o,d=l===r.length-1;return p.jsxs("span",{children:[l>0&&p.jsx("span",{className:"crumb-sep",children:"/"}),d?p.jsx("span",{children:s}):p.jsx("span",{className:"crumb-seg",title:u,onClick:()=>n(u),children:s})]},u)})})}function ew(e){if(e==="")return[];const n=e.split(`
+to connect this folder to a new BearDrive project on `+window.location.origin+"."}),p.jsx("p",{className:"ob-alt",children:p.jsx("a",{href:"https://docs.beardrive.ai/manual/setup-by-hand/",target:"_blank",rel:"noreferrer",children:"Or start a project manually →"})})]})]})}function m$(e,n=!0){const r=Yt({queryKey:["tree",e],queryFn:()=>fn(e+"tree"),enabled:n,refetchInterval:15e3}),o=w.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,...o,loaded:!!r.data}}function p$(e,n){return Yt({queryKey:["heat",e],queryFn:()=>fn(e+"heat?days=30"),enabled:n,staleTime:6e4,refetchInterval:6e4}).data?.entries??null}function g$(e,n,r){return Yt({queryKey:["history",e,"prefix",n,20],queryFn:()=>fn(e+"history?prefix="+encodeURIComponent(n)+"&n=20"),enabled:r,staleTime:15e3}).data?.entries??null}function Xx(e,n,r){if(!e)return null;if(!r)return e[n]||null;const o={human:0,agent:0,share:0};for(const[s,l]of Object.entries(e))s.startsWith(n+"/")&&(o.human+=l.human||0,o.agent+=l.agent||0,o.share+=l.share||0);return o.human||o.agent||o.share?o:null}function ul(e){return(e.human||0)+(e.agent||0)+(e.share||0)}function Bs(e){const n=ul(e);if(!n)return"";const r=n+(n===1?" read":" reads");if(!e.agent&&!e.share)return r;const o=[];return e.human&&o.push(e.human+" human"),e.agent&&o.push(e.agent+" agent"),e.share&&o.push(e.share+" shared"),r+" ("+o.join(", ")+")"}function v$(e){const n=ul(e);return n?n<3?1:n<10?2:n<30?3:4:0}function y$(e,n,r){const o=new Array(e);return new Proxy(o,{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&&mo[y]!==h))&&(o=d,s=n(...d),r?.onChange&&!(l&&r.skipInitialOnChange)&&r.onChange(s),l=!1),s}return u.updateDeps=d=>{o=d},u}function Jx(e,n){if(e===void 0)throw new Error("Unexpected undefined");return e}const b$=(e,n)=>Math.abs(e-n)<1.01,x$=(e,n,r)=>{let o;return function(...s){e.clearTimeout(o),o=e.setTimeout(()=>n.apply(this,s),r)}};let Vs;const Jh=()=>{if(Vs!==void 0)return Vs;if(typeof navigator>"u")return Vs=!1;if(/iP(hone|od|ad)/.test(navigator.userAgent))return Vs=!0;const e=navigator.maxTouchPoints;return Vs=navigator.platform==="MacIntel"&&e!==void 0&&e>0},Wx=e=>{const{offsetWidth:n,offsetHeight:r}=e;return{width:n,height:r}},w$=e=>e,S$=e=>{const n=Math.max(e.startIndex-e.overscan,0),o=Math.min(e.endIndex+e.overscan,e.count-1)-n+1,s=new Array(o);for(let l=0;l{const r=e.scrollElement;if(!r)return;const o=e.targetWindow;if(!o)return;const s=u=>{const{width:d,height:m}=u;n({width:Math.round(d),height:Math.round(m)})};if(s(Wx(r)),!o.ResizeObserver)return()=>{};const l=new o.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(Wx(r))};e.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(d):d()});return l.observe(r,{box:"border-box"}),()=>{l.unobserve(r)}},Eu={passive:!0},C$=typeof window>"u"?!0:"onscrollend"in window,E$=(e,n,r)=>{const o=e.scrollElement;if(!o)return;const s=e.targetWindow;if(!s)return;const l=e.options.useScrollendEvent&&C$;let u=0;const d=l?null:x$(s,()=>n(u,!1),e.options.isScrollingResetDelay),m=v=>()=>{u=r(o),d?.(),n(u,v)},h=m(!0),y=m(!1);return o.addEventListener("scroll",h,Eu),l&&o.addEventListener("scrollend",y,Eu),()=>{o.removeEventListener("scroll",h),l&&o.removeEventListener("scrollend",y)}},R$=(e,n)=>E$(e,n,r=>{const{horizontal:o,isRtl:s}=e.options;return o?r.scrollLeft*(s&&-1||1):r.scrollTop}),T$=(e,n,r)=>{if(r.options.useCachedMeasurements){const o=r.indexFromElement(e),s=r.options.getItemKey(o);return r.itemSizeCache.get(s)??r.options.estimateSize(o)}if(n?.borderBoxSize){const o=n.borderBoxSize[0];if(o)return Math.round(o[r.options.horizontal?"inlineSize":"blockSize"])}if(!n){const o=r.indexFromElement(e),s=r.options.getItemKey(o),l=r.itemSizeCache.get(s);if(l!==void 0)return l}return e[r.options.horizontal?"offsetWidth":"offsetHeight"]},O$=(e,{adjustments:n=0,behavior:r},o)=>{var s,l;(l=(s=o.scrollElement)==null?void 0:s.scrollTo)==null||l.call(s,{[o.options.horizontal?"left":"top"]:e+n,behavior:r})},M$=O$;class A${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,o,s;return((s=(o=(r=this.targetWindow)==null?void 0:r.performance)==null?void 0:o.now)==null?void 0:s.call(o))??Date.now()},this.observer=(()=>{let r=null;const o=()=>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=o())==null||s.disconnect(),r=null},observe:s=>{var l;return(l=o())==null?void 0:l.observe(s,{box:"border-box"})},unobserve:s=>{var l;return(l=o())==null?void 0:l.unobserve(s)}}})(),this.range=null,this.setOptions=r=>{var o,s;const l={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:w$,rangeExtractor:S$,onChange:()=>{},measureElement:T$,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 x=r[b];x!==void 0&&(l[b]=x)}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,x=l.count,_=this.getMeasurements(),C=b>0?((o=_[0])==null?void 0:o.key)??u.getItemKey(0):null,E=b>0?((s=_[b-1])==null?void 0:s.key)??u.getItemKey(b-1):null;if(x!==b||b>0&&x>0&&(l.getItemKey(0)!==C||l.getItemKey(x-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&&x>b&&this.isAtEnd(u.scrollEndThreshold)&&(b===0||l.getItemKey(x-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,x]=d,_=this.getMeasurements(),{count:C,getItemKey:E}=this.options;let T=0;for(;T{var o,s;(s=(o=this.options).onChange)==null||s.call(o,this,r)},this.maybeNotify=Ea(()=>(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 o=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==o){if(this.cleanup(),!o){this.maybeNotify();return}if(this.scrollElement=o,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,!(!Jh()||this.targetWindow==null)&&(this._iosJustTouchEnded=!0,this._iosTouchEndTimerId=this.targetWindow.setTimeout(()=>{this._iosJustTouchEnded=!1,this._iosTouchEndTimerId=null,this._flushIosDeferredIfReady()},150))};l.addEventListener("touchstart",u,Eu),l.addEventListener("touchend",d,Eu),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&&(Jh()&&(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(),o=this.getMaxScrollOffset();if(r<0||r>o)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=Ea(()=>[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,o,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:o,scrollMargin:s,getItemKey:l,enabled:u,lanes:d,laneAssignmentMode:m,gap:h}),{key:!1}),this.getMeasurements=Ea(()=>[this.getMeasurementOptions(),this.itemSizeCacheVersion],({count:r,paddingStart:o,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=o+s;else{const L=b-1;M=O[L*2]+O[L*2+1]+h}for(let L=b;L1){k=M;const ye=_[k],de=ye!==void 0?x[ye]:void 0;L=de?de.end+h:o+s}else if(E===d){let ye=0,de=C[0],le=_[0];for(let se=1;sethis.options.debug}),this.calculateRange=Ea(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(r,o,s,l)=>r.length===0||o===0?(this.range=null,null):(this.range=N$(r,o,s,l,l===1&&this._flatMeasurements!=null?this._flatMeasurements:null),this.range),{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=Ea(()=>{let r=null,o=null;const s=this.calculateRange();return s&&(r=s.startIndex,o=s.endIndex),this.maybeNotify.updateDeps([this.isScrolling,r,o]),[this.options.rangeExtractor,this.options.overscan,this.options.count,r,o]},(r,o,s,l,u)=>l===null||u===null?[]:r({startIndex:l,endIndex:u,overscan:o,count:s}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=r=>{const o=this.options.indexAttribute,s=r.getAttribute(o);return s?parseInt(s,10):(console.warn(`Missing attribute name '${o}={index}' on measured element.`),-1)},this.shouldMeasureDuringScroll=r=>{var o;if(!this.scrollState||this.scrollState.behavior!=="smooth")return!0;const s=this.scrollState.index??((o=this.getVirtualItemForOffset(this.scrollState.lastTargetOffset))==null?void 0:o.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 o=this.indexFromElement(r),s=this.options.getItemKey(o),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(o)&&this.resizeItem(o,this.options.measureElement(r,void 0,this))},this.resizeItem=(r,o)=>{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=o-y;if(v!==0){const b=this.options.anchorTo==="end"&&((s=this.scrollState)==null?void 0:s.behavior)!=="smooth"&&this.getVirtualDistanceFromEnd()<=this.options.scrollEndThreshold,x=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,o)=>{const s=[];for(let l=0,u=r.length;lthis.options.debug}),this.getVirtualItemForOffset=r=>{const o=this.getMeasurements();if(o.length===0)return;const s=this._flatMeasurements,l=this.options.lanes===1&&s!=null,u=CC(0,o.length-1,l?d=>s[d*2]:d=>Jx(o[d]).start,r);return Jx(o[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,o,s=0)=>{if(!this.scrollElement)return 0;const l=this.getSize(),u=this.getScrollOffset();o==="auto"&&(o=r>=u+l?"end":"start"),o==="center"?r+=(s-l)/2:o==="end"&&(r-=l);const d=this.getMaxScrollOffset();return Math.max(Math.min(d,r),0)},this.getOffsetForIndex=(r,o="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(o==="auto")if(u.end>=l+s-this.options.scrollPaddingEnd)o="end";else if(u.start<=l+this.options.scrollPaddingStart)o="start";else return[l,o];if(o==="end"&&r===this.options.count-1)return[this.getMaxScrollOffset(),o];const d=o==="end"?u.end+this.options.scrollPaddingEnd:u.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(d,o,u.size),o]},this.scrollToOffset=(r,{align:o="start",behavior:s="auto"}={})=>{const l=this.getOffsetForAlignment(r,o),u=this.now();this.scrollState={index:null,align:o,behavior:s,startedAt:u,lastTargetOffset:l,stableFrames:0},this._scrollToOffset(l,{adjustments:void 0,behavior:s}),this.scheduleScrollReconcile()},this.scrollToIndex=(r,{align:o="auto",behavior:s="auto"}={})=>{r=Math.max(0,Math.min(r,this.options.count-1));const l=this.getOffsetForIndex(r,o);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:o="auto"}={})=>{const s=this.getScrollOffset()+r,l=this.now();this.scrollState={index:null,align:"start",behavior:o,startedAt:l,lastTargetOffset:s,stableFrames:0},this._scrollToOffset(s,{adjustments:void 0,behavior:o}),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 o=this.getMeasurements();let s;if(o.length===0)s=this.options.paddingStart;else if(this.options.lanes===1){const l=o.length-1,u=this._flatMeasurements;u!=null?s=u[l*2]+u[l*2+1]:s=((r=o[l])==null?void 0:r.end)??0}else{const l=Array(this.options.lanes).fill(null);let u=o.length-1;for(;u>=0&&l.some(d=>d===null);){const d=o[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 o=this.getMeasurements();for(const s of o)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:o,behavior:s})=>{this._intendedScrollOffset=r+(o??0),this.options.scrollToFn(r,{behavior:s,adjustments:o},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&&(Jh()&&(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 o=this.scrollState.index!=null?this.getOffsetForIndex(this.scrollState.index,this.scrollState.align):void 0,s=o?o[0]:this.scrollState.lastTargetOffset,l=1,u=s!==this.scrollState.lastTargetOffset;if(!u&&b$(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 CC=(e,n,r,o)=>{for(;e<=n;){const s=(e+n)/2|0,l=r(s);if(lo)n=s-1;else return s}return e>0?e-1:0};function j$(e,n,r){let o=0;for(;o<=n;){const s=(o+n)/2|0,l=e[s*2];if(lr)n=s-1;else return s}return o>0?o-1:0}function N$(e,n,r,o,s){const l=e.length-1;if(e.length<=o)return{startIndex:0,endIndex:l};if(o===1&&s!==null){const h=j$(s,l,r);let y=h;const v=r+n;for(;ye[h].start,r),m=d;if(o===1)for(;m1){const h=Array(o).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%o),m=Math.min(l,m+(o-1-m%o))}return{startIndex:d,endIndex:m}}const Wh=typeof document<"u"?w.useLayoutEffect:w.useEffect;function D$({useFlushSync:e=!0,directDomUpdates:n=!1,directDomUpdatesMode:r="transform",...o}){const s=w.useReducer(h=>h+1,0)[1],l=w.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,x=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),x?M.style.transform=b?`translate3d(${O}px, 0, 0)`:`translate3d(0, ${O}px, 0)`:M.style[_]=`${O}px`)}},d={...o,onChange:(h,y)=>{var v;const b=l.current;let x=!0;if(b.enabled){u(h);const _=h.range,C=b.prevRange;x=!C||C.isScrolling!==h.isScrolling||C.startIndex!==_?.startIndex||C.endIndex!==_?.endIndex,x&&(b.prevRange=_?{startIndex:_.startIndex,endIndex:_.endIndex,isScrolling:h.isScrolling}:null)}x&&(e&&y?To.flushSync(s):s()),(v=o.onChange)==null||v.call(o,h,y)}},[m]=w.useState(()=>{const h=new A$(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 x=h.options.horizontal?"width":"height";y.style[x]=`${b}px`}}})});return m.setOptions(d),Wh(()=>m._didMount(),[]),Wh(()=>m._willUpdate()),Wh(()=>{u(m)}),m}function z$(e){return D$({observeElementRect:_$,observeElementOffset:R$,scrollToFn:M$,...e})}function k$(e,n){const r=[],o=(s,l)=>{for(const u of s)r.push({node:u,depth:l}),u.dir&&n.has(u.path)&&o(u.children||[],l+1)};return o(e?.children||[],0),r}function L$(e){const{root:n,expanded:r,onToggle:o,currentPath:s,listingShowing:l,onOpen:u}=e,d=w.useRef(null),m=w.useMemo(()=>k$(n,r),[n,r]),h=z$({count:m.length,getScrollElement:()=>d.current,estimateSize:()=>window.matchMedia("(max-width: 768px)").matches?44:28,overscan:12,getItemKey:y=>m[y].node.path});return w.useEffect(()=>{if(!s)return;const y=m.findIndex(v=>v.node.path===s);y>=0&&h.scrollToIndex(y,{align:"auto"})},[s,m]),p.jsx("nav",{id:"tree","aria-label":"Files",ref:d,children:p.jsx("div",{style:{height:h.getTotalSize(),position:"relative"},children:h.getVirtualItems().map(y=>{const{node:v,depth:b}=m[y.index],x=v.dir?r.has(v.path):!1,_=()=>{if(v.dir&&s===v.path&&l){o(v.path);return}u(v.path),v.dir||fr()};return p.jsxs("div",{className:"row "+(v.dir?"dir":"file")+(s===v.path?" active":"")+(v.dir&&!x?" collapsed":""),"data-path":v.path,tabIndex:0,role:"button",title:v.name,"aria-expanded":v.dir?x: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)=>p.jsx("span",{className:"tguide",style:{left:8+E*13+5},"aria-hidden":"true"},E)),p.jsx("span",{className:"chev",onClick:C=>{v.dir&&(C.stopPropagation(),o(v.path))},children:p.jsx(Dt,{name:"chevd"})}),p.jsx("span",{className:"ticon",children:p.jsx(Dt,{name:v.dir?"folder":"doc"})}),p.jsx("span",{className:"label",children:v.name})]},y.key)})})})}function $$(e){const n=e.split("/"),r=[];let o="";for(let s=0;s{o=o?o+"/"+s:s;const u=o,d=l===r.length-1;return p.jsxs("span",{children:[l>0&&p.jsx("span",{className:"crumb-sep",children:"/"}),d?p.jsx("span",{children:s}):p.jsx("span",{className:"crumb-seg",title:u,onClick:()=>n(u),children:s})]},u)})})}function ew(e){if(e==="")return[];const n=e.split(`
`);return n[n.length-1]===""&&n.pop(),n}const V$=4e6;function F$(e,n){let r=0;for(;rs.push({op:"-",line:l[v],an:r+v+1}),y=v=>s.push({op:"+",line:u[v],bn:r+v+1});if(d*m>V$){for(let v=0;v=0;_--)for(let C=m-1;C>=0;C--)v[_][C]=l[_]===u[C]?v[_+1][C+1]+1:Math.max(v[_+1][C],v[_][C+1]);let b=0,x=0;for(;b=v[b][x+1]?h(b++):y(x++);for(;bo.op==="+").length,del:r.filter(o=>o.op==="-").length}}const tw=1<<20,U$=8192;function Bm(e,n,r,o){let s=e+"blob?sha="+encodeURIComponent(n);return r&&(s+="&name="+encodeURIComponent(r)),o&&(s+="&download=1"),s}async function H$(e){const n=await P2(e);if(Number(n.headers.get("Content-Length"))>tw)return{kind:"too-large"};const o=new Uint8Array(await n.arrayBuffer());if(o.byteLength>tw)return{kind:"too-large"};if(o.subarray(0,U$).includes(0))return{kind:"binary"};try{return{kind:"text",text:new TextDecoder("utf-8",{fatal:!0}).decode(o)}}catch{return{kind:"binary"}}}function nw(e,n,r){return Yt({queryKey:["blob",e,n],queryFn:()=>H$(Bm(e,n)),enabled:!!n,staleTime:1/0,gcTime:1/0,retry:!1})}function B$(e){return e.slice(e.lastIndexOf("/")+1)}function q$({apiBase:e,path:n,prev:r,cur:o}){const s=B$(n);return p.jsxs("span",{className:"dv-dl",children:[p.jsx("a",{href:Bm(e,r,s,!0),children:"download previous"}),p.jsx("a",{href:Bm(e,o,s,!0),children:"download this version"})]})}function G$({apiBase:e,path:n,prev:r,cur:o}){const s=nw(e,r),l=nw(e,o),u=s.data?.kind==="text"&&l.data?.kind==="text",d=w.useMemo(()=>s.data?.kind==="text"&&l.data?.kind==="text"?P$(s.data.text,l.data.text):null,[s.data,l.data]);if(s.error||l.error)return p.jsx("div",{className:"dv dv-msg",children:"Could not load one of the versions."});if(!s.data||!l.data)return p.jsx("div",{className:"dv dv-msg",children:"Loading changes…"});if(!u){const v=s.data.kind==="too-large"||l.data.kind==="too-large";return p.jsxs("div",{className:"dv dv-msg",children:[v?"Too large to diff — download to compare.":"Binary file — no diff available.",p.jsx(q$,{apiBase:e,path:n,prev:r,cur:o})]})}const{lines:m,add:h,del:y}=d;return p.jsxs("div",{className:"dv",children:[p.jsxs("div",{className:"dv-head",children:[p.jsxs("span",{className:"dv-stat",children:[p.jsxs("span",{className:"dv-add",children:["+",h]})," ",p.jsxs("span",{className:"dv-del",children:["−",y]})]}),h===0&&y===0&&p.jsx("span",{className:"dv-same",children:"No line changes"})]}),p.jsx("div",{className:"dv-body",children:m.map((v,b)=>p.jsxs("div",{className:"dv-line dv-"+(v.op==="="?"ctx":v.op==="+"?"ins":"rm"),children:[p.jsx("span",{className:"dv-n",children:v.an??""}),p.jsx("span",{className:"dv-n",children:v.bn??""}),p.jsx("span",{className:"dv-mark",children:v.op==="="?" ":v.op}),p.jsx("span",{className:"dv-text",children:v.line||" "})]},b))})]})}const Z$={add:"plus",edit:"edit",delete:"x"},K$={add:"added",edit:"edited",delete:"deleted"};function EC({entry:e,onOpen:n,diff:r}){const[o,s]=w.useState(!1),[l,u]=w.useState(!1),d=e.kind==="put"?"edit":e.kind,m=hC(e),h=[e.device.name||e.device.id,e.device.os,e.device.ip].filter(Boolean).join(" · "),y=d!=="delete",v=!!r&&d!=="delete"&&!!e.blob,b=()=>u(!l),x=_=>{_.target.tagName!=="A"&&y&&n(e.path,e.blob)};return p.jsxs("div",{className:"hentry "+d+(y?" clickable":""),tabIndex:y?0:void 0,role:y?"button":void 0,onClick:x,onKeyDown:_=>{y&&(_.key==="Enter"||_.key===" ")&&(_.preventDefault(),n(e.path,e.blob))},children:[p.jsxs("div",{className:"hline",children:[p.jsx("span",{className:"hkind",children:p.jsx(Dt,{name:Z$[d]||"dot"})}),p.jsx("span",{className:"hpath",children:e.path}),p.jsx("span",{className:"htag",children:K$[d]||d}),p.jsx("span",{className:"htime",children:new Date(e.time).toLocaleString()})]}),p.jsxs("div",{className:"hmeta",children:[p.jsx("span",{className:"hwho",children:m}),p.jsx("span",{className:"hdev",children:h}),p.jsx("span",{className:"hsize",children:e.size?dC(e.size):""})]}),e.note&&p.jsx("div",{className:"hnote"+(o?" open":""),tabIndex:0,role:"button",title:o?"Collapse note":"Show full note","aria-expanded":o,onClick:_=>{_.stopPropagation(),_.target.tagName!=="A"&&s(!o)},onKeyDown:_=>{(_.key==="Enter"||_.key===" ")&&(_.preventDefault(),_.stopPropagation(),s(!o))},children:e.note.split(/(https?:\/\/\S+)/).map((_,C)=>/^https?:\/\//.test(_)?p.jsx("a",{href:_,target:"_blank",rel:"noopener",children:_},C):_)}),v&&(r.prev?p.jsxs(p.Fragment,{children:[p.jsxs("button",{type:"button",className:"hdiff-btn"+(l?" open":""),"aria-expanded":l,onClick:_=>{_.stopPropagation(),b()},onKeyDown:_=>_.stopPropagation(),children:[p.jsx(Dt,{name:l?"chevd":"chev"}),l?"hide changes":"show changes"]}),l&&p.jsx("div",{onClick:_=>_.stopPropagation(),children:p.jsx(G$,{apiBase:r.apiBase,path:e.path,prev:r.prev,cur:e.blob})})]}):p.jsx("div",{className:"hdiff-none",children:"First version — nothing to compare against"}))]})}function Y$(e){const{node:n,heatMap:r,onOpen:o}=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=Xx(r,n.path,!0);return m&&d.push(Bs(m)+" in 30 days"),p.jsxs("div",{className:"dirlist",children:[p.jsxs("h1",{className:"dl-title",children:[p.jsx("span",{className:"dl-title-icon",children:p.jsx(Dt,{name:"folder"})}),p.jsx("span",{children:n.name})]}),p.jsx("p",{className:"dl-sub",children:d.join(" · ")||"Empty folder"}),s.length===0?p.jsx("div",{className:"dl-empty",children:"Nothing in this folder yet."}):p.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?dC(h.size):"",h.time?new Date(h.time).toLocaleDateString():""].filter(Boolean).join(" · ");const v=Xx(r,h.path,!!h.dir);return v&&(y=Bs(v)+(y?" · "+y:"")),p.jsxs("div",{className:"dl-row",tabIndex:0,role:"button",title:h.path,onClick:()=>o(h.path),onKeyDown:b=>{(b.key==="Enter"||b.key===" ")&&(b.preventDefault(),o(h.path))},children:[p.jsx("span",{className:"ticon",children:p.jsx(Dt,{name:h.dir?"folder":"doc"})}),p.jsx("span",{className:"dl-name",children:h.name}),v&&p.jsx("span",{className:"heatdot lvl"+v$(v),role:"img","aria-label":Bs(v)+" in 30 days",title:Bs(v)+" in 30 days"}),p.jsx("span",{className:"dl-meta",children:y})]},h.path)})}),e.hub&&p.jsx(Q$,{apiBase:e.apiBase,prefix:n.path+"/",onOpen:o,onFullHistory:()=>e.onFullHistory(n.path+"/"),onRendered:e.onRendered})]})}function Q$(e){const n=g$(e.apiBase,e.prefix,!0),{onRendered:r}=e;return w.useEffect(()=>{n&&n.length&&r&&r()},[n,r]),!n||n.length===0?null:p.jsxs("div",{className:"dl-history",children:[p.jsx("h3",{className:"dl-h3",children:"Recent changes"}),p.jsx("div",{className:"history dl-hlist",children:n.map((o,s)=>p.jsx(EC,{entry:o,onOpen:e.onOpen},s))}),p.jsx("button",{className:"ai-btn dl-more",onClick:e.onFullHistory,children:"Full history"})]})}function X$(e){const{apiBase:n,path:r,version:o,onMeta:s}=e,l=o?n+"blob?sha="+o+"&name="+encodeURIComponent(r):n+"file?path="+encodeURIComponent(r);return w.useEffect(()=>()=>s(""),[r,s]),H8.test(r)?p.jsx(J$,{...e}):uC.test(r)?p.jsx("iframe",{className:"htmlview",sandbox:"allow-scripts",src:l,title:r,onLoad:e.onRendered}):B8.test(r)?p.jsx(tI,{src:l,alt:r,version:o,onRendered:e.onRendered}):q8.test(r)?p.jsx(nI,{...e,fileURL:l}):p.jsxs("div",{className:"filecard",children:[p.jsx("div",{className:"name",children:r.split("/").pop()}),p.jsx("p",{children:"No preview for this file type."}),p.jsx("a",{className:"btn",download:!0,href:o?l+"&download=1":n+"download?path="+encodeURIComponent(r),children:"Download"})]})}function J$(e){const{apiBase:n,path:r,version:o,heatMap:s,flatFiles:l,onOpenFile:u,onMeta:d,onRendered:m}=e,{data:h,error:y}=Yt({queryKey:["render",n,r,o||""],queryFn:()=>fn(n+"render?path="+encodeURIComponent(r)+(o?"&sha="+o:"")),retry:o?!1:void 0}),v=w.useMemo(()=>h?eI(h.html,r,n):"",[h,r,n]);return w.useEffect(()=>{if(!h)return;const b=[];h.author&&b.push(h.author+(h.device?" on "+h.device:"")),h.time&&b.push(new Date(h.time).toLocaleString());const x=o?null:s&&s[h.path];x&&ul(x)&&b.push(Bs(x)+" / 30d"),d(b.join(" · ")),m?.()},[h,o,s,d,m]),y?p.jsx(sg,{version:o,err:y}):h?p.jsx("div",{dangerouslySetInnerHTML:{__html:v},onClick:b=>W$(b,r,l,u)}):null}function W$(e,n,r,o){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(),rI(decodeURIComponent(l.slice(5)),r,o)):/^([a-z]+:|\/|#)/i.test(l)||(e.preventDefault(),o(fC(u,decodeURIComponent(l))))}function eI(e,n,r){const o=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(fC(o,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 tI(e){const[n,r]=w.useState(!1);return n?p.jsx(sg,{version:e.version,err:new Error("could not be loaded")}):p.jsx("img",{src:e.src,alt:e.alt,onLoad:e.onRendered,onError:()=>r(!0)})}function sg({version:e,err:n}){return p.jsx("div",{className:"empty",children:e?"That version isn't available.":"Could not load file: "+n.message})}function nI(e){const{path:n,version:r,fileURL:o,onRendered:s}=e,{data:l,error:u}=Yt({queryKey:["text",o],queryFn:async()=>{const d=await fetch(o);if(!d.ok)throw new Error(await d.text());return d.text()},retry:r?!1:void 0});return w.useEffect(()=>{l!=null&&s?.()},[l,s]),u?p.jsx(sg,{version:r,err:u}):l==null?null:p.jsx("pre",{className:"plain",children:l},n)}function rI(e,n,r){const o=e.toLowerCase(),s=n.find(l=>l.path.toLowerCase()===o||l.path.toLowerCase()===o+".md")||n.find(l=>{const u=l.name.toLowerCase();return u===o||u===o+".md"});s&&r(s.path)}function iI({url:e,copied:n,onClose:r}){const o=e.split("/s/")[1];return p.jsx($p,{open:!0,onOpenChange:s=>!s&&r(),children:p.jsxs(Ip,{className:"modal",showCloseButton:!1,children:[p.jsx(Ku,{asChild:!0,children:p.jsx("h3",{children:"Public link created"})}),p.jsxs("p",{children:[p.jsx("b",{children:"Anyone with this link can view this file"})," — no account needed. It always shows the latest version until you revoke it."]}),p.jsx("div",{className:"modal-url",children:e}),p.jsxs("div",{className:"modal-actions",children:[p.jsx(zt,{variant:"primary",onClick:()=>ll(e).then(s=>nt(s?"Copied.":"Select and copy the link above.")),children:n?"Copied ✓":"Copy link"}),p.jsx(zt,{variant:"subtle",onClick:()=>window.open(e,"_blank"),children:"Open"}),p.jsx(zt,{variant:"subtle",className:"ai-del",onClick:async()=>{try{await Jn("DELETE","/api/shares/"+o),nt("Link revoked — it no longer works."),r()}catch(s){nt(s.message,!0)}},children:"Revoke"}),p.jsx(zt,{variant:"subtle",onClick:r,children:"Done"})]})]})})}var rw=1,oI=.9,aI=.8,sI=.17,em=.1,tm=.999,lI=.9999,cI=.99,uI=/[\\\/_+.#"@\[\(\{&]/,dI=/[\\\/_+.#"@\[\(\{&]/g,fI=/[\s-]/,RC=/[\s-]/g;function qm(e,n,r,o,s,l,u){if(l===n.length)return s===e.length?rw:cI;var d=`${s},${l}`;if(u[d]!==void 0)return u[d];for(var m=o.charAt(l),h=r.indexOf(m,s),y=0,v,b,x,_;h>=0;)v=qm(e,n,r,o,h+1,l+1,u),v>y&&(h===s?v*=rw:uI.test(e.charAt(h-1))?(v*=aI,x=e.slice(s,h-1).match(dI),x&&s>0&&(v*=Math.pow(tm,x.length))):fI.test(e.charAt(h-1))?(v*=oI,_=e.slice(s,h-1).match(RC),_&&s>0&&(v*=Math.pow(tm,_.length))):(v*=sI,s>0&&(v*=Math.pow(tm,h-s))),e.charAt(h)!==n.charAt(l)&&(v*=lI)),(vv&&(v=b*em)),v>y&&(y=v),h=r.indexOf(m,h+1);return u[d]=y,y}function iw(e){return e.toLowerCase().replace(RC," ")}function hI(e,n,r){return e=r&&r.length>0?`${e+" "+r.join(" ")}`:e,qm(e,n,iw(e),iw(n),0,0,{})}var Fs='[cmdk-group=""]',nm='[cmdk-group-items=""]',mI='[cmdk-group-heading=""]',TC='[cmdk-item=""]',ow=`${TC}:not([aria-disabled="true"])`,Gm="cmdk-item-select",Ra="data-value",pI=(e,n,r)=>hI(e,n,r),OC=w.createContext(void 0),wl=()=>w.useContext(OC),MC=w.createContext(void 0),lg=()=>w.useContext(MC),AC=w.createContext(void 0),jC=w.forwardRef((e,n)=>{let r=Ta(()=>{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}}}),o=Ta(()=>new Set),s=Ta(()=>new Map),l=Ta(()=>new Map),u=Ta(()=>new Set),d=NC(e),{label:m,children:h,value:y,onValueChange:v,filter:b,shouldFilter:x,loop:_,disablePointerSelection:C=!1,vimBindings:E=!0,...T}=e,O=dn(),M=dn(),k=dn(),L=w.useRef(null),q=RI();Ro(()=>{if(y!==void 0){let j=y.trim();r.current.value=j,H.emit()}},[y]),Ro(()=>{q(6,se)},[]);let H=w.useMemo(()=>({subscribe:j=>(u.current.add(j),()=>u.current.delete(j)),snapshot:()=>r.current,setState:(j,U,Q)=>{var K,oe,J,pe;if(!Object.is(r.current[j],U)){if(r.current[j]=U,j==="search")le(),ye(),q(1,de);else if(j==="value"){if(document.activeElement.hasAttribute("cmdk-input")||document.activeElement.hasAttribute("cmdk-root")){let ve=document.getElementById(k);ve?ve.focus():(K=document.getElementById(O))==null||K.focus()}if(q(7,()=>{var ve;r.current.selectedItemId=(ve=he())==null?void 0:ve.id,H.emit()}),Q||q(5,se),((oe=d.current)==null?void 0:oe.value)!==void 0){let ve=U??"";(pe=(J=d.current).onValueChange)==null||pe.call(J,ve);return}}H.emit()}},emit:()=>{u.current.forEach(j=>j())}}),[]),I=w.useMemo(()=>({value:(j,U,Q)=>{var K;U!==((K=l.current.get(j))==null?void 0:K.value)&&(l.current.set(j,{value:U,keywords:Q}),r.current.filtered.items.set(j,ge(U,Q)),q(2,()=>{ye(),H.emit()}))},item:(j,U)=>(o.current.add(j),U&&(s.current.has(U)?s.current.get(U).add(j):s.current.set(U,new Set([j]))),q(3,()=>{le(),ye(),r.current.value||de(),H.emit()}),()=>{l.current.delete(j),o.current.delete(j),r.current.filtered.items.delete(j);let Q=he();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 ge(j,U){var Q,K;let oe=(K=(Q=d.current)==null?void 0:Q.filter)!=null?K:pI;return j?oe(j,r.current.search,U):0}function ye(){if(!r.current.search||d.current.shouldFilter===!1)return;let j=r.current.filtered.items,U=[];r.current.filtered.groups.forEach(K=>{let oe=s.current.get(K),J=0;oe.forEach(pe=>{let ve=j.get(pe);J=Math.max(ve,J)}),U.push([K,J])});let Q=L.current;xe().sort((K,oe)=>{var J,pe;let ve=K.getAttribute("id"),ze=oe.getAttribute("id");return((J=j.get(ze))!=null?J:0)-((pe=j.get(ve))!=null?pe:0)}).forEach(K=>{let oe=K.closest(nm);oe?oe.appendChild(K.parentElement===oe?K:K.closest(`${nm} > *`)):Q.appendChild(K.parentElement===Q?K:K.closest(`${nm} > *`))}),U.sort((K,oe)=>oe[1]-K[1]).forEach(K=>{var oe;let J=(oe=L.current)==null?void 0:oe.querySelector(`${Fs}[${Ra}="${encodeURIComponent(K[0])}"]`);J?.parentElement.appendChild(J)})}function de(){let j=xe().find(Q=>Q.getAttribute("aria-disabled")!=="true"),U=j?.getAttribute(Ra);H.setState("value",U||void 0)}function le(){var j,U,Q,K;if(!r.current.search||d.current.shouldFilter===!1){r.current.filtered.count=o.current.size;return}r.current.filtered.groups=new Set;let oe=0;for(let J of o.current){let pe=(U=(j=l.current.get(J))==null?void 0:j.value)!=null?U:"",ve=(K=(Q=l.current.get(J))==null?void 0:Q.keywords)!=null?K:[],ze=ge(pe,ve);r.current.filtered.items.set(J,ze),ze>0&&oe++}for(let[J,pe]of s.current)for(let ve of pe)if(r.current.filtered.items.get(ve)>0){r.current.filtered.groups.add(J);break}r.current.filtered.count=oe}function se(){var j,U,Q;let K=he();K&&(((j=K.parentElement)==null?void 0:j.firstChild)===K&&((Q=(U=K.closest(Fs))==null?void 0:U.querySelector(mI))==null||Q.scrollIntoView({block:"nearest"})),K.scrollIntoView({block:"nearest"}))}function he(){var j;return(j=L.current)==null?void 0:j.querySelector(`${TC}[aria-selected="true"]`)}function xe(){var j;return Array.from(((j=L.current)==null?void 0:j.querySelectorAll(ow))||[])}function N(j){let U=xe()[j];U&&H.setState("value",U.getAttribute(Ra))}function Z(j){var U;let Q=he(),K=xe(),oe=K.findIndex(pe=>pe===Q),J=K[oe+j];(U=d.current)!=null&&U.loop&&(J=oe+j<0?K[K.length-1]:oe+j===K.length?K[0]:K[oe+j]),J&&H.setState("value",J.getAttribute(Ra))}function ne(j){let U=he(),Q=U?.closest(Fs),K;for(;Q&&!K;)Q=j>0?CI(Q,Fs):EI(Q,Fs),K=Q?.querySelector(ow);K?H.setState("value",K.getAttribute(Ra)):Z(j)}let W=()=>N(xe().length-1),ee=j=>{j.preventDefault(),j.metaKey?W():j.altKey?ne(1):Z(1)},D=j=>{j.preventDefault(),j.metaKey?N(0):j.altKey?ne(-1):Z(-1)};return w.createElement(Ie.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&&ee(j);break}case"ArrowDown":{ee(j);break}case"p":case"k":{E&&j.ctrlKey&&D(j);break}case"ArrowUp":{D(j);break}case"Home":{j.preventDefault(),N(0);break}case"End":{j.preventDefault(),W();break}case"Enter":{j.preventDefault();let K=he();if(K){let oe=new Event(Gm);K.dispatchEvent(oe)}}}}},w.createElement("label",{"cmdk-label":"",htmlFor:I.inputId,id:I.labelId,style:OI},m),ld(e,j=>w.createElement(MC.Provider,{value:H},w.createElement(OC.Provider,{value:I},j))))}),gI=w.forwardRef((e,n)=>{var r,o;let s=dn(),l=w.useRef(null),u=w.useContext(AC),d=wl(),m=NC(e),h=(o=(r=m.current)==null?void 0:r.forceMount)!=null?o:u?.forceMount;Ro(()=>{if(!h)return d.item(s,u?.id)},[h]);let y=DC(s,l,[e.value,e.children,l],e.keywords),v=lg(),b=Ii(q=>q.value&&q.value===y.current),x=Ii(q=>h||d.filter()===!1?!0:q.search?q.filtered.items.get(s)>0:!0);w.useEffect(()=>{let q=l.current;if(!(!q||e.disabled))return q.addEventListener(Gm,_),()=>q.removeEventListener(Gm,_)},[x,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(!x)return null;let{disabled:E,value:T,onSelect:O,forceMount:M,keywords:k,...L}=e;return w.createElement(Ie.div,{ref:ka(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)}),vI=w.forwardRef((e,n)=>{let{heading:r,children:o,forceMount:s,...l}=e,u=dn(),d=w.useRef(null),m=w.useRef(null),h=dn(),y=wl(),v=Ii(x=>s||y.filter()===!1?!0:x.search?x.filtered.groups.has(u):!0);Ro(()=>y.group(u),[]),DC(u,d,[e.value,e.heading,m]);let b=w.useMemo(()=>({id:u,forceMount:s}),[s]);return w.createElement(Ie.div,{ref:ka(d,n),...l,"cmdk-group":"",role:"presentation",hidden:v?void 0:!0},r&&w.createElement("div",{ref:m,"cmdk-group-heading":"","aria-hidden":!0,id:h},r),ld(e,x=>w.createElement("div",{"cmdk-group-items":"",role:"group","aria-labelledby":r?h:void 0},w.createElement(AC.Provider,{value:b},x))))}),yI=w.forwardRef((e,n)=>{let{alwaysRender:r,...o}=e,s=w.useRef(null),l=Ii(u=>!u.search);return!r&&!l?null:w.createElement(Ie.div,{ref:ka(s,n),...o,"cmdk-separator":"",role:"separator"})}),bI=w.forwardRef((e,n)=>{let{onValueChange:r,...o}=e,s=e.value!=null,l=lg(),u=Ii(h=>h.search),d=Ii(h=>h.selectedItemId),m=wl();return w.useEffect(()=>{e.value!=null&&l.setState("search",e.value)},[e.value]),w.createElement(Ie.input,{ref:n,...o,"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)}})}),xI=w.forwardRef((e,n)=>{let{children:r,label:o="Suggestions",...s}=e,l=w.useRef(null),u=w.useRef(null),d=Ii(h=>h.selectedItemId),m=wl();return w.useEffect(()=>{if(u.current&&l.current){let h=u.current,y=l.current,v,b=new ResizeObserver(()=>{v=requestAnimationFrame(()=>{let x=h.offsetHeight;y.style.setProperty("--cmdk-list-height",x.toFixed(1)+"px")})});return b.observe(h),()=>{cancelAnimationFrame(v),b.unobserve(h)}}},[]),w.createElement(Ie.div,{ref:ka(l,n),...s,"cmdk-list":"",role:"listbox",tabIndex:-1,"aria-activedescendant":d,"aria-label":o,id:m.listId},ld(e,h=>w.createElement("div",{ref:ka(u,m.listInnerRef),"cmdk-list-sizer":""},h)))}),wI=w.forwardRef((e,n)=>{let{open:r,onOpenChange:o,overlayClassName:s,contentClassName:l,container:u,...d}=e;return w.createElement(ip,{open:r,onOpenChange:o},w.createElement(ap,{container:u},w.createElement(sp,{"cmdk-overlay":"",className:s}),w.createElement(lp,{"aria-label":e.label,"cmdk-dialog":"",className:l},w.createElement(jC,{ref:n,...d}))))}),SI=w.forwardRef((e,n)=>Ii(r=>r.filtered.count===0)?w.createElement(Ie.div,{ref:n,...e,"cmdk-empty":"",role:"presentation"}):null),_I=w.forwardRef((e,n)=>{let{progress:r,children:o,label:s="Loading...",...l}=e;return w.createElement(Ie.div,{ref:n,...l,"cmdk-loading":"",role:"progressbar","aria-valuenow":r,"aria-valuemin":0,"aria-valuemax":100,"aria-label":s},ld(e,u=>w.createElement("div",{"aria-hidden":!0},u)))}),sd=Object.assign(jC,{List:xI,Item:gI,Input:bI,Group:vI,Separator:yI,Dialog:wI,Empty:SI,Loading:_I});function CI(e,n){let r=e.nextElementSibling;for(;r;){if(r.matches(n))return r;r=r.nextElementSibling}}function EI(e,n){let r=e.previousElementSibling;for(;r;){if(r.matches(n))return r;r=r.previousElementSibling}}function NC(e){let n=w.useRef(e);return Ro(()=>{n.current=e}),n}var Ro=typeof window>"u"?w.useEffect:w.useLayoutEffect;function Ta(e){let n=w.useRef();return n.current===void 0&&(n.current=e()),n}function Ii(e){let n=lg(),r=()=>e(n.snapshot());return w.useSyncExternalStore(n.subscribe,r,r)}function DC(e,n,r,o=[]){let s=w.useRef(),l=wl();return Ro(()=>{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=o.map(h=>h.trim());l.value(e,d,m),(u=n.current)==null||u.setAttribute(Ra,d),s.current=d}),s}var RI=()=>{let[e,n]=w.useState(),r=Ta(()=>new Map);return Ro(()=>{r.current.forEach(o=>o()),r.current=new Map},[e]),(o,s)=>{r.current.set(o,s),n({})}};function TI(e){let n=e.type;return typeof n=="function"?n(e.props):"render"in n?n.render(e.props):e}function ld({asChild:e,children:n},r){return e&&w.isValidElement(n)?w.cloneElement(TI(n),{ref:n.ref},r(n.props.children)):r(n)}var OI={position:"absolute",width:"1px",height:"1px",padding:"0",margin:"-1px",overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0"};function MI({className:e,...n}){return p.jsx(sd,{"data-slot":"command",className:We("flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",e),...n})}function AI({className:e,...n}){return p.jsxs("div",{"data-slot":"command-input-wrapper",className:"flex h-9 items-center gap-2 border-b px-3",children:[p.jsx(i_,{className:"size-4 shrink-0 opacity-50"}),p.jsx(sd.Input,{"data-slot":"command-input",className:We("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 jI({className:e,...n}){return p.jsx(sd.List,{"data-slot":"command-list",className:We("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto",e),...n})}function NI({className:e,...n}){return p.jsx(sd.Item,{"data-slot":"command-item",className:We("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 aw(e,n){if(!e)return{score:0,hits:[]};const r=e.toLowerCase(),o=n.toLowerCase();let s=0,l=0,u=0;const d=[];for(let m=0;m3&&o.endsWith("ies")?s=o.slice(0,-3)+"y":o.length>3&&o.endsWith("es")?s=o.slice(0,-2):o.length>2&&o.endsWith("s")&&(s=o.slice(0,-1)),s?aw(s,n):null}function zI({text:e,hits:n}){const r=[];let o=0;return n.forEach((s,l)=>{s>o&&r.push(e.slice(o,s)),r.push(p.jsx("b",{children:e[s]},l)),o=s+1}),r.push(e.slice(o)),p.jsx("span",{className:"plabel",children:r})}function kI({open:e,onClose:n,candidates:r}){const[o,s]=w.useState(""),l=w.useMemo(()=>{if(!e)return[];const d=[];for(const m of r()){const h=DI(o,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,o,r]);w.useEffect(()=>{e&&s("")},[e]);const u=d=>{n(),d.run()};return p.jsx($p,{open:e,onOpenChange:d=>!d&&n(),children:p.jsxs(Ip,{id:"palette",className:"palette",showCloseButton:!1,"aria-describedby":void 0,children:[p.jsx(Ku,{className:"sr-only",children:"Search and quick actions"}),p.jsxs(MI,{shouldFilter:!1,loop:!0,children:[p.jsxs("div",{id:"palette-inputwrap",children:[p.jsx(Dt,{name:"search"}),p.jsx(AI,{id:"palette-input",placeholder:"Search file names, projects, actions…",autoComplete:"off",spellCheck:!1,value:o,onValueChange:s})]}),p.jsx(jI,{id:"palette-results",children:l.length===0?p.jsx("div",{className:"pempty",children:"No matches — search covers file names, projects, and actions"}):l.map(d=>p.jsxs(NI,{value:d.kind+":"+d.label,onSelect:()=>u(d),children:[p.jsx("span",{className:"picon",children:p.jsx(Dt,{name:d.icon})}),p.jsx(zI,{text:d.label,hits:d.hits}),p.jsx("span",{className:"pkind",children:d.kind})]},d.kind+":"+d.label))}),p.jsx("footer",{id:"palette-hint",children:"↑↓ navigate · ⏎ select · esc close"})]})]})})}const qs=3,Oa=30;function LI(e,n){return Yt({queryKey:["heatDevices",e],queryFn:()=>fn(e+"heat?by=device&days=30"),enabled:n,retry:!1,staleTime:6e4}).data?.devices??null}function sw(e){const[n,r]=w.useState("all"),{flatFiles:o,heatMap:s,devices:l,scope:u}=e,d=b=>!u||b===u||b.startsWith(u+"/"),m=u?o.filter(b=>d(b.path)):o,h=l&&u?l.map(b=>{const x={};for(const[_,C]of Object.entries(b.folders||{}))d(_)&&(x[_]=C);return{...b,folders:x}}).filter(b=>Object.keys(b.folders).length>0):l,y=Date.now(),v=m.map(b=>{const x=s&&s[b.path]||{},_=b.time?Math.max(0,(y-new Date(b.time).getTime())/864e5):0,C=n==="all"?ul(x):x[n]||0;return{path:b.path,reads:C,agent:x.agent||0,total:ul(x),days:_,danger:C>=qs&&_>=Oa}});return p.jsxs("div",{className:"insights",children:[p.jsxs("h1",{className:"in-title",children:["Knowledge insights",u?p.jsxs("span",{className:"in-scope",children:[" · ",u]}):null]}),p.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."}),p.jsx("div",{className:"in-lens",children:["all","human","agent"].map(b=>p.jsx("button",{className:"in-lens-btn"+(b===n?" active":""),onClick:()=>r(b),children:b==="all"?"All reads":b==="human"?"Human reads":"Agent reads"},b))}),p.jsx("h3",{className:"dl-h3",children:"Map — cell size = reads, color = freshness"}),p.jsx(II,{pts:v,onOpenFile:e.onOpenFile,onOpenFolder:e.onOpenFolder,isFolder:e.isFolder}),p.jsx("h3",{className:"dl-h3",children:"Reads × freshness"}),p.jsx(VI,{pts:v,onOpenFile:e.onOpenFile}),p.jsx("h3",{className:"dl-h3",children:"Hot path — top files by reads"}),p.jsx(FI,{pts:v,lens:n,onOpenFile:e.onOpenFile}),h&&h.length>0&&p.jsxs(p.Fragment,{children:[p.jsx("h3",{className:"dl-h3",children:"Agent coverage — which agents read which areas"}),p.jsx(PI,{devices:h})]})]})}function $I(e){const n=[[76,195,138],[232,196,84],[224,93,93]],r=Math.min(1,Math.max(0,e/300))*(n.length-1),o=Math.min(n.length-2,Math.floor(r)),s=r-o,l=n[o].map((u,d)=>Math.round(u+(n[o+1][d]-u)*s));return`rgb(${l[0]},${l[1]},${l[2]})`}function lw(e,n,r,o,s){const l=e.reduce((h,y)=>h+y.value,0);if(!l||o<=0||s<=0)return[];const u=e.slice().sort((h,y)=>y.value-h.value).map(h=>({it:h,a:h.value/l*o*s})),d=(h,y)=>{const b=h.reduce((_,C)=>_+C.a,0)/y;let x=0;for(const _ of h){const C=_.a/b;x=Math.max(x,C/b,b/C)}return x},m=[];for(;u.length;){const h=o>=s,y=h?s:o,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 x=0;for(const _ of v){const C=_.a/b;h?m.push({item:_.it,x:n,y:r+x,w:b,h:C}):m.push({item:_.it,x:n+x,y:r,w:C,h:b}),x+=C}h?(n+=b,o-=b):(r+=b,s-=b)}return m}const rm=15;function II({pts:e,onOpenFile:n,onOpenFolder:r,isFolder:o}){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 lw([...u.values()],0,0,720,480)){const h=m.item,y=h.name==="/"?"":h.name;if(d.push(p.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>rm+10){let b=h.name==="/"?"(root)":h.name;const x=Math.floor((m.w-8)/6);b.length>x&&(b=b.slice(0,Math.max(1,x-1))+"…"),d.push(p.jsx("text",{x:m.x+5,y:m.y+12,className:"in-tm-glabel","data-dir":y,children:b},"gl"+h.name))}const v=lw(h.files.map(b=>({...b,name:b.path.split("/").pop(),value:b.reads+1})),m.x+2,m.y+rm,Math.max(0,m.w-4),Math.max(0,m.h-rm-2));for(const b of v)if(d.push(p.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:$I(b.item.days),className:"in-tm-cell","data-path":b.item.path,children:p.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 x=Math.floor((b.w-8)/6);let _=(b.item.danger?"⚠ ":"")+b.item.name;_.length>x&&(_=_.slice(0,Math.max(1,x-1))+"…"),x>=5&&d.push(p.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 p.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&&o(v)&&r(v)},children:d})}function VI({pts:e,onOpenFile:n}){const s={l:44,r:16,t:20,b:34},l=Math.max(Oa*2,...e.map(v=>v.days)),u=Math.max(qs*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 p.jsxs("svg",{viewBox:"0 0 720 360",className:"in-chart",children:[p.jsx("rect",{x:h(Oa),y:s.t,width:720-s.r-h(Oa),height:y(qs)-s.t,className:"in-danger-zone"}),p.jsx("line",{x1:h(Oa),y1:s.t,x2:h(Oa),y2:360-s.b,className:"in-threshold"}),p.jsx("line",{x1:s.l,y1:y(qs),x2:720-s.r,y2:y(qs),className:"in-threshold"}),p.jsx("line",{x1:s.l,y1:360-s.b,x2:720-s.r,y2:360-s.b,className:"in-axis"}),p.jsx("line",{x1:s.l,y1:s.t,x2:s.l,y2:360-s.b,className:"in-axis"}),p.jsx("text",{x:(s.l+720-s.r)/2,y:352,className:"in-label",children:"days since last change →"}),p.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 →"}),p.jsx("text",{x:720-s.r-6,y:s.t+14,className:"in-quad in-quad-danger",textAnchor:"end",children:"hot + stale"}),p.jsx("text",{x:s.l+6,y:s.t+14,className:"in-quad",children:"hot + fresh"}),p.jsx("text",{x:720-s.r-6,y:360-s.b-8,className:"in-quad",textAnchor:"end",children:"cold + stale"}),p.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 p.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:p.jsx("title",{children:`${v.path} — ${v.reads} read${v.reads===1?"":"s"} / 30d · changed ${Math.round(v.days)}d ago`})},v.path)})]})}function FI({pts:e,lens:n,onOpenFile:r}){const o=e.filter(l=>l.reads>0).sort((l,u)=>u.reads-l.reads||u.days-l.days).slice(0,20);if(!o.length)return p.jsx("div",{className:"dl-empty",children:"No reads in the window yet."});const s=o[0].reads;return p.jsxs(p.Fragment,{children:[p.jsx("div",{className:"in-hotpath",children:o.map(l=>{const u=n==="agent"?1:n==="human"?0:l.total?l.agent/l.total:0,d=l.reads/s*100;return p.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:[p.jsx("span",{className:"in-hp-name"+(l.danger?" danger":""),children:l.path+(l.danger?" ⚠":"")}),p.jsxs("span",{className:"in-hp-bar",children:[p.jsx("span",{className:"in-hp-agent",style:{width:(d*u).toFixed(1)+"%"}}),p.jsx("span",{className:"in-hp-human",style:{width:(d*(1-u)).toFixed(1)+"%"}})]}),p.jsx("span",{className:"in-hp-count",children:l.reads})]},l.path)})}),p.jsxs("p",{className:"in-legend",children:[p.jsx("span",{className:"in-sw agent"})," agent reads ",p.jsx("span",{className:"in-sw human"})," human reads"]})]})}function PI({devices:e}){const n=new Map;for(const b of e)for(const[x,_]of Object.entries(b.folders||{}))n.set(x,(n.get(x)||0)+_);const r=[...n.entries()].sort((b,x)=>x[1]-b[1]).slice(0,12).map(b=>b[0]),o=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+o.length*d+58,y=Math.max(1,...o.flatMap(b=>r.map(x=>(b.folders||{})[x]||0))),v=b=>{const x=[23,25,31],_=[245,166,35],C=x.map((E,T)=>Math.round(E+(_[T]-E)*b));return`rgb(${C[0]},${C[1]},${C[2]})`};return p.jsxs("svg",{viewBox:`0 0 ${m} ${h}`,className:"in-chart in-matrix",children:[o.map((b,x)=>{let _=b.name||b.id||"";return _.length>20&&(_=_.slice(0,19)+"…"),p.jsxs("g",{children:[p.jsx("text",{x:s-8,y:l+x*d+17,textAnchor:"end",className:"in-label",children:_}),r.map((C,E)=>{const T=(b.folders||{})[C]||0;return p.jsx("rect",{x:s+E*u,y:l+x*d,width:u-4,height:d-4,rx:3,fill:v(Math.sqrt(T/y)),children:p.jsx("title",{children:`${b.name||b.id} × ${C||"(root)"}: ${T} read${T===1?"":"s"}/30d`})},C)})]},b.id||x)}),r.map((b,x)=>{const _=s+x*u+(u-4)/2,C=l+o.length*d+14;return p.jsx("text",{x:_,y:C,className:"in-label",textAnchor:"end",transform:`rotate(-28 ${_} ${C})`,children:b||"(root)"},b)})]})}function UI(e){const{apiBase:n,target:r,isFolder:o,onMeta:s,onRendered:l}=e,u=r?o(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}=Yt({queryKey:["history",n,d,200],queryFn:()=>fn(n+"history?"+d+"&n=200"),staleTime:15e3});if(w.useEffect(()=>{h&&s("History unavailable: "+h.message)},[h,s]),w.useEffect(()=>{m&&l?.()},[m,l]),!m)return null;const y=m.entries||[],v=!!r&&!o(r),b=x=>{for(let _=x+1;_p.jsx(EC,{entry:x,onOpen:e.onOpen,diff:v?{apiBase:n,prev:b(_)}:void 0},_))]})}function HI(e,n){return e?n(e)?e+"/ (folder)":e:"all changes"}function BI(e){const{apiBase:n,path:r,version:o}=e,s="path="+encodeURIComponent(r),{data:l}=Yt({queryKey:["history",n,s,200],queryFn:()=>fn(n+"history?"+s+"&n=200"),staleTime:15e3}),u=l?.entries?.find(y=>y.blob===o),d=u?hC(u):"",m=u?.time?new Date(u.time).toLocaleString():"",h=n+"blob?sha="+o+"&name="+encodeURIComponent(r.split("/").pop()||r)+"&download=1";return p.jsxs("div",{className:"vbanner",role:"status",children:[p.jsx("span",{className:"vb-icon",children:p.jsx(Dt,{name:"clock"})}),p.jsxs("div",{className:"vb-text",children:[p.jsx("b",{children:[m&&"Version from "+m,d&&"by "+d].filter(Boolean).join(" ")||"Earlier version"}),p.jsx("span",{children:"This is not the current file."})]}),p.jsxs("div",{className:"vb-actions",children:[p.jsx("button",{className:"ai-btn",onClick:e.onViewCurrent,children:"View current"}),p.jsx("a",{className:"ai-btn",download:!0,href:h,children:"Download this version"})]})]})}function zC(e){const{config:n,apiBase:r,route:o,hub:s,project:l}=e,u=Up(),d=Va(),{tree:m,flatFiles:h,dirIndex:y,loaded:v}=m$(r,!s||!!l),b=p$(r,s&&!!l&&!!n.reads?.enabled),x=s&&!!l&&!o.path&&!o.view,_=o.view==="dashboard"||x,C=LI(r,_);w.useEffect(()=>{_&&d.invalidateQueries({queryKey:["heat",r]})},[_,r,d]);const E=o.path,T=o.view?void 0:o.version,O=E||(o.view==="dashboard"||o.view==="history")&&o.viewTarget||"",M=!!E&&y.has(E),k=!!E&&v&&!M&&h.some(Me=>Me.path===E),L=!!E&&v&&!M&&!k,q=M&&!o.view,[H,I]=w.useState(()=>new Set),ge=w.useRef(!0);w.useEffect(()=>{if(!m||!ge.current)return;ge.current=!1;const Me=(m.children||[]).filter(Fe=>Fe.dir);Me.length===1&&I(Fe=>new Set(Fe).add(Me[0].path))},[m]),w.useEffect(()=>{!O||!v||I(Me=>{const Fe=new Set(Me);for(const Be of $$(O))Fe.add(Be);return y.has(O)&&Fe.add(O),Fe})},[O,v,y]);const ye=w.useCallback(Me=>{I(Fe=>{const Be=new Set(Fe);return Be.has(Me)?Be.delete(Me):Be.add(Me),Be})},[]),de=w.useRef(null),le=w.useRef(new Map),se=w.useRef({key:"",want:0,attempts:0});w.useEffect(()=>{se.current={key:u,want:n3()==="POP"?le.current.get(u)??0:0,attempts:0}},[u]);const he=w.useCallback(()=>{const Me=de.current,Fe=se.current;!Me||Fe.key!==u||Fe.attempts>=3||(Fe.attempts++,Me.scrollTo({top:Fe.want,behavior:"instant"}))},[u]),xe=w.useCallback(()=>{de.current&&le.current.set(u,de.current.scrollTop)},[u]),N=w.useCallback((Me,Fe)=>{pn(t3(Me,l?.id,Fe)),fr()},[l?.id]),Z=w.useCallback(Me=>pn(mo("history",l?.id,Me)),[l?.id]),[ne,W]=w.useState(""),[ee,D]=w.useState(null),[j,U]=w.useState(!1),[Q,K]=w.useState(!1);w.useEffect(()=>fD(()=>K(!0)),[]);const oe=w.useRef(null),J=e.panel??null,pe=!J&&s&&!!l&&k&&Cu(l.perm,"write"),ve=!J&&s&&!!l,ze=!J&&k,Ve=!J&&(k||s&&!!l&&M),He=T?r+"blob?sha="+T+"&name="+encodeURIComponent(E)+"&download=1":r+"download?path="+encodeURIComponent(E),mt=w.useCallback(async()=>{try{const Me=await fetch(r+"shares",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:E})});if(!Me.ok)throw new Error(await Me.text());const Fe=await Me.json(),Be=await ll(Fe.url);D({url:Fe.url,copied:Be})}catch(Me){nt("Share failed: "+Me.message,!0)}},[r,E]),Ye=w.useCallback(()=>{if(!E)return Z("");Z(M?E+"/":E)},[E,M,Z]);w.useEffect(()=>{const Me=Fe=>{(Fe.metaKey||Fe.ctrlKey)&&Fe.key.toLowerCase()==="k"&&(Fe.preventDefault(),K(Be=>!Be))};return window.addEventListener("keydown",Me),()=>window.removeEventListener("keydown",Me)},[]);const vn=w.useCallback(()=>{const Me=[],Fe=(Be,ti,ir,ni)=>Me.push({icon:Be,label:ti,kind:ir,run:ni});if(s&&l&&E&&(k&&Fe("share","Share: "+E,"action",mt),Fe("hist","History: "+E,"action",Ye),k&&Fe("download","Download: "+E,"action",()=>oe.current?.click())),s&&l&&Fe("hist","History: whole project","action",()=>Z("")),s)for(const Be of e.projects||[])(!l||Be.id!==l.id)&&Fe("folder","Switch to project: "+Be.name,"project",()=>pn("/"+Be.id));n.auth?.enabled&&Fe("power","Sign out","action",()=>window.location.href="/auth/logout");for(const Be of y.keys())Fe("folder",Be,"folder",()=>N(Be));for(const Be of h)Fe("doc",Be.path,"file",()=>N(Be.path));return Me},[s,l,E,k,n.auth?.enabled,y,h,e.projects,mt,Ye,Z,N]);w.useEffect(()=>{if(!j)return;const Me=()=>U(!1);return document.addEventListener("click",Me),()=>document.removeEventListener("click",Me)},[j]);const Qt=w.useCallback(Me=>y.has(Me),[y]);let Bt="app",nr,lt;J?lt=J.body:o.view==="dashboard"?lt=p.jsx(sw,{flatFiles:h,heatMap:b,devices:C,scope:o.viewTarget||"",onOpenFile:N,onOpenFolder:N,isFolder:Qt}):o.view==="history"?lt=p.jsx(UI,{apiBase:r,target:o.viewTarget||"",isFolder:Qt,onOpen:N,onMeta:W,onRendered:he}):E?v?L?lt=p.jsxs("div",{className:"notfound",children:[p.jsx("h1",{children:"Couldn't find that"}),p.jsxs("p",{children:[p.jsx("code",{children:E})," isn't in this project right now."]}),p.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."}),p.jsx("button",{className:"pbtn",onClick:()=>d.invalidateQueries({queryKey:["tree",r]}),children:"Check again"})]}):M?lt=p.jsx(Y$,{node:y.get(E),heatMap:b,hub:s&&!!l,apiBase:r,onOpen:N,onFullHistory:Z,onRendered:he}):(Bt=uC.test(E)?"wide":"read",nr="markdown",lt=p.jsxs(p.Fragment,{children:[T&&p.jsx(BI,{apiBase:r,path:E,version:T,onViewCurrent:()=>N(E)}),p.jsx(X$,{apiBase:r,path:E,version:T,heatMap:b,flatFiles:h,onOpenFile:N,onMeta:W,onRendered:he})]})):lt=p.jsx("div",{className:"empty",children:"Loading…"}):x?lt=p.jsxs(p.Fragment,{children:[p.jsx(_C,{project:l}),p.jsx("div",{className:"home-insights",children:p.jsx(sw,{flatFiles:h,heatMap:b,devices:C,onOpenFile:N,onOpenFolder:N,isFolder:Qt})})]}):lt=p.jsx("div",{className:"empty",children:"Select a file to read it."});const rr=J?J.crumb:E?p.jsx(I$,{path:E,onOpenFolder:N}):o.view==="dashboard"?"Dashboard — "+(o.viewTarget||l?.name||""):o.view==="history"?"History — "+HI(o.viewTarget||"",Qt):x?l.name:null,Ar=p.jsx(ol,{crumb:rr,meta:ne,actions:p.jsxs(p.Fragment,{children:[pe&&p.jsx(zt,{id:"share-btn",variant:"toolbar",className:"icon-only",title:"Share","aria-label":"Share",onClick:mt,children:p.jsx(Dt,{name:"share"})}),ve&&!E&&!o.view&&p.jsxs(zt,{id:"history-btn",variant:"toolbar",onClick:Ye,children:[p.jsx(Dt,{name:"hist"})," ",p.jsx("span",{className:"lbl",children:"History"})]}),ze&&p.jsx("a",{id:"download",hidden:!0,download:!0,href:He,ref:oe,children:"Download"}),Ve&&p.jsx(zt,{id:"more-btn",variant:"toolbar",className:"icon-only",title:"More actions","aria-label":"More actions",onClick:Me=>{Me.stopPropagation(),U(!j)},children:p.jsx(Dt,{name:"dots"})}),j&&p.jsxs("div",{id:"more-menu",role:"menu",children:[ve&&p.jsx("button",{className:"more-item",onClick:Ye,children:"History"}),ze&&p.jsx("button",{className:"more-item",onClick:()=>oe.current?.click(),children:"Download"}),s&&!!l&&p.jsx("button",{className:"more-item",onClick:()=>{e.onClosePanel?.(),pn(mo("dashboard",l?.id,E))},children:"Dashboard"})]})]})});return p.jsxs(p.Fragment,{children:[p.jsx(il,{vault:e.sidebar.vault,projectsNav:e.sidebar.projectsNav,orgBar:e.sidebar.orgBar,tree:p.jsx(L$,{root:m,expanded:H,onToggle:ye,currentPath:O,listingShowing:q,onOpen:N}),topbar:Ar,contentRef:de,onContentScroll:xe,children:p.jsx(pu,{width:Bt,className:nr,children:lt})}),ee&&p.jsx(iI,{url:ee.url,copied:ee.copied,onClose:()=>D(null)}),p.jsx(kI,{open:Q,onClose:()=>K(!1),candidates:vn})]})}function qI({config:e}){const n=Up(),r=Fp(),[o,s]=w.useState(null),[l,u]=w.useState(null);w.useEffect(()=>u(null),[n]);const d=w.useMemo(()=>{const I=n.split("?")[0].match(/^\/join\/([0-9a-f]+)\/?$/);return I?I[1]:null},[n]),{data:m}=Qk(!d),{data:h}=Xk(!d),y=!!e.auth.admin,{data:v}=f_(y),b=w.useMemo(()=>m_(n,"hub"),[n]),x=w.useMemo(()=>m&&(m.find(I=>I.id===b.project)||o&&m.find(I=>I.org===o)||m[0])||null,[m,b.project,o]);if(w.useEffect(()=>{document.title=x?x.name+" — BearDrive":e.brand||"BearDrive"},[x,e]),d)return p.jsx(GI,{token:d,onDone:async I=>{s(I),await r(),pn("/",{replace:!0})}});const _=e.brand||"BearDrive",C=x&&h?.find(I=>I.id===x.org)||null,E=p.jsx(Zu,{name:_,onHome:()=>pn("/"),search:!!x}),T=e.me?p.jsx(o$,{me:e.me,org:C,orgActive:!!b.org,billing:e.billing,admin:y?{pending:v?.length||0,onClick:()=>{u({kind:"hub"}),fr()}}:void 0}):void 0;if(!m||!h)return p.jsx(il,{vault:E,topbar:p.jsx(ol,{}),children:p.jsx(pu,{children:p.jsx("div",{className:"empty",children:"Loading…"})})});if(!x)return p.jsx(il,{vault:E,projectsNav:p.jsx(Yx,{projects:m}),orgBar:T,topbar:p.jsx(ol,{}),children:p.jsx(pu,{children:p.jsx(h$,{})})});const O=l?.kind==="hub"?{crumb:"Signup & access",body:p.jsx(X8,{})}:null,M=b.org?h.find(I=>I.id===b.org):null,L=b.org&&!M?{crumb:"Organization",body:p.jsxs("div",{className:"empty",children:[p.jsx("h3",{children:"Organization not found"}),p.jsx("p",{children:"This organization doesn't exist, or you're no longer a member."}),p.jsx("p",{children:p.jsxs("a",{...Tm("/"+x.id),children:["Back to ",x.name]})})]})}:M?{crumb:"Organization",body:p.jsx(Z8,{org:M,projects:m,myEmail:e.me?.email||""})}:null,q=b.billing?{crumb:"Billing",body:e.billing?p.jsx(a$,{url:e.billing.url}):p.jsxs("div",{className:"empty",children:[p.jsx("h3",{children:"No billing on this hub"}),p.jsx("p",{children:"This BearDrive hub doesn't have a billing surface."})]})}:null,H=b.view==="settings"?{crumb:"Project settings",body:p.jsx(u$,{project:x,org:C,onDeleted:async()=>{await r(),pn("/")}})}:b.view==="install"?{crumb:"Installation",body:p.jsx(_C,{project:x})}:null;return!b.org&&!b.billing&&b.project!==x.id?p.jsx(sx,{to:"/"+x.id}):b.legacyView&&b.view?p.jsx(sx,{to:mo(b.view,x.id,b.viewTarget)}):p.jsx(zC,{config:e,apiBase:"/api/p/"+x.id+"/",route:b,hub:!0,project:x,projects:m,sidebar:{vault:E,projectsNav:p.jsx(Yx,{projects:m,currentId:x.id,menu:{active:l?null:b.view==="dashboard"&&!b.viewTarget?"dashboard":b.view==="install"?"install":b.view==="history"&&!b.viewTarget?"history":b.view==="settings"?"settings":null,onDashboard:()=>{u(null),pn(mo("dashboard",x.id)),fr()},onInstall:()=>{u(null),pn(mo("install",x.id)),fr()},onHistory:()=>{u(null),pn(mo("history",x.id)),fr()},onSettings:()=>{u(null),pn(mo("settings",x.id)),fr()}}}),orgBar:T},panel:O||L||q||H,onClosePanel:()=>u(null)},x.id)}function GI({token:e,onDone:n}){return w.useEffect(()=>{let r=!1;return Js("/api/invites/"+e).then(o=>{r||(nt(`Welcome — you joined the “${o.org.name}” team. Opening its projects…`),n(o.org.id))}).catch(o=>{r||String(o.message).includes("signing in")||(nt("Could not accept the invite: "+o.message,!0),n(null))}),()=>{r=!0}},[e]),p.jsx(il,{vault:p.jsx(Zu,{name:"BearDrive"}),topbar:p.jsx(ol,{}),children:p.jsx(pu,{children:p.jsx("div",{className:"empty",children:"Joining…"})})})}function ZI({config:e}){const n=Up(),r=e.volume||"BearDrive";w.useEffect(()=>{document.title=e.brand||r},[e,r]);const o=w.useMemo(()=>m_(n,"volume"),[n]);return p.jsx(zC,{config:e,apiBase:"/api/",route:o,hub:!1,sidebar:{vault:p.jsx(Zu,{name:r,showSignout:e.auth.enabled,search:!0})}})}function KI(){const{data:e}=U2();return p.jsxs(lD,{delayDuration:150,children:[e?e.mode==="hub"?p.jsx(qI,{config:e}):p.jsx(ZI,{config:e}):p.jsx(il,{vault:p.jsx(Zu,{name:"…",showSignout:!1}),topbar:p.jsx(ol,{}),children:p.jsx("div",{className:"empty",children:"Loading…"})}),p.jsx(Uk,{}),p.jsx(Zk,{})]})}const YI=new T2({defaultOptions:{queries:{retry:1,refetchOnWindowFocus:!1}}});t2.createRoot(document.getElementById("root")).render(p.jsx(w.StrictMode,{children:p.jsx(O2,{client:YI,children:p.jsx(KI,{})})}));
diff --git a/internal/webapp/static/index.html b/internal/webapp/static/index.html
index 5198e6c..025b3b3 100644
--- a/internal/webapp/static/index.html
+++ b/internal/webapp/static/index.html
@@ -5,7 +5,7 @@
BearDrive
-
+