# Contributing to OmniRoute (ଓଡ଼ିଆ) 🌐 **Languages:** 🇺🇸 [English](../../../CONTRIBUTING.md) · 🇪🇹 [am](../am/CONTRIBUTING.md) · 🇸🇦 [ar](../ar/CONTRIBUTING.md) · 🇦🇿 [az](../az/CONTRIBUTING.md) · 🇧🇬 [bg](../bg/CONTRIBUTING.md) · 🇧🇩 [bn](../bn/CONTRIBUTING.md) · 🇧🇦 [bs](../bs/CONTRIBUTING.md) · 🇨🇿 [cs](../cs/CONTRIBUTING.md) · 🇩🇰 [da](../da/CONTRIBUTING.md) · 🇩🇪 [de](../de/CONTRIBUTING.md) · 🇬🇷 [el](../el/CONTRIBUTING.md) · 🇪🇸 [es](../es/CONTRIBUTING.md) · 🇪🇪 [et](../et/CONTRIBUTING.md) · 🇮🇷 [fa](../fa/CONTRIBUTING.md) · 🇫🇮 [fi](../fi/CONTRIBUTING.md) · 🇫🇷 [fr](../fr/CONTRIBUTING.md) · 🇮🇪 [ga](../ga/CONTRIBUTING.md) · 🇮🇳 [gu](../gu/CONTRIBUTING.md) · 🇳🇬 [ha](../ha/CONTRIBUTING.md) · 🇮🇱 [he](../he/CONTRIBUTING.md) · 🇮🇳 [hi](../hi/CONTRIBUTING.md) · 🇭🇷 [hr](../hr/CONTRIBUTING.md) · 🇭🇺 [hu](../hu/CONTRIBUTING.md) · 🇦🇲 [hy](../hy/CONTRIBUTING.md) · 🇮🇩 [id](../id/CONTRIBUTING.md) · 🇳🇬 [ig](../ig/CONTRIBUTING.md) · 🇮🇹 [it](../it/CONTRIBUTING.md) · 🇯🇵 [ja](../ja/CONTRIBUTING.md) · 🇬🇪 [ka](../ka/CONTRIBUTING.md) · 🇰🇭 [km](../km/CONTRIBUTING.md) · 🇮🇳 [kn](../kn/CONTRIBUTING.md) · 🇰🇷 [ko](../ko/CONTRIBUTING.md) · 🇱🇹 [lt](../lt/CONTRIBUTING.md) · 🇱🇻 [lv](../lv/CONTRIBUTING.md) · 🇮🇳 [ml](../ml/CONTRIBUTING.md) · 🇮🇳 [mr](../mr/CONTRIBUTING.md) · 🇲🇾 [ms](../ms/CONTRIBUTING.md) · 🇲🇹 [mt](../mt/CONTRIBUTING.md) · 🇲🇲 [my](../my/CONTRIBUTING.md) · 🇳🇵 [ne](../ne/CONTRIBUTING.md) · 🇳🇱 [nl](../nl/CONTRIBUTING.md) · 🇳🇴 [no](../no/CONTRIBUTING.md) · 🇮🇳 [pa](../pa/CONTRIBUTING.md) · 🇵🇭 [phi](../phi/CONTRIBUTING.md) · 🇵🇱 [pl](../pl/CONTRIBUTING.md) · 🇵🇹 [pt](../pt/CONTRIBUTING.md) · 🇧🇷 [pt-BR](../pt-BR/CONTRIBUTING.md) · 🇷🇴 [ro](../ro/CONTRIBUTING.md) · 🇷🇺 [ru](../ru/CONTRIBUTING.md) · 🇱🇰 [si](../si/CONTRIBUTING.md) · 🇸🇰 [sk](../sk/CONTRIBUTING.md) · 🇸🇮 [sl](../sl/CONTRIBUTING.md) · 🇷🇸 [sr](../sr/CONTRIBUTING.md) · 🇸🇪 [sv](../sv/CONTRIBUTING.md) · 🇰🇪 [sw](../sw/CONTRIBUTING.md) · 🇮🇳 [ta](../ta/CONTRIBUTING.md) · 🇮🇳 [te](../te/CONTRIBUTING.md) · 🇹🇭 [th](../th/CONTRIBUTING.md) · 🇹🇷 [tr](../tr/CONTRIBUTING.md) · 🇺🇦 [uk-UA](../uk-UA/CONTRIBUTING.md) · 🇵🇰 [ur](../ur/CONTRIBUTING.md) · 🇺🇿 [uz](../uz/CONTRIBUTING.md) · 🇻🇳 [vi](../vi/CONTRIBUTING.md) · 🇳🇬 [yo](../yo/CONTRIBUTING.md) · 🇨🇳 [zh-CN](../zh-CN/CONTRIBUTING.md) · 🇹🇼 [zh-TW](../zh-TW/CONTRIBUTING.md) --- ଅବଦାନ ଦେବା ପ୍ରତି ଆପଣଙ୍କ ଆଗ୍ରହ ପାଇଁ ଧନ୍ୟବାଦ! ଆରମ୍ଭ କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଯାହା ଆବଶ୍ୟକ, ଏହି ମାର୍ଗଦର୍ଶିକାରେ ସେସବୁ ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି। ପ୍ରତ୍ୟେକ ପରିବର୍ତ୍ତନ ପାଇଁ ଆଧିକାରିକ କାର୍ଯ୍ୟପ୍ରବାହ ନିମନ୍ତେ, [ଅବଦାନର ସୁବର୍ଣ୍ଣ ପଥ](docs/ops/CONTRIBUTION_GOLDEN_PATH.md)ରୁ ଆରମ୍ଭ କରନ୍ତୁ। ଏହା provider, routing, UI/UX, i18n, CLI, database, ଏବଂ build/deploy ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ସେଗୁଡ଼ିକର କଣ୍ଟ୍ରାକ୍ଟ, କେନ୍ଦ୍ରିତ ପରୀକ୍ଷା, CI କଭରେଜ୍, ଏବଂ ସମନ୍ୱୟ ପଦକ୍ଷେପ ସହିତ ମ୍ୟାପ୍ କରେ। --- ## ବିକାଶ ସେଟଅପ୍ ### ପୂର୍ବାପେକ୍ଷିତା - **Node.js** `>=22.22.2 <23`, କିମ୍ବା `>=24.0.0 <27` (ସୁପାରିଶ: 24 LTS) - **npm** 10+ > **Node 24 ସହିତ Windows:** ବର୍ତ୍ତମାନର 24 LTS ପ୍ୟାଚ୍ ରିଲିଜ୍ (ଅତି କମରେ 24.20.0) ବ୍ୟବହାର କରନ୍ତୁ। > ପୂର୍ବରୁ ଥିବା ରିଲିଜ୍ଗୁଡ଼ିକ `--test-force-exit` ପ୍ରକ୍ରିୟା ବନ୍ଦ କରିବା ପରେ ସଫଳ ପରୀକ୍ଷଣଗୁଡ଼ିକ ପରେ > ବନ୍ଦ ହୋଇପାରେ। Node ର [Windows libuv ସମାଧାନ](https://github.com/nodejs/node/pull/61999) ଏହି > ରନ୍ଟାଇମ୍ କ୍ରାଶ୍ର ସମାଧାନ କରେ; ପରୀକ୍ଷଣ ଅସର୍ସନ୍ଗୁଡ଼ିକ ଏବଂ ରନର୍ ଏକ୍ଜିଟ୍ ଯାଞ୍ଚଗୁଡ଼ିକ ସକ୍ରିୟ ରଖନ୍ତୁ। > **npm v11+ ବ୍ୟବହାରକାରୀମାନେ (Node 24+):** `npm install` ପରେ, ନେଟିଭ୍ ମଡ୍ୟୁଲ୍ଗୁଡ଼ିକ ସ୍ଥାପିତ ହୋଇଛି କି ଯାଞ୍ଚ କରନ୍ତୁ: > `node -e "require('better-sqlite3')"`। ଯଦି ଏହା `MODULE_NOT_FOUND` ସହିତ ବିଫଳ ହୁଏ, > `npm approve-scripts better-sqlite3 && npm install` ଚଲାନ୍ତୁ। [ସମସ୍ୟା ସମାଧାନ](docs/guides/TROUBLESHOOTING.md#npm-v11-better-sqlite3-not-installed-cannot-find-module) ଦେଖନ୍ତୁ। - **Git** ### କ୍ଲୋନ୍ ଏବଂ ସ୍ଥାପନ ```bash git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute npm install ``` ### ପରିବେଶ ଭେରିଏବଲ୍ଗୁଡ଼ିକ ```bash # ଟେମ୍ପଲେଟ୍ରୁ ଆପଣଙ୍କ .env ସୃଷ୍ଟି କରନ୍ତୁ cp .env.example .env # ଆବଶ୍ୟକ ସିକ୍ରେଟ୍ଗୁଡ଼ିକ ସୃଷ୍ଟି କରନ୍ତୁ echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env ``` ବିକାଶ ପାଇଁ ମୁଖ୍ୟ ଭେରିଏବଲ୍ଗୁଡ଼ିକ: | ଭେରିଏବଲ୍ | ବିକାଶ ଡିଫଲ୍ଟ | ବର୍ଣ୍ଣନା | | ---------------------- | ------------------------ | ------------------------ | | `PORT` | `20128` | ସର୍ଭର୍ ପୋର୍ଟ | | `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | ଫ୍ରଣ୍ଟଏଣ୍ଡ ପାଇଁ ବେସ୍ URL | | `JWT_SECRET` | (ଉପରେ ସୃଷ୍ଟି କରନ୍ତୁ) | JWT ସାଇନିଂ ସିକ୍ରେଟ୍ | | `INITIAL_PASSWORD` | `CHANGEME` | ପ୍ରଥମ ଲଗଇନ୍ ପାସୱାର୍ଡ | | `APP_LOG_LEVEL` | `info` | ଲଗ୍ ବିସ୍ତୃତତା ସ୍ତର | ### ଡ୍ୟାସବୋର୍ଡ ସେଟିଂସ୍ ଡ୍ୟାସବୋର୍ଡରେ ଏପରି ବୈଶିଷ୍ଟ୍ୟ ପାଇଁ UI ଟଗଲ୍ଗୁଡ଼ିକ ରହିଛି, ଯାହାକୁ ପରିବେଶ ଭେରିଏବଲ୍ ମାଧ୍ୟମରେ ମଧ୍ୟ ବିନ୍ୟାସ କରାଯାଇପାରେ: | ସେଟିଂ ସ୍ଥାନ | ଟଗଲ୍ | ବର୍ଣ୍ଣନା | | ------------------- | ------------------- | -------------------------------------- | | ସେଟିଂସ୍ → ଅଡଭାନ୍ସ୍ଡ | ଡିବଗ୍ ମୋଡ୍ | ଡିବଗ୍ ରିକ୍ୱେଷ୍ଟ ଲଗ୍ ସକ୍ରିୟ କରନ୍ତୁ (UI) | | ସେଟିଂସ୍ → ସାଧାରଣ | ସାଇଡବାର୍ ଦୃଶ୍ୟମାନତା | ସାଇଡବାର୍ ବିଭାଗଗୁଡ଼ିକ ଦେଖାନ୍ତୁ/ଲୁଚାନ୍ତୁ | ଏହି ସେଟିଂସ୍ଗୁଡ଼ିକ ଡାଟାବେସ୍ରେ ସଂରକ୍ଷିତ ହୁଏ ଏବଂ ପୁନଃଆରମ୍ଭ ପରେ ମଧ୍ୟ ରହିଥାଏ; ସେଗୁଡ଼ିକ ସେଟ୍ ହୋଇଥିଲେ env var ଡିଫଲ୍ଟଗୁଡ଼ିକୁ ଅତିକ୍ରମ କରେ। ### ସ୍ଥାନୀୟ ଭାବେ ଚଲାଇବା ```bash # ବିକାଶ ମୋଡ୍ (ହଟ୍ ରିଲୋଡ୍) npm run dev # ପ୍ରଡକ୍ସନ୍ ବିଲ୍ଡ npm run build # next build → .build/next/ ତାପରେ assembleStandalone → dist/ npm run start # ଯୋଗଦାନକାରୀ ପରିବର୍ତ୍ତନ ପାଇଁ ଦ୍ରୁତ ବ୍ୟାକଏଣ୍ଡ/API-କେବଳ କମ୍ପାଇଲ୍ npm run build:contributor # ରିଲିଜ୍ ବିଲ୍ଡ (ପରିଷ୍କାର ପୁନଃବିଲ୍ଡ + HEAD ସେଣ୍ଟିନେଲ୍ — ଡିପ୍ଲୟ ପାଇଁ ଆବଶ୍ୟକ) npm run build:release # rm -rf .build dist && build + dist/BUILD_SHA ଲେଖେ # ସାଧାରଣ ପୋର୍ଟ ବିନ୍ୟାସ PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev ``` ଯୋଗଦାନକାରୀ ବିଲ୍ଡ କେବଳ କମ୍ପାଇଲ୍-ଭିତ୍ତିକ ଯାଞ୍ଚ କରେ: ଏହା standalone ଡିଷ୍ଟ୍ରିବ୍ୟୁସନ୍ ଏକତ୍ର କରେ ନାହିଁ କିମ୍ବା ଐଚ୍ଛିକ ନେଟିଭ୍ ପ୍ୟାକେଜିଂ ଆସେଟ୍ଗୁଡ଼ିକୁ ବିଲ୍ଡ କରେ ନାହିଁ। ଯେତେବେଳେ ପଠାଯୋଗ୍ୟ ବଣ୍ଡଲ୍ ଯାଞ୍ଚ କରିବାକୁ ଆବଶ୍ୟକ ହୁଏ, ସାଧାରଣ ପ୍ରଡକ୍ସନ୍ ବିଲ୍ଡ ବ୍ୟବହାର କରନ୍ତୁ। ### ବିଲ୍ଡ ଆଉଟପୁଟ୍ ଲେଆଉଟ୍ | ଡିରେକ୍ଟୋରୀ | ବିଷୟବସ୍ତୁ | ଟ୍ରାକ୍ କରାଯାଇଛି | | ---------- | ------------------------------------------------------------------------------ | --------------- | | `src/` | ଆପ୍ଲିକେସନ୍ ସୋର୍ସ (TypeScript / TSX) | ହଁ | | `.build/` | ମଧ୍ୟବର୍ତ୍ତୀଗୁଡ଼ିକ — `next build` ଆଉଟପୁଟ୍ (gitignored, `distDir = .build/next`) | ନା | | `dist/` | ପଠାଯୋଗ୍ୟ ବଣ୍ଡଲ୍ — `assembleStandalone` ଦ୍ୱାରା ଏକତ୍ରିତ (gitignored) | ନା | ବିଲ୍ଡ ପାଇପଲାଇନ୍ ଏକକ ପାସ୍ରେ ଚାଲେ: ``` npm run build └─ next build → .build/next/standalone (Next.js output) └─ assembleStandalone() (copies standalone + static + public + native assets) └─ output: dist/ (server.js, .next/static/, public/, node_modules/) ``` `npm run build:release` ଅତିରିକ୍ତ ଭାବେ ପ୍ରଥମେ ଉଭୟ ଡିରେକ୍ଟୋରୀକୁ ପରିଷ୍କାର କରେ ଏବଂ ଡିପ୍ଲୟ ଇଣ୍ଟେଗ୍ରିଟି ସେଣ୍ଟିନେଲ୍ ଭାବେ `dist/BUILD_SHA` (= `git rev-parse --short HEAD`) ଲେଖେ। `npm run build:contributor` ବ୍ୟାକଏଣ୍ଡ-କେବଳ ବିଲ୍ଡ ପ୍ରୋଫାଇଲ୍ ବ୍ୟବହାର କରେ। ବିଲ୍ଡ ସମୟରେ ଏହା ଡ୍ୟାସବୋର୍ଡ UI ଫାଇଲ୍ଗୁଡ଼ିକୁ ସାମୟିକ ଭାବେ ଷ୍ଟବ୍ କରେ, API ରୁଟ୍ ହ୍ୟାଣ୍ଡଲର୍ଗୁଡ଼ିକୁ ରଖେ ଏବଂ ବିଲ୍ଡ ପରେ ମୂଳ ଫାଇଲ୍ଗୁଡ଼ିକୁ ପୁନଃସ୍ଥାପନ କରେ। ଡ୍ୟାସବୋର୍ଡ UI ପ୍ରଭାବିତ କରୁଥିବା ପରିବର୍ତ୍ତନ ପାଇଁ କିମ୍ବା ସମ୍ପୂର୍ଣ୍ଣ ରିଲିଜ୍ ଯାଞ୍ଚ ପାଇଁ `npm run build` ବ୍ୟବହାର କରନ୍ତୁ; ଯୋଗଦାନକାରୀ ପ୍ରୋଫାଇଲ୍ ରିଲିଜ୍ ବିଲ୍ଡର ପରିବର୍ତ୍ତେ ବ୍ୟବହାରଯୋଗ୍ୟ ନୁହେଁ। > **VPS ଡିପ୍ଲୟ ଟିପ୍ପଣୀ:** ରିମୋଟ୍ ଇମେଜ୍ ଡିରେକ୍ଟୋରୀ `/usr/lib/node_modules/omniroute/app/` > ଅପରିବର୍ତ୍ତିତ ରହେ। ଡିପ୍ଲୟ ସ୍କିଲ୍ଗୁଡ଼ିକ `dist/` ର ବିଷୟବସ୍ତୁକୁ ଏଥିରେ rsync କରେ। > କେବଳ ରିପୋଜିଟୋରୀ ଭିତରର ବିଲ୍ଡ ଆଉଟପୁଟ୍ ପଥ ବଦଳିଛି (`app/` → `dist/`)। ଡିଫଲ୍ଟ URLଗୁଡ଼ିକ: - **ଡ୍ୟାସବୋର୍ଡ**: `http://localhost:20128/dashboard` - **API**: `http://localhost:20128/v1` --- ## Git କାର୍ଯ୍ୟପ୍ରବାହ > ⚠️ **କେବେବି ସିଧାସଳଖ `main`କୁ commit କରନ୍ତୁ ନାହିଁ।** ସର୍ବଦା feature branch ବ୍ୟବହାର କରନ୍ତୁ। > > **PR ଆଧାର:** ସକ୍ରିୟ `release/vX.Y.Z` branchକୁ target କରନ୍ତୁ (`main`କୁ ନୁହେଁ)। ପ୍ରତ୍ୟେକ branch ପାଇଁ release + ship ସମୟରେ tag ମଡେଲ୍ ବିଷୟରେ > [`docs/ops/BRANCHING_MODEL.md`](docs/ops/BRANCHING_MODEL.md) ଦେଖନ୍ତୁ। ```bash # ସକ୍ରିୟ releaseର ଶେଷ tipରୁ branch ତିଆରି କରନ୍ତୁ (ଉଦାହରଣ: release/v3.8.49) git fetch origin git checkout -b feat/your-feature-name origin/release/v3.8.49 # ... ପରିବର୍ତ୍ତନ କରନ୍ତୁ ... git commit -m "feat: describe your change" git push -u origin feat/your-feature-name # base = release/v3.8.49 ସହିତ ଏକ Pull Request ଖୋଲନ୍ତୁ ``` ### Branch ନାମକରଣ | Prefix | ଉଦ୍ଦେଶ୍ୟ | | ----------- | ------------------------ | | `feat/` | ନୂତନ feature | | `fix/` | Bug ସମାଧାନ | | `refactor/` | Code ପୁନର୍ଗଠନ | | `docs/` | Documentation ପରିବର୍ତ୍ତନ | | `test/` | Test ଯୋଗ/ସମାଧାନ | | `chore/` | Tooling, CI, dependency | ### Commit ବାର୍ତ୍ତା [Conventional Commits](https://www.conventionalcommits.org/) ଅନୁସରଣ କରନ୍ତୁ: ``` feat: provider call ପାଇଁ circuit breaker ଯୋଗ କରନ୍ତୁ fix: JWT secret validationର edge case ସମାଧାନ କରନ୍ତୁ docs: PII ସୁରକ୍ଷା ସହିତ SECURITY.md ଅଦ୍ୟତନ କରନ୍ତୁ test: observability unit test ଯୋଗ କରନ୍ତୁ refactor(db): rate limit tableଗୁଡ଼ିକୁ ଏକତ୍ର କରନ୍ତୁ ``` Scopeଗୁଡ଼ିକ (v3.8): `db`, `sse`, `oauth`, `dashboard`, `api`, `cli`, `docker`, `ci`, `mcp`, `a2a`, `memory`, `skills`, `cloud-agent`, `guardrails`, `compression`, `auto-combo`, `resilience`, `providers`, `executors`, `translator`, `domain`, `authz`। --- ## ପରୀକ୍ଷାଗୁଡ଼ିକ ଚଲାଇବା ```bash # ସମସ୍ତ ପରୀକ୍ଷା (unit + vitest + ecosystem + e2e) npm run test:all # ଏକକ ପରୀକ୍ଷା ଫାଇଲ୍ (Node.js ନେଟିଭ୍ ପରୀକ୍ଷା ରନର୍ — ଅଧିକାଂଶ ପରୀକ୍ଷା ଏହାକୁ ବ୍ୟବହାର କରେ) node --import tsx/esm --test tests/unit/your-file.test.ts # କେବଳ ଆପଣଙ୍କ ପରିବର୍ତ୍ତନ ଦ୍ୱାରା ପ୍ରଭାବିତ unit ପରୀକ୍ଷାଗୁଡ଼ିକ (CI ଗେଟ୍ ସହିତ ସମାନ TIA ସିଲେକ୍ଟର୍, #8084) npm run test:scoped # ଶେଷ commitରେ (କିମ୍ବା working treeରେ) ହୋଇଥିବା ପରିବର୍ତ୍ତନ npm run test:scoped:staged # କେବଳ staged ପରିବର୍ତ୍ତନଗୁଡ଼ିକ — pre-commit ରନ୍ ସହିତ ଭଲ ଭାବେ କାମ କରେ npm run test:scoped:full # ପ୍ରଥମେ import-graph ମ୍ୟାପ୍ ପୁନଃନିର୍ମାଣ କରେ (ଫାଇଲ୍ ଯୋଡ଼ିବା/ସ୍ଥାନାନ୍ତର କରିବା ପରେ) # Exit 1 + "ସମ୍ପୂର୍ଣ୍ଣ suite ଚଲାନ୍ତୁ"ର ଅର୍ଥ ହେଉଛି ଗୋଟିଏ hub ଫାଇଲ୍ (tsconfig, package.json, …) କିମ୍ବା # ମ୍ୟାପ୍ ହୋଇନଥିବା source ପରିବର୍ତ୍ତିତ ହୋଇଛି — ସିଲେକ୍ଟର୍ ନିରାପଦ ଭାବେ ବିଫଳ ହୁଏ, ଏହା କେବେ ମଧ୍ୟ ନିରବରେ ଛାଡ଼ି ଦିଏ ନାହିଁ। # Vitest (MCP server, autoCombo, cache) npm run test:vitest # E2E ପରୀକ୍ଷାଗୁଡ଼ିକ (Playwright ଆବଶ୍ୟକ) npm run test:e2e # Protocol clients E2E (MCP transports, A2A) npm run test:protocols:e2e # Ecosystem ସୁସଙ୍ଗତତା ପରୀକ୍ଷାଗୁଡ଼ିକ npm run test:ecosystem # Coverage ଗେଟ୍: statements/lines/functions/branches ପାଇଁ 60% npm run test:coverage npm run coverage:report # Lint + format ଯାଞ୍ଚ npm run lint npm run check # ଗେଟ୍ କରାଯାଇଥିବା ପ୍ରକୃତ-upstream combo smoke (VPS ପ୍ରବେଶ + ପ୍ରକୃତ provider credits ଆବଶ୍ୟକ) # ପ୍ରକୃତ providersକୁ ଅନୁରୋଧ ପଠାଏ — ଅଳ୍ପ ଖର୍ଚ୍ଚ ହୁଏ। CIରେ କେବେ ମଧ୍ୟ ଚାଲେ ନାହିଁ। ଗେଟ୍ ନଥିଲେ ସ୍ୱଚ୍ଛ ଭାବେ ଛାଡ଼ିଦିଏ। # ଆବଶ୍ୟକ: ssh root@192.168.0.15 ପ୍ରବେଶ (VPSରୁ ଗୋଟିଏ read-only DB snapshot source କରେ)। RUN_COMBO_LIVE=1 npm run test:combo:live # Phase-3 VPS live smoke — ସାଧାରଣ Node ESM scripts, live .15 serverକୁ ସିଧାସଳଖ ଅନୁରୋଧ ପଠାଏ। # ଆବଶ୍ୟକ: ssh root@192.168.0.15 ପ୍ରବେଶ (SSH sqlite ମାଧ୍ୟମରେ combos ସୃଷ୍ଟି/ବିଲୋପ କରାଯାଏ)। # ପ୍ରକୃତ providersକୁ ଅନୁରୋଧ ପଠାଏ (ଅଳ୍ପ ଖର୍ଚ୍ଚ)। କେବଳ __live_test__* combos ସୃଷ୍ଟି/ବିଲୋପ କରେ। CIରେ କେବେ ମଧ୍ୟ ଚାଲେ ନାହିଁ। # .15ରେ REQUIRE_API_KEY=false, ତେଣୁ API key ଆବଶ୍ୟକ ନାହିଁ, କିନ୍ତୁ ସେଟ୍ ହୋଇଥିଲେ COMBO_LIVE_BASE_URL / COMBO_LIVE_API_KEYକୁ ସମ୍ମାନ କରେ। npm run test:combo:live:vps # 7ଟି HTTP ପରିଦୃଶ୍ୟ (priority/round-robin/weighted/cost/fusion/auto + health) npm run test:combo:live:vps:failover # ଏକ ପ୍ରକୃତ cross-provider failover ପରିଦୃଶ୍ୟ ଯୋଡ଼େ (ମୋଟ 8ଟି) ``` Coverage ସମ୍ବନ୍ଧୀୟ ଟିପ୍ପଣୀ: - `npm run test:coverage` ମୁଖ୍ୟ unit test suite ପାଇଁ source coverage ମାପେ, `tests/**`କୁ ବାଦ ଦିଏ ଏବଂ `open-sse/**`କୁ ଅନ୍ତର୍ଭୁକ୍ତ କରେ - Pull requestsଗୁଡ଼ିକୁ statements/lines/functions/branches ପାଇଁ coverage ଗେଟ୍ **60%+**ରେ ରଖିବାକୁ ହେବ - ଯଦି କୌଣସି PR `src/`, `open-sse/`, `electron/`, କିମ୍ବା `bin/`ରେ production code ପରିବର୍ତ୍ତନ କରେ, ତେବେ ସେହି PRରେ automated tests ଯୋଡ଼ିବା କିମ୍ବା ଅଦ୍ୟତନ କରିବା ଆବଶ୍ୟକ - `npm run coverage:report` ସର୍ବଶେଷ coverage runରୁ ବିସ୍ତୃତ file-by-file report ପ୍ରିଣ୍ଟ କରେ - `npm run test:coverage:legacy` ଐତିହାସିକ ତୁଳନା ପାଇଁ ପୁରୁଣା metricକୁ ସଂରକ୍ଷିତ ରଖେ - ପର୍ଯ୍ୟାୟକ୍ରମିକ coverage ଉନ୍ନତି roadmap ପାଇଁ `docs/ops/COVERAGE_PLAN.md` ଦେଖନ୍ତୁ ### Pull Request ଆବଶ୍ୟକତାଗୁଡ଼ିକ ଗୋଟିଏ PR ଖୋଲିବା ପୂର୍ବରୁ, ଆପଣ ଯାହା ପରିବର୍ତ୍ତନ କରିଛନ୍ତି ତାହା ପାଇଁ କେନ୍ଦ୍ରିତ loop ଚଲାଇବାକୁ [Contribution Golden Path](docs/ops/CONTRIBUTION_GOLDEN_PATH.md) ବ୍ୟବହାର କରନ୍ତୁ। ସମ୍ପୂର୍ଣ୍ଣ unit suite (4ଟି CI shards), Vitest, **60%+** coverage ଗେଟ୍, ଏବଂ production build ହେଉଛି CIର ଦାୟିତ୍ୱ — ସେଗୁଡ଼ିକୁ ସ୍ଥାନୀୟ ଭାବେ ଚଲାଇଲେ PR ଯାଞ୍ଚଗୁଡ଼ିକ ପୂର୍ବରୁ ଦେଉନଥିବା କୌଣସି ଅତିରିକ୍ତ ସଙ୍କେତ ମିଳେ ନାହିଁ, ଏବଂ ଛୋଟ machineଗୁଡ଼ିକରେ ଏହା hostକୁ ସନ୍ତୃପ୍ତ କରିପାରେ (#8084): - ଆପଣଙ୍କ ପରିବର୍ତ୍ତନକୁ cover କରୁଥିବା test files ଚଲାନ୍ତୁ: `node --import tsx/esm --test tests/unit/.test.ts` - `npm run lint` ଚଲାନ୍ତୁ - production code ପରିବର୍ତ୍ତିତ ହେଲେ ସେହି PRରେ automated tests ଅନ୍ତର୍ଭୁକ୍ତ କିମ୍ବା ଅଦ୍ୟତନ କରନ୍ତୁ - `node:test` ଫାଇଲ୍ଗୁଡ଼ିକରେ, ପ୍ରତ୍ୟେକ top-level `await` (ଯେପରିକି `await import(...)`)କୁ ପ୍ରଥମ `test()` / `describe()` ପୂର୍ବରୁ ରଖନ୍ତୁ: `--test-force-exit` ଅଧୀନରେ, ଏହା ପରେ register ହୋଇଥିବା tests କେବେ ମଧ୍ୟ ନିରବରେ ଚାଲିନପାରେ (#18045; `npm run check:test-tla-order` ଦ୍ୱାରା ବାଧ୍ୟତାମୂଳକ) - production code ପରିବର୍ତ୍ତିତ ହେଲେ PR ବର୍ଣ୍ଣନାରେ ପରିବର୍ତ୍ତିତ କିମ୍ବା ଯୋଡ଼ାଯାଇଥିବା test files ଅନ୍ତର୍ଭୁକ୍ତ କରନ୍ତୁ - CIରେ project secrets configure ହୋଇଥିଲେ PRରେ SonarQube ଫଳାଫଳ ଯାଞ୍ଚ କରନ୍ତୁ ବର୍ତ୍ତମାନର test ସ୍ଥିତି: **122ଟି unit test files**, ଯାହା ନିମ୍ନଲିଖିତକୁ cover କରେ: - Provider translators ଏବଂ format conversion - Rate limiting, circuit breaker, ଏବଂ resilience - Semantic cache, idempotency, progress tracking - Database operations ଏବଂ schema (21ଟି DB modules) - OAuth flows ଏବଂ authentication - API endpoint validation (Zod v4) - MCP server tools ଏବଂ scope enforcement - Memory ଏବଂ Skills systems --- ## କୋଡ୍ ଶୈଳୀ - **ESLint** — କମିଟ୍ କରିବା ପୂର୍ବରୁ `npm run lint` ଚଲାନ୍ତୁ - **Prettier** — କମିଟ୍ ସମୟରେ `lint-staged` ମାଧ୍ୟମରେ ସ୍ୱୟଂଚାଳିତ ଭାବେ ଫର୍ମାଟ୍ ହୁଏ (2ଟି ସ୍ପେସ୍, ସେମିକୋଲନ୍, ଡବଲ୍ କୋଟ୍, 100 ଅକ୍ଷର ପ୍ରସ୍ଥ, es5 ଟ୍ରେଲିଂ କମା) - **TypeScript** — ସମସ୍ତ `src/` କୋଡ୍ `.ts`/`.tsx` ବ୍ୟବହାର କରେ; `open-sse/` `.ts`/`.js` ବ୍ୟବହାର କରେ; TSDoc (`@param`, `@returns`, `@throws`) ସହିତ ଡକ୍ୟୁମେଣ୍ଟ୍ କରନ୍ତୁ - **`eval()` ନାହିଁ** — ESLint `no-eval`, `no-implied-eval`, `no-new-func`କୁ ବାଧ୍ୟତାମୂଳକ କରେ - **Zod ବୈଧତା ଯାଞ୍ଚ** — ସମସ୍ତ API ଇନପୁଟ୍ ବୈଧତା ଯାଞ୍ଚ ପାଇଁ Zod v4 ସ୍କିମା ବ୍ୟବହାର କରନ୍ତୁ - **ନାମକରଣ**: ଫାଇଲ୍ = camelCase/kebab-case, କମ୍ପୋନେଣ୍ଟ୍ = PascalCase, କନଷ୍ଟାଣ୍ଟ୍ = UPPER_SNAKE ### ତ୍ରୁଟି ପରିଚାଳନା / ଖାଲି catch ବ୍ଲକ୍ କୌଣସି `catch`କୁ ବ୍ୟାଖ୍ୟା ବିନା କେବେ ମଧ୍ୟ ଛାଡ଼ନ୍ତୁ ନାହିଁ। ଏହାକୁ ଦୁଇଟି ଶ୍ରେଣୀ ମଧ୍ୟରୁ ଗୋଟିଏରେ ବର୍ଗୀକୃତ କରନ୍ତୁ (ଏହା "SSE ଷ୍ଟ୍ରିମ୍ରେ କେବେ ମଧ୍ୟ ନିରବରେ ତ୍ରୁଟିଗୁଡ଼ିକୁ ଅଣଦେଖା କରନ୍ତୁ ନାହିଁ" କଠୋର ନିୟମକୁ କାର୍ଯ୍ୟକାରୀ କରେ): - **ଉଦ୍ଦେଶ୍ୟମୂଳକ (ଆମର ନିଜସ୍ୱ ସର୍ବୋତ୍ତମ-ପ୍ରୟାସ କ୍ଲିନଅପ୍/ଟେଲିମେଟ୍ରି)** — ଏଠାରେ ବିଫଳତା ଆଶାକରାଯାଏ ଏବଂ କ୍ଷତିହୀନ; ଗୋଟିଏ ଧାଡ଼ିରେ କାରଣ ସୂଚକ କମେଣ୍ଟ୍ ଯୋଡ଼ନ୍ତୁ, କୌଣସି ଲଗିଂ କରନ୍ତୁ ନାହିଁ (ପ୍ରତ୍ୟେକ ଅନୁରୋଧରେ ଲଗିଂ କରିବାରୁ ସୃଷ୍ଟି ହେଉଥିବା ଅନାବଶ୍ୟକ କୋଳାହଳକୁ ଏହି ପ୍ରଥା ଏଡ଼ାଇଥାଏ)। ```ts } catch {} // କ୍ଲାଏଣ୍ଟ୍ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହେବା ପରେ ପୂର୍ବରୁ ବନ୍ଦ ଥିବା କଣ୍ଟ୍ରୋଲର୍କୁ ବନ୍ଦ କରିବା ଆଶାକରାଯାଏ ``` - **ଲଗ୍ କରିବା ଉଚିତ (ବାହ୍ୟ/କଲର୍-ଯୋଗାଇଥିବା କୋଡ୍, କିମ୍ବା ଅଣଦେଖା କରିବା ଦ୍ୱାରା ନିୟନ୍ତ୍ରଣ ପ୍ରବାହ ପରିବର୍ତ୍ତିତ ହେଲେ)** — `catch`କୁ ରଖନ୍ତୁ (ଏହାକୁ କେବେ ମଧ୍ୟ ଷ୍ଟ୍ରିମ୍କୁ ଭଙ୍ଗ କରିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ), କିନ୍ତୁ ଏକ ପ୍ରସଙ୍ଗଯୁକ୍ତ `console.debug`/`warn` ନିର୍ଗତ କରନ୍ତୁ, ଯାହାଦ୍ୱାରା ବିଫଳତା ଚିହ୍ନଟ କରାଯାଇପାରିବ। ```ts } catch (e) { console.debug("[STREAM] onFailure କଲ୍ବ୍ୟାକ୍ ତ୍ରୁଟି:", e); } ``` ପ୍ରୟୋଗ ହୋଇଥିବା ଉଦାହରଣଗୁଡ଼ିକ ପାଇଁ `open-sse/utils/stream.ts` ଏବଂ `open-sse/utils/streamHandler.ts` ଦେଖନ୍ତୁ। --- ## ପ୍ରକଳ୍ପ ଗଠନ ``` src/ # TypeScript (.ts / .tsx) ├── app/ # Next.js 16 App Router │ ├── (dashboard)/ # ଡ୍ୟାସବୋର୍ଡ ପୃଷ୍ଠାଗୁଡ଼ିକ (23ଟି ବିଭାଗ) │ ├── api/ # API ରୁଟ୍ଗୁଡ଼ିକ (51ଟି ଡିରେକ୍ଟୋରୀ) │ └── login/ # ପ୍ରାମାଣିକରଣ ପୃଷ୍ଠାଗୁଡ଼ିକ (.tsx) ├── domain/ # ପଲିସି ଇଞ୍ଜିନ୍ (policyEngine, comboResolver, costRules, ଇତ୍ୟାଦି) ├── lib/ # ମୂଳ ବ୍ୟବସାୟିକ ତର୍କ (.ts) │ ├── a2a/ # Agent-to-Agent v0.3 ପ୍ରୋଟୋକଲ୍ ସର୍ଭର୍ │ ├── acp/ # Agent Communication Protocol ରେଜିଷ୍ଟ୍ରି │ ├── compliance/ # ଅନୁପାଳନ ପଲିସି ଇଞ୍ଜିନ୍ │ ├── db/ # SQLite ଡୋମେନ୍ ମଡ୍ୟୁଲ୍ଗୁଡ଼ିକ + 130ଟି ମାଇଗ୍ରେସନ୍ │ ├── memory/ # ସ୍ଥାୟୀ କଥୋପକଥନ ସ୍ମୃତି │ ├── oauth/ # OAuth ପ୍ରଦାତା, ସେବା ଏବଂ ଉପଯୋଗିତାଗୁଡ଼ିକ │ ├── skills/ # ବିସ୍ତାରଯୋଗ୍ୟ ଦକ୍ଷତା ଫ୍ରେମୱାର୍କ │ ├── usage/ # ବ୍ୟବହାର ଟ୍ରାକିଂ ଏବଂ ଖର୍ଚ୍ଚ ଗଣନା │ └── localDb.ts # କେବଳ ପୁନଃ-ରପ୍ତାନି ସ୍ତର — ଏଠାରେ କେବେବି ତର୍କ ଯୋଡ଼ନ୍ତୁ ନାହିଁ ├── middleware/ # ଅନୁରୋଧ ମିଡଲୱେର୍ (promptInjectionGuard) ├── mitm/ # MITM ପ୍ରକ୍ସି (ସାର୍ଟିଫିକେଟ୍, DNS, ଲକ୍ଷ୍ୟ ରାଉଟିଂ) ├── shared/ │ ├── components/ # React କମ୍ପୋନେଣ୍ଟଗୁଡ଼ିକ (.tsx) │ ├── constants/ # ପ୍ରଦାତା ସଂଜ୍ଞାଗୁଡ଼ିକ (329), MCP ସ୍କୋପ୍ଗୁଡ଼ିକ, 20ଟି ରାଉଟିଂ କୌଶଳ │ ├── utils/ # ସର୍କିଟ୍ ବ୍ରେକର୍, ସାନିଟାଇଜର୍, ପ୍ରାମାଣିକରଣ ସହାୟକ │ └── validation/ # Zod v4 ସ୍କିମାଗୁଡ଼ିକ └── sse/ # SSE ପ୍ରକ୍ସି ପାଇପଲାଇନ୍ open-sse/ # @omniroute/open-sse ୱର୍କସ୍ପେସ୍ ├── executors/ # 150ଟି ଏକ୍ସିକ୍ୟୁଟର୍ ମଡ୍ୟୁଲ୍ (ଏକ୍ସିକ୍ୟୁଟର୍ କ୍ଲାସ୍ + ପ୍ରତି-ପ୍ରଦାତା ସହାୟକ) ├── handlers/ # 11ଟି ଅନୁରୋଧ ହ୍ୟାଣ୍ଡଲର୍ (ଚାଟ୍, ପ୍ରତିକ୍ରିୟା, ଏମ୍ବେଡିଂ, ପ୍ରତିଛବି, ଇତ୍ୟାଦି) ├── mcp-server/ # MCP ସର୍ଭର୍ (110ଟି ଅନନ୍ୟ ଟୁଲ୍, 3ଟି ଟ୍ରାନ୍ସପୋର୍ଟ, 33ଟି ସ୍କୋପ୍) ├── services/ # 178ଟି ଶୀର୍ଷ-ସ୍ତରୀୟ ସେବା (combo, autoCombo, rateLimitManager, ଇତ୍ୟାଦି) ├── translator/ # ଫର୍ମାଟ୍ ଅନୁବାଦକଗୁଡ଼ିକ (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama) ├── transformer/ # Responses API ରୂପାନ୍ତରକ └── utils/ # 22ଟି ଉପଯୋଗିତା ମଡ୍ୟୁଲ୍ (ଷ୍ଟ୍ରିମ୍, TLS, ପ୍ରକ୍ସି, ଲଗିଂ) electron/ # Electron ଡେସ୍କଟପ୍ ଆପ୍ (ବହୁ-ପ୍ଲାଟଫର୍ମ) tests/ ├── unit/ # Node.js ପରୀକ୍ଷା ରନର୍ (1,574ଟି ପରୀକ୍ଷା ଫାଇଲ୍) ├── integration/ # ଇଣ୍ଟିଗ୍ରେସନ୍ ପରୀକ୍ଷାଗୁଡ଼ିକ ├── e2e/ # Playwright ପରୀକ୍ଷାଗୁଡ଼ିକ ├── security/ # ସୁରକ୍ଷା ପରୀକ୍ଷାଗୁଡ଼ିକ ├── translator/ # ଅନୁବାଦକ-ନିର୍ଦ୍ଦିଷ୍ଟ ପରୀକ୍ଷାଗୁଡ଼ିକ └── load/ # ଲୋଡ୍ ପରୀକ୍ଷାଗୁଡ଼ିକ docs/ ├── adr/ # ସ୍ଥାପତ୍ୟ ନିଷ୍ପତ୍ତି ରେକର୍ଡଗୁଡ଼ିକ ├── architecture/ # ସିଷ୍ଟମ୍ ସ୍ଥାପତ୍ୟ ଏବଂ ସ୍ଥିତିସ୍ଥାପକତା ├── comparison/ # OmniRoute ବନାମ ବିକଳ୍ପଗୁଡ଼ିକ ├── compression/ # ସଙ୍କୋଚନ ମାର୍ଗଦର୍ଶିକା ଏବଂ ନିୟମଗୁଡ଼ିକ ├── dev/ # ବିକାଶ ମାର୍ଗଦର୍ଶିକାଗୁଡ଼ିକ ├── diagrams/ # ସ୍ଥାପତ୍ୟ ଚିତ୍ରଗୁଡ଼ିକ ├── frameworks/ # MCP, A2A, OpenCode, Memory, Skills ├── guides/ # ବ୍ୟବହାରକାରୀ ମାର୍ଗଦର୍ଶିକା, Docker, ସେଟଅପ୍, ସମସ୍ୟା ସମାଧାନ ├── i18n/ # ଆନ୍ତର୍ଜାତୀୟକୃତ README ଅନୁବାଦଗୁଡ଼ିକ ├── marketing/ # ବିପଣନ ସାମଗ୍ରୀ ├── ops/ # ନିୟୋଜନ, ପ୍ରକ୍ସି, କଭରେଜ୍, ରିଲିଜ୍ ├── providers/ # ପ୍ରଦାତା-ନିର୍ଦ୍ଦିଷ୍ଟ ଡକ୍ୟୁମେଣ୍ଟେସନ୍ ├── reference/ # API ସନ୍ଦର୍ଭ, ପରିବେଶ ଭେରିଏବଲ୍, CLI ଟୁଲ୍, ମାଗଣା ସ୍ତର ├── releases/ # ରିଲିଜ୍ ଟିପ୍ପଣୀ ├── routing/ # ଅଟୋ-କମ୍ବୋ ଇଞ୍ଜିନ୍, ତର୍କ ପୁନଃଚାଳନ ├── screenshots/ # ଡ୍ୟାସବୋର୍ଡ ସ୍କ୍ରିନ୍ଶଟ୍ଗୁଡ଼ିକ ├── security/ # ସୁରକ୍ଷା ବ୍ୟବସ୍ଥା, ଅନୁପାଳନ, ଗୋପନୀୟତା, ଟୋକେନ୍ └── specs/ # ଡିଜାଇନ୍ ବିବରଣୀ ``` --- ## ଏକ ନୂତନ ପ୍ରଦାତା ଯୋଡ଼ିବା ### ପଦକ୍ଷେପ 1: ପ୍ରଦାତା ସ୍ଥିରାଙ୍କଗୁଡ଼ିକ ପଞ୍ଜୀକରଣ କରନ୍ତୁ `src/shared/constants/providers.ts`ରେ ଯୋଡ଼ନ୍ତୁ — ମଡ୍ୟୁଲ୍ ଲୋଡ୍ ସମୟରେ Zod ଦ୍ୱାରା ବୈଧତା ଯାଞ୍ଚ କରାଯାଏ। ### ପଦକ୍ଷେପ 2: ଏକ୍ସିକ୍ୟୁଟର୍ ଯୋଡ଼ନ୍ତୁ (ଯଦି କଷ୍ଟମ୍ ଲଜିକ୍ ଆବଶ୍ୟକ) ମୂଳ ଏକ୍ସିକ୍ୟୁଟର୍କୁ ବିସ୍ତାର କରି `open-sse/executors/your-provider.ts`ରେ ଏକ୍ସିକ୍ୟୁଟର୍ ତିଆରି କରନ୍ତୁ। ### ପଦକ୍ଷେପ 3: ଅନୁବାଦକ ଯୋଡ଼ନ୍ତୁ (ଯଦି ଫର୍ମାଟ୍ OpenAI ନୁହେଁ) `open-sse/translator/`ରେ ଅନୁରୋଧ/ପ୍ରତିକ୍ରିୟା ଅନୁବାଦକ ତିଆରି କରନ୍ତୁ। ### ପଦକ୍ଷେପ 4: OAuth କନ୍ଫିଗ୍ ଯୋଡ଼ନ୍ତୁ (ଯଦି OAuth-ଆଧାରିତ) `src/lib/oauth/constants/oauth.ts`ରେ OAuth ପରିଚୟପତ୍ର ଏବଂ `src/lib/oauth/services/`ରେ ସେବା ଯୋଡ଼ନ୍ତୁ। ଯଦି ଅପ୍ଷ୍ଟ୍ରିମ୍ ପ୍ରଦାତା ନିଜର ସାର୍ବଜନୀନ CLI / ବ୍ରାଉଜର୍ ବଣ୍ଡଲ୍ ଭିତରେ ଏକ ସାର୍ବଜନୀନ OAuth client_id/ଗୁପ୍ତ ତଥ୍ୟ କିମ୍ବା Firebase Web API କୀ ବିତରଣ କରେ, ତେବେ ଏହାକୁ ଏକ ଷ୍ଟ୍ରିଙ୍ଗ୍ ଲିଟେରାଲ୍ ଭାବେ ଏମ୍ବେଡ୍ **କରନ୍ତୁ ନାହିଁ**। `open-sse/utils/publicCreds.ts`ରୁ `resolvePublicCred()` ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ `EMBEDDED_DEFAULTS`ରେ ଏକ ମାସ୍କ୍ କରାଯାଇଥିବା ବାଇଟ୍ ଏଣ୍ଟ୍ରି ଯୋଡ଼ନ୍ତୁ। ସମ୍ପୂର୍ଣ୍ଣ ବାଧ୍ୟତାମୂଳକ କାର୍ଯ୍ୟପ୍ରବାହ [`docs/security/PUBLIC_CREDS.md`](./docs/security/PUBLIC_CREDS.md)ରେ ଲିପିବଦ୍ଧ ହୋଇଛି। ହ୍ୟାଣ୍ଡଲର୍/ଏକ୍ସିକ୍ୟୁଟର୍ଗୁଡ଼ିକ ଭିତରେ, କ୍ଲାଏଣ୍ଟ୍କୁ ପହଞ୍ଚୁଥିବା ତ୍ରୁଟି ସନ୍ଦେଶଗୁଡ଼ିକ `open-sse/utils/error.ts`ର `buildErrorBody()` / `sanitizeErrorMessage()` ମାଧ୍ୟମରେ ଯିବା ଆବଶ୍ୟକ — କୌଣସି Response ବଡିରେ କଞ୍ଚା `err.stack` କିମ୍ବା `err.message` କେବେବି ରଖନ୍ତୁ ନାହିଁ। [`docs/security/ERROR_SANITIZATION.md`](./docs/security/ERROR_SANITIZATION.md) ଦେଖନ୍ତୁ। ### ପଦକ୍ଷେପ 5: ମଡେଲ୍ଗୁଡ଼ିକ ପଞ୍ଜୀକରଣ କରନ୍ତୁ `open-sse/config/providerRegistry.ts`ରେ ମଡେଲ୍ ସଂଜ୍ଞାଗୁଡ଼ିକ ଯୋଡ଼ନ୍ତୁ। ### ପଦକ୍ଷେପ 6: ପରୀକ୍ଷାଗୁଡ଼ିକ ଯୋଡ଼ନ୍ତୁ ଅତି କମ୍ରେ ନିମ୍ନଲିଖିତ ବିଷୟଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରି `tests/unit/`ରେ ୟୁନିଟ୍ ପରୀକ୍ଷା ଲେଖନ୍ତୁ: - ପ୍ରଦାତା ପଞ୍ଜୀକରଣ - ଅନୁରୋଧ/ପ୍ରତିକ୍ରିୟା ଅନୁବାଦ - ତ୍ରୁଟି ପରିଚାଳନା --- ## ପୁଲ୍ ରିକ୍ୱେଷ୍ଟ ଯାଞ୍ଚତାଲିକା - [ ] ପରୀକ୍ଷଣଗୁଡ଼ିକ ସଫଳ ହୋଇଛି (`npm test`) - [ ] ଲିଣ୍ଟିଂ ସଫଳ ହୋଇଛି (`npm run lint`) - [ ] ବିଲ୍ଡ ସଫଳ ହୋଇଛି (`npm run build`) - [ ] ନୂତନ ସାର୍ବଜନୀନ ଫଙ୍କସନ୍ ଏବଂ ଇଣ୍ଟରଫେସ୍ଗୁଡ଼ିକ ପାଇଁ TypeScript ଟାଇପ୍ ଯୋଡ଼ାଯାଇଛି - [ ] କୌଣସି ହାର୍ଡକୋଡ୍ କରାଯାଇଥିବା ସିକ୍ରେଟ୍ କିମ୍ବା ଫଲ୍ବ୍ୟାକ୍ ମୂଲ୍ୟ ନାହିଁ - [ ] ସାର୍ବଜନୀନ ଅପ୍ଷ୍ଟ୍ରିମ୍ କ୍ରେଡେନ୍ସିଆଲ୍ଗୁଡ଼ିକୁ `resolvePublicCred()` ମାଧ୍ୟମରେ ଏମ୍ବେଡ୍ କରାଯାଇଛି ([`docs/security/PUBLIC_CREDS.md`](./docs/security/PUBLIC_CREDS.md) ଦେଖନ୍ତୁ), କେବେବି ଲିଟେରାଲ୍ ଭାବରେ ନୁହେଁ - [ ] ତ୍ରୁଟି ପ୍ରତିକ୍ରିୟାଗୁଡ଼ିକ `buildErrorBody()` / `sanitizeErrorMessage()` ମାଧ୍ୟମରେ ରୁଟ୍ ହୋଇଛି — ପ୍ରତିକ୍ରିୟା ବଡିରେ କୌଣସି ଅପରିବର୍ତ୍ତିତ ଷ୍ଟାକ୍ ଟ୍ରେସ୍ ନାହିଁ ([`docs/security/ERROR_SANITIZATION.md`](./docs/security/ERROR_SANITIZATION.md) ଦେଖନ୍ତୁ) - [ ] ସେଲ୍ କମାଣ୍ଡଗୁଡ଼ିକ (`exec` / `spawn`) ଷ୍ଟ୍ରିଙ୍ଗ୍ ଇଣ୍ଟରପୋଲେସନ୍ ମାଧ୍ୟମରେ ନୁହେଁ, `env` ମାଧ୍ୟମରେ ରନ୍ଟାଇମ୍ ମୂଲ୍ୟ ପାସ୍ କରନ୍ତି - [ ] ସମସ୍ତ ଇନ୍ପୁଟ୍କୁ Zod ସ୍କିମା ସହିତ ବୈଧୀକରଣ କରାଯାଇଛି - [ ] ବ୍ୟବହାରକାରୀଙ୍କୁ ପ୍ରଭାବିତ କରୁଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ପାଇଁ `changelog.d/{features|fixes|maintenance}/-.md` ଅଧୀନରେ ଚେଞ୍ଜଲଗ୍ **ଫ୍ରାଗ୍ମେଣ୍ଟ୍** ଯୋଡ଼ାଯାଇଛି ([`changelog.d/README.md`](./changelog.d/README.md) ଦେଖନ୍ତୁ) — `CHANGELOG.md`କୁ ସିଧାସଳଖ ସମ୍ପାଦନା କରନ୍ତୁ **ନାହିଁ**; ରିଲିଜ୍ ସମୟରେ ଫ୍ରାଗ୍ମେଣ୍ଟ୍ଗୁଡ଼ିକୁ ଏକତ୍ର କରାଯାଏ ଏବଂ PRଗୁଡ଼ିକ ମଧ୍ୟରେ କେବେବି ଦ୍ୱନ୍ଦ୍ୱ ସୃଷ୍ଟି ହୁଏ ନାହିଁ - [ ] ଡକ୍ୟୁମେଣ୍ଟେସନ୍ ଅପଡେଟ୍ କରାଯାଇଛି (ଯଦି ପ୍ରଯୁଜ୍ୟ) - [ ] କୌଣସି ନୂତନ CodeQL / Secret-Scanning ସତର୍କତା ଖୋଲାଯାଇନାହିଁ, କିମ୍ବା ପ୍ରତ୍ୟେକଟିକୁ ସମ୍ପର୍କିତ `docs/security/` ଡକ୍ୟୁମେଣ୍ଟ୍ ଉଲ୍ଲେଖ କରୁଥିବା ବୈଷୟିକ ଯଥାର୍ଥତା ସହିତ ଖାରଜ କରାଯାଇଛି - [ ] ଚାଇଲ୍ଡ ପ୍ରୋସେସ୍ ସ୍ପନ୍ କରୁଥିବା ରୁଟ୍ଗୁଡ଼ିକ (`/api/mcp/`, `/api/cli-tools/runtime/`) `src/server/authz/routeGuard.ts`ରେ `isLocalOnlyPath()` ଭାବରେ ବର୍ଗୀକୃତ ହୋଇଛି — [କଠୋର ନିୟମ #15](docs/security/ROUTE_GUARD_TIERS.md) ଦେଖନ୍ତୁ - [ ] କମିଟ୍ ବାର୍ତ୍ତାଗୁଡ଼ିକରେ କୌଣସି AI/ବଟ୍ `Co-authored-by` ଟ୍ରେଲର୍ ନାହିଁ (କଠୋର ନିୟମ #16) — ଯେଉଁ ମାନବ ସହଯୋଗୀଙ୍କ କାର୍ଯ୍ୟ ପୁନଃବ୍ୟବହୃତ ହୋଇଛି, ସେମାନଙ୍କୁ ମାନକ `Co-authored-by: Name ` ଟ୍ରେଲର୍ ସହିତ ଶ୍ରେୟ ଦିଆଯାଇଛି --- ## ରିଲିଜ୍ କରିବା ରିଲିଜ୍ଗୁଡ଼ିକ `/generate-release` ୱର୍କଫ୍ଲୋ ମାଧ୍ୟମରେ ପରିଚାଳିତ ହୁଏ। ଏକ ନୂତନ GitHub Release ସୃଷ୍ଟି ହେଲେ, ପ୍ୟାକେଜ୍ଟି GitHub Actions ମାଧ୍ୟମରେ **ସ୍ୱୟଂଚାଳିତ ଭାବେ npm ରେ ପ୍ରକାଶିତ ହୁଏ**। VPS ଡିପ୍ଲୟମେଣ୍ଟ ପାଇଁ, `npm run build` ପରିବର୍ତ୍ତେ `npm run build:release` ବ୍ୟବହାର କରନ୍ତୁ — ଏହା ଏକ ସ୍ୱଚ୍ଛ ପୁନଃବିଲ୍ଡ କରେ, ବଣ୍ଡଲ୍କୁ `dist/` ମଧ୍ୟରେ ଏକତ୍ର କରେ ଏବଂ `dist/BUILD_SHA` ସେଣ୍ଟିନେଲ୍ ଲେଖେ। ତା’ପରେ `/deploy-vps-*-cc` ସ୍କିଲ୍ଗୁଡ଼ିକ ବ୍ୟବହାର କରନ୍ତୁ, ଯେଉଁଗୁଡ଼ିକ `dist/`କୁ ରିମୋଟ୍ `app/` ଡିରେକ୍ଟୋରୀ ସହିତ rsync କରେ। --- ## ସହାୟତା ପାଇବା - **ଆର୍କିଟେକ୍ଚର୍**: [`docs/architecture/ARCHITECTURE.md`](docs/architecture/ARCHITECTURE.md) ଦେଖନ୍ତୁ - **API ସନ୍ଦର୍ଭ**: [`docs/reference/API_REFERENCE.md`](docs/reference/API_REFERENCE.md) ଦେଖନ୍ତୁ - **ସୁରକ୍ଷା ଡକ୍ୟୁମେଣ୍ଟଗୁଡ଼ିକ**: [`docs/security/CLI_TOKEN.md`](docs/security/CLI_TOKEN.md), [`docs/security/ROUTE_GUARD_TIERS.md`](docs/security/ROUTE_GUARD_TIERS.md), [`docs/security/ERROR_SANITIZATION.md`](docs/security/ERROR_SANITIZATION.md), [`docs/security/PUBLIC_CREDS.md`](docs/security/PUBLIC_CREDS.md) - **ଅପରେସନ୍ସ ଡକ୍ୟୁମେଣ୍ଟଗୁଡ଼ିକ**: [`docs/ops/SQLITE_RUNTIME.md`](docs/ops/SQLITE_RUNTIME.md) - **ସମସ୍ୟାଗୁଡ଼ିକ**: [github.com/diegosouzapw/OmniRoute/issues](https://github.com/diegosouzapw/OmniRoute/issues)