@getverbal/cli 0.4.3 → 0.6.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 (249) hide show
  1. package/dist/agent-hooks/claude.d.ts +10 -0
  2. package/dist/agent-hooks/claude.d.ts.map +1 -0
  3. package/dist/agent-hooks/claude.js +218 -0
  4. package/dist/agent-hooks/claude.js.map +1 -0
  5. package/dist/agent-hooks/cli.d.ts +2 -0
  6. package/dist/agent-hooks/cli.d.ts.map +1 -0
  7. package/dist/agent-hooks/cli.js +271 -0
  8. package/dist/agent-hooks/cli.js.map +1 -0
  9. package/dist/agent-hooks/codex.d.ts +9 -0
  10. package/dist/agent-hooks/codex.d.ts.map +1 -0
  11. package/dist/agent-hooks/codex.js +349 -0
  12. package/dist/agent-hooks/codex.js.map +1 -0
  13. package/dist/agent-hooks/config.d.ts +32 -0
  14. package/dist/agent-hooks/config.d.ts.map +1 -0
  15. package/dist/agent-hooks/config.js +176 -0
  16. package/dist/agent-hooks/config.js.map +1 -0
  17. package/dist/agent-hooks/ingest.d.ts +4 -0
  18. package/dist/agent-hooks/ingest.d.ts.map +1 -0
  19. package/dist/agent-hooks/ingest.js +22 -0
  20. package/dist/agent-hooks/ingest.js.map +1 -0
  21. package/dist/agent-hooks/launchagent.d.ts +7 -0
  22. package/dist/agent-hooks/launchagent.d.ts.map +1 -0
  23. package/dist/agent-hooks/launchagent.js +51 -0
  24. package/dist/agent-hooks/launchagent.js.map +1 -0
  25. package/dist/agent-hooks/runtime-context.d.ts +20 -0
  26. package/dist/agent-hooks/runtime-context.d.ts.map +1 -0
  27. package/dist/agent-hooks/runtime-context.js +90 -0
  28. package/dist/agent-hooks/runtime-context.js.map +1 -0
  29. package/dist/agent-hooks/state.d.ts +26 -0
  30. package/dist/agent-hooks/state.d.ts.map +1 -0
  31. package/dist/agent-hooks/state.js +67 -0
  32. package/dist/agent-hooks/state.js.map +1 -0
  33. package/dist/agent-hooks/tokscale.d.ts +70 -0
  34. package/dist/agent-hooks/tokscale.d.ts.map +1 -0
  35. package/dist/agent-hooks/tokscale.js +142 -0
  36. package/dist/agent-hooks/tokscale.js.map +1 -0
  37. package/dist/agent-hooks/tool-extraction.d.ts +7 -0
  38. package/dist/agent-hooks/tool-extraction.d.ts.map +1 -0
  39. package/dist/agent-hooks/tool-extraction.js +100 -0
  40. package/dist/agent-hooks/tool-extraction.js.map +1 -0
  41. package/dist/agent-hooks/trace.d.ts +17 -0
  42. package/dist/agent-hooks/trace.d.ts.map +1 -0
  43. package/dist/agent-hooks/trace.js +25 -0
  44. package/dist/agent-hooks/trace.js.map +1 -0
  45. package/dist/auth/browser-auth.d.ts +6 -0
  46. package/dist/auth/browser-auth.d.ts.map +1 -0
  47. package/dist/auth/browser-auth.js +202 -0
  48. package/dist/auth/browser-auth.js.map +1 -0
  49. package/dist/auth/credentials.d.ts +6 -0
  50. package/dist/auth/credentials.d.ts.map +1 -0
  51. package/dist/auth/credentials.js +78 -0
  52. package/dist/auth/credentials.js.map +1 -0
  53. package/dist/cli.d.ts +3 -0
  54. package/dist/cli.d.ts.map +1 -0
  55. package/dist/cli.js +1513 -440
  56. package/dist/cli.js.map +1 -0
  57. package/dist/commands/dashboard.d.ts +2 -0
  58. package/dist/commands/dashboard.d.ts.map +1 -0
  59. package/dist/commands/dashboard.js +19 -0
  60. package/dist/commands/dashboard.js.map +1 -0
  61. package/dist/commands/hooks.d.ts +2 -0
  62. package/dist/commands/hooks.d.ts.map +1 -0
  63. package/dist/commands/hooks.js +6 -0
  64. package/dist/commands/hooks.js.map +1 -0
  65. package/dist/commands/import.d.ts +2 -0
  66. package/dist/commands/import.d.ts.map +1 -0
  67. package/dist/commands/import.js +129 -0
  68. package/dist/commands/import.js.map +1 -0
  69. package/dist/commands/init.d.ts +2 -0
  70. package/dist/commands/init.d.ts.map +1 -0
  71. package/dist/commands/init.js +262 -0
  72. package/dist/commands/init.js.map +1 -0
  73. package/dist/commands/logout.d.ts +2 -0
  74. package/dist/commands/logout.d.ts.map +1 -0
  75. package/dist/commands/logout.js +17 -0
  76. package/dist/commands/logout.js.map +1 -0
  77. package/dist/commands/mcp-serve.d.ts +2 -0
  78. package/dist/commands/mcp-serve.d.ts.map +1 -0
  79. package/dist/commands/mcp-serve.js +7 -0
  80. package/dist/commands/mcp-serve.js.map +1 -0
  81. package/dist/commands/status.d.ts +2 -0
  82. package/dist/commands/status.d.ts.map +1 -0
  83. package/dist/commands/status.js +43 -0
  84. package/dist/commands/status.js.map +1 -0
  85. package/dist/commands/uninstall.d.ts +2 -0
  86. package/dist/commands/uninstall.d.ts.map +1 -0
  87. package/dist/commands/uninstall.js +43 -0
  88. package/dist/commands/uninstall.js.map +1 -0
  89. package/dist/commands/update.d.ts +2 -0
  90. package/dist/commands/update.d.ts.map +1 -0
  91. package/dist/commands/update.js +58 -0
  92. package/dist/commands/update.js.map +1 -0
  93. package/dist/configure/claude-code.d.ts +7 -0
  94. package/dist/configure/claude-code.d.ts.map +1 -0
  95. package/dist/configure/claude-code.js +11 -0
  96. package/dist/configure/claude-code.js.map +1 -0
  97. package/dist/configure/claude-desktop.d.ts +8 -0
  98. package/dist/configure/claude-desktop.d.ts.map +1 -0
  99. package/dist/configure/claude-desktop.js +28 -0
  100. package/dist/configure/claude-desktop.js.map +1 -0
  101. package/dist/configure/codex.d.ts +7 -0
  102. package/dist/configure/codex.d.ts.map +1 -0
  103. package/dist/configure/codex.js +12 -0
  104. package/dist/configure/codex.js.map +1 -0
  105. package/dist/configure/cursor.d.ts +7 -0
  106. package/dist/configure/cursor.d.ts.map +1 -0
  107. package/dist/configure/cursor.js +12 -0
  108. package/dist/configure/cursor.js.map +1 -0
  109. package/dist/configure/index.d.ts +34 -0
  110. package/dist/configure/index.d.ts.map +1 -0
  111. package/dist/configure/index.js +153 -0
  112. package/dist/configure/index.js.map +1 -0
  113. package/dist/detect/claude-code.d.ts +3 -0
  114. package/dist/detect/claude-code.d.ts.map +1 -0
  115. package/dist/detect/claude-code.js +82 -0
  116. package/dist/detect/claude-code.js.map +1 -0
  117. package/dist/detect/claude-desktop.d.ts +3 -0
  118. package/dist/detect/claude-desktop.d.ts.map +1 -0
  119. package/dist/detect/claude-desktop.js +89 -0
  120. package/dist/detect/claude-desktop.js.map +1 -0
  121. package/dist/detect/codex.d.ts +3 -0
  122. package/dist/detect/codex.d.ts.map +1 -0
  123. package/dist/detect/codex.js +64 -0
  124. package/dist/detect/codex.js.map +1 -0
  125. package/dist/detect/cursor.d.ts +3 -0
  126. package/dist/detect/cursor.d.ts.map +1 -0
  127. package/dist/detect/cursor.js +81 -0
  128. package/dist/detect/cursor.js.map +1 -0
  129. package/dist/detect/index.d.ts +3 -0
  130. package/dist/detect/index.d.ts.map +1 -0
  131. package/dist/detect/index.js +28 -0
  132. package/dist/detect/index.js.map +1 -0
  133. package/dist/import/file-upload.d.ts +10 -0
  134. package/dist/import/file-upload.d.ts.map +1 -0
  135. package/dist/import/file-upload.js +37 -0
  136. package/dist/import/file-upload.js.map +1 -0
  137. package/dist/import/index.d.ts +11 -0
  138. package/dist/import/index.d.ts.map +1 -0
  139. package/dist/import/index.js +51 -0
  140. package/dist/import/index.js.map +1 -0
  141. package/dist/mcp/exports.d.ts +13 -0
  142. package/dist/mcp/exports.d.ts.map +1 -0
  143. package/dist/mcp/exports.js +13 -0
  144. package/dist/mcp/exports.js.map +1 -0
  145. package/dist/mcp/git-context.d.ts +17 -0
  146. package/dist/mcp/git-context.d.ts.map +1 -0
  147. package/dist/mcp/git-context.js +72 -0
  148. package/dist/mcp/git-context.js.map +1 -0
  149. package/dist/mcp/hooks/anthropic.d.ts +31 -0
  150. package/dist/mcp/hooks/anthropic.d.ts.map +1 -0
  151. package/dist/mcp/hooks/anthropic.js +137 -0
  152. package/dist/mcp/hooks/anthropic.js.map +1 -0
  153. package/dist/mcp/hooks/google.d.ts +53 -0
  154. package/dist/mcp/hooks/google.d.ts.map +1 -0
  155. package/dist/mcp/hooks/google.js +161 -0
  156. package/dist/mcp/hooks/google.js.map +1 -0
  157. package/dist/mcp/hooks/index.d.ts +9 -0
  158. package/dist/mcp/hooks/index.d.ts.map +1 -0
  159. package/dist/mcp/hooks/index.js +7 -0
  160. package/dist/mcp/hooks/index.js.map +1 -0
  161. package/dist/mcp/hooks/openai.d.ts +59 -0
  162. package/dist/mcp/hooks/openai.d.ts.map +1 -0
  163. package/dist/mcp/hooks/openai.js +158 -0
  164. package/dist/mcp/hooks/openai.js.map +1 -0
  165. package/dist/mcp/hooks/types.d.ts +8 -0
  166. package/dist/mcp/hooks/types.d.ts.map +1 -0
  167. package/dist/mcp/hooks/types.js +5 -0
  168. package/dist/mcp/hooks/types.js.map +1 -0
  169. package/dist/mcp/ingestor.d.ts +23 -0
  170. package/dist/mcp/ingestor.d.ts.map +1 -0
  171. package/dist/mcp/ingestor.js +310 -0
  172. package/dist/mcp/ingestor.js.map +1 -0
  173. package/dist/mcp/pricing.d.ts +19 -0
  174. package/dist/mcp/pricing.d.ts.map +1 -0
  175. package/dist/mcp/pricing.js +130 -0
  176. package/dist/mcp/pricing.js.map +1 -0
  177. package/dist/mcp/server.d.ts +10 -0
  178. package/dist/mcp/server.d.ts.map +1 -0
  179. package/dist/mcp/server.js +689 -0
  180. package/dist/mcp/server.js.map +1 -0
  181. package/dist/mcp/session-tracker.d.ts +52 -0
  182. package/dist/mcp/session-tracker.d.ts.map +1 -0
  183. package/dist/mcp/session-tracker.js +186 -0
  184. package/dist/mcp/session-tracker.js.map +1 -0
  185. package/dist/mcp/tools/analyze-spending-trend.d.ts +10 -0
  186. package/dist/mcp/tools/analyze-spending-trend.d.ts.map +1 -0
  187. package/dist/mcp/tools/analyze-spending-trend.js +126 -0
  188. package/dist/mcp/tools/analyze-spending-trend.js.map +1 -0
  189. package/dist/mcp/tools/get-budget-status.d.ts +9 -0
  190. package/dist/mcp/tools/get-budget-status.d.ts.map +1 -0
  191. package/dist/mcp/tools/get-budget-status.js +59 -0
  192. package/dist/mcp/tools/get-budget-status.js.map +1 -0
  193. package/dist/mcp/tools/get-cost-breakdown.d.ts +10 -0
  194. package/dist/mcp/tools/get-cost-breakdown.d.ts.map +1 -0
  195. package/dist/mcp/tools/get-cost-breakdown.js +52 -0
  196. package/dist/mcp/tools/get-cost-breakdown.js.map +1 -0
  197. package/dist/mcp/tools/get-model-efficiency.d.ts +9 -0
  198. package/dist/mcp/tools/get-model-efficiency.d.ts.map +1 -0
  199. package/dist/mcp/tools/get-model-efficiency.js +137 -0
  200. package/dist/mcp/tools/get-model-efficiency.js.map +1 -0
  201. package/dist/mcp/tools/get-recent-prompts.d.ts +13 -0
  202. package/dist/mcp/tools/get-recent-prompts.d.ts.map +1 -0
  203. package/dist/mcp/tools/get-recent-prompts.js +56 -0
  204. package/dist/mcp/tools/get-recent-prompts.js.map +1 -0
  205. package/dist/mcp/tools/get-roi-metrics.d.ts +9 -0
  206. package/dist/mcp/tools/get-roi-metrics.d.ts.map +1 -0
  207. package/dist/mcp/tools/get-roi-metrics.js +84 -0
  208. package/dist/mcp/tools/get-roi-metrics.js.map +1 -0
  209. package/dist/mcp/tools/get-usage-summary.d.ts +10 -0
  210. package/dist/mcp/tools/get-usage-summary.d.ts.map +1 -0
  211. package/dist/mcp/tools/get-usage-summary.js +47 -0
  212. package/dist/mcp/tools/get-usage-summary.js.map +1 -0
  213. package/dist/mcp/tools/index.d.ts +221 -0
  214. package/dist/mcp/tools/index.d.ts.map +1 -0
  215. package/dist/mcp/tools/index.js +161 -0
  216. package/dist/mcp/tools/index.js.map +1 -0
  217. package/dist/mcp/tools/list-projects.d.ts +6 -0
  218. package/dist/mcp/tools/list-projects.d.ts.map +1 -0
  219. package/dist/mcp/tools/list-projects.js +43 -0
  220. package/dist/mcp/tools/list-projects.js.map +1 -0
  221. package/dist/mcp/tools/optimize-prompt.d.ts +44 -0
  222. package/dist/mcp/tools/optimize-prompt.d.ts.map +1 -0
  223. package/dist/mcp/tools/optimize-prompt.js +95 -0
  224. package/dist/mcp/tools/optimize-prompt.js.map +1 -0
  225. package/dist/mcp/types.d.ts +118 -0
  226. package/dist/mcp/types.d.ts.map +1 -0
  227. package/dist/mcp/types.js +5 -0
  228. package/dist/mcp/types.js.map +1 -0
  229. package/dist/types.d.ts +18 -0
  230. package/dist/types.d.ts.map +1 -0
  231. package/dist/types.js +2 -0
  232. package/dist/types.js.map +1 -0
  233. package/dist/update-check/check.d.ts +6 -0
  234. package/dist/update-check/check.d.ts.map +1 -0
  235. package/dist/update-check/check.js +64 -0
  236. package/dist/update-check/check.js.map +1 -0
  237. package/dist/update-check/notify.d.ts +6 -0
  238. package/dist/update-check/notify.d.ts.map +1 -0
  239. package/dist/update-check/notify.js +40 -0
  240. package/dist/update-check/notify.js.map +1 -0
  241. package/dist/verify.d.ts +7 -0
  242. package/dist/verify.d.ts.map +1 -0
  243. package/dist/verify.js +40 -0
  244. package/dist/verify.js.map +1 -0
  245. package/dist/version.d.ts +9 -0
  246. package/dist/version.d.ts.map +1 -0
  247. package/dist/version.js +21 -0
  248. package/dist/version.js.map +1 -0
  249. package/package.json +10 -5
