- Change author from Draculabo to evandrodevbr in package.json
- Update GitHub publisher config in forge.config.ts (owner/repo/iconUrl)
- Add favicon link in index.html pointing to src/assets/icon.png
- Ensure all app icon references use images/icon.* consistently
- Create scripts/build-windows.js that extracts wix314-binaries.zip to tools/wix314/
- Adds extracted dir to PATH so electron-wix-msi can find candle.exe/light.exe
- Adds npm script 'make:win' for one-command Windows installer build
The initial role chunk (role:'assistant', content:'') added in a3eabc2
was causing the OpenCode TUI to receive an empty first delta and
discard all subsequent content, showing only the completion time with
no text output.
Restored to the exact streaming behavior from e524a340 that worked:
- Remove the pre-emptive initial chunk entirely
- Move hasEmittedChunk=true back inside pushChunk (original position)
- Use reasoning_content delta field for thought parts instead of
wrapping in <think> tags (which corrupts plain text responses)
- Remove streamOptions/include_usage/lastUsageMetadata tracking
(not present in the working version)
- Remove isThinking state machine (was adding </think> noise to output)
Kept from the spec compliance work (a3eabc2):
- toolCallIndex counter for correct finish_reason:'tool_calls' mapping
- Comment explaining why we override Gemini's STOP finish reason
Route fixes:
- Add POST /v1/messages/chat/completions alias so OpenCode clients
misconfigured with baseURL ending in /v1/messages no longer get 404
Session affinity:
- Extract x-session-affinity HTTP header (sent by OpenCode) and use it
as the session key for token stickiness, falling back to body-level
session_id fields if the header is absent
Tool calling (streaming):
- finish_reason is now 'tool_calls' when function calls were emitted in
the stream (Gemini always sends STOP, so we check toolCallIndex > 0)
- createSyntheticOpenAIStream (stream fallback path) now emits all
tool_call deltas before the finish chunk instead of silently dropping
them when content is null
Tool calling (non-streaming):
- content is now always null when tool_calls are present, satisfying
strict clients that reject non-null content alongside tool_calls
- system_fingerprint field added to OpenAIChatResponse interface and
response builder for OpenAI spec compliance
Usage accounting:
- thoughtsTokenCount is now included in completion_tokens and
total_tokens for the streaming usage chunk, fixing undercount for
thinking/reasoning model runs
- GoogleAPIService: try loadCodeAssist first for AI credits since
fetchCredits returns 404 for many accounts; keep fetchCredits as
fallback, removing the spurious warn on every poll cycle
- CloudAccountRepo: auto-activate the most-recently-used account when
no account has is_active=1; downgrade noisy [DEBUG] log from info
to debug level
- StatusBar: increase process-status refetch interval from 10s to 30s
to reduce redundant IPC calls and log noise
- 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
* 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