Финальное разделение 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():
- удаление
Originдля same-origin - CORS и allowlist хостов
- pre-auth
/healthи/demoдля разрешенных loopback-конфигураций - логирование доступа
- статические ресурсы Web Shell
- bearer-аутентификация
- rate limit
- парсер тела JSON и маппер ошибок парсера JSON
- post-auth
/healthи/demo, когда это необходимо - телеметрия демона
- группы REST-маршрутов
- HTTP и WebSocket маршруты ACP
- fallback для Web Shell
- финальный обработчик ошибок
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.