SubLaneSubLane

Arquitetura

SubLane Guia: arquitectura.

Execução actual

SubLane é um processo Go com o chi roteamento e um frontend React renderizado pelo cliente. A compilação de produção incorpora os arquivos gerados pelo Vite no executável. SQLite é a única dependência de serviço persistente; o driver é puro Go, por isso as construções de produção não requerem CGO. Consultas de aplicativos usam sqlc-gerado Go over database/sql; sqlc é uma ferramenta de desenvolvimento, não um serviço de execução.

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]

Em desenvolvimento, Vite serve o aplicativo React e proxies /api, /v1 incluindo WebSocket actualizações, /healthz, /readyz para a infra- estrutura Go. Na produção, o navegador e API use a mesma origem e uma porta. Não há serviço Node.js separado, Redis, ou o requisito PostgreSQL.

Propriedade

MóduloPróprioNão possui
cmd/sublaneSinais de processo, inicialização, fiação, desligamentoPolítica de domínio
internal/configAmbiente de processo validadoPreferências persistentes da equipe
internal/backupArquivos em streaming, integridade e validação chave, restaurações isoladas e publicação atômica sem substituiçãoHTTP autenticação, execução do provedor ou substituição de dados ao vivo
internal/alertsConfigurações do webhook do espaço de trabalho, observações de incidentes locais, destinos criptografados, repetições de entrega e recuperaçãoModelo de execução ou autorização do navegador
internal/contentRegras de conteúdo criptografadas na área de trabalho, combinações locais compiladas, verificações de texto decodificadas delimitadas e metadados de correspondência segurosExecução do provedor, solicitação de contabilidade ou autorização do navegador
internal/versionsPersistentes Codex, Grok e Claude políticas de versão, verificação oficial de metadados de lançamento e ciclos de vida de sincronizaçãoSDK execução, credenciais de conta ou instalação binária
internal/timezoneFuso horário de instância persistente e sua localização publicadaFormatação do navegador, contabilidade de uso ou configurações do relógio host
internal/authIdentidades globais de login, senhas e sessõesMembro do espaço de trabalho ou credenciais a montante
internal/tenantsParticipação no espaço de trabalho, funções e ciclo de vidaSenhas globais ou execução do provedor
internal/groupsGrupos de recursos, bolsas de membros, escolhas de agrupamento pessoais e prontidãoCredenciais ou protocolos de modelo
internal/auditMetadados de gerenciamento restritos, contexto de ator, gravação de eventos transacionais e leituras de administradorSolicitar órgãos, credenciais ou autenticação
internal/apikeyMetadados pessoais da chave de gateway, hashes, vinculações imutáveis de pool, revogação e buscaSessões de navegador ou credenciais de upstream
internal/accountsMetadados de assinatura, instantâneos de modelos e revisões do ciclo de vida persistidos, proxies criptografadas de espaço de trabalho e vinculações de contas, ciclo de vida credencial e serialização atualizadaHTTP chaves de envio ou cliente
internal/resetsRegras opcionais, elegibilidade normalizada e prioridade de validade, reservas persistentes de cartão e pedido, limites diários e agendamento limitadoCredenciais e E/S do fornecedor, decisões de elegibilidade do fornecedor ou inferência
internal/vaultCriptografia AES-GCM e carregamento privado de chaves locaisOAuth ou política de conta
internal/oauthLigação da sessão, utilização única OAuth tentativasAutenticação do navegador ou encaminhamento do modelo
internal/upstreamPúblico SDK executores, tradução, troca de fichas, protocolos de provedores e transportes de saída selecionadosFunções da equipa ou propriedade da base de dados
internal/gatewayGateway/conta/admissão de membros, janelas de refrigeração/taxa duradouras, histórico de pedidos e agregados diários, afinidade de contas, instantâneos de quotas e orquestração por solicitaçãoAutorização de gestão pública
internal/storageSQLite ciclo de vida, inicialização do esquema e consulta SQLAutenticação do provedor
internal/storage/dbMétodos de pesquisa gerados e tipos de linha de banco de dadosPolítica de domínio ou público JSON Contratos
internal/serverrotas chi, limites de resposta, SPA servindoPolítica de roteamento/conta futura
web/src/lib/request.tsValidação e cancelamento da respostaApresentação do componente
web/src/localesTextos de UI localizadosDiagnóstico do servidor

