<script lang="ts">
  import { statusStore } from '../stores/status.svelte.js'
  import { api } from '@core/api.js'
  import { esc, icon } from '@core/ui.js'

  const s = $derived(statusStore.value)
  const allModels = $derived(((s?.models || []) as any[]).filter((m: any) => !m.incomplete))

  const url = $derived(baseUrl())
  let selectedTool = $state('zed')
  let selectedModelIds = $state<string[]>([])
  let testResult = $state('')
  let testOk = $state(false)
  let selectedMemTool = $state('cline')
  const memBlock = $derived(memMcpBlock(selectedMemTool))

  function baseUrl() { return `http://${location.hostname}:8080/v1` }
  function isLanIp(h: string) { return /^\d{1,3}(\.\d{1,3}){3}$/.test(h) }
  function behindProxy() { return location.protocol === 'https:' || !isLanIp(location.hostname) }

  const activeIds = $derived(
    selectedModelIds.length ? selectedModelIds : allModels.map((m: any) => m.name)
  )
  const firstModel = $derived(activeIds[0] || 'coder')
  const visionModel = $derived(allModels.find((m: any) => m.meta?.caps?.includes('Bild'))?.name)

  function zedBlock(url: string, ids: string[]) {
    const ms = ids.length ? allModels.filter((m: any) => ids.includes(m.name)) : (allModels.length ? allModels : [{ name: 'coder', meta: {} }])
    const entries = ms.map((m: any) => {
      const img = (m.meta?.caps || []).some((c: string) => /Bild|Vision/i.test(c))
      const ctx = m.meta?.ctx || 131072  // nutze konfigurierten Kontext des Modells (Standard: 128k)
      return `          { "name": "${m.name}", "display_name": "${m.name}", "max_tokens": ${ctx}${img ? `, "capabilities": { "tools": true, "images": true }` : ''} }`
    }).join(',\n')
    return `"language_models": {\n  "openai_compatible": {\n    "bosgame": {\n      "api_url": "${url}",\n      "available_models": [\n${entries}\n      ]\n    }\n  }\n}`
  }

  function openCodeBlock(url: string, ids: string[]) {
    const ms = ids.length
      ? allModels.filter((m: any) => ids.includes(m.name))
      : (allModels.length ? allModels : [{ name: 'coder', meta: {} }])
    const modelMap = ms.map((m: any) => {
      const ctx = m.meta?.ctx || 131072
      return `      "${m.name}": { "name": "${m.name}", "contextWindowSize": ${ctx} }`
    }).join(',\n')
    return `"provider": {\n  "llama-swap": {\n    "npm": "@ai-sdk/openai-compatible",\n    "name": "Bosgame (llama-swap)",\n    "options": {\n      "baseURL": "${url}",\n      "apiKey": "local"\n    },\n    "models": {\n${modelMap}\n    }\n  }\n}`
  }

  function continueBlock(url: string, ids: string[]) {
    const ms = ids.length
      ? allModels.filter((m: any) => ids.includes(m.name))
      : (allModels.length ? allModels : [{ name: 'coder', meta: {} }])
    const entries = ms.map((m: any) =>
      `    {\n      "title": "llama-swap / ${m.name}",\n      "provider": "openai",\n      "model": "${m.name}",\n      "apiBase": "${url}",\n      "apiKey": "local"\n    }`
    ).join(',\n')
    return `{\n  "models": [\n${entries}\n  ]\n}`
  }

  async function testConnection() {
    testResult = 'Teste…'
    try {
      const r = await api('/api/integration/test')
      testOk = r.ok
      testResult = r.ok
        ? `✓ Verbunden — ${r.models.length} Modell(e): ${r.models.join(', ')}`
        : `✗ Keine Verbindung: ${r.error}`
    } catch (e: any) { testOk = false; testResult = '✗ ' + e.message }
  }

  function copyCode(el: HTMLElement) {
    const code = el.querySelector('code')
    if (code) navigator.clipboard?.writeText(code.textContent || '')
  }
  function copyVal(inp: HTMLInputElement) {
    navigator.clipboard?.writeText(inp.value)
  }

  function memMcpBlock(tool: string) {
    const pyPath = tool === 'bosgame'
      ? '/opt/mission-control/.venv/bin/python'
      : 'python'
    const scriptPath = tool === 'bosgame'
      ? '/opt/mission-control/mcp_memory.py'
      : 'C:\\\\Users\\\\TobisPC\\\\mission-control\\\\mcp_memory.py'
    return `{\n  "mcpServers": {\n    "mission-control-memory": {\n      "command": "${pyPath}",\n      "args": ["${scriptPath}"],\n      "env": {\n        "MC_URL": "http://192.168.178.151:9000"\n      }\n    }\n  }\n}`
  }
