free-coding-models 0.1.24 β†’ 0.1.26

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 CHANGED
@@ -7,6 +7,14 @@
7
7
 
8
8
  <h1 align="center">free-coding-models</h1>
9
9
 
10
+ <p align="center">
11
+ <strong>Want to contribute or discuss the project?</strong> Join our <a href="https://discord.gg/U4vz7mYQ">Discord community</a>!
12
+ </p>
13
+
14
+ <p align="center">
15
+ <strong>πŸ“‚ GitHub:</strong> <a href="https://github.com/vava-nessa/free-coding-models">vava-nessa/free-coding-models</a>
16
+ </p>
17
+
10
18
  <p align="center">
11
19
 
12
20
  ```
@@ -347,7 +347,7 @@ function calculateViewport(terminalRows, scrollOffset, totalModels) {
347
347
  }
348
348
 
349
349
  // πŸ“– renderTable: mode param controls footer hint text (opencode vs openclaw)
350
- function renderTable(results, pendingPings, frame, cursor = null, sortColumn = 'avg', sortDirection = 'asc', pingInterval = PING_INTERVAL, lastPingTime = Date.now(), mode = 'opencode', tierFilter = null, scrollOffset = 0, terminalRows = 0) {
350
+ function renderTable(results, pendingPings, frame, cursor = null, sortColumn = 'avg', sortDirection = 'asc', pingInterval = PING_INTERVAL, lastPingTime = Date.now(), mode = 'opencode', tierFilterMode = 0, scrollOffset = 0, terminalRows = 0) {
351
351
  // πŸ“– Filter out hidden models for display
352
352
  const visibleResults = results.filter(r => !r.hidden)
353
353
 
@@ -383,8 +383,9 @@ function renderTable(results, pendingPings, frame, cursor = null, sortColumn = '
383
383
 
384
384
  // πŸ“– Tier filter badge shown when filtering is active
385
385
  let tierBadge = ''
386
- if (tierFilter) {
387
- tierBadge = chalk.bold.rgb(255, 200, 0)(` [Tier ${tierFilter}]`)
386
+ if (tierFilterMode > 0) {
387
+ const tierNames = ['All', 'S+/S', 'A+/A/A-', 'B+/B', 'C']
388
+ tierBadge = chalk.bold.rgb(255, 200, 0)(` [${tierNames[tierFilterMode]}]`)
388
389
  }
389
390
 
390
391
  // πŸ“– Column widths (generous spacing with margins)
@@ -600,9 +601,11 @@ function renderTable(results, pendingPings, frame, cursor = null, sortColumn = '
600
601
  : mode === 'opencode-desktop'
601
602
  ? chalk.rgb(0, 200, 255)('Enterβ†’OpenDesktop')
602
603
  : chalk.rgb(0, 200, 255)('Enterβ†’OpenCode')
603
- lines.push(chalk.dim(` ↑↓ Navigate β€’ `) + actionHint + chalk.dim(` β€’ R/T/O/M/P/A/S/V/U Sort β€’ W↓/X↑ Interval (${intervalSec}s) β€’ E↑/D↓ Tier β€’ Z Mode β€’ Ctrl+C Exit`))
604
+ lines.push(chalk.dim(` ↑↓ Navigate β€’ `) + actionHint + chalk.dim(` β€’ R/T/O/M/P/A/S/V/U Sort β€’ W↓/X↑ Interval (${intervalSec}s) β€’ T Tier β€’ Z Mode β€’ Ctrl+C Exit`))
604
605
  lines.push('')
605
- lines.push(chalk.dim(' made with ') + '🩷' + chalk.dim(' by vava-nessa β€’ ') + chalk.dim.underline('https://github.com/vava-nessa/free-coding-models'))
606
+ lines.push(chalk.dim(' Made with ') + 'πŸ’–' + chalk.dim(' by ') + '\x1b]8;;https://github.com/vava-nessa\x1b\\vava-nessa\x1b]8;;\x1b\\')
607
+ lines.push(chalk.dim(' πŸ“‚ GitHub: ') + chalk.dim.underline('https://github.com/vava-nessa/free-coding-models'))
608
+ lines.push(chalk.dim(' πŸ’¬ Discord: ') + chalk.dim.underline('https://discord.gg/U4vz7mYQ'))
606
609
  lines.push('')
607
610
  // πŸ“– Append \x1b[K (erase to EOL) to each line so leftover chars from previous
608
611
  // πŸ“– frames are cleared. Then pad with blank cleared lines to fill the terminal,
@@ -1137,11 +1140,27 @@ async function main() {
1137
1140
  process.on('SIGINT', () => exit(0))
1138
1141
  process.on('SIGTERM', () => exit(0))
1139
1142
 
1140
- // πŸ“– No tier filtering by default - all models visible
1143
+ // πŸ“– Tier filtering system - cycles through filter modes
1144
+ let tierFilterMode = 0 // 0=all, 1=S+/S, 2=A+/A/A-, 3=B+/B, 4=C
1141
1145
  function applyTierFilter() {
1142
- // πŸ“– All models visible by default
1143
1146
  state.results.forEach(r => {
1144
- r.hidden = false
1147
+ switch (tierFilterMode) {
1148
+ case 0: // All tiers visible
1149
+ r.hidden = false
1150
+ break
1151
+ case 1: // S+ and S only
1152
+ r.hidden = !(r.tier === 'S+' || r.tier === 'S')
1153
+ break
1154
+ case 2: // A+, A, A- only
1155
+ r.hidden = !(r.tier === 'A+' || r.tier === 'A' || r.tier === 'A-')
1156
+ break
1157
+ case 3: // B+ and B only
1158
+ r.hidden = !(r.tier === 'B+' || r.tier === 'B')
1159
+ break
1160
+ case 4: // C only
1161
+ r.hidden = r.tier !== 'C'
1162
+ break
1163
+ }
1145
1164
  })
1146
1165
 
1147
1166
  return state.results
@@ -1184,7 +1203,13 @@ async function main() {
1184
1203
  state.pingInterval = Math.min(60000, state.pingInterval + 1000)
1185
1204
  }
1186
1205
 
1187
- // πŸ“– Tier filtering removed for simplicity - all models visible by default
1206
+ // πŸ“– Tier toggle key: T = cycle through tier filters (all β†’ S+/S β†’ A+/A/A- β†’ B+/B β†’ C β†’ all)
1207
+ if (key.name === 't') {
1208
+ tierFilterMode = (tierFilterMode + 1) % 5
1209
+ applyTierFilter()
1210
+ adjustScrollOffset(state)
1211
+ return
1212
+ }
1188
1213
 
1189
1214
  // πŸ“– Mode toggle key: Z = cycle through modes (CLI β†’ Desktop β†’ OpenClaw)
1190
1215
  if (key.name === 'z') {
@@ -1270,10 +1295,10 @@ async function main() {
1270
1295
  // πŸ“– Animation loop: clear alt screen + redraw table at FPS with cursor
1271
1296
  const ticker = setInterval(() => {
1272
1297
  state.frame++
1273
- process.stdout.write(ALT_HOME + renderTable(state.results, state.pendingPings, state.frame, state.cursor, state.sortColumn, state.sortDirection, state.pingInterval, state.lastPingTime, state.mode, null, state.scrollOffset, state.terminalRows))
1298
+ process.stdout.write(ALT_HOME + renderTable(state.results, state.pendingPings, state.frame, state.cursor, state.sortColumn, state.sortDirection, state.pingInterval, state.lastPingTime, state.mode, tierFilterMode, state.scrollOffset, state.terminalRows))
1274
1299
  }, Math.round(1000 / FPS))
1275
1300
 
1276
- process.stdout.write(ALT_HOME + renderTable(state.results, state.pendingPings, state.frame, state.cursor, state.sortColumn, state.sortDirection, state.pingInterval, state.lastPingTime, state.mode, null, state.scrollOffset, state.terminalRows))
1301
+ process.stdout.write(ALT_HOME + renderTable(state.results, state.pendingPings, state.frame, state.cursor, state.sortColumn, state.sortDirection, state.pingInterval, state.lastPingTime, state.mode, tierFilterMode, state.scrollOffset, state.terminalRows))
1277
1302
 
1278
1303
  // ── Continuous ping loop β€” ping all models every N seconds forever ──────────
1279
1304
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "free-coding-models",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
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",