Skip to main content

الدماغ نفسه في كل قناة

يتواصل وولفيش من خلال خمس قنوات: واجهة سطح المكتب عبر Electron، وطرفية، وبوت Telegram، والمراسلة المباشرة عبر WhatsApp، وهاتفٍ مقترن. تعمل القنوات الخمس بنفس خط معالجة الذكاء — الفرق الوحيد هو كيفية وصول المدخلات وكيفية عرض المخرجات.

القنوات الخمس

واجهة Electron

واجهة سطح المكتب الأصلية. بث لحظي، تنسيق Markdown غني، نوافذ موافقة، وإدارة كاملة للمحادثات.

الطرفية

أمر wolffish — جلسة تفاعلية أو طلب واحد ينتهي بجوابه، متصلًا بالوكيل الذي يعمل. تنسيق Markdown يُصيَّر بألوان ANSI، والموافقات تُجاب بضغطة زر، والملفات مسارات في الاتجاهين. القناة الوحيدة التي تعمل على خادم بلا شاشة.

Telegram

بوت شخصي يستجيب لرسائلك الخاصة. أزرار مضمّنة للموافقات، تنسيق HTML، ومعالجة الملفات.

WhatsApp

مراسلة مباشرة عبر بروتوكول WhatsApp Web. موافقات نصية، تحويل الرسائل الصوتية لنص، وإعادة اتصال تلقائية.

الهاتف

رفيق الهاتف، مقترنٌ بهذا السطح عبر نفقٍ مشفَّرٍ من طرفٍ إلى طرف. ليس خيط رسائل بل واجهةٌ ثانية للتطبيق كلّه — والرسالة المُرسَلة منه تشغّل دورًا حقيقيًا هنا.

البنية المعمارية

كل قناة تصب في نفس خط المعالجة. القناة هي مجرد طبقة نقل — تستقبل مدخلات المستخدم، وتسلّمها للذكاء، ثم تعرض ما يعود منه.

واجهة TurnSink

كل قناة تنفّذ واجهة TurnSink — وهي العقد الذي يحدد كيفية استقبال مخرجات خط المعالجة:
واجهة Electron تعرض onSegment كبث لحظي بتنسيق Markdown. أما Telegram فيصيغ الأجزاء كرسائل HTML. بينما يرسل WhatsApp نصًا عاديًا. نفس البيانات، عرض مختلف.

مُشغّل الأدوار TurnRunner

يقوم TurnRunner بتسلسل الأدوار لكل محادثة على حدة، لا عالميًّا. المحادثة الواحدة نصٌّ واحد مرتّب — أدوارها تصطف خلف بعضها فلا تتداخل أبدًا — لكنّ أدوار المحادثات المختلفة تعمل بالتوازي، أيًّا كانت القناة التي وصلت منها. وكل دور يعمل في نطاقٍ معزول بحالته الخاصة، فلا يُفسد دورٌ متزامنٌ آخرَ.
الرسالة الثانية للمحادثة نفسها تنتظر انتهاء أولاها (حفظًا لترتيب النصّ ومنعًا لتعارضات كتابة الذاكرة وتجميع السياق في تلك المحادثة)، بينما تمضي محادثةٌ أخرى على أيّ قناة فورًا. لم يعد خيط واتساب صباحك ومهمّة طويلة داخل التطبيق يعطّل أحدهما الآخر. وكل دور يبثّ دورة حياته أيضًا — بدأ، انتهى، أُلغي، خطأ — إلى تطبيق سطح المكتب، وهذا ما يقود شرائح الحالة الحيّة في شريط المحادثات لتشغيلات داخل التطبيق وTelegram وWhatsApp سواءً بسواء.
الرسالة الجديدة في دردشة مشغولة تصطفّ خلف الدور الجاري، لا تُدمج فيه — يوقفها Telegram وWhatsApp جانباً ويشغّلانها تالياً، بالترتيب (انظر الرسائل المصطفّة في كل قناة). وما زال TurnRunner يدعم استباق دور محادثةٍ ما بإجهاضه أولاً — وهو بالضبط ما يفعله /stop — لكنّ الرسالة العادية لم تعد تُطلق ذلك، ولا يستبق شيءٌ أبداً محادثةً مختلفة.

موجّه الأدوار TurnRouter

