diff --git a/network-poc/static/index.html b/network-poc/static/index.html
index 5c54da9..61f6ddc 100644
--- a/network-poc/static/index.html
+++ b/network-poc/static/index.html
@@ -1089,10 +1089,18 @@
-
-
-
Hub:
-
Yhdistetään...
+
+
+
+ Hub:
+ Yhdistetään...
+
+ │
+
+
+ Laskenta:
+ Ei käynnissä ⟩
+
@@ -1826,6 +1834,7 @@
termLog(' kpn hello — iloinen tervehdys verkosta', '#a5d6ff');
termLog(' kpn run <malli> "<prompti>" — aja tehtävä verkossa', '#a5d6ff');
termLog(' kpn pipeline "<tehtävä>" — manageri → koodari → testaaja', '#a5d6ff');
+ termLog(' kpn load — lataa kielimalli omalle koneelle', '#a5d6ff');
termLog(' kpn status — verkon tila', '#a5d6ff');
termLog(' kpn models — käytettävissä olevat mallit', '#a5d6ff');
termLog(' kpn clear — tyhjennä terminaali', '#a5d6ff');
@@ -1837,6 +1846,17 @@
return;
}
+ if (sub === 'load') {
+ const cl = document.getElementById('agent-compute-label');
+ if (cl && cl.style.color === 'rgb(63, 185, 80)') {
+ termLog(' ✓ Kielimalli on jo ladattu ja valmis', '#3fb950');
+ } else {
+ termLog(' Ladataan kielimallia...', '#d29922');
+ ensureCoderNode();
+ }
+ return;
+ }
+
if (sub === 'status') {
const nodes = statNodes.textContent || '0';
const vram = statVram.textContent || '?';
@@ -2500,20 +2520,37 @@
if (msg.includes('[Coder]') && msg.includes('model') && msg.includes('löytyi')) { setStep('step-model', 'done', 'cache'); }
if (msg.includes('[Coder]') && msg.includes('model') && msg.includes('tallennettu')) { setStep('step-model', 'done', '100%'); }
if (msg.includes('[Coder]') && msg.includes('Rakennetaan')) { setStep('step-build', 'active'); }
+ if (msg.includes('Agent Node käynnistyy') || msg.includes('Rakennetaan')) {
+ // Laskenta käynnistymässä
+ const cd = document.getElementById('agent-compute-dot');
+ const cl = document.getElementById('agent-compute-label');
+ const cs = document.getElementById('agent-compute-status');
+ if (cd) cd.style.background = '#d29922';
+ if (cl) { cl.textContent = 'Ladataan mallia...'; cl.style.color = '#d29922'; }
+ if (cs) cs.title = 'Kielimallia ladataan — tämä kestää ensimmäisellä kerralla pidempään';
+ }
if (msg.includes('[Coder]') && msg.includes('Malli ladattu')) {
// Malli on valmis — merkataan kaikki vaiheet valmiiksi
setStep('step-wasm', 'done');
setStep('step-tokenizer', 'done');
-
+
const pctSpan = document.getElementById('step-model-pct');
if (pctSpan && pctSpan.textContent.includes('100%')) {
setStep('step-model', 'done', '100%');
} else {
setStep('step-model', 'done', 'cache');
}
-
+
setStep('step-build', 'done');
setStep('step-ready', 'done');
+
+ // Agents-sivun compute-status: valmis
+ const cd = document.getElementById('agent-compute-dot');
+ const cl = document.getElementById('agent-compute-label');
+ const cs = document.getElementById('agent-compute-status');
+ if (cd) cd.style.background = '#3fb950';
+ if (cl) { cl.textContent = 'Valmis (Qwen2.5-Coder)'; cl.style.color = '#3fb950'; }
+ if (cs) { cs.title = 'Kielimalli ladattu — oma kone on valmis suorittamaan tehtäviä'; cs.style.cursor = 'default'; }
}
if (msg.includes('[Coder]') && msg.includes('Syöte:')) {
// Pipeline piiloon kun generointi alkaa
@@ -2605,6 +2642,13 @@
ensureCoderNode();
}
+ // Klikkaa compute-statusta käynnistääksesi laskentasolmu
+ document.getElementById('agent-compute-status')?.addEventListener('click', () => {
+ const cl = document.getElementById('agent-compute-label');
+ if (cl && cl.style.color === 'rgb(63, 185, 80)') return; // Jo valmis
+ ensureCoderNode();
+ });
+
// JSON mode toggle
const jsonToggle = document.getElementById('json-mode-toggle');
const jsonHelp = document.getElementById('json-help');