* feat: add Nix Flake release and update documentation for Nix integration
- Added flake.nix with native library patching for Linux
- Included SHA256 hashes for v0.10.0 DEB releases (x86_64 and arm64)
- Updated README.md with instructions for nix run, NixOS, Home Manager, and devShells
- Generated flake.lock for reproducibility
* refactor: improve Nix Flake patterns for better consumer control
- Extracted derivation logic into a reusable `mkPackage` function
- Exposed `overlays.default` to allow consumers to use their own nixpkgs instance
- Updated `pkgs.system` to `pkgs.stdenv.hostPlatform.system` to follow modern Nix patterns
- Ensured default `packages` definition correctly handles unfree configuration for testing with `nix build` or `nix run`
* docs: update README with advanced Nix integration patterns
- Added Option 1 (Direct Integration) and Option 2 (Overlay) documentation
- Explained how to use the overlay for full nixpkgs control
- Fixed Markdown styling and lint issues in the Nix integration section
* docs: simplify Nix documentation to favor Overlay integration
- Removed "Option 1" (direct integration) as per user feedback
- Promoted the Overlay method as the standard way to consume the package
- Updated devShell examples to rely on the overlayed package set for consistency
* fix(security): prevent master key overwriting on decryption failure and improve account loading resilience
- Modify readSafeStorageKey and generatePrimaryMasterKey to stop if decryption fails for an existing file, preventing permanent data loss when keyring is temporarily locked.
- Update CloudAccountRepo.getAccounts and getAccount to gracefully skip corrupted account records instead of throwing errors.
- Added detailed logging for security failures to aid in diagnostics.
* docs(readme): sync Nix/NixOS integration docs in README.zh-CN
---------
Co-authored-by: Youssef <[email protected]>
* fix(linux): dynamic executable path detection
The hardcoded path '/usr/share/antigravity/antigravity' was causing
profile switching to fail on Linux when the app was installed in
standard locations like /usr/bin or /opt.
Implemented multi-path probing and /usr/local/bin:/usr/bin:/usr/local/sbin:/var/lib/flatpak/exports/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl lookup to correctly find
the binary for relaunch after profile swap.
* fix: return empty string when no executable found
Address codereview feedback: both windows and linux branches now
return '' when no binary is found at any known location, consistent
with the default case. Callers handle empty string as 'binary not
found' and will surface a clear error.
* chore: update package-lock.json to reflect changes in dependency configurations
---------
Co-authored-by: Muhammad Usama <[email protected]>
Co-authored-by: Draculabo <[email protected]>
* Refactor Gemini model display: filter old versions, group low/high pro, and improve naming
* Fix potential negative minutes and refine Gemini 3 Pro grouping logic based on PR feedback
* The account change process has been sped up
* Address PR review: enhance error message and parameterize polling interval in process handler
* Address PR review: fix potential race condition in database backup logic
* fix: prevent renderer white screen and harden sentry gating
* feat: localize model labels
* chore: enable hoisted node-linker
* chore: ignore .agent/.claude/.codex in prettier
---------
Co-authored-by: Draculabo <[email protected]>
* feat: Add powerful CLI for account management
- 18 commands for quota monitoring, switching, validation
- Interactive mode with keyboard navigation
- Smart auto-switch based on quotas
- Alias support for quick access
- Token auto-refresh and diagnostics
- Full documentation in cli/README.md"
* fix: Address code review issues - Add SQLite transactions for atomicity\n- Add input validation for import_accounts\n- Add per-account error handling in bulk operations\n- Add graceful error handling in interactive mode\n- Add validation for varint encoding (negative values)\n- Improve user feedback on partial failures
* feat: Implement provider groupings with account calculator and comprehensive fixes
- Add provider detection utilities (detectProvider, PROVIDER_REGISTRY) for Claude/Gemini/Others categorization
- Implement grouping logic (groupModelsByProvider, calculateProviderStats, calculateAccountStats) with health status calculation
- Create useProviderGrouping hook for collapsible state management and persistence
- Add ProviderGroup component with health indicators, progress bars, and model visibility integration
- Enhance CloudAccountList with account-level calculator showing overall percentage and earliest reset time
- Implement grid layout selector (auto/2-col/3-col/list) with config persistence and tooltips
- Add global quota aggregate bar across all accounts in top statistics
- Fix model visibility settings regression by accessing account.quota.models instead of account.quota
- Show 'Rate Limited' instead of '0%' for exhausted quotas with consistent getQuotaLabel function
- Add comprehensive i18n translations for layout selector and rate limited labels (en, zh-CN, ru)
- Disable batch operations when provider groupings are enabled to prevent conflicts
- Include unit tests for provider detection logic and grouping functionality
Addresses critical issues: model list regression, rate limited display, layout control, global quota visibility, and consistent quota labeling across all components.
* fix: resolve ESLint no-ex-assign violations in proxy service
- Fix exception parameter reassignment in catch blocks
- Rename catch parameters to avoid no-ex-assign rule violations
- Maintain same error handling logic while complying with linting rules
* fix: add missing Models tab to settings page
- Add Models tab between General and Proxy tabs
- Import and integrate ModelVisibilitySettings component
- Fix critical regression where model visibility settings were inaccessible
* fix: add missing React hook imports in settings route
* test: remove obsolete tests for removed controller APIs
---------
Co-authored-by: Draculabo <[email protected]>
## Problem
Application crashes with exit code 0xC0000374 (heap corruption) at ~7 minute mark due to excessive process monitoring subprocess spawning.
## Root Cause
StatusBar component continuously polls process status every 2 seconds (2000ms refetchInterval), triggering:
- ~210 subprocess invocations over 7 minutes
- Each invocation spawns find-process subprocess
- Accumulated process handles lead to heap corruption
- OS terminates renderer with 0xC0000374 exit code
## Solution
Reduce UI polling interval from 2 seconds to 10 seconds:
- Reduces subprocess spawning by 5x (210 42 calls over 7 minutes)
- 10-second UI update delay is imperceptible to users
- Purely cosmetic feature doesn't require real-time responsiveness
- Expected result: App survives 30+ minutes instead of 7 minutes
## Testing
- Can be tested by running app continuously for 30+ minutes
- Monitor for absence of 0xC0000374 exit codes
- Verify StatusBar still updates (with 10s delay instead of 2s)
## Impact
- Risk: LOW (configuration-only change)
- User impact: Minimal (UI status indicator updates slightly slower)
- System impact: CRITICAL - Prevents crash loop
* feat: Add sensitive data masking to packet logging by introducing a sanitization function and a list of sensitive keys.
* test: mock console methods in logger tests and restore after each test
* refactor: remove redundant sensitive data masking functions and integrate safeStringifyPacket utility for improved logging
* fix: run format:write
* test: enhance logger tests with error handling for directory setup and cleanup
* refactor: optimize sensitive data masking logic by checking for exact matches in sensitive keys
* refactor: enhance sensitive data masking to handle circular references and improve sanitization logic
* refactor: update sensitive data masking comments and test descriptions to improve clarity and consistency
* test: enhance logger tests with dynamic log directory creation and cleanup after tests
* test: add unit tests for handling malformed JSON strings in sensitive data masking