دعم عدم الاتصال
AISCouncil هو تطبيق ويب تقدمي (PWA) يعمل دون اتصال بعد الزيارة الأولى. التطبيق بأكمله هو ملف HTML واحد بدون تبعيات خارجية، لذا يمكن تخزينه مؤقتًا بالكامل بواسطة عامل خدمة المتصفح.
تطبيق الويب التقدمي (PWA)
يسجل التطبيق عامل خدمة (sw.js) يخزن جميع الأصول الثابتة مؤقتًا عند أول تحميل. في الزيارات اللاحقة، يُحمّل التطبيق فورًا من الذاكرة المؤقتة -- حتى بدون اتصال إنترنت.
التثبيت كتطبيق
Chrome / Edge (سطح المكتب):
- زُر aiscouncil.net
- انقر أيقونة التثبيت في شريط العناوين (أو انتقل لـ القائمة > "تثبيت AISCouncil")
- يفتح التطبيق في نافذته الخاصة، مع إدخال شريط المهام الخاص به
Chrome / Edge (أندرويد):
- زُر aiscouncil.net
- انقر قائمة المتصفح (ثلاث نقاط)
- اختر "إضافة إلى الشاشة الرئيسية" أو "تثبيت التطبيق"
Safari (iOS / macOS):
- زُر aiscouncil.net
- انقر زر المشاركة
- اختر "إضافة إلى الشاشة الرئيسية"
عند تثبيته كـ PWA، يعمل التطبيق في وضع standalone -- بدون واجهة متصفح، تجربة ملء الشاشة، ويظهر كتطبيق أصلي في مبدل المهام.
استراتيجية التخزين المؤقت لعامل الخدمة
يستخدم عامل الخدمة استراتيجية stale-while-revalidate:
- الزيارة الأولى: جميع الأصول المخزنة مسبقًا تُنزّل وتُخزن في الذاكرة المؤقتة
- الزيارات اللاحقة: تُخدم النسخة المخزنة مؤقتًا فورًا (صفر زمن انتقال شبكة)، بينما يجلب عامل الخدمة نسخة محدثة في الخلفية
- الزيارة التالية بعد التحديث: تُخدم النسخة المحدثة من الذاكرة المؤقتة
هذا يعني أنك دائمًا تحصل على أوقات تحميل فورية، والتحديثات تصل بصمت في الخلفية.
ما يُخزّن مؤقتًا
يخزن عامل الخدمة هذه الملفات مسبقًا عند التثبيت:
| الملف | الغرض |
|---|---|
/ | غلاف HTML (يعيد التوجيه لـ /index.html) |
/index.html | التطبيق الكامل (~كل JS و CSS و HTML مضمّن) |
/icon.svg | أيقونة التطبيق المتجهة |
/icon-192.png | أيقونة PNG 192x192 (شاشة أندرويد الرئيسية) |
/icon-512.png | أيقونة PNG 512x512 (شاشات البداية، قابلة للقناع) |
/favicon.ico | أيقونة تبويب المتصفح |
/manifest.webmanifest | بيان PWA (الاسم، الأيقونات، لون السمة) |
بالإضافة لذلك، أي طلب GET من نفس الأصل يجريه التطبيق سيُخزّن مؤقتًا عند أول جلب ويُخدم من الذاكرة المؤقتة في الطلبات اللاحقة (stale-while-revalidate).
ما لا يُخزّن مؤقتًا
| المورد | السبب |
|---|---|
| استدعاءات LLM API | هذه تذهب مباشرة لواجهات API للمزودين (Anthropic، OpenAI، إلخ) وتتطلب اتصال إنترنت |
| تحديثات السجل | يجلب سجل النماذج من GitHub يتطلب شبكة، لكن التطبيق يعود للبيانات المخزنة/المضمنة |
| الموارد عبر الأصول | فقط طلبات نفس الأصل تُخزّن مؤقتًا بواسطة عامل الخدمة |
| طلبات POST/PUT/DELETE | فقط طلبات GET تُخزّن مؤقتًا |
| استدعاءات وكيل API | الطلبات لـ /v1/* مستثناة صراحةً من التخزين المؤقت |
قدرات عدم الاتصال
عند عدم الاتصال، يمكنك:
- تصفح المحادثات الموجودة -- جميع سجل المحادثات مخزن محليًا في IndexedDB
- إدارة الملفات التعريفية -- إنشاء، تحرير، وحذف ملفات بوت تعريفية
- عرض وتغيير الإعدادات -- جميع الإعدادات في localStorage
- تصدير البيانات -- تنزيل ملف JSON للنسخة الاحتياطية
- التبديل بين البوتات -- جميع إعدادات البوت مخزنة محليًا
- قراءة المحادثات السابقة -- سجل الرسائل الكامل متاح
عند عدم الاتصال، لا يمكنك:
- إرسال رسائل جديدة -- يتطلب استدعاء API لمزود LLM
- تحديث سجل النماذج -- يتطلب الجلب من GitHub
- تسجيل الدخول -- OAuth يتطلب اتصال شبكة
- تثبيت برامج مصغرة -- يتطلب جلب البيان و HTML للدخول
مستخدمو Ollama مع نسخة محلية لا يزالون يمكنهم المحادثة دون اتصال، لأن Ollama يعمل على localhost ولا يتطلب وصول إنترنت.
إصدار الذاكرة المؤقتة
يستخدم عامل الخدمة اسم ذاكرة تخزين مؤقت مُصدّر:
const CACHE = "ais-v1.0.0";
عندما تتغير سلسلة الإصدار (عند تحديث فاصل)، عامل الخدمة الجديد:
- ينشئ ذاكرة تخزين مؤقت جديدة بالاسم الجديد
- يخزن جميع الأصول مسبقًا في الذاكرة المؤقتة الجديدة
- يحذف جميع الذكريات المؤقتة القديمة عند التفعيل
- يطالب بجميع العملاء المفتوحين
هذا يضمن أن الكود المخزن المؤقت القديم يُنظف بعد التحديثات الرئيسية.
تحديث التطبيق
التحديثات تحدث تلقائيًا:
- عند زيارة الصفحة، يتحقق المتصفح مما إذا كان
sw.jsقد تغير - إذا كان كذلك، يُثبّت عامل الخدمة الجديد في الخلفية
- عند تحميل الصفحة التالي (أو بعد إغلاق جميع التبويبات وإعادة فتحها)، يُفعّل عامل الخدمة الجديد
- النسخة الجديدة تُخدم الآن من الذاكرة المؤقتة
لفرض تحديث فوري: افتح DevTools > Application > Service Workers، انقر "Update" على عامل الخدمة المسجل، ثم أعد تحميل الصفحة. بدلاً من ذلك، اضغط Shift وانقر زر إعادة تحميل المتصفح لتجاوز الذاكرة المؤقتة.
بيان تطبيق الويب
ملف manifest.webmanifest يحدد كيف يظهر التطبيق عند تثبيته:
{
"name": "AISCouncil",
"short_name": "AISCouncil",
"description": "تحدث مع Claude أو GPT أو Grok -- بدون خادم، بدون إعداد.",
"start_url": "/",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#7c3aed",
"categories": ["productivity", "utilities"],
"icons": [
{ "src": "icon.svg", "sizes": "any", "type": "image/svg+xml" },
{ "src": "icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "icon-512.png", "sizes": "512x512", "type": "image/png" },
{
"src": "icon-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}
| الحقل | القيمة | الغرض |
|---|---|---|
display | standalone | يعمل بدون واجهة المتصفح (شريط العناوين، التبويبات) |
orientation | any | يعمل في الوضع العمودي والأفقي |
theme_color | #7c3aed | تمييز بنفسجي لشريط الحالة وشريط العنوان |
background_color | #000000 | خلفية شاشة البداية أثناء تحميل التطبيق |
استكشاف الأخطاء
التطبيق يُظهر نسخة قديمة:
- افتح DevTools > Application > Service Workers
- انقر "Unregister" على عامل الخدمة القديم
- أعد تحميل الصفحة
التطبيق لا يعمل دون اتصال:
- تأكد من تسجيل عامل الخدمة (DevTools > Application > Service Workers)
- تأكد من زيارة الصفحة مرة واحدة على الأقل أثناء الاتصال
- تحقق من وجود الذاكرة المؤقتة (DevTools > Application > Cache Storage)
- بعض المتصفحات في وضع التصفح الخاص/الخفي تعطل عمال الخدمة
موجه التثبيت لا يظهر:
- يجب تقديم الصفحة عبر HTTPS (أو
localhost) - يجب تسجيل عامل الخدمة وتفعيله
- يجب أن يكون البيان صالحًا ومرتبطًا في
<head>لـ HTML - يجب أن تكون قد زرت الصفحة مرتين على الأقل مع بعض الوقت بين الزيارات (ارشاد المتصفح)