/** * keys.ts — Client-Token verwalten. Die Datei (KEYS_FILE) liegt nur auf dem * Host, nie im Repo. `add ` erzeugt ein Token und gibt es EINMAL aus; * `add --token ` uebernimmt ein bestehendes (Migration von LiteLLM, * damit kein Container angefasst werden muss). `list` zeigt Namen. */ import { readFileSync, writeFileSync } from "fs"; import { randomBytes } from "crypto"; const pfad = process.env.KEYS_FILE; if (pfad === undefined) { console.error("KEYS_FILE nicht gesetzt"); process.exit(1); } let daten: Record = {}; try { daten = JSON.parse(readFileSync(pfad, "utf8")); } catch { /* neu */ } const [befehl, name] = process.argv.slice(2); if (befehl === "list") { for (const n of [...new Set(Object.values(daten))].sort()) console.log(n); } else if (befehl === "add" && name) { const i = process.argv.indexOf("--token"); const token = i > 0 ? process.argv[i + 1] : `sk-42i-${randomBytes(24).toString("base64url")}`; daten[token] = name; writeFileSync(pfad, JSON.stringify(daten, null, 1), { mode: 0o600 }); console.log(i > 0 ? `uebernommen fuer ${name}` : token); } else if (befehl === "remove" && name) { for (const [t, n] of Object.entries(daten)) if (n === name) delete daten[t]; writeFileSync(pfad, JSON.stringify(daten, null, 1), { mode: 0o600 }); } else { console.log("keys.ts list | add [--token ] | remove "); }