Zum Artikel springen
HB CodeDocsApp herunterladen

HandbuchArchitektur

Prozessgrenzen

Welcher Prozess welchen Teil ausführt, wie Aufrufe die Grenzen überqueren, wie Sessions zu Worktrees und Threads stehen, und wo Sie mit dem Lesen des Quellcodes beginnen.

Gegen den Quellcode geprüft am 5. Oktober 2026

Auf dieser Seite

Der Implementierungs-Stack

HB Code hat vier Anwendungsgrenzen und zwei Agent-Prozessgrenzen. Das Desktop-Frontend ist React und TypeScript in einer Tauri-2-WebView. Sein Rust-Backend besitzt lokale Commands, den SQLite-Produktzustand, den entfernten RPC-Router und beide Agent-Prozesse: den Codex-app-server-Kindprozess und den Claude-Agent-Host, einen Node-Prozess, der das Claude Agent SDK ausführt. Eine Session wählt ihren Agenten, wenn sie erstellt wird, und behält ihn. Der Server ist Rust mit Actix Web, Tokio, SQLx für PostgreSQL und Redis-Integration. Die iOS-Begleit-App verwendet Swift und SwiftUI, mit UIKit für ihre Chat-Collection-View, und die Android-Begleit-App verwendet Kotlin und Jetpack Compose. Beide Telefone sprechen denselben RPC-Vertrag mit dem Desktop.

Die WebView, die Agenten und Ihre Telefone tauschen Daten nur über die Rust-Laufzeit aus
Die WebView, die Agenten und Ihre Telefone tauschen Daten nur über die Rust-Laufzeit ausInnerhalb der gestrichelten Linie liegt Ihr Computer. Die WebView spricht über Tauri-Befehle und -Events mit der Rust-Laufzeit, und der Codex app-server läuft als Kindprozess, der mit der Laufzeit JSON-RPC-Zeilen über stdin und stdout austauscht. Die Laufzeit besitzt appdata.db und liest Projektordner und Git selbst. Neben dem Codex-Kindprozess läuft eine Claude-Session über den Claude-Agent-Host, einen Node-Prozess, den die Laufzeit für jeden Run startet und mit dem sie in JSON-Zeilen über stdin und stdout spricht. Beide Agenten führen Befehle aus und ändern Dateien im Projekt. Codex hält Transkripte und seine ChatGPT-Anmeldung in seinem eigenen Profilverzeichnis und ruft OpenAI auf. Claude hält sie in ~/.claude und ruft Anthropic auf. Jeder Pfeil, der die gestrichelte Linie kreuzt, beginnt innerhalb: Der Desktop öffnet einen WebSocket zum regionalen Server, jedes Telefon öffnet einen eigenen Socket zum selben Relay, und jeder Agent ruft seinen Anbieter über HTTPS auf.
Ihr Computer
WebViewReact · Tauri 2
Tauri-Befehle · Events
Rust-LaufzeitRPC-Router · Domänendienste · Outbox
appdata.dbSessions · Outbox
JSON-RPC-Zeilen über stdin/stdout
liest Dateien und Git
JSON-Zeilen über stdin/stdout
Codex app-serverKindprozess
Projekt­ordnerGit-Worktrees
Claude-Agent-HostNode, einer pro Run, startet claude
beide Agenten führen hier Befehle aus und ändern Dateien
Codex-ProfilverzeichnisTranskripte · ChatGPT-Anmeldung
~/.claudeTranskripte · Claude-Anmeldung
TelefoneiOS · Android
WebSocket
Regionaler ServerRelay · Konten
WebSocket
Jede Verbindung, die die gestrichelte Linie kreuzt, wird von innen geöffnet.
HTTPS
OpenAIModellanfragen
HTTPS
AnthropicModellanfragen
  • Rust-Laufzeitchat · agents · remote_api

    Bedient die Befehle der WebView und die RPC-Anfragen der Telefone mit denselben Domänendiensten. Sie besitzt appdata.db und liest Projektdateien und Git selbst.

  • Codex app-server--listen stdio://

    Ein Kindprozess pro Profilpaar, und höchstens drei bleiben aktiv, außer alle sind beschäftigt. Die Laufzeit liest seinen Verlauf über die Pipe mit thread/items/list, nie aus seinen Dateien.

  • Claude-Agent-Hostdesktop/agent-host

    Ein Node-Prozess, der das Claude Agent SDK ausführt, das wiederum die claude-Programmdatei startet. Die Laufzeit startet einen Host pro Run und Einmal-Hosts für Lesevorgänge, daher überlebt kein Claude-Prozess seine Arbeit.

  • Regionaler Server/ws/device-link

    Läuft in den USA oder der EU und reicht Nachrichten zwischen dem Socket, den der Desktop geöffnet hat, und dem Socket jedes Telefons weiter. Er speichert Konten, Gerätezeilen und Präsenz, nie Projektdateien oder Transkripte.

