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.
Files changed (49) hide show
  1. package/README.md +14 -9
  2. package/changelog/v0.5.7.md +20 -0
  3. package/changelog/v0.5.8.md +23 -0
  4. package/package.json +1 -1
  5. package/src/core/endpoint-installer.js +3 -3
  6. package/src/core/tool-launchers.js +2 -2
  7. package/web/dist/assets/index-27IYGKp2.js +39 -0
  8. package/web/dist/assets/index-DKmmiDip.css +1 -0
  9. package/web/dist/index.html +2 -2
  10. package/web/server.js +386 -1
  11. package/web/src/App.jsx +145 -26
  12. package/web/src/components/analytics/AnalyticsView.jsx +4 -0
  13. package/web/src/components/analytics/TokenUsagePanel.jsx +105 -0
  14. package/web/src/components/analytics/TokenUsagePanel.module.css +126 -0
  15. package/web/src/components/atoms/TierBadge.module.css +3 -3
  16. package/web/src/components/dashboard/DetailPanel.jsx +29 -4
  17. package/web/src/components/dashboard/DetailPanel.module.css +26 -0
  18. package/web/src/components/dashboard/FilterBar.jsx +17 -2
  19. package/web/src/components/dashboard/FilterBar.module.css +17 -0
  20. package/web/src/components/dashboard/ModelTable.jsx +17 -5
  21. package/web/src/components/dashboard/ModelTable.module.css +14 -1
  22. package/web/src/components/help/HelpView.jsx +1 -1
  23. package/web/src/components/install/InstallEndpointsView.jsx +278 -0
  24. package/web/src/components/install/InstallEndpointsView.module.css +351 -0
  25. package/web/src/components/installed/InstalledModelsView.jsx +89 -0
  26. package/web/src/components/installed/InstalledModelsView.module.css +200 -0
  27. package/web/src/components/launch/IncompatibleFallbackModal.jsx +69 -0
  28. package/web/src/components/launch/LaunchButton.jsx +30 -0
  29. package/web/src/components/launch/LaunchButton.module.css +35 -0
  30. package/web/src/components/launch/LaunchModal.module.css +125 -0
  31. package/web/src/components/layout/Header.jsx +70 -11
  32. package/web/src/components/layout/Header.module.css +62 -2
  33. package/web/src/components/recommend/RecommendView.jsx +121 -0
  34. package/web/src/components/recommend/RecommendView.module.css +55 -0
  35. package/web/src/components/router/RouterView.jsx +286 -0
  36. package/web/src/components/router/RouterView.module.css +357 -0
  37. package/web/src/components/tools/ToolPicker.jsx +86 -0
  38. package/web/src/components/tools/ToolPicker.module.css +84 -0
  39. package/web/src/global.css +23 -0
  40. package/web/src/hooks/urlState.constants.js +3 -0
  41. package/web/src/hooks/useInstalledModels.js +42 -0
  42. package/web/src/hooks/useRecommend.js +67 -0
  43. package/web/src/hooks/useRouterDashboard.js +133 -0
  44. package/web/src/hooks/useTokenUsage.js +103 -0
  45. package/web/src/hooks/useToolMode.js +77 -0
  46. package/web/src/hooks/useUrlState.js +4 -3
  47. package/web/src/utils/m3.js +55 -0
  48. package/web/dist/assets/index-Blp9QJev.js +0 -39
  49. 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 (M1 parity with TUI)
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 · 16 columns, resizable widths persisted in localStorage, ⭐ star 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 |
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&view=dashboard&q=…` hydrates the dashboard on load **and** every filter / sort / view change is reflected back in the URL (debounced 80ms, `history.replaceState`). CLI flags become shareable links. |
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
- Roadmap items (header menu badges show "M3 / M4" until they land):
183
- - **M3** Smart Recommend (3-question wizard 10s analysis Top 3), tool mode picker, per-row Launch, missing-tool install prompt, incompatible-fallback modal.
184
- - **M4** Router Dashboard, Token Usage, Install Endpoints wizard, Installed Models manager.
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.6",
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
- // 📖 Claude Code, Codex, and Gemini stay out while their dedicated bridges are being rebuilt.
57
- const INSTALL_TARGET_MODES = ['opencode', 'opencode-desktop', 'opencode-web', 'openclaw', 'kilo', 'crush', 'goose', 'pi', 'aider', 'qwen', 'openhands', 'amp', 'hermes', 'continue', 'cline', 'forgecode', 'fcm_router']
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`))