# 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) · 🇮🇩 [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) · 🇮🇳 [or](../or/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)։ Այն մատակարարի, երթուղավորման, UI/UX-ի, i18n-ի, CLI-ի, տվյալների բազայի և կառուցման/տեղակայման փոփոխությունները կապում է դրանց պայմանագրերի, նպատակային թեստերի, CI ծածկույթի և համադրման քայլերի հետ։ --- ## Մշակման կարգավորում ### Նախապայմաններ - **Node.js** `>=22.22.2 <23`, կամ `>=24.0.0 <27` (խորհուրդ է տրվում՝ 24 LTS) - **npm** 10+ > **Windows՝ Node 24-ով.** օգտագործեք ընթացիկ 24 LTS patch թողարկումը (առնվազն 24.20.0)։ > Ավելի վաղ թողարկումները կարող են դադարեցնել աշխատանքը հաջողված թեստերից հետո, երբ `--test-force-exit`-ը փակում է > գործընթացը։ Node-ի [Windows libuv-ի ուղղումը](https://github.com/nodejs/node/pull/61999) լուծում է > այս runtime-ի խափանումը․ մի անջատեք թեստերի assertion-ները և runner-ի ելքի ստուգումները։ > **npm v11+ օգտվողներ (Node 24+).** `npm install`-ից հետո ստուգեք՝ արդյոք native մոդուլները տեղադրվել են․ > `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` | Frontend-ի հիմնական URL | | `JWT_SECRET` | (ստեղծել վերևում) | JWT ստորագրման գաղտնիք | | `INITIAL_PASSWORD` | `CHANGEME` | Առաջին մուտքի գաղտնաբառ | | `APP_LOG_LEVEL` | `info` | Մատյանների մանրամասնության մակարդակ | ### Կառավարման վահանակի կարգավորումներ Կառավարման վահանակը տրամադրում է հնարավորությունների համար UI անջատիչներ, որոնք կարող են նաև կարգավորվել շրջակա միջավայրի փոփոխականների միջոցով։ | Կարգավորման տեղադրություն | Անջատիչ | Նկարագրություն | | ------------------------- | ------------------ | ------------------------------------------------ | | Settings → Advanced | Debug Mode | Միացնել վրիպազերծման հարցումների մատյանները (UI) | | Settings → General | Sidebar Visibility | Ցուցադրել/թաքցնել կողագոտու բաժինները | Այս կարգավորումները պահվում են տվյալների բազայում և պահպանվում են վերագործարկումներից հետո՝ սահմանվելու դեպքում փոխարինելով env փոփոխականների լռելյայն արժեքները։ ### Տեղային գործարկում ```bash # Մշակման ռեժիմ (թեժ վերաբեռնում) npm run dev # Արտադրական կառուցում npm run build # next build → .build/next/ then assembleStandalone → dist/ npm run start # Արագ backend/API-only կոմպիլյացիա մասնակիցների փոփոխությունների համար npm run build:contributor # Թողարկման կառուցում (մաքուր վերակառուցում + HEAD sentinel — անհրաժեշտ է տեղակայման համար) npm run build:release # rm -rf .build dist && build + writes dist/BUILD_SHA # Պորտի ընդհանուր կարգավորում PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev ``` Մասնակցի կառուցումը կատարում է միայն կոմպիլյացիայի վավերացում․ այն չի հավաքում standalone բաշխումը և չի կառուցում կամընտիր native փաթեթավորման ակտիվներ։ Օգտագործեք սովորական արտադրական կառուցումը, երբ անհրաժեշտ է վավերացնել առաքման ենթակա փաթեթը։ ### Կառուցման արդյունքի դասավորություն | Գրացուցակ | Բովանդակություն | Հետևվո՞ւմ է | | --------- | -------------------------------------------------------------------------------- | ----------- | | `src/` | Հավելվածի սկզբնական կոդ (TypeScript / TSX) | Այո | | `.build/` | Միջանկյալ ֆայլեր — `next build`-ի արդյունք (gitignored, `distDir = .build/next`) | Ոչ | | `dist/` | Առաքման ենթակա փաթեթ — հավաքվում է `assembleStandalone`-ի կողմից (gitignored) | Ոչ | Կառուցման pipeline-ը մեկ անցում է՝ ``` npm run build └─ next build → .build/next/standalone (Next.js-ի արդյունք) └─ assembleStandalone() (պատճենում է 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`)՝ որպես տեղակայման ամբողջականության sentinel։ `npm run build:contributor`-ը օգտագործում է միայն backend-ի կառուցման պրոֆիլը։ Կառուցման ընթացքում այն ժամանակավորապես փոխարինում է կառավարման վահանակի UI ֆայլերը, պահպանում API route handler-ները և կառուցումից հետո վերականգնում սկզբնական ֆայլերը։ Օգտագործեք `npm run build`-ը այն փոփոխությունների համար, որոնք ազդում են կառավարման վահանակի UI-ի վրա, կամ ամբողջական թողարկման վավերացման համար․ մասնակցի պրոֆիլը չի փոխարինում թողարկման կառուցմանը։ > **VPS-ի տեղակայման նշում․** հեռակա image-ի `/usr/lib/node_modules/omniroute/app/` > գրացուցակը չի փոխվում։ Տեղակայման skills-ները `dist/`-ի պարունակությունը rsync են անում այնտեղ։ > Փոխվել է միայն պահոցում կառուցման արդյունքի ուղին (`app/` → `dist/`)։ Լռելյայն URL-ներ՝ - **Կառավարման վահանակ**՝ `http://localhost:20128/dashboard` - **API**՝ `http://localhost:20128/v1` --- ## Git աշխատանքային հոսք > ⚠️ **ԵՐԲԵՔ commit մի արեք անմիջապես `main` ճյուղում։** Միշտ օգտագործեք ֆունկցիոնալ ճյուղեր։ > > **PR-ի բազային ճյուղը՝** թիրախավորեք ակտիվ `release/vX.Y.Z` ճյուղը (ոչ թե `main`)։ Յուրաքանչյուր թողարկման համար առանձին ճյուղ + առաքման պահին tag մոդելի մասին տե՛ս > [`docs/ops/BRANCHING_MODEL.md`](docs/ops/BRANCHING_MODEL.md)։ ```bash # Ճյուղ ստեղծեք ակտիվ թողարկման վերջին կետից (օրինակ՝ 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 # Բացեք Pull Request՝ base = release/v3.8.49 ``` ### Ճյուղերի անվանումներ | Նախածանց | Նպատակ | | ----------- | ------------------------------- | | `feat/` | Նոր գործառույթներ | | `fix/` | Սխալների ուղղումներ | | `refactor/` | Կոդի վերակազմավորում | | `docs/` | Փաստաթղթերի փոփոխություններ | | `test/` | Թեստերի ավելացումներ/ուղղումներ | | `chore/` | Գործիքներ, CI, կախվածություններ | ### Commit հաղորդագրություններ Հետևեք [Conventional Commits](https://www.conventionalcommits.org/) ձևաչափին՝ ``` feat: add circuit breaker for provider calls fix: resolve JWT secret validation edge case docs: update SECURITY.md with PII protection test: add observability unit tests refactor(db): consolidate rate limit tables ``` Տիրույթներ (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 # Բոլոր թեստերը (միավորային + vitest + էկոհամակարգային + e2e) npm run test:all # Մեկ թեստային ֆայլ (Node.js-ի ներկառուցված թեստերի գործարկիչ — թեստերի մեծ մասն օգտագործում է սա) node --import tsx/esm --test tests/unit/your-file.test.ts # Միայն ձեր փոփոխությունից ազդված միավորային թեստերը (նույն TIA ընտրիչը, ինչ CI սահմանափակիչում, #8084) npm run test:scoped # վերջին կոմիթի (կամ աշխատանքային ծառի) փոփոխությունները npm run test:scoped:staged # միայն stage արված փոփոխությունները — հարմար է pre-commit գործարկման հետ npm run test:scoped:full # նախ վերակառուցում է import-graph քարտեզը (ֆայլեր ավելացնելուց/տեղափոխելուց հետո) # Ելք 1 + "գործարկեք ամբողջ հավաքածուն" նշանակում է, որ փոխվել է կենտրոնական ֆայլ (tsconfig, package.json, …) կամ # չքարտեզագրված սկզբնաղբյուր — ընտրիչը ձախողվում է անվտանգ կերպով և երբեք աննկատ չի բաց թողնում թեստերը։ # Vitest (MCP սերվեր, autoCombo, քեշ) npm run test:vitest # E2E թեստեր (պահանջում է Playwright) npm run test:e2e # Արձանագրային հաճախորդների E2E թեստեր (MCP փոխադրամիջոցներ, A2A) npm run test:protocols:e2e # Էկոհամակարգի համատեղելիության թեստեր npm run test:ecosystem # Ծածկույթի սահմանաչափ՝ 60% արտահայտությունների/տողերի/ֆունկցիաների/ճյուղերի համար npm run test:coverage npm run coverage:report # Լինտինգի + ձևաչափի ստուգում npm run lint npm run check # Ակտիվացվող ծխային թեստ՝ իրական upstream combo-ով (պահանջում է VPS հասանելիություն + իրական մատակարարների կրեդիտներ) # Հարցումներ է ուղարկում ԻՐԱԿԱՆ մատակարարներին՝ առաջացնելով փոքր ծախս։ ԵՐԲԵՔ չի գործարկվում CI-ում։ Առանց ակտիվացման դրոշակի՝ անվնաս բաց է թողնվում։ # Պահանջվում է՝ ssh root@192.168.0.15 հասանելիություն (VPS-ից օգտագործում է DB-ի միայն ընթերցման պահապատկեր)։ RUN_COMBO_LIVE=1 npm run test:combo:live # Փուլ 3-ի VPS կենդանի ծխային թեստ — սովորական Node ESM սկրիպտներ, որոնք անմիջապես դիմում են գործող .15 սերվերին։ # Պահանջվում է՝ ssh root@192.168.0.15 հասանելիություն (combo-ները ստեղծվում/ջնջվում են SSH sqlite-ի միջոցով)։ # Հարցումներ է ուղարկում ԻՐԱԿԱՆ մատակարարներին (փոքր ծախս)։ Ստեղծում/ջնջում է միայն __live_test__* combo-ներ։ ԵՐԲԵՔ չի գործարկվում CI-ում։ # .15-ում REQUIRE_API_KEY=false է, ուստի API բանալի պետք չէ, սակայն սահմանված լինելու դեպքում հաշվի է առնում COMBO_LIVE_BASE_URL / COMBO_LIVE_API_KEY։ npm run test:combo:live:vps # 7 HTTP սցենար (առաջնահերթություն/հերթագայություն/կշռված/արժեք/միաձուլում/ավտոմատ + առողջության ստուգում) npm run test:combo:live:vps:failover # ավելացնում է իրական միջմատակարարային խափանումից վերականգնման սցենար (ընդամենը՝ 8) ``` Ծածկույթի նշումներ․ - `npm run test:coverage`-ը չափում է հիմնական միավորային թեստերի հավաքածուի սկզբնաղբյուրի ծածկույթը, բացառում է `tests/**`-ը և ներառում է `open-sse/**`-ը - Փոփոխությունների միավորման հարցումները պետք է արտահայտությունների/տողերի/ֆունկցիաների/ճյուղերի ծածկույթի սահմանաչափը պահպանեն **60%+** մակարդակում - Եթե PR-ը փոխում է արտադրական կոդը `src/`, `open-sse/`, `electron/` կամ `bin/` պանակներում, ապա նույն PR-ում պետք է ավելացնի կամ թարմացնի ավտոմատացված թեստերը - `npm run coverage:report`-ը տպում է ծածկույթի վերջին գործարկման մանրամասն՝ ըստ ֆայլերի հաշվետվությունը - `npm run test:coverage:legacy`-ը պահպանում է ավելի հին չափանիշը՝ պատմական համեմատության համար - Ծածկույթի փուլային բարելավման ճանապարհային քարտեզը տե՛ս `docs/ops/COVERAGE_PLAN.md`-ում ### Փոփոխությունների միավորման հարցման պահանջները Նախքան PR բացելը՝ օգտագործեք [Ներդրման ոսկե ուղին](docs/ops/CONTRIBUTION_GOLDEN_PATH.md)՝ ձեր կատարած փոփոխության համար նպատակային շրջափուլը գործարկելու նպատակով։ Ամբողջ միավորային հավաքածուն (CI-ի 4 շարդ), Vitest-ը, ծածկույթի **60%+** սահմանաչափը և արտադրական կառուցումը CI-ի պատասխանատվությունն են․ դրանց տեղային գործարկումը չի տրամադրում որևէ ազդանշան, որն արդեն չեն տրամադրի PR-ի ստուգումները, իսկ ավելի թույլ մեքենաներում այն կարող է ամբողջությամբ ծանրաբեռնել հոսթը (#8084)․ - Գործարկեք ձեր փոփոխությունը ծածկող թեստային ֆայլերը՝ `node --import tsx/esm --test tests/unit/.test.ts` - Գործարկեք `npm run lint` - Երբ արտադրական կոդը փոխվում է, նույն PR-ում ներառեք կամ թարմացրեք ավտոմատացված թեստերը - `node:test` ֆայլերում վերին մակարդակի յուրաքանչյուր `await` (օրինակ՝ `await import(...)`) տեղադրեք առաջին `test()` / `describe()`-ից առաջ․ `--test-force-exit`-ի դեպքում դրանից հետո գրանցված թեստերը կարող են աննկատ երբեք չգործարկվել (#18045․ պարտադրվում է `npm run check:test-tla-order`-ի միջոցով) - Երբ արտադրական կոդը փոխվել է, PR-ի նկարագրությունում ներառեք փոխված կամ ավելացված թեստային ֆայլերը - Ստուգեք PR-ի SonarQube արդյունքը, երբ նախագծի գաղտնիքները կարգավորված են CI-ում Թեստերի ընթացիկ կարգավիճակը՝ **122 միավորային թեստային ֆայլ**, որոնք ծածկում են․ - Մատակարարների թարգմանիչները և ձևաչափերի փոխակերպումը - Հարցումների հաճախականության սահմանափակումը, շղթայի անջատիչը և դիմակայունությունը - Իմաստային քեշը, իդեմպոտենտությունը և առաջընթացի հետևումը - Տվյալների բազայի գործողությունները և սխեման (DB-ի 21 մոդուլ) - OAuth հոսքերը և նույնականացումը - API վերջնակետերի վավերացումը (Zod v4) - MCP սերվերի գործիքները և հասանելիության տիրույթի պարտադրումը - Հիշողության և հմտությունների համակարգերը --- ## Կոդի ոճ - **ESLint** — Նախքան commit կատարելը գործարկեք `npm run lint` - **Prettier** — Commit-ի ժամանակ ավտոմատ ձևաչափվում է `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 {} // հաճախորդի անջատումից հետո արդեն փակված controller-ը փակելու փորձը սպասելի է ``` - **Պետք է գրանցել (արտաքին/կանչող կողմի տրամադրած կոդ, կամ անտեսումը փոխում է կառավարման հոսքը)** — պահպանեք 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/ # Auto-combo շարժիչ, դատողության վերարտադրում ├── 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-ի վրա) Ավելացրեք OAuth-ի հավատարմագրերը `src/lib/oauth/constants/oauth.ts`-ում, իսկ ծառայությունը՝ `src/lib/oauth/services/`-ում։ Եթե վերին հոսքի պրովայդերն իր հանրային CLI / դիտարկիչի փաթեթի ներսում տարածում է հանրային OAuth client_id/secret կամ Firebase Web API բանալի, **մի՛** ներդրեք այն որպես տողային լիտերալ։ Օգտագործեք `resolvePublicCred()`-ը՝ `open-sse/utils/publicCreds.ts`-ից, և `EMBEDDED_DEFAULTS`-ում ավելացրեք քողարկված բայթային գրառում։ Ամբողջ պարտադիր աշխատանքային ընթացքը փաստաթղթավորված է [`docs/security/PUBLIC_CREDS.md`](./docs/security/PUBLIC_CREDS.md)-ում։ Մշակիչների/կատարիչների ներսում հաճախորդին հասնող սխալի հաղորդագրությունները պետք է անցնեն `buildErrorBody()` / `sanitizeErrorMessage()` ֆունկցիաներով՝ `open-sse/utils/error.ts`-ից․ երբեք չտեղադրեք չմշակված `err.stack` կամ `err.message` Response-ի մարմնում։ Տե՛ս [`docs/security/ERROR_SANITIZATION.md`](./docs/security/ERROR_SANITIZATION.md)։ ### Քայլ 5․ Գրանցեք մոդելները Ավելացրեք մոդելների սահմանումները `open-sse/config/providerRegistry.ts`-ում։ ### Քայլ 6․ Ավելացրեք թեստեր Գրեք միավորային թեստեր `tests/unit/`-ում՝ առնվազն ընդգրկելով՝ - Պրովայդերի գրանցումը - Հարցման/պատասխանի փոխակերպումը - Սխալների մշակումը --- ## Pull Request-ի ստուգաթերթ - [ ] Թեստերն անցնում են (`npm test`) - [ ] Լինտինգն անցնում է (`npm run lint`) - [ ] Կառուցումը հաջողվում է (`npm run build`) - [ ] Նոր հանրային ֆունկցիաների և ինտերֆեյսների համար ավելացվել են TypeScript տիպեր - [ ] Չկան կոդում ուղղակիորեն գրված գաղտնիքներ կամ պահուստային արժեքներ - [ ] Հանրային վերին հոսքի հավատարմագրերը ներդրված են `resolvePublicCred()`-ի միջոցով (տե՛ս [`docs/security/PUBLIC_CREDS.md`](./docs/security/PUBLIC_CREDS.md)), երբեք՝ որպես լիտերալներ - [ ] Սխալների պատասխաններն անցնում են `buildErrorBody()` / `sanitizeErrorMessage()`-ի միջոցով. պատասխանների մարմիններում չկան չմշակված stack trace-եր (տե՛ս [`docs/security/ERROR_SANITIZATION.md`](./docs/security/ERROR_SANITIZATION.md)) - [ ] Shell հրամանները (`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/`) դասակարգված են որպես `isLocalOnlyPath()`՝ `src/server/authz/routeGuard.ts`-ում. տե՛ս [Խիստ կանոն #15](docs/security/ROUTE_GUARD_TIERS.md) - [ ] Commit-ի հաղորդագրություններում չկան AI-ի/բոտի `Co-authored-by` վերջնատողեր (Խիստ կանոն #16). մարդկային համահեղինակները, որոնց աշխատանքը վերաօգտագործվել է, նշվում են ստանդարտ `Co-authored-by: Name ` վերջնատողերով --- ## Թողարկումներ Թողարկումները կառավարվում են `/generate-release` աշխատանքային հոսքի միջոցով։ Երբ ստեղծվում է նոր GitHub Release, փաթեթը GitHub Actions-ի միջոցով **ավտոմատ հրապարակվում է npm-ում**։ VPS-ում տեղակայելու համար օգտագործեք `npm run build:release` (`npm run build`-ի փոխարեն)․ այն կատարում է մաքուր վերակառուցում, փաթեթը հավաքում է `dist/`-ում և ստեղծում `dist/BUILD_SHA` ստուգիչ ֆայլը։ Այնուհետև օգտագործեք `/deploy-vps-*-cc` հմտությունները, որոնք rsync-ի միջոցով `dist/`-ը համաժամացնում են հեռակա `app/` պանակի հետ։ --- ## Օգնություն ստանալը - **Ճարտարապետություն**: Տե՛ս [`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)