# OmniRoute Codebase Documentation (Dansk) 🌐 **Languages:** 🇺🇸 [English](../../../../architecture/CODEBASE_DOCUMENTATION.md) · 🇪🇹 [am](../../../am/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇦 [ar](../../../ar/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇦🇿 [az](../../../az/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇬 [bg](../../../bg/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇩 [bn](../../../bn/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇦 [bs](../../../bs/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇨🇿 [cs](../../../cs/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇩🇪 [de](../../../de/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇬🇷 [el](../../../el/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇪🇸 [es](../../../es/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇪🇪 [et](../../../et/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇷 [fa](../../../fa/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇫🇮 [fi](../../../fi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇫🇷 [fr](../../../fr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇪 [ga](../../../ga/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [gu](../../../gu/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇬 [ha](../../../ha/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇱 [he](../../../he/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [hi](../../../hi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇭🇷 [hr](../../../hr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇭🇺 [hu](../../../hu/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇦🇲 [hy](../../../hy/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇩 [id](../../../id/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇬 [ig](../../../ig/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇹 [it](../../../it/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇯🇵 [ja](../../../ja/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇬🇪 [ka](../../../ka/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇰🇭 [km](../../../km/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [kn](../../../kn/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇰🇷 [ko](../../../ko/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇱🇹 [lt](../../../lt/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇱🇻 [lv](../../../lv/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [ml](../../../ml/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [mr](../../../mr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇲🇾 [ms](../../../ms/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇲🇹 [mt](../../../mt/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇲🇲 [my](../../../my/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇵 [ne](../../../ne/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇱 [nl](../../../nl/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇴 [no](../../../no/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [or](../../../or/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [pa](../../../pa/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇭 [phi](../../../phi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇱 [pl](../../../pl/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇹 [pt](../../../pt/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇷🇴 [ro](../../../ro/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇷🇺 [ru](../../../ru/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇱🇰 [si](../../../si/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇰 [sk](../../../sk/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇮 [sl](../../../sl/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇷🇸 [sr](../../../sr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇸🇪 [sv](../../../sv/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇰🇪 [sw](../../../sw/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [ta](../../../ta/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇮🇳 [te](../../../te/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇹🇭 [th](../../../th/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇹🇷 [tr](../../../tr/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇵🇰 [ur](../../../ur/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇺🇿 [uz](../../../uz/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇻🇳 [vi](../../../vi/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇳🇬 [yo](../../../yo/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/architecture/CODEBASE_DOCUMENTATION.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/architecture/CODEBASE_DOCUMENTATION.md) --- > **Version:** v3.8.51 > **Senest opdateret:** 2026-06-28 > **Målgruppe:** Ingeniører, der bidrager til OmniRoute eller bygger integrationer oven på det. > > For arkitekturdiagrammer på højt niveau og begrundelserne bag hvert undersystem kan du læse > [ARCHITECTURE.md](./ARCHITECTURE.md). For dybdegående beskrivelser af individuelle undersystemer > (Auto Combo, MCP-server, A2A-server, Skills, Memory, Cloud Agents, Resilience, > Compression osv.) henvises til deres dedikerede filer i denne `docs/`-mappe. Denne fil beskriver **hvad der findes i repositoriet i dag**, så en ny ingeniør kan navigere i træet, forstå lagdelingen ved kørsel og vide, hvor kode skal tilføjes uden at opfinde nye moduler. --- ## 1. Teknologistak | Område | Valg | | ------------ | ----------------------------------------------------------------------------------------------------------------------------------- | | Webframework | **Next.js 16** (App Router, selvstændigt output, ingen global middleware) | | Sprog | **TypeScript 6.0+** — mål `ES2022`, `module: esnext`, `moduleResolution: bundler`, `strict: false` | | Runtime | **Node.js** `>=22.22.2 <23` eller `>=24.0.0 <27` (håndhævet via `engines` + `SUPPORTED_NODE_RANGE`) | | Database | **SQLite** via `better-sqlite3` (singleton, WAL-journalføring) | | Desktop | **Electron 41** + `electron-builder` 26.10 (separat workspace i `electron/`) | | Tests | **Nodes indbyggede testkører** (enheds-/integrationstest), **Vitest** (MCP, autoCombo, cache), **Playwright** (e2e + protocols-e2e) | | Build | Selvstændig Next.js-build via `scripts/build/build-next-isolated.mjs` | | Lint/format | Flad ESLint-konfiguration + Prettier (`lint-staged` via Husky pre-commit) | | Modulsystem | ESM overalt (`"type": "module"`) | | Workspaces | npm-workspace — `open-sse` er det eneste under-workspace | Stialiaser (`tsconfig.json`): - `@/*` → `src/*` - `@omniroute/open-sse` → `open-sse/index.ts` - `@omniroute/open-sse/*` → `open-sse/*` Standard-HTTP-port: **`20128`** (API'et og dashboardet deler samme proces). Datamappen angives af miljøvariablen `DATA_DIR` og er som standard `~/.omniroute/`. --- ## 2. Repositoriets struktur ``` OmniRoute/ ├── src/ Next.js-applikation (App Router, biblioteker, domæne, server, delt kode) ├── open-sse/ Workspace til streamingmotoren (@omniroute/open-sse) ├── electron/ Desktop-wrapper (Electron 41-hovedproces + preload) ├── bin/ CLI-indgangspunkter (omniroute, reset-password) ├── tests/ Enheds-, integrations-, e2e-, protocols-e2e-, oversætter- og sikkerhedstest samt fixtures ├── scripts/ Hjælpescripts til build, synkronisering, kontrol, migrering og kørsel ├── docs/ Offentlig dokumentation (denne mappe) ├── public/ Statiske ressourcer, PWA-manifest, service worker ├── config/ Eksempler på runtime-konfiguration ├── images/ Marketing-/skærmbilledressourcer ├── _ideia/, _references/, _mono_repo/, _tasks/ Internt kladde-/planlægningsmateriale (distribueres ikke) ├── CLAUDE.md Regler for repositoriet til Claude Code ├── AGENTS.md Dybere arkitekturreference til agenter ├── package.json v3.8.51, workspace-rod └── tsconfig.json Stialiaser + centrale compilerindstillinger ``` --- ## 3. `src/` — Next.js-applikation ``` src/ ├── app/ App Router-sider + API-ruter ├── lib/ Kernebiblioteker (DB, godkendelse, OAuth, færdigheder, hukommelse, …) ├── domain/ Rent domænelag (politik, fallback, omkostninger, spærring, …) ├── server/ Moduler kun til serveren (godkendelse, CORS, autentificering) ├── shared/ Typer, konstanter, validering, kontrakter, hjælpefunktioner (sikre på tværs af grænser) ├── mitm/ Man-in-the-middle-proxyhjælpere til CLI-integration ├── models/ Metadata/aliaser for lokale modeller ├── sse/ Ældre SSE-handlere, der stadig ligger under src/ (ikke open-sse/) ├── store/ Tilstandslagre på klientsiden ├── middleware/ Hjælpefunktioner til middleware på ruteniveau (ikke global Next.js-middleware) ├── scripts/ Scripts i kildetræet, der kan importeres af applikationskode ├── types/ Globale og delte TS-typer ├── i18n/ Sprogpakker ├── instrumentation.ts Next.js-instrumenteringshook ├── instrumentation-node.ts └── proxy.ts Hjælper til proxy-bootstrap på topniveau ``` ### 3.1 `src/app/` — App Router App Router eksponerer både dashboardets brugergrænseflade og det offentlige/administrative HTTP-API. Der er **ingen global middleware** — opfangning udføres pr. rute. Segmenter på topniveau under `src/app/`: | Sti | Formål | | ----------------------------------------------------------------------------- | -------------------------------------------------------------- | | `api/` | Alle HTTP API-ruter (se opdelingen nedenfor) | | `a2a/` | A2A JSON-RPC 2.0-slutpunkt (`POST /a2a`) | | `.well-known/agent.json/` | Registreringsdokument for A2A Agent Card | | `(dashboard)/` | Dashboardets brugergrænseflade (rutegruppe, intet URL-præfiks) | | `auth/`, `login/`, `forgot-password/`, `callback/` | Godkendelsesforløb | | `landing/` | Marketing-/landingsside | | `docs/` | Integreret API-dokumentationsfremviser | | `status/`, `maintenance/`, `offline/` | Driftssider | | `privacy/`, `terms/` | Juridiske sider | | `400/`, `401/`, `403/`, `408/`, `429/`, `500/`, `502/`, `503/` | Statiske fejlsider | | `error.tsx`, `global-error.tsx`, `not-found.tsx`, `forbidden/`, `loading.tsx` | Frameworkets fejl-/indlæsningsgrænser | | `layout.tsx`, `page.tsx`, `globals.css`, `manifest.ts` | Rodskal | #### 3.1.1 `src/app/(dashboard)/dashboard/` — UI-sider `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`, plus `page.tsx`, `HomePageClient.tsx` og `BootstrapBanner.tsx` i roden. #### 3.1.2 `src/app/api/` — API-grupper på topniveau ``` 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/ Administration af integrerede tjenester (9router, cliproxy) — LOCAL_ONLY ├── upstream-proxy/ ├── usage/ ├── v1/ OpenAI-kompatibelt offentligt API ├── v1beta/ Gemini-lignende kompatibilitet ├── version-manager/ └── webhooks/ ``` #### 3.1.2a `src/app/api/services/` — Administration af integrerede tjenester Ruter til installation, start, stop og overvågning af 9Router og CLIProxyAPI. Alle stier er klassificeret som **LOCAL_ONLY** (kun loopback, fast regel nr. 17), fordi de kan kalde `npm install` og oprette underprocesser. ``` src/app/api/services/ ├── 9router/ │ ├── _lib.ts getOrInitSupervisor()-hjælpefunktion │ ├── install/route.ts POST — npm-installation via execFile │ ├── start/route.ts POST — supervisor.start() │ ├── stop/route.ts POST — supervisor.stop() │ ├── restart/route.ts POST — supervisor.restart() │ ├── update/route.ts POST — npm-installation af nyere version │ ├── rotate-key/route.ts POST — generér ny API-nøgle + genstart │ ├── status/route.ts GET — live- og DB-status + versionsmetadata │ └── auto-start/route.ts POST — slå auto_start-flag til eller fra ├── cliproxy/ │ ├── _lib.ts getOrInitSupervisor()-hjælpefunktion │ ├── install/route.ts POST — npm-installation │ ├── start/route.ts POST — supervisor.start() │ ├── stop/route.ts POST — supervisor.stop() │ ├── restart/route.ts POST — supervisor.restart() │ ├── update/route.ts POST — npm-installation af nyere version │ ├── status/route.ts GET — live- og DB-status + versionsmetadata │ └── auto-start/route.ts POST — slå auto_start-flag til eller fra └── [name]/ └── logs/route.ts GET — SSE-loghale (deles af alle tjenester) ``` Tilhørende dashboardgrænseflade: `src/app/(dashboard)/dashboard/providers/services/` — side med to faner (CLIProxyAPI + 9Router). Reverse proxy til 9Routers integrerede brugergrænseflade: `src/app/(dashboard)/dashboard/providers/services/[name]/embed/[[...path]]/route.ts` Dybdegående gennemgang: `docs/frameworks/EMBEDDED-SERVICES.md` #### 3.1.3 `src/app/api/v1/` — OpenAI-kompatibelt offentligt API ``` v1/ ├── accounts/[id]/ kontoopslag ├── agents/tasks/[id]/, agents/tasks/ A2A-inspirerede opgaveslutpunkter ├── api/ interne API-hjælpefunktioner eksponeret under v1/api ├── audio/{speech, transcriptions}/ TTS + STT ├── batches/[id]/{cancel}, batches/ OpenAI Batches API ├── chat/completions/ Chat Completions (det primære slutpunkt) ├── completions/ ældre tekstfuldførelser ├── embeddings/ indlejringer ├── files/[id]/, files/ Files API ├── _helpers/ delte route-hjælpefunktioner (ingen offentlig URL) ├── images/{edits, generations}/ billedgenerering + redigering ├── issues/ hjælpeslutpunkter til triagering ├── management/{proxies}/ administrationsafgrænsede routes i v1 ├── messages/{count_tokens}/ kompatibilitet med meddelelser i Anthropic-stil ├── models/ modelliste (`route.ts`, `catalog.ts`) ├── moderations/ moderering ├── music/ musikgenerering ├── providers/[provider]/ handlinger pr. udbyder ├── quotas/{check} kvoteforespørgsler ├── registered-keys/ administration af registrerede nøgler ├── rerank/ omrangering ├── responses/[...path]/ OpenAI Responses API (opsamlingsroute) ├── search/ websøgning ├── videos/ videogenerering ├── ws/ WebSocket-bro └── route.ts indekshåndtering ``` Hver route-fil følger det samme mønster: ``` Route → CORS-preflight → Zod-validering af body → valgfri godkendelse → håndhævelse af API-nøglepolitik → delegering til handler (open-sse) ``` `v1beta/` er kompatibilitetsgrænsefladen i Gemini-stil (et tyndt wrapper-lag, der oversætter til den samme `open-sse/handlers/`-pipeline). ### 3.2 `src/lib/` — Kernebiblioteker Importér altid data, synkronisering, OAuth, skills, hukommelse osv. gennem disse moduler. Tabellen grupperer de faktiske mapper og bemærkelsesværdige filer på øverste niveau. | Modul | Formål | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `a2a/` | A2A-protokolserver: `taskManager.ts`, `streaming.ts`, `taskExecution.ts`, `routingLogger.ts`, `skills/` (6 færdigheder: omkostningsanalyse, tilstandsrapport, udbyderregistrering, kvotestyring, intelligent routing, visning af funktioner) | | `acp/` | Agent-Control-Protocol: `index.ts`, `manager.ts`, `registry.ts` | | `api/` | Interne API-hjælpefunktioner: `requireManagementAuth.ts`, `requireCliToolsAuth.ts`, `errorResponse.ts` | | `auth/` | `managementPassword.ts` (nulstilling af adgangskode/hashning) | | `batches/` | Tjeneste til OpenAI Batches API (`service.ts`) | | `catalog/` | Synkronisering af OpenRouter-katalog (`openrouterCatalog.ts`) | | `cloudAgent/` | Register over cloudagenter: `api.ts`, `baseAgent.ts`, `db.ts`, `index.ts`, `registry.ts`, `types.ts`, `agents/{codex, devin, jules}.ts` | | `combos/` | Hjælpefunktioner til løsning af kombinationer | | `compliance/` | Revision + udbyderrevision: `index.ts`, `providerAudit.ts` | | `config/` | Sammenkobling af runtimekonfiguration | | `db/` | SQLite-domænemoduler (se §3.2.1) | | `display/` | UI-/visningshjælpefunktioner, der bruges af API-svar | | `embeddings/` | Register over embeddingtjenester | | `env/` | Indlæsning + introspektion af miljø | | `evals/` | Evaluerings-runtime | | `guardrails/` | `piiMasker.ts`, `promptInjection.ts`, `visionBridge.ts`, `visionBridgeHelpers.ts`, `registry.ts`, `base.ts` | | `jobs/` | Baggrundsjob (`autoUpdate.ts`, …) | | `memory/` | Vedvarende hukommelse: `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/` | OAuth-/importmoduler til udbydere (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`, samt `services/`, `utils/` og `constants/oauth.ts` | | `plugins/` | Indlæser til plugins (`index.ts`) | | `promptCache/` | `prefixAnalyzer.ts`, `index.ts` | | `providerModels/` | Livscyklusstyring af administrerede modeller: `modelDiscovery.ts`, `managedModelImport.ts`, `managedAvailableModels.ts`, `cursorAgent.ts` | | `providers/` | Hjælpefunktioner til udbydere: `catalog.ts`, `validation.ts`, `imageValidation.ts`, `claudeExtraUsage.ts`, `codexConnectionDefaults.ts`, `codexFastTier.ts`, `webCookieAuth.ts`, `managedAvailableModels.ts`, `requestDefaults.ts` | | `resilience/` | `settings.ts` — indstillinger for kredsløbsafbryder, nedkøling og spærring | | `runtime/` | Registrering af runtimefunktioner | | `search/` | `executeWebSearch.ts` | | `services/` | Rammeværk til indlejrede tjenester: `ServiceSupervisor.ts` (generisk overvågning af underprocesser med operationslås, ringbuffer og tilstandskontrol), `bootstrap.ts` (registrering på procesniveau og automatisk start), `registry.ts` (værktøj → overvågningskort), `apiKey.ts` (AES-256-GCM-nøglelager), `modelSync.ts` (periodisk modelsynkronisering), `ringBuffer.ts` (5 MB cirkulær logbuffer), `healthCheck.ts` (HTTP-tilstandsforespørgsel), `types.ts`, `embedWsProxy.ts` (WebSocket-proxy), `installers/{ninerouter,cliproxy}.ts`. Se `docs/frameworks/EMBEDDED-SERVICES.md` | | `agentSkills/` | Katalog + generator til agentfærdigheder: `catalog.ts` (getCatalog/getSkillById/filterCatalog/computeCoverage), `generator.ts` (generateAgentSkills → skriver `skills/{id}/SKILL.md`), `openapiParser.ts` (udtrækker REST-slutpunkter fra OpenAPI-specifikation), `cliRegistryParser.ts` (udtrækker CLI-underkommandoer fra bin/cli-registry), `schemas.ts` (Zod: AgentSkillSchema, SkillCoverageSchema, ListQuerySchema, GenerateBodySchema), `types.ts` (AgentSkill, SkillCoverage, SkillMarkdown, GeneratorReport). Bruges af REST-ruter (`/api/agent-skills/*`), MCP-værktøjer (`omniroute_agent_skills_*`) og A2A-færdigheden `list-capabilities`. Se [AGENT-SKILLS.md](../frameworks/AGENT-SKILLS.md). | | `skills/` | Rammeværk til færdigheder: `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`, samt `builtin/browser.ts` | | `spend/` | `batchWriter.ts` (write-behind-buffer) | | `sync/` | `bundle.ts`, `tokens.ts` (cloudsynkronisering) | | `system/` | Hjælpefunktioner på systemniveau | | `translator/` | Overordnet translatorsammenkobling (delegerer til `open-sse/translator/`) | | `usage/` | Brugsregnskab: `costCalculator.ts`, `tokenAccounting.ts`, `usageHistory.ts`, `aggregateHistory.ts`, `usageStats.ts`, `callLogs.ts`, `callLogArtifacts.ts`, `fetcher.ts`, `providerLimits.ts`, `migrations.ts` | | `versionManager/` | Automatisk opdatering + versionsmanifest | | `ws/` | WebSocket-bro | | `zed-oauth/` | OAuth-flow til Zed-editoren | Filer på øverste niveau i `src/lib/`: - Den gamle `localDb.ts`-barrelfil blev fjernet — forbrugere importerer specifikke `src/lib/db/*`-moduler direkte. - `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/` Singleton-SQLite-database (`getDbInstance()` i `core.ts`, WAL-journalføring). **Skriv aldrig rå SQL i routes eller handlers** — gå gennem disse moduler. ![Oversigt over databaseskemaet (udvalgte kernetabeller)](../diagrams/exported/db-schema-overview.svg) > Kilde: [diagrams/db-schema-overview.mmd](../diagrams/db-schema-overview.mmd) Domænemoduler (hvert modul ejer én eller flere tabeller): `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`. `migrations/` indeholder 168 versionsstyrede `.sql`-filer (idempotente og transaktionelle) og køres af `migrationRunner.ts` ved opstart. Tabeller oprettet på tværs af migreringerne (123 i alt): `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` (samt virtuelle FTS5-tabeller til søgning i hukommelsen). ### 3.3 `src/domain/` — Domænelag Ren forretningslogik uden I/O. Importeres af routes og handlers. | Fil | Formål | | ------------------------------------------ | --------------------------------------------------------- | | `policyEngine.ts` | Overordnet policy-resolver | | `fallbackPolicy.ts` | Beslutningstræ for fallback | | `costRules.ts` | Regler for omkostningsberegning | | `lockoutPolicy.ts` | Beslutninger om modeludelukkelse | | `tagRouter.ts` | Tagbaseret routing | | `comboResolver.ts` | Combo-opløsning fra anmodning → målliste | | `connectionModelRules.ts` | Modelfiltre pr. forbindelse | | `modelAvailability.ts` | Kontrol af modeltilgængelighed | | `degradation.ts` | Overgange til reduceret tilstand | | `providerExpiration.ts` | Registrering af udløbne konti/nøgler | | `quotaCache.ts` | Cachelagrede kvotebeslutninger | | `responses.ts`, `omnirouteResponseMeta.ts` | Hjælpefunktioner til responsstruktur | | `configAudit.ts` | Revision af konfigurationsændringer | | `assessment/` | Modelvurdering (i henhold til RFC, delvist implementeret) | | `types.ts` | Delte domænetyper | ### 3.4 `src/server/` — Kun server Kan ikke importeres fra klientkomponenter. ``` server/ ├── auth/loginGuard.ts ├── authz/ │ ├── classify.ts Klassificerer routes som offentlige eller administrative │ ├── assertAuth.ts Hjælpefunktion til assertions │ ├── context.ts Authz-kontekst pr. anmodning │ ├── headers.ts │ ├── pipeline.ts Authz-pipeline │ ├── policies/ Konkrete policies │ └── types.ts └── cors/origins.ts Tilladelsesliste over CORS-origins ``` ### 3.5 `src/shared/` — Sikker at dele Opdelt i fokuserede undermapper: - `constants/` — `providers.ts` (Zod-valideret udbyderkatalog), `models.ts`, `modelSpecs.ts`, `modelCompat.ts`, `pricing.ts`, `cliTools.ts`, `cliCompatProviders.ts`, `routingStrategies.ts`, `comboConfigMode.ts`, `headers.ts`, `upstreamHeaders.ts` (afvisningsliste), `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 Zod-skemaer), `compressionConfigSchemas.ts`, `providerSchema.ts`, `settingsSchemas.ts`, `helpers.ts`. - `contracts/` — offentlige API-kontrakter, der udgives til npm. - `types/` — delte TS-typer. - `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` samt dashboard-hooks/-komponenter under `services/`, `network/`, `middleware/`, `schemas/`, `hooks/`, `components/`. --- ## 4. `open-sse/` — Arbejdsområde til streamingmotor Separat npm-arbejdsområde udgivet som `@omniroute/open-sse`. Står for behandling af anmodninger, eksekutorer, oversættere, tjenester, transformer og MCP-serveren. ``` open-sse/ ├── index.ts Offentlige eksporter ├── package.json Arbejdsområdemanifest ├── tsconfig.json ├── types.d.ts ├── config/ Udbyderregistre, headerprofiler, identitet, … ├── handlers/ Anmodningshåndteringer (chat, embeddings, lyd, billede, …) ├── executors/ 156 udbydereksekutormoduler (eksekutorklasser + hjælpere pr. udbyder) ├── translator/ Formatkonvertering (OpenAI ↔ Claude ↔ Gemini ↔ Cursor ↔ Kiro) ├── transformer/ Responses API ↔ Chat Completions-streamtransformer ├── services/ 80+ tjenestemoduler (kombinationer, fallback, kvoter, identitet, …) ├── utils/ Streaminghjælpere, TLS-klient, AWS SigV4, proxy-fetch, … └── mcp-server/ MCP-server (3 transporttyper, 33 scopes, 110 værktøjer) ``` ### 4.1 `open-sse/handlers/` | Håndtering | Formål | | ----------------------- | ------------------------------------------------------------------------------------------- | | `chatCore.ts` | Primær chatpipeline (cache, hastighedsbegrænsning, kombinationsrouting, eksekutor-dispatch) | | `responsesHandler.ts` | Indgangspunkt for OpenAI Responses API | | `embeddings.ts` | Embeddings | | `imageGeneration.ts` | Billedgenerering | | `audioSpeech.ts` | Tekst-til-tale | | `audioTranscription.ts` | Tale-til-tekst | | `videoGeneration.ts` | Videogenerering | | `musicGeneration.ts` | Musikgenerering | | `rerank.ts` | Genrangering | | `moderations.ts` | Moderation | | `search.ts` | Websøgning | | `sseParser.ts` | SSE-hændelsesparser | | `usageExtractor.ts` | Udtrækker tokenantal fra upstream-streams | | `responseSanitizer.ts` | Fjerner udbyderspecifik støj | | `responseTranslator.ts` | Forbindelsesled mellem udbydersvar og oversætterlaget | ### 4.2 `open-sse/executors/` 156 eksekutormoduler på topniveau (`*.ts` minus `base.ts`, `index.ts` og tests — antallet måles af `npm run check:docs-counts`). Hver eksekutorklasse udvider `BaseExecutor` (`base.ts`), direkte eller via `DefaultExecutor` eller en anden eksekutor; de resterende moduler er hjælpere for individuelle udbydere (værktøjsskemaer, fetch/TTS-adaptere, håndteringer af særheder). Eksekutorerne omfatter: `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`, samt `claudeIdentity.ts` (delt identitetshjælper) og `index.ts` (register). > Bemærk: Udbydere, der ikke er angivet her, betjenes af `default.ts` via den generiske > OpenAI-kompatible eksekutor. Det fulde udbyderkatalog (375 udbydere) findes i > `src/shared/constants/providers.ts`. ### 4.3 `open-sse/translator/` Hub-and-spoke-oversættelse (OpenAI er knudepunktet). - **9 anmodningsoversættere** (`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 svaroversættere** (`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 hjælpere** (`translator/helpers/`): `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`, samt hjælpetests. - **Billedhjælpere** (`translator/image/sizeMapper.ts`). - På topniveau: `bootstrap.ts`, `formats.ts`, `registry.ts`, `index.ts`. ### 4.4 `open-sse/transformer/` - `responsesTransformer.ts` — `TransformStream`-baseret Responses API ↔ Chat Completions-konverter (bruges af catch-all-ruten `responses/`). ### 4.5 `open-sse/services/` Højdepunkter (den fulde liste findes under `open-sse/services/`): | Område | Filer | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Combo-routing | `combo.ts` (20 strategier), `comboConfig.ts`, `comboMetrics.ts`, `comboManifestMetrics.ts`, `comboAgentMiddleware.ts` | | Auto Combo-motor | `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` | | Robusthed | `accountFallback.ts` (nedkøling + spærring), `errorClassifier.ts`, `requestRejectedStreak.ts`, `emergencyFallback.ts`, `rateLimitManager.ts`, `rateLimitSemaphore.ts`, `accountSemaphore.ts`, `accountSelector.ts` | | Kvoter | `quotaMonitor.ts`, `quotaPreflight.ts`, `bailianQuotaFetcher.ts`, `codexQuotaFetcher.ts`, `deepseekQuotaFetcher.ts`, `openrouterQuotaFetcher.ts`, `openrouterFreeWindow.ts`, `llmgatewayQuotaFetcher.ts`, `crofUsageFetcher.ts`, `antigravityCredits.ts` | | Caching | `reasoningCache.ts`, `searchCache.ts`, `signatureCache.ts`, `requestDedup.ts` | | Routingintelligens | `intentClassifier.ts`, `taskAwareRouter.ts`, `backgroundTaskDetector.ts`, `volumeDetector.ts`, `wildcardRouter.ts`, `workflowFSM.ts`, `specificityDetector.ts`, `specificityRules.ts`, `specificityTypes.ts` | | Modelhåndtering | `modelCapabilities.ts`, `modelDeprecation.ts`, `modelFamilyFallback.ts`, `modelStrip.ts`, `model.ts`, `provider.ts`, `providerRequestDefaults.ts`, `providerCostData.ts`, `payloadRules.ts` | | Komprimering | `compression/` — komplet integration af komprimeringsmotoren | | Token + session | `tokenRefresh.ts`, `sessionManager.ts`, `apiKeyRotator.ts`, `contextManager.ts`, `contextHandoff.ts`, `systemPrompt.ts`, `roleNormalizer.ts`, `responsesInputSanitizer.ts`, `toolSchemaSanitizer.ts`, `toolLimitDetector.ts`, `thinkingBudget.ts` | | Niveau / manifest | `tierResolver.ts`, `tierConfig.ts`, `tierDefaults.json`, `tierTypes.ts`, `manifestAdapter.ts` | | IP / netværk | `ipFilter.ts`, `webSearchFallback.ts` | | Batchbehandlinger | `batchProcessor.ts` | | Forbrug | `usage.ts` | ### 4.6 `open-sse/mcp-server/` - **110 unikke værktøjer** integreret i `server.ts` (45 kanoniske i `schemas/tools.ts` + hukommelses-, færdigheds-, GitHub-færdigheds-, pulje-, gamification-, plugin-, Notion-, Obsidian-, lokalt korpus- og komprimeringsmoduler — unionen optælles af `countUniqueMcpTools`). - **3 transporter**: stdio, HTTP Streamable, SSE. - **33 scopes** håndhæves ved kørsel — basislisten findes i `src/shared/constants/mcpScopes.ts`, og det fulde sæt er unionen af de scopes, som hvert værktøjsmodul deklarerer. - Revisionstabel: `mcp_tool_audit` (udfyldes af `audit.ts`). - Filer: `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`, samt tests under `__tests__/`. - Se [MCP-SERVER.md](../frameworks/MCP-SERVER.md) for det komplette værktøjskatalog. ### 4.7 `open-sse/config/` Udbyderregistre (`providerRegistry.ts`, `providerModels.ts`, `providerHeaderProfiles.ts`), modelspecifikke registre pr. format (`audioRegistry.ts`, `embeddingRegistry.ts`, `imageRegistry.ts`, `moderationRegistry.ts`, `musicRegistry.ts`, `rerankRegistry.ts`, `searchRegistry.ts`, `videoRegistry.ts`), identitetshjælpere (`codexIdentity.ts`, `codexInstructions.ts`, `anthropicHeaders.ts`, `antigravityUpstream.ts`, `antigravityModelAliases.ts`, `cliFingerprints.ts`, `toolCloaking.ts`, `defaultThinkingSignature.ts`), legitimationsoplysningshjælpere (`credentialLoader.ts`, `codexClient.ts`) og cloud- adaptere (`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/` Streaming-primitiver og provider-hjælpefunktioner: `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/` — Desktop-wrapper ``` electron/ ├── main.js Electrons hovedproces ├── preload.js Preload-bro (contextIsolation aktiveret) ├── types.d.ts ├── package.json electron-builder-konfiguration, version 3.8.51 ├── README.md ├── assets/ Buildressourcer (ikoner, rettigheder, …) ├── node_modules/ Dedikerede node_modules (better-sqlite3, electron-updater) └── dist-electron/ Buildoutput (ikke committet) ``` Fem npm-scripts i workspacets rod: `electron:dev`, `electron:build`, `electron:build:{win,mac,linux}`, `electron:smoke:packaged`. Automatisk opdatering sker via `electron-updater`, som peger på GitHub-udgivelsesfeedet. --- ## 6. `bin/` — CLI ``` bin/ ├── omniroute.mjs Primært CLI-entrypoint (Node ESM) ├── reset-password.mjs Nulstil administrationsadgangskoden fra CLI ├── mcp-server.mjs MCP-serverstarter (stdio) ├── nodeRuntimeSupport.mjs Kontrol af Node-version └── cli/ ├── program.mjs Commander-programbygger ├── runtime.mjs withRuntime-hjælper (server-først/db-reserveløsning) ├── output.mjs Outputformattering (json/jsonl/table/csv) ├── i18n.mjs t()-hjælper med lokaliteter ├── api.mjs Hjælper til API-fetch ├── data-dir.mjs ├── encryption.mjs ├── sqlite.mjs └── commands/ ├── registry.mjs Kommandoregistrering ├── setup.mjs ├── doctor.mjs ├── providers.mjs └── ... (én fil pr. kommando/gruppe) ``` To binære programmer eksponeres i `package.json` → `bin`: - `omniroute` → `bin/omniroute.mjs` - `omniroute-reset-password` → `bin/reset-password.mjs` --- ## 7. `tests/` | Mappe | Type | | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | `tests/unit/` | Enhedstests via Nodes indbyggede testkører (1821 filer samt undermapperne `api/`, `auth/`, `authz/`) | | `tests/integration/` | Tests på tværs af moduler samt DB-tilstandstests | | `tests/e2e/` | Playwright-UI-tests | | `tests/e2e/protocol-clients.test.ts` | MCP/A2A-protokol-e2e | | `tests/translator/` | Translatorspecifikke tests | | `tests/security/` | Sikkerhedsregressioner | | `tests/load/` | Belastnings-/stresstests | | `tests/golden-set/` | Referenceoutput til translatorregressioner | | `tests/helpers/`, `tests/fixtures/`, `tests/manual/` | Hjælpefiler | Almindelige kommandoer: | Kommando | Hvad den kører | | -------------------------------------------------------- | ----------------------------------------------------------------- | | `npm run test:unit` | Alle `tests/unit/*.test.ts` via Nodes testkører (10 samtidige) | | `npm run test:vitest` | Vitest-testsuite (MCP, autoCombo, cache) | | `npm run test:e2e` | Playwright-UI-testsuite | | `npm run test:protocols:e2e` | MCP- og A2A-protokol-e2e | | `npm run test:coverage` | Dækningskrav (≥60 % linjer/instruktioner/funktioner/forgreninger) | | `node --import tsx/esm --test tests/unit/.test.ts` | Kørsel af en enkelt fil | --- ## 8. `scripts/` Organiseret i 6 undermapper efter formål. - **`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` samt skrivebeskyttede hjælpeværktøjer til overvågning af PR'er: `ci-discriminate.sh` (sorterer signaturerne for mislykkede kontroller i en PR som egne / nedarvede / ukendte i forhold til en reference-PR eller problemet med røde kontroller i basisgrenen) og `audit-worktree.sh` (ændrede filer, beskyttede områder, fjernede assertions, antal undertrykkelser, tilbageværende midlertidige tsconfigs, PR-hoved mod lokal HEAD — før en workers PR accepteres). - **`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. Anmodningspipeline (oversigt) ![Anmodningspipeline (/v1/chat/completions)](../diagrams/exported/request-pipeline.svg) > Kilde: [diagrams/request-pipeline.mmd](../diagrams/request-pipeline.mmd) ``` Klientanmodning → /v1/chat/completions (route.ts) CORS-preflightkontrol Zod-validering (chatCompletionsSchema i shared/validation/schemas.ts) Godkendelse (extractApiKey + isValidApiKey ELLER requireManagementAuth) Politikmotor (src/server/authz/pipeline.ts) Sikkerhedsforanstaltninger (PII-maskering, promptinjektion, vision-bro) → handleChatCore() (open-sse/handlers/chatCore.ts) Cachekontrol (semantisk cache + læsecache) Hastighedsbegrænsning (rateLimitManager, accountSemaphore) Kombinationsrouting (hvis modellen fortolkes som en kombination) comboResolver → løkke pr. mål → handleSingleModel() translateRequest() (open-sse/translator/request/*) getExecutor(providerId).execute() (open-sse/executors/*) hent fra upstream → nyt forsøg/backoff via accountFallback translateResponse() (open-sse/translator/response/*) SSE-stream ELLER JSON-svar Hvis Responses API: TransformStream via open-sse/transformer/responsesTransformer.ts → Compliance-revision (src/lib/compliance/) → Svar til klienten ``` ### Kørselstilstand for robusthed (tre mekanismer) | Mekanisme | Omfang | Hvor | | --------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------- | | Circuit breaker for udbyder | Hele udbyderen | `src/shared/utils/circuitBreaker.ts`, gemt i `domain_circuit_breakers` | | Nedkøling af forbindelse | Én konto/nøgle | `markAccountUnavailable()` i `src/sse/services/auth.ts`; anvendt af `accountFallback.checkFallbackError()` | | Modelspærring | Udbyder + forbindelse + model | `open-sse/services/accountFallback.ts`, gemt i `domain_lockout_state` | Se [RESILIENCE_GUIDE.md](./RESILIENCE_GUIDE.md) og det dedikerede afsnit i [CLAUDE.md](../../CLAUDE.md). --- ## 10. Sådan bidrager du ### Tilføj en ny udbyder 1. Registrer den i `src/shared/constants/providers.ts` (Zod-valideret ved indlæsning). 2. Tilføj en executor i `open-sse/executors/`, hvis brugerdefineret logik er påkrævet (udvid `BaseExecutor`). 3. Tilføj en translator i `open-sse/translator/`, hvis den ikke bruger OpenAI-formatet. 4. Hvis den er OAuth-baseret, skal du tilføje konfiguration under `src/lib/oauth/providers/` og `src/lib/oauth/services/`. 5. Registrer modeller i `open-sse/config/providerRegistry.ts` (eller det formatspecifikke register under `open-sse/config/`). 6. Skriv tests under `tests/unit/`. ### Tilføj en ny API-rute 1. Opret `src/app/api/your-route/route.ts`. 2. Følg mønsteret: CORS → Zod-validering af body → godkendelse → delegering til handler. 3. Ved en ny request-struktur: Tilføj Zod-skemaet i `src/shared/validation/schemas.ts`. 4. Hvis den kun er til administration: Tilføj stien til `src/shared/constants/publicApiRoutes.ts` (afvisningsliste for den offentlige API-overflade). 5. Tilføj tests under `tests/unit/`. 6. Opdater `docs/reference/API_REFERENCE.md` og `docs/openapi.yaml`. ### Tilføj et nyt DB-modul 1. Opret `src/lib/db/yourModule.ts`, og importér `getDbInstance()` fra `./core.ts`. 2. Eksportér CRUD-funktioner for dit domæne. 3. Ved nye tabeller: Tilføj en migration under `src/lib/db/migrations/`, nummereret fortløbende, idempotent og transaktionel. 4. Importører bruger direkte imports fra `@/lib/db/yourModule` (ingen barrel — det gamle `localDb.ts`-lag med reeksport blev fjernet). 5. Tilføj tests under `tests/unit/`. ### Tilføj et nyt MCP-værktøj 1. Tilføj værktøjsdefinitionen under `open-sse/mcp-server/tools/` (eller udvid `open-sse/mcp-server/schemas/tools.ts`). 2. Tildel de relevante scopes i `src/shared/constants/mcpScopes.ts`. 3. Registrer værktøjet i `open-sse/mcp-server/server.ts`. 4. Tilføj tests under `open-sse/mcp-server/__tests__/`. 5. Opdater [MCP-SERVER.md](../frameworks/MCP-SERVER.md). ### Tilføj en ny A2A-færdighed Se [A2A-SERVER.md § Tilføjelse af en ny færdighed](../frameworks/A2A-SERVER.md). Færdigheder findes i `src/lib/a2a/skills/` og registreres via A2A-opgavestyringen. --- ## 11. Konventioner - **Kodestil**: indrykning med 2 mellemrum, dobbelte anførselstegn, linjebredde på 100 tegn, semikoloner, efterstillede kommaer i `es5`-stil — håndhæves af Prettier via `lint-staged`. - **Imports**: eksterne → interne (`@/`, `@omniroute/open-sse`) → relative. - **Navngivning**: filer bruger `camelCase` eller `kebab-case`, komponenter bruger `PascalCase`, konstanter bruger `UPPER_SNAKE`. - **ESLint**: `no-eval`, `no-implied-eval`, `no-new-func` = `error` overalt; `no-explicit-any` = `warn` i `open-sse/` og `tests/`, fejl andre steder. - **TypeScript**: `strict: false` (ældre praksis). Foretræk eksplicitte typer frem for inferens på tværs af modulgrænser. - **Database**: Skriv aldrig rå SQL i ruter eller handlers — gå altid gennem moduler i `src/lib/db/`. Brug aldrig barrel-imports — brug specifikke `src/lib/db/*`-moduler direkte. - **Typning af DB-entiteter (#3512)**: En funktion, der skriver eller læser en DB-tabels rækkestruktur, skal modtage/returnere et navngivet TS-interface, som afspejler tabellens kolonner 1:1, ikke `any` eller en anonym inline-type på kaldestedet. Placer interfacet ved siden af funktionen (f.eks. `export interface UsageEntry` i `src/lib/usage/usageHistory.ts` over `saveRequestUsage`), behold individuelle felter som valgfrie/nullbare, når forskellige skrivere udfylder rækken trinvist, og foretræk `unknown` frem for `any` for et felt, hvis struktur varierer mellem kaldere (dokumenteret på feltet, f.eks. accepterer `UsageEntry.tokens` både råt udbyderformet forbrug og den normaliserede struktur). Når en fils antal af `any` når nul på denne måde, skal den føjes til `check:any-budget:t11`-tilladelseslisten (`scripts/check/check-t11-any-budget.mjs`, `maxAny: 0`), så den ikke kan få tilbagefald. Dette er en konvention for første del — den bredere oprydning af "ingen anonym `any`" udføres iterativt i resten af kodebasen. - **Fejl**: Brug try/catch med specifikke fejltyper, og log med pino-kontekst. Ignorér aldrig fejl lydløst i SSE-streams; brug afbrydelsessignaler til oprydning. - **Sikkerhed**: Brug aldrig `eval()` / `new Function()` / implicit eval. Validér alle input med Zod. Krypter legitimationsoplysninger i hvile (AES-256-GCM). Hold afvisningslisten i `src/shared/constants/upstreamHeaders.ts` afstemt med rensnings-/valideringslaget. - **Commits**: Conventional Commits — `feat(scope): subject`. Tilladte scopes: `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`. - **Branches**: præfikserne `feat/`, `fix/`, `refactor/`, `docs/`, `test/`, `chore/`. Commit aldrig direkte til `main`. - **Husky**: pre-commit kører `lint-staged` + `check:docs-sync` + `check:any-budget:t11`; pre-push kører `check:any-budget:t11` + `check:tracked-artifacts` (hurtige kontroller; ekskluderer `test:unit`). --- ## 12. Ufravigelige regler (fra CLAUDE.md) 1. Commit aldrig hemmeligheder eller legitimationsoplysninger. 2. Brug aldrig barrel-imports — brug specifikke `src/lib/db/*`-moduler direkte. 3. Brug aldrig `eval()` / `new Function()` / implicit eval. 4. Commit aldrig direkte til `main`. 5. Skriv aldrig rå SQL i routes — gå altid gennem `src/lib/db/`-moduler. 6. Ignorer aldrig fejl lydløst i SSE-streams. 7. Validér altid input med Zod-skemaer. 8. Inkludér altid tests, når produktionskode ændres. 9. Kodedækningen skal forblive ≥ 60 % (statements, lines, functions, branches). --- ## 13. Se også - [ARCHITECTURE.md](./ARCHITECTURE.md) — overordnet arkitektur og modulernes ansvarsområder. - [API_REFERENCE.md](../reference/API_REFERENCE.md) — reference til offentlige API'er og administrations-API'er. - [FEATURES.md](../guides/FEATURES.md) — funktionsoversigt og højdepunkter i versionerne. - [RESILIENCE_GUIDE.md](./RESILIENCE_GUIDE.md) — detaljeret gennemgang af circuit breaker, cooldown og lockout. - [AUTO-COMBO.md](../routing/AUTO-COMBO.md) — Auto Combo-scoringsmetoder og -strategier. - [MCP-SERVER.md](../frameworks/MCP-SERVER.md) — komplet katalog over MCP-værktøjer og transportsystemer. - [A2A-SERVER.md](../frameworks/A2A-SERVER.md) — A2A-protokolfærdigheder og discovery. - [COMPRESSION_GUIDE.md](../compression/COMPRESSION_GUIDE.md) — RTK- og Caveman-komprimering. - [CLI-TOOLS.md](../reference/CLI-TOOLS.md) — CLI-integrationer. - [ELECTRON_GUIDE.md](../guides/ELECTRON_GUIDE.md) (hvis den findes), [DOCKER_GUIDE.md](../guides/DOCKER_GUIDE.md), [FLY_IO_DEPLOYMENT_GUIDE.md](../ops/FLY_IO_DEPLOYMENT_GUIDE.md), [VM_DEPLOYMENT_GUIDE.md](../ops/VM_DEPLOYMENT_GUIDE.md), [TERMUX_GUIDE.md](../guides/TERMUX_GUIDE.md), [PWA_GUIDE.md](../guides/PWA_GUIDE.md) — udrulningsmål. - [TROUBLESHOOTING.md](../guides/TROUBLESHOOTING.md) — almindelige driftsproblemer. - [CONTRIBUTING.md](../../CONTRIBUTING.md) — arbejdsgang for bidragydere. - [CLAUDE.md](../../CLAUDE.md) — repository-regler for Claude Code (den autoritative kilde til mange af konventionerne ovenfor). - [AGENTS.md](../../AGENTS.md) — mere dybdegående arkitekturreference, der bruges af agenter.