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
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@ public enum MistralCookieImporter {

public static func importSession(
browserDetection: BrowserDetection,
preferredBrowsers: [Browser] = [.chrome],
preferredBrowsers: [Browser]? = nil,
logger: ((String) -> Void)? = nil) throws -> SessionInfo
{
let log: (String) -> Void = { msg in logger?("[mistral-cookie] \(msg)") }
let installedBrowsers = preferredBrowsers.isEmpty
? mistralCookieImportOrder.cookieImportCandidates(using: browserDetection)
: preferredBrowsers.cookieImportCandidates(using: browserDetection)
let order = preferredBrowsers ?? mistralCookieImportOrder
let installedBrowsers = order.isEmpty
? Browser.defaultImportOrder.cookieImportCandidates(using: browserDetection)
: order.cookieImportCandidates(using: browserDetection)

for browserSource in installedBrowsers {
do {
Expand Down Expand Up @@ -73,7 +74,7 @@ public enum MistralCookieImporter {

public static func hasSession(
browserDetection: BrowserDetection,
preferredBrowsers: [Browser] = [.chrome],
preferredBrowsers: [Browser]? = nil,
logger: ((String) -> Void)? = nil) -> Bool
{
do {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public enum MistralProviderDescriptor {
defaultEnabled: false,
isPrimaryProvider: false,
usesAccountFallback: false,
browserCookieOrder: ProviderBrowserCookieDefaults.defaultImportOrder,
browserCookieOrder: ProviderBrowserCookieDefaults.mistralCookieImportOrder,
dashboardURL: "https://admin.mistral.ai/organization/usage",
statusPageURL: nil,
statusLinkURL: "https://status.mistral.ai"),
Expand Down
13 changes: 13 additions & 0 deletions Sources/CodexBarCore/Providers/Providers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -288,4 +288,17 @@ public enum ProviderBrowserCookieDefaults {
nil
#endif
}

/// Mistral Auto: Chrome first (matches the original Chrome-only behavior so
/// existing users see no change), then Firefox so users signed in via Firefox
/// or Firefox Developer Edition are detected without Manual mode. Safari
/// follows for Full Disk Access users. Other Chromium forks stay on Manual
/// import to avoid scanning the full default order.
public static var mistralCookieImportOrder: BrowserCookieImportOrder? {
#if os(macOS)
[.chrome, .firefox, .safari]
#else
nil
#endif
}
}
11 changes: 11 additions & 0 deletions Tests/CodexBarTests/BrowserCookieOrderLabelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,5 +86,16 @@ struct BrowserCookieOrderStatusStringTests {
#expect(ProviderDefaults.metadata[.copilot]?.browserCookieOrder == [.chrome])
#expect(ProviderBrowserCookieDefaults.copilotCookieImportOrder == [.chrome])
}

@Test
func `mistral cookie import order supports chrome firefox and safari`() {
let order = ProviderDefaults.metadata[.mistral]?.browserCookieOrder ?? Browser.defaultImportOrder
#expect(order == ProviderBrowserCookieDefaults.mistralCookieImportOrder)
#expect(order == [.chrome, .firefox, .safari])
#expect(order.first == .chrome)
#expect(order.contains(.firefox))
#expect(!order.contains(.edge))
#expect(!order.contains(.arc))
}
#endif
}
1 change: 1 addition & 0 deletions docs/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ headers, source selection, provider ordering, and token accounts are stored in `

## Mistral
- Session cookie (`ory_session_*`) from browser auto-import or manual `Cookie:` header.
- Cookie import order: Chrome → Firefox → Safari. Chrome first preserves the original behavior for existing users; Firefox (including Developer Edition) is detected automatically; Safari follows for Full Disk Access users. Other Chromium forks use Manual mode.
- CSRF token (`csrftoken` cookie) sent as `X-CSRFTOKEN` for billing and Vibe usage requests.
- Domains: `admin.mistral.ai` for API billing and credit balance, and `console.mistral.ai` for optional Vibe subscription usage. Console requests forward only `csrftoken` and `ory_session_*`; all other admin cookies stay origin-bound.
- Reads monthly usage and pricing from the billing usage endpoint, plus credit balance from the billing credits endpoint, using the Mistral web session.
Expand Down