Skip to content

Release v3.7.0 - #1439

Merged
diegosouzapw merged 144 commits into
mainfrom
release/v3.7.0
Apr 26, 2026
Merged

diegosouzapw merged 144 commits into
mainfrom
release/v3.7.0

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented Apr 20, 2026 •

Copy link
Copy Markdown
Owner

[3.7.0] — 2026-04-26

✨ New Features

🐛 Bug Fixes

♻️ Refactoring

  • refactor(fallback): Make provider failure thresholds configurable via PROVIDER_PROFILES instead of hardcoded constants, supporting different failure tolerance per provider type. (refactor: unify resilience controls #1449)
  • refactor(resilience): Unify resilience controls across the codebase for consistent circuit breaker and fallback behavior. (refactor: unify resilience controls #1449)
  • refactor(core): Implement shared path utilities, add custom date formatting, improve type safety, and unify database imports across modules.
  • refactor(security): Harden backup archive creation by switching to execFileSync, validate ACP agent IDs, expand shared CORS handling.
  • refactor(release): Remove obsolete agent workflow playbooks and the stale compiled src/lib/dataPaths.js artifact. (fix: remove stale compiled dataPaths.js artifact #1541)

🧪 Tests

  • test(providers): Add targeted coverage for AWS Polly SigV4 speech/validation, Azure OpenAI deployment discovery, Lemonade local discovery, provider dashboard taxonomy, managed provider catalog behavior, and merged /v1/models alias metadata.
  • test(catalog): Add v3.7.0 catalog coverage for Pollinations text models, Perplexity Sonar via Puter, and NVIDIA free-model alias resolution.
  • test(vision-bridge): Add 51 unit tests covering all VisionBridge spec scenarios (VB-S01 through VB-S10), including helper functions for callVisionModel, extractImageParts, replaceImageParts, and resolveImageAsDataUri.
  • test(batch-api): Isolate batch API unit tests with temp DATA_DIR to prevent schema state collisions.
  • test(settings-api): Add test harness with createSettingsApiHarness function for proper temp directory setup and storage reset between tests.
  • test(security): Update prompt injection test for fail-closed policy alignment.
  • test(core): Restore local test fixes for encryption and resilience modules.
  • test(next): Align transpile package expectations for the Next.js standalone build.
  • test(ci): Fix CI-only test failures from environment differences — clear INITIAL_PASSWORD and JWT_SECRET in integration tests, handle XDG_CONFIG_HOME for guide-settings tests.

📚 Documentation

🛠️ Maintenance

  • chore: Add .tmp/ to .gitignore to keep local build/test artifacts out of release diffs. (chore: add .tmp/ to .gitignore #1538)
  • chore(release): Clarify release version parity and changelog segregation rules for generated release workflows.

📦 Dependencies

Tests

  • ✅ 3,628 tests pass (0 failures)
  • ✅ CI Run #24950504947: 51/51 jobs green (0 failures)
  • ✅ npm audit: 0 vulnerabilities

⚠️ After merging: run Phase 2 steps to tag, publish, and deploy.

diegosouzapw and others added 4 commits April 19, 2026 21:07
…rializer (#1438)

Integrated into release/v3.7.0. Thanks @benzntech for this great contribution! 🎉 We've removed the unrelated sync-fork.yml file and it's now merged into the release branch.
…ck (#1430)

Integrated into release/v3.7.0. Thanks @clousky2020 for this massive and important contribution! 🎉 We've translated the deprecation comments to English for consistency, and it is now officially merged into the release branch. Great work on the ModelScope integration and Circuit Breaker!

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request upgrades OmniRoute to version 3.7.0, introducing provider-level circuit breakers, daily quota exhaustion locks, and ModelScope integration. It also adds real-time model status badges to the dashboard and hardens the SSE streaming decoder against memory exhaustion. Feedback focuses on improving the TOML configuration parser to correctly handle boolean and numeric types during round-trips and removing redundant re-entrancy guards from the synchronous failure tracking logic.

Comment on lines 41 to 53
let key = kvMatch[1].trim();
let value = kvMatch[2].trim();
// Remove quotes
// Strip quotes from key (TOML quoted keys like "gpt-5.3-codex")
if (
(key.startsWith('"') && key.endsWith('"')) ||
(key.startsWith("'") && key.endsWith("'"))
) {
key = key.slice(1, -1);
}
// Remove quotes from string values only (not arrays, booleans, numbers)
if (
(value.startsWith('"') && value.endsWith('"')) ||
(value.startsWith("'") && value.endsWith("'"))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The current TOML parser treats all values as strings. This causes a type mismatch during round-trips: boolean and numeric values in the original TOML (e.g., enabled = true) are parsed as strings and then re-serialized with quotes (e.g., enabled = "true"). This can break compatibility with tools expecting specific TOML types. The parser should detect and convert unquoted boolean and numeric strings into their respective types.

      let key = kvMatch[1].trim();
      let value = kvMatch[2].trim();
      let parsedValue: any = value;

      // Strip quotes from key (TOML quoted keys like "gpt-5.3-codex")
      if (
        (key.startsWith('"') && key.endsWith('"')) ||
        (key.startsWith("'") && key.endsWith("'"))
      ) {
        key = key.slice(1, -1);
      }

      // Handle value types: check if quoted first
      const isQuoted = (value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"));
      if (isQuoted) {
        parsedValue = value.slice(1, -1);
      } else {
        // Convert unquoted values to appropriate types
        if (value === "true") parsedValue = true;
        else if (value === "false") parsedValue = false;
        else if (!isNaN(Number(value)) && value !== "") parsedValue = Number(value);
      }

      if (currentSection) {
        result[currentSection][key] = parsedValue;
      } else {
        result._root[key] = parsedValue;
      }

Comment thread open-sse/services/accountFallback.ts Outdated
// NOT a true mutex — Node.js is single-threaded, so different SSE streams
// can interleave across ticks. This Set prevents a single call from recursively
// re-entering recordProviderFailure within the same synchronous call stack.
const providerFailureLocks = new Set<string>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The providerFailureLocks set and the associated logic in recordProviderFailure appear to be redundant. Since Node.js is single-threaded and recordProviderFailure is a synchronous function that does not call itself or any other function that might recursively call it, there is no risk of synchronous re-entrancy within the same call stack. This mechanism adds unnecessary complexity without providing actual protection.

Comment thread open-sse/services/accountFallback.ts Outdated
Comment on lines +532 to +533
if (providerFailureLocks.has(provider)) return;
providerFailureLocks.add(provider);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

As noted previously, this re-entrancy guard is unnecessary for a synchronous function in a single-threaded environment.

Comment on lines +74 to +76
if (typeof value === "string") return `"${value}"`;
return `"${value}"`;
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This logic is redundant as both lines return the same formatted string. Additionally, the fallback return at line 76 will stringify and quote non-string types like null or objects in a way that is likely invalid for TOML.

Suggested change
if (typeof value === "string") return `"${value}"`;
return `"${value}"`;
};
if (typeof value === "string") return value.startsWith("[") && value.endsWith("]") ? value : `"${value}"`;
return String(value);

@github-actions

github-actions Bot commented Apr 20, 2026 •

Copy link
Copy Markdown
Contributor

CI Coverage Report

  • Coverage job: success
  • PR test policy: failure

Coverage artifact was not available for this run.

PR Test Policy

This PR changes production code in src/, open-sse/, electron/, or bin/ without accompanying automated tests.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 333f0b9f2d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread open-sse/config/providerRegistry.ts Outdated
Comment on lines +1403 to +1408
modelscope: {
id: "modelscope",
alias: "ms",
format: "openai",
executor: "default",
baseUrl: "https://api-inference.modelscope.cn/v1/chat/completions",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Register ModelScope in managed provider catalogs

This commit adds modelscope only to the runtime registry, but provider creation still validates IDs against the managed provider catalog (/api/providers uses isManagedProviderConnectionId). Since modelscope is not present in src/shared/constants/providers.ts/catalog, normal create flows reject it as an invalid provider, so the new integration cannot actually be configured by users.

Useful? React with 👍 / 👎.

// Update all registered models with fresh data
const now = Date.now();
registeredModels.forEach((key) => {
const [provider, model] = key.split("/");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve full model IDs when decoding status keys

Model status keys are encoded as ${provider}/${model}, but this code decodes with key.split("/") into only two parts. Models containing / in their ID (including new ModelScope IDs like moonshotai/Kimi-K2.5) get truncated, so matching against /api/models/availability fails and badges incorrectly show as available/unknown instead of cooldown/error.

Useful? React with 👍 / 👎.

Comment on lines +6053 to +6054
// Only write when explicitly enabled; omit to let registry default take effect
...(formData.passthroughModels ? { passthroughModels: true } : {}),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Persist explicit false for passthroughModels updates

When editing a connection, passthroughModels is only sent when true; disabling the toggle omits the field. The update endpoint merges providerSpecificData with existing values, so an existing passthroughModels: true remains set and cannot be turned off from the UI. This makes the new toggle one-way for edited connections.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

lockModelIfPerModelQuota(
provider,
connectionId,
model,
"rate_limited",

P1 Badge Pass passthroughModels into per-model lock decisions

In handleChatCore, the new connection-level override (providerSpecificData.passthroughModels) is not forwarded when calling lockModelIfPerModelQuota for rate-limit/quota paths, so providers that are manually configured for per-model quota can still be marked connection-wide unavailable. In practice, a 429 on one model can still set rateLimitedUntil for the whole connection here, which defeats the new toggle and causes unnecessary full-account lockouts.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1530 to +1534
globalAttempts++;
if (globalAttempts > MAX_GLOBAL_ATTEMPTS) {
log.warn(
"COMBO",
`Maximum combo attempts (${MAX_GLOBAL_ATTEMPTS}) exceeded across all targets and fallbacks. Terminating loop to prevent runaway background requests.`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Derive combo attempt ceiling from targets and retries

This fixed global cap can terminate valid combo runs before all configured fallbacks are attempted. For example, with maxRetries = 1, a 20-target combo under transient failures needs up to 40 attempts, but this guard exits at 30 and returns 503 early, skipping later targets despite user-configured retry behavior.

Useful? React with 👍 / 👎.

Comment on lines +140 to +142
// Immediately fetch if no data yet
if (!modelStatusMap.has(key)) {
fetchModelStatus();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Gate initial status fetch to a single in-flight request

registerModel calls fetchModelStatus() whenever that model key has no cache entry, so when many badges mount together on first render, each one triggers its own /api/models/availability request before the first response populates the map. This reintroduces the redundant polling burst that the shared context is meant to avoid and can significantly increase dashboard load.

Useful? React with 👍 / 👎.

andruwa13 and others added 5 commits April 20, 2026 18:15
Complete translation and terminology improvements for Ukrainian documentation:
- docs/i18n/uk-UA/README.md:  full Ukrainian translation
- docs/i18n/uk-UA/SECURITY.md: full Ukrainian translation
- docs/i18n/uk-UA/docs/A2A-SERVER.md: full Ukrainian translation
- docs/i18n/uk-UA/docs/API_REFERENCE.md: full Ukrainian translation
- docs/i18n/uk-UA/docs/AUTO-COMBO.md: full Ukrainian translation
- docs/i18n/uk-UA/docs/USER_GUIDE.md: complete translation (966 lines)

Changes:
- Translated all English content to Ukrainian
- Preserved all code examples, commands, and technical terms
- Maintained proper Ukrainian orthography with diacritical marks
Address all 6 review comments from PR #1457:

- Fix typo: "drastично" → "драстично" (mixed Latin/Cyrillic)
- Translate model table entries: "Unlimited" → "Необмежено"
- Translate model table entries: "No reported cap" → "Немає повідомлень про ліміт"
- Translate OpenRouter description to Ukrainian
- Fix section header: "Documentation" → "Документація"
- Fix section header: "License" → "Ліцензія"

All terminology now uses proper Ukrainian orthography.
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
…nts' into docs/uk-ua-translation-improvements
Integrated into release/v3.7.0

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b38e57d452

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/sse/services/auth.ts
Comment on lines +1247 to +1251
: (fallbackResult.baseCooldownMs ?? effectiveProviderProfile?.baseCooldownMs ?? 0),
effectiveProviderProfile,
{
exactCooldownMs:
fallbackResult.usedUpstreamRetryHint === true ? fallbackResult.cooldownMs : null,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve daily-quota cooldown for per-model lockouts

When a per-model provider (e.g., passthrough/Gemini/ModelScope) returns a 429 daily-quota error, checkFallbackError provides a long cooldownMs (until tomorrow), but this branch only forwards exactCooldownMs when usedUpstreamRetryHint === true. Daily-quota results do not set that flag, so recordModelLockoutFailure falls back to short base cooldowns instead of the intended overnight lock, causing repeated retries on exhausted models rather than respecting daily reset windows.

Useful? React with 👍 / 👎.

Comment on lines 125 to +129
return NextResponse.json({
profiles: settings.providerProfiles || PROVIDER_PROFILES,
defaults: {
...DEFAULT_API_LIMITS,
...asRecord(settings.rateLimitDefaults),
requestQueue: resilience.requestQueue,
connectionCooldown: resilience.connectionCooldown,
providerBreaker: resilience.providerBreaker,
waitForCooldown: {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep circuit-breaker data in resilience GET response

GET /api/resilience now returns only configuration fields, but MCP health aggregation still reads resilience.circuitBreakers (open-sse/mcp-server/server.ts in handleGetHealth). With this response shape, MCP omniroute_get_health reports an empty circuit-breaker list even when providers are OPEN/HALF_OPEN, reducing operational visibility for users relying on MCP health output.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1d3d99bb9e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

const circuitBreakers = getAllCircuitBreakerStatuses();
const lockedIdentifiers = getLockedIdentifiers();
return NextResponse.json({ circuitBreakers, lockedIdentifiers });
return NextResponse.json({ lockedIdentifiers });

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep circuit-breaker data in policies GET payload

GET /api/policies now returns only lockedIdentifiers, but the usage dashboard still reads policies.circuitBreakers in BudgetTelemetryCards to show active/open breaker counts. With this response shape, that card always reports zero and never shows OPEN-breaker warnings, which hides live resilience incidents from operators.

Useful? React with 👍 / 👎.

Comment on lines +5503 to +5504
if (formData.passthroughModels) {
providerSpecificData.passthroughModels = true;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Persist explicit false for passthroughModels on create

The create flow only includes providerSpecificData.passthroughModels when the toggle is true. For providers whose registry default is passthroughModels: true (for example ModelScope/passthrough providers), leaving the toggle off sends undefined, so hasPerModelQuota falls back to the provider default and still treats the connection as per-model quota. This makes the new toggle unable to disable per-model quota at creation time.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9754b04bd6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +47 to +49
resolveDataDir = require("@/lib/dataPaths").resolveDataDir;
} catch (err) {
const fallbackDataDir = process.env.DATA_DIR || join(process.cwd(), "data");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Resolve credentials path with an ESM-safe loader

This module is ESM ("type": "module"), so calling require(...) here throws at runtime and always takes the fallback path. That silently switches credential lookup to process.cwd()/data (unless DATA_DIR is set), so installs that rely on the default OmniRoute data dir will stop loading provider-credentials.json and OAuth/client secrets appear missing after upgrade.

Useful? React with 👍 / 👎.

Comment thread src/lib/db/encryption.ts Outdated
Comment on lines +136 to +143
} catch (finalErr: unknown) {
const finalMessage = finalErr instanceof Error ? finalErr.message : String(finalErr);
console.error(
`[Encryption] Decryption final() failed: ${finalMessage}. ` +
`Ciphertext prefix: ${ciphertext.slice(0, 30)}... ` +
`Auth tag validation likely failed.`
);
return ciphertext;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Return null when GCM auth-tag verification fails

When decryption reaches decipher.final() and auth-tag validation fails (the common wrong-key/corrupted-ciphertext path), this branch returns the original ciphertext string instead of null. That reintroduces the failure mode this patch is trying to avoid: encrypted token blobs can flow downstream as credentials, causing repeated auth failures and leaking encrypted payloads into request paths.

Useful? React with 👍 / 👎.

Comment on lines 93 to 95
if (body.comboDefaults) {
updates.comboDefaults = body.comboDefaults;
updates.comboDefaults = sanitizeComboRuntimeConfig(body.comboDefaults);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid overwriting combo defaults with empty sanitized payloads

This writes comboDefaults whenever the field is present, even if sanitization removed all keys (e.g., legacy-only fields like timeoutMs/healthCheck*, or an empty object). Because updateSettings replaces the whole key, that turns existing saved defaults into {} and drops user configuration unexpectedly on otherwise valid PATCH requests.

Useful? React with 👍 / 👎.

diegosouzapw and others added 6 commits April 21, 2026 04:59
- create createSettingsApiHarness function with temp directory setup
- add beforeEach/afterEach hooks for storage reset between tests
- add after hook for cleanup
- use dynamic imports after env setup to ensure proper initialization
- add provider-level circuit breaker config to PROVIDER_PROFILES
- remove hardcoded threshold constants in favor of profile-based config
- use getProviderProfile() to read thresholds with fallback defaults
- support different failure tolerance per provider type
The mergeProviderProfile function was missing the three new fields
added to PROVIDER_PROFILES (providerFailureThreshold, providerFailureWindowMs,
providerCooldownMs). This caused tests to fail because the profile
returned by getRuntimeProviderProfile did not include these fields.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Remove 429 from PROVIDER_FAILURE_ERROR_CODES
   - 429 (rate limit) is already handled by model-level and account-level locks
   - Including it in provider-wide circuit breaker causes premature cooldown

2. Fix reference counting in ModelStatusContext
   - Changed registeredModels from Set to Map<string, number>
   - Prevents polling stop when one component unmounts while others still track the model

3. Fix model ID parsing for providers with slashes in model names
   - Use indexOf/substring instead of split to handle models like "modelscope/moonshotai/Kimi-K2.5"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Register LM Studio as an OpenAI-compatible local provider and map the
new grok-4.3 thinking model for web executor requests.

This update also hardens related platform behavior by switching backup
archive creation to execFileSync, validating ACP agent ids, expanding
shared CORS handling, and making prompt injection guard failures return
an explicit 500 response.

To preserve existing stored credentials, encryption now derives new
keys from a secret-based salt while still falling back to the legacy
static-salt key during decryption.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Populate newly introduced dashboard and provider UI message keys in all
locale bundles to prevent missing translation lookups after the v3.7.0
changes.

Also fix quota reset handling so expired limits are only marked stale
when usage is still pending, adjust combo form dark-mode backgrounds,
and expand the prepublish hash rewrite to handle nested package paths.
Pass the entered sudo password through endpoint enable and disable
requests so macOS and Linux installs can start or stop Tailscale
without retrying unauthenticated commands.

Also detect and cache the active tailscaled socket before issuing CLI
calls, preferring the system daemon socket when available so status and
funnel operations target the running service correctly.
Prevent repeated provider-limit refresh requests by guarding the bulk
refresh flow with a ref-backed lock instead of a stale callback
dependency.

Also avoid tying eval data loading to translation updates and replace the
fetch failure path with a static error so the effect runs predictably.
Refresh English cost dashboard copy to provide clearer labels and empty
state messaging.
…ound-trip

The parseToml function was stripping all value quotes uniformly, turning
every value into a JS string. When toToml re-serialized, unquoted
integers like 2 were wrapped in quotes becoming "2" — a TOML string.

This broke Codex CLI which expects u32 for tui.model_availability_nux:
  Error loading config.toml: invalid type: string "2", expected u32

Now parseToml detects booleans (true/false), integers, and floats,
preserving their native JS types. formatTomlValue already handles
number/boolean types correctly, so round-tripping no longer corrupts
third-party config sections.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

1 similar comment
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Replace placeholder builtin skill responses with real file, HTTP, and
code-execution flows constrained to per-key workspaces, size limits, and
sanitized request headers.

Harden the Docker sandbox with dropped capabilities, tmpfs-backed
workdirs, configurable runtime limits, and clearer failure behavior for
disabled browser automation.

Also consolidate legacy dashboard usage navigation into logs, remove
stale sidebar and SSE backup artifacts, and expand tests to lock in the
new runtime and routing contracts.
Comment thread src/lib/skills/builtins.ts Dismissed
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

- guide-settings-route.test.ts: control XDG_CONFIG_HOME so OpenCode config
  path resolves to the test dummy dir (CI runners have XDG set)
- proxy-registry-flow.test.ts: disable DASHBOARD_PASSWORD to prevent 401 on
  direct route handler calls (CI postinstall auto-generates it)
- _chatPipelineHarness.ts: clear DASHBOARD_PASSWORD for all integration tests
  using the shared chat pipeline harness
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

CI sets INITIAL_PASSWORD and JWT_SECRET env vars, which makes
isAuthRequired() return true even with a fresh temp DB. The tests
call route handlers directly without session cookies, so auth must
be fully disabled by clearing all auth-related env vars.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Update release notes and project documentation to reflect the
current 160+ provider catalog, 29-tool MCP server footprint, and
newly shipped v3.7.0 features and fixes.

This keeps public-facing docs, architecture references, and agent
guidance aligned with the actual release contents and supported
capabilities.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

# Conflicts:
#	src/i18n/messages/pt.json
@diegosouzapw
diegosouzapw merged commit 6df01ae into main Apr 26, 2026
3 of 4 checks passed
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] v3.6.9 PR #1406 (compression-before-translation) reintroduces orphan tool_call_id for Anthropic-format inputs (Claude Code → kimi/minimax 400)