---
title: الأحداث
description: 'كل حدث Laravel يطلقه LaRecipe، ومتى يُطلق كل منها، وحمولته مقروءة من التطبيق أثناء تشغيله، وكيف يُحدَّد نوع الطلب.'
url: 'https://larecipe.saleem.dev/ar/3.x/reference/events'
version: 3.x
locale: ar
last_updated: '2026-10-18'
---

> Docs index: https://larecipe.saleem.dev/3.x/llms.txt · MCP: https://larecipe.saleem.dev/mcp · Skill: https://larecipe.saleem.dev/skill.md

# الأحداث

كل حدث Laravel يطلقه LaRecipe. لا يخزّن LaRecipe أي بيانات عن الزيارات ولا أي ملاحظات: تطبيقك هو الذي يستمع إليها ويمرّرها. ولما يمكنك فعله بها، راجع [التحليلات والأحداث](https://larecipe.saleem.dev/ar/3.x/operate/analytics.md).

```php
use Illuminate\Support\Facades\Event;
use LaRecipe\Domains\Delivery\Events\PageViewed;

Event::listen(function (PageViewed $event) {
    // $event->set, $event->page->path, $event->format, $event->kind
});
```

أحداث الزيارات في `LaRecipe\Domains\Delivery\Events`، وأحداث المحتوى في `LaRecipe\Domains\Sources\Events`. يُقرأ كل جدول حمولة أدناه من هذا التطبيق عبر [مرجع حي `<Event>`](https://larecipe.saleem.dev/ar/3.x/writing/live-references.md)، مع مستمعي هذا التطبيق (لا يملك مستمعًا إلا `ContentChanged`، ومستمعه هو الذي يملأ به LaRecipe الذاكرة المؤقتة مسبقًا).

## نوع الطلب

تحمل أحداث الزيارات `kind`، وقيمته `human` أو `crawler` أو `agent`. وتحدّده أول قاعدة تنطبق:

| الترتيب | متى | النوع |
| --- | --- | --- |
| 1 | يحتوي الـ user agent على اسم زاحف: `ClaudeBot`، `GPTBot`، `PerplexityBot`، `Googlebot`، `Bingbot`، `Applebot`، `CCBot`، `Bytespider`، `Amazonbot`، `DuckDuckBot`، `YandexBot`، `facebookexternalhit`، `Slackbot`، `Twitterbot` أو `LinkedInBot` | `crawler` |
| 2 | يحتوي الـ user agent على اسم وكيل أو عميل HTTP، بأي حالة أحرف: `Claude-User`، `Claude-Code`، `ChatGPT-User`، `Perplexity-User`، `OAI-SearchBot`، `Cursor`، `codex`، `GoogleAgent`، `MistralAI-User`، `axios`، `node-fetch`، `python-requests`، `curl`، `Go-http-client` أو `undici` | `agent` |
| 3 | يطلب الطلب Markdown: رابط `.md`، أو `Accept: text/markdown` | `agent` |
| 4 | أي شيء آخر | `human` |

الملفات `llms.txt` و `llms-full.txt` و `skill.md`، وملفات المهارات المكتوبة يدويًا، وفهرس المهارات، ونقطة النهاية `/ask` موجودة للوكلاء، فأي جلب لها لا يطلب HTML يُعدّ `agent` ما لم يسمِّ الـ user agent فيه زاحفًا. واستدعاءات MCP دائمًا `agent`. ولا يغذّي النوع إلا الأحداث: لا يغيّر أبدًا ما يُقدَّم.

## أحداث الزيارات

### PageViewed

يُطلق لكل صفحة تُقدَّم بصيغة HTML، أو بصيغة Markdown، أو بصيغة JSON التي تجلبها واجهة القراءة حين تتنقل (`format` قيمته `html` أو `markdown` أو `json`)، بعد اجتياز فحوص الوصول. والصفحة المفقودة، أو التي لا يحق للقارئ رؤيتها، لا تطلق شيئًا.

**Event** `LaRecipe\Domains\Delivery\Events\PageViewed`

Payload:

| Property | Type |
| --- | --- |
| `kind` | string |
| `userAgent` | ?string |
| `set` | string |
| `page` | LaRecipe\Domains\Content\DTOs\PageRef |
| `format` | string |

Listeners:

| Listener | Runs |
| --- | --- |

### MarkdownServed

يُطلق مع `PageViewed` حين تُقدَّم نسخة Markdown من الصفحة. وقيمة `explicit` هي true لرابط `.md`، و false لـ `Accept: text/markdown`.

**Event** `LaRecipe\Domains\Delivery\Events\MarkdownServed`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `page` | LaRecipe\Domains\Content\DTOs\PageRef |
| `kind` | string |
| `userAgent` | ?string |
| `explicit` | bool |

Listeners:

| Listener | Runs |
| --- | --- |

### LlmsTxtServed

يُطلق حين يُقدَّم فهرس `llms.txt` أو ملف `llms-full.txt`. يبيّن `file` أيهما، ويُضبط `group` للملف المقسَّم حسب أقسام التنقل.

**Event** `LaRecipe\Domains\Delivery\Events\LlmsTxtServed`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `file` | string |
| `kind` | string |
| `version` | ?string |
| `locale` | ?string |
| `group` | ?string |
| `userAgent` | ?string |
| `page` | ?LaRecipe\Domains\Content\DTOs\PageRef |

Listeners:

| Listener | Runs |
| --- | --- |

### SkillServed

يُطلق حين يُقدَّم `skill.md`، أو ملف من مهارة مكتوبة يدويًا، أو `/.well-known/agent-skills/index.json`. وقيمتا `set` و `skill` هما null للفهرس، لأنه يغطي كل المجموعات.

**Event** `LaRecipe\Domains\Delivery\Events\SkillServed`

Payload:

| Property | Type |
| --- | --- |
| `set` | ?string |
| `skill` | ?string |
| `kind` | string |
| `file` | ?string |
| `userAgent` | ?string |
| `page` | ?LaRecipe\Domains\Content\DTOs\PageRef |

Listeners:

| Listener | Runs |
| --- | --- |

### McpToolCalled

يُطلق لكل استدعاء أداة على نقطة نهاية MCP لمجموعة على الويب أو على الخادم المحلي (`transport` قيمته `web` أو `local`). يحمل `arguments` الوسائط البسيطة (scalar)، مع اختصار القيم التي تتجاوز 200 حرف. واستدعاءات الأدوات التي تجريها ميزة اسأل الذكاء الاصطناعي (Ask AI) نفسها لا تطلقه.

**Event** `LaRecipe\Domains\Delivery\Events\McpToolCalled`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `tool` | string |
| `transport` | string |
| `page` | ?LaRecipe\Domains\Content\DTOs\PageRef |
| `arguments` | array |
| `successful` | bool |
| `kind` | string |

Listeners:

| Listener | Runs |
| --- | --- |

### SearchPerformed

يُطلق لكل عملية بحث، مع `source` الخاص بها:

| `source` | البحث |
| --- | --- |
| `mcp` | أداة MCP `search_docs`. |
| `endpoint` | نقطة النهاية `/ask` للوكلاء. |
| `assistant` | الاسترجاع في Ask AI. |
| `server` | نقطة النهاية `/_search`: لوحة البحث مع المشغّل `server` أو مع مشغّل مخصّص، والسكربتات. |
| `palette` | بحث أجابت عنه لوحة البحث في المتصفح، من فهرس المتصفح، ثم أبلغت عنه لاحقًا. |

تبلّغ لوحة البحث عن عمليات البحث فيها على دفعات صغيرة إلى `POST {prefix}/_search/report` (مع اللغة والإصدار قبله في النطاقات الأخرى). ولا يُحسب إلا الاستعلام المستقر، لا كل ضغطة مفتاح. والمسار محدود بـ 30 بلاغًا في الدقيقة لكل قارئ، ولا يخزّن شيئًا. ويستبعد التصدير الثابت هذا الإبلاغ. والأعداد تأتي من المتصفح: عاملها بوصفها تحليلات، لا إشارة أمنية أبدًا.

يعلّم `zeroResults` عمليات البحث التي لم يستطع توثيقك الإجابة عنها.

**Event** `LaRecipe\Domains\Delivery\Events\SearchPerformed`

Payload:

| Property | Type |
| --- | --- |
| `zeroResults` | bool |
| `set` | string |
| `version` | string |
| `locale` | string |
| `query` | string |
| `results` | int |
| `source` | string |
| `kind` | string |
| `page` | ?LaRecipe\Domains\Content\DTOs\PageRef |

Listeners:

| Listener | Runs |
| --- | --- |

### FeedbackSubmitted

يُطلق حين يجيب قارئ عن «هل كانت هذه الصفحة مفيدة؟» (`source` قيمته `reader`)، وحين يقيّم قارئ إجابة من Ask AI بالإعجاب أو عدمه (`ask`، مع `question` الذي كانت الإجابة له، والصفحة التي سأل منها القارئ)، وحين يستدعي وكيل أداة MCP `submit_feedback` (`agent`). لا يحتفظ LaRecipe بشيء: تطبيقك هو الذي يمرّره.

**Event** `LaRecipe\Domains\Delivery\Events\FeedbackSubmitted`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `page` | LaRecipe\Domains\Content\DTOs\PageRef |
| `helpful` | bool |
| `comment` | ?string |
| `source` | string |
| `kind` | string |
| `question` | ?string |

Listeners:

| Listener | Runs |
| --- | --- |

### AskAiAnswered

يُطلق حين ينهي Ask AI إجابة. تكون قيمة `covered` هي false حين يقول المساعد إن التوثيق لا يغطي السؤال، وتسرد `citations` روابط الصفحات التي استشهد بها، وتأتي أعداد الرموز (tokens) من المزوّد.

**Event** `LaRecipe\Domains\Delivery\Events\AskAiAnswered`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `version` | string |
| `locale` | string |
| `question` | string |
| `covered` | bool |
| `citations` | array |
| `kind` | string |
| `page` | ?LaRecipe\Domains\Content\DTOs\PageRef |
| `inputTokens` | ?int |
| `outputTokens` | ?int |

Listeners:

| Listener | Runs |
| --- | --- |

### PageRendered

يُطلق حين يُصيّر LaRecipe صفحة، للعمل الذي ينبغي أن يلي التصيير. تكون قيمة `format` هي `html` حين صُيّر المقال لأن الذاكرة المؤقتة للتصيير لم تكن تحويه (صفحة تغيّرت، أو ذاكرة مؤقتة فارغة، أو `larecipe:optimize`)، والإجابة من الذاكرة المؤقتة لا تطلق شيئًا. وتكون `markdown` في كل طلب لنسخة Markdown من الصفحة، لأنها لا تُخزَّن مؤقتًا. يحمل الصفحة وبصمة محتواها، ولا يحمل القارئ أبدًا: احسب القرّاء بـ `PageViewed`. ولا تطلقه أداة MCP `read_page` ولا `llms-full.txt`.

**Event** `LaRecipe\Domains\Delivery\Events\PageRendered`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `page` | LaRecipe\Domains\Content\DTOs\PageRef |
| `format` | string |
| `contentHash` | string |

Listeners:

| Listener | Runs |
| --- | --- |

## أحداث المحتوى

تُطلق أحداث المحتوى حين يمرّ تغيير عبر مسار الكتابة في LaRecipe: أدوات التأليف في MCP، أو لوحة الإدارة، أو `larecipe:sync`، أو ترحيل توثيق، أو `larecipe:source:import`، أو `larecipe:source:move`. أما تعديل ملف Markdown في محرّرك فلا يطلق شيئًا.

### PageWritten

يُطلق حين تُكتب صفحة أو تُنقل أو تُحذف، مباشرة أو مسودةً، وحين يُحتجز تغيير ترحيل توثيق على صفحة بوصفه تعارضًا. وتبيّن المراجعة (revision) أي ذلك حدث، ومن أجراه، وعبر أي قناة.

**Event** `LaRecipe\Domains\Sources\Events\PageWritten`

Payload:

| Property | Type |
| --- | --- |
| `revision` | LaRecipe\Domains\Sources\DTOs\Revision |

Listeners:

| Listener | Runs |
| --- | --- |

### DraftCreated

يُطلق حين ينتظر تغييرٌ المراجعةَ: مع `review: required` لتغيير أجراه وكيل خارج pull request، أو حين طُلبت مسودة.

**Event** `LaRecipe\Domains\Sources\Events\DraftCreated`

Payload:

| Property | Type |
| --- | --- |
| `revision` | LaRecipe\Domains\Sources\DTOs\Revision |

Listeners:

| Listener | Runs |
| --- | --- |

### DraftPublished

يُطلق حين ينشر مراجِع مسودة، أو يحلّ تعارضًا بأخذ نسخة الترحيل، في [قائمة المراجعة (The pass)](https://larecipe.saleem.dev/ar/3.x/sources/database.md#the-pass-the-review-queue) في لوحة الإدارة.

**Event** `LaRecipe\Domains\Sources\Events\DraftPublished`

Payload:

| Property | Type |
| --- | --- |
| `revision` | LaRecipe\Domains\Sources\DTOs\Revision |
| `by` | LaRecipe\Domains\Content\DTOs\Provenance |

Listeners:

| Listener | Runs |
| --- | --- |

### DraftRejected

يُطلق حين يرفض مراجِع مسودة، مع ذكر سببه، أو يحلّ تعارضًا بإبقاء نسخة الإنتاج، في قائمة المراجعة في لوحة الإدارة.

**Event** `LaRecipe\Domains\Sources\Events\DraftRejected`

Payload:

| Property | Type |
| --- | --- |
| `revision` | LaRecipe\Domains\Sources\DTOs\Revision |
| `by` | LaRecipe\Domains\Content\DTOs\Provenance |
| `reason` | ?string |

Listeners:

| Listener | Runs |
| --- | --- |

### ContentChanged

يُطلق حين يتغيّر المحتوى المنشور لمجموعة: تغيير منشور على صفحة أو على التنقل أو على ملف التعريف (ومنها ترحيلات التوثيق)، أو رفع أصل أو حذفه، أو استيراد، أو نقل مصدر، أو التراجع عن ترحيل توثيق. وتسرد `pages` الصفحات التي تغيّرت، حين تكون معروفة. ويستمع إليه LaRecipe نفسه، بمستمع في الطابور يملأ الذاكرة المؤقتة للمجموعة مسبقًا.

**Event** `LaRecipe\Domains\Sources\Events\ContentChanged`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `pages` | array |

Listeners:

| Listener | Runs |
| --- | --- |
| `LaRecipe\Domains\Sources\Listeners\WarmChangedSet` | queued |

### DocsMigrationConflicted

يُطلق حين يجد ترحيل توثيق أن الإنتاج تغيّر منذ كُتب الترحيل. لا يكتب فوقه: تنتظر نسخته مسودةَ تعارض بجوار نسخة الإنتاج، ويستمر النشر.

**Event** `LaRecipe\Domains\Sources\Events\DocsMigrationConflicted`

Payload:

| Property | Type |
| --- | --- |
| `set` | string |
| `migration` | string |
| `reason` | string |
| `revision` | ?LaRecipe\Domains\Sources\DTOs\Revision |

Listeners:

| Listener | Runs |
| --- | --- |

## التالي

- [التحليلات](https://larecipe.saleem.dev/ar/3.x/operate/analytics.md): مرّر هذه الأحداث إلى أدواتك.
- [واجهات الوكلاء](https://larecipe.saleem.dev/ar/3.x/agents/surfaces.md): الملفات التي يجلبها الوكلاء.
