تطبيق Next.js يُعرض في ورشة حيّة: نصفه تطبيق حقيقي، ونصفه نافذة على ما يجري داخله. يعمل بالعربية والإنجليزية، ويُبدَّل بينهما بزرّ واحد.
- التطبيق الحيّ. محادثة عادية. لا يعرف المستخدم شيئاً عن ReAct.
- لوحة الشرح. ثلاث لوحات تتحرّك مع كل طلب: بناء الـ Context، ثم تفكير الوكيل، ثم مسار n8n كرسم تخطيطي.
زر التبديل أعلى الصفحة يقلب كل شيء، لا الواجهة وحدها:
| عربي | إنجليزي | |
|---|---|---|
| الاتجاه | RTL | LTR |
| موضع التطبيق | يميناً | يساراً |
| موضع لوحة الشرح | يساراً | يميناً |
| System Prompt | عربي | إنجليزي |
| خطوات ReAct وجواب الوكيل | عربي | إنجليزي |
| الأمثلة الجاهزة | عربية | إنجليزية |
القاعدة واحدة في اللغتين: التطبيق يقع حيث تبدأ القراءة، ولوحة الشرح بعده.
لا يوجد order صريح في الكود — الترتيب المنطقي وحده يحقّق ذلك، وأدوات
Tailwind المنطقية (ms/me, ps/pe, start/end) تنقلب من dir على
<html>. أضِف ml-4 أو text-left مرة واحدة، وتكسر إحدى اللغتين بصمت.
ما يبقى إنجليزياً في اللغتين عن قصد: أسماء عقد n8n (Webhook,
Set Context, AI Agent) وأسماء الأدوات ومخرجات JSON. هذه أسماء حقيقية
داخل n8n، ومن يفتحه بعد الورشة سيبحث عنها بهذه الحروف — وترجمتها تقطع الصلة
بينه وبين ما رآه.
إضافة لغة ثالثة: مفتاح جديد في lib/i18n.ts وآخر في القواميس الثنائية
داخل lib/agent-sim.ts. لا يُلمس أي مكوّن.
npm install
npm run dev # http://localhost:3000
npm run build # بناء الإنتاجيحتاج Node 20.9+ أو 22+.
ادفع المشروع إلى GitHub، ثم من Vercel اختر New Project وأشِر إلى المستودع. لا توجد متغيّرات بيئة ولا مفاتيح — يبني وينشر كما هو.
app/
layout.tsx الجذر — لغة البداية قبل تشغيل الحزمة
page.tsx الشاشة المقسومة، وهي الوحيدة التي تملك الحالة
globals.css رموز التصميم (@theme) وقواعد الأساس
api/agent/route.ts نقطة النهاية — تبثّ NDJSON
components/
AgentChat.tsx التطبيق الحيّ
WorkshopDashboard.tsx لوحة الشرح — اللوحات الثلاث
WorkflowGraph.tsx رسم مسار n8n — عقد تضيء بالتتابع
lib/
agent-sim.ts محرّك المحاكاة — كل المنطق هنا
i18n.ts كل نصوص الواجهة في اللغتين
لا يوجد استدعاء لنموذج حقيقي، ولا مفتاح API، ولا اتصال بالشبكة. نفس المدخل يعطي نفس المخرج في كل مرة.
هذا قرار مقصود لا اختصار: التطبيق يُعرض أمام قاعة. استدعاء نموذج حقيقي يجعل العرض رهينة الشبكة والحصة وزمن الاستجابة — وفشل واحد أمام الحضور يكلّف أكثر بكثير من الواقعية التي كسبتها.
للانتقال إلى وكيل حقيقي: استبدل runAgent في lib/agent-sim.ts باستدعاء
فعلي، مع الإبقاء على نفس شكل الأحداث (AgentEvent). الواجهة لن تتغيّر إطلاقاً.
الدرس هو الترتيب: كيف يُركَّب الـ context، ثم كيف يفكّر الوكيل، ثم متى يستدعي الأداة. لو أرسلنا كل شيء دفعة واحدة لظهرت اللوحة مكتملة في لحظة وضاع التسلسل الذي جاء الحضور ليروه.
STEP_DELAY_MS في lib/agent-sim.ts يتحكّم بالإيقاع. ارفعه لو كانت القاعة
كبيرة، واخفضه في التجربة.
- الأمثلة الجاهزة تحت حقل الإدخال تغطّي أربعة مسارات، بينها واحد بلا أدوات («شنو الفرق بين الوكيل والـ chatbot؟» / "What is the difference…"). اعرضه: يُثبت للحضور أن الوكيل يقرّر، ولا ينفّذ أداة دائماً.
- افتح تبويب Network وأرِهم أسطر NDJSON تصل واحداً بعد آخر. هذه أوضح لحظة في الشرح كله.
- الملف الذي تستعرضه أمامهم هو
lib/agent-sim.ts— كل المنطق فيه، مُعلَّق بالعربية.
الحضور سيمسحون QR ويفتحونه على هواتفهم أثناء الورشة، فالجوال ليس حالة استثنائية:
- التخطيط يصير عموداً واحداً: المحادثة أولاً بارتفاع مريح للإبهام، ولوحة الشرح تحتها — فيجرّب الزائر أولاً ثم ينزل ليرى التفسير.
- اللوحات تتمدّد مع محتواها ولا تُقصّ؛ الصفحة هي التي تمرّر بدل كل لوح.
- رسم n8n ينقلب رأسياً، والأسهم تشير لأسفل في اللغتين.
- شريط العنوان يبقى ثابتاً أعلى الشاشة.
npm run buildنظيف، بلا أخطاء TypeScript.- التطبيق قُيد فعلياً في Chromium في اللغتين × ثلاثة مقاسات (1920×1080،
1280×720، 390×844) — ست حالات: صفر أخطاء كونسول، صفر تجاوز أفقي،
<h1>واحد، ولا زر بلا اسم وصول. - في كل حالة: وصلت العقد الخمس كاملة وظهر جواب الوكيل باللغة الصحيحة.
- تأكّد انقلاب الجانبين بقياس موضع اللوحين فعلياً: التطبيق يميناً في العربي ويساراً في الإنجليزي.
- الكود يبقى LTR داخل الواجهة العربية (
direction: ltrعلىpreوcode). - بُثّت الأحداث بالترتيب الصحيح عبر
/api/agentوتأكّد ذلك من الاستجابة الخام.
- لوحة الـ Context كانت تطغى على اللوحة تحتها — نمت مع محتواها بدل أن
تمرّر داخلياً. أُصلح بـ
h-fullعلى إطار اللوح. - الجانبان كانا معكوسين عن المواصفة —
order-firstعلى لوحة الشرح جعلها يميناً في العربية بدل التطبيق. حُذف الـorderكلّه، فصار الترتيب المنطقي يتكفّل بالاتجاهين. - أسهم الرسم كانت تشير يساراً في الإنجليزية أيضاً — المثلث كان موضوعاً قبل الخط، فبقي عند بداية الوصلة في الاتجاهين. نُقل بعد الخط وصار حدّه الملوَّن على جهة البداية، فأصبح يشير نحو النهاية في اللغتين.
- تسميات عقد n8n لم تكن موسّطة — قاعدة
text-align: startعلى.font-monoفيglobals.cssكانت تغلبtext-centerلأنها خارج طبقات Tailwind. حُصرت القاعدة فيcodeوpreوkbd. الصنف كان يظهر سليماً في الـ HTML، فلم يكن يُكتشف إلا بقراءة الأنماط المحسوبة.