anantham-v2 2.0.2 → 2.0.4

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 (67) hide show
  1. package/dist/bin/anantham.js +10 -1
  2. package/dist/bin/anantham.js.map +1 -1
  3. package/dist/cli/command-registry.d.ts +8 -0
  4. package/dist/cli/command-registry.d.ts.map +1 -1
  5. package/dist/cli/command-registry.js +363 -89
  6. package/dist/cli/command-registry.js.map +1 -1
  7. package/dist/domain/tui.d.ts +1 -1
  8. package/dist/domain/tui.d.ts.map +1 -1
  9. package/dist/domain/tui.js +1 -0
  10. package/dist/domain/tui.js.map +1 -1
  11. package/dist/models/adapters/openai-compatible-adapter.d.ts.map +1 -1
  12. package/dist/models/adapters/openai-compatible-adapter.js +2 -1
  13. package/dist/models/adapters/openai-compatible-adapter.js.map +1 -1
  14. package/dist/models/provider-registry.d.ts +2 -2
  15. package/dist/persistence/index.d.ts +2 -0
  16. package/dist/persistence/index.d.ts.map +1 -1
  17. package/dist/persistence/index.js +2 -0
  18. package/dist/persistence/index.js.map +1 -1
  19. package/dist/persistence/model-catalog-cache.d.ts +86 -0
  20. package/dist/persistence/model-catalog-cache.d.ts.map +1 -0
  21. package/dist/persistence/model-catalog-cache.js +398 -0
  22. package/dist/persistence/model-catalog-cache.js.map +1 -0
  23. package/dist/persistence/token-metrics-manager.d.ts +88 -0
  24. package/dist/persistence/token-metrics-manager.d.ts.map +1 -0
  25. package/dist/persistence/token-metrics-manager.js +272 -0
  26. package/dist/persistence/token-metrics-manager.js.map +1 -0
  27. package/dist/persistence/user-config-manager.d.ts +8 -0
  28. package/dist/persistence/user-config-manager.d.ts.map +1 -1
  29. package/dist/persistence/user-config-manager.js +50 -1
  30. package/dist/persistence/user-config-manager.js.map +1 -1
  31. package/dist/tui/ansi-gradient.d.ts +43 -0
  32. package/dist/tui/ansi-gradient.d.ts.map +1 -0
  33. package/dist/tui/ansi-gradient.js +131 -0
  34. package/dist/tui/ansi-gradient.js.map +1 -0
  35. package/dist/tui/command-palette.d.ts +20 -0
  36. package/dist/tui/command-palette.d.ts.map +1 -0
  37. package/dist/tui/command-palette.js +241 -0
  38. package/dist/tui/command-palette.js.map +1 -0
  39. package/dist/tui/model-accordion-browser.d.ts +80 -0
  40. package/dist/tui/model-accordion-browser.d.ts.map +1 -0
  41. package/dist/tui/model-accordion-browser.js +487 -0
  42. package/dist/tui/model-accordion-browser.js.map +1 -0
  43. package/dist/tui/terminal-layout.d.ts +4 -0
  44. package/dist/tui/terminal-layout.d.ts.map +1 -1
  45. package/dist/tui/terminal-layout.js +30 -0
  46. package/dist/tui/terminal-layout.js.map +1 -1
  47. package/dist/tui/terminal-logo-renderer.d.ts +63 -0
  48. package/dist/tui/terminal-logo-renderer.d.ts.map +1 -0
  49. package/dist/tui/terminal-logo-renderer.js +300 -0
  50. package/dist/tui/terminal-logo-renderer.js.map +1 -0
  51. package/dist/tui/token-dashboard-renderer.d.ts +6 -0
  52. package/dist/tui/token-dashboard-renderer.d.ts.map +1 -0
  53. package/dist/tui/token-dashboard-renderer.js +115 -0
  54. package/dist/tui/token-dashboard-renderer.js.map +1 -0
  55. package/dist/tui/tui-controller.d.ts +14 -0
  56. package/dist/tui/tui-controller.d.ts.map +1 -1
  57. package/dist/tui/tui-controller.js +192 -7
  58. package/dist/tui/tui-controller.js.map +1 -1
  59. package/dist/tui/tui-renderer.d.ts +7 -1
  60. package/dist/tui/tui-renderer.d.ts.map +1 -1
  61. package/dist/tui/tui-renderer.js +52 -10
  62. package/dist/tui/tui-renderer.js.map +1 -1
  63. package/dist/tui/tui-sanitizer.d.ts +4 -0
  64. package/dist/tui/tui-sanitizer.d.ts.map +1 -1
  65. package/dist/tui/tui-sanitizer.js +6 -0
  66. package/dist/tui/tui-sanitizer.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,398 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import * as os from "node:os";
