/* Git Servers — one entry per forge host, carrying the server's own credentials: * a forge token (stored encrypted, write-only) and an SSH deploy key whose public half * is shown here to paste into the forge. Projects on a configured server need no * per-repo credentials. */ "use client"; import { useState } from "react"; import { useDashboard } from "@/components/store"; import { Badge, Button, Card, Input, Select } from "@/components/ui"; import type { Host } from "@/lib/api"; const FORGE_OPTS = [ { value: "github", label: "github" }, { value: "gitlab", label: "gitlab" }, { value: "gitea", label: "gitea" }, { value: "forgejo", label: "forgejo" }, { value: "bitbucket", label: "bitbucket" }, ]; const empty = { hostname: "", forge_type: "github", token_env_var: "", base_url: "", token: "", generate_ssh_key: true, }; function PublicKey({ value }: { value: string }) { const [copied, setCopied] = useState(false); const copy = async () => { try { await navigator.clipboard.writeText(value); setCopied(true); setTimeout(() => setCopied(false), 1500); } catch { /* clipboard unavailable (http) — the key is selectable below */ } }; return (
SSH public key — add it to the forge (deploy key)
        {value}
      
); } export function GitServersSection() { const s = useDashboard(); const [form, setForm] = useState(empty); const [editing, setEditing] = useState(false); const reset = () => { setForm(empty); setEditing(false); }; const save = async () => { const ok = editing ? await s.updateHost(form.hostname, form) : await s.createHost(form); if (ok) reset(); }; const edit = (h: Host) => { setForm({ hostname: h.hostname, forge_type: h.forge_type, token_env_var: h.token_env_var ?? "", base_url: h.base_url ?? "", token: "", generate_ssh_key: false, }); setEditing(true); }; return ( <>
Git Servers
Each server carries its own credentials: a forge token (encrypted at rest, used by agents' forge + git) and an SSH deploy key — paste the public key into the forge. New repositories are added by picking a server and typing owner/name.
{editing ? `Edit server · ${form.hostname}` : "Add a git server"}
setForm({ ...form, hostname: v })} placeholder="github.com" disabled={editing} /> setForm({ ...form, token: v })} placeholder="stored encrypted; used by forge + git" /> setForm({ ...form, base_url: v })} placeholder="https://git.corp.internal:8443" /> setForm({ ...form, token_env_var: v })} placeholder="GITEA_TOKEN" />
{editing && ( )}
{s.hosts.length === 0 && (
No git servers registered (built-in host map still applies).
)} {s.hosts.map((h) => (
{h.hostname}
{h.forge_type} {h.has_token ? "token stored" : "no token"} {h.ssh_public_key ? "ssh key" : "no ssh key"}
token env {h.token_env_var || "—"} {h.base_url ? ` · ${h.base_url}` : ""}
{h.ssh_public_key && }
))}
); }