عندما تُصنّف الـ amygdala استدعاء أداة على أنه يحتاج موافقة، يوجّه TurnRouter طلب الموافقة إلى القناة المالكة للدور النشط. إذا بدأت محادثة في Telegram، يظهر زر الموافقة في Telegram — وليس في واجهة Electron. منطق التوجيه واضح ومباشر:
  1. كل دور يحمل معرّف قناة channelId (electron أو cli أو telegram أو whatsapp أو mobile)
  2. عندما يُرجع amygdala.classify() القيمة confirm، يُصدر TurnRunner طلب موافقة
  3. يبحث TurnRouter عن channelId الخاص بالدور النشط ويستدعي onApprovalRequest على واجهة TurnSink لتلك القناة
  4. تعرض القناة الموافقة بشكلها الأصلي (نافذة حوار، أو زر مضمّن، أو رسالة نصية)
  5. يعود رد المستخدم إلى TurnRunner لمتابعة العملية أو إلغائها

الحالة المشتركة

جميع القنوات تتشارك نفس حالة الذكاء:
  • الذاكرة — نفس حلقات hippocampus، ونفس فهرس cortex
  • المعرفة — نفس ملفات Markdown في مساحة العمل
  • المحادثات — محادثة بدأت في أي مكان يمكن إكمالها في أي مكان (انظر أدناه)
  • القدرات — نفس المهارات والإضافات المحمّلة
يمكنك بدء مهمة طويلة في واجهة سطح المكتب، ثم مغادرة مكتبك، ومتابعة التقدم أو إكمال المحادثة من Telegram على هاتفك.

كل محادثة قابلة للإكمال في كل مكان

المحادثات ثنائية الاتجاه بين القنوات بالكامل — لا شيء للقراءة فقط:
  • من الهاتف إلى سطح المكتب، حيّةً. المحادثة التي بدأت على تيليجرام أو واتساب تُفتَح في التطبيق دردشةً حية: صندوق الكتابة يعمل، وتُكملها بلوحة مفاتيح حقيقية. وإن كان دورٌ يعمل على الهاتف الآن — أو أتمتةٌ تشتغل بالمحادثة — عكسه سطح المكتب وهو يجري: الردّ ينساب في التغذية وهو يُكتَب، وزرّ الإيقاف يوقف ذلك التشغيل حقاً أيّاً كان الجهاز الذي بدأه، والرسالةُ التي تكتبها في منتصفه تصطفّ وتنطلق من تلقاء نفسها حين يحطّ التشغيل — ولو فتحتَ النافذة في منتصف تشغيلٍ ظهر حيّاً. والرسائل التي تحطّ على هاتفك تظهر في مكانها، والرسائل الصوتية تنجو من الرحلة كما هي.
  • والأتمتة أيضاً. تشغيلة الأتمتة أو الإجراء المنتهية ليست سجلاً مختوماً — أكملها في التطبيق لتسأل سؤال المتابعة، فتعود محادثة حية من جديد.
  • من سطح المكتب إلى الهاتف. أمر /resume على أي من القناتين يفتح قائمة اختيار مرقّمة على كل محادثة لدى وولفيش — كل القنوات، الأحدث أولاً، خمس وعشرون في الصفحة مع next، وكل صف موسوم بمصدره. وتشغيلات الأتمتة المجدولة مخفية منها افتراضياً (بمفتاح إعدادات لكل قناة)، مع بقائها في /delete وفي التطبيق.
  • الردود تحطّ حيث تنتمي. حين يراسل وولفيش قناةً من خارج السياق — أتمتة تبلّغ عن مهمة أنجزت، أو محادثة في التطبيق تترك لك ملاحظة — تعيد تلك الدردشة توجيه نفسها إلى المحادثة المُرسِلة، فيُكمل ردُّك بالضبط المحادثة التي راسلتك.
  • والمشاريع تسافر أيضاً. يبدأ /project على أي من القناتين محادثةً داخل أحد مشاريعك — مُطلَعةً على تعليماته الدائمة وملفاته، تماماً كمحادثة مشروع فُتحت في التطبيق. الربط يعيش على المحادثة نفسها، فإكمالها في أي مكان يُبقي سياق المشروع.