4
+ import { UserConfigManager } from "./user-config-manager.js";
5
+ /**
6
+ * Normalizes an OpenRouter model ID into a standardized provider string.
7
+ */
8
+ export function normalizeProvider(rawId) {
9
+ const cleanId = rawId.startsWith("openrouter/") ? rawId.slice("openrouter/".length) : rawId;
10
+ const parts = cleanId.split("/");
11
+ if (parts.length >= 2 && parts[0]) {
12
+ const p = parts[0].toLowerCase();
13
+ if (p === "openai")
14
+ return "openai";
15
+ if (p === "anthropic")
16
+ return "anthropic";
17
+ if (p === "google")
18
+ return "google";
19
+ if (p === "deepseek")
20
+ return "deepseek";
21
+ if (p === "meta-llama" || p === "meta" || p === "llama")
22
+ return "meta-llama";
23
+ if (p === "virtuals")
24
+ return "virtuals";
25
+ return p;
26
+ }
27
+ return "other";
28
+ }
29
+ /**
30
+ * Parses per-token pricing to price per 1 Million tokens.
31
+ */
32
+ export function parsePricePerM(rawPrice) {
33
+ if (rawPrice === undefined || rawPrice === null)
34
+ return 0;
35
+ const num = typeof rawPrice === "number" ? rawPrice : parseFloat(String(rawPrice));
36
+ if (isNaN(num) || num <= 0)
37
+ return 0;
38
+ const perM = num * 1_000_000;
39
+ return Number(perM.toFixed(4));
40
+ }
41
+ /**
42
+ * Persistent cache manager for OpenRouter live catalog models.
43
+ * Saves to ~/.anantham/models_cache.json with 1-hour TTL and atomic writes.
44
+ */
45
+ export class ModelCatalogCache {
46
+ static instance;
47
+ storageDir;
48
+ storagePath;
49
+ ttlMs;
50
+ memoryCache = null;
51
+ static DEFAULT_TTL_MS = 3_600_000; // 1 hour
52
+ /**
53
+ * Curated high-performance fallback models across the 6 major providers.
54
+ */
55
+ static CURATED_MODELS = [
56
+ // Anthropic
57
+ {
58
+ id: "anthropic/claude-3.5-sonnet",
59
+ name: "Claude 3.5 Sonnet",
60
+ provider: "anthropic",
61
+ contextLength: 200_000,
62
+ promptPricePerM: 3.0,
63
+ completionPricePerM: 15.0,
64
+ description: "Anthropic's flagship intelligent and balanced reasoning model",
65
+ },
66
+ {
67
+ id: "anthropic/claude-3.7-sonnet",
68
+ name: "Claude 3.7 Sonnet",
69
+ provider: "anthropic",
70
+ contextLength: 200_000,
71
+ promptPricePerM: 3.0,
72
+ completionPricePerM: 15.0,
73
+ description: "Anthropic's premier hybrid reasoning and coding model",
74
+ },
75
+ {
76
+ id: "anthropic/claude-3.5-haiku",
77
+ name: "Claude 3.5 Haiku",
78
+ provider: "anthropic",
79
+ contextLength: 200_000,
80
+ promptPricePerM: 0.8,
81
+ completionPricePerM: 4.0,
82
+ description: "Ultra-fast lightweight model with near-Sonnet performance",
83
+ },
84
+ {
85
+ id: "anthropic/claude-3-opus",
86
+ name: "Claude 3 Opus",
87
+ provider: "anthropic",
88
+ contextLength: 200_000,
89
+ promptPricePerM: 15.0,
90
+ completionPricePerM: 75.0,
91
+ description: "Anthropic's highest-power model for complex creative and scientific work",
92
+ },
93
+ // OpenAI
94
+ {
95
+ id: "openai/gpt-4o",
96
+ name: "GPT-4o",
97
+ provider: "openai",
98
+ contextLength: 128_000,
99
+ promptPricePerM: 2.5,
100
+ completionPricePerM: 10.0,
101
+ description: "OpenAI versatile high-intelligence multimodal flagship",
102
+ },
103
+ {
104
+ id: "openai/gpt-4o-mini",
105
+ name: "GPT-4o Mini",
106
+ provider: "openai",
107
+ contextLength: 128_000,
108
+ promptPricePerM: 0.15,
109
+ completionPricePerM: 0.6,
110
+ description: "Affordable, fast, lightweight model for high-frequency tasks",
111
+ },
112
+ {
113
+ id: "openai/o1",
114
+ name: "o1 Reasoning",
115
+ provider: "openai",
116
+ contextLength: 200_000,
117
+ promptPricePerM: 15.0,
118
+ completionPricePerM: 60.0,
119
+ description: "Deep chain-of-thought model designed for math, coding, and science",
120
+ },
121
+ {
122
+ id: "openai/o3-mini",
123
+ name: "o3 Mini",
124
+ provider: "openai",
125
+ contextLength: 200_000,
126
+ promptPricePerM: 1.1,
127
+ completionPricePerM: 4.4,
128
+ description: "Fast reasoning model optimized for STEM and coding workflows",
129
+ },
130
+ // Google
131
+ {
132
+ id: "google/gemini-2.5-pro",
133
+ name: "Gemini 2.5 Pro",
134
+ provider: "google",
135
+ contextLength: 1_000_000,
136
+ promptPricePerM: 1.25,
137
+ completionPricePerM: 5.0,
138
+ description: "Google's ultra-long context reasoning and multimodal powerhouse",
139
+ },
140
+ {
141
+ id: "google/gemini-2.0-flash",
142
+ name: "Gemini 2.0 Flash",
143
+ provider: "google",
144
+ contextLength: 1_000_000,
145
+ promptPricePerM: 0.1,
146
+ completionPricePerM: 0.4,
147
+ description: "Low-latency multimodal model with 1M context window",
148
+ },
149
+ {
150
+ id: "google/gemini-1.5-pro",
151
+ name: "Gemini 1.5 Pro",
152
+ provider: "google",
153
+ contextLength: 2_000_000,
154
+ promptPricePerM: 1.25,
155
+ completionPricePerM: 5.0,
156
+ description: "2M token context window for massive codebase ingestion",
157
+ },
158
+ // DeepSeek
159
+ {
160
+ id: "deepseek/deepseek-r1",
161
+ name: "DeepSeek R1",
162
+ provider: "deepseek",
163
+ contextLength: 64_000,
164
+ promptPricePerM: 0.55,
165
+ completionPricePerM: 2.19,
166
+ description: "Open-weights reasoning model with exceptional STEM performance",
167
+ },
168
+ {
169
+ id: "deepseek/deepseek-chat",
170
+ name: "DeepSeek V3",
171
+ provider: "deepseek",
172
+ contextLength: 64_000,
173
+ promptPricePerM: 0.14,
174
+ completionPricePerM: 0.28,
175
+ description: "High-efficiency MoE language model with top benchmark scores",
176
+ },
177
+ // Meta / Llama
178
+ {
179
+ id: "meta-llama/llama-3.3-70b-instruct",
180
+ name: "Llama 3.3 70B Instruct",
181
+ provider: "meta-llama",
182
+ contextLength: 128_000,
183
+ promptPricePerM: 0.12,
184
+ completionPricePerM: 0.3,
185
+ description: "Industry-standard open model with state-of-the-art 70B weights",
186
+ },
187
+ {
188
+ id: "meta-llama/llama-3.1-405b-instruct",
189
+ name: "Llama 3.1 405B Instruct",
190
+ provider: "meta-llama",
191
+ contextLength: 128_000,
192
+ promptPricePerM: 0.8,
193
+ completionPricePerM: 0.8,
194
+ description: "Frontier open-weights 405B parameter instruction model",
195
+ },
196
+ {
197
+ id: "meta-llama/llama-3.1-8b-instruct",
198
+ name: "Llama 3.1 8B Instruct",
199
+ provider: "meta-llama",
200
+ contextLength: 128_000,
201
+ promptPricePerM: 0.05,
202
+ completionPricePerM: 0.05,
203
+ description: "Compact, extremely fast open model for low-latency agent loops",
204
+ },
205
+ // Virtuals
206
+ {
207
+ id: "virtuals/game-agent",
208
+ name: "Virtuals GAME Agent",
209
+ provider: "virtuals",
210
+ contextLength: 32_000,
211
+ promptPricePerM: 0.5,
212
+ completionPricePerM: 1.5,
213
+ description: "On-chain autonomous agent execution model",
214
+ },
215
+ {
216
+ id: "virtuals/sentient-ai",
217
+ name: "Virtuals Sentient AI",
218
+ provider: "virtuals",
219
+ contextLength: 32_000,
220
+ promptPricePerM: 1.0,
221
+ completionPricePerM: 3.0,
222
+ description: "Interactive autonomous agent persona and simulation model",
223
+ },
224
+ ];
225
+ constructor(customStorageDir, ttlMs = ModelCatalogCache.DEFAULT_TTL_MS) {
226
+ this.storageDir = customStorageDir || path.join(os.homedir(), ".anantham");
227
+ this.storagePath = path.join(this.storageDir, "models_cache.json");
228
+ this.ttlMs = ttlMs;
229
+ this.loadFromDisk();
230
+ }
231
+ static getInstance(customStorageDir, ttlMs) {
232
+ if (!ModelCatalogCache.instance || customStorageDir !== undefined) {
233
+ ModelCatalogCache.instance = new ModelCatalogCache(customStorageDir, ttlMs);
234
+ }
235
+ return ModelCatalogCache.instance;
236
+ }
237
+ static resetInstance() {
238
+ ModelCatalogCache.instance = undefined;
239
+ }
240
+ /**
241
+ * Reads cached models from disk if present and valid.
242
+ */
243
+ loadFromDisk() {
244
+ try {
245
+ if (fs.existsSync(this.storagePath)) {
246
+ const raw = fs.readFileSync(this.storagePath, "utf-8");
247
+ const parsed = JSON.parse(raw);
248
+ if (parsed &&
249
+ typeof parsed.fetchedAt === "number" &&
250
+ Array.isArray(parsed.models) &&
251
+ parsed.models.length > 0) {
252
+ this.memoryCache = parsed;
253
+ return parsed;
254
+ }
255
+ }
256
+ }
257
+ catch {
258
+ // Fallback on read or JSON parse failure
259
+ }
260
+ return null;
261
+ }
262
+ /**
263
+ * Synchronously returns cached models from memory or disk if available.
264
+ */
265
+ getCachedModels() {
266
+ if (this.memoryCache && Array.isArray(this.memoryCache.models)) {
267
+ return this.memoryCache.models;
268
+ }
269
+ const loaded = this.loadFromDisk();
270
+ return loaded ? loaded.models : null;
271
+ }
272
+ /**
273
+ * Checks whether the current cache is within its valid TTL window.
274
+ */
275
+ isCacheFresh() {
276
+ if (!this.memoryCache) {
277
+ this.loadFromDisk();
278
+ }
279
+ if (!this.memoryCache) {
280
+ return false;
281
+ }
282
+ const age = Date.now() - this.memoryCache.fetchedAt;
283
+ return age >= 0 && age < (this.memoryCache.ttlMs || this.ttlMs);
284
+ }
285
+ /**
286
+ * Saves models atomically to memory and disk using a temporary file and atomic rename.
287
+ */
288
+ saveModels(models) {
289
+ const data = {
290
+ fetchedAt: Date.now(),
291
+ ttlMs: this.ttlMs,
292
+ models,
293
+ };
294
+ this.memoryCache = data;
295
+ try {
296
+ if (!fs.existsSync(this.storageDir)) {
297
+ fs.mkdirSync(this.storageDir, { recursive: true });
298
+ }
299
+ const tmpPath = path.join(this.storageDir, `models_cache.json.tmp.${Date.now()}.${Math.random().toString(36).slice(2, 8)}`);
300
+ fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2), "utf-8");
301
+ try {
302
+ fs.renameSync(tmpPath, this.storagePath);
303
+ }
304
+ catch {
305
+ // Windows fallback: if renameSync encounters locking, copy and unlink
306
+ fs.copyFileSync(tmpPath, this.storagePath);
307
+ try {
308
+ fs.unlinkSync(tmpPath);
309
+ }
310
+ catch {
311
+ // Ignore temp cleanup errors
312
+ }
313
+ }
314
+ }
315
+ catch {
316
+ // Non-critical cache write failure
317
+ }
318
+ }
319
+ /**
320
+ * Clears in-memory and on-disk cache.
321
+ */
322
+ clearCache() {
323
+ this.memoryCache = null;
324
+ try {
325
+ if (fs.existsSync(this.storagePath)) {
326
+ fs.unlinkSync(this.storagePath);
327
+ }
328
+ }
329
+ catch {
330
+ // Ignore cleanup error
331
+ }
332
+ }
333
+ /**
334
+ * Fetches the model catalog:
335
+ * 1. Returns fresh cache if not forceRefresh.
336
+ * 2. Tries live OpenRouter API fetch with configured key.
337
+ * 3. Falls back to disk cache if available.
338
+ * 4. Falls back to built-in curated models across all 6 providers.
339
+ */
340
+ async getModels(forceRefresh = false) {
341
+ if (!forceRefresh && this.isCacheFresh()) {
342
+ const cached = this.getCachedModels();
343
+ if (cached && cached.length > 0) {
344
+ return cached;
345
+ }
346
+ }
347
+ const apiKey = UserConfigManager.getInstance().getApiKey("openrouter") || process.env.OPENROUTER_API_KEY;
348
+ try {
349
+ const headers = {
350
+ "HTTP-Referer": "https://anantham.ai",
351
+ "X-Title": "Anantham V2",
352
+ };
353
+ if (apiKey) {
354
+ headers["Authorization"] = `Bearer ${apiKey}`;
355
+ }
356
+ const response = await fetch("https://openrouter.ai/api/v1/models", {
357
+ method: "GET",
358
+ headers,
359
+ signal: AbortSignal.timeout(8000),
360
+ });
361
+ if (!response.ok) {
362
+ throw new Error(`OpenRouter models API returned HTTP ${response.status}: ${response.statusText}`);
363
+ }
364
+ const json = (await response.json());
365
+ if (json && Array.isArray(json.data) && json.data.length > 0) {
366
+ const normalized = json.data.map((m) => {
367
+ const provider = normalizeProvider(m.id);
368
+ const promptPricePerM = parsePricePerM(m.pricing?.prompt);
369
+ const completionPricePerM = parsePricePerM(m.pricing?.completion);
370
+ const contextLength = typeof m.context_length === "number" ? m.context_length : 4096;
371
+ return {
372
+ id: m.id,
373
+ name: m.name && m.name.trim().length > 0 ? m.name : m.id,
374
+ provider,
375
+ contextLength,
376
+ promptPricePerM,
377
+ completionPricePerM,
378
+ description: m.description,
379
+ };
380
+ });
381
+ this.saveModels(normalized);
382
+ return normalized;
383
+ }
384
+ }
385
+ catch {
386
+ // Network fetch failure or timeout: proceed to fallbacks
387
+ }
388
+ // Fallback 1: Disk or memory cache (even if expired)
389
+ const existing = this.getCachedModels();
390
+ if (existing && existing.length > 0) {
391
+ return existing;
392
+ }
393
+ // Fallback 2: Comprehensive curated models across all 6 providers
394
+ this.saveModels(ModelCatalogCache.CURATED_MODELS);
395
+ return ModelCatalogCache.CURATED_MODELS;
396
+ }
397
+ }
398
+ //# sourceMappingURL=model-catalog-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog-cache.js","sourceRoot":"","sources":["../../src/persistence/model-catalog-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ export interface TokenRecord {
2
+ id: string;
3
+ timestamp: number;
4
+ date: string;
5
+ modelId: string;
6
+ provider: string;
7
+ inputTokens: number;
8
+ outputTokens: number;
9
+ cachedTokens: number;
10
+ estimatedCostUsd: number;
11
+ command?: string;
12
+ }
13
+ export interface ModelUsageStats {
14
+ inputTokens: number;
15
+ outputTokens: number;
16
+ cachedTokens: number;
17
+ totalTokens: number;
18
+ costUsd: number;
19
+ count: number;
20
+ }
21
+ export interface DailyTokenSummary {
22
+ date: string;
23
+ totalInputTokens: number;
24
+ totalOutputTokens: number;
25
+ totalCachedTokens: number;
26
+ totalTokens: number;
27
+ totalCostUsd: number;
28
+ requestCount: number;
29
+ models: Record<string, ModelUsageStats>;
30
+ }
31
+ export interface ModelPricing {
32
+ inputPerM: number;
33
+ outputPerM: number;
34
+ cachedPerM: number;
35
+ }
36
+ export interface TokenMetricsData {
37
+ records: TokenRecord[];
38
+ monthlyBudgetUsd?: number;
39
+ }
40
+ export declare class TokenMetricsManager {
41
+ private static instance;
42
+ private readonly storageDir;
43
+ private readonly storagePath;
44
+ private data;
45
+ static readonly PRICING: Record<string, ModelPricing>;
46
+ static readonly DEFAULT_PRICING: ModelPricing;
47
+ constructor(customStorageDir?: string);
48
+ static getInstance(customStorageDir?: string): TokenMetricsManager;
49
+ static resetInstance(): void;
50
+ private readFromDisk;
51
+ save(): void;
52
+ static calculateCost(modelId: string, inputTokens: number, outputTokens: number, cachedTokens?: number): number;
53
+ recordUsage(params: {
54
+ modelId: string;
55
+ provider?: string;
56
+ inputTokens: number;
57
+ outputTokens: number;
58
+ cachedTokens?: number;
59
+ command?: string;
60
+ estimatedCostUsd?: number;
61
+ timestamp?: number;
62
+ }): TokenRecord;
63
+ getRecords(): TokenRecord[];
64
+ getMonthlyBudget(): number;
65
+ setMonthlyBudget(usd: number): void;
66
+ getDailySummary(targetDate?: string): DailyTokenSummary;
67
+ getMtdSummary(): {
68
+ totalInputTokens: number;
69
+ totalOutputTokens: number;
70
+ totalCachedTokens: number;
71
+ totalTokens: number;
72
+ totalCostUsd: number;
73
+ requestCount: number;
74
+ };
75
+ getSevenDayTrend(): {
76
+ date: string;
77
+ tokens: number;
78
+ costUsd: number;
79
+ }[];
80
+ getTopModels(limit?: number): {
81
+ modelId: string;
82
+ totalTokens: number;
83
+ costUsd: number;
84
+ percentage: number;
85
+ }[];
86
+ private seedRealisticMetrics;
87
+ }
88
+ //# sourceMappingURL=token-metrics-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metrics-manager.d.ts","sourceRoot":"","sources":["../../src/persistence/token-metrics-manager.ts"],"names":[],"mappings":"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"}