Arquitectura
SubLane guía: arquitectura.
Implementación actual
SubLane es un proceso Go con enrutamiento chi y una interfaz React renderizada por el cliente. La compilación de producción incorpora los archivos generados por Vite en el ejecutable. SQLite es la única dependencia de servicio persistente; el controlador es Go puro, por lo que las versiones de producción no requieren CGO. Las consultas de aplicaciones utilizan el repaso generado por sqlc. database/sql; sqlc es una herramienta de desarrollo, no un servicio de ejecución.
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]En desarrollo, Vite sirve la aplicación React y los servidores proxy /api, /v1 incluyendo WebSocket actualizaciones, /healthz, y /readyz al backend de Go. En producción, el navegador y API usan el mismo origen y un puerto. No existe ningún requisito de servicio Node.js, Redis o PostgreSQL por separado.
Propiedad
| Módulo | posee | no posee |
|---|---|---|
cmd/sublane | Señales de proceso, arranque, cableado, parada. | Política de dominio |
internal/config | Entorno de proceso validado | Preferencias de equipo persistentes |
internal/backup | Archivos transmitidos, integridad y validación de claves, restauraciones aisladas y publicación atómica sin reemplazo | HTTP autenticación, ejecución del proveedor o reemplazo de datos en vivo |
internal/alerts | Configuración de webhook del espacio de trabajo, observaciones de incidentes locales, destinos cifrados, reintentos de entrega y recuperación | Ejecución del modelo o autorización del navegador. |
internal/content | Reglas de contenido del espacio de trabajo cifrado, comparadores locales compilados, comprobaciones de texto decodificado delimitado y metadatos de coincidencia segura | Ejecución del proveedor, contabilidad de solicitudes o autorización del navegador. |
internal/versions | Políticas de versión persistentes Codex, Grok y Claude, comprobaciones de metadatos de lanzamiento oficial y ciclos de vida de sincronización | SDK ejecución, credenciales de cuenta o instalación binaria |
internal/timezone | Zona horaria de instancia persistente y su ubicación publicada | Formateo del navegador, contabilidad de uso o configuración del reloj del host |
internal/auth | Identidades de inicio de sesión, contraseñas y sesiones globales | Membresía en el espacio de trabajo o credenciales ascendentes |
internal/tenants | Membresía, roles y ciclo de vida del espacio de trabajo | Contraseñas globales o ejecución de proveedores |
internal/groups | Grupos de recursos, subvenciones para miembros, opciones de grupos personales y preparación con alcance | Credenciales o protocolos modelo |
internal/audit | Metadatos de gestión delimitados, contexto del actor, escrituras de eventos transaccionales y lecturas del administrador. | Solicitar cuerpos, credenciales o autenticación |
internal/apikey | Metadatos de clave de puerta de enlace personal, hash, enlaces de grupo inmutables, revocación y búsqueda | Sesiones de navegador o credenciales ascendentes |
internal/accounts | Metadatos de suscripción, instantáneas de modelos persistentes y revisiones del ciclo de vida, servidores proxy de espacio de trabajo cifrados y enlaces de cuentas, ciclo de vida de credenciales y serialización de actualización | HTTP claves de despacho o cliente |
internal/resets | Reglas opcionales, elegibilidad normalizada y prioridad de caducidad, reservas persistentes de tarjeta y solicitud, límites diarios y programación acotada | Credenciales, E/S del proveedor, decisiones de elegibilidad del proveedor o inferencia |
internal/vault | Cifrado AES-GCM y carga de clave local privada | OAuth o política de cuenta |
internal/oauth | Intentos de un solo uso OAuth vinculados a sesión | Inicio de sesión del navegador o reenvío de modelo |
internal/upstream | Ejecutores públicos SDK, traducción, intercambio de tokens, protocolos de proveedores y transportes salientes seleccionados | Roles de equipo o propiedad de la base de datos |
internal/gateway | Puerta de enlace/cuenta/admisión de miembros limitada, períodos de recuperación/tasas duraderos, historial de solicitudes y agregados diarios, afinidad de cuentas, instantáneas de cuotas y orquestación por solicitud | Autorización de gestión pública |
internal/storage | SQLite ciclo de vida, inicialización de esquema y consulta SQL | Autenticación de proveedor |
internal/storage/db | Métodos de consulta generados y tipos de filas de bases de datos. | Política de dominio o contratos públicos JSON |
internal/server | rutas chi, límites de respuesta, servicio SPA | Política de cuenta/enrutamiento futuro |
web/src/lib/request.ts | Validación y cancelación de respuesta | Presentación de componentes |
web/src/locales | Cadenas de UI localizadas | Diagnóstico del servidor |
Persistencia
La base de datos se ejecuta en modo WAL con claves externas habilitadas, un tiempo de espera de ocupación limitado y una conexión abierta. Las nuevas instalaciones aplican el embebido. 001_schema.sql archivo de inicialización y migraciones aditivas ordenadas, incluida la tabla de proxy del espacio de trabajo y el enlace de cuenta anulable. Almacena identidades de inicio de sesión globales y cuentas, grupos, servidores proxy, claves, asignaciones, historial de solicitudes, uso y registros de auditoría del ámbito del espacio de trabajo. El primer administrador posee el espacio de trabajo uno. Se rechazan las bases de datos preliminares más antiguas y no compatibles; preservar su directorio de datos antes de inicializar uno nuevo. Los catálogos de grupos siguen derivando de instantáneas de cuentas y políticas actuales; ver catálogos de modelos. Ver espacios de trabajo, servidores proxy de red, auditoría de gestión, grupos de recursos, y tiempo de ejecución del grupo.
Nuevo modo de uso de archivos de base de datos 0600; uso de directorios de datos recién creados 0700. Los permisos de directorio existentes no se reescriben. La configuración de la base de datos utiliza una URL de archivo con escape adecuado, por lo que se admiten caracteres especiales en la ruta.
Las transacciones deben ser breves. No los retenga mientras espera respuestas de la red ascendente. Antes de presentar escritores simultáneos o trabajadores de larga data, mida la contención en lugar de aumentar ciegamente el recuento de conexiones.
Las consultas con nombre se encuentran debajo internal/storage/queries/. sqlc.yaml lee el mismo esquema de inicialización que incorpora la aplicación, evitando una copia del esquema mantenida por separado. Los servicios de dominio conservan la propiedad y el uso de las transacciones WithTx para vincular los métodos generados a la transacción activa. Las respuestas públicas siguen siendo tipos de dominio, por lo que las filas generadas no pueden exponer accidentalmente contraseñas o tokens hashes. El arranque del esquema sigue siendo SQL explícito en el almacenamiento. El Go generado está versionado y verificado con make generate-check.
HTTP y activos
- chi
Routegrupos y registros específicos de métodos despacho propio HTTP; Los controladores no activan los métodos de solicitud ni las rutas de puerta de enlace. Alcance del enrutadorUseaplica controles de sesión, rol y portador antes del manejo 404/405. Usos de autorización públicaGroupyWithpara disponibilidad, origen y limitación de inicio de sesión. Los servicios de dominio siguen siendo independientes de HTTP. - Las rutas de administración y las rutas de administración desconocidas conservan la autenticación del administrador. La autenticación pública y los puntos finales de clave personal son excepciones explícitas; sus rutas desconocidas recurren a la protección del administrador. JSON 405 respuestas derivan el encabezado Permitir de la tabla de rutas de chi. Los activos estáticos se registran solo para GET/HEAD fuera de los enrutadores API.
- La vivacidad no depende de SQLite; la preparación lo hace.
- Rutas de gestión bajo
/api/Requiere una sesión de administrador habilitada de forma predeterminada. Sólo los cuatro puntos finales de autenticación explícita son públicos; Las solicitudes de navegador que cambian de estado imponen comprobaciones exactas del origen. Personal/api/keysy el explícito/api/meEl historial, la contraseña, el límite y las rutas de uso aceptan cualquiera de los roles habilitados y derivan la propiedad de la sesión. El historial filtra la propiedad en SQL antes de la paginación y oculta las identidades de suscripción de la respuesta personal./v1utiliza autenticación de clave de puerta de enlace independiente para el descubrimiento de modelos, Responses HTTP/SSE/WebSocket, compactación, Chat Completions y mensajes nativos Claude./v1betaexpone la generación nativa Gemini con los mismos servicios de autorización y ciclo de vida; ver protocolos nativos. WebSocket vuelve a verificar la validez de la clave y la habilitación de miembros. - Uso de respuestas de sistema y salud JSON
Cache-Control: no-store. - Se revalida el documento SPA; hash
/assets/Los archivos pueden almacenarse en caché de forma inmutable. - Las rutas desconocidas API devuelven errores JSON (401 antes de la autenticación en el subárbol protegido; de lo contrario, 404) y los archivos estáticos faltantes devuelven 404. Nunca se convierten en una respuesta HTML exitosa.
- Los encabezados evitan el rastreo y el encuadre de MIME, y limitan la divulgación de la referencia al mismo origen.
- No hay un tiempo de escritura global para el streaming. El gateway usa
SUBLANE_GATEWAY_REQUEST_TIMEOUT(30 minutos por defecto), límites de cuerpos, eventos e historial y propagación de cancelaciones. - SIGINT/SIGTERM deja de aceptar nuevos trabajos y permite hasta diez segundos para el apagado HTTP.
Interfaz
TanStack Router posee navegación y carga componentes de página según demanda. TanStack Query posee el estado de solicitud remota. Zod valida la respuesta del sistema; El error se muestra como un error con una acción de reintento en lugar de datos en buen estado fabricados.
El subconjunto Shadcn Admin proporciona la barra lateral y las primitivas compartidas. Las páginas de la aplicación son SubLane específicas y no contienen registros comerciales de demostración. Las preferencias del tema son administradas por next-themes; traducciones uso i18next y react-i18next. El inglés es el predeterminado incluso en un navegador de idioma chino. Todos los diccionarios compatibles deben incluir las claves de inglés en el tiempo de compilación. El inglés y el chino simplificado se agrupan inicialmente; los diccionarios adicionales de idioma cargan bajo demanda. El árabe utiliza la dirección derecha a izquierda, mientras que los códigos y identificadores siguen siendo de izquierda a derecha.
La puerta de entrada de raíz espera para el estado del servidor antes de montar páginas protegidas. Las consultas de gestión sólo están habilitadas para administradores, incluso durante transiciones redirigidas. Una política de acceso de frontend controla la navegación y los guardias de ruta directa. Los miembros obtienen una página personal y ajustes de apariencia/idio compartidos, sin necesidad de consultar el sistema o los datos de gestión de miembros. autenticación.md.
Límite de ejecución del proveedor
Casos independientes en todo el mundo Codex, Grok y Claude las políticas de versión se gestionan a través del administrador solo Configuración del sistema página de barra lateral, separadamente de las preferencias personales. internal/versions persiste el proveedor separado JSON valores existentes settings mesa y proporciona un resolución de versión sin bloqueo al adaptador de corriente. Las comprobaciones de fondo sonda siguen las versiones oficiales estables cada seis horas por defecto (por defecto)Codex GitHub liberaciones y Grok npm latest dist-tag y Claude Código npm stable dist-tag); las anulaciones manuales tienen prioridad. Claude inferencia captura un inmutable SDK configuración del ejecutor por versión cliente para que sus metadatos de facturación y acuerdo final de firma de CCH; los oyentes de arranque de versión temporal estén cerrados y no hay credenciales en sus tiendas. Las operaciones de gateway se detienen antes de cerrar el servicio de versión y el transporte de liberación, y los trabajadores se unen antes SQLite cierra. Ajustes del sistema.
internal/upstream inicializa CLIProxyAPI v8.0.35 a través de su público SDK para obtener los ejecutores incorporados. Codex, Claude, Antigravity y Grok Build suscripciones y administrador-configurado OpenAI-compatible API cuentas, no aguas arriba internal Los paquetes son importados. SDK El gerente tiene una tienda vacía, de reelección de escritura y no recibe registro de cuenta en vivo. Un reloj no-op evita la sincronización credencial basada en archivos. SDK el ciclo de vida comienza una efímera sola HTTP oyente: cada ruta está bloqueada, tiene un azar separado API clave, y el acceso de gestión/panel está desactivado. SubLane’s chi server only. Modo de inicio y Redis no están habilitados.
SubLane mantiene al propietario del ciclo de vida duradero. OAuth intercambio y refrescar el uso de endpoints de proveedores conectados y marcados; las credenciales rotadas se cifran y se guardan antes de la ejecución del modelo. SDK Se detiene el refresco automático. Auth de suscripción efímera contiene tokens de acceso y metadatos de proveedores permitidos, tokens nunca refrescantes, overrides de endpoint importados, o configuración de proxy suministrada por el cliente. Los canales API guardan plataforma y protocolo con la clave cifrada y la URL validada. Usan el ejecutor SDK público seleccionado; Responses usa la ruta HTTP autenticada pública y los traductores. La búsqueda está acotada y sigue la configuración, sin asumir un contrato universal /models. Las claves no entran en OAuth ni en el almacén SDK. Se conservan permisos de grupo, afinidad y contabilidad; la rotación mantiene ID y configuración. Cambiar plataforma, protocolo o URL requiere otro canal. Antigravity usos públicos sdk/auth los ayudantes de código de autorización y una llamada de actualización explícita del ejecutante dentro del propietario duradero. Sólo esa llamada de actualización recibe el token refrescante; su resultado nunca se registra en el SDK manager. El transporte inyectado hace cumplir el plazo de llamada, los límites de respuesta, el rechazo redireccionado y los errores sanitarios incluso si el SDK Detiene su contexto de actualización. La preparación del proyecto también completa dentro de este camino. SDK El comportamiento publicista-antes-persista del administrador; no lo sustituya por el administrador no vigilado.
Un administrador del espacio de trabajo puede vincular una cuenta a una cifrada red proxy. El adaptador de corriente superior selecciona el proxy de la cuenta para servidor-side OAuth intercambio, refresco, descubrimiento, lecturas de uso y ejecución de modelo. SDK call conserva esa selección incluso si construye un contexto de solicitud desprendido. Los flujos de vuelo permanecen en su conexión original; cambiar un proxy no los retrata o cambiar la afinidad de la cuenta. La página de autorización del navegador permanece fuera de esta ruta lado del servidor.
Los catálogos de modelos públicos utilizan IDs nativas sin prefijos de canales añadidos, deduplicados entre proveedores. Las solicitudes de soporte selectas en proveedores elegibles; las solicitudes de calificación heredadas siguen siendo compatibles. El descubrimiento modelo persiste instantáneas por cuenta propia y las agrega dentro de la actual política de el pool. Inferencia selecciona sólo cuentas con instantáneas utilizables que apoyan el modelo solicitado. Codex uso, Claude ventanas y Antigravity franquicias modelo en el caché persistente compartido. Codex- sólo. Puerta de las ventanas de cuota principal Codex y Claude cuentas; Antigravity La admisión de cuotas coincide con el modelo nativo solicitado. La selección lee metadatos persistidos dentro de su transacción de política, mientras que los refrescos compartidos atados funcionan fuera de ella. Configuración del proveedor y detalles de la puerta de entrada.
La clave del almacén se genera como un archivo 0600 junto a SQLite. El inicio verifica las credenciales ascendentes cifradas existentes, las direcciones de proxy y los registros de claves personales API y no se cierra si la clave falta o no coincide. Utilizan enlaces de cifrado autenticados distintos. Las copias de seguridad deben preservar la clave junto con la base de datos. Las actualizaciones y los cambios de credenciales de administrador tienen un propietario serializado; La E/S de red nunca se ejecuta dentro de una transacción de base de datos.
La afinidad tiene como ámbito el miembro, el grupo y la sesión del cliente, con uno auto alcance para solicitudes nativas y alcances específicos del proveedor para solicitudes calificadas heredadas. Registra el modelo normalizado, persiste durante los reinicios normales del proceso y caduca después de 24 horas de inactividad. Un modelo diferente con historial portátil completo podrá reemplazar la encuadernación cuando la cuenta original no lo admita; Las continuaciones de proveedores y los modelos sin cambios permanecen inmovilizados. Las cuentas deshabilitadas/eliminadas y las cuentas eliminadas de un grupo fallan en las conversaciones existentes en lugar de desencadenar un cambio de cuenta inseguro. WebSocket el estado de la transcripción permanece en la conexión local y acotada. HTTP anterior_response_id se rechaza porque el backend ascendente HTTP no tiene estado; las personas que llaman deben proporcionar información completa.
Las pruebas de protocolo automatizadas utilizan credenciales sintéticas y flujos ascendentes falsos. Una prueba de inclusión ha verificado los modos Codex CLI 0.152.1 a través de HTTP/SSE y WebSocket. La suscripción real y la verificación de escritorio siguen siendo pasos de aceptación separados. No se afirma ninguna memoria universal ni presupuesto de rendimiento; medir la carga de trabajo prevista y la plataforma de implementación.
Grok Build La autorización utiliza intentos de código de dispositivo limitados y vinculados a sesiones con intervalos de sondeo aplicados por el servidor y finalización de un solo uso. El código secreto del dispositivo permanece en el servidor; la cancelación y el vencimiento evitan la publicación tardía de las credenciales. El ejecutor de xAI SDK recibe un marcador explícito OAuth para seleccionar el proxy de chat de suscripción, mientras que la actualización utiliza puntos finales de token xAI anclados bajo el propietario de la cuenta duradera existente. Grok la cuota lee los metadatos de facturación CLI oficiales a través del mismo proxy de cuenta y caché de uso persistente compartido; Sólo se normalizan los créditos de suscripción incluidos.
Copias de seguridad de instancias
La capa de almacenamiento utiliza la SQLite copia de seguridad en línea API a través de una conexión separada de solo lectura con memoria caché limitada y copia incremental de páginas. La capa de archivo empaqueta la base de datos, la clave de cifrado y el manifiesto con IO de transmisión. Restaurar valida y migra solo una copia provisional privada, borra las sesiones del navegador y publica un nuevo directorio sin sobrescribir las rutas existentes. Los administradores pueden exportar, verificar y preparar restauraciones desde la configuración del sistema; un reinicio del operador activa el directorio restaurado. La preparación de exportación/restauración se audita y las operaciones de archivos no retienen una transacción en la base de datos de la aplicación en vivo. Ver copia de seguridad y restauración.
Los metadatos del límite del modelo están normalizados en internal/upstream; Los cuerpos de error sin procesar no persisten ni se devuelven. La puerta de enlace posee tiempos de reutilización de cuenta/modelo, escrituras versionadas condicionales, memoria de estado activo limitada y recuperación de solicitudes ordinarias. Antigravity SDK -La refrigeración local se delega a este propietario, lo que evita temporizadores ocultos que pueden perder el alcance del modelo o sobrevivir al ciclo de vida de una autorización.
API gestión de canales
internal/channels expone un contrato de administración de canal API distinto sobre el propietario del recurso de ejecución cifrado compartido. El listado de suscripciones excluye API canales; /api/channels proporciona gestión de modelos y ciclo de vida del canal solo para administradores. Los ID de recursos de almacenamiento permanecen estables para que sobrevivan las membresías, afinidades y combinaciones de claves existentes.
internal/groups posee membresía de recursos de canal/suscripción escrita y preferencias de enrutamiento persistentes. Los nuevos grupos de UI prefieren suscripciones con API reserva; la migración preserva la preferencia de protocolo existente. La admisión, los catálogos de modelos, la disponibilidad, la preparación y la capacidad de alerta comparten la misma política de enrutamiento. Las conversaciones existentes no se mueven automáticamente entre recursos; Los cambios explícitos del modelo con historial portátil siguen las reglas de enrutamiento del modelo de puerta de enlace.