No profile loaded for this node.
diff --git a/web/src/components/nodes/NodeCard.vue b/web/src/components/nodes/NodeCard.vue
index 5ad0ff3..792c919 100644
--- a/web/src/components/nodes/NodeCard.vue
+++ b/web/src/components/nodes/NodeCard.vue
@@ -3,34 +3,7 @@ import { ref } from 'vue'
import GpuRow from './GpuRow.vue'
import OllamaModelPanel from './OllamaModelPanel.vue'
import HfNodeModelPanel from './HfNodeModelPanel.vue'
-
-interface GpuEntry {
- gpu_id: number
- card: string
- vram_total_mb: number
- vram_used_mb: number
- vram_free_mb: number
- temp_c: number | null
- utilization_pct: number | null
- compute_cap: number | null
- services_assigned: string[]
- services_running: string[]
-}
-
-interface ServiceInfo {
- min_compute_cap: number
- max_mb: number
- catalog_size: number
-}
-
-interface NodeSummary {
- node_id: string
- online: boolean
- agent_url: string
- gpus: GpuEntry[]
- profile_loaded: boolean
- services_catalog: Record
-}
+import type { NodeSummary } from '../../types/nodes'
const props = defineProps<{ node: NodeSummary }>()
const emit = defineEmits<{ updated: [] }>()
diff --git a/web/src/components/nodes/OllamaModelPanel.vue b/web/src/components/nodes/OllamaModelPanel.vue
index 5ee54dd..d30b0e4 100644
--- a/web/src/components/nodes/OllamaModelPanel.vue
+++ b/web/src/components/nodes/OllamaModelPanel.vue
@@ -1,5 +1,5 @@
@@ -150,9 +173,11 @@ onMounted(fetchModels)
-
Loading...
-
{{ loadError }}
-
+
+ Loading...
+
+ {{ loadError }}
+
- No Ollama models installed on this node.
-
{{ m.name }}
@@ -198,6 +223,7 @@ onMounted(fetchModels)
.progress-fill { height: 100%; background: var(--color-primary, #4080ff); transition: width 0.2s; }
.progress-label { font-size: 0.75rem; color: var(--text-secondary, #888); }
.pull-error, .panel-error { color: var(--color-error, #fc8181); font-size: 0.8rem; margin-bottom: 0.5rem; }
+.sr-announce { min-height: 1.2em; }
.panel-loading { color: var(--text-secondary, #888); font-size: 0.875rem; }
.model-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.3rem; }
.model-item {
diff --git a/web/src/components/nodes/ServiceBadge.vue b/web/src/components/nodes/ServiceBadge.vue
index 93ca73b..d1f1f44 100644
--- a/web/src/components/nodes/ServiceBadge.vue
+++ b/web/src/components/nodes/ServiceBadge.vue
@@ -17,7 +17,7 @@ const props = defineProps<{
const emit = defineEmits<{ toggle: [] }>()
-const STATE_LABELS: Record = {
+const STATE_LABELS: Record = {
running: 'Running',
stopped: 'Stopped',
'assigned-only': 'Assigned',
@@ -27,7 +27,7 @@ const STATE_LABELS: Record = {
unknown: 'Unknown',
}
-const STATE_ICONS: Record = {
+const STATE_ICONS: Record = {
running: '▶',
stopped: '⏹',
'assigned-only': '📌',
diff --git a/web/src/types/nodes.ts b/web/src/types/nodes.ts
new file mode 100644
index 0000000..bf6e5a6
--- /dev/null
+++ b/web/src/types/nodes.ts
@@ -0,0 +1,27 @@
+export interface GpuEntry {
+ gpu_id: number
+ card: string
+ vram_total_mb: number
+ vram_used_mb: number
+ vram_free_mb: number
+ temp_c: number | null
+ utilization_pct: number | null
+ compute_cap: number | null
+ services_assigned: string[]
+ services_running: string[]
+}
+
+export interface ServiceInfo {
+ min_compute_cap: number
+ max_mb: number
+ catalog_size: number
+}
+
+export interface NodeSummary {
+ node_id: string
+ online: boolean
+ agent_url: string
+ gpus: GpuEntry[]
+ profile_loaded: boolean
+ services_catalog: Record
+}
diff --git a/web/src/views/NodeManagementView.vue b/web/src/views/NodeManagementView.vue
index 99b9569..0c461be 100644
--- a/web/src/views/NodeManagementView.vue
+++ b/web/src/views/NodeManagementView.vue
@@ -1,34 +1,7 @@