[E10 umbrella] Runtime Federation для backend-расширений (10.1+10.2+10.2b+10.3) #71

Closed
claude wants to merge 0 commits from feat/E10-1-federation-subgraph into apps-catalog
Owner

Зонтичный PR на Epic 10 — Runtime Federation для backend-расширений каталога приложений.

Что внутри

Story 10.1 — coopback → ApolloFederationDriver (subgraph mode) [f6b5c01]

  • driver: ApolloDriver → ApolloFederationDriver
  • autoSchemaFile: { path, federation: 2 }
    • @apollo/subgraph ^2
  • Endpoint /v1/graphql сохранён, non-federated клиенты не сломаны.

Story 10.2 — @coopenomics/extension-sdk [883e597]

  • ExtensionFederationModule.forRoot() — готовый GraphQLModule с federation v2
  • ExtensionAuthModule.forRoot({ secret }) — passport-jwt
  • ExtensionJwtAuthGuard для GraphQL resolver'ов
  • SharedCooperator/Cooperative/Account stub'ы (@key + @external) для cross-extension references
  • HealthController GET /_health
  • loadExtensionConfig — fail-fast env loader
  • Templates: Dockerfile (multi-stage + wget healthcheck) + docker-compose.snippet.yaml

Story 10.2b — extension-hello-subgraph PoC [68b9156]

  • Минимальный subgraph на extension-sdk доказывает работу всего стека.
  • Smoke: GET /_health → 200; helloFromExtension query работает; _service { sdl } возвращает federation v2 SDL.

Story 10.3 — gateway-orchestrator [8ea8bce]

  • Отдельный per-tenant Nest-сервис: Apollo Gateway + REST orchestrator API + Postgres registry.
  • Apollo Federation Gateway (ApolloGatewayDriver) на /v1/graphql с IntrospectAndCompose + JWT forwarding.
  • REST: POST install / DELETE uninstall / POST composition refresh / GET composition status.
  • Bootstrap seed'ит core-subgraph (coopback) в registry, дальше extensions добавляются через REST.

Архитектура

См. apps-catalog/docs/epics/E10-federation-runtime.md (ветка docs/E10-federation-runtime) и blago req 8b-architecture-v3-runtime-federation-dlya-backend-rasshireniy.

Что НЕ в этом PR

  • 10.3b: dynamic supergraph composition без рестарта (custom SupergraphManager)
  • 10.4: реальный docker pull + healthcheck pipeline (orchestrator).
  • 10.5: on-chain auto-update watcher.
  • 10.6: CA-auth OCI token protocol для docker pull.
  • 10.7: ca-admin читает manifest из package.json.coopenomics.
  • 10.8: chatcoop как первый реальный subgraph extension.

Совместимость

Все 4 story совместимы по типам и независимы по runtime. Существующий desktop работает с coopback subgraph как раньше (через тот же /v1/graphql). Gateway-orchestrator пока не подключён к nginx — это поднимается отдельной story по deploy-конфигу.

