Files
OmniRoute/docs/i18n/cs/docs/architecture/CODEBASE_DOCUMENTATION.md
Diego Rodrigues de Sa e Souza b637350680 fix(docs): re-sync the 65 documentation mirror sets; section-level docs pipeline; drift gate blocking (#13940)
1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors.

⚠️ base-red inherited: #12732
2026-09-17 02:55:31 -03:00

84 KiB

OmniRoute Codebase Documentation (Čeština)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Verze: v3.8.51 Poslední aktualizace: 2026-06-28 Cílová skupina: Inženýři přispívající do OmniRoute nebo vytvářející integrace nad touto platformou.

Přehledová schémata architektury a zdůvodnění jednotlivých subsystémů najdete v ARCHITECTURE.md. Podrobné informace o jednotlivých subsystémech (Auto Combo, server MCP, server A2A, Skills, Memory, Cloud Agents, Resilience, Compression atd.) najdete v jejich vyhrazených souborech v tomto adresáři docs/.

Tento soubor popisuje aktuální obsah repozitáře, aby se nový inženýr dokázal zorientovat v jeho stromové struktuře, porozuměl vrstvám běhového prostředí a věděl, kam přidat kód, aniž by vytvářel nové moduly.


1. Technologický stack

Oblast Volba
Webový framework Next.js 16 (App Router, samostatný výstup, bez globálního middlewaru)
Jazyk TypeScript 6.0+ — cíl ES2022, module: esnext, moduleResolution: bundler, strict: false
Běhové prostředí Node.js >=22.22.2 <23 nebo >=24.0.0 <27 (vynuceno prostřednictvím engines + SUPPORTED_NODE_RANGE)
Databáze SQLite prostřednictvím better-sqlite3 (singleton, žurnálování WAL)
Desktop Electron 41 + electron-builder 26.10 (samostatný pracovní prostor v electron/)
Testy Nativní testovací nástroj Node (jednotkové/integrační), Vitest (MCP, autoCombo, mezipaměť), Playwright (e2e + protocols-e2e)
Sestavení Samostatné sestavení Next.js prostřednictvím scripts/build/build-next-isolated.mjs
Lintování/formátování Plochá konfigurace ESLint + Prettier (lint-staged prostřednictvím pre-commitu Husky)
Systém modulů Všude ESM ("type": "module")
Pracovní prostory Pracovní prostor npm — open-sse je jediný dílčí pracovní prostor

Aliasy cest (tsconfig.json):

  • @/*src/*
  • @omniroute/open-sseopen-sse/index.ts
  • @omniroute/open-sse/*open-sse/*

Výchozí port HTTP: 20128 (API a řídicí panel sdílejí stejný proces). Datový adresář se určuje proměnnou prostředí DATA_DIR; výchozí hodnota je ~/.omniroute/.


2. Struktura repozitáře

OmniRoute/
├── src/                  Aplikace Next.js (App Router, knihovny, doména, server, sdílené součásti)
├── open-sse/             Pracovní prostor streamovacího enginu (@omniroute/open-sse)
├── electron/             Desktopová nadstavba (hlavní proces Electron 41 + preload)
├── bin/                  Vstupní body CLI (omniroute, reset-password)
├── tests/                Jednotkové, integrační, e2e, protocols-e2e, překladové a bezpečnostní testy a testovací data
├── scripts/              Pomocné skripty pro sestavení, synchronizaci, kontroly, migraci a běhové prostředí
├── docs/                 Veřejná dokumentace (tento adresář)
├── public/               Statické prostředky, manifest PWA, service worker
├── config/               Ukázky konfigurace běhového prostředí
├── images/               Marketingové materiály a snímky obrazovky
├── _ideia/, _references/, _mono_repo/, _tasks/   Interní pracovní materiály / plánování (nejsou součástí distribuce)
├── CLAUDE.md             Pravidla repozitáře pro Claude Code
├── AGENTS.md             Podrobnější referenční dokumentace architektury pro agenty
├── package.json          v3.8.51, kořen pracovního prostoru
└── tsconfig.json         Aliasy cest + základní volby kompilátoru

3. src/ — Aplikace Next.js

src/
├── app/                  Stránky App Routeru + API trasy
├── lib/                  Základní knihovny (DB, ověřování, OAuth, dovednosti, paměť, …)
├── domain/               Čistá doménová vrstva (zásady, záložní mechanismy, náklady, uzamčení, …)
├── server/               Moduly pouze pro server (autorizace, CORS, ověřování)
├── shared/               Typy, konstanty, validace, kontrakty, nástroje (bezpečné napříč hranicemi)
├── mitm/                 Pomocné funkce proxy typu man-in-the-middle pro integraci CLI
├── models/               Metadata / aliasy lokálních modelů
├── sse/                  Starší obslužné rutiny SSE, které stále zůstávají v src/ (nikoli v open-sse/)
├── store/                Úložiště stavu na straně klienta
├── middleware/           Nástroje middlewaru na úrovni tras (nikoli globální middleware Next.js)
├── scripts/              Skripty ve zdrojovém stromu, které lze importovat kódem aplikace
├── types/                Globální a sdílené typy TS
├── i18n/                 Lokalizační balíčky
├── instrumentation.ts    Instrumentační hook Next.js
├── instrumentation-node.ts
└── proxy.ts              Pomocný modul pro zavedení proxy na nejvyšší úrovni

3.1 src/app/ — App Router

App Router zpřístupňuje jak uživatelské rozhraní řídicího panelu, tak veřejné/správcovské HTTP API. Globální middleware neexistuje — zachytávání se provádí pro každou trasu samostatně.

Segmenty nejvyšší úrovně v src/app/:

Cesta Účel
api/ Všechny trasy HTTP API (viz rozpis níže)
a2a/ Koncový bod A2A JSON-RPC 2.0 (POST /a2a)
.well-known/agent.json/ Dokument pro zjišťování karty agenta A2A
(dashboard)/ Uživatelské rozhraní řídicího panelu (skupina tras, bez prefixu URL)
auth/, login/, forgot-password/, callback/ Toky ověřování
landing/ Marketingová/vstupní stránka
docs/ Integrovaný prohlížeč dokumentace API
status/, maintenance/, offline/ Provozní stránky
privacy/, terms/ Právní stránky
400/, 401/, 403/, 408/, 429/, 500/, 502/, 503/ Statické chybové stránky
error.tsx, global-error.tsx, not-found.tsx, forbidden/, loading.tsx Hranice frameworku pro chyby/načítání
layout.tsx, page.tsx, globals.css, manifest.ts Kořenový rámec

3.1.1 src/app/(dashboard)/dashboard/ — Stránky uživatelského rozhraní

agents, analytics, api-manager, audit, auto-combo, batch, cache, changelog, cli-tools, cloud-agents, combos, compression, context, costs, endpoint, health, limits, logs, memory, onboarding, playground, providers, search-tools, settings, skills, system, translator, usage, webhooks a dále kořenové soubory page.tsx, HomePageClient.tsx, BootstrapBanner.tsx.

3.1.2 src/app/api/ — Skupiny API nejvyšší úrovně

src/app/api/
├── a2a/{status, tasks}
├── acp/
├── admin/
├── analytics/
├── assess/
├── auth/
├── batches/
├── cache/
├── cli-tools/
├── cloud/{codex-responses-ws}
├── combos/
├── compliance/
├── compression/
├── context/
├── db/, db-backups/
├── evals/
├── fallback/
├── files/
├── health/
├── init/
├── internal/{concurrency}
├── keys/
├── logs/
├── mcp/{audit, sse, status, stream, tools}
├── memory/{health, [id]/, route.ts}
├── model-combo-mappings/
├── models/
├── monitoring/
├── oauth/
├── openapi/
├── policies/
├── pricing/
├── provider-metrics/, provider-models/, provider-nodes/
├── providers/
├── rate-limit/, rate-limits/
├── resilience/
├── restart/, shutdown/
├── search/
├── sessions/
├── settings/
├── skills/{executions, [id], install, marketplace, route.ts, skillssh}
├── storage/
├── sync/, synced-available-models/
├── system/
├── tags/
├── telemetry/
├── token-health/
├── translator/
├── tunnels/
├── services/   Správa vestavěných služeb (9router, cliproxy) — LOCAL_ONLY
├── upstream-proxy/
├── usage/
├── v1/         Veřejné API kompatibilní s OpenAI
├── v1beta/     Kompatibilita ve stylu Gemini
├── version-manager/
└── webhooks/

3.1.2a src/app/api/services/ — Správa vestavěných služeb

Trasy pro instalaci, spouštění, zastavování a monitorování 9Router a CLIProxyAPI. Všechny cesty jsou klasifikovány jako LOCAL_ONLY (pouze loopback, pevné pravidlo č. 17), protože mohou spouštět npm install a vytvářet podřízené procesy.

src/app/api/services/
├── 9router/
│   ├── _lib.ts             pomocná funkce getOrInitSupervisor()
│   ├── install/route.ts    POST — npm install prostřednictvím execFile
│   ├── start/route.ts      POST — supervisor.start()
│   ├── stop/route.ts       POST — supervisor.stop()
│   ├── restart/route.ts    POST — supervisor.restart()
│   ├── update/route.ts     POST — npm install novější verze
│   ├── rotate-key/route.ts POST — vygenerování nového klíče API + restart
│   ├── status/route.ts     GET  — aktuální stav + stav DB + metadata verze
│   └── auto-start/route.ts POST — přepnutí příznaku auto_start
├── cliproxy/
│   ├── _lib.ts             pomocná funkce getOrInitSupervisor()
│   ├── install/route.ts    POST — npm install
│   ├── start/route.ts      POST — supervisor.start()
│   ├── stop/route.ts       POST — supervisor.stop()
│   ├── restart/route.ts    POST — supervisor.restart()
│   ├── update/route.ts     POST — npm install novější verze
│   ├── status/route.ts     GET  — aktuální stav + stav DB + metadata verze
│   └── auto-start/route.ts POST — přepnutí příznaku auto_start
└── [name]/
    └── logs/route.ts       GET  — průběžný výpis protokolu přes SSE (sdílený všemi službami)

Odpovídající uživatelské rozhraní řídicího panelu: src/app/(dashboard)/dashboard/providers/services/ — stránka se dvěma kartami (CLIProxyAPI + 9Router). Reverzní proxy pro vložené uživatelské rozhraní 9Router: src/app/(dashboard)/dashboard/providers/services/[name]/embed/[[...path]]/route.ts

Podrobný rozbor: docs/frameworks/EMBEDDED-SERVICES.md

3.1.3 src/app/api/v1/ — Veřejné API kompatibilní s OpenAI

v1/
├── accounts/[id]/                       vyhledání účtu
├── agents/tasks/[id]/, agents/tasks/    koncové body úloh ve stylu A2A
├── api/                                 interní pomocné funkce API zpřístupněné pod v1/api
├── audio/{speech, transcriptions}/      TTS + STT
├── batches/[id]/{cancel}, batches/      OpenAI Batches API
├── chat/completions/                    Chat Completions (hlavní koncový bod)
├── completions/                         starší textová dokončování
├── embeddings/                          vektorová vložení
├── files/[id]/, files/                  Files API
├── _helpers/                            sdílené pomocné funkce tras (bez veřejné URL)
├── images/{edits, generations}/         generování + úpravy obrázků
├── issues/                              pomocné koncové body pro třídění problémů
├── management/{proxies}/                trasy se správním rozsahem uvnitř v1
├── messages/{count_tokens}/             kompatibilita zpráv ve stylu Anthropic
├── models/                              výpis modelů (`route.ts`, `catalog.ts`)
├── moderations/                         moderování
├── music/                               generování hudby
├── providers/[provider]/                operace jednotlivých poskytovatelů
├── quotas/{check}                       kontroly kvót
├── registered-keys/                     správa registrovaných klíčů
├── rerank/                              změna pořadí
├── responses/[...path]/                 OpenAI Responses API (záchytná trasa)
├── search/                              vyhledávání na webu
├── videos/                              generování videí
├── ws/                                  most WebSocket
└── route.ts                             obslužná rutina indexu

Každý soubor trasy používá stejný vzor:

Trasa → předběžný požadavek CORS → validace těla pomocí Zod → volitelné ověření
      → vynucení zásad klíče API → delegování obslužné rutině (open-sse)

v1beta/ je rozhraní kompatibility ve stylu Gemini (tenká obálka, která provádí překlad do stejného zpracovatelského řetězce open-sse/handlers/).

3.2 src/lib/ — Základní knihovny

Data, synchronizaci, OAuth, dovednosti, paměť atd. vždy importujte prostřednictvím těchto modulů. Tabulka seskupuje skutečné adresáře a významné soubory nejvyšší úrovně.

Modul Účel
a2a/ Server protokolu A2A: taskManager.ts, streaming.ts, taskExecution.ts, routingLogger.ts, skills/ (6 dovedností: analýza nákladů, zpráva o stavu, vyhledávání poskytovatelů, správa kvót, inteligentní směrování, výpis schopností)
acp/ Agent-Control-Protocol: index.ts, manager.ts, registry.ts
api/ Pomocné funkce interního API: requireManagementAuth.ts, requireCliToolsAuth.ts, errorResponse.ts
auth/ managementPassword.ts (resetování / hashování hesla)
batches/ Služba OpenAI Batches API (service.ts)
catalog/ Synchronizace katalogu OpenRouter (openrouterCatalog.ts)
cloudAgent/ Registr cloudových agentů: api.ts, baseAgent.ts, db.ts, index.ts, registry.ts, types.ts, agents/{codex, devin, jules}.ts
combos/ Pomocné funkce pro vyhodnocování kombinací
compliance/ Audit + audit poskytovatelů: index.ts, providerAudit.ts
config/ Propojení konfigurace běhového prostředí
db/ Doménové moduly SQLite (viz §3.2.1)
display/ Pomocné funkce uživatelského rozhraní/zobrazení používané odpověďmi API
embeddings/ Registr služeb vektorových reprezentací
env/ Načítání + introspekce prostředí
evals/ Běhové prostředí evaluací
guardrails/ piiMasker.ts, promptInjection.ts, visionBridge.ts, visionBridgeHelpers.ts, registry.ts, base.ts
jobs/ Úlohy na pozadí (autoUpdate.ts, …)
memory/ Trvalá paměť: store.ts, cache.ts, retrieval.ts, summarization.ts, extraction.ts, injection.ts, qdrant.ts, settings.ts, verify.ts, schemas.ts, types.ts
monitoring/ observability.ts
oauth/ Moduly OAuth/importu poskytovatelů (22): agy, antigravity, claude, cline, codebuddy-cn, codex, cursor, devin-desktop, ghe-copilot, github, gitlab-duo, grok-cli-oauth, grok-cli, kilocode, kimi-coding, kiro, openference, qoder, trae, xai-oauth, zed-hosted, zed, plus services/, utils/ a constants/oauth.ts
plugins/ Načítání pluginů (index.ts)
promptCache/ prefixAnalyzer.ts, index.ts
providerModels/ Spravovaný životní cyklus modelů: modelDiscovery.ts, managedModelImport.ts, managedAvailableModels.ts, cursorAgent.ts
providers/ Pomocné funkce poskytovatelů: catalog.ts, validation.ts, imageValidation.ts, claudeExtraUsage.ts, codexConnectionDefaults.ts, codexFastTier.ts, webCookieAuth.ts, managedAvailableModels.ts, requestDefaults.ts
resilience/ settings.ts — nastavení pro jistič, dobu zklidnění a uzamčení
runtime/ Detekce funkcí běhového prostředí
search/ executeWebSearch.ts
services/ Framework vestavěných služeb: ServiceSupervisor.ts (obecný správce podřízených procesů se zámkem operací, kruhovou vyrovnávací pamětí a kontrolou stavu), bootstrap.ts (registrace na úrovni procesu a automatické spuštění), registry.ts (mapování nástroj → správce), apiKey.ts (úložiště klíčů AES-256-GCM), modelSync.ts (pravidelná synchronizace modelů), ringBuffer.ts (5 MB kruhová vyrovnávací paměť protokolu), healthCheck.ts (HTTP sonda stavu), types.ts, embedWsProxy.ts (WebSocket proxy), installers/{ninerouter,cliproxy}.ts. Viz docs/frameworks/EMBEDDED-SERVICES.md
agentSkills/ Katalog + generátor dovedností agentů: catalog.ts (getCatalog/getSkillById/filterCatalog/computeCoverage), generator.ts (generateAgentSkills → zapisuje skills/{id}/SKILL.md), openapiParser.ts (extrahuje koncové body REST ze specifikace OpenAPI), cliRegistryParser.ts (extrahuje podřízené příkazy CLI z bin/cli-registry), schemas.ts (Zod: AgentSkillSchema, SkillCoverageSchema, ListQuerySchema, GenerateBodySchema), types.ts (AgentSkill, SkillCoverage, SkillMarkdown, GeneratorReport). Používají jej trasy REST (/api/agent-skills/*), nástroje MCP (omniroute_agent_skills_*) a dovednost A2A list-capabilities. Viz AGENT-SKILLS.md.
skills/ Framework dovedností: registry.ts, executor.ts, interception.ts, injection.ts, sandbox.ts, custom.ts, hybrid.ts, builtins.ts, a2a.ts, providerSettings.ts, schemas.ts, skillssh.ts, types.ts a builtin/browser.ts
spend/ batchWriter.ts (vyrovnávací paměť pro odložený zápis)
sync/ bundle.ts, tokens.ts (cloudová synchronizace)
system/ Pomocné funkce na systémové úrovni
translator/ Propojení překladače nejvyšší úrovně (deleguje do open-sse/translator/)
usage/ Účtování využití: costCalculator.ts, tokenAccounting.ts, usageHistory.ts, aggregateHistory.ts, usageStats.ts, callLogs.ts, callLogArtifacts.ts, fetcher.ts, providerLimits.ts, migrations.ts
versionManager/ Automatické aktualizace + manifest verzí
ws/ Most WebSocket
zed-oauth/ Tok OAuth editoru Zed

Soubory nejvyšší úrovně v src/lib/:

  • Původní souhrnný modul localDb.ts byl odstraněn — konzumenti importují konkrétní moduly src/lib/db/* přímo.
  • proxyHealth.ts, proxyLogger.ts, tokenHealthCheck.ts, localHealthCheck.ts
  • apiBridgeServer.ts, cacheLayer.ts, semanticCache.ts, settingsCache.ts
  • cloudSync.ts, initCloudSync.ts
  • cloudflaredTunnel.ts, ngrokTunnel.ts, tailscaleTunnel.ts
  • consoleInterceptor.ts, container.ts, gracefulShutdown.ts, idempotencyLayer.ts
  • ipUtils.ts, logEnv.ts, logPayloads.ts, logRotation.ts
  • modelAliasSeed.ts, modelCapabilities.ts, modelMetadataRegistry.ts, modelsDevSync.ts
  • piiSanitizer.ts, pricingSync.ts
  • apiKeyExposure.ts, cacheControlSettings.ts, dataPaths.ts, toolPolicy.ts
  • translatorEvents.ts, usageDb.ts, usageAnalytics.ts, webhookDispatcher.ts

3.2.1 src/lib/db/

Databáze SQLite implementovaná jako singleton (getDbInstance() v core.ts, žurnálování WAL). Nikdy nezapisujte nezpracované SQL přímo do tras nebo obslužných rutin — používejte tyto moduly.

Přehled databázového schématu (vybrané základní tabulky)

Zdroj: diagrams/db-schema-overview.mmd

Doménové moduly (každý spravuje jednu nebo více tabulek): apiKeys.ts, backup.ts, batches.ts, cleanup.ts, cliToolState.ts, combos.ts, commandCodeAuth.ts, compression.ts, compressionAnalytics.ts, compressionCacheStats.ts, compressionCombos.ts, compressionScheduler.ts, contextHandoffs.ts, core.ts, creditBalance.ts, databaseSettings.ts, detailedLogs.ts, domainState.ts, encryption.ts, evals.ts, files.ts, healthCheck.ts, jsonMigration.ts, migrationRunner.ts, modelComboMappings.ts, models.ts, oneproxy.ts, prompts.ts, providers.ts, providerLimits.ts, proxies.ts, quotaSnapshots.ts, readCache.ts, reasoningCache.ts, registeredKeys.ts, secrets.ts, sessionAccountAffinity.ts, settings.ts, stateReset.ts, stats.ts, syncTokens.ts, tierConfig.ts, upstreamProxy.ts, versionManager.ts, webhooks.ts.

Adresář migrations/ obsahuje 168 verzovaných souborů .sql (idempotentních a transakčních), které při spuštění provádí migrationRunner.ts.

Tabulky vytvořené napříč migracemi (celkem 123):

a, account_key_limits, api_keys, batches, call_logs, combo_adaptation_state, combos, command_code_auth_sessions, compression_analytics, compression_cache_stats, compression_combo_assignments, compression_combos, context_handoffs, daily_usage_summary, db_meta, domain_budgets, domain_circuit_breakers, domain_cost_history, domain_fallback_chains, domain_lockout_state, eval_cases, eval_runs, eval_suites, files, hourly_usage_summary, key_value, mcp_tool_audit, memories, model_combo_mappings, provider_connections, provider_key_limits, provider_nodes, proxy_assignments, proxy_logs, proxy_registry, quota_snapshots, reasoning_cache, registered_keys, request_detail_logs, routing_decisions, semantic_cache, session_account_affinity, skill_executions, skills, sync_tokens, tier_assignments, tier_config, upstream_proxy_config, usage_history, version_manager, webhooks (plus virtuální tabulky FTS5 pro vyhledávání v paměti).

3.3 src/domain/ — Doménová vrstva

Čistá obchodní logika bez vstupu a výstupu. Importují ji trasy a obslužné rutiny.

Soubor Účel
policyEngine.ts Hlavní překladač zásad
fallbackPolicy.ts Rozhodovací strom záložních možností
costRules.ts Pravidla výpočtu nákladů
lockoutPolicy.ts Rozhodnutí o blokování modelu
tagRouter.ts Směrování na základě značek
comboResolver.ts Překlad kombinace z požadavku → seznam cílů
connectionModelRules.ts Filtry modelů pro jednotlivá připojení
modelAvailability.ts Kontrola dostupnosti modelu
degradation.ts Přechody do degradovaného režimu
providerExpiration.ts Detekce účtů nebo klíčů s ukončenou platností
quotaCache.ts Rozhodnutí o kvótách uložená v mezipaměti
responses.ts, omnirouteResponseMeta.ts Pomocné funkce pro strukturu odpovědí
configAudit.ts Audit změn konfigurace
assessment/ Hodnocení modelu (podle RFC, částečně implementováno)
types.ts Sdílené doménové typy

3.4 src/server/ — Pouze pro server

Nelze importovat z klientských komponent.

server/
├── auth/loginGuard.ts
├── authz/
│   ├── classify.ts        Klasifikuje trasy jako veřejné nebo správcovské
│   ├── assertAuth.ts      Pomocná funkce pro ověřování tvrzení
│   ├── context.ts         Kontext autorizace pro jednotlivé požadavky
│   ├── headers.ts
│   ├── pipeline.ts        Autorizační řetězec
│   ├── policies/          Konkrétní zásady
│   └── types.ts
└── cors/origins.ts        Seznam povolených zdrojů CORS

3.5 src/shared/ — Bezpečné pro sdílení

Rozděleno do účelově zaměřených podadresářů:

  • constants/providers.ts (katalog poskytovatelů ověřovaný pomocí Zod), models.ts, modelSpecs.ts, modelCompat.ts, pricing.ts, cliTools.ts, cliCompatProviders.ts, routingStrategies.ts, comboConfigMode.ts, headers.ts, upstreamHeaders.ts (seznam zakázaných položek), mcpScopes.ts, errorCodes.ts, publicApiRoutes.ts, batch.ts, batchEndpoints.ts, bodySize.ts, colors.ts, appConfig.ts, config.ts, sidebarVisibility.ts, visionBridgeDefaults.ts.
  • validation/schemas.ts (~80 schémat Zod), compressionConfigSchemas.ts, providerSchema.ts, settingsSchemas.ts, helpers.ts.
  • contracts/ — veřejné kontrakty API distribuované prostřednictvím npm.
  • types/ — sdílené typy TS.
  • utils/circuitBreaker.ts, apiAuth.ts, apiKey.ts, apiKeyPolicy.ts, api.ts, classify429.ts, cliCompat.ts, clipboard.ts, cloud.ts, cn.ts, cors.ts, featureFlags.ts, fetchTimeout.ts, formatting.ts, inputSanitizer.ts, logger.ts, machine.ts, machineId.ts, maskEmail.ts, modelCatalogSearch.ts, nodeRuntimeSupport.ts, parseApiKeys.ts, providerHints.ts, providerModelAliases.ts, rateLimiter.ts, releaseNotes.ts, a11yAudit.ts a také hooky/komponenty řídicího panelu v adresářích services/, network/, middleware/, schemas/, hooks/, components/.

4. open-sse/ — pracovní prostor streamovacího enginu

Samostatný npm pracovní prostor publikovaný jako @omniroute/open-sse. Zajišťuje zpracování požadavků, exekutory, překladače, služby, transformátor a MCP server.

open-sse/
├── index.ts                Veřejné exporty
├── package.json            Manifest pracovního prostoru
├── tsconfig.json
├── types.d.ts
├── config/                 Registry poskytovatelů, profily hlaviček, identita, …
├── handlers/               Obslužné rutiny požadavků (chat, vnoření, zvuk, obrázky, …)
├── executors/              108 HTTP exekutorů specifických pro jednotlivé poskytovatele
├── translator/             Převod formátů (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro)
├── transformer/            Transformátor streamů Responses API ↔ Chat Completions
├── services/               Více než 80 modulů služeb (kombinace, záložní mechanismy, kvóty, identita, …)
├── utils/                  Pomocné nástroje pro streamování, TLS klient, AWS SigV4, načítání přes proxy, …
└── mcp-server/             MCP server (3 transporty, 33 rozsahů, 110 nástrojů)

4.1 open-sse/handlers/

Obslužná rutina Účel
chatCore.ts Hlavní chatovací pipeline (mezipaměť, omezení rychlosti, kombinované směrování, předání exekutoru)
responsesHandler.ts Vstupní bod OpenAI Responses API
embeddings.ts Vnoření
imageGeneration.ts Generování obrázků
audioSpeech.ts Převod textu na řeč
audioTranscription.ts Převod řeči na text
videoGeneration.ts Generování videa
musicGeneration.ts Generování hudby
rerank.ts Změna pořadí
moderations.ts Moderování
search.ts Vyhledávání na webu
sseParser.ts Parser událostí SSE
usageExtractor.ts Získávání počtů tokenů ze streamů nadřazených služeb
responseSanitizer.ts Odstranění rušivých prvků specifických pro poskytovatele
responseTranslator.ts Propojení mezi odpovědí poskytovatele a překladovou vrstvou

4.2 open-sse/executors/

108 exekutorů poskytovatelů, z nichž každý rozšiřuje BaseExecutor (base.ts):

antigravity, azure-openai, blackbox-web, cliproxyapi, chatgpt-web-codex, cloudflare-ai, codex, commandCode, cursor, default, devin-cli, muse-spark-web, nlpcloud, opencode, perplexity-web, petals, pollinations, qoder, vertex, devin-desktop, dále claudeIdentity.ts (sdílená pomocná funkce pro identitu) a index.ts (registr).

Poznámka: poskytovatelé, kteří zde nejsou uvedeni, jsou obsluhováni souborem default.ts pomocí obecného exekutoru kompatibilního s OpenAI. Úplný katalog poskytovatelů (355 poskytovatelů) se nachází v src/shared/constants/providers.ts.

4.3 open-sse/translator/

Překlad podle modelu hub-and-spoke (OpenAI je centrálním uzlem).

  • 9 překladačů požadavků (translator/request/): antigravity-to-openai, claude-to-gemini, claude-to-openai, gemini-to-openai, openai-responses, openai-to-claude, openai-to-cursor, openai-to-gemini, openai-to-kiro.
  • 9 překladačů odpovědí (translator/response/): claude-to-openai, cursor-to-openai, gemini-to-claude, gemini-to-openai, kiro-to-openai, openai-responses, openai-to-antigravity, openai-to-claude.
  • 9 pomocných nástrojů (translator/helpers/): claudeHelper, geminiHelper, geminiToolsSanitizer, maxTokensHelper, openaiHelper, responsesApiHelper, schemaCoercion, toolCallHelper a testy pomocných nástrojů.
  • Pomocné nástroje pro obrázky (translator/image/sizeMapper.ts).
  • Na nejvyšší úrovni: bootstrap.ts, formats.ts, registry.ts, index.ts.

4.4 open-sse/transformer/

  • responsesTransformer.ts — převodník Responses API ↔ Chat Completions založený na TransformStream (používaný záchytnou trasou responses/).

4.5 open-sse/services/

Nejdůležitější části (úplný seznam se nachází v open-sse/services/):

Oblast Soubory
Směrování Combo combo.ts (19 strategií), comboConfig.ts, comboMetrics.ts, comboManifestMetrics.ts, comboAgentMiddleware.ts
Engine Auto Combo autoCombo/engine.ts, scoring.ts, taskFitness.ts, virtualFactory.ts, modePacks.ts, autoPrefix.ts, persistence.ts, providerDiversity.ts, providerRegistryAccessor.ts, routerStrategy.ts, selfHealing.ts, index.ts
Odolnost accountFallback.ts (doba čekání + uzamčení), errorClassifier.ts, emergencyFallback.ts, rateLimitManager.ts, rateLimitSemaphore.ts, accountSemaphore.ts, accountSelector.ts
Kvóty quotaMonitor.ts, quotaPreflight.ts, bailianQuotaFetcher.ts, codexQuotaFetcher.ts, deepseekQuotaFetcher.ts, openrouterQuotaFetcher.ts, openrouterFreeWindow.ts, crofUsageFetcher.ts, antigravityCredits.ts
Ukládání do mezipaměti reasoningCache.ts, searchCache.ts, signatureCache.ts, requestDedup.ts
Inteligentní směrování intentClassifier.ts, taskAwareRouter.ts, backgroundTaskDetector.ts, volumeDetector.ts, wildcardRouter.ts, workflowFSM.ts, specificityDetector.ts, specificityRules.ts, specificityTypes.ts
Zpracování modelů modelCapabilities.ts, modelDeprecation.ts, modelFamilyFallback.ts, modelStrip.ts, model.ts, provider.ts, providerRequestDefaults.ts, providerCostData.ts, payloadRules.ts
Komprese compression/ — kompletní propojení kompresního enginu
Tokeny + relace tokenRefresh.ts, sessionManager.ts, apiKeyRotator.ts, contextManager.ts, contextHandoff.ts, systemPrompt.ts, roleNormalizer.ts, responsesInputSanitizer.ts, toolSchemaSanitizer.ts, toolLimitDetector.ts, thinkingBudget.ts
Úroveň / manifest tierResolver.ts, tierConfig.ts, tierDefaults.json, tierTypes.ts, manifestAdapter.ts
IP / síť ipFilter.ts, webSearchFallback.ts
Dávky batchProcessor.ts
Využití usage.ts

4.6 open-sse/mcp-server/

  • 110 jedinečných nástrojů propojených v server.ts (45 kanonických v schemas/tools.ts + moduly paměti, dovedností, GitHub dovedností, fondu, gamifikace, pluginů, Notionu, Obsidianu, lokálního korpusu a komprese — sjednocení spočítané pomocí countUniqueMcpTools).
  • 3 transporty: stdio, HTTP Streamable, SSE.
  • 33 rozsahů oprávnění vynucovaných za běhu — základní seznam v src/shared/constants/mcpScopes.ts, úplná sada je sjednocením rozsahů deklarovaných jednotlivými moduly nástrojů.
  • Tabulka auditu: mcp_tool_audit (naplňovaná souborem audit.ts).
  • Soubory: server.ts, index.ts, httpTransport.ts, audit.ts, scopeEnforcement.ts, runtimeHeartbeat.ts, descriptionCompressor.ts, schemas/{tools, a2a, audit, index}.ts, tools/{advancedTools, compressionTools, memoryTools, skillTools}.ts, plus testy v __tests__/.
  • Úplný katalog nástrojů najdete v MCP-SERVER.md.

4.7 open-sse/config/

Registry poskytovatelů (providerRegistry.ts, providerModels.ts, providerHeaderProfiles.ts), registry modelů pro jednotlivé formáty (audioRegistry.ts, embeddingRegistry.ts, imageRegistry.ts, moderationRegistry.ts, musicRegistry.ts, rerankRegistry.ts, searchRegistry.ts, videoRegistry.ts), pomocné nástroje pro identitu (codexIdentity.ts, codexInstructions.ts, anthropicHeaders.ts, antigravityUpstream.ts, antigravityModelAliases.ts, cliFingerprints.ts, toolCloaking.ts, defaultThinkingSignature.ts), pomocné nástroje pro přihlašovací údaje (credentialLoader.ts, codexClient.ts) a cloudové adaptéry (azureAi.ts, bedrock.ts, datarobot.ts, glmProvider.ts, maritalk.ts, oci.ts, petals.ts, runway.ts, sap.ts, watsonx.ts, ollamaModels.ts, errorConfig.ts, constants.ts, registryUtils.ts).

4.8 open-sse/utils/

Streamovací primitiva a pomocné nástroje poskytovatele: stream.ts, streamHandler.ts, streamHelpers.ts, streamPayloadCollector.ts, streamReadiness.ts, sseHeartbeat.ts, proxyFetch.ts, proxyDispatcher.ts, tlsClient.ts, networkProxy.ts, awsSigV4.ts, cacheControlPolicy.ts, cursorChecksum.ts, cursorAgentProtobuf.ts, cursorVersionDetector.ts, comfyuiClient.ts, kieTask.ts, bypassHandler.ts, aiSdkCompat.ts, thinkTagParser.ts, urlSanitize.ts, usageTracking.ts, requestLogger.ts, progressTracker.ts, cors.ts, error.ts, logger.ts, sleep.ts, ollamaTransform.ts.


5. electron/ — Desktopový obal

electron/
├── main.js                  Hlavní proces Electronu
├── preload.js               Most preload (contextIsolation povoleno)
├── types.d.ts
├── package.json             Konfigurace electron-builder, verze 3.8.51
├── README.md
├── assets/                  Prostředky pro sestavení (ikony, oprávnění, …)
├── node_modules/            Vyhrazené node_modules (better-sqlite3, electron-updater)
└── dist-electron/           Výstup sestavení (není součástí repozitáře)

Pět npm skriptů v kořenovém adresáři pracovního prostoru: electron:dev, electron:build, electron:build:{win,mac,linux}, electron:smoke:packaged. Automatické aktualizace zajišťuje electron-updater odkazující na kanál vydání na GitHubu.


6. bin/ — CLI

bin/
├── omniroute.mjs           Hlavní vstupní bod CLI (Node ESM)
├── reset-password.mjs      Reset hesla pro správu z CLI
├── mcp-server.mjs          Spouštěč serveru MCP (stdio)
├── nodeRuntimeSupport.mjs  Kontrola verze Node
└── cli/
    ├── program.mjs         Tvůrce programu Commander
    ├── runtime.mjs         Pomocná funkce withRuntime (nejprve server, záložně DB)
    ├── output.mjs          Formátovače výstupu (json/jsonl/table/csv)
    ├── i18n.mjs            Pomocná funkce t() s lokalizacemi
    ├── api.mjs             Pomocná funkce pro načítání z API
    ├── data-dir.mjs
    ├── encryption.mjs
    ├── sqlite.mjs
    └── commands/
        ├── registry.mjs    Registrace příkazů
        ├── setup.mjs
        ├── doctor.mjs
        ├── providers.mjs
        └── ...             (jeden soubor pro každý příkaz/skupinu)

V package.jsonbin jsou zpřístupněny dva binární soubory:

  • omniroutebin/omniroute.mjs
  • omniroute-reset-passwordbin/reset-password.mjs

7. tests/

Adresář Typ
tests/unit/ Jednotkové testy prostřednictvím nativního testovacího nástroje Node (1821 souborů a podadresáře api/, auth/, authz/)
tests/integration/ Testy napříč moduly a testy stavu DB
tests/e2e/ Testy uživatelského rozhraní pomocí Playwrightu
tests/e2e/protocol-clients.test.ts E2E testy protokolů MCP/A2A
tests/translator/ Testy specifické pro překladač
tests/security/ Bezpečnostní regresní testy
tests/load/ Zátěžové testy / testy odolnosti
tests/golden-set/ Referenční výstupy pro regresní testy překladače
tests/helpers/, tests/fixtures/, tests/manual/ Podpůrné soubory

Běžné příkazy:

Příkaz Co spouští
npm run test:unit Všechny tests/unit/*.test.ts prostřednictvím testovacího nástroje Node (souběžnost 10)
npm run test:vitest Sada testů Vitest (MCP, autoCombo, cache)
npm run test:e2e Sada testů uživatelského rozhraní Playwright
npm run test:protocols:e2e E2E testy protokolů MCP + A2A
npm run test:coverage Kontrola pokrytí (≥60 % řádků/příkazů/funkcí/větví)
node --import tsx/esm --test tests/unit/<file>.test.ts Spuštění jednoho souboru

8. scripts/

Uspořádáno podle účelu do 6 podsložek.

  • scripts/build/build-next-isolated.mjs, prepublish.ts, prepare-electron-standalone.mjs, pack-artifact-policy.ts, validate-pack-artifact.ts, postinstall.mjs, postinstallSupport.mjs, uninstall.mjs, bootstrap-env.mjs, runtime-env.mjs, native-binary-compat.mjs.
  • scripts/dev/run-next.mjs, run-next-playwright.mjs, run-standalone.mjs, standalone-server-ws.mjs, responses-ws-proxy.mjs, v1-ws-bridge.mjs, smoke-electron-packaged.mjs, run-playwright-tests.mjs, run-ecosystem-tests.mjs, run-protocol-clients-tests.mjs, sync-env.mjs, healthcheck.mjs, system-info.mjs.
  • scripts/check/check-cycles.mjs, check-docs-sync.mjs, check-docs-counts-sync.mjs, check-env-doc-sync.mjs, check-deprecated-versions.mjs, check-route-validation.mjs, check-t11-any-budget.mjs, check-pr-test-policy.mjs, check-supported-node-runtime.ts, test-report-summary.mjs.
  • scripts/docs/generate-docs-index.mjs, gen-provider-reference.ts.
  • scripts/i18n/generate-multilang.mjs, run-visual-qa.mjs, generate-qa-checklist.mjs, apply-priority-overrides.mjs, validate_translation.py, check_translations.py, i18n_autotranslate.py, untranslatable-keys.json.
  • scripts/ad-hoc/cursor-tap.cjs, sync-cursor-models.mjs, migrate-env.mjs, dbsetup.js.

9. Kanál zpracování požadavků (shrnutí)

Kanál zpracování požadavků (/v1/chat/completions)

Zdroj: diagrams/request-pipeline.mmd

Požadavek klienta
  → /v1/chat/completions (route.ts)
     Kontrola předběžného požadavku CORS
     Ověření pomocí Zod (chatCompletionsSchema v shared/validation/schemas.ts)
     Ověření identity (extractApiKey + isValidApiKey NEBO requireManagementAuth)
     Modul zásad (src/server/authz/pipeline.ts)
     Ochranná opatření (maskování PII, ochrana před vložením instrukcí, most pro obrazové vstupy)
  → handleChatCore() (open-sse/handlers/chatCore.ts)
     Kontrola mezipaměti (sémantická mezipaměť + mezipaměť pro čtení)
     Omezení četnosti požadavků (rateLimitManager, accountSemaphore)
     Kombinované směrování (pokud se model přeloží na kombinaci)
       comboResolver → smyčka pro každý cíl → handleSingleModel()
     translateRequest()  (open-sse/translator/request/*)
     getExecutor(providerId).execute()  (open-sse/executors/*)
       načtení z nadřazené služby → opakování/exponenciální prodleva prostřednictvím accountFallback
     translateResponse() (open-sse/translator/response/*)
     Datový proud SSE NEBO odpověď JSON
     Pokud jde o Responses API: TransformStream prostřednictvím open-sse/transformer/responsesTransformer.ts
  → Audit souladu s předpisy (src/lib/compliance/)
  → Odpověď klientovi

Běhový stav odolnosti (tři mechanismy)

Mechanismus Rozsah Kde
Jistič poskytovatele Celý poskytovatel src/shared/utils/circuitBreaker.ts, uchováváno v domain_circuit_breakers
Prodleva připojení Jeden účet/klíč markAccountUnavailable() v src/sse/services/auth.ts; používáno funkcí accountFallback.checkFallbackError()
Uzamčení modelu Poskytovatel + připojení + model open-sse/services/accountFallback.ts, uchováváno v domain_lockout_state

Viz RESILIENCE_GUIDE.md a vyhrazená část v souboru CLAUDE.md.


10. Jak přispívat

Přidání nového poskytovatele

  1. Zaregistrujte jej v src/shared/constants/providers.ts (při načtení se validuje pomocí Zod).
  2. Pokud je vyžadována vlastní logika, přidejte executor do open-sse/executors/ (rozšiřte BaseExecutor).
  3. Pokud nepoužívá formát OpenAI, přidejte překladač do open-sse/translator/.
  4. Pokud je založen na OAuth, přidejte konfiguraci do src/lib/oauth/providers/ a src/lib/oauth/services/.
  5. Zaregistrujte modely v open-sse/config/providerRegistry.ts (nebo v registru příslušného formátu v open-sse/config/).
  6. Napište testy v tests/unit/.

Přidání nové API trasy

  1. Vytvořte src/app/api/your-route/route.ts.
  2. Dodržujte vzor: CORS → validace těla pomocí Zod → autentizace → delegování obsluze.
  3. Pokud má požadavek nový tvar, přidejte schéma Zod do src/shared/validation/schemas.ts.
  4. Pokud je určena pouze pro správu, přidejte cestu do src/shared/constants/publicApiRoutes.ts (seznam zakázaných cest pro veřejné API).
  5. Přidejte testy do tests/unit/.
  6. Aktualizujte docs/reference/API_REFERENCE.md a docs/openapi.yaml.

Přidání nového DB modulu

  1. Vytvořte src/lib/db/yourModule.ts a importujte getDbInstance() z ./core.ts.
  2. Exportujte CRUD funkce pro vaši doménu.
  3. Pokud přidáváte nové tabulky, přidejte migraci do src/lib/db/migrations/, číslovanou sekvenčně, idempotentní a transakční.
  4. Importující moduly používají přímé importy z @/lib/db/yourModule (bez souhrnného exportu — stará reexportní vrstva localDb.ts byla odstraněna).
  5. Přidejte testy do tests/unit/.

Přidání nového nástroje MCP

  1. Přidejte definici nástroje do open-sse/mcp-server/tools/ (nebo rozšiřte open-sse/mcp-server/schemas/tools.ts).
  2. Přiřaďte odpovídající rozsah či rozsahy v src/shared/constants/mcpScopes.ts.
  3. Zaregistrujte nástroj v open-sse/mcp-server/server.ts.
  4. Přidejte testy do open-sse/mcp-server/__tests__/.
  5. Aktualizujte MCP-SERVER.md.

Přidání nové dovednosti A2A

Viz A2A-SERVER.md § Přidání nové dovednosti. Dovednosti se nacházejí v src/lib/a2a/skills/ a registrují se prostřednictvím správce úloh A2A.


11. Konvence

  • Styl kódu: odsazení 2 mezerami, dvojité uvozovky, šířka 100 znaků, středníky, koncové čárky es5 — vynucováno nástrojem Prettier prostřednictvím lint-staged.
  • Importy: externí → interní (@/, @omniroute/open-sse) → relativní.
  • Pojmenování: soubory camelCase nebo kebab-case, komponenty PascalCase, konstanty UPPER_SNAKE.
  • ESLint: no-eval, no-implied-eval, no-new-func = error všude; no-explicit-any = warn v open-sse/ a tests/, jinde error.
  • TypeScript: strict: false (kvůli zpětné kompatibilitě). Na hranicích mezi moduly upřednostňujte explicitní typy před inferencí.
  • Databáze: nikdy nezapisujte nezpracované SQL do tras ani obslužných funkcí — vždy používejte moduly v src/lib/db/. Nikdy nepoužívejte souhrnné importy — importujte přímo konkrétní moduly src/lib/db/*.
  • Typování DB entit (#3512): funkce, která zapisuje nebo čte tvar řádku databázové tabulky, by měla přijímat/vracet pojmenované rozhraní TS, které zrcadlí sloupce této tabulky v poměru 1:1, nikoli any ani anonymní typ definovaný přímo v místě volání. Umístěte rozhraní vedle funkce (např. export interface UsageEntry v src/lib/usage/usageHistory.ts nad saveRequestUsage), ponechte jednotlivá pole volitelná nebo s možností hodnoty null, pokud různí zapisující doplňují řádek postupně, a pro pole, jehož tvar se mezi volajícími liší, upřednostněte unknown před any (zdokumentujte to u pole, např. UsageEntry.tokens přijímá jak nezpracovaná data o využití ve tvaru poskytovatele, tak normalizovaný tvar). Jakmile tímto způsobem počet výskytů any v souboru klesne na nulu, přidejte jej na seznam povolených položek check:any-budget:t11 (scripts/check/check-t11-any-budget.mjs, maxAny: 0), aby nedošlo k regresi. Toto je konvence pro první dílčí etapu — širší odstraňování „anonymního any“ probíhá iterativně ve zbytku kódové základny.
  • Chyby: používejte try/catch s konkrétními typy chyb a protokolujte s kontextem pino. Nikdy tiše nepotlačujte chyby v proudech SSE; pro úklid používejte signály přerušení.
  • Zabezpečení: nikdy nepoužívejte eval() / new Function() / implicitní eval. Validujte všechny vstupy pomocí Zod. Přihlašovací údaje v úložišti šifrujte (AES-256-GCM). Udržujte seznam zakázaných položek src/shared/constants/upstreamHeaders.ts v souladu s vrstvou sanitizace/validace.
  • Commity: Conventional Commits — feat(scope): subject. Povolené rozsahy: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills.
  • Větve: prefixy feat/, fix/, refactor/, docs/, test/, chore/. Nikdy necommitujte přímo do main.
  • Husky: před commitem se spouští lint-staged + check:docs-sync + check:any-budget:t11; před odesláním se spouští check:any-budget:t11 + check:tracked-artifacts (rychlé kontroly; nezahrnují test:unit).

12. Pevná pravidla (z CLAUDE.md)

  1. Nikdy necommitujte tajné údaje ani přihlašovací údaje.
  2. Nikdy nepoužívejte souhrnné importy — používejte přímo konkrétní moduly src/lib/db/*.
  3. Nikdy nepoužívejte eval() / new Function() / implicitní eval.
  4. Nikdy necommitujte přímo do main.
  5. Nikdy nezapisujte nezpracované SQL v routách — vždy používejte moduly src/lib/db/.
  6. Nikdy tiše nepotlačujte chyby v SSE streamech.
  7. Vstupy vždy validujte pomocí schémat Zod.
  8. Při změnách produkčního kódu vždy zahrňte testy.
  9. Pokrytí musí zůstat ≥ 60 % (příkazy, řádky, funkce, větve).

13. Viz také