SubLaneSubLane

Архитектура

SubLane Руководство: Архитектура.

Текущее осуществление

SubLane Это один процесс Go с маршрутизацией chi и фронтендом React, выполненным клиентом. Производственная сборка встраивает сгенерированные файлы Vite в исполняемый файл. SQLite Это единственная постоянная зависимость от сервиса; драйвер - это чистый Go, поэтому производственные сборки не требуют CGO. database/sql; sqlc - это инструмент разработки, а не служба выполнения.

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]

В разработке Vite обслуживает приложение React и прокси /api, /v1 включая WebSocket модернизация, /healthzи /readyz В производстве, браузере и на заднем плане. API Использование одного и того же источника и одного порта. Отдельного сервиса Node.js, Redis или PostgreSQL не требуется.

Собственность

МодульСобственникине является собственным
cmd/sublaneСигналы процесса, запуск, проводка, отключениеПолитика в области доменов
internal/configПроверенная среда процессаПостоянные командные предпочтения
internal/backupПотоковые архивы, целостность и валидация ключей, изолированные реставрации и атомная публикация без заменыHTTP аутентификация, исполнение провайдером или замена живых данных
internal/alertsНастройки Webhook рабочего пространства, локальные наблюдения за инцидентами, зашифрованные пункты назначения, повторные попытки доставки и восстановлениеВыполнение модели или авторизация браузера
internal/contentЗашифрованные правила содержимого рабочего пространства, скомпилированные локальные совпадения, ограниченные проверки декодированного текста и безопасные метаданные соответствияВыполнение поставщика, учет запросов или авторизация браузера
internal/versionsстойкий Codex, Grok и Claude политики версий, официальные проверки метаданных выпуска и жизненные циклы синхронизации;SDK выполнение, учетные данные учетной записи или бинарные установки
internal/timezoneВременной пояс с промежуточной инстанцией и его опубликованное местоположениеФорматирование браузера, учет использования или настройки часов хоста
internal/authГлобальные идентификаторы входа, пароли и сеансыЧленство в рабочем пространстве или учетные данные выше по течению
internal/tenantsЧленство в рабочем пространстве, роли и жизненный циклГлобальные пароли или исполнение провайдера
internal/groupsпулы счетов, права доступа участников, личный выбор пула и сфера готовностиПолномочия или типовые протоколы
internal/auditСвязанные метаданные управления, актерский контекст, транзакционное событие пишет и администратор читаетЗапрос органов, учетных данных или аутентификации
internal/apikeyПерсональные метаданные ключа шлюза, хэши, неизменяемые привязки пула, отзыв и поискБраузерные сессии или учетные данные upstream
internal/accountsМетаданные подписки, постоянные снимки моделей и пересмотры жизненного цикла, зашифрованные прокси-серверы рабочего пространства и привязки учетных записей, жизненный цикл учетных данных и сериализация обновленияHTTP Отправка или ключи клиента
internal/resetsНеобязательные правила, нормализованная пригодность и порядок сроков, постоянное резервирование карты и запроса, дневные лимиты и ограниченное планированиеУчётные данные и ввод-вывод провайдера, решения провайдера о допустимости или инференс
internal/vaultШифрование AES-GCM и загрузка приватного локального ключаOAuth или учетная политика
internal/oauthСеанс-связанный, одноразовый OAuth попыткиЛогин браузера или пересылка модели
internal/upstreamПубличное SDK исполнители, перевод, обмен токенами, протоколы провайдеров и выбранные исходящие перевозкиКомандные роли или владение базой данных
internal/gatewayСвязанные шлюзы / учетные записи / вход в члены, долговечные окна охлаждения / ставки, история запросов и ежедневные агрегаты, близость к учетной записи, снимки квот и оркестровка по запросуРазрешение на государственное управление
internal/storageSQLite жизненный цикл, инициализация схемы и запрос SQLАутентификация провайдера
internal/storage/dbСгенерированные методы запросов и типы строк баз данныхПолитика домена или общественная JSON контракты
internal/serverмаршруты, границы ответов, SPA-обслуживаниеБудущая политика маршрутизации/учета
web/src/lib/request.tsПроверка ответа и аннулированиеПрезентация компонентов
web/src/localesЛокализованные UI строкиДиагностика серверов

настойчивость

База данных работает в режиме WAL с включенными иностранными ключами, ограниченным временем ожидания и одним открытым подключением. Новые установки применяют встроенные 001_schema.sql Файл инициализации и упорядоченные аддитивные миграции, включая таблицу прокси-серверов рабочего пространства и привязку к нулевой учетной записи. Он хранит глобальные идентификаторы входа в систему и учетные записи, связанные с рабочим пространством, пулы, прокси-серверы, ключи, квоты использования, историю запросов, использование и аудиторские записи. Первый администратор владеет рабочим пространством. Старые неподдерживаемые базы данных предварительного выпуска отклоняются; сохраняют свой каталог данных до инициализации свежего. Каталоги пулов остаются производными от снимков учетной записи и текущей политики; см. каталоги моделейВидишь? рабочие места, Сетевые прокси, управленческий аудит, Ресурсные группыи Пул Runtime.