Eine mobile Anfrage bis zur Ausführung nachverfolgen

Eine Telefonanfrage und ein Klick am Desktop rufen denselben Dienst auf
Eine Telefonanfrage und ein Klick am Desktop rufen denselben Dienst aufZwei Wege enden in einem Dienst. Links durchläuft eine Telefonanfrage zuerst das Relay, das die Methode, den Idempotenzschlüssel und die Verbindung des Desktops prüft. Auf Ihrem Computer wartet die RPC-Annahme auf einen freien Platz, gleicht das Konto ab, sucht den Idempotenzschlüssel und dekodiert die Parameter. Rechts durchläuft ein Klick in der WebView nur die Tauri-Prüfung, ob sein Fenster den Befehl aufrufen darf, und das Dekodieren seiner Argumente. Beide Wege münden in submit_outbox_request, das für jeden Aufrufer drei Prüfungen ausführt: Text oder Anhänge, ein gültiger Sendemodus und eine Fähigkeit, die der Agent der Session hat. Dann speichert es die Nachricht und gibt eine Quittung zurück. Später übergibt ein Drain-Task die Nachricht an agents/dispatch, das den Turn im Agenten der Session startet: im Codex-Kindprozess oder in einem Claude-Agent-Host.
Telefonrpc.request
Relay
Ihr Computer
RPC-Annahme
WebViewKlick im Composer
Tauri-Befehl
Methode auf der Liste des Relays?
-32601
Mutation mit Idempotenzschlüssel?
-32026
Desktop verbunden?
-32010 oder -32011
Platz frei binnen 8 s?
ausgelastet
gleiches Konto wie der Desktop?
verboten
erste Nutzung des Schlüssels?
gespeichertes Ergebnis
Parameter dekodierbar?
ungültige Parameter
Eine Prüfung auf einem Weg schützt nur diesen Weg. Regeln für alle Aufrufer gehören in den Dienst.
im Fenster erlaubt?
verweigert
Argumente dekodierbar?
Fehler
Outbox-Dienstsubmit_outbox_request
Text oder Anhänge?
abgelehnt
Sendemodus gültig?
abgelehnt
Agent hat die Fähigkeit?
abgelehnt
gespeichert, Quittung zurückgegeben
Agent der Sessionagents/dispatch startet den Turn später, in Codex oder Claude
  • Relayrequest_validation.rs

    Prüft den Methodennamen und den Idempotenzschlüssel und überlässt die Parameter dem Desktop, außer bei session.syncHistoryState. Ist der Desktop offline oder verbindet er sich neu, antwortet das Relay selbst mit -32010 oder -32011.

  • RPC-Annahmesnapshot_and_rpc.rs · router

    Läuft für jede Telefonanfrage: 8 leichte und 2 schwere Plätze, dann der Kontoabgleich. Eine Mutation nimmt einen dauerhaften Idempotenzanspruch, und der Adapter dekodiert die Parameter in einen Anfragetyp, der unbekannte Felder ablehnt.

  • Tauri-Befehlcapabilities/default.json

    Erlaubt dem Hauptfenster und den Session-Fenstern, Workspace-Befehle aufzurufen. Tauri dekodiert die Argumente in denselben Anfragetyp, daher scheitern unbekannte Felder auch hier.

  • Outbox-Dienstsubmit_outbox_request

    Beide Wege rufen ihn auf, daher gelten seine Regeln für jeden Aufrufer, und eine wiederholte operationId legt nie eine zweite Nachricht an. Er lehnt das Ersetzen einer gesendeten Nachricht oder einen Geschwindigkeitsmodus in einer Claude-Session ab. Er speichert die Nachricht und gibt die Quittung zurück, und ein Drain-Task startet den Turn später.

Belassen Sie Geschäftsregeln im Domänendienst, wo sich beide Wege treffen. Der Dienst lehnt auch ab, was der Agent der Session nicht kann: das Ersetzen einer gesendeten Nachricht oder einen Geschwindigkeitsmodus in einer Claude-Session. Die gespeicherte Nachricht nennt keinen Agent-Prozess. Ein Drain-Task übergibt sie später an agents/dispatch, das den Turn im Codex-app-server-Kindprozess oder in einem neuen Claude-Agent-Host startet. Übereinstimmende UI-Bedienelemente sind keine Autorisierungsprüfung. Das Relay antwortet außerdem mit -32012, wenn ein Desktop eine Anfrage nicht vor dem Timeout des Relays abschließt, und das Relay-Kapitel listet seine Codes und Timer.

Projekte, Worktrees und Sessions

