Merge branch 'main' in wartung/ui-politur (Konflikte in frontend/dist aufgeloest und neu gebaut)

This commit is contained in:
Hitonabi
2026-07-09 12:00:24 +02:00
6 changed files with 280 additions and 232 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -7,8 +7,8 @@
<link rel="manifest" href="/manifest.webmanifest" /> <link rel="manifest" href="/manifest.webmanifest" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<title>Mission Control 2.0</title> <title>Mission Control 2.0</title>
<script type="module" crossorigin src="/assets/index-CEzQdC-M.js"></script> <script type="module" crossorigin src="/assets/index-BquQKOWt.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BWp2qc5S.css"> <link rel="stylesheet" crossorigin href="/assets/index-BlX5e5eL.css">
</head> </head>
<body> <body>
<div id="root"></div> <div id="root"></div>
+57 -9
View File
@@ -1,7 +1,7 @@
import { useState } from "react" import { useState } from "react"
import { import {
Check, Copy, Cpu, Brain, Globe, FolderOpen, Laptop, ArrowRight, Check, Copy, Cpu, Brain, Globe, FolderOpen, Laptop, ArrowRight,
Info, CircleCheck, CircleX, Loader2, Info, CircleCheck, CircleX, Loader2, ChevronDown, ChevronRight,
} from "lucide-react" } from "lucide-react"
import { useConnect, useConnectHealth } from "@/lib/queries" import { useConnect, useConnectHealth } from "@/lib/queries"
import type { ConnectTool, ConnectLine } from "@/lib/api" import type { ConnectTool, ConnectLine } from "@/lib/api"
@@ -75,8 +75,10 @@ function CodeWindow({
export function ConnectView() { export function ConnectView() {
const [host, setHost] = useState(localStorage.getItem("mc_host") || "192.168.178.151") const [host, setHost] = useState(localStorage.getItem("mc_host") || "192.168.178.151")
const [mcpPath, setMcpPath] = useState(localStorage.getItem("mc_mcp_path") || "") const [mcpPath, setMcpPath] = useState(localStorage.getItem("mc_mcp_path") || "")
const [active, setActive] = useState("hermes_desktop") // Legacy-Tools (roher /v1-Zugang) leben im Ausklapper — Hermes Desktop ist der Hauptweg.
const [copied, setCopied] = useState<"model" | "memory" | null>(null) const [active, setActive] = useState("kilo")
const [sonstigeOffen, setSonstigeOffen] = useState(false)
const [copied, setCopied] = useState<"desktop" | "model" | "memory" | null>(null)
const params = new URLSearchParams({ host }) const params = new URLSearchParams({ host })
if (mcpPath) params.set("mcp_path", mcpPath) if (mcpPath) params.set("mcp_path", mcpPath)
@@ -94,9 +96,10 @@ export function ConnectView() {
localStorage.setItem("mc_mcp_path", v) localStorage.setItem("mc_mcp_path", v)
} }
const desktop = data?.tools["hermes_desktop"]
const tool = data?.tools[active] const tool = data?.tools[active]
async function copy(which: "model" | "memory", snippet?: string) { async function copy(which: "desktop" | "model" | "memory", snippet?: string) {
if (!snippet) return if (!snippet) return
await navigator.clipboard.writeText(snippet) await navigator.clipboard.writeText(snippet)
setCopied(which) setCopied(which)
@@ -111,8 +114,8 @@ export function ConnectView() {
Verbindung &amp; Integration Verbindung &amp; Integration
</h1> </h1>
<p className="text-sm text-muted-foreground"> <p className="text-sm text-muted-foreground">
Binde deinen lokalen Agenten an die Box an über <span className="text-foreground">drei getrennte Leitungen</span>: <span className="text-foreground">Hermes Desktop</span> ist die Tür zur Box einmal verbinden, fertig.
das Modell (Gateway), das geteilte Gedächtnis (MCP) und das Desktop-Gateway. Für Spezialfälle gibt es darunter die rohen Leitungen (Gateway&nbsp;/v1 + Gedächtnis-MCP) für sonstige Tools.
</p> </p>
</div> </div>
@@ -221,7 +224,49 @@ export function ConnectView() {
)} )}
{data && ( {data && (
<div className="grid gap-5 lg:grid-cols-2"> <div className="space-y-5">
{/* Hauptweg — Hermes Desktop anbinden */}
{desktop && (
<div className="space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-emerald-500/70 bg-card/30 p-4">
<div>
<div className="flex items-center gap-2 text-sm font-space font-bold text-foreground">
<Laptop className="h-4 w-4 text-emerald-400" />
Hermes Desktop anbinden
<span className="text-[10px] font-medium text-emerald-400/90 normal-case">der Hauptweg</span>
</div>
<p className="text-[11px] text-muted-foreground mt-0.5">
Die Desktop-App dockt remote an die Box an volle Agent-Oberfläche, Projekte, Review, Gedächtnis inklusive.
</p>
</div>
{desktop.note && (
<div className="flex items-start gap-2.5 p-3 rounded-xl bg-emerald-500/5 border border-emerald-500/20 text-[11px] text-muted-foreground leading-relaxed">
<Info className="h-4 w-4 text-emerald-400 shrink-0 mt-0.5" />
<span>{desktop.note}</span>
</div>
)}
<CodeWindow
tool={desktop}
fileName={FILE_NAMES["hermes_desktop"]}
accent="teal"
copied={copied === "desktop"}
onCopy={() => copy("desktop", desktop.snippet)}
/>
</div>
)}
{/* Ausklapper — Legacy: roher /v1-Zugang + Gedächtnis-MCP für sonstige Tools */}
<div className="rounded-2xl border border-border/60 bg-card/30">
<button
onClick={() => setSonstigeOffen((v) => !v)}
className="flex w-full items-center gap-2 p-4 text-sm font-space font-bold text-foreground cursor-pointer hover:text-primary transition-colors"
>
{sonstigeOffen ? <ChevronDown className="h-4 w-4" /> : <ChevronRight className="h-4 w-4" />}
Sonstige Tools (roher /v1-Zugang + Gedächtnis-MCP)
<span className="text-[10px] font-medium text-muted-foreground normal-case">Kilo Code · Claude Code · Eigenbau</span>
</button>
{sonstigeOffen && (
<div className="grid gap-5 lg:grid-cols-2 p-4 pt-0">
{/* Leitung 1 — Modell anbinden */} {/* Leitung 1 — Modell anbinden */}
<div className="space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4"> <div className="space-y-3 rounded-2xl border border-border/60 border-t-2 border-t-primary/70 bg-card/30 p-4">
<div> <div>
@@ -232,9 +277,9 @@ export function ConnectView() {
<p className="text-[11px] text-muted-foreground mt-0.5">Wähle dein Tool das Snippet zeigt auf den Gateway.</p> <p className="text-[11px] text-muted-foreground mt-0.5">Wähle dein Tool das Snippet zeigt auf den Gateway.</p>
</div> </div>
{/* Tool-Picker */} {/* Tool-Picker (ohne hermes_desktop — der hat oben seine eigene Karte) */}
<div className="flex flex-wrap gap-1.5"> <div className="flex flex-wrap gap-1.5">
{Object.entries(data.tools).map(([key, t]) => ( {Object.entries(data.tools).filter(([key]) => key !== "hermes_desktop").map(([key, t]) => (
<button <button
key={key} key={key}
onClick={() => setActive(key)} onClick={() => setActive(key)}
@@ -296,5 +341,8 @@ export function ConnectView() {
</div> </div>
)} )}
</div> </div>
</div>
)}
</div>
) )
} }