Новые файлы баз данных используют режим 0600• использование вновь созданных каталогов данных 0700Существующие разрешения каталогов не переписываются. Конфигурация базы данных использует правильно удаленный URL-адрес файла, поэтому поддерживаются специальные символы в пути.

Транзакции должны оставаться короткими. Не удерживайте их, ожидая ответов сети. Перед тем, как представить одновременных авторов или долгосрочных работников, измеряйте споры вместо того, чтобы слепо увеличивать количество подключений.

Названные запросы живут под internal/storage/queries/. sqlc.yaml читает ту же схему инициализации, которую встраивает приложение, избегая отдельно поддерживаемой копии схемы. WithTx Публичные ответы остаются типами доменов, поэтому генерируемые строки не могут случайно разоблачить хэши паролей или токенов. Загрузочный штрих Schema остается явным SQL в хранилище. Generated Go версия и проверка make generate-check.

HTTP и активы

  • Чи Route собственные группы и методические регистрации HTTP отправка; обработчики не включают методы запроса или пути шлюза. Use Применяет сеанс, роль и проверку на предъявителя перед обработкой 404/405. Group и With для доступности, происхождения и дросселирования входа.Доменные услуги остаются независимыми от HTTP.
  • Маршруты управления и неизвестные пути управления сохраняют аутентификацию администратора. Публичный аутентификация и личные ключевые конечные точки являются явными исключениями; их неизвестные пути возвращаются к защите администратора. JSON 405 ответов получают заголовк Allow из таблицы маршрутов chi. Статические активы регистрируются только для GET/HEAD вне таблицы маршрутов. API роутеры.
  • Жизнь не зависит от SQLiteГотовность делает.
  • Маршруты управления под /api/ Только четыре явные конечные точки auth являются общедоступными; запросы браузера, изменяющие состояние, обеспечивают точную проверку происхождения. /api/keys и явно выраженный /api/me История, пароль, лимит и маршруты использования принимают либо включенную роль, либо получают право собственности от сессии.История фильтрует право собственности в SQL перед началом и скрывает идентификаторы подписки от личного ответа. /v1 использует отдельную аутентификацию ключа шлюза для обнаружения модели; Responses HTTP/SSE/WebSocketУплотнение, Chat Completions родной Claude Сообщения. /v1beta Разоблачение родного Gemini генерация с одинаковым разрешением и жизненным циклом; см. родные протоколы. WebSocket перепроверяет валидность ключа и включение члена.
  • Система и здоровье JSON Реакции используют Cache-Control: no-store.
  • Документ СПА повторно подтвержден; хешируется /assets/ Файлы могут быть кэшированы неизменяемо.
  • неизвестный API Маршруты возвращаются JSON Ошибки (401 до аутентификации в защищенном поддереве, иначе 404) и отсутствующие статические файлы возвращают 404. Они никогда не становятся успешным HTML-ответом.
  • Заголовки предотвращают обнюхивание и обрамление MIME и ограничивают раскрытие реферера тем же происхождением.
  • У потоковой передачи нет общего тайм-аута записи. Шлюз применяет SUBLANE_GATEWAY_REQUEST_TIMEOUT (по умолчанию 30 минут), ограничения тел, событий и истории и распространение отмены.
  • SIGINT/SIGTERM прекращает прием новых работ и позволяет до десяти секунд для работы. HTTP Отключение.

Фронтен

TanStack Router владеет навигацией и загружает компоненты страницы по требованию. TanStack Query владеет состоянием удаленного запроса. Zod проверяет системный ответ; сбой отображается как ошибка с повторным действием, а не сфабрикованными здоровыми данными.

Подмножество Shadcn Admin предоставляет боковую панель и общие примитивы. SubLane-конкретный и не содержит демо-записей. Предпочтения по теме управляются next-themes; переводы используют i18next и react-i18next.Английский язык является стандартным даже в браузере на китайском языке. Все поддерживаемые словари должны включать английские ключи во время компиляции. Английский и упрощенный китайский языки упакованы изначально; дополнительные языковые словари загружаются по требованию. Арабский язык использует право-левое направление, в то время как код и идентификаторы остаются слева направо.