Зонтичный PR на Epic 10 — Runtime Federation для backend-расширений каталога приложений. ## Что внутри **Story 10.1 — coopback → ApolloFederationDriver (subgraph mode)** [`f6b5c01`] - driver: ApolloDriver → ApolloFederationDriver - autoSchemaFile: { path, federation: 2 } - + @apollo/subgraph ^2 - Endpoint /v1/graphql сохранён, non-federated клиенты не сломаны. **Story 10.2 — @coopenomics/extension-sdk** [`883e597`] - ExtensionFederationModule.forRoot() — готовый GraphQLModule с federation v2 - ExtensionAuthModule.forRoot({ secret }) — passport-jwt - ExtensionJwtAuthGuard для GraphQL resolver'ов - SharedCooperator/Cooperative/Account stub'ы (@key + @external) для cross-extension references - HealthController GET /_health - loadExtensionConfig — fail-fast env loader - Templates: Dockerfile (multi-stage + wget healthcheck) + docker-compose.snippet.yaml **Story 10.2b — extension-hello-subgraph PoC** [`68b9156`] - Минимальный subgraph на extension-sdk доказывает работу всего стека. - Smoke: GET /_health → 200; helloFromExtension query работает; _service { sdl } возвращает federation v2 SDL. **Story 10.3 — gateway-orchestrator** [`8ea8bce`] - Отдельный per-tenant Nest-сервис: Apollo Gateway + REST orchestrator API + Postgres registry. - Apollo Federation Gateway (ApolloGatewayDriver) на /v1/graphql с IntrospectAndCompose + JWT forwarding. - REST: POST install / DELETE uninstall / POST composition refresh / GET composition status. - Bootstrap seed'ит core-subgraph (coopback) в registry, дальше extensions добавляются через REST. ## Архитектура См. apps-catalog/docs/epics/E10-federation-runtime.md (ветка docs/E10-federation-runtime) и blago req 8b-architecture-v3-runtime-federation-dlya-backend-rasshireniy. ## Что НЕ в этом PR - 10.3b: dynamic supergraph composition без рестарта (custom SupergraphManager) - 10.4: реальный docker pull + healthcheck pipeline (orchestrator). - 10.5: on-chain auto-update watcher. - 10.6: CA-auth OCI token protocol для docker pull. - 10.7: ca-admin читает manifest из package.json.coopenomics. - 10.8: chatcoop как первый реальный subgraph extension. ## Совместимость Все 4 story совместимы по типам и независимы по runtime. Существующий desktop работает с coopback subgraph как раньше (через тот же /v1/graphql). Gateway-orchestrator пока не подключён к nginx — это поднимается отдельной story по deploy-конфигу.
claude changed title from [E10-1] coopback → ApolloFederationDriver (subgraph mode) to [E10 umbrella] Runtime Federation для backend-расширений (10.1+10.2+10.2b+10.3) 2026-06-03 18:44:42 +00:00
claude changed target branch from dev to apps-catalog 2026-06-04 04:45:48 +00:00
claude added 14 commits 2026-06-04 04:45:48 +00:00
Документ остаётся в скроллящемся body BaseDialog, кнопка вынесена в слот
footer (.base-dialog__foot, вне overflow) — устраняет залипание, когда до
кнопки нельзя домотать (стек maximized-диалогов RequireAgreements).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Были перекрещены относительно реестра документов: draft 3=PrivacyPolicy,
4=UserAgreement (и тексты on-chain drafts, и cooptypes Registry, и protocol-vars
совета это подтверждают). Только make_base_coagreements крестил user↔privacy.
Затрагивает вновь создаваемые коопы; существующим нужна отдельная миграция.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(desktop): html2pdf — ленивый import, чинит SSR boot error «self is not defined»
Typecheck / desktop (pull_request) Successful in 13m17s
Typecheck / controller (pull_request) Successful in 12m53s
3482cfe094
html2pdf.js на верхнем уровне модуля трогает `self` → при SSR-бандле Quasar
падает [Quasar] boot error: ReferenceError: self is not defined. Экспорт PDF
нужен только на клиенте по действию пользователя — переносим импорт в
dynamic import() внутри exportFormToPdf, сервер модуль не вычисляет.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ci(typecheck): concurrency cancel-in-progress по PR-ветке
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
10e1075d5d
Новый push в PR отменяет ещё бегущий typecheck той же ветки —
прежде 30-минутные прогоны копились очередью.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
[E10-1] feat(controller): переключение GraphQL на ApolloFederationDriver (subgraph mode)
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
f6b5c01030
Epic 10 Story 10.1 — coopback становится первым federation v2 subgraph'ом.
Локальная core-схема компилируется с federation директивами (`autoSchemaFile.federation: 2`).
Endpoint остаётся на /v1/graphql; non-federated клиенты (desktop) не должны
заметить переключения — Apollo Federation добавляет лишь служебные
`_service { sdl }` и `_entities` query.

Gateway-режим (Apollo Gateway + IntrospectAndCompose) зайдёт отдельной
story 10.1b — поверх этого subgraph'а + registry в Postgres. На MVP пока
один subgraph, gateway не нужен.

Зависимости:
- + @apollo/subgraph ^2 (peer для federation 2 в @nestjs/apollo)

@key директивы на core entity (User/Cooperative/Account/Wallet) добавятся
по мере вытаскивания первых extension'ов — отдельными точечными PR.
[E10-2] feat(extension-sdk): @coopenomics/extension-sdk — Nest-template subgraph'а
Typecheck / controller (pull_request) Has been cancelled
Typecheck / desktop (pull_request) Has been cancelled
883e597d40
Epic 10 Story 10.2 — SDK для разработки backend-расширений Apollo Federation v2
subgraph'ов экосистемы кооператива.

Что внутри:
- ExtensionFederationModule.forRoot() — готовый GraphQL модуль с
  ApolloFederationDriver + autoSchemaFile.federation: 2
- ExtensionAuthModule.forRoot({ secret }) — passport-jwt стратегия,
  валидирует токен который Apollo Gateway forward'ит в Authorization-header.
- ExtensionJwtAuthGuard — guard для GraphQL resolver'ов
- SharedCooperator/SharedCooperative/SharedAccount — federation v2 stub'ы
  на core-entity для cross-extension references (@key + @external)