@@ -0,0 +1,137 @@
1
+ /**
2
+ * MCP Tool: get_model_efficiency
3
+ * Per-model cost efficiency comparison and recommendations
4
+ */
5
+ export async function getModelEfficiency(apiKey, apiUrl, params = {}) {
6
+ try {
7
+ const timeframe = params.timeframe || '30d';
8
+ // Call backend endpoint
9
+ const response = await fetch(`${apiUrl}/api/v1/roi/model-efficiency?timeframe=${timeframe}`, {
10
+ method: 'GET',
11
+ headers: {
12
+ 'Authorization': `Bearer ${apiKey}`,
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ });
16
+ if (!response.ok) {
17
+ return `Error: Failed to fetch model efficiency (${response.status})`;
18
+ }
19
+ const data = (await response.json());
20
+ // Format for natural language display
21
+ let output = `⚡ Model Efficiency Comparison (${timeframe})
22
+
23
+ `;
24
+ // Organization average
25
+ output += `━━━ Organization Average ━━━
26
+ `;
27
+ output += `💰 Cost/Token: $${data.organization_average.avg_cost_per_token.toFixed(8)}
28
+ `;
29
+ output += `🎯 Efficiency Score: ${data.organization_average.avg_efficiency_score}/100
30
+ `;
31
+ output += `✨ Quality Score: ${data.organization_average.avg_quality_score}/100
32
+ `;
33
+ output += `📊 Models Used: ${data.organization_average.total_models}
34
+ `;
35
+ output += `💵 Total Spend: $${data.organization_average.total_cost.toFixed(2)}
36
+ `;
37
+ output += `🔤 Total Tokens: ${formatLargeNumber(data.organization_average.total_tokens)}
38
+
39
+ `;
40
+ // Most efficient models
41
+ if (data.top_efficient.models.length > 0) {
42
+ output += `━━━ Most Cost-Efficient Models ━━━
43
+ `;
44
+ data.top_efficient.models.forEach((model, idx) => {
45
+ output += `${idx + 1}. ${model.model}
46
+ `;
47
+ output += ` 💰 Cost: $${model.cost_per_token.toFixed(8)}/token
48
+ `;
49
+ output += ` 🎯 Efficiency: ${model.efficiency_score}/100
50
+ `;
51
+ output += ` ✨ Quality: ${model.quality_score}/100
52
+ `;
53
+ });
54
+ output += '\n';
55
+ }
56
+ // Least efficient models
57
+ if (data.bottom_efficient.models.length > 0) {
58
+ output += `━━━ Least Cost-Efficient Models ━━━
59
+ `;
60
+ data.bottom_efficient.models.forEach((model, idx) => {
61
+ output += `${idx + 1}. ${model.model}
62
+ `;
63
+ output += ` 💰 Cost: $${model.cost_per_token.toFixed(8)}/token
64
+ `;
65
+ output += ` 🎯 Efficiency: ${model.efficiency_score}/100
66
+ `;
67
+ output += ` ✨ Quality: ${model.quality_score}/100
68
+ `;
69
+ });
70
+ output += '\n';
71
+ }
72
+ // All models ranked
73
+ output += `━━━ All Models Ranked by Efficiency ━━━
74
+ `;
75
+ data.models.slice(0, 10).forEach((model, idx) => {
76
+ const statusIcon = getStatusIcon(model.efficiency_score);
77
+ output += `${idx + 1}. ${statusIcon} ${model.model}
78
+ `;
79
+ output += ` Cost: $${model.cost_per_token.toFixed(8)}/token | Quality: ${model.quality_score}/100
80
+ `;
81
+ output += ` ${model.recommendation}
82
+ `;
83
+ });
84
+ if (data.models.length > 10) {
85
+ output += `
86
+ ... and ${data.models.length - 10} more models
87
+
88
+ `;
89
+ }
90
+ else {
91
+ output += '\n';
92
+ }
93
+ // Recommendations
94
+ if (data.recommendations.length > 0) {
95
+ output += `━━━ Recommendations ━━━
96
+ `;
97
+ data.recommendations.forEach((rec) => {
98
+ output += `${rec}
99
+ `;
100
+ });
101
+ output += '\n';
102
+ }
103
+ // Insights
104
+ output += `━━━ Key Insights ━━━
105
+ `;
106
+ data.insights.forEach((insight) => {
107
+ output += `${insight}
108
+ `;
109
+ });
110
+ return output;
111
+ }
112
+ catch (error) {
113
+ const msg = error instanceof Error ? error.message : String(error);
114
+ return `Error fetching model efficiency: ${msg}`;
115
+ }
116
+ }
117
+ function getStatusIcon(efficiencyScore) {
118
+ if (efficiencyScore < 20)
119
+ return '💎';
120
+ if (efficiencyScore < 40)
121
+ return '✅';
122
+ if (efficiencyScore < 60)
123
+ return '⚠️';
124
+ if (efficiencyScore < 80)
125
+ return '❌';
126
+ return '🚫';
127
+ }
128
+ function formatLargeNumber(num) {
129
+ if (num >= 1000000) {
130
+ return `${(num / 1000000).toFixed(2)}M`;
131
+ }
132
+ if (num >= 1000) {
133
+ return `${(num / 1000).toFixed(2)}K`;
134
+ }
135
+ return num.toFixed(0);
136
+ }
137
+ //# sourceMappingURL=get-model-efficiency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-model-efficiency.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-model-efficiency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * MCP Tool: get_recent_prompts
3
+ * Retrieve recent prompts with filtering
4
+ */
5
+ export interface GetRecentPromptsParams {
6
+ limit?: number;
7
+ offset?: number;
8
+ provider?: string;
9
+ model?: string;
10
+ include_content?: boolean;
11
+ }
12
+ export declare function getRecentPrompts(apiKey: string, apiUrl: string, params?: GetRecentPromptsParams): Promise<string>;
13
+ //# sourceMappingURL=get-recent-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-recent-prompts.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get-recent-prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,sBAA2B,GAClC,OAAO,CAAC,MAAM,CAAC,CAyDjB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * MCP Tool: get_recent_prompts
3
+ * Retrieve recent prompts with filtering
4
+ */
5
+ export async function getRecentPrompts(apiKey, apiUrl, params = {}) {
6
+ try {
7
+ const limit = params.limit || 10;
8
+ const offset = params.offset || 0;
9
+ const includeContent = params.include_content ? 'true' : 'false';
10
+ let url = `${apiUrl}/api/v1/usage/prompts?limit=${limit}&offset=${offset}&include_content=${includeContent}`;
11
+ if (params.provider) {
12
+ url += `&provider=${params.provider}`;
13
+ }
14
+ if (params.model) {
15
+ url += `&model=${params.model}`;
16
+ }
17
+ const response = await fetch(url, {
18
+ method: 'GET',
19
+ headers: {
20
+ 'Authorization': `Bearer ${apiKey}`,
21
+ 'Content-Type': 'application/json',
22
+ },
23
+ });
24
+ if (!response.ok) {
25
+ return `Error: Failed to fetch prompts (${response.status})`;
26
+ }
27
+ const data = (await response.json());
28
+ // Format for natural language display
29
+ let output = `📝 Recent Prompts (${data.prompts?.length || 0} results)
30
+
31
+ `;
32
+ if (data.prompts && data.prompts.length > 0) {
33
+ data.prompts.forEach((prompt, idx) => {
34
+ output += `[${idx + 1}] ${prompt.provider} / ${prompt.model}
35
+ `;
36
+ output += ` ${prompt.preview || '(empty)'}
37
+ `;
38
+ output += ` Cost: $${prompt.cost?.toFixed(4)} | In: ${prompt.tokens_in} | Out: ${prompt.tokens_out}
39
+ `;
40
+ output += ` ${new Date(prompt.created_at).toLocaleString()}
41
+
42
+ `;
43
+ });
44
+ }
45
+ if (data.has_more) {
46
+ output += `... and ${data.total - (offset + limit)} more results available
47
+ `;
48
+ }
49
+ return output;
50
+ }
51
+ catch (error) {
52
+ const msg = error instanceof Error ? error.message : String(error);
53
+ return `Error fetching recent prompts: ${msg}`;
54
+ }
55
+ }
56
+ //# sourceMappingURL=get-recent-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-recent-prompts.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-recent-prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,MAAc,EACd,SAAiC,EAAE;IAEnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAClC,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAEjE,IAAI,GAAG,GAAG,GAAG,MAAM,+BAA+B,KAAK,WAAW,MAAM,oBAAoB,cAAc,EAAE,CAAC;QAC7G,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,GAAG,IAAI,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxC,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,GAAG,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,mCAAmC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAE5C,sCAAsC;QACtC,IAAI,MAAM,GAAG,sBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;;CAE/D,CAAC;QAEE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,GAAW,EAAE,EAAE;gBAChD,MAAM,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,MAAM,MAAM,CAAC,KAAK;CAClE,CAAC;gBACM,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,IAAI,SAAS;CACnD,CAAC;gBACM,MAAM,IAAI,cAAc,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,SAAS,WAAW,MAAM,CAAC,UAAU;CAC5G,CAAC;gBACM,MAAM,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE;;CAEpE,CAAC;YACI,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,WAAW,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;CACvD,CAAC;QACE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,kCAAkC,GAAG,EAAE,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tool: get_roi_metrics
3
+ * Calculate ROI and efficiency metrics with trend comparison
4
+ */
5
+ export interface GetRoiMetricsParams {
6
+ timeframe?: '7d' | '30d' | '90d';
7
+ }
8
+ export declare function getRoiMetrics(apiKey: string, apiUrl: string, params?: GetRoiMetricsParams): Promise<string>;
9
+ //# sourceMappingURL=get-roi-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-roi-metrics.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get-roi-metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;CAClC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqEjB"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * MCP Tool: get_roi_metrics
3
+ * Calculate ROI and efficiency metrics with trend comparison
4
+ */
5
+ export async function getRoiMetrics(apiKey, apiUrl, params = {}) {
6
+ try {
7
+ const timeframe = params.timeframe || '30d';
8
+ // Call backend endpoint
9
+ const response = await fetch(`${apiUrl}/api/v1/roi/metrics?timeframe=${timeframe}`, {
10
+ method: 'GET',
11
+ headers: {
12
+ 'Authorization': `Bearer ${apiKey}`,
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ });
16
+ if (!response.ok) {
17
+ return `Error: Failed to fetch ROI metrics (${response.status})`;
18
+ }
19
+ const data = (await response.json());
20
+ // Format for natural language display
21
+ let output = `📊 ROI & Efficiency Metrics (Last ${timeframe})
22
+
23
+ `;
24
+ // Current metrics
25
+ output += `━━━ Current Period ━━━
26
+ `;
27
+ output += `💰 Total Spend: $${data.current.totalCost.toFixed(2)}
28
+ `;
29
+ output += `📈 Total Tokens: ${formatLargeNumber(data.current.totalTokens)}
30
+ `;
31
+ output += `⚡ Cost/Token: $${data.current.costPerToken.toFixed(8)}
32
+ `;
33
+ output += `📊 Daily Average: $${data.current.costPerDay.toFixed(2)}
34
+ `;
35
+ output += `🎯 Efficiency Score: ${data.current.efficiencyScore}/100${getEfficiencyLabel(data.current.efficiencyScore)}
36
+
37
+ `;
38
+ // Previous period comparison
39
+ output += `━━━ Previous Period Comparison ━━━
40
+ `;
41
+ const costChangeSymbol = data.trends.costChange > 0 ? '📈' : data.trends.costChange < 0 ? '📉' : '→';
42
+ const efficiencyChangeSymbol = data.trends.efficiencyChange > 0 ? '⬆️' : data.trends.efficiencyChange < 0 ? '⬇️' : '→';
43
+ output += `${costChangeSymbol} Cost Change: ${Math.abs(data.trends.costChange).toFixed(1)}% (${data.trends.costDirection})
44
+ `;
45
+ output += `${efficiencyChangeSymbol} Efficiency: ${Math.abs(data.trends.efficiencyChange).toFixed(1)}% (${data.trends.efficiencyDirection})
46
+ `;
47
+ output += `Cost/Token: $${data.previous.costPerToken.toFixed(8)}
48
+
49
+ `;
50
+ // Insights
51
+ output += `━━━ Insights ━━━
52
+ `;
53
+ data.insights.forEach((insight) => {
54
+ output += `${insight}
55
+ `;
56
+ });
57
+ return output;
58
+ }
59
+ catch (error) {
60
+ const msg = error instanceof Error ? error.message : String(error);
61
+ return `Error fetching ROI metrics: ${msg}`;
62
+ }
63
+ }
64
+ function getEfficiencyLabel(score) {
65
+ if (score < 20)
66
+ return ' (Excellent)';
67
+ if (score < 40)
68
+ return ' (Good)';
69
+ if (score < 60)
70
+ return ' (Fair)';
71
+ if (score < 80)
72
+ return ' (Poor)';
73
+ return ' (Very Poor)';
74
+ }
75
+ function formatLargeNumber(num) {
76
+ if (num >= 1000000) {
77
+ return `${(num / 1000000).toFixed(2)}M`;
78
+ }
79
+ if (num >= 1000) {
80
+ return `${(num / 1000).toFixed(2)}K`;
81
+ }
82
+ return num.toFixed(0);
83
+ }
84
+ //# sourceMappingURL=get-roi-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-roi-metrics.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-roi-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * MCP Tool: get_usage_summary
3
+ * Get aggregated usage data for LLM spending
4
+ */
5
+ export interface GetUsageSummaryParams {
6
+ timeframe?: '7d' | '30d' | '90d';
7
+ group_by?: 'provider' | 'model' | 'project';
8
+ }
9
+ export declare function getUsageSummary(apiKey: string, apiUrl: string, params?: GetUsageSummaryParams): Promise<string>;
10
+ //# sourceMappingURL=get-usage-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-usage-summary.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/get-usage-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IACjC,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;CAC7C;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,qBAA0B,GACjC,OAAO,CAAC,MAAM,CAAC,CAkDjB"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * MCP Tool: get_usage_summary
3
+ * Get aggregated usage data for LLM spending
4
+ */
5
+ export async function getUsageSummary(apiKey, apiUrl, params = {}) {
6
+ try {
7
+ const timeframe = params.timeframe || '30d';
8
+ const groupBy = params.group_by || 'provider';
9
+ // Call backend endpoint
10
+ const response = await fetch(`${apiUrl}/api/v1/usage/breakdown?timeframe=${timeframe}&group_by=${groupBy}`, {
11
+ method: 'GET',
12
+ headers: {
13
+ 'Authorization': `Bearer ${apiKey}`,
14
+ 'Content-Type': 'application/json',
15
+ },
16
+ });
17
+ if (!response.ok) {
18
+ return `Error: Failed to fetch usage summary (${response.status})`;
19
+ }
20
+ const data = (await response.json());
21
+ // Format for natural language display
22
+ let output = `📊 Usage Summary (Last ${timeframe})
23
+
24
+ `;
25
+ output += `Total Spend: $${data.total_cost.toFixed(2)}
26
+
27
+ `;
28
+ if (data.breakdown && data.breakdown.length > 0) {
29
+ output += `Breakdown by ${groupBy}:
30
+ `;
31
+ data.breakdown.slice(0, 5).forEach((item) => {
32
+ output += `• ${item.name}: $${item.cost.toFixed(2)} (${item.percentage.toFixed(1)}%)
33
+ `;
34
+ });
35
+ if (data.breakdown.length > 5) {
36
+ output += `... and ${data.breakdown.length - 5} more
37
+ `;
38
+ }
39
+ }
40
+ return output;
41
+ }
42
+ catch (error) {
43
+ const msg = error instanceof Error ? error.message : String(error);
44
+ return `Error fetching usage summary: ${msg}`;
45
+ }
46
+ }
47
+ //# sourceMappingURL=get-usage-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-usage-summary.js","sourceRoot":"","sources":["../../../src/mcp/tools/get-usage-summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,MAAc,EACd,SAAgC,EAAE;IAElC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC;QAE9C,wBAAwB;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,MAAM,qCAAqC,SAAS,aAAa,OAAO,EAAE,EAC7E;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACnC;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,yCAAyC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;QAE5C,sCAAsC;QACtC,IAAI,MAAM,GAAG,0BAA0B,SAAS;;CAEnD,CAAC;QACE,MAAM,IAAI,iBAAiB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;;CAExD,CAAC;QAEE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,gBAAgB,OAAO;CACtC,CAAC;YACI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;gBAC/C,MAAM,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;CACxF,CAAC;YACI,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;CACrD,CAAC;YACI,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,iCAAiC,GAAG,EAAE,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * MCP Tools Registry
3
+ * Exports all available tools for Claude Desktop integration
4
+ */
5
+ export { getUsageSummary } from './get-usage-summary.js';
6
+ export type { GetUsageSummaryParams } from './get-usage-summary.js';
7
+ export { getBudgetStatus } from './get-budget-status.js';
8
+ export type { GetBudgetStatusParams } from './get-budget-status.js';
9
+ export { getRecentPrompts } from './get-recent-prompts.js';
10
+ export type { GetRecentPromptsParams } from './get-recent-prompts.js';
11
+ export { listProjects } from './list-projects.js';
12
+ export { getCostBreakdown } from './get-cost-breakdown.js';
13
+ export type { GetCostBreakdownParams } from './get-cost-breakdown.js';
14
+ export { getRoiMetrics } from './get-roi-metrics.js';
15
+ export type { GetRoiMetricsParams } from './get-roi-metrics.js';
16
+ export { analyzeSpendingTrend } from './analyze-spending-trend.js';
17
+ export type { AnalyzeSpendingTrendParams } from './analyze-spending-trend.js';
18
+ export { getModelEfficiency } from './get-model-efficiency.js';
19
+ export type { GetModelEfficiencyParams } from './get-model-efficiency.js';
20
+ import { optimizePromptTool, OPTIMIZE_PROMPT_TOOL } from './optimize-prompt.js';
21
+ export { optimizePromptTool, OPTIMIZE_PROMPT_TOOL };
22
+ /**
23
+ * Tool definitions for MCP server registration
24
+ */
25
+ export declare const MCP_TOOLS: ({
26
+ name: string;
27
+ description: string;
28
+ inputSchema: {
29
+ type: "object";
30
+ required: string[];
31
+ properties: {
32
+ prompt: {
33
+ type: "string";
34
+ description: string;
35
+ };
36
+ context: {
37
+ type: "string";
38
+ description: string;
39
+ };
40
+ threshold: {
41
+ type: "number";
42
+ description: string;
43
+ minimum: number;
44
+ maximum: number;
45
+ };
46
+ };
47
+ };
48
+ } | {
49
+ name: string;
50
+ description: string;
51
+ inputSchema: {
52
+ type: "object";
53
+ properties: {
54
+ timeframe: {
55
+ type: "string";
56
+ enum: string[];
57
+ description: string;
58
+ };
59
+ group_by: {
60
+ type: "string";
61
+ enum: string[];
62
+ description: string;
63
+ };
64
+ break_down_by?: undefined;
65
+ limit?: undefined;
66
+ offset?: undefined;
67
+ provider?: undefined;
68
+ model?: undefined;
69
+ include_content?: undefined;
70
+ project_id?: undefined;
71
+ metric?: undefined;
72
+ };
73
+ };
74
+ } | {
75
+ name: string;
76
+ description: string;
77
+ inputSchema: {
78
+ type: "object";
79
+ properties: {
80
+ timeframe: {
81
+ type: "string";
82
+ enum: string[];
83
+ description: string;
84
+ };
85
+ break_down_by: {
86
+ type: "string";
87
+ enum: string[];
88
+ description: string;
89
+ };
90
+ group_by?: undefined;
91
+ limit?: undefined;
92
+ offset?: undefined;
93
+ provider?: undefined;
94
+ model?: undefined;
95
+ include_content?: undefined;
96
+ project_id?: undefined;
97
+ metric?: undefined;
98
+ };
99
+ };
100
+ } | {
101
+ name: string;
102
+ description: string;
103
+ inputSchema: {
104
+ type: "object";
105
+ properties: {
106
+ limit: {
107
+ type: "number";
108
+ description: string;
109
+ };
110
+ offset: {
111
+ type: "number";
112
+ description: string;
113
+ };
114
+ provider: {
115
+ type: "string";
116
+ description: string;
117
+ };
118
+ model: {
119
+ type: "string";
120
+ description: string;
121
+ };
122
+ include_content: {
123
+ type: "boolean";
124
+ description: string;
125
+ };
126
+ timeframe?: undefined;
127
+ group_by?: undefined;
128
+ break_down_by?: undefined;
129
+ project_id?: undefined;
130
+ metric?: undefined;
131
+ };
132
+ };
133
+ } | {
134
+ name: string;
135
+ description: string;
136
+ inputSchema: {
137
+ type: "object";
138
+ properties: {
139
+ project_id: {
140
+ type: "string";
141
+ description: string;
142
+ };
143
+ timeframe?: undefined;
144
+ group_by?: undefined;
145
+ break_down_by?: undefined;
146
+ limit?: undefined;
147
+ offset?: undefined;
148
+ provider?: undefined;
149
+ model?: undefined;
150
+ include_content?: undefined;
151
+ metric?: undefined;
152
+ };
153
+ };
154
+ } | {
155
+ name: string;
156
+ description: string;
157
+ inputSchema: {
158
+ type: "object";
159
+ properties: {
160
+ timeframe?: undefined;
161
+ group_by?: undefined;
162
+ break_down_by?: undefined;
163
+ limit?: undefined;
164
+ offset?: undefined;
165
+ provider?: undefined;
166
+ model?: undefined;
167
+ include_content?: undefined;
168
+ project_id?: undefined;
169
+ metric?: undefined;
170
+ };
171
+ };
172
+ } | {
173
+ name: string;
174
+ description: string;
175
+ inputSchema: {
176
+ type: "object";
177
+ properties: {
178
+ timeframe: {
179
+ type: "string";
180
+ enum: string[];
181
+ description: string;
182
+ };
183
+ group_by?: undefined;
184
+ break_down_by?: undefined;
185
+ limit?: undefined;
186
+ offset?: undefined;
187
+ provider?: undefined;
188
+ model?: undefined;
189
+ include_content?: undefined;
190
+ project_id?: undefined;
191
+ metric?: undefined;
192
+ };
193
+ };
194
+ } | {
195
+ name: string;
196
+ description: string;
197
+ inputSchema: {
198
+ type: "object";
199
+ properties: {
200
+ timeframe: {
201
+ type: "string";
202
+ enum: string[];
203
+ description: string;
204
+ };
205
+ metric: {
206
+ type: "string";
207
+ enum: string[];
208
+ description: string;
209
+ };
210
+ group_by?: undefined;
211
+ break_down_by?: undefined;
212
+ limit?: undefined;
213
+ offset?: undefined;
214
+ provider?: undefined;
215
+ model?: undefined;
216
+ include_content?: undefined;
217
+ project_id?: undefined;
218
+ };
219
+ };
220
+ })[];
221
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGtE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2IrB,CAAC"}