منصة ذكاء اصطناعي احترافية من YSD AI Studio. عربية أولًا (RTL) مع دعم الإنجليزية، مبنية على بنية Modular قابلة للتوسع.
| الطبقة | التقنية |
|---|---|
| الواجهة | Next.js App Router · TypeScript Strict · Tailwind CSS |
| قاعدة البيانات والمصادقة | Supabase (PostgreSQL · Auth · Storage · RLS) |
| الذكاء الاصطناعي | طبقة AIProviderAdapter موحدة — Anthropic أولًا، جاهزة لأي موفر |
| التحقق | Zod · React Hook Form |
| الاختبارات | Vitest · Playwright |
# 1. تثبيت الاعتماديات
npm install
# 2. إعداد البيئة
cp .env.example .env
# املأ مفاتيح Supabase وANTHROPIC_API_KEY
# 3. إعداد Supabase
# - أنشئ مشروعًا على supabase.com
# - ثبّت Supabase CLI ثم:
supabase link --project-ref YOUR_PROJECT_REF
supabase db push # يشغّل migrations من supabase/migrations/
# 4. التشغيل
npm run dev
npm run typecheck && npm run lint && npm run build && npm test
⚠️ لا تشغّل
npm run buildأثناء عملnpm run dev— كلاهما يكتب في.nextنفسه، وسيؤدي ذلك إلى صفحات بلا CSS (روابط أصول قديمة ترجع 404). إن حدث ذلك: أوقف الخادم، احذف.next، ثم شغّلnpm run devمن جديد. اختبارtests/styling-e2e.test.ts(معYSD_E2E=1) يكتشف هذه الحالة آليًا.
app/
api/chat/route.ts مسار المحادثة الآمن (Streaming · Rate limit · Usage)
(auth)/login/ صفحات المصادقة
(app)/chat/ واجهة المحادثة (قيد البناء — انظر النموذج الأولي)
lib/
ai/ AIProviderAdapter + الموفرون + السجل
supabase/ عملاء الخادم والمتصفح
validation/ مخططات Zod
supabase/migrations/ مخطط قاعدة البيانات + RLS
docs/ خارطة الطريق والتوثيق
middleware.ts حماية الجلسات والصفحات ولوحة الإدارة
انظر docs/ADDING_A_PROVIDER.md — باختصار: نفّذ واجهة AIProviderAdapter وسجّله في lib/ai/registry.ts. لا حاجة لتعديل أي شيء آخر.
استقرار وتجربة (إصدار تثبيت): لا ردود مقطوعة ولا مُعلّم قائمة منفرد،
ولا تكرار للرسالة عند النقر المزدوج أو إعادة الاتصال (client_request_id
محمي في قاعدة البيانات — يعمل عبر أكثر من نسخة خادم)، ولا خروج مفاجئ عند
انتهاء access token مع بقاء المسودة، وتصنيف صريح لأخطاء
auth_expired/network_error/timeout/rate_limit/provider_unavailable.
الأسماء الملتبسة تُسأل بدل التخمين (JoJo ≠ Jujutsu Kaisen)، والمهلة تشمل جسم
البثّ لا الترويسات فقط.
مراقبة آمنة: /admin/health بمقاييس دائمة تنجو من إعادة التشغيل. الجدول
لا يخزّن نص المستخدم ولا نص المساعد ولا البريد ولا IP ولا user_id — أرقام
ورموز مغلقة فقط، والقراءة للإدارة وحدها. مفتاح الخدمة خادمي بحت محروس
بـserver-only ولا يصل المتصفح.
يتطلب تطبيق migrations
0017و0018— انظرdocs/V0.6.6_DATABASE_GATE.md.
جودة الإجابة: فهم سياق الألعاب والقصص بدل الرفض بالكلمات المفتاحية (ضرر/نزف لم تعد تُسقط سؤالًا آمنًا)، ورفض الأذى الحقيقي باختصار. أسماء الألعاب بالنقحرة العربية تُفهَم («الدن رينق» = Elden Ring). الأسئلة التي تطلب مواقع أو خطوات أو أرقامًا دقيقة تدخل وضعًا محميًا: لا تُعرض تفاصيل متخصصة غير مُسنَدة إلى مصدر، وبلا مصدر يصل اعتراف فوري بعدم التأكد (~1.4 ثانية، بلا استدعاء مزوّد). الأسئلة العامة والإبداعية تبقى على البثّ الفوري كما هي.
متانة: حارس لغة أدقّ يمنع التسريبات (يابانية/سيريلية/يونانية وكلمات دخيلة) مع السماح بأسماء العلم والاختصارات، وإصلاح انقطاع البثّ المتأخر بمتابعة صامتة بلا تكرار، ومنع الردود الفارغة (تفكير داخلي بلا إجابة).
حدّ معروف: سؤال متخصص بلا ملف مرفق يحصل على اعتراف بعدم التأكد لا على إجابة تفصيلية. للحصول على تفاصيل موثقة: أرفق ملفًا واسأل عنه (RAG). هذا الإصدار لا يضمن صحة كل المعلومات العامة.
أداء (مقيس): تحقّق هوية محلي بـgetClaims (ES256/JWKS) بلا رحلة شبكة، إسقاط
تكرار auth/profile عبر سياق الوسيط المُتحقَّق (x-ysd-*، محمي ضد الانتحال)، كاش
platform_settings 30ث مع إبطال، وموازاة استعلامات /api/chat (Promise.allSettled
بعد ضمان حفظ رسالة المستخدم). زمن التطبيق قبل المزوّد ~3410ms → 1030ms، إنشاء
المحادثة 2422ms → 1030ms. ما تبقّى من زمن أول token خارجي (المزوّد المجاني).
سجلات أداء آمنة بـrequest_id بلا محتوى أو أسرار.
حالات المرفقات صريحة وصادقة:
rag_content_hash + فهرس فريد جزئي
للوظائف + حذف chunks الملف قبل أي إدراج ⇒ لا chunks مكررة.صلابة النماذج المجانية:
429 → Retry-After وإلا 15 دقيقة · 404 no_free_model
→ 6 ساعات (غياب بنيوي) · 5xx/timeout → دقيقتان. انتهاء المدة يسمح بمحاولة
واحدة جديدة تلقائيًا.ysd/free: Google AI Studio · Nvidia · Darkbloom —
حجب مزوّد واحد لا يُسقط الخدمة (الدرس: التنوّع في المزوّد لا في اسم النموذج).openrouter/free مستبعد دائمًا.Private Beta — بالدعوات فقط:
handle_new_user على auth.users — غير
قابلة للتجاوز من أي عميل. إعداد Supabase Allow new users to sign up يبقى مفعّلًا
عمدًا؛ الإغلاق من platform_settings والتطبيق فقط.sha256 وcode_hint فقط. الكود الخام يُعاد
مرة واحدة ولا يدخل القاعدة ولا السجلات ولا التدقيق./api/invite/claim بتذكرة 32 بايت تعيش 10 دقائق (hash فقط). تُستهلك ذريًا عند
التسجيل ثم تُستهلك الدعوة ذريًا — فتسريبها بلا قيمة.
لماذا: أي مفتاح في signUp.data ينتهي في استجابة GoTrue وفي الـJWT.FOR UPDATE) قبل العدّ والإدراج، ثم
3 تذاكر نشطة و20 تذكرة/ساعة لكل دعوة. الرفض عام لا يكشف السبب. الـRate Limit
في المسار طبقة إضافية فقط (الدالة مُصرَّحة لـanon عبر PostgREST).platform_settings داخل المُحفّز — لا يُوثق بنسخة العميل.revoked → exhausted → expired → active تُحسب في
PostgreSQL بـnow()، والانتهاء يُحسب بـnow() + make_interval(days => …).
لا Date.now() في مسار الدعوات — الإنشاء والإنفاذ والعرض على ساعة واحدة.banned → كل الصفحات الخاصة (/suspended) وكل الـAPIs (403)؛
ai_suspended يمنع /api/chat فقط./beta · /invite/[code] · /terms · /privacy · /usage (حدود يومية/شهرية
/admin/invites + تقرير Beta أسبوعي.0011–0016. لا Stripe ولا بوابة دفع ولا خدمة بريد مدفوعة ولا Mock Data.الاختبارات الحية: beta-check 70/70 · scrub-check 24/24 · claim-concurrency 13/13 · hourly-cap 10/10 — 117/117.
node scripts/beta-check.mjs # البوابة، التزامن، الصيانة، banned، العزل
node scripts/scrub-check.mjs # لا كود خام في signUp/JWT/auth.users/identities
node scripts/claim-concurrency-check.mjs # 20 طلبًا متوازيًا → ≤ 3 تذاكر
node scripts/hourly-cap-check.mjs # حد 20/ساعة (~8 دقائق)
تتطلب
scripts/.qa-owner.json(حساب QA بصلاحية owner) وكود دعوة فيscripts/.qa-invite.txt— كلاهما مُستثنى من git ولا يُنشأ إلا عند الاختبار ويُحذف بعده. أقسام التسجيل تتطلب تعطيل Confirm email مؤقتًا (وإلا لا تُنشأ جلسة لمستخدم عادي).
لوحة الإدارة والمراقبة (/admin):
security definer owner-only)Deployment Ready:
GET /api/health (تطبيق · Supabase · DB · pgvector · Storage · OpenRouter · Embeddings) بلا طلب AI مدفوع ولا كشف أسرار، مع correlation_iddocs/DEPLOYMENT.md + PRODUCTION_CHECKLIST.mdProduction-Hardened RAG (طابور دائم في قاعدة البيانات):
rag_jobs) — الذاكرة للأداء فقطFOR UPDATE SKIP LOCKED، فهرس فريد جزئي (وظيفة نشطة واحدة لكل ملف)RAG محلي مجاني (مكتمل ومُختبر E2E من المتصفح — PDF متعدد الصفحات + DOCX):
auth.uid()، عتبة مُعايَرة (أرضية 0.78 + ثقة 0.80)، تصريح «لم أجد هذه المعلومة في الملفات المرفقة» عند عدم التطابقنظام الملفات الكامل (36/36 اختبار Runtime):
v0.1.1:
مكتمل ومُختبر (38/38 اختبار Runtime + E2E تنسيق):
التالي (انظر docs/YSD_AI_ROADMAP.md):
195 commits
TypeScript
81.9%
JavaScript
11.6%
PLpgSQL
6.3%
منصة ذكاء اصطناعي احترافية من YSD AI Studio. عربية أولًا (RTL) مع دعم الإنجليزية، مبنية على بنية Modular قابلة للتوسع.
| الطبقة | التقنية |
|---|---|
| الواجهة | Next.js App Router · TypeScript Strict · Tailwind CSS |
| قاعدة البيانات والمصادقة | Supabase (PostgreSQL · Auth · Storage · RLS) |
| الذكاء الاصطناعي | طبقة AIProviderAdapter موحدة — Anthropic أولًا، جاهزة لأي موفر |
| التحقق | Zod · React Hook Form |
| الاختبارات | Vitest · Playwright |
# 1. تثبيت الاعتماديات
npm install
# 2. إعداد البيئة
cp .env.example .env
# املأ مفاتيح Supabase وANTHROPIC_API_KEY
# 3. إعداد Supabase
# - أنشئ مشروعًا على supabase.com
# - ثبّت Supabase CLI ثم:
supabase link --project-ref YOUR_PROJECT_REF
supabase db push # يشغّل migrations من supabase/migrations/
# 4. التشغيل
npm run dev
npm run typecheck && npm run lint && npm run build && npm test
⚠️ لا تشغّل
npm run buildأثناء عملnpm run dev— كلاهما يكتب في.nextنفسه، وسيؤدي ذلك إلى صفحات بلا CSS (روابط أصول قديمة ترجع 404). إن حدث ذلك: أوقف الخادم، احذف.next، ثم شغّلnpm run devمن جديد. اختبارtests/styling-e2e.test.ts(معYSD_E2E=1) يكتشف هذه الحالة آليًا.
app/
api/chat/route.ts مسار المحادثة الآمن (Streaming · Rate limit · Usage)
(auth)/login/ صفحات المصادقة
(app)/chat/ واجهة المحادثة (قيد البناء — انظر النموذج الأولي)
lib/
ai/ AIProviderAdapter + الموفرون + السجل
supabase/ عملاء الخادم والمتصفح
validation/ مخططات Zod
supabase/migrations/ مخطط قاعدة البيانات + RLS
docs/ خارطة الطريق والتوثيق
middleware.ts حماية الجلسات والصفحات ولوحة الإدارة
انظر docs/ADDING_A_PROVIDER.md — باختصار: نفّذ واجهة AIProviderAdapter وسجّله في lib/ai/registry.ts. لا حاجة لتعديل أي شيء آخر.
استقرار وتجربة (إصدار تثبيت): لا ردود مقطوعة ولا مُعلّم قائمة منفرد،
ولا تكرار للرسالة عند النقر المزدوج أو إعادة الاتصال (client_request_id
محمي في قاعدة البيانات — يعمل عبر أكثر من نسخة خادم)، ولا خروج مفاجئ عند
انتهاء access token مع بقاء المسودة، وتصنيف صريح لأخطاء
auth_expired/network_error/timeout/rate_limit/provider_unavailable.
الأسماء الملتبسة تُسأل بدل التخمين (JoJo ≠ Jujutsu Kaisen)، والمهلة تشمل جسم
البثّ لا الترويسات فقط.
مراقبة آمنة: /admin/health بمقاييس دائمة تنجو من إعادة التشغيل. الجدول
لا يخزّن نص المستخدم ولا نص المساعد ولا البريد ولا IP ولا user_id — أرقام
ورموز مغلقة فقط، والقراءة للإدارة وحدها. مفتاح الخدمة خادمي بحت محروس
بـserver-only ولا يصل المتصفح.
يتطلب تطبيق migrations
0017و0018— انظرdocs/V0.6.6_DATABASE_GATE.md.
جودة الإجابة: فهم سياق الألعاب والقصص بدل الرفض بالكلمات المفتاحية (ضرر/نزف لم تعد تُسقط سؤالًا آمنًا)، ورفض الأذى الحقيقي باختصار. أسماء الألعاب بالنقحرة العربية تُفهَم («الدن رينق» = Elden Ring). الأسئلة التي تطلب مواقع أو خطوات أو أرقامًا دقيقة تدخل وضعًا محميًا: لا تُعرض تفاصيل متخصصة غير مُسنَدة إلى مصدر، وبلا مصدر يصل اعتراف فوري بعدم التأكد (~1.4 ثانية، بلا استدعاء مزوّد). الأسئلة العامة والإبداعية تبقى على البثّ الفوري كما هي.
متانة: حارس لغة أدقّ يمنع التسريبات (يابانية/سيريلية/يونانية وكلمات دخيلة) مع السماح بأسماء العلم والاختصارات، وإصلاح انقطاع البثّ المتأخر بمتابعة صامتة بلا تكرار، ومنع الردود الفارغة (تفكير داخلي بلا إجابة).
حدّ معروف: سؤال متخصص بلا ملف مرفق يحصل على اعتراف بعدم التأكد لا على إجابة تفصيلية. للحصول على تفاصيل موثقة: أرفق ملفًا واسأل عنه (RAG). هذا الإصدار لا يضمن صحة كل المعلومات العامة.
أداء (مقيس): تحقّق هوية محلي بـgetClaims (ES256/JWKS) بلا رحلة شبكة، إسقاط
تكرار auth/profile عبر سياق الوسيط المُتحقَّق (x-ysd-*، محمي ضد الانتحال)، كاش
platform_settings 30ث مع إبطال، وموازاة استعلامات /api/chat (Promise.allSettled
بعد ضمان حفظ رسالة المستخدم). زمن التطبيق قبل المزوّد ~3410ms → 1030ms، إنشاء
المحادثة 2422ms → 1030ms. ما تبقّى من زمن أول token خارجي (المزوّد المجاني).
سجلات أداء آمنة بـrequest_id بلا محتوى أو أسرار.
حالات المرفقات صريحة وصادقة:
rag_content_hash + فهرس فريد جزئي
للوظائف + حذف chunks الملف قبل أي إدراج ⇒ لا chunks مكررة.صلابة النماذج المجانية:
429 → Retry-After وإلا 15 دقيقة · 404 no_free_model
→ 6 ساعات (غياب بنيوي) · 5xx/timeout → دقيقتان. انتهاء المدة يسمح بمحاولة
واحدة جديدة تلقائيًا.ysd/free: Google AI Studio · Nvidia · Darkbloom —
حجب مزوّد واحد لا يُسقط الخدمة (الدرس: التنوّع في المزوّد لا في اسم النموذج).openrouter/free مستبعد دائمًا.Private Beta — بالدعوات فقط:
handle_new_user على auth.users — غير
قابلة للتجاوز من أي عميل. إعداد Supabase Allow new users to sign up يبقى مفعّلًا
عمدًا؛ الإغلاق من platform_settings والتطبيق فقط.sha256 وcode_hint فقط. الكود الخام يُعاد
مرة واحدة ولا يدخل القاعدة ولا السجلات ولا التدقيق./api/invite/claim بتذكرة 32 بايت تعيش 10 دقائق (hash فقط). تُستهلك ذريًا عند
التسجيل ثم تُستهلك الدعوة ذريًا — فتسريبها بلا قيمة.
لماذا: أي مفتاح في signUp.data ينتهي في استجابة GoTrue وفي الـJWT.FOR UPDATE) قبل العدّ والإدراج، ثم
3 تذاكر نشطة و20 تذكرة/ساعة لكل دعوة. الرفض عام لا يكشف السبب. الـRate Limit
في المسار طبقة إضافية فقط (الدالة مُصرَّحة لـanon عبر PostgREST).platform_settings داخل المُحفّز — لا يُوثق بنسخة العميل.revoked → exhausted → expired → active تُحسب في
PostgreSQL بـnow()، والانتهاء يُحسب بـnow() + make_interval(days => …).
لا Date.now() في مسار الدعوات — الإنشاء والإنفاذ والعرض على ساعة واحدة.banned → كل الصفحات الخاصة (/suspended) وكل الـAPIs (403)؛
ai_suspended يمنع /api/chat فقط./beta · /invite/[code] · /terms · /privacy · /usage (حدود يومية/شهرية
/admin/invites + تقرير Beta أسبوعي.0011–0016. لا Stripe ولا بوابة دفع ولا خدمة بريد مدفوعة ولا Mock Data.الاختبارات الحية: beta-check 70/70 · scrub-check 24/24 · claim-concurrency 13/13 · hourly-cap 10/10 — 117/117.
node scripts/beta-check.mjs # البوابة، التزامن، الصيانة، banned، العزل
node scripts/scrub-check.mjs # لا كود خام في signUp/JWT/auth.users/identities
node scripts/claim-concurrency-check.mjs # 20 طلبًا متوازيًا → ≤ 3 تذاكر
node scripts/hourly-cap-check.mjs # حد 20/ساعة (~8 دقائق)
تتطلب
scripts/.qa-owner.json(حساب QA بصلاحية owner) وكود دعوة فيscripts/.qa-invite.txt— كلاهما مُستثنى من git ولا يُنشأ إلا عند الاختبار ويُحذف بعده. أقسام التسجيل تتطلب تعطيل Confirm email مؤقتًا (وإلا لا تُنشأ جلسة لمستخدم عادي).
لوحة الإدارة والمراقبة (/admin):
security definer owner-only)Deployment Ready:
GET /api/health (تطبيق · Supabase · DB · pgvector · Storage · OpenRouter · Embeddings) بلا طلب AI مدفوع ولا كشف أسرار، مع correlation_iddocs/DEPLOYMENT.md + PRODUCTION_CHECKLIST.mdProduction-Hardened RAG (طابور دائم في قاعدة البيانات):
rag_jobs) — الذاكرة للأداء فقطFOR UPDATE SKIP LOCKED، فهرس فريد جزئي (وظيفة نشطة واحدة لكل ملف)RAG محلي مجاني (مكتمل ومُختبر E2E من المتصفح — PDF متعدد الصفحات + DOCX):
auth.uid()، عتبة مُعايَرة (أرضية 0.78 + ثقة 0.80)، تصريح «لم أجد هذه المعلومة في الملفات المرفقة» عند عدم التطابقنظام الملفات الكامل (36/36 اختبار Runtime):
v0.1.1:
مكتمل ومُختبر (38/38 اختبار Runtime + E2E تنسيق):
التالي (انظر docs/YSD_AI_ROADMAP.md):
195 commits
TypeScript
81.9%
JavaScript
11.6%
PLpgSQL
6.3%