Commit Graph

1268 Commits

Author SHA1 Message Date
diegosouzapw
9da0e704a7 feat(cli): consolidar CLI_TOOLS — listCliTools/getCliTool + setup --list (Fase 1.6) 2026-05-14 23:48:12 -03:00
diegosouzapw
ab911265ed feat(cli): banir SQLite direto — withRuntime + src/lib/db/* modules (Fase 1.5) 2026-05-14 23:41:02 -03:00
diegosouzapw
dd06e64207 Merge PR #2261: fix: align managed model cleanup for imported models (thanks @InkshadeWoods)
Adds deleteSyncedAvailableModelsForProvider() for full provider-level
cleanup, fixes delete-alias button visibility (source=alias only),
compatible models section gets proper 3-way delete logic.
2026-05-14 15:47:56 -03:00
diegosouzapw
d9c2c13851 fix(security): address P1/P2 findings from release review
Five issues raised in the v3.8.0 release review, all release-blocking:

P1 — open-sse/services/tokenRefresh.ts
Read Windsurf Firebase API key from WINDSURF_CONFIG.firebaseApiKey
(resolvePublicCred wrapper) instead of process.env directly. Without
this, the literal removal from .env.example silently broke browser-flow
Windsurf/Devin token refresh.

P1 — open-sse/translator/request/openai-to-kiro.ts
Mark synthetic "(empty)" turns injected for assistant-first chats as
non-enumerable __synthetic and skip them when deriving conversationId
via uuidv5. Prevents unrelated chats from colliding on the same upstream
Kiro/AWS Builder ID context.

P2 — open-sse/utils/publicCreds.ts
Harden decodePublicCred against raw credential overrides outside
RAW_VALUE_PATTERN: strict-base64 alphabet check + printable-plain check
on the decoded result. Buffer.from(v, "base64") is lenient and was
silently mangling unrecognized raw values.

P2 — src/sse/services/auth.ts
Gate the x-api-key fallback on the anthropic-version header. Without
this scoping, local-mode requests with placeholder x-api-key from
non-Anthropic clients were rejected as Invalid API key even with
REQUIRE_API_KEY=false.

P2 — src/app/api/providers/[id]/test/route.ts
Move Qoder OAuth+PAT disambiguation BEFORE the CLI-runtime early-return
that was making the new message branch unreachable for the target
scenario from #2247.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:23:46 -03:00
diegosouzapw
f3f1f9f36e fix(api): sanitize error responses in management routes
Prevent raw exception messages from leaking stack frames or absolute
paths in the console logs and token health endpoints.

Also harden the i18n mirror move script by replacing shell-based git
commands with execFileSync and a safer fallback for untracked files.
2026-05-14 15:23:46 -03:00
墨林ObsidianGrove
83f242fa4d fix: clear synced provider models on delete all
Ensure provider-level delete all removes synced available model lists so imported models do not reappear after clearing managed models.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 01:39:31 +08:00
墨林ObsidianGrove
2f794d92a4 fix: hide delete action for imported models
Prevent synced imported and fallback provider models from showing row-level delete actions, while keeping custom/manual and alias-only deletion behavior intact.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 01:31:08 +08:00
diegosouzapw
ed1993d5bf Merge PR #2250: fix: sync managed model aliases with visibility (thanks @InkshadeWoods) 2026-05-14 13:42:14 -03:00
diegosouzapw
7210a73e1f fix(dashboard/api-manager): use getProviderDisplayName for owned_by labels (#2021)
Custom OpenAI-/Anthropic-compatible providers ship with synthetic IDs
like "openai-compatible-chat-<uuid>". ApiManagerPageClient was grouping
models by raw `model.owned_by`, so the user saw the full synthetic id
in the model picker.

Wrap `model.owned_by` with the existing centralized
`getProviderDisplayName` helper (already used by Endpoint, Health, and
Combos pages). The helper detects the dynamic-compatible pattern and
renders it as "Compatible (openai)" / "Compatible (anthropic)" — a
small but meaningful improvement that takes the dashboard one step
closer to issue #260's "no raw IDs in the UI" goal.

Showing the user-entered node name ("Poe") instead of the generic
"Compatible (openai)" label remains a follow-up (requires fetching
/api/provider-nodes here and matching by id/prefix); tracked separately.

Reported by @pulyankote with a complete surface-by-surface table.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 12:58:26 -03:00
diegosouzapw
f63f29830f fix(providers/qoder): disambiguate OAuth/CLI vs API-key error surface (#2247)
When a Qoder connection lands in OAuth/CLI-flavored mode but the user
has pasted a Personal Access Token, the provider test route surfaces
"Local CLI runtime is not installed" plus a cascading 401 from
DashScope. Neither error tells the user "you picked the wrong auth
mode, switch to API Key".

The runtime check now detects this state (Qoder + non-apikey authType +
a token present on the connection or providerSpecificData) and surfaces
a single actionable message: "Qoder OAuth/Local CLI mode is selected
but the Qoder CLI is not detected. If you have a Personal Access Token,
switch this connection to API Key auth instead."

Non-Qoder providers and Qoder in real OAuth/CLI mode without a token
still get the original generic message.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:46:07 -03:00
diegosouzapw
e84e1b41bf fix(ui): clarify Claude extra-usage toggle notification text (#2157)
The toggle is labeled "Block Claude Extra Usage" but the success
notification simply said "Claude extra-usage blocked / allowed". Users
who interpreted the toggle as "Allow Extra Usage" then read the message
as inverted ("I enabled it and it tells me it's blocked").

New text spells out the toggle→effect relationship:
- ON  → "Claude extra-usage blocking enabled (extra usage will be blocked)"
- OFF → "Claude extra-usage blocking disabled (extra usage is allowed)"

No functional change. Reported by @uwuclxdy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:43:43 -03:00
diegosouzapw
7ab68365ba fix(auth): accept x-api-key header in extractApiKey (#2225)
Anthropic-native clients (Claude Code, @anthropic-ai/sdk) authenticate
via x-api-key per the Messages API contract. extractApiKey only read
Authorization: Bearer, so:

- usage_history.api_key_id was NULL for all x-api-key traffic (~50% of
  real-world traffic invisible in Costs/Analytics)
- api_keys.last_used_at never updated for keys delivered via x-api-key
- per-key policies (allowedModels, budget, rateLimits, accessSchedule,
  expiresAt) were bypassed for every Anthropic-native client

The fallback honors x-api-key (case-insensitive) when no Authorization:
Bearer is present. Bearer still wins when both are set, preserving
back-compat for clients that already send both. Reported by
@Forcerecon with a complete repro and validation plan.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:39:35 -03:00
diegosouzapw
037f4e8d50 fix(security): close remaining CodeQL alerts + document mandatory patterns
Fixes the 4 fixable alerts opened in the recent scan and adds enforceable
guardrails so future development follows the same pattern.

Code fixes:
- src/mitm/cert/install.ts: pass certPath/certName/action via exec()'s env
  option instead of string-interpolating them into the bash script
  (CodeQL js/shell-command-injection-from-environment #225)
- scripts/docs/{gen-provider-reference,add-frontmatter,fix-internal-links}:
  escape backslash before other regex/markdown metacharacters
  (CodeQL js/incomplete-sanitization #227, #228, #229)

Documentation (mandatory patterns):
- docs/security/PUBLIC_CREDS.md — embedding public upstream OAuth/Firebase
  identifiers via resolvePublicCred(); never as string literals
- docs/security/ERROR_SANITIZATION.md — routing every error response through
  sanitizeErrorMessage()/buildErrorBody(); never raw err.stack/err.message
- CLAUDE.md: 4 new Hard Rules (#11-#14) + Security section + scenario notes
- AGENTS.md, CONTRIBUTING.md: cross-reference the two new docs
- SECURITY.md: extended Hard Security Rules with the new mandatory patterns
- docs/README.md: index entries pointing to the two new docs

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:12:14 -03:00
diegosouzapw
1a39c31ff4 fix(security): mask public upstream creds + centralize error sanitization
Embed Gemini, Antigravity and Windsurf public OAuth/Firebase identifiers
(extracted from upstream CLI binaries) through a XOR-masked byte sequence
in open-sse/utils/publicCreds.ts instead of source literals, so pattern
scanners (GitHub Secret Scanning, Semgrep) stop raising false positives on
every release. decodePublicCred passes raw values through unchanged for
users who already have plaintext in their .env (no migration needed).

- New utils/publicCreds.ts with decode/encode + tests
- Replace 6 hardcoded Google client_id/secret in oauth.ts + providerRegistry
- Drop literals from .env.example (comment-only documentation)
- Sanitize error messages inside buildErrorBody so every caller (incl.
  createErrorResult) is covered; cursor.ts now reuses the shared helper
- Cover the new helpers with unit tests (publicCreds + error sanitization)

Resolves the open code-scanning js/stack-trace-exposure findings and the
secret-scanning Google API Key alert without breaking existing setups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:36:42 -03:00
墨林ObsidianGrove
153a421354 test: cover managed model alias lifecycle
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 20:52:08 +08:00
diegosouzapw
678dee2ede Merge PR #2240: feat: CLI Integration Suite for issue #2016
Adds 5 new CLI management commands (config, status, logs, update, provider),
3 API endpoints (/api/cli-tools/{detect,config,apply}), config generators
for 6 tools (Claude, Cline, Codex, Continue, KiloCode, OpenCode), zero-config
auto-routing via auto/ prefix, and @omniroute/opencode-provider npm package.

Fixes: merge conflict in RoutingTab.tsx, help text indentation, README conflicts.
Closes #2016

Co-authored-by: oyi77 <paijo@users.noreply.github.com>
2026-05-14 09:27:18 -03:00
diegosouzapw
da939ca2ba fix: resolve merge conflict in RoutingTab.tsx and fix help text indentation
- Resolve <<<<<<< HEAD conflict in RoutingTab.tsx by keeping the
  HEAD version with aria-disabled and pre-computed titleText
- Fix inconsistent indentation in CLI help text (providers commands
  and CLI Tools section)
2026-05-14 09:25:09 -03:00
墨林ObsidianGrove
bcbc095798 fix: sync managed model aliases with visibility
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 19:31:38 +08:00
Dohyun Jung
1b14b5b012 fix(providers/command-code): fix validation request format for Command Code API (#2243)
Integrated into release/v3.8.0 — Command Code validation now sends correct external environment and stream=false.
2026-05-14 08:06:55 -03:00
oyi77
2d601ea459 feat: CLI Integration Suite for issue #2016
- Add tool-detector.ts (6 CLI tools: claude, codex, opencode, cline, kilocode, continue)
- Add config-generator/ factory + 6 generators (JSON + YAML)
- Add doctor/checks.ts for CLI tool health checks
- Add log-streamer.ts for usage log streaming
- Add @omniroute/opencode-provider npm package
- Add 5 CLI commands: config, status, logs, update, provider
- Add 3 API routes: config, detect, apply
- Update bin/omniroute.mjs, bin/cli/index.mjs, package.json
- Update docs: SETUP_GUIDE.md, CLI-TOOLS.md
- All tests pass (4302/4326, 24 pre-existing failures unchanged)
2026-05-14 17:26:30 +07:00
Vitalii
0c3d33899d Fix Azure AI Foundry provider connection handling (#2236)
Integrated into release/v3.8.0 with unit tests for Azure-AI /responses routing
2026-05-14 05:53:26 -03:00
Andrew Munsell
0caca472d4 feat(search): add Z.AI Coding Plan Search via MCP protocol (#2238)
Integrated into release/v3.8.0 with Zod schema validation replacing JSON.parse(parsed)
2026-05-14 05:42:22 -03:00
Anton
b9db934e39 fix(sse-heartbeat): shape-aware keepalives keep streams alive through stricter proxies (#2233)
Integrated into release/v3.8.0 with idle timeout default reverted to 600s
2026-05-14 05:23:26 -03:00
diegosouzapw
bf83aa55de feat(antigravity): support custom Google Cloud project ID (#2227)
Co-authored-by: nickwizard <nickwizard@users.noreply.github.com>
2026-05-14 05:11:24 -03:00
Anton
253f5e5904 fix(ModelSync): shared loopback readiness gate + IPv4 force (#2221)
Integrated into release/v3.8.0
2026-05-14 00:16:22 -03:00
Anton
bbdcb97a06 fix(antigravity): bootstrap project via loadCodeAssist + fetchAvailableModels fallback (#2219)
Integrated into release/v3.8.0
2026-05-14 00:09:26 -03:00
diegosouzapw
a249724777 Merge feat/devin-cli-windsurf-provider: Devin CLI + Windsurf provider + OAuth
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	src/shared/services/cliRuntime.ts
2026-05-13 21:52:20 -03:00
diegosouzapw
6f93d81e58 Merge prclean/resilience-model-cooldown: expose model cooldown list with manual re-enable
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx
2026-05-13 21:46:39 -03:00
diegosouzapw
9668b5fd34 refactor(docs-ui): update content.ts to reflect v3.8.0 (37 MCP tools, 7 deploy guides)
content.ts changes:
- DOCS_MCP_TOOL_GROUPS: 29 → 37 tools (added Compression group with 5 tools and
  1Proxy/Tunnels group with 3 tools); now matches docs/frameworks/MCP-SERVER.md
  totals (Routing 9 + Operations 11 + Cache 2 + Compression 5 + 1Proxy 3 +
  Memory 3 + Skills 4 = 37).
- DOCS_DEPLOYMENT_GUIDES: 1 (hardcoded GitHub URL to TERMUX_GUIDE) → 7 entries
  with internal /docs/<slug> hrefs (setup, electron, docker, vm, fly, pwa, termux).

i18n labels:
- Added 16 new keys to src/i18n/messages/en.json:
  - deploy{Setup,Electron,Docker,Vm,Fly,Pwa}Title + Text (12)
  - mcpTools{Compression,OneProxy}Title + Desc (4)
- Propagated to 40 locales via npm run i18n:sync-ui (+640 entries with
  __MISSING__: markers).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 19:13:46 -03:00
diegosouzapw
9638a88145 feat(docs-ui): generate openapi module from yaml + ApiExplorer consumes it
- scripts/docs/gen-openapi-module.mjs (new): build helper that loads
  docs/reference/openapi.yaml via js-yaml, flattens paths × methods, and
  emits src/app/docs/lib/openapi.generated.ts with strongly-typed
  OPENAPI_ENDPOINTS, OPENAPI_TAGS, OPENAPI_VERSION, OPENAPI_TITLE plus
  the OpenApiEndpoint interface (no `any`, deterministic ordering).
  By default it skips internal management paths (anything under /api/
  that isn't /api/v1/*) so the Api Explorer focuses on the OpenAI-
  compatible public surface — 19 endpoints for v3.8.0 (Chat, Messages,
  Responses, Embeddings, Images, Audio, Moderations, Rerank, Models,
  System). Add --include-management to emit all 121 paths if needed.
- src/app/docs/components/ApiExplorerClient.tsx: drop the 13-entry
  hardcoded API_ENDPOINTS array; the component now imports from
  @/app/docs/lib/openapi.generated. Tags come from the spec; the
  "Try It" form picks an example body keyed by full path (8 well-known
  bodies pre-seeded, everything else starts empty). The header pill
  now shows endpoint count + OpenAPI version, and an "auth" pill is
  rendered next to operations whose spec declares non-empty security.
- package.json: prebuild:docs now chains gen-openapi-module after the
  docs index generator so `next build` always sees a fresh module.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 18:57:12 -03:00
diegosouzapw
caa262a4c5 feat(docs): add YAML frontmatter to all docs (title/version/lastUpdated)
Every .md under docs/{architecture,guides,reference,frameworks,routing,
security,compression,ops,diagrams} plus docs/README.md now opens with:

  ---
  title: "<inferred from first H1>"
  version: 3.8.0
  lastUpdated: 2026-05-13
  ---

46 files updated (no docs were skipped — none had pre-existing
frontmatter). [slug]/page.tsx already reads frontmatter.version and
frontmatter.lastUpdated via gray-matter and renders a "v3.8.0" pill
plus a "Last updated" caption, so the UI picks these up automatically.

Helper: scripts/docs/add-frontmatter.mjs — idempotent (skips files that
already start with `---`), falls back to a humanized basename when no
leading H1 exists. Excludes docs/i18n/, docs/screenshots/,
docs/superpowers/, docs/diagrams/exported/. Re-runnable safely.

Also regenerated src/app/docs/lib/docs-auto-generated.ts: 44 docs across
8 sections (Architecture / Guides / Reference / Frameworks / Routing /
Security / Compression / Ops), which now includes the 14 docs that were
missing from the v3.7 sidebar (Cloud Agents, Guardrails, Memory, Skills,
Webhooks, Evals, Authz, Agent Protocols, Repository Map, Provider
Reference, Reasoning Replay, Stealth Guide, Tunnels Guide, Electron
Guide).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 18:46:05 -03:00
diegosouzapw
8a26128e93 fix(docs): correct provider/strategy/MCP-tools drift (179→177, 13→14)
- ARCHITECTURE.md and CODEBASE_DOCUMENTATION.md: 179 → 177 registered
  providers (canonical from src/shared/constants/providers.ts).
- FEATURES.md and en.json wizard step: 13 → 14 routing strategies; lists
  all 14 explicitly including reset-aware (the missing one).
- llm.txt root: combo strategy count corrected in 3 places (UI tree,
  dashboard summary, fallback semantics).
- MCP-SERVER.md: 37 tool count was already correct; added a "Related
  Frameworks (v3.8.0)" section pointing to Cloud Agents
  (docs/frameworks/CLOUD_AGENT.md) and Guardrails
  (docs/security/GUARDRAILS.md), both sibling frameworks intentionally
  outside the MCP tool catalog.
- scripts/i18n/sync-llm-mirrors.mjs (new): idempotent helper to push
  root llm.txt body into the 40 docs/i18n/<locale>/llm.txt mirrors
  while preserving each locale's heading + language bar prefix; ran
  it to refresh all 40 mirrors so `check:docs-sync` is green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 18:43:48 -03:00
diegosouzapw
5592b25243 feat(docs-ui): [slug]/page.tsx serves locale-translated docs with English fallback
Reads the current request locale via `getLocale()` from next-intl and
prefers a translated markdown copy under
`docs/i18n/<locale>/docs/<fileName>` when one exists. Falls back to
the English source otherwise, so locales with partial coverage stay
readable instead of 404ing.

Path resolution is hardened: every read is resolved against an
absolute docs root and verified to live inside it, so a stray
filename in the docs index cannot escape the directory.

This is the runtime counterpart to the DocsI18n removal: the locale
preference set by the shared LanguageSelector in the docs layout now
materially affects what content the page renders.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 18:02:16 -03:00
diegosouzapw
7b97b01fe6 refactor(docs-ui): drop DocsI18n.tsx, unify locale handling via next-intl
The cosmetic DocsI18n.tsx shim duplicated the locale catalog that
already lives in config/i18n.json and consumed it through a separate
client hook (useDocsLocale + a 10-entry hard-coded SECTION_LABELS
map). It only ever translated sidebar section titles — the docs
content itself was always English.

Now the /docs page uses the same `LanguageSelector` component as the
rest of the dashboard, backed by next-intl + config/i18n.json. The
locale cookie set there is consumed by the [slug] page server
component (next commit) to actually serve translated markdown.

Removed:
- src/app/docs/components/DocsI18n.tsx (203 lines)

Updated:
- src/app/docs/layout.tsx — swaps DocsLocaleSwitcher for the shared
  LanguageSelector
- tests/unit/docs-site-overhaul.test.ts — replaces the DocsI18n
  importability assertions with checks that (a) the shared next-intl
  config covers the same locales, (b) the global LanguageSelector
  is the new docs switcher, and (c) the DocsI18n module is gone.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 18:01:53 -03:00
diegosouzapw
fd65db99c8 chore(i18n-ui): backfill ~700 missing keys per locale with __MISSING__ markers
Ran `npm run i18n:sync-ui` against every non-English locale to
replicate the full key tree from `src/i18n/messages/en.json`. Missing
strings now show up as `__MISSING__:<english_value>` placeholders,
which:
- keep the catalogs the same shape as the source-of-truth, so a
  runtime `useTranslations('feature.x')` call no longer falls back
  to the English bundle for every drifted key;
- are visible to reviewers (and to the optional `--translate-markers`
  pass in sync-ui-keys.mjs) so the drift can be paid down
  incrementally.

Volume summary (40 locales):
- 25,234 placeholders inserted in total
- zh-CN closest to parity (+105)
- most European/Asian locales (+710)
- pt-BR slightly ahead (+589)
- bn/fa/gu/in/mr/sw/ta/te/ur (+445)

No existing translated strings were touched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 17:53:48 -03:00
diegosouzapw
dfe9a3e288 chore(i18n): point src/i18n/config.ts to config/i18n.json and deprecate legacy scripts
src/i18n/config.ts is now a thin adapter that reads config/i18n.json
(canonical locale list) and exports the same shape — LOCALES, LANGUAGES,
RTL_LOCALES, DEFAULT_LOCALE, Locale type, LOCALE_COOKIE — that
LanguageSelector, layout.tsx, request.ts, and the rest of the codebase
already consume. No call-site changes were required. Adds
DOCS_TARGET_LOCALES and getLanguage() helpers for new code.

The legacy scripts now print a deprecation warning on stderr at startup:
  - scripts/i18n/i18n_autotranslate.py    (banner + module-level warn)
  - scripts/i18n/generate-multilang.mjs   (banner + console.warn)

They keep working for messages and readme modes (UI strings / root README
variants), which are still outside the new pipeline's scope. Both will be
removed in v3.10.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:57:35 -03:00
diegosouzapw
afe2a67c76 Merge FASE 3: docs restructure into 8 subfolders
Reorganizes /docs into 8 subfolders (architecture, guides, reference, frameworks,
routing, security, compression, ops). Resolves two conflicts:

- scripts/docs/gen-provider-reference.ts: combined FASE 1's new __dirname-based
  ROOT (two levels up from scripts/docs/) with FASE 3's new output path
  (docs/reference/PROVIDER_REFERENCE.md).
- scripts/check-env-doc-sync.mjs: deleted by FASE 1, modified by FASE 3; FASE 1's
  delete wins (file is at scripts/check/ now). The FASE 3 intent (point to
  docs/reference/ENVIRONMENT.md) was applied to the strict checker at the new path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:10:49 -03:00
diegosouzapw
6991024935 Merge FASE 2: env audit
Resolves conflict in scripts/check/check-env-doc-sync.mjs (FASE 1 moved it from scripts/ to scripts/check/, FASE 2 modified it at the old path). Applies FASE 2's strict checker version at the new path, fixes __dirname-based REPO_ROOT to traverse two levels up, and updates the unit test import to the new path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:02:44 -03:00
diegosouzapw
c044cfdefb refactor(app): regenerate docs nav + update routes/tests for new subfolder layout
- src/app/docs/lib/docs-auto-generated.ts is regenerated from docs/<sub>/ with
  fileName values like "architecture/ARCHITECTURE.md". The dynamic slug page
  joins these against process.cwd()/docs so resolution still works.
- src/app/api/openapi/spec/route.ts now looks for the spec at
  docs/reference/openapi.yaml first, with the flat-path fallback retained for
  older bundles.
- tests updated: integration-wiring expects docs/reference/{API_REFERENCE.md,
  openapi.yaml}; docs-site-overhaul reflects the new 8-section nav titles
  (Architecture, Guides, Reference, Frameworks, Routing, Security, Compression,
  Ops) and the new section for setup-guide ("Guides").
- open-sse/mcp-server/README.md picks up the rewritten docs/ reference.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 13:13:28 -03:00
diegosouzapw
46932961d4 refactor(env): promote hardcoded URLs and circuit-breaker timeouts to environment
Centralizes a handful of hardcoded URLs, fetch timeouts, and circuit-breaker
constants behind opt-in environment variables. Behavior is unchanged when
the variables are unset because every call site keeps its current default.

- open-sse/services/usage.ts: extracts CROF_USAGE_URL,
  GEMINI_CLI_USAGE_URL, CODEWHISPERER_BASE_URL constants backed by
  OMNIROUTE_CROF_USAGE_URL, OMNIROUTE_GEMINI_CLI_USAGE_URL, and
  OMNIROUTE_CODEWHISPERER_BASE_URL. Lets operators redirect quota probes
  through corporate mirrors or a test fixture.
- open-sse/config/constants.ts: PROVIDER_PROFILES circuit-breaker
  thresholds and reset timeouts now honor OMNIROUTE_CIRCUIT_BREAKER_*
  env vars (oauth/api-key/local) with the same defaults as before.
- src/shared/utils/fetchTimeout.ts: DEFAULT_TIMEOUT_MS reads
  OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS (fallback 120000) so deployments can
  raise the global fallback without changing FETCH_TIMEOUT_MS semantics.
- open-sse/services/chatgptTlsClient.ts: DEFAULT_TIMEOUT_MS and
  HARD_TIMEOUT_GRACE_MS now honor OMNIROUTE_CHATGPT_TLS_TIMEOUT_MS and
  OMNIROUTE_CHATGPT_TLS_GRACE_MS (defaults 60000 / 10000).
- .env.example: documents the 11 new variables in the URLs and TIMEOUT
  sections.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 10:55:33 -03:00
diegosouzapw
f3b944a55a refactor(scripts): organize into build/dev/check/docs/i18n/ad-hoc subfolders
Reorganizes the 29 active scripts under scripts/ into purpose-driven
subfolders:

- scripts/build/    (11) — Build, install, publish, runtime env
- scripts/dev/      (13) — Dev servers, test runners, healthchecks
- scripts/check/    (10) — Lint/validation/coverage checks
- scripts/docs/      (2) — Docs index and provider reference generation
- scripts/i18n/     (+3) — Adds Python translation utilities (check/validate/autotranslate)
- scripts/ad-hoc/    (4) — One-shot maintenance utilities

Updates all references in package.json, electron/package.json,
.husky/pre-commit, .github/workflows/ci.yml, Dockerfile, src/,
tests/, scripts/ internal cross-imports, playwright.config.ts,
and English docs (CODEBASE_DOCUMENTATION, ENVIRONMENT, FEATURES,
RELEASE_CHECKLIST, COVERAGE_PLAN, ELECTRON_GUIDE, I18N, GEMINI).

Also patches scripts/build/pack-artifact-policy.ts so the npm pack
allowlist mirrors the new layout.

Validates with:
- npm run lint            (exit 0 — pre-existing minified-bundle errors only)
- npm run typecheck:core  (exit 0)
- npm run check:docs-all  (exit 0)
- unit tests for moved scripts (57 tests pass)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 10:14:25 -03:00
diegosouzapw
204e15628c chore(release): prepare v3.8.0 docs and coverage ratchet
Refresh the v3.8.0 documentation set across API, setup, Docker,
environment, Fly.io, VM deployment, and troubleshooting guides.

Document the updated budget payload, management-auth requirements,
WebSocket bridge secret, Compose profiles, production deployment
details, and expanded Node support. Also update the OpenAPI catalog,
raise coverage thresholds to match the current baseline, and align
cloud-agent task route typing and schemas with the stricter runtime
behavior.
2026-05-13 03:47:40 -03:00
diegosouzapw
46e5aa5522 refactor(api): consolidate auth routing and provider config handling
Centralize optional API key capability checks so dashboard forms and
provider schemas share the same rules, including keyless Pollinations
support and cloud-agent batch testing mode.

Also align auto-combo config on `routerStrategy`, keep legacy combo
reads compatible, preserve MCP routes as management APIs, narrow
`require-login` public access to readonly/bootstrap flows, and make
cloud-agent CORS reflect the request origin for credentialed requests.
2026-05-13 03:47:40 -03:00
diegosouzapw
c89663d774 fix(auth): require management auth for agent and cooldown APIs
Protect cloud agent task routes and model cooldown management endpoints
with management-session auth and consistent CORS handling.

Also align cloud agent API serialization with the dashboard, reuse the
provider connection schema for CLI key storage, and accept active OAuth
tokens when building virtual auto-combo candidates.
2026-05-13 03:47:40 -03:00
Diego Rodrigues de Sa e Souza
20b35c4d20 security: sanitize error messages in API routes (CodeQL js/stack-trace-exposure)
Integrated into release/v3.8.0
2026-05-12 23:23:07 -03:00
diegosouzapw
da982d31be fix(ci): align resilience and thinking checks 2026-05-12 20:44:23 -03:00
diegosouzapw
4f20fbc36c fix(api): validate model cooldown delete payload 2026-05-12 20:11:45 -03:00
Dohyun Jung
fc620514a9 feat(providers): add Command Code provider (#2199)
Integrated into release/v3.8.0 after syncing the contributor branch, removing unrelated workflow/package-lock changes, and validating Command Code provider, auth, validation, and Responses coverage locally.
2026-05-12 19:57:35 -03:00
nickwizard
061c0c29fe Feat/provider models (#2196)
Integrated into release/v3.8.0 after syncing the contributor branch, removing unrelated workflow/docker/package-lock changes, and validating provider-scoped models coverage locally.
2026-05-12 19:57:15 -03:00
backryun
af7d056f7e chore(providers): improve BazaarLink and Completions.me support (#2177)
Integrated into release/v3.8.0 after syncing the contributor branch, removing unrelated dependency churn, and validating executor/default URL coverage locally.
2026-05-12 19:57:06 -03:00