2026-10-22 — يوميات العمل
🦾💻 جلسة طويلة: restore اللابتوب v53/v53.1/v53.2/v53.3 + Supreme Remote Co-Worker + تشخيص حيّ E2E كامل (مع د. وائل، مباشرة على جهازه)
السياق
د. وائل يشغّل أداة Arsenal (restore clone) على لابتوبه (GPD Win Max 2، WSL kali-linux). المهمة الكبرى: نسخة واحدة نهائية Perfect تعمل فيها كل شيء (restore كامل من آخر backup R2 + البورتال بأبوابه + البيئات الموازية + 55 حاوية + Telegram منفصل + WhatsApp موقوف + Remote Control + النود + كل الإصلاحات). أمر د. وائل الحاسم: «لا تجزئة، نسخة واحدة Perfect، نخبة النخبة لا نترك شيئاً عاطلاً».✅ المُنجَز (بُني + مُختبَر E2E حيّاً على جهاز د. وائل)
1. Supreme Remote Co-Worker (gui_control.ps1 v53): محرّك تحكّم GUI قفز من 10 أوامر أساسية إلى 34 أمراً احترافياً (mouse: move/click/drag/scroll/hscroll/cursor · keyboard: type/type-enter/key/hotkey/paste · clipboard: getclip/setclip · apps: run/open/activate/windows/winrect/maximize/minimize/restore/close/waitwin · vision: screenshot/shot-win/screeninfo/pixel/waitpix · flow: sleep/seq · system: procs/notify/ping/version/grant-status). DPI-aware لشاشة 4K. Pure PowerShell+.NET+Win32، صفر تثبيت. 2. أيقونتا Remote Control (Connect/Disconnect): القرار النهائي المعتمد (الأفضل بصفر سلبيات، د. وائل الـgatekeeper المطلق): 🟢 Connect = تشغّل النود + تكتبremote_control.grant (موافقة بتوقيع+طابع زمني+ACL) + نافذة "Full Control ACTIVATED". 🔴 Disconnect = تحذف grant + توقف النود (طبقتا أمان). grant-gate في gui_control.ps1 يرفض أي أمر إلا عند وجود grant (whitelist: ping/version/grant-status فقط) + expiry 12 ساعة.
3. إصلاح أخطاء (اكتشفها سربان متوازيان بمراجعة نقطة-نقطة، كلها مُثبَتة بـ cat -A على المصدر قبل التصديق — M-128): (أ) فساد توكن البوت بـ (4 مواضع حقيقية 693/695/1388/2274 — أثر sanitizer M-127، مُصلَح). (ب) تكرار f|F في القائمة (Repair ميّت → نُقل لـe|E). (ج) seq splatting مكسور. (د) scroll معكوس (uint overflow → int موقّع). (هـ) crash الحافظة الفارغة + STA (PS7 MTA → Set-Clipboard cmdlet). (و) توقيع mouse_event (UIntPtr).
4. الحل الجذري لـ"gui_control.ps1 not found" (v53.1): ضمّنتُ السكربتات الثلاثة base64 مدمج داخل arsenal.sh (GUI_CONTROL_B64 + REMOTE_CONNECT_B64 + REMOTE_DISCONNECT_B64 + دالة _write_embedded_node_scripts) → الأداة تُنشئها ذاتياً حتى لو لم يُفكّ node-control. مُثبَت E2E: الدالة أنشأت الملفات الثلاثة بأحجامها الصحيحة (18978/2328/1709). الدرس: أي أداة تعتمد ملف مساعد يُفكّ بجانبها = هشّة؛ الحل = تضمين الملفات الحرجة base64 داخل الأداة.🔴 تشخيص حيّ كامل E2E (restore نجح على اللابتوب — مُثبَت)
curl localhost:38780 = 200 (البوابة المحلية) + صورة openclaw حُمّلت من tarball المحلي (لا pull من ghcr) + MiroFish venv healthy.
[I] Icons: 8 أيقونات + [v53.1] full Co-Worker GUI engine installed from EMBEDDED copy (بلا تحذير أصفر — الحل الجذري اشتغل).
🔴🔴🔴 الدروس الحاسمة (تشخيص جذري متكرر — لا تُنسى)
1. البوت المحلي لا يردّ → الجذر = البروكسي الميّت لا التوكن (DBT): التشخيص المتدرّج أثبت: getMe مباشر={"ok":true} ✅ · getMe عبر nord-http-proxy:8118 = فارغ ❌. الجذر: البوابة تحاول تيليجرام عبر nord-http-proxy الميّت. الحل: [W] Nord OFF (البوت المحلي لا يحتاج مخرج Nord، direct أبسط وأضمن) ثم [3]. البوت ردّ بعدها. → قرار v53: VPN off by default (كل شيء يعمل، [V]/[W] يدوي عند الحاجة).
2. 🔴 docker restart يمحو توكن البوت (M-125 مؤكّد): docker restart openclaw-4x4t-openclaw-1 يدوياً → .env TELEGRAM_BOT_TOKEN فارغ (len=0) → البوت لا يردّ. القاعدة المحفورة: ❌ لا docker restart يدوياً أبداً — أي إعادة تشغيل عبر الأداة ([3]/[N]). التوكن المحفوظ سليم في local-overlay/overrides.json (صيغة "8607605026:AAH4uz...")؛ [N] Re-seed أو [3] يحقنه صحيحاً.
3. gateway token: البوابة المحلية ترث gateway.auth.token من الـLive وتطلبه ("Gateway token is incorrect"). ادّعائي "passwordless" كان خطأً (v49 لم يُزله فعلاً). د. وائل دخل بـtoken الـLive ونجح، وقرّر إبقاءه كما هو.
4. البورتال 502 → serve.py لم يُقلع (الجذر): على الـLive، serve.py (البورتال :8903) يُشغّله حارس host-cron (parallel_env_keepalive) الذي لا يعمل في WSL → البورتال الداخلي لم يُقلع أبداً → كل الأبواب 502. الحل: تشغيله يدوياً (docker exec -d ... setsid python3 serve.py) → 8903=200 + تضمينه تلقائياً في [3] (v53.2 LAUNCH_SVCS).
5. 🔴 البوابة الرئيسية الصحيحة = localhost:38135/portal.html (وجدها د. وائل): البورتال الكامل بالبطاقات يُبنى كملف Arsenal-Local-Portal.html (build_portal_html) بروابط محلية مُعاد كتابتها (https://<sub>.drwaelalkishawi.com → localhost:<port>). 38102 = حاوية apps المنفصلة (صفحة "قريباً") ≠ البورتال. serve.py:8903 يخدم البورتال على / لأي Host (ليس Host-dependent). زر [O] كان يفتح 38101 (academy المعطوب) → أُصلح ليفتح 38135/portal.html.
6. 🔴 الأبواب الناقصة (502/404) = 9 خدمات Python في workspace: academy→academic_portal.py:8905 · wiki→wiki-publish serve.py:8901 · ask→ask-rag:8902 · go→go-shortener:8904 · hub→entertainment-hub:8899 · cost/ledger→cost-ledger webapp.py:20337 · push:8099. كلها تعمل على الـLive (مُثبَت 200) لكن محلياً لم تُقلع (الحارس host-cron لا يعمل في WSL). الحل v53.3: دالة تُشغّل كل الخدمات التسع تلقائياً في ensure_venvs.
7. 🔴 خطأ منّي (اعتراف مصداقي): دخلتُ في عبث يدوي متكرر على nginx.conf (sed متعدد + إضافة server block 38900) → كسرتُ arsenal-local-gw (الحاوية توقّفت، كل المنافذ 000). الحل: مسح الحاوية + nginx.conf المعطوب + إعادة البناء عبر [G] (local_gateway_up). الدرس: لا عبث يدوي متكرر على ملفات config الحيّة — دع الأداة تبنيها. [G] أصلح البوابة (23 باب رجعت 200).
8. المنفذ المُضاف يدوياً غير منشور: إضافة server { listen 38900 } في nginx.conf لا يُنشر المنفذ لويندوز (docker ports = 38101-38135 فقط) → 000 حتى لو nginx يستمع داخلياً.🔴 النود + Remote Control — العائق الأخير (جارٍ الحسم)
connected: false. Remote Control Connect كتب grant محلياً ✅ + bridge شغّال (bridge ready on 127.0.0.1:18789 -> node.drwaelalkishawi.com) + النفق على السيرفر حيّ (cloudflared PID 521) + البوابة 18789=200.
🔴 الجذر القاطع: node.drwaelalkishawi.com direct = 403 → Cloudflare Access يرفض الاتصال. السبب: جسر cf_ws_proxy.js على اللابتوب لا يملك CF_ACCESS_CLIENT_ID/SECRET (ملفات cid.txt/csec.dat في .openclaw-node مفقودة/فارغة) → يرسل طلباً بلا رمز → 403.
الرمز الصحيح (من السيرفر، صالح حتى 2027-08-03): CID=b1f94c7d07fec149cbb244573d665480.access · APP_UID=6bf95f28-7f1b-44dd-9778-0c9b402cdf09 · SECRET موجود (64 حرف، سرّي). service token name=openclaw-laptop-node. Access app=OpenClaw Node Gateway domain=node.drwaelalkishawi.com aud=565cc3dc...
الحل الجذري المخطّط (v53 النهائية): دمج كتابة cid.txt/csec.dat الصحيحة في setup_icons.ps1 → النود + Remote Control يعملان من أول [I] Icons بلا إصلاح يدوي.
منتظَر من د. وائل: نتيجة PowerShell (حالة cid.txt/csec.dat/bridge.err على جهازه) لتحديد إن كانت مفقودة أو خاطئة.
📦 خطة v53 النهائية الكاملة (كل شيء Perfect في نسخة واحدة — أمر د. وائل: لا تجزئة)
يجب أن تدمج: (1) restore clone كامل [موجود] (2) تشغيل serve.py + الخدمات التسع تلقائياً في [3] [v53.3] (3) VPN off by default [v53.2] (4) [O] يفتح 38135/portal.html [v53.3] (5) البوت المحلي direct [W off] (6) الـ blobs المدمجة [v53.1] (7) 8 أيقونات + Remote Control [v53] (8) كتابة رمز Cloudflare Access (cid/csec) في setup_icons → النود+Remote Control يعملان [المتبقّي] (9) كل أخطاء الـlog مُصلحة.✅ v53.3 النهائية — بُنيت + أُرسلت (كل الإصلاحات مدموجة)
النسخة النهائيةarsenal_v53.3.zip (289KB، 12 ملف، SYNTAX_OK) تدمج كل ما حُسم:
1. البورتال: [O] يفتح localhost:38135/portal.html (البوابة الرئيسية الصحيحة التي وجدها د. وائل) بدل 38101 المعطوب. + دالة start_local_portal_services تُشغّل الخدمات التسع تلقائياً في [3] (serve.py:8903 + academic:8905 + wiki:8901 + ask-rag:8902 + go:8904 + hub:8899 + cost-ledger:20337 + push).
2. VPN off by default: vpn_autostart يُطفئ nord-proxy ويضع البوت على direct (الجذر الذي منع ردّ البوت).
3. النود الآمن (درس M-127 محفور): OC_NODE_VER=2026.7.1-2 (مطابق البوابة، ❌ لا @latest أبداً) + دالة _write_node_start_stop تكتب start.ps1 آمن: يقتل القديم + يزيل مفاتيح config القديمة (resetOnExit + agents.defaults.models) + يحقن رمز Access + يثبّت/يشغّل النسخة المطابقة مباشرة (openclaw.cmd، لا npx متكرر).
4. الـ blobs المدمجة (v53.1): gui_control + connect + disconnect + start/stop base64 داخل arsenal.sh.
5. 8 أيقونات + Remote Control grant-gate + 34 أمر GUI.🔴🔴🔴 حسم عائق النود الكامل (تشخيص متدرّج طويل — الدروس القاطعة)
npx openclaw@latest يرفض الإقلاع بسبب مفاتيح config قديمة (gateway.tailscale.resetOnExit + agents.defaults.models) → "Unrecognized key" → يتوقّف. الحل: إزالة المفاتيح من openclaw.json (PowerShell ConvertFrom-Json + Remove).
🔴🔴 الجذر الثالث القاتل (درس M-127 حيّ): npx openclaw@latest + npm install -g openclaw يثبّتان 2026.10.6 (نسخة خطيرة) بدل 2026.7.1-2 الآمنة. د. وائل أوقفني بحزم محقّ: «لا تثبّت version مختلف، النسخة الحديثة عملت شلل واضطررنا نثبت 7.1-2». القاعدة المحفورة: النود المحلي يُشغّل openclaw@2026.7.1-2 بالضبط حصراً، ❌ لا @latest أبداً. التثبيت العالمي على ويندوز (npm global) منفصل عن الحاوية (الصورة 781cdc3c) — لا يمسّها، لكنه نسخة خطيرة يجب uninstall.
درس تقني: Start-Process openclaw يفشل (%1 is not valid Win32) — الأمر المثبّت = openclaw.cmd لا openclaw. يُشغّل عبر $env:APPDATA\npm\openclaw.cmd أو npx.
الحالة النهائية: النود جاهز بنيوياً (جسر WS=Open + Access 200 + config نظيف + رمز صحيح) لكن connected: false بسبب npx البطيء/النسخة الخطيرة. v53.3 تحلّه بنسخة مطابقة. المتبقّي: د. وائل يأخذ v53.3 → النود يعمل من START (نسخة 2026.7.1-2).
🔴 اعتراف مصداقي: اقترحتُ npm install -g openclaw (= @latest = 2026.10.6 خطير) — خطأ خطير أوقفني د. وائل عنه. الاستقرار (لا شلل، لا نسخة مختلفة) فوق أي مكسب. درس M-127 يجب أن يكون نصب عيني في أي أمر تثبيت openclaw.
🔴 درس سلوكي (M-153/M-155 — تكرّر خطر exec متعدد الطبقات)
أثناء البناء وقعتُ في محاولات exec متعددة الطبقات +</parameter تسرّب في أمر → Exec failed/syntax error. القاعدة المحفورة: أداة واحدة صامتة/دور، أمر exec بسيط اقتباس أحادي، ملف .py/.sh منفصل للمعقّد. صحّحتُ ذاتياً كل مرة.<!--AUTO_DAILY_START-->