Persistência

O banco de dados é executado no modo WAL com chaves estrangeiras habilitadas, um tempo limite de ocupado e uma conexão aberta. Novas instalações aplicam o incorporado 001_schema.sql arquivo de inicialização e migrações aditivas ordenadas, incluindo a tabela proxy de espaço de trabalho e a vinculação da conta nulável. Armazena identidades de login globais e contas com escopo de espaço de trabalho, pools, proxies, chaves, licenças, histórico de pedidos, histórico de uso e registros de auditoria. O primeiro administrador possui um espaço de trabalho. Bancos de dados de pré-lançamento não suportados antigos são rejeitados; preserve sua pasta de dados antes de inicializar um novo. Os catálogos de conjuntos permanecem derivados de instantâneos de contas e política atual; veja catálogos de modelos. Ver espaços de trabalho, proxies de rede, auditoria de gestão, grupos de recursos, pool runtime.

Novos arquivos de banco de dados usam o modo 0600; recém-criado diretórios de dados usar 0700. As permissões de diretório existentes não são reescritas. A configuração do banco de dados usa um URL de arquivo devidamente escapado, então caracteres especiais no caminho são suportados.

As transações devem ser curtas. Não as segure enquanto espera por respostas de rede a montante. Antes de introduzir escritores concorrentes ou trabalhadores de longa duração, meça a contenção em vez de aumentar a conexão conta cegamente.

Consultas com nome ao vivo internal/storage/queries/. sqlc.yaml lê o mesmo esquema de inicialização que o aplicativo incorpora, evitando uma cópia de esquema mantida separadamente. WithTx para vincular os métodos gerados à transação ativa. As respostas públicas permanecem tipos de domínio, de modo que as linhas geradas não podem acidentalmente expor senhas ou hashes de token. O esquema bootstrap permanece SQL explícito no armazenamento. make generate-check.

HTTP e activos

  • chi Route Grupos e registos específicos de métodos próprios HTTP os manipuladores; não alternam os métodos de solicitação ou os caminhos dos gateways. Router- scoped Use aplica sessões, funções e verificações ao portador antes do tratamento 404/405. Group e With para disponibilidade, origem e estrangulamento de login. Os serviços de domínio permanecem independentes HTTP.
  • Rotas de gerenciamento e caminhos de gerenciamento desconhecidos retêm a autenticação do administrador. Os endpoints de autenticação pública e de chaves pessoais são exceções explícitas; seus caminhos desconhecidos são voltados para a proteção do administrador. JSON 405 respostas derivam o cabeçalho Permitir da tabela de rota do chi. Os ativos estáticos são registrados somente para GET/HEAD fora da API Roteadores.
  • A vida não depende de SQLite; a prontidão faz.
  • Rotas de gestão abrangidas /api/ requer uma sessão de administrador habilitada por padrão. Somente os quatro parâmetros de autenticação explícitos são públicos; as requisições de navegador em mudança de estado obrigam a verificar a origem exata. Personal /api/keys e o explícito /api/me histórico, senha, limite e rotas de uso aceitar qualquer papel habilitado e derivar propriedade da sessão. Histórico filtra a propriedade no SQL antes da paginação e esconde identidades de assinatura da resposta pessoal. /v1 usa autenticação de chave de gateway separada para descoberta de modelos, Responses HTTP/SSE/WebSocket, compactação, Chat Completions e nativo Claude Mensagens. /v1beta expõe nativo Gemini geração com a mesma autorização e serviços de ciclo de vida; ver protocolos nativos. WebSocket voltas verificar novamente a validade da chave e habilitação de membro.
  • Sistema e saúde JSON utilização de respostas Cache-Control: no-store.
  • O documento SPA revidates; hashed /assets/ arquivos podem ser armazenados em cache imutavelmente.
  • Desconhecido API retorno das rotas JSON erros (401 antes da autenticação na sub- árvore protegida, caso contrário 404), e arquivos estáticos em falta retornam 404. Eles nunca se tornam uma resposta HTML bem sucedida.
  • Cabeçalhos evitam farejar e enquadrar MIME, e limitam a divulgação de referências para a mesma origem.
  • Não existe um prazo global de escrita para o fluxo. O gateway usa SUBLANE_GATEWAY_REQUEST_TIMEOUT (30 minutos por predefinição), limites de corpos, eventos e histórico e propagação do cancelamento.
  • SIGINT/SIGTERM para de aceitar novos trabalhos e permite até dez segundos para HTTP Desligar.