Корневой ворот auth ждет состояния сервера перед установкой защищенных страниц. Запросы управления активируются только для администраторов, в том числе во время переходов перенаправления. Одна политика доступа интерфейса контролирует навигацию и охрану прямого маршрута. Члены получают личную домашнюю страницу и общие настройки внешнего вида/языка, без запроса системы или данных управления членом. Личный ключ, запрос истории запроса и запросы использования включают идентификатор владельца в свой ключ кэша и выбирают доступ к члену только в то время, когда эта личность остается актуальной. Выход отменяет непогашенные запросы, обновляет состояние auth и удаляет данные частного запроса. Сеансы используют файлы cookie HttpOnly, а не маркеры хранения браузера. Полный контракт сервера документирован в Аутентификация.md.

Граница исполнения провайдера

Независимая инстанция в целом Codex, Grok и Claude Политики версий управляются только администратором. Системные настройки Страница боковой панели, отдельно от личных предпочтений. internal/versions Отдельный провайдер JSON Значения в существующих settings таблица и поставляет свободный от блокировок разрешитель версий на адаптер верхнего потока. Ограниченные проверки фона следуют за официальными стабильными релизами каждые шесть часов по умолчанию (Codex GitHub Освобождение и The Grok нпм latest дистэг и Claude Код npm stable Dist-tag; ручные надстройки имеют приоритет. Claude Вывод захватывает неизменяемый SDK Конфигурация исполнителя на клиентскую версию так что его пользователь-агент, выставление счетов метаданных и окончательное подписание CCH согласуются; временные слушатели загрузочного штриха версии закрыты и никакие учетные данные не входят в их магазины. Операции шлюза останавливаются до закрытия службы версии и выпуска транспорта, а работники присоединяются до того, как они закроются. SQLite Закрывается. Системные настройки.

internal/upstream инициализирует CLIProxyAPI v8.0.35 через свою публикацию SDK для получения встроенных исполнителей. Разрешение на использование учетной записи Runtime Codex, Claude, Antigravity и Grok Build подписки и сконфигурированный администратор OpenAI-совместимый API Никаких счетов. internal Упаковки импортируются. SDK Менеджер имеет пустой магазин, отклоняющий запись, и не получает регистрации в реальном времени. Наблюдатель без операции избегает синхронизации учетных данных на основе файлов. SDK Жизненный цикл начинается с эфемерной обратной связи HTTP слушатель: каждый маршрут заблокирован, в нем есть отдельный случайный API ключ, и доступ к управлению/панели отключен. SubLaneДомашний режим и Redis не включены.

SubLane Сохраняет долговечный жизненный цикл владельца. OAuth Обмен и использование обновлений ограниченных, прикрепленных конечных точек провайдера; повернутые учетные данные шифруются и сохраняются перед выполнением модели. SDK Эфемерная подписка auth содержит токены доступа и разрешенные метаданные провайдера, никогда не обновляйте токены, импортированные переопределения конечных точек или настройки прокси-сервера, предоставляемые клиентом. Каналы API хранят платформу и протокол вместе с зашифрованным ключом и проверенным URL. Используется выбранный публичный исполнитель SDK; для Responses — публичный аутентифицированный HTTP-интерфейс и преобразователи. Обнаружение ограничено и учитывает настройки, а не единый контракт /models. Ключи не попадают в OAuth или хранилище SDK. Сохраняются права группы, привязка диалогов и учёт; ротация сохраняет ID и настройки. Смена платформы, протокола или URL требует нового канала. Antigravity использует публичные sdk/auth Помощники кода авторизации и явный вызов исполнителя на обновление в пределах длительного владельца. Только этот вызов на обновление получает токен обновления; его результат никогда не регистрируется в SDK Вводимый транспорт обеспечивает соблюдение крайнего срока вызова, пределов ответа, отклонения перенаправления и исправленных ошибок, даже если SDK Подготовка проекта также завершается в рамках этого пути. Эта граница позволяет избежать SDK Поведение менеджера до публикации; не заменяйте его неохраняемым менеджером.

Администратор рабочего пространства может привязать учетную запись к одной зашифрованной сетевой проксиАдаптер верхнего потока выбирает прокси учетной записи на стороне сервера OAuth Обмен, обновление, открытие, использование считывается и выполнение модели. SDK Call сохраняет этот выбор, даже если он создает отдельный контекст запроса. Потоки в полете остаются на своем первоначальном соединении; изменение прокси не повторяет их или не изменяет аффинити учетной записи. Страница авторизации браузера остается за пределами этого маршрута на стороне сервера.

Публичные каталоги моделей используют собственные идентификаторы без добавленных префиксов каналов, дублируются между поставщиками. Запросы выбирают вспомогательные учетные записи между подходящими поставщиками; устаревшие явно квалифицированные запросы остаются совместимыми. Открытие модели сохраняется для снимков с каждой учетной записи и объединяет их в рамках текущей политики пула. Inference выбирает только учетные записи с пригодными для использования снимками, поддерживающими запрашиваемую модель. Совместное открытие использует не более двух существующих слотов для восходящего потока; устаревшие успешные данные остаются пригодными для использования до 24 часов, пока выполняется обновление. Считыватели квоты нормализуют Codex использование, Claude окна и Antigravity Модельные квоты использования в совместно используемом сохраняемом кэше. CodexСвежие окна основной квоты Codex и Claude счета; Antigravity Прием квоты соответствует только запрашиваемой родной модели. Отбор считывает сохраняющиеся метаданные внутри своей политической транзакции, в то время как ограниченные общие обновления выходят за ее пределы. настройка провайдера и детали шлюза.

Клавиша хранилища генерируется в виде файла 0600 SQLiteСтартап проверяет существующие зашифрованные учетные данные, прокси-адреса и личные API- ключевые записи и не закрывается, если ключ отсутствует или несоответствует. Они используют различные аутентифицированные связывания шифрования. Резервное копирование должно сохранять ключ рядом с базой данных. Обновление и изменения учетных данных администратора имеют одного серийного владельца; сетевой IO никогда не работает внутри транзакции базы данных.

Аффинити относится к члену, пулу и клиентской сессии, с одним auto В нем фиксируется нормализованная модель, сохраняется при нормальном перезапуске процесса и истекает через 24 часа бездействия. Другая модель с полной переносной историей может заменить связывание, когда исходная учетная запись не поддерживает его; продолжения провайдера и неизмененные модели остаются прикрепленными. Отключенные / удаленные учетные записи и учетные записи, удаленные из пула, не срабатывают в существующих разговорах вместо того, чтобы вызвать небезопасное переключение учетной записи. WebSocket Состояние транскрипта остается локальным и ограниченным. HTTP Предыдущая_response_id отклоняется, поскольку выше по течению HTTP Backend не имеет статуса; абоненты должны предоставить полный вход.

Автоматизированные протокольные тесты используют синтетические учетные данные и поддельные восходящие потоки. Codex CLI 0.152.1 до HTTP/SSE и WebSocket Реальная подписка и проверка рабочего стола по-прежнему являются отдельными шагами принятия. Универсальная память или бюджет пропускной способности не требуются; измеряйте предполагаемую рабочую нагрузку и платформу развертывания.

Grok Build авторизация использует ограниченные, связанные с сеансом попытки кода устройства с серверными интервалами опроса и завершением одноразового использования. Секретный код устройства остается на сервере; отмена и истечение срока действия предотвращают поздную публикацию учетных данных. SDK Исполнитель получает явное OAuth Маркер для выбора подписки чат прокси, в то время как обновление использует прикрепленные xAI токены конечных точек под существующей долговечной учетной записи владельца. Grok Квота считывает официальные метаданные выставления счетов CLI через тот же прокси-сервер учетной записи и общий кэш постоянного использования; нормализуются только включенные абонентские кредиты.

Резервное копирование

Слой хранения использует SQLite онлайн резервное копирование API через отдельное соединение только для чтения с ограниченной кэш-памятью и инкрементным копированием страниц. Архивный слой упаковывает базу данных, ключ шифрования и манифест с потоковым IO. Восстановление проверяет и мигрирует только приватную постановочную копию, очищает сеансы браузера и публикует новый каталог без перезаписи существующих путей. Администраторы могут экспортировать, проверять и готовить восстановления из настроек Системы; оператор перезапуска активирует восстановленный каталог. Подготовка к экспорту/восстановлению проверяется, а операции с файлами не проводят транзакцию в базе данных живых приложений. См. Резервное копирование и восстановление.

Модели-ограниченные метаданные нормализуются в internal/upstream; необработанные тела ошибок не сохраняются и не возвращаются. шлюз владеет охлаждением учетной записи / модели, условными версиями записей, ограниченной памятью активного состояния и восстановлением обычного запроса. Antigravity SDKМестное охлаждение делегируется этому владельцу, избегая скрытых таймеров, которые могут потерять область применения модели или пережить жизненный цикл авторизации.

API Управление каналами

internal/channels Обнаружены различные API- контракт на управление каналами, заключенный с владельцем зашифрованного исполнительного ресурса. API каналы; /api/channels Идентификаторы ресурсов хранения остаются стабильными, поэтому существующие членства, аффинити и ключевые привязки выживают.

internal/groups Владеет типизированной подпиской / членством в ресурсе канала и постоянными предпочтениями маршрутизации. Новые группы пользовательского интерфейса предпочитают подписки с API Откат; миграция сохраняет существующие протокольные предпочтения. Прием, каталоги моделей, доступность, готовность и мощность оповещения разделяют одну и ту же политику маршрутизации. Существующие разговоры не перемещаются между ресурсами автоматически; явные изменения модели с переносной историей следуют правилам маршрутизации шлюза.