Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 63 additions & 63 deletions docs/ar/policies/builtin-catalog.mdx

Large diffs are not rendered by default.

53 changes: 39 additions & 14 deletions docs/ar/policies/failure-behavior.mdx
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
---
---
title: "سلوك الفشل"
description: "افهم ما يحدث عندما يكون تقييم السياسة أو مستودع الملفات المحلي غير متاح."
description: "افهم ما يحدث عند عدم توفر تقييم السياسة أو daemon المحلي."
icon: "shield-alert"
---

تم تصميم Failproof AI بحيث يكون فشل الإنفاذ مرئياً بدلاً من السماح بصمت بعمل محفوف بالمخاطر.
تم تصميم Failproof AI بحيث يكون فشل الإنفاذ مرئياً بدلاً من السماح الصامت بعمل محفوف بالمخاطر.

## تشخيص كتلة الفشل المغلقة
## تشخيص كتلة مغلقة الفشل

<Tabs>
<Tab title="لوحة التحكم">
1. انتقل إلى **Admin → enforcement** وافتح الجهاز.
2. تحقق من آخر تسجيل دخول له والنشر المعين والنشر المبلغ عنه.
1. انتقل إلى **Admin → enforcement** وافتح الآلة.
2. تحقق من آخر تسجيل دخول، والنشر المعين، والنشر المبلغ عنه.
3. انتقل إلى **Observe → policy** وافتح جلسة القرار المرفوض.
4. تأكد مما إذا كان السبب يبلغ عن إمكانية الوصول إلى مستودع الملفات أو عدم تطابق الإصدار أو السياسة نفسها.
4. تأكد مما إذا كان السبب يشير إلى إمكانية الوصول إلى daemon أم عدم التطابق في الإصدار أم السياسة نفسها.

