Repository navigation
chore(release): v3.4.2 — memory/skills, claude code bridge, i18n CI, model-sync - #901
Conversation
…lation
- Remove x-goog-user-project header and executor-level project override
that caused 403 "Cloud Code Private API has not been used in project X"
- Add PROJECT_ROUTE_ERROR classifier type so project-routing 403s don't
permanently ban accounts (keeps accounts active, tracks the error)
- Fix Cloud Code envelope unwrapping for content accumulation in stream.ts
(Cloud Code wraps responses in { response: { candidates: [...] } })
- Extract unwrapGeminiChunk() into streamHelpers.ts with format guard
- Remove _currentModel singleton race condition from GeminiCLIExecutor
- Add handler for PROJECT_ROUTE_ERROR in chatCore.ts
- Add TODO in antigravity.ts about same stale-project risk
- Add 7 unit tests for error classifier and stream unwrap paths
…errors The stored projectId from OAuth connection time becomes stale because the Cloud Code API rotates free-tier projects. Native Gemini CLI refreshes the project every 30 seconds via loadCodeAssist — OmniRoute never did, causing 403 "has not been used in project X" errors that permanently banned accounts. - Add refreshProject() to GeminiCLIExecutor that calls loadCodeAssist API with 10s timeout and caches the result for 30s (matching native CLI) - transformRequest() replaces the stale projectId in the envelope before sending to the Cloud Code API, falling back to the stored ID on failure - Make transformRequest calls await-compatible in base executor and all subclasses (antigravity, cursor, kiro) so async overrides work
- Deduplicate in-flight loadCodeAssist requests to prevent thundering herd - Add typeof guard on cloudaicompanionProject.id before calling .trim() - Evict oldest cache entry when all entries are still valid - Fix unwrapGeminiChunk to use explicit null-safe check - Update test description for null response case
…avity/ - Replace stale model IDs (gemini-3.1-pro-preview, gemini-3.1-flash-lite-preview) with correct High/Low tier variants from fetchAvailableModels API (gemini-3-pro-high, gemini-3-pro-low, gemini-3.1-pro-high, gemini-3.1-pro-low, etc.) - Remove ag/ alias prefix in favor of antigravity/ across registry, providers, model capabilities, combos, docs, and static model providers - Make provider alias optional in Zod schema and guard ALIAS_TO_ID/ID_TO_ALIAS maps - Show raw model IDs in quota display instead of unmapped display names - Update T28 model catalog test to assert new High/Low tier models
…veUserQuota retrieveUserQuota only returns Gemini model quotas. fetchAvailableModels returns all models (including Claude) with per-model quotaInfo.
Added missing step 5 'Use Thinking Variant' to all 33 i18n language files for cliTools.guides.opencode.steps.5 The step was already defined in CLI_TOOLS constant but the i18n translations were missing, causing the step title/description to not display in the UI.
- Changed README path from ROOT to docs/i18n/{lang}/README.md
- Fixed prefix check from 'Disponible en' pattern to '🌐 **Languages:**'
- Added try/catch for missing README files
Added missing i18n keys for 'strict-random' routing strategy:
- combos.strategyGuide.strict-random: {when, avoid, example}
- combos.strategyRecommendations.strict-random: {title, description, tip1, tip2, tip3}
Total: 264 keys across all language files (8 keys × 33 languages)
These keys were already in pt-BR (incorrectly translated) and are now
aligned with the English fallback values from combos/page.tsx
Added missing cliTools.guides.windsurf.steps[1-5] with title and desc: - step 1: Open AI Settings - step 2: Add Custom Provider - step 3: Base URL (http://127.0.0.1:20128/v1) - step 4: API Key - step 5: Select Model Total: 165 keys across all language files (5 steps × 2 keys × 33 languages)
Detects mismatched placeholders like {count} vs {pocet} between
source (en.json) and translations. Catches cases where raw placeholders
like {# models} are translated without preserving the placeholder format.
Found 14 issues in cs.json as test case.
Fixed 14 placeholders that were translated instead of preserved:
- usage.inDuration: {trvání} -> {duration}
- usage.detailsContains: {termín} -> {term}
- usage.dayTimeFormat: {den} -> {day}
- translator.youWithFormat: {formát} -> {format}
- providers.testedCount: added missing {count} placeholder
- providers.allTestsPassed: added missing {total} placeholder
- All ICU plural formats now correctly preserve {# X} inner format
Added 130 missing keys from en.json: - a2aDashboard: 46 keys - agents: 6+ keys - cliTools.guides notes: continue, kiro, opencode - And all other missing keys from recent additions Total: All 33 language files now have full key parity.
Updated regex to only match top-level placeholders like {count}, {day}
and ignore {# X} format inside ICU plural/select constructs.
- Also fix quick_check to only fail on missing keys (not untranslated) - Use compact JSON for GITHUB_OUTPUT
The check-route-validation script now accepts both validateBody() and .safeParse() as valid body validation methods. This fixes false positives for routes using Zod schemas with safeParse().
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Models without quota data (e.g. tab-completion models) were showing 0% because remainingFraction defaulted to 0 when absent. Now defaults to 1 so they show 100% remaining instead.
- SECURITY.md: supported versions 3.4.x/3.0.x, MCP scopes (10), audit trail, Zod v4 validation, TLS/CLI fingerprint - CONTRIBUTING.md: Node >=18<24, port 20128, project structure (21 DB modules, 25 MCP tools, memory/skills/electron), 122 test files - README.md: 60+ providers, 25 MCP tools, 10 scopes, 9 strategies - .dockerignore: expanded exclusions (tests, docs, electron, *.tgz) - .npmignore: added llm.txt, bun.lock, tsconfig variants, subprojects - .gitignore: _*/ dirs, docs/new-features, COVERAGE_PLAN allowlist Deleted files: - 20 README.*.md redirect stubs (consolidated in docs/i18n/) - 4 scratch test files (test_exception/target_format/translator/out) - restart.sh, validate-translation.sh (obsolete scripts) - Moved COVERAGE_PLAN.md -> docs/COVERAGE_PLAN.md
- copilot-usage: use future reset date (2026-12-31) to avoid stale quota window causing remainingPercentage to reset to 100% - request-log-migration: close SQLite DB before cleanup to release Windows file locks; remove stale archive dir before second test
The wrapInCloudCodeEnvelopeForClaude function converts Claude message blocks to Antigravity/Gemini parts format but only handles text, tool_use, and tool_result types. Image blocks (type: 'image' with base64 source) are silently dropped, causing Claude models routed through Antigravity to never receive image content. This adds handling for image blocks, converting them to inlineData format (the same format the Gemini path already uses successfully). Tested: Claude via Antigravity now correctly receives and describes image content that was previously invisible.
Prevent auto-sync from wiping manually-imported models when the upstream /models endpoint fails, times out, or returns an empty list. Added `allowEmpty` option (default false) to replaceCustomModels — callers that intentionally clear all models (DELETE ?all=true) pass `allowEmpty: true`. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
# Conflicts: # tests/unit/copilot-usage.test.mjs
# Conflicts: # open-sse/handlers/chatCore.ts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…dd version-bump workflow
… i18n CI, model-sync fix
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge OverviewThis is a release PR (v3.4.2) containing documentation updates, CHANGELOG entries, and workflow improvements. No code changes were made — all modifications are to documentation files, localization files, and workflow configurations.
Changes Reviewed
Quality Observations
Files Reviewed (4 files with substantive changes)
This is a well-structured release PR with proper documentation. All changes are appropriately scoped for a version release. |
| .trim() | ||
| .replace(/\/$/, ""); | ||
| if (!normalized) return ""; | ||
| return normalized.replace(/\/messages(?:\?[^#]*)?$/i, ""); |
Check failure
Code scanning / CodeQL
Polynomial regular expression used on uncontrolled data High
There was a problem hiding this comment.
Pull request overview
Release v3.4.2 content + documentation re-org, alongside new i18n CI validation and refreshed security/dev docs to match the current runtime.
Changes:
- Added/updated multi-language documentation under
docs/i18n/*/docs/and refreshed localized READMEs/CHANGELOGs. - Introduced an
i18nvalidation job matrix in GitHub Actions. - Updated root/docs guidance and ignore rules (
SECURITY.md,CONTRIBUTING.md,.env.example,.dockerignore,.npmignore) to reflect new logging/limits/runtime behavior.
Reviewed changes
Copilot reviewed 94 out of 1127 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| docs/i18n/bg/docs/RELEASE_CHECKLIST.md | Adds Bulgarian release checklist under new docs/ i18n layout |
| docs/i18n/bg/docs/MCP-SERVER.md | Adds Bulgarian MCP server doc under new i18n layout |
| docs/i18n/bg/docs/FEATURES.md | Updates Bulgarian dashboard features (language links + provider list tweak) |
| docs/i18n/bg/docs/COVERAGE_PLAN.md | Adds Bulgarian coverage plan doc |
| docs/i18n/bg/docs/AUTO-COMBO.md | Adds Bulgarian auto-combo doc |
| docs/i18n/bg/docs/A2A-SERVER.md | Adds Bulgarian A2A server doc |
| docs/i18n/bg/SECURITY.md | Adds Bulgarian security policy doc |
| docs/i18n/bg/TROUBLESHOOTING.md | Removes old Bulgarian troubleshooting doc (pre-reorg path) |
| docs/i18n/bg/RELEASE_CHECKLIST.md | Removes old Bulgarian release checklist (pre-reorg path) |
| docs/i18n/bg/README.md | Refreshes Bulgarian README content and feature counts |
| docs/i18n/bg/MCP-SERVER.md | Removes old Bulgarian MCP server doc (pre-reorg path) |
| docs/i18n/bg/FEATURES.md | Removes old Bulgarian features doc (pre-reorg path) |
| docs/i18n/bg/CLI-TOOLS.md | Removes old Bulgarian CLI tools guide (pre-reorg path) |
| docs/i18n/bg/CHANGELOG.md | Updates Bulgarian changelog with v3.4.2 entries + language links |
| docs/i18n/bg/AUTO-COMBO.md | Removes old Bulgarian auto-combo doc (pre-reorg path) |
| docs/i18n/bg/A2A-SERVER.md | Removes old Bulgarian A2A server doc (pre-reorg path) |
| docs/i18n/ar/docs/TROUBLESHOOTING.md | Adds Arabic troubleshooting doc under new i18n layout |
| docs/i18n/ar/docs/RELEASE_CHECKLIST.md | Adds Arabic release checklist under new i18n layout |
| docs/i18n/ar/docs/MCP-SERVER.md | Adds Arabic MCP server doc under new i18n layout |
| docs/i18n/ar/docs/FEATURES.md | Updates Arabic dashboard features (language links + provider list tweak) |
| docs/i18n/ar/docs/COVERAGE_PLAN.md | Adds Arabic coverage plan doc |
| docs/i18n/ar/docs/AUTO-COMBO.md | Adds Arabic auto-combo doc |
| docs/i18n/ar/docs/A2A-SERVER.md | Adds Arabic A2A server doc under new i18n layout |
| docs/i18n/ar/TROUBLESHOOTING.md | Removes old Arabic troubleshooting doc (pre-reorg path) |
| docs/i18n/ar/SECURITY.md | Adds Arabic security policy doc |
| docs/i18n/ar/RELEASE_CHECKLIST.md | Removes old Arabic release checklist (pre-reorg path) |
| docs/i18n/ar/README.md | Refreshes Arabic README content and feature counts |
| docs/i18n/ar/MCP-SERVER.md | Removes old Arabic MCP server doc (pre-reorg path) |
| docs/i18n/ar/FEATURES.md | Removes old Arabic features doc (pre-reorg path) |
| docs/i18n/ar/CLI-TOOLS.md | Removes old Arabic CLI tools guide (pre-reorg path) |
| docs/i18n/ar/CHANGELOG.md | Updates Arabic changelog with v3.4.2 entries + language links |
| docs/i18n/ar/AUTO-COMBO.md | Removes old Arabic auto-combo doc (pre-reorg path) |
| docs/i18n/ar/A2A-SERVER.md | Removes old Arabic A2A server doc (pre-reorg path) |
| docs/i18n/README.md | Adds cs to i18n index |
| docs/adr/0003-security-checklist-proxy-limits.md | Removes ADR document |
| docs/adr/0002-api-error-contract-management-endpoints.md | Removes ADR document |
| docs/adr/0001-proxy-registry-limit-generalization.md | Removes ADR document |
| docs/USER_GUIDE.md | Updates env var docs tables formatting + adds provider limits cadence env var |
| SECURITY.md | Updates supported versions, adds MCP scope/audit details, tweaks terminology |
| README.md | Updates headline stats/features (providers count, MCP tool count, logging details) |
| CONTRIBUTING.md | Updates dev prerequisites, env defaults, test commands, repo structure overview |
| CHANGELOG.md | Adds v3.4.2 release notes and additional logging cleanup bullet |
| .npmignore | Expands ignored files/folders for npm package |
| .github/workflows/ci.yml | Adds i18n validation matrix job and generator job |
| .env.example | Updates logging env vars, adds limits sync interval env var |
| .dockerignore | Expands ignore rules to reduce Docker context size |
| .agents/workflows/version-bump.md | Adds new agent workflow for version bump/release prep |
| .agents/workflows/update-docs.md | Removes older agent workflow doc |
| README.*.md | Removes legacy root-level translated README stubs pointing to docs/i18n/* |
Comments suppressed due to low confidence (2)
docs/i18n/README.md:3
- This count is now stale: the same file adds
cs, and the PR description mentions 33 languages. Update the stated language count so it matches the actual set of translations tracked indocs/i18n/.
Translations of documentation into 30 languages. Code blocks remain in English.
docs/adr/0001-proxy-registry-limit-generalization.md:1
- This PR deletes ADRs (
docs/adr/0001..0003) but the release description/notes don’t mention removing architectural decision records. If these decisions are still relevant, consider keeping them (or moving them to an archive folder) to preserve design history and avoid breaking references to ADR IDs.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| id: langs | ||
| run: | | ||
| LANG_DIR="src/i18n/messages" | ||
| LANGS=$(ls "$LANG_DIR"/*.json | xargs -n1 basename | sed 's/.json$//' | grep -v '^en$' | jq -R . | jq -s . | jq -c .) |
There was a problem hiding this comment.
This will fail if there are no non-en locale JSON files (e.g. grep -v '^en$' yields nothing), because ${LANGS} can become empty/non-JSON and fromJson(...) in the matrix will error. Make the generator robust by defaulting to [] when the filtered list is empty (and/or avoid ls-failure cases by globbing safely).
| LANGS=$(ls "$LANG_DIR"/*.json | xargs -n1 basename | sed 's/.json$//' | grep -v '^en$' | jq -R . | jq -s . | jq -c .) | |
| LANGS=$(ls "$LANG_DIR"/*.json 2>/dev/null | xargs -n1 basename 2>/dev/null | sed 's/.json$//' | grep -v '^en$' || true) | |
| if [ -n "$LANGS" ]; then | |
| LANGS=$(printf '%s\n' "$LANGS" | jq -R . | jq -s . | jq -c .) | |
| else | |
| LANGS='[]' | |
| fi |
| i18n: | ||
| name: i18n Validation | ||
| runs-on: ubuntu-latest | ||
| continue-on-error: true |
There was a problem hiding this comment.
With continue-on-error: true, translation validation failures won't fail CI, which reduces the enforcement value of the new i18n checks (and may conflict with the PR description around CI placeholder validations). If the intent is to gate merges on placeholder correctness, remove continue-on-error or move it behind a repo/branch condition.
| continue-on-error: true |
|
|
||
| --- | ||
|
|
||
| > Model Context Protocol server with 16 intelligent tools |
There was a problem hiding this comment.
This doc claims the MCP server has 16 tools, but other updated docs in this PR (e.g. READMEs) reference 25 tools. Update this header (and the tool lists below if needed) so the Bulgarian MCP documentation matches the current MCP tool surface.
|
|
||
| --- | ||
|
|
||
| > Model Context Protocol server with 16 intelligent tools |
There was a problem hiding this comment.
This doc claims the MCP server has 16 tools, but other updated docs in this PR (e.g. READMEs) reference 25 tools. Update this header (and the tool lists below if needed) so the Arabic MCP documentation matches the current MCP tool surface.
| | Problem | Solution | | ||
| | ----------------------------- | ------------------------------------------------------------------ | | ||
| | First login not working | Set `INITIAL_PASSWORD` in `.env` (no hardcoded default) | | ||
| | Dashboard opens on wrong port | Set `PORT=20128` and `NEXT_PUBLIC_BASE_URL=http://localhost:20128` | | ||
| | No request logs under `logs/` | Set `ENABLE_REQUEST_LOGS=true` | | ||
| | EACCES: permission denied | Set `DATA_DIR=/path/to/writable/dir` to override `~/.omniroute` | | ||
| | Routing strategy not saving | Update to v1.4.11+ (Zod schema fix for settings persistence) | |
There was a problem hiding this comment.
This troubleshooting page still instructs users to set ENABLE_REQUEST_LOGS=true, but this PR updates .env.example to the new APP_LOG_* / CALL_LOG_* model and removes ENABLE_REQUEST_LOGS. Update this table to reference the current logging env vars and current log locations/retention behavior.
| | Problem | Solution | | |
| | ----------------------------- | ------------------------------------------------------------------ | | |
| | First login not working | Set `INITIAL_PASSWORD` in `.env` (no hardcoded default) | | |
| | Dashboard opens on wrong port | Set `PORT=20128` and `NEXT_PUBLIC_BASE_URL=http://localhost:20128` | | |
| | No request logs under `logs/` | Set `ENABLE_REQUEST_LOGS=true` | | |
| | EACCES: permission denied | Set `DATA_DIR=/path/to/writable/dir` to override `~/.omniroute` | | |
| | Routing strategy not saving | Update to v1.4.11+ (Zod schema fix for settings persistence) | | |
| | Problem | Solution | | |
| | ----------------------------- | ------------------------------------------------------------------------------------------------------------- | | |
| | First login not working | Set `INITIAL_PASSWORD` in `.env` (no hardcoded default) | | |
| | Dashboard opens on wrong port | Set `PORT=20128` and `NEXT_PUBLIC_BASE_URL=http://localhost:20128` | | |
| | No request logs under `logs/` | Configure `APP_LOG_*` / `CALL_LOG_*` in `.env` (see `.env.example`; logs are written under `logs/` with rotation/retention) | | |
| | EACCES: permission denied | Set `DATA_DIR=/path/to/writable/dir` to override `~/.omniroute` | | |
| | Routing strategy not saving | Update to v1.4.11+ (Zod schema fix for settings persistence) | |
| | `JWT_SECRET` | `omniroute-default-secret-change-me` | JWT signing secret (**change in production**) | | ||
| | `INITIAL_PASSWORD` | `123456` | First login password | |
There was a problem hiding this comment.
These defaults conflict with other updates in this PR (e.g. CONTRIBUTING.md now suggests INITIAL_PASSWORD=CHANGEME, and SECURITY.md states the server fails fast on missing/weak secrets). If the runtime no longer ships with these insecure defaults, update this table to reflect the real defaults/requirements (or mark them as examples rather than defaults).
| --- | ||
|
|
||
| ## [3.3.11] - 2026-03-31 | ||
| ## [3.4.0] - 2026-03-31 |
There was a problem hiding this comment.
This hunk indicates a version header was changed from ## [3.3.11] - 2026-03-31 to ## [3.4.0] - 2026-03-31. If 3.3.11 was a real released version, this edit rewrites published history and can break link anchors/upgrade references. Consider restoring the original version heading or ensuring 3.4.0 is inserted without overwriting an existing entry.
There was a problem hiding this comment.
Code Review
This pull request introduces a comprehensive documentation overhaul, including a new version-bump workflow, updated architecture details in AGENTS.md, and expanded multi-language support with Arabic and Bulgarian translations. It also refines environment variable configurations for logging and provider synchronization while cleaning up the repository structure. Feedback focuses on correcting critical syntax errors in shell commands and configuration snippets caused by curly quotes and improper spacing. Additionally, corrections were suggested for a non-existent TypeScript version reference, trailing parentheses in several files, and inconsistent default password values across the documentation.
| // turbo | ||
|
|
||
| ```bash | ||
| cd /home/diegosouzapw/dev/proxys/9router |
There was a problem hiding this comment.
The workflow contains a hardcoded absolute path /home/diegosouzapw/dev/proxys/9router. This will cause the workflow to fail on any other machine or in a CI environment. Use relative paths or environment variables instead. This issue is repeated on lines 67, 136, 159, 177, 239, 248, 257, and 302.
| cd /home/diegosouzapw/dev/proxys/9router | |
| cd "$(git rev-parse --show-toplevel)" |
|
|
||
| # Add official Docker repository | ||
| install -m 0755 -d /etc/apt/keyrings | ||
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg |
There was a problem hiding this comment.
The shell command is broken due to an extra space between $ and ( and the use of curly quotes (“, ”). This will prevent the apt source list from being correctly configured.
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg | |
| echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null |
| ``` | ||
|
|
||
| ### 2.2 Create environment variables file | ||
|
|
| - **Runtime**: Next.js 16 (App Router), Node.js, ES Modules | ||
| - **Language**: TypeScript 5.9 (`src/`) + JavaScript (`open-sse/`) | ||
| - **Runtime**: Next.js 16 (App Router), Node.js ≥18 <24, ES Modules (`"type": "module"`) | ||
| - **Language**: TypeScript 5.9 (`src/`) + JavaScript (`open-sse/`, `electron/`) |
There was a problem hiding this comment.
| | Proxy logging | `src/lib/proxyLogger.ts` | | ||
| | Data paths resolution | `src/lib/dataPaths.ts` | | ||
| JSON-RPC 2.0, SSE streaming, Task Manager with TTL cleanup( | ||
| Agent Card at `/.well-known/agent.json`. |
| | Variable | Default | Description | | ||
| | --------------------------------------- | ------------------------------------ | --------------------------------------------------------------------------------------------------------- | | ||
| | `JWT_SECRET` | `omniroute-default-secret-change-me` | JWT signing secret (**change in production**) | | ||
| | `INITIAL_PASSWORD` | `123456` | First login password | |
|
|
||
| ## Observability and Operational Signals | ||
|
|
||
| Runtime visibility sources: |
| | `artifacts[].content` | The LLM response text | | ||
| | `metadata.routing_explanation` | Human-readable explanation of routing decision | | ||
| | `metadata.cost_envelope` | Estimated vs actual cost with currency | | ||
| | `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | |
….4.2 chore(release): v3.4.2 — memory/skills, claude code bridge, i18n CI, model-sync
….4.2 chore(release): v3.4.2 — memory/skills, claude code bridge, i18n CI, model-sync
🚀 Release v3.4.2
✨ New Features
omniroute_web_searchtool with theexecute:searchscope.contextLengthfor all opencode-zen models.🐛 Bug Fixes
/dashboard/limitsUI freezing with 70+ accounts ([BUG] Slow load time on /dashboard/limits with many accounts (needs concurrency or caching) #784).replaceoverrides when auto-sync returns empty model list (fix(model-sync): skip replace when auto-sync returns empty model list #899).::1loopback.🛠️ Maintenance
release/v3.4.2.Integrated PRs
Tests