Skip to content

fix(combo): stop premature context compaction — real auto-combo windows + per-target compression limit - #3680

Merged
diegosouzapw merged 3 commits into
release/v3.8.22from
fix/combo-context-window
Jun 11, 2026
Merged

diegosouzapw merged 3 commits into
release/v3.8.22from
fix/combo-context-window

Conversation

@diegosouzapw

Copy link
Copy Markdown
Owner

Problem

Reported in a (since-deleted) discussion: auto combos mis-detect max context, producing too-small context windows and premature auto-compaction — the coding agent "keeps forgetting things".

Tracing the full chain surfaced two real bugs plus the mechanism that ties them together:

Bug 1 — auto combos advertise limit.context = 0 (client side)

GET /api/combos/auto never exposed any context info, so the opencode plugin hardcoded limit: { context: 0, output: 0 } for auto combos (mapAutoComboToStaticEntry).

opencode's overflow guard short-circuits on zero (packages/opencode/src/session/overflow.ts):

if (input.model.limit.context === 0) return false  // never overflow

→ smart auto-compaction is silently disabled for auto combos. The session grows unbounded until OmniRoute's server-side purifyHistory() (compression Layer 3) starts destructively dropping old messages on every turn — the agent forgets context with no client-visible signal.

Bug 2 — chatCore compresses DB combos at min(...allTargets) (server side)

chatCore.ts proactive compression overrode the context limit with the minimum across every combo target, even though chatCore always executes per concrete target (handleSingleModel resolves provider/model before delegating). A combo with a 1M-window primary and a 32k sibling compressed every request at 32000 × 0.7 — including requests served by the 1M target. Quota-shared pools (DB combos under the hood) hit the same path.

Fix

Layer Change
virtualFactory.ts New computeAdvertisedLimits() — MAX of candidates' context windows / max output tokens, exposed as advertisedContextLength / advertisedMaxOutputTokens
GET /api/combos/auto Serves context_length + max_output_tokens per variant
opencode plugin mapAutoComboToStaticEntry consumes the served limits; safe positive fallback (128000 / 8192) for older servers — never 0
contextManager.ts New resolveComboContextLimit() — uses the executing target's own window; min(...targets) kept only as defensive fallback when the current provider/model resolves no specific limit
chatCore.ts Combo compression block wired to the helper

Why MAX for auto combos: the auto-combo context pre-filter (combo.ts — estimated-tokens filter + filterTargetsByRequestCompatibility, which runs for all strategies) already routes oversized requests to large-window candidates, so advertising the largest window is safe and lets client compaction calibrate to the best candidate. Decision approved by maintainer; /v1/models LCD (MIN) policy for DB combos is deliberately unchanged.

Investigation answers (asked in the report)

  • How do we manage differing context sizes across combo targets? Catalog: MIN-of-targets (LCD, unchanged). Routing: per-request compatibility filter skips too-small targets (all strategies). Compression: was min-of-all (bug) → now per-executing-target.
  • Codex context-relay combo: orthogonal mechanism — watches codex quota (85%/95% thresholds, contextHandoff.ts), generates a structured LLM summary and injects it on account switch. It preserves context across accounts, not window sizing. Untouched.
  • Quota-shared: quotaShared-* are DB combos (fill-first) created without context_length; they inherit catalog MIN and hit the chatCore combo path — Bug 2's fix covers them.

