Zum Inhalt springen

API-Endpunkte

Die Penates-API ist eine REST-API auf Port 3333 (konfigurierbar über PORT). Alle Endpunkte unter /api/ erfordern Authentifizierung. Fehlermeldungen sind immer auf Englisch, unabhängig von der Browser-Sprache.

Authentifizierung

REST: Token in jedem Request-Header mitschicken:

Authorization: Bearer <token>

WebSocket: Token als Subprotocol übergeben:

new WebSocket(url, ["bearer." + token])

Der Server gibt das Subprotocol in der Handshake-Antwort zurück. Ein Legacy-Fallback über ?token= als Query-Parameter wird zur Migration akzeptiert.

Remote-Zugriff über Cloudflare Access: Wenn CF_ACCESS_TEAM_DOMAIN und CF_ACCESS_AUD gesetzt sind, müssen Tunnel-Requests zusätzlich ein gültiges Cloudflare-Access-JWT im Header Cf-Access-Jwt-Assertion tragen. Direkte lokale Requests überspringen diese Prüfung.

Sessions

MethodeRouteBeschreibung
GET/api/sessionsAlle tmux-Sessions auflisten. Jeder Eintrag enthält command, limits und cost.
POST/api/sessionsSession anlegen. Body: { name, directory, command }. Namen müssen dem Muster ^[\w\-. ]{1,64}$ entsprechen.
DELETE/api/sessions/:nameSession beenden und aus dem Known-Sessions-Store entfernen.
PATCH/api/sessions/:nameSession umbenennen. Body: { newName }.
POST/api/sessions/:name/adoptFremde (nicht über den Hub gestartete) Session unter ihrem Originalnamen registrieren, ohne sie umzubenennen.
POST/api/sessions/:name/restoreDormante (bekannte, aber nicht laufende) Session neu spawnen.
POST/api/sessions/:name/muteNotification-Stummschaltung für eine Session umschalten.
POST/api/sessions/:name/pinSidebar-Pin für eine Session umschalten.
DELETE/api/sessions/:name/knownEintrag aus known-sessions.json entfernen, ohne die Session zu beenden.
GET/api/sessions/:name/diffNicht committete Änderungen im Session-Arbeitsverzeichnis (für den Repo-Panel-Tab „Changes”).
GET/api/sessions/:name/git/logCommit-History des Session-Repos. Unterstützt ?limit und ?skip für Pagination.
GET/api/sessions/:name/git/branchesLokale und Remote-Branches des Session-Repos.
GET/api/sessions/:name/git/commit/:shaHeader und Diffs pro Datei für einen einzelnen Commit.
GET/api/sessions/:name/file-contentDatei per Pfad lesen, für klickbare Terminal-Pfad-Previews.
GET/api/sessions/:name/scrollbacktmux-Scrollback-History lesen. Akzeptiert ?lines=N.
POST/api/sessions/:name/uploadDateien ins Session-Arbeitsverzeichnis hochladen (multipart/form-data via Busboy).
POST/api/sessions/:name/imageEinzelnes PNG hochladen (raw image/png, max. 8 MB) nach .penates-images/. Gibt { rel } zurück.
POST/api/sessions/:name/mata-captureAktuellen iOS-Simulator-Frame aufnehmen und als Session-Image speichern. Gibt { rel } zurück.

Board

MethodeRouteBeschreibung
GET/api/board/cardsKarten auflisten. ?projectId filtert nach Projekt.
POST/api/board/cardsKarte anlegen. Body: { projectId, title, priority, stage, origin }.
PATCH/api/board/cards/:idKarte aktualisieren. Stufenwechsel laufen über moveCard; andere Felder über updateCard.
DELETE/api/board/cards/:idKarte löschen. Karten mit aktiven Sessions oder Worktrees lösen Cleanup aus.
POST/api/board/cards/:id/brainstormBrainstorm-Session für die Karte spawnen.
POST/api/board/cards/:id/implementImplement-Session in einem isolierten git-Worktree spawnen.
GET/api/board/cards/:id/branch-diffDiff zwischen dem Karten-Branch und dem Basis-Branch (für die Review-Spalte).
POST/api/board/cards/:id/finishMergen, Changelog aktualisieren und pushen (Review zu Done). Führt preflightFinish + finishCard aus.

Projekte und Dateien

