@code-insights/cli 3.6.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +40 -4
  3. package/dashboard-dist/assets/index-D1JDyyu5.js +660 -0
  4. package/dashboard-dist/assets/index-kwbCW1n2.css +1 -0
  5. package/dashboard-dist/index.html +2 -2
  6. package/dist/commands/reflect.d.ts +3 -0
  7. package/dist/commands/reflect.d.ts.map +1 -0
  8. package/dist/commands/reflect.js +457 -0
  9. package/dist/commands/reflect.js.map +1 -0
  10. package/dist/commands/reset.d.ts.map +1 -1
  11. package/dist/commands/reset.js +3 -1
  12. package/dist/commands/reset.js.map +1 -1
  13. package/dist/commands/stats/actions/patterns.d.ts +3 -0
  14. package/dist/commands/stats/actions/patterns.d.ts.map +1 -0
  15. package/dist/commands/stats/actions/patterns.js +140 -0
  16. package/dist/commands/stats/actions/patterns.js.map +1 -0
  17. package/dist/commands/stats/data/aggregation-helpers.d.ts +23 -0
  18. package/dist/commands/stats/data/aggregation-helpers.d.ts.map +1 -0
  19. package/dist/commands/stats/data/aggregation-helpers.js +128 -0
  20. package/dist/commands/stats/data/aggregation-helpers.js.map +1 -0
  21. package/dist/commands/stats/data/aggregation.d.ts +3 -35
  22. package/dist/commands/stats/data/aggregation.d.ts.map +1 -1
  23. package/dist/commands/stats/data/aggregation.js +8 -290
  24. package/dist/commands/stats/data/aggregation.js.map +1 -1
  25. package/dist/commands/stats/data/time-series.d.ts +24 -0
  26. package/dist/commands/stats/data/time-series.d.ts.map +1 -0
  27. package/dist/commands/stats/data/time-series.js +162 -0
  28. package/dist/commands/stats/data/time-series.js.map +1 -0
  29. package/dist/commands/stats/index.d.ts.map +1 -1
  30. package/dist/commands/stats/index.js +7 -1
  31. package/dist/commands/stats/index.js.map +1 -1
  32. package/dist/commands/sync.d.ts +19 -0
  33. package/dist/commands/sync.d.ts.map +1 -1
  34. package/dist/commands/sync.js +67 -1
  35. package/dist/commands/sync.js.map +1 -1
  36. package/dist/constants/llm-providers.js +1 -1
  37. package/dist/constants/llm-providers.js.map +1 -1
  38. package/dist/db/client.d.ts +7 -0
  39. package/dist/db/client.d.ts.map +1 -1
  40. package/dist/db/client.js +11 -1
  41. package/dist/db/client.js.map +1 -1
  42. package/dist/db/migrate.d.ts +10 -1
  43. package/dist/db/migrate.d.ts.map +1 -1
  44. package/dist/db/migrate.js +96 -0
  45. package/dist/db/migrate.js.map +1 -1
  46. package/dist/db/read.d.ts +5 -0
  47. package/dist/db/read.d.ts.map +1 -1
  48. package/dist/db/read.js +20 -3
  49. package/dist/db/read.js.map +1 -1
  50. package/dist/db/schema.d.ts +1 -1
  51. package/dist/db/schema.js +2 -2
  52. package/dist/db/schema.js.map +1 -1
  53. package/dist/db/write.d.ts.map +1 -1
  54. package/dist/db/write.js +8 -2
  55. package/dist/db/write.js.map +1 -1
  56. package/dist/index.js +39 -3
  57. package/dist/index.js.map +1 -1
  58. package/dist/parser/jsonl.d.ts +19 -1
  59. package/dist/parser/jsonl.d.ts.map +1 -1
  60. package/dist/parser/jsonl.js +109 -3
  61. package/dist/parser/jsonl.js.map +1 -1
  62. package/dist/providers/codex.js +4 -1
  63. package/dist/providers/codex.js.map +1 -1
  64. package/dist/providers/copilot-cli.js +3 -0
  65. package/dist/providers/copilot-cli.js.map +1 -1
  66. package/dist/providers/copilot.js +3 -0
  67. package/dist/providers/copilot.js.map +1 -1
  68. package/dist/providers/cursor.js +3 -0
  69. package/dist/providers/cursor.js.map +1 -1
  70. package/dist/types.d.ts +109 -0
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/utils/date-utils.d.ts +6 -0
  73. package/dist/utils/date-utils.d.ts.map +1 -0
  74. package/dist/utils/date-utils.js +26 -0
  75. package/dist/utils/date-utils.js.map +1 -0
  76. package/dist/utils/telemetry.d.ts +1 -1
  77. package/dist/utils/telemetry.d.ts.map +1 -1
  78. package/dist/utils/telemetry.js +1 -1
  79. package/dist/utils/telemetry.js.map +1 -1
  80. package/package.json +2 -1
  81. package/server-dist/export/agent-rules.d.ts.map +1 -1
  82. package/server-dist/export/agent-rules.js +15 -4
  83. package/server-dist/export/agent-rules.js.map +1 -1
  84. package/server-dist/export/knowledge-base.d.ts.map +1 -1
  85. package/server-dist/export/knowledge-base.js +30 -4
  86. package/server-dist/export/knowledge-base.js.map +1 -1
  87. package/server-dist/index.d.ts.map +1 -1
  88. package/server-dist/index.js +4 -0
  89. package/server-dist/index.js.map +1 -1
  90. package/server-dist/llm/analysis-db.d.ts +51 -0
  91. package/server-dist/llm/analysis-db.d.ts.map +1 -0
  92. package/server-dist/llm/analysis-db.js +208 -0
  93. package/server-dist/llm/analysis-db.js.map +1 -0
  94. package/server-dist/llm/analysis-internal.d.ts +36 -0
  95. package/server-dist/llm/analysis-internal.d.ts.map +1 -0
  96. package/server-dist/llm/analysis-internal.js +23 -0
  97. package/server-dist/llm/analysis-internal.js.map +1 -0
  98. package/server-dist/llm/analysis-pricing.d.ts +25 -0
  99. package/server-dist/llm/analysis-pricing.d.ts.map +1 -0
  100. package/server-dist/llm/analysis-pricing.js +74 -0
  101. package/server-dist/llm/analysis-pricing.js.map +1 -0
  102. package/server-dist/llm/analysis-usage-db.d.ts +45 -0
  103. package/server-dist/llm/analysis-usage-db.d.ts.map +1 -0
  104. package/server-dist/llm/analysis-usage-db.js +35 -0
  105. package/server-dist/llm/analysis-usage-db.js.map +1 -0
  106. package/server-dist/llm/analysis.d.ts +9 -79
  107. package/server-dist/llm/analysis.d.ts.map +1 -1
  108. package/server-dist/llm/analysis.js +119 -375
  109. package/server-dist/llm/analysis.js.map +1 -1
  110. package/server-dist/llm/facet-extraction.d.ts +14 -0
  111. package/server-dist/llm/facet-extraction.d.ts.map +1 -0
  112. package/server-dist/llm/facet-extraction.js +91 -0
  113. package/server-dist/llm/facet-extraction.js.map +1 -0
  114. package/server-dist/llm/friction-normalize.d.ts +16 -0
  115. package/server-dist/llm/friction-normalize.d.ts.map +1 -0
  116. package/server-dist/llm/friction-normalize.js +54 -0
  117. package/server-dist/llm/friction-normalize.js.map +1 -0
  118. package/server-dist/llm/index.d.ts +3 -2
  119. package/server-dist/llm/index.d.ts.map +1 -1
  120. package/server-dist/llm/index.js +1 -1
  121. package/server-dist/llm/index.js.map +1 -1
  122. package/server-dist/llm/message-format.d.ts +32 -0
  123. package/server-dist/llm/message-format.d.ts.map +1 -0
  124. package/server-dist/llm/message-format.js +129 -0
  125. package/server-dist/llm/message-format.js.map +1 -0
  126. package/server-dist/llm/normalize-utils.d.ts +22 -0
  127. package/server-dist/llm/normalize-utils.d.ts.map +1 -0
  128. package/server-dist/llm/normalize-utils.js +71 -0
  129. package/server-dist/llm/normalize-utils.js.map +1 -0
  130. package/server-dist/llm/pattern-normalize.d.ts +19 -0
  131. package/server-dist/llm/pattern-normalize.d.ts.map +1 -0
  132. package/server-dist/llm/pattern-normalize.js +90 -0
  133. package/server-dist/llm/pattern-normalize.js.map +1 -0
  134. package/server-dist/llm/prompt-constants.d.ts +9 -0
  135. package/server-dist/llm/prompt-constants.d.ts.map +1 -0
  136. package/server-dist/llm/prompt-constants.js +169 -0
  137. package/server-dist/llm/prompt-constants.js.map +1 -0
  138. package/server-dist/llm/prompt-quality-analysis.d.ts +8 -0
  139. package/server-dist/llm/prompt-quality-analysis.d.ts.map +1 -0
  140. package/server-dist/llm/prompt-quality-analysis.js +133 -0
  141. package/server-dist/llm/prompt-quality-analysis.js.map +1 -0
  142. package/server-dist/llm/prompt-quality-normalize.d.ts +26 -0
  143. package/server-dist/llm/prompt-quality-normalize.d.ts.map +1 -0
  144. package/server-dist/llm/prompt-quality-normalize.js +116 -0
  145. package/server-dist/llm/prompt-quality-normalize.js.map +1 -0
  146. package/server-dist/llm/prompt-types.d.ts +124 -0
  147. package/server-dist/llm/prompt-types.d.ts.map +1 -0
  148. package/server-dist/llm/prompt-types.js +4 -0
  149. package/server-dist/llm/prompt-types.js.map +1 -0
  150. package/server-dist/llm/prompts.d.ts +57 -100
  151. package/server-dist/llm/prompts.d.ts.map +1 -1
  152. package/server-dist/llm/prompts.js +606 -232
  153. package/server-dist/llm/prompts.js.map +1 -1
  154. package/server-dist/llm/providers/anthropic.d.ts.map +1 -1
  155. package/server-dist/llm/providers/anthropic.js +12 -0
  156. package/server-dist/llm/providers/anthropic.js.map +1 -1
  157. package/server-dist/llm/providers/gemini.d.ts.map +1 -1
  158. package/server-dist/llm/providers/gemini.js +10 -2
  159. package/server-dist/llm/providers/gemini.js.map +1 -1
  160. package/server-dist/llm/providers/ollama.d.ts.map +1 -1
  161. package/server-dist/llm/providers/ollama.js +3 -1
  162. package/server-dist/llm/providers/ollama.js.map +1 -1
  163. package/server-dist/llm/providers/openai.d.ts.map +1 -1
  164. package/server-dist/llm/providers/openai.js +4 -1
  165. package/server-dist/llm/providers/openai.js.map +1 -1
  166. package/server-dist/llm/recurring-insights.d.ts +26 -0
  167. package/server-dist/llm/recurring-insights.d.ts.map +1 -0
  168. package/server-dist/llm/recurring-insights.js +119 -0
  169. package/server-dist/llm/recurring-insights.js.map +1 -0
  170. package/server-dist/llm/reflect-prompts.d.ts +55 -0
  171. package/server-dist/llm/reflect-prompts.d.ts.map +1 -0
  172. package/server-dist/llm/reflect-prompts.js +151 -0
  173. package/server-dist/llm/reflect-prompts.js.map +1 -0
  174. package/server-dist/llm/response-parsers.d.ts +8 -0
  175. package/server-dist/llm/response-parsers.d.ts.map +1 -0
  176. package/server-dist/llm/response-parsers.js +151 -0
  177. package/server-dist/llm/response-parsers.js.map +1 -0
  178. package/server-dist/llm/types.d.ts +23 -1
  179. package/server-dist/llm/types.d.ts.map +1 -1
  180. package/server-dist/llm/types.js +10 -1
  181. package/server-dist/llm/types.js.map +1 -1
  182. package/server-dist/routes/analysis.d.ts.map +1 -1
  183. package/server-dist/routes/analysis.js +107 -282
  184. package/server-dist/routes/analysis.js.map +1 -1
  185. package/server-dist/routes/analytics.d.ts.map +1 -1
  186. package/server-dist/routes/analytics.js +3 -1
  187. package/server-dist/routes/analytics.js.map +1 -1
  188. package/server-dist/routes/export.d.ts.map +1 -1
  189. package/server-dist/routes/export.js +19 -27
  190. package/server-dist/routes/export.js.map +1 -1
  191. package/server-dist/routes/facets.d.ts +4 -0
  192. package/server-dist/routes/facets.d.ts.map +1 -0
  193. package/server-dist/routes/facets.js +208 -0
  194. package/server-dist/routes/facets.js.map +1 -0
  195. package/server-dist/routes/insights.d.ts.map +1 -1
  196. package/server-dist/routes/insights.js +12 -11
  197. package/server-dist/routes/insights.js.map +1 -1
  198. package/server-dist/routes/reflect.d.ts +4 -0
  199. package/server-dist/routes/reflect.d.ts.map +1 -0
  200. package/server-dist/routes/reflect.js +332 -0
  201. package/server-dist/routes/reflect.js.map +1 -0
  202. package/server-dist/routes/route-helpers.d.ts +124 -0
  203. package/server-dist/routes/route-helpers.d.ts.map +1 -0
  204. package/server-dist/routes/route-helpers.js +242 -0
  205. package/server-dist/routes/route-helpers.js.map +1 -0
  206. package/server-dist/routes/sessions.d.ts.map +1 -1
  207. package/server-dist/routes/sessions.js +29 -5
  208. package/server-dist/routes/sessions.js.map +1 -1
  209. package/server-dist/routes/shared-aggregation.d.ts +82 -0
  210. package/server-dist/routes/shared-aggregation.d.ts.map +1 -0
  211. package/server-dist/routes/shared-aggregation.js +384 -0
  212. package/server-dist/routes/shared-aggregation.js.map +1 -0
  213. package/dashboard-dist/assets/index-BaKju1iW.js +0 -607
  214. package/dashboard-dist/assets/index-_SWpRg6C.css +0 -1