</Tab>
<Tab title="CLI">
Expand All @@ -23,21 +24,45 @@ icon: "shield-alert"
failproofai config
```

إعادة تشغيل `failproofai config` تحدّث وتعيد تشغيل مستودع الملفات بعد ترقية الحزمة.
إعادة تشغيل `failproofai config` يحدّث ويعيد تشغيل daemon بعد ترقية الحزمة.
</Tab>
</Tabs>

على جهاز تم تكوينه للاستخدام مع `failproofaid`، مستودع الملفات هو المقيّم الوحيد. إذا كان غير قابل للوصول أو كان إصدار البروتوكول الخاص به غير متطابق مع CLI، يفشل تقييم الخطاف بشكل مغلق. يتم رفض الإجراء مع سبب يوجه المشغل للتحقق من مستودع الملفات أو تحديثه.
على آلة تم تكوينها لاستخدام `failproofaid`، يكون daemon هو المقيّم الوحيد. إذا كان غير قابل للوصول أو كان إصدار البروتوكول الخاص به لا يطابق CLI، يفشل تقييم hook بشكل مغلق. يتم رفض الإجراء مع سبب يوجه المشغل إلى التحقق من daemon أو تحديثه.

قبل تكوين مستودع الملفات، تقيّم الخطاطيف السياسات في العملية. بمجرد تسجيل تكوين مستودع الملفات، لا يعود Failproof AI إلى مقيّم ثانٍ بصمت عند فشل مستودع الملفات.
قبل تكوين daemon، تقيّم hooks السياسات أثناء المعالجة. بمجرد تسجيل تكوين daemon، لا يعود Failproof AI إلى تقييم ثاني بصمت عند فشل daemon.

## الرد على قرار الفشل المغلق
## الاستجابة لقرار مغلق الفشل

1. قم بتشغيل `failproofai config --status`.
2. إذا اختلفت الإصدارات، أعد تشغيل `failproofai config` بعد تحديث الحزمة.
3. إذا كان مستودع الملفات غير قابل للوصول، افحص حالة خدمته والسجلات المحلية.
4. استأنف عمل الوكيل فقط بعد التحقق من صحة مسار تقييم السياسة المعروف.
3. إذا كان daemon غير قابل للوصول، افحص حالة الخدمة وسجلات الملف الشخصي المحلي.
4. استأنف عمل agent فقط بعد التأكد من أن مسار تقييم السياسة المعروف سليم.

<Warning>
لا تعيد محاولة الإجراء المحظور بشكل متكرر. رد الفشل المغلق يعني أن النظام لم يتمكن من التأكد من أن الإجراء كان آمناً.
</Warning>
لا تحاول تكرار الإجراء المحظور بشكل متكرر. استجابة مغلقة الفشل تعني أن النظام لم يتمكن من إثبات أن الإجراء كان آمناً.
</Warning>

## لن يتم تحميل الحزمة

آلة تم إخبارها بفرض حزمة، ولا يمكنها تشغيلها، ترفض بدلاً من المتابعة بصمت. المحفز هو **توقع مسجل**، وليس توقع فارغ: آلة بدون حزم مثبتة تكون صامتة، بينما حزمة تم إعلانها ولن تُحل — أو تسجل أقل من ما يعلنه البيان الخاص بها — ترفض.

الرفض **ضيق**، على عكس daemon غير قابل للوصول. daemon الذي لا يمكن الوصول إليه يعني أنه لم يحدث أي تقييم على الإطلاق، لذلك لا يمكن معرفة شيء آمن. حزمة لن تتحمل لديها مجموعة قابلة للعد من الحراس المفقودين، لأن كل سياسة معلنة تحمل `match` خاصة بها — لذلك ترفض فقط الأحداث والأدوات التي غطتها تلك السياسات، وكل شيء آخر يمضي قدماً.

لا تنطلق بسبب:

- حزمة `observe`، التي تقيّم وتتجاهل بالبناء
- سياسات لم تأخذها، أو أوقفتها بشكل صريح
- حزمة لم يتلقاها المحمّل، حيث لا يمكن التمييز بين «لا تسجيلات» و تخطي متعمد
- توقف جلسة نشطة
- مهلة زمنية للتحميل، وهي عابرة — لحظة قرص واحدة بطيئة يجب ألا ترفض حتى يتدخل إنسان

`UserPromptSubmit` **توجه** بدلاً من الرفض، مهما أعلنت السياسة المفقودة. رفض شامل سيأخذ معه ويغلقك خارج agent الذي يمكنه إصلاح المشكلة.

### ماذا تفعل

```bash
failproofai pack list
```

يسمي أي حزمة مثبتة لن يتم تحميلها، ويقول السبب، ويخرج برمز غير صفر. ثم إما أعد تثبيتها (`failproofai pack add <source>`) أو أزلها (`failproofai pack remove <publisher/name>`) — إزالتها تسحب التوقع، والرفض يتوقف معها.
110 changes: 110 additions & 0 deletions docs/ar/policies/packs.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
---
title: "حزم السياسات"
description: "قم بتثبيت مجموعة من السياسات المنشورة كإصدار GitHub، وأدر ما تفرضه."
icon: "package"
---

الحزمة عبارة عن مجموعة من السياسات المنشورة كإصدار GitHub. أمر واحد يثبتها، ويتم التحقق من قيم تجزئة الإصدار قبل تشغيل أي شيء، ويتم تسجيل البصمة بحيث لا يمكن للحزمة أن تتغير على جهازك بعد ذلك.

## قم بتثبيت سياسات Failproof AI

```bash
failproofai pack add core
```

هذا يثبت المجموعة التي ننشرها، من النسخة داخل الحزمة — لذلك لا تحتاج إلى شبكة ولا يمكن أن تفشل خلف وكيل. خذ جزءًا منها:

```bash
failproofai pack add core --policy block-rm-rf # واحدة، أو عدة مفصولة بفواصل
failproofai pack add core --category dangerous-commands # فئة كاملة
failproofai pack add core --all # كل شيء فيها
```

يسمي `failproofai pack list` كل فئة تقدمها الحزمة.

## اطلع على محتويات الحزمة، قبل تثبيتها

```bash
failproofai pack list acme/support-agent
```

يسرد كل سياسة تحملها الحزمة، مجمعة حسب الفئة، مع تحديد أيها يفعّلها مؤلفها افتراضيًا وأيها اختيارية. يقرأ **البيان فقط** — لا يتم أبدًا تنزيل القطعة الرئيسية ولا استيرادها، لذا فإن النظر إلى حزمة غريب لا يمكن أن يشغل كود غريب. البيان لا يزال يتحقق منه مقابل `SHA256SUMS` الخاص بالإصدار، لذا ما تقرأه هو ما سيتم تثبيته.

يسرد `failproofai pack list` بدون مصدر الحزم المثبتة بالفعل هنا.

## قم بتثبيت حزمة شخص آخر

```bash
failproofai pack add acme/support-agent
```

أي من هذه تعمل — الصق أيًا منها لديك:

| المصدر | النتيجة |
| --- | --- |
| `acme/support-agent` | أحدث إصدار، **محدد** بالعلامة الدقيقة التي تم حلها |
| `acme/support-agent@v2.1.0` | هذا الإصدار |
| `github:acme/support-agent@v2.1.0` | نفس الشيء، مكتوب بوضوح |
| `https://github.com/acme/support-agent/releases/tag/v2.1.0` | نفس الشيء، تم نسخه من متصفح |

عدم تسمية علامة يثبت أحدث إصدار **ويحددها**، ثم يخبرك بالعلامة التي اختارها. ما يتم تسجيله دائمًا يسمي بالضبط إصدارًا واحدًا، لذا لا يمكن لإعادة التثبيت أن تنجرف.

## خذ جزءًا من الحزمة

