mirror of
https://github.com/mudler/LocalAI.git
synced 2026-06-25 09:09:07 -04:00
* chore: gitignore SDD scratch directory Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * feat(nodes): add GET /api/nodes/models cluster-wide loaded-models endpoint Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * feat(ui): add nodesApi.allModels() for cluster-wide model roster Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * feat(ui): move Scheduling to its own page and nav item Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * feat(ui): replace nodes stat-card strip with cluster pulse + attention callout Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * feat(ui): node-panel roster with inline model chips and segmented filter Replace the Nodes table with a full-width node-panel roster that shows each backend node's running-model chips without an expand click, plus an All/Backend/Agent segmented filter. Per-node detail (models, backends, labels, capacity) moves to the node detail page. Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * feat(ui): add deep-linkable node detail page at /app/nodes/:id Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * fix(ui): remove em-dash from CapacityEditor comment; align detail spec backend mock Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * chore(ui): nodes page cleanup, hover/chip polish, docs for restructured cluster view Nodes.jsx dead-code sweep confirmed clean (no StatCard/table/expand state/scheduling-form leftovers). Two App.css polish fixes: move the node-panel hover border-color onto the bordered element so hover gives real feedback, and add the missing .model-chip__state rule the ModelChip component already emits. Update distributed-mode docs prose to describe the restructured cluster view (cluster pulse, attention callout, node-panel roster with inline model chips, All/Backend/Agent filter, node detail page at /app/nodes/:id, Scheduling as its own page). Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] * chore(ui): drop unused gpuVendorLabel export from nodeStatus Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Assisted-by: Claude:claude-opus-4-8 [Claude Code] --------- Signed-off-by: Ettore Di Giacinto <mudler@localai.io> Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
42 lines
1.7 KiB
JavaScript
42 lines
1.7 KiB
JavaScript
import { test, expect } from './coverage-fixtures.js'
|
|
|
|
// Render-smoke coverage. Each page is lazy-loaded and runs its full render +
|
|
// initial effects on mount, so a bare visit captures the bulk of a page's
|
|
// lines — cheap, real coverage for pages that have no dedicated spec yet.
|
|
//
|
|
// This is the project's preferred way to keep the UI coverage gate green:
|
|
// raise the floor by covering more, rather than loosening the gate's
|
|
// tolerance (see CONTRIBUTING.md → "React UI coverage"). Auth is disabled in
|
|
// the test server, so RequireAdmin/RequireFeature resolve to isAdmin=true and
|
|
// every gated route renders without an auth/capability mock.
|
|
//
|
|
// Asserts the page mounted (its .page-title header is visible) and that it did
|
|
// not bounce to a gate redirect (/login or back to /app home).
|
|
const PAGES = [
|
|
['/app/talk', 'Talk'],
|
|
['/app/usage', 'Usage'],
|
|
['/app/account', 'Account'],
|
|
['/app/studio', 'Studio'],
|
|
['/app/manage', 'Manage'],
|
|
['/app/backends', 'Backends'],
|
|
['/app/settings', 'Settings'],
|
|
['/app/nodes', 'Nodes'],
|
|
['/app/scheduling', 'Scheduling'],
|
|
['/app/face', 'Face recognition'],
|
|
['/app/voice', 'Voice recognition'],
|
|
['/app/fine-tune', 'Fine-tuning'],
|
|
['/app/quantize', 'Quantize'],
|
|
]
|
|
|
|
test.describe('Page render smoke', () => {
|
|
for (const [path, label] of PAGES) {
|
|
test(`renders ${label} (${path})`, async ({ page }) => {
|
|
await page.goto(path)
|
|
// .page-title for the normal header; .empty-state-title for pages that
|
|
// render a gated/empty state (e.g. Account when auth is disabled).
|
|
await expect(page.locator('.page-title, .empty-state-title').first()).toBeVisible({ timeout: 15_000 })
|
|
await expect(page).toHaveURL(new RegExp(path.replace(/\//g, '\\/') + '$'))
|
|
})
|
|
}
|
|
})
|