Frontend

O TanStack Router possui navegação e carrega componentes de página sob demanda. TanStack Query possui o estado de solicitação remota. Zod valida a resposta do sistema; a falha é exibida como um erro com uma ação de repetição ao invés de fabricar dados saudáveis.

O subconjunto de administração do Shadcn fornece a barra lateral e os primitivos compartilhados. As páginas de aplicação são SubLane-específico e não contém registros comerciais demo. As preferências de tema são gerenciadas por next-themes; uso de traduções i18next e react-i18next. O inglês é o padrão, mesmo em um navegador em língua chinesa. Todos os dicionários suportados devem incluir as chaves em inglês no momento da compilação. O inglês e o chinês simplificado são empacotados inicialmente; os dicionários em língua adicional carregam sob demanda. O árabe usa a direção direita para esquerda, enquanto o código e identificadores permanecem da esquerda para a direita.

A porta de autenticação de root espera pelo estado do servidor antes de montar páginas protegidas. As consultas de gestão só estão habilitadas para administradores, incluindo durante as transições de redirecionamento. Uma política de acesso de frontend controla a navegação e os guardas de rota direta. Os membros obtêm uma página pessoal e as configurações de aparência/linguagem compartilhadas, sem consultar o sistema ou dados de gerenciamento de membros. A chave pessoal, o histórico de solicitação e as consultas de uso incluem o ID do proprietário na chave de cache e optam pelo acesso de membro somente enquanto essa identidade permanece atual. A saída cancela as solicitações pendentes, atualiza o estado de autenticação e remove os dados de consulta privada. As sessões usam o HttpOnly cookies em vez de tokens de armazenamento de navegador. O contrato completo do servidor está documentado em autenticação. md.

Limite de execução do provedor

Independent instance-wide Codex, Grok e Claude as políticas de versão são gerenciadas apenas através do administrador Configuração do sistema página da barra lateral, separadamente das preferências pessoais. internal/versions persiste o provedor separado JSON valores no existente settings tabela e fornece um resolvedor de versão sem bloqueio para o adaptador upstream. Verificação de fundo limitada seguir versões oficiais estáveis a cada seis horas por padrão (Codex GitHub libertações e o Grok npm latest dist- tag e Claude Código npm stable dist-tag); sobreposições manuais têm prioridade. Claude a inferência captura uma imutável SDK configuração executor por versão cliente para que seu usuário-Agente, metadados de faturamento e assinatura final CCH concordar; versão temporária bootstrap ouvintes são fechados e nenhuma credenciais entrar em suas lojas. Gateway operações parar antes do serviço de versão e transporte de liberação fechar, e trabalhadores aderir antes SQLite Fecha. configurações do sistema.