</script>

<div class="pagehead">
  <div>
    <h1>Verbinden</h1>
    <div class="sub">Schritt für Schritt: KI-Modelle in deine Tools einbinden — getestet, erklärt, mit Copy-Paste-Config.</div>
  </div>
</div>

<!-- Step 1: Connection -->
<div class="card">
  <div class="card-h"><h3>1 · Verbindung prüfen</h3></div>
  <div class="card-sub">Stelle sicher, dass die LLM-Engine erreichbar ist, bevor du Tools konfigurierst.</div>
  <label>Engine-Adresse (für alle Tools)</label>
  <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
    <input class="mono-sm" readonly value={url} style="flex:1;margin:0">
    <button class="ghost" onclick={e => { const inp = (e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement; copyVal(inp) }}>Kopieren</button>
  </div>
  {#if behindProxy()}
    <div class="alert warn" style="margin:0 0 12px">
      <span class="a-dot"></span>
      <span>Du öffnest Mission Control über einen <b>Proxy/Namen</b>. Die Engine läuft auf <b>Port 8080 ohne HTTPS</b> direkt am Bosgame.
      Trag in deinen Tools die <b>LAN-IP</b> ein: <code>http://192.168.178.151:8080/v1</code> — nicht den Proxy-Namen.</span>
    </div>
  {/if}
  <div class="btn-row" style="display:flex;align-items:center;gap:10px">
    <button class="primary" onclick={testConnection}>Verbindung testen</button>
    {#if testResult}
      <span class="mono-sm" style="color:{testOk ? '#7ee29a' : '#ff9b95'}">{testResult}</span>
    {/if}
  </div>
</div>

<!-- Auto-Swap explanation -->
<div class="card">
  <div class="card-h"><h3>Wie funktioniert das Auto-Swap?</h3></div>
  <div style="display:flex;flex-direction:column;gap:10px">
    {#each [
      ['⚡', 'Kein manuelles Starten nötig', 'Wenn du in Zed oder OpenCode „coder" auswählst und eine Anfrage sendest, lädt llama-swap das Modell automatisch — in ca. 2–5 Sekunden.'],
      ['🔄', 'Modelle wechseln sich automatisch ab', 'Rufst du ein anderes Modell auf, entlädt llama-swap das aktuelle (nach TTL-Ablauf) und lädt das neue. Es läuft immer nur eines gleichzeitig.'],
      ['🧠', 'Zwei Modelle gleichzeitig aktiv halten', 'Du hast 124 GB RAM — genug für z.B. Scout 8B (~5 GB) dauerhaft geladen + ein größeres Modell das swappt. Dafür beim Scout im Modelle-Tab → Konfigurieren die TTL auf 99999 setzen.']
    ] as [emoji, title, desc]}
      <div class="tile" style="display:flex;gap:12px;align-items:flex-start">
        <span style="font-size:20px;line-height:1;flex:0 0 auto">{emoji}</span>
        <div>
          <div style="font-weight:500;font-size:13.5px">{title}</div>
          <div class="card-sub" style="margin:4px 0 0">{desc}</div>
        </div>
      </div>
    {/each}
  </div>
</div>

<!-- Steps 2–4: nur anzeigen wenn Modelle installiert sind -->
{#if allModels.length}

  <!-- Step 2: Model selector -->
  <div class="card">
    <div class="card-h">
      <h3>2 · Modelle auswählen</h3>
      <span class="meta">{selectedModelIds.length ? `${selectedModelIds.length} von ${allModels.length} ausgewählt` : 'alle werden eingeschlossen'}</span>
    </div>
    <div class="card-sub">Wähle, welche Modelle im Config-Snippet erscheinen sollen.</div>
    <div class="flex gap-2" style="flex-wrap:wrap">
      {#each allModels as m}
        {@const active = selectedModelIds.includes(m.name)}
        <span class="chip" style="cursor:pointer;{active ? 'background:rgba(45,212,191,.2);border-color:var(--accent);color:var(--accent)' : ''}"
          role="button" tabindex="0"
          onclick={() => selectedModelIds = active ? selectedModelIds.filter(x => x !== m.name) : [...selectedModelIds, m.name]}
          onkeydown={e => e.key === 'Enter' && (selectedModelIds = active ? selectedModelIds.filter(x => x !== m.name) : [...selectedModelIds, m.name])}>
          {m.name}
        </span>
      {/each}
    </div>
    {#if selectedModelIds.length}
      <div style="margin-top:10px">
        <a href="#" onclick={e => { e.preventDefault(); selectedModelIds = [] }} style="color:var(--mut);font-size:12.5px">Auswahl aufheben (alle)</a>
      </div>
    {/if}
  </div>

  <!-- Step 3: Tool picker -->
  <div class="card">
    <div class="card-h"><h3>3 · Tool wählen</h3></div>
    <div class="card-sub" style="margin-bottom:8px">Für welches Werkzeug brauchst du die Konfiguration?</div>

    <div style="font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin-bottom:6px">Chat</div>
    <div class="grid grid-3" style="gap:8px;margin-bottom:14px">
      {#each [
        ['janai', 'Jan AI', 'Einfachstes Chat-Interface — Desktop-App, kein Setup'],
        ['openwebui', 'OpenWebUI', 'Browser-Chat für Teams — mehr Features, mehr Setup'],
      ] as [id, label, desc]}
        <button class="card-btn{selectedTool === id ? ' cb-best' : ''}" style="text-align:left;padding:12px 16px" onclick={() => selectedTool = id}>
          <div style="font-weight:500;font-size:13.5px">{label}</div>
          <div class="card-sub" style="margin:3px 0 0">{desc}</div>
        </button>
      {/each}
    </div>

    <div style="font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin-bottom:6px">Coding-Assistenten</div>
    <div class="grid grid-3" style="gap:8px">
      {#each [
        ['continue', 'Continue', 'VS Code/JetBrains — Hilfe ohne Agent-Overhead'],
        ['cline', 'Cline', 'VS Code/JetBrains/Zed — voller Coding-Agent'],
        ['antigravity', 'Antigravity', 'Googles agentic IDE — VS Code-basiert'],
        ['opencode', 'OpenCode', 'Terminal-Agent — autonom, mächtig'],
        ['zed', 'Zed', 'Schneller nativer Editor mit KI-Panel'],
      ] as [id, label, desc]}
        <button class="card-btn{selectedTool === id ? ' cb-best' : ''}" style="text-align:left;padding:12px 16px" onclick={() => selectedTool = id}>
          <div style="font-weight:500;font-size:13.5px">{label}</div>
          <div class="card-sub" style="margin:3px 0 0">{desc}</div>
        </button>
      {/each}
    </div>
  </div>

  <!-- Step 4: Config snippet -->
  <div class="card">
    <div class="card-h"><h3>4 · Config-Snippet</h3></div>
    {#if selectedTool === 'janai'}
      <p><b>Jan AI</b> ist eine Desktop-App — kein Browser, kein Server, kein Admin-Panel. Einfach installieren und loslegen.</p>
      <p>Jan AI öffnen → linke Leiste → <b>Remote-Modelle</b> → <b>+ Modell hinzufügen</b>:</p>
      <label>Basis-URL (kopieren und in Jan AI einfügen)</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={url} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <label>Modell-ID (in Jan AI als „Model name" eintragen)</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={firstModel} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <div class="hint">API-Key: ein beliebiger Wert (z.B. <code>local</code>). Jan AI fragt danach beim Einrichten.</div>
      <div class="hint" style="margin-top:8px">Jan AI herunterladen: <a href="https://jan.ai" target="_blank" rel="noopener">jan.ai</a> — kostenlos, open source, Windows/macOS/Linux.</div>
    {:else if selectedTool === 'continue'}
      {@const block = continueBlock(url, activeIds)}
      <p>Datei anlegen oder öffnen: <code>~/.continue/config.json</code></p>
      <div class="alert warn" style="margin:8px 0 12px;padding:10px 14px"><span class="a-dot"></span><span>Falls bereits eine <code>config.json</code> vorhanden: nur den <code>"models"</code>-Eintrag ergänzen, nicht die ganze Datei ersetzen.</span></div>
      <div style="position:relative">
        <button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1" onclick={e => copyCode(e.currentTarget!.parentElement!)}>Kopieren</button>
        <div class="log" style="max-height:none"><code>{block}</code></div>
      </div>
      <p style="margin-top:12px">Danach Continue in VS Code neu starten → im Chat-Panel das Modell <b>llama-swap / {firstModel}</b> wählen.</p>
      <div class="hint">Continue: <a href="https://continue.dev" target="_blank" rel="noopener">continue.dev</a> — kostenlose VS Code / JetBrains Extension. Hinweis: 2026 von Cursor akquiriert — aktuell weiter aktiv und kostenlos.</div>
    {:else if selectedTool === 'antigravity'}
      <p><b>Antigravity</b> (Googles agentic IDE, VS Code-basiert) unterstützt OpenAI-kompatible Endpoints direkt:</p>
      <p>Settings → Models → <b>Custom Endpoint</b> → <b>+ hinzufügen</b>:</p>
      <label>Basis-URL</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={url} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <label>Modell-ID</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={firstModel} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <div class="hint">API-Key: ein beliebiger Wert (z.B. <code>local</code>). Danach das Modell <b>{firstModel}</b> in der Model-Liste auswählen.</div>
      <div class="hint" style="margin-top:8px">Antigravity herunterladen: <a href="https://antigravityide.net" target="_blank" rel="noopener">antigravityide.net</a> — kostenlose Einzelperson-Tier, VS Code-basiert.</div>
    {:else if selectedTool === 'zed'}
      {@const block = zedBlock(url, activeIds)}
      <p>Öffne die Zed-Settings mit <code>Cmd/Strg + ,</code> und <b>füge diesen Block</b> in deine bestehende <code>settings.json</code> ein. Falls bereits ein <code>"bosgame"</code>-Eintrag existiert: vorher löschen.</p>
      <div class="alert warn" style="margin-bottom:12px;padding:10px 14px"><span class="a-dot"></span><span>Nur diesen Block einfügen, <b>nicht die ganze Datei ersetzen</b> — sonst gehen andere Einstellungen verloren.</span></div>
      <div style="position:relative">
        <button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1" onclick={e => copyCode(e.currentTarget!.parentElement!)}>Kopieren</button>
        <div class="log" style="max-height:none"><code>{block}</code></div>
      </div>
      <p style="margin-top:12px"><b>API-Key:</b> Öffne den Agent-Panel → Anbieter <b>bosgame</b> → trag irgendeinen Wert ein (z.B. <code>local</code>).</p>
      <div class="hint">Danach im Agent-Panel das Modell <b>bosgame / {firstModel}</b> auswählen.</div>
    {:else if selectedTool === 'opencode'}
      {@const block = openCodeBlock(url, activeIds)}
      <p>Datei anlegen oder öffnen:</p>
      <p class="mono-sm" style="line-height:1.6">Windows: <code>%USERPROFILE%\.config\opencode\opencode.json</code></p>
      <div class="alert warn" style="margin:8px 0 12px;padding:10px 14px"><span class="a-dot"></span><span>Nur den <code>"provider"</code>-Block einfügen. Falls bereits ein <code>"llama-swap"</code>-Eintrag vorhanden: <b>vorher löschen</b>, sonst erscheinen Modelle doppelt.</span></div>
      <div style="position:relative">
        <button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1" onclick={e => copyCode(e.currentTarget!.parentElement!)}>Kopieren</button>
        <div class="log" style="max-height:none"><code>{block}</code></div>
      </div>
      <p style="margin-top:12px">Danach in OpenCode <code>/models</code> → <b>llama-swap/{firstModel}</b> wählen.</p>
    {:else if selectedTool === 'cline'}
      <p>In Cline/Cursor den Provider <b>„OpenAI Compatible"</b> wählen:</p>
      <label>Basis-URL</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={url} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <label>Modell-ID</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={firstModel} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <div class="hint">API-Key: ein beliebiger Wert (z.B. <code>local</code>).</div>
    {:else if selectedTool === 'openwebui'}
      <p>Settings → Admin Panel → Connections → neue OpenAI-Verbindung:</p>
      <label>Basis-URL</label>
      <div class="flex gap-2" style="align-items:stretch;margin-bottom:12px">
        <input class="mono-sm" readonly value={url} style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
      <label>API-Key</label>
      <div class="flex gap-2" style="align-items:stretch">
        <input class="mono-sm" readonly value="dummy-key" style="flex:1;margin:0">
        <button class="ghost" onclick={e => copyVal((e.currentTarget as HTMLElement).previousElementSibling as HTMLInputElement)}>Kopieren</button>
      </div>
    {/if}
  </div>

  <!-- Vision -->
  {#if visionModel}
    {@const snippet = `curl ${url}/chat/completions \\\n  -H "Content-Type: application/json" \\\n  -d '{\n  "model": "${visionModel}",\n  "messages": [{"role":"user","content":[{"type":"text","text":"Was ist auf dem Bild falsch?"},{"type":"image_url","image_url":{"url":"data:image/png;base64,<DEIN_BILD>"}}]}]\n}'`}
    <div class="card">
      <div class="card-h">
        <h3>Bilder einbinden (Vision)</h3>
        <span class="chip" style="background:rgba(63,185,80,.12);border-color:rgba(63,185,80,.25);color:#7ee29a">{@html icon('check')} „{visionModel}" bereit</span>
      </div>
      <div class="card-sub">Mit Vision-Modellen kannst du Screenshots oder Fehlerbilder direkt mitschicken.</div>
      <div style="position:relative;margin-top:8px">
        <button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1" onclick={e => copyCode(e.currentTarget!.parentElement!)}>Kopieren</button>
        <div class="log" style="max-height:none"><code>{snippet}</code></div>
      </div>
    </div>
  {/if}

{:else}
  <!-- Kein Modell installiert: Schritt 0 erklären statt leeres Snippet ausgeben -->
  <div class="card">
    <div class="card-h"><h3>2 · Erst ein Modell installieren</h3></div>
    <div class="empty-c" style="padding:8px 0 4px">
      <div class="e-t">Noch kein Modell eingerichtet</div>
      <div class="e-s">Bevor du ein Tool verbinden kannst, braucht die Engine mindestens ein Modell. Das Config-Snippet wird dann automatisch mit deinen echten Modellnamen befüllt.</div>
      <button class="primary" style="margin-top:14px"
        onclick={() => document.querySelector(".nav-item[data-view='cookbook']")?.dispatchEvent(new MouseEvent('click'))}>
        → Zum Cookbook (Modell holen)
      </button>
    </div>
  </div>
{/if}

<!-- Memory MCP — unabhaengig von Modellen, immer sichtbar -->
<div class="card">
  <div class="card-h">
    <h3>Gedächtnis-MCP</h3>
    <span class="chip" style="background:rgba(45,212,191,.1);border-color:rgba(45,212,191,.3);color:var(--accent)">Neu in v7</span>
  </div>
  <div class="card-sub" style="margin-bottom:14px">
    Damit Cline, OpenCode und Claude Code sich Projektfakten, Entscheidungen und Präferenzen
    über Sessions hinweg merken — geteilt über alle Tools, verwaltet im
    <a href="#"
      onclick={e => { e.preventDefault(); (document.querySelector(".nav-item[data-view='memory']") as HTMLElement)?.click() }}
      style="color:var(--accent)">Gedächtnis-Tab</a>.
  </div>

  <!-- Tool selector -->
  <div class="flex gap-2" style="margin-bottom:14px;flex-wrap:wrap">
    {#each [
      ['cline',    'Cline / Claude Code',  'Windows — Tools auf dem Entwicklungs-PC'],
      ['opencode', 'OpenCode',             'Windows — Terminal-Agent'],
      ['bosgame',  'Direkt am Bosgame',    'Wenn das Tool am Server läuft'],
    ] as [id, label, desc]}
      <button class="card-btn{selectedMemTool === id ? ' cb-best' : ''}"
        style="text-align:left;padding:10px 14px"
        onclick={() => selectedMemTool = id}>
        <div style="font-weight:500;font-size:13px">{label}</div>
        <div class="card-sub" style="margin:2px 0 0;font-size:11.5px">{desc}</div>
      </button>
    {/each}
  </div>

  <!-- Config block -->
  <div style="position:relative">
    <button class="ghost" style="position:absolute;top:8px;right:8px;z-index:1"
      onclick={e => copyCode(e.currentTarget!.parentElement!)}>Kopieren</button>
    <div class="log" style="max-height:none"><code>{memBlock}</code></div>
  </div>

  {#if selectedMemTool === 'cline'}
    <p style="margin-top:12px">In <b>Cline</b>: MCP-Einstellungen öffnen (Stecker-Icon in der Cline-Sidebar) → „Add MCP Server" → diesen Block einfügen.</p>
    <p>In <b>Claude Code</b>: Block in <code>~/.claude/settings.json</code> unter <code>"mcpServers"</code> einfügen.</p>
    <div class="alert warn" style="margin-top:8px;padding:10px 14px"><span class="a-dot"></span>
      <span>Einmalig auf dem Windows-PC: <code>pip install mcp httpx</code> ausführen — danach <code>mcp_memory.py</code> aus dem Repo-Ordner erreichbar machen (Pfad im Snippet anpassen).</span>
    </div>
  {:else if selectedMemTool === 'opencode'}
    <p style="margin-top:12px">Block in <code>~/.config/opencode/opencode.json</code> unter <code>"mcpServers"</code> einfügen.</p>
    <div class="alert warn" style="margin-top:8px;padding:10px 14px"><span class="a-dot"></span>
      <span>Einmalig: <code>pip install mcp httpx</code> — und Pfad zu <code>mcp_memory.py</code> im Snippet anpassen.</span>
    </div>
  {:else}
    <p style="margin-top:12px">Block in die MCP-Config des jeweiligen Tools einfügen. Der Bosgame-Pfad <code>/opt/mission-control/mcp_memory.py</code> ist bereits korrekt — kein weiteres Setup nötig.</p>
  {/if}
</div>