- HealthController GET /_health — обязательный для orchestrator'а
- loadExtensionConfig() — fail-fast загрузчик env'ов

Templates:
- Dockerfile multi-stage (builder + runtime + wget healthcheck)
- docker-compose.snippet.yaml — шаблон service'а для orchestrator'а

Контракт фиксирован Epic 10 PRD (apps-catalog/docs/epics/E10-federation-runtime.md)
и Architecture v3 (blago req 8b-architecture-v3-runtime-federation).
[E10-2b] feat(extension-hello-subgraph): PoC smoke-тест @coopenomics/extension-sdk
Typecheck / desktop (pull_request) Has been cancelled
Typecheck / controller (pull_request) Has been cancelled
68b91566ad
Epic 10 Story 10.2b — минимальный subgraph на extension-sdk доказывает что
Federation v2 driver + JWT module + healthcheck реально работают вместе.

Smoke результат (SUBGRAPH_PORT=33001 JWT_SECRET=test-secret COOPNAME=voskhod):
- GET /_health → {"status":"ok","version":"unknown","uptimeSeconds":N}
- POST /v1/graphql { helloFromExtension(name:"мир") { greeting fromExtension } }
  → {"greeting":"Здравствуй, мир!","fromExtension":"hello-subgraph@0.1.0"}
- POST /v1/graphql { _service { sdl } } → returns federation v2 SDL с
  @key/@external/@requires/@shareable директивами

Также в этом коммите:
- extension-sdk переключён с unbuild на обычный tsc (unbuild esbuild не
  поддерживает декораторы для target ES2020). main: dist/index.js, CommonJS.
- @types/passport-jwt в devDeps.

Cross-extension entity references (SharedCooperator @key + ResolveField)
живут в chatcoop subgraph'е (story 10.8) — там есть локальная сущность
ChatThread которая ссылается на пайщика. Этот PoC только доказывает
базовую механику.
[E10-3] feat(gateway-orchestrator): Apollo Gateway + subgraph registry skeleton
Typecheck / desktop (pull_request) Successful in 13m48s
Typecheck / controller (pull_request) Successful in 13m40s
8ea8bceea9
Epic 10 Story 10.3 — отдельный per-tenant Nest-сервис, объединяющий:
1. Apollo Federation Gateway (ApolloGatewayDriver) на /v1/graphql.
2. REST orchestrator API на /v1/internal/{extensions,composition}/*.
3. Subgraph registry в Postgres (TypeORM entity SubgraphRegistryEntity).

Что работает:
- Bootstrap seed'ит запись core-subgraph'а (coopback) → IntrospectAndCompose
  стартует с одним subgraph'ом → gateway проксирует все queries в core.
- JWT forwarding: Authorization-header forward'ится в каждый subgraph
  через RemoteGraphQLDataSource.willSendRequest.
- POST /v1/internal/extensions/install { packageId, version, url } —
  upsert в registry.
- DELETE /v1/internal/extensions/uninstall/:packageId — deactivate.
- POST /v1/internal/composition/refresh — 202 Accepted (реальный recompose
  по polling'у IntrospectAndCompose, ≤10 сек).
- GET /v1/internal/composition/status — текущие subgraph'ы.

Trade-off MVP:
- subgraphs читаются ОДИН раз на bootstrap (Apollo 2.9 IntrospectAndCompose
  ожидает статичный массив). Добавление НОВОГО subgraph'а → требует
  рестарта контейнера gateway-orchestrator. Warmup ~5 сек, делается
  orchestrator-pipeline при install'е (Story 10.4).
- Реальный docker pull/up/healthcheck — Story 10.4 (Install pipeline).
- Динамическая supergraph composition без рестарта — Story 10.3b
  (custom SupergraphManager).
- On-chain auto-update watcher — Story 10.5.

ENV: GATEWAY_PORT, DATABASE_URL, CORE_SUBGRAPH_URL, COOPNAME, JWT_SECRET.
Author
Owner

Свёрнут в зонтичный PR #64 (apps-catalog) — все коммиты вмержены merge-commit-ом, история по фичам сохранена. Закрываю как rolled-into-umbrella.

Свёрнут в зонтичный PR #64 (apps-catalog) — все коммиты вмержены merge-commit-ом, история по фичам сохранена. Закрываю как rolled-into-umbrella.
claude closed this pull request 2026-06-04 04:55:03 +00:00
Some checks are pending
Typecheck / desktop (pull_request) Successful in 13m48s
Typecheck / controller (pull_request) Successful in 13m40s

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#71