@tokscale/cli 1.0.17 → 1.0.19

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 (111) hide show
  1. package/dist/cli.js +214 -91
  2. package/dist/cli.js.map +1 -1
  3. package/dist/graph-types.d.ts +1 -1
  4. package/dist/graph-types.d.ts.map +1 -1
  5. package/dist/native-runner.d.ts +1 -2
  6. package/dist/native-runner.d.ts.map +1 -1
  7. package/dist/native-runner.js +11 -39
  8. package/dist/native-runner.js.map +1 -1
  9. package/dist/native.d.ts +9 -30
  10. package/dist/native.d.ts.map +1 -1
  11. package/dist/native.js +31 -138
  12. package/dist/native.js.map +1 -1
  13. package/dist/sessions/types.d.ts +1 -1
  14. package/dist/sessions/types.d.ts.map +1 -1
  15. package/dist/submit.d.ts +2 -0
  16. package/dist/submit.d.ts.map +1 -1
  17. package/dist/submit.js +32 -16
  18. package/dist/submit.js.map +1 -1
  19. package/dist/tui/App.d.ts.map +1 -1
  20. package/dist/tui/App.js +14 -7
  21. package/dist/tui/App.js.map +1 -1
  22. package/dist/tui/components/DailyView.d.ts.map +1 -1
  23. package/dist/tui/components/DailyView.js +25 -8
  24. package/dist/tui/components/DailyView.js.map +1 -1
  25. package/dist/tui/components/DateBreakdownPanel.js +2 -2
  26. package/dist/tui/components/DateBreakdownPanel.js.map +1 -1
  27. package/dist/tui/components/Footer.d.ts.map +1 -1
  28. package/dist/tui/components/Footer.js +2 -3
  29. package/dist/tui/components/Footer.js.map +1 -1
  30. package/dist/tui/components/LoadingSpinner.d.ts.map +1 -1
  31. package/dist/tui/components/LoadingSpinner.js +1 -2
  32. package/dist/tui/components/LoadingSpinner.js.map +1 -1
  33. package/dist/tui/components/ModelView.js +2 -2
  34. package/dist/tui/components/ModelView.js.map +1 -1
  35. package/dist/tui/config/settings.d.ts +4 -4
  36. package/dist/tui/config/settings.d.ts.map +1 -1
  37. package/dist/tui/config/settings.js +11 -4
  38. package/dist/tui/config/settings.js.map +1 -1
  39. package/dist/tui/hooks/useData.d.ts.map +1 -1
  40. package/dist/tui/hooks/useData.js +29 -42
  41. package/dist/tui/hooks/useData.js.map +1 -1
  42. package/dist/tui/types/index.d.ts +2 -2
  43. package/dist/tui/types/index.d.ts.map +1 -1
  44. package/dist/tui/types/index.js +3 -1
  45. package/dist/tui/types/index.js.map +1 -1
  46. package/dist/tui/utils/colors.d.ts +1 -0
  47. package/dist/tui/utils/colors.d.ts.map +1 -1
  48. package/dist/tui/utils/colors.js +7 -0
  49. package/dist/tui/utils/colors.js.map +1 -1
  50. package/dist/wrapped.d.ts.map +1 -1
  51. package/dist/wrapped.js +20 -48
  52. package/dist/wrapped.js.map +1 -1
  53. package/package.json +2 -2
  54. package/src/cli.ts +232 -97
  55. package/src/graph-types.ts +1 -1
  56. package/src/native-runner.js +4 -0
  57. package/src/native-runner.ts +12 -42
  58. package/src/native.ts +47 -207
  59. package/src/sessions/types.ts +1 -1
  60. package/src/submit.ts +36 -22
  61. package/src/tui/App.tsx +10 -7
  62. package/src/tui/components/DailyView.tsx +29 -11
  63. package/src/tui/components/DateBreakdownPanel.tsx +2 -2
  64. package/src/tui/components/Footer.tsx +7 -2
  65. package/src/tui/components/LoadingSpinner.tsx +1 -2
  66. package/src/tui/components/ModelView.tsx +2 -2
  67. package/src/tui/config/settings.ts +18 -9
  68. package/src/tui/hooks/useData.ts +36 -47
  69. package/src/tui/types/index.ts +5 -4
  70. package/src/tui/utils/colors.ts +7 -0
  71. package/src/wrapped.ts +21 -54
  72. package/dist/graph.d.ts +0 -29
  73. package/dist/graph.d.ts.map +0 -1
  74. package/dist/graph.js +0 -383
  75. package/dist/graph.js.map +0 -1
  76. package/dist/pricing.d.ts +0 -58
  77. package/dist/pricing.d.ts.map +0 -1
  78. package/dist/pricing.js +0 -232
  79. package/dist/pricing.js.map +0 -1
  80. package/dist/sessions/claudecode.d.ts +0 -8
  81. package/dist/sessions/claudecode.d.ts.map +0 -1
  82. package/dist/sessions/claudecode.js +0 -84
  83. package/dist/sessions/claudecode.js.map +0 -1
  84. package/dist/sessions/codex.d.ts +0 -8
  85. package/dist/sessions/codex.d.ts.map +0 -1
  86. package/dist/sessions/codex.js +0 -158
  87. package/dist/sessions/codex.js.map +0 -1
  88. package/dist/sessions/gemini.d.ts +0 -8
  89. package/dist/sessions/gemini.d.ts.map +0 -1
  90. package/dist/sessions/gemini.js +0 -66
  91. package/dist/sessions/gemini.js.map +0 -1
  92. package/dist/sessions/index.d.ts +0 -32
  93. package/dist/sessions/index.d.ts.map +0 -1
  94. package/dist/sessions/index.js +0 -96
  95. package/dist/sessions/index.js.map +0 -1
  96. package/dist/sessions/opencode.d.ts +0 -9
  97. package/dist/sessions/opencode.d.ts.map +0 -1
  98. package/dist/sessions/opencode.js +0 -69
  99. package/dist/sessions/opencode.js.map +0 -1
  100. package/dist/sessions/reports.d.ts +0 -58
  101. package/dist/sessions/reports.d.ts.map +0 -1
  102. package/dist/sessions/reports.js +0 -337
  103. package/dist/sessions/reports.js.map +0 -1
  104. package/src/graph.ts +0 -485
  105. package/src/pricing.ts +0 -309
  106. package/src/sessions/claudecode.ts +0 -119
  107. package/src/sessions/codex.ts +0 -227
  108. package/src/sessions/gemini.ts +0 -108
  109. package/src/sessions/index.ts +0 -126
  110. package/src/sessions/opencode.ts +0 -117
  111. package/src/sessions/reports.ts +0 -475
