copilot-usage-studio 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -1
- package/README.md +42 -13
- package/data/github-copilot-pricing.json +34 -6
- package/dist/copilot-usage-studio/browser/chunk-2SAR2Q6M.js +1 -0
- package/dist/copilot-usage-studio/browser/chunk-5JYQJM5G.js +1 -0
- package/dist/copilot-usage-studio/browser/chunk-7FKLWMFH.js +1 -0
- package/dist/copilot-usage-studio/browser/chunk-EWN3YOHT.js +1 -0
- package/dist/copilot-usage-studio/browser/{chunk-NXH37FKU.js → chunk-KS5W2HMH.js} +1 -1
- package/dist/copilot-usage-studio/browser/{chunk-TVSYR63W.js → chunk-OS2XPCVW.js} +2 -2
- package/dist/copilot-usage-studio/browser/{chunk-QQOFM3HF.js → chunk-U4H425LY.js} +1 -1
- package/dist/copilot-usage-studio/browser/chunk-VEKXIM47.js +1 -0
- package/dist/copilot-usage-studio/browser/chunk-WOIYAEKB.js +4 -0
- package/dist/copilot-usage-studio/browser/{chunk-J47KKACI.js → chunk-XHID4XVE.js} +1 -1
- package/dist/copilot-usage-studio/browser/index.html +2 -2
- package/dist/copilot-usage-studio/browser/main-OZIMQRXC.js +1 -0
- package/dist/copilot-usage-studio/browser/styles-7RDDQXQV.css +1 -0
- package/docs/local-deployment.md +67 -11
- package/docs/pricing.md +3 -3
- package/docs/scanner-api.md +28 -0
- package/lib/cli.mjs +15 -1
- package/lib/local-runtime.mjs +455 -19
- package/lib/scanner-worker.mjs +25 -0
- package/package.json +17 -1
- package/scripts/pricing-utils.mjs +5 -0
- package/scripts/scan-vscode-sessions.mjs +383 -1475
- package/scripts/scanner-customization-evidence.mjs +576 -0
- package/scripts/scanner-customization-inventory.mjs +1021 -0
- package/scripts/scanner-memory.mjs +229 -0
- package/scripts/scanner-session-parser.mjs +1237 -0
- package/scripts/scanner-traversal.mjs +203 -0
- package/scripts/scanner-workspace.mjs +209 -0
- package/dist/copilot-usage-studio/browser/chunk-CUKTUQ6W.js +0 -1
- package/dist/copilot-usage-studio/browser/chunk-EYAHOEVS.js +0 -1
- package/dist/copilot-usage-studio/browser/chunk-FXNLFSUB.js +0 -1
- package/dist/copilot-usage-studio/browser/chunk-HJNYITFH.js +0 -1
- package/dist/copilot-usage-studio/browser/chunk-KDAJN6DF.js +0 -4
- package/dist/copilot-usage-studio/browser/main-TL27ZSEQ.js +0 -1
- package/dist/copilot-usage-studio/browser/styles-GZOQ5QIH.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Y,b as Z,c as ee,d as te,e as ne,g as V}from"./chunk-NXH37FKU.js";import{f as L,q as A,r as E,s as U}from"./chunk-FXNLFSUB.js";import{$a as y,Ca as u,Da as x,Ea as R,Fa as M,Ga as P,Ha as g,Ia as i,Ja as n,Ka as w,Na as O,O as b,P as f,Pa as v,Ra as p,Sa as D,U as z,Ua as a,Va as _,Wa as m,Xa as N,Ya as T,Z as S,Za as c,_a as C,cb as k,ka as l,nb as W,rb as H,sa as G,tb as j,ub as q,vb as J,wb as K,xb as Q,yb as X}from"./chunk-KDAJN6DF.js";var ie=(o,t)=>t.value,me=(o,t)=>t.model+t.pricingModel,ge=(o,t)=>t.size,_e=(o,t)=>t.key,ue=(o,t)=>t.label,xe=(o,t)=>t.session.id;function Ce(o,t){if(o&1&&a(0),o&2){let e=p();m(" ",e.analyticsExcludedCount," excluded by these filters. ")}}function ye(o,t){if(o&1){let e=O();i(0,"button",11),v("click",function(){b(e);let r=p(2);return f(r.resetAnalyticsFilters())}),a(1,"Reset filters"),n()}}function he(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e.value),l(),_(e.label)}}function be(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e),l(),_(e==="all"?"All workspaces":e)}}function fe(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e),l(),_(e==="all"?"All models":e)}}function ve(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e.value),l(),_(e.label)}}function Me(o,t){if(o&1){let e=O();i(0,"button",11),v("click",function(){b(e);let r=p(3);return f(r.resetAnalyticsFilters())}),a(1,"Reset filters"),n()}}function Pe(o,t){if(o&1&&(i(0,"section",10)(1,"h3"),a(2),n(),i(3,"p"),a(4),n(),u(5,Me,2,0,"button",5),n()),o&2){let e=p();l(2),_(e.emptyTitle),l(2),_(e.emptyDetail),l(),x(e.analyticsFiltersActive?5:-1)}}function Oe(o,t){o&1&&(i(0,"em",27),a(1,"fallback pricing"),n())}function Se(o,t){if(o&1&&(a(0),c(1,"number")),o&2){let e=p().$implicit;m(" / ",C(1,1,e.cachedInput)," cached in ")}}function we(o,t){if(o&1&&(a(0),c(1,"number")),o&2){let e=p().$implicit;m(" / ",C(1,1,e.cacheWrite)," cache write ")}}function ke(o,t){if(o&1&&(i(0,"div",17)(1,"strong"),a(2),i(3,"em"),a(4),n(),u(5,Oe,2,0,"em",27),n(),i(6,"span"),a(7),c(8,"number"),n(),i(9,"span"),a(10),c(11,"number"),i(12,"em"),a(13),c(14,"number"),u(15,Se,2,3),u(16,we,2,3),a(17),c(18,"number"),n()(),i(19,"span"),a(20),c(21,"number"),i(22,"em"),a(23),c(24,"number"),n()(),i(25,"span"),a(26),c(27,"number"),n(),i(28,"span",28),a(29),c(30,"number"),w(31,"i"),n()()),o&2){let e=t.$implicit,s=p(3);l(2),m(" ",e.model," "),l(2),_(e.pricingModel),l(),x(e.usesFallbackPrice?5:-1),l(2),_(C(8,15,e.sessionCount)),l(3),m(" ",C(11,17,e.tokens)," "),l(3),m(" ",C(14,19,e.input)," normal in "),l(2),x(e.cachedInput?15:-1),l(),x(e.cacheWrite?16:-1),l(),m(" / ",C(18,21,e.output)," out "),l(3),m(" $",y(21,23,e.cost,"1.2-4")," "),l(3),m("",y(24,26,s.aiCredits(e.cost),"1.0-1")," credits"),l(3),m("$",y(27,29,e.costPer1k,"1.4-4")),l(3),m(" ",y(30,32,e.share,"1.0-0"),"% "),l(2),D("width",e.share,"%")}}function Ee(o,t){o&1&&(i(0,"p",18),a(1,"No model rows for the current Insights cohort."),n())}function Te(o,t){if(o&1&&(i(0,"small"),a(1),n(),i(2,"span",30),a(3,"Open run"),n()),o&2){let e=p().$implicit;l(),m("Top run: ",e.topSession.title)}}function Ae(o,t){if(o&1){let e=O();i(0,"button",29),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.topSession))}),i(1,"span"),a(2),n(),i(3,"strong"),a(4),c(5,"number"),n(),i(6,"em"),a(7),c(8,"number"),c(9,"number"),c(10,"number"),n(),u(11,Te,4,1),n()}if(o&2){let e=t.$implicit;g("disabled",!e.topSession),l(2),_(e.size),l(2),m("",C(5,7,e.count)," runs"),l(3),T(" ",y(8,9,e.credits,"1.0-1")," credits \xB7 $",y(9,12,e.cost,"1.2-4")," \xB7 ",y(10,15,e.share,"1.0-0"),"% of cohort "),l(4),x(e.topSession?11:-1)}}function Ie(o,t){if(o&1&&(i(0,"small"),a(1),n(),i(2,"span",30),a(3,"Open run"),n()),o&2){let e=p().$implicit;l(),m("Top run: ",e.topSession.title)}}function Fe(o,t){if(o&1){let e=O();i(0,"button",29),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.topSession))}),i(1,"span"),a(2),n(),i(3,"strong"),a(4),c(5,"number"),n(),i(6,"em"),a(7),c(8,"number"),c(9,"number"),c(10,"number"),n(),u(11,Ie,4,1),n()}if(o&2){let e=t.$implicit;g("disabled",!e.topSession),l(2),_(e.label),l(2),m("",C(5,7,e.count)," runs"),l(3),T(" ",y(8,9,e.credits,"1.0-1")," credits \xB7 $",y(9,12,e.cost,"1.2-4")," \xB7 ",C(10,15,e.tokens)," tokens "),l(4),x(e.topSession?11:-1)}}function Be(o,t){o&1&&(i(0,"p",18),a(1,"No trend rows for the current Insights cohort."),n())}function $e(o,t){if(o&1&&(i(0,"em"),a(1),n(),i(2,"span",30),a(3,"Open run"),n()),o&2){let e=p().$implicit;l(),_(e.session.title)}}function Re(o,t){if(o&1){let e=O();i(0,"button",29),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.session))}),i(1,"span",31),a(2),w(3,"app-help-popover",32),n(),i(4,"strong"),a(5),n(),u(6,$e,4,1),n()}if(o&2){let e=t.$implicit;g("disabled",!e.session),l(2),m(" ",e.label," "),l(),g("text",e.help)("label","Explain "+e.label)("interactive",!1),l(2),_(e.value),l(),x(e.session?6:-1)}}function Ve(o,t){if(o&1){let e=O();i(0,"button",33),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.session))}),i(1,"span"),a(2),c(3,"number"),c(4,"number"),c(5,"number"),n(),i(6,"strong"),a(7),n(),i(8,"em"),a(9),n(),i(10,"span",30),a(11,"Open run"),n()()}if(o&2){let e=t.$implicit,s=p(3);l(2),T(" ",C(3,5,e.tokens)," tokens \xB7 $",y(4,7,s.usageUsd(e.session),"1.2-4")," \xB7 ",y(5,10,s.usageCredits(e.session),"1.0-1")," credits "),l(5),_(e.session.title),l(2),_(e.reason)}}function ze(o,t){o&1&&(i(0,"p",18),a(1,"No outliers in the current Insights cohort."),n())}function Ge(o,t){if(o&1&&(i(0,"section",12)(1,"div",13)(2,"div",14)(3,"div")(4,"h3"),a(5,"Model breakdown"),n(),i(6,"p"),a(7,"Model mix and priced token shape for this cohort."),n()(),i(8,"span"),a(9),c(10,"number"),n()(),i(11,"div",15)(12,"div",16)(13,"span"),a(14,"Model"),n(),i(15,"span"),a(16,"Sessions"),n(),i(17,"span"),a(18,"Tokens"),n(),i(19,"span"),a(20,"Cost"),n(),i(21,"span"),a(22,"Cost / 1k"),n(),i(23,"span"),a(24,"Share"),n()(),M(25,ke,32,35,"div",17,me,!1,Ee,2,0,"p",18),n()(),i(28,"aside",19)(29,"div",20)(30,"div",21)(31,"h3"),a(32,"Run size mix"),n(),i(33,"p"),a(34,"How runs are distributed by size."),n()(),i(35,"div",22),M(36,Ae,12,18,"button",23,ge),n()(),i(38,"div",20)(39,"div",21)(40,"h3"),a(41,"Usage trend"),n(),i(42,"p"),a(43),n()(),i(44,"div",22),M(45,Fe,12,17,"button",23,_e,!1,Be,2,0,"p",18),n()()()(),i(48,"section",24)(49,"div",20)(50,"div",21)(51,"h3"),a(52,"Runs to inspect"),n(),i(53,"p"),a(54,"Open the largest runs in this cohort."),n()(),i(55,"div",25),M(56,Re,7,7,"button",23,ue),n()(),i(58,"div",20)(59,"div",21)(60,"h3"),a(61,"Outlier signals"),n(),i(62,"p"),a(63,"Runs that stand apart from this cohort."),n()(),i(64,"div",25),M(65,Ve,12,13,"button",26,xe,!1,ze,2,0,"p",18),n()()()),o&2){let e=p();l(9),m("",C(10,5,e.modelRows.length)," rows"),l(16),P(e.modelRows),l(11),P(e.distribution),l(7),m("",e.groupingLabel,"."),l(2),P(e.trendRows),l(11),P(e.highlights),l(9),P(e.outliers)}}function De(o,t){if(o&1){let e=O();i(0,"section",0)(1,"div",1)(2,"div")(3,"p",2),a(4,"Cohort insights"),n(),i(5,"h2"),a(6,"Run patterns"),n(),i(7,"p",3),a(8),u(9,Ce,1,1),w(10,"app-help-popover",4),n()(),u(11,ye,2,0,"button",5),n(),i(12,"section",6)(13,"label")(14,"span"),a(15," Time range "),n(),i(16,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsTimeRange(r))}),M(17,he,2,2,"option",8,ie),n()(),i(19,"label")(20,"span"),a(21,"Workspace"),n(),i(22,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsWorkspaceFilter(r))}),M(23,be,2,2,"option",8,R),n()(),i(25,"label")(26,"span"),a(27,"Model"),n(),i(28,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsModelFilter(r))}),M(29,fe,2,2,"option",8,R),n()(),i(31,"label")(32,"span"),a(33," Group trend by "),w(34,"app-help-popover",9),n(),i(35,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsGrouping(r))}),M(36,ve,2,2,"option",8,ie),n()()(),u(38,Pe,6,3,"section",10)(39,Ge,68,7),n()}if(o&2){let e=t,s=p();l(8),N(" ",e.count," of ",e.importedCount," imported sessions included. "),l(),x(e.analyticsExcludedCount>0?9:-1),l(),g("text",s.help.analyticsScope),l(),x(e.analyticsFiltersActive?11:-1),l(5),g("ngModel",s.analyticsTimeRange()),l(),P(s.analyticsTimeOptions),l(5),g("ngModel",s.analyticsWorkspaceFilter()),l(),P(s.analyticsWorkspaceOptions()),l(5),g("ngModel",s.analyticsModelFilter()),l(),P(s.analyticsModelOptions()),l(5),g("text",s.help.trendGrouping),l(),g("ngModel",s.analyticsGrouping()),l(),P(s.analyticsGroupingOptions),l(2),x(e.count===0?38:39)}}var oe=class o{sessionsInput=S([]);openSession=new z;set sessions(t){this.sessionsInput.set(t??[])}analyticsTimeRange=S("all");analyticsWorkspaceFilter=S("all");analyticsModelFilter=S("all");analyticsGrouping=S("day");help={analyticsScope:"Insights use imported sessions and the time, workspace, and model filters on this page.",trendGrouping:"Time range chooses which sessions are included. Grouping only changes how those sessions are bucketed in the trend panel."};sizeOptions=["Small","Medium","Large","Very large"];analyticsTimeOptions=[{value:"all",label:"All time"},{value:"current-month",label:"Current month"},{value:"previous-month",label:"Previous month"},{value:"7d",label:"Last 7 days"},{value:"30d",label:"Last 30 days"},{value:"90d",label:"Last 90 days"}];analyticsGroupingOptions=[{value:"day",label:"By day"},{value:"week",label:"By week"},{value:"month",label:"By month"}];analyticsWorkspaceOptions=k(()=>{let t=new Set(this.sessionsInput().map(s=>s.workspace).filter(Boolean)),e=this.analyticsWorkspaceFilter();return e!=="all"&&t.add(e),["all",...[...t].sort()]});analyticsModelOptions=k(()=>{let t=new Set;for(let s of this.sessionsInput())for(let r of s.modelBreakdown)t.add(r.pricingModel||r.model);let e=this.analyticsModelFilter();return e!=="all"&&t.add(e),["all",...[...t].sort()]});analyticsSessions=k(()=>Y(this.sessionsInput(),this.analyticsTimeRange(),this.analyticsWorkspaceFilter(),this.analyticsModelFilter()));analytics=k(()=>{let t=this.analyticsSessions(),e=t.length,s=this.sessionsInput().length,r=t.reduce((h,$)=>h+A($),0),d=t.reduce((h,$)=>h+E($),0),ae=e?r/e:0,le=e?d/e:0,I=V(t,h=>A(h)),F=V(t,h=>E(h)),se=Z(t,d),re=ee(t,this.analyticsGrouping()),ce=te(t,d),pe=ne(t,le,ae),de=this.analyticsTimeRange()!=="all"||this.analyticsWorkspaceFilter()!=="all"||this.analyticsModelFilter()!=="all"||this.analyticsGrouping()!=="day",B=Math.max(s-e,0);return{count:e,importedCount:s,analyticsFiltersActive:de,analyticsExcludedCount:B,emptyTitle:s===0?"No imported sessions":"No sessions in this Insights cohort",emptyDetail:s===0?"Import VS Code sessions to explore model mix, run sizes, trends, and outliers.":`${B.toLocaleString()} imported session${B===1?"":"s"} excluded by the Insights controls. Reset the filters to return to all imported sessions.`,timeRangeLabel:this.analyticsTimeOptions.find(h=>h.value===this.analyticsTimeRange())?.label??"All time",workspaceLabel:this.analyticsWorkspaceFilter()==="all"?"All workspaces":this.analyticsWorkspaceFilter(),modelLabel:this.analyticsModelFilter()==="all"?"All models":this.analyticsModelFilter(),groupingLabel:this.analyticsGroupingOptions.find(h=>h.value===this.analyticsGrouping())?.label??"By day",highlights:[{label:"Highest-token run",session:I,value:I?`${A(I).toLocaleString()} tokens`:"n/a",help:"The included session with the largest imported token total."},{label:"Most expensive run",session:F,value:F?`$${E(F).toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:4})}`:"n/a",help:"The included session with the highest GitHub source usage, falling back to token estimate when source usage is absent."}],modelRows:se,trendRows:re,distribution:ce,outliers:pe}});setAnalyticsTimeRange(t){this.analyticsTimeRange.set(t)}setAnalyticsWorkspaceFilter(t){this.analyticsWorkspaceFilter.set(t)}setAnalyticsModelFilter(t){this.analyticsModelFilter.set(t)}setAnalyticsGrouping(t){this.analyticsGrouping.set(t)}resetAnalyticsFilters(){this.analyticsTimeRange.set("all"),this.analyticsWorkspaceFilter.set("all"),this.analyticsModelFilter.set("all"),this.analyticsGrouping.set("day")}emitOpenSession(t){t&&this.openSession.emit(t)}aiCredits(t){return t/L}usageUsd(t){return E(t)}usageCredits(t){return U(t)}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=G({type:o,selectors:[["app-analytics-page"]],inputs:{sessions:"sessions"},outputs:{openSession:"openSession"},decls:1,vars:1,consts:[[1,"pricing-page","analytics-page"],[1,"pricing-header"],[1,"eyebrow"],[1,"analytics-cohort"],["label","Explain analytics scope",3,"text"],["type","button",1,"ghost-button"],["aria-label","Analytics cohort controls",1,"analytics-controls"],[3,"ngModelChange","ngModel"],[3,"value"],["label","Explain trend grouping",3,"text"],[1,"analytics-empty"],["type","button",1,"ghost-button",3,"click"],[1,"analytics-primary"],[1,"analytics-panel","model-panel"],[1,"panel-heading"],["role","table","aria-label","Model breakdown",1,"cost-table","compact-table"],[1,"cost-row","analytics-model-row","cost-row-heading"],[1,"cost-row","analytics-model-row"],[1,"empty"],[1,"analytics-side"],[1,"analytics-panel"],[1,"panel-heading","compact-heading"],[1,"stat-list","compact"],["type","button",3,"disabled"],[1,"analytics-split"],[1,"highlight-list"],["type","button"],[1,"warning-text"],[1,"share-cell"],["type","button",3,"click","disabled"],[1,"open-cue"],[1,"row-kicker"],[3,"text","label","interactive"],["type","button",3,"click"]],template:function(e,s){if(e&1&&u(0,De,40,11,"section",0),e&2){let r;x((r=s.analytics())?0:-1,r)}},dependencies:[X,K,Q,J,j,q,H,W],styles:[".analytics-page[_ngcontent-%COMP%]{display:grid;gap:10px}.pricing-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.pricing-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:3px 0 0;color:var(--text-strong);font-size:21px;font-weight:760;letter-spacing:0}.pricing-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px;max-width:820px;margin:6px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.analytics-cohort[_ngcontent-%COMP%]{opacity:.86}.ghost-button[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:9px;padding:7px 10px;color:var(--text);background:var(--surface-soft);font-size:13px;font-weight:720;cursor:pointer}.ghost-button[_ngcontent-%COMP%]:hover{border-color:var(--line-strong)}.analytics-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,minmax(140px,1fr));gap:7px;border:1px solid var(--line);border-radius:12px;padding:8px;background:linear-gradient(135deg,#0c9f830e,#6f5cff09),var(--surface);box-shadow:var(--shadow-soft, 0 12px 30px rgba(15, 23, 42, .08))}.analytics-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:grid;gap:5px;min-width:0;color:var(--muted);font-size:10px;font-weight:720}.analytics-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px}.analytics-controls[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .analytics-controls[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%;min-height:30px;border:1px solid var(--line);border-radius:7px;padding:6px 9px;background:var(--surface-soft);color:var(--text);font:inherit;font-size:12px;font-weight:720}.analytics-empty[_ngcontent-%COMP%], .analytics-panel[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:12px;background:var(--surface);box-shadow:var(--shadow-soft, 0 12px 30px rgba(15, 23, 42, .08))}.analytics-empty[_ngcontent-%COMP%]{display:grid;gap:8px;justify-items:start;padding:18px}.analytics-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{max-width:720px;margin:0;color:var(--muted);font-size:12px}.analytics-primary[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr;gap:10px;align-items:start}.analytics-side[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.analytics-split[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:start}.analytics-panel[_ngcontent-%COMP%]{display:grid;gap:8px;min-width:0;padding:11px}.analytics-panel[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .analytics-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:15px;font-weight:760}.panel-heading[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.compact-heading[_ngcontent-%COMP%]{align-items:baseline}.panel-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:3px 0 0;color:var(--muted);font-size:12px}.compact-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;text-align:right}.panel-note[_ngcontent-%COMP%]{margin:-3px 0 0;color:var(--muted);font-size:12px}.panel-heading[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{flex:0 0 auto;border:1px solid var(--line);border-radius:999px;padding:3px 7px;color:var(--muted);background:var(--surface-soft);font-size:11px;font-weight:720}.highlight-list[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%]{display:grid;gap:6px}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:grid;gap:5px;width:100%;min-width:0;border:1px solid var(--line);border-radius:9px;padding:8px 9px;background:var(--surface-soft);color:var(--text);text-align:left}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{cursor:pointer}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover, .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{border-color:var(--line-strong)}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled, .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{cursor:default;opacity:.65}.highlight-list[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .highlight-list[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .empty[_ngcontent-%COMP%]{color:var(--muted);font-size:12px;font-style:normal;line-height:1.35}.stat-list[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-kicker[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px}.highlight-list[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:14px;font-weight:760;line-height:1.25}.open-cue[_ngcontent-%COMP%]{justify-self:start;border:1px solid var(--line);border-radius:999px;padding:3px 7px;background:#0c9f8314;color:var(--accent-strong, var(--accent))!important;font-size:10px!important;font-weight:760;text-transform:uppercase;letter-spacing:.04em}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover .open-cue[_ngcontent-%COMP%], .highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:focus-visible .open-cue[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 45%,var(--line));background:#0c9f8324}.stat-list.compact[_ngcontent-%COMP%] div[_ngcontent-%COMP%], .stat-list.compact[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{grid-template-columns:minmax(110px,.35fr) minmax(0,1fr) auto;gap:4px 10px;align-items:center;padding:8px 9px}.stat-list.compact[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .stat-list.compact[_ngcontent-%COMP%] .open-cue[_ngcontent-%COMP%]{grid-column:2 / -1}.cost-table[_ngcontent-%COMP%]{overflow-x:auto;border:1px solid var(--line);border-radius:10px;background:var(--surface)}.cost-row[_ngcontent-%COMP%]{display:grid;align-items:start;gap:8px;min-width:650px;border-bottom:1px solid var(--line);padding:8px 10px}.cost-row[_ngcontent-%COMP%]:last-child{border-bottom:0}.cost-row-heading[_ngcontent-%COMP%]{color:var(--muted);background:var(--surface-soft);font-size:11px;font-weight:760;letter-spacing:.04em;text-transform:uppercase}.analytics-model-row[_ngcontent-%COMP%]{grid-template-columns:minmax(170px,1.25fr) minmax(62px,.36fr) minmax(180px,1fr) minmax(86px,.48fr) minmax(84px,.46fr) minmax(80px,.45fr)}.analytics-model-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:grid;gap:3px}.analytics-model-row[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{display:block;margin-top:2px}.warning-text[_ngcontent-%COMP%]{color:var(--warning-text, #ffcf91)!important}.share-cell[_ngcontent-%COMP%]{display:grid;gap:5px}.share-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{display:block;width:0;max-width:100%;height:4px;border-radius:999px;background:linear-gradient(90deg,var(--accent),var(--accent-2))}@media(max-width:1200px){.analytics-side[_ngcontent-%COMP%], .analytics-split[_ngcontent-%COMP%]{grid-template-columns:1fr}}@media(max-width:960px){.analytics-primary[_ngcontent-%COMP%]{grid-template-columns:1fr}}@media(max-width:900px){.pricing-header[_ngcontent-%COMP%], .analytics-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr}}@media(max-width:600px){.analytics-panel[_ngcontent-%COMP%]{padding:11px}.cost-row[_ngcontent-%COMP%]{min-width:620px}}"]})};export{oe as AnalyticsPageComponent};
|
|
1
|
+
import{a as Y,b as Z,c as ee,d as te,e as ne,g as V}from"./chunk-KS5W2HMH.js";import{f as L,q as A,r as E,s as U}from"./chunk-VEKXIM47.js";import{$a as C,Ca as u,Da as x,Ea as R,Fa as M,Ga as P,Ha as g,Ia as i,Ja as n,Ka as w,O as b,Oa as O,P as f,Qa as v,Sa as p,Ta as D,U as z,Va as a,Wa as _,Xa as m,Ya as N,Z as S,Za as T,_a as c,ab as y,db as k,ka as l,ob as W,sa as G,sb as H,ub as j,vb as q,wb as J,xb as K,yb as Q,zb as X}from"./chunk-WOIYAEKB.js";var ie=(o,t)=>t.value,me=(o,t)=>t.model+t.pricingModel,ge=(o,t)=>t.size,_e=(o,t)=>t.key,ue=(o,t)=>t.label,xe=(o,t)=>t.session.id;function Ce(o,t){if(o&1&&a(0),o&2){let e=p();m(" ",e.analyticsExcludedCount," excluded by these filters. ")}}function ye(o,t){if(o&1){let e=O();i(0,"button",11),v("click",function(){b(e);let r=p(2);return f(r.resetAnalyticsFilters())}),a(1,"Reset filters"),n()}}function he(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e.value),l(),_(e.label)}}function be(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e),l(),_(e==="all"?"All workspaces":e)}}function fe(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e),l(),_(e==="all"?"All models":e)}}function ve(o,t){if(o&1&&(i(0,"option",8),a(1),n()),o&2){let e=t.$implicit;g("value",e.value),l(),_(e.label)}}function Me(o,t){if(o&1){let e=O();i(0,"button",11),v("click",function(){b(e);let r=p(3);return f(r.resetAnalyticsFilters())}),a(1,"Reset filters"),n()}}function Pe(o,t){if(o&1&&(i(0,"section",10)(1,"h3"),a(2),n(),i(3,"p"),a(4),n(),u(5,Me,2,0,"button",5),n()),o&2){let e=p();l(2),_(e.emptyTitle),l(2),_(e.emptyDetail),l(),x(e.analyticsFiltersActive?5:-1)}}function Oe(o,t){o&1&&(i(0,"em",27),a(1,"fallback pricing"),n())}function Se(o,t){if(o&1&&(a(0),c(1,"number")),o&2){let e=p().$implicit;m(" / ",C(1,1,e.cachedInput)," cached in ")}}function we(o,t){if(o&1&&(a(0),c(1,"number")),o&2){let e=p().$implicit;m(" / ",C(1,1,e.cacheWrite)," cache write ")}}function ke(o,t){if(o&1&&(i(0,"div",17)(1,"strong"),a(2),i(3,"em"),a(4),n(),u(5,Oe,2,0,"em",27),n(),i(6,"span"),a(7),c(8,"number"),n(),i(9,"span"),a(10),c(11,"number"),i(12,"em"),a(13),c(14,"number"),u(15,Se,2,3),u(16,we,2,3),a(17),c(18,"number"),n()(),i(19,"span"),a(20),c(21,"number"),i(22,"em"),a(23),c(24,"number"),n()(),i(25,"span"),a(26),c(27,"number"),n(),i(28,"span",28),a(29),c(30,"number"),w(31,"i"),n()()),o&2){let e=t.$implicit,s=p(3);l(2),m(" ",e.model," "),l(2),_(e.pricingModel),l(),x(e.usesFallbackPrice?5:-1),l(2),_(C(8,15,e.sessionCount)),l(3),m(" ",C(11,17,e.tokens)," "),l(3),m(" ",C(14,19,e.input)," normal in "),l(2),x(e.cachedInput?15:-1),l(),x(e.cacheWrite?16:-1),l(),m(" / ",C(18,21,e.output)," out "),l(3),m(" $",y(21,23,e.cost,"1.2-4")," "),l(3),m("",y(24,26,s.aiCredits(e.cost),"1.0-1")," credits"),l(3),m("$",y(27,29,e.costPer1k,"1.4-4")),l(3),m(" ",y(30,32,e.share,"1.0-0"),"% "),l(2),D("width",e.share,"%")}}function Ee(o,t){o&1&&(i(0,"p",18),a(1,"No model rows for the current Insights cohort."),n())}function Te(o,t){if(o&1&&(i(0,"small"),a(1),n(),i(2,"span",30),a(3,"Open run"),n()),o&2){let e=p().$implicit;l(),m("Top run: ",e.topSession.title)}}function Ae(o,t){if(o&1){let e=O();i(0,"button",29),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.topSession))}),i(1,"span"),a(2),n(),i(3,"strong"),a(4),c(5,"number"),n(),i(6,"em"),a(7),c(8,"number"),c(9,"number"),c(10,"number"),n(),u(11,Te,4,1),n()}if(o&2){let e=t.$implicit;g("disabled",!e.topSession),l(2),_(e.size),l(2),m("",C(5,7,e.count)," runs"),l(3),T(" ",y(8,9,e.credits,"1.0-1")," credits \xB7 $",y(9,12,e.cost,"1.2-4")," \xB7 ",y(10,15,e.share,"1.0-0"),"% of cohort "),l(4),x(e.topSession?11:-1)}}function Ie(o,t){if(o&1&&(i(0,"small"),a(1),n(),i(2,"span",30),a(3,"Open run"),n()),o&2){let e=p().$implicit;l(),m("Top run: ",e.topSession.title)}}function Fe(o,t){if(o&1){let e=O();i(0,"button",29),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.topSession))}),i(1,"span"),a(2),n(),i(3,"strong"),a(4),c(5,"number"),n(),i(6,"em"),a(7),c(8,"number"),c(9,"number"),c(10,"number"),n(),u(11,Ie,4,1),n()}if(o&2){let e=t.$implicit;g("disabled",!e.topSession),l(2),_(e.label),l(2),m("",C(5,7,e.count)," runs"),l(3),T(" ",y(8,9,e.credits,"1.0-1")," credits \xB7 $",y(9,12,e.cost,"1.2-4")," \xB7 ",C(10,15,e.tokens)," tokens "),l(4),x(e.topSession?11:-1)}}function Be(o,t){o&1&&(i(0,"p",18),a(1,"No trend rows for the current Insights cohort."),n())}function $e(o,t){if(o&1&&(i(0,"em"),a(1),n(),i(2,"span",30),a(3,"Open run"),n()),o&2){let e=p().$implicit;l(),_(e.session.title)}}function Re(o,t){if(o&1){let e=O();i(0,"button",29),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.session))}),i(1,"span",31),a(2),w(3,"app-help-popover",32),n(),i(4,"strong"),a(5),n(),u(6,$e,4,1),n()}if(o&2){let e=t.$implicit;g("disabled",!e.session),l(2),m(" ",e.label," "),l(),g("text",e.help)("label","Explain "+e.label)("interactive",!1),l(2),_(e.value),l(),x(e.session?6:-1)}}function Ve(o,t){if(o&1){let e=O();i(0,"button",33),v("click",function(){let r=b(e).$implicit,d=p(3);return f(d.emitOpenSession(r.session))}),i(1,"span"),a(2),c(3,"number"),c(4,"number"),c(5,"number"),n(),i(6,"strong"),a(7),n(),i(8,"em"),a(9),n(),i(10,"span",30),a(11,"Open run"),n()()}if(o&2){let e=t.$implicit,s=p(3);l(2),T(" ",C(3,5,e.tokens)," tokens \xB7 $",y(4,7,s.usageUsd(e.session),"1.2-4")," \xB7 ",y(5,10,s.usageCredits(e.session),"1.0-1")," credits "),l(5),_(e.session.title),l(2),_(e.reason)}}function ze(o,t){o&1&&(i(0,"p",18),a(1,"No outliers in the current Insights cohort."),n())}function Ge(o,t){if(o&1&&(i(0,"section",12)(1,"div",13)(2,"div",14)(3,"div")(4,"h3"),a(5,"Model breakdown"),n(),i(6,"p"),a(7,"Model mix and priced token shape for this cohort."),n()(),i(8,"span"),a(9),c(10,"number"),n()(),i(11,"div",15)(12,"div",16)(13,"span"),a(14,"Model"),n(),i(15,"span"),a(16,"Sessions"),n(),i(17,"span"),a(18,"Tokens"),n(),i(19,"span"),a(20,"Cost"),n(),i(21,"span"),a(22,"Cost / 1k"),n(),i(23,"span"),a(24,"Share"),n()(),M(25,ke,32,35,"div",17,me,!1,Ee,2,0,"p",18),n()(),i(28,"aside",19)(29,"div",20)(30,"div",21)(31,"h3"),a(32,"Run size mix"),n(),i(33,"p"),a(34,"How runs are distributed by size."),n()(),i(35,"div",22),M(36,Ae,12,18,"button",23,ge),n()(),i(38,"div",20)(39,"div",21)(40,"h3"),a(41,"Usage trend"),n(),i(42,"p"),a(43),n()(),i(44,"div",22),M(45,Fe,12,17,"button",23,_e,!1,Be,2,0,"p",18),n()()()(),i(48,"section",24)(49,"div",20)(50,"div",21)(51,"h3"),a(52,"Runs to inspect"),n(),i(53,"p"),a(54,"Open the largest runs in this cohort."),n()(),i(55,"div",25),M(56,Re,7,7,"button",23,ue),n()(),i(58,"div",20)(59,"div",21)(60,"h3"),a(61,"Outlier signals"),n(),i(62,"p"),a(63,"Runs that stand apart from this cohort."),n()(),i(64,"div",25),M(65,Ve,12,13,"button",26,xe,!1,ze,2,0,"p",18),n()()()),o&2){let e=p();l(9),m("",C(10,5,e.modelRows.length)," rows"),l(16),P(e.modelRows),l(11),P(e.distribution),l(7),m("",e.groupingLabel,"."),l(2),P(e.trendRows),l(11),P(e.highlights),l(9),P(e.outliers)}}function De(o,t){if(o&1){let e=O();i(0,"section",0)(1,"div",1)(2,"div")(3,"p",2),a(4,"Cohort insights"),n(),i(5,"h2"),a(6,"Run patterns"),n(),i(7,"p",3),a(8),u(9,Ce,1,1),w(10,"app-help-popover",4),n()(),u(11,ye,2,0,"button",5),n(),i(12,"section",6)(13,"label")(14,"span"),a(15," Time range "),n(),i(16,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsTimeRange(r))}),M(17,he,2,2,"option",8,ie),n()(),i(19,"label")(20,"span"),a(21,"Workspace"),n(),i(22,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsWorkspaceFilter(r))}),M(23,be,2,2,"option",8,R),n()(),i(25,"label")(26,"span"),a(27,"Model"),n(),i(28,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsModelFilter(r))}),M(29,fe,2,2,"option",8,R),n()(),i(31,"label")(32,"span"),a(33," Group trend by "),w(34,"app-help-popover",9),n(),i(35,"select",7),v("ngModelChange",function(r){b(e);let d=p();return f(d.setAnalyticsGrouping(r))}),M(36,ve,2,2,"option",8,ie),n()()(),u(38,Pe,6,3,"section",10)(39,Ge,68,7),n()}if(o&2){let e=t,s=p();l(8),N(" ",e.count," of ",e.importedCount," imported sessions included. "),l(),x(e.analyticsExcludedCount>0?9:-1),l(),g("text",s.help.analyticsScope),l(),x(e.analyticsFiltersActive?11:-1),l(5),g("ngModel",s.analyticsTimeRange()),l(),P(s.analyticsTimeOptions),l(5),g("ngModel",s.analyticsWorkspaceFilter()),l(),P(s.analyticsWorkspaceOptions()),l(5),g("ngModel",s.analyticsModelFilter()),l(),P(s.analyticsModelOptions()),l(5),g("text",s.help.trendGrouping),l(),g("ngModel",s.analyticsGrouping()),l(),P(s.analyticsGroupingOptions),l(2),x(e.count===0?38:39)}}var oe=class o{sessionsInput=S([]);openSession=new z;set sessions(t){this.sessionsInput.set(t??[])}analyticsTimeRange=S("all");analyticsWorkspaceFilter=S("all");analyticsModelFilter=S("all");analyticsGrouping=S("day");help={analyticsScope:"Insights use imported sessions and the time, workspace, and model filters on this page.",trendGrouping:"Time range chooses which sessions are included. Grouping only changes how those sessions are bucketed in the trend panel."};sizeOptions=["Small","Medium","Large","Very large"];analyticsTimeOptions=[{value:"all",label:"All time"},{value:"current-month",label:"Current month"},{value:"previous-month",label:"Previous month"},{value:"7d",label:"Last 7 days"},{value:"30d",label:"Last 30 days"},{value:"90d",label:"Last 90 days"}];analyticsGroupingOptions=[{value:"day",label:"By day"},{value:"week",label:"By week"},{value:"month",label:"By month"}];analyticsWorkspaceOptions=k(()=>{let t=new Set(this.sessionsInput().map(s=>s.workspace).filter(Boolean)),e=this.analyticsWorkspaceFilter();return e!=="all"&&t.add(e),["all",...[...t].sort()]});analyticsModelOptions=k(()=>{let t=new Set;for(let s of this.sessionsInput())for(let r of s.modelBreakdown)t.add(r.pricingModel||r.model);let e=this.analyticsModelFilter();return e!=="all"&&t.add(e),["all",...[...t].sort()]});analyticsSessions=k(()=>Y(this.sessionsInput(),this.analyticsTimeRange(),this.analyticsWorkspaceFilter(),this.analyticsModelFilter()));analytics=k(()=>{let t=this.analyticsSessions(),e=t.length,s=this.sessionsInput().length,r=t.reduce((h,$)=>h+A($),0),d=t.reduce((h,$)=>h+E($),0),ae=e?r/e:0,le=e?d/e:0,I=V(t,h=>A(h)),F=V(t,h=>E(h)),se=Z(t,d),re=ee(t,this.analyticsGrouping()),ce=te(t,d),pe=ne(t,le,ae),de=this.analyticsTimeRange()!=="all"||this.analyticsWorkspaceFilter()!=="all"||this.analyticsModelFilter()!=="all"||this.analyticsGrouping()!=="day",B=Math.max(s-e,0);return{count:e,importedCount:s,analyticsFiltersActive:de,analyticsExcludedCount:B,emptyTitle:s===0?"No imported sessions":"No sessions in this Insights cohort",emptyDetail:s===0?"Import VS Code sessions to explore model mix, run sizes, trends, and outliers.":`${B.toLocaleString()} imported session${B===1?"":"s"} excluded by the Insights controls. Reset the filters to return to all imported sessions.`,timeRangeLabel:this.analyticsTimeOptions.find(h=>h.value===this.analyticsTimeRange())?.label??"All time",workspaceLabel:this.analyticsWorkspaceFilter()==="all"?"All workspaces":this.analyticsWorkspaceFilter(),modelLabel:this.analyticsModelFilter()==="all"?"All models":this.analyticsModelFilter(),groupingLabel:this.analyticsGroupingOptions.find(h=>h.value===this.analyticsGrouping())?.label??"By day",highlights:[{label:"Highest-token run",session:I,value:I?`${A(I).toLocaleString()} tokens`:"n/a",help:"The included session with the largest imported token total."},{label:"Most expensive run",session:F,value:F?`$${E(F).toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:4})}`:"n/a",help:"The included session with the highest GitHub source usage, falling back to token estimate when source usage is absent."}],modelRows:se,trendRows:re,distribution:ce,outliers:pe}});setAnalyticsTimeRange(t){this.analyticsTimeRange.set(t)}setAnalyticsWorkspaceFilter(t){this.analyticsWorkspaceFilter.set(t)}setAnalyticsModelFilter(t){this.analyticsModelFilter.set(t)}setAnalyticsGrouping(t){this.analyticsGrouping.set(t)}resetAnalyticsFilters(){this.analyticsTimeRange.set("all"),this.analyticsWorkspaceFilter.set("all"),this.analyticsModelFilter.set("all"),this.analyticsGrouping.set("day")}emitOpenSession(t){t&&this.openSession.emit(t)}aiCredits(t){return t/L}usageUsd(t){return E(t)}usageCredits(t){return U(t)}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=G({type:o,selectors:[["app-analytics-page"]],inputs:{sessions:"sessions"},outputs:{openSession:"openSession"},decls:1,vars:1,consts:[[1,"pricing-page","analytics-page"],[1,"pricing-header"],[1,"eyebrow"],[1,"analytics-cohort"],["label","Explain analytics scope",3,"text"],["type","button",1,"ghost-button"],["aria-label","Analytics cohort controls",1,"analytics-controls"],[3,"ngModelChange","ngModel"],[3,"value"],["label","Explain trend grouping",3,"text"],[1,"analytics-empty"],["type","button",1,"ghost-button",3,"click"],[1,"analytics-primary"],[1,"analytics-panel","model-panel"],[1,"panel-heading"],["role","table","aria-label","Model breakdown",1,"cost-table","compact-table"],[1,"cost-row","analytics-model-row","cost-row-heading"],[1,"cost-row","analytics-model-row"],[1,"empty"],[1,"analytics-side"],[1,"analytics-panel"],[1,"panel-heading","compact-heading"],[1,"stat-list","compact"],["type","button",3,"disabled"],[1,"analytics-split"],[1,"highlight-list"],["type","button"],[1,"warning-text"],[1,"share-cell"],["type","button",3,"click","disabled"],[1,"open-cue"],[1,"row-kicker"],[3,"text","label","interactive"],["type","button",3,"click"]],template:function(e,s){if(e&1&&u(0,De,40,11,"section",0),e&2){let r;x((r=s.analytics())?0:-1,r)}},dependencies:[X,K,Q,J,j,q,H,W],styles:[".analytics-page[_ngcontent-%COMP%]{display:grid;gap:10px}.pricing-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.pricing-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:3px 0 0;color:var(--text-strong);font-size:21px;font-weight:760;letter-spacing:0}.pricing-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px;max-width:820px;margin:6px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.analytics-cohort[_ngcontent-%COMP%]{opacity:.86}.ghost-button[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:9px;padding:7px 10px;color:var(--text);background:var(--surface-soft);font-size:13px;font-weight:720;cursor:pointer}.ghost-button[_ngcontent-%COMP%]:hover{border-color:var(--line-strong)}.analytics-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,minmax(140px,1fr));gap:7px;border:1px solid var(--line);border-radius:12px;padding:8px;background:linear-gradient(135deg,#0c9f830e,#6f5cff09),var(--surface);box-shadow:var(--shadow-soft, 0 12px 30px rgba(15, 23, 42, .08))}.analytics-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:grid;gap:5px;min-width:0;color:var(--muted);font-size:10px;font-weight:720}.analytics-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px}.analytics-controls[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .analytics-controls[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%;min-height:30px;border:1px solid var(--line);border-radius:7px;padding:6px 9px;background:var(--surface-soft);color:var(--text);font:inherit;font-size:12px;font-weight:720}.analytics-empty[_ngcontent-%COMP%], .analytics-panel[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:12px;background:var(--surface);box-shadow:var(--shadow-soft, 0 12px 30px rgba(15, 23, 42, .08))}.analytics-empty[_ngcontent-%COMP%]{display:grid;gap:8px;justify-items:start;padding:18px}.analytics-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{max-width:720px;margin:0;color:var(--muted);font-size:12px}.analytics-primary[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr;gap:10px;align-items:start}.analytics-side[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.analytics-split[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:start}.analytics-panel[_ngcontent-%COMP%]{display:grid;gap:8px;min-width:0;padding:11px}.analytics-panel[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .analytics-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:15px;font-weight:760}.panel-heading[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.compact-heading[_ngcontent-%COMP%]{align-items:baseline}.panel-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:3px 0 0;color:var(--muted);font-size:12px}.compact-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;text-align:right}.panel-note[_ngcontent-%COMP%]{margin:-3px 0 0;color:var(--muted);font-size:12px}.panel-heading[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{flex:0 0 auto;border:1px solid var(--line);border-radius:999px;padding:3px 7px;color:var(--muted);background:var(--surface-soft);font-size:11px;font-weight:720}.highlight-list[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%]{display:grid;gap:6px}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:grid;gap:5px;width:100%;min-width:0;border:1px solid var(--line);border-radius:9px;padding:8px 9px;background:var(--surface-soft);color:var(--text);text-align:left}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{cursor:pointer}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover, .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{border-color:var(--line-strong)}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled, .stat-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{cursor:default;opacity:.65}.highlight-list[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .highlight-list[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .empty[_ngcontent-%COMP%]{color:var(--muted);font-size:12px;font-style:normal;line-height:1.35}.stat-list[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-kicker[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px}.highlight-list[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .stat-list[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:14px;font-weight:760;line-height:1.25}.open-cue[_ngcontent-%COMP%]{justify-self:start;border:1px solid var(--line);border-radius:999px;padding:3px 7px;background:#0c9f8314;color:var(--accent-strong, var(--accent))!important;font-size:10px!important;font-weight:760;text-transform:uppercase;letter-spacing:.04em}.highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover .open-cue[_ngcontent-%COMP%], .highlight-list[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:focus-visible .open-cue[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 45%,var(--line));background:#0c9f8324}.stat-list.compact[_ngcontent-%COMP%] div[_ngcontent-%COMP%], .stat-list.compact[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{grid-template-columns:minmax(110px,.35fr) minmax(0,1fr) auto;gap:4px 10px;align-items:center;padding:8px 9px}.stat-list.compact[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .stat-list.compact[_ngcontent-%COMP%] .open-cue[_ngcontent-%COMP%]{grid-column:2 / -1}.cost-table[_ngcontent-%COMP%]{overflow-x:auto;border:1px solid var(--line);border-radius:10px;background:var(--surface)}.cost-row[_ngcontent-%COMP%]{display:grid;align-items:start;gap:8px;min-width:650px;border-bottom:1px solid var(--line);padding:8px 10px}.cost-row[_ngcontent-%COMP%]:last-child{border-bottom:0}.cost-row-heading[_ngcontent-%COMP%]{color:var(--muted);background:var(--surface-soft);font-size:11px;font-weight:760;letter-spacing:.04em;text-transform:uppercase}.analytics-model-row[_ngcontent-%COMP%]{grid-template-columns:minmax(170px,1.25fr) minmax(62px,.36fr) minmax(180px,1fr) minmax(86px,.48fr) minmax(84px,.46fr) minmax(80px,.45fr)}.analytics-model-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:grid;gap:3px}.analytics-model-row[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{display:block;margin-top:2px}.warning-text[_ngcontent-%COMP%]{color:var(--warning-text, #ffcf91)!important}.share-cell[_ngcontent-%COMP%]{display:grid;gap:5px}.share-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{display:block;width:0;max-width:100%;height:4px;border-radius:999px;background:linear-gradient(90deg,var(--accent),var(--accent-2))}@media(max-width:1200px){.analytics-side[_ngcontent-%COMP%], .analytics-split[_ngcontent-%COMP%]{grid-template-columns:1fr}}@media(max-width:960px){.analytics-primary[_ngcontent-%COMP%]{grid-template-columns:1fr}}@media(max-width:900px){.pricing-header[_ngcontent-%COMP%], .analytics-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr}}@media(max-width:600px){.analytics-panel[_ngcontent-%COMP%]{padding:11px}.cost-row[_ngcontent-%COMP%]{min-width:620px}}"]})};export{oe as AnalyticsPageComponent};
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<base href="/">
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
8
8
|
<link rel="icon" type="image/svg+xml" href="usage-studio.svg">
|
|
9
|
-
<style>*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:Aptos,Segoe UI Variable,Segoe UI,Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;font-size:14px;line-height:1.45;background:#090d14;color:#d7dde7;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}</style><link rel="stylesheet" href="styles-
|
|
9
|
+
<style>*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:Aptos,Segoe UI Variable,Segoe UI,Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;font-size:14px;line-height:1.45;background:#090d14;color:#d7dde7;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}</style><link rel="stylesheet" href="styles-7RDDQXQV.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-7RDDQXQV.css"></noscript></head>
|
|
10
10
|
<body>
|
|
11
11
|
<app-root></app-root>
|
|
12
|
-
<link rel="modulepreload" href="chunk-
|
|
12
|
+
<link rel="modulepreload" href="chunk-OS2XPCVW.js"><link rel="modulepreload" href="chunk-VEKXIM47.js"><link rel="modulepreload" href="chunk-WOIYAEKB.js"><script src="main-OZIMQRXC.js" type="module"></script></body>
|
|
13
13
|
</html>
|