3b2a16b151
Introduce a minimal operations console reachable on a dedicated UI port (default 8081), kept separate from the OpenAI-compatible API port. - ts_web/ holds the SPA shell (index.html, app.css, vanilla app.js) with sidebar navigation for all views from readme.ui.md and a working Overview page backed by a new /_ui/overview JSON endpoint. - scripts/bundle-ui.ts walks ts_web/ and emits ts_bundled/bundle.ts, a single generated module exporting every asset as base64. Mirrors the @stack.gallery/registry pattern so deno compile binaries embed the entire UI with no external filesystem dependency at runtime. - ts/ui/server.ts (UiServer) serves assets from either the bundled map (default, prod) or directly from ts_web/ on disk (dev). The source is chosen per-config and can be overridden by UI_ASSET_SOURCE=disk|bundle. SPA fallback routes unknown extensionless paths to index.html. - IModelGridConfig.ui block with enabled/port/host/assetSource defaults; config init writes the block, the normalizer fills in defaults on load, and the daemon starts/stops the UI server alongside the API. - deno.json gains a bundle:ui task; compile:all now depends on it so released binaries always contain an up-to-date bundle. dev task sets UI_ASSET_SOURCE=disk for hot edits. - ts_bundled/ is gitignored (generated on build). - test/ui-server.smoke.ts exercises bundle and disk modes end to end (index, app.js, SPA fallback, /_ui/overview, 404).
33 lines
1.1 KiB
HTML
33 lines
1.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="theme-color" content="#000000">
|
|
<title>ModelGrid</title>
|
|
<link rel="stylesheet" href="/app.css">
|
|
</head>
|
|
<body>
|
|
<aside class="nav">
|
|
<div class="nav-brand">ModelGrid</div>
|
|
<nav class="nav-items">
|
|
<a href="#/overview" data-view="overview">Overview</a>
|
|
<a href="#/cluster" data-view="cluster">Cluster</a>
|
|
<a href="#/gpus" data-view="gpus">GPUs</a>
|
|
<a href="#/deployments" data-view="deployments">Deployments</a>
|
|
<a href="#/models" data-view="models">Models</a>
|
|
<a href="#/access" data-view="access">Access</a>
|
|
<a href="#/logs" data-view="logs">Logs</a>
|
|
<a href="#/metrics" data-view="metrics">Metrics</a>
|
|
<a href="#/settings" data-view="settings">Settings</a>
|
|
</nav>
|
|
<div class="nav-footer">
|
|
<div id="node-ident">—</div>
|
|
<div id="node-version" class="dim">—</div>
|
|
</div>
|
|
</aside>
|
|
<main id="view"></main>
|
|
<script src="/app.js"></script>
|
|
</body>
|
|
</html>
|