@@ -1,96 +0,0 @@
1
- /**
2
- * Session parsers for different AI coding assistant formats
3
- *
4
- * This module provides TypeScript fallback parsers that match the Rust
5
- * implementations in packages/core/src/sessions/. Used when native module
6
- * is not available.
7
- */
8
- export * from "./types.js";
9
- export { parseOpenCodeMessages, getOpenCodeStoragePath } from "./opencode.js";
10
- export { parseClaudeCodeMessages, getClaudeCodeProjectsPath } from "./claudecode.js";
11
- export { parseCodexMessages, getCodexSessionsPath } from "./codex.js";
12
- export { parseGeminiMessages, getGeminiBasePath } from "./gemini.js";
13
- import { parseOpenCodeMessages } from "./opencode.js";
14
- import { parseClaudeCodeMessages } from "./claudecode.js";
15
- import { parseCodexMessages } from "./codex.js";
16
- import { parseGeminiMessages } from "./gemini.js";
17
- /**
18
- * Check if a message date is within the filter range
19
- */
20
- function isDateInRange(date, since, until, year) {
21
- // Year filter
22
- if (year && !date.startsWith(year)) {
23
- return false;
24
- }
25
- // Since filter
26
- if (since && date < since) {
27
- return false;
28
- }
29
- // Until filter
30
- if (until && date > until) {
31
- return false;
32
- }
33
- return true;
34
- }
35
- /**
36
- * Parse all local session sources using TypeScript fallback parsers
37
- */
38
- export function parseLocalSources(options = {}) {
39
- const startTime = performance.now();
40
- const sources = options.sources;
41
- const allMessages = [];
42
- let opencodeCount = 0;
43
- let claudeCount = 0;
44
- let codexCount = 0;
45
- let geminiCount = 0;
46
- // Parse OpenCode
47
- if (!sources || sources.includes("opencode")) {
48
- const messages = parseOpenCodeMessages();
49
- for (const msg of messages) {
50
- if (isDateInRange(msg.date, options.since, options.until, options.year)) {
51
- allMessages.push(msg);
52
- opencodeCount++;
53
- }
54
- }
55
- }
56
- // Parse Claude Code
57
- if (!sources || sources.includes("claude")) {
58
- const messages = parseClaudeCodeMessages();
59
- for (const msg of messages) {
60
- if (isDateInRange(msg.date, options.since, options.until, options.year)) {
61
- allMessages.push(msg);
62
- claudeCount++;
63
- }
64
- }
65
- }
66
- // Parse Codex
67
- if (!sources || sources.includes("codex")) {
68
- const messages = parseCodexMessages();
69
- for (const msg of messages) {
70
- if (isDateInRange(msg.date, options.since, options.until, options.year)) {
71
- allMessages.push(msg);
72
- codexCount++;
73
- }
74
- }
75
- }
76
- // Parse Gemini
77
- if (!sources || sources.includes("gemini")) {
78
- const messages = parseGeminiMessages();
79
- for (const msg of messages) {
80
- if (isDateInRange(msg.date, options.since, options.until, options.year)) {
81
- allMessages.push(msg);
82
- geminiCount++;
83
- }
84
- }
85
- }
86
- const processingTimeMs = performance.now() - startTime;
87
- return {
88
- messages: allMessages,
89
- opencodeCount,
90
- claudeCount,
91
- codexCount,
92
- geminiCount,
93
- processingTimeMs,
94
- };
95
- }
96
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * OpenCode session parser
3
- * Reads from ~/.local/share/opencode/storage/message/
4
- */
5
- import { type UnifiedMessage } from "./types.js";
6
- export declare function normalizeAgentName(agent: string): string;
7
- export declare function getOpenCodeStoragePath(): string;
8
- export declare function parseOpenCodeMessages(): UnifiedMessage[];
9
- //# sourceMappingURL=opencode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/sessions/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAwB,KAAK,cAAc,EAAuB,MAAM,YAAY,CAAC;AA0B5F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAexD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAED,wBAAgB,qBAAqB,IAAI,cAAc,EAAE,CA4DxD"}
@@ -1,69 +0,0 @@
1
- /**
2
- * OpenCode session parser
3
- * Reads from ~/.local/share/opencode/storage/message/
4
- */
5
- import * as fs from "node:fs";
6
- import * as path from "node:path";
7
- import * as os from "node:os";
8
- import { createUnifiedMessage } from "./types.js";
9
- export function normalizeAgentName(agent) {
10
- const agentLower = agent.toLowerCase();
11
- if (agentLower.includes("plan")) {
12
- if (agentLower.includes("omo") || agentLower.includes("sisyphus")) {
13
- return "Planner-Sisyphus";
14
- }
15
- return agent;
16
- }
17
- if (agentLower === "omo" || agentLower === "sisyphus") {
18
- return "Sisyphus";
19
- }
20
- return agent;
21
- }
22
- export function getOpenCodeStoragePath() {
23
- const dataHome = process.env.XDG_DATA_HOME || path.join(os.homedir(), ".local", "share");
24
- return path.join(dataHome, "opencode", "storage");
25
- }
26
- export function parseOpenCodeMessages() {
27
- const storagePath = getOpenCodeStoragePath();
28
- const messagePath = path.join(storagePath, "message");
29
- if (!fs.existsSync(messagePath)) {
30
- return [];
31
- }
32
- const messages = [];
33
- try {
34
- const sessionDirs = fs
35
- .readdirSync(messagePath)
36
- .map((dir) => path.join(messagePath, dir))
37
- .filter((dir) => fs.statSync(dir).isDirectory());
38
- for (const sessionDir of sessionDirs) {
39
- const sessionId = path.basename(sessionDir);
40
- const files = fs.readdirSync(sessionDir).filter((f) => f.endsWith(".json"));
41
- for (const file of files) {
42
- try {
43
- const content = fs.readFileSync(path.join(sessionDir, file), "utf-8");
44
- const msg = JSON.parse(content);
45
- if (msg.role === "assistant" && msg.tokens && msg.modelID) {
46
- const tokens = {
47
- input: msg.tokens.input || 0,
48
- output: msg.tokens.output || 0,
49
- cacheRead: msg.tokens.cache?.read || 0,
50
- cacheWrite: msg.tokens.cache?.write || 0,
51
- reasoning: msg.tokens.reasoning || 0,
52
- };
53
- const agentOrMode = msg.mode || msg.agent;
54
- const agent = agentOrMode ? normalizeAgentName(agentOrMode) : undefined;
55
- messages.push(createUnifiedMessage("opencode", msg.modelID, msg.providerID || "unknown", sessionId, msg.time.created, tokens, msg.cost || 0, agent));
56
- }
57
- }
58
- catch {
59
- // Skip malformed files
60
- }
61
- }
62
- }
63
- }
64
- catch {
65
- // Skip inaccessible directories
66
- }
67
- return messages;
68
- }
69
- //# sourceMappingURL=opencode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/sessions/opencode.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- /**
2
- * TypeScript fallback report generators
3
- *
4
- * Used when native Rust module is not available.
5
- */
6
- import type { UnifiedMessage } from "./types.js";
7
- import type { PricingEntry } from "../pricing.js";
8
- import type { TokenContributionData } from "../graph-types.js";
9
- export interface ModelUsage {
10
- source: string;
11
- model: string;
12
- provider: string;
13
- input: number;
14
- output: number;
15
- cacheRead: number;
16
- cacheWrite: number;
17
- reasoning: number;
18
- messageCount: number;
19
- cost: number;
20
- }
21
- export interface ModelReport {
22
- entries: ModelUsage[];
23
- totalInput: number;
24
- totalOutput: number;
25
- totalCacheRead: number;
26
- totalCacheWrite: number;
27
- totalMessages: number;
28
- totalCost: number;
29
- processingTimeMs: number;
30
- }
31
- export interface MonthlyUsage {
32
- month: string;
33
- models: string[];
34
- input: number;
35
- output: number;
36
- cacheRead: number;
37
- cacheWrite: number;
38
- messageCount: number;
39
- cost: number;
40
- }
41
- export interface MonthlyReport {
42
- entries: MonthlyUsage[];
43
- totalCost: number;
44
- processingTimeMs: number;
45
- }
46
- /**
47
- * Generate model report from parsed messages
48
- */
49
- export declare function generateModelReport(messages: UnifiedMessage[], pricing: PricingEntry[], startTime: number): ModelReport;
50
- /**
51
- * Generate monthly report from parsed messages
52
- */
53
- export declare function generateMonthlyReport(messages: UnifiedMessage[], pricing: PricingEntry[], startTime: number): MonthlyReport;
54
- /**
55
- * Generate graph data from parsed messages
56
- */
57
- export declare function generateGraphData(messages: UnifiedMessage[], pricing: PricingEntry[], startTime: number): TokenContributionData;
58
- //# sourceMappingURL=reports.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/sessions/reports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AA8ED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,WAAW,CA6Db;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,aAAa,CAkEf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,SAAS,EAAE,MAAM,GAChB,qBAAqB,CAkMvB"}
@@ -1,337 +0,0 @@
1
- /**
2
- * TypeScript fallback report generators
3
- *
4
- * Used when native Rust module is not available.
5
- */
6
- import { normalizeModelName, isWordBoundaryMatch } from "../pricing.js";
7
- function buildPricingLookup(pricing) {
8
- const map = new Map();
9
- for (const entry of pricing) {
10
- map.set(entry.modelId, entry.pricing);
11
- }
12
- const sortedKeys = [...map.keys()].sort();
13
- const prefixes = ["anthropic/", "openai/", "google/", "bedrock/"];
14
- return {
15
- get(modelId) {
16
- if (map.has(modelId))
17
- return map.get(modelId);
18
- for (const prefix of prefixes) {
19
- if (map.has(prefix + modelId))
20
- return map.get(prefix + modelId);
21
- }
22
- const normalized = normalizeModelName(modelId);
23
- if (normalized) {
24
- if (map.has(normalized))
25
- return map.get(normalized);
26
- for (const prefix of prefixes) {
27
- if (map.has(prefix + normalized))
28
- return map.get(prefix + normalized);
29
- }
30
- }
31
- const lowerModelId = modelId.toLowerCase();
32
- const lowerNormalized = normalized?.toLowerCase();
33
- for (const key of sortedKeys) {
34
- const lowerKey = key.toLowerCase();
35
- if (isWordBoundaryMatch(lowerKey, lowerModelId))
36
- return map.get(key);
37
- if (lowerNormalized && isWordBoundaryMatch(lowerKey, lowerNormalized))
38
- return map.get(key);
39
- }
40
- for (const key of sortedKeys) {
41
- const lowerKey = key.toLowerCase();
42
- if (isWordBoundaryMatch(lowerModelId, lowerKey))
43
- return map.get(key);
44
- if (lowerNormalized && isWordBoundaryMatch(lowerNormalized, lowerKey))
45
- return map.get(key);
46
- }
47
- return undefined;
48
- },
49
- };
50
- }
51
- /**
52
- * Calculate cost for a message based on token counts and pricing
53
- */
54
- function calculateCost(tokens, pricing) {
55
- if (!pricing)
56
- return 0;
57
- let cost = 0;
58
- cost += tokens.input * pricing.inputCostPerToken;
59
- cost += tokens.output * pricing.outputCostPerToken;
60
- cost += tokens.cacheRead * (pricing.cacheReadInputTokenCost || 0);
61
- cost += tokens.cacheWrite * (pricing.cacheCreationInputTokenCost || 0);
62
- // Note: reasoning tokens are typically charged at output rate
63
- cost += tokens.reasoning * pricing.outputCostPerToken;
64
- return cost;
65
- }
66
- /**
67
- * Generate model report from parsed messages
68
- */
69
- export function generateModelReport(messages, pricing, startTime) {
70
- const pricingMap = buildPricingLookup(pricing);
71
- // Aggregate by source + model
72
- const aggregated = new Map();
73
- for (const msg of messages) {
74
- const key = `${msg.source}:${msg.modelId}`;
75
- let usage = aggregated.get(key);
76
- if (!usage) {
77
- usage = {
78
- source: msg.source,
79
- model: msg.modelId,
80
- provider: msg.providerId,
81
- input: 0,
82
- output: 0,
83
- cacheRead: 0,
84
- cacheWrite: 0,
85
- reasoning: 0,
86
- messageCount: 0,
87
- cost: 0,
88
- };
89
- aggregated.set(key, usage);
90
- }
91
- usage.input += msg.tokens.input;
92
- usage.output += msg.tokens.output;
93
- usage.cacheRead += msg.tokens.cacheRead;
94
- usage.cacheWrite += msg.tokens.cacheWrite;
95
- usage.reasoning += msg.tokens.reasoning;
96
- usage.messageCount++;
97
- const calculatedCost = calculateCost(msg.tokens, pricingMap.get(msg.modelId));
98
- usage.cost += calculatedCost > 0 ? calculatedCost : msg.cost;
99
- }
100
- const entries = Array.from(aggregated.values()).sort((a, b) => b.cost - a.cost);
101
- const totals = entries.reduce((acc, e) => ({
102
- input: acc.input + e.input,
103
- output: acc.output + e.output,
104
- cacheRead: acc.cacheRead + e.cacheRead,
105
- cacheWrite: acc.cacheWrite + e.cacheWrite,
106
- messages: acc.messages + e.messageCount,
107
- cost: acc.cost + e.cost,
108
- }), { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, messages: 0, cost: 0 });
109
- return {
110
- entries,
111
- totalInput: totals.input,
112
- totalOutput: totals.output,
113
- totalCacheRead: totals.cacheRead,
114
- totalCacheWrite: totals.cacheWrite,
115
- totalMessages: totals.messages,
116
- totalCost: totals.cost,
117
- processingTimeMs: performance.now() - startTime,
118
- };
119
- }
120
- /**
121
- * Generate monthly report from parsed messages
122
- */
123
- export function generateMonthlyReport(messages, pricing, startTime) {
124
- const pricingMap = buildPricingLookup(pricing);
125
- // Aggregate by month
126
- const aggregated = new Map();
127
- for (const msg of messages) {
128
- // Extract YYYY-MM from date
129
- const month = msg.date.slice(0, 7);
130
- let usage = aggregated.get(month);
131
- if (!usage) {
132
- usage = {
133
- models: new Set(),
134
- input: 0,
135
- output: 0,
136
- cacheRead: 0,
137
- cacheWrite: 0,
138
- messageCount: 0,
139
- cost: 0,
140
- };
141
- aggregated.set(month, usage);
142
- }
143
- usage.models.add(msg.modelId);
144
- usage.input += msg.tokens.input;
145
- usage.output += msg.tokens.output;
146
- usage.cacheRead += msg.tokens.cacheRead;
147
- usage.cacheWrite += msg.tokens.cacheWrite;
148
- usage.messageCount++;
149
- const calculatedCost = calculateCost(msg.tokens, pricingMap.get(msg.modelId));
150
- usage.cost += calculatedCost > 0 ? calculatedCost : msg.cost;
151
- }
152
- const entries = Array.from(aggregated.entries())
153
- .map(([month, data]) => ({
154
- month,
155
- models: Array.from(data.models),
156
- input: data.input,
157
- output: data.output,
158
- cacheRead: data.cacheRead,
159
- cacheWrite: data.cacheWrite,
160
- messageCount: data.messageCount,
161
- cost: data.cost,
162
- }))
163
- .sort((a, b) => b.month.localeCompare(a.month)); // Most recent first
164
- const totalCost = entries.reduce((sum, e) => sum + e.cost, 0);
165
- return {
166
- entries,
167
- totalCost,
168
- processingTimeMs: performance.now() - startTime,
169
- };
170
- }
171
- /**
172
- * Generate graph data from parsed messages
173
- */
174
- export function generateGraphData(messages, pricing, startTime) {
175
- const pricingMap = buildPricingLookup(pricing);
176
- // Group messages by date
177
- const byDate = new Map();
178
- const allSources = new Set();
179
- const allModels = new Set();
180
- let totalTokens = 0;
181
- let totalCost = 0;
182
- let maxCostInSingleDay = 0;
183
- for (const msg of messages) {
184
- allSources.add(msg.source);
185
- allModels.add(msg.modelId);
186
- let dayData = byDate.get(msg.date);
187
- if (!dayData) {
188
- dayData = {
189
- tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0 },
190
- cost: 0,
191
- messages: 0,
192
- sources: new Map(),
193
- };
194
- byDate.set(msg.date, dayData);
195
- }
196
- const calculatedCost = calculateCost(msg.tokens, pricingMap.get(msg.modelId));
197
- const msgCost = calculatedCost > 0 ? calculatedCost : msg.cost;
198
- dayData.tokens.input += msg.tokens.input;
199
- dayData.tokens.output += msg.tokens.output;
200
- dayData.tokens.cacheRead += msg.tokens.cacheRead;
201
- dayData.tokens.cacheWrite += msg.tokens.cacheWrite;
202
- dayData.tokens.reasoning += msg.tokens.reasoning;
203
- dayData.cost += msgCost;
204
- dayData.messages++;
205
- // Source contribution
206
- const sourceKey = `${msg.source}:${msg.modelId}`;
207
- let sourceData = dayData.sources.get(sourceKey);
208
- if (!sourceData) {
209
- sourceData = {
210
- modelId: msg.modelId,
211
- providerId: msg.providerId,
212
- tokens: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0 },
213
- cost: 0,
214
- messages: 0,
215
- };
216
- dayData.sources.set(sourceKey, sourceData);
217
- }
218
- sourceData.tokens.input += msg.tokens.input;
219
- sourceData.tokens.output += msg.tokens.output;
220
- sourceData.tokens.cacheRead += msg.tokens.cacheRead;
221
- sourceData.tokens.cacheWrite += msg.tokens.cacheWrite;
222
- sourceData.tokens.reasoning += msg.tokens.reasoning;
223
- sourceData.cost += msgCost;
224
- sourceData.messages++;
225
- const msgTokens = msg.tokens.input +
226
- msg.tokens.output +
227
- msg.tokens.cacheRead +
228
- msg.tokens.cacheWrite +
229
- msg.tokens.reasoning;
230
- totalTokens += msgTokens;
231
- totalCost += msgCost;
232
- }
233
- // Calculate max cost per day for intensity calculation
234
- for (const dayData of byDate.values()) {
235
- if (dayData.cost > maxCostInSingleDay) {
236
- maxCostInSingleDay = dayData.cost;
237
- }
238
- }
239
- // Build contributions array
240
- const contributions = Array.from(byDate.entries())
241
- .map(([date, data]) => {
242
- const dayTokens = data.tokens.input +
243
- data.tokens.output +
244
- data.tokens.cacheRead +
245
- data.tokens.cacheWrite +
246
- data.tokens.reasoning;
247
- // Calculate intensity (0-4 scale based on cost)
248
- let intensity = 0;
249
- if (maxCostInSingleDay > 0) {
250
- const ratio = data.cost / maxCostInSingleDay;
251
- if (ratio > 0.75)
252
- intensity = 4;
253
- else if (ratio > 0.5)
254
- intensity = 3;
255
- else if (ratio > 0.25)
256
- intensity = 2;
257
- else if (ratio > 0)
258
- intensity = 1;
259
- }
260
- return {
261
- date,
262
- totals: {
263
- tokens: dayTokens,
264
- cost: data.cost,
265
- messages: data.messages,
266
- },
267
- intensity,
268
- tokenBreakdown: data.tokens,
269
- sources: Array.from(data.sources.entries()).map(([key, src]) => ({
270
- source: key.split(":")[0],
271
- modelId: src.modelId,
272
- providerId: src.providerId,
273
- tokens: src.tokens,
274
- cost: src.cost,
275
- messages: src.messages,
276
- })),
277
- };
278
- })
279
- .sort((a, b) => a.date.localeCompare(b.date));
280
- // Determine date range
281
- const dates = Array.from(byDate.keys()).sort();
282
- const rangeStart = dates[0] || new Date().toISOString().split("T")[0];
283
- const rangeEnd = dates[dates.length - 1] || rangeStart;
284
- // Group by year
285
- const yearData = new Map();
286
- for (const [date, data] of byDate.entries()) {
287
- const year = date.slice(0, 4);
288
- let yd = yearData.get(year);
289
- if (!yd) {
290
- yd = { tokens: 0, cost: 0, start: date, end: date };
291
- yearData.set(year, yd);
292
- }
293
- const dayTokens = data.tokens.input +
294
- data.tokens.output +
295
- data.tokens.cacheRead +
296
- data.tokens.cacheWrite +
297
- data.tokens.reasoning;
298
- yd.tokens += dayTokens;
299
- yd.cost += data.cost;
300
- if (date < yd.start)
301
- yd.start = date;
302
- if (date > yd.end)
303
- yd.end = date;
304
- }
305
- const years = Array.from(yearData.entries())
306
- .map(([year, data]) => ({
307
- year,
308
- totalTokens: data.tokens,
309
- totalCost: data.cost,
310
- range: { start: data.start, end: data.end },
311
- }))
312
- .sort((a, b) => b.year.localeCompare(a.year));
313
- const activeDays = byDate.size;
314
- const totalDays = activeDays > 0
315
- ? Math.ceil((new Date(rangeEnd).getTime() - new Date(rangeStart).getTime()) / 86400000) + 1
316
- : 0;
317
- return {
318
- meta: {
319
- generatedAt: new Date().toISOString(),
320
- version: "1.0.0-ts-fallback",
321
- dateRange: { start: rangeStart, end: rangeEnd },
322
- },
323
- summary: {
324
- totalTokens,
325
- totalCost,
326
- totalDays,
327
- activeDays,
328
- averagePerDay: activeDays > 0 ? totalCost / activeDays : 0,
329
- maxCostInSingleDay,
330
- sources: Array.from(allSources),
331
- models: Array.from(allModels),
332
- },
333
- years,
334
- contributions,
335
- };
336
- }
337
- //# sourceMappingURL=reports.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/sessions/reports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAuDxE,SAAS,kBAAkB,CAAC,OAAuB;IACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAElE,OAAO;QACL,GAAG,CAAC,OAAe;YACjB,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE9C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC;oBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;oBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACpD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBAC9B,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;wBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,eAAe,GAAG,UAAU,EAAE,WAAW,EAAE,CAAC;YAElD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBACnC,IAAI,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC;oBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrE,IAAI,eAAe,IAAI,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC;oBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7F,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;gBACnC,IAAI,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;oBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrE,IAAI,eAAe,IAAI,mBAAmB,CAAC,eAAe,EAAE,QAAQ,CAAC;oBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7F,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,MAAsB,EACtB,OAAgC;IAEhC,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC;IAEvB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACjD,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACnD,IAAI,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,2BAA2B,IAAI,CAAC,CAAC,CAAC;IACvE,8DAA8D;IAC9D,IAAI,IAAI,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAEtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA0B,EAC1B,OAAuB,EACvB,SAAiB;IAEjB,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE/C,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEjD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK,EAAE,GAAG,CAAC,OAAO;gBAClB,QAAQ,EAAE,GAAG,CAAC,UAAU;gBACxB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,YAAY,EAAE,CAAC;gBACf,IAAI,EAAE,CAAC;aACR,CAAC;YACF,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QAC1C,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,KAAK,CAAC,YAAY,EAAE,CAAC;QAErB,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEhF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAC7B,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS;QACtC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;QACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,YAAY;QACvC,IAAI,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;KACxB,CAAC,EACF,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAC3E,CAAC;IAEF,OAAO;QACL,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,KAAK;QACxB,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,cAAc,EAAE,MAAM,CAAC,SAAS;QAChC,eAAe,EAAE,MAAM,CAAC,UAAU;QAClC,aAAa,EAAE,MAAM,CAAC,QAAQ;QAC9B,SAAS,EAAE,MAAM,CAAC,IAAI;QACtB,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;KAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAA0B,EAC1B,OAAuB,EACvB,SAAiB;IAEjB,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE/C,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,GAAG,EAWvB,CAAC;IAEJ,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,4BAA4B;QAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,MAAM,EAAE,IAAI,GAAG,EAAE;gBACjB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC;gBACf,IAAI,EAAE,CAAC;aACR,CAAC;YACF,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QAC1C,KAAK,CAAC,YAAY,EAAE,CAAC;QAErB,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/D,CAAC;IAED,MAAM,OAAO,GAAmB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;SAC7D,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,KAAK;QACL,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB;IAEvE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE9D,OAAO;QACL,OAAO;QACP,SAAS;QACT,gBAAgB,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS;KAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA0B,EAC1B,OAAuB,EACvB,SAAiB;IAEjB,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE/C,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,GAAG,EAiBnB,CAAC;IAEJ,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAE3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE3B,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;gBAC1E,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,IAAI,GAAG,EAAE;aACnB,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QAE/D,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACjD,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;QACxB,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEnB,sBAAsB;QACtB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACjD,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG;gBACX,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;gBAC1E,IAAI,EAAE,CAAC;gBACP,QAAQ,EAAE,CAAC;aACZ,CAAC;YACF,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC7C,CAAC;QACD,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5C,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9C,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACpD,UAAU,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC;QACtD,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACpD,UAAU,CAAC,IAAI,IAAI,OAAO,CAAC;QAC3B,UAAU,CAAC,QAAQ,EAAE,CAAC;QAEtB,MAAM,SAAS,GACb,GAAG,CAAC,MAAM,CAAC,KAAK;YAChB,GAAG,CAAC,MAAM,CAAC,MAAM;YACjB,GAAG,CAAC,MAAM,CAAC,SAAS;YACpB,GAAG,CAAC,MAAM,CAAC,UAAU;YACrB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACvB,WAAW,IAAI,SAAS,CAAC;QACzB,SAAS,IAAI,OAAO,CAAC;IACvB,CAAC;IAED,uDAAuD;IACvD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,GAAG,kBAAkB,EAAE,CAAC;YACtC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;QACpC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACpB,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,CAAC,KAAK;YACjB,IAAI,CAAC,MAAM,CAAC,MAAM;YAClB,IAAI,CAAC,MAAM,CAAC,SAAS;YACrB,IAAI,CAAC,MAAM,CAAC,UAAU;YACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExB,gDAAgD;QAChD,IAAI,SAAS,GAAsB,CAAC,CAAC;QACrC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;YAC7C,IAAI,KAAK,GAAG,IAAI;gBAAE,SAAS,GAAG,CAAC,CAAC;iBAC3B,IAAI,KAAK,GAAG,GAAG;gBAAE,SAAS,GAAG,CAAC,CAAC;iBAC/B,IAAI,KAAK,GAAG,IAAI;gBAAE,SAAS,GAAG,CAAC,CAAC;iBAChC,IAAI,KAAK,GAAG,CAAC;gBAAE,SAAS,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,OAAO;YACL,IAAI;YACJ,MAAM,EAAE;gBACN,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB;YACD,SAAS;YACT,cAAc,EAAE,IAAI,CAAC,MAAM;YAC3B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/D,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAe;gBACvC,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,uBAAuB;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;IAEvD,gBAAgB;IAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwE,CAAC;IACjG,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YACpD,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,SAAS,GACb,IAAI,CAAC,MAAM,CAAC,KAAK;YACjB,IAAI,CAAC,MAAM,CAAC,MAAM;YAClB,IAAI,CAAC,MAAM,CAAC,SAAS;YACrB,IAAI,CAAC,MAAM,CAAC,UAAU;YACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACxB,EAAE,CAAC,MAAM,IAAI,SAAS,CAAC;QACvB,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,IAAI,GAAG,EAAE,CAAC,KAAK;YAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;QACrC,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG;YAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,SAAS,EAAE,IAAI,CAAC,IAAI;QACpB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;KAC5C,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;IAC/B,MAAM,SAAS,GACb,UAAU,GAAG,CAAC;QACZ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC3F,CAAC,CAAC,CAAC,CAAC;IAER,OAAO;QACL,IAAI,EAAE;YACJ,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,OAAO,EAAE,mBAAmB;YAC5B,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE;SAChD;QACD,OAAO,EAAE;YACP,WAAW;YACX,SAAS;YACT,SAAS;YACT,UAAU;YACV,aAAa,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1D,kBAAkB;YAClB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAiB;YAC/C,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;SAC9B;QACD,KAAK;QACL,aAAa;KACd,CAAC;AACJ,CAAC"}