Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions apps/desktop-tauri/src-tauri/src/commands/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,33 @@ fn fetch_context_defaults_to_manual_cookies_without_browser_import() {
assert_eq!(ctx.source_mode, SourceMode::Web);
}

#[test]
fn fetch_context_muse_uses_oauth_login_lane() {
let settings = Settings::default();
let cookies = ManualCookies::default();
let api_keys = ApiKeys::default();
let token_accounts = HashMap::new();

let ctx = super::build_fetch_context(
ProviderId::Muse,
&settings,
&cookies,
&api_keys,
&token_accounts,
);

assert_eq!(ctx.source_mode, SourceMode::Auto);
let provider = instantiate_provider(ProviderId::Muse);
assert_eq!(
provider.available_sources(),
vec![SourceMode::Auto, SourceMode::OAuth]
);
assert!(provider.supports_oauth());
assert!(!provider.supports_web());
assert!(!provider.supports_cli());
assert_eq!(provider.metadata().display_name, "Muse Code");
}

#[test]
fn fetch_context_cursor_cookie_off_stays_cli() {
let mut settings = Settings::default();
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions apps/desktop-tauri/src/components/providers/providerIcons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import meta from "./icons/ProviderIcon-meta.svg?raw";
import mimo from "./icons/ProviderIcon-mimo.svg?raw";
import minimax from "./icons/ProviderIcon-minimax.svg?raw";
import mistral from "./icons/ProviderIcon-mistral.svg?raw";
import muse from "./icons/ProviderIcon-muse.svg?raw";
import notion from "./icons/ProviderIcon-notion.svg?raw";
import xai from "./icons/ProviderIcon-xai.svg?raw";
import ollama from "./icons/ProviderIcon-ollama.svg?raw";
Expand Down Expand Up @@ -127,6 +128,7 @@ const RAW: Record<string, string> = {
notion: tint(notion),
xai: tint(xai),
mistral: tint(mistral),
muse: tint(muse),
ollama: tint(ollama),
opencode: tint(opencode),
opencodego: tint(opencodego),
Expand Down Expand Up @@ -184,6 +186,7 @@ export const PROVIDER_ICON_REGISTRY: Record<string, ProviderIcon> = {
llmproxy: { id: "llmproxy", brandColor: "#4f46e5", fallbackLetter: "L", svgPath: RAW.llmproxy },
minimax: { id: "minimax", brandColor: "#fe603c", fallbackLetter: "M", svgPath: RAW.minimax },
mistral: { id: "mistral", brandColor: "#ff500f", fallbackLetter: "M", svgPath: RAW.mistral },
muse: { id: "muse", brandColor: "#0668e1", fallbackLetter: "M", svgPath: RAW.muse },
ollama: { id: "ollama", brandColor: "#8b95b0", fallbackLetter: "○", svgPath: RAW.ollama },
azureopenai: { id: "azureopenai", brandColor: "#0078d4", fallbackLetter: "A" },
t3chat: { id: "t3chat", brandColor: "#8b5cf6", fallbackLetter: "T", svgPath: RAW.t3chat },
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop-tauri/src/surfaces/TrayPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const HAS_DASHBOARD = new Set([
"mimo", "minimax", "mistral", "nanogpt", "notion", "ollama", "openaiapi",
"opencode", "opencodego", "openrouter", "perplexity", "qoder", "codebuddy", "sakana", "stepfun",
"t3chat", "venice", "vertexai", "warp", "windsurf",
"xai", "zai", "fireworks", "meta",
"xai", "zai", "fireworks", "meta", "muse",
]);
/** Provider IDs that have a status page URL in the backend */
const HAS_STATUS_PAGE = new Set([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ const POLICIES: Readonly<Record<string, UsageSourcePolicy>> = {
},
],
},
muse: {
options: [
{ value: "auto", label: "Auto", description: "Uses the local Muse Code device login." },
{ value: "oauth", label: "Muse Code login", description: "Uses the local Muse Code device-code login only." },
],
},
};

export function usageSourcePolicy(providerId: string): UsageSourcePolicy | null {
Expand Down
1 change: 1 addition & 0 deletions apps/desktop-tauri/src/test/providerCatalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,5 @@ export const TEST_PROVIDER_CATALOG: Array<[string, string]> = [
["qwencloud", "Qwen Cloud"],
["notion", "Notion AI"],
["meta", "Meta"],
["muse", "Muse Code"],
];
4 changes: 4 additions & 0 deletions rust/src/cli/serve/dashboard/icons.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@ static ICONS: &[(&str, &[u8])] = &[
"ProviderIcon-mistral",
include_bytes!("icons/ProviderIcon-mistral.svg"),
),
(
"ProviderIcon-muse",
include_bytes!("icons/ProviderIcon-muse.svg"),
),
(
"ProviderIcon-neuralwatt",
include_bytes!("icons/ProviderIcon-neuralwatt.svg"),
Expand Down
1 change: 1 addition & 0 deletions rust/src/cli/serve/dashboard/icons/ProviderIcon-muse.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 24 additions & 1 deletion rust/src/core/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ pub enum ProviderId {
Fireworks,
#[serde(alias = "metaspark")]
Meta,
Muse,
}

impl ProviderId {
Expand Down Expand Up @@ -161,6 +162,7 @@ impl ProviderId {
ProviderId::Xai,
ProviderId::Fireworks,
ProviderId::Meta,
ProviderId::Muse,
]
}

Expand Down Expand Up @@ -204,6 +206,7 @@ impl ProviderId {
ProviderId::DeepInfra => "deepinfra",
ProviderId::Fireworks => "fireworks",
ProviderId::Meta => "meta",
ProviderId::Muse => "muse",
ProviderId::AiAnd => "aiand",
ProviderId::Windsurf => "windsurf",
ProviderId::Manus => "manus",
Expand Down Expand Up @@ -282,6 +285,7 @@ impl ProviderId {
ProviderId::DeepInfra => "DeepInfra",
ProviderId::Fireworks => "Fireworks",
ProviderId::Meta => "Meta",
ProviderId::Muse => "Muse Code",
ProviderId::AiAnd => "ai&",
ProviderId::Windsurf => "Windsurf",
ProviderId::Manus => "Manus",
Expand Down Expand Up @@ -373,6 +377,7 @@ impl ProviderId {
ProviderId::DeepInfra => None,
ProviderId::Fireworks => None,
ProviderId::Meta => None,
ProviderId::Muse => None,
ProviderId::AiAnd => None,
ProviderId::Windsurf => None,
ProviderId::Doubao => None,
Expand Down Expand Up @@ -446,6 +451,7 @@ impl ProviderId {
"deepseek" | "deep-seek" | "ds" => Some(ProviderId::DeepSeek),
"deepinfra" | "deep-infra" | "di" => Some(ProviderId::DeepInfra),
"fireworks" | "fireworks-ai" | "fw" => Some(ProviderId::Fireworks),
"muse" | "muse-code" | "muse code" => Some(ProviderId::Muse),
"meta" | "metaspark" | "meta-spark" | "muse-spark" | "musespark" | "muse spark"
| "meta muse spark" => Some(ProviderId::Meta),
"aiand" | "ai&" | "ai-and" | "ai and" => Some(ProviderId::AiAnd),
Expand Down Expand Up @@ -842,6 +848,8 @@ pub fn cli_name_map() -> HashMap<&'static str, ProviderId> {
map.insert("di", ProviderId::DeepInfra);
map.insert("fireworks-ai", ProviderId::Fireworks);
map.insert("fw", ProviderId::Fireworks);
map.insert("muse-code", ProviderId::Muse);
map.insert("muse code", ProviderId::Muse);
map.insert("metaspark", ProviderId::Meta);
map.insert("meta-spark", ProviderId::Meta);
map.insert("muse-spark", ProviderId::Meta);
Expand Down Expand Up @@ -976,6 +984,7 @@ pub fn brand_color(id: ProviderId) -> &'static str {
ProviderId::Xai => "#8E8E93",
ProviderId::Fireworks => "#F25B1C",
ProviderId::Meta => "#0467DF",
ProviderId::Muse => "#0668E1",
}
}

Expand All @@ -990,7 +999,7 @@ mod tests {
#[test]
fn test_provider_id_all() {
let all = ProviderId::all();
assert_eq!(all.len(), 71);
assert_eq!(all.len(), 72);
assert!(all.contains(&ProviderId::Claude));
assert!(all.contains(&ProviderId::Codex));
assert!(all.contains(&ProviderId::Fireworks));
Expand Down Expand Up @@ -1042,6 +1051,7 @@ mod tests {
assert!(all.contains(&ProviderId::Notion));
assert!(all.contains(&ProviderId::Xai));
assert!(all.contains(&ProviderId::Meta));
assert!(all.contains(&ProviderId::Muse));
}

#[test]
Expand Down Expand Up @@ -1292,6 +1302,19 @@ mod tests {
assert_eq!(brand_color(ProviderId::Meta), "#0467DF");
}

#[test]
fn test_provider_id_muse() {
assert_eq!(ProviderId::Muse.cli_name(), "muse");
assert_eq!(ProviderId::Muse.display_name(), "Muse Code");
assert_eq!(ProviderId::Muse.cookie_domain(), None);
assert_eq!(ProviderId::from_cli_name("muse"), Some(ProviderId::Muse));
assert_eq!(
ProviderId::from_cli_name("muse-code"),
Some(ProviderId::Muse)
);
assert_eq!(brand_color(ProviderId::Muse), "#0668E1");
}

#[test]
fn test_provider_id_xai() {
assert_eq!(ProviderId::Xai.cli_name(), "xai");
Expand Down
13 changes: 7 additions & 6 deletions rust/src/core/provider_factory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ use crate::providers::{
ElevenLabsProvider, FactoryProvider, FireworksProvider, GeminiProvider, GrokProvider,
GroqProvider, InfiniProvider, JetBrainsProvider, KiloProvider, KimiK2Provider, KimiProvider,
KiroProvider, LLMProxyProvider, LiteLLMProvider, LongCatProvider, ManusProvider, MetaProvider,
MiMoProvider, MiniMaxProvider, MistralProvider, NanoGPTProvider, NeuralwattProvider,
NotionProvider, OllamaProvider, OpenAIApiProvider, OpenCodeGoProvider, OpenCodeProvider,
OpenRouterProvider, PerplexityProvider, PoeProvider, QoderProvider, QwenCloudProvider,
SakanaProvider, StepFunProvider, Sub2ApiProvider, T3ChatProvider, VeniceProvider,
VertexAIProvider, WarpProvider, WayfinderProvider, WindsurfProvider, XaiProvider, ZaiProvider,
ZedProvider, ZenMuxProvider, ZoomMateProvider,
MiMoProvider, MiniMaxProvider, MistralProvider, MuseProvider, NanoGPTProvider,
NeuralwattProvider, NotionProvider, OllamaProvider, OpenAIApiProvider, OpenCodeGoProvider,
OpenCodeProvider, OpenRouterProvider, PerplexityProvider, PoeProvider, QoderProvider,
QwenCloudProvider, SakanaProvider, StepFunProvider, Sub2ApiProvider, T3ChatProvider,
VeniceProvider, VertexAIProvider, WarpProvider, WayfinderProvider, WindsurfProvider,
XaiProvider, ZaiProvider, ZedProvider, ZenMuxProvider, ZoomMateProvider,
};

/// Instantiate the concrete [`Provider`] implementation for a given [`ProviderId`].
Expand Down Expand Up @@ -100,6 +100,7 @@ pub fn instantiate(id: ProviderId) -> Box<dyn Provider> {
ProviderId::Xai => Box::new(XaiProvider::new()),
ProviderId::Fireworks => Box::new(FireworksProvider::new()),
ProviderId::Meta => Box::new(MetaProvider::new()),
ProviderId::Muse => Box::new(MuseProvider::new()),
}
}

Expand Down
3 changes: 2 additions & 1 deletion rust/src/core/token_accounts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,8 @@ impl TokenAccountSupport {
| ProviderId::Wayfinder
| ProviderId::QwenCloud
| ProviderId::Fireworks
| ProviderId::Meta => None,
| ProviderId::Meta
| ProviderId::Muse => None,
}
}

Expand Down
2 changes: 2 additions & 0 deletions rust/src/providers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ pub mod meta;
pub mod mimo;
pub mod minimax;
pub mod mistral;
pub mod muse;
pub mod nanogpt;
pub mod neuralwatt;
pub mod notion;
Expand Down Expand Up @@ -124,6 +125,7 @@ pub use meta::MetaProvider;
pub use mimo::MiMoProvider;
pub use minimax::{MiniMaxProvider, MiniMaxRegion};
pub use mistral::MistralProvider;
pub use muse::MuseProvider;
pub use nanogpt::NanoGPTProvider;
pub use neuralwatt::NeuralwattProvider;
pub use notion::NotionProvider;
Expand Down
Loading