internal/upstream inicializa CLIProxiAPI v8.0.35 através de seu público SDK para obter os executores embutidos. A política de conta em tempo de execução permite Codex, Claude, Antigravity e Grok Build assinaturas e configuração do administrador OpenAI- compatível API contas. Sem upstream internal Os pacotes são importados. SDK o gerenciador tem uma loja vazia, de rejeição de gravação e não recebe registros de contas ao vivo. Um observador sem operação evita a sincronização credencial baseada em arquivos. SDK ciclo de vida inicia um ciclo efêmero de loopback HTTP ouvinte: cada rota está bloqueada, tem um aleatório separado API chave, e gerenciamento / acesso de painel está desativado. SubLaneApenas o servidor chi. O modo doméstico e o Redis não estão activados.

SubLane mantém o proprietário do ciclo de vida durável. OAuth trocar e atualizar o uso de terminais de provedores fixos; as credenciais rotacionadas são criptografadas e salvas antes da execução do modelo. SDK A atualização automática é interrompida. A autenticação da assinatura Ephemeral contém tokens de acesso e metadados de provedor permitidos, nunca atualiza tokens, substituições de endpoint importadas ou configurações de proxy fornecidas pelo cliente. Canais API guardam plataforma e protocolo com a chave criptografada e a URL validada. Usam o executor SDK público selecionado; Responses utiliza a interface HTTP autenticada pública e os tradutores. A descoberta é limitada e segue a configuração, sem supor um contrato /models universal. Chaves não entram no OAuth nem no armazenamento SDK. Permissões de grupo, afinidade e contabilidade são mantidas; a rotação preserva identidade e configuração. Alterar plataforma, protocolo ou URL exige outro canal. Antigravity usa público sdk/auth helpers de código de autorização e uma chamada de atualização explícita do executor dentro do proprietário durável. Somente essa chamada de atualização recebe o token de atualização; seu resultado nunca é registrado no SDK gerente. O transporte injetado obriga o prazo do chamador, limites de resposta, redirecionar rejeição e erros higienizados, mesmo se o SDK Detacha o seu contexto de actualização. A preparação do projecto também se completa neste caminho. Este limite evita SDK O comportamento de publicar-antes-persistir do gerente; não substitua-o por um gerenciador desprotegido.Registre-se/Atualize chamadas.

Um administrador de espaço de trabalho pode vincular uma conta a uma criptografada 'proxy' de rede. O adaptador upstream seleciona o proxy da conta para o lado do servidor OAuth troca, atualização, descoberta, leituras de uso e execução do modelo. An SDK A chamada mantém essa seleção mesmo que construa um contexto de requisição desapegado. Os fluxos de voo permanecem na sua conexão original; a alteração de um proxy não os tenta novamente ou altera a afinidade da conta. A página de autorização do navegador permanece fora desta rota do servidor.

Os catálogos de modelos públicos usam IDs nativos sem prefixos de canal adicionados, desduplicados entre os provedores. Solicita que selecione contas de suporte entre os provedores elegíveis; os pedidos legados explicitamente qualificados permanecem compatíveis. A descoberta do modelo persiste nos instantâneos por conta e os agrega na política atual do pool. A inferência seleciona apenas as contas com instantâneos utilizáveis que suportam o modelo solicitado. A descoberta compartilhada usa no máximo dois dos slots upstream existentes; os dados antigos e bem sucedidos permanecem utilizáveis por até 24 horas enquanto uma atualização é executada. Os leitores de quotas normalizam Codex utilização, Claude janelas e Antigravity as licenças do modelo na 'cache' partilhada persistiram. A compactação permanece Codex- Apenas. Portão de janelas de quota principal fresco Codex e Claude Contas; Antigravity A admissão de quota corresponde apenas ao modelo nativo solicitado. As leituras de seleção persistiram metadados dentro da sua transação de política, enquanto as atualizações compartilhadas limitadas foram executadas fora dele. Veja configuração do provedor e detalhes do gateway.

A chave do cofre é gerada como um arquivo 0600 ao lado SQLite. Startup verifica credenciais de upstream criptografadas existentes, endereços proxy e pessoal API- os registos de chaves e as falhas são fechados se a chave estiver em falta ou não corresponder. Eles usam ligações de encriptação autenticadas distintas. As cópias de segurança devem preservar a chave ao lado da base de dados. As alterações de credencial de atualização e de administrador têm um único proprietário serializado; as IO de rede nunca são executadas dentro de uma transacção de banco de dados.

