Zum Artikel springen
PlanToCodeDocsApp 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 17. September 2026

Auf dieser Seite

Der Implementierungs-Stack

PlanToCode hat vier Anwendungsgrenzen und eine Agent-Prozessgrenze. 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 den Codex-Kindprozess. 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.

WebView, Codex-Kindprozess und Telefone treffen sich nur in der Rust-Laufzeit
WebView, Codex-Kindprozess und Telefone treffen sich nur in der Rust-LaufzeitInnerhalb 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 den Projektordner und Git selbst. Der Codex-Kindprozess führt im Projekt Befehle aus und bearbeitet Dateien, hält Transkripte und seine ChatGPT-Anmeldung in seinem eigenen Profilverzeichnis und ruft OpenAI über HTTPS auf. Jeder Pfeil, der die gestrichelte Linie kreuzt, beginnt innen: Der Desktop öffnet einen WebSocket zum regionalen Server, und jedes Telefon öffnet seinen eigenen Socket zum selben Relay.
Ihr Computer
WebViewReact · Tauri 2
Tauri-Befehle · Events
Rust-LaufzeitRPC-Router · Domänendienste · Outbox
appdata.dbSessions · Outbox
liest Dateien und Git
Projekt­ordnerGit-Worktrees
JSON-RPC-Zeilen über stdin/stdout
Codex app-serverKindprozess
Befehle · Änderungen
Codex-ProfilverzeichnisTranskripte · ChatGPT-Anmeldung
TelefoneiOS · Android
WebSocket
Regionaler ServerRelay · Konten
WebSocket
OpenAIModellanfragen
HTTPS
Jede Verbindung, die die gestrichelte Linie kreuzt, wird von innen geöffnet.
  • Rust-Laufzeitcommands · 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.

  • 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 enden im selben Dienst
Eine Telefonanfrage und ein Klick am Desktop enden im selben DienstZwei 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 Text oder Anhänge und einen gültigen Sendemodus prüft, die Nachricht speichert und eine Quittung zurückgibt. Später startet ein Drain-Task den Turn im Codex-Kindprozess.
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
gespeichert, Quittung zurückgegeben
Codex-Kinderhält turn/start oder turn/steer später
  • 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 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. Ü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

    PlanToCode 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/services/codex_app_server/Kindprozess-Transport, Client-Akteure, Turn-Zulassung und Registry-Ownership.
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/plantocode/mobile/Android-Einstiegs-Routing, Workspace-Tabs, Relay-Client und Compose-Bildschirme.