وفي التطبيق، يضع شريط المحادثات وصفحة السجل على كل محادثة شارة مصدر صغيرة — الطرفية، أو تيليجرام، أو واتساب، أو الهاتف، أو أتمتة، أو تشغيلة إجراء — فتبقى القائمة المختلطة مقروءة. ومحادثات التطبيق بلا شارة: فالتطبيق هو الأصل. والمحادثات التابعة لمشروع أو التي شغّلتها أتمتة أو إجراء تلبس أيضاً الرمز التعبيري لمصدرها على رقاقتها في الشريط.

تسليم الملفات

عندما يُنتج وولفيش ملفًا — ملف PDF، أو فيديو محوَّلًا، أو جدول بيانات — فإن تسليمه فعل متعمَّد يقوم به الوكيل: عبر أداته send_file. لا شيء يُسلَّم تلقائيًا. الأداة التي تكتب ملفًا على القرص لا ترسله بنفسها أبدًا، والمسارات المذكورة في مخرجات الأدوات لا تُلتقط ولا تُرفع تلقائيًا — إن لم يرسل الوكيل الملف فلن يصلك، وعقد التشغيل الخاص بالوكيل يُلزمه بإرسال النتيجة فور اكتمال أي مهمة مُنتِجة للملفات. تظهر ملفات send_file بشكل أصلي على كل واجهة:

نتائج المهام المفصّلة

لكل قناة مفتاح نتائج المهام المفصّلة يتحكم في مقدار ما تراه من خطوات عمل الوكيل. وهو مُعطّل افتراضيًا، مما يُبقي التغذية نظيفة:
  • إيقاف (تغذية نظيفة) — فقط ما يهمّك: ردود الوكيل، وأي ملفات يرسلها، والأخطاء. أما استدعاءات الأدوات الروتينية ونتائجها الناجحة وإشعارات الضغط فتُخفى. وفي واجهة سطح المكتب يبقى مؤشّر النموذج المستخدَم ظاهرًا أيضًا.
  • تشغيل (مفصّل) — يظهر كل استدعاء أداة وكل نتيجة وكل بطاقة نشاط، تمامًا كما جرى الدور خطوةً بخطوة.
يوجد المفتاح ضمن إعدادات كل قناة، وكلها تحت الإعدادات → القنوات:
لا يغيّر الوضع المفصّل سوى ما يُعرض أو يُبثّ — لا ما يفعله الوكيل. فكل جزء يُحفظ كاملًا في السجل والذاكرة، لذا فإن تبديل المفتاح يعيد رسم التغذية فقط؛ ولا يضيع شيء عند إيقافه.
تشغيلات وضع سير العمل هي الإضافة الوحيدة فوق ذلك: فهي على Telegram وWhatsApp تُبلغ دائمًا عن تقدّم حتمي — خطة المراحل عند بدء التشغيلة، وسطر عند اكتمال كل مرحلة، وملخّص ختامي بالمجاميع — بينما يضيف الوضع المفصّل سطر وصول لكل وكيل (اسمه ونموذجه ومدته وعدد استدعاءات أدواته). وداخل التطبيق تسكن المعلومات نفسها بطاقة سير العمل.

القنوات اتّصالات لا تطبيقات

Telegram وWhatsApp اتّصالات يخاطبك وولفيش من خلالها — لا تطبيقات سطح مكتب مثبَّتة على جهازك. لا يصل إليها وولفيش إلا عبر أدواتها الخاصة (telegram_send وwhatsapp_send و…)، لا بتشغيل نافذة «Telegram»/«WhatsApp» أو النقر عليها. وأدوات الإرسال لأي قناة لا توجد إلا ما دامت متّصلة، فوجودها نفسه هو الإشارة إلى أنّ القناة حيّة. وحين يحتاج وولفيش إلى مراسلتك خارج السياق — مهمة خلفية انتهت، أو وظيفة مجدوَلة — يتحقّق أولًا من channel_status (أو wolffish_status الذي يسرد حالة الاتصال). فإن كانت القناة منقطعة، لا يخمّن ولا يعيد المحاولة؛ بل يخبرك أنّها منقطعة ويبلّغك خطوات إعادة الوصل الدقيقة (Telegram → رمز البوت من @BotFather؛ WhatsApp → امسح رمز QR).

مقارنة القنوات

سطر أوامر الطرفية

التطبيق كله في طرفية — وعلى خادم.

قناة Telegram

إعداد واستخدام بوت Telegram.

قناة WhatsApp

إعداد واستخدام مراسلة WhatsApp.