Skip to content

feat(compression): unified config panel — single source for engine on/off + level (Phase 1) - #4432

Merged
diegosouzapw merged 16 commits into
release/v3.8.32from
feat/compression-config-panel-v3831
Jun 20, 2026
Merged

diegosouzapw merged 16 commits into
release/v3.8.32from
feat/compression-config-panel-v3831

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Fase 1 — Painel unificado de configuração de compressão

Faz de /dashboard/context/settings a fonte única do master on/off + on/off+nível de cada engine de compressão. O pipeline default passa a ser derivado desses toggles (não mais armazenado/editável), removendo a duplicação que existia entre a config central, o "default combo" editável e as páginas por-engine.

Arquitetura (fluxo de dados)

engineCatalog (metadados) → deriveDefaultPlan(engines, master) (engines map → {mode, stackedPipeline}) → resolveCompressionPlan(config, ctx) (precedência header → override por-rota → perfil ativo → default derivado → off, já header/active-aware para as Fases 2-3) → selectCompressionPlan (strategySelector) → chatCore alimenta o stackedPipeline derivado em applyCompressionAsync.

O que muda

  • Modelo de dados: CompressionConfig ganha um engines map + activeComboId (migração 102 + backfill no read-path → zero mudança de comportamento para instalações existentes).
  • API: /api/settings/compression carrega engines + activeComboId; /api/context/combos/default vira um shim read-only 410 (o default agora é derivado).
  • UI: novo CompressionPanel.tsx (grid de engines: master + on/off + nível + preview do pipeline derivado). As páginas por-engine e os 2 cards perdem on/off+nível (ficam só com config detalhada). Menu reordenado: Settings → Combos → páginas por-engine → Studio.

Correção crítica — gate enginesExplicit

O default combo seeded (migração 042/043, is_default=1, presente em toda instalação = [rtk, caveman]) sobrescrevia silenciosamente os toggles do painel. Agora a engines map só dirige o dispatch quando explicitamente salva pelo painel (existe linha engines armazenada); instalações legadas/backfilled mantêm o caminho histórico defaultMode/default-combo → zero mudança de comportamento até o operador optar pelo painel.

Fora de escopo (Fases seguintes, cada uma com seu próprio PR)

  • Fase 2: perfis nomeados + seletor de perfil ativo (activeComboId) na página de Combos.
  • Fase 3: header por-request x-omniroute-compression (o resolver já é header-aware).

Validação

  • typecheck:core limpo · lint 0 errors · check:cycles OK
  • Suíte node de compressão 764/764 · API + shim + sidebar 94/94 · test:vitest bloqueante verde para todos os arquivos relevantes
  • Cada fix validado por teste (TDD); branch rebaseada sobre release/v3.8.32.

Nota: os 3 testes de audit.test.ts (shutdown de DB MCP) que falham in-suite são pré-existentes na base release/v3.8.32 (falham idênticos — na verdade pior, 4 testes — na árvore pristina; passam isolados; flake de timing sob carga), não introduzidos por este PR.

Specs: docs/compression/2026-06-20-unified-compression-config-panel-{design,plan}.md.

Engine-centric central panel (single source for master + per-engine on/off + level),
default pipeline derived from the engines map; Combos page owns named ordered pipelines +
active-profile selection; per-engine pages keep only detailed config. Phased: (1) core
consolidation + Model A migration, (2) named profiles + active selector, (3) per-request
x-omniroute-compression header.
… panel

12 TDD tasks: engine catalog, engines map + activeComboId, deriveDefaultPlan,
migration 102 + backfill, resolveCompressionPlan, runtime wiring, API, default-combo
shim, the engine-grid panel, consolidation, menu. Ends with a recap + the pending
follow-ups (Phase 2 named profiles/active selector, Phase 3 header, deferred items).
Pure function that converts a per-engine EngineToggle map + masterEnabled
flag into a { mode, stackedPipeline } plan: off when master is off or no
engines on; single-mode when exactly one single-mode engine is enabled;
stacked (sorted by stackPriority) otherwise.
Extends compressionSettingsUpdateSchema with engines (Record<string,{enabled:boolean,level?:string}>)
and activeComboId (string|null) so the PUT route accepts and persists these fields.
GET already returns the full getCompressionSettings() object which includes both fields.

TDD: added route round-trip tests (PUT+GET) for engines, activeComboId, null clear,
and schema rejection of invalid engines shape.
…s under vitest

The bare "@omniroute/open-sse/.../engineCatalog.ts" specifier resolves under tsc/tsx
but not under vitest's MCP config: Vite externalizes a brand-new open-sse module to
Node, which can't load the .ts subpath. types.ts is already in Vite's graph, so route
ENGINE_IDS through its re-export. Fixes 3 failing MCP vitest suites (cacheTools,
dbHealthTool, essentialTools).
…nel-saved

Code-review finding: the legacy seeded default combo (present on every install via
migration 042/043) was silently overriding a panel-configured engines map — the
default-combo block in chatCore set compressionComboApplied=true, skipping the
engines-map override, so an operator's panel toggles were ignored.

