* feat(providers): add Zylo UnoRouter and Poolside registries * feat(providers): integrate audited free-tier gateways * feat: add wave2 free-tier provider registries * feat(providers): add Mixlayer Speka and TokenReply registries * feat: add wave 2 free-tier provider registries * fix: align meganova provider slug * feat(providers): integrate wave2 free-tier gateways * feat(providers): add Wave 3-A free-tier registries * feat(providers): add HelyxAI Auriko and Poixe registries * feat(providers): add Naga AI and Chat Oripe registries * feat(providers): integrate wave3 free-tier gateways * feat(providers): add FreeInference registry * feat(providers): add Free.ai registry * feat(providers): integrate wave4 free-tier gateways * docs: synchronize provider and free-tier inventories * refactor(providers): split audited gateway catalog * feat(providers): add audited Void AI and HelixMind gateways * feat(providers): finalize audited free-tier integration * test(providers): update APIKEY split count to 229 after rebase onto release/v3.8.50 The rebase merged the release catalog (201 APIKEY providers) with the PR's 28 free-tier additions, yielding 229 total. Correct the characterization count so the partition assertion reflects the true merged state. --------- Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com> Co-authored-by: backryun <bakryun0718@proton.me>
27 KiB
CLAUDE.md (Bahasa Melayu)
🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 es · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇺 hu · 🇮🇩 id · 🇮🇩 in · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇮🇳 mr · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN
Fail ini memberikan panduan kepada Claude Code (claude.ai/code) apabila bekerja dengan kod dalam repositori ini.
Permulaan Pantas
npm install # Pasang deps (auto-generate .env dari .env.example)
npm run dev # Pelayan dev di http://localhost:20128
npm run build # Pembinaan pengeluaran (Next.js 16 standalone)
npm run lint # ESLint (0 ralat dijangka; amaran adalah sedia ada)
npm run typecheck:core # Semakan TypeScript (seharusnya bersih)
npm run typecheck:noimplicit:core # Semakan ketat (tiada implicit any)
npm run test:coverage # Ujian unit + pintu liputan (75/75/75/70 — kenyataan/garis/fungsi/cabang)
npm run check # lint + ujian digabungkan
npm run check:cycles # Mengesan kebergantungan bulat
Menjalankan Ujian
# Fail ujian tunggal (penjalur ujian asli Node.js — kebanyakan ujian)
node --import tsx/esm --test tests/unit/your-file.test.ts
# Vitest (pelayan MCP, autoCombo, cache)
npm run test:vitest
# Semua suite
npm run test:all
Untuk matriks ujian penuh, lihat CONTRIBUTING.md → "Menjalankan Ujian". Untuk seni bina mendalam, lihat AGENTS.md.
Projek Secara Ringkas
OmniRoute — proksi/router AI yang bersatu. Satu titik akhir, 329 penyedia LLM, auto-fallback.
| Lapisan | Lokasi | Tujuan |
|---|---|---|
| API Routes | src/app/api/v1/ |
Penghala Aplikasi Next.js — titik masuk |
| Handlers | open-sse/handlers/ |
Pemprosesan permintaan (chat, embeddings, dll) |
| Executors | open-sse/executors/ |
Penghantaran HTTP khusus penyedia |
| Translators | open-sse/translator/ |
Penukaran format (OpenAI↔Claude↔Gemini) |
| Transformer | open-sse/transformer/ |
API Respons ↔ Penyelesaian Chat |
| Services | open-sse/services/ |
Penghalaan combo, had kadar, caching, dll |
| Database | src/lib/db/ |
110 top-level SQLite domain modules, 130 migrations |
| Domain/Policy | src/domain/ |
Enjin dasar, peraturan kos, logik fallback |
| MCP Server | open-sse/mcp-server/ |
107 unique tools, 3 transports (stdio / SSE / Streamable HTTP), 32 scopes |
| A2A Server | src/lib/a2a/ |
Protokol agen JSON-RPC 2.0 |
| Skills | src/lib/skills/ |
Rangka kerja kemahiran yang boleh diperluas |
| Memory | src/lib/memory/ |
Memori perbualan yang berterusan |
Monorepo: src/ (aplikasi Next.js 16), open-sse/ (workspace enjin streaming), electron/ (aplikasi desktop), tests/, bin/ (titik masuk CLI).
Saluran Permintaan
Klien → /v1/chat/completions (laluan Next.js)
→ CORS → pengesahan Zod → auth? → semakan polisi → pengawal suntikan prompt
→ handleChatCore() [open-sse/handlers/chatCore.ts]
→ semakan cache → had kadar → penghalaan combo?
→ resolveComboTargets() → handleSingleModel() bagi setiap sasaran
→ translateRequest() → getExecutor() → executor.execute()
→ fetch() upstream → retry w/ backoff
→ terjemahan respons → aliran SSE atau JSON
→ Jika API Respons: responsesTransformer.ts TransformStream
Laluan API mengikuti pola yang konsisten: Laluan → CORS preflight → pengesahan badan Zod → Auth pilihan (extractApiKey/isValidApiKey) → penguatkuasaan polisi kunci API → Delegasi Pengendali (open-sse). Tiada middleware global Next.js — pemotongan adalah khusus untuk laluan.
Combo routing (open-sse/services/combo.ts): 19 public strategies (priority, weighted, fill-first, round-robin, p2c, random, least-used, cost-optimized, reset-aware, reset-window, headroom, strict-random, auto, lkgp, context-optimized, cache-optimized, context-relay, fusion, pipeline). Each target calls handleSingleModel(), which wraps handleChatCore() with per-target error handling and circuit-breaker checks. See docs/routing/AUTO-COMBO.md for the 13-factor Auto-Combo scoring and docs/architecture/RESILIENCE_GUIDE.md for the 3 resilience layers.
Keadaan Runtime Ketahanan
OmniRoute mempunyai tiga mekanisme kegagalan sementara yang berkaitan tetapi berbeza. Pastikan skop mereka terpisah semasa menyahpepijat tingkah laku penghalaan. Lihat rajah ketahanan 3-lapisan (sumber: docs/diagrams/resilience-3layers.mmd) untuk peta ringkas.
Pemutus Litar Penyedia
Skop: keseluruhan penyedia, contohnya glm, openai, anthropic.
Tujuan: menghentikan penghantaran trafik kepada penyedia yang berulang kali gagal di peringkat upstream/perkhidmatan, supaya satu penyedia yang tidak sihat tidak melambatkan setiap permintaan.
Pelaksanaan:
- Kelas teras:
src/shared/utils/circuitBreaker.ts - Penghantaran pintu/pendawaian pelaksanaan:
src/sse/handlers/chatHelpers.ts,src/sse/handlers/chat.ts - API status runtime:
src/app/api/monitoring/health/route.ts - Pembungkus bersama:
open-sse/services/accountFallback.ts - Jadual keadaan yang dipersisten:
domain_circuit_breakers
Keadaan:
CLOSED: trafik normal dibenarkan.OPEN: penyedia disekat sementara; pemanggil mendapat respons pemutus-litar-penyedia-terbuka atau penghalaan combo melangkau ke sasaran lain.HALF_OPEN: masa tamat reset telah berlalu; benarkan permintaan probe. Kejayaan menutup pemutus, kegagalan membukanya semula.
Tetapan Lalai (open-sse/config/constants.ts):
- Penyedia OAuth: ambang
3, masa tamat reset60s. - Penyedia kunci API: ambang
5, masa tamat reset30s. - Penyedia tempatan: ambang
2, masa tamat reset15s.
Hanya status kegagalan peringkat penyedia yang seharusnya mencetuskan pemutus penyedia:
(408, 500, 502, 503, 504);
Jangan mencetuskan pemutus penyedia keseluruhan untuk kesalahan akaun/kunci/model normal seperti kebanyakan
kes 401, 403, atau 429. Kes-kes tersebut biasanya berkaitan dengan cooldown sambungan atau penguncian model. Penyedia kunci API generik 403 seharusnya boleh dipulihkan kecuali ia diklasifikasikan
sebagai kesalahan penyedia/akaun terminal.
Pemutus menggunakan pemulihan malas, bukan pemasa latar belakang. Apabila OPEN tamat, bacaan seperti getStatus(), canExecute(), dan getRetryAfterMs() menyegarkan keadaan kepada
HALF_OPEN, supaya papan pemuka dan pembina calon combo tidak terus mengecualikan penyedia yang tamat selama-lamanya.
Cooldown Sambungan
Skop: satu sambungan penyedia/akaun/kunci.
Tujuan: melangkau sementara satu kunci/akaun yang buruk sambil membenarkan sambungan lain untuk penyedia yang sama terus memenuhi permintaan.
Pelaksanaan:
- Laluan tulis/kemas kini:
src/sse/services/auth.ts::markAccountUnavailable() - Pemilihan/pengasingan akaun:
src/sse/services/auth.ts::getProviderCredentials... - Pengiraan cooldown:
open-sse/services/accountFallback.ts::checkFallbackError() - Tetapan:
src/lib/resilience/settings.ts
Medan penting pada sambungan penyedia:
rateLimitedUntil;
testStatus: "unavailable";
lastError;
lastErrorType;
errorCode;
backoffLevel;
Semasa pemilihan akaun, sambungan dilangkau sementara:
new Date(rateLimitedUntil).getTime() > Date.now();
Cooldown juga malas: apabila rateLimitedUntil berada di masa lalu, sambungan menjadi
layak semula. Pada penggunaan yang berjaya, clearAccountError() membersihkan testStatus,
rateLimitedUntil, medan ralat, dan backoffLevel.
Tingkah laku cooldown sambungan lalai:
- Cooldown asas OAuth:
5s. - Cooldown asas kunci API:
3s. - Kunci API
429seharusnya lebih mengutamakan petunjuk retry upstream (Retry-After, header reset, atau teks reset yang boleh dibaca) apabila tersedia. - Kegagalan boleh dipulihkan yang berulang menggunakan backoff eksponen:
baseCooldownMs * 2 ** failureIndex;
Pengawal anti-thundering-herd menghalang kegagalan serentak pada sambungan yang sama daripada
berulang kali melanjutkan cooldown atau meningkatkan backoffLevel dua kali ganda.
Keadaan terminal bukan cooldown. banned, expired, dan credits_exhausted adalah
dimaksudkan untuk kekal tidak tersedia sehingga kelayakan/tetapan berubah atau seorang pengendali menetapkannya semula. Jangan menulis semula keadaan terminal dengan keadaan cooldown sementara.
Penguncian Model
Skop: penyedia + sambungan + model.
Tujuan: mengelakkan melumpuhkan keseluruhan sambungan apabila hanya satu model tidak tersedia atau had kuota untuk sambungan tersebut.
Contoh:
- Penyedia kuota per-model yang mengembalikan
429. - Penyedia tempatan yang mengembalikan
404untuk satu model yang hilang. - Kegagalan kebenaran mod/model khusus penyedia seperti mod Grok yang dipilih.
Penguncian model hidup dalam open-sse/services/accountFallback.ts dan membenarkan sambungan yang sama terus memenuhi model lain.
Panduan Menyahpepijat
- Jika semua kunci untuk penyedia dilangkau, periksa kedua-dua keadaan pemutus penyedia dan setiap
rateLimitedUntil/testStatussambungan. - Jika penyedia kelihatan kekal dikecualikan selepas tetingkap reset, semak sama ada kod
membaca
statementah dan bukannya menggunakangetStatus()/canExecute(). - Jika satu kunci penyedia gagal tetapi yang lain seharusnya berfungsi, lebih baik menggunakan cooldown sambungan daripada pemutus penyedia.
- Jika hanya satu model gagal, lebih baik menggunakan penguncian model daripada cooldown sambungan.
- Jika satu keadaan seharusnya pulih sendiri, ia seharusnya mempunyai cap waktu/reset masa depan dan laluan bacaan yang menyegarkan keadaan yang tamat. Status kekal memerlukan perubahan kelayakan atau konfigurasi secara manual.
Konvensyen Utama
Gaya Kod
- 2 ruang, titik koma, petikan berganda, lebar 100 aksara, koma akhir es5 (dikuatkuasakan oleh lint-staged melalui Prettier)
- Import: luaran → dalaman (
@/,@omniroute/open-sse) → relatif - Penamaan: fail=camelCase/kebab, komponen=PascalCase, pemalar=UPPER_SNAKE
- ESLint:
no-eval,no-implied-eval,no-new-func= ralat di mana-mana;no-explicit-any= amaran dalamopen-sse/dantests/ - TypeScript:
strict: false, sasaran ES2022, modul esnext, resolusi bundler. Utamakan jenis eksplisit.
Pangkalan Data
- Sentiasa melalui modul domain
src/lib/db/— jangan sekali-kali menulis SQL mentah dalam laluan atau pengendali - Jangan sekali-kali menambah logik ke dalam
src/lib/localDb.ts(lapisan re-export sahaja) - Jangan sekali-kali mengimport dari
localDb.ts— import moduldb/tertentu sebaliknya - DB singleton:
getDbInstance()darisrc/lib/db/core.ts(penulisan jurnal WAL) - Migrasi:
src/lib/db/migrations/— fail SQL versi, idempotent, dijalankan dalam transaksi
Pengendalian Ralat
- try/catch dengan jenis ralat tertentu, log dengan konteks pino
- Jangan sekali-kali menelan ralat dalam aliran SSE — gunakan isyarat abort untuk pembersihan
- Kembalikan kod status HTTP yang betul (4xx/5xx)
Keselamatan
- Jangan sekali-kali menggunakan
eval(),new Function(), atau eval tersirat - Sahkan semua input dengan skema Zod
- Enkripsi kredensial dalam keadaan rehat (AES-256-GCM)
- Senarai denylist header upstream:
src/shared/constants/upstreamHeaders.ts— pastikan sanitasi, skema Zod, dan ujian unit selaras semasa mengedit - Kredensial upstream awam (Gemini/Antigravity/Windsurf-style OAuth client_id/secret + kunci Web Firebase yang diekstrak dari CLI awam): HARUS disematkan melalui
resolvePublicCred()dariopen-sse/utils/publicCreds.ts— jangan sekali-kali sebagai literal string. Lihatdocs/security/PUBLIC_CREDS.mduntuk pola yang wajib. - Respons ralat (HTTP / SSE / pengendali executor / MCP): HARUS melalui
buildErrorBody()atausanitizeErrorMessage()dariopen-sse/utils/error.ts— jangan sekali-kali meletakkanerr.stackatauerr.messagementah dalam badan respons. Lihatdocs/security/ERROR_SANITIZATION.md. - Perintah shell yang dibina dari pembolehubah: apabila memanggil
exec()/spawn()dengan skrip yang memerlukan nilai runtime, hantarkan melalui pilihanenv(automatik di-escape shell) — jangan sekali-kali interpolasi string laluan tidak dipercayai/luaran ke dalam badan skrip. Rujukan:src/mitm/cert/install.ts::updateNssDatabases. - Perpustakaan yang selamat secara lalai (tldrsec/awesome-secure-defaults): utamakan Helmet.js, DOMPurify, ssrf-req-filter, safe-regex, Google Tink berbanding pelaksanaan khusus apabila menambah permukaan sensitif keselamatan yang baru.
Senario Pengubahsuaian Biasa
Menambah Penyedia Baru
- Daftar dalam
src/shared/constants/providers.ts(disahkan Zod semasa memuat) - Tambah executor dalam
open-sse/executors/jika logik khusus diperlukan (lanjutanBaseExecutor) - Tambah penterjemah dalam
open-sse/translator/jika format bukan OpenAI - Tambah konfigurasi OAuth dalam
src/lib/oauth/constants/oauth.tsjika berasaskan OAuth — jika CLI upstream menghantar client_id/secret awam, sematkan melaluiresolvePublicCred()(lihatdocs/security/PUBLIC_CREDS.md), jangan sekali-kali sebagai literal - Daftar model dalam
open-sse/config/providerRegistry.ts - Tulis ujian dalam
tests/unit/(sertakan pengesahan bentuk publicCreds jika anda menambah default yang disematkan baru)
Menambah Laluan API Baru
- Buat direktori di bawah
src/app/api/v1/your-route/ - Buat
route.tsdengan pengendaliGET/POST - Ikuti pola: CORS → pengesahan badan Zod → pengesahan pilihan → delegasi pengendali
- Pengendali pergi ke dalam
open-sse/handlers/(import dari situ, bukan dalam talian) - Respons ralat menggunakan
buildErrorBody()/errorResponse()dariopen-sse/utils/error.ts(auto-sanitized — jangan sekali-kali meletakkanerr.stackatauerr.messagementah dalam badan). Lihatdocs/security/ERROR_SANITIZATION.md. - Tambah ujian — termasuk sekurang-kurangnya satu pengesahan bahawa respons ralat tidak bocorkan jejak tumpukan (
!body.error.message.includes("at /"))
Menambah Modul DB Baru
- Buat
src/lib/db/yourModule.ts— importgetDbInstancedari./core.ts - Eksport fungsi CRUD untuk jadual domain anda
- Tambah migrasi dalam
src/lib/db/migrations/jika jadual baru diperlukan - Re-export dari
src/lib/localDb.ts(tambahkan ke senarai re-export sahaja) - Tulis ujian
Menambah Alat MCP Baru
- Tambah definisi alat dalam
open-sse/mcp-server/tools/dengan skema input Zod + pengendali asinkron - Daftar dalam set alat (disambungkan oleh
createMcpServer()) - Tugaskan kepada skop yang sesuai
- Tulis ujian (panggilan alat dicatat ke dalam jadual
mcp_audit)
Menambah Kemahiran A2A Baru
- Buat kemahiran dalam
src/lib/a2a/skills/(5 sudah ada: smart-routing, quota-management, provider-discovery, cost-analysis, health-report) - Kemahiran menerima konteks tugas (mesej, metadata) → mengembalikan hasil terstruktur
- Daftar dalam
A2A_SKILL_HANDLERSdalamsrc/lib/a2a/taskExecution.ts - Dedahkan dalam
src/app/.well-known/agent.json/route.ts(Kad Ejen) - Tulis ujian dalam
tests/unit/ - Dokumentasikan dalam jadual kemahiran
docs/frameworks/A2A-SERVER.md
Menambah Ejen Cloud Baru
- Buat kelas ejen dalam
src/lib/cloudAgent/agents/yang memperluasCloudAgentBase(3 sudah ada: codex-cloud, devin, jules) - Laksanakan
createTask,getStatus,approvePlan,sendMessage,listSources - Daftar dalam
src/lib/cloudAgent/registry.ts - Tambah pengendalian OAuth/kredensial jika perlu (
src/lib/oauth/providers/) - Ujian + dokumentasikan dalam
docs/frameworks/CLOUD_AGENT.md
Menambah Garis Panduan / Eval / Kemahiran / Acara Webhook Baru
- Garis panduan:
src/lib/guardrails/→ dokumen:docs/security/GUARDRAILS.md - Suite Eval:
src/lib/evals/→ dokumen:docs/frameworks/EVALS.md - Kemahiran (sandbox):
src/lib/skills/→ dokumen:docs/frameworks/SKILLS.md - Acara Webhook:
src/lib/webhookDispatcher.ts→ dokumen:docs/frameworks/WEBHOOKS.md
Dokumentasi Rujukan
Untuk sebarang perubahan yang tidak remeh, baca analisis mendalam yang sepadan terlebih dahulu:
| Kawasan | Dokumen |
|---|---|
| Navigasi repo | docs/architecture/REPOSITORY_MAP.md |
| Seni bina | docs/architecture/ARCHITECTURE.md |
| Rujukan kejuruteraan | docs/architecture/CODEBASE_DOCUMENTATION.md |
| Auto-Combo (13-factor scoring, 19 public strategies) | docs/routing/AUTO-COMBO.md |
| Ketahanan (3 mekanisme) | docs/architecture/RESILIENCE_GUIDE.md |
| Ulangan penaakulan | docs/routing/REASONING_REPLAY.md |
| Rangka kerja kemahiran | docs/frameworks/SKILLS.md |
| Sistem memori (FTS5 + Qdrant) | docs/frameworks/MEMORY.md |
| Ejen awan | docs/frameworks/CLOUD_AGENT.md |
| Garis panduan (PII / suntikan / visi) | docs/security/GUARDRAILS.md |
| Kelayakan awam hulu (Gemini/dll.) | docs/security/PUBLIC_CREDS.md |
| Pembersihan mesej ralat | docs/security/ERROR_SANITIZATION.md |
| Penilaian | docs/frameworks/EVALS.md |
| Pematuhan / audit | docs/security/COMPLIANCE.md |
| Webhook | docs/frameworks/WEBHOOKS.md |
| Saluran pengesahan | docs/architecture/AUTHZ_GUIDE.md |
| Stealth (TLS / cap jari) | docs/security/STEALTH_GUIDE.md |
| Protokol ejen (A2A / ACP / Awan) | docs/frameworks/AGENT_PROTOCOLS_GUIDE.md |
| Pelayan MCP | docs/frameworks/MCP-SERVER.md |
| Pelayan A2A | docs/frameworks/A2A-SERVER.md |
| Rujukan API + OpenAPI | docs/reference/API_REFERENCE.md + docs/reference/openapi.yaml |
| Katalog penyedia (dihasilkan secara automatik) | docs/reference/PROVIDER_REFERENCE.md |
| Aliran pelepasan | docs/ops/RELEASE_CHECKLIST.md |
Ujian
| Apa | Perintah |
|---|---|
| Ujian unit | npm run test:unit |
| Fail tunggal | node --import tsx/esm --test tests/unit/file.test.ts |
| Vitest (MCP, autoCombo) | npm run test:vitest |
| E2E (Playwright) | npm run test:e2e |
| Protokol E2E (MCP+A2A) | npm run test:protocols:e2e |
| Ekosistem | npm run test:ecosystem |
| Pintu liputan | npm run test:coverage (75/75/75/70 — pernyataan/garis/fungsi/cabang) |
| Laporan liputan | npm run coverage:report |
Peraturan PR: Jika anda mengubah kod pengeluaran dalam src/, open-sse/, electron/, atau bin/, anda mesti menyertakan atau mengemas kini ujian dalam PR yang sama.
Keutamaan lapisan ujian: unit pertama → integrasi (multi-modul atau keadaan DB) → e2e (UI/aliran sahaja). Kodkan pengulangan pepijat sebagai ujian automatik sebelum atau bersama dengan pembetulan.
Dasar liputan Copilot: Apabila PR mengubah kod pengeluaran dan liputan berada di bawah 75% (pernyataan/garis/fungsi) atau 70% (cabang), jangan hanya laporkan — tambah atau kemas kini ujian, jalankan semula pintu liputan, kemudian minta pengesahan. Sertakan perintah yang dijalankan, fail ujian yang diubah, dan hasil liputan akhir dalam laporan PR.
Aliran Kerja Git
# Jangan pernah komit terus ke main
git checkout -b feat/your-feature
git commit -m "feat: terangkan perubahan anda"
git push -u origin feat/your-feature
Awalan cawangan: feat/, fix/, refactor/, docs/, test/, chore/
Format komit (Komit Konvensional): feat(db): tambah pemutus litar — skop: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills
Pautan Husky:
- pre-commit: lint-staged +
check-docs-sync+check:any-budget:t11 - pre-push:
npm run test:unit
Persekitaran
- Runtime: Node.js ≥20.20.2 <21 | | ≥22.22.2 <23 | | ≥24 <25, Modul ES
- TypeScript: 5.9+, sasaran ES2022, modul esnext, resolusi bundler
- Alias laluan:
@/*→src/,@omniroute/open-sse→open-sse/,@omniroute/open-sse/*→open-sse/* - Port lalai: 20128 (API + papan pemuka pada port yang sama)
- Direktori data:
DATA_DIRenv var, lalai kepada~/.omniroute/ - Variabel env utama:
PORT,JWT_SECRET,API_KEY_SECRET,INITIAL_PASSWORD,REQUIRE_API_KEY,APP_LOG_LEVEL - Persediaan:
cp .env.example .envkemudian hasilkanJWT_SECRET(openssl rand -base64 48) danAPI_KEY_SECRET(openssl rand -hex 32)
Peraturan Ketat
- Jangan pernah komit rahsia atau kelayakan
- Jangan pernah tambah logik ke
localDb.ts - Jangan pernah gunakan
eval()/new Function()/ eval tersirat - Jangan pernah komit terus ke
main - Jangan pernah menulis SQL mentah dalam laluan — gunakan modul
src/lib/db/ - Jangan pernah menelan ralat secara senyap dalam aliran SSE
- Sentiasa sahkan input dengan skema Zod
- Sentiasa sertakan ujian apabila mengubah kod pengeluaran
- Liputan mesti kekal ≥75% (pernyataan, garis, fungsi) / ≥70% (cabang). Ukuran semasa: ~82%.
- Jangan pernah mengabaikan pautan Husky (
--no-verify,--no-gpg-sign) tanpa kelulusan pengendali yang jelas. - Jangan pernah menyematkan client_id/secret OAuth awam atau kunci Web Firebase sebagai literal rentetan — sentiasa melalui
resolvePublicCred()(open-sse/utils/publicCreds.ts). Lihatdocs/security/PUBLIC_CREDS.md. - Jangan pernah mengembalikan
err.stack/err.messagementah dalam HTTP / SSE / respons pelaksana — sentiasa laluibuildErrorBody()atausanitizeErrorMessage()(open-sse/utils/error.ts). Lihatdocs/security/ERROR_SANITIZATION.md. - Jangan pernah interpolasi rentetan laluan luaran atau nilai runtime ke dalam skrip shell yang dihantar kepada
exec()/spawn()— hantarkan melalui pilihanenvsebaliknya. Rujukan:src/mitm/cert/install.ts::updateNssDatabases. - Jangan pernah menolak amaran CodeQL / Pengimbasan Rahsia tanpa (a) terlebih dahulu memeriksa dokumen pola di atas untuk melihat jika pembantu terpakai, dan (b) merekodkan justifikasi teknikal dalam komen penolakan. Preseden:
js/stack-trace-exposureyang dibangkitkan pada callsites yang sudah laluisanitizeErrorMessage()adalah batasan CodeQL yang diketahui (pembersih khusus tidak dikenali) — tolak sebagaifalse positivemerujuk kepadadocs/security/ERROR_SANITIZATION.md. - Jangan pernah mendedahkan laluan yang memulakan proses anak (
/api/mcp/,/api/cli-tools/runtime/) tanpa klasifikasiisLocalOnlyPath()dalamsrc/server/authz/routeGuard.ts. Penguatkuasaan loopback berlaku tanpa syarat sebelum sebarang semakan pengesahan — JWT yang bocor melalui terowong tidak boleh mencetuskan pemulaan proses. Lihatdocs/security/ROUTE_GUARD_TIERS.md. - Jangan sekali-kali sertakan trailer
Co-Authored-Byyang mengkreditkan pembantu AI, LLM, atau akaun automasi (cth. nama yang mengandungi "Claude", "GPT", "Copilot", "Bot"; emel dianthropic.com/openai.com/ alamatnoreply.github.commilik bot). Trailer sebegitu mengarahkan atribusi commit kepada akaun bot di GitHub, menyembunyikan penulis sebenar (diegosouzapw) dalam sejarah PR. Penyumbang manusia — termasuk penulis PR upstream dan pelapor issue yang diport ke OmniRoute — BOLEH dan SEPATUTNYA dikreditkan dengan trailer standardCo-authored-by: Name <email>; aliran kerja upstream-port (/port-upstream-features,/port-upstream-issues) bergantung pada ini.