free-coding-models 0.5.6 → 0.5.9
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 +14 -9
- package/changelog/v0.5.7.md +20 -0
- package/changelog/v0.5.8.md +23 -0
- package/package.json +1 -1
- package/src/core/endpoint-installer.js +3 -3
- package/src/core/tool-launchers.js +2 -2
- package/web/dist/assets/index-27IYGKp2.js +39 -0
- package/web/dist/assets/index-DKmmiDip.css +1 -0
- package/web/dist/index.html +2 -2
- package/web/server.js +386 -1
- package/web/src/App.jsx +145 -26
- package/web/src/components/analytics/AnalyticsView.jsx +4 -0
- package/web/src/components/analytics/TokenUsagePanel.jsx +105 -0
- package/web/src/components/analytics/TokenUsagePanel.module.css +126 -0
- package/web/src/components/atoms/TierBadge.module.css +3 -3
- package/web/src/components/dashboard/DetailPanel.jsx +29 -4
- package/web/src/components/dashboard/DetailPanel.module.css +26 -0
- package/web/src/components/dashboard/FilterBar.jsx +17 -2
- package/web/src/components/dashboard/FilterBar.module.css +17 -0
- package/web/src/components/dashboard/ModelTable.jsx +17 -5
- package/web/src/components/dashboard/ModelTable.module.css +14 -1
- package/web/src/components/help/HelpView.jsx +1 -1
- package/web/src/components/install/InstallEndpointsView.jsx +278 -0
- package/web/src/components/install/InstallEndpointsView.module.css +351 -0
- package/web/src/components/installed/InstalledModelsView.jsx +89 -0
- package/web/src/components/installed/InstalledModelsView.module.css +200 -0
- package/web/src/components/launch/IncompatibleFallbackModal.jsx +69 -0
- package/web/src/components/launch/LaunchButton.jsx +30 -0
- package/web/src/components/launch/LaunchButton.module.css +35 -0
- package/web/src/components/launch/LaunchModal.module.css +125 -0
- package/web/src/components/layout/Header.jsx +70 -11
- package/web/src/components/layout/Header.module.css +62 -2
- package/web/src/components/recommend/RecommendView.jsx +121 -0
- package/web/src/components/recommend/RecommendView.module.css +55 -0
- package/web/src/components/router/RouterView.jsx +286 -0
- package/web/src/components/router/RouterView.module.css +357 -0
- package/web/src/components/tools/ToolPicker.jsx +86 -0
- package/web/src/components/tools/ToolPicker.module.css +84 -0
- package/web/src/global.css +23 -0
- package/web/src/hooks/urlState.constants.js +3 -0
- package/web/src/hooks/useInstalledModels.js +42 -0
- package/web/src/hooks/useRecommend.js +67 -0
- package/web/src/hooks/useRouterDashboard.js +133 -0
- package/web/src/hooks/useTokenUsage.js +103 -0
- package/web/src/hooks/useToolMode.js +77 -0
- package/web/src/hooks/useUrlState.js +4 -3
- package/web/src/utils/m3.js +55 -0
- package/web/dist/assets/index-Blp9QJev.js +0 -39
- package/web/dist/assets/index-Cz_aCLTR.css +0 -1
package/README.md
CHANGED
|
@@ -155,7 +155,7 @@ free-coding-models web
|
|
|
155
155
|
|
|
156
156
|
This starts the realtime Web Dashboard locally, opens it in your browser, and uses `http://localhost:3333/` by default. Override the port with `FCM_WEB_PORT=3334 free-coding-models web`.
|
|
157
157
|
|
|
158
|
-
#### Web Dashboard features (
|
|
158
|
+
#### Web Dashboard features (M4 parity with TUI)
|
|
159
159
|
|
|
160
160
|
The local Web Dashboard is a real-time control center for the model catalog
|
|
161
161
|
— not just a static table. The header holds every navigation entry, the
|
|
@@ -164,24 +164,29 @@ and every TUI capability that's safe to port ships behind a button or chip.
|
|
|
164
164
|
|
|
165
165
|
| Area | What's there |
|
|
166
166
|
|---|---|
|
|
167
|
-
| **Header** | Logo + version · primary nav (Dashboard, Settings, Analytics, Recommend, Router) · kebab menu (Help, Changelog, Install Endpoints, Installed Models) · `⌘K` command palette · AI Latency · theme · export |
|
|
168
|
-
| **Model table** | Full-bleed (no left/right border, no margin) under the sticky header + filter bar ·
|
|
167
|
+
| **Header** | Logo + version · primary nav (Dashboard, Settings, Analytics, Recommend, Router) · kebab menu (Help, Changelog, Install Endpoints, Installed Models) · endpoint target picker · `⌘K` command palette · AI Latency · theme · export |
|
|
168
|
+
| **Model table** | Full-bleed (no left/right border, no margin) under the sticky header + filter bar · 17 columns, resizable widths persisted in localStorage, ⭐ star per row, 🔌 install-endpoint button per row, medal borders for top-3, dark-red row class for tool-incompatible models, click AI Lat. cell to run a per-row benchmark · table header row stays sticky while scrolling |
|
|
169
169
|
| **Filter bar** | Sticky right below the header (always visible) · Tier / Status / Verdict / Health chip rows · Visibility dropdown (Normal / Configured only / Usable only) · Provider select · custom text filter chip with `X` clear · Reset button (TUI `N`) · ping mode (Speed / Normal / Slow / Forced) · "next ping in Xs" countdown (TUI style, always shown) |
|
|
170
170
|
| **Stats bar** | Removed in M1 (users found it noisy; the table + chips carry the same info at a glance) |
|
|
171
|
-
| **Detail panel** | Slide-in from the right on row click · per-row benchmark button (TUI `Ctrl+A`) · favorite toggle (TUI `F`) + up/down reorder (TUI `Shift+↑↓`) · latency trend chart · all stats |
|
|
171
|
+
| **Detail panel** | Slide-in from the right on row click · endpoint target indicator + install-endpoint button · per-row benchmark button (TUI `Ctrl+A`) · favorite toggle (TUI `F`) + up/down reorder (TUI `Shift+↑↓`) · latency trend chart · all stats |
|
|
172
172
|
| **Command palette** | `⌘K` / `Ctrl+P` (the only global keyboard shortcut) · fuzzy search across views, theme, ping mode, reset, export, **and the full TUI command registry** (every filter / sort / tool / page entry from `src/tui/command-palette.js`) |
|
|
173
173
|
| **Keyboard** | `Esc` closes any modal · `Cmd+K` toggles the palette — that's it. Everything else is mouse-first. |
|
|
174
|
-
| **URL deep-linking** | `?tier=S+&sort=verdict&origin=groq&
|
|
174
|
+
| **URL deep-linking** | `?tier=S+&sort=verdict&origin=groq&toolMode=goose&q=…` hydrates the dashboard on load **and** every filter / sort / view / endpoint target change is reflected back in the URL (debounced 80ms, `history.replaceState`). CLI flags become shareable links. |
|
|
175
175
|
| **Favorites** | Shared with the TUI through `~/.free-coding-models.json` — a star in the Web is a star in the TUI. Includes pinned+sticky display mode (TUI `Y`). |
|
|
176
176
|
| **Help modal** | Header overflow menu → "Help" opens a full-screen modal with all the TUI's keyboard shortcuts, filter behavior, and parity notes. Live search bar. |
|
|
177
177
|
| **Changelog modal** | Header overflow menu → "Changelog" or Settings "Open Changelog" link. Two-phase (index of versions + per-version release notes). Deep-linkable to a specific version. |
|
|
178
178
|
| **Update flow** | Header `⬆ vX.Y.Z` chip + popover with "Update now" + "What's new" (jumps to the new version's changelog entry). Polls every 5 min. |
|
|
179
179
|
| **Settings parity** | Full Settings page: theme (auto/dark/light), favorites pinned mode, startup AI Speed Scan, shell env export, legacy proxy cleanup, per-provider **Test** key button (TUI `T` key), update row. All settings persisted to the same `~/.free-coding-models.json` the TUI uses. |
|
|
180
180
|
| **Theme** | Tri-state `auto / dark / light` cycle (TUI `G`) — auto follows the OS preference. |
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
181
|
+
| **Smart Recommend** | Header "Recommend" opens the 3-question wizard, runs the 10s analysis phase, then returns the Top 3 shared-score recommendations with Pin + install-endpoint actions. |
|
|
182
|
+
| **Endpoint installs** | The Web never starts external tools. It writes the selected provider/model endpoint into the chosen tool config (`/api/install-endpoint`), then users start their tool themselves. |
|
|
183
|
+
| **Router Dashboard** | Header "Router" opens a full modal with daemon start/stop, model health table with circuit breaker badges, request log, probe mode selector, and quick-setup card (copy base URL + model to clipboard). |
|
|
184
|
+
| **Token Usage** | Integrated inside Analytics: today + all-time summary cards, 7-day usage bar chart, top models and top providers breakdown. |
|
|
185
|
+
| **Installed Models** | Header overflow → "Installed Models" opens a modal that scans all tool configs (Goose, Crush, Aider, Kilo, Qwen, Pi, OpenHands, Amp) and shows configured models with soft-delete (backup saved). |
|
|
186
|
+
| **Install Endpoints wizard** | Header overflow → "Install Endpoints" opens a 4-step wizard: pick provider → pick tool → select models → install. Writes managed provider catalogs into tool configs using the same engine as the TUI. |
|
|
187
|
+
|
|
188
|
+
Roadmap items:
|
|
189
|
+
- **M5** — Polish, accessibility, mobile hamburger nav, Lighthouse a11y ≥ 95.
|
|
185
190
|
|
|
186
191
|
### Available Image Tags
|
|
187
192
|
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog v0.5.7 - 2026-06-02
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
- **Router Dashboard** (M4) — Full TUI-parity modal for the smart model router daemon. Shows running status, port, uptime, start/stop controls, model health table with circuit breaker badges (CLOSED / OPEN / HALF_OPEN / AUTH_ERROR), request log with failover indicators, probe mode selector (eco / balanced / aggressive), and quick-setup card for one-click clipboard copy of base URL + model.
|
|
5
|
+
- **Token Usage** (M4) — New panel inside Analytics view. Shows today + all-time token summary cards, 7-day bar chart, top models, and top providers breakdown. Reads from the same `~/.free-coding-models-tokens.json` file the daemon writes.
|
|
6
|
+
- **Installed Models** (M4) — New modal accessible from the header overflow menu. Scans all 8 supported tool configs (Goose, Crush, Aider, Kilo, Qwen, Pi, OpenHands, Amp) and shows installed models grouped by tool. Soft-delete button per model saves a backup to `~/.free-coding-models-backups.json`.
|
|
7
|
+
- **Install Endpoints Wizard** (M4) — New 4-step modal: (1) pick provider, (2) pick target tool, (3) select all or specific models, (4) install. Uses the same `installProviderEndpoints` engine from `src/core/endpoint-installer.js` that powers the TUI's install flow.
|
|
8
|
+
- **15 new server endpoints** for the above features: `/api/router/status`, `/api/router/stats`, `/api/router/tokens`, `/api/router/start`, `/api/router/stop`, `/api/router/sets`, `/api/router/probe-mode`, `/api/router/quick-setup`, `/api/installed-models`, `/api/installed-models/:tool/:model/disable`, `/api/install-endpoints/providers`, `/api/install-endpoints/catalog`, `/api/install-endpoints/wizard`.
|
|
9
|
+
- **Mobile hamburger nav** (M5) — At viewports under 768px, the header nav buttons hide and a hamburger menu appears. Tapping it opens a full-width dropdown with all nav and overflow items. Never a left sidebar.
|
|
10
|
+
- **Global `:focus-visible` outlines** (M5) — Keyboard users now see a visible focus ring on all interactive elements. Mouse clicks don't trigger the ring. Improves accessibility for keyboard-only navigation.
|
|
11
|
+
- **`aria-label` audit** (M5) — All header buttons now have descriptive `aria-label` attributes for screen readers.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- Header overflow menu items (Install Endpoints, Installed Models, Router) no longer show "M4" coming-soon badges — they're live.
|
|
15
|
+
- Router nav button is now a real working navigation target instead of a placeholder toast.
|
|
16
|
+
- README updated from "M3 parity" to "M4 parity" with all new features documented.
|
|
17
|
+
- 11 new tests for M4 endpoints, hooks, and component wiring (474 total, up from 463).
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- Header overflow menu now also closes on Esc when the mobile nav is open.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Changelog v0.5.8 - 2026-06-02
|
|
2
|
+
|
|
3
|
+
### Added
|
|
4
|
+
- **Lighthouse Accessibility score: 96** (target ≥ 95). Web Dashboard passes comprehensive a11y audit.
|
|
5
|
+
- **Global `:focus-visible` outlines** — All interactive elements show a visible focus ring for keyboard users. Mouse clicks don't trigger the ring.
|
|
6
|
+
- **Mobile hamburger navigation** — At viewports ≤ 768px, primary nav buttons collapse into a hamburger menu that opens a full-width dropdown. Never a left sidebar.
|
|
7
|
+
- **`aria-label` audit** — All header buttons (benchmark, theme, export, command palette, kebab menu) now have descriptive `aria-label` attributes for screen readers.
|
|
8
|
+
- **`<main>` landmark** — Dashboard view now uses a `<main>` element for proper HTML5 document structure.
|
|
9
|
+
- **Select element labels** — Visibility and Provider `<select>` elements now have `htmlFor`/`id` linkage and `aria-label` attributes.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- **Color contrast improvements** — Version badge uses `--color-text-muted` instead of `--color-text-dim`. Model ID text in the table uses `--color-text-muted`. Dark-theme B+/B/C tier badge colors brightened for WCAG compliance.
|
|
13
|
+
- **Benchmark button `aria-label`** matches visible text to avoid label-content-name-mismatch.
|
|
14
|
+
- **Header overflow menu** closes on Esc when mobile nav is open.
|
|
15
|
+
- **README** updated from "M3 parity" to "M4 parity" with Router Dashboard, Token Usage, Installed Models, and Install Endpoints documented. M5 roadmap listed.
|
|
16
|
+
- **Changelog** — `changelog/v0.5.7.md` updated to cover both M4 and M5 changes.
|
|
17
|
+
- **Plan tracker** — `ideas/tui-web-feature-parity.md` updated: all 5 milestones marked DONE.
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
- Lighthouse `landmark-one-main` — Added `<main>` element.
|
|
21
|
+
- Lighthouse `select-name` — Linked labels to selects via `htmlFor`/`id`.
|
|
22
|
+
- Lighthouse `label-content-name-mismatch` — Fixed benchmark button accessible name.
|
|
23
|
+
- Lighthouse `color-contrast` — Brightened low-contrast text in version badge, model IDs, and tier badges.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "free-coding-models",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9",
|
|
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",
|
|
@@ -53,8 +53,8 @@ import { getToolMeta } from './tool-metadata.js'
|
|
|
53
53
|
// 📖 zai and opencode-zen ARE OpenAI-compatible and CAN be installed into any tool.
|
|
54
54
|
const DIRECT_INSTALL_UNSUPPORTED_PROVIDERS = new Set(['replicate', 'rovo', 'gemini'])
|
|
55
55
|
// 📖 Install Endpoints only lists tools whose persisted config shape is actually supported here.
|
|
56
|
-
// 📖
|
|
57
|
-
const INSTALL_TARGET_MODES = ['opencode', 'opencode-desktop', 'opencode-web', 'openclaw', '
|
|
56
|
+
// 📖 Launch-only tools stay out: the Web dashboard configures endpoints, it never starts CLIs.
|
|
57
|
+
const INSTALL_TARGET_MODES = ['opencode', 'opencode-desktop', 'opencode-web', 'openclaw', 'crush', 'goose', 'pi', 'aider', 'qwen', 'openhands', 'amp', 'forgecode', 'fcm_router']
|
|
58
58
|
|
|
59
59
|
function getDefaultPaths() {
|
|
60
60
|
const home = homedir()
|
|
@@ -131,7 +131,7 @@ function writeSimpleYamlMap(filePath, entries) {
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
function canonicalizeToolMode(toolMode) {
|
|
134
|
-
return toolMode === 'opencode-desktop' ? 'opencode' : toolMode
|
|
134
|
+
return toolMode === 'opencode-desktop' || toolMode === 'opencode-web' ? 'opencode' : toolMode
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
function getManagedProviderId(providerKey) {
|
|
@@ -1094,13 +1094,13 @@ export async function startExternalTool(mode, model, config) {
|
|
|
1094
1094
|
}
|
|
1095
1095
|
|
|
1096
1096
|
if (mode === 'xcode') {
|
|
1097
|
-
const xcodeUrl = baseUrl ? baseUrl.replace(/\/v1$/, '').replace(/\/v1\/chat\/completions$/, '') : ''
|
|
1097
|
+
const xcodeUrl = launchPlan.baseUrl ? launchPlan.baseUrl.replace(/\/v1$/, '').replace(/\/v1\/chat\/completions$/, '') : ''
|
|
1098
1098
|
console.log(chalk.bold.cyan('\n 🛠️ Xcode Intelligence Setup Instructions:'))
|
|
1099
1099
|
console.log(chalk.white(' 1. Open Xcode and go to ') + chalk.bold('Xcode > Settings > Intelligence'))
|
|
1100
1100
|
console.log(chalk.white(' 2. Click ') + chalk.bold('Add a Chat Provider') + chalk.white(' and select ') + chalk.bold('Internet Hosted'))
|
|
1101
1101
|
console.log(chalk.white(' 3. Enter the following details:'))
|
|
1102
1102
|
console.log(chalk.dim(' URL: ') + chalk.green(xcodeUrl))
|
|
1103
|
-
console.log(chalk.dim(' API Key: ') + chalk.green(apiKey || '<your_api_key>'))
|
|
1103
|
+
console.log(chalk.dim(' API Key: ') + chalk.green(launchPlan.apiKey || '<your_api_key>'))
|
|
1104
1104
|
console.log(chalk.dim(' API Key Header: ') + chalk.green('Authorization') + chalk.dim(' (or x-api-key)'))
|
|
1105
1105
|
console.log(chalk.dim(' Description: ') + chalk.green(`FCM - ${sources[model.providerKey]?.name || model.providerKey}`))
|
|
1106
1106
|
console.log(chalk.white(` 4. Click Add, then select `) + chalk.bold(model.modelId) + chalk.white(` from the list.\n`))
|