Nur ein eigener Worktree hält die Dateien zweier Aufgaben auseinander
Nur ein eigener Worktree hält die Dateien zweier Aufgaben auseinanderDrei Geräte wählen ihre Sessions selbst. Der Desktop und das iPhone zeigen dieselbe Session Dunkelmodus, das Android-Telefon zeigt Login-Fix. Einstellungsseite und Dunkelmodus arbeiten im Haupt-Worktree und bearbeiten beide dessen src/settings.tsx, ohne Sperre zwischen ihnen. Login-Fix und sein Subagent-Thread Regressionstest arbeiten im verknüpften Worktree, einem getrennten Checkout mit eigener Kopie von src/settings.tsx. Beide Worktrees gehören zu einem Projekt. Wird ein verknüpfter Worktree gelöscht, verschiebt der nächste Scan seine ruhenden Sessions in den Haupt-Worktree und überspringt laufende.
Desktop
iPhone
Android
jedes Gerät wählt seine Session selbst
EinstellungsseiteSession
DunkelmodusSession
Login-FixSession
RegressionstestSubagent-Thread
erzeugt
src/settings.tsx
src/login.ts
zwei Sessions, eine Datei, keine Sperre
Haupt-Worktree~/code/app · main
src/login.ts
src/login.test.ts
src/settings.tsx
eigene Kopie
Verknüpfter Worktree~/code/app-login · fix-login
ein Projekt
Verknüpfter Worktree gelöscht: Der nächste Scan verschiebt seine ruhenden Sessions in den Haupt-Worktree und überspringt laufende. Während der Scan Sessions verschiebt, kann kein Run starten, weil beide dieselbe Sperre nehmen.
  • Worktreegit worktree list

    HB Code listet die vorhandenen Worktrees auf und legt nie einen an. Eine Session entsteht in einem davon, und der Desktop lehnt ein projectDirectory ab, das kein Worktree des Projekts ist.

  • Subagent-ThreadactiveRun: null

    Vom Agenten während eines Turns der Eltern-Session gestartet, in deren Worktree. Er hat eine eigene Timeline und ein eigenes Live-Overlay, und nur die Eltern-Session meldet den aktiven Run.

  • GeräteauswahlappSessionId

    Jedes Gerät wählt Projekt, Worktree und Session selbst, daher können zwei Geräte dieselbe Session oder verschiedene zeigen. Ein Subagent-Thread wird über seine Session geöffnet.

Ein Projekt ist ein Git-Repository, gruppiert unter seinem Haupt-Worktree. Ein Ordner ohne Git ist ein Projekt, dessen einziger Arbeitsbereich der Ordner selbst ist.

Im Quellcode-Baum navigieren

Pfad vom Repository-StammverzeichnisBeginnen Sie hier für
desktop/src/app/components/workspace-chat/React-Workspace-Komposition, Timeline-Zustand, Viewport-Ownership und Outbox-Anzeige.
desktop/src-tauri/src/commands/Tauri-Einstiegspunkte und Desktop-Domänenoperationen.
desktop/src-tauri/src/chat/Die gemeinsame Chat-Schicht: Outbox, Operation-Ledger, Run-Registry, Live-Timeline-Overlay, Darstellungszeilen und die Tauri-Einstiegspunkte des Chats. Sie importiert nie einen Agent-Adapter.
desktop/src-tauri/src/agents/codex/Der Codex-Adapter: app-server-Kindprozess, Auth-Profile, Turns, Verlauf über thread/items/list und der Speicher für Befehlsausgaben.
desktop/src-tauri/src/agents/claude/Der Claude-Adapter: Run-Schleife, Projektion in die gemeinsamen Zeilen, Verlauf, Subagents, Berechtigungen, Konten und die Laufzeit des Agent-Hosts.
desktop/src-tauri/src/agents/dispatch/Der Code, der den Adapter einer Session auswählt. Die Chat-Schicht erreicht einen Adapter nur über dieses Modul.
desktop/src-tauri/src/usage_history/Gespeicherte Plan-Limit-Messwerte beider Agenten. Es liest beide Adapter direkt, weil es beide Kontoarten liest.
desktop/src-tauri/src/services/agent_tools/Der HB-Code-Tool-Katalog, den beide Agenten bekommen, und die Tool-Handler.
desktop/agent-host/Der Node-Agent-Host in TypeScript. Er führt das Claude Agent SDK aus und spricht JSON-Zeilen über stdin und stdout.
desktop/src-tauri/src/remote_api/RPC-Typen, Validierung, Idempotenz, Dispatch und Remote-Methodenadapter.
server/src/services/device_link_ws/WebSocket-Registrierung, Anforderungsvalidierung, Weiterleitung und Verbindungslebenszyklus.
mobile/ios/Core/Sources/Core/Connectivity/Relay/iOS-Relay-Verbindung und Methodenvertrag.
mobile/ios/VibeUI/Sources/VibeUI/Features/Workspace/Chat/iOS-Chat-Ownership, Timeline-Reconciliation und Collection-Rendering.
mobile/android/app/src/main/java/com/hbcode/mobile/Android-Einstiegs-Routing, Workspace-Tabs, Relay-Client und Compose-Bildschirme.