SubLaneSubLane

Architecture

SubLane guide: architecture.

Mise en œuvre actuelle

SubLane est un processus Go avec routage chi et un frontend React rendu par le client. La production intègre les fichiers générés par Vite dans l'exécutable. SQLite est la seule dépendance persistante au service; le pilote est pur Go, de sorte que les constructions de production ne nécessitent pas CGO. database/sql; sqlc est un outil de développement, pas un service d'exécution.

Current implementation · 1
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]

Dans le développement, Vite sert l'application React et proxies /api, /v1 y compris WebSocket les mises à niveau, /healthzet /readyz Dans la production, le navigateur et API Il n'y a pas de service Node.js séparé, Redis, ou PostgreSQLTM obligatoire.

Propriété

ModulePossèdeNe possède pas
cmd/sublaneSignalisation de processus, démarrage, câblage, arrêtPolitique du domaine
internal/configEnvironnement de processus validéPréférences persistantes de l'équipe
internal/backupArchives, intégrité et validation des clés, restaurations isolées et publication atomique sans remplacementHTTP authentification, exécution par le fournisseur ou remplacement de données en direct
internal/alertsParamètres du webhook Workspace, observations d'incidents locaux, destinations cryptées, relevés de livraison et récupérationModèle d'exécution ou d'autorisation du navigateur
internal/contentRègles de contenu de l'espace de travail chiffré, jumeleurs locaux compilés, vérifications de texte décodé et métadonnées de correspondance sécuriséesExécution du fournisseur, demande de comptabilité ou autorisation du navigateur
internal/versionsPersisté Codex, Grok et Claude les politiques de version, les vérifications officielles des métadonnées et les cycles de vie de la synchronisationSDK exécution, identifiants de compte ou installation binaire
internal/timezoneFuseau horaire de l'instance permanente et son emplacement publiéConfiguration du formatage du navigateur, de la comptabilité d'utilisation ou de l'horloge hôte
internal/authIdentités de connexion globales, mots de passe et sessionsAdhérent à l'espace de travail ou références en amont
internal/tenantsAdhésion à l'espace de travail, rôles et cycle de viePasswords mondiaux ou exécution par le fournisseur
internal/groupsGroupes de ressources, autorisations aux membres, choix de pools personnels et préparation étenduePouvoirs ou protocoles types
internal/auditMétadonnées de gestion bounded, contexte d'acteur, événement transactionnel écrit et l'administrateur litDemander des organismes, des pouvoirs ou une authentification
internal/apikeyMétadonnées personnelles de la clé de passerelle, hachages, reliures immuables de pool, révocation et rechercheSessions du navigateur ou références en amont
internal/accountsMétadonnées d'abonnement, instantanés de modèles persistants et révisions du cycle de vie, proxies cryptées de l'espace de travail et liaisons de comptes, cycle de vie des titres de compétence et mise à jour de la sérialisationHTTP les clés d'expédition ou client
internal/resetsRègles facultatives, admissibilité normalisée et priorité d’expiration, réservations persistantes de carte et de requête, plafonds quotidiens et planification bornéeIdentifiants et E/S du fournisseur, décisions d’admissibilité du fournisseur ou inférence
internal/vaultcryptage AES-GCM et chargement de clé locale privéeOAuth ou une police de compte
internal/oauthSéance, à usage unique OAuth tentativesConnexion du navigateur ou renvoi de modèle
internal/upstreamPublic SDK Exécuteurs, traduction, échange de jetons, protocoles fournisseurs, et certains transports sortantsRôles de l'équipe ou propriété de la base de données
internal/gatewayEntrée de passerelle/compte/membre, fenêtres de taux/refroidissement durables, historique des demandes et agrégats quotidiens, affinité des comptes, instantanés de quotas et orchestration par demandeAutorisation de gestion publique
internal/storageSQLite cycle de vie, initialisation du schéma et requête SQLAuthentification du fournisseur
internal/storage/dbMéthodes de requête générées et types de lignes de base de donnéesPolitique de domaine ou public JSON contrats
internal/serveritinéraires chi, limites de réponse, service de SPAFuture politique d'acheminement/compte
web/src/lib/request.tsValidation et annulation de la réponsePrésentation des composantes
web/src/localesChaînes d'interface utilisateur localiséesDiagnostic du serveur

Persistance

La base de données fonctionne en mode WAL avec des clés étrangères activées, un timeout occupé limité, et une connexion ouverte. 001_schema.sql Le premier administrateur possède un espace de travail. Les bases de données antérieures non supportées sont rejetées; préserver leur répertoire de données avant d'initialiser un nouveau répertoire. Les catalogues de pools restent dérivés des instantanés de comptes et de la politique actuelle; voir le fichier d'initialisation et les migrations additives ordonnées, y compris la table proxy de l'espace de travail et la liaison de compte nulle. catalogues de modèlesVoir Espaces de travail, proxies réseau, audit de gestion, Groupes de ressourceset temps d'exécution de le pool.

