كل ما يجمعه مستخدم Lolly يعيش على جهازه - بلا حساب، بلا سحابة. حزمة نقل البيانات هي وسيلة انتقال تلك القيمة: صدّرها من تثبيت واحد، واحمل الملف بأي وسيلة (USB، AirDrop، بريد إلكتروني لنفسك، مشاركة شبكية) واستورده في تثبيت آخر. الملف هو وسيلة النقل. يمكن أن تكون الوجهة غير متصلة أو متصلة بالإنترنت. لا فرق، لأن لا شيء يتواصل مع خادم على الإطلاق.
signed by Lollyvector SVG9 paths~4.9k nodes11 groups56 KBتحقق بنفسكاحصل على الملف الموقَّع
signed by Lollyvector SVG9 paths~4.9k nodes11 groups56 KBتحقق بنفسكاحصل على الملف الموقَّع
هذه الصفحة هي مواصفة التنسيق. لدليل المستخدم النهائي راجع ابحث عن عملك واستعده → نقل عملك إلى جهاز آخر. التنفيذ موجود في shells/web/src/data-transfer.ts، ويثبّت tests/data-transfer.test.ts عقد الذهاب والإياب.
النطاق. تحمل الحزمة بيانات المستخدم، لا أدوات الكتالوج. تُزامن أدوات الكتالوج وأصوله بشكل منفصل، ويُفترض أنها موجودة بالفعل على الجهاز الهدف (في أسوأ الحالات بإصدار أحدث)؛ أما الأدوات التي صنعها المستخدم بنفسه فتنتقل داخل
profile.json. لا يقوم الاستيراد أبدا بتثبيت أداة كتالوج أو ترقيتها.
الأهداف
- تنسيق واحد، لكل قشرة (shell). تُنتَج البايتات نفسها وتُستهلك من قِبل الـ PWA على الويب، وتطبيقات Tauri لسطح المكتب/الجوال، وأي قشرة مستقبلية. الحزمة هي العقد. جسر القدرات الخاص بكل قشرة هو المحوّل الخاص بالمنصة خلفه.
- تنجو من الرحلة. حزمة تالفة أو مبتورة أثناء النقل تفشل بصوت عالٍ عند الاستيراد، ولا تستعيد جزئيا أبدا.
- تعيش أطول من هذا الإصدار. لا يزال بإمكان تطبيق أقدم استيراد الأجزاء المعروفة لديه من حزمة أحدث. أما التنسيق الذي يُحدث كسرا حقيقيا فيُرفض بشكل نظيف.
- آمن للدمج. استيراد حزمة إلى تثبيت قيد الاستخدام بالفعل لا يمحو أبدا أي شيء لم يكن في الحزمة.
المغلّف
الحزمة ملف .zip عادي. يُسمّى التنزيل باسم الشخص الذي يخصّه - LollyTools-<First>-<Last>-<YYYY-MM-DD>-<n>.zip (على سبيل المثال LollyTools-Ada-Lovelace-2026-06-26-1.zip) - بحيث يبقى مجلد التنزيلات المليء بالنسخ الاحتياطية مقروءا. يأتي الاسم الأول والأخير من الملف الشخصي ويُحذفان عندما لا يكونان مضبوطين. عدم وجود ملف شخصي يعطي LollyTools-2026-06-26-1.zip، والاسم الأول وحده يعطي LollyTools-Ada-2026-06-26-1.zip. يُنقّى كل جزء إلى رمز آمن لاسم الملف (تُبقى حروف وأرقام Unicode، وتُحذف المسافات وعلامات الترقيم، بحد أقصى 32 حرفا). <n> تسلسل يومي لكل جهاز، بحيث لا تتصادم الصادرات المتكررة في اليوم نفسه وتبقى مرتبة. تبني backupFilename() في shells/web/src/data-transfer.ts الاسم. محتويات ملف zip متطابقة بصرف النظر عن الاسم. بداخله:
| Path | مطلوب | المحتوى |
|---|---|---|
manifest.json | نعم | معرّف التنسيق، والإصدارات، والأعداد، وسلامة كل جزء. أول شيء ينظر إليه القارئ. |
profile.json | عند ضبطه | سجل me الخاص بالمستخدم بأكمله: الاسم، وجهة الاتصال، ومرجع الصورة الشخصية، والأعلام، إضافة إلى المجلدات، وسلة المهملات، ومخططات المشاريع، وقوالب المستخدم والأدوات التي صنعها، والمفضلة، والأدوات المخفية، واختيار اللغة والرموز التعبيرية. يُقرأ عبر host.profile. |
sessions.json | نعم | كل جلسة محفوظة: الفتحة، معرّف/إصدار الأداة، التسمية، الصورة المصغّرة (data-URL) وكامل بيانات الإدخال. تُقرأ عبر host.state. |
assets.json | نعم | بيانات وصفية لكل أصل مرفوع (صور، وخطوط، ورموز العلامة التجارية، وشعارات، ونسخ محفوظة من التنزيلات)، يشير كل منها إلى بايتاته تحت assets/blobs/. |
assets/blobs/<n>.<ext> | لكل أصل | بايتات الأصل الخام (ملفات الصور والخطوط). تُخزَّن غير مضغوطة (تنسيقات مضغوطة أصلا). الامتداد تجميلي فقط. نوع MIME في assets.json هو المرجع الموثوق. |
assets/blobs/<n>.c2pa | عند وجوده | بيانات Content Credentials المستخرجة كبايتات ثنائية دقيقة، يشير إليها _credentialFile في سجل الأصل. وهذه ليست مفاتيح توقيع الجهاز. |
design-systems.json | عند وجوده | أنظمة التصميم المصنوعة أو المضافة على هذا التثبيت، بصيغة { active, records }. تُدمج حسب المعرّف عند الاستيراد؛ ولا يُطبَّق اختيار الحزمة النشط إلا حين لا يملك الجهاز الهدف نظام تصميم خاصا به. |
file-history.json | اختياري | لقطات إصدارات للأصول، وتقارير عمليات ملفات منتهية، وبيانات دفعات كاملة. يملك جزء السجل إصداره الخاص؛ يوفّره محوّل النسخ الاحتياطي الداخلي fileHistory الخاص بالقشرة. |
revision-history.json | اختياري، النسخ الاحتياطية اليدوية | معرّفات إنشاء ثابتة، ونقاط تفتيش محتفَظ بها، وصور مصغّرة، ومسودات استعادة متجددة. يوفّرها host.state.history.backup حيث يُدعم ذلك. |
file-history/versions/ | لكل لقطة | بايتات الأصل السابقة وبيانات الاعتماد المستخرجة، بصرف النظر عن استمرار وجود الأصل الحالي. |
file-history/results/ | لكل عملية مكتملة | بايتات الخرج الدقيقة. لا يُحتفظ بأي ملف أصلي اختير للتحويل ولا يُدرَج. |
prefs.json | نعم | تفضيلات محلية يملكها المستخدم: theme، وsidebarWidth، وعدّاد نشاط ct-metrics. |
lolly.txt | نعم | ملخص مقروء للبشر عن الحزمة (الأعداد، الملف الشخصي، اسم الملف) لأي شخص يفتح ملف zip دون Lolly. يُعاد توليده مع كل تصدير ويُتعرَّف عليه عند الاستيراد، لذا لا يُحتسب أبدا كجزء متخطى. يُكتب بعد خريطة السلامة، لذا يبقى خارجها. |
الحزمة ملف zip عادي عن قصد: تنجو سليمة من أي وسيلة نقل، ويمكن لأي أداة فك ضغط فحصها.
profile.json هو أصغر جزء والجزء الذي يراه القارئ أولا في التطبيق: التفاصيل التي يملؤها المُنشئ مرة واحدة، بالإضافة إلى الموافقة التي تسمح للأدوات باستخدامها.
signed by Lollyvector SVG15 paths~1.2k nodes30 groups1 image40 KBتحقق بنفسكاحصل على الملف الموقَّع
manifest.json
{
"format": "lolly-backup",
"formatVersion": 3,
"minReader": 1,
"app": "lolly",
"exportedAt": "2026-06-22T09:30:00.000Z",
"counts": { "profile": true, "sessions": 2, "userAssets": 4, "prefs": 3, "assetVersions": 1, "fileOperations": 1 },
"integrity": {
"profile.json": "sha256-…",
"sessions.json": "sha256-…",
"assets.json": "sha256-…",
"assets/blobs/0.bin": "sha256-…",
"file-history.json": "sha256-…",
"file-history/versions/0.bin": "sha256-…",
"file-history/results/0.bin": "sha256-…",
"prefs.json": "sha256-…"
}
}| الحقل | المعنى |
|---|---|
format | دائما lolly-backup. يُرفض الملف الذي يفتقده باعتباره "ليس نسخة احتياطية من Lolly". |
formatVersion | التخطيط الذي كُتبت به هذه الحزمة. يُرفع عند أي تغيير في مجموعة الأجزاء أو أشكالها. لا يستند القارئ إليه في القرار. |
minReader | الحد الأدنى لإصدار القارئ اللازم لاستيراد هذه الحزمة بأمان. هذا هو الحقل الذي يستند إليه القارئ في القرار. |
app | معرّف التطبيق المُنتِج، للتشخيص. |
exportedAt | الطابع الزمني ISO الذي أُنشئت فيه الحزمة. |
counts | ما وضعه الكاتب، للعرض والتحقق من السلامة. |
integrity | اختياري. يربط كل جزء عدا manifest.json بملخّص (digest) بنمط SRI sha256-<base64> لبايتاته غير المضغوطة. |
سياسة الإصدارات (التوافق المستقبلي)
الفصل بين formatVersion وminReader هو ما يسمح للتنسيق بالنمو دون التخلي عن التثبيتات الأقدم:
- يستورد القارئ حزمة عندما يكون
manifest.minReader ≤إصدار القارئ نفسه. يرفض (برسالة "needs a newer version of the app") فقط عندما تطلب الحزمة صراحة قارئا أحدث. - التغيير الإضافي - جزء اختياري جديد، أو حقل بيان اختياري جديد - يرفع
formatVersionلكنه يتركminReaderدون تغيير. لا تزال التطبيقات الأقدم تستورد كل جزء تتعرف عليه. تُتخطى الأجزاء التي لا تتعرف عليها (انظر أدناه)، ولا تُسقَط بصمت. - التغيير الكاسر - تغيير يؤدي فيه استيراد خاطئ لجزء إلى إتلاف البيانات، أو يصبح فيه جزء كان اختياريا إلزاميا - يرفع
minReader. حينها ترفض التطبيقات الأقدم بشكل نظيف بدلا من استيراد شيء لا يمكنها التعامل معه. - إذا ضبطت حزمة مستقبلية
formatVersionلكنها أغفلتminReader، يعود القرّاء بحذر إلى الاستناد إلىformatVersion(يعاملون التغيير كأنه كاسر).
قاعدة عملية للمؤلفين: إذا كان كل قارئ موجود سيتصرف بشكل صحيح رغم تجاهل إضافتك، فهي إضافية - ارفع
formatVersionواتركminReader. وإلا فارفعminReader.
السلامة
عندما يكون manifest.integrity موجودا، يتحقق القارئ من SHA-256 لكل جزء مُدرج قبل كتابة أي شيء. عدم التطابق ("failed its integrity check") أو غياب جزء ("incomplete") يُلغي الاستيراد بأكمله - لا استعادة جزئية. يلتقط هذا التلف الذي قد تُحدثه وسيلة نقل الملف (عملية AirDrop مبتورة، بوابة بريد إلكتروني أعادت ترميز المرفق، قطاع USB تالف).
السلامة مبذولة على أساس أفضل جهد بالتصميم: تُكتب فقط حيث تتوفر Web Crypto (كل سياق متصفح آمن وكل Node حديث)، وتُتحقَّق منها فقط عندما تتوفر الخريطة وWeb Crypto معا. تُستورَد الحزمة الخالية من الخريطة - مثلا حزمة من قبل وجود السلامة - دون تغيير. "لا يمكن التحقق" لا تُعامَل أبدا كـ"تالفة".
لا يُدرج البيان نفسه ولا ملف lolly.txt التمهيدي المُعاد توليده. تغطي الملخصات (digests) الأجزاء التي يكفلها البيان.
دلالات الاستيراد
الاستيراد دمج، وليس استبدالا كليا أبدا:
- تُترك البيانات الموجودة على الجهاز الهدف كما هي.
- حين تكون فتحة جلسة أو معرّف صورة مرفوعة موجودين في الطرفين، تُحفظ النسخة الأحدث حفظا، بحيث لا تكتب نسخة احتياطية أقدم أبدا فوق عمل أحدث على الجهاز الهدف. وإذا تساوى الوقتان أو كانا مجهولين، تُحفظ نسخة الجهاز الهدف. وفي تثبيت ويب يملك سجل إنشاء، يقرر النظام نفسه أي نسخة من الإنشاء تبقى حالية، بينما تُحفظ النسخة الأخرى كمسودة محمية (انظر أدناه).
- يُدمَج سجل الملف الشخصي، لا يُستبدل. يبقى كل مجلد على الجهاز الهدف بمحتوياته؛ ويُضاف مجلد من الحزمة لا يملكه الجهاز الهدف، ويحتفظ مجلد موجود في الطرفين باسم الجهاز الهدف ووالده ويكتسب أعضاء الحزمة التي يفتقدها. وتبقى جلسة مصنَّفة في مجلد على الجهاز الهدف مصنَّفة هناك.
- تُدمج المفضلة (الأدوات، وأصول الكتالوج، وعناصر المشاريع). وتُضاف القوالب وقوالب المشاريع والأدوات التي صنعها المستخدم من الحزمة حين لا يملك الجهاز الهدف سجلا بذلك المعرّف. وتُحفظ مدخلات سلة المهملات من الطرفين، بحيث يظل بالإمكان استعادة عنصر كان قابلا للاستعادة على أي من التثبيتين.
- يحتفظ كل حقل آخر في الملف الشخصي (الاسم، وبيانات التواصل، واللغة، وأعلام الميزات، والأدوات المخفية، والإعدادات الأخرى) بقيمة الجهاز الهدف. ويأخذ حقل فارغ على الجهاز الهدف قيمة الحزمة. وينطبق الأمر نفسه على
prefs.json: لا يُكتب تفضيل إلا حيث لا يملك الجهاز الهدف أي تفضيل. - التطبيق المعتاد لمزامنة الأجهزة استثناء: فللحفاظ على تزامن الأجهزة، يأخذ سجل الملف الشخصي والتفضيلات والجلسات والصور من النسخة المزامَنة. وتفعل استعادة نسخة أقدم الشيء نفسه، لأنها تعود في الزمن إلى الوراء عن قصد. أما أول انضمام، Bring it to this device، فيدمج كما يفعل الاستيراد.
- إصدارات الأصول التاريخية ومعرّفات العمليات استثناءات غير قابلة للتغيير: الاستيراد المكرر متكافئ الأثر (idempotent)، والمعرّف الذي يسمي بالفعل بايتات/سجلا مختلفا يُرفض، لا يُستبدل. وإعادة استيراد أصل حالي مطابق يحافظ على إصداره. ويجب أن يحمل الأصل الحالي المتغيّر إصدارا مختلفا.
- يندمج سجل الإنشاء أيضا. فالإنشاء الموجود في الطرفين يحتفظ بالنسخة الأحدث حفظا بوصفها الحالية، وبالنسخة الأخرى كمسودة محمية؛ ويُضاف إلى جانبها إنشاء تستخدم فتحته على الجهاز الهدف لإنشاء آخر؛ ويبقى إنشاء موجود في سلة مهملات الجهاز الهدف هناك. ويحتفظ معرّف نقطة تفتيش يسمي محتوى مختلفا على الجهاز الهدف بنسخة الجهاز الهدف. وتوقف أرشيف يفشل في اختباراته الخاصة الاستيراد قبل أي تغيير في الملف الشخصي أو الجلسة أو الأصل أو التفضيلات. ولا يضيف استيراد مكرر مطابق أي تخزين.
- لا يُمس أي شيء لم يكن في الحزمة. تنجو من الاستيراد جلسة كانت لدى الجهاز الهدف ولم تكن في الحزمة.
تُعيد الجلسات المحفوظة الربط بصورها تلقائيا: تُحفظ إشارات الأصول بالمعرّف، ويُعيد الجسر تحليلها بعد استعادة الصور المرفوعة (وهو مضطر لذلك على أي حال، لأن روابط blob: لا تنجو من إعادة التحميل).
يُبلّغ ملخص الاستيراد عن { profile, sessions, userAssets, prefs, skipped, failedAssets }. يحسب failedAssets الأصول المرفوعة التي تعذّرت استعادتها (امتلاء تخزين الجهاز، مثلا). وهو متمايز عن skipped، الذي يحسب الأجزاء من كاتب أحدث متوافق مستقبليا لم يتعرف عليها هذا الإصدار. تُظهر الواجهة skipped ("… · N newer items skipped")، بحيث تكون الاستعادة صادقة بشأن ما تركته وراءها.
عند وجود سجل الملفات، يحمل الملخص أيضا assetVersions وfileOperations وfailedHistory. وقد يتسبب نفاد التخزين أو تعارضات المعرّفات غير القابلة للتغيير في استعادة جزئية؛ وتخبر الواجهة المستخدم بالاحتفاظ بالنسخة الاحتياطية المصدر. ولا تُقدّم المزامنة السحابية مراجعتها المطبَّقة بعد استعادة جزئية أو غير مدعومة، فتبقى اللقطة متاحة لإعادة المحاولة. والاستعادة ليست معاملة واحدة عبر كل مخازن الملف الشخصي/الجلسة/الأصل/السجل.
سجل الإنشاء (v3)
تتضمن النسخ الاحتياطية اليدوية من مضيف ويب يدعم السجل ملف revision-history.json بمخطط خاص به هو { version: 1, documents, revisions, recoveries }. ويحمل المعرّفات المحتفَظ بها، ولقطات الإدخال القياسية، وطوابع الإصدار، والمعاينات النقطية، ومسودات الكاتب المنفصلة. ويلتقط محوّل السجل الجلسات الحالية ورؤوسها في معاملة قراءة واحدة؛ ويستخدم sessions.json تلك اللقطات الحالية نفسها للقراء الأقدم.
تتحقق الاستعادة من SHA-256 للحمولة وعدد البايتات، والهويات الفريدة، وعلاقات المستند/الرأس، والنسب، والطوابع الزمنية، وأنواع المعاينة، والحدود، قبل تثبيت الأرشيف في معاملة واحدة. وقد تكون مراجع الأصل المضغوطة غائبة. ولا يُستبدَل العمل الحالي الموجود أبدا بصمت: حين يوجد إنشاء في الطرفين، يصبح الطرف غير المحتفَظ به كحالي مسودة محمية. ويُتحقق صراحة من حد النقل البالغ 384 ميبيبايت للأرشيف، وتُفرض حدود التخزين دون اقتطاع نقاط التفتيش المحتفَظ بها. ولا يزال النسخ الاحتياطي الكلي يستخدم تنفيذ ZIP في الذاكرة وليس أرشيفا يبثّ تدريجيا.
يضيف الملخص revisions وrecoveryDrafts، فيحسب فقط ما أضافه هذا الاستيراد، وadded وkept وreplaced وcopies وhidden لبيان كيف دُمج كل إنشاء. وتستعيد القشرة التي تفتقر إلى هذه القدرة الجلسات العادية فقط وتُبلغ عن جزء السجل بأنه متخطى. ويبقى سجل نظام الملفات الأصلي غير مدعوم إلى أن يوفّر محوّله معاملات سجل دائمة. ولا تملك حالة الضيف في P2P أي سجل دائم أو أرشيف استعادة.
تستثني مزامنة اللقطة الشخصية سجل الإنشاء صراحة. وتطبيق لقطة على مستند محلي يحمل سجلا يحفظ حالة عمله السابقة كمسودة استعادة منفصلة، ويُبطل رمز الكتابة الخاص بأي محرر مفتوح. وتبقى نقاط تفتيشه غير القابلة للتغيير على الجهاز. وهذا يحمي السجل المحلي أثناء استبدال اللقطة؛ ولا يدمج سجلات أجهزة متزامنة.
تُحفظ إشارات الأصول التاريخية، بينما لا يزال العرض يحلّ الأصول عبر مكتبة الوجهة الحالية. ولا يضمن هذا الأرشيف بعد بايتات الأصل القديمة الدقيقة أو عمليات عرض الأداة القديمة. وتستمر بايتات إصدار الأصل ونتيجة الملف في الانتقال عبر جزء النسخ الاحتياطي المنفصل الحالي الخاص بها.
الإصدارات المحفوظة ونتائج الملفات (v2)
يحتوي جزء السجل الاختياري على { version: 2, assetVersions: [...], operations: [...], batches: [...] }؛ ويقبل القراء أيضا شكل history-v1 الأقدم دون الدفعات. وتُعرِّف كل لقطة معرّف الأصل الثابت وإصداره الدقيق، ووقت حفظه، وطول بايتاته، و SHA-256 السداسي، إضافة إلى سجل أصل يشير حقلاه _file و_credentialFile الاختياري إلى أجزاء ثنائية. وتحمل العمليات حقائق الملف الأصلي، والطلب، والتقرير، والطوابع الزمنية، وحقل _file الاختياري للنتيجة؛ ولا تنتقل أسماء أنظمة التخزين الخلفية، ولا مقابض OPFS، ولا عقود التنفيذ. ويرفض القراء الأقدم من نوع history-v1 فقط إصدار السجل الجديد قبل الاستيراد، بدل إسقاط عضوية الدفعة بصمت.
تُسجّل بيانات الدفعة كل مصدر مختار قبل المعالجة، بما في ذلك الملفات التي لم تُقرأ قط، والأعضاء الملغاة، وحالات فشل حجز مساحة النتيجة، والعمل المقطوع. ولكل عضو معرّف عملية ثابت، ومرجع/حقائق المصدر، واسم الخرج المطلوب، وتقرير نهائي. وللمصدر غير المقروء حقائق مُعلَنة، لا ملخصا مختلَقا. ويتحقق الاستيراد من هوية العضو واتساقه مع أي تقرير عملية محمول. وتبقى تقارير الدفعة متاحة حين تُزال نتائج فردية صراحة، لكن الإيصال لا يعني أن بايتات خرجه لا تزال مخزَّنة.
- يُتحقق من كل سجل تاريخي معروف وتقرير وملف مُشار إليه قبل أي عملية كتابة لاستيراد الملف الشخصي أو الأصول. وتفشل البايتات المفقودة و SHA-256 غير المطابق حتى إن لم يكن للمغلّف خريطة سلامة. وتبقى بيانات الاعتماد المستخرجة مصفوفات بايتات، بما في ذلك الاستيرادات من كتّاب أقدم سلسلوها JSON ككائنات بمفاتيح رقمية.
- تتحول العمليات الجارية إلى سجلات مقطوعة في النسخة الاحتياطية، مع تقرير فشل توضيحي وبلا نتيجة. ولا تُعيد الاستعادة أبدا تشغيل عمل خلفي ولا تستورد عقد تنفيذ نشطا. وتتطلب إعادة المحاولة اختيار الملف الأصلي، مُتحققا منه مقابل SHA-256 المسجّل حين يتوفر.
- تُثبِّت النتائج المستعادة بايتاتها وبياناتها الوصفية معا في IndexedDB. وتستخدم النتائج الجديدة العادية OPFS حيث يتوفر، مع رجوع احتياطي إلى IndexedDB. ولا تُستبدل أبدا عملية حية قائمة باستيراد.
- لا يزال تجميع ZIP الخاص بالسجل في الذاكرة: والحد الحالي 256 ميبيبايت من حمولة السجل، و4 ميبيبايت من بيانات السجل الوصفية، وحد أقصى 100 عملية، و100 دفعة، و2000 لقطة. ويرفض التصدير صراحة السجل الزائد الحجم أو غير المكتمل؛ ولا يحذفه أبدا بصمت. نزّل الإصدارات/النتائج المهمة فرديا قبل إزالة النسخ المحلية الأقدم. وهذه الحدود ليست ضمانا مقاسا لذروة الذاكرة على الهواتف.
- ولنتائج السجل المحلية ميزانية 512 ميبيبايت وحد 100 سجل. ولِلقطات الأصول ميزانية منفصلة قدرها 512 ميبيبايت وحد أقصى 20 إصدارا تاريخيا لكل أصل؛ وتُحتسب بايتات بيانات الاعتماد المستخرجة ضمن ميزانية تلك اللقطة. وتحترم الاستعادة هذه الحدود ولا تطرد أبدا بصمت بيانات مستخدم موجودة.
- وللبيانات الوصفية للدفعات المحلية ميزانية منفصلة قدرها 4 ميبيبايت، وحد أقصى 100 بيان دفعة و20 عضوا لكل دفعة. وتحجز الأعضاء المعلّقون سعة بيانات وصفية، بسقف تقرير قدره 32 كيبيبايت لكل عضو. وهذه ميزانية منطقية، لا ضمان مساحة قرص في المتصفح؛ ويُكشف عن فشل الحصة الحقيقي ويبقى التقرير المخزَّن في الذاكرة قابلا للتنزيل. وإعادة محاولة عضو دفعة تُنشئ دفعة جديدة دون الكتابة فوق التقرير القديم. وإزالة سجل دفعة لا تزيل بايتات النتيجة الفردية ولا أصول المكتبة.
- يمكن إضافة النتائج المحوَّلة صراحة إلى المكتبة دون تسوية أو إعادة ترميز. وترافق الأصل مجاميع اختبارية للمصدر/الخرج وعلاقة العملية. وتعيد الإضافات المتكررة استخدام نسخة غير متغيّرة؛ ولا يُستبدل أبدا نسخة معدَّلة. ويمكن للصور النقطية بدء مستند Design جديد. ويستخدم ذلك المستند معرّف أصل المكتبة الحالي: وفرض تثبيت إصدار دقيق عبر زمن تشغيل Design ومسار الرابط بأكمله لا يزال عملا منفصلا. وتُحفظ نتائج SVG/HTML/PDF/ZIP كأصول ملفات معتمة بهذا التسليم، لا تُرقَّى إلى محتوى تفاعلي/متجهي موثوق.
- ويكشف Convert → Recent file operations استخدام السجل، والتقارير، والتنزيلات، ومدير الإصدارات. ويجد المدير أيضا إصدارات أقدم لأصول مكتبة محذوفة. وتُنشئ استعادة لقطة إصدارا حاليا جديدا مع إبقاء اللقطة المختارة سليمة. ويحسب الإعدادات → التخزين النتائج والإصدارات منفصلة عن الذاكرة المؤقتة القابلة للتخلص.
- ولا تزيل التنظيف الصريح للملفات المؤقتة إلا بايتات تملكها عملية ولا يُشار إليها. وتحمي السجلات الحالية ملفاتها؛ ولملفات OPFS الحديثة مهلة سماح ساعة واحدة. ولا تُمسح النتائج المحفوظة ولقطات الأصول تلقائيا.
ولا يزال بإمكان القراء الأقدم قبول مغلّف v2 (minReader: 1) واستعادة الأجزاء المألوفة، مع احتساب أجزاء السجل غير المدعومة كمتخطاة. وتتطلب الاستعادة الكاملة للسجل قشرة تملك محوّل fileHistory؛ وهذا خط تماس داخلي للقشرة، لا قدرة جديدة تواجه الأداة في HostV1. وتغطي بوابة Chromium المحلية الاستعادة الحقيقية بين جهازين؛ ويبقى قبول استعادة Tauri/iOS/Android المثبَّتة منفصلا.
ما لا ينتقل
- ذاكرات الكتالوج المؤقتة (بيانات وصفية وبايتات الأصول المنزّلة، فهرس الأدوات) - تُعاد مزامنتها مجانا على الجهاز الهدف.
- أدوات الكتالوج وأصوله - خارج النطاق، ويُفترض أنها موجودة بالفعل على الجهاز الهدف. أما رموز العلامة والخطوط والشعارات التي أضافها المستخدم فهي أصول مستخدم، فتنتقل فعلا.
- روابط
blob:/ روابط الكائنات - تُعاد توليدها بواسطة الجسر عند التحميل. - أصول التحويل الأصلية، وعقود التنفيذ الحية، والأسرار المحلية للجهاز الخاصة بالوصول/التوقيع - ليست حمولة سجل قابلة للنقل. والنتيجة المحفوظة نسخة، لا وعد بأن المصدر الأصلي نُسخ احتياطيا.
- عدّاد تسلسل التصدير - عدّاد تسمية التنزيل اليومي (مفتاح
localStorageباسمlolly-export-seq) هو راحة تسمية محلية. يُبقى خارجPREF_KEYS، لذا لا ينتقل أبدا داخل حزمة.
يفصّل مقياس التخزين الانقسام نفسه. تنتقل الجلسات المحفوظة وMy images ونتائج الملفات وإصداراتها داخل الحزمة. أما ذاكرة الأصول المؤقتة ومعاينات الأدوات والتثبيتات غير المتصلة أسفلها فكلها قابلة لإعادة الاشتقاق، لذا تبقى خلفا.
signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KBتحقق بنفسكاحصل على الملف الموقَّع
signed by Lollyvector SVG37 paths~4.9k nodes85 groups65 KBتحقق بنفسكاحصل على الملف الموقَّع
ضمان عبر القشرات
لا تقرأ وحدة data-transfer.ts وتكتب إلا عبر جسر القدرات (host.profile، وhost.state، وhost.assets) وتفضيلات localStorage المشتركة. وتقرأ الوحدة نفسها المغلّف المشترك وتكتبه على الويب وTauri، فوق تخزين IndexedDB أو نظام الملفات. ولا تظهر أجزاء السجل الاختيارية إلا حيث يتوفر المحوّل المطابق؛ ويُبلَّغ عن الجزء غير المدعوم كمتخطى عند الاستيراد. وتُمرِّن مجموعة الاختبارات غير المرئية (headless) الأجزاء المشتركة مقابل جسر في الذاكرة، بينما تملك معاملات السجل أيضا اختبارات متصفح حقيقية.
يقع غلافان خارج هذا الضمان، لأسباب مختلفة:
- CLI أحادية التشغيل ليس لديها ما تحمله - حالتها في الذاكرة ومؤقتة لكل استدعاء.
- تحافظ TUI فعليا على الحالة (
~/.lolly: الجلسات، المجلدات، الملف الشخصي) ويمكن لعرض الملف الشخصي فيها إنشاء نسخة احتياطية منها، لكنها تكتب أرشيفا أبسط خاصا بها:saved-state/<slot>.jsonلكل جلسة إضافة إلىprofile.jsonوfolders.json، بلا بيان (manifest)، وبلاformatVersion/minReaderوبلا خريطة سلامة. لا يمكن استيرادها بهذا التنسيق - يرفضها القارئ باعتبارها "ليست نسخة احتياطية من Lolly" - ومما يزيد الالتباس أنها تستخدم اسما مشابها (lolly-backup-<stamp>.zip). توحيد الاثنين فجوة معروفة.
نقاط امتداد محجوزة
المغلف عبارة عن بيان إضافة إلى مجموعة من الأجزاء المسماة بالتصميم، بحيث يمكن لأنواع جديدة من البيانات القابلة للنقل أن تُحمل عليه لاحقا دون تغيير جذري (breaking change). تُدرج كأجزاء إضافية (formatVersion جديد، ونفس minReader)، ويتجاهل القارئ الحالي ما لا يتعرف عليه. ولم تُبنَ هذه الأجزاء بعد. الأسماء محجوزة هنا حتى يبقى التنسيق متسقا عند إضافتها.
tokens.json- رموز التصميم (design tokens). مستند رموز تصميم بمعيار W3C DTCG (التنسيق الذي يستورده ويصدره Penpot - رموز بحقول$value/$type/$description، منظمة في مجموعات (groups)، أطقم (sets) وسمات (themes)). تتيح مجموعة رموز داخل الحزمة للمستخدم نقل عناصر علامته التجارية الأساسية بين عمليات التثبيت جنبا إلى جنب مع جلساته. (تنتقل رموز العلامة التجارية الخاصة بالمستخدم اليوم بالفعل كأصلuser/tokens/brandفيassets.json؛ وسيحمل هذا الجزء مستند DTCG كاملا بأطقمه وسماته.) وعلى المدى الأبعد، تصبح مجموعة الرموز المستوردة مصدرا أساسيا تحتكم إليه الأدوات وأصول لوحة الألوان.penpot/- ملفات Penpot المستوردة. دليل محجوز لملف Penpot (أو المجموعة الفرعية المستخرجة منه ذات الصلة بـ Lolly) المستورد والمعروض كأداة. ستحمل الحزمة التعريف المستورد، بحيث ينتقل مع بقية بيانات المستخدم.
أي شيء خارج هذه الأسماء المحجوزة والأجزاء أعلاه يُعامله القارئ كجزء غير معروف: يُترك دون مساس ويُحسب ضمن skipped.
مرجع
- الوحدة:
shells/web/src/data-transfer.ts(exportBackup،importBackup،BACKUP_FORMAT،BACKUP_FORMAT_VERSION،BACKUP_READER_VERSION- أداة تسمية الملفاتbackupFilename()داخلية). - اختبار العقد:
tests/data-transfer.test.ts- حالات الدورة الكاملة، الدمج، السلامة، التوافق التقدمي وبوابة القارئ. - اختبارات عقد السجل:
tests/file-history-backup.test.ts، وtests/file-batch-history.test.ts، وtests/file-result-library.test.ts. وقبول المتصفح:tests/file-history.browser.test.ts، وtests/file-batch-history.browser.test.ts، وtests/file-result-reuse.browser.test.ts. - سطح الجسر المستخدم:
host.profile،host.state،host.assets- انظر واجهة برمجة المضيف.