"use strict"; import { apiGet, apiPost } from "../core/api.js"; let refreshTimer = null; function ensurePanel() { let panel = document.getElementById("mhrn-runtime-io"); if (panel) return panel; // Fallback: Panel erzeugen falls nicht im Template vorhanden const workspace = document.getElementById("tab-wesen"); if (!workspace) return null; panel = document.createElement("section"); panel.id = "mhrn-runtime-io"; panel.className = "wesen-card wesen-runtime-io"; panel.innerHTML = `
RUNTIME INPUT / OUTPUT

Manuelle Operator-Injektion

unknown
lade …
Noch kein manueller Eingriff.
`; const subnav = workspace.querySelector(":scope > .wesen-subnav"); const anchor = workspace.querySelector(":scope > header"); if (subnav) subnav.insertAdjacentElement("afterend", panel); else if (anchor) anchor.insertAdjacentElement("afterend", panel); else workspace.prepend(panel); panel.querySelector("#runtime-io-form").addEventListener("submit", inject); return panel; } function render(payload) { const panel = ensurePanel(); if (!panel) return; const select = panel.querySelector("#runtime-io-neuron"); const selected = select.value; select.innerHTML = (payload.input_neurons || []).map((n) => ``).join(""); if ([...select.options].some((opt) => opt.value === selected)) select.value = selected; panel.querySelector("#runtime-io-mode").textContent = `${payload.mode || "unknown"} · tick ${payload.tick ?? "unknown"}`; const submit = panel.querySelector('button[type="submit"]'); submit.disabled = !payload.manual_injection_allowed || !payload.input_neurons?.length; panel.querySelector("#runtime-io-status").textContent = payload.manual_injection_allowed ? `bereit · ${payload.counts?.input_neurons ?? 0} Inputs / ${payload.counts?.output_neurons ?? 0} Outputs` : `gesperrt · ${payload.mode || payload.controller_state || "unknown"}`; } async function refresh() { const panel = ensurePanel(); if (!panel || panel.hidden) return; try { render(await apiGet("/api/runtime/io")); } catch (error) { panel.querySelector("#runtime-io-status").textContent = `nicht verfügbar · ${error.message}`; } } async function inject(event) { event.preventDefault(); const panel = ensurePanel(); if (!panel) return; const body = { neuron_id: Number(panel.querySelector("#runtime-io-neuron").value), current: Number(panel.querySelector("#runtime-io-current").value), ticks: Number(panel.querySelector("#runtime-io-ticks").value) }; try { const result = await apiPost("/api/runtime/io/inject", body); panel.querySelector("#runtime-io-output").textContent = JSON.stringify({ operator_intervention: result.operator_intervention, scientific_evidence: result.scientific_evidence, request: result.request, delta: result.delta, output_neurons: result.after?.outputs }, null, 2); await refresh(); } catch (error) { panel.querySelector("#runtime-io-output").textContent = `Injektion abgelehnt: ${error.message}`; await refresh(); } } export function initRuntimeIO() { ensurePanel(); refresh(); if (refreshTimer) clearInterval(refreshTimer); refreshTimer = setInterval(refresh, 3000); }