diff --git a/package-lock.json b/package-lock.json
index ef51b21a64..0ccbd9ba98 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "omniroute",
- "version": "3.4.8",
+ "version": "3.4.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "omniroute",
- "version": "3.4.8",
+ "version": "3.4.9",
"hasInstallScript": true,
"license": "MIT",
"workspaces": [
diff --git a/package.json b/package.json
index c54796d951..5bc5b88e48 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "omniroute",
- "version": "3.4.8",
+ "version": "3.4.9",
"description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
"type": "module",
"bin": {
diff --git a/src/app/(dashboard)/dashboard/auto-combo/page.tsx b/src/app/(dashboard)/dashboard/auto-combo/page.tsx
index a3d68325c6..022b9cd96a 100644
--- a/src/app/(dashboard)/dashboard/auto-combo/page.tsx
+++ b/src/app/(dashboard)/dashboard/auto-combo/page.tsx
@@ -7,6 +7,7 @@
"use client";
import { useEffect, useState, useCallback } from "react";
+import { Card } from "@/shared/components";
interface ProviderScore {
provider: string;
@@ -152,102 +153,183 @@ export default function AutoComboDashboard() {
];
return (
-
-
⚡ Auto-Combo Engine
-
- {/* Status Bar */}
-
-
- {incidentMode ? "🚨 INCIDENT MODE" : "✅ Normal"}
-
-
- Mode: {MODE_PACKS.find((m) => m.id === modePack)?.label || modePack}
-
-
-
- {/* Mode Pack Selector */}
-
-
🎛️ Mode Pack
-
- {MODE_PACKS.map((mp) => (
-
- ))}
-
-
-
- {/* Provider Scores */}
-
-
📊 Provider Scores
- {scores.length === 0 ? (
-
- No auto-combo configured. Create one via POST /api/combos/auto.
+
+
+
+
⚡ Auto-Combo Engine
+
+ Smart routing automatically adapting to latency, health, and throughput
- ) : (
-
- {scores.map((s) => (
-
-
-
- {s.provider} / {s.model}
-
- {(s.score * 100).toFixed(0)}%
-
- {/* Score Bar */}
-
- {/* Factor Breakdown */}
-
- {Object.entries(s.factors || {}).map(([key, val]) => (
-
- {FACTOR_LABELS[key] || key}: {((val as number) * 100).toFixed(0)}%
-
- ))}
-
-
- ))}
-
- )}
+
- {/* Exclusions */}
-
-
🚫 Excluded Providers
- {exclusions.length === 0 ? (
-
No providers currently excluded.
- ) : (
-
- {exclusions.map((e) => (
+
+
+
+
Status Overview
+
-
-
{e.provider}
-
- Cooldown: {Math.round(e.cooldownMs / 60000)}min
+
+
+ {incidentMode ? "warning" : "check_circle"}
+
+
+ {incidentMode ? "Incident Mode" : "Normal Operation"}
+
+
+ {incidentMode
+ ? "High circuit breaker trip rate detected"
+ : "All providers reporting healthy metrics"}
+
+
- {e.reason}
- ))}
+
+
+
+
tune
+
+
Active Mode Pack
+
+ {MODE_PACKS.find((m) => m.id === modePack)?.label || modePack}
+
+
+
+
+
- )}
+
+
+
Mode Pack
+
+ {MODE_PACKS.map((mp) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ leaderboard
+
+
+
Provider Scores
+
+
+ {scores.length === 0 ? (
+
+ No auto-combo configured or data loading... Create one via{" "}
+ POST /api/combos/auto.
+
+ ) : (
+
+ {scores.map((s) => (
+
+
+
+ {s.provider} / {s.model}
+
+
+ {(s.score * 100).toFixed(0)}%
+
+
+ {/* Score Bar */}
+
+ {/* Factor Breakdown */}
+
+ {Object.entries(s.factors || {}).map(([key, val]) => (
+
+ {FACTOR_LABELS[key] || key}:{" "}
+
+ {((val as number) * 100).toFixed(0)}%
+
+
+ ))}
+
+
+ ))}
+
+ )}
+
+
+
+
+
+
+ block
+
+
+
Excluded Providers
+
+
+ {exclusions.length === 0 ? (
+
+
+ verified
+
+
No providers currently excluded.
+
+ ) : (
+
+ {exclusions.map((e) => (
+
+
+
+
+ {e.provider}
+
+
+
+ Cooldown: {Math.round(e.cooldownMs / 60000)}m
+
+
+
+ info
+ {e.reason}
+
+
+ ))}
+
+ )}
+
);
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index 9fd535b5d6..9bb077bb2f 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -1800,6 +1800,25 @@
"enablePassword": "Enable Password",
"darkMode": "Dark Mode",
"lightMode": "Light Mode",
+ "memoryTitle": "Memory",
+ "memoryDesc": "Persistent cross-session conversational memory",
+ "memoryEnabled": "Enable Memory",
+ "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.",
+ "maxTokens": "Max Tokens",
+ "retentionDays": "Retention",
+ "recent": "Recent",
+ "recentDesc": "Chronological window",
+ "semantic": "Semantic",
+ "semanticDesc": "Vector search",
+ "hybrid": "Hybrid",
+ "hybridDesc": "Recent + Semantic",
+ "skillsTitle": "Skills",
+ "skillsDesc": "Tools for models",
+ "skillsEnabled": "Enable Skills",
+ "skillsEnabledDesc": "Allows agents to trigger functions.",
+ "skillsComingSoon": "Skills marketplace coming soon.",
+ "memorySkillsTitle": "Memory & Skills",
+ "memorySkillsDesc": "Persistent context & capabilities",
"systemTheme": "System Theme",
"debugToggle": "Enable Debug Mode",
"sidebarVisibilityToggle": "Show Sidebar Items",
diff --git a/src/shared/constants/routingStrategies.ts b/src/shared/constants/routingStrategies.ts
index 18d6529db7..988beb9820 100644
--- a/src/shared/constants/routingStrategies.ts
+++ b/src/shared/constants/routingStrategies.ts
@@ -84,6 +84,8 @@ export const ROUTING_STRATEGIES: RoutingStrategyOption[] = [
];
export const SETTINGS_FALLBACK_STRATEGY_VALUES: RoutingStrategyValue[] = [
+ "priority",
+ "weighted",
"fill-first",
"round-robin",
"p2c",