diff --git a/network-poc/static/index.html b/network-poc/static/index.html
index a91819d..fe282e3 100644
--- a/network-poc/static/index.html
+++ b/network-poc/static/index.html
@@ -2242,11 +2242,58 @@ Files: ${Object.keys(generatedFiles).join(', ')}`;
termLog(`\n━━━ Pipeline valmis ━━━`);
}
+ // Autokorjaus: tunnetut kirjoitusvirheet ja lähimmän komennon ehdotus
+ function autocorrect(input) {
+ const typos = {
+ 'knp': 'kpn', 'kpb': 'kpn', 'kpm': 'kpn', 'kn': 'kpn', 'kp': 'kpn',
+ 'kpn rnu': 'kpn run', 'kpn rn': 'kpn run', 'kpn ru': 'kpn run',
+ 'kpn laod': 'kpn load', 'kpn lod': 'kpn load', 'kpn loa': 'kpn load',
+ 'kpn porject': 'kpn project', 'kpn projcet': 'kpn project', 'kpn proejct': 'kpn project',
+ 'kpn pipelien': 'kpn pipeline', 'kpn pipline': 'kpn pipeline',
+ 'kpn staus': 'kpn status', 'kpn stauts': 'kpn status',
+ 'kpn modles': 'kpn models', 'kpn mdoels': 'kpn models',
+ 'kpn hlep': 'kpn help', 'kpn hep': 'kpn help',
+ 'kpn clera': 'kpn clear', 'kpn claer': 'kpn clear',
+ 'kpn helo': 'kpn hello', 'kpn hell': 'kpn hello',
+ };
+ // Tarkista koko komento ja ensimmäinen sana + alikomento
+ const lower = input.toLowerCase();
+ for (const [typo, fix] of Object.entries(typos)) {
+ if (lower === typo || lower.startsWith(typo + ' ')) {
+ return fix + input.slice(typo.length);
+ }
+ }
+ // Levenshtein-etäisyys ensimmäiselle sanalle
+ const firstWord = input.trim().split(/\s+/)[0].toLowerCase();
+ if (firstWord !== 'kpn' && firstWord.length >= 2 && firstWord.length <= 5) {
+ const dist = levenshtein(firstWord, 'kpn');
+ if (dist <= 2) return 'kpn' + input.slice(firstWord.length);
+ }
+ return null;
+ }
+
+ function levenshtein(a, b) {
+ const m = a.length, n = b.length;
+ const d = Array.from({length: m + 1}, (_, i) => [i]);
+ for (let j = 1; j <= n; j++) d[0][j] = j;
+ for (let i = 1; i <= m; i++)
+ for (let j = 1; j <= n; j++)
+ d[i][j] = Math.min(d[i-1][j] + 1, d[i][j-1] + 1, d[i-1][j-1] + (a[i-1] !== b[j-1] ? 1 : 0));
+ return d[m][n];
+ }
+
function termExec(cmd) {
termLog(`$ ${esc(cmd)}`);
termHistory.unshift(cmd);
termHistIdx = -1;
+ // Autokorjaus
+ const corrected = autocorrect(cmd.trim());
+ if (corrected && corrected !== cmd.trim()) {
+ cmd = corrected;
+ termLog(` → korjattu: ${esc(cmd)}`);
+ }
+
const parts = cmd.trim().split(/\s+/);
if (parts[0] !== 'kpn') {
termLog('kpn: tuntematon komento. Kokeile: kpn help', '#f85149');