بشكل افتراضي تحصل على **الافتراضيات الخاصة** بالحزمة — السياسات التي وضع مؤلفها علامة عليها آمنة للتشغيل دون مراقبة — وليس كل ما تحتويه.

```bash
failproofai pack add acme/support-agent --category billing,git
failproofai pack add acme/support-agent --policy block-refunds
failproofai pack add acme/support-agent --all
```

يتم دمج `--category` و `--policy` كاتحاد (`--only` مقبول كمرادف لـ `--policy`). إضافة مجددًا بإصدار أحدث تحتفظ بما اخترته بدلاً من إعادة تشغيل الباقي.

## أدر ما هو قيد التشغيل

```bash
failproofai policies # كل مصدر في قائمة واحدة، الحزم مضمنة
failproofai pack list # الحزم فقط، مجمعة حسب الفئة
failproofai policies --uninstall block-refunds # أوقف سياسة حزمة واحدة
failproofai policies --install block-refunds # وإعادة تشغيلها
failproofai pack remove acme/support-agent
```

الاسم العادي يعني **المدمج** عندما يكون موجودًا بهذا الاسم. اذكر نسخة الحزمة بوضوح عندما تحتاج إلى:

```bash
failproofai policies --uninstall acme/support-agent:block-refunds
```

<Note>
إذا كانت الحزمة تشحن سياسة اسمها هو أيضًا **مدمج مفعّل**، يتم تشغيل المدمج وتخطي نسخة الحزمة — سيتم تقييم نفس الحماية مرتين وإلا. أوقف المدمج لاستخدام نسخة الحزمة بدلاً من ذلك.
</Note>

## من أين تأتي سياسات Failproof AI

يقرأ `core` النسخة المدرجة في حزمة npm. نفس المجموعة منشورة كإصدار GitHub، وهو ما تثبته إذا كنت تريد إصدارًا محددًا:

```bash
failproofai pack add core # من هذه الحزمة، بدون شبكة
failproofai pack add FailproofAI/policies # نفس المجموعة، من إصدار GitHub الخاص بها
```

## ما الذي توفره السلامة الكاملة وما الذي لا توفره

`SHA256SUMS` مرسلة في نفس الإصدار مثل القطعة، لذا فهي **ليست** توقيعًا ولا تثبت شيئًا عن هوية ناشرها. ما تثبته هو أن البايتات هي الموجودة في ذلك الإصدار — وبسبب تسجيل البصمة عند إضافة الحزمة وإعادة التحقق منها قبل كل استيراد، لا يمكن للحزمة أن تتغير على جهازك بعد ذلك. يتوقف المستودع الذي يُعيد وسم أو يستبدل أحد الأصول عن التحميل بدلاً من تشغيل شيء آخر بهدوء.

في وقت التثبيت، يتم أيضًا **استيراد الحزمة مرة واحدة** والتحقق منها مقابل بيانها الخاص. يتم رفض الحزمة التي لا يمكن تحليل قطعتها أو التي تسجل شيئًا مختلفًا عما تعلنه قبل تفعيل أي شيء — بدلاً من التثبيت بنجاح والفشل في استدعاء الأداة التالية.

## عندما لن تحميل الحزمة

الحزمة التي تم إخبار هذا الجهاز بفرضها ولا يمكنه تشغيلها **ترفض** الأحداث التي غطتها سياساته المفقودة، بدلاً من السماح بها صمتًا. انظر [سلوك الفشل](/ar/policies/failure-behavior). `failproofai pack list` يسمي أي حزمة في تلك الحالة ويخرج بقيمة غير صفرية.

## بلا اتصال والمرايا

| المتغير | التأثير |
| --- | --- |
| `FAILPROOFAI_NO_DOWNLOAD=1` | يرفض الجلب؛ الحزم المثبتة بالفعل تستمر في الفرض |
| `FAILPROOFAI_PACK_BASE_URL` | يوجه جلب الحزم إلى مرآة بدلاً من `github.com` |

نشر حزمتك الخاصة: انظر [نشر حزمة](/ar/policies/publish-a-pack).
92 changes: 92 additions & 0 deletions docs/ar/policies/publish-a-pack.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
---
---
title: "نشر حزمة"
description: "شحن سياساتك الخاصة كإصدار GitHub يمكن لأي شخص تثبيته."
icon: "upload"
---

الحزمة عبارة عن ثلاثة ملفات مرفقة بإصدار GitHub. يكتب `failproofai pack build` جميع الثلاثة من ملف سياسة لديك بالفعل.

## 1. اكتب السياسات

ملف واحد، يستخدم نفس الواجهة البرمجية لأي سياسة مخصصة. يهمان حقلان إضافيان للحزمة:

```js
import { customPolicies, deny, allow } from "failproofai";

customPolicies.add({
name: "block-refunds",
description: "Refunds above the approved limit need a human",
category: "Billing", // groups it, and is what --category selects on
defaultEnabled: true, // switched on by a plain `pack add`
match: { events: ["PreToolUse"], tools: ["Bash"] },
fn: async (ctx) =>
String(ctx.toolInput?.command ?? "").includes("refund")
? deny("Refunds need a human. Ask before running this.")
: allow(),
});
```

يتم تعيين `defaultEnabled` افتراضيًا إلى **false** عند حذفه. `failproofai pack add` البسيط يقوم بتشغيل فقط ما حددته — تثبيت كل سياسة من سياسات الغريب دون مراقبة ليست قرارًا يجب على المثبت أن يتخذه للمستخدم.

<Warning>
يجب أن يكون الإدخال **ملف واحد مكتفٍ بذاته**. فقط الإدخال هو ما يتم تثبيت الخلاصة عليه، لذا فإن حزمة تستورد ملفات محلية لا يمكنها بصراحة المطالبة بأن الخلاصة تغطي ما يعمل. قم بالدمج أولاً (`esbuild` أو `bun build` أو `rollup`) وأنشئ الحزمة من الحزمة المدمجة — يرفض `pack build` الاستيراد المحلي بدلاً من شحن وعد لا يمكنه الوفاء به.
</Warning>

## 2. بناء أصول الإصدار

```bash
failproofai pack build ./policies.mjs \
--id acme/support-agent \
--version 1.0.0 \
--out ./dist-pack
```

يكتب ثلاثة ملفات ويتحقق من صحة كل سياسة باستخدام **قواعد المُحمِّل الخاصة** أولاً — لذا فإن الحزمة التي لن تتمكن من التثبيت تفشل هنا، حيث يمكنك إصلاحها:

| الملف | ما هو |
| --- | --- |
| `failproofai-pack.json` | البيان: المعرّف والإصدار والتأثير وإدخال واحد لكل سياسة |
| `failproofai-pack.mjs` | إدخالك، كما هو حرفيًا |
| `SHA256SUMS` | `<sha256> <filename>` للملفين الآخرين |

تم الرفض عند وقت البناء: معرف ليس `publisher/name`، اسم سياسة يحتوي على `/`، سياسة تعلن `alwaysOn`، وصف مفقود أو `category` أو `match`، إدخال لا يسجل أي شيء، وإدخال يستورد ملفات محلية.

## 3. أرفقها بإصدار

ضع علامة على الإصدار بنفس الإصدار الذي أنشأته، وأرفق جميع الملفات الثلاثة كأصول الإصدار:

```bash
gh release create 1.0.0 \
./dist-pack/failproofai-pack.json \
./dist-pack/failproofai-pack.mjs \
./dist-pack/SHA256SUMS
```

يمكن لأي شخص الآن تثبيته:

```bash
failproofai pack add acme/support-agent
```

أسماء الأصول ثابتة — وهي ما ينشئها CLI الخاص بالمستهلك من عناوين URL الخاصة به، بدون استدعاء API وبدون اكتشاف.

## شحن إصدار جديد

قم بالبناء باستخدام `--version` الجديد، وضع علامة على إصدار جديد، وأرفق الأصول الثلاثة مرة أخرى. يقوم المستهلكون بتشغيل نفس `pack add` والاحتفاظ بأي مجموعة اختاروها؛ تبقى السياسة التي أطفأوها مطفأة عبر الترقية.

تغيير **اسم** السياسة هو تغيير كسر: جهاز قام بإيقاف تشغيله يقوم بإيقاف تشغيل اسم لم يعد موجودًا، والاسم الجديد يصل إلى أيًا كان `defaultEnabled` يقول.

## ما يثق به المستخدمون

`SHA256SUMS` يعيش في نفس الإصدار مثل الأصل، لذا فإنه يثبت أن البايتات هي تلك التي نشرتها — وليس من أنت. أي شخص يمكنه الكتابة إلى المستودع يمكنه كتابة كلا الملفين. حماية المستخدمين هي أن الخلاصة يتم تثبيتها عند التثبيت، بحيث لا يمكن لما شحنته أن يتغير تحتهم بعد ذلك.

قم بالنشر من مستودع يمكنك التحكم في الوصول الكتابي إليه، وتعامل مع إصدار حزمة مثل نشر حزمة.

## راقب قبل أن تفرض

قد يعلن البيان عن `"effect": "observe"`. تعمل تلك السياسات وتُسجل أحكامها **وتُرفض** — لا شيء محجوب. إنها الطريقة لقياس قاعدة جديدة مقابل حركة المرور الحقيقية قبل أن تتمكن من مقاطعة عمل أي شخص.

```json
{ "id": "acme/support-agent", "version": "1.1.0", "effect": "observe", "policies": [ ... ] }
```
Loading