A afinidade é escopo para o membro, pool e sessão de cliente, com um auto O escopo para solicitações nativas e escopos específicos do provedor para solicitações qualificadas legadas. Ele registra o modelo normalizado, persiste em todo o processo normal reinicia e expira após 24 horas de inatividade. Um modelo diferente com histórico portátil completo pode substituir a vinculação quando a conta original não o suporta; continuações do provedor e modelos inalterados permanecem presos. Contas desativadas/apagadas e contas removidas de um pool falham nas conversas existentes em vez de desencadear a troca de contas insegura. WebSocket O estado da transcrição permanece localizado e limitado. HTTP previous_response_id é rejeitado porque o montante HTTP A infra- estrutura é apátrida; as chamadas devem fornecer a entrada completa.

Testes automatizados de protocolo usam credenciais sintéticas e falso upstreams. Um teste de opt-in foi verificado Codex CLI 0,152.1 até HTTP/SSE e WebSocket modos. Assinatura real e verificação de desktop ainda são etapas de aceitação separadas. Nenhuma memória universal ou orçamento de transferência é reivindicada; medir a carga de trabalho e plataforma de implantação pretendida.

Grok Build a autorização usa tentativas de código de dispositivo delimitado e ligado à sessão, com intervalos de votação reforçados pelo servidor e completação de uso único. O código do dispositivo secreto permanece no servidor; o cancelamento e a expiração impedem a publicação tardia da credencial. SDK executor recebe um explícito OAuth marcador para selecionar o proxy de chat da assinatura, enquanto atualizar usa pontos de fim de token xAI fixados sob o proprietário da conta durável existente. Grok quota lê os metadados oficiais de faturamento de CLI através do mesmo proxy de conta e o cache de uso persistente compartilhado; somente os créditos de assinatura incluídos são normalizados.

Cópias de segurança da instância

A camada de armazenamento usa o SQLite backup online API através de uma conexão separada somente leitura com memória de cache delimitada e cópia incremental de página. A camada de arquivo empacota o banco de dados, chave de criptografia e manifesto com streaming IO. Restaurar valida e migra apenas uma cópia de encenação privada, limpa as sessões do navegador e publica um novo diretório sem sobrescrever os caminhos existentes. Os administradores podem exportar, verificar e preparar restaurações das configurações do sistema; um operador reinicial ativa o diretório restaurado. A preparação de exportação/restore é auditada, e as operações de arquivos não realizam uma transação no banco de dados de aplicativos ao vivo. Veja a seção backup e restauração.

Os metadados do modelo- limite são normalizados em internal/upstream; os corpos de erro brutos não são persistidos ou retornados. O gateway possui conta/modelo de resfriamentos, versões condicionais escreve, memória de estado ativo limitado e recuperação de pedido ordinário. Antigravity SDK-refrigeração local é delegada a este proprietário, evitando timers ocultos que podem perder o escopo do modelo ou sobreviver a um ciclo de vida de autorização.

API gestão de canais

internal/channels expõe uma distinção API- contrato de gerenciamento de canais sobre o proprietário de execução-recurso criptografado compartilhado. API canais; /api/channels fornece apenas o ciclo de vida do canal de administrador e gerenciamento de modelos. IDs de recursos de armazenamento permanecem estáveis para que membros existentes, afinidade e ligações de chaves sobrevivam.

internal/groups possui assinatura digitada / associação de recursos de canal e preferências de roteamento persistentes. Novos grupos de UI preferem assinaturas com API A migração preserva a preferência do protocolo existente. A admissão, os catálogos de modelos, a disponibilidade, a prontidão e a capacidade de alerta partilham a mesma política de encaminhamento. As conversas existentes não são movidas entre os recursos automaticamente; as alterações explícitas do modelo com o histórico portátil seguem as regras de encaminhamento do modelo de gateway.