copilot-usage-studio 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/data/github-copilot-pricing.json +66 -3
- package/dist/copilot-usage-studio/browser/chunk-2VFTKZDH.js +1 -0
- package/dist/copilot-usage-studio/browser/chunk-4SRW5HAB.js +1 -0
- package/dist/copilot-usage-studio/browser/chunk-5FL3PHQS.js +1 -0
- package/dist/copilot-usage-studio/browser/{chunk-WWU6QMJC.js → chunk-5KYZJDMG.js} +1 -1
- package/dist/copilot-usage-studio/browser/chunk-6AXGMNCK.js +1 -0
- package/dist/copilot-usage-studio/browser/{chunk-QMNOUQ2X.js → chunk-OKFPCYAJ.js} +1 -1
- package/dist/copilot-usage-studio/browser/{chunk-23NLHIOR.js → chunk-QJ4KZ5PT.js} +1 -1
- package/dist/copilot-usage-studio/browser/{chunk-7I2HDBC6.js → chunk-ST4Z2MU5.js} +1 -1
- package/dist/copilot-usage-studio/browser/{chunk-RTOXDOOI.js → chunk-YCZAIDR7.js} +1 -1
- package/dist/copilot-usage-studio/browser/index.html +1 -1
- package/dist/copilot-usage-studio/browser/{main-XFPP45VE.js → main-GTYMLVSP.js} +1 -1
- package/docs/pricing.md +3 -3
- package/lib/local-runtime.mjs +13 -0
- package/package.json +1 -1
- package/scripts/scanner-customization-inventory.mjs +23 -2
- package/dist/copilot-usage-studio/browser/chunk-5JYQJM5G.js +0 -1
- package/dist/copilot-usage-studio/browser/chunk-TICIZRSM.js +0 -1
- package/dist/copilot-usage-studio/browser/chunk-XMVGLQQH.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -30,8 +30,28 @@ All notable changes to Copilot Usage Studio are recorded here.
|
|
|
30
30
|
- Refresh GitHub Copilot model pricing from the July 5, 2026 GitHub Docs table, including Claude Sonnet 5, Claude Opus 4.8 fast mode, Kimi K2.7 Code, and updated model statuses.
|
|
31
31
|
- Add raw model-id alias support so newly observed VS Code ids can map to the matching GitHub pricing row without hidden fallback pricing.
|
|
32
32
|
|
|
33
|
-
## 0.
|
|
33
|
+
## 0.3.0 - 2026-07-13
|
|
34
|
+
|
|
35
|
+
- Refresh the GitHub Copilot pricing catalogue from the July 13 table, including GPT-5.6 Luna, Sol, and Terra with per-request long-context tiers.
|
|
36
|
+
- Harmonize Customizations around explicit Global refresh and focused evidence-scan states, evidence-first sorting, quick filters, compact confidence cards, clearer preview/source explanations, and readable request chips.
|
|
37
|
+
- Give generic `SKILL.md` records recognizable metadata/folder-derived names.
|
|
38
|
+
- Add a shared, persisted, draggable results sidebar width to Customizations and Memory.
|
|
39
|
+
- Preserve merged debug-log source counts after focused and incremental scans so Refresh cannot falsely report that no Agent Debug Log session was imported.
|
|
34
40
|
|
|
41
|
+
## 0.2.3 - 2026-07-12
|
|
42
|
+
|
|
43
|
+
- Ship incremental routine refreshes with a clear up-to-date result and an explicit recovery-oriented full rescan.
|
|
44
|
+
- Separate session and memory refresh from on-demand Customizations analysis.
|
|
45
|
+
- Cache unchanged customization evidence and inspect only new or changed session logs.
|
|
46
|
+
- Require substantial, distinctive text before reporting customization request evidence.
|
|
47
|
+
- Preserve conservative discovery, read/reference, and request-text evidence states.
|
|
48
|
+
- Improve Customizations actions, empty states, progress reporting, and cancellation behavior.
|
|
49
|
+
- Add a VS Code Full Rescan command and automatic lightweight refresh when returning to the app.
|
|
50
|
+
- Keep npm, extension, tag, Marketplace, and GitHub Release versions aligned.
|
|
51
|
+
- Publish the same tested VSIX automatically through Microsoft Entra workload identity federation.
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
## 0.2.2 - 2026-07-12
|
|
35
55
|
- Make routine refreshes incremental and report clearly when local Copilot data is already up to date.
|
|
36
56
|
- Add an explicit full-rescan command for recovery without making every refresh expensive.
|
|
37
57
|
- Separate session and memory refresh from on-demand Customizations analysis.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "github-copilot-usage-pricing-2026-07-
|
|
2
|
+
"version": "github-copilot-usage-pricing-2026-07-13",
|
|
3
3
|
"sourceUrl": "https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing",
|
|
4
4
|
"sourceLabel": "GitHub Docs: Models and pricing for GitHub Copilot",
|
|
5
|
-
"snapshotDate": "2026-07-
|
|
6
|
-
"importedAt": "2026-07-
|
|
5
|
+
"snapshotDate": "2026-07-13",
|
|
6
|
+
"importedAt": "2026-07-13",
|
|
7
7
|
"fallbackModel": "GPT-5.4",
|
|
8
8
|
"models": {
|
|
9
9
|
"GPT-5 mini": {
|
|
@@ -80,6 +80,69 @@
|
|
|
80
80
|
}
|
|
81
81
|
]
|
|
82
82
|
},
|
|
83
|
+
"GPT-5.6 Luna": {
|
|
84
|
+
"provider": "OpenAI",
|
|
85
|
+
"releaseStatus": "GA",
|
|
86
|
+
"category": "Lightweight",
|
|
87
|
+
"input": 1,
|
|
88
|
+
"cachedInput": 0.1,
|
|
89
|
+
"output": 6,
|
|
90
|
+
"tierLabel": "Default",
|
|
91
|
+
"tierThresholdLabel": "Up to 200K input tokens",
|
|
92
|
+
"tiers": [
|
|
93
|
+
{
|
|
94
|
+
"id": "long-context",
|
|
95
|
+
"label": "Long context",
|
|
96
|
+
"thresholdInputTokensExclusive": 200000,
|
|
97
|
+
"thresholdLabel": "Over 200K input tokens",
|
|
98
|
+
"input": 2,
|
|
99
|
+
"cachedInput": 0.2,
|
|
100
|
+
"output": 9
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
"GPT-5.6 Sol": {
|
|
105
|
+
"provider": "OpenAI",
|
|
106
|
+
"releaseStatus": "GA",
|
|
107
|
+
"category": "Powerful",
|
|
108
|
+
"input": 5,
|
|
109
|
+
"cachedInput": 0.5,
|
|
110
|
+
"output": 30,
|
|
111
|
+
"tierLabel": "Default",
|
|
112
|
+
"tierThresholdLabel": "Up to 272K input tokens",
|
|
113
|
+
"tiers": [
|
|
114
|
+
{
|
|
115
|
+
"id": "long-context",
|
|
116
|
+
"label": "Long context",
|
|
117
|
+
"thresholdInputTokensExclusive": 272000,
|
|
118
|
+
"thresholdLabel": "Over 272K input tokens",
|
|
119
|
+
"input": 10,
|
|
120
|
+
"cachedInput": 1,
|
|
121
|
+
"output": 45
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"GPT-5.6 Terra": {
|
|
126
|
+
"provider": "OpenAI",
|
|
127
|
+
"releaseStatus": "GA",
|
|
128
|
+
"category": "Versatile",
|
|
129
|
+
"input": 2.5,
|
|
130
|
+
"cachedInput": 0.25,
|
|
131
|
+
"output": 15,
|
|
132
|
+
"tierLabel": "Default",
|
|
133
|
+
"tierThresholdLabel": "Up to 272K input tokens",
|
|
134
|
+
"tiers": [
|
|
135
|
+
{
|
|
136
|
+
"id": "long-context",
|
|
137
|
+
"label": "Long context",
|
|
138
|
+
"thresholdInputTokensExclusive": 272000,
|
|
139
|
+
"thresholdLabel": "Over 272K input tokens",
|
|
140
|
+
"input": 5,
|
|
141
|
+
"cachedInput": 0.5,
|
|
142
|
+
"output": 22.5
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
},
|
|
83
146
|
"Claude Haiku 4.5": {
|
|
84
147
|
"provider": "Anthropic",
|
|
85
148
|
"releaseStatus": "GA",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as Y}from"./chunk-6AXGMNCK.js";import{$a as h,Ba as k,Ca as p,Da as g,Ea as D,Fa as P,Ga as M,Ha as x,Ia as s,Ja as i,Ka as b,O as S,Oa as y,P as z,Qa as _,Sa as d,U as I,Ua as O,Va as r,Wa as m,Xa as C,Ya as T,Z as f,Za as A,_a as v,a as N,ab as L,b as $,db as w,ka as a,nb as V,ob as R,sa as q,sb as B,tb as j,ub as H,vb as W,wb as K,xb as G,yb as Q,zb as U}from"./chunk-WOIYAEKB.js";var X=(o,e)=>e.value,Z=(o,e)=>e.kind+":"+e.path,ee=(o,e)=>e.id,te=(o,e)=>e.sessionId,ne=(o,e)=>e.callNumber,ie=(o,e)=>e.key,oe=(o,e)=>e.raw+e.label;function ae(o,e){if(o&1&&(s(0,"span"),r(1),i()),o&2){let t=d(2);a(),m(t.evidenceScanProgressLabel())}}function se(o,e){if(o&1&&(s(0,"p",30),r(1),i()),o&2){let t=d(2);a(),m(t.activeScanStats())}}function re(o,e){if(o&1&&(s(0,"span"),r(1),i()),o&2){let t=d(2);a(),C("Running ",t.elapsedScanLabel())}}function ce(o,e){if(o&1&&(s(0,"span"),r(1),i()),o&2){let t=d(2);a(),C("Last update ",t.lastProgressLabel()," ago")}}function le(o,e){if(o&1&&(s(0,"div",28)(1,"div")(2,"strong"),r(3),i(),p(4,ae,2,1,"span"),i(),b(5,"progress",29),i(),p(6,se,2,1,"p",30),s(7,"p",31),p(8,re,2,1,"span"),p(9,ce,2,1,"span"),i()),o&2){let t=d();a(3),m(t.evidenceScanProgressPercent()?t.evidenceScanProgressPercent()+"%":"Working"),a(),g(t.evidenceScanProgressLabel()?4:-1),a(),x("value",t.evidenceScanProgressPercent()||null),a(),g(t.activeScanStats()?6:-1),a(2),g(t.elapsedScanLabel()?8:-1),a(),g(t.lastProgressLabel()?9:-1)}}function de(o,e){o&1&&(s(0,"p",8),r(1,"This is taking longer than expected. You can stop it; existing data will be kept."),i())}function ue(o,e){o&1&&(s(0,"p",8),r(1,"No recent progress update has been received."),i())}function me(o,e){if(o&1){let t=y();s(0,"button",32),_("click",function(){S(t);let c=d();return z(c.cancelScan.emit())}),r(1,"Stop evidence scan"),i()}}function pe(o,e){o&1&&b(0,"span",34)}function ge(o,e){if(o&1){let t=y();s(0,"button",33),_("click",function(){S(t);let c=d();return z(c.scanEvidence.emit())}),p(1,pe,1,0,"span",34),r(2),i()}if(o&2){let t=d();x("disabled",t.refreshState==="refreshing"),k("aria-busy",t.refreshState==="refreshing"),a(),g(t.isEvidenceScanActive()?1:-1),a(),C(" ",t.scanActionLabel()," ")}}function Ce(o,e){if(o&1&&(s(0,"option",21),r(1),i()),o&2){let t=e.$implicit;x("value",t),a(),m(t==="all"?"All workspaces":t)}}function ve(o,e){if(o&1){let t=y();s(0,"button",35),_("click",function(){let c=S(t).$implicit,l=d();return z(l.setResultFilter(c.value))}),r(1),i()}if(o&2){let t=e.$implicit,n=d();O("active",n.resultFilter()===t.value),k("aria-pressed",n.resultFilter()===t.value),a(),C(" ",t.label," ")}}function xe(o,e){if(o&1&&(s(0,"div")(1,"b"),r(2),i(),s(3,"code"),r(4),i()()),o&2){let t=e.$implicit,n=d(2);a(2),m(n.diagnosticKindLabel(t.kind)),a(2),m(t.path)}}function he(o,e){o&1&&(s(0,"p",25),r(1,"Showing the first 80 recorded locations. Generated scan diagnostics are capped."),i())}function _e(o,e){if(o&1&&(s(0,"div",36),P(1,xe,5,2,"div",null,Z),i(),p(3,he,2,0,"p",25)),o&2){let t=d();a(),M(t.scanDiagnostics().locations),a(2),g(t.scanDiagnostics().capped?3:-1)}}function fe(o,e){o&1&&(s(0,"p",25),r(1,"No source-location details were recorded for this scan. This does not mean no customization files were found."),i())}function be(o,e){if(o&1){let t=y();s(0,"button",35),_("click",function(){S(t);let c=d(2);return z(c.resetFilters())}),r(1,"Reset"),i()}}function Se(o,e){if(o&1){let t=y();s(0,"button",43),_("click",function(){let c=S(t).$implicit,l=d(2);return z(l.selectCustomization(c))}),s(1,"span",44),r(2),i(),s(3,"span",45)(4,"strong"),r(5),i(),s(6,"small"),r(7),i()(),s(8,"span",46)(9,"b"),r(10),i(),s(11,"em"),r(12),i()()()}if(o&2){let t=e.$implicit,n=d(2);O("active",n.selectedCustomizationId()===t.id)("sent",t.evidenceStatus==="sent")("listed",t.evidenceStatus==="listed")("discovered",t.evidenceStatus==="discovered"),a(2),C(" ",n.kindLabel(t.kind).slice(0,1)," "),a(3),m(t.title),a(2),T("",n.customizationTypeLabel(t)," \xB7 ",n.fileName(t)),a(3),m(n.statusLabel(t.evidenceStatus)),a(2),m(n.evidenceCountLabel(t))}}function ze(o,e){if(o&1&&(s(0,"span")(1,"b"),r(2,"applyTo"),i(),r(3),i()),o&2){let t=d();a(3),C(" ",t.applyTo.join(", "))}}function Pe(o,e){if(o&1&&(s(0,"span")(1,"b"),r(2,"trigger"),i(),r(3),i()),o&2){let t=d();a(3),C(" ",t.triggers.join(", "))}}function Me(o,e){o&1&&(s(0,"li",54),r(1,"\u2713 Matching request text found"),i())}function ye(o,e){o&1&&(s(0,"li",59),r(1,"~ File path or read reference found"),i(),s(2,"li"),r(3,"\u2013 File contents unavailable for text comparison"),i())}function we(o,e){o&1&&(s(0,"li",59),r(1,"~ VS Code discovery record found"),i(),s(2,"li"),r(3,"\u2013 No matching request text recovered"),i())}function Oe(o,e){o&1&&(s(0,"li"),r(1,"\u2013 No matching evidence in imported request logs"),i())}function Ee(o,e){o&1&&(s(0,"a",55),r(1,"View evidence"),i())}function ke(o,e){if(o&1&&(s(0,"p",56),r(1),i()),o&2){let t=d();a(),m(t.description)}}function Ie(o,e){if(o&1&&(s(0,"span",71),r(1),i()),o&2){let t=e.$implicit,n=d(6);O("sent",t.status==="sent")("listed",t.status==="listed")("discovered",t.status==="discovered"),k("aria-label",n.timelineMarkerLabel(t)),a(),C(" R",t.callNumber," ")}}function Te(o,e){if(o&1&&(s(0,"span",70),r(1),i()),o&2){let t=d(2).$implicit,n=d(4);a(),C("+",n.timelineOverflow(t)," more")}}function Fe(o,e){if(o&1&&(s(0,"span",65),P(1,Ie,2,8,"span",69,ne),p(3,Te,2,1,"span",70),i()),o&2){let t=d().$implicit,n=d(4);k("aria-label",n.sessionEvidenceLabel(t)),a(),M(n.timelineMarkers(t)),a(2),g(n.timelineOverflow(t)?3:-1)}}function Le(o,e){o&1&&(s(0,"span",66),r(1,"Limited evidence"),i())}function Ne(o,e){if(o&1){let t=y();s(0,"button",35),_("click",function(){S(t);let c=d().$implicit,l=d(4);return z(l.emitOpenSession(c.sessionId))}),r(1,"Open run"),i()}}function $e(o,e){if(o&1&&(s(0,"span",76),r(1,"Matched excerpt"),i(),s(2,"blockquote"),r(3),i(),s(4,"small",77),r(5),v(6,"number"),i()),o&2){let t=d().$implicit;a(3),C(" ",t.matchedPreview[0]," "),a(2),C(" Approximate matched content: ",h(6,2,t.matchedCharacters)," characters ")}}function qe(o,e){if(o&1&&(s(0,"li")(1,"b"),r(2),i(),s(3,"code"),r(4),i()()),o&2){let t=e.$implicit;a(2),m(t.label),a(2),m(t.raw)}}function De(o,e){if(o&1&&(s(0,"article",73)(1,"div",74)(2,"strong"),r(3),i(),s(4,"p"),r(5),i(),p(6,$e,7,4),s(7,"details",75)(8,"summary"),r(9),i(),s(10,"div")(11,"span"),r(12,"Visible VS Code log sources"),i(),s(13,"p"),r(14,"These labels identify request-log sections where the match appeared. They are evidence fields, not files, so they cannot be opened."),i(),s(15,"ul"),P(16,qe,5,2,"li",null,oe),i()()()()()),o&2){let t=e.$implicit,n=d(6);O("sent",t.status==="sent"),a(3),m(n.callEvidenceTitle(t)),a(2),m(n.callEvidenceSummary(t)),a(),g(t.matchedPreview.length?6:-1),a(3),C("Proof details \xB7 ",n.evidenceDetailsSummary(t)),a(7),M(n.rawEvidenceSources(t))}}function Ae(o,e){if(o&1&&(s(0,"div",68),P(1,De,18,6,"article",72,ie),i()),o&2){let t=d().$implicit,n=d(4);a(),M(n.sentCallEvidence(t))}}function Ve(o,e){if(o&1&&(s(0,"details",62)(1,"summary")(2,"span",63)(3,"time"),r(4),v(5,"date"),i(),s(6,"b"),r(7),i(),s(8,"em"),r(9),i()(),s(10,"span",64),p(11,Fe,4,2,"span",65)(12,Le,2,0,"span",66),s(13,"strong"),r(14),i()()(),s(15,"div",67)(16,"p"),r(17),i(),p(18,Ne,2,0,"button",39),i(),p(19,Ae,3,0,"div",68),i()),o&2){let t=e.$implicit,n=d(4);O("sent",t.bestStatus==="sent")("listed",t.bestStatus==="listed")("discovered",t.bestStatus==="discovered"),a(4),m(L(5,14,t.timestamp,"medium")),a(3),m(t.title),a(2),m(n.evidenceGroupSubtitle(t)),a(2),g(t.bestStatus==="sent"?11:12),a(3),m(n.sessionEvidenceLabel(t)),a(3),C(" ",t.bestStatus==="sent"?n.groupDetailSummary(t):n.weakEvidenceExplanation(t)," "),a(),g(t.session?18:-1),a(),g(t.bestStatus==="sent"?19:-1)}}function Re(o,e){if(o&1&&(s(0,"section",57)(1,"header")(2,"span",48),r(3,"Where it appeared"),i(),s(4,"h4"),r(5),v(6,"number"),i()(),s(7,"p",60),r(8," Each row is one Copilot session. Open a row for request-level proof. "),i(),P(9,Ve,20,17,"details",61,te),i()),o&2){let t=d(3);a(5),T("",h(6,2,t.selectedSessionEvidence().length)," session",t.selectedSessionEvidence().length===1?"":"s"),a(4),M(t.selectedSessionEvidence())}}function Be(o,e){if(o&1&&(s(0,"article",42)(1,"header",47)(2,"div")(3,"span",48),r(4),i(),s(5,"h3"),r(6),i(),s(7,"p"),r(8),i()(),s(9,"span",49),r(10),b(11,"app-help-popover",50),i()(),s(12,"div",51)(13,"span")(14,"b"),r(15),v(16,"number"),i(),r(17," characters"),i(),s(18,"span")(19,"b"),r(20),v(21,"number"),i(),r(22," lines"),i(),s(23,"span")(24,"b"),r(25,"updated"),i(),r(26),v(27,"date"),i(),p(28,ze,4,1,"span"),p(29,Pe,4,1,"span"),i(),s(30,"section",52)(31,"div")(32,"span",48),r(33,"Evidence confidence"),i(),s(34,"h4"),r(35),i(),s(36,"ul",53)(37,"li",54),r(38,"\u2713 Local file detected"),i(),p(39,Me,2,0,"li",54)(40,ye,4,0)(41,we,4,0)(42,Oe,2,0,"li"),i(),p(43,Ee,2,0,"a",55),i(),p(44,ke,2,1,"p",56),i(),p(45,Re,11,4,"section",57),s(46,"footer",58)(47,"span"),r(48,"Local file"),i(),s(49,"code"),r(50),i()()()),o&2){let t=e,n=d(2);a(4),m(n.customizationTypeLabel(t)),a(2),m(t.title),a(2),T("",t.workspace||"Local"," \xB7 ",n.fileName(t)),a(),O("sent",t.evidenceStatus==="sent")("listed",t.evidenceStatus==="listed")("discovered",t.evidenceStatus==="discovered"),a(),C(" ",n.statusLabel(t.evidenceStatus)," "),a(),x("text",n.statusHelp(t.evidenceStatus)),a(4),m(h(16,23,t.characterCount)),a(5),m(h(21,25,t.lineCount)),a(6),C(" ",L(27,27,t.modifiedAt,"mediumDate")),a(2),g(t.applyTo.length?28:-1),a(),g(t.triggers.length?29:-1),a(6),m(n.statusHeadline(t.evidenceStatus)),a(4),g(t.evidenceStatus==="sent"?39:t.evidenceStatus==="listed"?40:t.evidenceStatus==="discovered"?41:42),a(4),g(t.matches.length?43:-1),a(),g(t.description?44:-1),a(),g(t.matches.length?45:-1),a(5),m(t.sourcePath)}}function je(o,e){if(o&1&&(s(0,"section",26)(1,"aside",37)(2,"div",38)(3,"span"),r(4),v(5,"number"),i(),p(6,be,2,0,"button",39),i(),P(7,Se,13,14,"button",40,ee),i(),b(9,"div",41),p(10,Be,51,30,"article",42),i()),o&2){let t,n=d();a(4),C("",h(5,5,n.filteredCustomizations().length)," shown"),a(2),g(n.query()||n.resultFilter()!=="all"||n.workspaceFilter()!=="all"?6:-1),a(),M(n.filteredCustomizations()),a(2),x("resizableMin",300)("resizableDefault",430),a(),g((t=n.selectedCustomization())?10:-1,t)}}function He(o,e){o&1&&b(0,"span",34)}function We(o,e){if(o&1){let t=y();s(0,"button",33),_("click",function(){S(t);let c=d(2);return z(c.scanEvidence.emit())}),p(1,He,1,0,"span",34),r(2),i()}if(o&2){let t=d(2);x("disabled",t.refreshState==="refreshing"),k("aria-busy",t.refreshState==="refreshing"),a(),g(t.isEvidenceScanActive()?1:-1),a(),C(" ",t.scanActionLabel()," ")}}function Ke(o,e){if(o&1){let t=y();s(0,"button",35),_("click",function(){S(t);let c=d(2);return z(c.resetFilters())}),r(1,"Reset filters"),i()}}function Ge(o,e){if(o&1&&(s(0,"section",27)(1,"h3"),r(2),i(),s(3,"p"),r(4),i(),p(5,We,3,4,"button",11)(6,Ke,2,0,"button",39),i()),o&2){let t=d();a(2),m(t.emptyStateTitle()),a(2),m(t.emptyStateText()),a(),g(t.customizationsInput().length?6:5)}}var J=class o{customizationsInput=f([]);sessionsInput=f([]);ingestionInput=f(null);query=f("");kindFilter=f("all");statusFilter=f("all");workspaceFilter=f("all");resultFilter=f("all");selectedId=f(null);set customizations(e){let t=e??[];this.customizationsInput.set(t),(!this.selectedId()||!t.some(n=>n.id===this.selectedId()))&&this.selectedId.set(t[0]?.id??null)}set sessions(e){this.sessionsInput.set(e??[])}set ingestion(e){this.ingestionInput.set(e??null)}refreshState="idle";refreshMessage=null;runtimeStatus=null;scanEvidence=new I;cancelScan=new I;openSession=new I;workspaceOptions=w(()=>["all",...[...new Set(this.customizationsInput().map(e=>e.workspace).filter(Boolean))].sort()]);filteredCustomizations=w(()=>{let e=this.query().trim().toLowerCase(),t=this.kindFilter(),n=this.statusFilter(),c=this.workspaceFilter();return this.customizationsInput().filter(l=>(!e||[l.title,l.name,l.description,l.excerpt,l.relativePath,l.sourcePath,l.kind,l.evidenceStatus,l.workspace,...l.applyTo,...l.triggers].join(" ").toLowerCase().includes(e))&&(t==="all"||l.kind===t)&&(n==="all"||l.evidenceStatus===n)&&(c==="all"||l.workspace===c)&&this.matchesResultFilter(l,this.resultFilter())).sort((l,u)=>this.evidenceSortCount(u)-this.evidenceSortCount(l)||this.statusRank(u.evidenceStatus)-this.statusRank(l.evidenceStatus)||l.title.localeCompare(u.title))});selectedCustomization=w(()=>{let e=this.filteredCustomizations();return e.find(t=>t.id===this.selectedId())??e[0]??null});selectedCustomizationId=w(()=>this.selectedCustomization()?.id??"");selectedSessionEvidence=w(()=>{let e=this.selectedCustomization();return e?this.groupMatchesBySession(e):[]});summary=w(()=>{let e=this.customizationsInput();return{total:e.length,sent:e.filter(t=>t.evidenceStatus==="sent").length,listed:e.filter(t=>t.evidenceStatus==="listed").length,discovered:e.filter(t=>t.evidenceStatus==="discovered").length,sessions:this.evidenceSessionCount(),matches:this.evidenceMatchCount(),partial:e.filter(t=>["listed","discovered"].includes(t.evidenceStatus)).length}});resultFilters=[{value:"all",label:"All"},{value:"evidence",label:"Evidence found"},{value:"none",label:"No evidence"},{value:"partial",label:"Partial results"},{value:"skill",label:"Skills"},{value:"instruction",label:"Instructions"},{value:"prompt",label:"Prompts"},{value:"rule",label:"Rules"}];summaryHelp={files:"Customization files discovered in trusted VS Code settings, defaults, or exact local-log references.",evidence:"Files with distinctive text matched inside visible VS Code model-request logs.",sessions:"Distinct Copilot sessions containing at least one text match for a customization file.",matches:"Text-match evidence records. One file can match multiple requests in the same session."};scanDiagnostics=w(()=>{let e=this.ingestionInput(),t=(e?.scannedCustomizationLocations??[]).filter(n=>n.kind!=="candidate");return{roots:e?.scannedCustomizationRoots??0,files:e?.importedCustomizations??this.customizationsInput().length,locations:t.slice(0,80),locationCount:t.length,capped:t.length>=200}});customizationEvidenceSummary=w(()=>{let e=this.ingestionInput(),t=this.customizationsInput(),n=t.filter(u=>u.evidenceStatus==="sent").length,c=t.filter(u=>u.evidenceStatus==="listed").length,l=!!(e?.customizationEvidenceAnalyzedAt||(e?.customizationEvidenceScannedSessions??0)>0);return{sent:n,notProved:c,hasScannedEvidence:l,label:l?`${n.toLocaleString()} text-matched \xB7 ${c.toLocaleString()} read/referenced`:"Detailed evidence skipped"}});scanActionLabel(){return this.refreshState==="refreshing"?"Analyzing...":!this.customizationsInput().length&&!this.customizationEvidenceSummary().hasScannedEvidence?"Analyze this workspace":this.customizationEvidenceSummary().hasScannedEvidence?"Analyze new activity":"Analyze customizations"}showHeaderScanAction(){return this.isEvidenceScanActive()||this.customizationsInput().length>0||this.customizationEvidenceSummary().hasScannedEvidence||this.refreshState==="error"}isEvidenceScanActive(){return this.refreshState==="refreshing"&&this.runtimeStatus?.activeScanMode==="customizations"}scanRelationshipText(){return this.isEvidenceScanActive()?"Customization evidence scan is running. Global refresh is temporarily unavailable because local scans run one at a time.":"Customization evidence analysis is separate from Global refresh and runs only when requested here."}currentWorkspaceLabel(){let e=this.runtimeStatus?.scanProgress?.workspace||"";if(e)return e;let t=this.workspaceOptions().filter(n=>n!=="all");return this.workspaceFilter()!=="all"?this.workspaceFilter():t.length===1?t[0]:"Current VS Code workspace"}customizationFileCountLabel(){let e=this.summary().total;return`${e.toLocaleString()} customization file${e===1?"":"s"}`}requestTextCountLabel(){let e=this.customizationEvidenceSummary();if(this.isEvidenceScanActive())return"Checking recent requests";if(this.refreshState==="error")return"Scan failed";if(this.refreshMessage?.toLowerCase().includes("stopped"))return"Scan stopped";if(!e.hasScannedEvidence)return"Not checked yet";let t=e.sent;return t?`${t.toLocaleString()} file${t===1?"":"s"} with request text`:"No request text found"}evidenceResultText(){if(this.isEvidenceScanActive())return this.currentScanStep();if(this.refreshState==="error")return this.refreshMessage||"The usage evidence scan did not finish.";if(this.refreshMessage?.toLowerCase().includes("stopped"))return"Scan stopped. Existing customization data was kept.";if(this.customizationEvidenceSummary().hasScannedEvidence){let e=this.customizationEvidenceSummary().sent,t=this.evidenceSessionCount(),n=this.evidenceMatchCount();return e?`${n.toLocaleString()} text match${n===1?"":"es"} across ${t.toLocaleString()} Copilot session${t===1?"":"s"}.`:"Checked recent Copilot requests. No customization file text was found."}return this.customizationsInput().length?"Analyze customizations to check whether these files appeared inside recent Copilot model requests.":"Analyze this workspace to find customization files and check recent Copilot requests."}emptyStateTitle(){return this.customizationsInput().length?"No customizations match these filters":this.scanDiagnostics().roots>0?"No customization files found":"No customization scan has run yet"}emptyStateText(){return this.customizationsInput().length?"Try a broader search or reset the filters.":this.scanDiagnostics().roots>0?"Checked the current VS Code customization locations. Open Advanced scan coverage if you need to inspect the folders that were checked.":"Scan this workspace to find Copilot instructions, skills, prompts, hooks, and agents, then check recent request logs for evidence."}evidenceMetricLabel(){return this.isEvidenceScanActive()?"Matches so far":"Last result"}evidenceMetricText(){let e=this.isEvidenceScanActive()?Number(this.runtimeStatus?.scanProgress?.matches??this.evidenceMatchCount()):this.evidenceMatchCount();return`${e.toLocaleString()} text match${e===1?"":"es"}`}activeScanStats(){if(!this.isEvidenceScanActive())return"";let e=this.runtimeStatus?.scanProgress,t=Number(e?.sessions??0),n=Number(e?.modelCalls??0);return[t>0?`${t.toLocaleString()} session${t===1?"":"s"} checked`:"",n>0?`${n.toLocaleString()} model call${n===1?"":"s"} checked`:"",this.evidenceMetricText()].filter(Boolean).join(" \xB7 ")}evidenceScanProgressPercent(){if(!this.isEvidenceScanActive())return 0;let e=this.runtimeStatus?.scanProgress,t=Number(e?.index??e?.workspaceIndex??0),n=Number(e?.total??e?.workspaceTotal??0);return t>0&&n>0?Math.max(1,Math.min(100,Math.round(t/n*100))):0}evidenceScanProgressLabel(){if(!this.isEvidenceScanActive())return"";let e=this.runtimeStatus?.scanProgress,t=Number(e?.index??0),n=Number(e?.total??0);return t>0&&n>0?`${t.toLocaleString()} of ${n.toLocaleString()} Copilot session folders checked`:"Preparing session list"}currentScanStep(){let e=this.runtimeStatus?.scanProgress?.stage??"";return e==="customizations"||e==="workspace"||e==="workspace-state"?"Step 1 of 3: Loading customization files":e==="customization-evidence"||e==="debug-logs"?"Step 2 of 3: Checking recent Copilot sessions":e==="complete"?"Step 3 of 3: Summarising matches":"Preparing current workspace scan"}elapsedScanLabel(){let e=this.runtimeStatus?.lastScanStartedAt;return!e||!this.isEvidenceScanActive()?"":this.durationLabel(Date.now()-Date.parse(e))}lastProgressLabel(){let e=this.runtimeStatus?.scanProgress?.updatedAt;return!e||!this.isEvidenceScanActive()?"":this.durationLabel(Date.now()-Date.parse(e))}isLongRunningScan(){let e=this.runtimeStatus?.lastScanStartedAt;return!e||!this.isEvidenceScanActive()?!1:Date.now()-Date.parse(e)>6e4}isStaleScan(){let e=this.runtimeStatus?.scanProgress?.updatedAt;return!e||!this.isEvidenceScanActive()?!1:Date.now()-Date.parse(e)>3e4}evidenceSessionCount(){return new Set(this.customizationsInput().flatMap(e=>e.matches.map(t=>t.sessionId))).size}evidenceMatchCount(){return this.customizationsInput().reduce((e,t)=>e+t.matches.filter(n=>n.status==="sent").length,0)}durationLabel(e){if(!Number.isFinite(e)||e<0)return"";let t=Math.max(0,Math.round(e/1e3));return t<60?`${t}s`:`${Math.floor(t/60)}m ${t%60}s`}selectCustomization(e){this.selectedId.set(e.id)}setQuery(e){this.query.set(e),this.ensureVisibleSelection()}setKindFilter(e){this.kindFilter.set(e),this.ensureVisibleSelection()}setStatusFilter(e){this.statusFilter.set(e),this.ensureVisibleSelection()}setWorkspaceFilter(e){this.workspaceFilter.set(e),this.ensureVisibleSelection()}setResultFilter(e){this.resultFilter.set(e),this.ensureVisibleSelection()}resetFilters(){this.query.set(""),this.kindFilter.set("all"),this.statusFilter.set("all"),this.workspaceFilter.set("all"),this.resultFilter.set("all"),this.ensureVisibleSelection()}fileName(e){return(e.relativePath||e.sourcePath).split(/[\\/]+/).filter(Boolean).at(-1)??e.title}kindLabel(e){return{instruction:"Instruction",skill:"Skill",prompt:"Prompt",hook:"Hook",agent:"Agent",other:"Other"}[e]}customizationTypeLabel(e){let t=this.kindLabel(e.kind);return e.kind==="skill"&&!/^skill$/i.test(e.title)?`${t} (${e.title})`:t}statusLabel(e){return{sent:"Evidence found",listed:"Path/reference only",discovered:"Discovered locally",not_seen:"No local-log evidence"}[e]}statusHeadline(e){return{sent:"File text appeared in a model request",listed:"Copilot read or referenced this file",discovered:"Found locally, not seen in a request",not_seen:"No evidence in imported sessions"}[e]}statusHelp(e){return{sent:"We found distinctive text from this file inside local VS Code request logs. The text reached a model request, but it may have arrived as customization context or as manually attached file context.",listed:"Local logs show Copilot read or referenced this file, but did not show distinctive file text inside the model request.",discovered:"The file exists in a known customization location, but imported model requests did not show a text match.",not_seen:"The file exists locally, but imported sessions do not show local evidence for it yet."}[e]}evidenceCountLabel(e){let t=new Set(e.matches.map(n=>n.sessionId)).size;return e.matches.length?`${t.toLocaleString()} session${t===1?"":"s"}`:"No sessions"}evidenceGroupSubtitle(e){let t=e.modelCallNumbers.length;if(e.bestStatus==="sent"){let n=this.sentModelCallCount(e);return n?`${n.toLocaleString()} text-matched request${n===1?"":"s"}`:"Evidence found"}return e.bestStatus==="listed"?t?"File path or read recorded; contents unavailable":"Read or referenced":e.bestStatus==="discovered"?"Found during setup or discovery":"No imported evidence"}sourceLabel(e){return/^system_prompt/i.test(e)?"Instructions":/^tools/i.test(e)?"Tool list":{inputMessages:"Complete request",userRequest:"User prompt",copilotFileRead:"File read"}[e]??e}sourceHelp(e){return/^system_prompt/i.test(e.raw)?"Matched inside the instruction/system part of a VS Code request. This is usually where custom instructions and skills appear.":/^tools/i.test(e.raw)?"Matched near the tool definitions included with the request. This can include tool or MCP schema material.":e.raw==="inputMessages"?"Matched somewhere in the full request payload visible in VS Code logs. This is useful as broad local confirmation that the text appeared.":e.raw==="userRequest"?"Matched in the user-facing prompt/request material for this model call.":e.raw==="copilotFileRead"?"VS Code logs show Copilot read this customization file. This is useful evidence, but it does not prove the file text was sent to the model.":"Matched in this VS Code debug-log source. Open the technical proof section if you need the raw field name."}rawSourceLabel(e){return String(e)}sessionEvidenceLabel(e){if(!e.modelCallNumbers.length)return e.bestStatus==="sent"?"Evidence found":this.statusLabel(e.bestStatus);if(e.bestStatus!=="sent")return"Read or referenced";let n=this.sentModelCallCount(e),c=n===1?"request":"requests";return`${n.toLocaleString()} text-matched ${c}`}timelineMarkers(e){let t=new Map;for(let n of e.matches){if(!n.modelCallNumber)continue;let c=t.get(n.modelCallNumber)??"not_seen";t.set(n.modelCallNumber,this.strongerStatus(c,n.status))}return[...t.entries()].sort(([n],[c])=>n-c).filter(([,n])=>e.bestStatus!=="sent"||n==="sent").slice(0,10).map(([n,c])=>({callNumber:n,status:c}))}timelineOverflow(e){let t=new Set(e.matches.filter(n=>e.bestStatus!=="sent"||n.status==="sent").map(n=>n.modelCallNumber).filter(Boolean));return Math.max(0,t.size-10)}timelineMarkerLabel(e){return e.status==="sent"?`Model request #${e.callNumber}: this file's text was included`:`Model request #${e.callNumber}: file text not proved`}callEvidence(e){let t=new Map;for(let n of e.matches){let c=n.modelCallNumber?`call:${n.modelCallNumber}`:`event:${n.eventIndex}`,u=t.get(c)??{key:c,callNumber:n.modelCallNumber,eventIndex:n.eventIndex,status:n.status,matches:[],sources:[],matchedChunks:0,matchedCharacters:0,matchedPreview:[]};u.matches.push(n),u.status=this.strongerStatus(u.status,n.status),u.matchedChunks+=n.matchedChunks??0,u.matchedCharacters+=n.matchedCharacters??0;for(let E of n.matchedPreview??[])E&&!u.matchedPreview.includes(E)&&u.matchedPreview.push(E);let F={label:this.sourceLabel(n.source),raw:this.rawSourceLabel(n.source)};u.sources.some(E=>E.label===F.label&&E.raw===F.raw)||u.sources.push(F),t.set(c,u)}return[...t.values()].sort((n,c)=>n.callNumber!==c.callNumber?c.callNumber-n.callNumber:c.eventIndex-n.eventIndex)}sentCallEvidence(e){return this.callEvidence(e).filter(t=>t.status==="sent")}callEvidenceTitle(e){let t=e.callNumber?`Request #${e.callNumber}`:`Event #${e.eventIndex}`;return e.status==="sent"?`${t}: file text found`:e.status==="listed"?`${t}: read or referenced`:`${t}: ${this.statusLabel(e.status).toLowerCase()}`}callEvidenceSummary(e){if(e.status==="sent"){let t=e.matchedCharacters.toLocaleString();return e.matchedCharacters>=600?`Large text match detected. A representative excerpt is shown below. Approximate matched content: ${t} characters.`:`Distinctive file text appeared in this Copilot request. Approximate matched content: ${t} characters.`}return e.status==="listed"?"Copilot read or referenced this file, but local logs did not show distinctive file text inside this model request.":"No request payload content was verified for this event."}groupDetailSummary(e){if(e.bestStatus==="sent"){let t=this.sentModelCallCount(e),n=t===1?"model request":"model requests";return`File text appeared in ${t.toLocaleString()} Copilot ${n}. This confirms the text was visible in local request logs.`}return e.bestStatus==="listed"?"Copilot read or referenced this file in this session, but imported model requests did not show distinctive file text.":e.bestStatus==="discovered"?"VS Code setup or discovery mentioned this file, but imported model requests did not show distinctive file text.":"No visible request evidence was imported for this session."}weakEvidenceExplanation(e){return e.bestStatus==="listed"?"Only the file path or a file-read reference was visible. The file contents were not available in the request logs for comparison.":e.bestStatus==="discovered"?"VS Code reported the file during customization discovery, but no matching text snippet could be recovered from imported request logs.":"No matching text snippet could be recovered from the imported logs."}evidenceSourceLabels(e){return this.uniqueSources(e.sources).map(t=>t.label)}evidenceSources(e){return this.uniqueSources(e.sources)}rawEvidenceSources(e){return this.uniqueSources(e.sources)}evidenceDetailsSummary(e){let t=[];e.callNumber&&t.push(`request #${e.callNumber}`);let n=this.sourcePhrase(e.sources);return n&&t.push(n),e.matchedCharacters&&t.push(`${e.matchedCharacters.toLocaleString()} characters matched`),t.join(" \xB7 ")||"raw debug-log proof"}sourcePhrase(e){let t=this.uniqueSources(e).map(n=>n.label);return t.length?t.length===1?t[0].toLowerCase():t.length===2?`${t[0].toLowerCase()} and ${t[1].toLowerCase()}`:`${t.slice(0,-1).map(n=>n.toLowerCase()).join(", ")}, and ${t.at(-1)?.toLowerCase()}`:"the model request"}uniqueSources(e){let t=new Set,n=[];for(let c of e){let l=`${c.label}:${c.raw}`;t.has(l)||(t.add(l),n.push(c))}return n}sentModelCallCount(e){return new Set(e.matches.filter(t=>t.status==="sent").map(t=>t.modelCallNumber).filter(Boolean)).size}diagnosticKindLabel(e){return{candidate:"Candidate root",root:"Folder",file:"File","debug-reference":"Debug reference","debug-discovery-root":"VS Code discovery","vscode-setting-root":"VS Code setting","vscode-default-root":"VS Code default","vscode-user-setting-root":"User setting","vscode-workspace-setting-root":"Workspace setting","vscode-workspace-folder-setting-root":"Workspace-folder setting","vscode-parent-repo-default-root":"Parent repo default","user-default-root":"User default"}[e]??e}sessionForMatch(e){return this.sessionsInput().find(t=>t.id===e)??null}emitOpenSession(e){let t=this.sessionForMatch(e);t&&this.openSession.emit(t)}groupMatchesBySession(e){let t=new Map;for(let n of e.matches){let c=this.sessionForMatch(n.sessionId),u=t.get(n.sessionId)??{sessionId:n.sessionId,session:c,title:c?.title??`Session ${n.sessionId.slice(0,8)}`,timestamp:n.timestamp,bestStatus:n.status,matches:[],sentCount:0,listedCount:0,discoveredCount:0,modelCallNumbers:[],sources:[],matchedChunks:0,matchedCharacters:0};u.matches.push(n),u.bestStatus=this.strongerStatus(u.bestStatus,n.status),u.timestamp=[u.timestamp,n.timestamp].filter(Boolean).sort().at(-1)??u.timestamp,u.sentCount+=n.status==="sent"?1:0,u.listedCount+=n.status==="listed"?1:0,u.discoveredCount+=n.status==="discovered"?1:0,u.matchedChunks+=n.matchedChunks??0,u.matchedCharacters+=n.matchedCharacters??0,n.modelCallNumber&&!u.modelCallNumbers.includes(n.modelCallNumber)&&u.modelCallNumbers.push(n.modelCallNumber),n.source&&!u.sources.includes(n.source)&&u.sources.push(n.source),t.set(n.sessionId,u)}return[...t.values()].map(n=>$(N({},n),{modelCallNumbers:[...n.modelCallNumbers].sort((c,l)=>c-l),matches:[...n.matches].sort((c,l)=>l.timestamp.localeCompare(c.timestamp)||l.eventIndex-c.eventIndex)})).sort((n,c)=>c.timestamp.localeCompare(n.timestamp))}strongerStatus(e,t){let n={not_seen:0,discovered:1,listed:2,sent:3};return n[t]>n[e]?t:e}statusRank(e){return{not_seen:0,discovered:1,listed:2,sent:3}[e]}evidenceSortCount(e){return e.matches.filter(t=>t.status==="sent").length}matchesResultFilter(e,t){if(t==="all")return!0;if(t==="evidence")return e.evidenceStatus==="sent";if(t==="none")return e.evidenceStatus==="not_seen";if(t==="partial")return["listed","discovered"].includes(e.evidenceStatus);if(t==="rule"){let n=`${e.relativePath} ${e.sourcePath}`.replace(/\\/g,"/").toLowerCase();return e.kind==="instruction"&&(n.includes("/rules/")||n.includes(".rules."))}return e.kind===t}ensureVisibleSelection(){let e=this.filteredCustomizations();if(!e.length){this.selectedId.set(null);return}e.some(t=>t.id===this.selectedId())||this.selectedId.set(e[0].id)}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=q({type:o,selectors:[["app-customizations-page"]],inputs:{customizations:"customizations",sessions:"sessions",ingestion:"ingestion",refreshState:"refreshState",refreshMessage:"refreshMessage",runtimeStatus:"runtimeStatus"},outputs:{scanEvidence:"scanEvidence",cancelScan:"cancelScan",openSession:"openSession"},decls:86,vars:37,consts:[[1,"customizations-page"],[1,"customizations-header"],[1,"eyebrow"],[1,"preview-badge"],["aria-label","Customization scan status",1,"customizations-scan-status"],[1,"scan-status-body"],[1,"scan-summary-line"],[1,"scan-relationship"],[1,"scan-warning"],[1,"scan-status-actions"],["type","button",1,"secondary-scan-button"],["type","button",1,"evidence-scan-button",3,"disabled"],["aria-label","Customization evidence summary",1,"customizations-summary"],["label","Explain discovered customization files",3,"text"],["label","Explain files with evidence",3,"text"],["label","Explain sessions containing evidence",3,"text"],["label","Explain total evidence matches",3,"text"],["aria-label","Customization filters",1,"customizations-controls"],[1,"customizations-search"],["type","search","placeholder","Search filename, title, description, applyTo, trigger",3,"ngModelChange","ngModel"],[3,"ngModelChange","ngModel"],[3,"value"],["aria-label","Quick result filters",1,"customizations-filter-chips"],["type","button",3,"active"],[1,"customizations-diagnostics"],[1,"diagnostic-note"],[1,"customizations-workspace"],[1,"customizations-empty"],["aria-label","Evidence scan progress",1,"scan-progress-meter"],["max","100",3,"value"],[1,"scan-progress-stats"],[1,"scan-progress-line"],["type","button",1,"secondary-scan-button",3,"click"],["type","button",1,"evidence-scan-button",3,"click","disabled"],["aria-hidden","true",1,"button-spinner"],["type","button",3,"click"],[1,"diagnostic-list"],["aria-label","Local customizations",1,"customizations-list"],[1,"customizations-list-heading"],["type","button"],["type","button",1,"customization-card",3,"active","sent","listed","discovered"],["appResizableSidebar","copilot-usage-studio.results-sidebar-width",1,"results-sidebar-resizer",3,"resizableMin","resizableDefault"],[1,"customization-detail"],["type","button",1,"customization-card",3,"click"],["aria-hidden","true",1,"customization-file-icon"],[1,"customization-card-main"],[1,"customization-card-side"],[1,"customization-detail-header"],[1,"customization-kicker"],[1,"evidence-badge"],["label","Explain customization evidence",3,"text"],[1,"customization-facts"],[1,"evidence-summary"],[1,"evidence-checklist"],[1,"confirmed"],["href","#customization-evidence-list"],[1,"description"],["id","customization-evidence-list","aria-label","Customization evidence matches",1,"match-list"],[1,"customization-path"],[1,"partial"],[1,"match-list-help"],[1,"match-group",3,"sent","listed","discovered"],[1,"match-group"],[1,"match-group-title"],[1,"match-group-status"],[1,"match-group-timeline"],[1,"match-group-weak"],[1,"match-group-detail-header"],[1,"match-events","call-events"],[1,"timeline-marker",3,"sent","listed","discovered"],[1,"timeline-overflow"],[1,"timeline-marker"],[1,"match-event","call-event",3,"sent"],[1,"match-event","call-event"],[1,"call-event-main"],[1,"raw-evidence-details"],[1,"matched-excerpt-label"],[1,"matched-character-count"]],template:function(t,n){t&1&&(s(0,"section",0)(1,"header",1)(2,"div")(3,"p",2),r(4,"Customization evidence "),s(5,"span",3),r(6,"Preview"),i()(),s(7,"h2"),r(8,"Did your rules appear in Copilot requests?"),i(),s(9,"p"),r(10,"Browse local instructions, skills, prompts, hooks, and agents. Preview evidence is based on text visible in imported VS Code model requests."),i()()(),s(11,"section",4)(12,"div",5)(13,"div")(14,"p",6)(15,"strong"),r(16),i(),s(17,"span"),r(18),i(),s(19,"span"),r(20),i()(),s(21,"p"),r(22),i(),s(23,"p",7),r(24),i(),p(25,le,10,6),p(26,de,2,0,"p",8),p(27,ue,2,0,"p",8),i(),s(28,"div",9),p(29,me,2,0,"button",10),p(30,ge,3,4,"button",11),i()()(),s(31,"section",12)(32,"div")(33,"span"),r(34,"Customization files discovered"),i(),s(35,"strong"),r(36),v(37,"number"),i(),b(38,"app-help-popover",13),i(),s(39,"div")(40,"span"),r(41,"Files with evidence"),i(),s(42,"strong"),r(43),v(44,"number"),i(),b(45,"app-help-popover",14),i(),s(46,"div")(47,"span"),r(48,"Sessions containing evidence"),i(),s(49,"strong"),r(50),v(51,"number"),i(),b(52,"app-help-popover",15),i(),s(53,"div")(54,"span"),r(55,"Total evidence matches"),i(),s(56,"strong"),r(57),v(58,"number"),i(),b(59,"app-help-popover",16),i()(),s(60,"section",17)(61,"label",18)(62,"span"),r(63,"Search customizations"),i(),s(64,"input",19),_("ngModelChange",function(l){return n.setQuery(l)}),i()(),s(65,"label")(66,"span"),r(67,"Workspace"),i(),s(68,"select",20),_("ngModelChange",function(l){return n.setWorkspaceFilter(l)}),P(69,Ce,2,2,"option",21,D),i()()(),s(71,"nav",22),P(72,ve,2,4,"button",23,X),i(),s(74,"details",24)(75,"summary")(76,"span"),r(77,"Advanced scan coverage"),i(),s(78,"strong"),r(79),v(80,"number"),v(81,"number"),i()(),p(82,_e,4,1)(83,fe,2,0,"p",25),i(),p(84,je,11,7,"section",26)(85,Ge,7,3,"section",27),i()),t&2&&(a(16),m(n.currentWorkspaceLabel()),a(2),m(n.customizationFileCountLabel()),a(2),m(n.requestTextCountLabel()),a(2),m(n.evidenceResultText()),a(2),m(n.scanRelationshipText()),a(),g(n.isEvidenceScanActive()?25:-1),a(),g(n.isLongRunningScan()?26:-1),a(),g(n.isStaleScan()?27:-1),a(2),g(n.isEvidenceScanActive()?29:-1),a(),g(n.showHeaderScanAction()?30:-1),a(6),m(h(37,25,n.summary().total)),a(2),x("text",n.summaryHelp.files),a(5),m(h(44,27,n.summary().sent)),a(2),x("text",n.summaryHelp.evidence),a(5),m(h(51,29,n.summary().sessions)),a(2),x("text",n.summaryHelp.sessions),a(5),m(h(58,31,n.summary().matches)),a(2),x("text",n.summaryHelp.matches),a(5),x("ngModel",n.query()),a(4),x("ngModel",n.workspaceFilter()),a(),M(n.workspaceOptions()),a(3),M(n.resultFilters),a(7),A(" ",h(80,33,n.scanDiagnostics().roots)," folders/files checked \xB7 ",h(81,35,n.scanDiagnostics().files)," customization",n.scanDiagnostics().files===1?"":"s"," found "),a(3),g(n.scanDiagnostics().locations.length?82:83),a(2),g(n.filteredCustomizations().length?84:85))},dependencies:[U,G,Q,j,K,H,W,B,Y,V,R],styles:['[_nghost-%COMP%]{display:block}.customizations-page[_ngcontent-%COMP%]{display:grid;grid-template-rows:auto auto auto auto auto auto minmax(0,1fr);gap:7px;min-height:calc(100vh - 96px)}.customizations-header[_ngcontent-%COMP%], .customizations-scan-status[_ngcontent-%COMP%], .customizations-controls[_ngcontent-%COMP%], .customizations-diagnostics[_ngcontent-%COMP%], .customizations-summary[_ngcontent-%COMP%], .customizations-filter-chips[_ngcontent-%COMP%], .customizations-list[_ngcontent-%COMP%], .customization-detail[_ngcontent-%COMP%], .customizations-empty[_ngcontent-%COMP%]{border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow-soft)}.customizations-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:14px;border-color:color-mix(in srgb,var(--accent-2) 18%,var(--line));border-radius:13px;padding:10px 12px;background:var(--header-gradient)}.customizations-scan-status[_ngcontent-%COMP%]{display:grid;gap:4px;border-color:color-mix(in srgb,var(--accent) 22%,var(--line));border-radius:10px;padding:7px 9px;background:linear-gradient(135deg,color-mix(in srgb,var(--accent) 6%,transparent),transparent 50%),var(--surface)}.scan-status-body[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px}.scan-status-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:12px;line-height:1.4}.scan-relationship[_ngcontent-%COMP%]{margin-top:3px!important;color:var(--muted-2)!important;font-size:10px!important}.customizations-summary[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;overflow:hidden;border-radius:12px}.customizations-summary[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px 8px;align-items:center;min-height:50px;padding:8px 10px;background:var(--surface)}.customizations-summary[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted);font-size:10px}.customizations-summary[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{grid-row:1 / 3;grid-column:2;color:var(--text-strong);font-size:20px}.scan-summary-line[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:7px;color:var(--muted)!important}.scan-summary-line[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:12px}.scan-summary-line[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;color:var(--muted);font-size:11px}.scan-summary-line[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:before{width:3px;height:3px;border-radius:50%;background:color-mix(in srgb,var(--accent) 62%,var(--muted));content:""}.scan-progress-line[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px;margin-top:3px!important;color:var(--muted-2)!important;font-size:11px!important}.scan-progress-meter[_ngcontent-%COMP%]{display:grid;gap:5px;max-width:460px;margin-top:8px}.scan-progress-meter[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:10px;color:var(--muted);font-size:11px}.scan-progress-meter[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text)}.scan-progress-meter[_ngcontent-%COMP%] progress[_ngcontent-%COMP%]{width:100%;height:7px;overflow:hidden;border:0;border-radius:999px;background:color-mix(in srgb,var(--surface-soft) 70%,transparent)}.scan-progress-meter[_ngcontent-%COMP%] progress[_ngcontent-%COMP%]::-webkit-progress-bar{border-radius:999px;background:color-mix(in srgb,var(--surface-soft) 70%,transparent)}.scan-progress-meter[_ngcontent-%COMP%] progress[_ngcontent-%COMP%]::-webkit-progress-value{border-radius:999px;background:linear-gradient(90deg,var(--accent),var(--accent-2))}.scan-progress-stats[_ngcontent-%COMP%]{margin-top:3px!important;color:var(--text)!important;font-size:11px!important;font-weight:720}.scan-warning[_ngcontent-%COMP%]{margin-top:4px!important;color:var(--warning)!important}.scan-status-actions[_ngcontent-%COMP%]{display:flex;flex:0 0 auto;align-items:center;gap:7px}.eyebrow[_ngcontent-%COMP%], .customization-kicker[_ngcontent-%COMP%]{margin:0;color:var(--muted-2);font-size:9px;font-weight:820;letter-spacing:.08em;text-transform:uppercase}.preview-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;min-height:17px;margin-left:6px;border:1px solid color-mix(in srgb,var(--accent) 42%,var(--line));border-radius:999px;padding:0 7px;background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent-strong, var(--accent));font-size:9px;letter-spacing:.08em}.customizations-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .customization-detail[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .customizations-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:2px 0 0;color:var(--text-strong);letter-spacing:0}.customizations-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:19px;line-height:1.15}.customizations-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .customization-detail-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .customizations-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .evidence-summary[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:3px 0 0;color:var(--muted);font-size:12px;line-height:1.35}.evidence-scan-button[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:30px;border:1px solid color-mix(in srgb,var(--accent) 34%,var(--line));border-radius:999px;padding:6px 11px;background:color-mix(in srgb,var(--accent) 12%,var(--surface));color:var(--accent);font-size:11px;font-weight:780;cursor:pointer}.evidence-scan-button[_ngcontent-%COMP%]:disabled{cursor:wait;opacity:.68}.secondary-scan-button[_ngcontent-%COMP%]{min-height:30px;border:1px solid var(--line);border-radius:999px;padding:6px 11px;background:var(--surface-soft);color:var(--text);font-size:11px;font-weight:760;cursor:pointer}.button-spinner[_ngcontent-%COMP%]{width:12px;height:12px;border:2px solid color-mix(in srgb,var(--accent) 22%,transparent);border-top-color:var(--accent);border-radius:999px;animation:_ngcontent-%COMP%_spin .8s linear infinite}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}.customizations-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(260px,1.8fr) minmax(180px,.8fr);gap:6px;align-items:end;border-radius:12px;padding:7px}.customizations-filter-chips[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;border-radius:12px;padding:6px}.customizations-filter-chips[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{min-height:26px;border:1px solid var(--line);border-radius:999px;padding:4px 9px;background:var(--surface-soft);color:var(--muted);font-size:10px;font-weight:760;cursor:pointer}.customizations-filter-chips[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 48%,var(--line));background:color-mix(in srgb,var(--accent) 12%,var(--surface));color:var(--accent)}.customizations-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:grid;align-content:start;gap:4px;min-height:0}.customizations-controls[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted);font-size:10px;font-weight:760}.customizations-controls[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .customizations-controls[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{width:100%;height:32px;min-height:32px;border:1px solid var(--line);border-radius:8px;padding:6px 9px;background:var(--surface-soft);color:var(--text);font:inherit;font-size:12px}.customizations-diagnostics[_ngcontent-%COMP%]{border-radius:12px;padding:0;overflow:hidden}.customizations-diagnostics[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:34px;padding:8px 10px;color:var(--muted);font-size:11px;font-weight:760;cursor:pointer}.customizations-diagnostics[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--text-strong);font-size:12px}.customizations-diagnostics[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--muted);font-size:11px;font-weight:760}.diagnostic-list[_ngcontent-%COMP%]{display:grid;gap:1px;max-height:240px;overflow:auto;border-top:1px solid var(--line);padding:6px;background:var(--surface-soft)}.diagnostic-list[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:grid;grid-template-columns:110px minmax(0,1fr);gap:8px;align-items:center;min-height:28px;border-radius:7px;padding:5px 7px}.diagnostic-list[_ngcontent-%COMP%] div[_ngcontent-%COMP%]:nth-child(odd){background:color-mix(in srgb,var(--accent) 4%,transparent)}.diagnostic-list[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{color:var(--muted-2);font-size:10px;text-transform:uppercase}.diagnostic-list[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{overflow-wrap:anywhere;color:var(--text);font-size:11px}.diagnostic-note[_ngcontent-%COMP%]{margin:0;border-top:1px solid var(--line);padding:8px 10px;color:var(--muted);font-size:11px;background:var(--surface-soft)}.customizations-workspace[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(300px,var(--results-sidebar-width, 430px)) 8px minmax(0,1fr);gap:0;align-items:start;min-height:0}.results-sidebar-resizer[_ngcontent-%COMP%]{position:sticky;top:66px;height:calc(100vh - 138px);cursor:col-resize;touch-action:none}.results-sidebar-resizer[_ngcontent-%COMP%]:after{display:block;width:2px;height:100%;margin:0 auto;border-radius:999px;background:color-mix(in srgb,var(--line) 82%,transparent);content:""}.results-sidebar-resizer[_ngcontent-%COMP%]:hover:after, .results-sidebar-resizer[_ngcontent-%COMP%]:focus-visible:after, .results-sidebar-resizer.dragging[_ngcontent-%COMP%]:after{background:var(--accent)}.customizations-list[_ngcontent-%COMP%], .customization-detail[_ngcontent-%COMP%], .customizations-empty[_ngcontent-%COMP%]{border-radius:13px}.customizations-list[_ngcontent-%COMP%]{position:sticky;top:66px;display:grid;align-content:start;gap:2px;max-height:calc(100vh - 138px);overflow:auto;padding:6px}.customizations-list-heading[_ngcontent-%COMP%]{position:sticky;top:0;z-index:1;display:flex;align-items:center;justify-content:space-between;min-height:28px;padding:2px 4px 5px;background:var(--surface);color:var(--muted);font-size:11px}.customizations-list-heading[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .customizations-empty[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:7px;padding:5px 8px;background:var(--surface-soft);color:var(--text);font:inherit;font-size:11px;font-weight:760;cursor:pointer}.customization-card[_ngcontent-%COMP%]{display:grid;grid-template-columns:22px minmax(0,1fr) auto;align-items:center;gap:7px;width:100%;min-height:44px;border:1px solid transparent;border-radius:9px;padding:6px 7px;background:transparent;color:var(--text);text-align:left;cursor:pointer}.customization-card[_ngcontent-%COMP%]:hover, .customization-card.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:color-mix(in srgb,var(--accent) 6%,var(--surface-soft))}.customization-card.sent.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 46%,var(--line));background:color-mix(in srgb,var(--accent) 8%,var(--surface-soft))}.customization-card.listed.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent-2) 42%,var(--line));background:color-mix(in srgb,var(--accent-2) 7%,var(--surface-soft))}.customization-card.discovered.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--warning) 38%,var(--line));background:color-mix(in srgb,var(--warning) 7%,var(--surface-soft))}.customization-file-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:22px;height:22px;border-radius:6px;background:color-mix(in srgb,var(--accent) 12%,var(--surface-soft));color:var(--accent);font-size:10px;font-weight:850}.customization-card-main[_ngcontent-%COMP%]{display:grid;gap:1px;min-width:0}.customization-card-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%], .customization-card-side[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .match-group[_ngcontent-%COMP%] time[_ngcontent-%COMP%], .customization-path[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted);font-size:10px;font-style:normal}.customization-card-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{overflow:hidden;color:var(--text-strong);font-size:12px;text-overflow:ellipsis;white-space:nowrap}.customization-card-side[_ngcontent-%COMP%]{display:grid;justify-items:end;gap:3px;color:var(--muted);font-size:10px}.customization-card-side[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{color:var(--accent);font-size:10px}.customization-detail[_ngcontent-%COMP%]{display:grid;align-content:start;gap:9px;min-height:calc(100vh - 138px);padding:10px}.customization-detail-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.customization-detail-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:19px;line-height:1.15}.evidence-badge[_ngcontent-%COMP%], .customization-facts[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px;min-height:27px;border:1px solid var(--line);border-radius:999px;padding:4px 8px;background:var(--surface-soft);color:var(--text);font-size:11px;font-weight:760}.evidence-badge.sent[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 44%,var(--line));background:color-mix(in srgb,var(--accent) 10%,var(--surface-soft));color:var(--accent)}.evidence-badge.listed[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent-2) 44%,var(--line));background:color-mix(in srgb,var(--accent-2) 9%,var(--surface-soft));color:var(--accent-2)}.evidence-badge.discovered[_ngcontent-%COMP%]{color:var(--warning)}.customization-facts[_ngcontent-%COMP%]{display:flex;align-items:flex-start;flex-wrap:wrap;gap:6px}.customization-facts[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{flex:0 0 auto;min-height:24px;padding:3px 8px}.customization-facts[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{color:var(--text-strong)}.evidence-summary[_ngcontent-%COMP%], .match-list[_ngcontent-%COMP%], .customization-path[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:11px;padding:10px;background:var(--surface-soft)}.evidence-summary[_ngcontent-%COMP%]{display:grid;gap:10px}.evidence-summary[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{width:fit-content;color:var(--accent);font-size:11px;font-weight:760}.evidence-checklist[_ngcontent-%COMP%]{display:grid;gap:4px;margin:8px 0 0;padding:0;list-style:none;color:var(--muted);font-size:11px}.evidence-checklist[_ngcontent-%COMP%] .confirmed[_ngcontent-%COMP%]{color:var(--accent)}.evidence-checklist[_ngcontent-%COMP%] .partial[_ngcontent-%COMP%]{color:var(--warning)}.evidence-summary[_ngcontent-%COMP%] h4[_ngcontent-%COMP%], .match-list[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:15px}.evidence-summary[_ngcontent-%COMP%] .description[_ngcontent-%COMP%]{color:var(--text)}.matched-customization-text[_ngcontent-%COMP%]{border-top:1px solid var(--line);padding-top:9px}.match-list[_ngcontent-%COMP%]{display:grid;gap:5px}.match-list[_ngcontent-%COMP%] header[_ngcontent-%COMP%]{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.match-list-help[_ngcontent-%COMP%]{margin:-2px 0 2px;color:var(--muted);font-size:11px;line-height:1.35}.match-group[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:8px;background:var(--surface);overflow:hidden}.match-group.sent[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 34%,var(--line))}.match-group.listed[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent-2) 30%,var(--line))}.match-group.discovered[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--warning) 26%,var(--line))}.match-group[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(240px,1fr) auto;gap:10px;align-items:center;min-height:46px;padding:6px 10px;cursor:pointer}.match-group[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::marker{color:var(--accent)}.match-group-title[_ngcontent-%COMP%]{display:grid;gap:2px;min-width:0}.match-group-title[_ngcontent-%COMP%] time[_ngcontent-%COMP%]{color:var(--muted);font-size:10px}.match-group-title[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{color:var(--text-strong);font-size:11px;line-height:1.2}.match-group-title[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{overflow:hidden;color:var(--muted);font-size:10px;font-style:normal;text-overflow:ellipsis;white-space:nowrap}.match-group-status[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:5px}.match-group-status[_ngcontent-%COMP%]{justify-content:flex-end;min-width:0}.match-group-status[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;min-height:20px;border-radius:999px;padding:2px 7px;background:color-mix(in srgb,var(--accent) 7%,var(--surface-soft));color:var(--muted);font-size:10px;font-weight:720}.match-group-status[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--accent)}.match-group-timeline[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:center;gap:3px;min-width:0}.matched-excerpt-label[_ngcontent-%COMP%], .matched-character-count[_ngcontent-%COMP%]{color:var(--muted-2);font-size:10px;font-weight:760}.timeline-marker[_ngcontent-%COMP%], .timeline-overflow[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;min-width:21px;height:18px;border:1px solid color-mix(in srgb,var(--line) 86%,transparent);border-radius:999px;padding:0 5px;background:color-mix(in srgb,var(--surface-soft) 88%,var(--surface));color:var(--muted);font-size:9px;font-weight:800;line-height:1}.timeline-marker.sent[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 54%,var(--line));background:color-mix(in srgb,var(--accent) 18%,var(--surface));color:var(--accent-strong, var(--accent))}.timeline-marker.listed[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent-2) 42%,var(--line));background:color-mix(in srgb,var(--accent-2) 13%,var(--surface));color:var(--accent-2)}.timeline-marker.discovered[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--warning) 42%,var(--line));background:color-mix(in srgb,var(--warning) 12%,var(--surface));color:var(--warning)}.timeline-overflow[_ngcontent-%COMP%]{max-width:76px;border-style:dashed;white-space:nowrap}.match-group-weak[_ngcontent-%COMP%]{border:1px dashed color-mix(in srgb,var(--muted) 26%,var(--line));border-radius:999px;padding:2px 7px;color:var(--muted);font-size:10px;font-weight:760}.match-group-detail-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--line);padding:8px 10px}.match-group-detail-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:11px}.match-group-detail-header[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{flex:0 0 auto;border:1px solid color-mix(in srgb,var(--accent) 30%,var(--line));border-radius:999px;padding:5px 9px;background:color-mix(in srgb,var(--accent) 8%,var(--surface));color:var(--accent);font-size:10px;font-weight:760;cursor:pointer}.match-events[_ngcontent-%COMP%]{display:grid;gap:1px;border-top:1px solid var(--line);background:var(--surface-soft)}.match-event[_ngcontent-%COMP%]{display:block;min-height:36px;padding:7px 10px}.match-event[_ngcontent-%COMP%] + .match-event[_ngcontent-%COMP%]{border-top:1px solid color-mix(in srgb,var(--line) 70%,transparent)}.call-event-main[_ngcontent-%COMP%]{display:grid;gap:3px;min-width:0}.call-event-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--accent-2);font-size:11px;font-weight:780}.call-event.sent[_ngcontent-%COMP%] .call-event-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--accent-strong, var(--accent))}.call-event-main[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:11px}.call-event-main[_ngcontent-%COMP%] blockquote[_ngcontent-%COMP%]{margin:0;border-left:2px solid color-mix(in srgb,var(--accent) 48%,var(--line));border-radius:6px;padding:4px 8px;background:color-mix(in srgb,var(--surface-soft) 84%,transparent);color:var(--text);font-size:11px;line-height:1.35}.raw-evidence-details[_ngcontent-%COMP%]{margin-top:5px}.raw-evidence-details[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{width:fit-content;color:var(--muted);font-size:10px;font-weight:760;cursor:pointer}.raw-evidence-details[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]:hover{color:var(--text)}.raw-evidence-details[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:grid;gap:5px;margin-top:6px;border:1px solid color-mix(in srgb,var(--line) 82%,transparent);border-radius:8px;padding:7px 8px;background:color-mix(in srgb,var(--surface) 76%,transparent)}.raw-evidence-details[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted);font-size:10px;font-weight:820;letter-spacing:.08em;text-transform:uppercase}.raw-evidence-details[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:10px;line-height:1.35}.raw-evidence-details[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{display:grid;gap:4px;margin:0;padding:0;list-style:none}.raw-evidence-details[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--muted);font-size:11px}.raw-evidence-details[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{border-radius:999px;padding:2px 6px;background:color-mix(in srgb,var(--surface-soft) 80%,transparent);color:var(--muted);font-size:10px}.customization-path[_ngcontent-%COMP%]{display:grid;gap:4px}.customization-path[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{overflow-wrap:anywhere;color:var(--text);font-size:11px}.customizations-empty[_ngcontent-%COMP%]{display:grid;place-items:center;align-self:start;gap:8px;min-height:160px;padding:18px;text-align:center}.customizations-empty[_ngcontent-%COMP%] .evidence-scan-button[_ngcontent-%COMP%]{margin-top:2px}@media(max-width:980px){.customizations-controls[_ngcontent-%COMP%], .customizations-workspace[_ngcontent-%COMP%]{grid-template-columns:1fr}.customizations-list[_ngcontent-%COMP%]{position:static;max-height:420px}.results-sidebar-resizer[_ngcontent-%COMP%]{display:none}}@media(max-width:700px){.customizations-summary[_ngcontent-%COMP%]{grid-template-columns:repeat(2,minmax(0,1fr))}.customizations-header[_ngcontent-%COMP%], .customizations-scan-status[_ngcontent-%COMP%], .customization-detail-header[_ngcontent-%COMP%]{display:grid}.scan-status-grid[_ngcontent-%COMP%]{grid-template-columns:1fr 1fr}.scan-status-body[_ngcontent-%COMP%]{display:grid}.match-group[_ngcontent-%COMP%] summary[_ngcontent-%COMP%], .match-event[_ngcontent-%COMP%]{grid-template-columns:1fr}.match-group-status[_ngcontent-%COMP%]{justify-content:flex-start}.match-group-weak[_ngcontent-%COMP%]{justify-self:start}.match-group-timeline[_ngcontent-%COMP%]{flex-wrap:wrap}}']})};export{J as CustomizationsPageComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as N,d as D}from"./chunk-OS2XPCVW.js";import{a as H}from"./chunk-6AXGMNCK.js";import{$a as _,Ca as g,Da as u,Ea as T,Fa as O,Ga as S,Ha as h,Ia as i,J as E,Ja as n,Ka as k,O as y,Oa as b,P as M,Qa as x,Sa as c,U as I,Ua as z,Va as o,Wa as p,Xa as C,Ya as P,Z as f,_a as d,ab as w,db as v,ka as l,nb as V,ob as B,sa as F,sb as R,tb as j,ub as q,vb as $,wb as A,xb as L,yb as K,zb as W}from"./chunk-WOIYAEKB.js";var G=(r,t)=>t.id;function U(r,t){if(r&1&&(i(0,"option",15),o(1),n()),r&2){let e=t.$implicit;h("value",e),l(),p(e==="all"?"All workspaces":e)}}function J(r,t){if(r&1){let e=b();i(0,"button",24),x("click",function(){y(e);let s=c(2);return M(s.resetFilters())}),o(1,"Reset"),n()}}function X(r,t){if(r&1&&(i(0,"em"),o(1),d(2,"number"),n()),r&2){let e=c().$implicit;l(),P(" ",_(2,2,e.recalls==null?null:e.recalls.length)," ",(e.recalls==null?null:e.recalls.length)===1?"read":"reads"," ")}}function Y(r,t){if(r&1&&(i(0,"time"),o(1),d(2,"date"),n()),r&2){let e=c().$implicit;l(),p(w(2,1,e.modifiedAt,"MMM d"))}}function Z(r,t){if(r&1){let e=b();i(0,"button",25),x("click",function(){let s=y(e).$implicit,m=c(2);return M(m.selectMemory(s))}),i(1,"span",26),o(2),n(),i(3,"span",27)(4,"small"),o(5),n(),i(6,"strong"),o(7),n()(),i(8,"span",28)(9,"b"),o(10),n(),g(11,X,3,4,"em")(12,Y,3,4,"time"),n()()}if(r&2){let e=t.$implicit,a=c(2);z("active",a.selectedMemory().id===e.id)("plan",e.kind==="plan"),l(2),C(" ",e.kind==="plan"?"P":"M"," "),l(3),p(a.fileName(e)),l(2),p(e.title),l(3),p(e.kind==="plan"?"Plan":a.scopeLabel(e.scope)),l(),u(e.recalls!=null&&e.recalls.length?11:12)}}function ee(r,t){if(r&1){let e=b();i(0,"button",24),x("click",function(){y(e);let s=c(2),m=c(2);return M(m.emitOpenSession(s))}),o(1),n()}if(r&2){let e=c();l(),C(" Created in: ",e.title," ")}}function te(r,t){if(r&1&&(i(0,"span"),o(1),n()),r&2){let e=c();l(),C("Created in: ",e.title)}}function ne(r,t){if(r&1&&g(0,ee,2,1,"button",20)(1,te,2,1,"span"),r&2){let e=c(3);u(e.canOpenSession?0:1)}}function oe(r,t){if(r&1&&(i(0,"span"),o(1),n()),r&2){let e=c();l(),C("Session ",e.sessionId.slice(0,8))}}function ie(r,t){if(r&1&&(i(0,"p",35),o(1),n()),r&2){let e=c(3);l(),p(e.actionStatus())}}function re(r,t){if(r&1){let e=b();i(0,"button",24),x("click",function(){y(e);let s=c(2).$implicit,m=c(4);return M(m.emitRecallSession(s.sessionId))}),o(1),n()}if(r&2){let e=c();l(),C(" ",e.title," ")}}function ae(r,t){if(r&1&&(i(0,"span"),o(1),n()),r&2){let e=c();l(),p(e.title)}}function le(r,t){if(r&1&&g(0,re,2,1,"button",20)(1,ae,2,1,"span"),r&2){let e=c(5);u(e.canOpenSession?0:1)}}function se(r,t){if(r&1&&(i(0,"span"),o(1),n()),r&2){let e=c().$implicit;l(),C("Session ",e.sessionId.slice(0,8))}}function ce(r,t){if(r&1&&(o(0),d(1,"number")),r&2){let e=c();C(" \xB7 ",_(1,1,e.cachedInputTokens)," cached ")}}function me(r,t){if(r&1&&(i(0,"span"),o(1),d(2,"number"),g(3,ce,2,3),n()),r&2){let e=t,a=c().$implicit,s=c(4);l(),P(" ",s.recallRequestLabel(a)," \xB7 ",_(2,3,e.inputTokens)," input "),l(2),u(e.cachedInputTokens?3:-1)}}function pe(r,t){if(r&1&&(i(0,"article",41)(1,"div")(2,"time"),o(3),d(4,"date"),n(),g(5,le,2,1)(6,se,2,1,"span"),n(),i(7,"div",43)(8,"span"),o(9),d(10,"number"),n(),g(11,me,4,5,"span"),n()()),r&2){let e,a,s=t.$implicit,m=c(4);l(3),p(w(4,4,s.timestamp,"medium")),l(2),u((e=m.recallSession(s.sessionId))?5:6,e),l(4),C("",_(10,7,s.returnedCharacterCount)," characters loaded"),l(2),u((a=s.followingModelCall)?11:-1,a)}}function de(r,t){if(r&1&&(i(0,"section",36)(1,"header")(2,"div")(3,"span",30),o(4,"Observed use"),n(),i(5,"h4"),o(6),d(7,"number"),n()(),i(8,"p"),o(9,"These are explicit memory reads recorded by VS Code."),n()(),i(10,"div",40),O(11,pe,12,9,"article",41,G),n(),i(13,"p",42),o(14," Request totals include the complete prompt and context, not only this memory. "),n()()),r&2){let e=c();l(6),P(" Read ",_(7,2,e.recalls==null?null:e.recalls.length)," ",(e.recalls==null?null:e.recalls.length)===1?"time":"times"," "),l(5),S(e.recalls)}}function _e(r,t){if(r&1){let e=b();i(0,"article",23)(1,"header",29)(2,"div")(3,"span",30),o(4),n(),i(5,"h3"),o(6),n(),i(7,"p"),o(8),d(9,"date"),n()(),i(10,"div",31)(11,"button",24),x("click",function(){let s=y(e),m=c(2);return M(m.copyContent(s))}),o(12,"Copy"),n(),i(13,"button",24),x("click",function(){let s=y(e),m=c(2);return M(m.runMemoryAction(s,"open"))}),o(14,"Open file"),n(),i(15,"button",24),x("click",function(){let s=y(e),m=c(2);return M(m.runMemoryAction(s,"reveal"))}),o(16,"Show in folder"),n(),i(17,"button",24),x("click",function(){let s=y(e),m=c(2);return M(m.copyPath(s))}),o(18,"Copy path"),n()()(),i(19,"div",32)(20,"span",33)(21,"b"),o(22),n(),o(23," scope "),k(24,"app-help-popover",34),n(),i(25,"span")(26,"b"),o(27),d(28,"number"),n(),o(29," characters"),n(),i(30,"span")(31,"b"),o(32),d(33,"number"),n(),o(34," lines"),n(),i(35,"span")(36,"b"),o(37),n()(),g(38,ne,2,1)(39,oe,2,1,"span"),n(),g(40,ie,2,1,"p",35),g(41,de,15,4,"section",36),i(42,"details",37)(43,"summary")(44,"span"),o(45,"Markdown source"),n(),i(46,"small"),o(47),d(48,"number"),d(49,"number"),n()(),i(50,"pre",38),o(51),n()(),i(52,"footer",39)(53,"span"),o(54,"Local file"),n(),i(55,"code"),o(56),n()()()}if(r&2){let e,a=t,s=c(2);l(4),C(" ",a.kind==="plan"?"Saved plan":s.scopeLabel(a.scope)+" memory"," "),l(2),p(a.title),l(2),P(" ",a.workspace||"Available across workspaces"," \xB7 updated ",w(9,16,a.modifiedAt,"medium")," "),l(14),p(s.scopeLabel(a.scope)),l(2),h("text",s.scopeHelp(a.scope)),l(3),p(_(28,19,a.characterCount)),l(5),p(_(33,21,a.lineCount)),l(5),p(s.fileName(a)),l(),u((e=s.linkedSession(a))?38:a.sessionId?39:-1,e),l(2),u(s.actionStatus()?40:-1),l(),u(a.recalls!=null&&a.recalls.length?41:-1),l(6),P("",_(48,23,a.lineCount)," lines \xB7 ",_(49,25,a.characterCount)," characters"),l(4),p(a.content),l(5),p(a.sourcePath)}}function ge(r,t){if(r&1&&(i(0,"section",16)(1,"aside",18)(2,"div",19)(3,"span"),o(4),d(5,"number"),n(),g(6,J,2,0,"button",20),n(),O(7,Z,13,9,"button",21,G),n(),k(9,"div",22),g(10,_e,57,27,"article",23),n()),r&2){let e,a=c();l(4),C("",_(5,5,a.filteredMemories().length)," shown"),l(2),u(a.query()||a.scopeFilter()!=="all"||a.kindFilter()!=="all"||a.workspaceFilter()!=="all"?6:-1),l(),S(a.filteredMemories()),l(2),h("resizableMin",280)("resizableDefault",380),l(),u((e=a.selectedMemory())?10:-1,e)}}function ue(r,t){if(r&1){let e=b();i(0,"button",24),x("click",function(){y(e);let s=c(2);return M(s.resetFilters())}),o(1,"Reset filters"),n()}}function xe(r,t){if(r&1&&(i(0,"section",17)(1,"h3"),o(2),n(),i(3,"p"),o(4),n(),g(5,ue,2,0,"button",20),n()),r&2){let e=c();l(2),p(e.memoriesInput().length?"No memories match these filters":"No Copilot memories found"),l(2),C(" ",e.memoriesInput().length?"Try a broader search or reset the filters.":"Create a saved memory or plan in VS Code, then refresh the local scan."," "),l(),u(e.memoriesInput().length?5:-1)}}var Q=class r{http=E(N);memoriesInput=f([]);sessionsInput=f([]);query=f("");scopeFilter=f("all");kindFilter=f("all");workspaceFilter=f("all");selectedId=f(null);actionStatus=f("");set memories(t){let e=t??[];this.memoriesInput.set(e),(!this.selectedId()||!e.some(a=>a.id===this.selectedId()))&&this.selectedId.set(e[0]?.id??null)}set sessions(t){this.sessionsInput.set(t??[])}canOpenSession=!0;openSession=new I;workspaceOptions=v(()=>["all",...[...new Set(this.memoriesInput().map(t=>t.workspace).filter(Boolean))].sort()]);filteredMemories=v(()=>{let t=this.query().trim().toLowerCase();return this.memoriesInput().filter(e=>(!t||[e.title,e.excerpt,e.content,e.relativePath,e.sourcePath,this.fileName(e),e.workspace,e.scope,e.kind].join(" ").toLowerCase().includes(t))&&(this.scopeFilter()==="all"||e.scope===this.scopeFilter())&&(this.kindFilter()==="all"||e.kind===this.kindFilter())&&(this.workspaceFilter()==="all"||e.workspace===this.workspaceFilter()))});selectedMemory=v(()=>{let t=this.filteredMemories();return t.find(e=>e.id===this.selectedId())??t[0]??null});summary=v(()=>{let t=this.memoriesInput();return{total:t.length,plans:t.filter(e=>e.kind==="plan").length,recalls:t.reduce((e,a)=>e+(a.recalls?.length??0),0),repositories:new Set(t.map(e=>e.workspace).filter(Boolean)).size}});recallSession(t){return this.sessionsInput().find(e=>e.id===t)??null}emitRecallSession(t){let e=this.recallSession(t);this.canOpenSession&&e&&this.openSession.emit(e)}recallRequestLabel(t){let e=t.followingModelCall?.number,a=e?`request ${e}`:"request";return t.sourceLog==="main.jsonl"?`Before model ${a}`:`Before subagent model ${a}`}selectMemory(t){this.selectedId.set(t.id),this.actionStatus.set("")}setScopeFilter(t){this.scopeFilter.set(t),this.actionStatus.set(""),this.ensureVisibleSelection()}setKindFilter(t){this.kindFilter.set(t),this.actionStatus.set(""),this.ensureVisibleSelection()}setWorkspaceFilter(t){this.workspaceFilter.set(t),this.actionStatus.set(""),this.ensureVisibleSelection()}setQuery(t){this.query.set(t),this.actionStatus.set(""),this.ensureVisibleSelection()}resetFilters(){this.query.set(""),this.scopeFilter.set("all"),this.kindFilter.set("all"),this.workspaceFilter.set("all"),this.ensureVisibleSelection()}fileName(t){return(t.relativePath||t.sourcePath).split(/[\\/]+/).filter(Boolean).at(-1)??t.title}scopeHelp(t){return{session:"Session-scoped memory is tied to one Copilot session. It is useful for saved plans or temporary research from that run.",repository:"Repository memory is saved for a workspace repository and can be available to future Copilot sessions in that workspace.",workspace:"Workspace memory belongs to this VS Code workspace but is not clearly tied to one repository or session.",global:"Global memory is stored in VS Code user storage and can apply across workspaces on this machine."}[t]}ensureVisibleSelection(){let t=this.filteredMemories();if(!t.length){this.selectedId.set(null);return}t.some(e=>e.id===this.selectedId())||this.selectedId.set(t[0].id)}linkedSession(t){return t.sessionId?this.sessionsInput().find(e=>e.id===t.sessionId)??null:null}emitOpenSession(t){let e=this.linkedSession(t);this.canOpenSession&&e&&this.openSession.emit(e)}runMemoryAction(t,e){this.actionStatus.set(e==="open"?"Opening file\u2026":"Showing file\u2026"),this.http.post(D(`/api/memories/${t.id}/open`),{action:e}).subscribe({next:()=>this.actionStatus.set(e==="open"?"Opened file":"Shown in folder"),error:()=>this.actionStatus.set("File actions require the local runtime")})}async copyPath(t){try{await globalThis.navigator?.clipboard?.writeText(t.sourcePath),this.actionStatus.set("Path copied")}catch{this.actionStatus.set("Could not copy the path")}}async copyContent(t){try{await globalThis.navigator?.clipboard?.writeText(t.content),this.actionStatus.set("Memory copied")}catch{this.actionStatus.set("Could not copy the memory")}}scopeLabel(t){return{global:"Global",repository:"Repository",session:"Session",workspace:"Workspace"}[t]}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=F({type:r,selectors:[["app-memory-page"]],inputs:{memories:"memories",sessions:"sessions",canOpenSession:"canOpenSession"},outputs:{openSession:"openSession"},decls:69,vars:17,consts:[[1,"memory-page"],[1,"memory-header"],[1,"eyebrow"],["aria-label","Memory summary",1,"memory-header-meta"],["aria-label","Memory filters",1,"memory-controls"],[1,"memory-search"],["type","search","placeholder","Search title, filename, content, or path",3,"ngModelChange","ngModel"],[3,"ngModelChange","ngModel"],["value","all"],["value","memory"],["value","plan"],["value","global"],["value","repository"],["value","session"],["value","workspace"],[3,"value"],[1,"memory-workspace"],[1,"memory-empty"],["aria-label","Saved memories",1,"memory-list"],[1,"memory-list-heading"],["type","button"],["type","button",1,"memory-card",3,"active","plan"],["appResizableSidebar","copilot-usage-studio.results-sidebar-width",1,"results-sidebar-resizer",3,"resizableMin","resizableDefault"],[1,"memory-detail"],["type","button",3,"click"],["type","button",1,"memory-card",3,"click"],["aria-hidden","true",1,"memory-file-icon"],[1,"memory-card-main"],[1,"memory-card-side"],[1,"memory-detail-header"],[1,"memory-kicker"],[1,"memory-actions"],[1,"memory-facts"],[1,"scope-fact"],["label","Explain memory scope",3,"text"],["aria-live","polite",1,"memory-action-status"],["aria-label","Observed memory use",1,"memory-recalls"],[1,"memory-source"],[1,"memory-content"],[1,"memory-path"],[1,"memory-recall-list"],[1,"memory-recall-row"],[1,"memory-recall-note"],[1,"memory-recall-facts"]],template:function(e,a){e&1&&(i(0,"section",0)(1,"header",1)(2,"div")(3,"p",2),o(4,"Copilot memory"),n(),i(5,"h2"),o(6,"What Copilot remembers"),n(),i(7,"p"),o(8,"Saved plans and memories from local VS Code Copilot storage."),n()(),i(9,"div",3)(10,"span")(11,"strong"),o(12),d(13,"number"),n(),o(14," files"),n(),i(15,"span")(16,"strong"),o(17),d(18,"number"),n(),o(19," plans"),n(),i(20,"span")(21,"strong"),o(22),d(23,"number"),n(),o(24," reads"),n(),i(25,"span")(26,"strong"),o(27),d(28,"number"),n(),o(29," workspaces"),n(),i(30,"b"),o(31,"Read-only"),n()()(),i(32,"section",4)(33,"label",5)(34,"span"),o(35,"Search memories"),n(),i(36,"input",6),x("ngModelChange",function(m){return a.setQuery(m)}),n()(),i(37,"label")(38,"span"),o(39,"Type"),n(),i(40,"select",7),x("ngModelChange",function(m){return a.setKindFilter(m)}),i(41,"option",8),o(42,"Memories and plans"),n(),i(43,"option",9),o(44,"Memories"),n(),i(45,"option",10),o(46,"Plans"),n()()(),i(47,"label")(48,"span"),o(49,"Scope"),n(),i(50,"select",7),x("ngModelChange",function(m){return a.setScopeFilter(m)}),i(51,"option",8),o(52,"All scopes"),n(),i(53,"option",11),o(54,"Global"),n(),i(55,"option",12),o(56,"Repository"),n(),i(57,"option",13),o(58,"Session"),n(),i(59,"option",14),o(60,"Workspace"),n()()(),i(61,"label")(62,"span"),o(63,"Workspace"),n(),i(64,"select",7),x("ngModelChange",function(m){return a.setWorkspaceFilter(m)}),O(65,U,2,2,"option",15,T),n()()(),g(67,ge,11,7,"section",16)(68,xe,6,3,"section",17),n()),e&2&&(l(12),p(_(13,9,a.summary().total)),l(5),p(_(18,11,a.summary().plans)),l(5),p(_(23,13,a.summary().recalls)),l(5),p(_(28,15,a.summary().repositories)),l(9),h("ngModel",a.query()),l(4),h("ngModel",a.kindFilter()),l(10),h("ngModel",a.scopeFilter()),l(14),h("ngModel",a.workspaceFilter()),l(),S(a.workspaceOptions()),l(2),u(a.filteredMemories().length?67:68))},dependencies:[W,L,K,j,A,q,$,R,H,V,B],styles:['[_nghost-%COMP%]{display:block}.memory-page[_ngcontent-%COMP%]{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:8px;min-height:calc(100vh - 96px)}.memory-header[_ngcontent-%COMP%], .memory-controls[_ngcontent-%COMP%], .memory-list[_ngcontent-%COMP%], .memory-detail[_ngcontent-%COMP%], .memory-empty[_ngcontent-%COMP%]{border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow-soft)}.memory-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:14px;border-color:color-mix(in srgb,var(--accent-2) 18%,var(--line));border-radius:14px;padding:12px 14px;background:var(--header-gradient)}.eyebrow[_ngcontent-%COMP%], .memory-kicker[_ngcontent-%COMP%]{margin:0;color:var(--muted-2);font-size:9px;font-weight:820;letter-spacing:.08em;text-transform:uppercase}.memory-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%], .memory-detail[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], .memory-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:2px 0 0;color:var(--text-strong);letter-spacing:0}.memory-header[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:21px;line-height:1.15}.memory-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .memory-detail-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .memory-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:4px 0 0;color:var(--muted);font-size:12px;line-height:1.35}.memory-header-meta[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:5px}.memory-header-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .memory-header-meta[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{display:inline-flex;align-items:center;min-height:24px;border:1px solid var(--line);border-radius:999px;padding:3px 8px;background:color-mix(in srgb,var(--surface) 74%,transparent);color:var(--muted);font-size:11px;font-weight:720;white-space:nowrap}.memory-header-meta[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{margin-right:4px;color:var(--text-strong)}.memory-header-meta[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 28%,var(--line));color:var(--accent)}.memory-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(260px,1.8fr) repeat(3,minmax(130px,.8fr));gap:7px;border-radius:12px;padding:8px}.memory-controls[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{display:grid;gap:4px}.memory-controls[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted);font-size:10px;font-weight:760}.memory-controls[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .memory-controls[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{width:100%;min-height:32px;border:1px solid var(--line);border-radius:8px;padding:6px 9px;background:var(--surface-soft);color:var(--text);font:inherit;font-size:12px}.memory-workspace[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(280px,var(--results-sidebar-width, 380px)) 8px minmax(0,1fr);gap:0;align-items:start;min-height:0}.results-sidebar-resizer[_ngcontent-%COMP%]{position:sticky;top:70px;height:calc(100vh - 150px);cursor:col-resize;touch-action:none}.results-sidebar-resizer[_ngcontent-%COMP%]:after{display:block;width:2px;height:100%;margin:0 auto;border-radius:999px;background:color-mix(in srgb,var(--line) 82%,transparent);content:""}.results-sidebar-resizer[_ngcontent-%COMP%]:hover:after, .results-sidebar-resizer[_ngcontent-%COMP%]:focus-visible:after, .results-sidebar-resizer.dragging[_ngcontent-%COMP%]:after{background:var(--accent)}.memory-list[_ngcontent-%COMP%], .memory-detail[_ngcontent-%COMP%], .memory-empty[_ngcontent-%COMP%]{border-radius:13px}.memory-list[_ngcontent-%COMP%]{position:sticky;top:70px;display:grid;align-content:start;gap:3px;max-height:calc(100vh - 150px);overflow:auto;padding:7px}.memory-list-heading[_ngcontent-%COMP%]{position:sticky;top:0;z-index:1;display:flex;align-items:center;justify-content:space-between;min-height:28px;padding:2px 4px 5px;background:var(--surface);color:var(--muted);font-size:11px}.memory-list-heading[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .memory-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .memory-facts[_ngcontent-%COMP%] button[_ngcontent-%COMP%], .memory-empty[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{border:1px solid var(--line);border-radius:7px;padding:5px 8px;background:var(--surface-soft);color:var(--text);font:inherit;font-size:11px;font-weight:760;cursor:pointer}.memory-card[_ngcontent-%COMP%]{display:grid;grid-template-columns:22px minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-height:47px;border:1px solid transparent;border-radius:8px;padding:7px 8px;background:transparent;color:var(--text);text-align:left;cursor:pointer}.memory-card[_ngcontent-%COMP%]:hover, .memory-card.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent) 34%,var(--line));background:color-mix(in srgb,var(--accent) 6%,var(--surface-soft))}.memory-card.plan.active[_ngcontent-%COMP%]{border-color:color-mix(in srgb,var(--accent-2) 42%,var(--line));background:color-mix(in srgb,var(--accent-2) 7%,var(--surface-soft))}.memory-file-icon[_ngcontent-%COMP%]{display:grid;place-items:center;width:22px;height:22px;border-radius:6px;background:color-mix(in srgb,var(--accent) 12%,var(--surface-soft));color:var(--accent);font-size:10px;font-weight:850}.memory-card.plan[_ngcontent-%COMP%] .memory-file-icon[_ngcontent-%COMP%]{background:color-mix(in srgb,var(--accent-2) 14%,var(--surface-soft));color:var(--accent-2)}.memory-card-main[_ngcontent-%COMP%], .memory-card-side[_ngcontent-%COMP%]{display:grid;gap:2px;min-width:0}.memory-card-main[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{overflow:hidden;color:var(--text-strong);font-size:13px;font-weight:760;line-height:1.22;text-overflow:ellipsis;white-space:nowrap}.memory-card-main[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{overflow:hidden;color:var(--muted-2);font-size:10px;line-height:1.15;text-overflow:ellipsis;white-space:nowrap}.memory-card-side[_ngcontent-%COMP%]{justify-items:end;color:var(--muted-2);font-size:10px;white-space:nowrap}.memory-card-side[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{color:var(--muted);font-size:10px;text-transform:uppercase}.memory-card-side[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{border-radius:999px;padding:2px 6px;background:color-mix(in srgb,var(--accent) 10%,var(--surface));color:var(--accent);font-style:normal;font-weight:760}.memory-detail[_ngcontent-%COMP%]{min-width:0;padding:14px}.memory-detail-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:14px}.memory-detail[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:20px;line-height:1.2}.memory-actions[_ngcontent-%COMP%], .memory-facts[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:6px}.memory-actions[_ngcontent-%COMP%]{justify-content:flex-end}.memory-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:first-child{border-color:var(--accent);background:var(--accent);color:#fff}.memory-facts[_ngcontent-%COMP%]{margin-top:10px}.memory-facts[_ngcontent-%COMP%] > span[_ngcontent-%COMP%], .memory-facts[_ngcontent-%COMP%] > button[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px;min-height:25px;border:1px solid var(--line);border-radius:999px;padding:4px 8px;background:var(--surface-soft);color:var(--muted);font-size:11px}.memory-facts[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{color:var(--text-strong)}.memory-facts[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--accent)}.memory-action-status[_ngcontent-%COMP%]{margin:9px 0 0;color:var(--accent);font-size:11px}.memory-recalls[_ngcontent-%COMP%]{display:grid;gap:8px;margin-top:12px;border:1px solid color-mix(in srgb,var(--accent) 22%,var(--line));border-radius:10px;padding:10px;background:color-mix(in srgb,var(--accent) 4%,var(--surface-soft))}.memory-recalls[_ngcontent-%COMP%] > header[_ngcontent-%COMP%]{display:flex;align-items:end;justify-content:space-between;gap:10px}.memory-recalls[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:2px 0 0;color:var(--text-strong);font-size:14px}.memory-recalls[_ngcontent-%COMP%] > header[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .memory-recall-note[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:11px}.memory-recall-list[_ngcontent-%COMP%]{display:grid;gap:5px}.memory-recall-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(180px,.8fr) minmax(230px,1.2fr);gap:10px;border-top:1px solid var(--line);padding-top:7px}.memory-recall-row[_ngcontent-%COMP%] > div[_ngcontent-%COMP%], .memory-recall-facts[_ngcontent-%COMP%]{display:grid;gap:2px}.memory-recall-row[_ngcontent-%COMP%] time[_ngcontent-%COMP%], .memory-recall-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted);font-size:11px}.memory-recall-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:fit-content;border:0;padding:0;background:none;color:var(--accent);font:inherit;font-size:12px;font-weight:760;text-align:left;cursor:pointer}.memory-source[_ngcontent-%COMP%]{margin-top:12px;border:1px solid var(--line);border-radius:10px;background:var(--surface-soft)}.memory-source[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:38px;padding:8px 11px;color:var(--text-strong);cursor:pointer;list-style:none}.memory-source[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::-webkit-details-marker{display:none}.memory-source[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]:before{content:"";flex:0 0 auto;width:7px;height:7px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(-45deg);transition:transform .14s ease}.memory-source[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]:before{transform:rotate(45deg)}.memory-source[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{flex:1;font-size:12px;font-weight:780}.memory-source[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{color:var(--muted);font-size:11px}.memory-content[_ngcontent-%COMP%]{max-height:48vh;margin:0;border-top:1px solid var(--line);padding:14px;overflow:auto;color:var(--text);font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:12px;line-height:1.58;white-space:pre-wrap;overflow-wrap:anywhere}.memory-path[_ngcontent-%COMP%]{display:grid;gap:4px;margin-top:10px;color:var(--muted-2);font-size:10px;text-transform:uppercase}.memory-path[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;border:1px solid var(--line);border-radius:8px;padding:7px 9px;background:var(--surface-soft);color:var(--muted);font-size:11px;text-transform:none;overflow-wrap:anywhere;-webkit-user-select:text;user-select:text}.memory-empty[_ngcontent-%COMP%]{display:grid;justify-items:start;padding:28px}@media(max-width:1050px){.memory-controls[_ngcontent-%COMP%]{grid-template-columns:repeat(2,minmax(0,1fr))}.memory-search[_ngcontent-%COMP%]{grid-column:1 / -1}}@media(max-width:820px){.memory-page[_ngcontent-%COMP%]{min-height:auto}.memory-detail-header[_ngcontent-%COMP%]{display:grid}.memory-workspace[_ngcontent-%COMP%]{grid-template-columns:1fr}.memory-header[_ngcontent-%COMP%]{align-items:flex-start;padding:10px}.memory-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:none}.memory-header-meta[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,max-content);justify-content:end;gap:4px}.memory-header-meta[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .memory-header-meta[_ngcontent-%COMP%] b[_ngcontent-%COMP%]{min-height:21px;padding:2px 6px;font-size:10px}.memory-controls[_ngcontent-%COMP%]{grid-template-columns:repeat(3,minmax(0,1fr))}.memory-search[_ngcontent-%COMP%]{grid-column:1 / -1}.memory-list[_ngcontent-%COMP%]{position:static;max-height:420px}.results-sidebar-resizer[_ngcontent-%COMP%]{display:none}.memory-actions[_ngcontent-%COMP%]{justify-content:flex-start}.memory-recalls[_ngcontent-%COMP%] > header[_ngcontent-%COMP%], .memory-recall-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr}}@media(max-width:480px){.memory-header[_ngcontent-%COMP%]{display:grid}.memory-header-meta[_ngcontent-%COMP%]{justify-content:start}.memory-controls[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .memory-controls[_ngcontent-%COMP%] select[_ngcontent-%COMP%]{padding-inline:6px;font-size:11px}.memory-controls[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:9px}}']})};export{Q as MemoryPageComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as c,b as l}from"./chunk-WOIYAEKB.js";var u={version:"github-copilot-usage-pricing-2026-07-13",sourceUrl:"https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing",sourceLabel:"GitHub Docs: Models and pricing for GitHub Copilot",snapshotDate:"2026-07-13",importedAt:"2026-07-13",fallbackModel:"GPT-5.4",models:{"GPT-5 mini":{provider:"OpenAI",releaseStatus:"GA",category:"Lightweight",input:.25,cachedInput:.025,output:2},"GPT-5.3-Codex":{provider:"OpenAI",releaseStatus:"GA",category:"Powerful",input:1.75,cachedInput:.175,output:14},"GPT-5.4":{provider:"OpenAI",releaseStatus:"GA",category:"Versatile",input:2.5,cachedInput:.25,output:15,tierLabel:"Default",tierThresholdLabel:"Up to 272K input tokens",tiers:[{id:"long-context",label:"Long context",thresholdInputTokensExclusive:272e3,thresholdLabel:"Over 272K input tokens",input:5,cachedInput:.5,output:22.5}]},"GPT-5.4 mini":{provider:"OpenAI",releaseStatus:"GA",category:"Lightweight",input:.75,cachedInput:.075,output:4.5},"GPT-5.4 nano":{provider:"OpenAI",releaseStatus:"GA",category:"Lightweight",input:.2,cachedInput:.02,output:1.25},"GPT-5.5":{provider:"OpenAI",releaseStatus:"GA",category:"Powerful",input:5,cachedInput:.5,output:30,tierLabel:"Default",tierThresholdLabel:"Up to 272K input tokens",tiers:[{id:"long-context",label:"Long context",thresholdInputTokensExclusive:272e3,thresholdLabel:"Over 272K input tokens",input:10,cachedInput:1,output:45}]},"GPT-5.6 Luna":{provider:"OpenAI",releaseStatus:"GA",category:"Lightweight",input:1,cachedInput:.1,output:6,tierLabel:"Default",tierThresholdLabel:"Up to 200K input tokens",tiers:[{id:"long-context",label:"Long context",thresholdInputTokensExclusive:2e5,thresholdLabel:"Over 200K input tokens",input:2,cachedInput:.2,output:9}]},"GPT-5.6 Sol":{provider:"OpenAI",releaseStatus:"GA",category:"Powerful",input:5,cachedInput:.5,output:30,tierLabel:"Default",tierThresholdLabel:"Up to 272K input tokens",tiers:[{id:"long-context",label:"Long context",thresholdInputTokensExclusive:272e3,thresholdLabel:"Over 272K input tokens",input:10,cachedInput:1,output:45}]},"GPT-5.6 Terra":{provider:"OpenAI",releaseStatus:"GA",category:"Versatile",input:2.5,cachedInput:.25,output:15,tierLabel:"Default",tierThresholdLabel:"Up to 272K input tokens",tiers:[{id:"long-context",label:"Long context",thresholdInputTokensExclusive:272e3,thresholdLabel:"Over 272K input tokens",input:5,cachedInput:.5,output:22.5}]},"Claude Haiku 4.5":{provider:"Anthropic",releaseStatus:"GA",category:"Versatile",input:1,cachedInput:.1,cacheWrite:1.25,output:5},"Claude Sonnet 4":{provider:"Anthropic",releaseStatus:"GA",category:"Versatile",input:3,cachedInput:.3,cacheWrite:3.75,output:15},"Claude Sonnet 4.5":{provider:"Anthropic",releaseStatus:"GA",category:"Versatile",input:3,cachedInput:.3,cacheWrite:3.75,output:15},"Claude Sonnet 4.6":{provider:"Anthropic",releaseStatus:"GA",category:"Versatile",input:3,cachedInput:.3,cacheWrite:3.75,output:15},"Claude Opus 4.5":{provider:"Anthropic",releaseStatus:"GA",category:"Powerful",input:5,cachedInput:.5,cacheWrite:6.25,output:25},"Claude Opus 4.6":{provider:"Anthropic",releaseStatus:"GA",category:"Powerful",input:5,cachedInput:.5,cacheWrite:6.25,output:25},"Claude Opus 4.7":{provider:"Anthropic",releaseStatus:"GA",category:"Powerful",input:5,cachedInput:.5,cacheWrite:6.25,output:25},"Claude Opus 4.8":{provider:"Anthropic",releaseStatus:"GA",category:"Powerful",input:5,cachedInput:.5,cacheWrite:6.25,output:25},"Claude Sonnet 5":{provider:"Anthropic",releaseStatus:"GA",category:"Versatile",input:2,cachedInput:.2,cacheWrite:2.5,output:10,note:"GitHub documents this promotional pricing through August 31, 2026."},"Claude Opus 4.8 (fast mode)":{provider:"Anthropic",releaseStatus:"GA",category:"Powerful",input:10,cachedInput:1,cacheWrite:12.5,output:50,aliases:["Claude Opus 4.8 fast","claude-opus-4.8-fast"],note:"GitHub's table includes '(preview)' in the model label."},"Claude Fable 5":{provider:"Anthropic",releaseStatus:"GA",category:"Powerful",input:10,cachedInput:1,cacheWrite:12.5,output:50},"Gemini 2.5 Pro":{provider:"Google",releaseStatus:"GA",category:"Powerful",input:1.25,cachedInput:.125,output:10},"Gemini 3 Flash":{provider:"Google",releaseStatus:"Public preview",category:"Lightweight",input:.5,cachedInput:.05,output:3},"Gemini 3.1 Pro":{provider:"Google",releaseStatus:"Public preview",category:"Powerful",input:2,cachedInput:.2,output:12,tierLabel:"Default",tierThresholdLabel:"Up to 200K input tokens",tiers:[{id:"long-context",label:"Long context",thresholdInputTokensExclusive:2e5,thresholdLabel:"Over 200K input tokens",input:4,cachedInput:.4,output:18}]},"Gemini 3.5 Flash":{provider:"Google",releaseStatus:"GA",category:"Lightweight",input:1.5,cachedInput:.15,output:9},"Raptor mini":{provider:"Fine-tuned (GitHub)",releaseStatus:"GA",category:"Versatile",input:.25,cachedInput:.025,output:2},"MAI-Code-1-Flash":{provider:"Microsoft",releaseStatus:"GA",category:"Lightweight",input:.75,cachedInput:.075,output:4.5},"Kimi K2.7 Code":{provider:"Moonshot AI",releaseStatus:"GA",category:"Versatile",input:.95,cachedInput:.19,output:4}}};var C=u.version,U=u.sourceUrl,M=u.sourceLabel,O=u.snapshotDate,E=u.importedAt,A=u.fallbackModel,x=.01,_="https://docs.github.com/en/copilot/concepts/billing/usage-based-billing-for-organizations-and-enterprises",a=u.models,y=[{id:"business-standard",label:"Copilot Business",shortLabel:"Business",creditsPerUserMonthly:1900,period:"Standard monthly allowance",note:"Included AI credits are pooled at the billing entity level."},{id:"enterprise-standard",label:"Copilot Enterprise",shortLabel:"Enterprise",creditsPerUserMonthly:3900,period:"Standard monthly allowance",note:"Included AI credits are pooled at the billing entity level."},{id:"business-promo",label:"Copilot Business promo",shortLabel:"Business promo",creditsPerUserMonthly:3e3,period:"Existing-customer promo, Jun 1-Sep 1 2026",note:"GitHub documents this temporary higher allowance for existing Business customers."},{id:"enterprise-promo",label:"Copilot Enterprise promo",shortLabel:"Enterprise promo",creditsPerUserMonthly:7e3,period:"Existing-customer promo, Jun 1-Sep 1 2026",note:"GitHub documents this temporary higher allowance for existing Enterprise customers."}];function p(e){return String(e??"").replace(/^copilot\//i,"").toLowerCase().replace(/[^a-z0-9]+/g," ").trim().replace(/\s+/g," ")}function g(e){let r=String(e??"").replace(/^copilot\//i,"").trim(),n=p(r),t=Object.keys(a),i=t.flatMap(o=>(a[o].aliases??[]).map(s=>({name:o,aliasKey:p(s)})));return t.find(o=>p(o)===n)??i.find(({aliasKey:o})=>o===n)?.name??t.find(o=>n.includes(p(o)))??i.find(({aliasKey:o})=>n.includes(o))?.name??(r||"Unknown model")}function P(e){let r=g(e);return a[r]?r:A}function T(e){return a[e||""]??a[A]}function k(e,r){let n=T(e),t=Math.max(0,r.input)+Math.max(0,r.cachedInput),i=[...n.tiers??[]].sort((o,s)=>s.thresholdInputTokensExclusive-o.thresholdInputTokensExclusive).find(o=>t>o.thresholdInputTokensExclusive);return i?l(c(c({},n),i),{tiers:n.tiers}):n}function d(e,r){let n=g(e);return(r||P(n))!==n||!a[n]}function G(e,r){let n=g(e),t=r||P(n);return d(n,t)?`${n||"Unknown model"} is a raw VS Code model id that does not have a GitHub pricing row in the local table. The estimate keeps that model label visible and uses ${t} pricing as an explicit assumption.`:"This model matched a GitHub price row directly."}function F(e,r){let n=e.pricingModel||e.model,t=k(n,e.tokens),i=e.costBreakdown?.inputUsd??h(e.tokens.input,t.input),o=e.costBreakdown?.cachedInputUsd??h(e.tokens.cachedInput,t.cachedInput),s=e.costBreakdown?.cacheWriteUsd??h(e.tokens.cacheWrite,t.cacheWrite??0),m=e.costBreakdown?.outputUsd??h(e.tokens.output,t.output),I=i+o+s+m,f=e.pricingTiers?.length?e.pricingTiers:[t.label??t.tierLabel??"Default"];return l(c({},e),{provider:t.provider,releaseStatus:t.releaseStatus,category:t.category,inputRate:t.input,cachedInputRate:t.cachedInput,cacheWriteRate:t.cacheWrite??0,outputRate:t.output,inputUsd:i,cachedInputUsd:o,cacheWriteUsd:s,outputUsd:m,totalUsd:I,share:r>0?I/r*100:0,usesFallbackPrice:d(e.model,n),pricingTierLabel:f.join(" + "),hasMixedPricingTiers:f.length>1})}function h(e,r){return e/1e6*r}function S(e){return e.input+e.cachedInput+e.cacheWrite+e.output}function K(e){return S(e.tokens)}function H(e){return b(e.sourceUsage?.usd)??e.cost.usd}function N(e){return b(e.sourceUsage?.credits)??e.cost.usd/x}function V(e){return e.sourceUsage?"GitHub usage":"Estimate fallback"}function z(e){return b(e.sourceUsage?.usd)}function j(e,r){return e===0?null:(r-e)/e*100}var J=d;function $(e,r){return e.size!==r.size?!0:[...e].some(n=>!r.has(n))}function b(e){return typeof e=="number"&&Number.isFinite(e)?e:null}export{C as a,U as b,M as c,O as d,E as e,x as f,_ as g,a as h,y as i,p as j,P as k,k as l,d as m,G as n,F as o,S as p,K as q,H as r,N as s,V as t,z as u,j as v,J as w,$ as x};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as K,o as X,p as L,q as G,r as w,v as S,w as Y,x as j}from"./chunk-TICIZRSM.js";import{$a as b,Ba as W,Ca as x,Da as h,Fa as T,Ga as E,Ha as A,Ia as a,Ja as o,Ka as Q,O as U,Oa as F,P as D,Qa as O,Sa as u,U as z,Ua as y,Va as c,Wa as f,Xa as k,Ya as C,Z as B,Za as V,_a as m,ab as _,db as v,ka as s,mb as H,ob as J,sa as q,sb as Z,tb as ee,ub as te,vb as ne,zb as ie}from"./chunk-WOIYAEKB.js";var re=(r,t)=>t.id,ae=(r,t)=>t.label,se=(r,t)=>t.title,ce=(r,t)=>t.model+t.pricingModel;function le(r,t){if(r&1){let e=F();a(0,"button",12),O("click",function(){U(e);let i=u();return D(i.openBaselinePicker())}),a(1,"strong"),c(2),o(),a(3,"em"),c(4),m(5,"number"),o()()}if(r&2){let e=t,n=u();s(2),f(e.title),s(2),C("",n.compactDate(e.startedAt)," \xB7 $",_(5,3,n.usageUsd(e),"1.2-4"))}}function pe(r,t){r&1&&(a(0,"em",15),c(1,"Same prompt as B"),o())}function de(r,t){if(r&1&&(a(0,"em",16),c(1),m(2,"number"),o()),r&2){let e=u().$implicit,n=u(2);s(),k("",b(2,1,n.promptRepeatCount(e))," matching prompts")}}function me(r,t){if(r&1){let e=F();a(0,"button",14),O("click",function(){let i=U(e).$implicit,l=u(2);return D(l.setCompareA(i.id))}),a(1,"strong"),c(2),o(),a(3,"span"),c(4),m(5,"number"),m(6,"number"),o(),x(7,pe,2,0,"em",15)(8,de,3,3,"em",16),o()}if(r&2){let e=t.$implicit,n=u(2);y("active",e.id===n.selectedAId())("same-prompt",n.isSamePromptAsOther(e,"baseline")),W("aria-selected",e.id===n.selectedAId()),s(2),f(e.title),s(2),V(" ",n.compactDate(e.startedAt)," \xB7 $",_(5,10,n.usageUsd(e),"1.2-4")," \xB7 ",b(6,13,n.runTokenTotal(e))," tokens "),s(3),h(n.isSamePromptAsOther(e,"baseline")?7:n.promptRepeatCount(e)>1?8:-1)}}function ue(r,t){r&1&&(a(0,"em"),c(1,"No matching runs"),o())}function ge(r,t){if(r&1&&(a(0,"div",7),T(1,me,9,15,"button",13,re,!1,ue,2,0,"em"),o()),r&2){let e=u();s(),E(e.baselineOptions().slice(0,8))}}function Ce(r,t){if(r&1){let e=F();a(0,"button",17),O("click",function(){U(e);let i=u();return D(i.openCandidatePicker())}),a(1,"strong"),c(2),o(),a(3,"em"),c(4),m(5,"number"),o()()}if(r&2){let e=t,n=u();s(2),f(e.title),s(2),C("",n.compactDate(e.startedAt)," \xB7 $",_(5,3,n.usageUsd(e),"1.2-4"))}}function _e(r,t){r&1&&(a(0,"em",15),c(1,"Same prompt as A"),o())}function xe(r,t){if(r&1&&(a(0,"em",16),c(1),m(2,"number"),o()),r&2){let e=u().$implicit,n=u(2);s(),k("",b(2,1,n.promptRepeatCount(e))," matching prompts")}}function he(r,t){if(r&1){let e=F();a(0,"button",14),O("click",function(){let i=U(e).$implicit,l=u(2);return D(l.setCompareB(i.id))}),a(1,"strong"),c(2),o(),a(3,"span"),c(4),m(5,"number"),m(6,"number"),o(),x(7,_e,2,0,"em",15)(8,xe,3,3,"em",16),o()}if(r&2){let e=t.$implicit,n=u(2);y("active",e.id===n.selectedBId())("same-prompt",n.isSamePromptAsOther(e,"candidate")),W("aria-selected",e.id===n.selectedBId()),s(2),f(e.title),s(2),V(" ",n.compactDate(e.startedAt)," \xB7 $",_(5,10,n.usageUsd(e),"1.2-4")," \xB7 ",b(6,13,n.runTokenTotal(e))," tokens "),s(3),h(n.isSamePromptAsOther(e,"candidate")?7:n.promptRepeatCount(e)>1?8:-1)}}function be(r,t){r&1&&(a(0,"em"),c(1,"No matching runs"),o())}function fe(r,t){if(r&1&&(a(0,"div",10),T(1,he,9,15,"button",13,re,!1,be,2,0,"em"),o()),r&2){let e=u();s(),E(e.candidateOptions().slice(0,8))}}function ve(r,t){r&1&&(a(0,"p",19),c(1,"These first prompts differ, so read this as run comparison rather than prompt A/B testing."),o())}function Pe(r,t){if(r&1&&(a(0,"strong"),c(1),m(2,"number"),o(),a(3,"em"),c(4),m(5,"number"),m(6,"number"),o()),r&2){let e=u().$implicit,n=u(2);y("saving",e.lowerIsBetter&&e.delta<0),s(),C(" ",e.delta<0?"-":"+","$",_(2,6,n.abs(e.delta),"1.2-4")," "),s(3),C("A $",_(5,9,e.a,"1.2-4")," / B $",_(6,12,e.b,"1.2-4"))}}function Me(r,t){if(r&1&&(c(0),m(1,"number")),r&2){let e=u(2).$implicit;C(" \xB7 ",e.percent>=0?"+":"","",_(1,2,e.percent,"1.0-0"),"% ")}}function Oe(r,t){if(r&1&&(a(0,"strong"),c(1),m(2,"number"),o(),a(3,"em"),c(4),m(5,"number"),m(6,"number"),x(7,Me,2,5),o()),r&2){let e=u().$implicit;y("saving",e.lowerIsBetter&&e.delta<0),s(),C(" ",e.delta>=0?"+":"","",b(2,7,e.delta)," "),s(3),C(" A ",b(5,9,e.a)," / B ",b(6,11,e.b)," "),s(3),h(e.percent!==null?7:-1)}}function ye(r,t){if(r&1&&(a(0,"div")(1,"span"),c(2),Q(3,"app-help-popover",29),o(),x(4,Pe,7,15)(5,Oe,8,13),o()),r&2){let e=t.$implicit;s(2),k(" ",e.label," "),s(),A("text",e.help)("label","Explain "+e.label),s(),h(e.format==="currency"?4:5)}}function ke(r,t){if(r&1&&(a(0,"article",24)(1,"div")(2,"span"),c(3),o(),a(4,"strong"),c(5),o()(),a(6,"p"),c(7),o()()),r&2){let e=t.$implicit;A("ngClass",e.tone),s(3),f(e.title),s(2),f(e.value),s(2),f(e.detail)}}function we(r,t){if(r&1&&(a(0,"em",30),c(1," fallback pricing "),Q(2,"app-help-popover",32),o()),r&2){let e=u().$implicit,n=u(2);s(2),A("text",n.pricingFallbackReason(e.model,e.pricingModel))}}function Se(r,t){if(r&1&&(a(0,"em"),c(1),o()),r&2){let e=u().$implicit,n=u(2);s(),k("write ",n.tokenDeltaLabel(e.cacheWriteDelta))}}function Be(r,t){if(r&1&&(a(0,"div",28)(1,"strong"),c(2),o(),a(3,"span"),c(4),x(5,we,3,1,"em",30),o(),a(6,"span"),c(7),m(8,"number"),m(9,"number"),o(),a(10,"span",31)(11,"strong"),c(12),m(13,"number"),o(),a(14,"em"),c(15),o(),x(16,Se,2,1,"em"),a(17,"em"),c(18),o()(),a(19,"span"),c(20),m(21,"number"),m(22,"number"),o(),a(23,"span"),c(24),m(25,"number"),o()()),r&2){let e=t.$implicit,n=u(2);s(2),f(e.model),s(2),k(" ",e.pricingModel," "),s(),h(e.usesFallbackPrice?5:-1),s(2),C("$",_(8,17,e.aCost,"1.4-6")," / $",_(9,20,e.bCost,"1.4-6")),s(5),C("",e.tokenDelta>=0?"+":"","",b(13,23,e.tokenDelta)),s(3),C(" normal ",n.tokenDeltaLabel(e.inputDelta)," \xB7 cached ",n.tokenDeltaLabel(e.cachedInputDelta)," "),s(),h(e.cacheWriteDelta?16:-1),s(2),k("out ",n.tokenDeltaLabel(e.outputDelta)),s(2),C("",b(21,25,e.aTurns)," / ",b(22,27,e.bTurns)),s(3),y("saving",e.costDelta<0),s(),C(" ",e.costDelta<0?"-":"+","$",_(25,29,n.abs(e.costDelta),"1.4-4")," ")}}function Ie(r,t){if(r&1&&(a(0,"div",18)(1,"div")(2,"span"),c(3),o(),a(4,"strong"),c(5),m(6,"number"),o(),a(7,"p"),c(8),o(),x(9,ve,2,0,"p",19),o(),a(10,"dl")(11,"div")(12,"dt"),c(13,"A"),o(),a(14,"dd"),c(15),m(16,"number"),o()(),a(17,"div")(18,"dt"),c(19,"B"),o(),a(20,"dd"),c(21),m(22,"number"),o()(),a(23,"div")(24,"dt"),c(25,"Tokens"),o(),a(26,"dd"),c(27),m(28,"number"),o()()()(),a(29,"div",20),T(30,ye,6,4,"div",null,ae),o(),a(32,"section",21)(33,"div",22)(34,"h3"),c(35,"What changed"),o()(),a(36,"div",23),T(37,ke,8,4,"article",24,se),o()(),a(39,"section",25)(40,"div",22)(41,"h3"),c(42,"Model movement"),o(),a(43,"p"),c(44,"Pricing row, token buckets, turns, and cost movement."),o()(),a(45,"div",26)(46,"div",27)(47,"span"),c(48,"Model"),o(),a(49,"span"),c(50,"Price row"),o(),a(51,"span"),c(52,"Cost A / B"),o(),a(53,"span"),c(54,"Token movement"),o(),a(55,"span"),c(56,"Model calls A / B"),o(),a(57,"span"),c(58,"Cost delta"),o()(),T(59,Be,26,32,"div",28,ce),o()()),r&2){let e=t,n=u();s(3),f(e.promptMatch?"Same-prompt read":"Manual comparison read"),s(),y("saving",e.costDelta<0),s(),C(" ",e.costDelta<0?"-":"+","$",_(6,11,n.abs(e.costDelta),"1.2-4")," "),s(3),f(e.summary),s(),h(e.promptMatch?-1:9),s(6),k("",_(16,14,n.usageUsd(e.a),"1.2-2")," USD"),s(6),k("",_(22,17,n.usageUsd(e.b),"1.2-2")," USD"),s(6),C("",e.totalTokenDelta>=0?"+":"","",b(28,20,e.totalTokenDelta)),s(3),E(e.metrics),s(7),E(e.drivers),s(22),E(e.modelRows)}}function Te(r,t){r&1&&(a(0,"p",11),c(1,"Pick two different sessions to compare cost and token deltas."),o())}var oe=class r{sessionsInput=B([]);compareAInput=B(null);compareBInput=B(null);baselineQuery=B("");candidateQuery=B("");baselinePickerOpen=B(!1);candidatePickerOpen=B(!1);compareAChange=new z;compareBChange=new z;set sessions(t){this.sessionsInput.set(t??[])}set compareA(t){this.compareAInput.set(t??null)}set compareB(t){this.compareBInput.set(t??null)}sessionOptions=v(()=>this.sessionsInput());selectedAId=v(()=>this.compareAInput()??this.sessionOptions()[0]?.id??null);selectedBId=v(()=>this.compareBInput()??this.sessionOptions()[1]?.id??null);selectedASession=v(()=>this.sessionOptions().find(t=>t.id===this.selectedAId())??null);selectedBSession=v(()=>this.sessionOptions().find(t=>t.id===this.selectedBId())??null);baselineOptions=v(()=>this.filteredSessionOptions(this.baselineQuery(),this.selectedAId()));candidateOptions=v(()=>this.filteredSessionOptions(this.candidateQuery(),this.selectedBId()));abs=Math.abs;pricingFallbackReason=K;promptGroups=v(()=>this.samePromptGroups(this.sessionOptions()));comparison=v(()=>{let t=this.sessionOptions().find(R=>R.id===this.selectedAId()),e=this.sessionOptions().find(R=>R.id===this.selectedBId());if(!t||!e||t.id===e.id)return null;let n=this.sessionComparisonAnalysis(t),i=this.sessionComparisonAnalysis(e),l=i.totalTokens-n.totalTokens,p=w(t),d=w(e),g=d-p,P=i.inputContextUsd-n.inputContextUsd,I=i.outputUsd-n.outputUsd,M=e.traceSummary.toolCalls-t.traceSummary.toolCalls,N=e.traceSummary.modelTurns-t.traceSummary.modelTurns;return{a:t,b:e,aAnalysis:n,bAnalysis:i,promptMatch:$(t.firstPrompt)===$(e.firstPrompt),costDelta:g,totalTokenDelta:l,percent:S(p,d),summary:this.comparisonSummary(g,l,P,I,M,N),metrics:[{label:"Usage",a:p,b:d,delta:g,percent:S(p,d),format:"currency",lowerIsBetter:!0,help:"GitHub source usage when VS Code logged it. Falls back to local token pricing when source usage is unavailable."},{label:"Normal input tokens",a:t.tokens.input,b:e.tokens.input,delta:e.tokens.input-t.tokens.input,percent:S(t.tokens.input,e.tokens.input),format:"number",lowerIsBetter:!0,help:"Prompt/context tokens priced at the normal input rate. Cached input is shown separately when present."},{label:"Cached input tokens",a:t.tokens.cachedInput,b:e.tokens.cachedInput,delta:e.tokens.cachedInput-t.tokens.cachedInput,percent:S(t.tokens.cachedInput,e.tokens.cachedInput),format:"number",lowerIsBetter:!0,help:"Prompt/context tokens VS Code reported as cachedTokens. These are priced with the cached-input rate, not merged into normal input."},{label:"Cache write tokens",a:t.tokens.cacheWrite,b:e.tokens.cacheWrite,delta:e.tokens.cacheWrite-t.tokens.cacheWrite,percent:S(t.tokens.cacheWrite,e.tokens.cacheWrite),format:"number",lowerIsBetter:!0,help:"Cache creation tokens when VS Code exposes a numeric cache-write field. These are priced separately from normal and cached input."},{label:"Output tokens",a:t.tokens.output,b:e.tokens.output,delta:e.tokens.output-t.tokens.output,percent:S(t.tokens.output,e.tokens.output),format:"number",lowerIsBetter:!1,help:"Generated response tokens. More output can be useful, but it still affects cost."},{label:"Model turns",a:t.traceSummary.modelTurns,b:e.traceSummary.modelTurns,delta:N,percent:S(t.traceSummary.modelTurns,e.traceSummary.modelTurns),format:"number",lowerIsBetter:!1,help:"Model request count. More turns often means more accumulated context gets resent."},{label:"Tool calls",a:t.traceSummary.toolCalls,b:e.traceSummary.toolCalls,delta:M,percent:S(t.traceSummary.toolCalls,e.traceSummary.toolCalls),format:"number",lowerIsBetter:!1,help:"Tool activity. Tool results can become later input context."}],drivers:this.comparisonDrivers(n,i,g,P,I,M,N),modelRows:this.compareModelRows(n.modelRows,i.modelRows)}});setCompareA(t){let e=this.selectedAId(),n=this.selectedBId();this.compareAInput.set(t),this.compareAChange.emit(t),t&&t===n&&e&&e!==t&&(this.compareBInput.set(e),this.compareBChange.emit(e)),this.baselineQuery.set(""),this.baselinePickerOpen.set(!1)}setCompareB(t){let e=this.selectedAId(),n=this.selectedBId();this.compareBInput.set(t),this.compareBChange.emit(t),t&&t===e&&n&&n!==t&&(this.compareAInput.set(n),this.compareAChange.emit(n)),this.candidateQuery.set(""),this.candidatePickerOpen.set(!1)}setBaselineQuery(t){this.baselineQuery.set(t),this.baselinePickerOpen.set(!0)}setCandidateQuery(t){this.candidateQuery.set(t),this.candidatePickerOpen.set(!0)}openBaselinePicker(){this.baselinePickerOpen.set(!0)}openCandidatePicker(){this.candidatePickerOpen.set(!0)}closePickerOnFocusOut(t,e){let n=e.relatedTarget;if(!(n instanceof Node&&e.currentTarget instanceof Node&&e.currentTarget.contains(n))){if(t==="baseline"){this.baselinePickerOpen.set(!1);return}this.candidatePickerOpen.set(!1)}}compactDate(t){return new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(new Date(t))}runTokenTotal(t){return G(t)}usageUsd(t){return w(t)}promptRepeatCount(t){let e=$(t.firstPrompt);return e?this.promptGroups().find(n=>n.key===e)?.sessions.length??1:1}isSamePromptAsOther(t,e){let n=e==="baseline"?this.selectedBSession():this.selectedASession(),i=$(t.firstPrompt);return!!(n&&i&&i===$(n.firstPrompt))}tokenDeltaLabel(t){return`${t>=0?"+":""}${t.toLocaleString()}`}filteredSessionOptions(t,e){let n=t.trim().toLowerCase();if(!n)return this.sessionOptions();let i=this.sessionOptions().filter(p=>[p.title,p.firstPrompt,p.model,p.workspace].join(" ").toLowerCase().includes(n)),l=this.sessionOptions().find(p=>p.id===e);return l&&!i.some(p=>p.id===l.id)?[l,...i]:i}sessionComparisonAnalysis(t){let e=t.modelBreakdown.map(i=>X(i,w(t))),n=[...e].sort((i,l)=>l.totalUsd-i.totalUsd)[0]??null;return{session:t,modelRows:e,totalTokens:G(t),inputUsd:e.reduce((i,l)=>i+l.inputUsd,0),inputContextUsd:e.reduce((i,l)=>i+l.inputUsd+l.cachedInputUsd+l.cacheWriteUsd,0),outputUsd:e.reduce((i,l)=>i+l.outputUsd,0),cachedInputUsd:e.reduce((i,l)=>i+l.cachedInputUsd,0),cacheWriteUsd:e.reduce((i,l)=>i+l.cacheWriteUsd,0),topModel:n,modelNames:new Set(e.map(i=>i.model)),pricingRows:new Set(e.map(i=>i.pricingModel))}}samePromptGroups(t){let e=new Map;for(let n of t){let i=$(n.firstPrompt);i&&e.set(i,[...e.get(i)??[],n])}return[...e.entries()].filter(([,n])=>n.length>1).map(([n,i])=>{let l=[...i].sort((p,d)=>w(p)-w(d));return{key:n,sessions:[...i].sort((p,d)=>p.startedAt.localeCompare(d.startedAt)),costRangeUsd:w(l[l.length-1])-w(l[0])}}).sort((n,i)=>i.sessions.length-n.sessions.length||i.costRangeUsd-n.costRangeUsd)}comparisonSummary(t,e,n,i,l,p){let d=t>0?"more expensive":t<0?"cheaper":"about the same cost",g=e>0?"more":e<0?"fewer":"the same number of",P=Math.abs(n)>=Math.abs(i)?"input/context tokens":"generated output tokens",I=Math.abs(p)>=Math.abs(l)?`${Math.abs(p).toLocaleString()} ${p>=0?"more":"fewer"} model turns`:`${Math.abs(l).toLocaleString()} ${l>=0?"more":"fewer"} tool calls`;return t===0&&e===0?"These runs look equivalent on imported cost and token totals. Check logs if behavior differed qualitatively.":`Run B is ${d}, with ${Math.abs(e).toLocaleString()} ${g} imported tokens. The largest priced movement is ${P}; activity changed by ${I}.`}comparisonDrivers(t,e,n,i,l,p,d){let g=j(t.modelNames,e.modelNames)||j(t.pricingRows,e.pricingRows),P=t.topModel?.pricingModel!==e.topModel?.pricingModel;return[{title:"Cost movement",value:n>0?"Higher":n<0?"Lower":"Flat",tone:n>0?"high":n<0?"info":"medium",detail:n===0?"The imported estimate did not materially change between these two runs.":`Run B moved by ${n>0?"+":"-"}$${Math.abs(n).toFixed(4)}. Cheaper is only better if the run still did the job.`},{title:"Priced token driver",value:Math.abs(i)>=Math.abs(l)?"Input":"Output",tone:Math.abs(i)>=Math.abs(l)?"high":"medium",detail:Math.abs(i)>=Math.abs(l)?`Input/context cost moved by ${i>=0?"+":"-"}$${Math.abs(i).toFixed(4)} across normal input, cached input, and cache-write buckets. This is usually repo context, prior chat, or tool results.`:`Output cost moved by ${l>=0?"+":"-"}$${Math.abs(l).toFixed(4)}. The later run generated more or less text.`},{title:"Model pricing",value:g?"Changed":"Same",tone:g||P?"medium":"info",detail:g?`The model or pricing-row mix changed. A: ${[...t.pricingRows].join(", ")}. B: ${[...e.pricingRows].join(", ")}.`:`Both runs used the same imported pricing row mix: ${[...e.pricingRows].join(", ")}.`},{title:"Agent activity",value:`${d>=0?"+":""}${d} turns`,tone:d>3||p>10?"medium":"info",detail:`Run B has ${Math.abs(d)} ${d>=0?"more":"fewer"} model turns and ${Math.abs(p)} ${p>=0?"more":"fewer"} tool calls.`}]}compareModelRows(t,e){return[...new Set([...t,...e].map(i=>`${i.model}::${i.pricingModel}`))].map(i=>{let[l,p]=i.split("::"),d=t.find(M=>M.model===l&&M.pricingModel===p),g=e.find(M=>M.model===l&&M.pricingModel===p),P=d?L(d.tokens):0,I=g?L(g.tokens):0;return{model:l,pricingModel:p,usesFallbackPrice:Y(l,p),aCost:d?.totalUsd??0,bCost:g?.totalUsd??0,costDelta:(g?.totalUsd??0)-(d?.totalUsd??0),aTokens:P,bTokens:I,tokenDelta:I-P,inputDelta:(g?.tokens.input??0)-(d?.tokens.input??0),cachedInputDelta:(g?.tokens.cachedInput??0)-(d?.tokens.cachedInput??0),cacheWriteDelta:(g?.tokens.cacheWrite??0)-(d?.tokens.cacheWrite??0),outputDelta:(g?.tokens.output??0)-(d?.tokens.output??0),aTurns:d?.turns??0,bTurns:g?.turns??0}}).sort((i,l)=>Math.abs(l.costDelta)-Math.abs(i.costDelta))}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=q({type:r,selectors:[["app-compare-page"]],inputs:{sessions:"sessions",compareA:"compareA",compareB:"compareB"},outputs:{compareAChange:"compareAChange",compareBChange:"compareBChange"},decls:24,vars:11,consts:[[1,"compare"],[1,"compare-header"],[1,"eyebrow"],[1,"selectors"],[1,"run-picker",3,"focusout"],["type","button","aria-label","Open baseline run picker",1,"selected-run"],["type","search","placeholder","Search baseline runs","aria-label","Search baseline runs",3,"ngModelChange","focus","ngModel"],["role","listbox","aria-label","Baseline run results",1,"selector-results"],["type","button","aria-label","Open candidate run picker",1,"selected-run"],["type","search","placeholder","Search candidate runs","aria-label","Search candidate runs",3,"ngModelChange","focus","ngModel"],["role","listbox","aria-label","Candidate run results",1,"selector-results"],[1,"empty"],["type","button","aria-label","Open baseline run picker",1,"selected-run",3,"click"],["type","button","role","option",3,"active","same-prompt"],["type","button","role","option",3,"click"],[1,"match-chip"],[1,"match-chip","muted-chip"],["type","button","aria-label","Open candidate run picker",1,"selected-run",3,"click"],[1,"compare-readout"],[1,"compare-caveat"],[1,"comparison-grid","advanced"],[1,"comparison-section","comparison-drivers"],[1,"section-heading"],[1,"driver-list"],[3,"ngClass"],[1,"comparison-section","comparison-models"],[1,"cost-table","compact-table"],[1,"cost-row","cost-row-heading"],[1,"cost-row"],[3,"text","label"],[1,"warning-text"],[1,"token-movement"],["label","Explain fallback pricing",3,"text"]],template:function(e,n){if(e&1&&(a(0,"section",0)(1,"div",1)(2,"div")(3,"p",2),c(4,"Evaluation"),o(),a(5,"h2"),c(6,"Compare runs"),o(),a(7,"p"),c(8,"Pick a baseline and a candidate run. The page explains what changed in cost, tokens, activity, and model mix."),o()(),a(9,"div",3)(10,"div",4),O("focusout",function(l){return n.closePickerOnFocusOut("baseline",l)}),a(11,"span"),c(12,"Baseline A"),o(),x(13,le,6,6,"button",5),a(14,"input",6),O("ngModelChange",function(l){return n.setBaselineQuery(l)})("focus",function(){return n.openBaselinePicker()}),o(),x(15,ge,4,1,"div",7),o(),a(16,"div",4),O("focusout",function(l){return n.closePickerOnFocusOut("candidate",l)}),a(17,"span"),c(18,"Candidate B"),o(),x(19,Ce,6,6,"button",8),a(20,"input",9),O("ngModelChange",function(l){return n.setCandidateQuery(l)})("focus",function(){return n.openCandidatePicker()}),o(),x(21,fe,4,1,"div",10),o()()(),x(22,Ie,61,22)(23,Te,2,0,"p",11),o()),e&2){let i,l,p;s(10),y("open",n.baselinePickerOpen()),s(3),h((i=n.selectedASession())?13:-1,i),s(),A("ngModel",n.baselineQuery()),s(),h(n.baselinePickerOpen()?15:-1),s(),y("open",n.candidatePickerOpen()),s(3),h((l=n.selectedBSession())?19:-1,l),s(),A("ngModel",n.candidateQuery()),s(),h(n.candidatePickerOpen()?21:-1),s(),h((p=n.comparison())?22:23,p)}},dependencies:[ie,ee,te,ne,Z,H,J],styles:["[_nghost-%COMP%]{display:block}.compare[_ngcontent-%COMP%]{display:grid;gap:10px;border:1px solid var(--line);border-radius:16px;padding:16px;background:linear-gradient(180deg,#6f5cff09,#0c9f8305),var(--surface);box-shadow:var(--shadow-soft, 0 16px 38px rgba(15, 23, 42, .1))}.compare-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.compare[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:4px 0 0;color:var(--text-strong);font-size:22px;font-weight:760;letter-spacing:0}.compare-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:not(.eyebrow){max-width:620px;margin:6px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.eyebrow[_ngcontent-%COMP%]{margin:0;color:var(--accent-2);font-size:10px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.selectors[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(260px,360px));gap:12px;min-width:min(760px,62vw)}.run-picker[_ngcontent-%COMP%]{position:relative;display:grid;gap:6px;min-width:0}.run-picker[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{color:var(--muted);font-size:11px;font-weight:760}.selectors[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .selected-run[_ngcontent-%COMP%]{width:100%;border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:var(--control-bg, var(--surface-soft));color:var(--text);font:inherit;font-size:12px}.selected-run[_ngcontent-%COMP%]{display:grid;gap:3px;min-height:50px;text-align:left;cursor:pointer}.selected-run[_ngcontent-%COMP%]:hover, .run-picker.open[_ngcontent-%COMP%] .selected-run[_ngcontent-%COMP%]{border-color:#1fd1a573;box-shadow:0 0 0 3px #1fd1a514}.selected-run[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .selected-run[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.selected-run[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:12px;font-weight:760}.selected-run[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{color:var(--muted);font-size:11px;font-style:normal}.selectors[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{min-height:34px;border-color:#637d9438;background:color-mix(in srgb,var(--surface-soft) 78%,transparent)}.selectors[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder{color:var(--muted-2)}.selector-results[_ngcontent-%COMP%]{position:absolute;z-index:20;top:calc(100% + 6px);left:0;right:0;display:grid;gap:6px;max-height:min(320px,46vh);overflow:auto;border:1px solid var(--line);border-radius:11px;padding:6px;background:var(--surface);box-shadow:0 18px 42px #0f172a29}.selector-results[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:grid;gap:2px;width:100%;border:1px solid transparent;border-radius:9px;padding:8px 9px;background:transparent;color:var(--text);font:inherit;text-align:left;cursor:pointer}.selector-results[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover, .selector-results[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{border-color:#1fd1a559;background:#1fd1a514}.selector-results[_ngcontent-%COMP%] button.same-prompt[_ngcontent-%COMP%]{border-color:#6f5cff61;background:linear-gradient(135deg,#6f5cff17,#1fd1a50e),transparent}.selector-results[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{overflow:hidden;color:var(--text-strong);font-size:12px;font-weight:760;text-overflow:ellipsis;white-space:nowrap}.selector-results[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .selector-results[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{overflow:hidden;color:var(--muted);font-size:11px;font-style:normal;text-overflow:ellipsis;white-space:nowrap}.match-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;width:fit-content;max-width:100%;border:1px solid rgba(111,92,255,.28);border-radius:999px;padding:2px 7px;background:#6f5cff17;color:var(--text-strong)!important;font-size:10px!important;font-weight:760;line-height:1.2}.match-chip.muted-chip[_ngcontent-%COMP%]{border-color:var(--line);background:color-mix(in srgb,var(--surface-soft) 72%,transparent);color:var(--muted)!important}.compare-readout[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:stretch;border:1px solid rgba(12,159,131,.2);border-radius:13px;padding:12px;background:radial-gradient(circle at 100% 0%,rgba(111,92,255,.11),transparent 34%),linear-gradient(135deg,#0c9f8313,#6f5cff09),var(--surface)}.compare-readout[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{border-left:4px solid var(--accent-2);padding-left:12px}.compare-readout[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(86px,1fr));gap:8px;align-self:center;margin:0}.compare-readout[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:grid;gap:4px;border:1px solid var(--line);border-radius:11px;padding:9px;background:var(--surface-soft)}.compare-readout[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:var(--muted-2);font-size:10px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.compare-readout[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:14px;font-weight:760;white-space:nowrap}.compare-readout[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;margin-bottom:3px;color:var(--muted);font-size:11px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.compare-readout[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:22px;font-weight:760}.compare-readout[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{max-width:920px;margin:5px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.compare-caveat[_ngcontent-%COMP%]{color:var(--warning-text, #ffcf75)!important}.comparison-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:7px}.comparison-grid[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;gap:3px;border:1px solid var(--line);border-radius:10px;padding:8px 9px;background:var(--surface-soft)}.comparison-grid[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .comparison-grid[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{color:var(--muted);font-size:12px;font-style:normal}.comparison-grid[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:15px;font-weight:760;letter-spacing:0}.comparison-section[_ngcontent-%COMP%]{display:grid;gap:8px}.section-heading[_ngcontent-%COMP%]{display:flex;align-items:end;justify-content:space-between;gap:14px}.section-heading[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:15px;font-weight:760}.section-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:12px}.driver-list[_ngcontent-%COMP%]{display:grid;gap:6px}.driver-list[_ngcontent-%COMP%] article[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(155px,.34fr) minmax(0,1fr);gap:10px;align-items:start;border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:10px;padding:8px 10px;background:color-mix(in srgb,var(--surface-soft) 58%,transparent)}.driver-list[_ngcontent-%COMP%] article.medium[_ngcontent-%COMP%]{border-left-color:var(--warning)}.driver-list[_ngcontent-%COMP%] article.high[_ngcontent-%COMP%]{border-left-color:var(--danger)}.driver-list[_ngcontent-%COMP%] article[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;gap:2px;min-width:0}.driver-list[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted-2);font-size:10px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.driver-list[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:14px;font-weight:760;line-height:1.1;overflow-wrap:anywhere}.driver-list[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--text);font-size:12px;line-height:1.35}.cost-table[_ngcontent-%COMP%]{display:grid;overflow:auto hidden;border:1px solid var(--line);border-radius:12px;background:var(--surface)}.cost-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(140px,1.05fr) minmax(110px,.82fr) minmax(128px,.95fr) minmax(190px,1.25fr) minmax(96px,.7fr) minmax(74px,.5fr);gap:8px;align-items:start;min-width:760px;border-bottom:1px solid var(--line);padding:8px 9px}.cost-row[_ngcontent-%COMP%]:last-child{border-bottom:0}.cost-row-heading[_ngcontent-%COMP%]{background:var(--surface-soft);font-size:11px;font-weight:720;text-transform:uppercase}.cost-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:grid;gap:3px}.cost-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong)}.cost-row[_ngcontent-%COMP%] .token-movement[_ngcontent-%COMP%]{gap:4px}.cost-row[_ngcontent-%COMP%] .token-movement[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;color:var(--text-strong);font-size:12px}.cost-row[_ngcontent-%COMP%] .token-movement[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{line-height:1.35}.saving[_ngcontent-%COMP%]{color:var(--success-text, #35d07f)!important}.warning-text[_ngcontent-%COMP%]{color:var(--warning-text, #ffcf75)!important;font-weight:900}.empty[_ngcontent-%COMP%]{margin:0;color:var(--muted)}@media(max-width:900px){.compare-header[_ngcontent-%COMP%], .compare-readout[_ngcontent-%COMP%], .section-heading[_ngcontent-%COMP%]{display:grid}.comparison-grid[_ngcontent-%COMP%], .driver-list[_ngcontent-%COMP%] article[_ngcontent-%COMP%], .selectors[_ngcontent-%COMP%], .compare-readout[_ngcontent-%COMP%] dl[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%]{grid-template-columns:1fr}.cost-row[_ngcontent-%COMP%], .selectors[_ngcontent-%COMP%]{min-width:0}}"]})};function $(r){return String(r??"").toLowerCase().replace(/[^\p{L}\p{N}#/@._-]+/gu," ").replace(/\s+/g," ").trim()}export{oe as ComparePageComponent};
|
|
1
|
+
import{n as K,o as X,p as L,q as G,r as w,v as S,w as Y,x as j}from"./chunk-5FL3PHQS.js";import{$a as b,Ba as W,Ca as x,Da as h,Fa as T,Ga as E,Ha as A,Ia as a,Ja as o,Ka as Q,O as U,Oa as F,P as D,Qa as O,Sa as u,U as z,Ua as y,Va as c,Wa as f,Xa as k,Ya as C,Z as B,Za as V,_a as m,ab as _,db as v,ka as s,mb as H,ob as J,sa as q,sb as Z,tb as ee,ub as te,vb as ne,zb as ie}from"./chunk-WOIYAEKB.js";var re=(r,t)=>t.id,ae=(r,t)=>t.label,se=(r,t)=>t.title,ce=(r,t)=>t.model+t.pricingModel;function le(r,t){if(r&1){let e=F();a(0,"button",12),O("click",function(){U(e);let i=u();return D(i.openBaselinePicker())}),a(1,"strong"),c(2),o(),a(3,"em"),c(4),m(5,"number"),o()()}if(r&2){let e=t,n=u();s(2),f(e.title),s(2),C("",n.compactDate(e.startedAt)," \xB7 $",_(5,3,n.usageUsd(e),"1.2-4"))}}function pe(r,t){r&1&&(a(0,"em",15),c(1,"Same prompt as B"),o())}function de(r,t){if(r&1&&(a(0,"em",16),c(1),m(2,"number"),o()),r&2){let e=u().$implicit,n=u(2);s(),k("",b(2,1,n.promptRepeatCount(e))," matching prompts")}}function me(r,t){if(r&1){let e=F();a(0,"button",14),O("click",function(){let i=U(e).$implicit,l=u(2);return D(l.setCompareA(i.id))}),a(1,"strong"),c(2),o(),a(3,"span"),c(4),m(5,"number"),m(6,"number"),o(),x(7,pe,2,0,"em",15)(8,de,3,3,"em",16),o()}if(r&2){let e=t.$implicit,n=u(2);y("active",e.id===n.selectedAId())("same-prompt",n.isSamePromptAsOther(e,"baseline")),W("aria-selected",e.id===n.selectedAId()),s(2),f(e.title),s(2),V(" ",n.compactDate(e.startedAt)," \xB7 $",_(5,10,n.usageUsd(e),"1.2-4")," \xB7 ",b(6,13,n.runTokenTotal(e))," tokens "),s(3),h(n.isSamePromptAsOther(e,"baseline")?7:n.promptRepeatCount(e)>1?8:-1)}}function ue(r,t){r&1&&(a(0,"em"),c(1,"No matching runs"),o())}function ge(r,t){if(r&1&&(a(0,"div",7),T(1,me,9,15,"button",13,re,!1,ue,2,0,"em"),o()),r&2){let e=u();s(),E(e.baselineOptions().slice(0,8))}}function Ce(r,t){if(r&1){let e=F();a(0,"button",17),O("click",function(){U(e);let i=u();return D(i.openCandidatePicker())}),a(1,"strong"),c(2),o(),a(3,"em"),c(4),m(5,"number"),o()()}if(r&2){let e=t,n=u();s(2),f(e.title),s(2),C("",n.compactDate(e.startedAt)," \xB7 $",_(5,3,n.usageUsd(e),"1.2-4"))}}function _e(r,t){r&1&&(a(0,"em",15),c(1,"Same prompt as A"),o())}function xe(r,t){if(r&1&&(a(0,"em",16),c(1),m(2,"number"),o()),r&2){let e=u().$implicit,n=u(2);s(),k("",b(2,1,n.promptRepeatCount(e))," matching prompts")}}function he(r,t){if(r&1){let e=F();a(0,"button",14),O("click",function(){let i=U(e).$implicit,l=u(2);return D(l.setCompareB(i.id))}),a(1,"strong"),c(2),o(),a(3,"span"),c(4),m(5,"number"),m(6,"number"),o(),x(7,_e,2,0,"em",15)(8,xe,3,3,"em",16),o()}if(r&2){let e=t.$implicit,n=u(2);y("active",e.id===n.selectedBId())("same-prompt",n.isSamePromptAsOther(e,"candidate")),W("aria-selected",e.id===n.selectedBId()),s(2),f(e.title),s(2),V(" ",n.compactDate(e.startedAt)," \xB7 $",_(5,10,n.usageUsd(e),"1.2-4")," \xB7 ",b(6,13,n.runTokenTotal(e))," tokens "),s(3),h(n.isSamePromptAsOther(e,"candidate")?7:n.promptRepeatCount(e)>1?8:-1)}}function be(r,t){r&1&&(a(0,"em"),c(1,"No matching runs"),o())}function fe(r,t){if(r&1&&(a(0,"div",10),T(1,he,9,15,"button",13,re,!1,be,2,0,"em"),o()),r&2){let e=u();s(),E(e.candidateOptions().slice(0,8))}}function ve(r,t){r&1&&(a(0,"p",19),c(1,"These first prompts differ, so read this as run comparison rather than prompt A/B testing."),o())}function Pe(r,t){if(r&1&&(a(0,"strong"),c(1),m(2,"number"),o(),a(3,"em"),c(4),m(5,"number"),m(6,"number"),o()),r&2){let e=u().$implicit,n=u(2);y("saving",e.lowerIsBetter&&e.delta<0),s(),C(" ",e.delta<0?"-":"+","$",_(2,6,n.abs(e.delta),"1.2-4")," "),s(3),C("A $",_(5,9,e.a,"1.2-4")," / B $",_(6,12,e.b,"1.2-4"))}}function Me(r,t){if(r&1&&(c(0),m(1,"number")),r&2){let e=u(2).$implicit;C(" \xB7 ",e.percent>=0?"+":"","",_(1,2,e.percent,"1.0-0"),"% ")}}function Oe(r,t){if(r&1&&(a(0,"strong"),c(1),m(2,"number"),o(),a(3,"em"),c(4),m(5,"number"),m(6,"number"),x(7,Me,2,5),o()),r&2){let e=u().$implicit;y("saving",e.lowerIsBetter&&e.delta<0),s(),C(" ",e.delta>=0?"+":"","",b(2,7,e.delta)," "),s(3),C(" A ",b(5,9,e.a)," / B ",b(6,11,e.b)," "),s(3),h(e.percent!==null?7:-1)}}function ye(r,t){if(r&1&&(a(0,"div")(1,"span"),c(2),Q(3,"app-help-popover",29),o(),x(4,Pe,7,15)(5,Oe,8,13),o()),r&2){let e=t.$implicit;s(2),k(" ",e.label," "),s(),A("text",e.help)("label","Explain "+e.label),s(),h(e.format==="currency"?4:5)}}function ke(r,t){if(r&1&&(a(0,"article",24)(1,"div")(2,"span"),c(3),o(),a(4,"strong"),c(5),o()(),a(6,"p"),c(7),o()()),r&2){let e=t.$implicit;A("ngClass",e.tone),s(3),f(e.title),s(2),f(e.value),s(2),f(e.detail)}}function we(r,t){if(r&1&&(a(0,"em",30),c(1," fallback pricing "),Q(2,"app-help-popover",32),o()),r&2){let e=u().$implicit,n=u(2);s(2),A("text",n.pricingFallbackReason(e.model,e.pricingModel))}}function Se(r,t){if(r&1&&(a(0,"em"),c(1),o()),r&2){let e=u().$implicit,n=u(2);s(),k("write ",n.tokenDeltaLabel(e.cacheWriteDelta))}}function Be(r,t){if(r&1&&(a(0,"div",28)(1,"strong"),c(2),o(),a(3,"span"),c(4),x(5,we,3,1,"em",30),o(),a(6,"span"),c(7),m(8,"number"),m(9,"number"),o(),a(10,"span",31)(11,"strong"),c(12),m(13,"number"),o(),a(14,"em"),c(15),o(),x(16,Se,2,1,"em"),a(17,"em"),c(18),o()(),a(19,"span"),c(20),m(21,"number"),m(22,"number"),o(),a(23,"span"),c(24),m(25,"number"),o()()),r&2){let e=t.$implicit,n=u(2);s(2),f(e.model),s(2),k(" ",e.pricingModel," "),s(),h(e.usesFallbackPrice?5:-1),s(2),C("$",_(8,17,e.aCost,"1.4-6")," / $",_(9,20,e.bCost,"1.4-6")),s(5),C("",e.tokenDelta>=0?"+":"","",b(13,23,e.tokenDelta)),s(3),C(" normal ",n.tokenDeltaLabel(e.inputDelta)," \xB7 cached ",n.tokenDeltaLabel(e.cachedInputDelta)," "),s(),h(e.cacheWriteDelta?16:-1),s(2),k("out ",n.tokenDeltaLabel(e.outputDelta)),s(2),C("",b(21,25,e.aTurns)," / ",b(22,27,e.bTurns)),s(3),y("saving",e.costDelta<0),s(),C(" ",e.costDelta<0?"-":"+","$",_(25,29,n.abs(e.costDelta),"1.4-4")," ")}}function Ie(r,t){if(r&1&&(a(0,"div",18)(1,"div")(2,"span"),c(3),o(),a(4,"strong"),c(5),m(6,"number"),o(),a(7,"p"),c(8),o(),x(9,ve,2,0,"p",19),o(),a(10,"dl")(11,"div")(12,"dt"),c(13,"A"),o(),a(14,"dd"),c(15),m(16,"number"),o()(),a(17,"div")(18,"dt"),c(19,"B"),o(),a(20,"dd"),c(21),m(22,"number"),o()(),a(23,"div")(24,"dt"),c(25,"Tokens"),o(),a(26,"dd"),c(27),m(28,"number"),o()()()(),a(29,"div",20),T(30,ye,6,4,"div",null,ae),o(),a(32,"section",21)(33,"div",22)(34,"h3"),c(35,"What changed"),o()(),a(36,"div",23),T(37,ke,8,4,"article",24,se),o()(),a(39,"section",25)(40,"div",22)(41,"h3"),c(42,"Model movement"),o(),a(43,"p"),c(44,"Pricing row, token buckets, turns, and cost movement."),o()(),a(45,"div",26)(46,"div",27)(47,"span"),c(48,"Model"),o(),a(49,"span"),c(50,"Price row"),o(),a(51,"span"),c(52,"Cost A / B"),o(),a(53,"span"),c(54,"Token movement"),o(),a(55,"span"),c(56,"Model calls A / B"),o(),a(57,"span"),c(58,"Cost delta"),o()(),T(59,Be,26,32,"div",28,ce),o()()),r&2){let e=t,n=u();s(3),f(e.promptMatch?"Same-prompt read":"Manual comparison read"),s(),y("saving",e.costDelta<0),s(),C(" ",e.costDelta<0?"-":"+","$",_(6,11,n.abs(e.costDelta),"1.2-4")," "),s(3),f(e.summary),s(),h(e.promptMatch?-1:9),s(6),k("",_(16,14,n.usageUsd(e.a),"1.2-2")," USD"),s(6),k("",_(22,17,n.usageUsd(e.b),"1.2-2")," USD"),s(6),C("",e.totalTokenDelta>=0?"+":"","",b(28,20,e.totalTokenDelta)),s(3),E(e.metrics),s(7),E(e.drivers),s(22),E(e.modelRows)}}function Te(r,t){r&1&&(a(0,"p",11),c(1,"Pick two different sessions to compare cost and token deltas."),o())}var oe=class r{sessionsInput=B([]);compareAInput=B(null);compareBInput=B(null);baselineQuery=B("");candidateQuery=B("");baselinePickerOpen=B(!1);candidatePickerOpen=B(!1);compareAChange=new z;compareBChange=new z;set sessions(t){this.sessionsInput.set(t??[])}set compareA(t){this.compareAInput.set(t??null)}set compareB(t){this.compareBInput.set(t??null)}sessionOptions=v(()=>this.sessionsInput());selectedAId=v(()=>this.compareAInput()??this.sessionOptions()[0]?.id??null);selectedBId=v(()=>this.compareBInput()??this.sessionOptions()[1]?.id??null);selectedASession=v(()=>this.sessionOptions().find(t=>t.id===this.selectedAId())??null);selectedBSession=v(()=>this.sessionOptions().find(t=>t.id===this.selectedBId())??null);baselineOptions=v(()=>this.filteredSessionOptions(this.baselineQuery(),this.selectedAId()));candidateOptions=v(()=>this.filteredSessionOptions(this.candidateQuery(),this.selectedBId()));abs=Math.abs;pricingFallbackReason=K;promptGroups=v(()=>this.samePromptGroups(this.sessionOptions()));comparison=v(()=>{let t=this.sessionOptions().find(R=>R.id===this.selectedAId()),e=this.sessionOptions().find(R=>R.id===this.selectedBId());if(!t||!e||t.id===e.id)return null;let n=this.sessionComparisonAnalysis(t),i=this.sessionComparisonAnalysis(e),l=i.totalTokens-n.totalTokens,p=w(t),d=w(e),g=d-p,P=i.inputContextUsd-n.inputContextUsd,I=i.outputUsd-n.outputUsd,M=e.traceSummary.toolCalls-t.traceSummary.toolCalls,N=e.traceSummary.modelTurns-t.traceSummary.modelTurns;return{a:t,b:e,aAnalysis:n,bAnalysis:i,promptMatch:$(t.firstPrompt)===$(e.firstPrompt),costDelta:g,totalTokenDelta:l,percent:S(p,d),summary:this.comparisonSummary(g,l,P,I,M,N),metrics:[{label:"Usage",a:p,b:d,delta:g,percent:S(p,d),format:"currency",lowerIsBetter:!0,help:"GitHub source usage when VS Code logged it. Falls back to local token pricing when source usage is unavailable."},{label:"Normal input tokens",a:t.tokens.input,b:e.tokens.input,delta:e.tokens.input-t.tokens.input,percent:S(t.tokens.input,e.tokens.input),format:"number",lowerIsBetter:!0,help:"Prompt/context tokens priced at the normal input rate. Cached input is shown separately when present."},{label:"Cached input tokens",a:t.tokens.cachedInput,b:e.tokens.cachedInput,delta:e.tokens.cachedInput-t.tokens.cachedInput,percent:S(t.tokens.cachedInput,e.tokens.cachedInput),format:"number",lowerIsBetter:!0,help:"Prompt/context tokens VS Code reported as cachedTokens. These are priced with the cached-input rate, not merged into normal input."},{label:"Cache write tokens",a:t.tokens.cacheWrite,b:e.tokens.cacheWrite,delta:e.tokens.cacheWrite-t.tokens.cacheWrite,percent:S(t.tokens.cacheWrite,e.tokens.cacheWrite),format:"number",lowerIsBetter:!0,help:"Cache creation tokens when VS Code exposes a numeric cache-write field. These are priced separately from normal and cached input."},{label:"Output tokens",a:t.tokens.output,b:e.tokens.output,delta:e.tokens.output-t.tokens.output,percent:S(t.tokens.output,e.tokens.output),format:"number",lowerIsBetter:!1,help:"Generated response tokens. More output can be useful, but it still affects cost."},{label:"Model turns",a:t.traceSummary.modelTurns,b:e.traceSummary.modelTurns,delta:N,percent:S(t.traceSummary.modelTurns,e.traceSummary.modelTurns),format:"number",lowerIsBetter:!1,help:"Model request count. More turns often means more accumulated context gets resent."},{label:"Tool calls",a:t.traceSummary.toolCalls,b:e.traceSummary.toolCalls,delta:M,percent:S(t.traceSummary.toolCalls,e.traceSummary.toolCalls),format:"number",lowerIsBetter:!1,help:"Tool activity. Tool results can become later input context."}],drivers:this.comparisonDrivers(n,i,g,P,I,M,N),modelRows:this.compareModelRows(n.modelRows,i.modelRows)}});setCompareA(t){let e=this.selectedAId(),n=this.selectedBId();this.compareAInput.set(t),this.compareAChange.emit(t),t&&t===n&&e&&e!==t&&(this.compareBInput.set(e),this.compareBChange.emit(e)),this.baselineQuery.set(""),this.baselinePickerOpen.set(!1)}setCompareB(t){let e=this.selectedAId(),n=this.selectedBId();this.compareBInput.set(t),this.compareBChange.emit(t),t&&t===e&&n&&n!==t&&(this.compareAInput.set(n),this.compareAChange.emit(n)),this.candidateQuery.set(""),this.candidatePickerOpen.set(!1)}setBaselineQuery(t){this.baselineQuery.set(t),this.baselinePickerOpen.set(!0)}setCandidateQuery(t){this.candidateQuery.set(t),this.candidatePickerOpen.set(!0)}openBaselinePicker(){this.baselinePickerOpen.set(!0)}openCandidatePicker(){this.candidatePickerOpen.set(!0)}closePickerOnFocusOut(t,e){let n=e.relatedTarget;if(!(n instanceof Node&&e.currentTarget instanceof Node&&e.currentTarget.contains(n))){if(t==="baseline"){this.baselinePickerOpen.set(!1);return}this.candidatePickerOpen.set(!1)}}compactDate(t){return new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(new Date(t))}runTokenTotal(t){return G(t)}usageUsd(t){return w(t)}promptRepeatCount(t){let e=$(t.firstPrompt);return e?this.promptGroups().find(n=>n.key===e)?.sessions.length??1:1}isSamePromptAsOther(t,e){let n=e==="baseline"?this.selectedBSession():this.selectedASession(),i=$(t.firstPrompt);return!!(n&&i&&i===$(n.firstPrompt))}tokenDeltaLabel(t){return`${t>=0?"+":""}${t.toLocaleString()}`}filteredSessionOptions(t,e){let n=t.trim().toLowerCase();if(!n)return this.sessionOptions();let i=this.sessionOptions().filter(p=>[p.title,p.firstPrompt,p.model,p.workspace].join(" ").toLowerCase().includes(n)),l=this.sessionOptions().find(p=>p.id===e);return l&&!i.some(p=>p.id===l.id)?[l,...i]:i}sessionComparisonAnalysis(t){let e=t.modelBreakdown.map(i=>X(i,w(t))),n=[...e].sort((i,l)=>l.totalUsd-i.totalUsd)[0]??null;return{session:t,modelRows:e,totalTokens:G(t),inputUsd:e.reduce((i,l)=>i+l.inputUsd,0),inputContextUsd:e.reduce((i,l)=>i+l.inputUsd+l.cachedInputUsd+l.cacheWriteUsd,0),outputUsd:e.reduce((i,l)=>i+l.outputUsd,0),cachedInputUsd:e.reduce((i,l)=>i+l.cachedInputUsd,0),cacheWriteUsd:e.reduce((i,l)=>i+l.cacheWriteUsd,0),topModel:n,modelNames:new Set(e.map(i=>i.model)),pricingRows:new Set(e.map(i=>i.pricingModel))}}samePromptGroups(t){let e=new Map;for(let n of t){let i=$(n.firstPrompt);i&&e.set(i,[...e.get(i)??[],n])}return[...e.entries()].filter(([,n])=>n.length>1).map(([n,i])=>{let l=[...i].sort((p,d)=>w(p)-w(d));return{key:n,sessions:[...i].sort((p,d)=>p.startedAt.localeCompare(d.startedAt)),costRangeUsd:w(l[l.length-1])-w(l[0])}}).sort((n,i)=>i.sessions.length-n.sessions.length||i.costRangeUsd-n.costRangeUsd)}comparisonSummary(t,e,n,i,l,p){let d=t>0?"more expensive":t<0?"cheaper":"about the same cost",g=e>0?"more":e<0?"fewer":"the same number of",P=Math.abs(n)>=Math.abs(i)?"input/context tokens":"generated output tokens",I=Math.abs(p)>=Math.abs(l)?`${Math.abs(p).toLocaleString()} ${p>=0?"more":"fewer"} model turns`:`${Math.abs(l).toLocaleString()} ${l>=0?"more":"fewer"} tool calls`;return t===0&&e===0?"These runs look equivalent on imported cost and token totals. Check logs if behavior differed qualitatively.":`Run B is ${d}, with ${Math.abs(e).toLocaleString()} ${g} imported tokens. The largest priced movement is ${P}; activity changed by ${I}.`}comparisonDrivers(t,e,n,i,l,p,d){let g=j(t.modelNames,e.modelNames)||j(t.pricingRows,e.pricingRows),P=t.topModel?.pricingModel!==e.topModel?.pricingModel;return[{title:"Cost movement",value:n>0?"Higher":n<0?"Lower":"Flat",tone:n>0?"high":n<0?"info":"medium",detail:n===0?"The imported estimate did not materially change between these two runs.":`Run B moved by ${n>0?"+":"-"}$${Math.abs(n).toFixed(4)}. Cheaper is only better if the run still did the job.`},{title:"Priced token driver",value:Math.abs(i)>=Math.abs(l)?"Input":"Output",tone:Math.abs(i)>=Math.abs(l)?"high":"medium",detail:Math.abs(i)>=Math.abs(l)?`Input/context cost moved by ${i>=0?"+":"-"}$${Math.abs(i).toFixed(4)} across normal input, cached input, and cache-write buckets. This is usually repo context, prior chat, or tool results.`:`Output cost moved by ${l>=0?"+":"-"}$${Math.abs(l).toFixed(4)}. The later run generated more or less text.`},{title:"Model pricing",value:g?"Changed":"Same",tone:g||P?"medium":"info",detail:g?`The model or pricing-row mix changed. A: ${[...t.pricingRows].join(", ")}. B: ${[...e.pricingRows].join(", ")}.`:`Both runs used the same imported pricing row mix: ${[...e.pricingRows].join(", ")}.`},{title:"Agent activity",value:`${d>=0?"+":""}${d} turns`,tone:d>3||p>10?"medium":"info",detail:`Run B has ${Math.abs(d)} ${d>=0?"more":"fewer"} model turns and ${Math.abs(p)} ${p>=0?"more":"fewer"} tool calls.`}]}compareModelRows(t,e){return[...new Set([...t,...e].map(i=>`${i.model}::${i.pricingModel}`))].map(i=>{let[l,p]=i.split("::"),d=t.find(M=>M.model===l&&M.pricingModel===p),g=e.find(M=>M.model===l&&M.pricingModel===p),P=d?L(d.tokens):0,I=g?L(g.tokens):0;return{model:l,pricingModel:p,usesFallbackPrice:Y(l,p),aCost:d?.totalUsd??0,bCost:g?.totalUsd??0,costDelta:(g?.totalUsd??0)-(d?.totalUsd??0),aTokens:P,bTokens:I,tokenDelta:I-P,inputDelta:(g?.tokens.input??0)-(d?.tokens.input??0),cachedInputDelta:(g?.tokens.cachedInput??0)-(d?.tokens.cachedInput??0),cacheWriteDelta:(g?.tokens.cacheWrite??0)-(d?.tokens.cacheWrite??0),outputDelta:(g?.tokens.output??0)-(d?.tokens.output??0),aTurns:d?.turns??0,bTurns:g?.turns??0}}).sort((i,l)=>Math.abs(l.costDelta)-Math.abs(i.costDelta))}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=q({type:r,selectors:[["app-compare-page"]],inputs:{sessions:"sessions",compareA:"compareA",compareB:"compareB"},outputs:{compareAChange:"compareAChange",compareBChange:"compareBChange"},decls:24,vars:11,consts:[[1,"compare"],[1,"compare-header"],[1,"eyebrow"],[1,"selectors"],[1,"run-picker",3,"focusout"],["type","button","aria-label","Open baseline run picker",1,"selected-run"],["type","search","placeholder","Search baseline runs","aria-label","Search baseline runs",3,"ngModelChange","focus","ngModel"],["role","listbox","aria-label","Baseline run results",1,"selector-results"],["type","button","aria-label","Open candidate run picker",1,"selected-run"],["type","search","placeholder","Search candidate runs","aria-label","Search candidate runs",3,"ngModelChange","focus","ngModel"],["role","listbox","aria-label","Candidate run results",1,"selector-results"],[1,"empty"],["type","button","aria-label","Open baseline run picker",1,"selected-run",3,"click"],["type","button","role","option",3,"active","same-prompt"],["type","button","role","option",3,"click"],[1,"match-chip"],[1,"match-chip","muted-chip"],["type","button","aria-label","Open candidate run picker",1,"selected-run",3,"click"],[1,"compare-readout"],[1,"compare-caveat"],[1,"comparison-grid","advanced"],[1,"comparison-section","comparison-drivers"],[1,"section-heading"],[1,"driver-list"],[3,"ngClass"],[1,"comparison-section","comparison-models"],[1,"cost-table","compact-table"],[1,"cost-row","cost-row-heading"],[1,"cost-row"],[3,"text","label"],[1,"warning-text"],[1,"token-movement"],["label","Explain fallback pricing",3,"text"]],template:function(e,n){if(e&1&&(a(0,"section",0)(1,"div",1)(2,"div")(3,"p",2),c(4,"Evaluation"),o(),a(5,"h2"),c(6,"Compare runs"),o(),a(7,"p"),c(8,"Pick a baseline and a candidate run. The page explains what changed in cost, tokens, activity, and model mix."),o()(),a(9,"div",3)(10,"div",4),O("focusout",function(l){return n.closePickerOnFocusOut("baseline",l)}),a(11,"span"),c(12,"Baseline A"),o(),x(13,le,6,6,"button",5),a(14,"input",6),O("ngModelChange",function(l){return n.setBaselineQuery(l)})("focus",function(){return n.openBaselinePicker()}),o(),x(15,ge,4,1,"div",7),o(),a(16,"div",4),O("focusout",function(l){return n.closePickerOnFocusOut("candidate",l)}),a(17,"span"),c(18,"Candidate B"),o(),x(19,Ce,6,6,"button",8),a(20,"input",9),O("ngModelChange",function(l){return n.setCandidateQuery(l)})("focus",function(){return n.openCandidatePicker()}),o(),x(21,fe,4,1,"div",10),o()()(),x(22,Ie,61,22)(23,Te,2,0,"p",11),o()),e&2){let i,l,p;s(10),y("open",n.baselinePickerOpen()),s(3),h((i=n.selectedASession())?13:-1,i),s(),A("ngModel",n.baselineQuery()),s(),h(n.baselinePickerOpen()?15:-1),s(),y("open",n.candidatePickerOpen()),s(3),h((l=n.selectedBSession())?19:-1,l),s(),A("ngModel",n.candidateQuery()),s(),h(n.candidatePickerOpen()?21:-1),s(),h((p=n.comparison())?22:23,p)}},dependencies:[ie,ee,te,ne,Z,H,J],styles:["[_nghost-%COMP%]{display:block}.compare[_ngcontent-%COMP%]{display:grid;gap:10px;border:1px solid var(--line);border-radius:16px;padding:16px;background:linear-gradient(180deg,#6f5cff09,#0c9f8305),var(--surface);box-shadow:var(--shadow-soft, 0 16px 38px rgba(15, 23, 42, .1))}.compare-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.compare[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:4px 0 0;color:var(--text-strong);font-size:22px;font-weight:760;letter-spacing:0}.compare-header[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:not(.eyebrow){max-width:620px;margin:6px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.eyebrow[_ngcontent-%COMP%]{margin:0;color:var(--accent-2);font-size:10px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.selectors[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(260px,360px));gap:12px;min-width:min(760px,62vw)}.run-picker[_ngcontent-%COMP%]{position:relative;display:grid;gap:6px;min-width:0}.run-picker[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{color:var(--muted);font-size:11px;font-weight:760}.selectors[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .selected-run[_ngcontent-%COMP%]{width:100%;border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:var(--control-bg, var(--surface-soft));color:var(--text);font:inherit;font-size:12px}.selected-run[_ngcontent-%COMP%]{display:grid;gap:3px;min-height:50px;text-align:left;cursor:pointer}.selected-run[_ngcontent-%COMP%]:hover, .run-picker.open[_ngcontent-%COMP%] .selected-run[_ngcontent-%COMP%]{border-color:#1fd1a573;box-shadow:0 0 0 3px #1fd1a514}.selected-run[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .selected-run[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.selected-run[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:12px;font-weight:760}.selected-run[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{color:var(--muted);font-size:11px;font-style:normal}.selectors[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{min-height:34px;border-color:#637d9438;background:color-mix(in srgb,var(--surface-soft) 78%,transparent)}.selectors[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder{color:var(--muted-2)}.selector-results[_ngcontent-%COMP%]{position:absolute;z-index:20;top:calc(100% + 6px);left:0;right:0;display:grid;gap:6px;max-height:min(320px,46vh);overflow:auto;border:1px solid var(--line);border-radius:11px;padding:6px;background:var(--surface);box-shadow:0 18px 42px #0f172a29}.selector-results[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:grid;gap:2px;width:100%;border:1px solid transparent;border-radius:9px;padding:8px 9px;background:transparent;color:var(--text);font:inherit;text-align:left;cursor:pointer}.selector-results[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover, .selector-results[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%]{border-color:#1fd1a559;background:#1fd1a514}.selector-results[_ngcontent-%COMP%] button.same-prompt[_ngcontent-%COMP%]{border-color:#6f5cff61;background:linear-gradient(135deg,#6f5cff17,#1fd1a50e),transparent}.selector-results[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{overflow:hidden;color:var(--text-strong);font-size:12px;font-weight:760;text-overflow:ellipsis;white-space:nowrap}.selector-results[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .selector-results[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{overflow:hidden;color:var(--muted);font-size:11px;font-style:normal;text-overflow:ellipsis;white-space:nowrap}.match-chip[_ngcontent-%COMP%]{display:inline-flex;align-items:center;width:fit-content;max-width:100%;border:1px solid rgba(111,92,255,.28);border-radius:999px;padding:2px 7px;background:#6f5cff17;color:var(--text-strong)!important;font-size:10px!important;font-weight:760;line-height:1.2}.match-chip.muted-chip[_ngcontent-%COMP%]{border-color:var(--line);background:color-mix(in srgb,var(--surface-soft) 72%,transparent);color:var(--muted)!important}.compare-readout[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:stretch;border:1px solid rgba(12,159,131,.2);border-radius:13px;padding:12px;background:radial-gradient(circle at 100% 0%,rgba(111,92,255,.11),transparent 34%),linear-gradient(135deg,#0c9f8313,#6f5cff09),var(--surface)}.compare-readout[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{border-left:4px solid var(--accent-2);padding-left:12px}.compare-readout[_ngcontent-%COMP%] dl[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(86px,1fr));gap:8px;align-self:center;margin:0}.compare-readout[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{display:grid;gap:4px;border:1px solid var(--line);border-radius:11px;padding:9px;background:var(--surface-soft)}.compare-readout[_ngcontent-%COMP%] dt[_ngcontent-%COMP%]{color:var(--muted-2);font-size:10px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.compare-readout[_ngcontent-%COMP%] dd[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:14px;font-weight:760;white-space:nowrap}.compare-readout[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block;margin-bottom:3px;color:var(--muted);font-size:11px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.compare-readout[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:22px;font-weight:760}.compare-readout[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{max-width:920px;margin:5px 0 0;color:var(--muted);font-size:12px;line-height:1.45}.compare-caveat[_ngcontent-%COMP%]{color:var(--warning-text, #ffcf75)!important}.comparison-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:7px}.comparison-grid[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;gap:3px;border:1px solid var(--line);border-radius:10px;padding:8px 9px;background:var(--surface-soft)}.comparison-grid[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .comparison-grid[_ngcontent-%COMP%] em[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{color:var(--muted);font-size:12px;font-style:normal}.comparison-grid[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:15px;font-weight:760;letter-spacing:0}.comparison-section[_ngcontent-%COMP%]{display:grid;gap:8px}.section-heading[_ngcontent-%COMP%]{display:flex;align-items:end;justify-content:space-between;gap:14px}.section-heading[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:var(--text-strong);font-size:15px;font-weight:760}.section-heading[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--muted);font-size:12px}.driver-list[_ngcontent-%COMP%]{display:grid;gap:6px}.driver-list[_ngcontent-%COMP%] article[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(155px,.34fr) minmax(0,1fr);gap:10px;align-items:start;border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:10px;padding:8px 10px;background:color-mix(in srgb,var(--surface-soft) 58%,transparent)}.driver-list[_ngcontent-%COMP%] article.medium[_ngcontent-%COMP%]{border-left-color:var(--warning)}.driver-list[_ngcontent-%COMP%] article.high[_ngcontent-%COMP%]{border-left-color:var(--danger)}.driver-list[_ngcontent-%COMP%] article[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{display:grid;gap:2px;min-width:0}.driver-list[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:var(--muted-2);font-size:10px;font-weight:760;letter-spacing:.08em;text-transform:uppercase}.driver-list[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong);font-size:14px;font-weight:760;line-height:1.1;overflow-wrap:anywhere}.driver-list[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--text);font-size:12px;line-height:1.35}.cost-table[_ngcontent-%COMP%]{display:grid;overflow:auto hidden;border:1px solid var(--line);border-radius:12px;background:var(--surface)}.cost-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:minmax(140px,1.05fr) minmax(110px,.82fr) minmax(128px,.95fr) minmax(190px,1.25fr) minmax(96px,.7fr) minmax(74px,.5fr);gap:8px;align-items:start;min-width:760px;border-bottom:1px solid var(--line);padding:8px 9px}.cost-row[_ngcontent-%COMP%]:last-child{border-bottom:0}.cost-row-heading[_ngcontent-%COMP%]{background:var(--surface-soft);font-size:11px;font-weight:720;text-transform:uppercase}.cost-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:grid;gap:3px}.cost-row[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-strong)}.cost-row[_ngcontent-%COMP%] .token-movement[_ngcontent-%COMP%]{gap:4px}.cost-row[_ngcontent-%COMP%] .token-movement[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;color:var(--text-strong);font-size:12px}.cost-row[_ngcontent-%COMP%] .token-movement[_ngcontent-%COMP%] em[_ngcontent-%COMP%]{line-height:1.35}.saving[_ngcontent-%COMP%]{color:var(--success-text, #35d07f)!important}.warning-text[_ngcontent-%COMP%]{color:var(--warning-text, #ffcf75)!important;font-weight:900}.empty[_ngcontent-%COMP%]{margin:0;color:var(--muted)}@media(max-width:900px){.compare-header[_ngcontent-%COMP%], .compare-readout[_ngcontent-%COMP%], .section-heading[_ngcontent-%COMP%]{display:grid}.comparison-grid[_ngcontent-%COMP%], .driver-list[_ngcontent-%COMP%] article[_ngcontent-%COMP%], .selectors[_ngcontent-%COMP%], .compare-readout[_ngcontent-%COMP%] dl[_ngcontent-%COMP%], .cost-row[_ngcontent-%COMP%]{grid-template-columns:1fr}.cost-row[_ngcontent-%COMP%], .selectors[_ngcontent-%COMP%]{min-width:0}}"]})};function $(r){return String(r??"").toLowerCase().replace(/[^\p{L}\p{N}#/@._-]+/gu," ").replace(/\s+/g," ").trim()}export{oe as ComparePageComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ba as l,J as n,Qa as d,ca as s,ta as o}from"./chunk-WOIYAEKB.js";var h=class r{element=n(s);dragging=!1;width=400;storageKey="copilot-usage-studio.results-sidebar-width";resizableMin=280;resizableMax=760;resizableDefault=400;role="separator";orientation="vertical";label="Resize results sidebar";tabindex=0;get ariaMin(){return this.resizableMin}get ariaMax(){return this.availableMax()}get ariaNow(){return Math.round(this.width)}ngOnInit(){this.width=this.readStoredWidth(),this.applyWidth(this.width,!1)}ngOnDestroy(){this.stopDragging()}onPointerDown(e){e.button===0&&(e.preventDefault(),this.dragging=!0,this.element.nativeElement.classList.add("dragging"),globalThis.addEventListener("pointermove",this.onPointerMove),globalThis.addEventListener("pointerup",this.onPointerUp,{once:!0}))}onKeyDown(e){if(!["ArrowLeft","ArrowRight","Home","End"].includes(e.key))return;e.preventDefault();let i=e.key==="Home"?this.resizableMin:e.key==="End"?this.availableMax():this.width+(e.key==="ArrowRight"?24:-24);this.applyWidth(i)}onPointerMove=e=>{if(!this.dragging)return;let i=this.element.nativeElement.parentElement;i&&this.applyWidth(e.clientX-i.getBoundingClientRect().left)};onPointerUp=()=>this.stopDragging();stopDragging(){this.dragging&&(this.dragging=!1,this.element.nativeElement.classList.remove("dragging"),globalThis.removeEventListener("pointermove",this.onPointerMove))}availableMax(){let e=this.element.nativeElement.parentElement?.clientWidth??this.resizableMax;return Math.max(this.resizableMin,Math.min(this.resizableMax,e-320))}applyWidth(e,i=!0){if(this.width=Math.max(this.resizableMin,Math.min(this.availableMax(),Number(e)||this.resizableDefault)),this.element.nativeElement.parentElement?.style.setProperty("--results-sidebar-width",`${this.width}px`),i)try{globalThis.localStorage?.setItem(this.storageKey,String(Math.round(this.width)))}catch{}}readStoredWidth(){try{return Number(globalThis.localStorage?.getItem(this.storageKey))||this.resizableDefault}catch{return this.resizableDefault}}static \u0275fac=function(i){return new(i||r)};static \u0275dir=o({type:r,selectors:[["","appResizableSidebar",""]],hostVars:7,hostBindings:function(i,t){i&1&&d("pointerdown",function(a){return t.onPointerDown(a)})("keydown",function(a){return t.onKeyDown(a)}),i&2&&l("role",t.role)("aria-orientation",t.orientation)("aria-label",t.label)("tabindex",t.tabindex)("aria-valuemin",t.ariaMin)("aria-valuemax",t.ariaMax)("aria-valuenow",t.ariaNow)},inputs:{storageKey:[0,"appResizableSidebar","storageKey"],resizableMin:"resizableMin",resizableMax:"resizableMax",resizableDefault:"resizableDefault"}})};export{h as a};
|