متصفحك الحقيقي، لا بيئة معزولة
إضافة وولفيش للمتصفح تمنح الوكيل تحكّمًا مباشرًا بمتصفحك الحقيقي. على عكس قدرة المتصفح المبنية على Playwright (التي تعمل في جلسة معزولة)، الإضافة تعمل في متصفحك الفعلي — ملفات تعريف الارتباط وتسجيلات الدخول والإضافات والتبويبات المفتوحة كلها متاحة.الوكيل يفضّل تلقائيًا أدوات
ext_* على أدوات Playwright browser_* عندما تكون الإضافة متصلة. لا حاجة لأي إعداد.ثلاث طرق إلى الويب
أمام وولفيش ثلاث طرقٍ إلى الصفحة، وكان يمدّ يده عادةً إلى أضعفها. ومنذ الإصدار 1.0.236 صار التوجيه متعمَّداً، وصارت الإضافة هي الافتراض لكلّ ما يهمّ:
والوكيل مُعلَّمٌ أن يميل إلى المتصفّح كلّما:
- سمّت المهمّة موقعاً بعينه، أو موقعاً مسجَّل الدخول أو مدفوعاً أو خلف جدار دفعٍ أو موافقةٍ أو فحص روبوتات — فجلستك أنت مُوثَّقةٌ هنا أصلاً.
- كانت الصفحة مُصيَّرةً بـ JS (وهي معظم التطبيقات الحديثة)، أو لا نهائيّة التمرير، أو تخفي محتواها خلف نقرة. فـ
web_fetchيعيد قشرةً فارغة في هذه الحالات. - كان العمل أكثر من قراءة — ملء نموذج، أو نشر، أو تنزيل، أو المرور بمسارٍ من خطوات.
- عاد
web_fetchنحيلاً أو نمطيّاً أو محجوباً بجدار دفع. فلا يعيد الجلب، بل يأتي إلى هنا. - امتدّت المهمّة على صفحاتٍ عدّة، حيث تتجاوز كلفةُ دورة جلبٍ-ثمّ-إخفاق لكلّ صفحة كلفةَ فتح المتصفّح مرّةً واحدة.
مجموعة تبويبات وولفيش
يعمل الوكيل في مجموعة تبويباتٍ خاصّةٍ به، لا في تبويباتك أنت. فأوّل أمرٍ يحتاج صفحةً يُنشئ تبويباً جديداً، أزرق اللون بعنوان Wolffish، وكلُّ أمرٍ بعده يحطّ فيه افتراضاً. أمّا تبويباتك أنت فلا يُنقَل أيٌّ منها ولا يُنقَر فيه ولا يُكتَب.- المهمّة الجديدة أو الموقع الجديد يأخذ تبويباً طازجاً — فـ
ext_navigateيقبل رايةnewTab، وext_tab_openيفتح داخل المجموعة دائماً. ولا تُعاد تبويبات مهامّ لا صلة لها. - العمل عبر مواقع يعني تبويباً لكلٍّ منها، كلّها داخل المجموعة، والتنقّل بينها بـ
ext_tab_switch. - قراءة التبويب الذي تقف عليه لا تحدث إلّا حين تطلبها («ما الذي في هذه الصفحة؟»). فـ
ext_tabs_listيَسِم كلّ تبويبٍ برايةwolffish—trueلتبويبات الوكيل وfalseلتبويباتك — ويمرّر الوكيل مُعرِّف تبويبك صراحةً. والمُعرِّف الصريح يغلب الافتراض دائماً. يقرأ تبويباً لك؛ ولا يعمل فيه أبداً. ext_window_openيقع خارج المجموعة — فالتبويب الأوّل لنافذةٍ جديدة لا يستطيع الانضمام إليها، ولذلك تعيد الأداةtabIdوعلى الأوامر أن تسمّيه. وext_tab_openمفضَّلٌ إلّا أن تكون نافذةٌ منفصلة مطلوبةً حقّاً.- أغلق تبويب الوكيل أو المجموعة كلّها فينشئ الأمرُ التالي واحداً جديداً في صمت.
عنوان المجموعة سطرُ حالة
عنوان المجموعة هو الشيء الوحيد الذي تراه بينما يعمل الوكيل، وext_set_activity هي طريقه إلى إبقائه صادقاً — رمزٌ تعبيريّ وكلماتٌ قليلة، دون نحو 24 محرفاً لأنّ مجموعات التبويبات ضيّقة.
والوسم حُكمٌ لا طقس (ضُبط في الإصدار 1.0.237):
- البحثة العابرة تُبقي الاسم المجرّد
Wolffish. ففتح صفحةٍ واحدة أو حسم معلومةٍ واحدة لا يحتاج إعلاناً — الاسم المجرّد يقول كلّ ما ثمّة ليُقال. - المهمّة الحقيقيّة — خطواتٌ عدّة، أو أكثر من صفحة، أو أكثر من لحظة — تحمل وسماً، يُحدَّث كلّما انتقل العمل من طورٍ إلى طور:
🔎 أقارن الرحلات،🛒 أُتمّ الشراء،✍️ أكتب ردّاً،📖 أقرأ التوثيق. والوسم البائت أسوأ من لا وسم. - واستدعاء
ext_set_activityبلا وسائط يعيد المجموعة إلى Wolffish المجرّد.
تحتاج المجموعة صلاحيّة
tabGroups في Chrome، وقد صارت الإضافة تطلبها. أمّا المتصفّح الذي لا يدعم مجموعات التبويبات فيحصل على تبويبٍ مخصَّصٍ عاديّ بدلاً منها — فالوسم تجميليّ ولا يُفشِل مهمّةً أبداً.لماذا هذه الإضافة
التحكم بالحاسوب — حيث يلتقط الذكاء الاصطناعي لقطات شاشة ويحرّك الماوس ويكتب — يعمل، لكنه بطيء ومكلف وهشّ. كل إجراء يتطلب لقطة شاشة كاملة تُرسل لنموذج رؤية، والنموذج يخمّن أين ينقر بناءً على إحداثيات البكسل، والأخطاء تتراكم لأنه لا يفهم بنية الصفحة. الإضافة تستبدل كل ذلك بتحكّم مباشر بالمتصفح. لا حاجة للقطات شاشة للتنقل. لا تخمين. الوكيل يرسلext_click('.submit-btn') والإضافة تنقر على العنصر الفعلي. يرسل ext_read_page({ format: 'text' }) ويحصل على نص نظيف — وليس لقطة شاشة بحجم 2 ميجابايت.
الميزة الحقيقية هي إعادة استخدام الجلسة. متصفحك مسجّل الدخول فعلاً في كل شيء — Gmail، LinkedIn، Reddit، GitHub، Notion، أدوات شركتك الداخلية. الإضافة تمنح الوكيل وصولاً لكل ذلك بدون تخزين بيانات اعتماد أو إدارة OAuth أو تشغيل متصفحات مؤقتة.
أمثلة واقعية
- “لخّص صفحتي الرئيسية في Reddit” — الوكيل يفتح Reddit (أنت مسجّل الدخول فعلاً)، يقرأ المنشورات، يمرّر لتحميل المزيد، ويعطيك ملخصًا. بدون مفتاح API، بدون OAuth.
- “ابحث في Reddit عن مراجعات MacBook Air M4” — ينتقل للبحث، يقرأ النتائج، يدخل المواضيع، يستخرج التعليقات المفيدة.
- “نظّف محادثات LinkedIn — احذف التي لم أرد عليها منذ 6 أشهر” — يفتح الرسائل، يقرأ المعاينات، يحدد القديمة، ويحذفها.
- “اقبل طلبات الاتصال المعلّقة من أشخاص في مجالي” — يفتح صفحة الدعوات، يقرأ كل طلب، يتحقق من العنوان، يقبل المناسبين.
- “تحقق من إشعارات GitHub وأغلق المشاكل المحلولة” — يفتح الإشعارات، يقرأ كل واحد، يتابع الرابط، يتحقق ويغلق.
- “ابحث في Hacker News عن أوراق الذكاء الاصطناعي اليوم واحفظ الروابط” — لا يوجد API لهذا. الإضافة تقرأ الصفحة كما تفعل أنت.
التكلفة: لماذا اختيار النموذج مهم
أتمتة المتصفح تولّد سياقات كبيرة بسرعة. كلext_read_page يعيد النص الكامل. كل ext_screenshot يضيف صورة للسياق. جلسة تصفح نموذجية بـ 20-30 استدعاء أداة يمكن أن تدفع السياق لأكثر من 100 ألف رمز.
ننصح بـ DeepSeek أو MiniMax أو Kimi لسير العمل الكثيف على المتصفح. تتعامل مع التصفح المعقّد متعدد الخطوات بموثوقية وبجزء بسيط من التكلفة. فرق الجودة لمهام “تنقّل، اقرأ، استخرج، لخّص” ضئيل. احتفظ بالنماذج المتقدمة للمهام التي تحتاج فعلاً لتفكير أعمق.
البنية
الإضافة تتصل بتطبيق وولفيش عبر WebSocket محلي.الإعداد
- افتح الإعدادات → الخدمات → إضافة المتصفح
- انقر عرض في فايندر للوصول لمجلد الإضافة
- افتح متصفحك →
chrome://extensions - فعّل وضع المطور → رفع غير مضغوطة → اختر مجلد الإضافة
- الإضافة تتصل تلقائيًا — يظهر المتصفح صفًّا مستقلًّا بنقطة خضراء
عدّة متصفحات، إضافة واحدة
لم تعد الإضافة تفترض متصفحًا واحدًا. حمّل المجلد غير المضغوط نفسه في عدة متصفحات في آنٍ واحد — بل إنّ الملفّين الشخصيّين للمتصفح الواحد يُحسبان متصفحَين، يُفرَّق بينهما بالبريد الإلكتروني المسجَّل في كلٍّ منهما، فلا يعود التمييز بين «كروم العمل» و«كروم الشخصي» تخمينًا. كل متصفح يتصل يقدّم نفسه لحظة وصوله: إلى جانب إصدار الإضافة يبلّغ اسمَ المتصفح وإصدارَه، ونظامَ التشغيل، وبريدَ الملف الشخصي المسجَّل (عبر واجهةidentity في Chrome — يبقى فارغًا عند عدم تسجيل الدخول)، ومُعرِّفَ نسخةٍ ثابتًا — مُعرِّف عشوائي يُحفَظ في التخزين المحلي للإضافة ويثبت لكل ملفٍّ شخصي. فالمجلد غير المضغوط نفسه يُنتج مُعرِّفَ إضافةٍ واحدًا في كل متصفحات Chromium، ولذا فإنّ مُعرِّفَ النسخة هذا هو ما يتيح لوولفيش أن يميّز متصفحًا يعيد الاتصال ويستبدل مقبسَه القديم بدل أن يسرد المتصفح نفسه مرتين.
وفي الإعدادات ← الخدمات ← إضافة المتصفح ينال كل متصفح متصل صفَّه الخاص: أيقونة المتصفح، والاسم مع الإصدار الرئيسي، وسطرٌ فرعي فيه بريد الملف الشخصي ونظام التشغيل ووقت الاتصال، وإصدار الإضافة، وزرُّ اختبار اتصال خاصٌّ بالصف. ومتى اتصل أكثر من متصفح، يعرض كل صف أيضًا مفتاح اختياره — عُرف المتصفح (chrome أو edge أو brave)، ملحقًا بـ-2 حين يتصل المتصفح نفسه مرتين. والصفوف تثبت في مكانها عبر إعادات تحميل الإضافة (لإعادة التحميل مهلة سماح 20 ثانية) بدل أن ترمش وتختفي.
أيَّ متصفحٍ يقود الوكيل؟
- متصفح واحد متصل — كل أدوات
ext_*تستهدفه تلقائيًا. لا شيء يُختار. - عدة متصفحات متصلة — كل محادثة تقود متصفحًا واحدًا بالضبط. يستعرض الوكيل القائمة بـ
ext_browsersويختار واحدًا بـext_use_browser(بمفتاح الاختيار، أو العُرف، أو الاسم، أو جزءٍ من بريد الملف الشخصي مثلwork@company.com). والاختيار يلزم تلك المحادثة حتى يبدّله عمدًا. يقرّره بنفسه إن سمّيتَ متصفحًا أو دلّ السياق عليه دلالةً واضحة، ويسألك أولًا حين لا دليل — وإلى أن يُختار متصفح، تعيد نداءاتext_*القائمةَ بدل أن تخمّن.
التحديث التلقائي
الإضافة تحدّث نفسها تلقائيًا عند تحديث وولفيش — بدون أي خطوات يدوية.- كل إصدار من وولفيش يتضمن أحدث ملفات الإضافة داخل التطبيق
- عند كل تشغيل، الملفات تُنسخ إلى
~/.wolffish/workspace/extension/فوق النسخة السابقة - عند اتصال الإضافة، الخادم يقارن إصدارها بالإصدار الموجود على القرص
- إذا اختلفا، يرسل الخادم أمر إعادة تحميل — الإضافة تستدعي
chrome.runtime.reload()وتلتقط الكود الجديد وتعيد الاتصال تلقائيًا
62 أداة
الوكيل يراها كأدواتext_*. الإضافة تترجمها لأوامر browser_* عبر البروتوكول.
اختيار المتصفح وتشغيله
ext_browsers · ext_use_browser · ext_launch_browser
التنقل
ext_navigate · ext_back · ext_forward · ext_reload
التفاعل مع الصفحة
ext_click · ext_type · ext_select · ext_hover · ext_scroll · ext_focus · ext_keypress · ext_drag_drop · ext_file_upload · ext_set_value · ext_submit_form
قراءة الصفحة
ext_read_page · ext_query_selector · ext_get_attribute · ext_get_value · ext_get_url · ext_get_page_info
إدارة التبويبات والنوافذ
ext_tabs_list · ext_tab_open · ext_tab_close · ext_tab_switch · ext_tab_duplicate · ext_tab_move · ext_windows_list · ext_window_open · ext_window_close · ext_window_resize
مجموعة تبويبات وولفيش
ext_set_activity
الالتقاط
ext_screenshot · ext_pdf · ext_download
البيانات والتخزين
ext_cookies_get · ext_cookies_set · ext_cookies_remove · ext_storage_get · ext_storage_set · ext_clipboard_read · ext_clipboard_write
متقدم
ext_execute_js · ext_wait · ext_wait_for · ext_wait_for_navigation · ext_wait_for_network_idle · ext_notify
وضع المُنقّح
ext_debugger_attach · ext_debugger_detach · ext_debugger_status
الماوس والإحداثيات والأنسنة
ext_mouse_move · ext_mouse_click · ext_mouse_down · ext_mouse_up · ext_mouse_drag · ext_element_from_point · ext_get_interactive_elements · ext_humanize
وضع المُنقّح (Debugger Mode)
وضع المُنقّح يربط بروتوكول أدوات المطور في Chrome (CDP) بتبويب ويستبدل التفاعلات عبر content script بأحداث إدخال منخفضة المستوى. عند تفعيل المُنقّح، النقرات والكتابة والتمرير والتحويم والضغطات تُرسل عبر أوامرInput.dispatch* في CDP بدلاً من واجهات DOM.
لماذا يوجد
تفاعلات content script مثلelement.click() و element.value = '...' قابلة للاكتشاف. المواقع تستطيع التمييز بين الأحداث البرمجية وإدخال المستخدم الحقيقي عبر فحص خصائص مثل isTrusted، أو مراقبة ترتيب الأحداث، أو استخدام مكتبات كشف البوتات. أحداث CDP تتجاوز كل هذا — تدخل خط أنابيب الإدخال في المتصفح بنفس مستوى أحداث لوحة المفاتيح والماوس الفعلية.
كيف يعمل
- الوكيل يستدعي
ext_debugger_attachمع معرّف التبويب - Chrome يربط بروتوكول المُنقّح بالتبويب (سترى شريط ”… is debugging this tab”)
- جميع استدعاءات
ext_clickوext_typeوext_scrollوext_hoverوext_keypressعلى ذلك التبويب تُوجَّه تلقائيًا عبر CDP بدلاً من content script - حركات الماوس تتبع منحنيات بيزيه مع توقيت بتوزيع غاوسي — وليس خطوطًا مستقيمة بتأخيرات ثابتة
- الكتابة تُرسل تسلسلات
keyDown/char/keyUpلكل حرف بتأخيرات متغيرة بين المفاتيح - عند الانتهاء، استدعِ
ext_debugger_detachلتحرير المُنقّح
القيود
- تبويب واحد فقط يمكن ربط المُنقّح به في نفس الوقت — الربط بتبويب جديد يفصل السابق
- Chrome يعرض شريطًا أصفر “debugging” أعلى الصفحة (لا يمكن إخفاؤه)
- صفحات
chrome://وchrome-extension://لا يمكن تنقيحها - إذا كانت أدوات المطور مفتوحة بالفعل على التبويب، لا يمكن ربط المُنقّح
الأنسنة (Humanize)
أداة الأنسنة (ext_humanize) تحقن سلوكيات بشرية دقيقة بين إجراءات الوكيل. بدلاً من أن ينقر الوكيل ويكتب ويتنقل بدقة آلية وبدون أي وقت خمول، الأنسنة تضيف التوقفات والتمريرات الصغيرة وانزلاقات المؤشر وتأخيرات القراءة التي ينتجها المستخدمون الحقيقيون طبيعيًا.
مستويات الشدة
الإجراءات الدقيقة
كل استدعاءext_humanize يختار إجراءً عشوائيًا من مجمّع مستوى الشدة وينفذه:
- توقف عشوائي — انتظار 0.8-2 ثانية (يحاكي التفكير أو القراءة)
- تمرير دقيق — تمرير بمقدار صغير للأعلى أو الأسفل، أحيانًا يعود
- حركة مؤشر — يحرك المؤشر لعنصر غير تفاعلي عبر مسار بيزيه
- تحويم على عنصر خامل — ينتقل لعنصر غير تفاعلي ويتوقف قليلاً
- تمرير متغير — 2-4 خطوات تمرير صغيرة متتالية بتوقيت متغير
- ارتداد التمرير — يمرر للأسفل ثم يعود للأعلى (كمن تجاوز أثناء القراءة)
- انزلاق الخمول — حركات مؤشر عشوائية صغيرة حول الموضع الحالي
- توقف طويل — انتظار 2-5 ثوانٍ (يحاكي قراءة فقرة)
مع وضع المُنقّح
الأنسنة تعمل مع أو بدون المُنقّح. عند تفعيل المُنقّح، إجراءات التمرير والمؤشر تستخدم أحداث CDP. بدونه، تعود لتنفيذ content script. الوكيل لا يحتاج للتنسيق — الأنسنة تتحقق من حالة المُنقّح تلقائيًا.لقطات الشاشة
لقطات الشاشة تُعالج عبر sharp قبل إرسالها للنموذج:- الإضافة تلتقط التبويب المرئي عبر
chrome.tabs.captureVisibleTab() - الإضافة تزيل بادئة data URL وتفك الترميز
- sharp تغيّر الحجم للعرض الأقصى المُعدّ (افتراضي 1280 بكسل)
- تحويل للصيغة المُعدّة (افتراضي JPEG، جودة 80)
- تعيد base64 نظيف — يُعرض تلقائيًا في المحادثة
اللوحة الجانبية
الإضافة تتضمن لوحة جانبية تعرض:- حالة الاتصال — متصل، بانتظار، أو غير متصل
- بث الأحداث المباشر — كل استدعاء أداة يظهر فوريًا أثناء تصفح الوكيل
- سجل المحادثات — تصفّح أحداث المحادثات السابقة
~/.wolffish/workspace/logs/extension/{conversationId}.jsonl، موسومةً بالمتصفح الذي أجراها — فمع اتصال عدة متصفحات، تعرض اللوحة الجانبية لكل متصفح المحادثاتِ التي قادها ذلك المتصفح وحدها.
التخصيص
تعديل تعليمات الوكيل
عدّل~/.wolffish/workspace/brain/cerebellum/.browser-extension/SKILL.md:
- غيّر أوصاف الأدوات لتوجيه الوكيل بشكل مختلف
- أضف أو عدّل كلمات التفعيل
- أضف أنماط الأمان (
danger_patterns،confirm_patterns) - عدّل نص التعليمات لإجراءات تصفح مخصصة
تعديل الإضافة
عدّل~/.wolffish/workspace/brain/cerebellum/.browser-extension/plugin/index.mjs:
- أضف معالجة قبل/بعد استدعاءات الأدوات
- اجمع أوامر متعددة في أدوات عالية المستوى
- خصّص معالجة لقطات الشاشة
- أضف أدوات جديدة تجمع الأوامر الموجودة
بناء إضافة مخصصة
خادم WebSocket لا يهتم بمحتوى الأوامر — يمرر أي{ id, type, params } للإضافة ويحل عند وصول الاستجابة. يمكنك نسخ الإضافة وإضافة أوامر جديدة وتحديث الإضافة.
راجع مستودع الإضافة للشفرة المصدرية الكاملة.
المتصفحات المدعومة
الأمان
الإضافة ترث نظام أمان القدرات القياسي:ext_execute_jsمعdocument.cookieأوnavigator.sendBeacon→ محظورext_execute_js(أي) → يتطلب موافقةext_download→ يتطلب موافقةext_cookies_set→ يتطلب موافقة- التنقل لمواقع مالية → يتطلب موافقة