Commit Graph

1281 Commits

Author SHA1 Message Date
diegosouzapw
4913439d91 fix(dashboard): fix search icon alignment and widen search field in providers page
- Use Input's built-in icon prop so the search icon renders inside the correct
  positioned context (Input's internal div.relative) instead of misaligned outside
- Switch from className to inputClassName so padding applies to the actual <input>
  element, not the outer wrapper div
- Remove flex-1 spacer; make search container flex-1 so it fills available width
2026-05-16 17:21:55 -03:00
diegosouzapw
789a263967 feat(dashboard): provider summary card, free test btn, sidebar order, i18n fix
- sidebarVisibility: move endpoints before api-manager
- en.json: add freeTierProviders/Label/Desc + providerSummaryAll to providers namespace
- page.tsx: apply showConfiguredOnly filter to free tier section (was hardcoded false)
- page.tsx: replace search bar with summary Card containing:
    search (25%) + configured-only toggle + test-all button / dot legend / stats row
    stats show Total / Free / OAuth / API Key configured/total counts
- page.tsx: add batch test button to Free Tier Providers section header
- page.tsx: remove duplicate configured-only toggle from OAuth section header
- page.tsx: import Card component
2026-05-16 15:53:37 -03:00
diegosouzapw
f224b9f104 fix(dashboard): correct dot colors per provider type + search/legend bar
- ProviderCard: add cloud-agent dot (violet) to DOT_COLORS
- page.tsx: web-cookie/search/audio/cloud-agent/local/upstream-proxy
  sections now pass their actual type as authType instead of displayAuthType
  (which was always "apikey" for all static catalog groups)
- page.tsx: split search bar row into 25% input + 75% dot-type legend
  showing all 10 auth types with their colors and translated labels
2026-05-16 13:53:18 -03:00
diegosouzapw
b3b006b630 fix(dashboard): compact empty state, remove free badges, shrink toggle
- ProviderCard: remove Free Tier badge (dots already indicate type/free)
- ProviderCard: add dual-dot for providers with hasFree + paid authType
- ProviderCard: font-size xs for name, Toggle shrunk to size xs
- Toggle: add xs size variant (w-6 h-3 track, 8px thumb)
- page.tsx: compact Compatible Providers empty state (single inline line)
2026-05-16 12:25:02 -03:00
diegosouzapw
9ccb7b1c1e fix(dashboard,sse): correct opencode free provider and free section dot color
Add passthroughModels: true to the opencode registry entry so that unknown
model IDs trigger model lockout instead of connection cooldown. Fix dot color
for FREE_PROVIDERS in the Free Tier section by using toggleAuthType === "free"
to select the green dot instead of the blue oauth dot.
2026-05-16 12:01:31 -03:00
diegosouzapw
51918cb5d4 feat(dashboard): providers page — custom section to top, smaller cards, free tier section
Moves Compatible Providers to the top (before Expiration Banner) so users can
add custom OpenAI/Anthropic compatible providers without scrolling. Reduces
ProviderCard icon from 32px to 28px and increases grid density by one column at
each breakpoint (gap-4→gap-3). Adds a curated Free Tier Providers section with
27 providers (OAuth/noAuth group + API-key free-tier group), positioned between
Expiration Banner and OAuth Providers. Cards in the free section suppress the
hasFree badge since context makes it implicit.
2026-05-16 11:31:02 -03:00
diegosouzapw
91af593bb2 feat(dashboard,sse): add OpenCode Free provider (noAuth, public endpoint)
Adds 'opencode' to FREE_PROVIDERS as a no-auth provider using the public
OpenCode endpoint (https://opencode.ai/zen/v1). The existing OpencodeExecutor
already skips the Authorization header when no API key is present. Registry
entry reuses the opencode executor and shares models from the zen/v1 endpoint.
2026-05-16 11:29:57 -03:00
diegosouzapw
367497958f feat(endpoints): grid layout for Available Endpoints card, add 4 missing endpoints
Layout change:
- Replace accordion (EndpointSection) with compact grid cards (EndpointCard)
  showing icon, title, model count badge, path, and copy URL in 2–4 columns
- All 17 endpoints now visible at once without expand/collapse

Missing endpoints added:
- /v1/messages — Anthropic Messages API native format (badge: Anthropic)
- /v1/images/edits — Image editing/inpainting (shares image models)
- /v1/batches — OpenAI-compatible Batch API (badge: OpenAI)
- /v1/files — Files API for batch job management

Counter fix:
- Remove hardcoded +2 hack; compute count precisely:
  chat×4 (chat/responses/completions/messages) + image×2 (gen+edits)
  + per-category media + 3 fixed utility (batch/files/list-models)
  + model-based utility + search

i18n: add messagesApi, imageEdits, batchApi, filesApi keys to endpoint namespace
2026-05-16 10:27:15 -03:00
diegosouzapw
beb43a8bea feat(dashboard): add A2A audit page, stats bar on MCP audit, fix sidebar duplicates
- Add /dashboard/audit/a2a page with A2aAuditTab: lists tasks with skill/state
  filters, colored state badges, duration, events and artifacts counts
- Add "A2A Audit" item to Audit sidebar group (Monitoring section)
- Remove duplicate "MCP Audit" from MCP Server sidebar group — it stays
  only in the Audit group under Monitoring
- Improve McpAuditTab: fetch /api/mcp/audit/stats and show 4-card stat bar
  (calls 24h, success rate, avg duration, top tool) above the filters
- Add audit-a2a to HIDEABLE_SIDEBAR_ITEM_IDS
- Add i18n keys: auditA2a in sidebar + header sections, a2a* in compliance namespace
2026-05-16 09:57:40 -03:00
diegosouzapw
06bdc31a50 refactor(dashboard): rename MCP/A2A pages to *Server, wrap headers in Card, add MCP sidebar group
- Rename sidebar/page titles: "mcp" → "MCP Server", "a2a" → "A2A Server" (en.json)
- Wrap top header section in <Card> on both MCP and A2A pages for consistent styling
- Remove redundant "hub MCP Server" / "group_work A2A Server" headings from page body
- Add MCP_GROUP collapsible sidebar group (MCP Server + MCP Audit) in Agentic Features
- Update AGENTIC_FEATURES_ITEMS type to SidebarSectionChild[] to support groups
2026-05-16 09:38:07 -03:00
diegosouzapw
6a51b96a47 refactor(dashboard): remove Integration Surface card, move Cloud OmniRoute to tunnels, inline quick-start
- Remove Integration Surface card (tab switcher + Protocols tab card)
- API endpoints list always visible (no tab toggle needed)
- Cloud OmniRoute moved to first position inside Tunnels accordion section
- Tunnels header always visible (was conditional on tunnel flags)
- Cloudflare row: no longer collapsible — flat row with inline notice/error
- Remove leading comma from LAN IP and Tailscale IP inline displays
- Remove Cloudflare URL notice text (always-shown description removed)
- Remove double border between Tunnels header and Cloud OmniRoute row
- ngrok authtoken label: "not set in environment" (was "not set")
- MCP page: description + 3-step quick start merged into header area
- A2A page: description + 3-step quick start merged into header area
2026-05-16 09:15:47 -03:00
diegosouzapw
dc6c276992 refactor(dashboard): streamline endpoint card expanded panels and inline IPs
- Local Server: show LAN IPs inline (comma-separated) instead of chips below name
- Tailscale row: show Tailscale IP (100.x) inline with comma in row header
- Cloudflare expanded: remove readOnly URL input (URL visible in Active Endpoints bar)
- Tailscale expanded: remove both URL inputs; sudo field always visible (not conditional on running state)
- ngrok expanded: remove readOnly URL input; keep only authtoken field
2026-05-16 08:44:10 -03:00
diegosouzapw
8b555d7ee6 fix(dashboard): Tailscale detection, icon fix, and LAN IP display
- tailscaleTunnel: add 'serve status' fallback for older/permissioned CLI builds
- tailscaleTunnel: use settings.tailscaleEnabled as fallback when live funnel detection fails
- tailscaleTunnel: use path.format() to avoid CWE-22 false positive on sibling binary path
- api/network/info: new endpoint returning LAN IPs and Tailscale interface IP
- endpoint page: show machine LAN IP chips in Local Server row for network access
- endpoint page: show Tailscale 100.x IP URL in expanded Tailscale panel
- endpoint page: fix Tailscale Stop Funnel icon (vpn_lock_off -> vpn_key_off, valid glyph)
2026-05-16 05:01:03 -03:00
diegosouzapw
feb263ff4d fix(dashboard): clean up endpoint card URL redundancy and tunnel persistence
- Remove inline URL <code> blocks from all 5 connection rows (URLs now show only in the Active Endpoints bar)
- Show Active Endpoints bar when any URL is active (was: only when > 1)
- Fix Tailscale missing from Active bar by falling back to tunnelUrl when apiUrl is null
- Persist ngrok authtoken to /api/settings after first successful enable; restore on startup so it never needs re-entering
2026-05-16 04:30:10 -03:00
diegosouzapw
a0d766de8a refactor(dashboard): layout accordion para endpoint — barra de URLs ativas + linhas colapsáveis por túnel 2026-05-16 04:12:15 -03:00
diegosouzapw
00e19f3941 refactor(dashboard): remover card de intro do api-manager e mover botão para Registered Keys 2026-05-16 03:45:57 -03:00
diegosouzapw
dc6e7b00d0 refactor(dashboard): mover toggle/transport para páginas MCP e A2A, limpar abas duplicadas
- /dashboard/mcp: adiciona ServiceToggle (ON/OFF), TransportSelector (stdio/SSE/streamable-http) e DisabledPanel
- /dashboard/a2a: adiciona ServiceToggle (ON/OFF) e DisabledPanel
- /dashboard/endpoint: remove abas MCP, A2A e API Endpoints (agora têm páginas próprias), renderiza só EndpointPageClient
- ApiEndpointsTab: remove sub-aba Webhooks (migrada para /dashboard/webhooks)
2026-05-16 00:37:03 -03:00
diegosouzapw
cfc6be6a12 feat(home): remove Providers Overview card; rename API Manager → API Key Manager
- HomePageClient: remove tier coverage card (free/oauth/apikey breakdown)
- i18n: update apiManager label to "API Key Manager" in 13 locales (EN + placeholders)
2026-05-16 00:11:52 -03:00
diegosouzapw
da8218856b refactor(dashboard): reestruturação completa do sidebar — 9 seções, sub-grupos visuais, abas → páginas
- sidebarVisibility: novo tipo SidebarItemGroup para sub-grupos; SidebarSectionDefinition usa children[] (flat items + grupos); getSectionItems() helper; 9 seções (home, omni-proxy, analytics, monitoring, devtools, agentic-features, other-features, configuration, help); 8 sub-grupos (Compression Context, Tools, Integrations, Proxy, Costs Parameters, Audit, Batch); novos itens mitm-proxy e 1proxy
- Sidebar: OmniProxy pinada por default na primeira visita; home sem cabeçalho de seção; sub-grupos renderizados como separadores visuais (não colapsáveis); collapsed mode achata grupos corretamente
- Header: getSectionItems para lookup de hrefs; descrições para mitm-proxy, 1proxy
- Páginas convertidas (tabs → conteúdo direto): analytics, costs, audit, batch, logs, system/proxy
- Páginas com redirect: settings/page → /settings/general; settings/pricing → /costs/pricing
- McpAuditTab extraído para componente compartilhado (elimina duplicação audit/page + audit/mcp/page)
- Novas páginas: system/mitm-proxy e system/1proxy (wrappers das abas existentes)
- i18n: 17 novas chaves em 41 locales (sub-grupos, seções renomeadas, novos itens)
- AppearanceTab: usa getSectionItems para visibilidade do sidebar
2026-05-15 22:48:35 -03:00
diegosouzapw
a5f33017fd feat(dashboard): accordion sidebar + OmniProxy section + pin behavior
- Rename first section from "Routing" to "OmniProxy" with collapsible header
- Accordion behavior: opening a section closes all non-pinned sections
- Pin button (push_pin) on section headers — visible on hover, always visible when pinned
- Pinned sections stay open regardless of accordion toggle
- Both expanded + pinned state persisted to localStorage
- i18n: add omniProxySection key to all 41 locales
2026-05-15 20:26:45 -03:00
diegosouzapw
a045ddca56 feat(dashboard): tabs → pages, collapsible sidebar, narrower width, tooltips
- Sidebar: w-80 → w-[220px], 12 collapsible sections (default: routing open),
  localStorage persistence, auto-expand active section, styled JS tooltip on mini mode
- sidebarVisibility: restructure from 6 to 12 sections, add 22 new item IDs
- Header: add HEADER_DESCRIPTIONS for all 22 new routes
- i18n: add 23 sidebar + 20 header keys to all 41 locale files
- New pages (Proposal A — tabs become dedicated routes):
  /dashboard/mcp, /dashboard/a2a, /dashboard/api-endpoints
  /dashboard/analytics/{evals,search,utilization,combo-health,compression}
  /dashboard/costs/{budget,pricing}
  /dashboard/batch/files
  /dashboard/logs/{proxy,console,activity}
  /dashboard/audit/mcp
  /dashboard/settings/{general,appearance,ai,security,routing,resilience,advanced}
2026-05-15 19:53:02 -03:00
diegosouzapw
93526e3d9c refactor(dashboard): remove remaining redundant padding/max-width across all pages
Complete the width standardization pass — DashboardLayout provides p-4 sm:p-6 lg:p-10
and max-w-7xl mx-auto, so page-level containers must not add their own padding or width
constraints.

- analytics/loading, providers/loading, settings/loading: remove p-6 from loading skeletons
- providers/error, settings/error: remove p-6 from error boundary pages
- endpoint/ApiEndpointsTab: remove p-6 max-w-6xl mx-auto (loading + main return); collapse
  redundant wrapper div in loading state
- endpoint/components/A2ADashboard, MCPDashboard: remove p-6 max-w-7xl mx-auto (both states);
  collapse loading wrapper div to single element
- settings/pricing: remove max-w-6xl mx-auto p-6
- system/proxy: remove max-w-6xl mx-auto
2026-05-15 18:47:58 -03:00
diegosouzapw
b39d0d8861 refactor(dashboard): fix dark theme + two-column layout on agent-skills, standardize page widths
- agent-skills: replace all inline style={{ color: "var(--color-xxx, #fallback)" }} with
  Tailwind semantic classes (text-text-main, text-text-muted, bg-bg-subtle, border-border,
  text-primary, bg-primary/10, bg-emerald-500/10, bg-amber-500/10) — fixes dark mode
- agent-skills: full-width "How to use" card + two-column grid (API Skills | CLI Skills)
  on lg+ screens; remove internal p-6 and max-w-3xl (layout already provides padding/max-w)
- audit, webhooks: remove redundant p-6 + mx-auto max-w-7xl (DashboardLayout already wraps
  content in max-w-7xl with p-4 sm:p-6 lg:p-10)
- memory: remove extra p-6
- agents: remove p-6 + max-w-5xl mx-auto
- cloud-agents: remove p-6 + max-w-6xl mx-auto
- changelog: remove max-w-5xl mx-auto w-full
- health: remove outer p-6 + max-w-6xl mx-auto; strip redundant p-6 from loading/error states
- translator: remove p-4 sm:p-8 (layout provides padding)
- context/caveman, context/rtk, context/combos: remove mx-auto max-w-6xl
2026-05-15 18:31:24 -03:00
diegosouzapw
3975d2c10f feat(dashboard): complete header descriptions for all sidebar pages
- Add header descriptions for 13 remaining pages (agents, cloud-agents, memory,
  skills/omniSkills, agent-skills, translator, playground, search-tools, logs,
  audit, webhooks, health, proxy) across all 41 locale files
- Update HEADER_DESCRIPTIONS map in Header.tsx to cover all 30 sidebar pages
- Remove page-body title block from agent-skills page (cherry-picked from feat/v3.8.0-features)
2026-05-15 17:26:42 -03:00
diegosouzapw
58c2cfccd9 fix(skills): use useCopyToClipboard hook in AgentSkills for HTTP fallback 2026-05-15 17:23:50 -03:00
diegosouzapw
291c1ffaf8 feat(skills): add 5 CLI skills + split AgentSkills / OmniSkills pages
- Add skills/omniroute-cli/SKILL.md — CLI entry point (install, global flags, output formats, env vars)
- Add skills/omniroute-cli-admin/SKILL.md — server lifecycle, setup, doctor, backup, autostart, tunnels
- Add skills/omniroute-cli-providers/SKILL.md — provider connections, keys, OAuth, models, combos, quota
- Add skills/omniroute-cli-cloud/SKILL.md — Codex / Devin / Jules cloud agent task workflow
- Add skills/omniroute-cli-eval/SKILL.md — eval suites, run + watch, scorecard, CI integration
- Update agentSkills.ts: add category field (api | cli), add 5 new CLI skills (18 total)
- Create /dashboard/agent-skills page (AgentSkills) with API + CLI sections and copy-URL buttons
- Remove AI Skills tab from /dashboard/skills (OmniSkills) — now a separate page
- Add agent-skills to sidebar (CLI section) with i18n keys omniSkills + agentSkills
- Update skills/README.md and omniroute/SKILL.md index tables
2026-05-15 17:23:42 -03:00
diegosouzapw
68ca8bf1e9 refactor(dashboard): remove page-body headers, add topology multi-ring, icon+title header
- ProviderTopology: replace single-ring ellipse with multi-ring concentric layout (6 rings)
  - Providers sorted active → error → last-used → rest; compact node design (text-xs, 16px icon)
- Header: derive icon/title from SIDEBAR_SECTIONS auto-mapping, remove breadcrumbs logic
  - Add HEADER_DESCRIPTIONS map for all pages with known descriptions
  - Use sidebar i18n namespace for titles (covers all 42 locales)
- DashboardLayout: remove <Breadcrumbs /> component
- Add header descriptions for 9 new pages (costs, cache, limits, api-manager, batch,
  context-caveman/rtk/combos, changelog) across all 41 locale files
- Remove duplicate page-body title+description from 16 pages: costs, analytics, cache,
  cache/media, context/caveman/rtk/combos, changelog, agents, cloud-agents, skills,
  audit, translator, webhooks, memory, health — preserving action buttons in each
- Rename sidebar "Limits & Quotas" → "Quota Limits" (en.json)
- run-next.mjs: pre-read DATA_DIR from .env before bootstrap (zero-config dev start)
2026-05-15 17:20:48 -03:00
diegosouzapw
f56485f3cf 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:13:07 -03:00
diegosouzapw
871f0520bb 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:38:13 -03: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
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