CRM API — Endpunkt-Referenz

Arc OS — The Orchestration System für KI-Teams

Allgemeine Informationen

Parameter Wert
Base URL https://arc-os.co/api/crm
Autorisierung Authorization: Bearer <JWT> oder ?token=<JWT> (für SSE/WebSocket)
Content-Type application/json
JWT-Algorithmus HMAC-SHA256
JWT TTL 24 Stunden

Authentifizierung

Alle Endpunkte (außer /docs/*) erfordern einen JWT-Token im Header Authorization: Bearer <token>.

Für SSE- und WebSocket-Verbindungen wird der Token über den Query-Parameter ?token=<JWT> übermittelt.

Autorisierungsfehler

Code Beschreibung
401 Fehlender oder ungültiger Token
403 Kein Zugriff auf das Projekt (Multi-Tenancy)

Endpunkte nach Kategorien

Konto und Einstellungen

Methode Pfad Beschreibung
GET /account/settings Kontoeinstellungen abrufen
PUT /account/settings Kontoeinstellungen aktualisieren
GET /account/usage Token-Usage-Verlauf für den autorisierten Benutzer (Phase 63, #148). Response: { rows: [ { project_name, worker_id, input_tokens, output_tokens, cache_tokens, total_tokens, created_at } × bis zu 200 ], totals: { total, input, output } }. Liest token_usage_log nach owner_id. Angezeigt in UserDropdown (UsageCard) und BillingPage (Token-Usage-Sektion).

Onboarding + Trial Credits (Phase 50.1)

Methode Pfad Beschreibung
POST /onboarding/setup Erstes Projekt erstellen. Body multipart: config (JSON) + files. Feld anthropicKey ist jetzt optional — wenn leer + User hat email_verified + hat noch keine Testphase erhalten, wird das Projekt im trial_mode=1 mit 100K Free Tokens erstellt. Response: { ok, project, trial_activated }. Phase 51: Gibt 402 mit {error:"plan_limit_reached", reason, current, limit, plan} zurück, wenn der User das Projekt-Limit seines Plans überschritten hat.
GET /account/trial-status Testphasen-Status für das UI-Banner. Response: { email, email_verified, trial_granted, has_trial_active, total_remaining, total_granted, projects: [...] }

Onboarding Checklist (Phase 54.1, Issue #56)

Post-Wizard-5-Schritt-Engagement-Checkliste. Jeder Schritt (workers, cli, skill, bot, issue) akzeptiert den Status completed oder skipped. Mutationen sind idempotent: Ein erneuter identischer POST gibt denselben State zurück, ohne einen Duplikateintrag in activity_log zu schreiben. Replay setzt den State nicht zurück, entfernt nur dismissed_at — das UI zeigt das Panel erneut mit demselben Fortschritt.

Methode Pfad Beschreibung
GET /onboarding/progress Aktueller State für den autorisierten User. Response: { steps:["workers","cli","skill","bot","issue"], state:{<step>:<status>}, completed_count, total_steps:5, completed_at, dismissed_at, source, started_at, updated_at }. Unberührter User → Nullwerte/null ohne Zeilenerstellung.
POST /onboarding/event Schritt-Transition aufzeichnen. Body: { step: "workers"|"cli"|"skill"|"bot"|"issue", status: "completed"|"skipped", source?: "web"|"cli" }. Whitelist-Validierung → 400 bei unbekanntem step/status. Response: dieselbe Form wie GET. Emittiert onboarding_step_completed/onboarding_step_skipped im activity_log nur bei changed; bei Transition auf 5/5 wird zusätzlich onboarding_completed mit duration_ms emittiert.
POST /onboarding/dismiss Panel schließen (dismissed_at = now). Idempotent. Emittiert onboarding_dismissed beim ersten Aufruf mit Payload {completed_count}.
POST /onboarding/replay Geschlossenes Panel wieder öffnen (dismissed_at = NULL). Schritt-State bleibt unberührt. Emittiert onboarding_replayed beim Clear-Event.
POST /projects/:name/active-issue Issue #115. Aktuelle Web-Sitzung an ein Issue binden. Body: { issue_id: number, title?: string }. Schreibt activity_log-Event session_active_issue (source=web).
GET /projects/:name/active-issue Issue #115. Zuletzt gebundenes Issue dieses Owners innerhalb von 7 Tagen. Response: { active_issue_id, title, ts }.
GET /onboarding/cli-status Phase 54.3 (Issue #58). Hat sich der User in den letzten 30 Tagen über arc login eingeloggt? Response: { installed: boolean, last_cli_at: string|null }. SSOT — Zeilen in activity_log mit event_type='cli_invocation' und actor=chatId. Das Frontend-Onboarding-Checklisten-UI pollt diesen Endpunkt alle 10s, solange der CLI-Schritt aussteht; wenn installed=true — wird der cli-Schritt automatisch als abgeschlossen markiert.
GET /analytics/onboarding-funnel Phase 54.6 (Issue #61). Aggregierte Funnel-Statistiken über ein Rolling Window. Query: hours=168 (1-720, Standard 7d). Response: { hours, total_steps:5, started_users, completed_users, completion_rate, per_step: [{step, completed, skipped}…], duration_p50_ms, duration_p90_ms, ttfc_p50_ms, ttfc_sample_size }. SSOT — activity_log-Events onboarding_step_* + onboarding_completed + cli_invocation. TTFC = Time-to-First-arc (julianday-Delta vom ersten Onboarding-Schritt bis zur ersten cli_invocation pro Actor).

SSOT für Funnel-Metriken (Phase 54.6 / Issue #61) — Events in activity_log (event_type LIKE 'onboarding_%'). Tabelle onboarding_progress — Derived Cache: UI rendert mit einer Abfrage statt durch Event-Aggregation.

Beta Feedback (Phase 53.3)

Methode Pfad Beschreibung
POST /feedback Beta-Feedback senden. Body: {type: "bug"|"feature"|"other", title, description, project?, browser?}. Schreibt in activity_log (event_type=feedback_report) und pingt den CEO auf Telegram.
GET /admin/feedback Liste der letzten Einsendungen (nur Admin). Query: limit=50 (max 500). Response: {items: [...], count}.

POST /feedback — Body-Validierung: type ∈ {bug,feature,other}, title ≤200 Zeichen, description ≤5000 Zeichen. Erfolg → {ok: true, type, title}. Telegram-Ping wird formatiert als 🐞/💡/📝 New <type> feedback ... From: <user> Title: <title> + erste 400 Zeichen der Beschreibung.

Das Floating-Widget in FeedbackWidget.jsx (CRM Dashboard) überträgt automatisch browser (UA + Viewport + Locale) und project (technical_name des aktiven Projekts).

Beta Invites (Phase 52.1, nur Admin)

Methode Pfad Beschreibung
GET /admin/invites Liste aller Einladungscodes + Zählungen (total_active, total_used). Nur Admin.
POST /admin/invites N Codes generieren. Body: {count: N, note?: string}. Nur Admin. Response: {ok, codes, count}.
DELETE /admin/invites/:code Ungenutzten Einladungscode widerrufen.

Auth-Flow-Update: POST /api/auth/register erfordert nun das Feld invite_code (Phase 52.1 Closed Beta). Ohne Code → 403 {error: "invite_required"}. Ungültiger/bereits verwendeter Code → 403 {error: "invalid_invite"}.

Billing (Phase 51)

Methode Pfad Beschreibung
GET /billing/status Aktueller Plan, Limits, Usage, Features. Erstellt automatisch eine Free-Zeile beim ersten Aufruf. Response: { plan, status, current_period_end, limits, usage, features, pricing, can_upgrade, stripe_ready }
POST /billing/checkout-session Stripe Checkout (Stage 2 — gibt 501 zurück, solange Stripe SDK nicht integriert ist)

Plan-Limits (OR-Semantik):

402-Response bei POST /onboarding/setup oder POST /projects/:name/workers, wenn das Limit überschritten wird: { error: "plan_limit_reached", reason: "projects_limit"|"workers_limit", current, limit, plan, message }

Admin-User (role=admin) umgehen die Plan-Limit-Prüfung vollständig — sie sind Operatoren, keine zahlenden Mandanten.

Beta-Tester (subscriptions.plan='beta', Phase 52 F&F) umgehen das ebenfalls — unbegrenzte Anzahl an Projekten/Worker plus alle Max-Features. Wird manuell zugewiesen: UPDATE subscriptions SET plan='beta' WHERE user_id=?.

Bugfix (Issue #25): POST /projects/create (Quick Start, Phase 50.2) schlug zuvor mit ownerChatId is not defined wegen eines Tippfehlers fehl — behoben, der Audit-Actor wird jetzt korrekt eingetragen.

Bugfix (Issue #26): allocatePort() für neue Projekte prüft jetzt echte TCP-Bindings (ss -tln) statt nur die Registry. Zuvor konnte ein Port zurückgegeben werden, der von einem Nicht-Registry-Dienst belegt war (NotebookLM Bridge :19213, interne Bridges) → Workspace-Bot schlug mit EADDRINUSE fehl.

Auth-Flow (Phase 50.1): /api/auth/register und /api/auth/login geben nun JWT auch für unverified E-Mails zurück + Flag needs_verification: true. Sensitive Aktionen (Trial Grant, Billing, Invites) prüfen email_verified separat. Rate-Limit bei Registrierung: 3 / IP / 24h.


Projekte (9 Endpunkte)

Methode Pfad Beschreibung
GET /projects Liste der Projekte des Users
POST /projects/create Projekt erstellen
GET /projects/:name Projektdetails
GET /projects/:name/config Projektkonfiguration
PUT /projects/:name/config Konfiguration aktualisieren
GET /projects/:name/protocol Projektprotokoll
PUT /projects/:name/protocol Protokoll aktualisieren
GET /projects/:name/logs Projekt-Logs
GET /projects/:name/metrics Projektmetriken

POST /projects/create — Body:

{
  "technical_name": "string",
  "displayName": "string",
  "description": "string",
  "icon": "string",
  "color": "string"
}

GET /projects/:name/logs — Query: category, lines

GET /projects/:name/metrics — Query: since, until


Worker (11 Endpunkte)

Methode Pfad Beschreibung
GET /projects/:name/workers Liste der Worker
POST /projects/:name/workers Worker erstellen
POST /projects/:name/workers/reorder Phase 53.8 — Worker-Reihenfolge ändern. Body: {order: [id1, id2, ...]}. Überschreibt workers_registry.json atomar. Worker, die nicht in order enthalten sind, werden ans Ende angehängt (Schutz vor Datenverlust). Response: {ok, count, order}.
PUT /projects/:name/workers/:id Worker aktualisieren
DELETE /projects/:name/workers/:id Worker löschen
POST /projects/:name/workers/generate-prompt System-Prompt generieren
GET /projects/:name/workers/:id/telegram-token Telegram-Token abrufen
POST /projects/:name/workers/:id/telegram-token Phase 53.4 — Validiert den Token über Telegram getMe, speichert bot_username im Vault, verweigert die Anfrage, wenn derselbe Bot bereits an einen anderen Worker gebunden ist (409). Response: {ok, started, bot_username}.
DELETE /projects/:name/workers/:id/telegram-token Telegram-Token löschen
POST /projects/:name/workers/:id/notify Phase 53.2 — TG-Event-Ping senden ({event?, text, buttons?}). Stiller No-Op, wenn kein Token gebunden oder CRM_DISABLE_TG_NOTIFY=1.
POST /projects/:name/workers/:id/suggest-bot-username 53.11.1 (Issue #48) — Gibt 5 Kandidaten für den TG-Username im Bot-Creation-Wizard zurück, im Format <project>_<worker>_bot + nummerierte Fallbacks. Slugify entfernt Bindestriche, Truncate auf 32 Zeichen (Worker-Teil wird zuerst gekürzt). Response: {candidates: string[]}.
POST /metrics/wizard 53.11.1 (Issue #48) — Telemetrie-Sink für den Bot-Creation-Wizard. Body: {action, duration_ms?, attempts?, success?, project?, worker_id?}. Schreibt in activity_log (event_type=wizard_metric), Best-Effort.
GET /analytics/wizard-metrics?hours=168 53.11.1 (Issue #48) — Funnel-Zusammenfassung: {starts, completions, abandons, success_rate, avg_duration_ms_completed, avg_attempts_completed, by_action}. Standard 7 Tage, Clamp 1-720h.
POST /projects/:name/restart Worker neu starten
GET /projects/:name/active-role Aktuell aktive Rolle
POST /projects/:name/active-role Aktive Rolle ändern

POST /projects/:name/workers — Body:

{
  "label": "string",
  "icon": "string",
  "type": "terminal | telegram",
  "model": "string",
  "max_turns": 20,
  "tools": ["Read", "Write", "Bash"],
  "system_prompt": "string",
  "focus_dirs": ["src/", "docs/"]
}

max_turns standardmäßig 20 (zuvor 5, was den Fehler "Reached max turns" bei mehrstufigen Dialogen mit Tool Calls verursachte).

POST /projects/:name/restart — Query: worker_id


Dateien und Speicher (8 Endpunkte)

Methode Pfad Beschreibung
GET /projects/:name/files Dateibaum
POST /projects/:name/files/upload Datei hochladen (multipart, max 100MB)
POST /projects/:name/files/mkdir Verzeichnis erstellen
POST /projects/:name/files/create Datei erstellen
GET /projects/:name/files/read Datei lesen
PUT /projects/:name/files/save Datei speichern
DELETE /projects/:name/files/delete Datei löschen
POST /projects/:name/files/clone Git-Repository klonen

GET /projects/:name/files — Query: path

GET /projects/:name/files/read — Query: path, raw


Skills (18 Endpunkte)

Projekt-Skills

Methode Pfad Beschreibung
GET /projects/:name/skills Liste der Projekt-Skills
POST /projects/:name/skills Skill erstellen
PUT /projects/:name/skills/:id Skill aktualisieren
DELETE /projects/:name/skills/:id Skill löschen

Globaler Marketplace

Methode Pfad Beschreibung
GET /skills Liste der globalen Skills
POST /skills Skill veröffentlichen
GET /skills/:id Skill-Details
PUT /skills/:id Skill aktualisieren
DELETE /skills/:id Skill löschen

Evolution und Updates

Methode Pfad Beschreibung
GET /skills/:id/evolution Evolutionshistorie eines Skills
GET /skill-updates Liste verfügbarer Updates
POST /skill-updates/:id/approve Update annehmen
POST /skill-updates/:id/reject Update ablehnen

Skill-Forks

Methode Pfad Beschreibung
GET /projects/:name/skill-forks Liste der Forks
POST /projects/:name/skill-forks Fork erstellen
PUT /projects/:name/skill-forks/:id Fork aktualisieren
DELETE /projects/:name/skill-forks/:id Fork löschen

Chat und Nachrichten

Methode Pfad Beschreibung
POST /projects/:name/chat Nachricht in den Chat senden
GET /projects/:name/chat/history Chatverlauf
POST /projects/:name/message Nachricht an einen Worker senden (Phase 48.6: weckt automatisch einen im Idle getöteten Worker auf, ~2-4s Cold Start; Phase 48.6.1: Wake-Up funktioniert jetzt auch in Single-Mode-Projekten, nicht nur im Parallel-Modus)
GET /projects/:name/pins Liste der Notizen (Pins)
POST /projects/:name/pins Notiz erstellen
DELETE /projects/:name/pins/:id Notiz löschen

Wiki (4 Endpunkte)

Methode Pfad Beschreibung
GET /projects/:name/wiki/tree Wiki-Seitenbaum
GET /projects/:name/wiki/file Wiki-Seite lesen
PUT /projects/:name/wiki/save Wiki-Seite speichern
GET /projects/:name/wiki/download Wiki als ZIP-Archiv herunterladen

Analytik (4 Endpunkte)

Methode Pfad Beschreibung
GET /analytics/activity Aktivitäts-Feed
GET /analytics/sidebar Daten für die Seitenleiste
GET /analytics/phases Liste der Projektphasen
POST /analytics/phases Projektphasen aktualisieren

Marketplace und Sage (8 Endpunkte)

Methode Pfad Beschreibung
GET /sage/scout/categories Marketplace-Kategorien
POST /sage/scout Skills suchen
POST /sage/scout/quick-scan Schnell-Scan
POST /sage/scout/analyze Tiefenanalyse eines Skills
POST /sage/scout/install Skill installieren
POST /sage/analyze Sage-Analyse
GET /sage/status Sage-Dienststatus
POST /sage/benchmark Benchmark starten

Speicher und Knowledge

Methode Pfad Beschreibung
POST /projects/:name/memory/refresh Neuralen Speicher aktualisieren
POST /projects/:name/memory/fetch-artifact Artefakt laden
GET /projects/:name/learnings Liste der Learnings
POST /projects/:name/learnings Learning hinzufügen
GET /projects/:name/knowledge-graph Wissensgraph des Projekts

Dokumentation (global, ohne Auth)

Methode Pfad Beschreibung
GET /docs/tree?lang=<lang> Dokumentationsbaum; lang optional (en/uk), Standard en
GET /docs/file?path=<p>&lang=<lang> Dokumentationsdatei mit Language-Fallback lesen

GET /docs/tree — Query: lang (optional)

GET /docs/file — Query: path (erforderlich), lang (optional)


System

Methode Pfad Beschreibung
GET /system/configs Systemkonfigurationen abrufen
PUT /system/configs Systemkonfigurationen aktualisieren

Fehlercodes

Code Bedeutung
200 Erfolg
201 Erstellt
400 Ungültige Anfrage
401 Nicht autorisiert
403 Verboten (Multi-Tenancy)
404 Nicht gefunden
409 Konflikt (Duplikat)
429 Zu viele Anfragen
500 Serverfehler

GitHub Integration (Phase 49.3)

Endpoint Method Beschreibung
/api/crm/projects/:name/github GET Liste der mit dem Projekt verknüpften GitHub-Repos
/api/crm/projects/:name/github POST Repo verknüpfen (Body: {owner, repo}) — gibt Webhook-URL + Secret + Setup-Anweisungen zurück
/api/crm/projects/:name/github/:id DELETE Repo-Verknüpfung aufheben
/api/crm/projects/:name/github/events GET Liste der letzten GitHub-Events (Phase 49.3.1, Query: ?limit=50)
/api/webhooks/github POST Öffentlicher Webhook-Receiver (HMAC-SHA256-validiert, Rate-Limit 100/min)

Unterstützte Events: push, pull_request, workflow_run, issues. Benachrichtigungen werden an den Telegram-Account des Projekteigentümers weitergeleitet.

Account Security (Phase 45.4)

Endpoint Method Beschreibung
/api/crm/account/recovery GET Liste der aktiven Recovery Keys
/api/crm/account/recovery POST Recovery Key erstellen (Body: encryptedKey, keyHint)
/api/crm/account/recovery DELETE Recovery Key(s) widerrufen (Body: { id } oder {} für alle)
/api/crm/account/recovery/restore GET Verschlüsselten Master Key zur Wiederherstellung abrufen

Sicherheit


Phase 53.13 — Type-Safety-Baseline (2026-05-10)

Keine Verhaltensänderung der Endpunkte — nur interne Typen. tsc --noEmit blockiert jetzt Push/CI:


Phase 53.15 — Sentinel Sprint 1 (2026-05-10)

Verhaltensänderungen bei Auth- und Admin-Endpunkten (Sentinel Audit P0-Fixes):


Phase 53.21 — Sentinel P2 Batch 2 (2026-05-12)

Phase 53.18 — tmux Secret-Leak-Fix (2026-05-11)

Keine Verhaltensänderung der Endpunkte — nur Refactoring interner Spawn-Pfade.

Phase 53.16 — Sentinel Sprint 2 (2026-05-10)

Verhaltensänderungen der Endpunkte nach Hardening von 13 × P1:

Phase 55 — Cosmic Editorial Login (2026-05-13)

Neue Endpunkte für Magic-Link-Sign-in:

EphemeralTokenType-Union erweitert: enthält nun "magic_link" neben den bestehenden Typen oauth_state / password_reset / email_verification / tfa_challenge.

Das Frontend (CosmicCard.jsx) verarbeitet den magic-State (60-s-Resend-Countdown) und den ?magic_token=-URL-Parameter (Auto-Consume → Login → Erfolgsanimation).

Phase 56 — AI Interop / Project Context Export (2026-05-13)

Nur-für-Eigentümer-Export eines sanitizierten Projekt-Snapshots als .md zur Übergabe an externe KI-Systeme (Gemini / ChatGPT / Perplexity / Claude.ai).

Alert: Wenn der Eigentümer innerhalb von 24h mehr als 3 Exporte durchführt UND prefs.notify_on_export = true (Standard OFF) — geht logActivity("export_alert", ...) über die bestehende Phase-53.10-TG-Notify-Pipeline (alertFired: true im Response-Body).

Multi-Tier-Scanner (shared/secret-scanner.ts) — Tier 1 Regex (PATTERN_REGISTRY aus PII-Sanitizer), Tier 2 Shannon-Entropie ≥4,5 Bits/Zeichen auf ≥20-Zeichen-Runs, Tier 3 Kontext-Heuristiken (key=/token:/secret=/password=). Whitelist: UUID / Git SHA / SHA-256 / wiederholte Zeichen / kurzes Hex / Low-Entropy-Base58. Severity-Tiers (critical/high/medium/low). Performance: <500 ms / 1 MB.

DB-Migration 024 — Tabellen export_audit_log + export_preferences.


Phase 57 — Platform Einstellungen (Sentinel #103 Follow-up, 2026-05-15)

Super-Admin-Secret-Management über das CRM-UI statt SSH/edit-.env/paste-in-chat. Backend-MVP (Stage 1 von 4 Stages). Alle Endpunkte sind durch requireAdmin gesichert (Phase 53.15) — gibt 403 Forbidden — admin only für Nicht-Admins zurück, 401 Unauthorized ohne JWT.

Strikte Ausschlussliste NEVER_EXPOSE: CRM_SECRET (JWT-Signing) + SECRET_ENCRYPTION_KEY (Vault-Meta-Key) — selbst eine Admin-Anfrage mit gültigem Token gibt 400 "not managed" zurück. Audit-Log append-only (kein UPDATE/DELETE-Handler), jede Aktion (inkl. fehlgeschlagene) schreibt eine Zeile mit IP + UA + E-Mail.

DB-Migration 026 — Tabelle platform_audit_log. Stage 2 (Frontend PlatformSettings.jsx) — shipped 2026-05-15 (cbc8bac): Admin-only Card-Grid + Rotate-Modal (<input type="password"> + Retype-Confirm) + Audit-Drawer; Sidebar-Eintrag gefiltert nach userRole === "admin", abgerufen von /api/auth/me.

Polish (2026-05-15, Commit 56191b0) — Platform-Einstellungen-UI-Restrukturierung. GET /api/crm/platform/settings-Response-Items erhalten 5 neue Felder: category (anthropic|oauth|telegram|email), usedIn (string[] — Dateien/Flows, die den Key verwenden), getFromUrl (wo ein frischer Wert abgerufen werden kann), effectAfterRotate, riskIfLeaked. Vom Frontend verwendet, um 4 sektionierte Card-Gruppen + kollapsierbare Hilfe-Panels pro Card mit strukturiertem Kontext zu rendern (Used in / Get from / Effect / Risk). Keine Verhaltensänderung bei den Mutator-Endpunkten (PUT/POST/restart/test).

Refactor (2026-05-16)shared/routes/platform.ts internes Cleanup. 39 Zeilen entfernt (16 hinzugefügt), keine Änderung der öffentlichen API-Oberfläche. PUT/POST/restart/test/audit-Endpunkt-Signaturen und Responses unverändert. Hier dokumentiert, da der Doc-Coverage-Pre-Push-Gate bei jedem shared/routes/*.ts-Diff auslöst.

Rückdatierte Aktivität (#117, 2026-05-16)POST /api/mcp/issues/:project/:id/log akzeptiert nun das optionale Feld ts (ISO-8601-String). Wird von arc retro-Rekonstruktion verwendet, damit historische Einträge mit ihren ursprünglichen Zeitstempeln landen. Zukünftig datierte Werte werden innerhalb von addActivity() stillschweigend auf jetzt gedeckelt (Schutz vor Versehen). Ungültiges ISO → 400.

Stage 3 (2026-05-15) — Hot-Reload von OAuth- und Resend-Secrets ohne Neustart. shared/auth.ts loadOAuthConfig() liest jetzt getSecret("GITHUB_CLIENT_ID/SECRET" | "GOOGLE_CLIENT_ID/SECRET") pro Aufruf statt process.env. Callsites in master-bot/routes/auth.ts riefen bereits getOAuthConfig() pro Request auf → 0 Callsite-Änderungen. RESEND_API_KEY ist bereits Hot-Reload über shared/email.ts:47. Verhaltensänderung: PUT /api/crm/platform/settings/{GITHUB_CLIENT_ID|GITHUB_CLIENT_SECRET|GOOGLE_CLIENT_ID|GOOGLE_CLIENT_SECRET|RESEND_API_KEY} tritt jetzt mit dem nächsten Request in Kraft, erfordert keinen Neustart. restartTargets für diese 5 Keys ist leer → Restart-Schaltfläche im UI ausgeblendet. Edge Case: Ein OAuth-Flow mit einem vor der Rotation ausgestellten State-Token kann beim Code-Exchange beim Callback eine 400 erhalten — User-Retry löst das. ANTHROPIC_API_KEY, PLATFORM_ANTHROPIC_KEY, MASTER_BOT_TOKEN, CITADEL_BOT_TOKEN erfordern weiterhin einen Neustart (werden beim Child-Bot-Spawn / TG-Long-Poll-Init gelesen).

Phase 57.3.5 Cleanup (2026-05-16)MANAGED_KEYS-Allowlist von 9 auf 6 reduziert. Entfernt: ANTHROPIC_API_KEY (Operatoren verwenden jetzt den einheitlichen PLATFORM_ANTHROPIC_KEY für Trial-Credits und Platform-Inferenz; .env-Fallback funktioniert weiterhin für Legacy-Code-Pfade, bis Sage/Karpathy migrieren), CITADEL_BOT_TOKEN (Per-Projekt-Bot gehört zu child:<name>:token-Vault-Einträgen, verwaltet durch den Worker-Onboarding-Flow — nicht durch Platform Einstellungen). MASTER_BOT_TOKEN umbenannt: Label → "Telegram — System Monitor Bot", Beschreibung → "Server-Health-Alerts + On-Demand-Status-Probes (nur Admin, kein Chat-Bot)". Phase 58 wird die Monitoring-Schleife hinzufügen (Push-Alerts für Worker-Crash / Disk / RAM / SSH-Brute-Force / CF-Bypass + /status, /health, /errors, /restart-Befehle). Finales Set: PLATFORM_ANTHROPIC_KEY + GITHUB×2 + GOOGLE×2 + MASTER_BOT_TOKEN + RESEND_API_KEY (refs #103).

Phase 63 — UI/UX Konsolidierung + Token-Usage-Tracking (2026-05-21, #148)

Neuer Endpunkt:

Änderungen in claude-runner.ts:

UI-Änderungen (kein API):