Validation (Rule #18 — TDD)

  • RED→GREEN: tests/unit/auto-combo-context-advertising.test.ts (8 tests: MAX aggregation, route advertising, per-target limit + regression cases) and @omniroute/opencode-plugin/tests/auto-combo-context.test.ts (3 tests: served limits, old-server fallback, non-positive rejection)
  • Plugin suite: 257/257 · vitest (autoCombo): 146/146 · affected unit files: 57/57
  • typecheck:core clean · lint clean · check:cycles clean · docs-sync + any-budget gates green
  • Full test:unit: 19 failures, all verified pre-existing/flaky — same names fail on clean base a3253399b (13), plus the known chatcore-translation-paths cycle drift ([BUG] Valid max_tokens-truncated response misclassified as "empty content" → fake 502 #3572) and 4 suite-parallelism flakes that pass isolated (4/4)

…ombo windows + per-target compression limit

Auto combos advertised limit.context=0 through the opencode plugin, which
disables opencode's smart auto-compaction (overflow guard short-circuits on
context===0); sessions then grew until chatCore's destructive purifyHistory
silently dropped old messages — 'coding agent keeps forgetting things'.
Separately, chatCore compressed DB-combo requests (incl. quota-shared pools)
at min(...allTargets) even though it always executes with the concrete
target's provider/model.

- GET /api/combos/auto now serves context_length / max_output_tokens =
  MAX across the candidate pool (virtualFactory.computeAdvertisedLimits);
  MAX is safe because the auto-combo context pre-filter routes oversized
  requests to large-window candidates
- opencode plugin maps the served limits; safe positive fallback
  (128000/8192) for older servers — never 0
- chatCore proactive compression uses the executing target's own window
  (contextManager.resolveComboContextLimit); min-of-targets kept only as a
  defensive fallback when the current provider/model has no specific limit

TDD: tests/unit/auto-combo-context-advertising.test.ts (8) +
@omniroute/opencode-plugin/tests/auto-combo-context.test.ts (3), RED→GREEN.
Suites: plugin 257/257, vitest 146/146, affected unit files green;
typecheck:core clean; lint clean; cycles clean.
@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!

@diegosouzapw
diegosouzapw merged commit ef82f10 into release/v3.8.22 Jun 11, 2026
1 check passed
@diegosouzapw

Copy link
Copy Markdown
Owner Author

Merged into release/v3.8.22 ✅ — fixes the premature context-compaction chain (auto-combo now advertises real context_length/max_output_tokens instead of 0, and chatCore compresses against the executing target's window, not min(...allTargets)). 8 server + 3 plugin TDD tests green. Ships in the next release.

@kilo-code-bot

kilo-code-bot Bot commented Jun 11, 2026 •

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

This PR fixes a critical two-part bug in auto-combo context-window handling:

  1. Client-side fix: /api/combos/auto now advertises context_length/max_output_tokens (MAX of candidate pool) instead of hardcoding 0, which was causing opencode to disable its smart auto-compaction entirely.
  2. Server-side fix: chatCore compression now uses the executing target's own window via resolveComboContextLimit(), with min(...targets) kept only as a defensive fallback.

The implementation is sound:

  • resolveComboContextLimit() correctly prioritizes target-specific limits
  • computeAdvertisedLimits() uses MAX safely (pre-filter routes oversized requests to large-window candidates)
  • Both functions have comprehensive TypeScript safety and positive fallbacks (128000/8192)
  • 11 TDD tests cover the expected behavior

The PR is already merged and all tests/quality gates pass.

Files Reviewed (6 files)
  • open-sse/services/contextManager.ts - New resolveComboContextLimit() function
  • open-sse/services/autoCombo/virtualFactory.ts - New computeAdvertisedLimits() function
  • open-sse/handlers/chatCore.ts - Wired to use per-target compression limit
  • src/app/api/combos/auto/route.ts - Exposes context_length/max_output_tokens
  • @omniroute/opencode-plugin/src/index.ts - Consumes served limits with fallback
  • tests/unit/auto-combo-context-advertising.test.ts - TDD tests
  • @omniroute/opencode-plugin/tests/auto-combo-context.test.ts - Plugin TDD tests

Reviewed by laguna-m.1-20260312:free · 2,044,614 tokens

@diegosouzapw diegosouzapw mentioned this pull request Jun 11, 2026
diegosouzapw added a commit that referenced this pull request Jun 11, 2026
* chore(release): open v3.8.22 development cycle

* refactor(dashboard): extract ProviderDetailPageClient — #3501 Phase 0 (#3633)

#3501 Phase 0: extract ProviderDetailPageClient + smoke test.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract auth-import modals — #3501 Phase 1a (#3634)

#3501 Phase 1a: extract 3 auth-import modal clusters.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(db): reclassify localDb unexported modules as intentionally-internal (#3499) (#3635)

Closes #3499 — reclassify localDb unexported modules as intentionally-internal (audit + honest gate framing).

* refactor(db): move call_logs aggregations into callLogStats db module (#3500) (#3636)

#3500 slice 1: call_logs aggregations → src/lib/db/callLogStats.ts (Rule #5). Byte-identical queries; TDD 6/6.

* refactor(dashboard): extract EditCompatibleNodeModal — #3501 Phase 1b (#3638)

#3501 Phase 1b: extract EditCompatibleNodeModal (cycle-safe via leaf constants module).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(db): move community_servers SQL into gamification db module (#3500 slice 3) (#3639)

#3500 slice 3: community_servers SQL → gamification db module.

* refactor(db): move usage_history SQL into usageAnalytics module (#3500 slice 2) (#3644)

#3500 slice 2: usage_history/daily_usage_summary SQL → usageAnalytics db module.

* refactor(db): move skills UPDATE + db-backups SQL into db modules (#3500 slice 5) (#3647)

#3500 slice 5: skills UPDATE (allowlist) + db-backups SQL → db modules.

* refactor(db): move usage_logs/semantic_cache/proxy_logs SQL into db modules (#3500 slice 4) (#3648)

#3500 slice 4: usage_logs/semantic_cache/proxy_logs SQL → db modules. All internal routes done (2 external by-design remain).

* chore(db-gate): reclassify external-DB reads, fully close #3500 (#3649)

Closes #3500: reclassify external-DB reads; all internal raw-SQL migrated to db/ modules.

* refactor(dashboard): extract pure helpers to providerPageHelpers — #3501 Phase 2 (#3653)

#3501 Phase 2: extract pure helpers to providerPageHelpers (leaf, cycle-safe).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract remaining shared helpers to providerPageHelpers — #3501 Phase 2b (#3658)

#3501 Phase 2b: extract remaining shared helpers to providerPageHelpers (leaf, cycle-safe). Heavy modals unblocked.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(reasoning): replay reasoning_content on plain DeepSeek turns (#1682) (#3632)

Integrated into release/v3.8.22

* fix(kiro): route enterprise IAM Identity Center accounts to their regional endpoint (#3631)

Integrated into release/v3.8.22

* refactor: small code cleanup (#3523)

Integrated into release/v3.8.22

* fix(combo): skip same-provider targets on 408/500/502/503/504/524 errors (#3637)

Integrated into release/v3.8.22 — circuit-breaker guard added in review (#1731v2)

* feat(providers): add MiMoCode free-tier provider with bootstrap JWT auth (#3659)

Integrated into release/v3.8.22 — page.tsx conflict resolved + NoAuthAccountCard re-applied to ProviderDetailPageClient in review. MiMoCode endpoint validated live.

* Log Responses WebSocket calls in history (#3616)

Integrated into release/v3.8.22 — Codex Responses WebSocket call history logging.

* Add Claude Code routing preference for unprefixed Claude models (#3540)

Integrated into release/v3.8.22 — page.tsx conflict resolved (re-applied toggle to ProviderDetailPageClient) + disable-test updated for catalog drift in review.

* docs(changelog): credit #3632/#3631/#3637/#3659/#3540/#3616/#3523 (v3.8.22 targeted review round)

* fix(mimocode): add required authHeader:"none" to registry entry (#3659 follow-up)

The mimocode RegistryEntry omitted the required authHeader field, which broke
typecheck:core (TS2741). Match the no-auth convention (authType:"none" + authHeader:"none")
used by veoaifree-web and other free providers. Follow-up to #3659 (@pizzav-xyz).

* fix(responses): detect stream readiness for tool-call-only and object-less chunks (#3612) (#3661)

Closes #3612

* fix(mitm): remove duplicated 'Command failed:' error prefix (#3641) (#3662)

Closes #3641

* fix(cli): honor HERMES_HOME for Hermes Agent config path (#3628) (#3663)

Closes #3628

* fix(api): fetch live OpenCode model catalog for no-auth model picker (#3611) (#3664)

Closes #3611

* fix(api): flag provider topology error state by current status, not stale history (#3619) (#3666)

Closes #3619

* fix(electron): launch peer-stamping server-ws.mjs entrypoint to avoid 403 LOCAL_ONLY (#3386) (#3665)

Closes #3386

* fix(dashboard): restore home topology live in-flight pulse (#3507) (#3667)

Closes #3507

* fix(oauth): name Kiro/AWS auto-imported accounts and dedupe by profileArn (#3615) (#3671)

Closes #3615

* fix(resilience): clear stale transient connection cooldowns on startup (#3625) (#3672)

Closes #3625

* fix(i18n): use logical CSS direction utilities for sidebar and key overlays (RTL #3541) (#3670)

Closes #3541

* fix(dashboard): honor auto-hide and switch to visible filter on passthrough Test-all (#3610) (#3669)

Closes #3610

* refactor(dashboard): extract AddApiKeyModal + EditConnectionModal — #3501 Phase 1c (#3674)

#3501 Phase 1c: extract AddApiKeyModal, EditConnectionModal, WebSessionCredentialGuide into components/; god-component 10,166->8,092 LOC. Reconciles the v3.8.22 file-size drift for this file.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* docs(changelog): reconcile v3.8.22 — credit #3621/#3622 + MiMoCode follow-up roll-up

* refactor(dashboard): extract ConnectionRow + ModelCompatPopover + SiliconFlowEndpointModal — #3501 Phase 1d (#3676)

#3501 Phase 1d: god-component 8,092->6,838 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* feat(obsidian): add WebDAV config route + encrypt creds at rest (#3485 part 1) (#3677)

Part 1 of #3485. Adds /api/settings/obsidian/webdav (GET/POST/DELETE) wiring the ready obsidianSync lib, encrypts webdav password + obsidian token at rest, removes the duplicate UI block, drops the KNOWN_MISSING entry. WebDAV file server is part 2.

* feat(obsidian): add /api/v1/webdav file server for Obsidian vault sync (#3485 part 2) (#3678)

Part 2 of #3485. WebDAV server (PROPFIND/GET/PUT/DELETE/MKCOL/MOVE/OPTIONS) handled in the custom server layer (standalone-server-ws.mjs) since the App Router cannot export WebDAV methods. Basic-Auth (constant-time), path-traversal hardened, password decrypt ported from encryption.ts (parity-tested), DATA_DIR resolution parity-tested against dataPaths.ts. End-to-end Obsidian-over-Tailscale validation is a live VPS step (Rule #18).

* fix(combo): stop premature context compaction — real auto-combo windows + per-target compression limit (#3680)

Integrated into release/v3.8.22

* feat(dashboard): deactivate/activate accounts from the quota overview (#3675)

Integrated into release/v3.8.22

* fix(dashboard): close review gaps in bulk provider connection actions (#3271 follow-up) (#3673)

Integrated into release/v3.8.22 — page.tsx conflict (god-component split #3501) resolved by re-applying the bulk-action deltas to ProviderDetailPageClient.tsx

* refactor(dashboard): extract useModelCompatState hook + model sections — #3501 Phase 1e (#3683)

#3501 Phase 1e: extract useModelCompatState hook (unblocks the model sections) + ModelRow/PassthroughModelsSection/PassthroughModelRow/CustomModelsSection/CompatibleModelsSection. god-component 6,838->4,921 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract useProviderConnections/Settings/Models hooks — #3501 Phase 1f (#3684)

#3501 Phase 1f: god-component 4,948->4,062 LOC. Connection state+handlers, settings, and model metadata moved into hooks/.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* chore(release): v3.8.22 CHANGELOG + env-doc sync

- Set release date in CHANGELOG [3.8.22] to 2026-06-11
- Add HERMES_HOME to .env.example (from #3628/#3663)
- Add HERMES_HOME + OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS to ENVIRONMENT.md (#3628/#3540)

* docs(changelog): credit #3673 + #3675 — leninejunior bulk-actions + quota-toggle

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: NOXX - Commiter <artur1992123@mail.ru>
Co-authored-by: Nicolas Lorin <androw95220@gmail.com>
Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: kkkayye <98376609+kkkayye@users.noreply.github.com>
Co-authored-by: Witroch4 <witalo_rocha@hotmail.com>
Co-authored-by: Lenine Júnior <lenine@engrene.com.br>
@diegosouzapw diegosouzapw mentioned this pull request Jun 12, 2026
@diegosouzapw
diegosouzapw deleted the fix/combo-context-window branch June 12, 2026 03:21
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 17, 2026
…ws + per-target compression limit (diegosouzapw#3680)

Integrated into release/v3.8.22
oyi77 pushed a commit to oyi77/OmniRoute that referenced this pull request Jun 18, 2026
…ws + per-target compression limit (diegosouzapw#3680)

Integrated into release/v3.8.22
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
* chore(release): open v3.8.22 development cycle

* refactor(dashboard): extract ProviderDetailPageClient — diegosouzapw#3501 Phase 0 (diegosouzapw#3633)

diegosouzapw#3501 Phase 0: extract ProviderDetailPageClient + smoke test.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract auth-import modals — diegosouzapw#3501 Phase 1a (diegosouzapw#3634)

diegosouzapw#3501 Phase 1a: extract 3 auth-import modal clusters.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(db): reclassify localDb unexported modules as intentionally-internal (diegosouzapw#3499) (diegosouzapw#3635)

Closes diegosouzapw#3499 — reclassify localDb unexported modules as intentionally-internal (audit + honest gate framing).

* refactor(db): move call_logs aggregations into callLogStats db module (diegosouzapw#3500) (diegosouzapw#3636)

diegosouzapw#3500 slice 1: call_logs aggregations → src/lib/db/callLogStats.ts (Rule diegosouzapw#5). Byte-identical queries; TDD 6/6.

* refactor(dashboard): extract EditCompatibleNodeModal — diegosouzapw#3501 Phase 1b (diegosouzapw#3638)

diegosouzapw#3501 Phase 1b: extract EditCompatibleNodeModal (cycle-safe via leaf constants module).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(db): move community_servers SQL into gamification db module (diegosouzapw#3500 slice 3) (diegosouzapw#3639)

diegosouzapw#3500 slice 3: community_servers SQL → gamification db module.

* refactor(db): move usage_history SQL into usageAnalytics module (diegosouzapw#3500 slice 2) (diegosouzapw#3644)

diegosouzapw#3500 slice 2: usage_history/daily_usage_summary SQL → usageAnalytics db module.

* refactor(db): move skills UPDATE + db-backups SQL into db modules (diegosouzapw#3500 slice 5) (diegosouzapw#3647)

diegosouzapw#3500 slice 5: skills UPDATE (allowlist) + db-backups SQL → db modules.

* refactor(db): move usage_logs/semantic_cache/proxy_logs SQL into db modules (diegosouzapw#3500 slice 4) (diegosouzapw#3648)

diegosouzapw#3500 slice 4: usage_logs/semantic_cache/proxy_logs SQL → db modules. All internal routes done (2 external by-design remain).

* chore(db-gate): reclassify external-DB reads, fully close diegosouzapw#3500 (diegosouzapw#3649)

Closes diegosouzapw#3500: reclassify external-DB reads; all internal raw-SQL migrated to db/ modules.

* refactor(dashboard): extract pure helpers to providerPageHelpers — diegosouzapw#3501 Phase 2 (diegosouzapw#3653)

diegosouzapw#3501 Phase 2: extract pure helpers to providerPageHelpers (leaf, cycle-safe).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract remaining shared helpers to providerPageHelpers — diegosouzapw#3501 Phase 2b (diegosouzapw#3658)

diegosouzapw#3501 Phase 2b: extract remaining shared helpers to providerPageHelpers (leaf, cycle-safe). Heavy modals unblocked.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(reasoning): replay reasoning_content on plain DeepSeek turns (diegosouzapw#1682) (diegosouzapw#3632)

Integrated into release/v3.8.22

* fix(kiro): route enterprise IAM Identity Center accounts to their regional endpoint (diegosouzapw#3631)

Integrated into release/v3.8.22

* refactor: small code cleanup (diegosouzapw#3523)

Integrated into release/v3.8.22

* fix(combo): skip same-provider targets on 408/500/502/503/504/524 errors (diegosouzapw#3637)

Integrated into release/v3.8.22 — circuit-breaker guard added in review (#1731v2)

* feat(providers): add MiMoCode free-tier provider with bootstrap JWT auth (diegosouzapw#3659)

Integrated into release/v3.8.22 — page.tsx conflict resolved + NoAuthAccountCard re-applied to ProviderDetailPageClient in review. MiMoCode endpoint validated live.

* Log Responses WebSocket calls in history (diegosouzapw#3616)

Integrated into release/v3.8.22 — Codex Responses WebSocket call history logging.

* Add Claude Code routing preference for unprefixed Claude models (diegosouzapw#3540)

Integrated into release/v3.8.22 — page.tsx conflict resolved (re-applied toggle to ProviderDetailPageClient) + disable-test updated for catalog drift in review.

* docs(changelog): credit diegosouzapw#3632/diegosouzapw#3631/diegosouzapw#3637/diegosouzapw#3659/diegosouzapw#3540/diegosouzapw#3616/diegosouzapw#3523 (v3.8.22 targeted review round)

* fix(mimocode): add required authHeader:"none" to registry entry (diegosouzapw#3659 follow-up)

The mimocode RegistryEntry omitted the required authHeader field, which broke
typecheck:core (TS2741). Match the no-auth convention (authType:"none" + authHeader:"none")
used by veoaifree-web and other free providers. Follow-up to diegosouzapw#3659 (@pizzav-xyz).

* fix(responses): detect stream readiness for tool-call-only and object-less chunks (diegosouzapw#3612) (diegosouzapw#3661)

Closes diegosouzapw#3612

* fix(mitm): remove duplicated 'Command failed:' error prefix (diegosouzapw#3641) (diegosouzapw#3662)

Closes diegosouzapw#3641

* fix(cli): honor HERMES_HOME for Hermes Agent config path (diegosouzapw#3628) (diegosouzapw#3663)

Closes diegosouzapw#3628

* fix(api): fetch live OpenCode model catalog for no-auth model picker (diegosouzapw#3611) (diegosouzapw#3664)

Closes diegosouzapw#3611

* fix(api): flag provider topology error state by current status, not stale history (diegosouzapw#3619) (diegosouzapw#3666)

Closes diegosouzapw#3619

* fix(electron): launch peer-stamping server-ws.mjs entrypoint to avoid 403 LOCAL_ONLY (diegosouzapw#3386) (diegosouzapw#3665)

Closes diegosouzapw#3386

* fix(dashboard): restore home topology live in-flight pulse (diegosouzapw#3507) (diegosouzapw#3667)

Closes diegosouzapw#3507

* fix(oauth): name Kiro/AWS auto-imported accounts and dedupe by profileArn (diegosouzapw#3615) (diegosouzapw#3671)

Closes diegosouzapw#3615

* fix(resilience): clear stale transient connection cooldowns on startup (diegosouzapw#3625) (diegosouzapw#3672)

Closes diegosouzapw#3625

* fix(i18n): use logical CSS direction utilities for sidebar and key overlays (RTL diegosouzapw#3541) (diegosouzapw#3670)

Closes diegosouzapw#3541

* fix(dashboard): honor auto-hide and switch to visible filter on passthrough Test-all (diegosouzapw#3610) (diegosouzapw#3669)

Closes diegosouzapw#3610

* refactor(dashboard): extract AddApiKeyModal + EditConnectionModal — diegosouzapw#3501 Phase 1c (diegosouzapw#3674)

diegosouzapw#3501 Phase 1c: extract AddApiKeyModal, EditConnectionModal, WebSessionCredentialGuide into components/; god-component 10,166->8,092 LOC. Reconciles the v3.8.22 file-size drift for this file.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* docs(changelog): reconcile v3.8.22 — credit diegosouzapw#3621/diegosouzapw#3622 + MiMoCode follow-up roll-up

* refactor(dashboard): extract ConnectionRow + ModelCompatPopover + SiliconFlowEndpointModal — diegosouzapw#3501 Phase 1d (diegosouzapw#3676)

diegosouzapw#3501 Phase 1d: god-component 8,092->6,838 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* feat(obsidian): add WebDAV config route + encrypt creds at rest (diegosouzapw#3485 part 1) (diegosouzapw#3677)

Part 1 of diegosouzapw#3485. Adds /api/settings/obsidian/webdav (GET/POST/DELETE) wiring the ready obsidianSync lib, encrypts webdav password + obsidian token at rest, removes the duplicate UI block, drops the KNOWN_MISSING entry. WebDAV file server is part 2.

* feat(obsidian): add /api/v1/webdav file server for Obsidian vault sync (diegosouzapw#3485 part 2) (diegosouzapw#3678)

Part 2 of diegosouzapw#3485. WebDAV server (PROPFIND/GET/PUT/DELETE/MKCOL/MOVE/OPTIONS) handled in the custom server layer (standalone-server-ws.mjs) since the App Router cannot export WebDAV methods. Basic-Auth (constant-time), path-traversal hardened, password decrypt ported from encryption.ts (parity-tested), DATA_DIR resolution parity-tested against dataPaths.ts. End-to-end Obsidian-over-Tailscale validation is a live VPS step (Rule diegosouzapw#18).

* fix(combo): stop premature context compaction — real auto-combo windows + per-target compression limit (diegosouzapw#3680)

Integrated into release/v3.8.22

* feat(dashboard): deactivate/activate accounts from the quota overview (diegosouzapw#3675)

Integrated into release/v3.8.22

* fix(dashboard): close review gaps in bulk provider connection actions (diegosouzapw#3271 follow-up) (diegosouzapw#3673)

Integrated into release/v3.8.22 — page.tsx conflict (god-component split diegosouzapw#3501) resolved by re-applying the bulk-action deltas to ProviderDetailPageClient.tsx

* refactor(dashboard): extract useModelCompatState hook + model sections — diegosouzapw#3501 Phase 1e (diegosouzapw#3683)

diegosouzapw#3501 Phase 1e: extract useModelCompatState hook (unblocks the model sections) + ModelRow/PassthroughModelsSection/PassthroughModelRow/CustomModelsSection/CompatibleModelsSection. god-component 6,838->4,921 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract useProviderConnections/Settings/Models hooks — diegosouzapw#3501 Phase 1f (diegosouzapw#3684)

diegosouzapw#3501 Phase 1f: god-component 4,948->4,062 LOC. Connection state+handlers, settings, and model metadata moved into hooks/.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* chore(release): v3.8.22 CHANGELOG + env-doc sync

- Set release date in CHANGELOG [3.8.22] to 2026-06-11
- Add HERMES_HOME to .env.example (from diegosouzapw#3628/diegosouzapw#3663)
- Add HERMES_HOME + OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS to ENVIRONMENT.md (diegosouzapw#3628/diegosouzapw#3540)

* docs(changelog): credit diegosouzapw#3673 + diegosouzapw#3675 — leninejunior bulk-actions + quota-toggle

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: NOXX - Commiter <artur1992123@mail.ru>
Co-authored-by: Nicolas Lorin <androw95220@gmail.com>
Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: kkkayye <98376609+kkkayye@users.noreply.github.com>
Co-authored-by: Witroch4 <witalo_rocha@hotmail.com>
Co-authored-by: Lenine Júnior <lenine@engrene.com.br>
Poid-ZA pushed a commit to Poid-ZA/OmniRoute that referenced this pull request Aug 5, 2026
* chore(release): open v3.8.22 development cycle

* refactor(dashboard): extract ProviderDetailPageClient — diegosouzapw#3501 Phase 0 (diegosouzapw#3633)

diegosouzapw#3501 Phase 0: extract ProviderDetailPageClient + smoke test.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract auth-import modals — diegosouzapw#3501 Phase 1a (diegosouzapw#3634)

diegosouzapw#3501 Phase 1a: extract 3 auth-import modal clusters.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(db): reclassify localDb unexported modules as intentionally-internal (diegosouzapw#3499) (diegosouzapw#3635)

Closes diegosouzapw#3499 — reclassify localDb unexported modules as intentionally-internal (audit + honest gate framing).

* refactor(db): move call_logs aggregations into callLogStats db module (diegosouzapw#3500) (diegosouzapw#3636)

diegosouzapw#3500 slice 1: call_logs aggregations → src/lib/db/callLogStats.ts (Rule diegosouzapw#5). Byte-identical queries; TDD 6/6.

* refactor(dashboard): extract EditCompatibleNodeModal — diegosouzapw#3501 Phase 1b (diegosouzapw#3638)

diegosouzapw#3501 Phase 1b: extract EditCompatibleNodeModal (cycle-safe via leaf constants module).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(db): move community_servers SQL into gamification db module (diegosouzapw#3500 slice 3) (diegosouzapw#3639)

diegosouzapw#3500 slice 3: community_servers SQL → gamification db module.

* refactor(db): move usage_history SQL into usageAnalytics module (diegosouzapw#3500 slice 2) (diegosouzapw#3644)

diegosouzapw#3500 slice 2: usage_history/daily_usage_summary SQL → usageAnalytics db module.

* refactor(db): move skills UPDATE + db-backups SQL into db modules (diegosouzapw#3500 slice 5) (diegosouzapw#3647)

diegosouzapw#3500 slice 5: skills UPDATE (allowlist) + db-backups SQL → db modules.

* refactor(db): move usage_logs/semantic_cache/proxy_logs SQL into db modules (diegosouzapw#3500 slice 4) (diegosouzapw#3648)

diegosouzapw#3500 slice 4: usage_logs/semantic_cache/proxy_logs SQL → db modules. All internal routes done (2 external by-design remain).

* chore(db-gate): reclassify external-DB reads, fully close diegosouzapw#3500 (diegosouzapw#3649)

Closes diegosouzapw#3500: reclassify external-DB reads; all internal raw-SQL migrated to db/ modules.

* refactor(dashboard): extract pure helpers to providerPageHelpers — diegosouzapw#3501 Phase 2 (diegosouzapw#3653)

diegosouzapw#3501 Phase 2: extract pure helpers to providerPageHelpers (leaf, cycle-safe).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract remaining shared helpers to providerPageHelpers — diegosouzapw#3501 Phase 2b (diegosouzapw#3658)

diegosouzapw#3501 Phase 2b: extract remaining shared helpers to providerPageHelpers (leaf, cycle-safe). Heavy modals unblocked.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(reasoning): replay reasoning_content on plain DeepSeek turns (diegosouzapw#1682) (diegosouzapw#3632)

Integrated into release/v3.8.22

* fix(kiro): route enterprise IAM Identity Center accounts to their regional endpoint (diegosouzapw#3631)

Integrated into release/v3.8.22

* refactor: small code cleanup (diegosouzapw#3523)

Integrated into release/v3.8.22

* fix(combo): skip same-provider targets on 408/500/502/503/504/524 errors (diegosouzapw#3637)

Integrated into release/v3.8.22 — circuit-breaker guard added in review (#1731v2)

* feat(providers): add MiMoCode free-tier provider with bootstrap JWT auth (diegosouzapw#3659)

Integrated into release/v3.8.22 — page.tsx conflict resolved + NoAuthAccountCard re-applied to ProviderDetailPageClient in review. MiMoCode endpoint validated live.

* Log Responses WebSocket calls in history (diegosouzapw#3616)

Integrated into release/v3.8.22 — Codex Responses WebSocket call history logging.

* Add Claude Code routing preference for unprefixed Claude models (diegosouzapw#3540)

Integrated into release/v3.8.22 — page.tsx conflict resolved (re-applied toggle to ProviderDetailPageClient) + disable-test updated for catalog drift in review.

* docs(changelog): credit diegosouzapw#3632/diegosouzapw#3631/diegosouzapw#3637/diegosouzapw#3659/diegosouzapw#3540/diegosouzapw#3616/diegosouzapw#3523 (v3.8.22 targeted review round)

* fix(mimocode): add required authHeader:"none" to registry entry (diegosouzapw#3659 follow-up)

The mimocode RegistryEntry omitted the required authHeader field, which broke
typecheck:core (TS2741). Match the no-auth convention (authType:"none" + authHeader:"none")
used by veoaifree-web and other free providers. Follow-up to diegosouzapw#3659 (@pizzav-xyz).

* fix(responses): detect stream readiness for tool-call-only and object-less chunks (diegosouzapw#3612) (diegosouzapw#3661)

Closes diegosouzapw#3612

* fix(mitm): remove duplicated 'Command failed:' error prefix (diegosouzapw#3641) (diegosouzapw#3662)

Closes diegosouzapw#3641

* fix(cli): honor HERMES_HOME for Hermes Agent config path (diegosouzapw#3628) (diegosouzapw#3663)

Closes diegosouzapw#3628

* fix(api): fetch live OpenCode model catalog for no-auth model picker (diegosouzapw#3611) (diegosouzapw#3664)

Closes diegosouzapw#3611

* fix(api): flag provider topology error state by current status, not stale history (diegosouzapw#3619) (diegosouzapw#3666)

Closes diegosouzapw#3619

* fix(electron): launch peer-stamping server-ws.mjs entrypoint to avoid 403 LOCAL_ONLY (diegosouzapw#3386) (diegosouzapw#3665)

Closes diegosouzapw#3386

* fix(dashboard): restore home topology live in-flight pulse (diegosouzapw#3507) (diegosouzapw#3667)

Closes diegosouzapw#3507

* fix(oauth): name Kiro/AWS auto-imported accounts and dedupe by profileArn (diegosouzapw#3615) (diegosouzapw#3671)

Closes diegosouzapw#3615

* fix(resilience): clear stale transient connection cooldowns on startup (diegosouzapw#3625) (diegosouzapw#3672)

Closes diegosouzapw#3625

* fix(i18n): use logical CSS direction utilities for sidebar and key overlays (RTL diegosouzapw#3541) (diegosouzapw#3670)

Closes diegosouzapw#3541

* fix(dashboard): honor auto-hide and switch to visible filter on passthrough Test-all (diegosouzapw#3610) (diegosouzapw#3669)

Closes diegosouzapw#3610

* refactor(dashboard): extract AddApiKeyModal + EditConnectionModal — diegosouzapw#3501 Phase 1c (diegosouzapw#3674)

diegosouzapw#3501 Phase 1c: extract AddApiKeyModal, EditConnectionModal, WebSessionCredentialGuide into components/; god-component 10,166->8,092 LOC. Reconciles the v3.8.22 file-size drift for this file.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* docs(changelog): reconcile v3.8.22 — credit diegosouzapw#3621/diegosouzapw#3622 + MiMoCode follow-up roll-up

* refactor(dashboard): extract ConnectionRow + ModelCompatPopover + SiliconFlowEndpointModal — diegosouzapw#3501 Phase 1d (diegosouzapw#3676)

diegosouzapw#3501 Phase 1d: god-component 8,092->6,838 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* feat(obsidian): add WebDAV config route + encrypt creds at rest (diegosouzapw#3485 part 1) (diegosouzapw#3677)

Part 1 of diegosouzapw#3485. Adds /api/settings/obsidian/webdav (GET/POST/DELETE) wiring the ready obsidianSync lib, encrypts webdav password + obsidian token at rest, removes the duplicate UI block, drops the KNOWN_MISSING entry. WebDAV file server is part 2.

* feat(obsidian): add /api/v1/webdav file server for Obsidian vault sync (diegosouzapw#3485 part 2) (diegosouzapw#3678)

Part 2 of diegosouzapw#3485. WebDAV server (PROPFIND/GET/PUT/DELETE/MKCOL/MOVE/OPTIONS) handled in the custom server layer (standalone-server-ws.mjs) since the App Router cannot export WebDAV methods. Basic-Auth (constant-time), path-traversal hardened, password decrypt ported from encryption.ts (parity-tested), DATA_DIR resolution parity-tested against dataPaths.ts. End-to-end Obsidian-over-Tailscale validation is a live VPS step (Rule diegosouzapw#18).

* fix(combo): stop premature context compaction — real auto-combo windows + per-target compression limit (diegosouzapw#3680)

Integrated into release/v3.8.22

* feat(dashboard): deactivate/activate accounts from the quota overview (diegosouzapw#3675)

Integrated into release/v3.8.22

* fix(dashboard): close review gaps in bulk provider connection actions (diegosouzapw#3271 follow-up) (diegosouzapw#3673)

Integrated into release/v3.8.22 — page.tsx conflict (god-component split diegosouzapw#3501) resolved by re-applying the bulk-action deltas to ProviderDetailPageClient.tsx

* refactor(dashboard): extract useModelCompatState hook + model sections — diegosouzapw#3501 Phase 1e (diegosouzapw#3683)

diegosouzapw#3501 Phase 1e: extract useModelCompatState hook (unblocks the model sections) + ModelRow/PassthroughModelsSection/PassthroughModelRow/CustomModelsSection/CompatibleModelsSection. god-component 6,838->4,921 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract useProviderConnections/Settings/Models hooks — diegosouzapw#3501 Phase 1f (diegosouzapw#3684)

diegosouzapw#3501 Phase 1f: god-component 4,948->4,062 LOC. Connection state+handlers, settings, and model metadata moved into hooks/.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* chore(release): v3.8.22 CHANGELOG + env-doc sync

- Set release date in CHANGELOG [3.8.22] to 2026-06-11
- Add HERMES_HOME to .env.example (from diegosouzapw#3628/diegosouzapw#3663)
- Add HERMES_HOME + OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS to ENVIRONMENT.md (diegosouzapw#3628/diegosouzapw#3540)

* docs(changelog): credit diegosouzapw#3673 + diegosouzapw#3675 — leninejunior bulk-actions + quota-toggle

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: NOXX - Commiter <artur1992123@mail.ru>
Co-authored-by: Nicolas Lorin <androw95220@gmail.com>
Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: kkkayye <98376609+kkkayye@users.noreply.github.com>
Co-authored-by: Witroch4 <witalo_rocha@hotmail.com>
Co-authored-by: Lenine Júnior <lenine@engrene.com.br>
tkgo11 pushed a commit to tkgo11/OmniRoute that referenced this pull request Sep 23, 2026
…ws + per-target compression limit (diegosouzapw#3680)

Integrated into release/v3.8.22
muhamadgalihsaputra pushed a commit to niyatna/NiyatnaRoute that referenced this pull request Sep 27, 2026
* chore(release): open v3.8.22 development cycle

* refactor(dashboard): extract ProviderDetailPageClient — diegosouzapw#3501 Phase 0 (diegosouzapw#3633)

diegosouzapw#3501 Phase 0: extract ProviderDetailPageClient + smoke test.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract auth-import modals — diegosouzapw#3501 Phase 1a (diegosouzapw#3634)

diegosouzapw#3501 Phase 1a: extract 3 auth-import modal clusters.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(db): reclassify localDb unexported modules as intentionally-internal (diegosouzapw#3499) (diegosouzapw#3635)

Closes diegosouzapw#3499 — reclassify localDb unexported modules as intentionally-internal (audit + honest gate framing).

* refactor(db): move call_logs aggregations into callLogStats db module (diegosouzapw#3500) (diegosouzapw#3636)

diegosouzapw#3500 slice 1: call_logs aggregations → src/lib/db/callLogStats.ts (Rule diegosouzapw#5). Byte-identical queries; TDD 6/6.

* refactor(dashboard): extract EditCompatibleNodeModal — diegosouzapw#3501 Phase 1b (diegosouzapw#3638)

diegosouzapw#3501 Phase 1b: extract EditCompatibleNodeModal (cycle-safe via leaf constants module).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(db): move community_servers SQL into gamification db module (diegosouzapw#3500 slice 3) (diegosouzapw#3639)

diegosouzapw#3500 slice 3: community_servers SQL → gamification db module.

* refactor(db): move usage_history SQL into usageAnalytics module (diegosouzapw#3500 slice 2) (diegosouzapw#3644)

diegosouzapw#3500 slice 2: usage_history/daily_usage_summary SQL → usageAnalytics db module.

* refactor(db): move skills UPDATE + db-backups SQL into db modules (diegosouzapw#3500 slice 5) (diegosouzapw#3647)

diegosouzapw#3500 slice 5: skills UPDATE (allowlist) + db-backups SQL → db modules.

* refactor(db): move usage_logs/semantic_cache/proxy_logs SQL into db modules (diegosouzapw#3500 slice 4) (diegosouzapw#3648)

diegosouzapw#3500 slice 4: usage_logs/semantic_cache/proxy_logs SQL → db modules. All internal routes done (2 external by-design remain).

* chore(db-gate): reclassify external-DB reads, fully close diegosouzapw#3500 (diegosouzapw#3649)

Closes diegosouzapw#3500: reclassify external-DB reads; all internal raw-SQL migrated to db/ modules.

* refactor(dashboard): extract pure helpers to providerPageHelpers — diegosouzapw#3501 Phase 2 (diegosouzapw#3653)

diegosouzapw#3501 Phase 2: extract pure helpers to providerPageHelpers (leaf, cycle-safe).

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract remaining shared helpers to providerPageHelpers — diegosouzapw#3501 Phase 2b (diegosouzapw#3658)

diegosouzapw#3501 Phase 2b: extract remaining shared helpers to providerPageHelpers (leaf, cycle-safe). Heavy modals unblocked.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* fix(reasoning): replay reasoning_content on plain DeepSeek turns (diegosouzapw#1682) (diegosouzapw#3632)

Integrated into release/v3.8.22

* fix(kiro): route enterprise IAM Identity Center accounts to their regional endpoint (diegosouzapw#3631)

Integrated into release/v3.8.22

* refactor: small code cleanup (diegosouzapw#3523)

Integrated into release/v3.8.22

* fix(combo): skip same-provider targets on 408/500/502/503/504/524 errors (diegosouzapw#3637)

Integrated into release/v3.8.22 — circuit-breaker guard added in review (#1731v2)

* feat(providers): add MiMoCode free-tier provider with bootstrap JWT auth (diegosouzapw#3659)

Integrated into release/v3.8.22 — page.tsx conflict resolved + NoAuthAccountCard re-applied to ProviderDetailPageClient in review. MiMoCode endpoint validated live.

* Log Responses WebSocket calls in history (diegosouzapw#3616)

Integrated into release/v3.8.22 — Codex Responses WebSocket call history logging.

* Add Claude Code routing preference for unprefixed Claude models (diegosouzapw#3540)

Integrated into release/v3.8.22 — page.tsx conflict resolved (re-applied toggle to ProviderDetailPageClient) + disable-test updated for catalog drift in review.

* docs(changelog): credit diegosouzapw#3632/diegosouzapw#3631/diegosouzapw#3637/diegosouzapw#3659/diegosouzapw#3540/diegosouzapw#3616/diegosouzapw#3523 (v3.8.22 targeted review round)

* fix(mimocode): add required authHeader:"none" to registry entry (diegosouzapw#3659 follow-up)

The mimocode RegistryEntry omitted the required authHeader field, which broke
typecheck:core (TS2741). Match the no-auth convention (authType:"none" + authHeader:"none")
used by veoaifree-web and other free providers. Follow-up to diegosouzapw#3659 (@pizzav-xyz).

* fix(responses): detect stream readiness for tool-call-only and object-less chunks (diegosouzapw#3612) (diegosouzapw#3661)

Closes diegosouzapw#3612

* fix(mitm): remove duplicated 'Command failed:' error prefix (diegosouzapw#3641) (diegosouzapw#3662)

Closes diegosouzapw#3641

* fix(cli): honor HERMES_HOME for Hermes Agent config path (diegosouzapw#3628) (diegosouzapw#3663)

Closes diegosouzapw#3628

* fix(api): fetch live OpenCode model catalog for no-auth model picker (diegosouzapw#3611) (diegosouzapw#3664)

Closes diegosouzapw#3611

* fix(api): flag provider topology error state by current status, not stale history (diegosouzapw#3619) (diegosouzapw#3666)

Closes diegosouzapw#3619

* fix(electron): launch peer-stamping server-ws.mjs entrypoint to avoid 403 LOCAL_ONLY (diegosouzapw#3386) (diegosouzapw#3665)

Closes diegosouzapw#3386

* fix(dashboard): restore home topology live in-flight pulse (diegosouzapw#3507) (diegosouzapw#3667)

Closes diegosouzapw#3507

* fix(oauth): name Kiro/AWS auto-imported accounts and dedupe by profileArn (diegosouzapw#3615) (diegosouzapw#3671)

Closes diegosouzapw#3615

* fix(resilience): clear stale transient connection cooldowns on startup (diegosouzapw#3625) (diegosouzapw#3672)

Closes diegosouzapw#3625

* fix(i18n): use logical CSS direction utilities for sidebar and key overlays (RTL diegosouzapw#3541) (diegosouzapw#3670)

Closes diegosouzapw#3541

* fix(dashboard): honor auto-hide and switch to visible filter on passthrough Test-all (diegosouzapw#3610) (diegosouzapw#3669)

Closes diegosouzapw#3610

* refactor(dashboard): extract AddApiKeyModal + EditConnectionModal — diegosouzapw#3501 Phase 1c (diegosouzapw#3674)

diegosouzapw#3501 Phase 1c: extract AddApiKeyModal, EditConnectionModal, WebSessionCredentialGuide into components/; god-component 10,166->8,092 LOC. Reconciles the v3.8.22 file-size drift for this file.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* docs(changelog): reconcile v3.8.22 — credit diegosouzapw#3621/diegosouzapw#3622 + MiMoCode follow-up roll-up

* refactor(dashboard): extract ConnectionRow + ModelCompatPopover + SiliconFlowEndpointModal — diegosouzapw#3501 Phase 1d (diegosouzapw#3676)

diegosouzapw#3501 Phase 1d: god-component 8,092->6,838 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* feat(obsidian): add WebDAV config route + encrypt creds at rest (diegosouzapw#3485 part 1) (diegosouzapw#3677)

Part 1 of diegosouzapw#3485. Adds /api/settings/obsidian/webdav (GET/POST/DELETE) wiring the ready obsidianSync lib, encrypts webdav password + obsidian token at rest, removes the duplicate UI block, drops the KNOWN_MISSING entry. WebDAV file server is part 2.

* feat(obsidian): add /api/v1/webdav file server for Obsidian vault sync (diegosouzapw#3485 part 2) (diegosouzapw#3678)

Part 2 of diegosouzapw#3485. WebDAV server (PROPFIND/GET/PUT/DELETE/MKCOL/MOVE/OPTIONS) handled in the custom server layer (standalone-server-ws.mjs) since the App Router cannot export WebDAV methods. Basic-Auth (constant-time), path-traversal hardened, password decrypt ported from encryption.ts (parity-tested), DATA_DIR resolution parity-tested against dataPaths.ts. End-to-end Obsidian-over-Tailscale validation is a live VPS step (Rule diegosouzapw#18).

* fix(combo): stop premature context compaction — real auto-combo windows + per-target compression limit (diegosouzapw#3680)

Integrated into release/v3.8.22

* feat(dashboard): deactivate/activate accounts from the quota overview (diegosouzapw#3675)

Integrated into release/v3.8.22

* fix(dashboard): close review gaps in bulk provider connection actions (diegosouzapw#3271 follow-up) (diegosouzapw#3673)

Integrated into release/v3.8.22 — page.tsx conflict (god-component split diegosouzapw#3501) resolved by re-applying the bulk-action deltas to ProviderDetailPageClient.tsx

* refactor(dashboard): extract useModelCompatState hook + model sections — diegosouzapw#3501 Phase 1e (diegosouzapw#3683)

diegosouzapw#3501 Phase 1e: extract useModelCompatState hook (unblocks the model sections) + ModelRow/PassthroughModelsSection/PassthroughModelRow/CustomModelsSection/CompatibleModelsSection. god-component 6,838->4,921 LOC.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* refactor(dashboard): extract useProviderConnections/Settings/Models hooks — diegosouzapw#3501 Phase 1f (diegosouzapw#3684)

diegosouzapw#3501 Phase 1f: god-component 4,948->4,062 LOC. Connection state+handlers, settings, and model metadata moved into hooks/.

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>

* chore(release): v3.8.22 CHANGELOG + env-doc sync

- Set release date in CHANGELOG [3.8.22] to 2026-06-11
- Add HERMES_HOME to .env.example (from diegosouzapw#3628/diegosouzapw#3663)
- Add HERMES_HOME + OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS to ENVIRONMENT.md (diegosouzapw#3628/diegosouzapw#3540)

* docs(changelog): credit diegosouzapw#3673 + diegosouzapw#3675 — leninejunior bulk-actions + quota-toggle

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: NOXX - Commiter <artur1992123@mail.ru>
Co-authored-by: Nicolas Lorin <androw95220@gmail.com>
Co-authored-by: Hernan Javier Ardila Sanchez <hjasgr@gmail.com>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: kkkayye <98376609+kkkayye@users.noreply.github.com>
Co-authored-by: Witroch4 <witalo_rocha@hotmail.com>
Co-authored-by: Lenine Júnior <lenine@engrene.com.br>
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