# CLI Tools — OmniRoute (العربية) 🌐 **Languages:** 🇺🇸 [English](../../../../reference/CLI-TOOLS.md) · 🇪🇹 [am](../../../am/docs/reference/CLI-TOOLS.md) · 🇦🇿 [az](../../../az/docs/reference/CLI-TOOLS.md) · 🇧🇬 [bg](../../../bg/docs/reference/CLI-TOOLS.md) · 🇧🇩 [bn](../../../bn/docs/reference/CLI-TOOLS.md) · 🇧🇦 [bs](../../../bs/docs/reference/CLI-TOOLS.md) · 🇨🇿 [cs](../../../cs/docs/reference/CLI-TOOLS.md) · 🇩🇰 [da](../../../da/docs/reference/CLI-TOOLS.md) · 🇩🇪 [de](../../../de/docs/reference/CLI-TOOLS.md) · 🇬🇷 [el](../../../el/docs/reference/CLI-TOOLS.md) · 🇪🇸 [es](../../../es/docs/reference/CLI-TOOLS.md) · 🇪🇪 [et](../../../et/docs/reference/CLI-TOOLS.md) · 🇮🇷 [fa](../../../fa/docs/reference/CLI-TOOLS.md) · 🇫🇮 [fi](../../../fi/docs/reference/CLI-TOOLS.md) · 🇫🇷 [fr](../../../fr/docs/reference/CLI-TOOLS.md) · 🇮🇪 [ga](../../../ga/docs/reference/CLI-TOOLS.md) · 🇮🇳 [gu](../../../gu/docs/reference/CLI-TOOLS.md) · 🇳🇬 [ha](../../../ha/docs/reference/CLI-TOOLS.md) · 🇮🇱 [he](../../../he/docs/reference/CLI-TOOLS.md) · 🇮🇳 [hi](../../../hi/docs/reference/CLI-TOOLS.md) · 🇭🇷 [hr](../../../hr/docs/reference/CLI-TOOLS.md) · 🇭🇺 [hu](../../../hu/docs/reference/CLI-TOOLS.md) · 🇦🇲 [hy](../../../hy/docs/reference/CLI-TOOLS.md) · 🇮🇩 [id](../../../id/docs/reference/CLI-TOOLS.md) · 🇳🇬 [ig](../../../ig/docs/reference/CLI-TOOLS.md) · 🇮🇹 [it](../../../it/docs/reference/CLI-TOOLS.md) · 🇯🇵 [ja](../../../ja/docs/reference/CLI-TOOLS.md) · 🇬🇪 [ka](../../../ka/docs/reference/CLI-TOOLS.md) · 🇰🇭 [km](../../../km/docs/reference/CLI-TOOLS.md) · 🇮🇳 [kn](../../../kn/docs/reference/CLI-TOOLS.md) · 🇰🇷 [ko](../../../ko/docs/reference/CLI-TOOLS.md) · 🇱🇹 [lt](../../../lt/docs/reference/CLI-TOOLS.md) · 🇱🇻 [lv](../../../lv/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ml](../../../ml/docs/reference/CLI-TOOLS.md) · 🇮🇳 [mr](../../../mr/docs/reference/CLI-TOOLS.md) · 🇲🇾 [ms](../../../ms/docs/reference/CLI-TOOLS.md) · 🇲🇹 [mt](../../../mt/docs/reference/CLI-TOOLS.md) · 🇲🇲 [my](../../../my/docs/reference/CLI-TOOLS.md) · 🇳🇵 [ne](../../../ne/docs/reference/CLI-TOOLS.md) · 🇳🇱 [nl](../../../nl/docs/reference/CLI-TOOLS.md) · 🇳🇴 [no](../../../no/docs/reference/CLI-TOOLS.md) · 🇮🇳 [or](../../../or/docs/reference/CLI-TOOLS.md) · 🇮🇳 [pa](../../../pa/docs/reference/CLI-TOOLS.md) · 🇵🇭 [phi](../../../phi/docs/reference/CLI-TOOLS.md) · 🇵🇱 [pl](../../../pl/docs/reference/CLI-TOOLS.md) · 🇵🇹 [pt](../../../pt/docs/reference/CLI-TOOLS.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/CLI-TOOLS.md) · 🇷🇴 [ro](../../../ro/docs/reference/CLI-TOOLS.md) · 🇷🇺 [ru](../../../ru/docs/reference/CLI-TOOLS.md) · 🇱🇰 [si](../../../si/docs/reference/CLI-TOOLS.md) · 🇸🇰 [sk](../../../sk/docs/reference/CLI-TOOLS.md) · 🇸🇮 [sl](../../../sl/docs/reference/CLI-TOOLS.md) · 🇷🇸 [sr](../../../sr/docs/reference/CLI-TOOLS.md) · 🇸🇪 [sv](../../../sv/docs/reference/CLI-TOOLS.md) · 🇰🇪 [sw](../../../sw/docs/reference/CLI-TOOLS.md) · 🇮🇳 [ta](../../../ta/docs/reference/CLI-TOOLS.md) · 🇮🇳 [te](../../../te/docs/reference/CLI-TOOLS.md) · 🇹🇭 [th](../../../th/docs/reference/CLI-TOOLS.md) · 🇹🇷 [tr](../../../tr/docs/reference/CLI-TOOLS.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/CLI-TOOLS.md) · 🇵🇰 [ur](../../../ur/docs/reference/CLI-TOOLS.md) · 🇺🇿 [uz](../../../uz/docs/reference/CLI-TOOLS.md) · 🇻🇳 [vi](../../../vi/docs/reference/CLI-TOOLS.md) · 🇳🇬 [yo](../../../yo/docs/reference/CLI-TOOLS.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/CLI-TOOLS.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/CLI-TOOLS.md) --- آخر تحديث: 2026-08-23 يتكامل OmniRoute مع ثلاث فئات من أدوات CLI موزعة على ثلاث صفحات مخصصة في لوحة المعلومات: | الصفحة | المسار | المفهوم | العدد | | ---------------------- | ----------------------- | --------------------------------------------------------------------- | ---------- | | **أدوات CLI البرمجية** | `/dashboard/cli-code` | أدوات برمجة توجهها إلى OmniRoute (العميل ← CLI ← OmniRoute ← المزوّد) | 26 | | **وكلاء CLI** | `/dashboard/cli-agents` | وكلاء مستقلون توجههم إلى OmniRoute (التدفق نفسه، بنطاق أوسع) | 10 | | **وكلاء ACP** | `/dashboard/acp-agents` | أدوات CLI يشغّلها OmniRoute كواجهة خلفية عبر stdio/ACP (تدفق عكسي) | راجع السجل | تُعاد توجيه المسارات القديمة باستخدام 308:‏ `/dashboard/cli-tools` ← `/dashboard/cli-code`، و`/dashboard/agents` ← `/dashboard/acp-agents`. --- ## آلية العمل ``` أدوات CLI البرمجية / وكلاء CLI (تدفق الاستهلاك): Claude / Codex / OpenCode / Cline / KiloCode / Continue / Hermes Agent / Goose / ... │ ▼ (تشير جميعها إلى OmniRoute) http://YOUR_SERVER:20128/v1 │ ▼ (يوجّه OmniRoute الطلب إلى المزوّد المناسب) Anthropic / OpenAI / Gemini / DeepSeek / Groq / Mistral / ... وكلاء ACP (تدفق التشغيل العكسي): طلب العميل ← OmniRoute ← يشغّل CLI عبر stdio/ACP ← الاستجابة ``` **الفوائد:** - مفتاح API واحد لإدارة جميع الأدوات - تتبع التكلفة لجميع أدوات CLI في لوحة المعلومات - تبديل النماذج دون إعادة تهيئة كل أداة - يعمل محليًا وعلى الخوادم البعيدة (VPS وDocker وAkamai وCloudflare Tunnel) --- ## التهيئة التلقائية باستخدام `setup-*` لا يتعين عليك كتابة إعدادات كل أداة يدويًا. يوفّر OmniRoute أمرًا من نوع `setup-*` لكل CLI مدعوم، يقرأ كتالوج النماذج **الفعلي** من نسخة OmniRoute قيد التشغيل (محلية أو بعيدة)، ثم يكتب إعدادات الأداة نفسها على جهازك: ```bash omniroute setup-codex omniroute setup-claude omniroute setup-opencode omniroute setup-cline omniroute setup-kilo omniroute setup-continue omniroute setup-cursor omniroute setup-roo omniroute setup-crush omniroute setup-goose omniroute setup-qwen omniroute setup-aider omniroute setup-5dive omniroute setup-zed ``` يقبل كل أمر `--remote --api-key ` (لتهيئة أداة محلية للعمل مع OmniRoute بعيد)، و`--dry-run` (للمعاينة دون كتابة)، و`--port`. أما الأدوات التي لا تدعم الاكتشاف التلقائي للنماذج (Cline وKilo وRoo وGoose وAider وQwen و5dive)، فتقبل `--model ` (وكذلك `--yes` للتشغيل غير التفاعلي). تُعد `setup-5dive` الوصفة الوحيدة التي لا تكتب ضمن `$HOME`: فهي تهيّئ مجموعة وكلاء 5dive عبر كتابة ملف تعريف مصادقة مملوك للمستخدم الجذر على مضيف المجموعة، ولذلك تعيد تنفيذ نفسها من خلال `sudo` ولا تملك وضعًا بعيدًا خاصًا بها. لتشغيل CLI مع حقن متغيرات البيئة الصحيحة ومن دون كتابة أي إعدادات على الإطلاق، استخدم مشغّل التشغيل العام `omniroute run ` (claude وcodex وaider وgoose وopencode وqwen وgemini — تأتي الأهداف والأسماء البديلة من `bin/cli/cli-manifest.mjs`)؛ وتظل مشغّلات التشغيل القديمة المخصصة لكل أداة، وهي `omniroute launch` ‏(Claude Code) و`omniroute launch-codex` ‏(Codex)، متاحة. يدعم Gemini CLI التشغيل فقط: فهو هدف لـ `omniroute run` ولكن لا توجد له وصفة `setup-*`/`configure`. > **المرجع الكامل:** يوجد الجدول الرئيسي — الذي يوضّح ما يكتبه كل أمر، وجميع العلامات، > والوضع المحلي مقابل البعيد، والأدوات التي تتطلب اللاحقة `/v1` — في > **[تكاملات CLI](../guides/CLI-INTEGRATIONS.md)**. ### تشغيل هذه الأوامر داخل حاوية عند تنفيذ أمر `setup-*` داخل حاوية OmniRoute، فإنه يكتب في الدليل الرئيسي الخاص بالحاوية، والذي لا تقرؤه أي أداة CLI على المضيف ويختفي مع الحاوية. يكتشف OmniRoute ذلك وينهي التنفيذ بالرمز `2` مع عرض إرشادات بدلًا من الكتابة. توجد طريقتان مدعومتان للمتابعة — تثبيت CLI على المضيف ثم استخدام `omniroute connect` للاتصال بالحاوية، أو ربط أدلة الإعدادات عبر bind mount وضبط `CLI_CONFIG_HOME` (ملف تعريف compose المسمى `host`). يقبل كل أمر `setup-*`، بالإضافة إلى `omniroute configure` و`omniroute config set`، الخيار `--allow-container-write` عندما يكون المقصود فعليًا هو تهيئة أدوات CLI الخاصة بالحاوية؛ ويؤدي `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` الوظيفة نفسها بالنسبة إلى الخادم. راجع [دليل Docker ← تهيئة أدوات CLI على المضيف](../guides/DOCKER_GUIDE.md#configuring-host-cli-tools-when-omniroute-runs-in-docker). تفرض **نقطة نهاية التطبيق** في لوحة المعلومات (`POST /api/cli-tools/apply`) القيد نفسه: داخل حاوية، إذا لم يكن هدف الكتابة مرتبطًا من المضيف عبر bind mount، فستستجيب بالرمز **`422`** مع `containerEphemeralTarget: true`، ونص الخطأ الآمن، وكذلك — للأدوات التي لها وصفة خاصة بالمضيف (claude وcodex وopencode وcline وkilo وcontinue) — قيمة `hostSetupCommand` (مثل `omniroute setup-opencode`) لتشغيلها على المضيف بدلًا من ذلك؛ ولن تتم كتابة أي شيء. يظل `dryRun: true` يعمل في وضع الحاوية، ويعيد معاينة منقّحة ومسار الهدف من دون لمس القرص. محتوى المعاينة ليس إعدادًا يحتوي على بيانات اعتماد بغرض نسخه أو استيراده. نفّذ التطبيق باستخدام المدخلات الأصلية للأداة/عنوان URL الأساسي/مفتاح API/النموذج على المضيف، أو استخدم أمر الإعداد المشار إليه على جانب المضيف. راجع [أمان تهيئة CLI](../security/CLI-CONFIGURATION.md) للاطلاع على ترويسة المعاينة وعقد الطلب. هذا السلوك مقصود ومحمي من الانحدارات بواسطة `tests/unit/api/cli-tools/apply-container-guard.test.ts` — لا «تصلح» الخطأ 422 أبدًا عن طريق إزالة القيد. --- ## مصدر الحقيقة يوجد الكتالوج الموحّد في `src/shared/constants/cliTools.ts` باسم `CLI_TOOLS: Record`. يحتوي كل إدخال على الحقول التالية (المعرّفة في `src/shared/schemas/cliCatalog.ts`): | الحقل | النوع | الوصف | | ----------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------- | | `category` | `"code" \| "agent"` | الصفحة التي تظهر فيها الأداة | | `vendor` | `string` | مصدر الأداة ("Anthropic"، "OSS (P. Gauthier)") | | `acpSpawnable` | `boolean` | يمكن استخدامها أيضًا كوكيل ACP (تظهر شارة) | | `baseUrlSupport` | `"full" \| "partial" \| "none"` | مستوى دعم نقطة النهاية المخصّصة. `"none"` = قائمة مهام MITM | | `configType` | `"env" \| "custom" \| "guide" \| "custom-builder" \| "mitm"` | آلية التكوين | | `id`, `name`, `color`, `description`, `docsUrl` | قياسي | حقول العرض الأساسية | الإدخالات التي تحتوي على `baseUrlSupport: "none"` **لا تظهر** في صفحات لوحة المعلومات — بل تُسجّل في قائمة مهام MITM الخاصة بالخطة 11 (راجع `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md`). ### مستويات القدرات (مفهرسة × قابلة للاكتشاف × قابلة للتكوين × قابلة للتشغيل) ليست كل أداة مفهرسة قابلة للاكتشاف أو التكوين أو التشغيل. لكل مستوى مصدر واحد يعلنه، ويحافظ اختبار الانحراف على اتساقها: | المستوى | المعنى | مُعلن عنه في | | ------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------ | | **مفهرسة** | تظهر في كتالوج لوحة المعلومات (الاسم، والمورّد، والوثائق، ونوع التكوين) | `src/shared/constants/cliTools.ts` (`CLI_TOOLS`) | | **قابلة للاكتشاف** | اكتشاف الملف الثنائي/التكوين، وفحوصات السلامة، ومسارات التكوين | `src/shared/services/cliRuntime.ts` (كتالوج وقت تشغيل `CLI_TOOLS`) | | **قابلة للتكوين** | مدعومة بواسطة `omniroute configure ` (توجد وصفة إعداد) | `bin/cli/cli-manifest.mjs` (`configure: true`) | | **قابلة للتشغيل** | مدعومة بواسطة `omniroute run ` (تم تعريف حقن متغيرات البيئة/الوسائط) | `bin/cli/cli-manifest.mjs` (`run: true`) | يُعد `bin/cli/cli-manifest.mjs` بيان التنفيذ المرجعي لواجهات أوامر CLI: تستمد منه `run` و`configure` ومولّدات الإكمال الطرفي جميعُها قوائم الأهداف، وتحليل الأسماء البديلة (مثل `kilocode`/`kilo-code`/`kilo_cli` → `kilo`) وإعداد علامة `--model`. يتحقق حاجز الانحراف `tests/unit/cli/cli-manifest-drift.test.ts` من بقاء البيان وكتالوج وقت التشغيل وكتالوج واجهة المستخدم وكل واجهة مستهلكة متزامنة — وتؤدي إضافة هدف إلى واجهة واحدة دون الواجهات الأخرى إلى فشل مجموعة الاختبارات بدلًا من حدوث انحراف بصمت. --- ## 1. كتالوج CLI Code ‏(27 أداة) جميع الأدوات التي تظهر في `/dashboard/cli-code`. الأدوات التي تحمل `baseUrlSupport: none` تُربط عبر MITM أو دليل يدوي بدلًا من عنوان URL أساسي مخصص: | المعرّف | الاسم | المورّد | baseUrlSupport | configType | acpSpawnable | | ------------ | ----------------------- | ------------------- | -------------- | -------------- | ------------ | | claude | Claude Code | Anthropic | full | env | true | | codex | OpenAI Codex CLI | OpenAI | full | custom | true | | zcode | ZCode (GLM Coding Plan) | Z.ai | none | custom | false | | cline | Cline | OSS (ex-Claude Dev) | full | custom | true | | kilo | Kilo Code | Kilo-Org | full | custom | false | | roo | Roo Code | Roo (OSS) | full | guide | false | | continue | Continue | continue.dev | full | guide | false | | aider | Aider | OSS (P. Gauthier) | full | guide | true | | forge | ForgeCode | Antinomy HQ | full | custom | true | | jcode | jcode | 1jehuang (OSS) | full | custom | false | | deepseek-tui | DeepSeek TUI | Hunter Bown (OSS) | full | custom | false | | codewhale | CodeWhale | Hmbown (OSS) | full | custom | false | | opencode | OpenCode | Anomaly (ex-SST) | full | guide | true | | droid | Factory Droid | Factory AI | partial | guide | false | | copilot | GitHub Copilot CLI | GitHub/MS | full | custom | false | | cursor-cli | Cursor CLI | Anysphere | partial | guide | true | | smelt | Smelt | leonardcser (OSS) | full | custom | false | | pi | Pi (pi-coding-agent) | M. Zechner (OSS) | full | custom | false | | grok-build | Grok Build | xAI | full | custom | false | | crush | Crush | OSS (Charm) | full | custom | false | | qwen | Qwen Code | Alibaba | full | guide | true | | zed | Zed | Zed Industries | full | guide | false | | cursor | Cursor | Anysphere | none | guide | false | | antigravity | Antigravity | Google | none | mitm | false | | hermes | Hermes | Nous Research | none | guide | false | | kiro | Kiro AI | Amazon | none | mitm | false | | custom | Custom CLI | — | full | custom-builder | false | تُظهر الأدوات التي تحمل `baseUrlSupport: "partial"` شارة "⚠ عنوان URL الأساسي جزئي" في بطاقة لوحة المعلومات. --- ## 2. كتالوج وكلاء CLI (10 أدوات) الوكلاء المستقلون الذين يظهرون في `/dashboard/cli-agents`: | id | الاسم | المورّد | دعم baseUrl | قابل للتشغيل عبر ACP | | ------------ | ---------------- | ------------------------ | ----------- | -------------------- | | hermes-agent | Hermes Agent | Nous Research | full | false | | openclaw | OpenClaw | OSS (P. Steinberger) | full | true | | goose | Goose | Block / Linux Foundation | full | true | | interpreter | Open Interpreter | OSS | full | true | | warp | Warp AI | Warp Inc. | partial | true | | agent-deck | Agent Deck | asheshgoplani (OSS) | full | false | | omp | Oh My Pi | OSS | full | true | | letta | Letta CLI | Letta | full | false | | prime-agent | Prime Agent | Prime Intellect (OSS) | full | false | | 5dive | 5dive | OSS (5dive-ai) | full | false | --- ## 3. وكلاء ACP (/dashboard/acp-agents) تعرض هذه الصفحة (التي أُعيدت تسميتها من `/dashboard/agents`) واجهات CLI التي يمكن لـ OmniRoute **تشغيلها** كمحركات تنفيذ خلفية عبر بروتوكول stdio/ACP. تتم صيانة الكتالوج بصورة منفصلة في `src/lib/acp/registry.ts`، وهو **ليس** مماثلًا لـ `CLI_TOOLS`. --- ## 4. قائمة MITM المؤجلة (لا تظهر في لوحة المعلومات) لا تدعم واجهات CLI التالية عنوان URL أساسيًا مخصصًا بصورة أصلية، وهي **غير مدرجة** في صفحتي CLI Code أو CLI Agents. وهي مرشحة للاعتراض عبر MITM في الخطة 11: | CLI | السبب | | ------------------- | ------------------------------------------------------- | | windsurf | يقتصر BYOK على نماذج Claude محددة + عنوان URL/رمز مؤسسي | | amp | منظومة مغلقة (Sourcegraph) | | amazon-q / kiro-cli | مصادقة AWS SSO، دون عنوان URL مخصص | | cowork | Anthropic Desktop، دون نقطة نهاية قابلة للتهيئة | راجع `_tasks/features-v3.8.6/refactorpages/_orchestration/_plan11-mitm-backlog.md` للاطلاع على الإحالات المرجعية الكاملة. --- ## 5. واجهة API للكشف الدفعي تُجمّع جميع عمليات اكتشاف الأدوات عبر نقطة نهاية واحدة: **`GET /api/cli-tools/all-statuses`** - المصادقة: `requireCliToolsAuth(request)` (كما هو الحال مع مسارات `/api/cli-tools/` الأخرى) - القيمة المُعادة: `Record` (النوع: `src/shared/types/cliBatchStatus.ts`) - الاستراتيجية: `Promise.all` عبر جميع الأدوات، مع مهلة 5 ثوانٍ لكل أداة - ذاكرة التخزين المؤقت: LRU داخل الذاكرة، مفهرسة حسب `mtime` لملف الإعداد. تُبطَل ذاكرة التخزين المؤقت عند تغيّر mtime. وتُعاد تهيئتها عند إعادة تشغيل الخادم. بنية الاستجابة لكل أداة: ```ts interface ToolBatchStatus { detection: { installed: boolean; runnable: boolean; version?: string; command?: string; commandPath?: string; reason?: string; }; config: { status: "configured" | "not_configured" | "not_installed" | "unknown" | "other"; endpoint?: string | null; lastConfiguredAt?: string | null; }; error?: string; // منقّح، دون تتبعات للمكدس } ``` --- ## 6. معالجات الإعدادات للأدوات الجديدة تحتوي الأدوات الجديدة ذات `configType: "custom"` على مسارات API مخصصة للإعدادات: | المسار | الأداة | | ------------------------------------------- | ------------------------------------------------------------------- | | `POST /api/cli-tools/forge-settings` | ForgeCode ‏(.forge.toml) | | `POST /api/cli-tools/jcode-settings` | jcode ‏(علامة `--base-url`) | | `POST /api/cli-tools/deepseek-tui-settings` | DeepSeek TUI ‏(OPENAI_BASE_URL، قديم) | | `POST /api/cli-tools/codewhale-settings` | CodeWhale ‏(OPENAI_BASE_URL، أساسي + مزامنة قديمة مع `~/.deepseek`) | | `POST /api/cli-tools/smelt-settings` | Smelt | | `POST /api/cli-tools/pi-settings` | وكيل البرمجة Pi | | `POST /api/cli-tools/grok-build-settings` | Grok Build ‏(~/.grok/config.toml، `[model.omniroute]`) | | `POST /api/cli-tools/qwen-settings` | Qwen Code ‏(`~/.qwen/settings.json` + مفتاح `.env` مخصص) | تستخدم جميع المسارات `sanitizeErrorMessage()` لاستجابات الأخطاء (القاعدة الصارمة رقم 12). --- ## 7. بنية صفحات لوحة المعلومات ### أكواد CLI (`/dashboard/cli-code`) - `src/app/(dashboard)/dashboard/cli-code/page.tsx` — مكوّن خادم - `src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx` — شبكة عميل - `src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx` — صفحة تفاصيل الأداة - `src/app/(dashboard)/dashboard/cli-code/components/` — 12 بطاقة أدوات متخصصة + `ToolDetailClient.tsx` ### وكلاء CLI (`/dashboard/cli-agents`) - `src/app/(dashboard)/dashboard/cli-agents/page.tsx` — مكوّن خادم - `src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx` — شبكة عميل - `src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx` — يعيد استخدام `ToolDetailClient` ### وكلاء ACP (`/dashboard/acp-agents`) - `src/app/(dashboard)/dashboard/acp-agents/page.tsx` — مكوّن خادم (نُقل من `agents/`) ### مكوّنات واجهة المستخدم المشتركة (`src/shared/components/cli/`) | الملف | الغرض | | ----------------------- | --------------------------------------------------- | | `CliToolCard.tsx` | بطاقة حالة ذكية (الاكتشاف + الإعداد + نقطة النهاية) | | `CliConceptCard.tsx` | بطاقة شرح المفهوم لكل صفحة | | `CliComparisonCard.tsx` | مقارنة من ثلاثة أعمدة بين أنواع CLI | | `BaseUrlSelect.tsx` | قائمة منسدلة لنقطة النهاية (محلية/سحابية/مخصصة) | | `ApiKeySelect.tsx` | محدد مفتاح API | | `ManualConfigModal.tsx` | نافذة منبثقة لمقتطف إعداد قابل للنسخ | ### الخطّاف المشترك (`src/shared/hooks/cli/`) | الملف | الغرض | | ------------------------- | ------------------------------------------------------------- | | `useToolBatchStatuses.ts` | يجلب `/api/cli-tools/all-statuses` ويدير حالة التحميل/التحديث | --- ## 8. التدويل أُضيفت مساحات أسماء جديدة في الخطة 14 F9: | مساحة الاسم | الغرض | | ----------- | -------------------------------------------------------------------------------- | | `cliCommon` | النصوص المشتركة (تسميات البطاقات، نصوص المفاهيم/المقارنات، تسميات صفحة التفاصيل) | | `cliCode` | نصوص صفحة CLI Code | | `cliAgents` | نصوص صفحة CLI Agents | | `acpAgents` | نصوص صفحة ACP Agents | تتوفر ترجمات كاملة للبرتغالية البرازيلية والإنجليزية. وتعود اللغات الـ39 الأخرى تلقائيًا إلى الإنجليزية عبر الدمج على مستوى مساحة الاسم في `src/i18n/request.ts`. --- ## 9. البدء السريع ### الخطوة 1 — الحصول على مفتاح OmniRoute API 1. افتح `/dashboard/api-manager` ← **إنشاء مفتاح API** 2. امنحه اسمًا (مثل `cli-tools`) وحدد جميع الأذونات 3. انسخ المفتاح — ستحتاج إليه مع كل أداة CLI أدناه > يبدو مفتاحك على النحو التالي: `sk-xxxxxxxxxxxxxxxx-xxxxxxxxx` --- ### الخطوة 2 — تثبيت أدوات CLI تتطلب جميع الأدوات المستندة إلى npm إصدار Node.js 22.22.2+ أو 24.x: ```bash # Claude Code (Anthropic) npm install -g @anthropic-ai/claude-code # OpenAI Codex npm install -g @openai/codex # OpenCode npm install -g opencode-ai # Cline npm install -g cline # KiloCode npm install -g kilocode # Qwen Code npm install -g @qwen-code/qwen-code # Google Gemini CLI (يمكن تشغيله عبر `omniroute run gemini` ← واجهة /v1beta) npm install -g @google/gemini-cli # Aider pip install aider-chat # Smelt cargo install smelt # مستند إلى Rust # وكيل البرمجة Pi # راجع https://github.com/zechnerj/pi-coding-agent لمعرفة كيفية التثبيت # jcode # راجع https://github.com/1jehuang/jcode لمعرفة كيفية التثبيت ``` --- ### الخطوة 3 — الإعداد عبر لوحة المعلومات 1. انتقل إلى `http://localhost:20128/dashboard/cli-code` 2. ابحث عن أداتك في الشبكة 3. انقر على البطاقة لفتح صفحة تفاصيل الأداة 4. حدد مفتاح API وعنوان URL الأساسي 5. انقر على **تطبيق الإعداد** أو انسخ مقتطف الإعداد اليدوي --- ### الخطوة 4 — تعيين متغيرات البيئة العامة ```bash # نقطة نهاية OmniRoute الموحّدة export OPENAI_BASE_URL="http://localhost:20128/v1" export OPENAI_API_KEY="sk-your-omniroute-key" export ANTHROPIC_BASE_URL="http://localhost:20128" export ANTHROPIC_AUTH_TOKEN="sk-your-omniroute-key" # يقرأ Gemini CLI المتغير GOOGLE_GEMINI_BASE_URL عند الجذر (وتضيف حزمة SDK الخاصة به /v1beta/... بنفسها) export GOOGLE_GEMINI_BASE_URL="http://localhost:20128" export GEMINI_API_KEY="sk-your-omniroute-key" ``` > بالنسبة إلى **خادم بعيد**، استبدل `localhost:20128` بعنوان IP للخادم أو اسم النطاق، > مثل `http://:20128`. --- ### الخطوة 4 — إعداد كل أداة #### Claude Code ```bash # أنشئ ~/.claude/settings.json: mkdir -p ~/.claude && cat > ~/.claude/settings.json << EOF { "env": { "ANTHROPIC_BASE_URL": "http://localhost:20128", "ANTHROPIC_AUTH_TOKEN": "sk-your-omniroute-key" } } EOF ``` استخدم جذر بوابة Anthropic الموحّدة مع Claude Code. لا تُلحق `/v1` هنا. **الاختبار:** `claude "say hello"` --- #### OpenAI Codex يقرأ Codex الحديث (v0.137+) الملف `~/.codex/config.toml` فقط — أما ملف `config.yaml` القديم فيخص واجهة npm CLI القديمة ويتم تجاهله بصمت. يبقى مفتاح API في متغير البيئة `OMNIROUTE_API_KEY`‏ (`env_key`)، ولا يوضع مطلقًا داخل الملف: ```bash mkdir -p ~/.codex && cat > ~/.codex/config.toml << EOF model_provider = "omniroute" [model_providers.omniroute] name = "OmniRoute" base_url = "http://localhost:20128/v1" env_key = "OMNIROUTE_API_KEY" requires_openai_auth = false EOF export OMNIROUTE_API_KEY="sk-your-omniroute-key" ``` المرجع الكامل (ملفات التعريف، `wire_api`، نوافذ السياق): [CODEX-CLI-CONFIGURATION.md](../guides/CODEX-CLI-CONFIGURATION.md). **الاختبار:** `codex "what is 2+2?"` --- #### OpenCode ```bash mkdir -p ~/.config/opencode && cat > ~/.config/opencode/opencode.json << EOF { "\$schema": "https://opencode.ai/config.json", "provider": { "omniroute": { "npm": "@ai-sdk/openai-compatible", "name": "OmniRoute", "options": { "baseURL": "http://localhost:20128/v1", "apiKey": "sk-your-omniroute-key" }, "models": { "claude-sonnet-4-5": { "name": "claude-sonnet-4-5" }, "claude-sonnet-4-5-thinking": { "name": "claude-sonnet-4-5-thinking" }, "gemini-3-flash": { "name": "gemini-3-flash" } } } } } EOF ``` **الاختبار:** `opencode` > استخدم `opencode run "your prompt" --model omniroute/claude-sonnet-4-5-thinking --variant high` > لإرسال متغيرات التفكير. --- #### Cline (واجهة CLI أو VS Code) **وضع CLI:** ```bash mkdir -p ~/.cline/data && cat > ~/.cline/data/globalState.json << EOF { "apiProvider": "openai", "openAiBaseUrl": "http://localhost:20128/v1", "openAiApiKey": "sk-your-omniroute-key" } EOF ``` **وضع VS Code:** إعدادات إضافة Cline ← موفر API:‏ `OpenAI Compatible` ← عنوان URL الأساسي: `http://localhost:20128/v1` أو استخدم لوحة معلومات OmniRoute ← **أدوات CLI ← Cline ← تطبيق الإعداد**. --- #### KiloCode (واجهة CLI أو VS Code) **وضع CLI:** ```bash kilocode --api-base http://localhost:20128/v1 --api-key sk-your-omniroute-key ``` **إعدادات VS Code:** ```json { "kilo-code.openAiBaseUrl": "http://localhost:20128/v1", "kilo-code.apiKey": "sk-your-omniroute-key" } ``` أو استخدم لوحة معلومات OmniRoute ← **أدوات CLI ← KiloCode ← تطبيق الإعداد**. --- #### Continue (إضافة VS Code) حرّر `~/.continue/config.yaml`: ```yaml models: - name: OmniRoute provider: openai model: auto apiBase: http://localhost:20128/v1 apiKey: sk-your-omniroute-key default: true ``` أعد تشغيل VS Code بعد التحرير. --- #### VS Code Insiders (`chatLanguageModels.json`) استخدم هذا عندما يكون VS Code Insiders مهيّأً لنماذج نقاط نهاية مخصصة، وتريد أن يعمل OmniRoute من دون حقل ترويسة مخصص. **الموقع الموصى به:** - Linux: `~/.config/Code - Insiders/User/chatLanguageModels.json` - Windows: `%APPDATA%/Code - Insiders/User/chatLanguageModels.json` **مثال باستخدام الاسم المستعار المرمّز لـ OmniRoute:** ```json [ { "vendor": "customendpoint", "id": "auto", "name": "OmniRoute Auto", "family": "gpt-4", "version": "1.0.0", "url": "http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/chat/completions", "modelsUrl": "http://localhost:20128/api/v1/vscode/sk-your-omniroute-key/models", "requestFormat": "openai-chat-completions", "contextWindow": 256000, "maxOutputTokens": 32768, "auth": { "type": "none" } } ] ``` **ملاحظات:** - استبدل `sk-your-omniroute-key` بمفتاح API تم إنشاؤه في OmniRoute. - يجب أن يشير الحقل `url` إلى `/api/v1/vscode/{token}/chat/completions`. - يجب أن يشير الحقل `modelsUrl` إلى `/api/v1/vscode/{token}/models`. - يُفضّل استخدام المسار المعتاد `/v1` مع ترويسة Bearer عندما يدعم العميل الترويسات المخصصة. - تُعد الرموز المضمّنة في عناوين URL خيارًا احتياطيًا للتوافق، وقد تظهر في سجلات المحرر أو سجل الوكيل. --- #### Kiro CLI (Amazon) ```bash # سجّل الدخول إلى حساب AWS/Kiro الخاص بك: kiro-cli login # تستخدم CLI مصادقتها الخاصة — لا يلزم OmniRoute كخلفية لـ Kiro CLI نفسها. # استخدم kiro-cli إلى جانب OmniRoute للأدوات الأخرى. kiro-cli status ``` بالنسبة إلى تطبيق سطح المكتب **Kiro IDE**، استخدم نقطة نهاية MITM التي يوفّرها OmniRoute ضمن `/dashboard/cli-tools → Kiro`. --- ## 10. واجهة سطر الأوامر الداخلية لـ OmniRoute يوفّر الملف التنفيذي `omniroute` أوامر لإدارة دورة حياة الخادم، والإعداد، والتشخيصات، وإدارة المزوّدين. نقطة الدخول: `bin/omniroute.mjs`. ```bash omniroute # تشغيل الخادم (المنفذ الافتراضي 20128) omniroute setup # معالج إعداد تفاعلي omniroute doctor # فحص الإعدادات وقاعدة البيانات والمنافذ وبيئة التشغيل omniroute providers list # اتصالات المزوّدين المُهيأة omniroute providers test-all # اختبار كل اتصال نشط omniroute reset-password # إعادة تعيين كلمة مرور المسؤول omniroute logs # بث سجلات الطلبات omniroute health # حالة صحية تفصيلية (قواطع الدائرة، وذاكرة التخزين المؤقت، والذاكرة) omniroute --version # طباعة الإصدار omniroute --help # عرض جميع الأوامر ``` ### الإعداد والتهيئة ```bash omniroute setup # معالج إعداد تفاعلي omniroute setup --non-interactive # وضع CI/الأتمتة (يقرأ متغيرات البيئة والعلامات) omniroute setup --password '' # تعيين كلمة مرور المسؤول مباشرةً omniroute setup --add-provider \ --provider openai \ --api-key '' \ --test-provider # إضافة مزوّد واختباره في خطوة واحدة ``` متغيرات البيئة المعروفة للإعداد غير التفاعلي: | المتغير | الغرض | | ------------------- | --------------------------------------------------------------- | | `OMNIROUTE_API_KEY` | مفتاح API للمزوّد (مرتبط بـ `--api-key` عبر Commander `.env()`) | | `DATA_DIR` | تجاوز دليل بيانات OmniRoute | تُمرَّر جميع المُدخلات غير التفاعلية الأخرى كعلامات، وليس كمتغيرات بيئة: `--password`، و`--provider`، و`--provider-name`، و`--provider-base-url`، و`--default-model` (راجع خيارات `omniroute setup` أعلاه). ### التشخيصات ```bash omniroute doctor # فحص الإعدادات وقاعدة البيانات والمنافذ وبيئة التشغيل والذاكرة وحيوية الخادم omniroute doctor --json # JSON قابل للقراءة آليًا omniroute doctor --no-liveness # تخطي فحص صحة HTTP omniroute doctor --host 0.0.0.0 # تجاوز مضيف فحص الحيوية omniroute doctor --liveness-url # تجاوز URL الكامل لنقطة نهاية الصحة ``` ينفّذ الأمر doctor الفحوصات التالية: `Config`، و`Database`، و`Storage/encryption`، و`Port availability`، و`Node runtime`، و`Native binary` ‏(better-sqlite3)، و`Memory`، و`Server liveness`. وينهي التنفيذ برمز غير صفري إذا كانت نتيجة أي فحص هي `fail`. ### إدارة المزوّدين ```bash omniroute providers available # كتالوج مزوّدي OmniRoute omniroute providers available --search openai # تصفية الكتالوج حسب المعرّف/الاسم/الاسم البديل/الفئة omniroute providers available --category api-key # التصفية حسب الفئة (api-key، oauth، free، ...) omniroute providers available --json # JSON قابل للقراءة آليًا omniroute providers list # اتصالات المزوّدين المُهيأة omniroute providers list --json omniroute providers test # اختبار اتصال مُهيأ واحد omniroute providers test-all # اختبار كل اتصال نشط omniroute providers validate # تحقق بنيوي محلي فقط omniroute providers add --credential-env PROVIDER_KEY omniroute providers import ./providers.json --dry-run --json omniroute providers auth # تدفق OAuth الحالي omniroute providers edit --default-model omniroute providers remove --yes ``` تعمل أوامر `providers add/import/auth/edit/remove` وفق نهج API أولًا، ولذلك تعمل مع السياق المحلي أو البعيد النشط. ينبغي إدخال بيانات الاعتماد باستخدام `--credential-stdin` أو `--credential-env`؛ ويعرض `--dry-run --json` فقط معلومات الوجود/البنية المنقّحة. يقرأ `providers available` كتالوج OmniRoute؛ وتحتفظ أوامر `providers list/test/test-all/validate` بسلوك SQLite المحلي الخاص بها، ولا تتطلب تشغيل الخادم. بالنسبة إلى عقدة مخصّصة متوافقة مع OpenAI أو Anthropic، اربط بيانات الاعتماد بمعرّف العقدة الذي يعيده `omniroute nodes add`، باستخدام `omniroute keys add "$NODE_ID" --stdin`. يتطلب ذلك خادمًا قيد التشغيل ومصادقة إدارية للسياق النشط. تستخدم واجهة سطر الأوامر `POST /api/providers`، التي تتحقق من صحة العقدة وتنسخ إعدادات نقطة نهايتها إلى الاتصال. يؤدي عدم وجود العقدة، أو فشل التفويض، أو عدم توفر الخادم إلى إرجاع خطأ من دون إنشاء بيانات اعتماد احتياطية محلية. يعيّن `nodes add --base-url` نقطة نهاية العقدة؛ وهي تختلف عن عنوان الخادم في `OMNIROUTE_BASE_URL`. بالنسبة إلى ملفات OpenAPI، استخدم `omniroute openapi dump --format json --out ./openapi.json`؛ ويحدد الخيار العام `--output` تنسيق عرض واجهة سطر الأوامر، وليس اسم ملف الوجهة. ### الاسترداد وإعادة التعيين ```bash omniroute reset-password # إعادة تعيين كلمة مرور المسؤول (أيضًا: omniroute-reset-password) omniroute reset-encrypted-columns # عرض تحذير + تشغيل تجريبي لإعادة تعيين بيانات الاعتماد المشفرة omniroute reset-encrypted-columns --force # تصفير بيانات الاعتماد المشفرة فعليًا في SQLite ``` ### تصدير بيانات الاعتماد (⚠ تعامل معها بحذر) ```bash omniroute auth export # عرض تحذير + طلب تأكيد — دون الوصول إلى قاعدة البيانات omniroute auth export --force # تصدير بيانات الاعتماد المفكوكة التشفير لجميع الاتصالات إلى stdout بصيغة JSON omniroute auth export --force --id # تصدير الاتصال المطابق فقط omniroute auth export --force --format env # إخراج أسطر OMNIROUTE__= omniroute auth export --force --out creds.json # الكتابة إلى ملف (يُنشأ بأذونات 0600) ``` `auth export` يعمل **محليًا فقط** (قراءة مباشرة من SQLite، دون مسار HTTP)، ويطبع/يكتب عمدًا قيم `apiKey`/`accessToken`/`refreshToken`/`idToken` **بنص صريح** — وهذه ميزة وليست خطأً. لا تتم قراءة أي شيء من قاعدة البيانات، ولا يُفك تشفير أي شيء، دون `--force`. يظهر دائمًا شريط تحذير على stderr قبل إخراج أي نص صريح. يتطلب تعيين `STORAGE_ENCRYPTION_KEY`. يتم الإبلاغ عن الحقل الذي يفشل فك تشفيره (مفتاح قديم، أو نص مُشفّر تالف) بصيغة `DecryptFailed: true` بدلًا من إيقاف عملية التصدير بأكملها أو كشف الخطأ الأساسي. ### الأوامر الفرعية الأخرى تفترض هذه الأوامر وجود خادم OmniRoute قيد التشغيل، ما لم يُذكر خلاف ذلك: ```bash omniroute status # حالة شاملة لوقت التشغيل omniroute logs # بث سجلات الطلبات (--json، --search، --follow) omniroute config list # عرض أدوات CLI المُهيأة omniroute provider list # سرد المزوّدين المتاحين (اسم مستعار للأمر providers list) omniroute provider add # تسجيل OmniRoute كمزوّد في أداة omniroute keys add | list | remove # إدارة مفاتيح API omniroute models [provider] # سرد النماذج (--json، --search) omniroute combo list | switch | create | delete omniroute backup # أخذ لقطة للإعدادات + قاعدة البيانات omniroute restore # الاستعادة من لقطة سابقة omniroute health # حالة صحية مفصّلة (قواطع الدائرة، ذاكرة التخزين المؤقت، الذاكرة) omniroute quota # استخدام حصة المزوّد omniroute cache # حالة ذاكرة التخزين المؤقت omniroute cache clear # مسح ذاكرات التخزين المؤقت الدلالية والخاصة بالتوقيعات omniroute mcp status | restart # حالة خادم MCP / إعادة تشغيله omniroute a2a status | card # حالة خادم A2A / بطاقة الوكيل omniroute tunnel list | create | stop # إدارة الأنفاق (cloudflare/tailscale/ngrok) omniroute env show | get | set # فحص / تعيين متغيرات البيئة (مؤقتًا) omniroute test # اختبار أولي لاتصال المزوّد omniroute update # التحقق من وجود تحديثات omniroute completion # إنشاء الإكمال التلقائي للصدفة ``` ### الخيارات الشائعة | الخيار | الوصف | | ------------------- | -------------------------------------------------------- | | `--no-open` | عدم فتح المتصفح تلقائيًا عند بدء التشغيل | | `--port ` | تجاوز منفذ API (الافتراضي 20128) | | `--mcp` | التشغيل كخادم MCP عبر stdio (لبيئات IDE) | | `--non-interactive` | وضع CI (دون مطالبات؛ يقرأ من البيئة/الخيارات) | | `--json` | مخرجات JSON قابلة للقراءة آليًا (doctor، providers، إلخ) | | `--help`, `-h` | عرض المساعدة الخاصة بالأمر | | `--version`, `-v` | طباعة الإصدار المُثبّت | --- ## نقاط نهاية API المتاحة | نقطة النهاية | الوصف | الاستخدام | | -------------------------- | ----------------------------------- | ------------------------------------- | | `/v1/chat/completions` | الدردشة القياسية (جميع المزوّدين) | جميع الأدوات الحديثة | | `/v1/responses` | واجهة Responses API (بتنسيق OpenAI) | Codex، وسير عمل الوكلاء | | `/v1/completions` | إكمالات النص القديمة | الأدوات القديمة التي تستخدم `prompt:` | | `/v1/embeddings` | تضمينات النص | RAG، والبحث | | `/v1/images/generations` | توليد الصور | GPT-Image، وFlux، وغيرها | | `/v1/audio/speech` | تحويل النص إلى كلام | ElevenLabs، وOpenAI TTS | | `/v1/audio/transcriptions` | تحويل الكلام إلى نص | Deepgram، وAssemblyAI | أمثلة جاهزة للصق باستخدام عنوان URL مرمّز لـ OmniRoute: ```txt مثال على الرمز: sk-a3ab3c080beaee3a-69f4a4-070d71af عنوان OpenAI الأساسي القياسي: http://localhost:20128/v1 نماذج VS Code: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/models دردشة VS Code: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/chat/completions استجابات VS Code: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/responses وسوم Ollama: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/tags دردشة Ollama: http://localhost:20128/api/v1/vscode/sk-a3ab3c080beaee3a-69f4a4-070d71af/api/chat ``` --- ## استكشاف الأخطاء وإصلاحها | الخطأ | السبب | الحل | | ---------------------------------------------- | -------------------------------- | ------------------------------------------------------- | | `Connection refused` | OmniRoute غير مشغّل | `omniroute serve` | | `401 Unauthorized` | مفتاح API غير صحيح | تحقّق في `/dashboard/api-manager` | | `No combo configured` | لا توجد تركيبة توجيه نشطة | قم بإعدادها في `/dashboard/combos` | | تعرض CLI الرسالة "not installed" | الملف التنفيذي غير موجود في PATH | تحقّق باستخدام `which ` | | تعرض لوحة المعلومات "not detected" بعد التثبيت | ذاكرة التخزين المؤقت قديمة | انقر فوق "⟳ تحديث الاكتشاف" في لوحة المعلومات | | الرابط القديم `/dashboard/cli-tools` | إشارة مرجعية لما قبل v3.8.6 | يُعاد توجيهه تلقائيًا إلى `/dashboard/cli-code` (308) | | الرابط القديم `/dashboard/agents` | إشارة مرجعية لما قبل v3.8.6 | يُعاد توجيهه تلقائيًا إلى `/dashboard/acp-agents` (308) | ## إدارة سياسة مفتاح الاستدلال باستخدام OmniRoute CLI استخدم سياق إدارة موثّقًا (راجع [الوضع البعيد](../guides/REMOTE-MODE.md)) لفحص مفتاح استدلال موجود أو تحديثه باستخدام معرّفه: ```bash omniroute --output json keys policy show KEY_ID omniroute keys policy set KEY_ID --unrestricted omniroute --output json keys policy show KEY_ID ``` يمثل `--unrestricted` اسمًا بديلًا لـ `--model-access-mode all`. يؤدي التحديث إلى مسح قائمة النماذج المسموح بها. ويحافظ على النطاقات وقواعد الاتصال والنماذج المحظورة وحدود المعدل وحدود التكلفة، ولذلك لا يزال بإمكان عناصر التحكم الأخرى هذه رفض الطلب. يؤدي تحديد `--allowed-models ""` صراحةً أيضًا إلى اختيار `all`؛ ادمجه مع `--model-access-mode restricted` للإبقاء على مفتاح مقيّد من دون نماذج مسموح بها. تؤدي قائمة غير فارغة مفصولة بفواصل إلى اختيار `restricted` ما لم يُحدَّد خلاف ذلك صراحةً. يُرفض الجمع المتعارض بين `all` وقائمة سماح غير فارغة قبل إرسال الطلب. يضبط `--rate-limit 30` عدد الطلبات في الدقيقة ويحافظ على قواعد الفترات الزمنية الأخرى. يفعّل `--max-cost 5` الحد اليومي بالدولار الأمريكي من دون تغيير الحد الأسبوعي؛ ويزيل `--max-cost 0` الحد اليومي مع الحفاظ على مفتاح تبديل حد الاستخدام الحالي والحد الأسبوعي. تظل حقول السياسة المحذوفة دون تغيير. تقرأ تغييرات المعدل السياسة الحالية أولًا؛ تجنّب إجراء تعديلات متزامنة على مصفوفة حدود المعدل للمفتاح نفسه. تستخدم أوامر السياسة الطلبين الموثّقين `GET`/`PATCH /api/keys/{id}` وتلتزم بالسياق النشط وخيار `--api-key` العام. يحتوي إخراج JSON على حقول السياسة فقط، من دون المفتاح المخزّن أو تمثيله المحجوب. لا يمكن لبيانات اعتماد مخصّصة للاستدلال فقط تخويل تغييرات الإدارة. تتطلب استجابة 401/403 التحقق من بيانات اعتماد الإدارة والسياق؛ وهي لا تثبت وجود فشل في رمز CLI المحلي أو قيمة salt. راجع [رمز CLI](../security/CLI_TOKEN.md) للاطلاع على عقد المصادقة المحلية المنفصل.