git-history-ui 3.2.2 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/build/frontend/{chunk-TQVUSJBM.js → chunk-3KK6F5JX.js} +1 -1
- package/build/frontend/{chunk-3FFYILBL.js → chunk-6VRZZB3T.js} +1 -1
- package/build/frontend/chunk-AWMYL3YU.js +1 -0
- package/build/frontend/{chunk-36NFLS3P.js → chunk-CFCRPNUQ.js} +1 -1
- package/build/frontend/chunk-EZUFC4CQ.js +1 -0
- package/build/frontend/chunk-GRG6HTLW.js +9 -0
- package/build/frontend/{chunk-N7UHDKJ7.js → chunk-I4VBIHH2.js} +1 -1
- package/build/frontend/chunk-L4LXF744.js +2 -0
- package/build/frontend/chunk-OBPR2XVH.js +5 -0
- package/build/frontend/{chunk-YSTG766K.js → chunk-UHWTLUOW.js} +1 -1
- package/build/frontend/{chunk-ITIFFECZ.js → chunk-UIWFTWLF.js} +1 -1
- package/build/frontend/{chunk-R33W2FKN.js → chunk-UNROVCUZ.js} +2 -2
- package/build/frontend/chunk-VHEMN3MU.js +1 -0
- package/build/frontend/index.html +2 -2
- package/build/frontend/main-6PSVVDXD.js +1 -0
- package/build/frontend/styles-DUWPKHDX.css +1 -0
- package/dist/backend/cache/sqliteIndex.d.ts +8 -2
- package/dist/backend/cache/sqliteIndex.js +24 -9
- package/dist/backend/cache/sqliteIndex.js.map +1 -1
- package/dist/backend/gitService.d.ts +9 -3
- package/dist/backend/gitService.js +126 -53
- package/dist/backend/gitService.js.map +1 -1
- package/dist/backend/grouping/prGrouping.d.ts +1 -0
- package/dist/backend/grouping/prGrouping.js +1 -0
- package/dist/backend/grouping/prGrouping.js.map +1 -1
- package/dist/backend/insights.d.ts +2 -0
- package/dist/backend/insights.js +2 -1
- package/dist/backend/insights.js.map +1 -1
- package/dist/backend/search/nlSearch.d.ts +5 -0
- package/dist/backend/search/nlSearch.js +5 -3
- package/dist/backend/search/nlSearch.js.map +1 -1
- package/dist/backend/server.js +27 -5
- package/dist/backend/server.js.map +1 -1
- package/package.json +1 -1
- package/build/frontend/chunk-B7ZU76GM.js +0 -1
- package/build/frontend/chunk-HQV5AEMT.js +0 -3
- package/build/frontend/chunk-NUMLL3OZ.js +0 -1
- package/build/frontend/chunk-QUDEGJKI.js +0 -1
- package/build/frontend/chunk-RPBKHRPI.js +0 -2
- package/build/frontend/chunk-TQE5NWMZ.js +0 -5
- package/build/frontend/main-6GA6B4NK.js +0 -1
- package/build/frontend/styles-AH3HC64Q.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as J}from"./chunk-UNROVCUZ.js";import{a as V,b as B,c as U,d as Y,h as q}from"./chunk-UHWTLUOW.js";import{a as G}from"./chunk-I4VBIHH2.js";import"./chunk-UIWFTWLF.js";import{$ as v,Ab as d,Bb as y,Cb as A,Ga as a,Hb as j,Pa as F,Rb as h,Sb as O,Ta as m,W as D,cc as R,db as l,dc as L,ea as E,eb as r,fa as S,fb as o,gb as _,gc as $,lc as w,mb as N,mc as H,nb as C,oa as g,ob as p,wb as k,xb as M,yb as z,zb as s}from"./chunk-OBPR2XVH.js";var x=class i{http=v(H);base="/api";snapshot(t){let e=new w().set("at",t);return this.http.get(`${this.base}/snapshot`,{params:e})}rangeDiff(t,e){let n=new w().set("from",t).set("to",e);return this.http.get(`${this.base}/diff`,{params:n})}static \u0275fac=function(e){return new(e||i)};static \u0275prov=D({token:i,factory:i.\u0275fac,providedIn:"root"})};function X(i,t){if(i&1&&(r(0,"span",19),s(1,"|"),o()),i&2){let e=t.$implicit,n=t.index,c=p();M("active",n===c.tickIndex()),l("title",e.label)}}function Z(i,t){if(i&1&&(r(0,"li")(1,"span",28),s(2),o(),r(3,"code",29),s(4),o()()),i&2){let e=t.$implicit;a(2),d(e.name),a(2),d(e.hash.slice(0,7))}}function ee(i,t){if(i&1&&(r(0,"div",25)(1,"span",22),s(2),o(),r(3,"ul",26),m(4,Z,5,2,"li",27),o()()),i&2){let e=p().ngIf,n=p();a(2),y("Branches (",n.branchEntries(e).length,")"),a(2),l("ngForOf",n.branchEntries(e).slice(0,8))}}function te(i,t){if(i&1&&(r(0,"li")(1,"span",28),s(2),o(),r(3,"code",29),s(4),o()()),i&2){let e=t.$implicit;a(2),d(e.name),a(2),d(e.hash.slice(0,7))}}function ne(i,t){if(i&1&&(r(0,"div",25)(1,"span",22),s(2),o(),r(3,"ul",26),m(4,te,5,2,"li",27),o()()),i&2){let e=p().ngIf,n=p();a(2),y("Tags (",n.tagEntries(e).length,")"),a(2),l("ngForOf",n.tagEntries(e).slice(0,8))}}function ie(i,t){if(i&1&&(r(0,"section",20)(1,"div",21)(2,"span",22),s(3,"HEAD at this moment"),o(),r(4,"code",23),s(5),o()(),m(6,ee,5,2,"div",24)(7,ne,5,2,"div",24),o()),i&2){let e=t.ngIf,n=p();a(5),d(e.ref??"(no commits yet)"),a(),l("ngIf",n.branchEntries(e).length),a(),l("ngIf",n.tagEntries(e).length)}}function ae(i,t){i&1&&(r(0,"span",30),s(1,"Computing diff\u2026"),o())}function oe(i,t){if(i&1&&(r(0,"span",30),s(1),o()),i&2){let e=t.ngIf;a(),d(e)}}function re(i,t){i&1&&(r(0,"span",31),s(1," No differences (you're already at HEAD). "),o())}function se(i,t){if(i&1){let e=N();r(0,"div",34),C("click",function(){let c=E(e).$implicit,f=p(2);return S(f.selectedFile.set(c))}),r(1,"span"),s(2),o(),r(3,"span",35),s(4),o(),r(5,"span",36),s(6),o()()}if(i&2){let e=t.$implicit,n=p(2);M("selected",e===n.selectedFile()),a(),z(j("status status-",e.status)),a(),d(n.statusLabel(e.status)),a(2),d(e.file),a(2),A("+",e.additions," \u2212",e.deletions)}}function le(i,t){if(i&1&&(r(0,"div",32),m(1,se,7,9,"div",33),o()),i&2){let e=p();a(),l("ngForOf",e.diff())}}function de(i,t){if(i&1&&(r(0,"div",37),_(1,"app-diff-viewer",38),o()),i&2){let e=t.ngIf;a(),l("fileInput",e)}}var K=class i{state=v(G);timelineApi=v(x);snapshot=g(null);diff=g(null);loadingDiff=g(!1);diffError=g(null);selectedFile=g(null);tickIndex=g(0);ticks=h(()=>ce(this.state.commits()));atDisplay=h(()=>{let t=this.ticks()[this.tickIndex()];return t?t.label:""});firstTickLabel=h(()=>this.ticks()[0]?.label??"");lastTickLabel=h(()=>this.ticks()[this.ticks().length-1]?.label??"");tickPct=h(()=>{let t=Math.max(1,this.ticks().length-1);return Math.round(this.tickIndex()/t*100)});constructor(){O(()=>{let t=this.ticks();t.length!==0&&this.tickIndex()>=t.length&&this.tickIndex.set(t.length-1)}),O(()=>{let t=this.ticks()[this.tickIndex()];t&&this.timelineApi.snapshot(t.iso).subscribe({next:e=>{this.snapshot.set(e),this.loadDiff(e)},error:()=>this.snapshot.set(null)})})}onTickChange(t){this.tickIndex.set(Math.max(0,Math.min(this.ticks().length-1,Number(t))))}branchEntries(t){return Object.entries(t.branches).map(([e,n])=>({name:e,hash:n}))}tagEntries(t){return Object.entries(t.tags).map(([e,n])=>({name:e,hash:n}))}statusLabel(t){return t==="modified"?"mod":t.slice(0,3)}loadDiff(t){if(!t.ref){this.diff.set([]),this.selectedFile.set(null);return}let e=this.state.commits()[0]?.hash;if(!e||e===t.ref){this.diff.set([]),this.selectedFile.set(null);return}this.loadingDiff.set(!0),this.diffError.set(null),this.timelineApi.rangeDiff(t.ref,e).subscribe({next:n=>{this.diff.set(n),this.selectedFile.set(n[0]??null),this.loadingDiff.set(!1)},error:n=>{this.diffError.set(n?.error?.error??"Failed to compute diff"),this.loadingDiff.set(!1)}})}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=F({type:i,selectors:[["app-timeline"]],decls:31,vars:16,consts:[[1,"page"],[1,"head"],[1,"sub"],[1,"now"],[1,"slider-wrap"],[1,"rail"],[1,"rail-fill"],[1,"rail-knob"],["type","range","min","0",1,"slider",3,"ngModelChange","max","ngModel"],[1,"ticks"],["class","tick",3,"active","title",4,"ngFor","ngForOf"],[1,"tick-labels"],["class","snapshot",4,"ngIf"],[1,"diff-panel"],[1,"diff-head"],["class","diff-status",4,"ngIf"],["class","diff-status muted",4,"ngIf"],["class","files",4,"ngIf"],["class","diff-body",4,"ngIf"],[1,"tick",3,"title"],[1,"snapshot"],[1,"snap-card"],[1,"snap-label"],[1,"snap-hash"],["class","snap-card branches",4,"ngIf"],[1,"snap-card","branches"],[1,"ref-list"],[4,"ngFor","ngForOf"],[1,"ref-name"],[1,"ref-hash"],[1,"diff-status"],[1,"diff-status","muted"],[1,"files"],["class","file",3,"selected","click",4,"ngFor","ngForOf"],[1,"file",3,"click"],[1,"path"],[1,"changes"],[1,"diff-body"],[3,"fileInput"]],template:function(e,n){if(e&1&&(r(0,"div",0)(1,"header",1)(2,"div")(3,"h2"),s(4,"Time travel"),o(),r(5,"p",2),s(6,"Drag the slider to see repo state at any point. Diff is computed against current HEAD."),o()(),r(7,"div",3),s(8),o()(),r(9,"div",4)(10,"div",5),_(11,"div",6)(12,"div",7),o(),r(13,"input",8),C("ngModelChange",function(f){return n.onTickChange(f)}),o(),r(14,"div",9),m(15,X,2,3,"span",10),o(),r(16,"div",11)(17,"span"),s(18),o(),r(19,"span"),s(20),o()()(),m(21,ie,8,3,"section",12),r(22,"section",13)(23,"div",14)(24,"h3"),s(25,"Diff vs HEAD"),o(),m(26,ae,2,0,"span",15)(27,oe,2,1,"span",15)(28,re,2,0,"span",16),o(),m(29,le,2,1,"div",17)(30,de,2,1,"div",18),o()()),e&2){let c,f;a(8),d(n.atDisplay()),a(3),k("width",n.tickPct(),"%"),a(),k("left",n.tickPct(),"%"),a(),l("max",n.ticks().length-1)("ngModel",n.tickIndex()),a(2),l("ngForOf",n.ticks()),a(3),d(n.firstTickLabel()),a(2),d(n.lastTickLabel()),a(),l("ngIf",n.snapshot()),a(5),l("ngIf",n.loadingDiff()),a(),l("ngIf",n.diffError()),a(),l("ngIf",!n.loadingDiff()&&!n.diffError()&&((c=n.diff())==null?null:c.length)===0),a(),l("ngIf",(((f=n.diff())==null?null:f.length)??0)>0),a(),l("ngIf",n.selectedFile())}},dependencies:[$,R,L,q,V,Y,B,U,J],styles:["[_nghost-%COMP%]{display:block;flex:1;min-height:0;overflow-y:auto}.page[_ngcontent-%COMP%]{padding:1.1rem 1.25rem 1.4rem;max-width:1240px;margin:0 auto}.head[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-end;gap:1rem;margin-bottom:1rem}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:clamp(20px,2vw,28px);letter-spacing:-.03em}.head[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%]{margin:.2rem 0 0;color:var(--fg-muted);font-size:13px}.now[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:13px;padding:.4rem .7rem;background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:999px;box-shadow:var(--shadow-sm)}.slider-wrap[_ngcontent-%COMP%]{position:relative;background:radial-gradient(circle at 20% 0%,color-mix(in oklab,var(--accent) 14%,transparent),transparent 42%),var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:1rem 1.25rem;margin-bottom:1rem;box-shadow:var(--shadow-sm)}.rail[_ngcontent-%COMP%]{position:relative;height:10px;margin:.25rem 0 .85rem;border-radius:999px;background:var(--bg-surface-2);overflow:visible}.rail-fill[_ngcontent-%COMP%]{height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--accent),#06b6d4);transition:width .12s ease}.rail-knob[_ngcontent-%COMP%]{position:absolute;top:50%;width:18px;height:18px;border-radius:50%;background:var(--bg-surface);border:3px solid var(--accent);box-shadow:var(--shadow-md);transform:translate(-50%,-50%);pointer-events:none}.slider[_ngcontent-%COMP%]{width:100%;accent-color:var(--accent);opacity:.01;position:absolute;left:1.25rem;right:1.25rem;top:.95rem;width:calc(100% - 2.5rem);height:34px;cursor:ew-resize}.ticks[_ngcontent-%COMP%]{display:flex;justify-content:space-between;margin-top:.4rem;color:var(--fg-subtle);font-size:10px}.tick.active[_ngcontent-%COMP%]{color:var(--accent);font-weight:700}.tick-labels[_ngcontent-%COMP%]{display:flex;justify-content:space-between;margin-top:.5rem;font-size:11px;color:var(--fg-muted)}.snapshot[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:.75rem;margin-bottom:1rem}.snap-card[_ngcontent-%COMP%]{background:linear-gradient(180deg,color-mix(in oklab,var(--bg-panel) 96%,white 4%),var(--bg-panel));border:1px solid var(--border-soft);border-radius:var(--radius-lg);padding:.75rem 1rem;box-shadow:var(--shadow-sm);transition:border-color .12s,box-shadow .12s,transform .12s}.snap-card[_ngcontent-%COMP%]:hover{border-color:color-mix(in oklab,var(--accent) 28%,var(--border-soft));box-shadow:var(--shadow-md);transform:translateY(-1px)}.snap-label[_ngcontent-%COMP%]{display:block;font-size:11px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.4rem}.snap-hash[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);font-size:13px;color:var(--accent);word-break:break-all}.ref-list[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;font-size:12px}.ref-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:2px 0;gap:1rem}.ref-name[_ngcontent-%COMP%]{color:var(--fg-secondary)}.ref-hash[_ngcontent-%COMP%]{font-family:var(--font-mono, monospace);color:var(--fg-muted);font-size:11px}.diff-panel[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-soft);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-sm)}.diff-head[_ngcontent-%COMP%]{padding:.75rem 1rem;border-bottom:1px solid var(--border-soft);display:flex;align-items:baseline;gap:1rem}.diff-head[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:14px}.diff-status[_ngcontent-%COMP%]{font-size:12px;color:var(--fg-muted)}.diff-status.muted[_ngcontent-%COMP%]{font-style:italic}.files[_ngcontent-%COMP%]{display:flex;gap:.4rem;padding:.65rem;max-height:170px;overflow:auto;flex-wrap:wrap;background:color-mix(in oklab,var(--bg-surface-2) 56%,transparent)}.file[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.6rem;padding:.38rem .65rem;cursor:pointer;font-size:12px;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-surface);max-width:100%}.file[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.file.selected[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 18%,transparent);border-color:color-mix(in oklab,var(--accent) 40%,var(--border-soft))}.status[_ngcontent-%COMP%]{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--bg-surface-2);color:var(--fg-muted);text-transform:uppercase}.status-added[_ngcontent-%COMP%]{background:#10b9812e;color:#10b981}.status-deleted[_ngcontent-%COMP%]{background:#ef44442e;color:#ef4444}.status-modified[_ngcontent-%COMP%]{background:#6366f12e;color:var(--accent)}.path[_ngcontent-%COMP%]{flex:1;font-family:var(--font-mono, monospace);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.changes[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.diff-body[_ngcontent-%COMP%]{border-top:1px solid var(--border-soft);padding:.5rem 0}"],changeDetection:0})};function ce(i){if(i.length===0)return[];let t=[...i].sort((u,b)=>u.date.localeCompare(b.date)),e=t[0].date,n=t[t.length-1].date,c=new Date(e),P=new Date(n).getTime()-c.getTime(),I=Math.max(12,Math.min(24,Math.floor(P/(1e3*60*60*24*7))+1)),Q=P/Math.max(1,I-1),T=[];for(let u=0;u<I;u++){let b=new Date(c.getTime()+u*Q);T.push({iso:b.toISOString(),label:b.toISOString().slice(0,10)})}return T}export{K as TimelineComponent};
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<meta name="theme-color" content="#0b1020" media="(prefers-color-scheme: dark)">
|
|
10
10
|
<meta name="theme-color" content="#f7f8fa" media="(prefers-color-scheme: light)">
|
|
11
11
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%234f46e5' d='M12 .5a11.5 11.5 0 1 0 11.5 11.5A11.5 11.5 0 0 0 12 .5Zm5.7 14.83a1 1 0 0 1-1.41 1.41L13 13.41V19a1 1 0 0 1-2 0v-5.59l-3.29 3.33A1 1 0 1 1 6.3 15.34l5-5.05a1 1 0 0 1 1.42 0Z'/%3E%3C/svg%3E">
|
|
12
|
-
<style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}:root{color-scheme:light;--bg-app:#f7f8fa;--bg-surface:#ffffff;--bg-surface-2:#f3f4f6;--bg-elevated:#ffffff;--bg-hover:#eef2ff;--bg-selected:#e0e7ff;--bg-overlay:rgba(15, 23, 42, .45);--fg-primary:#0f172a;--fg-secondary:#475569;--fg-muted:#64748b;--fg-subtle:#94a3b8;--fg-inverted:#ffffff;--border-soft:#e2e8f0;--border-strong:#cbd5e1;--border-focus:#6366f1;--accent:#4f46e5;--accent-hover:#4338ca;--accent-soft:#eef2ff;--accent-fg:#ffffff;--success:#16a34a;--warning:#d97706;--danger:#dc2626;--diff-add-bg:#dcfce7;--diff-add-fg:#14532d;--diff-add-gutter:#86efac;--diff-del-bg:#fee2e2;--diff-del-fg:#7f1d1d;--diff-del-gutter:#fca5a5;--diff-hunk-bg:#f1f5f9;--diff-hunk-fg:#475569;--graph-guide:rgba(148, 163, 184, .28);--graph-row-alt:rgba(15, 23, 42, .025);--graph-row-hover:rgba(79, 70, 229, .08);--graph-row-selected:rgba(79, 70, 229, .14);--graph-node-ring:#ffffff;--graph-shadow:rgba(15, 23, 42, .12);--shadow-sm:0 1px 2px rgba(15, 23, 42, .06);--shadow-md:0 4px 12px rgba(15, 23, 42, .08);--shadow-lg:0 12px 32px rgba(15, 23, 42, .12);--radius-sm:6px;--radius-md:10px;--radius-lg:14px;--font-sans:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-
|
|
12
|
+
<style>*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgb(59 130 246 / .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}:root{color-scheme:light;--bg-app:#f7f8fa;--bg-surface:#ffffff;--bg-surface-2:#f3f4f6;--bg-elevated:#ffffff;--bg-panel:rgba(255, 255, 255, .78);--bg-glass:rgba(255, 255, 255, .72);--bg-hover:#eef2ff;--bg-selected:#e0e7ff;--bg-overlay:rgba(15, 23, 42, .45);--bg-gradient:radial-gradient(circle at 12% -8%, rgba(79, 70, 229, .12), transparent 34%), radial-gradient(circle at 90% 0%, rgba(6, 182, 212, .12), transparent 28%), linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);--fg-primary:#0f172a;--fg-secondary:#475569;--fg-muted:#64748b;--fg-subtle:#94a3b8;--fg-inverted:#ffffff;--border-soft:#e2e8f0;--border-strong:#cbd5e1;--border-focus:#6366f1;--accent:#4f46e5;--accent-hover:#4338ca;--accent-soft:#eef2ff;--accent-fg:#ffffff;--accent-ring:rgba(99, 102, 241, .18);--success:#16a34a;--warning:#d97706;--danger:#dc2626;--diff-add-bg:#dcfce7;--diff-add-fg:#14532d;--diff-add-gutter:#86efac;--diff-del-bg:#fee2e2;--diff-del-fg:#7f1d1d;--diff-del-gutter:#fca5a5;--diff-hunk-bg:#f1f5f9;--diff-hunk-fg:#475569;--graph-guide:rgba(148, 163, 184, .28);--graph-row-alt:rgba(15, 23, 42, .025);--graph-row-hover:rgba(79, 70, 229, .08);--graph-row-selected:rgba(79, 70, 229, .14);--graph-node-ring:#ffffff;--graph-shadow:rgba(15, 23, 42, .12);--chart-add:#16a34a;--chart-del:#dc2626;--chart-line:#4f46e5;--chart-fill:rgba(79, 70, 229, .16);--shadow-sm:0 1px 2px rgba(15, 23, 42, .06);--shadow-md:0 4px 12px rgba(15, 23, 42, .08);--shadow-lg:0 12px 32px rgba(15, 23, 42, .12);--shadow-glow:0 16px 60px rgba(79, 70, 229, .14);--radius-sm:6px;--radius-md:10px;--radius-lg:14px;--radius-xl:18px;--font-sans:ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-gradient);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}</style><link rel="stylesheet" href="styles-DUWPKHDX.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-DUWPKHDX.css"></noscript></head>
|
|
13
13
|
<body>
|
|
14
14
|
<app-root></app-root>
|
|
15
|
-
<link rel="modulepreload" href="chunk-
|
|
15
|
+
<link rel="modulepreload" href="chunk-CFCRPNUQ.js"><link rel="modulepreload" href="chunk-UHWTLUOW.js"><link rel="modulepreload" href="chunk-AWMYL3YU.js"><link rel="modulepreload" href="chunk-I4VBIHH2.js"><link rel="modulepreload" href="chunk-6VRZZB3T.js"><link rel="modulepreload" href="chunk-OBPR2XVH.js"><script src="polyfills-5CFQRCPP.js" type="module"></script><script src="main-6PSVVDXD.js" type="module"></script></body>
|
|
16
16
|
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as be,b as ve,c as xe}from"./chunk-CFCRPNUQ.js";import{a as z,b as B,c as R,e as fe,f as he,g as _e,h as j}from"./chunk-UHWTLUOW.js";import{a as Ce}from"./chunk-AWMYL3YU.js";import{a as S}from"./chunk-I4VBIHH2.js";import{a as ae,c as de,e as me,f as ue,g as ge}from"./chunk-6VRZZB3T.js";import{$ as v,Ab as b,Bb as C,D as Y,Ea as ie,F as ee,Fa as D,Ga as a,Jb as oe,Pa as M,Pb as re,R as te,Rb as y,Sb as w,Ta as f,W as ne,ab as E,cc as I,db as c,dc as k,ea as m,eb as o,fa as u,fb as r,ga as P,gb as x,gc as T,ha as $,kb as V,lb as F,lc as se,mb as _,mc as le,nb as p,nc as ce,oa as O,ob as g,oc as pe,q as X,sb as N,tb as L,ub as A,xb as H,zb as l}from"./chunk-OBPR2XVH.js";var ye=[{path:"",loadComponent:()=>import("./chunk-L4LXF744.js").then(n=>n.HomeShellComponent),pathMatch:"full"},{path:"timeline",loadComponent:()=>import("./chunk-VHEMN3MU.js").then(n=>n.TimelineComponent)},{path:"file/:path",loadComponent:()=>import("./chunk-3KK6F5JX.js").then(n=>n.FileHistoryComponent)},{path:"insights",loadComponent:()=>import("./chunk-GRG6HTLW.js").then(n=>n.InsightsComponent)},{path:"**",redirectTo:""}];var Me={providers:[re({eventCoalescing:!0}),ge(ye),ce(pe())]};var ke=["input"];function Te(n,e){if(n&1){let t=_();o(0,"div",3),p("click",function(){m(t);let s=g();return u(s.close())}),r()}}function Se(n,e){if(n&1){let t=_();o(0,"li",11),p("mouseenter",function(){let s=m(t).index,d=g(2);return u(d.index.set(s))})("click",function(){let s=m(t).$implicit,d=g(2);return u(d.pick(s))}),o(1,"span",12),l(2),r(),o(3,"span",13),l(4),r(),o(5,"span",14),l(6),r()()}if(n&2){let t=e.$implicit,i=e.index,s=g(2);H("active",i===s.index()),E("aria-selected",i===s.index()),a(2),b(t.shortHash),a(2),b(t.subject),a(2),b(t.author)}}function Oe(n,e){n&1&&(o(0,"li",15),l(1,"No matches."),r())}function Pe(n,e){if(n&1){let t=_();o(0,"div",4)(1,"input",5,0),p("ngModelChange",function(s){m(t);let d=g();return u(d.onQuery(s))})("keydown",function(s){m(t);let d=g();return u(d.onKey(s))}),r(),o(3,"ul",6),f(4,Se,7,6,"li",7)(5,Oe,2,0,"li",8),r(),o(6,"div",9)(7,"span")(8,"kbd",10),l(9,"\u2191"),r(),o(10,"kbd",10),l(11,"\u2193"),r(),l(12," navigate"),r(),o(13,"span")(14,"kbd",10),l(15,"Enter"),r(),l(16," select"),r(),o(17,"span")(18,"kbd",10),l(19,"Esc"),r(),l(20," close"),r()()()}if(n&2){let t=g();a(),c("ngModel",t.query()),a(3),c("ngForOf",t.results())("ngForTrackBy",t.trackByHash),a(),c("ngIf",!t.results().length)}}var q=class n{state=v(S);input;query=O("");index=O(0);results=y(()=>{let e=this.query().trim().toLowerCase(),t=this.state.commits();return e?t.filter(i=>i.hash.toLowerCase().startsWith(e)||i.shortHash.toLowerCase().startsWith(e)||i.subject.toLowerCase().includes(e)||i.author.toLowerCase().includes(e)).slice(0,50):t.slice(0,50)});constructor(){w(()=>{this.state.paletteOpen()&&(this.query.set(""),this.index.set(0),queueMicrotask(()=>this.input?.nativeElement.focus()))}),w(()=>{let e=this.results().length;this.index()>=e&&this.index.set(Math.max(0,e-1))})}trackByHash(e,t){return t.hash}onQuery(e){this.query.set(e),this.index.set(0)}onKey(e){if(e.key==="ArrowDown")e.preventDefault(),this.index.update(t=>Math.min(this.results().length-1,t+1));else if(e.key==="ArrowUp")e.preventDefault(),this.index.update(t=>Math.max(0,t-1));else if(e.key==="Enter"){e.preventDefault();let t=this.results()[this.index()];t&&this.pick(t)}else e.key==="Escape"&&(e.preventDefault(),this.close())}pick(e){this.state.selectHash(e.hash),this.close()}close(){this.state.paletteOpen.set(!1)}onGlobal(e){(e.metaKey||e.ctrlKey)&&(e.key==="k"||e.key==="K")&&(e.preventDefault(),this.state.paletteOpen.set(!this.state.paletteOpen()))}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=M({type:n,selectors:[["app-command-palette"]],viewQuery:function(t,i){if(t&1&&N(ke,5),t&2){let s;L(s=A())&&(i.input=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onGlobal(d)},D)},decls:2,vars:2,consts:[["input",""],["class","backdrop",3,"click",4,"ngIf"],["class","palette","role","dialog","aria-modal","true",4,"ngIf"],[1,"backdrop",3,"click"],["role","dialog","aria-modal","true",1,"palette"],["type","text","placeholder","Jump to a commit by hash, subject, or author\u2026",1,"search",3,"ngModelChange","keydown","ngModel"],["role","listbox",1,"results"],["class","result",3,"active","mouseenter","click",4,"ngFor","ngForOf","ngForTrackBy"],["class","result empty",4,"ngIf"],[1,"footer"],[1,"kbd"],[1,"result",3,"mouseenter","click"],[1,"hash"],[1,"subj"],[1,"auth"],[1,"result","empty"]],template:function(t,i){t&1&&f(0,Te,1,0,"div",1)(1,Pe,21,4,"div",2),t&2&&(c("ngIf",i.state.paletteOpen()),a(),c("ngIf",i.state.paletteOpen()))},dependencies:[T,I,k,j,z,B,R],styles:[".backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:90}.palette[_ngcontent-%COMP%]{position:fixed;top:12vh;left:50%;transform:translate(-50%);width:min(640px,calc(100vw - 32px));background:color-mix(in oklab,var(--bg-glass) 96%,transparent);border:1px solid var(--border-soft);border-radius:var(--radius-xl);box-shadow:var(--shadow-lg),var(--shadow-glow);-webkit-backdrop-filter:blur(18px) saturate(1.2);backdrop-filter:blur(18px) saturate(1.2);z-index:100;overflow:hidden}.search[_ngcontent-%COMP%]{width:100%;border:0;outline:0;padding:1rem 1.1rem;background:transparent;color:var(--fg-primary);font-size:14px;border-bottom:1px solid var(--border-soft)}.results[_ngcontent-%COMP%]{list-style:none;margin:0;padding:.25rem 0;max-height:50vh;overflow:auto}.result[_ngcontent-%COMP%]{display:grid;grid-template-columns:70px 1fr auto;align-items:center;gap:.6rem;padding:.52rem 1rem;cursor:pointer;font-size:13px}.result.active[_ngcontent-%COMP%]{background:color-mix(in oklab,var(--accent) 12%,transparent);box-shadow:inset 3px 0 0 var(--accent)}.result.empty[_ngcontent-%COMP%]{grid-template-columns:1fr;color:var(--fg-muted);cursor:default}.hash[_ngcontent-%COMP%]{font-family:var(--font-mono);color:var(--fg-muted)}.subj[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--fg-primary)}.auth[_ngcontent-%COMP%]{color:var(--fg-muted);font-size:11px}.footer[_ngcontent-%COMP%]{display:flex;gap:1rem;padding:.4rem .75rem;background:color-mix(in oklab,var(--bg-surface-2) 84%,transparent);border-top:1px solid var(--border-soft);font-size:11px;color:var(--fg-muted)}"],changeDetection:0})};function Ee(n,e){if(n&1&&(o(0,"kbd",11),l(1),r()),n&2){let t=e.$implicit;a(),b(t)}}function Ie(n,e){if(n&1&&(o(0,"li")(1,"span",8),l(2),r(),o(3,"span",9),f(4,Ee,2,1,"kbd",10),r()()),n&2){let t=e.$implicit;a(2),b(t.description),a(2),c("ngForOf",t.keys)}}function Ve(n,e){if(n&1&&(o(0,"section")(1,"h3"),l(2),r(),o(3,"ul"),f(4,Ie,5,2,"li",7),r()()),n&2){let t=e.$implicit;a(2),b(t.title),a(2),c("ngForOf",t.bindings)}}function Fe(n,e){if(n&1){let t=_();V(0),o(1,"div",1),p("click",function(){m(t);let s=g();return u(s.close())}),r(),o(2,"div",2)(3,"div",3)(4,"h2",4),l(5,"Keyboard shortcuts"),r(),o(6,"button",5),p("click",function(){m(t);let s=g();return u(s.close())}),l(7,"\u2715"),r()(),o(8,"div",6),f(9,Ve,5,2,"section",7),r()(),F()}if(n&2){let t=g();a(9),c("ngForOf",t.groups)}}var De=[{title:"Navigation",bindings:[{keys:["j"],description:"Next commit"},{keys:["k"],description:"Previous commit"},{keys:["g"],description:"Jump to newest commit"},{keys:["G"],description:"Jump to oldest commit"}]},{title:"Search & overlays",bindings:[{keys:["/"],description:"Focus search"},{keys:["\u2318","K"],description:"Open command palette"},{keys:["?"],description:"Show this help"},{keys:["Esc"],description:"Close overlays"}]}],G=class n{state=v(S);groups=De;close(){this.state.shortcutsOpen.set(!1)}onKey(e){e.key==="?"&&!this.isTyping(e.target)&&(e.preventDefault(),this.state.shortcutsOpen.set(!0)),e.key==="Escape"&&(this.state.shortcutsOpen.set(!1),this.state.paletteOpen.set(!1))}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=M({type:n,selectors:[["app-shortcuts-modal"]],hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onKey(d)},D)},decls:1,vars:1,consts:[[4,"ngIf"],[1,"backdrop",3,"click"],["role","dialog","aria-modal","true","aria-labelledby","shortcuts-title",1,"modal"],[1,"head"],["id","shortcuts-title"],["aria-label","Close",1,"btn","btn-ghost","btn-icon",3,"click"],[1,"body"],[4,"ngFor","ngForOf"],[1,"desc"],[1,"keys"],["class","kbd",4,"ngFor","ngForOf"],[1,"kbd"]],template:function(t,i){t&1&&f(0,Fe,10,1,"ng-container",0),t&2&&c("ngIf",i.state.shortcutsOpen())},dependencies:[T,I,k],styles:[".backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);z-index:90}.modal[_ngcontent-%COMP%]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,calc(100vw - 32px));max-height:80vh;overflow:auto;background:var(--bg-elevated);border:1px solid var(--border-soft);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);z-index:100}.head[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid var(--border-soft)}.head[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0;font-size:16px}.body[_ngcontent-%COMP%]{padding:.75rem 1rem 1rem}h3[_ngcontent-%COMP%]{margin:1rem 0 .4rem;font-size:12px;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.04em}h3[_ngcontent-%COMP%]:first-child{margin-top:0}ul[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}li[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:.45rem .25rem;border-bottom:1px dashed var(--border-soft)}li[_ngcontent-%COMP%]:last-child{border-bottom:0}.desc[_ngcontent-%COMP%]{color:var(--fg-secondary);font-size:13px}.keys[_ngcontent-%COMP%]{display:flex;gap:4px}"],changeDetection:0})};var Ne=["searchInput"],Le=()=>({exact:!0});function Ae(n,e){if(n&1&&(o(0,"span",36),l(1),r()),n&2){let t=e.ngIf;a(),b(t)}}function He(n,e){n&1&&(V(0),P(),o(1,"svg",37),x(2,"path",38),r(),F())}function ze(n,e){n&1&&(V(0),o(1,"span",39),l(2,"AI"),r(),F())}function Be(n,e){n&1&&(o(0,"kbd",40),l(1,"/"),r())}function Re(n,e){if(n&1&&(o(0,"option",41),l(1),r()),n&2){let t=e.$implicit,i=g();c("value",t),a(),b(i.shortBranch(t))}}function je(n,e){if(n&1&&(o(0,"option",41),l(1),r()),n&2){let t=e.$implicit;c("value",t),a(),b(t)}}function qe(n,e){if(n&1){let t=_();o(0,"button",42),p("click",function(){m(t);let s=g();return u(s.clearFilters())}),l(1),r()}if(n&2){let t=g();a(),C(" Clear ",t.activeFilterCount()," ")}}function Ke(n,e){n&1&&(P(),o(0,"svg",28),x(1,"path",43),r())}function Ge(n,e){n&1&&(P(),o(0,"svg",28),x(1,"path",44),r())}function Ze(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("author: ",t.author)}}function Qe(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("since: ",t.since)}}function Ue(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=g().ngIf;a(),C("until: ",t.until)}}function $e(n,e){if(n&1&&(o(0,"span",50),l(1),r()),n&2){let t=e.$implicit;a(),b(t)}}function We(n,e){n&1&&(o(0,"span",51),l(1,"no structured filters detected"),r())}function Je(n,e){if(n&1&&(o(0,"div",45)(1,"span",46),l(2,"Interpreted as"),r(),f(3,Ze,2,1,"span",47)(4,Qe,2,1,"span",47)(5,Ue,2,1,"span",47)(6,$e,2,1,"span",48)(7,We,2,0,"span",49),r()),n&2){let t=e.ngIf;a(3),c("ngIf",t.author),a(),c("ngIf",t.since),a(),c("ngIf",t.until),a(),c("ngForOf",t.keywords),a(),c("ngIf",t.keywords.length===0&&!t.author&&!t.since)}}function Xe(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onBranch(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf,i=g(2);a(),C(" branch: ",i.shortBranch(t)," ")}}function Ye(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onAuthor(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" author: ",t," ")}}function et(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onSince(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" since: ",t," ")}}function tt(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onUntil(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" until: ",t," ")}}function nt(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onFile(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" file: ",t," ")}}function it(n,e){if(n&1){let t=_();o(0,"button",54),p("click",function(){m(t);let s=g(2);return u(s.onSearchInput(""))}),l(1),o(2,"span"),l(3,"\xD7"),r()()}if(n&2){let t=e.ngIf;a(),C(" search: ",t," ")}}function ot(n,e){if(n&1&&(o(0,"div",52)(1,"span",46),l(2,"Active filters"),r(),f(3,Xe,4,1,"button",53)(4,Ye,4,1,"button",53)(5,et,4,1,"button",53)(6,tt,4,1,"button",53)(7,nt,4,1,"button",53)(8,it,4,1,"button",53),r()),n&2){let t=g();a(3),c("ngIf",t.state.filters().branch),a(),c("ngIf",t.state.filters().author),a(),c("ngIf",t.state.filters().since),a(),c("ngIf",t.state.filters().until),a(),c("ngIf",t.state.filters().file),a(),c("ngIf",t.state.filters().search)}}var Z=class n{state=v(S);theme=v(xe);searchEl;searchValue=O("");totalLabel=y(()=>{let e=this.state.total();return e?`${e.toLocaleString()} commits`:""});themeLabel=y(()=>`Switch to ${this.theme.resolved()==="light"?"dark":"light"} mode`);searchPlaceholder=y(()=>this.state.searchMode()==="nl"?'Ask anything: "login bug last month", "payments by alice"\u2026':"Search commits\u2026 ( / )");searchModeTooltip=y(()=>this.state.searchMode()==="nl"?"Natural-language search active. Click to switch to literal search.":"Literal git-grep search. Click to switch to natural-language search.");viewModeTooltip=y(()=>this.state.viewMode()==="grouped"?"Showing PR / feature groups. Click for flat list.":"Showing flat commit list. Click for PR / feature groups.");branchOptions=y(()=>{let e=this.state.branches(),t=e.filter(i=>!rt(i));return t.length?t:e});activeFilterCount=y(()=>{let e=this.state.filters();return[e.branch,e.author,e.since,e.until,e.file,e.search].filter(Boolean).length});debounce=null;constructor(){w(()=>{let e=this.state.filters();this.searchValue.set(e.search??"")})}onKeydown(e){e.key==="/"&&!this.isTyping(e.target)&&(e.preventDefault(),queueMicrotask(()=>this.searchEl?.nativeElement.focus()))}onSearchInput(e){this.searchValue.set(e),this.debounce&&clearTimeout(this.debounce),this.debounce=setTimeout(()=>{this.state.patchFilters({search:e||void 0})},250)}onAuthor(e){this.state.patchFilters({author:e||void 0})}onBranch(e){this.state.patchFilters({branch:e||void 0})}onSince(e){this.state.patchFilters({since:e||void 0})}onUntil(e){this.state.patchFilters({until:e||void 0})}onFile(e){this.state.patchFilters({file:e||void 0})}toggleSearchMode(){let e=this.state.searchMode()==="classic"?"nl":"classic";this.state.searchMode.set(e),e==="classic"&&this.state.nlInterpretation.set(null),this.state.patchFilters({})}toggleViewMode(){this.state.viewMode.set(this.state.viewMode()==="flat"?"grouped":"flat")}clearFilters(){this.state.patchFilters({branch:void 0,author:void 0,since:void 0,until:void 0,file:void 0,search:void 0}),this.searchValue.set("")}isTyping(e){return e instanceof HTMLElement?["INPUT","TEXTAREA","SELECT"].includes(e.tagName)||e.isContentEditable:!1}shortBranch(e){return e.startsWith("origin/")?e.slice(7):e}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=M({type:n,selectors:[["app-toolbar"]],viewQuery:function(t,i){if(t&1&&N(Ne,5),t&2){let s;L(s=A())&&(i.searchEl=s.first)}},hostBindings:function(t,i){t&1&&p("keydown",function(d){return i.onKeydown(d)},ie)},decls:49,vars:29,consts:[["searchInput",""],[1,"toolbar"],[1,"brand"],["aria-hidden","true",1,"brand-mark"],[1,"brand-text"],[1,"brand-title"],["class","brand-sub",4,"ngIf"],[1,"nav"],["routerLink","/","routerLinkActive","active",3,"routerLinkActiveOptions"],["routerLink","/timeline","routerLinkActive","active"],["routerLink","/insights","routerLinkActive","active"],[1,"filters"],[1,"search"],["type","button",1,"search-mode",3,"click","title"],[4,"ngIf"],["type","text","aria-label","Search commits",1,"search-input",3,"ngModelChange","placeholder","ngModel"],["class","kbd",4,"ngIf"],["aria-label","Filter by branch",1,"select",3,"ngModelChange","ngModel"],["value",""],[3,"value",4,"ngFor","ngForOf"],["aria-label","Filter by author",1,"select","author",3,"ngModelChange","ngModel"],["type","date","aria-label","Since date",1,"input","date",3,"ngModelChange","ngModel"],["type","date","aria-label","Until date",1,"input","date",3,"ngModelChange","ngModel"],["type","text","placeholder","path/to/file","aria-label","Filter by file path",1,"input","file",3,"ngModelChange","ngModel"],[1,"actions"],["class","btn btn-ghost clear-filters","title","Clear active filters",3,"click",4,"ngIf"],[1,"btn","btn-ghost","view-toggle",3,"click","title"],["title","Command palette (\u2318K)",1,"btn","btn-ghost","btn-icon",3,"click"],["viewBox","0 0 24 24","width","16","height","16","aria-hidden","true"],["fill","currentColor","d","M3 6a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3Zm3-1a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1Zm2 4h2v2H8Zm4 0h6v2h-6Zm-4 4h6v2H8Zm8 0h2v2h-2Z"],["title","Keyboard shortcuts (?)",1,"btn","btn-ghost","btn-icon",3,"click"],["fill","currentColor","d","M11 18h2v-2h-2Zm1-16a8 8 0 0 0-8 8h2a6 6 0 1 1 9.6 4.8c-1.06.8-1.6 1.42-1.6 3.2v.5h-2v-.5c0-2.6.94-3.5 2.13-4.39A4 4 0 1 0 8 10H6a6 6 0 0 1 6-8Z"],[1,"btn","btn-ghost","btn-icon",3,"click","title"],["viewBox","0 0 24 24","width","16","height","16","aria-hidden","true",4,"ngIf"],["class","nl-chips",4,"ngIf"],["class","filter-chips",4,"ngIf"],[1,"brand-sub"],["viewBox","0 0 20 20","width","14","height","14","aria-hidden","true"],["fill","currentColor","d","M9 2a7 7 0 1 1-4.32 12.5l-3.1 3.09a1 1 0 0 1-1.42-1.42l3.1-3.09A7 7 0 0 1 9 2Zm0 2a5 5 0 1 0 0 10A5 5 0 0 0 9 4Z"],[1,"ai-pill"],[1,"kbd"],[3,"value"],["title","Clear active filters",1,"btn","btn-ghost","clear-filters",3,"click"],["fill","currentColor","d","M12 4V2m0 20v-2m8-8h2M2 12h2m13.66-6.34 1.42-1.42M4.92 19.08l1.42-1.42m0-11.32L4.92 4.92m14.16 14.16-1.42-1.42M12 7a5 5 0 1 1 0 10 5 5 0 0 1 0-10Z"],["fill","currentColor","d","M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z"],[1,"nl-chips"],[1,"chip-label"],["class","chip",4,"ngIf"],["class","chip",4,"ngFor","ngForOf"],["class","chip muted",4,"ngIf"],[1,"chip"],[1,"chip","muted"],[1,"filter-chips"],["class","chip active",3,"click",4,"ngIf"],[1,"chip","active",3,"click"]],template:function(t,i){if(t&1){let s=_();o(0,"header",1)(1,"div",2)(2,"span",3),l(3,"\u2387"),r(),o(4,"div",4)(5,"span",5),l(6,"Git History"),r(),f(7,Ae,2,1,"span",6),r()(),o(8,"nav",7)(9,"a",8),l(10,"History"),r(),o(11,"a",9),l(12,"Timeline"),r(),o(13,"a",10),l(14,"Insights"),r()(),o(15,"div",11)(16,"label",12)(17,"button",13),p("click",function(){return m(s),u(i.toggleSearchMode())}),f(18,He,3,0,"ng-container",14)(19,ze,3,0,"ng-container",14),r(),o(20,"input",15,0),p("ngModelChange",function(h){return m(s),u(i.onSearchInput(h))}),r(),f(22,Be,2,0,"kbd",16),r(),o(23,"select",17),p("ngModelChange",function(h){return m(s),u(i.onBranch(h))}),o(24,"option",18),l(25,"All branches"),r(),f(26,Re,2,2,"option",19),r(),o(27,"select",20),p("ngModelChange",function(h){return m(s),u(i.onAuthor(h))}),o(28,"option",18),l(29,"All authors"),r(),f(30,je,2,2,"option",19),r(),o(31,"input",21),p("ngModelChange",function(h){return m(s),u(i.onSince(h))}),r(),o(32,"input",22),p("ngModelChange",function(h){return m(s),u(i.onUntil(h))}),r(),o(33,"input",23),p("ngModelChange",function(h){return m(s),u(i.onFile(h))}),r()(),o(34,"div",24),f(35,qe,2,1,"button",25),o(36,"button",26),p("click",function(){return m(s),u(i.toggleViewMode())}),l(37),r(),o(38,"button",27),p("click",function(){return m(s),u(i.state.paletteOpen.set(!0))}),P(),o(39,"svg",28),x(40,"path",29),r()(),$(),o(41,"button",30),p("click",function(){return m(s),u(i.state.shortcutsOpen.set(!0))}),P(),o(42,"svg",28),x(43,"path",31),r()(),$(),o(44,"button",32),p("click",function(){return m(s),u(i.theme.cycle())}),f(45,Ke,2,0,"svg",33)(46,Ge,2,0,"svg",33),r()()(),f(47,Je,8,5,"div",34)(48,ot,9,6,"div",35)}t&2&&(a(7),c("ngIf",i.totalLabel()),a(2),c("routerLinkActiveOptions",oe(28,Le)),a(7),H("search-nl",i.state.searchMode()==="nl"),a(),c("title",i.searchModeTooltip()),E("aria-label",i.searchModeTooltip()),a(),c("ngIf",i.state.searchMode()==="classic"),a(),c("ngIf",i.state.searchMode()==="nl"),a(),c("placeholder",i.searchPlaceholder())("ngModel",i.searchValue()),a(2),c("ngIf",!i.searchValue()),a(),c("ngModel",i.state.filters().branch??""),a(3),c("ngForOf",i.branchOptions()),a(),c("ngModel",i.state.filters().author??""),a(3),c("ngForOf",i.state.authors()),a(),c("ngModel",i.state.filters().since??""),a(),c("ngModel",i.state.filters().until??""),a(),c("ngModel",i.state.filters().file??""),a(2),c("ngIf",i.activeFilterCount()),a(),c("title",i.viewModeTooltip()),E("aria-label",i.viewModeTooltip()),a(),C(" ",i.state.viewMode()==="grouped"?"Grouped":"Flat"," "),a(7),c("title",i.themeLabel()),E("aria-label",i.themeLabel()),a(),c("ngIf",i.theme.resolved()==="light"),a(),c("ngIf",i.theme.resolved()==="dark"),a(),c("ngIf",i.state.searchMode()==="nl"&&i.state.nlInterpretation()),a(),c("ngIf",i.activeFilterCount()))},dependencies:[T,I,k,j,he,_e,z,fe,B,R,me,ue],styles:["[_nghost-%COMP%]{display:block;position:sticky;top:0;z-index:50;background:color-mix(in oklab,var(--bg-glass) 94%,transparent);-webkit-backdrop-filter:blur(16px) saturate(1.2);backdrop-filter:blur(16px) saturate(1.2);border-bottom:1px solid var(--border-soft);box-shadow:var(--shadow-sm)}.toolbar[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;align-items:center;column-gap:.75rem;row-gap:.4rem;padding:.65rem 1rem .55rem}.brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.6rem;padding-right:.25rem}.brand-mark[_ngcontent-%COMP%]{width:32px;height:32px;border-radius:8px;display:grid;place-items:center;background:linear-gradient(135deg,var(--accent),#06b6d4);color:var(--accent-fg);box-shadow:var(--shadow-glow);font-weight:700;font-size:18px}.brand-text[_ngcontent-%COMP%]{display:flex;flex-direction:column;line-height:1.1}.brand-title[_ngcontent-%COMP%]{font-weight:600}.brand-sub[_ngcontent-%COMP%]{font-size:11px;color:var(--fg-muted)}.filters[_ngcontent-%COMP%]{display:flex;gap:.4rem;align-items:center;min-width:0;justify-content:flex-end}.filters[_ngcontent-%COMP%] > *[_ngcontent-%COMP%]{min-width:0}.search[_ngcontent-%COMP%]{position:relative;display:flex;align-items:center;gap:.35rem;flex:1 1 220px;min-width:0;max-width:360px;padding:0 .55rem;background:linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 94%,white 6%),var(--bg-surface));border:1px solid var(--border-soft);border-radius:999px;color:var(--fg-muted)}.search[_ngcontent-%COMP%]:focus-within{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-ring)}.search-input[_ngcontent-%COMP%]{flex:1;border:0;outline:0;background:transparent;color:var(--fg-primary);font-size:13px;padding:.45rem 0}.search-input[_ngcontent-%COMP%]::placeholder{color:var(--fg-subtle)}.search[_ngcontent-%COMP%] .kbd[_ngcontent-%COMP%]{margin-left:.4rem}.date[_ngcontent-%COMP%]{width:8.25rem}.filters[_ngcontent-%COMP%] .input[_ngcontent-%COMP%], .filters[_ngcontent-%COMP%] .select[_ngcontent-%COMP%]{font-size:12px}.filters[_ngcontent-%COMP%] .select[_ngcontent-%COMP%]{max-width:9.5rem}.filters[_ngcontent-%COMP%] .select.author[_ngcontent-%COMP%]{max-width:8.5rem}.filters[_ngcontent-%COMP%] .input.file[_ngcontent-%COMP%]{width:9rem}.actions[_ngcontent-%COMP%]{display:flex;gap:.3rem;align-items:center}.nav[_ngcontent-%COMP%]{display:flex;gap:.15rem;padding:0}.nav[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{font-size:12px;color:var(--fg-muted);text-decoration:none;padding:.3rem .65rem;border-radius:var(--radius-sm);transition:background .15s ease,color .15s ease}.nav[_ngcontent-%COMP%] a[_ngcontent-%COMP%]:hover{background:var(--bg-elevated);color:var(--fg-primary)}.nav[_ngcontent-%COMP%] a.active[_ngcontent-%COMP%]{background:var(--bg-elevated);color:var(--accent);font-weight:600}.search-mode[_ngcontent-%COMP%]{background:transparent;border:0;padding:0;cursor:pointer;color:var(--fg-muted);display:flex;align-items:center}.search-mode[_ngcontent-%COMP%]:hover{color:var(--fg-primary)}.search.search-nl[_ngcontent-%COMP%]{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in oklab,var(--accent) 20%,transparent)}.ai-pill[_ngcontent-%COMP%]{font-size:10px;font-weight:700;letter-spacing:.04em;background:var(--accent);color:var(--accent-fg);padding:1px 5px;border-radius:4px}.view-toggle[_ngcontent-%COMP%]{font-size:11px;letter-spacing:.04em;text-transform:uppercase;padding:.35rem .6rem}.clear-filters[_ngcontent-%COMP%]{font-size:11px;color:var(--danger);border-color:color-mix(in oklab,var(--danger) 24%,transparent)}.nl-chips[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;padding:.4rem 1rem;border-bottom:1px solid var(--border-soft);background:var(--bg-surface);font-size:11px}.filter-chips[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;padding:0 1rem .55rem;background:color-mix(in oklab,var(--bg-glass) 94%,transparent);font-size:11px}.chip-label[_ngcontent-%COMP%]{color:var(--fg-muted);margin-right:.2rem}.chip[_ngcontent-%COMP%]{background:var(--bg-elevated);border:1px solid var(--border-soft);padding:2px 8px;border-radius:999px;color:var(--fg-secondary)}button.chip[_ngcontent-%COMP%]{cursor:pointer;font-family:inherit}.chip.active[_ngcontent-%COMP%]{display:inline-flex;gap:.35rem;align-items:center;border-color:color-mix(in oklab,var(--accent) 35%,var(--border-soft));color:var(--fg-primary)}.chip.active[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--fg-muted);font-weight:700}.chip.muted[_ngcontent-%COMP%]{font-style:italic;color:var(--fg-subtle)}@media (max-width: 1280px){.filters[_ngcontent-%COMP%] .input.file[_ngcontent-%COMP%]{display:none}}@media (max-width: 1100px){.filters[_ngcontent-%COMP%] .date[_ngcontent-%COMP%]{display:none}.search[_ngcontent-%COMP%]{max-width:280px}}@media (max-width: 900px){.toolbar[_ngcontent-%COMP%]{grid-template-columns:auto minmax(0,1fr) auto;row-gap:.5rem}.nav[_ngcontent-%COMP%]{grid-column:1 / -1;order:5}.filters[_ngcontent-%COMP%] .select[_ngcontent-%COMP%]{display:none}}"],changeDetection:0})};function rt(n){return n.startsWith("origin/")||n.includes("/origin/")}var Q=class n{http=v(le);base="/api";naturalLanguage(e,t={}){let s=new se().set("q",e).set("page",String(t.page??1)).set("pageSize",String(t.pageSize??100));for(let d of["author","since","until","branch","file"]){let h=t[d];h&&(s=s.set(d,String(h)))}return this.http.get(`${this.base}/search`,{params:s})}static \u0275fac=function(t){return new(t||n)};static \u0275prov=ne({token:n,factory:n.\u0275fac,providedIn:"root"})};function at(n,e){if(n&1&&(o(0,"div",2)(1,"span"),l(2),r()()),n&2){let t=e.ngIf;a(2),b(t)}}function st(n,e){n&1&&(o(0,"div",3),x(1,"span",4),l(2," Loading commits\u2026 "),r())}var U=class n{state=v(S);git=v(Ce);search=v(Q);commitsResp=ve(be(this.state.filters).pipe(ee(200),te(e=>{this.state.loading.set(!0),this.state.error.set(null);let i=this.state.searchMode()==="nl"&&(e.search||"").trim().length>0,s=!i&&(e.page??1)===1;return(i?this.search.naturalLanguage(e.search||"",e):s?this.git.streamCommits(e):this.git.getCommits(e)).pipe(Y(h=>(this.state.error.set(this.errorMessage(h)),this.state.loading.set(!1),X(null))))})),{initialValue:null});authorsLoaded=O(!1);constructor(){w(()=>{let e=this.commitsResp();if(!e)return;this.state.commits.set(e.commits),this.state.total.set(e.total),this.state.page.set(e.page),this.state.pageSize.set(e.pageSize),this.state.loading.set(!1);let t=e.parsedQuery;this.state.nlInterpretation.set(t??null),!this.state.selectedHash()&&e.commits.length&&this.state.selectHash(e.commits[0].hash)}),w(()=>{this.commitsResp()&&!this.authorsLoaded()&&(this.authorsLoaded.set(!0),this.git.getAuthors().subscribe({next:e=>this.state.authors.set(e),error:()=>this.state.authors.set([])}),this.git.getBranches().subscribe({next:e=>this.state.branches.set(e),error:()=>this.state.branches.set([])}),this.git.getTags().subscribe({next:e=>this.state.tags.set(e),error:()=>this.state.tags.set([])}))})}errorMessage(e){if(e&&typeof e=="object"&&"error"in e){let t=e.error;if(t?.error)return t.error}return e instanceof Error?e.message:"Failed to load commits."}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=M({type:n,selectors:[["app-root"]],decls:6,vars:2,consts:[["class","status-bar",4,"ngIf"],["class","loading","aria-live","polite",4,"ngIf"],[1,"status-bar"],["aria-live","polite",1,"loading"],[1,"spinner"]],template:function(t,i){t&1&&(x(0,"app-toolbar"),f(1,at,3,1,"div",0),x(2,"router-outlet"),f(3,st,3,0,"div",1),x(4,"app-command-palette")(5,"app-shortcuts-modal")),t&2&&(a(),c("ngIf",i.state.error()),a(2),c("ngIf",i.state.loading()))},dependencies:[T,k,de,Z,q,G],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden;background:var(--bg-app);color:var(--fg-primary)}.status-bar[_ngcontent-%COMP%]{padding:.5rem 1rem;background:#dc26261a;color:var(--danger);border-bottom:1px solid var(--border-soft);font-size:13px}.loading[_ngcontent-%COMP%]{position:fixed;bottom:1rem;right:1rem;display:flex;align-items:center;gap:.5rem;padding:.5rem .85rem;background:var(--bg-elevated);border:1px solid var(--border-soft);border-radius:var(--radius-md);box-shadow:var(--shadow-md);font-size:12px;color:var(--fg-secondary);z-index:80}.spinner[_ngcontent-%COMP%]{width:14px;height:14px;border:2px solid var(--border-strong);border-top-color:var(--accent);border-radius:50%;animation:_ngcontent-%COMP%_spin .7s linear infinite}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}"],changeDetection:0})};ae(U,Me).catch(n=>console.error(n));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-shrink{flex-shrink:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.border{border-width:1px}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{color-scheme:light;--bg-app: #f7f8fa;--bg-surface: #ffffff;--bg-surface-2: #f3f4f6;--bg-elevated: #ffffff;--bg-panel: rgba(255, 255, 255, .78);--bg-glass: rgba(255, 255, 255, .72);--bg-hover: #eef2ff;--bg-selected: #e0e7ff;--bg-overlay: rgba(15, 23, 42, .45);--bg-gradient: radial-gradient(circle at 12% -8%, rgba(79, 70, 229, .12), transparent 34%), radial-gradient(circle at 90% 0%, rgba(6, 182, 212, .12), transparent 28%), linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);--fg-primary: #0f172a;--fg-secondary: #475569;--fg-muted: #64748b;--fg-subtle: #94a3b8;--fg-inverted: #ffffff;--border-soft: #e2e8f0;--border-strong: #cbd5e1;--border-focus: #6366f1;--accent: #4f46e5;--accent-hover: #4338ca;--accent-soft: #eef2ff;--accent-fg: #ffffff;--accent-ring: rgba(99, 102, 241, .18);--success: #16a34a;--warning: #d97706;--danger: #dc2626;--diff-add-bg: #dcfce7;--diff-add-fg: #14532d;--diff-add-gutter: #86efac;--diff-del-bg: #fee2e2;--diff-del-fg: #7f1d1d;--diff-del-gutter: #fca5a5;--diff-hunk-bg: #f1f5f9;--diff-hunk-fg: #475569;--graph-guide: rgba(148, 163, 184, .28);--graph-row-alt: rgba(15, 23, 42, .025);--graph-row-hover: rgba(79, 70, 229, .08);--graph-row-selected: rgba(79, 70, 229, .14);--graph-node-ring: #ffffff;--graph-shadow: rgba(15, 23, 42, .12);--chart-add: #16a34a;--chart-del: #dc2626;--chart-line: #4f46e5;--chart-fill: rgba(79, 70, 229, .16);--shadow-sm: 0 1px 2px rgba(15, 23, 42, .06);--shadow-md: 0 4px 12px rgba(15, 23, 42, .08);--shadow-lg: 0 12px 32px rgba(15, 23, 42, .12);--shadow-glow: 0 16px 60px rgba(79, 70, 229, .14);--radius-sm: 6px;--radius-md: 10px;--radius-lg: 14px;--radius-xl: 18px;--font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Liberation Mono", "Courier New", monospace}:root.dark{color-scheme:dark;--bg-app: #0b1020;--bg-surface: #111827;--bg-surface-2: #0f172a;--bg-elevated: #1f2937;--bg-panel: rgba(17, 24, 39, .74);--bg-glass: rgba(15, 23, 42, .72);--bg-hover: #1e293b;--bg-selected: #312e81;--bg-overlay: rgba(2, 6, 23, .6);--bg-gradient: radial-gradient(circle at 10% -10%, rgba(129, 140, 248, .18), transparent 34%), radial-gradient(circle at 94% 2%, rgba(34, 211, 238, .12), transparent 30%), linear-gradient(180deg, #0b1020 0%, #020617 100%);--fg-primary: #f8fafc;--fg-secondary: #cbd5e1;--fg-muted: #94a3b8;--fg-subtle: #64748b;--fg-inverted: #0b1020;--border-soft: #1f2937;--border-strong: #334155;--border-focus: #818cf8;--accent: #818cf8;--accent-hover: #a5b4fc;--accent-soft: #1e1b4b;--accent-fg: #0b1020;--accent-ring: rgba(129, 140, 248, .24);--success: #4ade80;--warning: #fbbf24;--danger: #f87171;--diff-add-bg: rgba(34, 197, 94, .16);--diff-add-fg: #bbf7d0;--diff-add-gutter: #166534;--diff-del-bg: rgba(239, 68, 68, .18);--diff-del-fg: #fecaca;--diff-del-gutter: #7f1d1d;--diff-hunk-bg: #1f2937;--diff-hunk-fg: #cbd5e1;--graph-guide: rgba(148, 163, 184, .22);--graph-row-alt: rgba(248, 250, 252, .025);--graph-row-hover: rgba(129, 140, 248, .12);--graph-row-selected: rgba(129, 140, 248, .2);--graph-node-ring: #111827;--graph-shadow: rgba(0, 0, 0, .45);--chart-add: #4ade80;--chart-del: #f87171;--chart-line: #a5b4fc;--chart-fill: rgba(129, 140, 248, .18);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .45);--shadow-md: 0 6px 16px rgba(0, 0, 0, .45);--shadow-lg: 0 18px 40px rgba(0, 0, 0, .55);--shadow-glow: 0 24px 80px rgba(79, 70, 229, .18)}*,*:before,*:after{box-sizing:border-box}html,body{height:100%}body{margin:0;font-family:var(--font-sans);font-size:14px;line-height:1.5;color:var(--fg-primary);background:var(--bg-gradient);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}::selection{background:var(--accent);color:var(--accent-fg)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px;border:2px solid transparent;background-clip:padding-box}::-webkit-scrollbar-track{background:transparent}:focus-visible{outline:2px solid var(--border-focus);outline-offset:2px}button{font-family:inherit}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.45rem .85rem;font-size:13px;font-weight:500;border-radius:calc(var(--radius-sm) + 2px);background:linear-gradient(180deg,color-mix(in oklab,var(--bg-surface) 92%,white 8%),var(--bg-surface-2));color:var(--fg-primary);border:1px solid var(--border-soft);cursor:pointer;box-shadow:var(--shadow-sm);transition:background .12s,border-color .12s,color .12s,transform 60ms,box-shadow .12s}.btn:hover{background:var(--bg-hover);border-color:var(--border-strong);box-shadow:var(--shadow-md)}.btn:active{transform:translateY(1px)}.btn-primary{background:var(--accent);color:var(--accent-fg);border-color:transparent}.btn-primary:hover{background:var(--accent-hover)}.btn-ghost{background:transparent;border-color:transparent;box-shadow:none}.btn-ghost:hover{background:var(--bg-hover)}.btn-icon{width:32px;padding:0;height:32px}.input,.select{background:color-mix(in oklab,var(--bg-surface) 88%,transparent);color:var(--fg-primary);border:1px solid var(--border-soft);border-radius:calc(var(--radius-sm) + 2px);padding:.4rem .6rem;font-size:13px;outline:none;min-height:32px}.input::placeholder{color:var(--fg-subtle)}.input:focus,.select:focus{border-color:var(--border-focus);box-shadow:0 0 0 3px var(--accent-ring)}.panel-card{background:linear-gradient(180deg,color-mix(in oklab,var(--bg-panel) 94%,white 6%),var(--bg-panel));border:1px solid color-mix(in oklab,var(--border-soft) 88%,transparent);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.metric-chip{display:inline-flex;align-items:center;gap:.35rem;padding:.2rem .55rem;border:1px solid var(--border-soft);border-radius:999px;background:var(--bg-surface-2);color:var(--fg-secondary);font-size:11px;font-variant-numeric:tabular-nums}.skeleton{position:relative;overflow:hidden;background:var(--bg-surface-2);border-radius:var(--radius-sm)}.skeleton:after{content:"";position:absolute;inset:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in oklab,var(--fg-muted) 14%,transparent),transparent);animation:shimmer 1.4s infinite}@keyframes shimmer{to{transform:translate(100%)}}.kbd{display:inline-flex;align-items:center;justify-content:center;min-width:22px;padding:1px 6px;font-family:var(--font-mono);font-size:11px;font-weight:600;color:var(--fg-secondary);background:var(--bg-surface);border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:4px}.divider{height:1px;background:var(--border-soft)}.hljs{background:transparent;color:var(--fg-primary)}.hljs-keyword,.hljs-selector-tag,.hljs-meta-keyword,.hljs-doctag,.hljs-section,.hljs-name{color:#c084fc}.dark .hljs-keyword,.dark .hljs-selector-tag,.dark .hljs-meta-keyword,.dark .hljs-doctag,.dark .hljs-section,.dark .hljs-name{color:#d8b4fe}.hljs-string,.hljs-attr,.hljs-symbol,.hljs-bullet,.hljs-addition{color:#15803d}.dark .hljs-string,.dark .hljs-attr,.dark .hljs-symbol,.dark .hljs-bullet,.dark .hljs-addition{color:#86efac}.hljs-number,.hljs-literal,.hljs-link{color:#b45309}.dark .hljs-number,.dark .hljs-literal,.dark .hljs-link{color:#fcd34d}.hljs-comment,.hljs-quote{color:var(--fg-subtle);font-style:italic}.hljs-title,.hljs-class .hljs-title,.hljs-type{color:#1d4ed8}.dark .hljs-title,.dark .hljs-class .hljs-title,.dark .hljs-type{color:#93c5fd}.hljs-deletion{color:#b91c1c}.dark .hljs-deletion{color:#fca5a5}.cdk-overlay-dark-backdrop{background:var(--bg-overlay);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
|
|
@@ -21,7 +21,9 @@ export interface IndexStats {
|
|
|
21
21
|
reason?: string;
|
|
22
22
|
}
|
|
23
23
|
export type GitRunner = (args: string[]) => Promise<string>;
|
|
24
|
-
export type GitStreamRunner = (args: string[], onChunk: (chunk: Buffer) => void
|
|
24
|
+
export type GitStreamRunner = (args: string[], onChunk: (chunk: Buffer) => void, opts?: {
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
}) => Promise<void>;
|
|
25
27
|
export declare class SqliteIndex {
|
|
26
28
|
private runGit;
|
|
27
29
|
private dbFile;
|
|
@@ -36,10 +38,14 @@ export declare class SqliteIndex {
|
|
|
36
38
|
open(): boolean;
|
|
37
39
|
stats(): Promise<IndexStats>;
|
|
38
40
|
/** Synchronously build the index from `git log --all`. Idempotent. */
|
|
39
|
-
build(
|
|
41
|
+
build(opts?: {
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
}): Promise<IndexStats>;
|
|
40
44
|
private doBuild;
|
|
41
45
|
/** Quick FTS5 / LIKE search returning hashes + subjects. */
|
|
42
46
|
search(query: string, limit?: number): Promise<Array<Pick<Commit, 'hash' | 'shortHash' | 'subject' | 'date' | 'author'>>>;
|
|
43
47
|
close(): void;
|
|
44
48
|
private refSignature;
|
|
49
|
+
private currentHead;
|
|
50
|
+
private isAncestor;
|
|
45
51
|
}
|
|
@@ -94,14 +94,14 @@ class SqliteIndex {
|
|
|
94
94
|
return { available: true, total, builtAt };
|
|
95
95
|
}
|
|
96
96
|
/** Synchronously build the index from `git log --all`. Idempotent. */
|
|
97
|
-
async build() {
|
|
97
|
+
async build(opts = {}) {
|
|
98
98
|
if (!this.open())
|
|
99
99
|
return this.stats();
|
|
100
100
|
if (this.buildPromise) {
|
|
101
101
|
await this.buildPromise;
|
|
102
102
|
return this.stats();
|
|
103
103
|
}
|
|
104
|
-
this.buildPromise = this.doBuild();
|
|
104
|
+
this.buildPromise = this.doBuild(opts);
|
|
105
105
|
try {
|
|
106
106
|
await this.buildPromise;
|
|
107
107
|
}
|
|
@@ -110,25 +110,31 @@ class SqliteIndex {
|
|
|
110
110
|
}
|
|
111
111
|
return this.stats();
|
|
112
112
|
}
|
|
113
|
-
async doBuild() {
|
|
113
|
+
async doBuild(opts = {}) {
|
|
114
114
|
if (!this.db)
|
|
115
115
|
return;
|
|
116
116
|
const sig = await this.refSignature();
|
|
117
117
|
const stored = this.db.prepare("SELECT v FROM meta WHERE k='refsSig'").get()?.v;
|
|
118
118
|
if (stored === sig)
|
|
119
119
|
return;
|
|
120
|
+
const head = await this.currentHead();
|
|
121
|
+
const storedHead = this.db.prepare("SELECT v FROM meta WHERE k='indexedHead'").get()?.v ?? '';
|
|
122
|
+
const canIncrement = !!storedHead && !!head && await this.isAncestor(storedHead, head);
|
|
120
123
|
const args = [
|
|
121
124
|
'log',
|
|
122
125
|
'--all',
|
|
126
|
+
...(canIncrement ? ['--not', storedHead] : []),
|
|
123
127
|
`--pretty=format:${exports.SQLITE_LOG_FORMAT}${RECORD_SEP}`
|
|
124
128
|
];
|
|
125
129
|
this.db.exec('BEGIN');
|
|
126
130
|
try {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
131
|
+
if (!canIncrement) {
|
|
132
|
+
this.db.exec('DELETE FROM commits');
|
|
133
|
+
try {
|
|
134
|
+
this.db.exec('DELETE FROM commits_fts');
|
|
135
|
+
}
|
|
136
|
+
catch { /* no fts */ }
|
|
130
137
|
}
|
|
131
|
-
catch { /* no fts */ }
|
|
132
138
|
const ins = this.db.prepare('INSERT OR REPLACE INTO commits(hash,short,author,email,date,parents,subject,body) VALUES (?,?,?,?,?,?,?,?)');
|
|
133
139
|
const insFts = (() => {
|
|
134
140
|
try {
|
|
@@ -173,7 +179,7 @@ class SqliteIndex {
|
|
|
173
179
|
pending = pending.slice(idx + 1);
|
|
174
180
|
ingest(record);
|
|
175
181
|
}
|
|
176
|
-
});
|
|
182
|
+
}, { signal: opts.signal });
|
|
177
183
|
pending += decoder.end();
|
|
178
184
|
if (pending.trim())
|
|
179
185
|
ingest(pending);
|
|
@@ -184,6 +190,7 @@ class SqliteIndex {
|
|
|
184
190
|
ingest(record);
|
|
185
191
|
}
|
|
186
192
|
this.db.prepare("INSERT OR REPLACE INTO meta(k,v) VALUES('refsSig', ?)").run(sig);
|
|
193
|
+
this.db.prepare("INSERT OR REPLACE INTO meta(k,v) VALUES('indexedHead', ?)").run(head);
|
|
187
194
|
this.db.prepare("INSERT OR REPLACE INTO meta(k,v) VALUES('builtAt', ?)").run(new Date().toISOString());
|
|
188
195
|
this.db.exec('COMMIT');
|
|
189
196
|
}
|
|
@@ -224,7 +231,7 @@ class SqliteIndex {
|
|
|
224
231
|
}
|
|
225
232
|
}
|
|
226
233
|
async refSignature() {
|
|
227
|
-
const head = await this.
|
|
234
|
+
const head = await this.currentHead();
|
|
228
235
|
let mtimes = '';
|
|
229
236
|
try {
|
|
230
237
|
const refsDir = path_1.default.join(this.repoCwd, '.git', 'refs');
|
|
@@ -245,6 +252,14 @@ class SqliteIndex {
|
|
|
245
252
|
}
|
|
246
253
|
return crypto_1.default.createHash('sha256').update(head + '|' + mtimes).digest('hex');
|
|
247
254
|
}
|
|
255
|
+
async currentHead() {
|
|
256
|
+
return this.runGit(['rev-parse', 'HEAD']).then((s) => s.trim()).catch(() => '');
|
|
257
|
+
}
|
|
258
|
+
async isAncestor(base, head) {
|
|
259
|
+
if (!/^[0-9a-fA-F]{4,40}$/.test(base) || !/^[0-9a-fA-F]{4,40}$/.test(head))
|
|
260
|
+
return false;
|
|
261
|
+
return this.runGit(['merge-base', '--is-ancestor', base, head]).then(() => true).catch(() => false);
|
|
262
|
+
}
|
|
248
263
|
}
|
|
249
264
|
exports.SqliteIndex = SqliteIndex;
|
|
250
265
|
//# sourceMappingURL=sqliteIndex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqliteIndex.js","sourceRoot":"","sources":["../../../src/backend/cache/sqliteIndex.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,mDAA+C;AAG/C,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,UAAU,GAAG,MAAM,CAAC;AACb,QAAA,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAErG,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAmC5D,IAAI,OAAsC,CAAC;AAC3C,SAAS,UAAU;IACjB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAe,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqliteIndex.js","sourceRoot":"","sources":["../../../src/backend/cache/sqliteIndex.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,mDAA+C;AAG/C,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,UAAU,GAAG,MAAM,CAAC;AACb,QAAA,iBAAiB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAErG,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAmC5D,IAAI,OAAsC,CAAC;AAC3C,SAAS,UAAU;IACjB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAe,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AASD,MAAa,WAAW;IASZ;IARF,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,EAAE,GAAoB,IAAI,CAAC;IAC3B,YAAY,GAAyB,IAAI,CAAC;IAC1C,SAAS,CAAyB;IAE1C,YACE,OAAe,EACP,MAAiB,EACzB,SAA2B;QADnB,WAAM,GAAN,MAAM,CAAW;QAGzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC;QACnC,MAAM,EAAE,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;IAC1B,CAAC;IAED,iFAAiF;IACjF,IAAI;QACF,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC;YACH,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;OAcZ,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,IAAI,CACV,qHAAqH,CACtH,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;QAC/F,CAAC;QACD,MAAM,KAAK,GAAI,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CAAC;QAC/F,MAAM,OAAO,GACV,IAAI,CAAC,EAAG,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAgC,EAAE,CAAC,IAAI,IAAI,CAAC;QAC7G,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,KAAK,CAAC,OAAiC,EAAE;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,YAAY,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,OAAiC,EAAE;QACvD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,MAAM,GAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,EAAgC,EAAE,CAAC,CAAC;QAC/G,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,UAAU,GACb,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAgC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5G,MAAM,YAAY,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEvF,MAAM,IAAI,GAAG;YACX,KAAK;YACL,OAAO;YACP,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,mBAAmB,yBAAiB,GAAG,UAAU,EAAE;SACpD,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpC,IAAI,CAAC;oBAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,4GAA4G,CAC7G,CAAC;YACF,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,EAAG,CAAC,OAAO,CACrB,uGAAuG,CACxG,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,EAAE;gBAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO;gBAC9B,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC;gBACpF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAClC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBACzE,IAAI,MAAM,EAAE,CAAC;oBACX,IAAI,CAAC;wBACH,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;oBAClC,CAAC;oBAAC,MAAM,CAAC;wBACP,YAAY;oBACd,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;YAEF,oEAAoE;YACpE,mEAAmE;YACnE,yCAAyC;YACzC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,OAAO,GAAG,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,IAAI,8BAAa,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;oBACnC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAChC,IAAI,GAAW,CAAC;oBAChB,+DAA+D;oBAC/D,wDAAwD;oBACxD,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBACrC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACjC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACjB,CAAC;gBACH,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5B,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACzB,IAAI,OAAO,CAAC,IAAI,EAAE;oBAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACvG,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,MAAM,CACV,KAAa,EACb,KAAK,GAAG,EAAE;QAEV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAG,CAAC;QACpB,IAAI,IAAI,GAA0F,EAAE,CAAC;QACrG,IAAI,CAAC;YACH,IAAI,GAAG,EAAE;iBACN,OAAO,CACN,8IAA8I,CAC/I;iBACA,GAAG,CAAC,KAAK,EAAE,KAAK,CAAgB,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC;YAC1B,IAAI,GAAG,EAAE;iBACN,OAAO,CACN,uHAAuH,CACxH;iBACA,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAgB,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,KAAK;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;gBACjC,KAAK,MAAM,KAAK,IAAI,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBACjE,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,KAAK,CAAC,WAAW,EAAE;wBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;wBAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC;YACF,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAY;QACjD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACzF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtG,CAAC;CACF;AAjPD,kCAiPC"}
|
|
@@ -32,10 +32,14 @@ export interface GitOptions {
|
|
|
32
32
|
since?: string;
|
|
33
33
|
until?: string;
|
|
34
34
|
author?: string;
|
|
35
|
+
branch?: string;
|
|
35
36
|
search?: string;
|
|
36
37
|
page?: number;
|
|
37
38
|
pageSize?: number;
|
|
38
39
|
}
|
|
40
|
+
export interface GitStreamOptions {
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
}
|
|
39
43
|
export interface PaginatedCommits {
|
|
40
44
|
commits: Commit[];
|
|
41
45
|
total: number;
|
|
@@ -59,6 +63,7 @@ export declare class GitService {
|
|
|
59
63
|
getCommits(options?: GitOptions): Promise<PaginatedCommits>;
|
|
60
64
|
private getTotalCount;
|
|
61
65
|
private buildFilterArgs;
|
|
66
|
+
private revisionArg;
|
|
62
67
|
private parseLog;
|
|
63
68
|
getCommit(hash: string): Promise<Commit>;
|
|
64
69
|
getAuthors(): Promise<string[]>;
|
|
@@ -87,7 +92,7 @@ export declare class GitService {
|
|
|
87
92
|
* entire output in memory. The callback receives each line; resolves
|
|
88
93
|
* when the subprocess exits cleanly, rejects on non-zero exit.
|
|
89
94
|
*/
|
|
90
|
-
streamRaw(args: string[], onChunk: (chunk: Buffer) => void): Promise<void>;
|
|
95
|
+
streamRaw(args: string[], onChunk: (chunk: Buffer) => void, opts?: GitStreamOptions): Promise<void>;
|
|
91
96
|
/**
|
|
92
97
|
* Per-commit numstat (additions, deletions, file path) for a window of
|
|
93
98
|
* recent commits. Single `git log` invocation — orders of magnitude
|
|
@@ -97,7 +102,7 @@ export declare class GitService {
|
|
|
97
102
|
* Format: each commit is prefixed by a record separator + commit hash;
|
|
98
103
|
* file lines follow as `additions\tdeletions\tpath`.
|
|
99
104
|
*/
|
|
100
|
-
getNumstat(options?: GitOptions, maxCommits?: number): Promise<Map<string, Array<{
|
|
105
|
+
getNumstat(options?: GitOptions, maxCommits?: number, opts?: GitStreamOptions): Promise<Map<string, Array<{
|
|
101
106
|
file: string;
|
|
102
107
|
additions: number;
|
|
103
108
|
deletions: number;
|
|
@@ -107,7 +112,8 @@ export declare class GitService {
|
|
|
107
112
|
* endpoint to feed huge repos to the UI progressively without buffering
|
|
108
113
|
* the entire `git log` output in memory.
|
|
109
114
|
*/
|
|
110
|
-
streamCommits(options?: GitOptions,
|
|
115
|
+
streamCommits(options?: GitOptions, _batchSize?: number, opts?: GitStreamOptions): AsyncGenerator<Commit, void, void>;
|
|
116
|
+
private streamRecords;
|
|
111
117
|
getBlame(filePath: string): Promise<BlameLine[]>;
|
|
112
118
|
getTags(): Promise<string[]>;
|
|
113
119
|
getBranches(): Promise<string[]>;
|