Skip to content

fix(settings): make OpenRouter cloud-policy block reactive to live state#163

Merged
qnbs merged 2 commits into
mainfrom
fix/openrouter-policy-reactive
Jun 16, 2026
Merged

fix(settings): make OpenRouter cloud-policy block reactive to live state#163
qnbs merged 2 commits into
mainfrom
fix/openrouter-policy-reactive

Conversation

@qnbs

@qnbs qnbs commented Jun 16, 2026

Copy link
Copy Markdown
Owner

User description

Problem

The OpenRouter settings section derived its cloud-policy block from an async assertCloudAiAllowed('openrouter') call that only re-ran on mount / API-key change. Toggling Local storage only (default ON) or switching the AI mode never updated the banner — OpenRouter looked permanently blocked even after the user enabled cloud AI.

Fix

  • Derive the policy block from live Redux state (aiMode + privacy.localStorageOnly) via useMemo, so it reacts instantly to AI-mode / privacy changes.
  • Distinguish the two block reasons with dedicated messages: policyBlocked.mode (Local/Eco AI mode) and policyBlocked.localOnly (Local storage only).
  • Remove the now-orphaned policyBlocked key across all 11 locales + rebuilt bundles.
  • Translate the new keys for de/es/fr/it/el/ja/pt/zh (ar/he stay EN stubs per RTL-stub policy).

Tests

  • Updated OpenRouterSection.test.tsx to drive the derived block via mutable mock settings state; asserts both the mode and local-only messages.
  • Local gate green: Biome lint, full 4-checker tsgo typecheck, i18n:check (2698 keys parity), unit test (9/9 reported pass).

🤖 Generated with Claude Code


CodeAnt-AI Description

Make OpenRouter policy warnings react instantly and explain the exact block reason

What Changed

  • OpenRouter now updates its block warning as soon as the AI mode or “Local storage only” setting changes.
  • The warning now shows the specific reason: one message for Local/Eco mode, another for the local-storage-only privacy setting.
  • Connection tests and model loading stop immediately when OpenRouter is blocked, and the settings page no longer shows a stale block state.
  • The new warning text is available in all supported languages, replacing the older single generic message.

Impact

✅ Fewer confusing OpenRouter blocks
✅ Clearer setup instructions for cloud AI
✅ Faster feedback when privacy or AI mode changes

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

Derive the OpenRouter policy block from live Redux aiMode + privacy state
via useMemo instead of the async assertCloudAiAllowed() check that only
re-ran on mount / API-key change. Toggling "Local storage only" (default
ON) or switching AI mode now updates the banner and the test-connection /
catalog-fetch guards instantly instead of leaving OpenRouter looking
permanently blocked.

Split policyBlocked into distinct .mode / .localOnly messages, remove the
now-orphaned policyBlocked key across all 11 locales (+ rebuilt bundles),
and translate the new keys for de/es/fr/it/el/ja/pt/zh (ar/he stay EN
stubs per RTL-stub policy). Tests drive the derived block via mutable
mock settings state.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
worldscript-studio Ready Ready Preview, Comment Jun 16, 2026 11:13am

@codeant-ai

codeant-ai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@codeant-ai codeant-ai Bot added the size:M This PR changes 30-99 lines, ignoring generated files label Jun 16, 2026
The reactive-policy refactor made the blocked-path catalog clear emit a
fresh [] on every run. Combined with a per-render-unstable t (which re-runs
the catalog effect each render), models' identity changed every render →
infinite render loop: unit tests hung and the CI quality-gate vitest step
failed (#163). Clear the catalog with a functional setModels update that
returns the SAME reference when already empty, in both the policy-blocked
and fetch-error paths. All 12 OpenRouterSection tests pass in ~20s.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@qnbs
qnbs merged commit 1614f08 into main Jun 16, 2026
17 checks passed
@qnbs
qnbs deleted the fix/openrouter-policy-reactive branch June 16, 2026 11:34
qnbs added a commit that referenced this pull request Jun 16, 2026
… CF Pages rename (#166)

* chore(release): finalize v1.23.0 changelog + rename CF Pages project

Promote the [Unreleased] changelog to [1.23.0] — 2026-06-16 and add this
release's remaining entries (Local-First foundation #140, OpenRouter reactive
policy #163, Local AI i18n #164, WorldScript icons + URL cleanup #165, and
Dependabot maintenance). Rename the Cloudflare Pages project in wrangler.toml
storycraft-studio → worldscript-studio (CF is not actively deployed; the
project rename on the CF side is a later step).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(tauri): resolve Vite base from TAURI_ENV_PLATFORM (fixes blank desktop window)

The Tauri build detected desktop mode via `TAURI_PLATFORM`, the Tauri 1.x env
var that Tauri 2.x never sets. Every desktop build therefore fell through to the
GitHub Pages base (`/WorldScript-Studio/`) and 404'd its hashed assets under
`tauri://localhost/`, leaving only the native file/help menu over an empty
webview on Windows/macOS.

Base resolution now checks `TAURI_ENV_PLATFORM` (legacy `TAURI_PLATFORM` kept as
a fallback) and is extracted into a pure, unit-tested `config/resolveViteBase.ts`
so the regression cannot silently return. No runtime landmines: locale/community
fetches use `import.meta.env.BASE_URL`, which resolves correctly under `./`.

Linux `.deb`/AppImage still require webkit2gtk-4.1 (Ubuntu 22.04+) — a Tauri 2
platform minimum documented in the changelog, not a bug.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M This PR changes 30-99 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant