free-coding-models 0.5.22 → 0.5.24
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.
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Changelog v0.5.23 - 2026-06-10
|
|
2
|
+
|
|
3
|
+
### Fixed
|
|
4
|
+
- **Critical SyntaxError crash on startup** in `src/tui/render-table.js`: `speedCell` and `moodCell` were declared twice in the same scope (lines 855–856 vs 866–867), causing the published 0.5.22 CLI to fail with `SyntaxError: Identifier 'speedCell' has already been declared` before the TUI could render. Removed the dead first declarations; the badge-aware declarations are now the only ones in scope.
|
|
5
|
+
- **Missing `NEW_MODELS` import** in `src/tui/render-table.js`: the NEW (🆕) badge check added in 0.5.22 was reading from `NEW_MODELS` without importing it. Exported the set from `src/core/utils.js` and imported it correctly in the renderer.
|
|
6
|
+
- **Stale renderTable unit test** regex that assumed the old `🟩 Perfect` verdict format. Updated to match the new `🟩✨ Perfect` (sparkle emoji) format introduced in 0.5.22.
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
- Bumped package version to `0.5.23`.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Changelog v0.5.24 - 2026-06-10
|
|
2
|
+
|
|
3
|
+
### Fixed
|
|
4
|
+
- Removed erroneous ✨ sparkles from ALL verdict icons (🟩🟢🟡🟠🔴🔥🟥⚫⏳💀). The ✨ were added by mistake to every model row instead of being reserved for new models only.
|
|
5
|
+
- The 🆕 NEW badge now correctly appears **only** on recently added models (from the `NEW_MODELS` set), keeping the table clean and readable for all other models.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "free-coding-models",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.24",
|
|
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",
|
package/src/core/utils.js
CHANGED
|
@@ -115,7 +115,7 @@ export const getAvg = (r) => {
|
|
|
115
115
|
//
|
|
116
116
|
// 📖 The "wasUpBefore" check is key — it distinguishes between a model that's
|
|
117
117
|
// temporarily flaky vs one that was never reachable in the first place.
|
|
118
|
-
const NEW_MODELS = new Set([
|
|
118
|
+
export const NEW_MODELS = new Set([
|
|
119
119
|
'nvidia/nemotron-3-ultra-550b-a55b',
|
|
120
120
|
'@cf/meta/llama-3.2-90b-instruct',
|
|
121
121
|
'@cf/mistralai/mistral-7b-instruct-v0.2',
|
package/src/tui/render-table.js
CHANGED
|
@@ -49,7 +49,7 @@ import {
|
|
|
49
49
|
} from '../core/constants.js'
|
|
50
50
|
import { themeColors, currentPalette, getProviderRgb, getTierRgb, getReadableTextRgb, getTheme, THEME_BG_RGB } from './theme.js'
|
|
51
51
|
import { TIER_COLOR } from './tier-colors.js'
|
|
52
|
-
import { getAvg, getVerdict, getUptime, getStabilityScore, getVersionStatusInfo } from '../core/utils.js'
|
|
52
|
+
import { getAvg, getVerdict, getUptime, getStabilityScore, getVersionStatusInfo, NEW_MODELS } from '../core/utils.js'
|
|
53
53
|
import { usagePlaceholderForProvider } from '../core/ping.js'
|
|
54
54
|
import { formatBenchmarkLatency, formatBenchmarkTps } from '../core/benchmark.js'
|
|
55
55
|
import { calculateViewport, sortResultsWithPinnedFavorites, padEndDisplay, displayWidth, stripAnsi, fadedRow } from './render-helpers.js'
|
|
@@ -800,71 +800,64 @@ export function renderTable({
|
|
|
800
800
|
// 📖 Verdict colors follow the same green→red gradient as TIER_COLOR / SWE%
|
|
801
801
|
switch (verdict) {
|
|
802
802
|
case 'Perfect':
|
|
803
|
-
verdictIcon = '
|
|
803
|
+
verdictIcon = '🟩'
|
|
804
804
|
verdictText = `${verdictIcon} Perfect`
|
|
805
805
|
verdictColor = themeColors.successBold
|
|
806
806
|
break
|
|
807
807
|
case 'Normal':
|
|
808
|
-
verdictIcon = '
|
|
808
|
+
verdictIcon = '🟢'
|
|
809
809
|
verdictText = `${verdictIcon} Normal`
|
|
810
810
|
verdictColor = themeColors.metricGood
|
|
811
811
|
break
|
|
812
812
|
case 'Spiky':
|
|
813
|
-
verdictIcon = '
|
|
813
|
+
verdictIcon = '🟡'
|
|
814
814
|
verdictText = `${verdictIcon} Spiky`
|
|
815
815
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('A+'))(text)
|
|
816
816
|
break
|
|
817
817
|
case 'Slow':
|
|
818
|
-
verdictIcon = '
|
|
818
|
+
verdictIcon = '🟠'
|
|
819
819
|
verdictText = `${verdictIcon} Slow`
|
|
820
820
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('A-'))(text)
|
|
821
821
|
break
|
|
822
822
|
case 'Very Slow':
|
|
823
|
-
verdictIcon = '
|
|
823
|
+
verdictIcon = '🔴'
|
|
824
824
|
verdictText = `${verdictIcon} Very Slow`
|
|
825
825
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('B+'))(text)
|
|
826
826
|
break
|
|
827
827
|
case 'Overloaded':
|
|
828
|
-
verdictIcon = '
|
|
828
|
+
verdictIcon = '🔥'
|
|
829
829
|
verdictText = `${verdictIcon} Overloaded`
|
|
830
830
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('B'))(text)
|
|
831
831
|
break
|
|
832
832
|
case 'Unstable':
|
|
833
833
|
// 📖 Avoid ⚠️ here: its variation selector has inconsistent terminal width and shifts the tiny ❔ column.
|
|
834
|
-
verdictIcon = '
|
|
834
|
+
verdictIcon = '🟥'
|
|
835
835
|
verdictText = `${verdictIcon} Unstable`
|
|
836
836
|
verdictColor = themeColors.errorBold
|
|
837
837
|
break
|
|
838
838
|
case 'Not Active':
|
|
839
|
-
verdictIcon = '
|
|
839
|
+
verdictIcon = '⚫'
|
|
840
840
|
verdictText = `${verdictIcon} Not Active`
|
|
841
841
|
verdictColor = themeColors.dim
|
|
842
842
|
break
|
|
843
843
|
case 'Pending':
|
|
844
|
-
verdictIcon = '
|
|
844
|
+
verdictIcon = '⏳'
|
|
845
845
|
verdictText = `${verdictIcon} Pending`
|
|
846
846
|
verdictColor = themeColors.dim
|
|
847
847
|
break
|
|
848
848
|
default:
|
|
849
|
-
verdictIcon = '
|
|
849
|
+
verdictIcon = '💀'
|
|
850
850
|
verdictText = `${verdictIcon} Unusable`
|
|
851
851
|
verdictColor = (text) => chalk.bold.rgb(...getTierRgb('C'))(text)
|
|
852
852
|
break
|
|
853
853
|
}
|
|
854
|
-
// 📖 Use padEndDisplay to account for emoji display width (2 cols each) so all rows align
|
|
855
|
-
const speedCell = verdictColor(padEndDisplay(verdictText, W_VERDICT))
|
|
856
|
-
const moodCell = padEndDisplay(verdictIcon, W_MOOD)
|
|
857
|
-
|
|
858
854
|
// 📖 Add NEW badge for recently added models
|
|
855
|
+
// 📖 Use padEndDisplay to account for emoji display width (2 cols each) so all rows align
|
|
859
856
|
const isNewModel = NEW_MODELS.has(r.modelId) || NEW_MODELS.has(`${r.providerKey}/${r.modelId}`)
|
|
860
857
|
const newBadge = isNewModel ? '🆕' : ''
|
|
861
858
|
const verdictTextWithBadge = newBadge ? `${newBadge} ${verdictText}` : verdictText
|
|
862
|
-
const
|
|
863
|
-
const
|
|
864
|
-
|
|
865
|
-
// 📖 Use the version with badge for display
|
|
866
|
-
const speedCell = speedCellWithBadge
|
|
867
|
-
const moodCell = moodCellWithBadge
|
|
859
|
+
const speedCell = verdictColor(padEndDisplay(verdictTextWithBadge, W_VERDICT))
|
|
860
|
+
const moodCell = padEndDisplay(verdictIcon, W_MOOD)
|
|
868
861
|
|
|
869
862
|
// 📖 Stability column - composite score (0–100) from p95 + jitter + spikes + uptime
|
|
870
863
|
// 📖 Left-aligned to sit flush under the column header
|