@selvakumaresra/specship 0.4.0 → 0.5.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.
Files changed (41) hide show
  1. package/README.md +11 -1
  2. package/commands/ss-brainstorm.md +68 -0
  3. package/dist/analytics/specship-impact.d.ts +72 -0
  4. package/dist/analytics/specship-impact.d.ts.map +1 -0
  5. package/dist/analytics/specship-impact.js +216 -0
  6. package/dist/analytics/specship-impact.js.map +1 -0
  7. package/dist/bin/specship.js +4 -4
  8. package/dist/bin/specship.js.map +1 -1
  9. package/dist/db/migrations.d.ts +1 -1
  10. package/dist/db/migrations.d.ts.map +1 -1
  11. package/dist/db/migrations.js +15 -1
  12. package/dist/db/migrations.js.map +1 -1
  13. package/dist/db/schema.sql +8 -0
  14. package/dist/index.d.ts +27 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +48 -0
  17. package/dist/index.js.map +1 -1
  18. package/dist/installer/index.d.ts +2 -2
  19. package/dist/installer/index.d.ts.map +1 -1
  20. package/dist/installer/targets/claude.d.ts.map +1 -1
  21. package/dist/installer/targets/claude.js +2 -0
  22. package/dist/installer/targets/claude.js.map +1 -1
  23. package/dist/server/ingest/impact-backfill.js +69 -0
  24. package/dist/server/ingest/impact-query.js +343 -0
  25. package/dist/server/ingest/index.js +2 -1
  26. package/dist/server/ingest/ingestor.js +41 -6
  27. package/dist/server/ingest/specship-classify.js +153 -0
  28. package/dist/server/routes/claude.js +32 -0
  29. package/dist/server/routes/spec.js +94 -0
  30. package/dist/server/server.js +26 -2
  31. package/dist/web/chunk-O7434ZMN.js +1 -0
  32. package/dist/web/{chunk-2YUJNZ2Y.js → chunk-ODX6CT3I.js} +6 -6
  33. package/dist/web/chunk-RASJHUXS.js +1 -0
  34. package/dist/web/chunk-TQ3P2QZO.js +1 -0
  35. package/dist/web/chunk-WCHGDXWC.js +1 -0
  36. package/dist/web/index.html +1 -1
  37. package/dist/web/main-X2KCYXZ4.js +1 -0
  38. package/package.json +1 -1
  39. package/dist/web/chunk-B3YPFY6A.js +0 -1
  40. package/dist/web/chunk-GWPVKJIY.js +0 -1
  41. package/dist/web/main-R53HA54V.js +0 -1