Nouveau mode d'utilisation des fichiers de base de données 0600; les répertoires de données nouvellement créés utilisent 0700. Les permissions de répertoire existantes ne sont pas réécrites. La configuration de la base de données utilise une URL de fichier correctement échappée afin que les caractères spéciaux dans le chemin soient pris en charge.

Avant d'introduire des auteurs concurrents ou des travailleurs de longue date, mesurez la discorde au lieu d'augmenter les connexions compte aveuglément.

Les requêtes nommées live under internal/storage/queries/. sqlc.yaml lit le même schéma d'initialisation que l'application intègre, en évitant une copie de schéma tenue séparément. WithTx Les réponses publiques restent des types de domaine, de sorte que les lignes générées ne peuvent pas accidentellement exposer mot de passe ou haches jeton. Schema bootstrap reste SQL explicite dans le stockage. Généré Go est versioné et vérifié avec make generate-check.

HTTP et avoirs

  • C'est une bonne idée. Route des groupes et des enregistrements propres à chaque méthode HTTP expédition; les gestionnaires ne changent pas sur les méthodes de demande ou les chemins de passerelle. Use applique les contrôles de session, de rôle et de porteur avant la manipulation 404/405. Group et With pour la disponibilité, l'origine et la connexion throttling. Les services de domaine restent indépendants de HTTP.
  • Les voies de gestion et les chemins de gestion inconnus conservent l'authentification de l'administrateur. Les paramètres d'authentification et les paramètres de clé personnels sont des exceptions explicites; leurs chemins inconnus reviennent à la protection de l'administrateur. JSON 405 réponses dérivent l'en-tête Autoriser à partir de la table de route de chi. Les actifs statiques sont enregistrés uniquement pour GET/HEAD en dehors de la API les routeurs.
  • La vie ne dépend pas de SQLite; c'est le cas de la préparation.
  • Voies de gestion /api/ exiger une session d'administrateur activée par défaut. Seuls les quatre paramètres d'authentification explicites sont publics; les demandes de changement d'état du navigateur imposent des contrôles d'origine exacts. /api/keys et les /api/me Les itinéraires d'historique, de mot de passe, de limite et d'utilisation acceptent le rôle activé et tirent la propriété de la session. L'historique filtre la propriété dans SQL avant la pagination et cache les identités d'abonnement de la réponse personnelle. /v1 utilise l'authentification séparée de la clé de passerelle pour la découverte du modèle, Responses HTTP/SSE/WebSocket, compactage, Chat Completions et natif Claude Des messages. /v1beta expose native Gemini génération avec la même autorisation et les mêmes services de cycle de vie; voir Protocoles natifs. WebSocket retourne la validité de la clé et l'activation du membre.
  • Système et santé JSON utilisation des réponses Cache-Control: no-store.
  • Le document SPA est revalidé; hashed /assets/ les fichiers peuvent être mis en cache immuablement.
  • Inconnu API retour des routes JSON erreurs (401 avant l'authentification dans le sous-arbre protégé, sinon 404), et les fichiers statiques manquants retournent 404. Ils ne deviennent jamais une réponse HTML réussie.
  • Les en-têtes empêchent le reniflage et le cadrage du MIME et limitent la divulgation de la référent à la même origine.
  • Aucun délai global d’écriture ne s’applique au streaming. La passerelle utilise SUBLANE_GATEWAY_REQUEST_TIMEOUT (30 minutes par défaut), des limites sur les corps, événements et historiques et la propagation de l’annulation.
  • SIGINT/SIGTERM arrête d'accepter de nouveaux travaux et permet jusqu'à dix secondes pour HTTP Arrêt.

Frontière

TanStack Router possède des composants de navigation et charge des pages sur demande. TanStack Query possède un état de demande à distance. Zod valide la réponse du système; la défaillance est affichée comme une erreur avec une action de réessayer plutôt que des données saines fabriquées.

Le sous-ensemble Shadcn Admin fournit la barre latérale et les primitives partagés. SubLane-spécifique et ne contient pas d'enregistrements commerciaux de démonstration. next-themes; utilisation des traductions i18next et react-i18next. L'anglais est la valeur par défaut même dans un navigateur en langue chinoise. Tous les dictionnaires pris en charge doivent inclure les clés anglaises au moment de la compilation. L'anglais et le chinois simplifié sont initialement groupés; les dictionnaires de langue supplémentaires se chargent sur demande.

Les requêtes de gestion ne sont activées que pour les administrateurs, y compris lors des transitions de redirection. Une interface contrôle la navigation et les gardes-routes. Les membres obtiennent une page d'accueil personnelle et des paramètres d'apparence/langue partagés, sans interroger le système ou les données de gestion des membres. Les requêtes de clé personnelle, d'historique des requêtes et d'utilisation incluent l'ID du propriétaire dans leur clé cache et optent pour l'accès aux membres seulement pendant que cette identité reste à jour. Authentification.md.

Limite d'exécution du fournisseur

Instance indépendante à l'échelle de l'instance Codex, Grok et Claude les politiques de version sont gérées uniquement par l'administrateur Paramètres du système sidebar page, séparément des préférences personnelles. internal/versions persiste fournisseur séparé JSON valeurs dans les valeurs existantes settings et fournit un résolveur de version sans verrou à l'adaptateur en amont. Les vérifications de fond bounded suivent les versions officielles stables toutes les six heures par défaut (Codex GitHub des rejets et Grok npm latest dist-tag et Claude Code npm stable dist-tag); les dépassements manuels prennent la priorité. Claude l'inférence capture un immuable SDK configuration de l'exécuteur par version client de sorte que son Utilisateur-Agent, métadonnées de facturation et la signature finale de CCH acceptent; les auditeurs de bootstrap de version temporaire sont fermés et aucune identification entre dans leurs magasins. SQLite - Oui, c'est fini. paramètres du système.

internal/upstream initialise CLIProxyAPI v8.0.35 par l'intermédiaire de son public SDK Pour obtenir les exécuteurs intégrés. La politique de compte d'exécution permet Codex, Claude, Antigravity et Grok Build abonnements et configuration de l'administrateur OpenAI-compatibles API comptes. Pas en amont internal les emballages sont importés. SDK gestionnaire dispose d'un magasin vide, de rejet d'écriture et ne reçoit pas d'enregistrements de compte en direct. Un watcher no-op évite la synchronisation des qualifications basées sur des fichiers. SDK Le cycle de vie commence un cycle de loopback seulement éphémère HTTP auditeur: chaque itinéraire est bloqué, il a un aléatoire séparé API clé, et l'accès à la gestion/panel est désactivé. SubLaneLe mode d'accueil et Redis ne sont pas activés.

SubLane garde le propriétaire durable du cycle de vie. OAuth échange et rafraîchir l'utilisation limited, pincé les paramètres du fournisseur; les identifiants rotatifs sont cryptés et enregistrés avant l'exécution du modèle. SDK l'abonnement Ephemeral auth contient des jetons d'accès et des métadonnées autorisées pour les fournisseurs, jamais des jetons de rafraîchissement, des redéfinitions de fin de gamme importées ou des paramètres de proxy fournis par le client. Les canaux API conservent plateforme et protocole avec la clé chiffrée et l’URL validée. Ils utilisent l’exécuteur SDK public choisi ; Responses utilise l’accès HTTP authentifié public et les traducteurs. La découverte est bornée et suit la configuration, sans supposer un contrat /models universel. Les clés ne passent ni par OAuth ni par le stockage SDK. Les droits de groupe, l’affinité et la comptabilité restent partagés ; la rotation conserve identité et paramètres. Un changement de plateforme, protocole ou URL nécessite un autre canal. Antigravity utilise le public sdk/auth helpers d'autorisation-code et un exécuteur d'exécution explicite rafraîchir l'appel au sein du propriétaire durable. Seul cet appel rafraîchissant reçoit le jeton rafraîchissant; son résultat n'est jamais enregistré dans le SDK gestionnaire. Le transport injecté impose le délai d'appel, les limites de réponse, rediriger le rejet, et les erreurs sanitisées même si le SDK La préparation du projet s'achève également dans ce parcours. SDK Le gestionnaire publie-avant-persiste le comportement; ne le remplacez pas par un gestionnaire non protégé.Inscrivez/Mettre à jour les appels.

Un administrateur d'espace de travail peut lier un compte à un compte chiffré proxy réseau. L'adaptateur en amont sélectionne le proxy du compte côté serveur OAuth échange, rafraîchissement, découverte, lectures d'utilisation et exécution de modèles. SDK call conserve cette sélection même si elle construit un contexte de requête détaché. Les flux en vol restent sur leur connexion originale; changer un proxy ne les réessaye pas ou change d'affinité de compte. La page d'autorisation du navigateur reste en dehors de cette route côté serveur.

Les catalogues de modèles publics utilisent des identifiants natifs sans préfixes de canaux ajoutés, dédoublement entre les fournisseurs. Les demandes sélectionnent les comptes de soutien parmi les fournisseurs admissibles; les demandes explicitement qualifiées restent compatibles. La découverte de modèles persiste dans les instantanés par compte et les regroupe dans la politique de pool actuelle. Inférence sélectionne uniquement les comptes avec des instantanés utilisables pour le modèle demandé. La découverte partagée utilise au plus deux des emplacements en amont existants; les données manquantes restent utilisables jusqu'à 24 heures pendant les opérations de rafraîchissement. Codex utilisation, Claude les fenêtres et Antigravity modèle des quotas dans le cache partagé persisté. Compaction reste Codex- seulement. Porte des fenêtres de quota principal frais Codex et Claude comptes; Antigravity l'admission de quotas ne correspond qu'au modèle natif demandé. La sélection lit les métadonnées persistantes dans sa transaction de politique, tandis que les rafraîchissements partagés restreints s'exécutent à l'extérieur. Voir configuration du fournisseur et détails de la passerelle.

La clé de voûte est générée en fichier 0600 à côté SQLite. Startup vérifie les identifiants cryptés existants en amont, les adresses proxy et personnels APILes sauvegardes doivent préserver la clé à côté de la base de données. Les modifications de l'identification de l'administrateur et de la nouvelle version ont un propriétaire sérialisé; les IO réseau ne fonctionnent jamais à l'intérieur d'une transaction de base de données.

L'affinité est portée à la session de membre, pool et client, avec un auto Il enregistre le modèle normalisé, persiste pendant les redémarrages normaux du processus et expire après 24 heures d'inactivité. Un modèle différent avec un historique portable complet peut remplacer la liaison lorsque le compte original ne le supporte pas; les continuations du fournisseur et les modèles inchangés restent coincés. Comptes désactivés/supprimés et comptes supprimés d'un pool échouent les conversations existantes au lieu de déclencher un changement de compte dangereux. WebSocket transcript state reste connection-local et limité. HTTP previous_response_id est rejeté parce que l'amont HTTP backend est apatride; les appelants doivent fournir une entrée complète.

Les tests automatisés de protocole utilisent des références synthétiques et des en amont faux. Un test opt-in a vérifié Codex CLI 0,152.1 à HTTP/SSE et WebSocket La vérification de l ' abonnement réel et de l ' ordinateur est toujours une étape d ' acceptation distincte, qui n ' exige pas de budget de mémoire ou de débit universel; elle permet de mesurer la charge de travail et la plate-forme de déploiement prévue.

Grok Build l'autorisation utilise des tentatives limitées de code de périphérique lié à la session avec des intervalles de sondage renforcés par le serveur et l'achèvement d'une seule utilisation. Le code de périphérique secret reste sur le serveur; l'annulation et l'expiration empêchent la publication tardive des titres de compétence. SDK l'exécuteur reçoit un OAuth marqueur pour sélectionner le proxy de chat d'abonnement, tout en rafraîchissant utilise des paramètres de jeton xAI épinglés sous le propriétaire de compte durable existant. Grok quota lit les métadonnées officielles de facturation CLI par le même proxy de compte et le cache d'utilisation partagé; seuls les crédits d'abonnement inclus sont normalisés.

Sauvegardes d'instance

La couche de stockage utilise la SQLite sauvegarde en ligne API La couche d'archive charge la base de données, la clé de cryptage et le manifeste avec le streaming IO. Restaurer valide et migre seulement une copie de mise en scène privée, efface les sessions du navigateur et publie un nouveau répertoire sans écraser les chemins existants. Les administrateurs peuvent exporter, vérifier et préparer des restaurations à partir des paramètres du système; un redémarrage de l'opérateur active le répertoire restauré. La préparation d'export/restauration est vérifiée et les opérations de fichiers ne détiennent pas de transaction dans la base de données d'application en direct. Voir sauvegarde et restauration.

Les métadonnées de la limite de modèles sont normalisées dans internal/upstream; les corps d'erreur bruts ne sont pas maintenus ou retournés. La passerelle possède des cooldowns de compte/modèle, des écritures en version conditionnelle, une mémoire d'état actif délimitée et une récupération ordinaire-requête. Antigravity SDK- le refroidissement local est délégué à ce propriétaire, en évitant les minuteries cachées qui peuvent perdre la portée du modèle ou survivre à un cycle de vie d'autorisation.

API gestion des canaux

internal/channels expose un distinct API-contrat de gestion de canal sur le propriétaire d'exécution crypté partagé-ressources. API les canaux; /api/channels Les ID des ressources de stockage restent stables, de sorte que les adhésions existantes, l'affinité et les liaisons clés survivent.

internal/groups possède un abonnement dactylographié / abonnement à la ressource canal et des préférences de routage persistantes. API L'entrée, les catalogues de modèles, la disponibilité, l'état de préparation et la capacité d'alerte partagent la même politique de routage. Les conversations existantes ne sont pas automatiquement déplacées entre les ressources; les changements de modèles explicites avec l'historique portable suivent les règles de routage du modèle de passerelle.