@mayank3238/keymux 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -0
- package/dist/cli.cjs +870 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +840 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +2615 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +859 -0
- package/dist/index.d.ts +859 -0
- package/dist/index.js +2567 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy/index.cjs +2138 -0
- package/dist/proxy/index.cjs.map +1 -0
- package/dist/proxy/index.d.cts +38 -0
- package/dist/proxy/index.d.ts +38 -0
- package/dist/proxy/index.js +2122 -0
- package/dist/proxy/index.js.map +1 -0
- package/package.json +77 -0
package/dist/cli.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/dashboard.ts","../src/proxy/daemon.ts","../src/cli.ts"],"names":["path","os","fs","http","chalk","today","args","path2","os2","fs2","net","spawn","execSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport chalk from 'chalk';\nimport * as http from 'http';\n\n// Config & State\nconst configPath = path.join(os.homedir(), '.keymux', 'config.json');\nlet config = readConfig();\nlet draftConfig = JSON.parse(JSON.stringify(config));\nlet flashMessage = '';\n\nfunction readConfig() {\n try {\n if (fs.existsSync(configPath)) {\n const parsed = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n if (parsed && typeof parsed === 'object') {\n if (!parsed.keys) parsed.keys = { openrouter: [], nvidia: [], mistral: [], gemini: [], groq: [] };\n return parsed;\n }\n }\n } catch (e) {}\n return { defaultProvider: null, defaultModel: '', keys: { openrouter: [], nvidia: [], mistral: [], gemini: [], groq: [] } };\n}\n\nfunction saveConfig(cfg: any) {\n try {\n fs.writeFileSync(configPath, JSON.stringify(cfg, null, 2));\n } catch (e) {}\n}\n\nconst proxyPort = process.argv.includes('--port') ? parseInt(process.argv[process.argv.indexOf('--port') + 1] || '3002', 10) : 3002;\n\nasync function triggerReload() {\n return new Promise((resolve) => {\n const req = http.request({\n hostname: 'localhost',\n port: proxyPort,\n path: '/v1/keymux/reload',\n method: 'POST'\n }, (res) => { resolve(true); });\n req.on('error', () => { resolve(false); });\n req.end();\n });\n}\n\nfunction readUsageData() {\n const usagePath = path.join(os.homedir(), '.keymux', 'usage.json');\n try {\n if (fs.existsSync(usagePath)) {\n const parsed = JSON.parse(fs.readFileSync(usagePath, 'utf8'));\n if (parsed && typeof parsed === 'object') {\n return parsed;\n }\n }\n } catch (e) {}\n return { totalInputTokens: 0, totalOutputTokens: 0, totalCacheTokens: 0, providerUsage: {}, daily: {}, sessions: 0 };\n}\n\nfunction formatTokens(num: number) {\n if (num > 1000000) return (num / 1000000).toFixed(1) + 'm';\n if (num > 1000) return (num / 1000).toFixed(1) + 'k';\n return num.toString();\n}\n\nconst TABS = ['Status', 'Usage', 'Stats', 'Settings'];\nlet currentTabIdx = 0;\nlet settingsSelectionIdx = 0;\nlet expandedProviders: string[] = [];\nlet currentTreeItems: any[] = [];\nlet usageViewMode: 'today' | 'session' = 'today';\nlet settingsView: 'main' | 'models' | 'keys' = 'main';\n\nlet isInputMode = false;\nlet inputTarget = '';\nlet inputBuffer = '';\nlet promptStr = '';\nlet isListening = false;\n\n\n\n\n\nconst orange = chalk.hex('#e27d60');\nconst lightBlue = chalk.hex('#8b9df2');\nconst gray = chalk.hex('#808080');\nconst highlight = chalk.bgHex('#8b9df2').black;\nconst whiteHighlight = chalk.bgWhite.black;\n\nfunction renderTabs() {\n let out = '';\n for (let i = 0; i < TABS.length; i++) {\n if (i === currentTabIdx) {\n out += highlight(` ${TABS[i]} `) + ' ';\n } else {\n out += lightBlue(TABS[i]) + ' ';\n }\n }\n console.log(out + '');\n}\n\nasync function renderStats() {\n console.log('\\n' + whiteHighlight(' Overview '));\n console.log(chalk.gray.italic(' (Showing all-time cumulative history and lifetime session metrics)\\n'));\n const data = readUsageData();\n\n let favProvider = 'None';\n let maxUsage = 0;\n for (const [prov, count] of Object.entries(data.providerUsage || {})) {\n if ((count as number) > maxUsage) { maxUsage = count as number; favProvider = prov; }\n }\n\n const totalTokens = (data.totalInputTokens || 0) + (data.totalOutputTokens || 0);\n const formattedTotal = formatTokens(totalTokens);\n\n const inTokensStr = formatTokens(data.totalInputTokens || 0);\n const outTokensStr = formatTokens(data.totalOutputTokens || 0);\n const cacheTokensStr = formatTokens(data.totalCacheTokens || 0);\n\n const sessions = data.sessions || 1;\n const dailyDates = Object.keys(data.daily || {}).sort();\n const activeDays = dailyDates.length;\n\n let mostActiveDay = 'None';\n let maxDailyTokens = 0;\n\n for (const date of dailyDates) {\n const dayData = (data.daily as any)[date];\n const dayTokens = (dayData.inputTokens || 0) + (dayData.outputTokens || 0);\n if (dayTokens > maxDailyTokens) {\n maxDailyTokens = dayTokens;\n mostActiveDay = date;\n }\n }\n\n let currentStreak = 0;\n if (activeDays > 0) {\n const today = new Date();\n for (let i = 0; i < 365; i++) {\n const checkDate = new Date(today);\n checkDate.setDate(today.getDate() - i);\n const dateStr = checkDate.toISOString().split('T')[0] as string;\n if (data.daily && (data.daily as any)[dateStr]) {\n currentStreak++;\n } else if (i > 0) {\n break;\n }\n }\n }\n\n // Real Heatmap\n const numWeeks = 52;\n const blocks = [gray('·'), orange('░'), orange('▒'), orange('▓'), orange('█')];\n const grid: string[][] = Array.from({length: 7}, () => Array(numWeeks).fill(' '));\n const today = new Date();\n const todayDayOfWeek = today.getDay();\n\n for (let col = 0; col < numWeeks; col++) {\n for (let row = 0; row < 7; row++) {\n const weeksAgo = (numWeeks - 1) - col;\n const daysAgo = (weeksAgo * 7) + (todayDayOfWeek - row);\n if (daysAgo < 0 || daysAgo > 364) {\n if(grid[row] && typeof col === \"number\") grid[row]![col] = ' ';\n } else {\n const d = new Date();\n d.setDate(today.getDate() - daysAgo);\n const dateStr = d.toISOString().split('T')[0] as string;\n const dayData = (data.daily && (data.daily as any)[dateStr]) ? (data.daily as any)[dateStr] : null;\n if (!dayData) {\n if(grid[row] && typeof col === \"number\") grid[row]![col] = blocks[0] as string;\n } else {\n const tokens = (dayData.inputTokens || 0) + (dayData.outputTokens || 0);\n let b = 1;\n if (tokens > 10000) b = 2;\n if (tokens > 50000) b = 3;\n if (tokens > 100000) b = 4;\n if(grid[row] && typeof col === \"number\") grid[row]![col] = blocks[b] as string;\n }\n }\n }\n }\n\n // Month labels compressed\n console.log(' Sep Oct Nov Dec Jan Feb Mar Apr May Jun Jul Aug');\n const rowLabels = [' ', 'Mon', ' ', 'Wed', ' ', 'Fri', ' '];\n for (let row = 0; row < 7; row++) {\n process.stdout.write(rowLabels[row] + ' ');\n for (let col = 0; col < numWeeks; col++) {\n process.stdout.write(grid[row] && grid[row]![col] ? grid[row]![col] as string : ' ');\n }\n console.log();\n }\n console.log(' Less ' + blocks.join('') + ' More');\n\n console.log(orange('All time') + gray(' · Last 7 days · Last 30 days') + '');\n\n console.log(`Favorite provider: ${orange(favProvider.padEnd(16))}Total tokens: ${orange(formattedTotal)}`);\n console.log(`Sessions: ${orange(sessions.toString().padEnd(25))}Active days: ${orange(activeDays.toString())}`);\n console.log(`Most active day: ${orange(mostActiveDay.padEnd(17))}Current streak: ${orange(currentStreak + ' days')}`);\n console.log();\n console.log(gray(`Input ${inTokensStr} · Output ${outTokensStr} · Cache read ${cacheTokensStr}`));\n console.log();\n console.log();\n console.log(gray('↓ stats · r to refresh'));\n}\n\nasync function renderStatus() {\n console.log('\\n\\n STATUS');\n\n let activeMode = 'auto';\n let activeModel = 'none';\n let currentProvider = 'auto';\n\n try {\n const amRes = await fetch(`http://localhost:${proxyPort}/v1/keymux/activeModel`);\n if (amRes.ok) {\n const am: any = await amRes.json();\n activeMode = am.mode === 'STRICT' ? 'strict' : 'auto';\n activeModel = am.model === 'auto' ? 'auto (best available)' : am.model;\n currentProvider = am.provider === 'auto' ? 'auto' : am.provider.toLowerCase();\n }\n } catch(e) {}\n\n let activeKey = '';\n let lastUsedModel = 'none';\n let lastUsedProvider = 'none';\n try {\n const lrRes = await fetch(`http://localhost:${proxyPort}/v1/keymux/lastRoute`);\n if (lrRes.ok) {\n const lr: any = await lrRes.json();\n if (lr && lr.provider) {\n activeKey = lr.key || '';\n lastUsedModel = lr.model || 'none';\n lastUsedProvider = lr.provider || 'none';\n }\n }\n } catch(e) {}\n\n const leftColWidth = 35;\n const printRow = (label: string, value: string) => {\n console.log(` ${chalk.white(label.padEnd(leftColWidth))} ${chalk.white(value)}`);\n };\n\n let maskedActiveKey = 'none';\n if (activeKey) {\n maskedActiveKey = activeKey.length > 10 ? `${activeKey.substring(0, 4)}...${activeKey.slice(-4)}` : activeKey;\n }\n\n let displayModel = activeModel;\n let displayProvider = currentProvider;\n \n if (activeMode === 'auto') {\n if (lastUsedModel && lastUsedModel !== 'none') {\n displayModel = `auto (last: ${lastUsedModel})`;\n }\n if (lastUsedProvider && lastUsedProvider !== 'none') {\n displayProvider = `auto (last: ${lastUsedProvider})`;\n }\n }\n\n printRow('Active mode', activeMode);\n printRow('Active model', displayModel);\n printRow('Current provider', displayProvider);\n printRow('Last used key', maskedActiveKey);\n\n console.log('\\n CONNECTIONS (Real-time health, RPM limits, latency)');\n console.log(' ' + '─'.repeat(60));\n\n try {\n const res = await fetch(`http://localhost:${proxyPort}/v1/keymux/stats`);\n if (res.ok) {\n const stats: any[] = await res.json() as any[];\n\n if (stats.length === 0) {\n console.log(chalk.dim(' No active keys found.'));\n }\n\n for (const ep of stats) {\n let providerName = ep.id?.split('-')[0] || 'unk';\n if (providerName.toLowerCase() === 'openrouter') providerName = 'OpenRouter';\n else if (providerName.toLowerCase() === 'nvidia') providerName = 'Nvidia NIM';\n else if (providerName.toLowerCase() === 'mistral') providerName = 'Mistral AI';\n else if (providerName.toLowerCase() === 'gemini') providerName = 'Google Gemini';\n else if (providerName.toLowerCase() === 'groq') providerName = 'Groq';\n else providerName = providerName.charAt(0).toUpperCase() + providerName.slice(1);\n\n let kStr = ep.key || 'unk';\n if (kStr.length > 10) {\n kStr = kStr.substring(0, 4) + '...' + kStr.slice(-4);\n }\n\n const isH = ep.isHealthy;\n const cooldownS = ep.cooldownRemainingMs ? Math.ceil(ep.cooldownRemainingMs / 1000) : 0;\n\n let healthStr = '';\n if (!isH && (ep.circuitState === 'open' || cooldownS > 0)) {\n healthStr = chalk.red(`BLOCKED ${cooldownS}s cdn`.padEnd(19));\n } else if (!isH) {\n healthStr = chalk.red('BLOCKED '.padEnd(19));\n } else {\n healthStr = chalk.green('ACTIVE '.padEnd(19));\n }\n\n const rpm = ep.rpm || 0;\n const lim = ep.rpmLimit;\n let rStr = lim && lim > 0 ? `${rpm} rpm` : `${rpm} rpm`;\n rStr = rStr.padEnd(16);\n\n const lat = ep.latency || ep.avgLatencyMs || 0;\n let lStr = (!isH && (ep.circuitState === 'open' || cooldownS > 0)) ? '---' :\n (lat >= 60000 ? `${(lat / 60000).toFixed(1)}m` :\n (lat >= 1000 ? `${(lat / 1000).toFixed(1)}s` : `${lat}ms`));\n\n if (lStr === '---') {\n lStr = chalk.gray('---');\n } else {\n lStr = chalk.white(lStr);\n }\n\n console.log(` ${chalk.white(providerName.padEnd(15))}${chalk.white(kStr.padEnd(16))}${healthStr}${chalk.white(rStr)}${lStr}`);\n }\n } else {\n console.log(chalk.dim(' Proxy returned an error.'));\n }\n } catch(e) {\n console.log(chalk.dim(' Proxy offline or unreachable.'));\n }\n}\n\nfunction renderSettings() {\n const isUnsaved = JSON.stringify(draftConfig) !== JSON.stringify(config);\n const unsavedTag = isUnsaved ? chalk.yellow(' (Unsaved Changes - Press S to Save)') : '';\n\n if (flashMessage) {\n console.log(chalk.green(` ✔ ${flashMessage}`));\n flashMessage = '';\n }\n\n currentTreeItems = [];\n let index = 0;\n\n const leftColWidth = 35;\n const renderRow = (label: string, value: string, isSelected: boolean) => {\n const bg = isSelected ? chalk.bgHex('#333333').white : chalk.white;\n const padding = Math.max(0, leftColWidth - label.length);\n console.log(bg(` ${label}${' '.repeat(padding)} ${value}`.padEnd(80)));\n };\n\n if (settingsView === 'main') {\n console.log('\\n\\n SETTINGS' + unsavedTag);\n console.log(' ' + '─'.repeat(60));\n\n currentTreeItems.push({ type: 'main_mode', index: index++ });\n const isAuto = !draftConfig.strictMode;\n renderRow('Routing mode', isAuto ? 'auto' : 'strict', (index - 1) === settingsSelectionIdx);\n\n currentTreeItems.push({ type: 'main_model', index: index++ });\n renderRow('Active model', isAuto ? chalk.gray('auto') : (draftConfig.defaultModel || 'none'), (index - 1) === settingsSelectionIdx);\n\n currentTreeItems.push({ type: 'main_keys', index: index++ });\n const totalKeys = Object.values(draftConfig.keys || {}).reduce((acc: number, arr: any) => acc + arr.length, 0);\n renderRow('API keys', `${totalKeys} active keys`, (index - 1) === settingsSelectionIdx);\n\n console.log('\\n\\n ' + chalk.gray('Enter to toggle/select · S to save · X to discard'));\n\n } else if (settingsView === 'models') {\n console.log('\\n\\n SELECT ACTIVE MODEL');\n console.log(' ' + '─'.repeat(110));\n\n const modelList = [\n { provider: 'openrouter', id: 'inclusionai/ling-3.0-flash-vl:free', capa: 'Vision • Free tier • Multimodal logic & QA' },\n { provider: 'groq', id: 'qwen/qwen3.8-27b', capa: 'Vision tower • Ultra fast LPU • Native reasoning tags' },\n { provider: 'groq', id: 'openai/gpt-oss-120b', capa: '120B • Reasoning traces • Structured output • Tool use' },\n { provider: 'groq', id: 'groq/compound', capa: 'Multi-tool agent • Integrated web search & code execution' },\n { provider: 'nvidia', id: 'nvidia/nemotron-3-super-120b-a12b', capa: '120B MoE • High volume agentic reasoning traces' },\n { provider: 'nvidia', id: 'nvidia/nemotron-3-ultra-550b-a55b', capa: '550B MoE • Massive enterprise IT & logic solver' },\n { provider: 'gemini', id: 'gemini-3.5-flash-lite', capa: 'Multimodal • 1M context • Low cost document parser' },\n { provider: 'mistral', id: 'devstral-latest', capa: 'Discontinued • Software engineering agentic workflow specialist' },\n { provider: 'mistral', id: 'codestral-2508', capa: '256K context • Pure fill-in-the-middle code completion' },\n ];\n\n for (const m of modelList) {\n currentTreeItems.push({ type: 'model', provider: m.provider, id: m.id, index: index++ });\n const isSelected = (index - 1) === settingsSelectionIdx;\n const isSaved = draftConfig.defaultModel === m.id;\n const hasKeys = draftConfig.keys && (draftConfig.keys as any)[m.provider] && (draftConfig.keys as any)[m.provider].length > 0;\n\n const modelStr = m.id.padEnd(leftColWidth);\n const provStr = m.provider.padEnd(10);\n const keyWarning = hasKeys ? '' : chalk.red(' ⚠️ NO KEYS ');\n const capaStr = chalk.gray(`${m.capa}`);\n\n let line = '';\n if (isSelected) {\n line = chalk.bgHex('#333333').white(` ${modelStr} `) + chalk.bgHex('#333333').gray(`${provStr}`) + (hasKeys ? '' : chalk.bgHex('#333333').red(' ⚠️ NO KEYS ')) + chalk.bgHex('#333333').gray(`${m.capa}`);\n console.log(chalk.bgHex('#333333')(line.padEnd(120)));\n } else {\n const idCol = isSaved ? chalk.blue(` ${modelStr} `) : chalk.bold.white(` ${modelStr} `);\n console.log(`${idCol}${chalk.gray(provStr)}${keyWarning}${capaStr}`);\n }\n }\n\n console.log('\\n\\n ' + chalk.gray('Enter to select · Esc to return'));\n\n } else if (settingsView === 'keys') {\n console.log('\\n\\n API SECRETS');\n console.log(' ' + '─'.repeat(60));\n\n const providers = ['openrouter', 'nvidia', 'mistral', 'gemini', 'groq'];\n const capitalize = (s: string) => {\n if (s === 'openrouter') return 'OpenRouter';\n if (s === 'nvidia') return 'Nvidia NIM';\n if (s === 'mistral') return 'Mistral AI';\n if (s === 'gemini') return 'Google Gemini';\n if (s === 'groq') return 'Groq';\n return s;\n };\n const maskKey = (k: string) => k.length > 8 ? k.substring(0, 4) + '...' + k.slice(-4) : '***';\n\n for (const p of providers) {\n const keys = draftConfig.keys?.[p] || [];\n currentTreeItems.push({ type: 'secret_provider', provider: p, index: index++ });\n\n const isSelected = (index - 1) === settingsSelectionIdx;\n renderRow(capitalize(p), `${keys.length} active keys`, isSelected);\n\n if (expandedProviders.includes(p)) {\n for (const key of keys) {\n currentTreeItems.push({ type: 'key', provider: p, keyString: key, index: index++ });\n const keySelected = (index - 1) === settingsSelectionIdx;\n const bg = keySelected ? chalk.bgHex('#333333').gray : chalk.gray;\n console.log(bg(` ↳ ${maskKey(key)}${keySelected ? chalk.red(' (Press D to delete)') : ''}`.padEnd(80)));\n }\n\n currentTreeItems.push({ type: 'add', provider: p, index: index++ });\n const addSelected = (index - 1) === settingsSelectionIdx;\n if (isInputMode && inputTarget === p) {\n console.log(` ↳ ${chalk.cyan('Enter new key:')} ` + chalk.bgCyan.black(` ${inputBuffer}_ `));\n } else {\n const bg = addSelected ? chalk.bgHex('#333333').gray : chalk.gray;\n console.log(bg(` ↳ [ Press Enter to Add ]`.padEnd(80)));\n }\n }\n }\n console.log('\\n\\n ' + chalk.gray('Enter to add/toggle · D to delete key · Esc to return · S to save'));\n }\n}\nfunction formatCompact(num: number): string {\n if (num >= 1000000) return (num / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n if (num >= 1000) return (num / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n return num.toString();\n}\n\nasync function renderUsage() {\n console.log('\\n\\n USAGE & ANALYTICS');\n\n let usageData: any = { providerUsage: {} };\n try {\n const res = await fetch(`http://localhost:${proxyPort}/v1/keymux/usage`);\n if (res.ok) {\n usageData = await res.json() as any;\n } else {\n usageData = { providerUsage: readUsageData().providerUsage };\n }\n } catch(e) {\n usageData = { providerUsage: readUsageData().providerUsage };\n }\n\n let liveStats: any[] = [];\n let activeKey = '';\n try {\n const res = await fetch(`http://localhost:${proxyPort}/v1/keymux/stats`);\n if (res.ok) {\n liveStats = await res.json() as any[];\n }\n const lrRes = await fetch(`http://localhost:${proxyPort}/v1/keymux/lastRoute`);\n if (lrRes.ok) {\n const lr: any = await lrRes.json();\n if (lr && lr.provider) activeKey = lr.key || '';\n }\n } catch(e) {}\n\n console.log(chalk.dim(` [ ${usageViewMode === 'today' ? 'Last 24 Hours (Today)' : 'Current Session'} ] (Press Enter to toggle)\\n`));\n\n const getTokens = (usage: any) => typeof usage === 'number' ? 0 : (usage?.tokens || 0);\n const getReqs = (usage: any) => typeof usage === 'number' ? usage : (usage?.requests || 0);\n\n const currentUsageData = usageViewMode === 'today' ? (usageData.today || usageData.providerUsage) : (usageData.session || usageData.providerUsage);\n\n const orUsage = currentUsageData?.openrouter;\n const nvUsage = currentUsageData?.nvidia;\n const miUsage = currentUsageData?.mistral;\n const geUsage = currentUsageData?.gemini;\n const gqUsage = currentUsageData?.groq;\n const orTokens = getTokens(orUsage);\n const nvTokens = getTokens(nvUsage);\n const miTokens = getTokens(miUsage);\n const geTokens = getTokens(geUsage);\n const gqTokens = getTokens(gqUsage);\n\n const totalTokens = orTokens + nvTokens + miTokens + geTokens + gqTokens;\n const orPct = totalTokens > 0 ? Math.round((orTokens / totalTokens) * 100) : 0;\n const nvPct = totalTokens > 0 ? Math.round((nvTokens / totalTokens) * 100) : 0;\n const miPct = totalTokens > 0 ? Math.round((miTokens / totalTokens) * 100) : 0;\n const gePct = totalTokens > 0 ? Math.round((geTokens / totalTokens) * 100) : 0;\n const gqPct = totalTokens > 0 ? Math.round((gqTokens / totalTokens) * 100) : 0;\n\n const leftColWidth = 35;\n\n console.log(' PROVIDER DISTRIBUTION (TOKENS)');\n console.log(' ' + '─'.repeat(60));\n\n const printRow = (label: string, value: string) => {\n console.log(` ${chalk.white(label.padEnd(leftColWidth))} ${chalk.white(value)}`);\n };\n\n printRow('OpenRouter', `${formatCompact(orTokens)} Tokens (${orPct}%)`);\n printRow('Nvidia NIM', `${formatCompact(nvTokens)} Tokens (${nvPct}%)`);\n\n if (miTokens > 0 || getReqs(miUsage) > 0 || draftConfig.keys?.mistral?.length) {\n printRow('Mistral AI', `${formatCompact(miTokens)} Tokens (${miPct}%)`);\n }\n if (geTokens > 0 || getReqs(geUsage) > 0 || draftConfig.keys?.gemini?.length) {\n printRow('Google Gemini', `${formatCompact(geTokens)} Tokens (${gePct}%)`);\n }\n if (gqTokens > 0 || getReqs(gqUsage) > 0 || draftConfig.keys?.groq?.length) {\n printRow('Groq', `${formatCompact(gqTokens)} Tokens (${gqPct}%)`);\n }\n\n console.log('\\n TRAFFIC ROUTING (REQUESTS)');\n console.log(' ' + '─'.repeat(60));\n\n if (liveStats.length === 0) {\n console.log(chalk.dim(' No active keys found.'));\n } else {\n for (const stat of liveStats) {\n const keyStr = stat.key || '';\n let masked = keyStr;\n if (keyStr.length > 10) {\n masked = `${keyStr.substring(0, 4)}...${keyStr.slice(-4)}`;\n }\n\n const reqs = stat.totalRequests || 0;\n const errs = stat.totalErrors || 0;\n\n let label = masked;\n if (activeKey && keyStr && activeKey.endsWith(keyStr.slice(-4))) {\n label += chalk.dim(' (Active)');\n }\n\n const val = `${reqs} reqs ${errs > 0 ? chalk.red(`[${errs} errs]`) : ''}`;\n // Clean up ansi codes for padding calc\n const rawLabel = label.replace(/\\x1B\\[\\d+m/g, '');\n const padding = Math.max(0, leftColWidth - rawLabel.length);\n console.log(` ${chalk.white(label)}${' '.repeat(padding)} ${chalk.white(val.trim())}`);\n }\n }\n}\n\nlet lastFrameBuffer = '';\n\nasync function render() {\n let frameBuffer = '';\n const originalLog = console.log;\n const originalWrite = process.stdout.write;\n\n console.log = (...args: any[]) => {\n frameBuffer += args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ') + '\\n';\n };\n process.stdout.write = ((chunk: any) => {\n frameBuffer += chunk.toString();\n return true;\n }) as any;\n\n try {\n renderTabs();\n\n const tab = TABS[currentTabIdx];\n if (tab === 'Stats') await renderStats();\n else if (tab === 'Status') await renderStatus();\n else if (tab === 'Usage') await renderUsage();\n else if (tab === 'Settings') renderSettings();\n console.log('' + chalk.gray('Tab to switch tabs · q to quit'));\n } finally {\n console.log = originalLog;\n process.stdout.write = originalWrite;\n }\n\n if (frameBuffer !== lastFrameBuffer) {\n process.stdout.write('\\x1b[2J\\x1b[H' + frameBuffer);\n lastFrameBuffer = frameBuffer;\n }\n}\n\n\nexport async function runDashboard() {\n await render();\n\n if (process.stdin.isTTY && !isListening) {\n isListening = true;\n\n let isRendering = false;\n setInterval(async () => {\n if (!isInputMode && !isRendering) {\n isRendering = true;\n try {\n await render();\n } finally {\n isRendering = false;\n }\n }\n }, 2000);\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n\n process.stdin.on('data', async (key: string) => {\n\n if (key === '\\u0003' || key === 'q' && !isInputMode) {\n process.stdout.write('\\x1b[2J\\x1b[H');\n process.exit();\n }\n\n if (key === 'r' && !isInputMode) {\n await render();\n return;\n }\n\n\n\n\n if (isInputMode) {\n if (key === '\\r' || key === '') {\n const val = inputBuffer.trim();\n if (val) {\n if (!draftConfig.keys) draftConfig.keys = { openrouter: [], nvidia: [], mistral: [], gemini: [], groq: [] };\n if (!(draftConfig.keys as any)[inputTarget]) {\n (draftConfig.keys as any)[inputTarget] = [];\n }\n if (!(draftConfig.keys as any)[inputTarget].includes(val)) {\n (draftConfig.keys as any)[inputTarget].push(val);\n }\n }\n isInputMode = false;\n await render();\n } else if (key === '\\x1b') {\n isInputMode = false;\n await render();\n } else if (key === '\\u007f' || key === '\\b') {\n inputBuffer = inputBuffer.slice(0, -1);\n await render();\n } else {\n // Strip ANSI and limit buffer\n const cleanKey = key.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\n if (cleanKey) {\n inputBuffer += cleanKey;\n if (inputBuffer.length > 500) {\n inputBuffer = inputBuffer.slice(0, 500);\n }\n await render();\n }\n }\n return;\n }\n\n // Tab Navigation\n if (key === '\\t' || key === '\\x1b[C' || key === '\\x1bOC') { // Tab or Right Arrow\n currentTabIdx = (currentTabIdx + 1) % TABS.length; isInputMode = false;\n settingsView = 'main'; settingsSelectionIdx = 0;\n await render();\n } else if (key === '\\x1b[D' || key === '\\x1bOD') { // Left Arrow\n currentTabIdx = (currentTabIdx - 1 + TABS.length) % TABS.length; isInputMode = false;\n settingsView = 'main'; settingsSelectionIdx = 0;\n await render();\n } else if (TABS[currentTabIdx] === 'Usage' && (key === '\\r' || key === '' || key === ' ')) {\n usageViewMode = usageViewMode === 'today' ? 'session' : 'today';\n await render();\n }\n\n // Settings Navigation\n else if (TABS[currentTabIdx] === 'Settings') {\n if (key === '\\x1b' || key === '\\x1b[27~') { // Escape\n if (settingsView !== 'main') {\n settingsView = 'main';\n settingsSelectionIdx = 0;\n await render();\n }\n } else if (key === '\\x1b[A' || key === '\\x1bOA') { // Up Arrow\n if (settingsSelectionIdx > 0) settingsSelectionIdx--;\n await render();\n } else if (key === '\\x1b[B' || key === '\\x1bOB') { // Down Arrow\n if (settingsSelectionIdx < currentTreeItems.length - 1) settingsSelectionIdx++;\n await render();\n } else if (key === '\\r' || key === '' || key === ' ') { // Enter or Space\n const selected = currentTreeItems[settingsSelectionIdx];\n if (!selected) return;\n\n if (selected.type === 'main_mode') {\n draftConfig.strictMode = !draftConfig.strictMode;\n if (!draftConfig.strictMode) {\n draftConfig.defaultModel = '';\n draftConfig.defaultProvider = '';\n }\n await render();\n } else if (selected.type === 'main_model') {\n settingsView = 'models';\n settingsSelectionIdx = 0;\n await render();\n } else if (selected.type === 'main_keys') {\n settingsView = 'keys';\n settingsSelectionIdx = 0;\n await render();\n } else if (selected.type === 'model') {\n draftConfig.defaultProvider = selected.provider;\n draftConfig.defaultModel = selected.id;\n draftConfig.strictMode = true;\n settingsView = 'main';\n settingsSelectionIdx = 0;\n await render();\n } else if (selected.type === 'secret_provider') {\n if (expandedProviders.includes(selected.provider)) {\n expandedProviders = expandedProviders.filter(p => p !== selected.provider);\n } else {\n expandedProviders.push(selected.provider);\n }\n await render();\n } else if (selected.type === 'add') {\n isInputMode = true;\n inputTarget = selected.provider;\n promptStr = 'Enter new key: ';\n inputBuffer = '';\n await render();\n }\n } else if (key.toLowerCase() === 'm' && !isInputMode && settingsView === 'main') { // Toggle Mode\n draftConfig.strictMode = !draftConfig.strictMode;\n if (!draftConfig.strictMode) {\n draftConfig.defaultModel = '';\n draftConfig.defaultProvider = '';\n }\n flashMessage = draftConfig.strictMode ? '🔒 Switched to STRICT Mode' : '⚡ Switched to AUTO Mode';\n await render();\n } else if ((key.toLowerCase() === 'd' || key === '\\x7f' || key === '\\b' || key === '\\x1b[3~') && !isInputMode && settingsView === 'keys') { // Delete\n const selected = currentTreeItems[settingsSelectionIdx];\n if (selected && selected.type === 'key') {\n const providerKeys = (draftConfig.keys as any)[selected.provider];\n if (providerKeys) {\n const idx = providerKeys.indexOf(selected.keyString);\n if (idx > -1) {\n providerKeys.splice(idx, 1);\n flashMessage = `🗑️ Deleted key for ${selected.provider}`;\n // Ensure selection index doesn't overshoot after deleting an item\n if (settingsSelectionIdx >= currentTreeItems.length - 1) {\n settingsSelectionIdx = Math.max(0, currentTreeItems.length - 2);\n }\n }\n }\n }\n await render();\n } else if (key.toLowerCase() === 's') { // Save\n config = JSON.parse(JSON.stringify(draftConfig));\n saveConfig(config);\n await triggerReload();\n flashMessage = 'Changes saved successfully!';\n await render();\n } else if (key.toLowerCase() === 'x') { // Discard\n draftConfig = JSON.parse(JSON.stringify(config));\n settingsView = 'main';\n settingsSelectionIdx = 0;\n flashMessage = 'Changes discarded.';\n await render();\n }\n }\n\n });\n }\n}\n","import { spawn, execSync } from 'child_process';\nimport * as net from 'net';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nfunction getPidFile() {\n const dir = path.join(os.homedir(), '.keymux');\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n return path.join(dir, 'proxy.pid');\n}\n\nexport async function startDaemon(port: number): Promise<void> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n\n server.once('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n console.log(`Keymux proxy already running on port ${port}`);\n resolve();\n } else {\n reject(err);\n }\n });\n\n server.once('listening', () => {\n server.close(async () => {\n try {\n let proxyScriptPath;\n if (typeof __dirname !== 'undefined') {\n proxyScriptPath = path.join(__dirname, 'proxy', 'index.js').replace(/\\\\/g, '\\\\\\\\');\n } else {\n const url = await import('url');\n const dirname = url.fileURLToPath(new URL('.', import.meta.url));\n proxyScriptPath = path.join(dirname, 'proxy', 'index.js').replace(/\\\\/g, '\\\\\\\\');\n }\n const child = spawn('node', ['-e', `import('${proxyScriptPath}').then(m => m.startProxyServer({ port: ${port} })).catch(console.error)`], {\n detached: true,\n stdio: 'ignore'\n });\n\n if (child.pid) {\n fs.writeFileSync(getPidFile(), child.pid.toString());\n }\n child.unref();\n console.log(`Keymux proxy started on port ${port}`);\n resolve();\n } catch (err) {\n reject(err);\n }\n });\n });\n\n server.listen(port);\n });\n}\n\nexport async function stopDaemon(port: number): Promise<void> {\n const pidFile = getPidFile();\n let stopped = false;\n\n if (fs.existsSync(pidFile)) {\n try {\n const pid = parseInt(fs.readFileSync(pidFile, 'utf8').trim(), 10);\n if (pid && !isNaN(pid)) {\n try {\n const cmd = execSync(`ps -p ${pid} -o command=`).toString();\n if (!cmd.includes('node') && !cmd.includes('keymux')) {\n console.log(`Process ${pid} is not a Keymux proxy. Aborting.`);\n } else {\n process.kill(pid, 'SIGTERM');\n console.log(`Keymux proxy (PID ${pid}) stopped gracefully.`);\n stopped = true;\n }\n } catch (e) {\n // Process doesn't exist\n console.log(`Failed to verify process ${pid}`);\n }\n }\n } catch (e: any) {\n if (e.code === 'ESRCH') {\n console.log('Proxy is not running (stale PID file).');\n } else {\n console.log('Failed to stop proxy via PID: ' + e.message);\n }\n }\n try { fs.unlinkSync(pidFile); } catch (e) {}\n }\n\n // Fallback: forcefully kill any orphaned keymux proxy node processes\n try {\n const pkillCmd = `pkill -f \"dist/proxy/index.js.*port: ${port}\"`;\n execSync(pkillCmd, { stdio: 'ignore' });\n if (!stopped) {\n console.log(`Orphaned Keymux proxy on port ${port} forcefully stopped.`);\n stopped = true;\n }\n } catch (e) {\n // pkill throws if no processes matched, which is fine\n }\n\n if (!stopped) {\n console.log('Keymux proxy is not running.');\n }\n}\n","#!/usr/bin/env node\n\nimport { runDashboard } from './cli/dashboard';\nimport { startDaemon, stopDaemon } from './proxy/daemon';\n\nconst args = process.argv.slice(2);\n\n\nconst sleep = (ms: number) => new Promise(r => setTimeout(r, ms));\nasync function runBootAnimation() {\n const chalk = (await import('chalk')).default;\n const logo = [\n \" ██╗ ██╗███████╗██╗ ██╗███╗ ███╗██╗ ██╗██╗ ██╗\",\n \" ██║ ██╔╝██╔════╝╚██╗ ██╔╝████╗ ████║██║ ██║╚██╗██╔╝\",\n \" █████╔╝ █████╗ ╚████╔╝ ██╔████╔██║██║ ██║ ╚███╔╝\",\n \" ██╔═██╗ ██╔══╝ ╚██╔╝ ██║╚██╔╝██║██║ ██║ ██╔██╗\",\n \" ██║ ██╗███████╗ ██║ ██║ ╚═╝ ██║╚██████╔╝██╔╝ ██╗\",\n \" ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝\"\n ];\n \n console.clear();\n console.log('\\n');\n for (const line of logo) {\n console.log(chalk.cyan(line));\n await sleep(30);\n }\n \n console.log('\\n' + chalk.green(' ✔ Keymux Gateway initialized successfully.'));\n}\nconst helpText = `Usage: keymux [command] [options]\n\nCommands:\n -d, --dashboard Run the interactive dashboard\n proxy, start Start the Keymux proxy daemon\n stop Stop the Keymux proxy daemon\n\nOptions for proxy/start:\n --port <port> Specify the port to run the proxy on (default: 3002)\n\nExamples:\n keymux -d\n keymux start\n keymux proxy --port 8080\n keymux stop`;\n\nasync function main() {\n if (args.includes('--help') || args.includes('-h')) {\n console.log(helpText);\n return;\n }\n\n if (args.length === 0 || args.includes('-d') || args.includes('--dashboard')) {\n runDashboard().catch(console.error);\n return;\n }\n\n const command = args[0];\n\n if (command === 'proxy' || command === 'start') {\n let port = 3002;\n const portIndex = args.indexOf('--port');\n if (portIndex !== -1 && args.length > portIndex + 1) {\n port = parseInt(args[portIndex + 1] ?? '3002', 10);\n }\n await runBootAnimation();\n await startDaemon(port);\n } else if (command === 'stop') {\n let port = 3002;\n const portIndex = args.indexOf('--port');\n if (portIndex !== -1 && args.length > portIndex + 1) {\n port = parseInt(args[portIndex + 1] ?? '3002', 10);\n }\n await stopDaemon(port);\n } else {\n console.log(`Unknown command: ${command}`);\n console.log(helpText);\n process.exit(1);\n }\n}\n\nmain().catch(console.error);\n"]}
|
package/dist/cli.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|