Skip to Content
ДизайнФинальное разделение serve server.ts

Финальное разделение serve server.ts

Goal

Продолжить поэтапное разделение packages/cli/src/serve/server.ts без изменения поведения демона. На этом этапе оставшиеся встроенные REST-обработчики, небольшие вспомогательные функции middleware, создание capabilities, настройка реестра device-flow и настройка rate-limiter переносятся в специализированные внутренние модули. createServeApp() остается точкой композиции для состояния демона, порядка middleware, регистрации маршрутов, подключения транспорта ACP, fallback для Web Shell и финальной обработки ошибок.

Middleware And Route Order

Порядок сборки является частью контракта демона и должен оставаться визуально проверяемым в createServeApp():

  1. удаление Origin для same-origin
  2. CORS и allowlist хостов
  3. pre-auth /health и /demo для разрешенных loopback-конфигураций
  4. логирование доступа
  5. статические ресурсы Web Shell
  6. bearer-аутентификация
  7. rate limit
  8. парсер тела JSON и маппер ошибок парсера JSON
  9. post-auth /health и /demo, когда это необходимо
  10. телеметрия демона
  11. группы REST-маршрутов
  12. HTTP и WebSocket маршруты ACP
  13. fallback для Web Shell
  14. финальный обработчик ошибок

Extracted Boundaries

server/self-origin.ts, server/access-log.ts, server/rate-limiter-setup.ts и server/error-handlers.ts содержат небольшие блоки middleware/настройки, которые ранее находились непосредственно в createServeApp(). Они намеренно сделаны тонкими и сохраняют тот же порядок регистрации в server.ts.

server/serve-features.ts содержит список кодов языков, кэш capabilities для распознавания речи и формирование входных данных для конверта анонсируемых функций (feature envelope). Функция инвалидации его кэша по-прежнему вызывается путями перезагрузки/изменения настроек рабочего пространства.

server/device-flow-registry.ts отвечает за регистрацию провайдера Qwen OAuth по умолчанию, подключение event sink, добавление breadcrumbs в stderr для аудита и установку реестра app.locals.

routes/capabilities.ts отвечает за GET /capabilities.

routes/workspace-mcp-control.ts отвечает за мутации перезапуска/управления/добавления/удаления runtime для MCP.

routes/workspace-lifecycle.ts отвечает за /workspace/init и /workspace/reload.

routes/workspace-tools.ts отвечает за /workspace/tools/:name/enable.

Каждый модуль маршрутов получает только необходимые ему зависимости. Ни один из новых модулей не импортирует server.ts, что сохраняет однонаправленность зависимостей и предотвращает циклы.

Remaining In server.ts

server.ts по-прежнему отвечает за создание приложения, каноникализацию bound-workspace, построение bridge/filesystem/workspace, создание mutation gate, упорядочивание маршрутов, подключение ACP HTTP/WebSocket, размещение статики/fallback для Web Shell и экспорт совместимости, используемый существующими вызывающими сторонами.

В этом PR не требуется сокращать размер файла до менее чем 200 строк. Критерий приемки заключается в том, что в нем нет встроенных обработчиков REST-эндпоинтов, и он читается как файл сборки, порядок поведения которого можно проверить в одном месте.

Non-goals

На этом этапе не изменяются тела ответов, коды состояния, заголовки, фреймы SSE, поведение ACP, auth gates, уровни rate-limit, семантика device-flow или таксономия ошибок. Не удаляются shim-файлы совместимости status.ts, event-bus.ts или in-memory-channel.ts. Не происходит переименования исторических документов, не внедряется фреймворк Router и не создается единый god context для маршрутов.

Audit Notes

Раунд 1 проверил границы архитектуры и сохранил существующий паттерн registerXRoutes(app, deps) вместо добавления абстракции Router.

Раунд 2 проверил направление зависимостей и переместил настройку device-flow/runtime за вспомогательные функции, не позволив ни одному модулю маршрутов импортировать server.ts.

Раунд 3 проверил пути обработки ошибок и сохранил поведение маппинга ошибок bridge, ошибок парсера тела JSON, строгих mutation gates и мест вызова валидации client-id.

Раунд 4 проверил совместимость и сохранил публичные экспорты из server.ts для run-qwen-serve.ts, вызывающих сторон ACP HTTP и тестов.

Раунд 5 проверил стратегию тестирования и использует сфокусированные server.test.ts, тесты маршрутов, тесты ACP HTTP, typecheck, build, lint, inline endpoint grep и git diff --check.

Last updated on