Gate the engines-map path on a new runtime-only CompressionConfig.enginesExplicit
(true when a stored engines row exists). Panel-saved installs: the engines map is
authoritative (deriveDefaultPlanFromConfig + new enginesMapDerivesStackedPipeline
guard the chatCore default-combo block). Legacy/backfilled installs: the map is
display-only and dispatch stays on the historical defaultMode/default-combo path —
zero behaviour change until the operator opts in via the panel.

Also documents why resolveCacheAwareConfig's getCacheAwareStrategy(config.defaultMode)
arg is safe (skipSystemPrompt is mode-independent).
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

…umadocs build

docs/compression/**/*.md is compiled as MDX by the Next build (fumadocs,
source.config.ts). The two planning docs lacked the required `title`
frontmatter (build error: 'title: expected string, received undefined') and the
design doc had a bare {rtk,caveman} that MDX parsed as a JSX expression. Adds
frontmatter matching the sibling docs and backticks the brace. Fixes the
dast-smoke build step.
@diegosouzapw
diegosouzapw merged commit 95e6522 into release/v3.8.32 Jun 20, 2026
3 checks passed
@diegosouzapw
diegosouzapw deleted the feat/compression-config-panel-v3831 branch June 20, 2026 22:08
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…/off + level (Phase 1) (cheaper-inference#4432)

* docs(compression): design spec for the unified compression config panel

Engine-centric central panel (single source for master + per-engine on/off + level),
default pipeline derived from the engines map; Combos page owns named ordered pipelines +
active-profile selection; per-engine pages keep only detailed config. Phased: (1) core
consolidation + Model A migration, (2) named profiles + active selector, (3) per-request
x-omniroute-compression header.

* docs(compression): Phase 1 implementation plan for the unified config panel

12 TDD tasks: engine catalog, engines map + activeComboId, deriveDefaultPlan,
migration 102 + backfill, resolveCompressionPlan, runtime wiring, API, default-combo
shim, the engine-grid panel, consolidation, menu. Ends with a recap + the pending
follow-ups (Phase 2 named profiles/active selector, Phase 3 header, deferred items).

* feat(compression): engine catalog metadata (levels, single-mode, order)

* feat(compression): add engines map + activeComboId to CompressionConfig

* feat(compression): deriveDefaultPlan (engines map -> mode/pipeline)

Pure function that converts a per-engine EngineToggle map + masterEnabled
flag into a { mode, stackedPipeline } plan: off when master is off or no
engines on; single-mode when exactly one single-mode engine is enabled;
stacked (sorted by stackPriority) otherwise.

* feat(compression): persist+backfill engines map and activeComboId (migration 102)

* feat(compression): resolveCompressionPlan precedence resolver (header>override>active>default)

* feat(compression): selectCompressionStrategy uses resolveCompressionPlan

* feat(api): settings/compression carries engines map + activeComboId

Extends compressionSettingsUpdateSchema with engines (Record<string,{enabled:boolean,level?:string}>)
and activeComboId (string|null) so the PUT route accepts and persists these fields.
GET already returns the full getCompressionSettings() object which includes both fields.

TDD: added route round-trip tests (PUT+GET) for engines, activeComboId, null clear,
and schema rejection of invalid engines shape.

* refactor(compression): default-combo route is a read-only shim (default derived from engines)

* feat(dashboard): engine-grid compression panel (single source for on/off + level)

* refactor(dashboard): remove duplicate compression toggles; per-engine pages keep only detailed config

* feat(compression): unified panel menu order + derived-pipeline integration coverage

* fix(compression): import ENGINE_IDS via types re-export so it resolves under vitest

The bare "@omniroute/open-sse/.../engineCatalog.ts" specifier resolves under tsc/tsx
but not under vitest's MCP config: Vite externalizes a brand-new open-sse module to
Node, which can't load the .ts subpath. types.ts is already in Vite's graph, so route
ENGINE_IDS through its re-export. Fixes 3 failing MCP vitest suites (cacheTools,
dbHealthTool, essentialTools).

* fix(compression): engines map drives dispatch only when explicitly panel-saved

Code-review finding: the legacy seeded default combo (present on every install via
migration 042/043) was silently overriding a panel-configured engines map — the
default-combo block in chatCore set compressionComboApplied=true, skipping the
engines-map override, so an operator's panel toggles were ignored.

Gate the engines-map path on a new runtime-only CompressionConfig.enginesExplicit
(true when a stored engines row exists). Panel-saved installs: the engines map is
authoritative (deriveDefaultPlanFromConfig + new enginesMapDerivesStackedPipeline
guard the chatCore default-combo block). Legacy/backfilled installs: the map is
display-only and dispatch stays on the historical defaultMode/default-combo path —
zero behaviour change until the operator opts in via the panel.

Also documents why resolveCacheAwareConfig's getCacheAwareStrategy(config.defaultMode)
arg is safe (skipSystemPrompt is mode-independent).

* docs(compression): add MDX frontmatter + escape inline brace to fix fumadocs build

docs/compression/**/*.md is compiled as MDX by the Next build (fumadocs,
source.config.ts). The two planning docs lacked the required `title`
frontmatter (build error: 'title: expected string, received undefined') and the
design doc had a bare {rtk,caveman} that MDX parsed as a JSX expression. Adds
frontmatter matching the sibling docs and backticks the brace. Fixes the
dast-smoke build step.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant