Architektur
SubLane Leitfaden: Architektur.
Aktuelle Umsetzung
SubLane Ein Go-Prozess mit Chi-Routing und einem vom Client gerenderten React-Frontend. Der Production Build bettet die generierten Dateien von Vite in die ausführbare Datei ein. SQLite ist die einzige persistente Serviceabhängigkeit; der Treiber ist reines Go, also erfordern Produktions-Builds kein CGO. Anwendungsabfragen verwenden sqlc-generiertes Go over database/sql; sqlc ist ein Entwicklungstool, kein Laufzeitdienst.
flowchart LR
Browser[Browser] --> HTTP[chi HTTP server]
Clients[Responses and Chat clients] --> HTTP
HTTP --> SPA[Embedded React application]
HTTP --> Tenant[Workspace routing and membership]
Tenant --> Accounts[Workspace accounts and encrypted credentials]
Accounts --> DB[(SQLite)]
HTTP --> Gateway[Key-bound workspace routing and affinity]
Gateway --> Accounts
Gateway --> Adapter[Provider adapters and SDK executors]
Adapter --> Providers[Codex, Claude, Antigravity and Grok Build]In der Entwicklung bedient Vite die React App und Proxies /api, /v1 einschließlich WebSocket Upgrades, /healthz, und /readyz im Go-Backend. In der Produktion wird der Browser und API Es gibt keine separaten Node.js-Dienste, Redis oder PostgreSQL-Anforderungen.
Eigentum
| Modul | Besitz | nicht besitzt |
|---|---|---|
cmd/sublane | Prozesssignale, Inbetriebnahme, Verdrahtung, Abschaltung | Domänenpolitik |
internal/config | Validierte Prozessumgebung | Anhaltende Teampräferenzen |
internal/backup | Streamed Archive, Integrität und Schlüsselvalidierung, isolierte Wiederherstellungen und atomare No-Replace-Veröffentlichung | HTTP Authentifizierung, Anbieterausführung oder Austausch von Live-Daten |
internal/alerts | Workspace-Webhook-Einstellungen, lokale Vorfallsbeobachtungen, verschlüsselte Ziele, Zustellungswiederholungen und Wiederherstellung | Modellausführung oder Browserautorisierung |
internal/content | Verschlüsselte Workspace-Content-Regeln, kompilierte lokale Matcher, Bounded-Decoded-Text-Checks und sichere Match-Metadaten | Ausführung des Anbieters, Anforderungsbuchhaltung oder Browserautorisierung |
internal/versions | Persistierend Codex, Grok und Claude Versionsrichtlinien, offizielle Metadatenprüfungen und Synchronisationslebenszyklen | SDK Ausführung, Kontoanmeldeinformationen oder Binärinstallation |
internal/timezone | Persistierte Instanz-Zeitzone und ihr veröffentlichter Standort | Browserformatierung, Nutzungsabrechnung oder Host-Clock-Einstellungen |
internal/auth | Globale Login-Identitäten, Passwörter und Sitzungen | Workspace-Mitgliedschaft oder Upstream-Anmeldeinformationen |
internal/tenants | Workspace-Mitgliedschaft, Rollen und Lebenszyklus | Globale Passwörter oder Provider-Ausführung |
internal/groups | Ressourcengruppen, Mitgliedsstipendien, persönliche Pool-Optionen und Umfang Bereitschaft | Anmeldeinformationen oder Modellprotokolle |
internal/audit | Gebundene Management-Metadaten, Akteurskontext, Transaktionsereignis schreibt und Administrator liest | Anfordernde Stellen, Beglaubigungsdaten oder Authentifizierung |
internal/apikey | Persönliche Gateway-Schlüssel-Metadaten, Hashes, unveränderliche Pool-Bindungen, Widerruf und Lookup | Browsersitzungen oder Upstream-Anmeldeinformationen |
internal/accounts | Subscription-Metadaten, persistente Modell-Snapshots und Lifecycle-Revisionen, verschlüsselte Workspace-Proxys und Account-Bindungen, Credential Lifecycle und Refresh-Serialisierung | HTTP Versand- oder Kundenschlüssel |
internal/resets | Optionale Kartenregeln, normalisierte Eignung und Ablaufreihenfolge, dauerhafte Karten-/Anfragereservierung, Tageslimits und begrenzte Zeitplanung | Anbieterzugangsdaten und -IO, Eignungsentscheidungen des Anbieters oder Inferenz |
internal/vault | AES-GCM-Verschlüsselung und Laden von privaten lokalen Schlüsseln | OAuth oder Account Policy |
internal/oauth | Sitzungsgebunden, Single-Use OAuth Versuche | Browser-Login oder Modell-Weiterleitung |
internal/upstream | öffentlich SDK Ausführende, Übersetzungen, Token-Austausch, Provider-Protokolle und ausgewählte Outbound-Transporte | Teamrollen oder Datenbankbesitz |
internal/gateway | Bounded Gateway / Account / Member-Zugang, dauerhafte Cooldown / Rate-Fenster, Anfrageverlauf und tägliche Aggregate, Kontoaffinität, Quotierungs-Snapshots und Per-Request-Orchestrierung | Genehmigung der öffentlichen Verwaltung |
internal/storage | SQLite Lifecycle, Schemainitialisierung und Abfrage SQL | Anbieter-Authentifizierung |
internal/storage/db | Generierte Abfragemethoden und Datenbankzeilentypen | Domain Policy oder Public JSON Verträge |
internal/server | Chi-Routen, Response-Grenzen, SPA-Service | Zukünftige Routing-/Kontopolitik |
web/src/lib/request.ts | Validierung und Löschung von Antworten | Komponentenaufmachung |
web/src/locales | Lokalisierte UI-Strings | Serverdiagnose |
Persistenz
Die Datenbank läuft im WAL-Modus mit aktivierten Fremdschlüsseln, einem begrenzten Zeitüberhang und einer offenen Verbindung. 001_schema.sql Initialisierungsdatei und bestellte additive Migrationen, einschließlich der Workspace-Proxy-Tabelle und der Nullable-Account-Bindung. Es speichert globale Anmeldeidentitäten und Workspace-scoped Accounts, Pools, Proxies, Schlüssel, Zertifikate, Anforderungsverlauf, Nutzung und Audit-Datensätze. Der erste Administrator besitzt Workspace-One. Ältere nicht unterstützte Vorab-Datenbanken werden abgelehnt; bewahren ihr Datenverzeichnis auf, bevor sie ein neues initialisieren. Pool-Kataloge bleiben von Account-Snapshots und aktuellen Richtlinien abgeleitet; siehe Modellkataloge. siehe Arbeitsbereiche, Netzwerkproxies, Verwaltungsaudit, Ressourcengruppen, und Poollaufzeit.
Neue Datenbankdateien verwenden Modus 0600; neu erstellte Datenverzeichnisse 0700. Bestehende Verzeichnisberechtigungen werden nicht neu geschrieben. Die Datenbankkonfiguration verwendet eine ordnungsgemäß entwichene Datei-URL, so dass Sonderzeichen im Pfad unterstützt werden.
Transaktionen müssen kurz bleiben. Halten Sie sie nicht fest, während Sie auf Reaktionen im vorgelagerten Netzwerk warten. Bevor Sie gleichzeitige Autoren oder langjährige Mitarbeiter einführen, zählt die Messung von Streitigkeiten anstelle von zunehmenden Verbindungen blindlings.
Named Queries Live Under internal/storage/queries/. sqlc.yaml Lesen Sie das gleiche Initialisierungsschema, das die Anwendung einbettet, und vermeiden Sie eine separat gepflegte Schemakopie. WithTx Öffentliche Antworten bleiben Domänentypen, so dass generierte Zeilen nicht versehentlich Passwort oder Token-Hashes aussetzen können. Schema-Bootstrap bleibt explizites SQL im Speicher. Generated Go wird versioniert und überprüft mit make generate-check.
HTTP und Vermögenswerte
- Chio
RouteGruppen und methodenspezifische Registrierungen Eigen HTTP Versand; Handler schalten keine Anfragemethoden oder Gateway-Pfade ein.Usewendet Sitzungs-, Rollen- und Trägerkontrollen vor der Behandlung 404/405 an.GroupundWithVerfügbarkeit, Herkunft und Login-Drosselung. Domain-Dienste bleiben unabhängig von HTTP. - Verwaltungsrouten und unbekannte Verwaltungspfade behalten die Administrator-Authentifizierung bei. Öffentliche Authen- und persönliche Schlüssel-Endpunkte sind explizite Ausnahmen; ihre unbekannten Pfade greifen auf den Administratorschutz zurück. JSON 405 Antworten leiten den Allow-Header aus der Routentabelle von chi ab. Statische Assets werden nur für GET/HEAD außerhalb des API Router.
- Lebendigkeit ist nicht abhängig von SQLite; Bereitschaft tut.
- Bewirtschaftungsrouten unter
/api/Standardmäßig ist eine aktivierte Administratorsitzung erforderlich. Nur die vier expliziten Auth-Endpunkte sind öffentlich; zustandsändernde Browseranforderungen erzwingen genaue Herkunftsprüfungen./api/keysund die explizite/api/meHistory, Passwort, Limit und Nutzungsrouten akzeptieren entweder aktivierte Rollen und leiten das Eigentum aus der Sitzung ab. History filtert das Eigentum in SQL vor der Paginierung und verbirgt Abonnementidentitäten vor der persönlichen Antwort./v1für die Modellerkennung eine separate Gateway-Schlüssel-Authentifizierung verwendet, Responses HTTP/SSE/WebSocket, Verdichtung, Chat Completions und gebürtiger Claude Nachrichten./v1betaexponiert native Gemini Generierung mit den gleichen Autorisierungs- und Lifecycle-Services; siehe native Protokolle. WebSocket Turns Recheck Key Validity und Member Enablement. - System und Gesundheit JSON Antworten verwenden
Cache-Control: no-store. - Das SPA-Dokument wird verlängert; Hash
/assets/Dateien können unveränderlich zwischengespeichert werden. - Unbekannt API Streckenrückkehr JSON Fehler (401 vor der Authentifizierung im geschützten Unterbaum, sonst 404) und fehlende statische Dateien geben 404 zurück.
- Header verhindern MIME Sniffing und Framing und begrenzen die Offenlegung von Referrern auf den gleichen Ursprung.
- Für Streaming gilt kein pauschales Schreibzeitlimit. Das Gateway verwendet
SUBLANE_GATEWAY_REQUEST_TIMEOUT(standardmäßig 30 Minuten), begrenzte Körper, Ereignisse und Historie sowie Abbruchweitergabe. - SIGINT/SIGTERM stoppt die Annahme neuer Arbeiten und erlaubt bis zu zehn Sekunden für HTTP Abschaltung.
Vorderteil
TanStack Router besitzt die Navigation und lädt Seitenkomponenten bei Bedarf. TanStack Query besitzt den Status der Remote-Anfrage. Zod validiert die Systemantwort; Fehler wird als Fehler mit einer Wiederholungsaktion angezeigt und nicht als fabrizierte gesunde Daten.
Die Shadcn-Admin-Submenge stellt die Sidebar und die freigegebenen Primitiven bereit. SubLane-spezifisch und enthalten keine Demo-Geschäftsunterlagen. next-themes; Verwendung von Übersetzungen i18next und react-i18next. Englisch ist die Standardeinstellung auch in einem chinesischsprachigen Browser. Alle unterstützten Wörterbücher müssen die englischen Schlüssel zum Kompilierungszeitpunkt enthalten. Englisch und vereinfachtes Chinesisch werden zunächst gebündelt; zusätzliche Sprachwörterbücher werden bei Bedarf geladen. Arabisch verwendet die Richtung von rechts nach links, während Code und Identifikatoren von links nach rechts bleiben.
Das Root-Auth-Gate wartet auf den Server-Status, bevor geschützte Seiten aktiviert werden. Management-Abfragen sind nur für Administratoren aktiviert, auch bei Umleitungsübergängen. Eine Frontend-Zugriffsrichtlinie steuert Navigation und Direct-Route-Wächter. Mitglieder erhalten eine persönliche Homepage und gemeinsame Erscheinungsbild-/Spracheinstellungen, ohne System- oder Mitgliederverwaltungsdaten abzufragen. Persönlicher Schlüssel, Request-History- und Nutzungsabfragen enthalten die Besitzer-ID in ihrem Cache-Schlüssel und entscheiden sich nur für den Mitgliederzugriff, solange diese Identität aktuell bleibt. Logout storniert ausstehende Anfragen, aktualisiert den Auth-Status und entfernt private Abfragedaten. Sitzungen verwenden HttpOnly-Cookies anstelle von Browser-Storage-Token. Der vollständige Server-Vertrag ist in Authentifizierung.md.
Grenze für die Ausführung des Anbieters
Unabhängige Instanz-weit Codex, Grok und Claude Versionsrichtlinien werden nur über den Administrator verwaltet Systemeinstellungen Sidebar-Seite, getrennt von persönlichen Vorlieben. internal/versions weiterhin separater Anbieter JSON Werte in der bestehenden settings Tabelle und liefert einen sperrfreien Versionsresolver an den vorgelagerten Adapter. Gegrenzte Hintergrundprüfungen folgen standardmäßig alle sechs Stunden den offiziellen stabilen Releases (Set-Releases).Codex GitHub Releases und die Grok npm latest Dist-Tag und Claude Code npm stable dist-tag; manuelle Überschreibungen haben Priorität. Claude Inferenz fängt ein unveränderliches SDK Executor-Konfiguration pro Client-Version, so dass der User-Agent, die Abrechnungs-Metadaten und die endgültige CCH-Unterzeichnung zustimmen; Bootstrap-Hörer für temporäre Versionen sind geschlossen und es werden keine Anmeldeinformationen in ihre Stores eingegeben. Gateway-Operationen werden gestoppt, bevor der Versionsdienst und der Release-Transport geschlossen werden, und die Mitarbeiter treten vor dem Start bei SQLite schließt. Siehe Systemeinstellungen.
internal/upstream initialisiert CLIProxyAPI v8.0.35 durch seine Öffentlichkeit SDK um die eingebauten Vollstrecker zu erhalten. Codex, Claude, Antigravity und Grok Build Abonnements und Administrator-konfiguriert OpenAI- kompatibel API Konten. Keine vorgelagerten internal Pakete werden importiert. SDK Der Manager hat einen leeren, Schreib-Ablehnungs-Speicher und erhält keine Live-Account-Registrierungen. SDK Lifecycle startet eine Loopback-only ephemeral HTTP Listener: Jede Route ist blockiert, sie hat einen separaten Zufall API Schlüssel, und der Zugriff auf das Management/Panel ist deaktiviert. SubLaneNur der Chi-Server. Der Home-Modus und Redis sind nicht aktiviert.
SubLane hält den langlebigen Lifecycle-Besitzer. OAuth Austauschen und Aktualisieren von eingeschränkten, angehefteten Provider-Endpunkten; gedrehte Anmeldeinformationen werden vor der Ausführung des Modells verschlüsselt und gespeichert. SDK Die automatische Aktualisierung wird gestoppt. Ephemeral Subscription Auth enthält Zugriffstoken und erlaubte Provider-Metadaten, niemals Aktualisierungstoken, importierte Endpunkt-Overrides oder vom Client bereitgestellte Proxy-Einstellungen. API-Kanäle speichern Plattform und Protokoll mit verschlüsseltem Schlüssel und validierter Basis-URL. Sie verwenden den gewählten öffentlichen SDK-Ausführer; Responses nutzt die öffentliche authentifizierte HTTP-Schnittstelle und Übersetzer. Die Modellerkennung ist begrenzt und folgt der Konfiguration statt einem universellen /models-Vertrag. Schlüssel gelangen weder in OAuth noch in den SDK-Speicher. Gruppenrechte, Affinität und Accounting bleiben erhalten; die Rotation behält Identität und Einstellungen. Plattform-, Protokoll- oder URL-Änderungen erfordern einen neuen Kanal. Antigravity Nutzung öffentlicher sdk/auth Nur dieser Refresh-Anruf erhält das Refresh-Token; sein Ergebnis wird nie im SDK Der injizierte Transport setzt die Anruferfrist, die Antwortgrenzen, die Redirect-Ablehnung und die bereinigten Fehler durch, selbst wenn SDK Die Projektvorbereitung schließt sich auch innerhalb dieses Pfades ab. SDK das Publizieren-vor-Beständigen-Verhalten des Managers; Ersetzen Sie es nicht durch unbewachte Manager.Register/Update-Aufrufe.
Ein Workspace-Administrator kann ein Konto an einen verschlüsselten binden Netzwerk-ProxyDer vorgelagerte Adapter wählt den Proxy des Kontos für serverseitig aus. OAuth Austausch, Aktualisierung, Entdeckung, Nutzung liest und Modellausführung. SDK Der Aufruf behält diese Auswahl bei, auch wenn er einen losgelösten Anforderungskontext erstellt. Während des Fluges bleiben Streams auf ihrer ursprünglichen Verbindung; das Ändern eines Proxys wiederholt sie nicht oder ändert die Affinität des Kontos. Die Browserautorisierungsseite bleibt außerhalb dieser serverseitigen Route.
Öffentliche Modellkataloge verwenden native IDs ohne zusätzliche Kanalpräfixe, die anbieterübergreifend dedupliziert werden. Anfragen wählen unterstützende Konten über berechtigte Anbieter aus; Alte explizit qualifizierte Anfragen bleiben kompatibel. Modellerkennung besteht weiterhin aus Snapshots pro Konto und aggregiert sie innerhalb der aktuellen Poolrichtlinie. Inference wählt nur Konten mit nutzbaren Snapshots aus, die das angeforderte Modell unterstützen. Geteilte Entdeckung verwendet höchstens zwei der vorhandenen Upstream-Slots; veraltete erfolgreiche Daten bleiben bis zu 24 Stunden lang nutzbar, während eine Aktualisierung läuft. Quotenleser normalisieren Codex Nutzung, Claude Fenster und Antigravity Modellzuweisungen in den freigegebenen persistenten Cache. Codex-only. Frisches Hauptkontingent Fenster Tor Codex und Claude Konten; Antigravity Die Auswahl liest persistente Metadaten innerhalb ihrer Policy-Transaktion, während begrenzte gemeinsame Aktualisierungen außerhalb davon laufen. Provider Setup und Angaben zum Gateway.
Der Vault-Schlüssel wird als 0600 Datei neben SQLiteStartup überprüft vorhandene verschlüsselte Upstream-Anmeldeinformationen, Proxy-Adressen und persönliche API-key records and fail closed if the key is missing or mismatched. Sie verwenden eindeutig authentifizierte Verschlüsselungsbindungen. Backups müssen den Schlüssel neben der Datenbank bewahren. Aktualisierte und Administrator-Anmeldeinformationen haben einen serialisierten Besitzer; Netzwerk-IO läuft niemals innerhalb einer Datenbanktransaktion.
Affinität gilt für die Mitglieder-, Pool- und Client-Sitzung, mit einem auto Ein anderes Modell mit vollständiger portabler Historie kann die Bindung ersetzen, wenn das ursprüngliche Konto es nicht unterstützt; Anbieterfortsetzungen und unveränderte Modelle bleiben angeheftet. Deaktivierte/gelöschte Konten und aus einem Pool entfernte Konten scheitern an bestehenden Gesprächen, anstatt einen unsicheren Kontowechsel auszulösen. WebSocket Der Transkriptzustand bleibt verbindungslokal und begrenzt. HTTP previous_response_id wird abgelehnt, weil der Upstream HTTP Backend ist zustandslos; Anrufer müssen volle Eingabe liefern.
Automatisierte Protokolltests verwenden synthetische Anmeldeinformationen und gefälschte Upstreams. Codex CLI 0.152.1 bis HTTP/SSE und WebSocket Modi: Echte Subskriptions- und Desktop-Verifizierung sind immer noch getrennte Akzeptanzschritte; es wird kein universelles Speicher- oder Durchsatzbudget beansprucht; Messung der beabsichtigten Arbeitslast und Bereitstellungsplattform.
Grok Build Die Autorisierung verwendet begrenzte, sitzungsgebundene Gerätecode-Versuche mit servererzwungenen Abfrageintervallen und Einmalvervollständigung. Der geheime Gerätecode bleibt auf dem Server; Stornierung und Ablauf verhindern verspätete Veröffentlichung von Berechtigungsnachweisen. SDK Executor erhält einen expliziten OAuth Marker zum Auswählen des Abonnement-Chat-Proxys, während die Aktualisierung gepinnte xAI-Token-Endpunkte unter dem vorhandenen dauerhaften Kontoinhaber verwendet. Grok Quotierung liest die offiziellen CLI-Abrechnungsmetadaten über den gleichen Konto-Proxy und den gemeinsamen persistenten Nutzungs-Cache; nur enthaltene Abonnement-Credits werden normalisiert.
Instance Backups
Die Speicherschicht nutzt die SQLite Online Backup API durch eine separate schreibgeschützte Verbindung mit begrenztem Cache-Speicher und inkrementellem Seitenkopieren. Die Archivschicht packt die Datenbank, den Verschlüsselungsschlüssel und das Manifest mit Streaming-IO. Wiederherstellen validiert und migriert nur eine private Staging-Kopie, löscht Browsersitzungen und veröffentlicht ein neues Verzeichnis, ohne bestehende Pfade zu überschreiben. Administratoren können Wiederherstellungen aus den Systemeinstellungen exportieren, überprüfen und vorbereiten. Ein Neustart des Operators aktiviert das wiederhergestellte Verzeichnis. Export-/Wiederherstellungsvorbereitungen werden geprüft, und Dateioperationen enthalten keine Transaktion in der Live-Anwendungsdatenbank. Backup und Wiederherstellung.
Modelllimit-Metadaten werden in internal/upstreamDas Gateway besitzt Konto-/Modell-Cooldowns, bedingte versionierte Schreibvorgänge, begrenzten Aktivzustandsspeicher und Wiederherstellung von gewöhnlichen Anforderungen. Antigravity SDKDie lokale Kühlung wird an diesen Besitzer delegiert, wodurch versteckte Timer vermieden werden, die den Umfang des Modells verlieren oder einen Autorisierungszyklus überleben können.
API Kanalverwaltung
internal/channels Entlarvt eine unterschiedliche API-Channel-Management-Vertrag über den gemeinsam genutzten verschlüsselten Ausführungsressourcen-Eigentümer. API Kanäle; /api/channels Speicherressourcen-IDs bleiben stabil, so dass bestehende Mitgliedschaften, Affinität und Schlüsselbindungen bestehen bleiben.
internal/groups besitzt eine typisierte Subscription/Channel-Ressourcenmitgliedschaft und persistente Routing-Präferenzen. Neue UI-Gruppen bevorzugen Subscriptionen mit API Rückfall-Aus; Migration behält bestehende Protokollpräferenzen bei. Zulassung, Modellkataloge, Verfügbarkeit, Bereitschaft und Alarmierungskapazität haben die gleiche Routing-Richtlinie. Bestehende Gespräche werden nicht automatisch zwischen Ressourcen verschoben; explizite Modelländerungen mit tragbarem Verlauf folgen den Gateway-Modell-Routing-Regeln.