@@ -0,0 +1 @@
1
+ import{a as V}from"./chunk-SBWU7JFC.js";import{a as me,b as ge,c as A}from"./chunk-GR72OOCN.js";import{b as se,c as $,d as de,e as pe,f as ce}from"./chunk-SHPTC4RL.js";import{a as D}from"./chunk-7RNS77UP.js";import{a as H}from"./chunk-E44X4RH2.js";import{$ as ne,Aa as c,Ba as s,Ca as p,Da as x,Ga as O,Ha as B,I as _,Ia as C,Ja as R,Ka as u,M as w,N as M,O as J,R as ee,Ta as oe,Ua as y,V as te,Va as l,W as T,Wa as v,Xa as N,Ya as ae,ca as ie,cb as re,da as X,ea as o,ka as h,lb as j,ob as F,pb as k,qa as P,ra as m,sa as g,va as S,wa as E,wb as le,xa as f,ya as a,za as r,zb as z}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";var ue=[{path:"",pathMatch:"full",redirectTo:"dashboard"},{path:"dashboard",loadComponent:()=>import("./chunk-D5OCNEJA.js").then(e=>e.Dashboard),data:{nav:"dashboard",title:"Dashboard"}},{path:"graph",loadComponent:()=>import("./chunk-WLIMNDS3.js").then(e=>e.Graph),data:{nav:"graph",title:"Graph"}},{path:"specs",loadComponent:()=>import("./chunk-ODX6CT3I.js").then(e=>e.Specs),data:{nav:"specs",title:"Specs"}},{path:"drift",loadComponent:()=>import("./chunk-FHZHD2ZG.js").then(e=>e.Drift),data:{nav:"drift",title:"Drift queue"}},{path:"workflows",loadComponent:()=>import("./chunk-NZEZCT65.js").then(e=>e.Workflows),data:{nav:"workflows",title:"Workflows"}},{path:"runs",loadComponent:()=>import("./chunk-UBOZGQNK.js").then(e=>e.Runs),data:{nav:"runs",title:"Runs"}},{path:"runs/:id",loadComponent:()=>import("./chunk-MVOMVPYB.js").then(e=>e.RunDetail),data:{nav:"runs",title:"Run detail"}},{path:"chat",loadComponent:()=>import("./chunk-L37MTFSG.js").then(e=>e.Chat),data:{nav:"chat",title:"Chat"}},{path:"sessions",loadComponent:()=>import("./chunk-ASZ77FMZ.js").then(e=>e.Sessions),data:{nav:"sessions",title:"Sessions"}},{path:"sessions/:id",loadComponent:()=>import("./chunk-RASJHUXS.js").then(e=>e.SessionDetail),data:{nav:"sessions",title:"Session detail"}},{path:"heatmap",loadComponent:()=>import("./chunk-YAMRN47K.js").then(e=>e.Heatmap),data:{nav:"heatmap",title:"Heatmap"}},{path:"costs",loadComponent:()=>import("./chunk-WCHGDXWC.js").then(e=>e.Costs),data:{nav:"costs",title:"Costs"}},{path:"specship-impact",loadComponent:()=>import("./chunk-TQ3P2QZO.js").then(e=>e.SpecshipImpact),data:{nav:"specship-impact",title:"SpecShip Impact"}},{path:"compare",loadComponent:()=>import("./chunk-WCKHQIYN.js").then(e=>e.Compare),data:{nav:"compare",title:"Compare projects"}},{path:"tips",loadComponent:()=>import("./chunk-A5R3MJMO.js").then(e=>e.Tips),data:{nav:"tips",title:"Tips"}},{path:"memory",loadComponent:()=>import("./chunk-45QHGCB4.js").then(e=>e.Memory),data:{nav:"memory",title:"Memory"}},{path:"design",loadComponent:()=>import("./chunk-WAI2JMZP.js").then(e=>e.Design),data:{nav:"design",title:"Design system"}},{path:"settings",loadComponent:()=>import("./chunk-BYZFQSM6.js").then(e=>e.Settings),data:{nav:"settings",title:"Settings"}},{path:"**",redirectTo:"dashboard"}];var fe={providers:[te(),ce(ue)]};function ve(e,n){e&1&&(J(),x(0,"rect",14)(1,"rect",15))}var G=class e{size=k(24);tile=k(!0);glow=k(!0);static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-logo-mark"]],inputs:{size:[1,"size"],tile:[1,"tile"],glow:[1,"glow"]},decls:16,vars:5,consts:[["viewBox","0 0 32 32","fill","none",2,"flex-shrink","0"],["id","ssTile","x1","0","y1","0","x2","32","y2","32","gradientUnits","userSpaceOnUse"],["stop-color","#12161E"],["offset","1","stop-color","#0B0D11"],["id","ssLead","x1","18","y1","11","x2","26","y2","21","gradientUnits","userSpaceOnUse"],["stop-color","#6FA0F6"],["offset","1","stop-color","#5B93F2"],["transform","translate(4.6 4.6) scale(0.715)"],["d","M5 16 H11 M11 9 L23 16 L11 23","stroke","rgba(150,165,200,0.5)","stroke-width","1.9","stroke-linecap","round","stroke-linejoin","round","fill","none"],["x1","11","y1","9","x2","11","y2","23","stroke","rgba(150,165,200,0.4)","stroke-width","1.9","stroke-linecap","round"],["cx","23","cy","16","r","3.6","fill","url(#ssLead)"],["cx","11","cy","9","r","2.9","fill","#A586F5"],["cx","11","cy","23","r","2.9","fill","#46C26B"],["cx","5","cy","16","r","2.1","fill","#29D2BE"],["width","32","height","32","rx","7.2","fill","url(#ssTile)"],["x","0.5","y","0.5","width","31","height","31","rx","6.7","fill","none","stroke","rgba(255,255,255,0.08)"]],template:function(t,i){t&1&&(J(),s(0,"svg",0)(1,"defs")(2,"linearGradient",1),x(3,"stop",2)(4,"stop",3),p(),s(5,"linearGradient",4),x(6,"stop",5)(7,"stop",6),p()(),m(8,ve,2,0),s(9,"g",7),x(10,"path",8)(11,"line",9)(12,"circle",10)(13,"circle",11)(14,"circle",12)(15,"circle",13),p()()),t&2&&(oe("filter",i.glow()?"drop-shadow(0 0 9px rgba(91,147,242,0.35))":"none"),P("width",i.size())("height",i.size()),o(8),g(i.tile()?8:-1))},styles:["[_nghost-%COMP%]{display:inline-flex;align-items:center;justify-content:center;line-height:0}"],changeDetection:0})};var _e=e=>["/",e],be=(e,n)=>n.group,he=(e,n)=>n.id;function xe(e,n){e&1&&(a(0,"div",3),l(1,"SpecShip "),a(2,"span",14),l(3,"Desktop"),r()())}function Ce(e,n){if(e&1&&(a(0,"div",15),l(1),r()),e&2){let t=u().$implicit;o(),v(t.group)}}function ye(e,n){if(e&1&&(a(0,"span",18),l(1),r()),e&2){let t=u(2).$implicit,i=u(2);P("data-kind",t.badgeKind),o(),v(i.badgeOf(t))}}function Pe(e,n){if(e&1&&(a(0,"span",11),l(1),r(),m(2,ye,2,2,"span",18)),e&2){let t=u().$implicit,i=u(2);o(),v(t.label),o(),g(i.badgeOf(t)>0?2:-1)}}function ke(e,n){if(e&1&&(a(0,"a",16),c(1,"span",8),a(2,"span",9),c(3,"app-icon",17),r(),m(4,Pe,3,2),r()),e&2){let t=n.$implicit,i=u(2);f("routerLink",re(5,_e,t.id))("title",i.collapsed()?t.label:null),o(3),f("name",t.icon)("size",16),o(),g(i.collapsed()?-1:4)}}function we(e,n){if(e&1&&(a(0,"div",5),m(1,Ce,2,1,"div",15),S(2,ke,5,7,"a",16,he),r()),e&2){let t=n.$implicit,i=u();o(),g(i.collapsed()?-1:1),o(),E(t.items)}}function Me(e,n){e&1&&(a(0,"span",11),l(1,"Design system"),r())}function Se(e,n){e&1&&(a(0,"span",11),l(1,"Settings"),r())}var q=class e{collapsed=k(!1);api=_(H);projects=_(D);status=A(this.api,()=>`/api/status${this.projects.projectQuery()}`);tips=A(this.api,()=>"/api/claude/tips");nav=[{group:"Project",items:[{id:"dashboard",label:"Dashboard",icon:"dashboard"},{id:"graph",label:"Graph",icon:"graph"},{id:"specs",label:"Specs",icon:"book"},{id:"drift",label:"Drift queue",icon:"drift",badge:()=>this.status.state().data?.drift??0,badgeKind:"warn"},{id:"workflows",label:"Workflows",icon:"workflow"},{id:"runs",label:"Runs",icon:"play"},{id:"chat",label:"Chat",icon:"chat"}]},{group:"Claude Code",items:[{id:"sessions",label:"Sessions",icon:"sessions"},{id:"heatmap",label:"Heatmap",icon:"heatmap"},{id:"costs",label:"Costs",icon:"dollar"},{id:"specship-impact",label:"SpecShip Impact",icon:"graph"},{id:"compare",label:"Compare projects",icon:"compare"},{id:"memory",label:"Memory",icon:"memory"},{id:"tips",label:"Tips",icon:"tips",badge:()=>(this.tips.state().data?.tips??[]).filter(n=>n.severity!=="info").length,badgeKind:"error"}]}];badgeOf(n){return n.badge?n.badge():0}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-sidebar"]],inputs:{collapsed:[1,"collapsed"]},decls:18,vars:10,consts:[[1,"sidebar"],[1,"brand"],[3,"size"],[1,"brand-text"],[1,"scroll-y","nav-scroll"],[1,"nav-group"],[1,"pinned"],["routerLink","/design","routerLinkActive","active",1,"nav-item",3,"title"],[1,"indicator"],[1,"nav-icon"],["name","palette",3,"size"],[1,"nav-label"],["routerLink","/settings","routerLinkActive","active",1,"nav-item",3,"title"],["name","settings",3,"size"],[1,"muted"],[1,"eyebrow","group-label"],["routerLinkActive","active",1,"nav-item",3,"routerLink","title"],[3,"name","size"],[1,"badge"]],template:function(t,i){t&1&&(a(0,"nav",0)(1,"div",1),c(2,"app-logo-mark",2),m(3,xe,4,0,"div",3),r(),a(4,"div",4),S(5,we,4,1,"div",5,be),r(),a(7,"div",6)(8,"a",7),c(9,"span",8),a(10,"span",9),c(11,"app-icon",10),r(),m(12,Me,2,0,"span",11),r(),a(13,"a",12),c(14,"span",8),a(15,"span",9),c(16,"app-icon",13),r(),m(17,Se,2,0,"span",11),r()()()),t&2&&(y("collapsed",i.collapsed()),o(2),f("size",26),o(),g(i.collapsed()?-1:3),o(2),E(i.nav),o(3),f("title",i.collapsed()?"Design system":null),o(3),f("size",16),o(),g(i.collapsed()?-1:12),o(),f("title",i.collapsed()?"Settings":null),o(3),f("size",16),o(),g(i.collapsed()?-1:17))},dependencies:[de,pe,z,G],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.sidebar[_ngcontent-%COMP%]{width:var(--sidebar-w);flex-shrink:0;background:var(--bg-panel);border-right:1px solid var(--border-subtle);display:flex;flex-direction:column;transition:width .12s;overflow:hidden;font-family:var(--font-ui)}.sidebar.collapsed[_ngcontent-%COMP%]{width:var(--sidebar-w-collapsed)}.brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:15px 16px}.collapsed[_ngcontent-%COMP%] .brand[_ngcontent-%COMP%]{justify-content:center;padding:14px 0}.brand-text[_ngcontent-%COMP%]{font-weight:600;font-size:13.5px;letter-spacing:-.01em}.brand-text[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--text-muted);font-weight:400}.nav-scroll[_ngcontent-%COMP%]{flex:1;padding:4px 8px}.nav-group[_ngcontent-%COMP%]{margin-bottom:10px}.group-label[_ngcontent-%COMP%]{padding:8px 8px 4px}.nav-item[_ngcontent-%COMP%]{position:relative;display:flex;align-items:center;gap:10px;height:32px;padding:0 10px;border-radius:7px;text-decoration:none;margin-bottom:1px;color:var(--text-secondary);font-weight:450;font-size:13px;transition:background .1s}.collapsed[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]{padding:0;justify-content:center}.nav-item[_ngcontent-%COMP%]:hover{background:var(--bg-hover);color:var(--text-primary)}.nav-item.active[_ngcontent-%COMP%]{background:var(--bg-active);color:var(--text-primary);font-weight:600}.nav-item.active[_ngcontent-%COMP%] .indicator[_ngcontent-%COMP%]{position:absolute;left:0;top:7px;bottom:7px;width:2.5px;border-radius:2px;background:var(--accent)}.nav-icon[_ngcontent-%COMP%]{width:16px;height:16px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;color:var(--text-secondary)}.nav-item[_ngcontent-%COMP%]:hover .nav-icon[_ngcontent-%COMP%]{color:var(--text-primary)}.nav-item.active[_ngcontent-%COMP%] .nav-icon[_ngcontent-%COMP%]{color:var(--accent)}.nav-label[_ngcontent-%COMP%]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge[_ngcontent-%COMP%]{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10px;font-weight:700;padding:1px 6px;min-width:18px;border-radius:999px;display:inline-flex;justify-content:center;color:var(--text-secondary);background:#ffffff0f}.badge[data-kind=error][_ngcontent-%COMP%]{color:var(--error);background:var(--error-soft)}.badge[data-kind=warn][_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.pinned[_ngcontent-%COMP%]{padding:8px;border-top:1px solid var(--border-subtle)}'],changeDetection:0})};function Ee(e,n){if(e&1&&(s(0,"span",8),l(1),p(),x(2,"span",1),s(3,"span",9)(4,"span",10),l(5,"backend"),p(),s(6,"span",4),l(7),p()(),x(8,"span",1),s(9,"span",9)(10,"span",10),l(11,"nodes"),p(),s(12,"span",4),l(13),p()(),s(14,"span",9)(15,"span",10),l(16,"edges"),p(),s(17,"span",4),l(18),p()(),x(19,"span",1),s(20,"span",9)(21,"span",10),l(22,"drift"),p(),s(23,"span",4),l(24),p()(),x(25,"span",11),s(26,"span",9)(27,"span",10),l(28,"indexed"),p(),s(29,"span",4),l(30),p()()),e&2){let t=u(),i=t.status.state().data;o(),v(i.projectPath),o(6),v(i.backend),o(6),v(i.nodeCount.toLocaleString()),o(5),v(i.edgeCount.toLocaleString()),o(5),y("warn",i.drift>0)("success",i.drift===0),o(),v(i.drift),o(6),v(t.indexedLabel())}}function Oe(e,n){e&1&&(s(0,"span",12),l(1,"loading status\u2026"),p(),x(2,"span",11))}function Te(e,n){if(e&1&&(s(0,"span",12),l(1),p(),x(2,"span",11)),e&2){let t=u();o(),v(t.conn.online()?"no backend":"offline \u2014 no cached data")}}function je(e,n){e&1&&(s(0,"span",5),l(1),p()),e&2&&(o(),N("\xB7 ",n))}function De(e,n){e&1&&(s(0,"span",6),l(1,"\u26A0"),p()),e&2&&B("title",n)}var K=class e{api=_(H);projects=_(D);refreshSvc=_(ge);conn=_(me);status=A(this.api,()=>`/api/status${this.projects.projectQuery()}`);offlineAge=j(()=>{let n=this.status.state().cachedAt??this.conn.lastOnlineAt();if(n===null)return null;let t=Date.now()-n;return t<1e4?"just now":t<6e4?`${Math.round(t/1e3)}s ago`:t<36e5?`${Math.round(t/6e4)}m ago`:t<864e5?`${Math.round(t/36e5)}h ago`:`${Math.round(t/864e5)}d ago`});indexedLabel=j(()=>{let n=this.status.state().data?.lastIndexed;if(!n)return"never";try{let t=new Date(n),i=Date.now()-t.getTime();return i<6e4?"just now":i<36e5?`${Math.round(i/6e4)}m ago`:i<864e5?`${Math.round(i/36e5)}h ago`:t.toLocaleDateString()}catch{return String(n)}});async refresh(){await this.refreshSvc.triggerGlobalRefresh()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-status-strip"]],decls:13,vars:14,consts:[[1,"status-strip"],[1,"divider"],[1,"seg","conn",3,"title"],[1,"conn-dot"],[1,"mono","val"],[1,"muted","conn-age"],[1,"refresh-error","mono",3,"title"],[1,"refresh",3,"click","disabled","title"],[1,"seg","mono"],[1,"seg"],[1,"lbl"],[1,"grow"],[1,"mono","muted"]],template:function(t,i){if(t&1&&(s(0,"div",0),m(1,Ee,31,10)(2,Oe,3,0)(3,Te,3,1),x(4,"span",1),s(5,"span",2),x(6,"span",3),s(7,"span",4),l(8),p(),m(9,je,2,1,"span",5),p(),m(10,De,2,1,"span",6),s(11,"button",7),R("click",function(){return i.refresh()}),l(12,"\u21BB"),p()()),t&2){let d,b;o(),g(i.status.state().data?1:i.status.state().loading?2:3),o(4),B("title",i.conn.online()?"Connected to the SpecShip server":"Server unreachable \u2014 showing the last cached data"),o(),y("live",i.conn.online())("off",!i.conn.online()),o(2),v(i.conn.online()?"Live":"Offline"),o(),g((d=!i.conn.online()&&i.offlineAge())?9:-1,d),o(),g((b=i.refreshSvc.error())?10:-1,b),o(),y("spinning",i.refreshSvc.loading()),B("disabled",i.refreshSvc.loading()||!i.conn.online())("title",i.conn.online()?i.refreshSvc.loading()?"Refreshing\u2026":"Refresh: sync index + re-ingest Claude Code transcripts. Updates Sessions, Heatmap, Costs, Memory, Drift, Graph.":"Offline \u2014 reconnect to refresh"),P("aria-label",i.conn.online()?i.refreshSvc.loading()?"Refreshing\u2026":"Refresh everything \u2014 sync index + ingest Claude Code transcripts":"Offline \u2014 reconnect to refresh")}},styles:["[_nghost-%COMP%]{display:contents}.status-strip[_ngcontent-%COMP%]{height:var(--status-h);flex-shrink:0;display:flex;align-items:center;gap:14px;padding:0 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-panel-2);font-size:11.5px;overflow:hidden;white-space:nowrap}.seg[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;flex-shrink:0}.lbl[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px}.val[_ngcontent-%COMP%]{color:var(--text-secondary);font-variant-numeric:tabular-nums}.val.warn[_ngcontent-%COMP%]{color:var(--warn)}.val.success[_ngcontent-%COMP%]{color:var(--success)}.divider[_ngcontent-%COMP%]{width:1px;height:12px;background:var(--border-subtle);flex-shrink:0}.grow[_ngcontent-%COMP%]{flex:1}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.refresh[_ngcontent-%COMP%]{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:4px;transition:background .12s,color .12s}.refresh[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}.refresh[_ngcontent-%COMP%]:disabled{cursor:progress;opacity:.8}.refresh[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.refresh.spinning[_ngcontent-%COMP%]{display:inline-block;animation:_ngcontent-%COMP%_spin .9s linear infinite;color:var(--accent)}@keyframes _ngcontent-%COMP%_spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.refresh-error[_ngcontent-%COMP%]{color:var(--warn);font-size:12px;padding:0 2px;cursor:help}.conn[_ngcontent-%COMP%]{gap:5px}.conn-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.conn-dot.live[_ngcontent-%COMP%]{background:var(--success);box-shadow:0 0 6px var(--success)}.conn-dot.off[_ngcontent-%COMP%]{background:var(--warn);box-shadow:0 0 6px var(--warn)}.conn-age[_ngcontent-%COMP%]{font-size:11px}"],changeDetection:0})};var ze=(e,n)=>n.slug;function Ie(e,n){e&1&&c(0,"span",8)}function Le(e,n){e&1&&c(0,"span",9)}function Re(e,n){e&1&&c(0,"span",10)}function Ne(e,n){if(e&1&&(a(0,"span",7),l(1),r(),m(2,Ie,1,0,"span",8)(3,Le,1,0,"span",9)(4,Re,1,0,"span",10)),e&2){let t=n,i=u();o(),v(i.shortPath(t.path)),o(),g(t.exists?t.initialized?4:3:2)}}function Fe(e,n){e&1&&(a(0,"span",3),l(1,"Select project"),r())}function Ae(e,n){if(e&1){let t=O();a(0,"button",20),C("click",function(){w(t);let d=u(2);return M(d.clear())}),c(1,"app-icon",21),l(2," Clear "),r()}e&2&&(o(),f("size",11))}function Be(e,n){e&1&&(a(0,"span",16),l(1,"\xB7 loading\u2026"),r())}function $e(e,n){if(e&1&&(a(0,"span",16),l(1),r()),e&2){let t=u(2);o(),N("\xB7 ",t.filtered().length," shown \xB7 live")}}function He(e,n){e&1&&(a(0,"div",18),l(1,"No projects match."),r())}function Ve(e,n){e&1&&(a(0,"span",25),l(1,"missing"),r())}function Ge(e,n){e&1&&(a(0,"span",26),l(1,"not init"),r())}function qe(e,n){e&1&&(a(0,"span",27),l(1,"initialized"),r())}function Ke(e,n){if(e&1&&(a(0,"span"),l(1),r()),e&2){let t=u().$implicit,i=u(2);o(),N("\xB7 ",i.formatRelative(t.lastModifiedMs))}}function We(e,n){e&1&&c(0,"app-icon",29),e&2&&f("size",13)}function Ue(e,n){if(e&1){let t=O();a(0,"button",22),C("click",function(){let d=w(t).$implicit,b=u(2);return M(b.pick(d.slug))}),a(1,"div",23)(2,"div",24)(3,"span",7),l(4),r(),m(5,Ve,2,0,"span",25)(6,Ge,2,0,"span",26)(7,qe,2,0,"span",27),r(),a(8,"div",28)(9,"span"),l(10),r(),m(11,Ke,2,1,"span"),r()(),m(12,We,1,1,"app-icon",29),r()}if(e&2){let t=n.$implicit,i=u(2);y("active",i.projects.activeSlug()===t.slug),o(4),v(i.shortPath(t.path)),o(),g(t.exists?t.initialized?7:6:5),o(5),ae("",t.sessionCount," session",t.sessionCount===1?"":"s"),o(),g(t.lastModifiedMs>0?11:-1),o(),g(i.projects.activeSlug()===t.slug?12:-1)}}function Qe(e,n){if(e&1){let t=O();a(0,"div",6)(1,"div",11),c(2,"app-icon",12),a(3,"input",13),C("input",function(d){w(t);let b=u();return M(b.onQuery(d.target.value))}),r(),m(4,Ae,3,1,"button",14),r(),a(5,"div",15)(6,"span"),l(7),r(),m(8,Be,2,0,"span",16)(9,$e,2,1,"span",16),r(),a(10,"div",17),m(11,He,2,0,"div",18),S(12,Ue,13,8,"button",19,ze),r()()}if(e&2){let t=u();o(2),f("size",13),o(),f("value",t.query()),o(),g(t.projects.activeSlug()?4:-1),o(3),v(t.projects.claudeRoot()??"~/.claude/projects"),o(),g(t.projects.loading()?8:9),o(3),g(t.filtered().length===0&&!t.projects.loading()?11:-1),o(),E(t.filtered())}}var W=class e{host=_(ne);projects=_(D);open=T(!1);query=T("");filtered=j(()=>{let n=this.query().trim().toLowerCase(),t=this.projects.projects();return n?t.filter(i=>i.path.toLowerCase().includes(n)||i.slug.toLowerCase().includes(n)):t});badge=j(()=>this.projects.projects().length);toggle(){this.open.update(n=>!n)}pick(n){this.projects.setActive(n),this.open.set(!1),this.query.set("")}clear(){this.projects.setActive(null),this.open.set(!1)}onQuery(n){this.query.set(n)}onDocumentClick(n){if(!this.open())return;let t=n.target;t&&!this.host.nativeElement.contains(t)&&this.open.set(!1)}onEscape(){this.open()&&this.open.set(!1)}formatRelative(n){if(!n)return"";let t=Date.now()-n,i=Math.round(t/1e3);if(i<60)return`${i}s ago`;let d=Math.round(i/60);if(d<60)return`${d}m ago`;let b=Math.round(d/60);if(b<24)return`${b}h ago`;let Z=Math.round(b/24);return Z<30?`${Z}d ago`:new Date(n).toLocaleDateString()}shortPath(n){if(!n)return"";let t=this.detectHome();return t&&n===t?"~":t&&n.startsWith(t+"/")?"~/"+n.slice(t.length+1):n}detectHome(){let n=this.projects.claudeRoot();if(!n)return null;let t="/.claude/projects";return n.endsWith(t)?n.slice(0,-t.length):null}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-project-picker"]],hostBindings:function(t,i){t&1&&C("click",function(b){return i.onDocumentClick(b)},X)("keydown.escape",function(){return i.onEscape()},X)},decls:9,vars:9,consts:[[1,"wrap"],["type","button","aria-label","Switch project",1,"trigger",3,"click"],["name","folder",3,"size"],[1,"placeholder"],[1,"badge","mono"],[3,"name","size"],["role","dialog","aria-label","Pick a project",1,"popover"],[1,"path","mono"],["title","path no longer exists on disk",1,"status-dot","missing"],["title","not yet specship init'd",1,"status-dot","warn"],["title","initialized",1,"status-dot","ok"],[1,"popover-head","row","gap-8"],["name","search",3,"size"],["type","text","placeholder","Filter projects\u2026","autofocus","",1,"popover-input",3,"input","value"],["title","Clear selection",1,"btn","btn-ghost","btn-xs"],[1,"popover-meta","mono"],[1,"muted"],[1,"popover-list","scroll-y"],[1,"empty"],["type","button",1,"row-item",3,"active"],["title","Clear selection",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],["type","button",1,"row-item",3,"click"],[1,"col","gap-2","grow"],[1,"row","gap-6","path-line"],[1,"pill","missing"],[1,"pill","warn"],[1,"pill","ok"],[1,"meta","row","gap-8","mono","muted"],["name","check",3,"size"]],template:function(t,i){if(t&1&&(a(0,"div",0)(1,"button",1),C("click",function(){return i.toggle()}),c(2,"app-icon",2),m(3,Ne,5,2)(4,Fe,2,0,"span",3),a(5,"span",4),l(6),r(),c(7,"app-icon",5),r(),m(8,Qe,14,6,"div",6),r()),t&2){let d;y("open",i.open()),o(),P("aria-expanded",i.open()),o(),f("size",13),o(),g((d=i.projects.active())?3:4,d),o(3),v(i.badge()),o(),f("name",i.open()?"chevronDown":"chevronRight")("size",11),o(),g(i.open()?8:-1)}},dependencies:[z],styles:["[_nghost-%COMP%]{display:inline-flex;min-width:0}.wrap[_ngcontent-%COMP%]{position:relative;min-width:0}.trigger[_ngcontent-%COMP%]{height:30px;padding:0 11px 0 10px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:8px;color:var(--text-secondary);display:inline-flex;align-items:center;gap:8px;font-family:var(--font-ui);font-size:12.5px;cursor:pointer;max-width:360px;min-width:0;transition:background .1s,border-color .1s}.trigger[_ngcontent-%COMP%]:hover, .wrap.open[_ngcontent-%COMP%] .trigger[_ngcontent-%COMP%]{background:var(--bg-panel-2);border-color:var(--border-strong);color:var(--text-primary)}.trigger[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.trigger[_ngcontent-%COMP%]:hover app-icon[_ngcontent-%COMP%]{color:var(--text-secondary)}.path[_ngcontent-%COMP%]{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.placeholder[_ngcontent-%COMP%]{color:var(--text-muted);font-style:italic}.status-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.status-dot.ok[_ngcontent-%COMP%]{background:var(--success)}.status-dot.warn[_ngcontent-%COMP%]{background:var(--warn)}.status-dot.missing[_ngcontent-%COMP%]{background:var(--error)}.badge[_ngcontent-%COMP%]{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--bg-active);color:var(--text-muted);font-variant-numeric:tabular-nums;flex-shrink:0}.popover[_ngcontent-%COMP%]{position:absolute;top:calc(100% + 6px);left:0;z-index:30;width:420px;max-width:calc(100vw - 40px);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--shadow-pop);display:flex;flex-direction:column;max-height:480px;animation:_ngcontent-%COMP%_pp-in .12s ease-out}@keyframes _ngcontent-%COMP%_pp-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.popover-head[_ngcontent-%COMP%]{padding:10px 12px 8px;border-bottom:1px solid var(--border-subtle)}.popover-head[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.popover-input[_ngcontent-%COMP%]{flex:1;min-width:0;background:transparent;border:none;outline:none;font-family:var(--font-ui);font-size:13px;color:var(--text-primary)}.popover-input[_ngcontent-%COMP%]::placeholder{color:var(--text-muted)}.popover-meta[_ngcontent-%COMP%]{padding:6px 12px 8px;font-size:10.5px;color:var(--text-secondary);border-bottom:1px solid var(--border-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popover-meta[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--text-muted)}.popover-list[_ngcontent-%COMP%]{flex:1;min-height:0;padding:4px}.row-item[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:10px;padding:9px 10px;border:none;border-radius:7px;background:transparent;color:inherit;cursor:pointer;font-family:inherit;text-align:left;transition:background 80ms}.row-item[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.row-item.active[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--text-primary)}.row-item.active[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--accent)}.path-line[_ngcontent-%COMP%]{min-width:0}.path-line[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-size:12.5px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.meta[_ngcontent-%COMP%]{font-size:10.5px}.pill[_ngcontent-%COMP%]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:999px;white-space:nowrap;flex-shrink:0}.pill.ok[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.pill.warn[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.pill.missing[_ngcontent-%COMP%]{color:var(--error);background:var(--error-soft)}.empty[_ngcontent-%COMP%]{text-align:center;color:var(--text-muted);font-size:12px;padding:18px 12px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1;min-width:0}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.col[_ngcontent-%COMP%]{display:flex;flex-direction:column}.gap-2[_ngcontent-%COMP%]{gap:2px}.gap-6[_ngcontent-%COMP%]{gap:6px}.gap-8[_ngcontent-%COMP%]{gap:8px}.scroll-y[_ngcontent-%COMP%]{overflow-y:auto;overflow-x:hidden}"],changeDetection:0})};var U=class e{toggleSidebar=F();openPalette=F();theme=_(V);effective=this.theme.effective;onToggleTheme(){this.theme.toggle()}onMenuClick(){this.toggleSidebar.emit()}onPalette(){this.openPalette.emit()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-top-bar"]],outputs:{toggleSidebar:"toggleSidebar",openPalette:"openPalette"},decls:13,vars:5,consts:[[1,"topbar"],["title","Toggle sidebar","aria-label","Toggle sidebar",1,"ghost","icon-btn",3,"click"],["name","menu",3,"size"],["aria-label","Open command palette",1,"palette-trigger",3,"click"],["name","search",3,"size"],[1,"grow"],["aria-label","Toggle theme",1,"ghost","icon-btn",3,"click","title"],[3,"name","size"]],template:function(t,i){t&1&&(a(0,"div",0)(1,"button",1),C("click",function(){return i.onMenuClick()}),c(2,"app-icon",2),r(),c(3,"app-project-picker"),a(4,"button",3),C("click",function(){return i.onPalette()}),c(5,"app-icon",4),a(6,"span"),l(7,"Search or jump to\u2026"),r(),a(8,"kbd"),l(9,"\u2318K"),r()(),c(10,"span",5),a(11,"button",6),C("click",function(){return i.onToggleTheme()}),c(12,"app-icon",7),r()()),t&2&&(o(2),f("size",16),o(3),f("size",13),o(6),f("title","Theme: "+i.effective()),o(),f("name",i.effective()==="dark"?"sun":"moon")("size",16))},dependencies:[z,W],styles:["[_nghost-%COMP%]{display:contents}.topbar[_ngcontent-%COMP%]{height:44px;flex-shrink:0;display:flex;align-items:center;gap:10px;padding:0 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas)}.ghost[_ngcontent-%COMP%]{background:transparent;border:1px solid transparent;color:var(--text-secondary);cursor:pointer}.ghost[_ngcontent-%COMP%]:hover{background:var(--bg-hover);color:var(--text-primary)}.icon-btn[_ngcontent-%COMP%]{padding:6px 9px;border-radius:5px;font-size:16px}.palette-trigger[_ngcontent-%COMP%]{flex:1;max-width:380px;height:30px;padding:0 11px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:8px;cursor:text;color:var(--text-muted);font-size:12.5px;text-align:left;display:flex;align-items:center;gap:8px}.palette-trigger[_ngcontent-%COMP%]:hover{border-color:var(--border-strong);color:var(--text-secondary)}.palette-trigger[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted)}.palette-trigger[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{flex:1}kbd[_ngcontent-%COMP%]{font-family:var(--font-mono);font-size:10px;color:var(--text-muted);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:4px;padding:2px 6px}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};var Ye=(e,n)=>n.id;function Je(e,n){if(e&1){let t=O();s(0,"button",6),R("click",function(){let d=w(t).$implicit,b=u(2);return M(b.go(d.id))}),s(1,"span",7),l(2),p(),s(3,"span",8),l(4),p()()}if(e&2){let t=n.$implicit;o(2),v(t.label),o(2),v(t.sub)}}function Xe(e,n){if(e&1){let t=O();s(0,"div",1),R("click",function(d){w(t);let b=u();return M(b.onBackdrop(d))}),s(1,"div",2)(2,"div",3)(3,"span"),l(4,"Jump to\u2026"),p(),s(5,"kbd"),l(6,"esc"),p()(),s(7,"div",4),S(8,Je,5,2,"button",5,Ye),p()()()}if(e&2){let t=u();o(8),E(t.items)}}var Ze=[{id:"dashboard",label:"Dashboard",sub:"/dashboard"},{id:"graph",label:"Graph",sub:"/graph"},{id:"specs",label:"Specs",sub:"/specs"},{id:"drift",label:"Drift queue",sub:"/drift"},{id:"workflows",label:"Workflows",sub:"/workflows"},{id:"runs",label:"Runs",sub:"/runs"},{id:"chat",label:"Chat",sub:"/chat"},{id:"sessions",label:"Sessions",sub:"/sessions"},{id:"heatmap",label:"Heatmap",sub:"/heatmap"},{id:"costs",label:"Costs",sub:"/costs"},{id:"compare",label:"Compare projects",sub:"/compare"},{id:"tips",label:"Tips",sub:"/tips"},{id:"settings",label:"Settings",sub:"/settings"}],Q=class e{open=k(!1);close=F();router=_($);items=Ze;go(n){this.router.navigate(["/"+n]),this.close.emit()}onBackdrop(n){n.target===n.currentTarget&&this.close.emit()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-command-palette"]],inputs:{open:[1,"open"]},outputs:{close:"close"},decls:1,vars:1,consts:[[1,"backdrop"],[1,"backdrop",3,"click"],[1,"palette"],[1,"palette-header"],[1,"palette-list","scroll-y"],[1,"item"],[1,"item",3,"click"],[1,"label"],[1,"sub","mono"]],template:function(t,i){t&1&&m(0,Xe,10,0,"div",0),t&2&&g(i.open()?0:-1)},styles:["[_nghost-%COMP%]{display:contents}.backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:grid;place-items:start center;padding-top:12vh;z-index:100;animation:fadeIn .1s}.palette[_ngcontent-%COMP%]{width:560px;max-width:90vw;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--shadow-pop);overflow:hidden}.palette-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:12px 14px;border-bottom:1px solid var(--border-subtle);font-size:13px}.palette-list[_ngcontent-%COMP%]{max-height:380px;padding:6px}.item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:7px;cursor:pointer;color:var(--text-primary);font-family:inherit;font-size:13px;text-align:left}.item[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.label[_ngcontent-%COMP%]{flex:1}.sub[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}kbd[_ngcontent-%COMP%]{font-family:var(--font-mono);font-size:10px;color:var(--text-muted);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:4px;padding:2px 6px}"],changeDetection:0})};var Y=class e{_theme=_(V);_destroyRef=_(ee);_router=_($);sidebarCollapsed=T(typeof window<"u"&&window.innerWidth<1100);paletteOpen=T(!1);gChord={armed:!1,t:0};onGlobalKey(n){let t=n.metaKey||n.ctrlKey;if(t&&n.key.toLowerCase()==="k"){n.preventDefault(),this.paletteOpen.update(i=>!i);return}if(n.key==="Escape"){this.paletteOpen.set(!1);return}if(!t&&n.key.toLowerCase()==="g"&&!this.gChord.armed){let i=n.target;if(i&&/input|textarea/i.test(i.tagName))return;this.gChord.armed=!0,this.gChord.t=Date.now(),setTimeout(()=>{this.gChord.armed=!1},600);return}if(this.gChord.armed&&!t){let i=n.key.toLowerCase();i==="d"?this._router.navigate(["/dashboard"]):i==="g"?this._router.navigate(["/graph"]):i==="s"&&this._router.navigate(["/specs"]),this.gChord.armed=!1}}toggleSidebar(){this.sidebarCollapsed.update(n=>!n)}onOpenPalette(){this.paletteOpen.set(!0)}onClosePalette(){this.paletteOpen.set(!1)}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-root"]],hostBindings:function(t,i){t&1&&C("keydown",function(b){return i.onGlobalKey(b)},ie)},decls:8,vars:2,consts:[[1,"shell"],[3,"collapsed"],[1,"main"],[3,"toggleSidebar","openPalette"],[1,"page-frame"],[3,"close","open"]],template:function(t,i){t&1&&(a(0,"div",0),c(1,"app-sidebar",1),a(2,"div",2),c(3,"app-status-strip"),a(4,"app-top-bar",3),C("toggleSidebar",function(){return i.toggleSidebar()})("openPalette",function(){return i.onOpenPalette()}),r(),a(5,"div",4),c(6,"router-outlet"),r()(),a(7,"app-command-palette",5),C("close",function(){return i.onClosePalette()}),r()()),t&2&&(o(),f("collapsed",i.sidebarCollapsed()),o(6),f("open",i.paletteOpen()))},dependencies:[se,q,K,U,Q],styles:["[_nghost-%COMP%]{display:block;height:100%}.shell[_ngcontent-%COMP%]{display:flex;height:100vh;background:var(--bg-canvas);color:var(--text-primary);font-family:var(--font-ui);font-size:var(--fs-base)}.main[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.page-frame[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--bg-canvas)}"],changeDetection:0})};le(Y,fe).catch(e=>console.error(e));typeof navigator<"u"&&"serviceWorker"in navigator&&window.addEventListener("load",()=>{navigator.serviceWorker.register("sw.js").catch(e=>{console.warn("[specship] offline service worker registration failed",e)})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selvakumaresra/specship",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Supercharge Claude Code with semantic code intelligence. 94% fewer tool calls • 77% faster exploration • 100% local.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1 +0,0 @@
1
- import{a as oe}from"./chunk-MC4DFIHG.js";import{a as te}from"./chunk-UYC52MBC.js";import{a as ne}from"./chunk-SUZYBYDW.js";import{c as Q}from"./chunk-GR72OOCN.js";import"./chunk-7RNS77UP.js";import{a as J}from"./chunk-E44X4RH2.js";import{Aa as _,Ba as C,Ca as M,Da as $,Ea as j,Fa as G,I as B,Ia as I,Ja as V,Ka as u,O as w,P as A,Ta as k,Ua as K,Va as c,W as F,Wa as d,Xa as z,Ya as Y,bb as E,ea as a,fb as Z,gb as U,ib as W,ka as P,lb as p,ob as X,pb as g,qa as b,ra as v,sa as f,ua as H,va as D,vb as q,wa as S,xa as y,ya as r,za as s,zb as ee}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";function ve(o,e){if(o&1&&(w(),$(0,"path",1)(1,"path",2)),o&2){let t=u();b("d",t.fillD())("fill",t.color()),a(),b("d",t.pathD())("stroke",t.color())}}var T=class o{series=g([]);color=g("var(--accent)");height=g(200);hover=X();width=600;stats=p(()=>{let e=this.series();if(!e.length)return{max:1,min:0};let t=e.map(n=>n.cost);return{max:Math.max(...t,.01),min:0}});pathD=p(()=>{let e=this.series();if(!e.length)return"";let t=this.width,n=this.height(),{max:i}=this.stats();return e.map((l,m)=>{let x=m/Math.max(1,e.length-1)*t,h=n-l.cost/i*(n-20)-10;return(m===0?"M":"L")+x.toFixed(2)+" "+h.toFixed(2)}).join(" ")});fillD=p(()=>{let e=this.pathD();return e?e+` L ${this.width} ${this.height()} L 0 ${this.height()} Z`:""});onLeave(){this.hover.emit(null)}onMove(e){let n=e.currentTarget.getBoundingClientRect(),i=(e.clientX-n.left)/n.width,l=this.series();if(!l.length)return;let m=Math.min(l.length-1,Math.max(0,Math.round(i*(l.length-1)))),x=l[m];x&&this.hover.emit(x)}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=P({type:o,selectors:[["app-line-chart"]],inputs:{series:[1,"series"],color:[1,"color"],height:[1,"height"]},outputs:{hover:"hover"},decls:2,vars:3,consts:[["width","100%","preserveAspectRatio","none",1,"line-chart",3,"mousemove","mouseleave"],["opacity","0.10"],["fill","none","stroke-width","1.6","stroke-linecap","round","stroke-linejoin","round"]],template:function(t,n){t&1&&(w(),C(0,"svg",0),V("mousemove",function(l){return n.onMove(l)})("mouseleave",function(){return n.onLeave()}),v(1,ve,2,4),M()),t&2&&(b("viewBox","0 0 "+n.width+" "+n.height())("height",n.height()),a(),f(n.pathD()?1:-1))},styles:["[_nghost-%COMP%]{display:block}.line-chart[_ngcontent-%COMP%]{cursor:crosshair}"],changeDetection:0})};var fe=(o,e)=>e.label;function _e(o,e){if(o&1&&(w(),$(0,"path")),o&2){let t=e.$implicit;b("d",t.d)("fill",t.color)}}function xe(o,e){if(o&1&&(C(0,"div",3),c(1),M()),o&2){let t=u();a(),d(t.centerSub())}}var N=class o{data=g([]);size=g(150);centerLabel=g("");centerSub=g("");arcs=p(()=>{let e=this.data(),t=e.reduce((h,L)=>h+L.cost,0);if(t<=0)return[];let i=this.size()/2,l=i*.6,m=-Math.PI/2,x=[];for(let h of e){let L=h.cost/t*Math.PI*2,O=m+L,R=L>Math.PI?1:0,ce=i+Math.cos(m)*i,le=i+Math.sin(m)*i,de=i+Math.cos(O)*i,pe=i+Math.sin(O)*i,me=i+Math.cos(O)*l,ue=i+Math.sin(O)*l,ge=i+Math.cos(m)*l,he=i+Math.sin(m)*l;x.push({d:`M ${ce} ${le} A ${i} ${i} 0 ${R} 1 ${de} ${pe} L ${me} ${ue} A ${l} ${l} 0 ${R} 0 ${ge} ${he} Z`,color:h.color,label:h.short||h.model||""}),m=O}return x});static \u0275fac=function(t){return new(t||o)};static \u0275cmp=P({type:o,selectors:[["app-donut"]],inputs:{data:[1,"data"],size:[1,"size"],centerLabel:[1,"centerLabel"],centerSub:[1,"centerSub"]},decls:8,vars:9,consts:[[1,"donut"],[1,"donut-center"],[1,"center-label"],[1,"center-sub"]],template:function(t,n){t&1&&(C(0,"div",0),w(),C(1,"svg"),D(2,_e,1,2,":svg:path",null,fe),M(),A(),C(4,"div",1)(5,"div",2),c(6),M(),v(7,xe,2,1,"div",3),M()()),t&2&&(k("width",n.size(),"px")("height",n.size(),"px"),a(),b("width",n.size())("height",n.size())("viewBox","0 0 "+n.size()+" "+n.size()),a(),S(n.arcs()),a(4),d(n.centerLabel()),a(),f(n.centerSub()?7:-1))},styles:["[_nghost-%COMP%]{display:inline-block}.donut[_ngcontent-%COMP%]{position:relative}.donut-center[_ngcontent-%COMP%]{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.center-label[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums;font-size:18px;font-weight:700;color:var(--text-primary)}.center-sub[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px;margin-top:2px}"],changeDetection:0})};var be=()=>({value:"today",label:"Today"}),ye=()=>({value:"week",label:"This week"}),Ce=()=>({value:"month",label:"This month"}),Me=()=>({value:"all",label:"All time"}),we=(o,e,t,n)=>[o,e,t,n],Pe=()=>[0,1,2,3],De=(o,e)=>e.model,Se=(o,e)=>e.id;function ke(o,e){if(o&1&&_(0,"app-delta",10),o&2){let t=u();y("value",t.wowDelta())("invert",!0)}}function Ee(o,e){if(o&1&&(r(0,"div",11)(1,"div",24),c(2),s(),r(3,"div",25),c(4),s()()),o&2){let t=e,n=u();a(2),d(n.fmt$(t.cost)),a(2),Y("",t.prompts," prompts \xB7 day ",t.day)}}function Oe(o,e){if(o&1&&(r(0,"div",19),_(1,"span",26),r(2,"span",27),c(3),s(),r(4,"span",28),c(5),s(),r(6,"span",29),c(7),s()()),o&2){let t=e.$implicit,n=u();a(),k("background",t.color),a(2),d(t.short),a(2),d(n.fmt$(t.cost)),a(2),z("",n.percentOf(t.cost,n.total()),"%")}}function ze(o,e){o&1&&_(0,"div",30)}function Le(o,e){o&1&&D(0,ze,1,0,"div",30,H),o&2&&S(E(0,Pe))}function $e(o,e){if(o&1&&(r(0,"div",32)(1,"span",33),c(2),s(),r(3,"div",34)(4,"div",35),c(5),s(),r(6,"div",36),_(7,"span",37),s()(),r(8,"span",38),c(9),s(),r(10,"span",39),c(11),s(),r(12,"span",40),c(13),U(14,"number"),s(),r(15,"span",41),c(16),s()()),o&2){let t=e.$implicit,n=e.$index,i=u(2);K("first",n===0),a(2),d(n+1),a(3),d(t.text),a(2),k("width",t.cost_usd/i.maxPrompt()*100,"%")("background",t.cost_usd/i.maxPrompt()>.66?"var(--error)":"var(--accent)"),a(2),d(i.modelShort(t.model)),a(2),d(i.fmtK(i.promptTokens(t))),a(),k("color",i.cacheColor(i.cacheRate(t))),a(),z("",W(14,14,i.cacheRate(t)*100,"1.0-0"),"%"),a(3),d(i.fmt$(t.cost_usd))}}function Te(o,e){if(o&1&&D(0,$e,17,17,"div",31,Se),o&2){let t=u();S(t.topPrompts())}}var Ne={"claude-opus-4-7":"#A586F5","claude-opus-4":"#A586F5","claude-sonnet-4-6":"#5B93F2","claude-sonnet-4-7":"#5B93F2","claude-sonnet-4":"#5B93F2","claude-haiku-4-5":"#29D2BE","claude-haiku-4":"#29D2BE"},re={"claude-opus-4-7":"Opus 4.7","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-7":"Sonnet 4.7","claude-sonnet-4":"Sonnet 4","claude-haiku-4-5":"Haiku 4.5","claude-haiku-4":"Haiku 4"},se=class o{api=B(J);range=F("month");ranges=["today","week","month","all"];hovered=F(null);resource=Q(this.api,()=>`/api/claude/costs?range=${this.range()}`);series=p(()=>this.resource.state().data?.series??[]);topPrompts=p(()=>(this.resource.state().data?.topPrompts??[]).slice(0,12));maxPrompt=p(()=>{let e=this.topPrompts();return Math.max(.01,...e.map(t=>t.cost_usd??0))});byModel=p(()=>(this.resource.state().data?.byModel??[]).map(t=>({model:t.model,short:re[t.model]||t.model,cost:t.cost||0,color:Ne[t.model]||"#5C6573"})));total=p(()=>this.resource.state().data?.total??0);wowDelta=p(()=>this.resource.state().data?.wowDelta??0);setRange(e){this.range.set(e)}onHover(e){this.hovered.set(e)}fmt$(e){return"$"+e.toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}fmtK(e){return e>=1e3?(e/1e3).toFixed(e>=1e4?0:1)+"k":String(e)}promptTokens(e){return(e.input_tokens??0)+(e.output_tokens??0)+(e.cache_creation_tokens??0)+(e.cache_read_tokens??0)}cacheRate(e){let t=(e.input_tokens??0)+(e.cache_creation_tokens??0)+(e.cache_read_tokens??0);return t>0?(e.cache_read_tokens??0)/t:0}cacheColor(e){return e>=.7?"var(--success)":e>=.5?"var(--warn)":"var(--error)"}modelShort(e){return e?re[e]||e.replace(/^claude-/,""):"?"}percentOf(e,t){return t>0?Math.round(e/t*100):0}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=P({type:o,selectors:[["app-costs"]],decls:34,vars:25,consts:[[1,"page","scroll-y"],["icon","dollar","title","Costs","sub","Where the money goes"],["actions",""],["size","sm",3,"change","value","options"],[1,"top-grid"],[1,"card","card-pad","chart-card"],[1,"chart-header"],[1,"big-number","mono"],[1,"row","gap-8",2,"margin-top","2px"],[1,"muted",2,"font-size","11.5px"],[3,"value","invert"],[2,"text-align","right"],["color","var(--accent)",3,"hover","series","height"],[1,"card","card-pad","donut-card"],[1,"row","gap-8",2,"align-self","flex-start","margin-bottom","8px"],["name","layers",2,"color","var(--node-code)",3,"size"],[2,"font-weight","600","font-size","12.5px"],[3,"data","size","centerLabel","centerSub"],[1,"model-legend"],[1,"legend-row"],[1,"card","card-pad"],[1,"row","gap-8",2,"margin-bottom","12px"],["name","sortAsc",2,"color","var(--accent)",3,"size"],[1,"muted",2,"font-size","11px"],[1,"mono",2,"font-size","13px","font-weight","600"],[1,"muted",2,"font-size","10.5px"],[1,"swatch"],[1,"mono","grow",2,"font-size","11.5px"],[1,"mono",2,"font-size","11.5px"],[1,"mono","muted",2,"font-size","10.5px","width","38px","text-align","right"],[1,"skel","row-skel"],[1,"prompt-row",3,"first"],[1,"prompt-row"],[1,"mono","muted","tabular","rank"],[1,"prompt-grow"],[1,"prompt-text"],[1,"bar-track",2,"margin-top","4px","max-width","280px"],[1,"bar-fill"],[1,"mono","muted","prompt-model"],[1,"mono","muted","tabular","prompt-toks"],[1,"mono","tabular","cache-cell"],[1,"mono","tabular","cost-cell"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"app-page-head",1),j(2,2),r(3,"app-segmented",3),I("change",function(l){return n.setRange(l)}),s(),G(),s(),r(4,"div",4)(5,"div",5)(6,"div",6)(7,"div")(8,"div",7),c(9),s(),r(10,"div",8)(11,"span",9),c(12),s(),v(13,ke,1,2,"app-delta",10),s()(),v(14,Ee,5,3,"div",11),s(),r(15,"app-line-chart",12),I("hover",function(l){return n.onHover(l)}),s()(),r(16,"div",13)(17,"div",14),_(18,"app-icon",15),r(19,"span",16),c(20,"By model"),s()(),_(21,"app-donut",17),r(22,"div",18),D(23,Oe,8,5,"div",19,De),s()()(),r(25,"div",20)(26,"div",21),_(27,"app-icon",22),r(28,"span",16),c(29,"Most expensive prompts"),s(),r(30,"span",23),c(31),s()(),v(32,Le,2,1)(33,Te,2,0),s()()),t&2){let i;a(3),y("value",n.range())("options",Z(20,we,E(16,be),E(17,ye),E(18,Ce),E(19,Me))),a(6),d(n.fmt$(n.total())),a(3),z("total \xB7 ",n.range()),a(),f(n.range()!=="all"&&n.wowDelta()!==0?13:-1),a(),f((i=n.hovered())?14:-1,i),a(),y("series",n.series())("height",200),a(3),y("size",14),a(3),y("data",n.byModel())("size",150)("centerLabel","$"+n.total().toFixed(0))("centerSub",n.range()+" window"),a(2),S(n.byModel()),a(4),y("size",14),a(4),z("\xB7 top ",n.topPrompts().length),a(),f(n.resource.state().loading?32:33)}},dependencies:[T,N,te,ne,oe,ee,q],styles:["[_nghost-%COMP%]{display:contents}.page[_ngcontent-%COMP%]{flex:1;padding:18px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1}.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:var(--r-lg)}.card-pad[_ngcontent-%COMP%]{padding:14px}.top-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.3fr 1fr;gap:14px;margin-bottom:14px}.chart-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:10px}.chart-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:flex-start}.big-number[_ngcontent-%COMP%]{font-size:34px;font-weight:700;letter-spacing:-.02em}.donut-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;gap:10px}.model-legend[_ngcontent-%COMP%]{width:100%;display:flex;flex-direction:column;gap:6px;margin-top:14px}.legend-row[_ngcontent-%COMP%]{display:flex;gap:8px;align-items:center}.swatch[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:3px;flex-shrink:0}.prompt-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:18px 1fr 70px 54px 44px 56px;gap:12px;align-items:center;padding:9px 0;border-top:1px solid var(--border-subtle)}.prompt-row.first[_ngcontent-%COMP%]{border-top:none}.rank[_ngcontent-%COMP%]{width:16px;font-size:11px}.prompt-grow[_ngcontent-%COMP%]{min-width:0}.prompt-text[_ngcontent-%COMP%]{font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bar-track[_ngcontent-%COMP%]{height:4px;background:#ffffff0f;border-radius:999px;overflow:hidden}.bar-fill[_ngcontent-%COMP%]{display:block;height:100%;border-radius:999px}.prompt-model[_ngcontent-%COMP%]{font-size:10.5px;text-align:right}.prompt-toks[_ngcontent-%COMP%], .cache-cell[_ngcontent-%COMP%]{font-size:11px;text-align:right}.cost-cell[_ngcontent-%COMP%]{font-size:13px;font-weight:600;text-align:right}.skel[_ngcontent-%COMP%]{background:var(--bg-elevated);border-radius:5px;animation:_ngcontent-%COMP%_skeleton 1.4s ease-in-out infinite}.row-skel[_ngcontent-%COMP%]{height:30px;margin:6px 0}@keyframes _ngcontent-%COMP%_skeleton{0%,to{opacity:.5}50%{opacity:.9}}"],changeDetection:0})};export{se as Costs};
@@ -1 +0,0 @@
1
- import{a as le}from"./chunk-SEXBRGYK.js";import{a as re}from"./chunk-G7VZT5KB.js";import{a as ae}from"./chunk-X2HTISHL.js";import{a as oe}from"./chunk-DTRN7FZR.js";import{b as ne,c as H}from"./chunk-GR72OOCN.js";import{a as Z,d as ee}from"./chunk-SHPTC4RL.js";import"./chunk-7RNS77UP.js";import{a as te}from"./chunk-E44X4RH2.js";import{Aa as x,C as j,Ga as $,I as M,Ia as E,Ka as d,M as D,N as I,R as F,Ta as C,Ua as z,Va as l,W as S,Wa as u,X as B,Xa as g,Ya as V,Za as J,aa as L,bb as Y,ea as o,gb as k,hb as K,ib as w,ka as W,lb as h,qa as A,ra as p,sa as m,ua as G,va as P,vb as Q,wa as O,xa as _,ya as a,yb as X,za as r,zb as ie}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";function se(i,t){let n=!t?.manualCleanup?t?.injector?.get(F)??M(F):null,s=_e(t?.equal),c;t?.requireSync?c=S({kind:0},{equal:s}):c=S({kind:1,value:t?.initialValue},{equal:s});let v,y=i.subscribe({next:f=>c.set({kind:1,value:f}),error:f=>{c.set({kind:2,error:f}),v?.()},complete:()=>{v?.()}});if(t?.requireSync&&c().kind===0)throw new j(601,!1);return v=n?.onDestroy(y.unsubscribe.bind(y)),h(()=>{let f=c();switch(f.kind){case 1:return f.value;case 2:throw f.error;case 0:throw new j(601,!1)}},{equal:t?.equal})}function _e(i=Object.is){return(t,e)=>t.kind===1&&e.kind===1&&i(t.value,e.value)}var xe=()=>["/sessions"],pe=(i,t)=>t.prompt.id,ge=(i,t)=>t.id,de=(i,t)=>t.name;function fe(i,t){if(i&1&&(a(0,"app-pill",7),l(1),r()),i&2){let e=d();_("color","var(--node-spec)")("bg","var(--node-spec-soft)"),o(),u(e.session().last_model)}}function ve(i,t){if(i&1&&l(0),i&2){let e=d(),n=d();J(" \xB7 ",n.fmtClock(e.started_at)," \u2013 ",n.fmtClock(e.ended_at)," (",n.fmtDurationSec(e.started_at,e.ended_at),") ")}}function be(i,t){if(i&1&&(a(0,"div",10),l(1),p(2,ve,1,3),r()),i&2){let e=t;o(),g("",e.project_path," "),o(),m(e.started_at&&e.ended_at?2:-1)}}function he(i,t){i&1&&(a(0,"div",14),l(1,"Loading session\u2026"),r())}function Ce(i,t){if(i&1){let e=$();a(0,"div",15)(1,"div",18),l(2,"Couldn't load session"),r(),a(3,"div",19),l(4),r(),a(5,"button",20),E("click",function(){D(e);let s=d();return I(s.forceRefresh())}),l(6,"Retry"),r()()}if(i&2){let e,n=d();o(4),u((e=n.resource.state().error)==null?null:e.message)}}function ye(i,t){i&1&&(a(0,"app-pill",59),x(1,"app-icon",72),l(2,"subagent "),r()),i&2&&(_("color","var(--node-route)")("bg","var(--node-route-soft)"),o(),_("size",10))}function ke(i,t){if(i&1&&x(0,"app-icon",60),i&2){let e=d().$implicit;_("size",12)("title",e.slashCommand)}}function Me(i,t){if(i&1&&l(0),i&2){let e=d().$implicit;g(" ",e.prompt.text.length>140?e.prompt.text.slice(0,140)+"\u2026":e.prompt.text," ")}}function Se(i,t){i&1&&(a(0,"span",62),l(1,"(assistant-only turn)"),r())}function we(i,t){if(i&1&&(a(0,"span",66),l(1),r()),i&2){let e=d().$implicit,n=d(2);o(),u(n.fmtDurationMs(e.prompt.durationMs))}}function Pe(i,t){if(i&1&&(a(0,"section",73)(1,"div",74),l(2,"User prompt"),r(),a(3,"pre",80),l(4),r()()),i&2){let e=d(2).$implicit;o(4),u(e.prompt.text)}}function Oe(i,t){if(i&1&&(a(0,"section",73)(1,"div",74),l(2,"Assistant response"),r(),x(3,"div",81),r()),i&2){let e=d(2).$implicit,n=d(2);o(3),_("innerHTML",n.renderAssistant(e.prompt.assistant_text),L)}}function Ee(i,t){if(i&1&&(a(0,"section",73)(1,"details",82)(2,"summary",83),l(3," Extended thinking "),a(4,"span",84),l(5,"(click to expand)"),r()(),x(6,"div",85),r()()),i&2){let e=d(2).$implicit,n=d(2);o(6),_("innerHTML",n.renderAssistant(e.prompt.thinking_text),L)}}function Te(i,t){if(i&1&&(a(0,"div",76)(1,"div",77),l(2,"Duration"),r(),a(3,"div",78),l(4),r()()),i&2){let e=d(2).$implicit,n=d(2);o(4),u(n.fmtDurationMs(e.prompt.durationMs))}}function De(i,t){if(i&1&&(a(0,"div",76)(1,"div",77),l(2,"Model"),r(),a(3,"div",78),l(4),r()()),i&2){let e=d(2).$implicit;o(4),u(e.prompt.model)}}function Ie(i,t){if(i&1&&(a(0,"div",87)(1,"span",88),l(2),r()()),i&2){let e=t.$implicit;_("title",e),o(2),u(e)}}function ze(i,t){if(i&1&&(a(0,"section",73)(1,"div",74),l(2),r(),a(3,"div",86),P(4,Ie,3,2,"div",87,G),r()()),i&2){let e=d(2).$implicit;o(2),g("Files touched \xB7 ",e.filesTouched.length),o(2),O(e.filesTouched)}}function Re(i,t){i&1&&l(0," \u203A ")}function Fe(i,t){if(i&1&&(a(0,"span",94),l(1),r()),i&2){let e=d().$implicit;o(),u(e.input_summary)}}function $e(i,t){if(i&1&&(a(0,"span",95),l(1),r()),i&2){let e=d().$implicit,n=d(5);o(),u(n.fmtBytes(e.result_length))}}function Be(i,t){if(i&1&&(a(0,"pre",96),l(1),r()),i&2){let e=d().$implicit,n=d(5);o(),u(n.formatToolInput(e.input_json))}}function Ne(i,t){if(i&1){let e=$();a(0,"div",90)(1,"button",91),E("click",function(){let s=D(e).$implicit,c=d(5);return I(c.toggleToolInput(s.id))}),a(2,"span",92),p(3,Re,1,0),r(),a(4,"span",93),l(5),r(),p(6,Fe,2,1,"span",94),x(7,"span",31),p(8,$e,2,1,"span",95),r(),p(9,Be,2,1,"pre",96),r()}if(i&2){let e=t.$implicit,n=d(5);o(),z("has-input",!!e.input_json)("expanded",n.isToolInputExpanded(e.id)),_("disabled",!e.input_json),A("aria-expanded",n.isToolInputExpanded(e.id)),o(),z("open",n.isToolInputExpanded(e.id)),o(),m(e.input_json?3:-1),o(),C("color",n.toolColor(e.tool_name)),o(),u(e.tool_name),o(),m(e.input_summary?6:-1),o(2),m(e.result_length?8:-1),o(),m(e.input_json&&n.isToolInputExpanded(e.id)?9:-1)}}function je(i,t){if(i&1&&(a(0,"section",73)(1,"div",74),l(2),r(),a(3,"div",89),P(4,Ne,10,15,"div",90,ge),r()()),i&2){let e=d(2).$implicit,n=d(2);o(2),V("Tool calls \xB7 ",e.tools.length," \xB7 returned ",n.fmtBytes(e.toolBytes)),o(2),O(e.tools)}}function Le(i,t){if(i&1&&(a(0,"div",71),p(1,Pe,5,1,"section",73),p(2,Oe,4,1,"section",73),p(3,Ee,7,1,"section",73),a(4,"section",73)(5,"div",74),l(6,"Token breakdown"),r(),a(7,"div",75)(8,"div",76)(9,"div",77),l(10,"Input"),r(),a(11,"div",78),l(12),r()(),a(13,"div",76)(14,"div",77),l(15,"Output"),r(),a(16,"div",78),l(17),r()(),a(18,"div",76)(19,"div",77),l(20,"Cache write"),r(),a(21,"div",78),l(22),r()(),a(23,"div",76)(24,"div",77),l(25,"Cache read"),r(),a(26,"div",78),l(27),r()(),a(28,"div",76)(29,"div",77),l(30,"Cost"),r(),a(31,"div",79),l(32),r()(),p(33,Te,5,1,"div",76),p(34,De,5,1,"div",76),r()(),p(35,ze,6,1,"section",73),p(36,je,6,2,"section",73),r()),i&2){let e=d().$implicit,n=d(2);o(),m(e.prompt.text?1:-1),o(),m(e.prompt.assistant_text?2:-1),o(),m(e.prompt.thinking_text?3:-1),o(9),u(n.fmtTokens(e.prompt.input_tokens)),o(5),u(n.fmtTokens(e.prompt.output_tokens)),o(5),u(n.fmtTokens(e.prompt.cache_creation_tokens)),o(5),u(n.fmtTokens(e.prompt.cache_read_tokens)),o(5),g("$",e.prompt.cost_usd.toFixed(4)),o(),m(e.prompt.durationMs?33:-1),o(),m(e.prompt.model?34:-1),o(),m(e.filesTouched.length>0?35:-1),o(),m(e.tools.length>0?36:-1)}}function Ae(i,t){if(i&1){let e=$();a(0,"div",34)(1,"button",56),E("click",function(){let s=D(e).$implicit,c=d(2);return I(c.toggleExpand(s.prompt.id))}),a(2,"span",57),l(3),r(),x(4,"span",58),k(5,"number"),p(6,ye,3,3,"app-pill",59),p(7,ke,1,2,"app-icon",60),a(8,"span",61),p(9,Me,1,1)(10,Se,2,0,"span",62),r(),a(11,"span",63),x(12,"app-icon",64),a(13,"span",65),l(14),r()(),p(15,we,2,1,"span",66),a(16,"span",67),l(17),r(),a(18,"span",68),l(19),k(20,"number"),r(),a(21,"span",69),l(22),r(),x(23,"app-icon",70),r(),p(24,Le,37,12,"div",71),r()}if(i&2){let e=t.$implicit,n=d(2);o(),z("expanded",n.isExpanded(e.prompt.id)),A("aria-expanded",n.isExpanded(e.prompt.id)),o(2),u(n.fmtClock(e.prompt.ts)),o(),C("background",n.cacheColor(e.prompt.cache_read_tokens>0?e.prompt.cache_read_tokens/(e.prompt.input_tokens+e.prompt.cache_creation_tokens+e.prompt.cache_read_tokens||1):0)),_("title","Cache: "+K(5,22,e.prompt.cache_read_tokens)),o(2),m(e.prompt.is_sidechain===1?6:-1),o(),m(e.slashCommand?7:-1),o(2),m(e.prompt.text?9:10),o(3),_("size",11),o(2),u(e.tools.length),o(),m(e.prompt.durationMs?15:-1),o(2),u(n.fmtTokens(e.totalTokens)),o(),C("color",n.cacheColor(e.totalTokens>0?(e.prompt.cache_read_tokens||0)/e.totalTokens:0)),o(),g(" ",e.totalTokens>0?w(20,24,(e.prompt.cache_read_tokens||0)/e.totalTokens*100,"1.0-0"):0,"% "),o(2),C("color",e.prompt.cost_usd>2.5?"var(--error)":"var(--text-primary)"),o(),g("$",e.prompt.cost_usd.toFixed(2)),o(),_("size",14),o(),m(n.isExpanded(e.prompt.id)?24:-1)}}function Ve(i,t){i&1&&(a(0,"div",17),l(1,"No prompts logged for this session yet."),r())}function He(i,t){if(i&1&&(a(0,"span",102),l(1),r()),i&2){let e=d().$implicit;o(),g("\xD7",e.count)}}function qe(i,t){if(i&1&&(a(0,"span",99),x(1,"app-icon",101),l(2),p(3,He,2,1,"span",102),r()),i&2){let e=t.$implicit;o(),_("size",10),o(),g("",e.name," "),o(),m(e.count>1?3:-1)}}function Ue(i,t){if(i&1&&(a(0,"span",102),l(1),r()),i&2){let e=d().$implicit;o(),g("\xD7",e.count)}}function We(i,t){if(i&1&&(a(0,"span",100),x(1,"app-icon",103),l(2),p(3,Ue,2,1,"span",102),r()),i&2){let e=t.$implicit;o(),_("size",10),o(),g("",e.name," "),o(),m(e.count>1?3:-1)}}function Ge(i,t){if(i&1&&(a(0,"div",97)(1,"div",36),l(2,"Commands & skills"),r(),a(3,"div",98),P(4,qe,4,3,"span",99,de),P(6,We,4,3,"span",100,de),r()()),i&2){let e=d();o(4),O(e.slashCommands),o(2),O(e.skills)}}function Je(i,t){if(i&1&&(a(0,"div",36),l(1),r(),x(2,"app-h-bars",104),a(3,"div",105),l(4,"bar = call count"),r()),i&2){let e=d(),n=d(2);o(),g("Tools used \xB7 ",e.byTool.length),o(),_("items",e.byTool)("fmt",n.fmtTokensFn)("color",n.toolBarColor)}}function Ye(i,t){if(i&1&&(p(0,Ge,8,0,"div",97),p(1,Je,5,4)),i&2){let e=t;m(e.slashCommands.length||e.skills.length?0:-1),o(),m(e.byTool.length?1:-1)}}function Ke(i,t){if(i&1&&(a(0,"div",43)(1,"span",108),l(2),r(),a(3,"div",31),x(4,"app-bar",109),r(),a(5,"span",110),l(6),r()()),i&2){let e=t.$implicit,n=d(3);o(2),u(n.fmtClock(e.prompt.ts)),o(2),_("frac",e.prompt.cost_usd/n.maxPromptCost())("color",e.prompt.cost_usd>2.5?"var(--error)":"var(--accent)"),o(2),g("$",e.prompt.cost_usd.toFixed(2))}}function Qe(i,t){if(i&1&&(a(0,"div",106),l(1,"Cost per prompt"),r(),a(2,"div",107),P(3,Ke,7,4,"div",43,pe),r()),i&2){let e=d(2);o(3),O(e.groups())}}function Xe(i,t){if(i&1){let e=$();a(0,"div",16)(1,"div",21)(2,"div",22)(3,"div",23)(4,"div",24),l(5,"Cost"),r(),a(6,"div",25),l(7),r()(),a(8,"div",23)(9,"div",24),l(10,"Prompts"),r(),a(11,"div",26),l(12),r()(),a(13,"div",23)(14,"div",24),l(15,"Window"),r(),a(16,"div",27),l(17),r()(),a(18,"div",23)(19,"div",24),l(20,"Cache hit"),r(),a(21,"div",26),l(22),k(23,"number"),r()(),a(24,"div",23)(25,"div",24),l(26,"Tool calls"),r(),a(27,"div",26),l(28),r()()(),a(29,"div",28)(30,"span",29),l(31),r(),a(32,"span",30),l(33,"click a prompt for full detail"),r(),x(34,"div",31),a(35,"button",32),E("click",function(){D(e);let s=d();return I(s.expandAll())}),l(36,"Expand all"),r(),a(37,"button",32),E("click",function(){D(e);let s=d();return I(s.collapseAll())}),l(38,"Collapse all"),r()(),a(39,"div",33),P(40,Ae,25,27,"div",34,pe,!1,Ve,2,0,"div",17),r()(),a(43,"div",35)(44,"div",36),l(45,"Token mix"),r(),a(46,"div",37),x(47,"div",38)(48,"div",39)(49,"div",40)(50,"div",41),r(),a(51,"div",42)(52,"div",43),x(53,"span",44),a(54,"span",45),l(55,"Input"),r(),a(56,"span",46),l(57),r(),a(58,"span",47),l(59),k(60,"number"),r()(),a(61,"div",43),x(62,"span",48),a(63,"span",45),l(64,"Output"),r(),a(65,"span",46),l(66),r(),a(67,"span",47),l(68),k(69,"number"),r()(),a(70,"div",43),x(71,"span",49),a(72,"span",45),l(73,"Cache write"),r(),a(74,"span",46),l(75),r(),a(76,"span",47),l(77),k(78,"number"),r()(),a(79,"div",43),x(80,"span",50),a(81,"span",45),l(82,"Cache read"),r(),a(83,"span",46),l(84),r(),a(85,"span",47),l(86),k(87,"number"),r()()(),a(88,"div",51)(89,"div",43),x(90,"app-icon",52),a(91,"span",53),l(92,"Cache effectiveness"),r()(),a(93,"div",54)(94,"span",55),l(95),k(96,"number"),r(),a(97,"span",53),l(98,"of input served from cache"),r()()(),p(99,Ye,2,2),p(100,Qe,5,0),r()()}if(i&2){let e,n=t,s=d();o(7),g("$",n.total_cost_usd.toFixed(2)),o(5),u(n.prompt_count),o(5),V(" ",s.fmtClock(n.started_at)," \u2013 ",s.fmtClock(n.ended_at).split(" ").pop()," "),o(4),C("color",s.cacheColor(s.cacheReadRate())),o(),g(" ",w(23,34,s.cacheReadRate()*100,"1.0-0"),"% "),o(6),u(s.totalToolCalls()),o(3),g("Prompt timeline \xB7 ",s.groups().length),o(9),O(s.groups()),o(7),C("width",s.tokPct("input"),"%"),_("title","Input: "+s.fmtTokens(n.total_input_tokens)),o(),C("width",s.tokPct("output"),"%"),_("title","Output: "+s.fmtTokens(n.total_output_tokens)),o(),C("width",s.tokPct("cacheWrite"),"%"),_("title","Cache write: "+s.fmtTokens(n.total_cache_creation_tokens)),o(),C("width",s.tokPct("cacheRead"),"%"),_("title","Cache read: "+s.fmtTokens(n.total_cache_read_tokens)),o(7),u(s.fmtTokens(n.total_input_tokens)),o(2),g("",w(60,37,s.tokPct("input"),"1.0-0"),"%"),o(7),u(s.fmtTokens(n.total_output_tokens)),o(2),g("",w(69,40,s.tokPct("output"),"1.0-0"),"%"),o(7),u(s.fmtTokens(n.total_cache_creation_tokens)),o(2),g("",w(78,43,s.tokPct("cacheWrite"),"1.0-0"),"%"),o(7),u(s.fmtTokens(n.total_cache_read_tokens)),o(2),g("",w(87,46,s.tokPct("cacheRead"),"1.0-0"),"%"),o(4),_("size",13),o(5),g("",w(96,49,s.cacheReadRate()*100,"1.0-0"),"%"),o(4),m((e=s.summaryData())?99:-1,e),o(),m(s.groups().length>0?100:-1)}}function Ze(i,t){i&1&&(a(0,"div",17),l(1,"Session not found."),r())}var et=5e3,tt=/<command-name>([^<]+)<\/command-name>/,nt=new Set(["Read","Edit","Write","NotebookEdit","MultiEdit"]),ce=class i{api=M(te);route=M(Z);sanitizer=M(X);destroyRef=M(F);refresh=M(ne);liveMode=S("idle");idSig=se(this.route.paramMap,{initialValue:this.route.snapshot.paramMap});id=h(()=>this.idSig().get("id")??"");localRefreshing=S(!1);expandedIds=S(new Set);expandedToolInputs=S(new Set);resource=H(this.api,()=>{let t=this.id();return t?`/api/claude/session/${encodeURIComponent(t)}`:null});summary=H(this.api,()=>{let t=this.id();return t?`/api/claude/session/${encodeURIComponent(t)}/summary`:null});session=h(()=>this.resource.state().data?.session??null);prompts=h(()=>this.resource.state().data?.prompts??[]);toolCalls=h(()=>this.resource.state().data?.toolCalls??[]);summaryData=h(()=>this.summary.state().data??null);groups=h(()=>{let t=this.prompts(),e=this.toolCalls(),n=new Map;for(let s of e){let c=n.get(s.prompt_id)??[];c.push(s),n.set(s.prompt_id,c)}return t.map(s=>{let c=n.get(s.id)??[],v=(s.input_tokens||0)+(s.output_tokens||0)+(s.cache_creation_tokens||0)+(s.cache_read_tokens||0),y=c.reduce((b,R)=>b+(R.result_length||0),0),f=s.text?tt.exec(s.text):null,T=f?f[1].trim():null,q=c.length>0?Math.max(...c.map(b=>b.ts||0)):0,me=q>s.ts?q-s.ts:0,N=new Map;for(let b of c)N.set(b.tool_name,(N.get(b.tool_name)??0)+1);let ue=Array.from(N.entries()).map(([b,R])=>({name:b,count:R,color:this.toolColor(b)})).sort((b,R)=>R.count-b.count),U=new Set;for(let b of c)nt.has(b.tool_name)&&b.input_summary&&U.add(b.input_summary);return{prompt:s,tools:c,totalTokens:v,toolBytes:y,slashCommand:T,durationMs:me,toolBreakdown:ue,filesTouched:Array.from(U)}})});totalToolCalls=h(()=>this.toolCalls().length);totalTokens=h(()=>{let t=this.session();return t&&(t.total_input_tokens||0)+(t.total_output_tokens||0)+(t.total_cache_creation_tokens||0)+(t.total_cache_read_tokens||0)||1});maxPromptCost=h(()=>{let t=this.groups();return Math.max(1e-4,...t.map(e=>e.prompt.cost_usd||0))});toolBarColor=t=>{let e=t.name;return e==="Read"?"var(--node-spec)":e==="Edit"||e==="Write"||e==="MultiEdit"?"var(--accent)":e==="Bash"?"var(--warn)":e==="Grep"||e==="Glob"?"var(--node-test)":e==="Task"?"var(--node-route)":e.startsWith("mcp__")?"var(--success)":"var(--node-code)"};cacheReadRate=h(()=>{let t=this.session();if(!t)return 0;let e=(t.total_input_tokens||0)+(t.total_cache_creation_tokens||0)+(t.total_cache_read_tokens||0);return e>0?(t.total_cache_read_tokens||0)/e:0});constructor(){B(()=>{!this.resource.state().loading&&this.localRefreshing()&&this.localRefreshing.set(!1)});let t=null,e=null,n=()=>{e!==null&&(clearInterval(e),e=null)},s=()=>{e===null&&(e=setInterval(()=>{typeof document<"u"&&document.visibilityState==="visible"&&this.resource.refetch()},et))},c=()=>{t&&(t(),t=null)},v=f=>{f&&(c(),t=this.api.openEventStream(`/api/claude/session/${encodeURIComponent(f)}/events`,T=>{T==="prompt_added"||T==="tool_call_added"?this.resource.refetch():T==="snapshot"?(this.liveMode.set("live"),n()):T==="stream_error"&&(this.liveMode.set("polling"),s())},()=>{this.liveMode.set("polling"),s()},["prompt_added","tool_call_added","snapshot","stream_error"]))},y=()=>{if(!(typeof document>"u"))if(document.visibilityState==="visible"){this.resource.refetch();let f=this.id();f&&this.liveMode()==="polling"&&v(f)}else n()};B(()=>{let f=this.id();if(c(),n(),!f){this.liveMode.set("idle");return}v(f)}),typeof document<"u"&&document.addEventListener("visibilitychange",y),this.destroyRef.onDestroy(()=>{c(),n(),this.liveMode.set("idle"),typeof document<"u"&&document.removeEventListener("visibilitychange",y)})}async forceRefresh(){this.localRefreshing.set(!0),await this.refresh.triggerGlobalRefresh()}isExpanded(t){return this.expandedIds().has(t)}toggleExpand(t){this.expandedIds.update(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})}expandAll(){this.expandedIds.set(new Set(this.prompts().map(t=>t.id)))}collapseAll(){this.expandedIds.set(new Set)}isToolInputExpanded(t){return this.expandedToolInputs().has(t)}toggleToolInput(t){this.expandedToolInputs.update(e=>{let n=new Set(e);return n.has(t)?n.delete(t):n.add(t),n})}renderAssistant(t){return this.sanitizer.bypassSecurityTrustHtml(re(t??""))}formatToolInput(t){if(!t)return"";try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}}fmtBytes(t){return t?t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} kB`:`${(t/(1024*1024)).toFixed(1)} MB`:"0"}fmtTokens(t){return t<1e3?`${t}`:t<1e6?`${(t/1e3).toFixed(1)}k`:`${(t/1e6).toFixed(2)}M`}fmtTokensFn=t=>this.fmtTokens(t);fmtClock(t){if(!t)return"";try{let e=new Date(t),n=new Date;n.setHours(0,0,0,0);let s=864e5,c=n.getTime()-new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),v=e.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"});return c===0?v:c===s?"Yest "+v:e.toLocaleDateString([],{month:"short",day:"numeric"})+" "+v}catch{return String(t)}}fmtDurationSec(t,e){if(!t||!e)return"";let n=Math.round((e-t)/1e3);if(n<60)return`${n}s`;let s=Math.floor(n/60),c=n%60;if(s<60)return`${s}m ${c}s`;let v=Math.floor(s/60),y=s%60;return`${v}h ${y}m`}fmtDurationMs(t){if(!t||t<=0)return"";if(t<1e3)return`${t}ms`;let e=t/1e3;if(e<60)return`${e.toFixed(e<10?1:0)}s`;let n=Math.floor(e/60),s=Math.round(e%60);if(n<60)return`${n}m ${s}s`;let c=Math.floor(n/60),v=n%60;return`${c}h ${v}m`}basename(t){if(!t)return"";if(t.length<=40)return t;let e=t.split("/");return e.length<=2?t:"\u2026/"+e.slice(-2).join("/")}toolColor(t){return t==="Read"?"var(--node-spec)":t==="Edit"||t==="Write"||t==="MultiEdit"||t==="NotebookEdit"?"var(--accent)":t==="Bash"?"var(--warn)":t==="Grep"||t==="Glob"?"var(--node-test)":t==="Task"?"var(--node-route)":t.startsWith("mcp__")?"var(--success)":"var(--text-secondary)"}cacheColor(t){return t>=.7?"var(--success)":t>=.5?"var(--warn)":"var(--error)"}tokPct(t){let e=this.session();if(!e)return 0;let n=this.totalTokens();return(t==="input"?e.total_input_tokens||0:t==="output"?e.total_output_tokens||0:t==="cacheWrite"?e.total_cache_creation_tokens||0:e.total_cache_read_tokens||0)/n*100}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=W({type:i,selectors:[["app-session-detail"]],decls:22,vars:20,consts:[[1,"sd-root"],[1,"page-head"],[1,"back-link","btn","btn-ghost","btn-sm",3,"routerLink"],["name","chevronLeft",3,"size"],[1,"title-block"],[1,"title"],[1,"mono","session-id"],[3,"color","bg"],[1,"live-pill",3,"title"],[1,"dot"],[1,"sub"],[1,"page-actions"],["type","button","aria-label","Refresh session detail",1,"btn","btn-secondary","btn-sm","refresh-btn",3,"click","disabled"],["name","refresh",3,"size"],[1,"loading"],[1,"error"],[1,"sd-body"],[1,"empty"],[1,"error-title"],[1,"error-detail"],[1,"btn","btn-secondary","btn-sm",3,"click"],[1,"scroll-y","sd-main"],[1,"stat-strip"],[1,"stat"],[1,"stat-lbl"],[1,"stat-val","cost"],[1,"stat-val","mono"],[1,"stat-val","mono",2,"font-size","12px"],[1,"row","gap-8",2,"justify-content","space-between","margin-bottom","8px"],[1,"eyebrow"],[1,"muted",2,"font-size","11px"],[1,"grow"],["type","button",1,"btn","btn-ghost","btn-sm",3,"click"],[1,"col","gap-6",2,"padding-bottom","16px"],[1,"prompt","card"],[1,"scroll-y","sd-rail"],[1,"eyebrow",2,"margin-bottom","10px"],[1,"tok-bar",2,"margin-bottom","10px"],[1,"tok-seg",2,"background","var(--node-spec)",3,"title"],[1,"tok-seg",2,"background","var(--node-code)",3,"title"],[1,"tok-seg",2,"background","var(--warn)",3,"title"],[1,"tok-seg",2,"background","var(--node-route)",3,"title"],[1,"col","gap-6",2,"margin-bottom","20px"],[1,"row","gap-8"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-spec)","flex-shrink","0"],[1,"muted","grow",2,"font-size","11.5px"],[1,"mono","tabular",2,"font-size","11.5px"],[1,"mono","tabular","muted",2,"font-size","10px","width","32px","text-align","right"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-code)","flex-shrink","0"],[2,"width","9px","height","9px","border-radius","2px","background","var(--warn)","flex-shrink","0"],[2,"width","9px","height","9px","border-radius","2px","background","var(--node-route)","flex-shrink","0"],[1,"cache-card",2,"margin-bottom","20px"],["name","database",2,"color","var(--success)",3,"size"],[1,"muted",2,"font-size","10.5px"],[1,"row",2,"align-items","baseline","gap","8px","margin-top","4px"],[1,"tabular",2,"font-size","24px","font-weight","700","color","var(--success)"],["type","button",1,"prompt-head","row","gap-10",3,"click"],[1,"mono","muted",2,"font-size","10.5px","width","52px","flex-shrink","0"],[2,"width","8px","height","8px","border-radius","50%","flex-shrink","0",3,"title"],[2,"flex-shrink","0",3,"color","bg"],["name","command",2,"color","var(--node-code)","flex-shrink","0",3,"size","title"],[1,"grow",2,"font-size","12.5px","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","min-width","0"],[1,"muted"],[1,"row","gap-4",2,"flex-shrink","0"],["name","wrench",2,"color","var(--text-muted)",3,"size"],[1,"mono","tabular","muted",2,"font-size","11px"],["title","Wall-clock duration for this prompt",1,"mono","tabular","muted",2,"font-size","11px","width","44px","text-align","right","flex-shrink","0"],[1,"mono","tabular","muted",2,"font-size","11px","width","50px","text-align","right","flex-shrink","0"],[1,"mono","tabular",2,"font-size","11px","width","38px","text-align","right","flex-shrink","0"],[1,"mono","tabular",2,"font-size","13px","font-weight","600","width","54px","text-align","right","flex-shrink","0"],["name","chevronRight",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"prompt-body"],["name","bot",3,"size"],[1,"prompt-section"],[1,"section-lbl"],[1,"kv-row"],[1,"kv"],[1,"kv-lbl"],[1,"kv-val","mono"],[1,"kv-val","mono","cost"],[1,"prompt-pre"],[1,"assistant-body","md-content",3,"innerHTML"],[1,"thinking-details"],[1,"section-lbl","thinking-summary"],[1,"muted","xs"],[1,"thinking-body","md-content",3,"innerHTML"],[1,"files-touched"],[1,"file-row",3,"title"],[1,"file-path","mono"],[1,"tools"],[1,"tool-block"],["type","button",1,"tool-row",3,"click","disabled"],["aria-hidden","true",1,"tool-chevron","mono"],[1,"tool-name","mono"],[1,"tool-input","mono"],[1,"tool-bytes","mono","muted"],[1,"tool-input-json","mono"],[2,"margin-bottom","20px"],[1,"row","gap-6",2,"flex-wrap","wrap"],[1,"pill",2,"color","var(--node-code)","background","var(--node-code-soft)","font-family","var(--font-mono)","font-weight","500"],[1,"pill",2,"color","var(--node-test)","background","var(--node-test-soft)","font-family","var(--font-mono)","font-weight","500"],["name","command",3,"size"],[2,"opacity","0.7"],["name","sparkles",3,"size"],["valueKey","calls",3,"items","fmt","color"],[1,"muted",2,"font-size","10px","margin-top","8px"],[1,"eyebrow",2,"margin","20px 0 10px"],[1,"col","gap-5"],[1,"mono","muted",2,"font-size","10px","width","44px","flex-shrink","0"],[3,"frac","color"],[1,"mono","tabular",2,"font-size","10.5px","width","40px","text-align","right"]],template:function(e,n){if(e&1&&(a(0,"div",0)(1,"header",1)(2,"a",2),x(3,"app-icon",3),l(4," Sessions "),r(),a(5,"div",4)(6,"div",5)(7,"span",6),l(8),r(),p(9,fe,2,3,"app-pill",7),a(10,"span",8),x(11,"span",9),l(12),r()(),p(13,be,3,2,"div",10),r(),a(14,"div",11)(15,"button",12),E("click",function(){return n.forceRefresh()}),x(16,"app-icon",13),l(17),r()()(),p(18,he,2,0,"div",14)(19,Ce,7,1,"div",15)(20,Xe,101,52,"div",16)(21,Ze,2,0,"div",17),r()),e&2){let s,c,v;o(2),_("routerLink",Y(19,xe)),o(),_("size",14),o(5),u(n.id().slice(0,12)),o(),m((s=n.session())!=null&&s.last_model?9:-1),o(),z("live",n.liveMode()==="live")("polling",n.liveMode()==="polling")("idle",n.liveMode()==="idle"),_("title",n.liveMode()==="live"?"Live \u2014 new prompts push as Claude Code writes them":n.liveMode()==="polling"?"Polling \u2014 SSE unavailable, refetching every 5s":"Idle \u2014 live updates paused"),o(2),g(" ",n.liveMode()==="live"?"Live":n.liveMode()==="polling"?"Polling":"Idle"," "),o(),m((c=n.session())?13:-1,c),o(2),z("spinning",n.localRefreshing()||n.refresh.loading()),_("disabled",n.refresh.loading()),o(),_("size",13),o(),g(" ",n.localRefreshing()||n.refresh.loading()?"Refreshing\u2026":"Refresh"," "),o(),m(n.resource.state().loading&&!n.session()?18:n.resource.state().error?19:(v=n.session())?20:21,v)}},dependencies:[ee,ie,ae,oe,le,Q],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.sd-root[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-height:0;padding:16px 18px 0}.page-head[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:12px;margin-bottom:14px;flex-wrap:wrap}.back-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;color:var(--text-muted);text-decoration:none}.title-block[_ngcontent-%COMP%]{flex:1;min-width:250px}.title[_ngcontent-%COMP%]{font-size:var(--fs-title);font-weight:600;letter-spacing:-.01em;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.session-id[_ngcontent-%COMP%]{color:var(--accent);font-size:14px}.live-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:999px;white-space:nowrap;cursor:help}.live-pill[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;flex-shrink:0}.live-pill.live[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.live-pill.live[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--success);animation:_ngcontent-%COMP%_live-pulse 1.6s ease-in-out infinite}.live-pill.polling[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.live-pill.polling[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--warn)}.live-pill.idle[_ngcontent-%COMP%]{color:var(--text-muted);background:var(--bg-canvas)}.live-pill.idle[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--text-muted)}@keyframes _ngcontent-%COMP%_live-pulse{0%,to{opacity:.4;transform:scale(.85)}50%{opacity:1;transform:scale(1.05)}}.sub[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:12px;margin-top:2px}.page-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.refresh-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px}.refresh-btn.spinning[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_spin .9s linear infinite;color:var(--accent)}.refresh-btn[_ngcontent-%COMP%]:disabled{cursor:progress;opacity:.8}@keyframes _ngcontent-%COMP%_spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.sd-body[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;gap:0}.sd-main[_ngcontent-%COMP%]{flex:1;min-width:0;padding:0 0 18px}.sd-rail[_ngcontent-%COMP%]{width:290px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);padding:16px}.stat-strip[_ngcontent-%COMP%]{display:flex;gap:24px;padding:12px 0;border-top:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle);margin-bottom:16px}.stat[_ngcontent-%COMP%] .stat-lbl[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}.stat[_ngcontent-%COMP%] .stat-val[_ngcontent-%COMP%]{font-size:16px;font-weight:600;margin-top:2px;color:var(--text-primary);font-variant-numeric:tabular-nums}.stat-val.cost[_ngcontent-%COMP%]{color:var(--accent)}.tok-bar[_ngcontent-%COMP%]{display:flex;height:10px;border-radius:999px;overflow:hidden}.tok-seg[_ngcontent-%COMP%]{height:100%}.cache-card[_ngcontent-%COMP%]{background:var(--success-soft);border:1px solid rgba(70,194,107,.25);border-radius:8px;padding:10px 12px}.prompt.card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:9px;overflow:hidden;transition:border-color .12s}.prompt.card[_ngcontent-%COMP%]:hover{border-color:var(--border-strong)}.prompt-head[_ngcontent-%COMP%]{width:100%;padding:11px 12px;background:transparent;border:0;text-align:left;cursor:pointer;color:inherit;font-family:inherit}.prompt-head[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.prompt-head[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.prompt-body[_ngcontent-%COMP%]{border-top:1px solid var(--border-subtle);padding:14px 16px;background:var(--bg-canvas)}.prompt-section[_ngcontent-%COMP%]{margin-bottom:14px}.prompt-section[_ngcontent-%COMP%]:last-child{margin-bottom:0}.section-lbl[_ngcontent-%COMP%]{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:6px}.prompt-pre[_ngcontent-%COMP%]{margin:0;padding:10px 12px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;font-family:var(--font-mono);font-size:11.5px;line-height:1.55;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:280px;overflow-y:auto}.kv-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(100px,1fr));gap:10px 18px}.kv[_ngcontent-%COMP%] .kv-lbl[_ngcontent-%COMP%]{font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600}.kv[_ngcontent-%COMP%] .kv-val[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600;margin-top:2px;color:var(--text-primary);font-variant-numeric:tabular-nums}.kv-val.cost[_ngcontent-%COMP%]{color:var(--accent)}.tools[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:3px}.tool-block[_ngcontent-%COMP%]{display:flex;flex-direction:column}.tool-row[_ngcontent-%COMP%]{appearance:none;background:var(--bg-panel);border:1px solid var(--border-subtle);color:inherit;font-family:inherit;text-align:left;display:flex;align-items:center;gap:8px;width:100%;padding:5px 10px;border-radius:6px;font-size:11.5px;cursor:pointer}.tool-row[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--bg-hover)}.tool-row[_ngcontent-%COMP%]:disabled{cursor:default}.tool-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tool-row.expanded[_ngcontent-%COMP%]{border-bottom-left-radius:0;border-bottom-right-radius:0}.tool-chevron[_ngcontent-%COMP%]{width:10px;color:var(--text-muted);transition:transform .12s;font-size:12px;flex-shrink:0;display:inline-block}.tool-chevron.open[_ngcontent-%COMP%]{transform:rotate(90deg);color:var(--accent)}.tool-name[_ngcontent-%COMP%]{font-weight:600;flex-shrink:0}.tool-input[_ngcontent-%COMP%]{color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:11px}.tool-bytes[_ngcontent-%COMP%]{font-size:10.5px;flex-shrink:0}.tool-input-json[_ngcontent-%COMP%]{margin:0;padding:10px 14px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-top:0;border-radius:0 0 6px 6px;font-family:var(--font-mono);font-size:11px;line-height:1.5;color:var(--text-primary);white-space:pre-wrap;word-break:break-word;max-height:320px;overflow-y:auto}.assistant-body[_ngcontent-%COMP%]{padding:10px 14px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;font-size:12.5px;line-height:1.55;color:var(--text-primary);max-height:480px;overflow-y:auto;overflow-wrap:anywhere}.thinking-details[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:7px;padding:8px 12px}.thinking-summary[_ngcontent-%COMP%]{cursor:pointer;list-style:none;display:flex;align-items:center;gap:6px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted)}.thinking-summary[_ngcontent-%COMP%]::-webkit-details-marker{display:none}.thinking-summary[_ngcontent-%COMP%]:before{content:"\\203a";display:inline-block;transition:transform .12s;font-size:14px;color:var(--text-muted)}.thinking-details[open][_ngcontent-%COMP%] .thinking-summary[_ngcontent-%COMP%]:before{transform:rotate(90deg);color:var(--accent)}.thinking-body[_ngcontent-%COMP%]{margin-top:10px;padding:8px 0 0;border-top:1px dashed var(--border-subtle);font-size:12px;line-height:1.55;color:var(--text-secondary);max-height:320px;overflow-y:auto;overflow-wrap:anywhere}.files-touched[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:3px;font-size:11.5px;max-height:180px;overflow-y:auto;padding:6px 10px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px}.files-touched[_ngcontent-%COMP%] .file-row[_ngcontent-%COMP%]{display:flex;align-items:center;min-width:0}.files-touched[_ngcontent-%COMP%] .file-path[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-secondary)}.loading[_ngcontent-%COMP%]{padding:40px 18px;text-align:center;color:var(--text-muted);font-size:13px}.error[_ngcontent-%COMP%]{padding:16px;margin:12px 0;border-radius:8px;border:1px solid rgba(255,90,90,.35);background:var(--error-soft);color:var(--error);display:flex;flex-direction:column;gap:8px;align-items:flex-start}.error-title[_ngcontent-%COMP%]{font-weight:600;font-size:13px}.error-detail[_ngcontent-%COMP%]{font-size:12px;color:var(--text-secondary)}.empty[_ngcontent-%COMP%]{padding:30px 18px;color:var(--text-muted);font-size:12.5px;text-align:center}.md-content[_ngcontent-%COMP%] .md-h1[_ngcontent-%COMP%]{font-size:14px;font-weight:650;color:var(--text-primary);letter-spacing:-.01em;margin:0 0 8px}.md-content[_ngcontent-%COMP%] .md-h2[_ngcontent-%COMP%]{font-size:12.5px;font-weight:650;color:var(--text-primary);margin:14px 0 4px;padding-bottom:3px;border-bottom:1px solid var(--border-subtle)}.md-content[_ngcontent-%COMP%] .md-h3[_ngcontent-%COMP%]{font-size:12px;font-weight:650;color:var(--text-primary);margin:12px 0 4px}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.6;color:var(--text-primary);margin:0 0 4px;overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:650}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{padding:0;margin:4px 0 6px}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{position:relative;padding:2px 0 2px 20px;font-size:12.5px;line-height:1.55;color:var(--text-primary);overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%]{list-style:none}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:"\\2022";position:absolute;left:4px;top:1px;color:var(--text-faint)}.md-content[_ngcontent-%COMP%] .md-spacer[_ngcontent-%COMP%]{height:5px}.md-content[_ngcontent-%COMP%] .md-inline-code[_ngcontent-%COMP%]{font-size:11px;background:var(--bg-canvas);padding:1px 5px;border-radius:3px;border:1px solid var(--border-subtle);color:var(--node-spec)}.md-content[_ngcontent-%COMP%] .md-blockquote[_ngcontent-%COMP%]{margin:5px 0;padding:6px 10px;border-left:3px solid var(--accent);background:var(--accent-soft);color:var(--text-secondary);font-size:12px;line-height:1.5;border-radius:0 5px 5px 0}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%]{position:relative;margin:6px 0 8px;padding:10px 12px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:6px;overflow-x:auto}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;font-size:11px;line-height:1.5;color:var(--text-primary);white-space:pre}.md-content[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{margin-top:0}'],changeDetection:0})};export{ce as SessionDetail};
@@ -1 +0,0 @@
1
- import{a as V}from"./chunk-SBWU7JFC.js";import{a as me,b as ue,c as A}from"./chunk-GR72OOCN.js";import{b as se,c as $,d as de,e as pe,f as ce}from"./chunk-SHPTC4RL.js";import{a as D}from"./chunk-7RNS77UP.js";import{a as H}from"./chunk-E44X4RH2.js";import{$ as ne,Aa as c,Ba as s,Ca as p,Da as x,Ga as O,Ha as B,I as _,Ia as C,Ja as R,Ka as g,M as w,N as M,O as J,R as ee,Ta as oe,Ua as y,V as te,Va as l,W as T,Wa as v,Xa as N,Ya as ae,ca as ie,cb as re,da as X,ea as o,ka as h,lb as j,ob as F,pb as k,qa as P,ra as m,sa as u,va as S,wa as E,wb as le,xa as f,ya as a,za as r,zb as z}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";var ge=[{path:"",pathMatch:"full",redirectTo:"dashboard"},{path:"dashboard",loadComponent:()=>import("./chunk-D5OCNEJA.js").then(e=>e.Dashboard),data:{nav:"dashboard",title:"Dashboard"}},{path:"graph",loadComponent:()=>import("./chunk-WLIMNDS3.js").then(e=>e.Graph),data:{nav:"graph",title:"Graph"}},{path:"specs",loadComponent:()=>import("./chunk-2YUJNZ2Y.js").then(e=>e.Specs),data:{nav:"specs",title:"Specs"}},{path:"drift",loadComponent:()=>import("./chunk-FHZHD2ZG.js").then(e=>e.Drift),data:{nav:"drift",title:"Drift queue"}},{path:"workflows",loadComponent:()=>import("./chunk-NZEZCT65.js").then(e=>e.Workflows),data:{nav:"workflows",title:"Workflows"}},{path:"runs",loadComponent:()=>import("./chunk-UBOZGQNK.js").then(e=>e.Runs),data:{nav:"runs",title:"Runs"}},{path:"runs/:id",loadComponent:()=>import("./chunk-MVOMVPYB.js").then(e=>e.RunDetail),data:{nav:"runs",title:"Run detail"}},{path:"chat",loadComponent:()=>import("./chunk-L37MTFSG.js").then(e=>e.Chat),data:{nav:"chat",title:"Chat"}},{path:"sessions",loadComponent:()=>import("./chunk-ASZ77FMZ.js").then(e=>e.Sessions),data:{nav:"sessions",title:"Sessions"}},{path:"sessions/:id",loadComponent:()=>import("./chunk-GWPVKJIY.js").then(e=>e.SessionDetail),data:{nav:"sessions",title:"Session detail"}},{path:"heatmap",loadComponent:()=>import("./chunk-YAMRN47K.js").then(e=>e.Heatmap),data:{nav:"heatmap",title:"Heatmap"}},{path:"costs",loadComponent:()=>import("./chunk-B3YPFY6A.js").then(e=>e.Costs),data:{nav:"costs",title:"Costs"}},{path:"compare",loadComponent:()=>import("./chunk-WCKHQIYN.js").then(e=>e.Compare),data:{nav:"compare",title:"Compare projects"}},{path:"tips",loadComponent:()=>import("./chunk-A5R3MJMO.js").then(e=>e.Tips),data:{nav:"tips",title:"Tips"}},{path:"memory",loadComponent:()=>import("./chunk-45QHGCB4.js").then(e=>e.Memory),data:{nav:"memory",title:"Memory"}},{path:"design",loadComponent:()=>import("./chunk-WAI2JMZP.js").then(e=>e.Design),data:{nav:"design",title:"Design system"}},{path:"settings",loadComponent:()=>import("./chunk-BYZFQSM6.js").then(e=>e.Settings),data:{nav:"settings",title:"Settings"}},{path:"**",redirectTo:"dashboard"}];var fe={providers:[te(),ce(ge)]};function ve(e,n){e&1&&(J(),x(0,"rect",14)(1,"rect",15))}var G=class e{size=k(24);tile=k(!0);glow=k(!0);static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-logo-mark"]],inputs:{size:[1,"size"],tile:[1,"tile"],glow:[1,"glow"]},decls:16,vars:5,consts:[["viewBox","0 0 32 32","fill","none",2,"flex-shrink","0"],["id","ssTile","x1","0","y1","0","x2","32","y2","32","gradientUnits","userSpaceOnUse"],["stop-color","#12161E"],["offset","1","stop-color","#0B0D11"],["id","ssLead","x1","18","y1","11","x2","26","y2","21","gradientUnits","userSpaceOnUse"],["stop-color","#6FA0F6"],["offset","1","stop-color","#5B93F2"],["transform","translate(4.6 4.6) scale(0.715)"],["d","M5 16 H11 M11 9 L23 16 L11 23","stroke","rgba(150,165,200,0.5)","stroke-width","1.9","stroke-linecap","round","stroke-linejoin","round","fill","none"],["x1","11","y1","9","x2","11","y2","23","stroke","rgba(150,165,200,0.4)","stroke-width","1.9","stroke-linecap","round"],["cx","23","cy","16","r","3.6","fill","url(#ssLead)"],["cx","11","cy","9","r","2.9","fill","#A586F5"],["cx","11","cy","23","r","2.9","fill","#46C26B"],["cx","5","cy","16","r","2.1","fill","#29D2BE"],["width","32","height","32","rx","7.2","fill","url(#ssTile)"],["x","0.5","y","0.5","width","31","height","31","rx","6.7","fill","none","stroke","rgba(255,255,255,0.08)"]],template:function(t,i){t&1&&(J(),s(0,"svg",0)(1,"defs")(2,"linearGradient",1),x(3,"stop",2)(4,"stop",3),p(),s(5,"linearGradient",4),x(6,"stop",5)(7,"stop",6),p()(),m(8,ve,2,0),s(9,"g",7),x(10,"path",8)(11,"line",9)(12,"circle",10)(13,"circle",11)(14,"circle",12)(15,"circle",13),p()()),t&2&&(oe("filter",i.glow()?"drop-shadow(0 0 9px rgba(91,147,242,0.35))":"none"),P("width",i.size())("height",i.size()),o(8),u(i.tile()?8:-1))},styles:["[_nghost-%COMP%]{display:inline-flex;align-items:center;justify-content:center;line-height:0}"],changeDetection:0})};var _e=e=>["/",e],be=(e,n)=>n.group,he=(e,n)=>n.id;function xe(e,n){e&1&&(a(0,"div",3),l(1,"SpecShip "),a(2,"span",14),l(3,"Desktop"),r()())}function Ce(e,n){if(e&1&&(a(0,"div",15),l(1),r()),e&2){let t=g().$implicit;o(),v(t.group)}}function ye(e,n){if(e&1&&(a(0,"span",18),l(1),r()),e&2){let t=g(2).$implicit,i=g(2);P("data-kind",t.badgeKind),o(),v(i.badgeOf(t))}}function Pe(e,n){if(e&1&&(a(0,"span",11),l(1),r(),m(2,ye,2,2,"span",18)),e&2){let t=g().$implicit,i=g(2);o(),v(t.label),o(),u(i.badgeOf(t)>0?2:-1)}}function ke(e,n){if(e&1&&(a(0,"a",16),c(1,"span",8),a(2,"span",9),c(3,"app-icon",17),r(),m(4,Pe,3,2),r()),e&2){let t=n.$implicit,i=g(2);f("routerLink",re(5,_e,t.id))("title",i.collapsed()?t.label:null),o(3),f("name",t.icon)("size",16),o(),u(i.collapsed()?-1:4)}}function we(e,n){if(e&1&&(a(0,"div",5),m(1,Ce,2,1,"div",15),S(2,ke,5,7,"a",16,he),r()),e&2){let t=n.$implicit,i=g();o(),u(i.collapsed()?-1:1),o(),E(t.items)}}function Me(e,n){e&1&&(a(0,"span",11),l(1,"Design system"),r())}function Se(e,n){e&1&&(a(0,"span",11),l(1,"Settings"),r())}var q=class e{collapsed=k(!1);api=_(H);projects=_(D);status=A(this.api,()=>`/api/status${this.projects.projectQuery()}`);tips=A(this.api,()=>"/api/claude/tips");nav=[{group:"Project",items:[{id:"dashboard",label:"Dashboard",icon:"dashboard"},{id:"graph",label:"Graph",icon:"graph"},{id:"specs",label:"Specs",icon:"book"},{id:"drift",label:"Drift queue",icon:"drift",badge:()=>this.status.state().data?.drift??0,badgeKind:"warn"},{id:"workflows",label:"Workflows",icon:"workflow"},{id:"runs",label:"Runs",icon:"play"},{id:"chat",label:"Chat",icon:"chat"}]},{group:"Claude Code",items:[{id:"sessions",label:"Sessions",icon:"sessions"},{id:"heatmap",label:"Heatmap",icon:"heatmap"},{id:"costs",label:"Costs",icon:"dollar"},{id:"compare",label:"Compare projects",icon:"compare"},{id:"memory",label:"Memory",icon:"memory"},{id:"tips",label:"Tips",icon:"tips",badge:()=>(this.tips.state().data?.tips??[]).filter(n=>n.severity!=="info").length,badgeKind:"error"}]}];badgeOf(n){return n.badge?n.badge():0}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-sidebar"]],inputs:{collapsed:[1,"collapsed"]},decls:18,vars:10,consts:[[1,"sidebar"],[1,"brand"],[3,"size"],[1,"brand-text"],[1,"scroll-y","nav-scroll"],[1,"nav-group"],[1,"pinned"],["routerLink","/design","routerLinkActive","active",1,"nav-item",3,"title"],[1,"indicator"],[1,"nav-icon"],["name","palette",3,"size"],[1,"nav-label"],["routerLink","/settings","routerLinkActive","active",1,"nav-item",3,"title"],["name","settings",3,"size"],[1,"muted"],[1,"eyebrow","group-label"],["routerLinkActive","active",1,"nav-item",3,"routerLink","title"],[3,"name","size"],[1,"badge"]],template:function(t,i){t&1&&(a(0,"nav",0)(1,"div",1),c(2,"app-logo-mark",2),m(3,xe,4,0,"div",3),r(),a(4,"div",4),S(5,we,4,1,"div",5,be),r(),a(7,"div",6)(8,"a",7),c(9,"span",8),a(10,"span",9),c(11,"app-icon",10),r(),m(12,Me,2,0,"span",11),r(),a(13,"a",12),c(14,"span",8),a(15,"span",9),c(16,"app-icon",13),r(),m(17,Se,2,0,"span",11),r()()()),t&2&&(y("collapsed",i.collapsed()),o(2),f("size",26),o(),u(i.collapsed()?-1:3),o(2),E(i.nav),o(3),f("title",i.collapsed()?"Design system":null),o(3),f("size",16),o(),u(i.collapsed()?-1:12),o(),f("title",i.collapsed()?"Settings":null),o(3),f("size",16),o(),u(i.collapsed()?-1:17))},dependencies:[de,pe,z,G],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.sidebar[_ngcontent-%COMP%]{width:var(--sidebar-w);flex-shrink:0;background:var(--bg-panel);border-right:1px solid var(--border-subtle);display:flex;flex-direction:column;transition:width .12s;overflow:hidden;font-family:var(--font-ui)}.sidebar.collapsed[_ngcontent-%COMP%]{width:var(--sidebar-w-collapsed)}.brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:15px 16px}.collapsed[_ngcontent-%COMP%] .brand[_ngcontent-%COMP%]{justify-content:center;padding:14px 0}.brand-text[_ngcontent-%COMP%]{font-weight:600;font-size:13.5px;letter-spacing:-.01em}.brand-text[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--text-muted);font-weight:400}.nav-scroll[_ngcontent-%COMP%]{flex:1;padding:4px 8px}.nav-group[_ngcontent-%COMP%]{margin-bottom:10px}.group-label[_ngcontent-%COMP%]{padding:8px 8px 4px}.nav-item[_ngcontent-%COMP%]{position:relative;display:flex;align-items:center;gap:10px;height:32px;padding:0 10px;border-radius:7px;text-decoration:none;margin-bottom:1px;color:var(--text-secondary);font-weight:450;font-size:13px;transition:background .1s}.collapsed[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]{padding:0;justify-content:center}.nav-item[_ngcontent-%COMP%]:hover{background:var(--bg-hover);color:var(--text-primary)}.nav-item.active[_ngcontent-%COMP%]{background:var(--bg-active);color:var(--text-primary);font-weight:600}.nav-item.active[_ngcontent-%COMP%] .indicator[_ngcontent-%COMP%]{position:absolute;left:0;top:7px;bottom:7px;width:2.5px;border-radius:2px;background:var(--accent)}.nav-icon[_ngcontent-%COMP%]{width:16px;height:16px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;color:var(--text-secondary)}.nav-item[_ngcontent-%COMP%]:hover .nav-icon[_ngcontent-%COMP%]{color:var(--text-primary)}.nav-item.active[_ngcontent-%COMP%] .nav-icon[_ngcontent-%COMP%]{color:var(--accent)}.nav-label[_ngcontent-%COMP%]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge[_ngcontent-%COMP%]{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10px;font-weight:700;padding:1px 6px;min-width:18px;border-radius:999px;display:inline-flex;justify-content:center;color:var(--text-secondary);background:#ffffff0f}.badge[data-kind=error][_ngcontent-%COMP%]{color:var(--error);background:var(--error-soft)}.badge[data-kind=warn][_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.pinned[_ngcontent-%COMP%]{padding:8px;border-top:1px solid var(--border-subtle)}'],changeDetection:0})};function Ee(e,n){if(e&1&&(s(0,"span",8),l(1),p(),x(2,"span",1),s(3,"span",9)(4,"span",10),l(5,"backend"),p(),s(6,"span",4),l(7),p()(),x(8,"span",1),s(9,"span",9)(10,"span",10),l(11,"nodes"),p(),s(12,"span",4),l(13),p()(),s(14,"span",9)(15,"span",10),l(16,"edges"),p(),s(17,"span",4),l(18),p()(),x(19,"span",1),s(20,"span",9)(21,"span",10),l(22,"drift"),p(),s(23,"span",4),l(24),p()(),x(25,"span",11),s(26,"span",9)(27,"span",10),l(28,"indexed"),p(),s(29,"span",4),l(30),p()()),e&2){let t=g(),i=t.status.state().data;o(),v(i.projectPath),o(6),v(i.backend),o(6),v(i.nodeCount.toLocaleString()),o(5),v(i.edgeCount.toLocaleString()),o(5),y("warn",i.drift>0)("success",i.drift===0),o(),v(i.drift),o(6),v(t.indexedLabel())}}function Oe(e,n){e&1&&(s(0,"span",12),l(1,"loading status\u2026"),p(),x(2,"span",11))}function Te(e,n){if(e&1&&(s(0,"span",12),l(1),p(),x(2,"span",11)),e&2){let t=g();o(),v(t.conn.online()?"no backend":"offline \u2014 no cached data")}}function je(e,n){e&1&&(s(0,"span",5),l(1),p()),e&2&&(o(),N("\xB7 ",n))}function De(e,n){e&1&&(s(0,"span",6),l(1,"\u26A0"),p()),e&2&&B("title",n)}var K=class e{api=_(H);projects=_(D);refreshSvc=_(ue);conn=_(me);status=A(this.api,()=>`/api/status${this.projects.projectQuery()}`);offlineAge=j(()=>{let n=this.status.state().cachedAt??this.conn.lastOnlineAt();if(n===null)return null;let t=Date.now()-n;return t<1e4?"just now":t<6e4?`${Math.round(t/1e3)}s ago`:t<36e5?`${Math.round(t/6e4)}m ago`:t<864e5?`${Math.round(t/36e5)}h ago`:`${Math.round(t/864e5)}d ago`});indexedLabel=j(()=>{let n=this.status.state().data?.lastIndexed;if(!n)return"never";try{let t=new Date(n),i=Date.now()-t.getTime();return i<6e4?"just now":i<36e5?`${Math.round(i/6e4)}m ago`:i<864e5?`${Math.round(i/36e5)}h ago`:t.toLocaleDateString()}catch{return String(n)}});async refresh(){await this.refreshSvc.triggerGlobalRefresh()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-status-strip"]],decls:13,vars:14,consts:[[1,"status-strip"],[1,"divider"],[1,"seg","conn",3,"title"],[1,"conn-dot"],[1,"mono","val"],[1,"muted","conn-age"],[1,"refresh-error","mono",3,"title"],[1,"refresh",3,"click","disabled","title"],[1,"seg","mono"],[1,"seg"],[1,"lbl"],[1,"grow"],[1,"mono","muted"]],template:function(t,i){if(t&1&&(s(0,"div",0),m(1,Ee,31,10)(2,Oe,3,0)(3,Te,3,1),x(4,"span",1),s(5,"span",2),x(6,"span",3),s(7,"span",4),l(8),p(),m(9,je,2,1,"span",5),p(),m(10,De,2,1,"span",6),s(11,"button",7),R("click",function(){return i.refresh()}),l(12,"\u21BB"),p()()),t&2){let d,b;o(),u(i.status.state().data?1:i.status.state().loading?2:3),o(4),B("title",i.conn.online()?"Connected to the SpecShip server":"Server unreachable \u2014 showing the last cached data"),o(),y("live",i.conn.online())("off",!i.conn.online()),o(2),v(i.conn.online()?"Live":"Offline"),o(),u((d=!i.conn.online()&&i.offlineAge())?9:-1,d),o(),u((b=i.refreshSvc.error())?10:-1,b),o(),y("spinning",i.refreshSvc.loading()),B("disabled",i.refreshSvc.loading()||!i.conn.online())("title",i.conn.online()?i.refreshSvc.loading()?"Refreshing\u2026":"Refresh: sync index + re-ingest Claude Code transcripts. Updates Sessions, Heatmap, Costs, Memory, Drift, Graph.":"Offline \u2014 reconnect to refresh"),P("aria-label",i.conn.online()?i.refreshSvc.loading()?"Refreshing\u2026":"Refresh everything \u2014 sync index + ingest Claude Code transcripts":"Offline \u2014 reconnect to refresh")}},styles:["[_nghost-%COMP%]{display:contents}.status-strip[_ngcontent-%COMP%]{height:var(--status-h);flex-shrink:0;display:flex;align-items:center;gap:14px;padding:0 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-panel-2);font-size:11.5px;overflow:hidden;white-space:nowrap}.seg[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;flex-shrink:0}.lbl[_ngcontent-%COMP%]{color:var(--text-muted);font-size:11px}.val[_ngcontent-%COMP%]{color:var(--text-secondary);font-variant-numeric:tabular-nums}.val.warn[_ngcontent-%COMP%]{color:var(--warn)}.val.success[_ngcontent-%COMP%]{color:var(--success)}.divider[_ngcontent-%COMP%]{width:1px;height:12px;background:var(--border-subtle);flex-shrink:0}.grow[_ngcontent-%COMP%]{flex:1}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.refresh[_ngcontent-%COMP%]{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:14px;padding:2px 6px;border-radius:4px;transition:background .12s,color .12s}.refresh[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--bg-hover);color:var(--text-primary)}.refresh[_ngcontent-%COMP%]:disabled{cursor:progress;opacity:.8}.refresh[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.refresh.spinning[_ngcontent-%COMP%]{display:inline-block;animation:_ngcontent-%COMP%_spin .9s linear infinite;color:var(--accent)}@keyframes _ngcontent-%COMP%_spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.refresh-error[_ngcontent-%COMP%]{color:var(--warn);font-size:12px;padding:0 2px;cursor:help}.conn[_ngcontent-%COMP%]{gap:5px}.conn-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.conn-dot.live[_ngcontent-%COMP%]{background:var(--success);box-shadow:0 0 6px var(--success)}.conn-dot.off[_ngcontent-%COMP%]{background:var(--warn);box-shadow:0 0 6px var(--warn)}.conn-age[_ngcontent-%COMP%]{font-size:11px}"],changeDetection:0})};var ze=(e,n)=>n.slug;function Le(e,n){e&1&&c(0,"span",8)}function Ie(e,n){e&1&&c(0,"span",9)}function Re(e,n){e&1&&c(0,"span",10)}function Ne(e,n){if(e&1&&(a(0,"span",7),l(1),r(),m(2,Le,1,0,"span",8)(3,Ie,1,0,"span",9)(4,Re,1,0,"span",10)),e&2){let t=n,i=g();o(),v(i.shortPath(t.path)),o(),u(t.exists?t.initialized?4:3:2)}}function Fe(e,n){e&1&&(a(0,"span",3),l(1,"Select project"),r())}function Ae(e,n){if(e&1){let t=O();a(0,"button",20),C("click",function(){w(t);let d=g(2);return M(d.clear())}),c(1,"app-icon",21),l(2," Clear "),r()}e&2&&(o(),f("size",11))}function Be(e,n){e&1&&(a(0,"span",16),l(1,"\xB7 loading\u2026"),r())}function $e(e,n){if(e&1&&(a(0,"span",16),l(1),r()),e&2){let t=g(2);o(),N("\xB7 ",t.filtered().length," shown \xB7 live")}}function He(e,n){e&1&&(a(0,"div",18),l(1,"No projects match."),r())}function Ve(e,n){e&1&&(a(0,"span",25),l(1,"missing"),r())}function Ge(e,n){e&1&&(a(0,"span",26),l(1,"not init"),r())}function qe(e,n){e&1&&(a(0,"span",27),l(1,"initialized"),r())}function Ke(e,n){if(e&1&&(a(0,"span"),l(1),r()),e&2){let t=g().$implicit,i=g(2);o(),N("\xB7 ",i.formatRelative(t.lastModifiedMs))}}function We(e,n){e&1&&c(0,"app-icon",29),e&2&&f("size",13)}function Ue(e,n){if(e&1){let t=O();a(0,"button",22),C("click",function(){let d=w(t).$implicit,b=g(2);return M(b.pick(d.slug))}),a(1,"div",23)(2,"div",24)(3,"span",7),l(4),r(),m(5,Ve,2,0,"span",25)(6,Ge,2,0,"span",26)(7,qe,2,0,"span",27),r(),a(8,"div",28)(9,"span"),l(10),r(),m(11,Ke,2,1,"span"),r()(),m(12,We,1,1,"app-icon",29),r()}if(e&2){let t=n.$implicit,i=g(2);y("active",i.projects.activeSlug()===t.slug),o(4),v(i.shortPath(t.path)),o(),u(t.exists?t.initialized?7:6:5),o(5),ae("",t.sessionCount," session",t.sessionCount===1?"":"s"),o(),u(t.lastModifiedMs>0?11:-1),o(),u(i.projects.activeSlug()===t.slug?12:-1)}}function Qe(e,n){if(e&1){let t=O();a(0,"div",6)(1,"div",11),c(2,"app-icon",12),a(3,"input",13),C("input",function(d){w(t);let b=g();return M(b.onQuery(d.target.value))}),r(),m(4,Ae,3,1,"button",14),r(),a(5,"div",15)(6,"span"),l(7),r(),m(8,Be,2,0,"span",16)(9,$e,2,1,"span",16),r(),a(10,"div",17),m(11,He,2,0,"div",18),S(12,Ue,13,8,"button",19,ze),r()()}if(e&2){let t=g();o(2),f("size",13),o(),f("value",t.query()),o(),u(t.projects.activeSlug()?4:-1),o(3),v(t.projects.claudeRoot()??"~/.claude/projects"),o(),u(t.projects.loading()?8:9),o(3),u(t.filtered().length===0&&!t.projects.loading()?11:-1),o(),E(t.filtered())}}var W=class e{host=_(ne);projects=_(D);open=T(!1);query=T("");filtered=j(()=>{let n=this.query().trim().toLowerCase(),t=this.projects.projects();return n?t.filter(i=>i.path.toLowerCase().includes(n)||i.slug.toLowerCase().includes(n)):t});badge=j(()=>this.projects.projects().length);toggle(){this.open.update(n=>!n)}pick(n){this.projects.setActive(n),this.open.set(!1),this.query.set("")}clear(){this.projects.setActive(null),this.open.set(!1)}onQuery(n){this.query.set(n)}onDocumentClick(n){if(!this.open())return;let t=n.target;t&&!this.host.nativeElement.contains(t)&&this.open.set(!1)}onEscape(){this.open()&&this.open.set(!1)}formatRelative(n){if(!n)return"";let t=Date.now()-n,i=Math.round(t/1e3);if(i<60)return`${i}s ago`;let d=Math.round(i/60);if(d<60)return`${d}m ago`;let b=Math.round(d/60);if(b<24)return`${b}h ago`;let Z=Math.round(b/24);return Z<30?`${Z}d ago`:new Date(n).toLocaleDateString()}shortPath(n){if(!n)return"";let t=this.detectHome();return t&&n===t?"~":t&&n.startsWith(t+"/")?"~/"+n.slice(t.length+1):n}detectHome(){let n=this.projects.claudeRoot();if(!n)return null;let t="/.claude/projects";return n.endsWith(t)?n.slice(0,-t.length):null}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-project-picker"]],hostBindings:function(t,i){t&1&&C("click",function(b){return i.onDocumentClick(b)},X)("keydown.escape",function(){return i.onEscape()},X)},decls:9,vars:9,consts:[[1,"wrap"],["type","button","aria-label","Switch project",1,"trigger",3,"click"],["name","folder",3,"size"],[1,"placeholder"],[1,"badge","mono"],[3,"name","size"],["role","dialog","aria-label","Pick a project",1,"popover"],[1,"path","mono"],["title","path no longer exists on disk",1,"status-dot","missing"],["title","not yet specship init'd",1,"status-dot","warn"],["title","initialized",1,"status-dot","ok"],[1,"popover-head","row","gap-8"],["name","search",3,"size"],["type","text","placeholder","Filter projects\u2026","autofocus","",1,"popover-input",3,"input","value"],["title","Clear selection",1,"btn","btn-ghost","btn-xs"],[1,"popover-meta","mono"],[1,"muted"],[1,"popover-list","scroll-y"],[1,"empty"],["type","button",1,"row-item",3,"active"],["title","Clear selection",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],["type","button",1,"row-item",3,"click"],[1,"col","gap-2","grow"],[1,"row","gap-6","path-line"],[1,"pill","missing"],[1,"pill","warn"],[1,"pill","ok"],[1,"meta","row","gap-8","mono","muted"],["name","check",3,"size"]],template:function(t,i){if(t&1&&(a(0,"div",0)(1,"button",1),C("click",function(){return i.toggle()}),c(2,"app-icon",2),m(3,Ne,5,2)(4,Fe,2,0,"span",3),a(5,"span",4),l(6),r(),c(7,"app-icon",5),r(),m(8,Qe,14,6,"div",6),r()),t&2){let d;y("open",i.open()),o(),P("aria-expanded",i.open()),o(),f("size",13),o(),u((d=i.projects.active())?3:4,d),o(3),v(i.badge()),o(),f("name",i.open()?"chevronDown":"chevronRight")("size",11),o(),u(i.open()?8:-1)}},dependencies:[z],styles:["[_nghost-%COMP%]{display:inline-flex;min-width:0}.wrap[_ngcontent-%COMP%]{position:relative;min-width:0}.trigger[_ngcontent-%COMP%]{height:30px;padding:0 11px 0 10px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:8px;color:var(--text-secondary);display:inline-flex;align-items:center;gap:8px;font-family:var(--font-ui);font-size:12.5px;cursor:pointer;max-width:360px;min-width:0;transition:background .1s,border-color .1s}.trigger[_ngcontent-%COMP%]:hover, .wrap.open[_ngcontent-%COMP%] .trigger[_ngcontent-%COMP%]{background:var(--bg-panel-2);border-color:var(--border-strong);color:var(--text-primary)}.trigger[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.trigger[_ngcontent-%COMP%]:hover app-icon[_ngcontent-%COMP%]{color:var(--text-secondary)}.path[_ngcontent-%COMP%]{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.placeholder[_ngcontent-%COMP%]{color:var(--text-muted);font-style:italic}.status-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.status-dot.ok[_ngcontent-%COMP%]{background:var(--success)}.status-dot.warn[_ngcontent-%COMP%]{background:var(--warn)}.status-dot.missing[_ngcontent-%COMP%]{background:var(--error)}.badge[_ngcontent-%COMP%]{font-size:10px;padding:1px 6px;border-radius:999px;background:var(--bg-active);color:var(--text-muted);font-variant-numeric:tabular-nums;flex-shrink:0}.popover[_ngcontent-%COMP%]{position:absolute;top:calc(100% + 6px);left:0;z-index:30;width:420px;max-width:calc(100vw - 40px);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--shadow-pop);display:flex;flex-direction:column;max-height:480px;animation:_ngcontent-%COMP%_pp-in .12s ease-out}@keyframes _ngcontent-%COMP%_pp-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.popover-head[_ngcontent-%COMP%]{padding:10px 12px 8px;border-bottom:1px solid var(--border-subtle)}.popover-head[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.popover-input[_ngcontent-%COMP%]{flex:1;min-width:0;background:transparent;border:none;outline:none;font-family:var(--font-ui);font-size:13px;color:var(--text-primary)}.popover-input[_ngcontent-%COMP%]::placeholder{color:var(--text-muted)}.popover-meta[_ngcontent-%COMP%]{padding:6px 12px 8px;font-size:10.5px;color:var(--text-secondary);border-bottom:1px solid var(--border-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.popover-meta[_ngcontent-%COMP%] .muted[_ngcontent-%COMP%]{color:var(--text-muted)}.popover-list[_ngcontent-%COMP%]{flex:1;min-height:0;padding:4px}.row-item[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:10px;padding:9px 10px;border:none;border-radius:7px;background:transparent;color:inherit;cursor:pointer;font-family:inherit;text-align:left;transition:background 80ms}.row-item[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.row-item.active[_ngcontent-%COMP%]{background:var(--accent-soft);color:var(--text-primary)}.row-item.active[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--accent)}.path-line[_ngcontent-%COMP%]{min-width:0}.path-line[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-size:12.5px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.meta[_ngcontent-%COMP%]{font-size:10.5px}.pill[_ngcontent-%COMP%]{font-size:10px;font-weight:600;padding:1px 7px;border-radius:999px;white-space:nowrap;flex-shrink:0}.pill.ok[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.pill.warn[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.pill.missing[_ngcontent-%COMP%]{color:var(--error);background:var(--error-soft)}.empty[_ngcontent-%COMP%]{text-align:center;color:var(--text-muted);font-size:12px;padding:18px 12px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}.grow[_ngcontent-%COMP%]{flex:1;min-width:0}.row[_ngcontent-%COMP%]{display:flex;align-items:center}.col[_ngcontent-%COMP%]{display:flex;flex-direction:column}.gap-2[_ngcontent-%COMP%]{gap:2px}.gap-6[_ngcontent-%COMP%]{gap:6px}.gap-8[_ngcontent-%COMP%]{gap:8px}.scroll-y[_ngcontent-%COMP%]{overflow-y:auto;overflow-x:hidden}"],changeDetection:0})};var U=class e{toggleSidebar=F();openPalette=F();theme=_(V);effective=this.theme.effective;onToggleTheme(){this.theme.toggle()}onMenuClick(){this.toggleSidebar.emit()}onPalette(){this.openPalette.emit()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-top-bar"]],outputs:{toggleSidebar:"toggleSidebar",openPalette:"openPalette"},decls:13,vars:5,consts:[[1,"topbar"],["title","Toggle sidebar","aria-label","Toggle sidebar",1,"ghost","icon-btn",3,"click"],["name","menu",3,"size"],["aria-label","Open command palette",1,"palette-trigger",3,"click"],["name","search",3,"size"],[1,"grow"],["aria-label","Toggle theme",1,"ghost","icon-btn",3,"click","title"],[3,"name","size"]],template:function(t,i){t&1&&(a(0,"div",0)(1,"button",1),C("click",function(){return i.onMenuClick()}),c(2,"app-icon",2),r(),c(3,"app-project-picker"),a(4,"button",3),C("click",function(){return i.onPalette()}),c(5,"app-icon",4),a(6,"span"),l(7,"Search or jump to\u2026"),r(),a(8,"kbd"),l(9,"\u2318K"),r()(),c(10,"span",5),a(11,"button",6),C("click",function(){return i.onToggleTheme()}),c(12,"app-icon",7),r()()),t&2&&(o(2),f("size",16),o(3),f("size",13),o(6),f("title","Theme: "+i.effective()),o(),f("name",i.effective()==="dark"?"sun":"moon")("size",16))},dependencies:[z,W],styles:["[_nghost-%COMP%]{display:contents}.topbar[_ngcontent-%COMP%]{height:44px;flex-shrink:0;display:flex;align-items:center;gap:10px;padding:0 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-canvas)}.ghost[_ngcontent-%COMP%]{background:transparent;border:1px solid transparent;color:var(--text-secondary);cursor:pointer}.ghost[_ngcontent-%COMP%]:hover{background:var(--bg-hover);color:var(--text-primary)}.icon-btn[_ngcontent-%COMP%]{padding:6px 9px;border-radius:5px;font-size:16px}.palette-trigger[_ngcontent-%COMP%]{flex:1;max-width:380px;height:30px;padding:0 11px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:8px;cursor:text;color:var(--text-muted);font-size:12.5px;text-align:left;display:flex;align-items:center;gap:8px}.palette-trigger[_ngcontent-%COMP%]:hover{border-color:var(--border-strong);color:var(--text-secondary)}.palette-trigger[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted)}.palette-trigger[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{flex:1}kbd[_ngcontent-%COMP%]{font-family:var(--font-mono);font-size:10px;color:var(--text-muted);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:4px;padding:2px 6px}.grow[_ngcontent-%COMP%]{flex:1}"],changeDetection:0})};var Ye=(e,n)=>n.id;function Je(e,n){if(e&1){let t=O();s(0,"button",6),R("click",function(){let d=w(t).$implicit,b=g(2);return M(b.go(d.id))}),s(1,"span",7),l(2),p(),s(3,"span",8),l(4),p()()}if(e&2){let t=n.$implicit;o(2),v(t.label),o(2),v(t.sub)}}function Xe(e,n){if(e&1){let t=O();s(0,"div",1),R("click",function(d){w(t);let b=g();return M(b.onBackdrop(d))}),s(1,"div",2)(2,"div",3)(3,"span"),l(4,"Jump to\u2026"),p(),s(5,"kbd"),l(6,"esc"),p()(),s(7,"div",4),S(8,Je,5,2,"button",5,Ye),p()()()}if(e&2){let t=g();o(8),E(t.items)}}var Ze=[{id:"dashboard",label:"Dashboard",sub:"/dashboard"},{id:"graph",label:"Graph",sub:"/graph"},{id:"specs",label:"Specs",sub:"/specs"},{id:"drift",label:"Drift queue",sub:"/drift"},{id:"workflows",label:"Workflows",sub:"/workflows"},{id:"runs",label:"Runs",sub:"/runs"},{id:"chat",label:"Chat",sub:"/chat"},{id:"sessions",label:"Sessions",sub:"/sessions"},{id:"heatmap",label:"Heatmap",sub:"/heatmap"},{id:"costs",label:"Costs",sub:"/costs"},{id:"compare",label:"Compare projects",sub:"/compare"},{id:"tips",label:"Tips",sub:"/tips"},{id:"settings",label:"Settings",sub:"/settings"}],Q=class e{open=k(!1);close=F();router=_($);items=Ze;go(n){this.router.navigate(["/"+n]),this.close.emit()}onBackdrop(n){n.target===n.currentTarget&&this.close.emit()}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-command-palette"]],inputs:{open:[1,"open"]},outputs:{close:"close"},decls:1,vars:1,consts:[[1,"backdrop"],[1,"backdrop",3,"click"],[1,"palette"],[1,"palette-header"],[1,"palette-list","scroll-y"],[1,"item"],[1,"item",3,"click"],[1,"label"],[1,"sub","mono"]],template:function(t,i){t&1&&m(0,Xe,10,0,"div",0),t&2&&u(i.open()?0:-1)},styles:["[_nghost-%COMP%]{display:contents}.backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:grid;place-items:start center;padding-top:12vh;z-index:100;animation:fadeIn .1s}.palette[_ngcontent-%COMP%]{width:560px;max-width:90vw;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:12px;box-shadow:var(--shadow-pop);overflow:hidden}.palette-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:12px 14px;border-bottom:1px solid var(--border-subtle);font-size:13px}.palette-list[_ngcontent-%COMP%]{max-height:380px;padding:6px}.item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;padding:8px 10px;background:transparent;border:none;border-radius:7px;cursor:pointer;color:var(--text-primary);font-family:inherit;font-size:13px;text-align:left}.item[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.label[_ngcontent-%COMP%]{flex:1}.sub[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}kbd[_ngcontent-%COMP%]{font-family:var(--font-mono);font-size:10px;color:var(--text-muted);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:4px;padding:2px 6px}"],changeDetection:0})};var Y=class e{_theme=_(V);_destroyRef=_(ee);_router=_($);sidebarCollapsed=T(typeof window<"u"&&window.innerWidth<1100);paletteOpen=T(!1);gChord={armed:!1,t:0};onGlobalKey(n){let t=n.metaKey||n.ctrlKey;if(t&&n.key.toLowerCase()==="k"){n.preventDefault(),this.paletteOpen.update(i=>!i);return}if(n.key==="Escape"){this.paletteOpen.set(!1);return}if(!t&&n.key.toLowerCase()==="g"&&!this.gChord.armed){let i=n.target;if(i&&/input|textarea/i.test(i.tagName))return;this.gChord.armed=!0,this.gChord.t=Date.now(),setTimeout(()=>{this.gChord.armed=!1},600);return}if(this.gChord.armed&&!t){let i=n.key.toLowerCase();i==="d"?this._router.navigate(["/dashboard"]):i==="g"?this._router.navigate(["/graph"]):i==="s"&&this._router.navigate(["/specs"]),this.gChord.armed=!1}}toggleSidebar(){this.sidebarCollapsed.update(n=>!n)}onOpenPalette(){this.paletteOpen.set(!0)}onClosePalette(){this.paletteOpen.set(!1)}static \u0275fac=function(t){return new(t||e)};static \u0275cmp=h({type:e,selectors:[["app-root"]],hostBindings:function(t,i){t&1&&C("keydown",function(b){return i.onGlobalKey(b)},ie)},decls:8,vars:2,consts:[[1,"shell"],[3,"collapsed"],[1,"main"],[3,"toggleSidebar","openPalette"],[1,"page-frame"],[3,"close","open"]],template:function(t,i){t&1&&(a(0,"div",0),c(1,"app-sidebar",1),a(2,"div",2),c(3,"app-status-strip"),a(4,"app-top-bar",3),C("toggleSidebar",function(){return i.toggleSidebar()})("openPalette",function(){return i.onOpenPalette()}),r(),a(5,"div",4),c(6,"router-outlet"),r()(),a(7,"app-command-palette",5),C("close",function(){return i.onClosePalette()}),r()()),t&2&&(o(),f("collapsed",i.sidebarCollapsed()),o(6),f("open",i.paletteOpen()))},dependencies:[se,q,K,U,Q],styles:["[_nghost-%COMP%]{display:block;height:100%}.shell[_ngcontent-%COMP%]{display:flex;height:100vh;background:var(--bg-canvas);color:var(--text-primary);font-family:var(--font-ui);font-size:var(--fs-base)}.main[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.page-frame[_ngcontent-%COMP%]{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--bg-canvas)}"],changeDetection:0})};le(Y,fe).catch(e=>console.error(e));typeof navigator<"u"&&"serviceWorker"in navigator&&window.addEventListener("load",()=>{navigator.serviceWorker.register("sw.js").catch(e=>{console.warn("[specship] offline service worker registration failed",e)})});