free-coding-models 0.1.41 β†’ 0.1.43

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.
@@ -411,11 +411,11 @@ function renderTable(results, pendingPings, frame, cursor = null, sortColumn = '
411
411
  // πŸ“– Add mode toggle hint
412
412
  const modeHint = chalk.dim.yellow(' (Z to toggle)')
413
413
 
414
- // πŸ“– Tier filter badge shown when filtering is active
414
+ // πŸ“– Tier filter badge shown when filtering is active (shows exact tier name)
415
+ const TIER_CYCLE_NAMES = [null, 'S+', 'S', 'A+', 'A', 'A-', 'B+', 'B', 'C']
415
416
  let tierBadge = ''
416
417
  if (tierFilterMode > 0) {
417
- const tierNames = ['All', 'S+/S', 'A+/A/A-', 'B+/B', 'C']
418
- tierBadge = chalk.bold.rgb(255, 200, 0)(` [${tierNames[tierFilterMode]}]`)
418
+ tierBadge = chalk.bold.rgb(255, 200, 0)(` [${TIER_CYCLE_NAMES[tierFilterMode]}]`)
419
419
  }
420
420
 
421
421
  // πŸ“– Column widths (generous spacing with margins)
@@ -663,9 +663,9 @@ function renderTable(results, pendingPings, frame, cursor = null, sortColumn = '
663
663
  : mode === 'opencode-desktop'
664
664
  ? chalk.rgb(0, 200, 255)('Enterβ†’OpenDesktop')
665
665
  : chalk.rgb(0, 200, 255)('Enterβ†’OpenCode')
666
- lines.push(chalk.dim(` ↑↓ Navigate β€’ `) + actionHint + chalk.dim(` β€’ R/T/O/M/L/A/S/C/H/V/U Sort β€’ W↓/X↑ Interval (${intervalSec}s) β€’ T Tier β€’ Z Mode β€’ Ctrl+C Exit`))
666
+ lines.push(chalk.dim(` ↑↓ Navigate β€’ `) + actionHint + chalk.dim(` β€’ R/Y/O/M/L/A/S/C/H/V/U Sort β€’ W↓/X↑ Interval (${intervalSec}s) β€’ T Filter tier β€’ Z Mode β€’ Ctrl+C Exit`))
667
667
  lines.push('')
668
- lines.push(chalk.dim(' Made with ') + 'πŸ’– & β˜•' + chalk.dim(' by ') + '\x1b]8;;https://github.com/vava-nessa\x1b\\vava-nessa\x1b]8;;\x1b\\' + chalk.dim(' β€’ ') + 'πŸ’¬ ' + chalk.cyanBright('\x1b]8;;https://discord.gg/WKA3TwYVuZ\x1b\\Join Free-Coding-Models Discord!\x1b]8;;\x1b\\') + chalk.dim(' β€’ ') + '⭐ ' + '\x1b]8;;https://github.com/vava-nessa/free-coding-models\x1b\\Read the docs on GitHub\x1b]8;;\x1b\\')
668
+ lines.push(chalk.dim(' Made with ') + 'πŸ’– & β˜•' + chalk.dim(' by ') + '\x1b]8;;https://github.com/vava-nessa\x1b\\vava-nessa\x1b]8;;\x1b\\' + chalk.dim(' β€’ ') + 'πŸ«‚ ' + chalk.cyanBright('\x1b]8;;https://discord.gg/WKA3TwYVuZ\x1b\\Join our Discord!\x1b]8;;\x1b\\') + chalk.dim(' β€’ ') + '⭐ ' + '\x1b]8;;https://github.com/vava-nessa/free-coding-models\x1b\\Read the docs on GitHub\x1b]8;;\x1b\\')
669
669
  lines.push('')
670
670
  // πŸ“– Append \x1b[K (erase to EOL) to each line so leftover chars from previous
671
671
  // πŸ“– frames are cleared. Then pad with blank cleared lines to fill the terminal,
@@ -1296,29 +1296,15 @@ async function main() {
1296
1296
  process.on('SIGINT', () => exit(0))
1297
1297
  process.on('SIGTERM', () => exit(0))
1298
1298
 
1299
- // πŸ“– Tier filtering system - cycles through filter modes
1300
- let tierFilterMode = 0 // 0=all, 1=S+/S, 2=A+/A/A-, 3=B+/B, 4=C
1299
+ // πŸ“– Tier filtering system - cycles through each individual tier one by one
1300
+ // πŸ“– 0=All, 1=S+, 2=S, 3=A+, 4=A, 5=A-, 6=B+, 7=B, 8=C
1301
+ const TIER_CYCLE = [null, 'S+', 'S', 'A+', 'A', 'A-', 'B+', 'B', 'C']
1302
+ let tierFilterMode = 0
1301
1303
  function applyTierFilter() {
1304
+ const activeTier = TIER_CYCLE[tierFilterMode]
1302
1305
  state.results.forEach(r => {
1303
- switch (tierFilterMode) {
1304
- case 0: // All tiers visible
1305
- r.hidden = false
1306
- break
1307
- case 1: // S+ and S only
1308
- r.hidden = !(r.tier === 'S+' || r.tier === 'S')
1309
- break
1310
- case 2: // A+, A, A- only
1311
- r.hidden = !(r.tier === 'A+' || r.tier === 'A' || r.tier === 'A-')
1312
- break
1313
- case 3: // B+ and B only
1314
- r.hidden = !(r.tier === 'B+' || r.tier === 'B')
1315
- break
1316
- case 4: // C only
1317
- r.hidden = r.tier !== 'C'
1318
- break
1319
- }
1306
+ r.hidden = activeTier !== null && r.tier !== activeTier
1320
1307
  })
1321
-
1322
1308
  return state.results
1323
1309
  }
1324
1310
 
@@ -1332,9 +1318,10 @@ async function main() {
1332
1318
  const onKeyPress = async (str, key) => {
1333
1319
  if (!key) return
1334
1320
 
1335
- // πŸ“– Sorting keys: R=rank, T=tier, O=origin, M=model, L=latest ping, A=avg ping, S=SWE-bench, N=context, H=health, V=verdict, U=uptime
1321
+ // πŸ“– Sorting keys: R=rank, Y=tier, O=origin, M=model, L=latest ping, A=avg ping, S=SWE-bench, N=context, H=health, V=verdict, U=uptime
1322
+ // πŸ“– T is reserved for tier filter cycling β€” tier sort moved to Y
1336
1323
  const sortKeys = {
1337
- 'r': 'rank', 't': 'tier', 'o': 'origin', 'm': 'model',
1324
+ 'r': 'rank', 'y': 'tier', 'o': 'origin', 'm': 'model',
1338
1325
  'l': 'ping', 'a': 'avg', 's': 'swe', 'n': 'ctx', 'h': 'condition', 'v': 'verdict', 'u': 'uptime'
1339
1326
  }
1340
1327
 
@@ -1359,9 +1346,9 @@ async function main() {
1359
1346
  state.pingInterval = Math.min(60000, state.pingInterval + 1000)
1360
1347
  }
1361
1348
 
1362
- // πŸ“– Tier toggle key: T = cycle through tier filters (all β†’ S+/S β†’ A+/A/A- β†’ B+/B β†’ C β†’ all)
1349
+ // πŸ“– Tier toggle key: T = cycle through each individual tier (All β†’ S+ β†’ S β†’ A+ β†’ A β†’ A- β†’ B+ β†’ B β†’ C β†’ All)
1363
1350
  if (key.name === 't') {
1364
- tierFilterMode = (tierFilterMode + 1) % 5
1351
+ tierFilterMode = (tierFilterMode + 1) % TIER_CYCLE.length
1365
1352
  applyTierFilter()
1366
1353
  adjustScrollOffset(state)
1367
1354
  return
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-coding-models",
3
- "version": "0.1.41",
3
+ "version": "0.1.43",
4
4
  "description": "Find the fastest coding LLM models in seconds β€” ping free models from multiple providers, pick the best one for OpenCode, Cursor, or any AI coding assistant.",
5
5
  "keywords": [
6
6
  "nvidia",