MethodeRouteBeschreibung
GET/api/projectsAlle registrierten Projekte auflisten.
POST/api/projectsNeues Projekt registrieren. Body: { name, path }.
PATCH/api/projects/:idProjekt-Metadaten aktualisieren.
DELETE/api/projects/:idProjekt aus der Registry entfernen.
PATCH/api/projects/:id/itemsCheckbox in Released/In-Dev im Plandokument umschalten.
POST/api/projects/:id/releaseNeues Release im CHANGELOG.md des Projekts anlegen.
POST/api/projects/:id/ideagenIdeen-Generierungs-Session für das Projekt spawnen.
GET/api/projects/:id/filesVerzeichnisinhalt auflisten. ?path= für Unterverzeichnis.
POST/api/projects/:id/filesDatei oder Verzeichnis innerhalb des Projekts anlegen.
PATCH/api/projects/:id/filesDatei innerhalb des Projekts umbenennen, verschieben oder kopieren.
DELETE/api/projects/:id/filesDatei in den Papierkorb verschieben.
GET/api/projects/:id/files/readDateiinhalt lesen. Gibt Text (max. 2 MB) oder Base64-Bild/PDF (max. 10 MB) zurück.
GET/api/browseVerzeichnis-Picker. Akzeptiert ?path= und ?hidden=1. Beschränkt auf $HOME und BROWSE_ROOTS.
POST/api/browse/mkdirVerzeichnis innerhalb der erlaubten Browse-Roots anlegen.

Usage

MethodeRouteBeschreibung
GET/api/usage/limitsAccount-weite Rate-Limits, History und Peaks aus dem Statusline-State. 30 s gecacht.
GET/api/usage/costsAggregierte Kosten aller aktiven Sessions. 10 s gecacht.
GET/api/usage/historyErweitertes Tages-Aggregat (getDailyUsageV2). Akzeptiert ?days=30.
GET/api/recent-dirsRecency-rankte Arbeitsverzeichnisse aus moshi-hook.

Hooks

Diese Endpunkte werden von Claude-Code-Hook-Skripten aufgerufen, die setup.sh konfiguriert. Sie sind nicht für manuelle Clients gedacht.

MethodeRouteBeschreibung
POST/api/hooks/StopClaude-Code-Stop-Hook. Markiert die Session als idle.
POST/api/hooks/NotificationClaude-Code-Notification-Hook. Markiert die Session als waiting.
POST/api/hooks/UserPromptSubmitClaude-Code-UserPromptSubmit-Hook. Markiert die Session als working.
POST/api/hooks/SubagentStopClaude-Code-SubagentStop-Hook. Wird wie Stop behandelt.
POST/api/hooks/SessionStartClaude-Code-SessionStart-Hook. Initialisiert den Session-State.
POST/api/hooks/SessionEndClaude-Code-SessionEnd-Hook. Bereinigt den Session-State.
POST/api/hooks/pre-tool-usePreToolUse-Hook. Leitet den Aufruf durch das Approvals-Gate.
POST/api/hooks/statuslineEmpfängt Statusline-Daten (Rate-Limits, Kosten, Kontextfenster, Modell) vom Statusline-Skript.

Alle Hook-Routen akzeptieren X-Penates-Session als Header zur Identifikation der sendenden Session. Ungültiges JSON im Payload wird fehlertolerant behandelt: der Endpunkt parst opportunistisch und fällt bei Fehler auf {} zurück.

WebSocket

ProtokollRouteBeschreibung
WS/api/terminal/:nameAn den Session-PTY anhängen. Binäre Frames enthalten rohe PTY-Bytes; Text-Frames enthalten JSON-Steuernachrichten. Close-Code 4004 bedeutet, die Session existiert nicht; 4001 bedeutet Authentifizierungsfehler.
WS/api/files/eventsLive-Dateiänderungs-Events. { subscribe: projectId } oder { subscribeSession: name } senden, um Events zu empfangen.

Terminal-Frame-Format:

  • Client an Server (Text, JSON): { type: "input", data }, { type: "resize", cols, rows }, { type: "ping" }.
  • Server an Client (binär): rohe PTY-Bytes (UTF-8).
  • Server an Client (Text, JSON): { type: "error", message }, { type: "pong" }.

Weitere Routen

MethodeRouteBeschreibung
GET/POST/api/preview/config, /api/preview/ports, /api/preview/selectBrowser-Preview-Proxy-Konfiguration.
GET/POST/api/mata/status, /api/mata/controliOS-Simulator (Mata): Status sowie Start/Stop/Restart.
GET/POST/api/voice/config, /api/voice/transcribeVoice-Input-Konfiguration und WAV-Transkription.
GET/POST/api/approvals/*PreToolUse-Approvals-Gate.
GET/POST/api/push/*Web-Push-Abonnementverwaltung.
GET/POST/api/settingsServer-Einstellungen lesen und schreiben (GET / PATCH).
POST/api/server/restartHub-Prozess über den OS-Service-Manager neu starten.
GET/api/server/logsAktuelle Log-Ausgabe streamen.
GET/POST/api/updatesVerfügbare Komponenten-Updates auflisten. Akzeptiert ?refresh=1.
POST/api/updates/:idUpdate auslösen, indem eine losgelöste tmux-Session gestartet wird.
GET/POST/api/version, /api/version/checkHub-Version und GitHub-Release-Update-Check.