- Add dedicated API logger (api-logger.ts) with winston daily rotation
- Create Fastify plugin (api-logging.plugin.ts) to intercept all API requests/responses
- Log request start, body, response, errors, and summary with precise timestamps
- Auto-mask sensitive data using existing sanitizeObject utility
- Register API logging plugin in NestJS bootstrap (server/main.ts)
- Add npm run dev script with cross-env for automatic DEBUG on Windows
- Install cross-env as devDependency for cross-platform env vars
* 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]>
* chore: mark peer dependencies in package-lock.json
* docs: add comprehensive developer guide for antigravity-manager
* build: add @radix-ui/react-tooltip dependency
The tooltip component is needed for future UI enhancements to provide better user guidance and information display.
* feat(StatusBar): add collapsed view with toggle button
- Introduce `isCollapsed` prop to support both expanded and compact layouts
- Collapsed view shows a single icon button with status tooltip
- Enhanced visual styling with shadows, borders, and improved spacing
- Use Tooltip component to display status in collapsed mode
* feat(ui): add Radix UI tooltip component wrapper
Create a reusable tooltip component using Radix UI primitives.
The wrapper provides styled content with animations and integrates
with the project's class name utility for consistent theming.
* feat(layout): add collapsible sidebar with persistent state
- Add toggle button to collapse/expand sidebar with smooth animations
- Persist sidebar state in localStorage to maintain user preference
- Show tooltips for navigation items when sidebar is collapsed
- Adjust StatusBar component to support collapsed state
* chore: remove "peer": true flags from package-lock.json
* build: mark peer dependencies in package-lock.json
* build: add yaml v2.8.2 dependency and update package-lock
* docs(project_overview): update skill documentation formatting
* docs: remove extra blank line in AGENTS.md
* docs: update changelog formatting to use hyphens
* docs: improve readability of OpenSpec workflow files
* chore: standardize YAML string quotes in GitHub configs
* style(StatusBar): reformat JSX for consistency and readability
- Simplify className expres
* style(ui): standardize quotes and class order in tooltip component
- Use single quotes consistently across imports and strings
- Reorder Tailwind CSS classes to follow recommended conventions
* style(ipc): remove unnecessary parentheses in debug log statement
* style(MainLayout): improve code formatting and consistency
- Reformat multi-line import for better readability
- Normalize Tailwind CSS class ordering
- Remove unnecessary whitespace and ensure consistent quotes
- Maintain all functionality while improving code style
* style(i18n): format long translation strings for better readability
* style: remove unnecessary line break in logger.info call
The logger.info call had an unnecessary line break that made the code less readable. The line has been consolidated to improve code style consistency.
* chore: disable several ESLint rules for development flexibility
Disable TypeScript ESLint rules and other linting rules that are too restrictive during active development. This allows faster iteration without constant linting errors for common patterns like `any` types, unused variables, and inline comments.
* refactor: use const for immutable variables in request mapper
- Change `let` to `const` for variables that are not reassigned
- Improves code clarity and prevents accidental reassignment
* refactor: replace direct hasOwnProperty calls with safe variant
Use Object.prototype.hasOwnProperty.call to avoid issues when objects have overridden hasOwnProperty method. This ensures consistent behavior across all object types.
* fix: disable eslint for intentional assignment in useEffect
The eslint warning was triggered by directly using setProxyConfig with config.proxy inside useEffect without including it in the dependency array. This assignment is intentional and only needs to run when config changes, not when setProxyConfig changes. Adding the eslint-disable comment prevents the warning while maintaining correct behavior.
* chore: disable react-hooks/exhaustive-deps rule
This rule was already disabled; the change only adds a trailing comma to the ESLint configuration for consistency.
* fix(eslint): re-enable lint rules for hooks and case-declarations
---------
Co-authored-by: Draculabo <[email protected]>
* feat: add React Query hooks for managing cloud accounts and update the generated route tree.
* feat: implement React Query hooks for comprehensive cloud account management.
* fix(cloud-accounts): add error handling to force poll mutation
Add an onError handler to log failures when forcing a cloud monitor poll, improving debuggability.
* fix: add error handling for cloud account polling failure
Add error toast notification when force polling fails, providing localized error message to improve user feedback.
* refactor: remove error logging from force poll cloud monitor hook
The onError handler was removed as error handling is now managed at a higher level in the application. This simplifies the hook and prevents duplicate error logging.
* fix(localization): add missing pollFailed translation keys
Add missing English and Chinese translations for the 'pollFailed' error message used when quota polling fails for all accounts.
* fix(CloudAccountList): prevent duplicate force poll requests
Add guard clause to disable button while mutation is pending to avoid duplicate API calls.
* fix: ensure UI updates after cloud quota poll and refresh
* chore: remove "peer": true flags from package-lock.json
---------
Co-authored-by: Draculabo <[email protected]>
Summary
- Replace hard keytar dependency with a multi-strategy key storage:
1) safeStorage (Electron built-in) — preferred
2) keytar (system keychain) — fallback
3) file-based encryption — last resort
- Dynamically import keytar to avoid asar load failures
- Refactor cloudHandler to use const (clean code)
- Fix “Failed to load cloud accounts” in packaged app
Rationale
The keytar native module can fail to load from asar archives in production builds. This ensures the app works even when system keychain access is unavailable.
Additional changes
- Replace sync file ops with async (fs/promises)
- Add atomic file writes to prevent data races
- Implement concurrency lock for key generation
- Add security error codes for better diagnostics
- Add warnings for file-based fallback mode
- Align error handling after merge
- Migrate legacy encrypted account data
References
- Issue: #38
- Commit: 92dc2f6