@@ -0,0 +1,140 @@
1
+ // ──────────────────────────────────────────────────────
2
+ // stats patterns — View cross-session pattern analysis
3
+ // ──────────────────────────────────────────────────────
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { resolveDataSource } from '../data/source.js';
7
+ import { handleStatsError } from './error-handler.js';
8
+ import { loadConfig } from '../../../utils/config.js';
9
+ import { sectionHeader } from '../render/layout.js';
10
+ export async function patternsAction(flags) {
11
+ try {
12
+ const source = await resolveDataSource(flags);
13
+ // Sync first unless --no-sync
14
+ if (!flags.noSync) {
15
+ const spinner = ora({ text: 'Syncing...', indent: 2 }).start();
16
+ try {
17
+ const prepResult = await source.prepare(flags);
18
+ spinner.succeed(prepResult.message);
19
+ }
20
+ catch {
21
+ spinner.warn('Sync failed (showing cached data)');
22
+ }
23
+ }
24
+ const config = loadConfig();
25
+ const port = config?.dashboard?.port || 7890;
26
+ const baseUrl = `http://localhost:${port}`;
27
+ // Check if server is running
28
+ try {
29
+ await fetch(`${baseUrl}/api/health`);
30
+ }
31
+ catch {
32
+ console.log();
33
+ console.log(chalk.yellow(' Dashboard server is not running.'));
34
+ console.log(chalk.dim(' Start it with: code-insights dashboard'));
35
+ console.log();
36
+ return;
37
+ }
38
+ // Fetch aggregated data
39
+ const params = new URLSearchParams();
40
+ params.set('period', flags.period);
41
+ if (flags.project)
42
+ params.set('project', flags.project);
43
+ if (flags.source)
44
+ params.set('source', flags.source);
45
+ const res = await fetch(`${baseUrl}/api/reflect/results?${params.toString()}`);
46
+ if (!res.ok) {
47
+ console.log(chalk.red(` Failed to fetch patterns: ${res.statusText}`));
48
+ return;
49
+ }
50
+ const data = await res.json();
51
+ if (data.totalSessions === 0) {
52
+ console.log();
53
+ console.log(chalk.dim(' No sessions with facets found.'));
54
+ console.log(chalk.dim(' Run session analysis to extract facets, then try again.'));
55
+ console.log();
56
+ return;
57
+ }
58
+ console.log();
59
+ console.log(sectionHeader(`Patterns (${flags.period}) — ${data.totalSessions} sessions`));
60
+ console.log();
61
+ // Friction categories
62
+ if (data.frictionCategories.length > 0) {
63
+ console.log(chalk.bold(' Friction Categories'));
64
+ const maxCount = Math.max(...data.frictionCategories.map(fc => fc.count));
65
+ for (const fc of data.frictionCategories.slice(0, 10)) {
66
+ const barLen = Math.max(1, Math.round((fc.count / maxCount) * 20));
67
+ const bar = '█'.repeat(barLen);
68
+ const severityColor = fc.avg_severity >= 2.5 ? chalk.red : fc.avg_severity >= 1.5 ? chalk.yellow : chalk.green;
69
+ console.log(` ${chalk.dim(String(fc.count).padStart(3))} ${severityColor(bar)} ${fc.category}`);
70
+ }
71
+ console.log();
72
+ }
73
+ // Effective patterns
74
+ if (data.effectivePatterns.length > 0) {
75
+ console.log(chalk.bold(' Effective Patterns'));
76
+ for (const ep of data.effectivePatterns.slice(0, 5)) {
77
+ console.log(` ${chalk.green('✓')} ${ep.description} ${chalk.dim(`(${ep.frequency}x)`)}`);
78
+ }
79
+ console.log();
80
+ }
81
+ // Outcome distribution
82
+ const outcomes = Object.entries(data.outcomeDistribution);
83
+ if (outcomes.length > 0) {
84
+ console.log(chalk.bold(' Outcome Distribution'));
85
+ for (const [outcome, count] of outcomes) {
86
+ const icon = outcome === 'high' ? chalk.green('●') : outcome === 'medium' ? chalk.yellow('●') : outcome === 'low' ? chalk.red('●') : chalk.dim('●');
87
+ console.log(` ${icon} ${outcome}: ${count}`);
88
+ }
89
+ console.log();
90
+ }
91
+ // Workflow patterns
92
+ const workflows = Object.entries(data.workflowDistribution);
93
+ if (workflows.length > 0) {
94
+ console.log(chalk.bold(' Workflow Patterns'));
95
+ for (const [pattern, count] of workflows) {
96
+ console.log(` ${chalk.cyan('→')} ${pattern}: ${count}`);
97
+ }
98
+ console.log();
99
+ }
100
+ console.log(chalk.dim(' Generate full analysis: code-insights reflect'));
101
+ console.log(chalk.dim(' View in dashboard: code-insights dashboard → Patterns'));
102
+ console.log();
103
+ // Check for cached reflect snapshot
104
+ const snapshotRes = await fetch(`${baseUrl}/api/reflect/snapshot?${params.toString()}`);
105
+ if (snapshotRes.ok) {
106
+ const snapshotData = await snapshotRes.json();
107
+ if (snapshotData.snapshot) {
108
+ const snap = snapshotData.snapshot;
109
+ const genDate = new Date(snap.generatedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
110
+ const windowLabel = snap.windowStart
111
+ ? `${new Date(snap.windowStart).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${new Date(snap.windowEnd).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`
112
+ : 'All time';
113
+ console.log(chalk.dim(` ─── Last reflection (generated ${genDate} · ${windowLabel} · ${snap.sessionCount} sessions) ───`));
114
+ console.log();
115
+ const frictionWins = snap.results['friction-wins'];
116
+ if (frictionWins?.narrative) {
117
+ console.log(chalk.bold(' Friction & Wins'));
118
+ const lines = String(frictionWins.narrative).split('\n').slice(0, 3);
119
+ for (const line of lines) {
120
+ console.log(chalk.dim(' ') + line);
121
+ }
122
+ if (String(frictionWins.narrative).split('\n').length > 3) {
123
+ console.log(chalk.dim(' ...'));
124
+ }
125
+ console.log();
126
+ }
127
+ const stale = data.totalSessions > snap.sessionCount;
128
+ if (stale) {
129
+ console.log(chalk.yellow(` ${data.totalSessions - snap.sessionCount} new sessions since last reflection.`));
130
+ console.log(chalk.dim(' Run: code-insights reflect'));
131
+ console.log();
132
+ }
133
+ }
134
+ }
135
+ }
136
+ catch (error) {
137
+ handleStatsError(error);
138
+ }
139
+ }
140
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../../src/commands/stats/actions/patterns.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,uDAAuD;AACvD,yDAAyD;AAEzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAsBpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAiB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAE9C,8BAA8B;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC/C,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC;QAC7C,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAE3C,6BAA6B;QAC7B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,OAAO,aAAa,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAErD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,wBAAwB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoB,CAAC;QAEhD,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,KAAK,CAAC,MAAM,OAAO,IAAI,CAAC,aAAa,WAAW,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,sBAAsB;QACtB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC/G,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpJ,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC5D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,oCAAoC;QACpC,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,yBAAyB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxF,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,IAAI,EAQ1C,CAAC;YAEF,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC;gBACnC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3G,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;oBAClC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;oBAC/L,CAAC,CAAC,UAAU,CAAC;gBAEf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,OAAO,MAAM,WAAW,MAAM,IAAI,CAAC,YAAY,gBAAgB,CAAC,CAAC,CAAC;gBAC5H,OAAO,CAAC,GAAG,EAAE,CAAC;gBAEd,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBACnD,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC;oBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;oBACtC,CAAC;oBACD,IAAI,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;oBAClC,CAAC;oBACD,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;gBACrD,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,sCAAsC,CAAC,CAAC,CAAC;oBAC7G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;oBACvD,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Period, SessionRow } from './types.js';
2
+ export declare function sum<T>(items: T[], fn: (item: T) => number): number;
3
+ export declare function diffMinutes(start: Date, end: Date): number;
4
+ export declare function groupBy<T>(items: T[], keyFn: (item: T) => string): Map<string, T[]>;
5
+ export declare function findMostFrequent(items: string[]): string | undefined;
6
+ export declare function today(): Date;
7
+ export declare function yesterday(): Date;
8
+ export declare function startOfWeek(): Date;
9
+ /**
10
+ * Returns the start date for a given period, or undefined for 'all'.
11
+ */
12
+ export declare function periodStartDate(period: Period): Date | undefined;
13
+ /**
14
+ * Resolve the display title for a session.
15
+ */
16
+ export declare function resolveTitle(session: SessionRow): string;
17
+ /**
18
+ * Shorten a model identifier to a display-friendly name.
19
+ */
20
+ export declare function shortenModelName(model: string): string;
21
+ /** Pad a number to 2 digits */
22
+ export declare function pad2(n: number): string;
23
+ //# sourceMappingURL=aggregation-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregation-helpers.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/aggregation-helpers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIrD,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAE1D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAYnF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAepE;AAID,wBAAgB,KAAK,IAAI,IAAI,CAI5B;AAED,wBAAgB,SAAS,IAAI,IAAI,CAIhC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAMlC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAehE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAOxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBtD;AAED,+BAA+B;AAC/B,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtC"}
@@ -0,0 +1,128 @@
1
+ // Pure utility functions used across aggregation.ts and time-series.ts.
2
+ // No imports from aggregation.ts — these are leaf-level helpers.
3
+ // ─── Numeric helpers ──────────────────────────────────────────────────────────
4
+ export function sum(items, fn) {
5
+ return items.reduce((acc, item) => acc + fn(item), 0);
6
+ }
7
+ export function diffMinutes(start, end) {
8
+ return Math.max(0, (end.getTime() - start.getTime()) / 60_000);
9
+ }
10
+ export function groupBy(items, keyFn) {
11
+ const map = new Map();
12
+ for (const item of items) {
13
+ const key = keyFn(item);
14
+ const group = map.get(key);
15
+ if (group) {
16
+ group.push(item);
17
+ }
18
+ else {
19
+ map.set(key, [item]);
20
+ }
21
+ }
22
+ return map;
23
+ }
24
+ export function findMostFrequent(items) {
25
+ if (items.length === 0)
26
+ return undefined;
27
+ const counts = new Map();
28
+ for (const item of items) {
29
+ counts.set(item, (counts.get(item) ?? 0) + 1);
30
+ }
31
+ let best;
32
+ let bestCount = 0;
33
+ for (const [key, count] of counts) {
34
+ if (count > bestCount) {
35
+ best = key;
36
+ bestCount = count;
37
+ }
38
+ }
39
+ return best;
40
+ }
41
+ // ─── Date helpers ─────────────────────────────────────────────────────────────
42
+ export function today() {
43
+ const d = new Date();
44
+ d.setHours(0, 0, 0, 0);
45
+ return d;
46
+ }
47
+ export function yesterday() {
48
+ const d = today();
49
+ d.setDate(d.getDate() - 1);
50
+ return d;
51
+ }
52
+ export function startOfWeek() {
53
+ const d = today();
54
+ const day = d.getDay(); // 0=Sun, 1=Mon, ... 6=Sat
55
+ const diff = day === 0 ? 6 : day - 1; // days back to Monday
56
+ d.setDate(d.getDate() - diff);
57
+ return d;
58
+ }
59
+ /**
60
+ * Returns the start date for a given period, or undefined for 'all'.
61
+ */
62
+ export function periodStartDate(period) {
63
+ const d = today();
64
+ switch (period) {
65
+ case '7d':
66
+ d.setDate(d.getDate() - 7);
67
+ return d;
68
+ case '30d':
69
+ d.setDate(d.getDate() - 30);
70
+ return d;
71
+ case '90d':
72
+ d.setDate(d.getDate() - 90);
73
+ return d;
74
+ case 'all':
75
+ return undefined;
76
+ }
77
+ }
78
+ /**
79
+ * Resolve the display title for a session.
80
+ */
81
+ export function resolveTitle(session) {
82
+ return (session.customTitle ??
83
+ session.generatedTitle ??
84
+ session.summary ??
85
+ 'Untitled Session');
86
+ }
87
+ /**
88
+ * Shorten a model identifier to a display-friendly name.
89
+ */
90
+ export function shortenModelName(model) {
91
+ // Claude 4.x opus variants
92
+ if (/^claude-opus-4/.test(model))
93
+ return 'Opus 4.x';
94
+ // Claude 4.x sonnet variants
95
+ if (/^claude-sonnet-4/.test(model))
96
+ return 'Sonnet 4.x';
97
+ // Claude haiku variants (covers haiku-4-5, haiku-3-5, etc.)
98
+ if (/^claude-haiku/.test(model))
99
+ return 'Haiku';
100
+ // Claude 3.5 sonnet
101
+ if (/^claude-3-5-sonnet/.test(model))
102
+ return 'Sonnet 3.5';
103
+ // Claude 3.5 haiku
104
+ if (/^claude-3-5-haiku/.test(model))
105
+ return 'Haiku 3.5';
106
+ // Claude 3 opus
107
+ if (/^claude-3-opus/.test(model))
108
+ return 'Opus 3';
109
+ // Claude 3 sonnet
110
+ if (/^claude-3-sonnet/.test(model))
111
+ return 'Sonnet 3';
112
+ // Claude 3 haiku
113
+ if (/^claude-3-haiku/.test(model))
114
+ return 'Haiku 3';
115
+ // GPT-4o
116
+ if (/^gpt-4o/.test(model))
117
+ return 'GPT-4o';
118
+ // GPT-4-turbo
119
+ if (/^gpt-4-turbo/.test(model))
120
+ return 'GPT-4 Turbo';
121
+ // Fallback: truncate to 20 chars
122
+ return model.length > 20 ? model.slice(0, 20) : model;
123
+ }
124
+ /** Pad a number to 2 digits */
125
+ export function pad2(n) {
126
+ return n < 10 ? `0${n}` : `${n}`;
127
+ }
128
+ //# sourceMappingURL=aggregation-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregation-helpers.js","sourceRoot":"","sources":["../../../../src/commands/stats/data/aggregation-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,38 +1,6 @@
1
- import type { Period, SessionRow, StatsOverview, CostBreakdown, ProjectStatsEntry, TodayStats, ModelStatsEntry, TimeSeriesPoint, GroupedMetric, DayStats } from './types.js';
2
- /**
3
- * Returns the start date for a given period, or undefined for 'all'.
4
- */
5
- export declare function periodStartDate(period: Period): Date | undefined;
6
- /**
7
- * Resolve the display title for a session.
8
- */
9
- export declare function resolveTitle(session: SessionRow): string;
10
- /**
11
- * Shorten a model identifier to a display-friendly name.
12
- */
13
- export declare function shortenModelName(model: string): string;
14
- /**
15
- * Returns the bucket key for a given date based on period granularity.
16
- */
17
- export declare function bucketKey(date: Date, period: Period): string;
18
- /**
19
- * Create empty time-series buckets for the full date range.
20
- * Uses an optional referenceDate for deterministic testing (defaults to today).
21
- */
22
- export declare function createBuckets(period: Period, referenceDate?: Date): Map<string, TimeSeriesPoint>;
23
- /**
24
- * Group sessions into time-series buckets.
25
- * Returns an array sorted oldest-first with gap-filling (zero values).
26
- */
27
- export declare function groupByDay(sessions: SessionRow[], period: Period, metric?: 'sessions' | 'cost' | 'tokens'): TimeSeriesPoint[];
28
- /**
29
- * Compute stats for sessions starting on a specific calendar day.
30
- */
31
- export declare function computeDayStats(sessions: SessionRow[], dayStart: Date): DayStats;
32
- /**
33
- * Compute stats for sessions in a [from, to) date range.
34
- */
35
- export declare function computeRangeStats(sessions: SessionRow[], from: Date, to: Date): DayStats;
1
+ import type { Period, SessionRow, StatsOverview, CostBreakdown, ProjectStatsEntry, TodayStats, ModelStatsEntry, GroupedMetric } from './types.js';
2
+ export { periodStartDate, resolveTitle, shortenModelName } from './aggregation-helpers.js';
3
+ export { bucketKey, createBuckets, groupByDay, computeDayStats, computeRangeStats } from './time-series.js';
36
4
  /**
37
5
  * Compute top projects by session count.
38
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"aggregation.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/aggregation.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,UAAU,EAEV,eAAe,EACf,eAAe,EACf,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAC;AAsEpB;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAehE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAOxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAuBtD;AA6BD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAoB5D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,IAAI,GACnB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CA+C9B;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,UAAU,GAAG,MAAM,GAAG,QAAqB,GAClD,eAAe,EAAE,CA2BnB;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAmBhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,IAAI,GACP,QAAQ,CAcV;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,MAAM,GACZ,aAAa,EAAE,CAgBjB;AA6BD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,aAAa,CA2Df;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,aAAa,CA8Gf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,iBAAiB,EAAE,CAyCrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,CAqDpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,eAAe,EAAE,CAyDnB"}
1
+ {"version":3,"file":"aggregation.d.ts","sourceRoot":"","sources":["../../../../src/commands/stats/data/aggregation.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,UAAU,EAEV,eAAe,EACf,aAAa,EACd,MAAM,YAAY,CAAC;AAuBpB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM5G;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,EAAE,MAAM,GACZ,aAAa,EAAE,CAgBjB;AA6BD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,aAAa,CA2Df;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,aAAa,CA8Gf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,iBAAiB,EAAE,CAyCrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,UAAU,CAqDpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,EAAE,MAAM,GACb,eAAe,EAAE,CAyDnB"}