Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
c6efa07
Harden provider numeric boundaries
Finesssee Sep 21, 2026
703e0d5
Harden oversized provider usage values
Finesssee Sep 21, 2026
33fde92
Reconcile Kimi zero ratio placeholders
Finesssee Sep 21, 2026
594159c
Port standalone Pi history
Finesssee Sep 21, 2026
fc54a8c
Keep shared-workspace accounts distinct by user
gleaming9 Sep 22, 2026
d2e2d54
Merge remote-tracking branch 'origin/codex/port-0.63.0-num-b' into co…
Finesssee Sep 22, 2026
ecdf2c5
Merge remote-tracking branch 'origin/codex/port-0.63.0-kimi-zero' int…
Finesssee Sep 22, 2026
5fcc5e8
Honor Kimi manual cookie policy
Finesssee Sep 22, 2026
7ca9714
Default Kimi cookie discovery to automatic
Finesssee Sep 22, 2026
bc00490
Route Kimi through selected region
Finesssee Sep 22, 2026
70da771
Merge remote-tracking branch 'origin/codex/port-0.63.0-num-b' into co…
Finesssee Sep 22, 2026
9eac174
Merge remote-tracking branch 'origin/codex/port-0.63.0-pi' into codex…
Finesssee Sep 22, 2026
b1a619c
Contain oversized Claude history values
Finesssee Sep 22, 2026
6d5763a
Centralize unsigned Claude pricing
Finesssee Sep 22, 2026
f1b2918
Centralize provider dashboard routing
Finesssee Sep 22, 2026
78c0c95
Add stacked provider tray mode
Finesssee Sep 22, 2026
a311d93
Centralize tray presentation planning
Finesssee Sep 22, 2026
0837354
Fix tray presentation snapshot lifetimes
Finesssee Sep 22, 2026
299aadb
Retire Crof provider safely
Finesssee Sep 22, 2026
1ccb4de
Canonicalize loaded provider identifiers
Finesssee Sep 22, 2026
6193e7c
Exclude inherited Codex fork baselines
Finesssee Sep 22, 2026
f7d37e8
Model Codex parser modes explicitly
Finesssee Sep 22, 2026
340de7d
Persist inherited-only fork accounting
Finesssee Sep 22, 2026
54b69cb
Estimate Antigravity local history costs
Finesssee Sep 22, 2026
7bb133a
Track local pricing coverage
Finesssee Sep 22, 2026
33697f1
Fix local pricing coverage totals
Finesssee Sep 22, 2026
d5128cc
Fix stacked tray presentation structure
Finesssee Sep 22, 2026
58e984b
Fix partial overview spend expectation
Finesssee Sep 22, 2026
1badfe8
Fix Codex fork accounting precedence
Finesssee Sep 22, 2026
5dcb845
Fix tray render test lifetime
Finesssee Sep 22, 2026
d3be018
Fix Codex fork accounting test access
Finesssee Sep 22, 2026
f64861c
Fix Codex fork baseline provenance
Finesssee Sep 22, 2026
3521a23
Fix Codex parent baseline transition order
Finesssee Sep 22, 2026
f7d1ad9
Fix fork cache replacement test
Finesssee Sep 22, 2026
0735ff5
Reconcile inferred Codex forks in one scan
Finesssee Sep 22, 2026
361655e
Order Codex scan work by lineage
Finesssee Sep 22, 2026
b77e3c1
Merge remote-tracking branch 'origin/main' into codex/fix-pr-597-ci
Finesssee Sep 22, 2026
4d0b599
Fail closed on ambiguous Codex lineage
Finesssee Sep 22, 2026
9b2361a
Validate Codex lineage across refreshes
Finesssee Sep 22, 2026
0a2789e
Merge remote-tracking branch 'origin/main' into codex/fix-pr-597-ci
Finesssee Sep 22, 2026
4558dc2
Harden Codex fork lineage validation
Finesssee Sep 22, 2026
a7f685a
Consolidate Codex lineage validation graph
Finesssee Sep 22, 2026
ac88694
Reject late ordinal gaps in inferred forks
Finesssee Sep 22, 2026
042c88b
Bound Antigravity local history scans
Finesssee Sep 23, 2026
cce5b27
Preserve uncertainty in Claude history scans
Finesssee Sep 23, 2026
69398db
Avoid Clippy warnings in Claude history scanning
Finesssee Sep 23, 2026
99cc6be
Merge branch 'main' into codex/port-0.63.0-kimi-zero
Finesssee Sep 23, 2026
35ff684
Integrate history fixes with current main
Finesssee Sep 23, 2026
94884db
Stabilize tray panel sizing test
Finesssee Sep 23, 2026
0f759e6
Remove shell startup timing from login exit tests
Finesssee Sep 23, 2026
a6517c3
Require known Kimi legacy window duration
Finesssee Sep 23, 2026
c2bf8b5
Merge remote-tracking branch 'origin/main' into codex/fix-pr587-windo…
Finesssee Sep 23, 2026
4f5a661
Test Claude daily history public coverage
Finesssee Sep 23, 2026
cd2a624
Merge remote-tracking branch 'origin/main' into codex/fix-pr-605-thermo
Finesssee Sep 23, 2026
5e5fd5a
Bound tray sizing test timeout to async work
Finesssee Sep 23, 2026
7cadca5
Integrate corrected Kimi reconciliation and bounded CI test
Finesssee Sep 23, 2026
96e5e2e
Integrate Kimi cookie policy and selected-region routing
Finesssee Sep 23, 2026
3aec9b6
Integrate checked Claude history aggregation and public regression
Finesssee Sep 23, 2026
cc6a8a0
Integrate Crof retirement with current provider catalog
Finesssee Sep 23, 2026
68c5481
Integrate Codex fork baseline exclusion
Finesssee Sep 23, 2026
82bad19
Integrate distinct users in shared Codex workspaces
Finesssee Sep 23, 2026
ff72bfa
Integrate reviewed stacked tray presentation
Finesssee Sep 23, 2026
b35ec29
Skip pricing zero-token Antigravity events
Finesssee Sep 23, 2026
d28d3b4
Integrate Antigravity estimates and corrected zero-token coverage
Finesssee Sep 23, 2026
ab706db
Canonicalize stacked provider preferences
Finesssee Sep 23, 2026
775a4c4
Reuse Codex lineage plan per refresh
Finesssee Sep 23, 2026
c54f673
Bound Codex lineage planning during port integration
Finesssee Sep 23, 2026
bc1ac36
Initialize lineage planner in one branch expression
Finesssee Sep 23, 2026
d32defc
Integrate definite lineage planner initialization
Finesssee Sep 23, 2026
b79e67e
Separate stacked preference enablement regression
Finesssee Sep 23, 2026
c186e19
Prefer current Codex lineage metadata
Finesssee Sep 23, 2026
23e449f
Reconcile fresh lineage metadata on bounded rescans
Finesssee Sep 23, 2026
2df956f
Allow proof harness to seed multiple providers
Finesssee Sep 23, 2026
1455c04
Keep validated proof seed state in memory
Finesssee Sep 23, 2026
5d2d39e
Scope lineage invalidation to active dependencies
Finesssee Sep 23, 2026
eb41733
Limit lineage cache invalidation to active dependencies
Finesssee Sep 23, 2026
6eec2e2
Fall back to API key dashboard URLs
Finesssee Sep 23, 2026
da5ce39
Compile Antigravity offline count helper only for tests
Finesssee Sep 23, 2026
e354f3f
Reinfer grown subagent history from start
Finesssee Sep 23, 2026
aca5988
Preserve unknown Claude daily costs
Finesssee Sep 23, 2026
a9af9ff
Use public API key catalog export
Finesssee Sep 23, 2026
63e243d
Remove obsolete cached local provenance
Finesssee Sep 23, 2026
08ad198
Clarify Kimi manual cookie error
Finesssee Sep 23, 2026
2aa7ff5
Add isolated no-focus Antigravity proof mode
Finesssee Sep 24, 2026
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
49 changes: 43 additions & 6 deletions apps/desktop-tauri/src-tauri/src/commands/bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,8 @@ pub struct SettingsSnapshot {
predictive_pace_warning_enabled: bool,
show_pace: bool,
tray_icon_mode: &'static str,
stacked_tray_top_provider: Option<String>,
stacked_tray_bottom_provider: Option<String>,
switcher_shows_icons: bool,
menu_bar_shows_highest_usage: bool,
menu_bar_shows_percent: bool,
Expand Down Expand Up @@ -719,24 +721,56 @@ pub struct SettingsSnapshot {
provider_accent_colors: std::collections::HashMap<String, String>,
}

#[tauri::command]
pub fn get_bootstrap_state() -> BootstrapState {
let settings = Settings::load();
fn bootstrap_state_from_settings(settings: Settings) -> BootstrapState {
BootstrapState {
contract_version: "v1",
providers: provider_catalog_for(&settings),
settings: SettingsSnapshot::from(settings),
}
}

#[cfg(not(test))]
#[tauri::command]
pub fn get_provider_catalog() -> Vec<ProviderCatalogEntry> {
pub fn get_bootstrap_state(
state: tauri::State<'_, Mutex<AppState>>,
) -> Result<BootstrapState, String> {
Ok(bootstrap_state_from_settings(settings_for_command(&state)?))
}

#[cfg(test)]
#[tauri::command]
pub fn get_bootstrap_state() -> BootstrapState {
bootstrap_state_from_settings(Settings::default())
}

#[tauri::command]
pub fn get_provider_catalog(
state: tauri::State<'_, Mutex<AppState>>,
) -> Result<Vec<ProviderCatalogEntry>, String> {
Ok(provider_catalog_for(&settings_for_command(&state)?))
}

pub fn get_provider_catalog_for_current_settings() -> Vec<ProviderCatalogEntry> {
provider_catalog_for(&Settings::load())
}

#[tauri::command]
pub fn get_settings_snapshot() -> SettingsSnapshot {
SettingsSnapshot::from(Settings::load())
pub fn get_settings_snapshot(
state: tauri::State<'_, Mutex<AppState>>,
) -> Result<SettingsSnapshot, String> {
Ok(SettingsSnapshot::from(settings_for_command(&state)?))
}

fn settings_for_command(state: &tauri::State<'_, Mutex<AppState>>) -> Result<Settings, String> {
let guard = state.lock().map_err(|error| error.to_string())?;
if guard.is_containment_proof() {
guard
.proof_settings()
.cloned()
.ok_or_else(|| "containment proof settings are unavailable".to_string())
} else {
Ok(Settings::load())
}
}

impl From<Settings> for SettingsSnapshot {
Expand Down Expand Up @@ -783,6 +817,8 @@ impl From<Settings> for SettingsSnapshot {
predictive_pace_warning_enabled: settings.predictive_pace_warning_enabled,
show_pace: settings.show_pace,
tray_icon_mode: tray_icon_mode_label(settings.tray_icon_mode),
stacked_tray_top_provider: settings.stacked_tray_top_provider,
stacked_tray_bottom_provider: settings.stacked_tray_bottom_provider,
switcher_shows_icons: settings.switcher_shows_icons,
menu_bar_shows_highest_usage: settings.menu_bar_shows_highest_usage,
menu_bar_shows_percent: settings.menu_bar_shows_percent,
Expand Down Expand Up @@ -876,6 +912,7 @@ fn tray_icon_mode_label(mode: TrayIconMode) -> &'static str {
match mode {
TrayIconMode::Single => "single",
TrayIconMode::PerProvider => "perProvider",
TrayIconMode::Stacked => "stacked",
}
}

Expand Down
34 changes: 28 additions & 6 deletions apps/desktop-tauri/src-tauri/src/commands/locale_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,22 @@ fn locale_strings_for(lang: Language) -> LocaleStrings {
/// the persisted label (`"english"`, `"chinese"`), or the full name
/// (`"English"`, `"Chinese"`, `"中文"`).
#[tauri::command]
pub fn get_locale_strings(language: Option<String>) -> Result<LocaleStrings, String> {
let lang = match language.as_deref() {
None => locale::current_language(),
Some(raw) => {
parse_locale_language(raw).ok_or_else(|| format!("unknown language code: {raw}"))?
pub fn get_locale_strings(
state: tauri::State<'_, Mutex<AppState>>,
language: Option<String>,
) -> Result<LocaleStrings, String> {
let proof_mode = state
.lock()
.map(|guard| guard.is_containment_proof())
.unwrap_or(true);
let lang = if proof_mode {
Language::English
} else {
match language.as_deref() {
None => locale::current_language(),
Some(raw) => {
parse_locale_language(raw).ok_or_else(|| format!("unknown language code: {raw}"))?
}
}
};
Ok(locale_strings_for(lang))
Expand All @@ -71,7 +82,18 @@ fn parse_locale_language(raw: &str) -> Option<Language> {
/// Persist the UI language and emit a `locale-changed` event so the
/// frontend can refetch its locale table without a restart.
#[tauri::command]
pub fn set_ui_language(app: tauri::AppHandle, language: String) -> Result<(), String> {
pub fn set_ui_language(
app: tauri::AppHandle,
state: tauri::State<'_, Mutex<AppState>>,
language: String,
) -> Result<(), String> {
if state
.lock()
.map(|guard| guard.is_containment_proof())
.unwrap_or(true)
{
return Err("settings mutations disabled in containment proof mode".to_string());
}
let lang =
parse_locale_language(&language).ok_or_else(|| format!("unknown language: {language}"))?;
let mut settings = Settings::load();
Expand Down
33 changes: 33 additions & 0 deletions apps/desktop-tauri/src-tauri/src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,39 @@ fn canonical_provider_arg(provider_id: &str) -> Result<String, String> {
Ok(parse_provider_arg(provider_id)?.cli_name().to_string())
}

fn provider_dashboard_url(id: ProviderId, settings: &Settings) -> Option<String> {
match id {
ProviderId::MiniMax => Some(
codexbar::providers::MiniMaxProvider::dashboard_url_for_region(Some(
settings.api_region(id),
)),
),
ProviderId::Kimi => Some(
codexbar::providers::KimiRegion::from_settings(Some(settings.api_region(id)))
.console_url()
.to_string(),
),
ProviderId::OpenRouter => instantiate_provider(id)
.metadata()
.dashboard_url
.map(str::to_string),
_ => provider_dashboard_url_from_sources(
instantiate_provider(id).metadata().dashboard_url,
codexbar::settings::get_api_key_providers()
.into_iter()
.find(|provider| provider.id == id)
.and_then(|provider| provider.dashboard_url),
),
}
}

fn provider_dashboard_url_from_sources(
metadata_url: Option<&'static str>,
api_key_catalog_url: Option<&'static str>,
) -> Option<String> {
metadata_url.or(api_key_catalog_url).map(str::to_string)
}

fn validate_single_line_secret(value: &str, field: &str, max_len: usize) -> Result<(), String> {
let trimmed = value.trim();
if trimmed.is_empty() {
Expand Down
10 changes: 1 addition & 9 deletions apps/desktop-tauri/src-tauri/src/commands/provider_detail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,15 +73,7 @@ pub(crate) fn build_provider_detail(
let provider = instantiate_provider(id);
let metadata = provider.metadata();
let resume_supported = auto_resume_supported(id);
let dashboard_url = if id == codexbar::core::ProviderId::MiniMax {
Some(
codexbar::providers::MiniMaxProvider::dashboard_url_for_region(Some(
settings.api_region(id),
)),
)
} else {
metadata.dashboard_url.map(|s| s.to_string())
};
let dashboard_url = provider_dashboard_url(id, &settings);

let detail = ProviderDetail {
id: id.cli_name().to_string(),
Expand Down
34 changes: 33 additions & 1 deletion apps/desktop-tauri/src-tauri/src/commands/provider_refresh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ fn provider_cache_can_skip_refresh(
.iter()
.any(|snapshot| snapshot.provider_id == id.cli_name())
});
if !force && crate::proof_harness::seed_usage_json_active() && cache_has_all {
if !force && state.provider_cache_seeded && cache_has_all {
return true;
}
!force
Expand Down Expand Up @@ -125,6 +125,38 @@ pub(super) fn complete_provider_refresh(
mod tests {
use super::*;

#[test]
fn validated_seed_pins_only_complete_nonforced_cache() {
let mut state = AppState::new();
state.provider_cache.push(
crate::proof_harness::parse_seed_usage_snapshot(
r#"{"providerId":"codex","primary":{"usedPercent":25.0}}"#,
)
.unwrap(),
);
assert!(!provider_cache_can_skip_refresh(
&state,
false,
&[ProviderId::Codex]
));
state.provider_cache_seeded = true;
assert!(provider_cache_can_skip_refresh(
&state,
false,
&[ProviderId::Codex]
));
assert!(!provider_cache_can_skip_refresh(
&state,
true,
&[ProviderId::Codex]
));
assert!(!provider_cache_can_skip_refresh(
&state,
false,
&[ProviderId::Codex, ProviderId::Claude]
));
}

#[test]
fn stale_inputs_cannot_reserve_a_new_generation_after_invalidation() {
let mut state = AppState::new();
Expand Down
13 changes: 13 additions & 0 deletions apps/desktop-tauri/src-tauri/src/commands/provider_settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ fn region_provider(provider_id: &str) -> Option<codexbar::core::ProviderId> {
"alibabatokenplan" => ProviderId::AlibabaTokenPlan,
"zai" => ProviderId::Zai,
"minimax" => ProviderId::MiniMax,
"kimi" => ProviderId::Kimi,
_ => return None,
})
}
Expand All @@ -284,6 +285,10 @@ pub(crate) fn provider_region_lookup(settings: &Settings, provider_id: &str) ->
))
.settings_value()
.to_string()
} else if id == codexbar::core::ProviderId::Kimi {
codexbar::providers::KimiRegion::from_settings(Some(settings.api_region(id)))
.settings_value()
.to_string()
} else {
settings.api_region(id).to_string()
}
Expand Down Expand Up @@ -820,6 +825,14 @@ pub fn region_options_for(provider_id: &str) -> Vec<RegionOption> {
.to_string(),
},
],
"kimi" => codexbar::providers::KimiRegion::ALL
.iter()
.copied()
.map(|region| RegionOption {
value: region.settings_value().to_string(),
label: region.display_name().to_string(),
})
.collect(),
"alibabatokenplan" => codexbar::providers::AlibabaTokenPlanRegion::ALL
.iter()
.copied()
Expand Down
37 changes: 29 additions & 8 deletions apps/desktop-tauri/src-tauri/src/commands/providers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use serde::Serialize;
use std::sync::Arc;

const MAX_CONCURRENT_PROVIDER_FETCHES: usize = 8;
const PROOF_REFRESH_DISABLED: &str = "provider refresh disabled in containment proof mode";

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum RefreshScope {
Expand Down Expand Up @@ -379,10 +380,13 @@ async fn do_refresh_providers_with_policy(
scope: RefreshScope,
) -> Result<ProviderRefreshOutcome, String> {
let state = app.state::<Mutex<AppState>>();
let expected_generation = state
.lock()
.map_err(|e| e.to_string())?
.provider_refresh_generation;
let expected_generation = {
let guard = state.lock().map_err(|e| e.to_string())?;
if guard.is_containment_proof() {
return Err(PROOF_REFRESH_DISABLED.to_string());
}
guard.provider_refresh_generation
};
let settings = Settings::load();
let enabled_ids = settings.get_enabled_provider_ids();
let refresh_ids = scope.provider_ids(&settings, &enabled_ids);
Expand Down Expand Up @@ -1159,6 +1163,13 @@ pub struct DeepSeekPricingStatus {
pub fn get_deepseek_pricing_status(
state: tauri::State<'_, Mutex<AppState>>,
) -> Option<DeepSeekPricingStatus> {
if state
.lock()
.map(|guard| guard.is_containment_proof())
.unwrap_or(true)
{
return None;
}
let settings = Settings::load();
if !settings.enabled_providers.contains("deepseek") {
return None;
Expand Down Expand Up @@ -1203,11 +1214,21 @@ pub async fn refresh_providers_if_stale(app: tauri::AppHandle) -> Result<(), Str
pub fn get_cached_providers(
state: tauri::State<'_, Mutex<AppState>>,
) -> Vec<ProviderUsagePresentationSnapshot> {
let snapshots = state
let (snapshots, proof_mode, proof_settings) = state
.lock()
.map(|guard| guard.provider_cache.clone())
.unwrap_or_default();
let settings = Settings::load();
.map(|guard| {
(
guard.provider_cache.clone(),
guard.is_containment_proof(),
guard.proof_settings().cloned(),
)
})
.unwrap_or((Vec::new(), true, None));
let settings = if proof_mode {
proof_settings.unwrap_or_default()
} else {
Settings::load()
};

snapshots
.into_iter()
Expand Down
Loading