Put resources where somebody would look for them
`resources` was reachable from the SDK and the API and nowhere else, and `node_queued` was published to nothing at all — so a node waiting for a machine looked exactly like a node that had hung, which is the failure the event was added for. The node panel gets a Resources section: a size by name, the numbers for a node that wants its own, and how long it is expected to take. Picking a flavor drops the numbers, because saying both is two answers and the engine refuses it. A queued node draws a neutral dot rather than one of the three status colours — it is not running, it did not go well, and it did not go wrong; it is idle with a reason, which the tooltip gives. And a Workers screen, which is the first UI for any of this: every machine the engine can reach with what is free of each, what is attached, what a cluster has been asked for, and the sizes, editable. `fluksio status` grew a line of the same. The demo's training node already preferred a GPU worker, which was exactly the declaration that used to be dropped, so it now says how much of that machine it takes as well. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6HeySA27EkGANZN95QySW
This commit is contained in:
@@ -20,6 +20,7 @@ import { Route as LayoutIndexRouteImport } from './routes/_layout/index'
|
||||
import { Route as ViewNameRouteImport } from './routes/view.$name'
|
||||
import { Route as PanelIdRouteImport } from './routes/panel.$id'
|
||||
import { Route as OauthAuthorizeRouteImport } from './routes/oauth.authorize'
|
||||
import { Route as LayoutWorkersRouteImport } from './routes/_layout/workers'
|
||||
import { Route as LayoutSettingsRouteImport } from './routes/_layout/settings'
|
||||
import { Route as LayoutSecretsRouteImport } from './routes/_layout/secrets'
|
||||
import { Route as LayoutModulesRouteImport } from './routes/_layout/modules'
|
||||
@@ -85,6 +86,11 @@ const OauthAuthorizeRoute = OauthAuthorizeRouteImport.update({
|
||||
path: '/oauth/authorize',
|
||||
getParentRoute: () => rootRouteImport,
|
||||
} as any)
|
||||
const LayoutWorkersRoute = LayoutWorkersRouteImport.update({
|
||||
id: '/workers',
|
||||
path: '/workers',
|
||||
getParentRoute: () => LayoutRoute,
|
||||
} as any)
|
||||
const LayoutSettingsRoute = LayoutSettingsRouteImport.update({
|
||||
id: '/settings',
|
||||
path: '/settings',
|
||||
@@ -152,6 +158,7 @@ export interface FileRoutesByFullPath {
|
||||
'/modules': typeof LayoutModulesRoute
|
||||
'/secrets': typeof LayoutSecretsRoute
|
||||
'/settings': typeof LayoutSettingsRoute
|
||||
'/workers': typeof LayoutWorkersRoute
|
||||
'/oauth/authorize': typeof OauthAuthorizeRoute
|
||||
'/panel/$id': typeof PanelIdRoute
|
||||
'/view/$name': typeof ViewNameRoute
|
||||
@@ -174,6 +181,7 @@ export interface FileRoutesByTo {
|
||||
'/modules': typeof LayoutModulesRoute
|
||||
'/secrets': typeof LayoutSecretsRoute
|
||||
'/settings': typeof LayoutSettingsRoute
|
||||
'/workers': typeof LayoutWorkersRoute
|
||||
'/oauth/authorize': typeof OauthAuthorizeRoute
|
||||
'/panel/$id': typeof PanelIdRoute
|
||||
'/view/$name': typeof ViewNameRoute
|
||||
@@ -198,6 +206,7 @@ export interface FileRoutesById {
|
||||
'/_layout/modules': typeof LayoutModulesRoute
|
||||
'/_layout/secrets': typeof LayoutSecretsRoute
|
||||
'/_layout/settings': typeof LayoutSettingsRoute
|
||||
'/_layout/workers': typeof LayoutWorkersRoute
|
||||
'/oauth/authorize': typeof OauthAuthorizeRoute
|
||||
'/panel/$id': typeof PanelIdRoute
|
||||
'/view/$name': typeof ViewNameRoute
|
||||
@@ -223,6 +232,7 @@ export interface FileRouteTypes {
|
||||
| '/modules'
|
||||
| '/secrets'
|
||||
| '/settings'
|
||||
| '/workers'
|
||||
| '/oauth/authorize'
|
||||
| '/panel/$id'
|
||||
| '/view/$name'
|
||||
@@ -245,6 +255,7 @@ export interface FileRouteTypes {
|
||||
| '/modules'
|
||||
| '/secrets'
|
||||
| '/settings'
|
||||
| '/workers'
|
||||
| '/oauth/authorize'
|
||||
| '/panel/$id'
|
||||
| '/view/$name'
|
||||
@@ -268,6 +279,7 @@ export interface FileRouteTypes {
|
||||
| '/_layout/modules'
|
||||
| '/_layout/secrets'
|
||||
| '/_layout/settings'
|
||||
| '/_layout/workers'
|
||||
| '/oauth/authorize'
|
||||
| '/panel/$id'
|
||||
| '/view/$name'
|
||||
@@ -373,6 +385,13 @@ declare module '@tanstack/react-router' {
|
||||
preLoaderRoute: typeof OauthAuthorizeRouteImport
|
||||
parentRoute: typeof rootRouteImport
|
||||
}
|
||||
'/_layout/workers': {
|
||||
id: '/_layout/workers'
|
||||
path: '/workers'
|
||||
fullPath: '/workers'
|
||||
preLoaderRoute: typeof LayoutWorkersRouteImport
|
||||
parentRoute: typeof LayoutRoute
|
||||
}
|
||||
'/_layout/settings': {
|
||||
id: '/_layout/settings'
|
||||
path: '/settings'
|
||||
@@ -472,6 +491,7 @@ interface LayoutRouteChildren {
|
||||
LayoutModulesRoute: typeof LayoutModulesRoute
|
||||
LayoutSecretsRoute: typeof LayoutSecretsRoute
|
||||
LayoutSettingsRoute: typeof LayoutSettingsRoute
|
||||
LayoutWorkersRoute: typeof LayoutWorkersRoute
|
||||
LayoutIndexRoute: typeof LayoutIndexRoute
|
||||
LayoutRunsIdRoute: typeof LayoutRunsIdRoute
|
||||
LayoutDashboardsIndexRoute: typeof LayoutDashboardsIndexRoute
|
||||
@@ -485,6 +505,7 @@ const LayoutRouteChildren: LayoutRouteChildren = {
|
||||
LayoutModulesRoute: LayoutModulesRoute,
|
||||
LayoutSecretsRoute: LayoutSecretsRoute,
|
||||
LayoutSettingsRoute: LayoutSettingsRoute,
|
||||
LayoutWorkersRoute: LayoutWorkersRoute,
|
||||
LayoutIndexRoute: LayoutIndexRoute,
|
||||
LayoutRunsIdRoute: LayoutRunsIdRoute,
|
||||
LayoutDashboardsIndexRoute: LayoutDashboardsIndexRoute,
|
||||
|
||||
Reference in New Issue
Block a user