Skip to main content

الرفيق بحجم الجيب

يعمل وولفيش على جهازك — وهو ما كان يعني دائماً أن تكون عند جهازك. ويضع تطبيق الهاتف تجربةَ سطح المكتب في راحة اليد: خيط المحادثة ببطاقات أدواته وملفاته المسلَّمة، وسجلّ المحادثات، ودفتر الاستهلاك، وكلّ صفحات الإعدادات — النماذج، والقنوات، والخدمات، وMCP، والمتغيّرات، والقدرات، والمعرفة، والاستخدام، والبيانات، والتحديثات، والتفضيلات، والمظهر — مرتَّبةً كما لو أنّ شريط إعدادات سطح المكتب صار قائمةَ تنقّل. أمّا الصفحات التي تقصدها لا التي تضبطها — المكتبة والتخصيص والمحادثات — فتسكن ورقة المحادثات بدلاً من ذلك، على بُعد نقرةٍ من المحادثة. ومنذ الإصدار 1.0.235 يفعل ذلك مقابل سطح مكتبك أنت. فالهاتف يقترن بهذا الجهاز ويحمل معه المحادثات نفسها والإعدادات نفسها والاستهلاك نفسه — عبر وصلةٍ لا يقرؤها إلا الجهازان. ومنذ الإصدار 1.0.236 يحمل أيضاً كلَّ ما يصوغ تلك المحادثات: المشاريع والإجراءات والأتمتة والوثائق الثلاث خلف كلّ ردّ، تُحرَّر من أيّ الجهازين على الملفّات ذاتها. ومنذ الإصدار 1.0.239 لم يعد الجهاز على الطرف الآخر محتاجاً إلى شاشةٍ أصلاً — فالهاتف يقترن بـخادمٍ بلا شاشة تماماً كما يقترن بسطح مكتب.

الحصول على التطبيق

يقيم وولفيش موبايل على المتجرين — App Store لهواتف iPhone وأجهزة iPad، وGoogle Play لأندرويد. وتحمل لوحة الإعدادات ← القنوات ← الهاتف على سطح المكتب بطاقة «احصل على التطبيق» وفيها الرابطان نفساهما، فيُقرأ الطريق كما يُسلَك: ثبّت، وافتح، وامسح — بلا شيءٍ تبحث عنه في الوسط.

الاقتران

كلّ شيءٍ يجري في الإعدادات ← القنوات ← الهاتف على سطح المكتب. الاقتران يحدث مرّةً واحدة، ولا رمزَ تلصقه: سطحُ المكتب يعرض اقتراناً والهاتف يطالب به.

رمز QR

ولّد رمز QR وامسحه بكاميرا هاتفك. السرّ يسافر من الشاشة إلى الكاميرا — ولا يعبر الشبكة أبداً. ويحمل الرمزُ عنوانَ المُرحِّل أيضاً، فالمُرحِّل المخصّص لا يحتاج كتابةً إضافية.

رمز الاقتران

ولّد رمزاً قصيراً — ثمانية محارف تُطبع هكذا K7M9-2QXR — واكتبه على الهاتف حين لا ترى الكاميرا الشاشة. لا يهمّ حجم الحرف ولا المسافات ولا الشُّرَط، والمحارف المتشابهة (O/0 وI/1) تُطوى نيابةً عنك.
ويَنقضي العرض بعد ثلاث دقائق تقريباً؛ ولّد غيره متى شئت. افتح وولفيش على الهاتف، واضغط الاتصال بسطح المكتب، ثم امسح أو اكتب.
الرمز المكتوب لا يحمل إلا السرّ. فإن وجّهت سطح المكتب إلى مُرحِّلٍ مخصّص وجب أن يُخبَر الهاتف بذلك العنوان يدوياً — ولشاشة اقترانه حقلٌ له، وشاشة العرض على سطح المكتب تظهر العنوان المطلوب كتابته بالضبط. أمّا رمز QR فيفعل ذلك عنك.

النفق المشفَّر

بعد الاقتران يتخاطب الجهازان مشفَّرَين من طرفٍ إلى طرف — تبادل مفاتيح X25519، وتعمية الإطارات بـ ChaCha20-Poly1305. كلّ شيءٍ يُختَم على أجهزتك قبل أن يُرسَل، والمفاتيح عند هذا السطح وهاتفك وحدهما. ولكلّ جهازٍ مفتاحه الخاص، ويثبّت مفتاح الآخر: لا حساب، ولا كلمة سرّ، ولا شيء تسجّل الدخول إليه. وتعرض اللوحة بعد الاقتران حالةَ الوصلة كاملةً — حال النفق، واسم الهاتف وطرازه ونظامه، ومتى اقترن ومتى شوهد آخر مرّة، والمُرحِّل ونقطة اللقاء، وبصمتَي المفتاحين، والجلسة، وعدّادات الإطارات. وتطابق البصمتين على الجهازين يعني أنّ لا شيء يقف بينهما. وتُحفظ مفاتيح الاقتران على سطح المكتب في مخزن مفاتيح النظام — Keychain على macOS، وDPAPI على ويندوز، وخدمة الأسرار على لينكس — واللوحة تسمّي الخلفية المستعملة فعلاً.

المُرحِّل الأعمى

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

قطع الاتصال مقابل إلغاء الاقتران

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

ما يعبر الوصلة

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

مساحة العمل قابلة للتحرير

حمل الاقتران محادثاتك إلى هاتفك، وبقي حتى الإصدار 1.0.236 كلُّ ما يصوغ تلك المحادثات عند الجهاز. كانت المشاريع والإجراءات والأتمتة أشياءَ يعرضها الهاتف ولا يغيّرها إلا سطح المكتب. أمّا اليوم فالثلاثة تُحرَّر من أيّ الشاشتين شئت.

المكتبة

منذ الإصدار 1.0.56 تسكن تلك الصفحات الثلاث خلف صفٍّ واحد في ورقة المحادثات: المكتبة. افتحها فتجد ثلاثة تبويبات تحت العنوان — الأتمتة والمشاريع والإجراءات — فيصير الانتقال من جدولٍ إلى المشروع الذي يعمل فيه نقرةً واحدة بدل رحلةٍ راجعةٍ عبر الورقة. وكلّ تبويبٍ هو الصفحة التي تعرفها، بالبطاقات نفسها والمحرّر نفسه وأزرار التشغيل والتحرير والحذف نفسها على كلّ صفّ. والمكتبة تتذكّر التبويب الذي تركته، والإشعار الذي يسمّي واحدةً من الثلاث ما زال يفتح عليها مباشرةً. وهي المكتبة نفسها التي يفتحها سطح المكتب منذ إصداره 1.0.286، مرتَّبةً لهاتف: فالتبويبات تقوم في شريطٍ مثبَّتٍ تحت الترويسة لا بجانب زرّ الرجوع، لأنّ ترويسة الهاتف لا تتّسع لثلاثة تبويباتٍ معنونةٍ بحجمٍ يقبل النقر.
تبويب الأتمتة يعرض البطاقات وحدها. فنظرة heartbeat.md الخام ومفتاح البطاقات/الماركداون ذهبا في الإصدار 1.0.56. على الهاتف البطاقاتُ هي الجدول — فكلّ مفتاحٍ ووضعٍ وتعليمةٍ عليها تكتب الملفّ نفسه — فلم يكن للنظرة الثانية ما تضيفه، وكانت موضعاً ثانياً للخطأ. وسطح المكتب يحتفظ بنظرة الماركداون عنده.

المشاريع

المشروع يجمع التعليمات القائمة والملفات التي تبدأ منها المحادثات الجديدة. أنشئ واحداً، وامنحه رمزاً تعبيريّاً من المنتقي، وحرّر تعليماته، وأضف ملفّاتٍ من الهاتف نفسه، وأدرج محادثةً قائمة تحته. والمحادثة التي تُفتح داخل مشروعٍ تحمل إحاطته من دورها الأوّل لا بعد لحظة.

الإجراءات

طلبٌ محفوظ تشغّله عند الحاجة — يُنشأ ويُحرَّر ويُحذف ويُشغَّل من الهاتف، والتشغيل يبلّغك بما فعله المجدوِل فعلاً.

الأتمتة

طلبٌ يعمل على جدول، يُحرَّر هنا ببطاقاتٍ تكتب ملفّ heartbeat.md نفسه الذي يكتبه محرّر سطح المكتب — ومعه موعد تشغيله التالي وزرّ تشغيلٍ إلى جانبه. ومنذ الإصدار 1.0.55 يفتح المحرّر بصفٍّ من شرائح العدد — مرّة، مرّتين، 3 مرات، 4 مرات، 5 مرات — فوق شرائح الفترة: اختر 3 مرات وكل يوم، بأيّ ترتيب، فيملأ الجدولُ نفسَه بـثلاث تشغيلاتٍ موزَّعةٍ بالتساوي على اليوم. والشرائح تُضاء ممّا في الحقل فعلاً، فالأتمتة التي تفتحها للتحرير تصف نفسها لا آخر نقرةٍ نقرتَها.

التخصيص

الروح والمستخدم والوكلاء — مَن هو وولفيش، وما ينبغي أن يعرفه عنك دائماً، وإجراءاتك التي تعلو على المدمجة — تُفتح محرِّراتٍ وتُحفَظ مباشرةً في مساحة عمل سطح المكتب. وهذه هي الملفّات التي تصوغ كلّ ردٍّ على كلّ واجهة، في المحادثة وتيليجرام وواتساب سواءً بسواء.
إعدادات لقطات استخدام الحاسوب ذهبت من الإعدادات › الخدمات منذ الإصدار 1.0.52. فالوكيل يختار عرضاً وصيغةً لكلّ لقطةٍ يلتقطها — أحدَّ حين يحتاج إلى قراءة خطٍّ دقيق، وأخفَّ حين يبحث عن طريقه لا غير — فلم يبقَ للصفّين ما يضبطانه، ويقوم سطرٌ يشرح السبب حيث كانا. وامتداد المتصفّح يحتفظ بإعدادات لقطاته: تلك ما زالت لك.
وكلُّ كتابةٍ من هذه تمرّ بشيفرة سطح المكتب نفسها، فالتعديل الذي تصنعه على الهاتف والتعديل الذي تصنعه عند الجهاز فعلٌ واحد على الملفّات ذاتها — لا نسخةٌ ثانيةٌ تخالفها في صمت. والشاشتان تعرضانه معاً: فمحرّر ماركداون على سطح المكتب يتبنّى ما حفظه الهاتف حيّاً، إلّا أن تكون في وسط مسوّدةٍ لم تحفظها بعد، فحينها يبقى نصّك على حاله ويفوز هو حين تحفظه. وكلُّ بطاقةٍ من الثلاث تحمل أيضاً مستوى تفكيرها الخاصّ منذ الإصدار 1.0.72 — مغلقاً أو مفعّلاً أو مرتفعاً أو أقصى — من مفتاحٍ على البطاقة نفسها. والقيمةُ واحدة لا نسختان: قرّبها على سطح المكتب فيُظهرها هاتفك، وقرّبها على هاتفك فيُظهرها سطح المكتب، لأنهما إعدادٌ واحد يُرى من موضعين. والمستوياتُ المعروضة هي التي يحترمها النموذج المختار فعلاً، تُرسَل من سطح المكتب لا تُخمَّن، فلا تعرض بطاقةٌ مستوى سيتجاهله النموذج بصمت. انظر الأتمتة والإجراءات والمشاريع. والمشاريع والإجراءات والأتمتة كلّها تحمل ملفّاتٍ مرفقة ومجلّدات عمل، تُحرَّر من الهاتف منذ الإصدار 1.0.239. فالملفّ المرفق يُنسَخ إلى مساحة العمل، فلا ينكسر تشغيلٌ أبداً لأنّ الأصل انتقل من مكانه؛ أمّا مجلّد العمل فهو المجلّد الحقيقيّ الذي يجري فيه العمل، ولذلك لا يُنسَخ عن قصد. والمجلّدات تُكتَب كتابةً لا تُتصفّح — يتحقّق سطح المكتب من المسار على نظام ملفّاته هو، ويردّ برفضه هو حين لا يكون موجوداً — والرقاقة ترتدي مسار سطح المكتب الكامل، فلا يبقى شكٌّ في مجلّد أيّ جهازٍ تسمّي.

كلّ محادثة، دون أن تغادر التي أنت فيها

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

بماذا ينشغل سطح المكتب

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

التشخيص من الهاتف

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

إشعارات الهاتف

حين تكون إشعارات الهاتف مشتغلة، يبلغك الوكيل بأداته notify_phone — ومنذ الإصدار 1.0.250 صار الإبلاغ قاعدتَه لا استثناءه: كلُّ دورٍ ينتهي بإشعارٍ واحدٍ يحمل النتيجة الفعليّة، والعائق أو الإخفاق يقاطع في منتصف التشغيل لحظةَ وقوعه، والعمل الطويل يعلن نفسه حين يبدأ. ولا شيء موصولٌ بحدث — فالوكيل يصوغ الإشعار ويستدعي الأداة عمداً في كلّ مرّة، والإطفاء يجعل الأداة ترفض من أساسها بنزعها من يد الوكيل نزعاً تامّاً. والنقرة تحطّ حيث يشير الإشعار — بما في ذلك محادثة التشغيل نفسه، عبر wolffish://chat?id=current — فإن كان الهاتف متصلاً ركب الإشعارُ النفقَ الحيّ، وإن لم يكن خرج إشعارَ منصّةٍ يحطّ على تطبيقٍ مغلق، أو تطبيقٍ في الخلفيّة، أو هاتفٍ نائم. وللمنظومة كلّها اليوم صفحتها الخاصّة: الأطوار وكم يبقى كلٌّ منها وجيهاً، وما يختمه سطح المكتب على كلّ إرسالٍ وما لا يُؤتمَن عليه النموذج أبداً، والقائمة الثابتة للشاشات التي تفتحها النقرة، وكيف تبقى شارات غير المقروء صادقة، وما يستطيع المُرحِّل رؤيته وما لا يستطيع في الطريق بالضبط.

شارات غير المقروء

كلُّ إشعارٍ يسمّي محادثةً يغذّي عدّاد غير مقروءٍ لكلّ محادثةٍ على حدة — على صفوف المحادثات هنا وفي السجلّ، ومجموعاً على زرّ القائمة العائم، ورقماً على أيقونة التطبيق، صحيحاً حتى قبل أن يستيقظ التطبيق. والمسحُ هو القراءة: افتح المحادثة يذهب عدّادها، ومعه إشعارات الدرج؛ ولا عملَ من نوع «علِّم كمقروء». وصفحة الإشعارات تحمل الآليّات كاملة. والمحادثةُ تُختَم ولا تُستنتَج منذ الإصدار 1.0.61: كان الهاتف يقرأ أيَّ محادثةٍ ينتمي إليها الإشعار من رابطه، لكنّ الرابطَ هو حيث يذهب النقر، والوكيل يتركه عمداً خارج معظم إشعارات منتصف الدور — فمحادثةٌ أرسلت خمسة إشعارات كانت تلبس شارةً تقرأ 2. وكلُّ إشعارٍ الآن يحمل محادثته، مختومةً من سطح المكتب لا مختارةً من النموذج، فتطابق الشارةُ قائمةَ الإشعارات.

صفحة الإشعارات

منذ الإصدار 1.0.64 هناك صفحة إشعارات خاصّة: تسرد ما أُرسل، مع أرشيف، وشارةٍ تجيب الدرجَ. وهي تعدّ كلَّ إشعارات المحادثة لا بعضها منذ الإصدار نفسه، وكذا يفعل جرسٌ على الحافة الأخرى من الشاشة يخبرك بما قالته هذه المحادثة.

عرض كل نشاط الأدوات

مفتاحٌ واحد يقرّر كم من التشغيل ينقله خيط الهاتف. الإطفاء — وهو الافتراضي — يُبقيه نظيفاً: رسائل المساعد، والنتائج الحاملة للملفات، و**تعديلات الشيفرة وأوامر الطرفية، والأسئلة والموافقات، والتفكير وقوائم المهامّ، والأخطاء. والإشعال** ينقل كذلك كلّ استدعاء أداةٍ ونشاط. أمّا تسجيل الاتصال فمنفصلٌ ومشتغلٌ دائماً. وكان اسم المفتاح نتائج المهامّ حتى الإصدار 1.0.54؛ وصار يقرأ عرض كل نشاط الأدوات، مطابقاً سائر الأسطح، ويقول بالضبط ما يبقى ظاهراً حين يكون مطفأً.

خيط المحادثة

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

أن تقول شيئاً وهو يعمل

الرسالةُ المكتوبة والوكيلُ في وسط عمله كانت تنتظر دورها — تجلس فوق حقل الإدخال حتى ينتهي العمل ثم تذهب أوّلَ ما تقوله بعده، وهو بالضبط أوانٌ فات. ومنذ الإصدار 1.0.59 تذهب إلى العمل الجاري أصلاً: فـ*«تخطَّ مجلّد الاختبارات»* و*«استعمل الملفّ الآخر»* و*«اترك ملفّ الضبط وشأنه»* تبلغ الوكيل عند خطوته التالية، وما زال هناك ما يُوجَّه. وتنضمّ رسالتك إلى المحادثة لحظةَ ترسلها، فقّاعةً خاصّةً بك، تحتها سطرٌ هادئ يقول إنّها تُقرَأ عند الخطوة التالية. وحين يقرؤها الوكيل فعلاً تنتقل تلك الفقّاعة إلى داخل الردّ، عند النقطة التي أُخذت فيها بالضبط — فتُري المحادثةُ ما قلتَه وأين انعطف الجواب معاً. وغيّر رأيك قبل أن تُقرَأ فـنقرةٌ واحدة تستردّها، وتعود الكلماتُ إلى حقل الإدخال الذي كتبتها فيه. ولا يضطرب من ذلك شيءٌ في التشغيلة: فالردّ يواصل انسيابه، والبطاقات تبقى مكانها، والإيقاف ما زال يوقف. وهي تحمل صورةً أو ملفّاً أو رسالةً صوتية كما تحمل الرسالةُ العادية، وتعمل بالطريقة نفسها في الوضع التجريبيّ، ووكيلُ الجولة يقرؤها تماماً كما يقرؤها وكيلٌ حقيقيّ. ونال سطحُ المكتب والطرفية وقنوات المحادثة السلوكَ نفسه في إصدار سطح المكتب 1.0.296.

العمل البرمجيّ على الهاتف

منذ الإصدار 1.0.54 يرسم الهاتف بطاقات البرمجة الخاصّة بسطح المكتب، ويرسمها مهما قال مفتاح نشاط الأدوات — فالتغيير في مشروعك ليس ميكانيكا أدوات:
  • لكلّ تعديل ملفٍّ وكتابةٍ وأمر طرفيّةٍ صفُّه المضغوط، يسمّي الملفّ أو الأمر، ويحمل +N خضراء و−M حمراء للتعديل أو رمز الخروج للأمر، وكم استغرق. انقره ينفتح على الشيء الحقيقيّ: الفرقُ الأحمر والأخضر بأرقام الأسطر، أو مخرجات الأمر — وحين كانت المخرجات أكبر من أن تُحمَل، أين حُفظت كلّها.
  • قائمة المهامّ بطاقةٌ في المحادثة — علامةٌ عند كلّ عنصر، ووسمٌ أحمر high حيث استحقّه واحد، وعدّ «منجَز من أصل» بشريط تقدّم. وهي تتحدّث في مكانها لا تعيد طبع نفسها، والقائمة التي يستأنفها الوكيل بعد أدوارٍ تُحسَم على البطاقة الأصلية، حيث رأيتها أوّل مرّة. والصفُّ الجاري يلبس دوّاماً حقيقيّاً منذ الإصدار 1.0.57؛ فالرمز الذي سبقه كان يخفت في مكانه لا غير فيُقرَأ شاشةً متجمّدة.
  • وهذه البطاقات وبطاقةُ سير العمل تدخل إلى عرض الوكيل (85%) منذ الإصدار 1.0.57، الحافّة نفسها التي تقف عندها كلُّ بطاقةٍ يرسمها الوكيل، بدل أن تجري في الخيط من حافّةٍ إلى حافّة فتُقرَأ أثاثاً للخيط نفسه.

وضع التخطيط

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

عارضو الملفات

انقر أيَّ مرفقٍ يتوسّع ملءَ الشاشة (والمشاركة تُسلَّم إلى ورقة مشاركة النظام): الصور بالتكبير بالقرص والسحب، وSVG بعارضٍ ضوئي، ومشغّلا فيديو وصوت، وPDF، ومستندات Word، وجداول البيانات — مع CSV/TSV جداولَ حقيقية — وMarkdown، والنص العادي، وHTML بمبدّل معاينة/مصدر، وملفات الشيفرة بطاقاتٍ مرقّمةَ الأسطر. وملفّات PDF تُصيَّر في البطاقة على المنصّتين. فWebView في أندرويد لم يشحن قطّ محرّك PDF، فكانت البطاقة تسلّم المستند إلى أيّ عارضٍ صادف وجوده على الهاتف. أمّا القارئ اليوم فمضمَّنٌ في التطبيق — صفحة pdf.js قائمة بذاتها تُركَّب حول بايتات الملفّ نفسه — فصارت المعاينة والمستند الموسَّع على أندرويد كما هما على iPhone: صفحةٌ أولى حقيقيّة، قابلة للتمرير وللتكبير بالقرص. ولا يُسلَّم شيء إلى تطبيقٍ آخر، والصندوق المعزول يبقى مغلقاً، والصفحة التي ترسم المستند لا تبلغ ملفّاً غير الذي فتحته. أمّا ملفّات PDF الضخمة جدّاً فتذهب إلى عارض النظام، وهو موضعها الصحيح.

الاستخدام وأنت في الطريق

شاشة الاستخدام هي لوحة سطح المكتب على عمودٍ واحد: شبكة النشاط الشهرية، وبطاقة اليوم الحاضرة دائماً (تفتح على اليوم وتتحرك بنقرة يومٍ آخر — الرموز والكلفة والرسائل وصفوف كل نموذج واستعلامات Brave)، وستّة نطاقات من «اليوم» إلى «كل الوقت»، وإحصاءات عامة (محادثات، ورسائل، وإجمالي رموز، وأيام نشطة، وأطول سلسلة، والنموذج المفضّل)، وقسم التكاليف (إجمالي الإنفاق، وأعلى يوم، والمتوسط اليومي)، وبطاقات لكل مزوّد. وكلُّ نطاقٍ يبلّغ عن نافذته هو: فكلّ مجموعٍ مغلقٌ عند اليوم كما هو مفتوحٌ عند بدايته، فلا يحمل رقمٌ موسومٌ بـ«اليوم» غداً في صمت، والانتقال من 3 أشهر إلى 6 أشهر إلى «منذ بداية السنة» يحرّك الأرقام بدل أن يكرّرها. والحدّ المغلِق يخصّ مجاميع النطاقات وحدها — أمّا تقويم النشاط وبطاقة يومه فيرسمان كلّ صفٍّ يحمله الدفتر، لأنّ شهراً يظهر فارغاً لأنّ الساعة لم تبلغه لا يُميَّز عن شهرٍ بلا استخدام. ومبدّل النطاقات يملأ صفّه عنصراً واحداً، مقتسماً العرض بالتساوي بين الستّة.

صفوف المتصفّح

للمتصفّح بطاقته الخاصّة على صفحة القنوات منذ الإصدار 1.0.62، بين هذا الهاتف وتيليجرام، بالترتيب الذي يستخدمه سطح مكتبك — فهو موضعٌ يفعل فيه الوكيل أشياء، لا خدمةٌ يستعير منها مفتاحاً، وهو حيث صنّفه سطح المكتب دائماً. وكلُّ ما حمله جاء معه: المتصفّحاتُ المتّصلة، والحكمُ على ما يستطيع وولفيش الوصول إليه فعلاً عبرها، ومنفذُ الاقتران، وعرضُ اللقطة وصيغتُها وجودتُها — كلُّها قابلةٌ للتحرير من هنا. واتّصالُه يُقرأ صفّاً بكلمات القناة نفسها، كما يفعل اتصالُ الطرفيّة، بدل رقاقةٍ بجانب اسم خدمة. وصفُّ القنوات يحمل علامةً للمتصفّح بجانب الهاتف والطرفيّة والجسرين — خضراءَ حين يكون لمتصفّحٍ امتدادٌ متّصل — ولم يبقَ عدُّ الخدمات يعدّ لوحةً لم تبقَ لتلك الصفحة. وتحت صفوف المتصفّح يقوم سطرٌ واحد بالحكم (الإصدار 1.0.61): كلُّ شيء في محلّه، أو جزءٌ من المتصفّح يمكن الوصول إليه، أو عددٌ لما يقف في الطريق — مع شارةٍ لمقدار ما يستطيع وولفيش الوصول إليه (كامل، أو محدود، أو مُدار، أو غير قابل للوصول) وتحتها أوّل ما يعوّقه بكلماتٍ صريحة. وكلُّ إصلاحٍ لأيّ منه على سطح مكتبك، فيقول السطرُ ذلك أيضاً ويدلّك على اللوحة التي تمشي بك خلاله. ولا يتكلّم إلّا حين يكون لديه ما يقوله — فسطحُ مكتبٍ لا شيء عنده ليبلّغ به، أو أقدمُ من أن يكون له رأي، يترك الصفحة على حالها بدل أن يوقف عليها علامةَ سؤالٍ رماديّةً إلى الأبد. والإعدادات ← الخدمات ما زالت تعكس قائمةَ إضافة المتصفح متعددة المتصفحات على سطح المكتب حيث تنتمي القائمة: صفٌّ لكل ملفٍّ شخصي متصل — اسم المتصفح مع بريد الملف الشخصي والإصدار ونظام التشغيل — مع إمكانية ضبط إعدادات لقطة الشاشة من الهاتف. أمّا منفذ الاقتران فيبقى بيد سطح المكتب: فنقله يعيد تشغيل خادم الاقتران على سطح المكتب، وذلك فعلُ سطح المكتب نفسه. واللقطة الآتية من سطح مكتبٍ أقدم يسبق دعمَ تعدّد المتصفحات تنحدر إلى صفّ «إضافة Chrome» واحدٍ بمنفذه. أمّا تثبيت الإضافة واقترانها فيجريان على سطح المكتب دائماً.

التحديثات

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

الاقتران بخادم

لا يعنى الهاتف بمن يجيب على الطرف الآخر من النفق. اقرِنه بتطبيق سطح المكتب على حاسوبك المحمول، أو بـوولفيش بلا شاشةٍ على خادمٍ افتراضيٍّ خاصّ — الخيط نفسه، ومساحة العمل نفسها، وصفحات الإعدادات نفسها، عبر الوصلة المختومة نفسها. وفي نشر الخوادم هذه هي الواجهة الموصى بها: سطر أوامر الطرفيّة يدير الجهاز، والهاتف هو السطح الذي تعيش فيه فعلاً — محادثاتٌ تُبثّ حيّة، وأتمتةٌ تشاهدها في أثناء عملها، وإشعاراتٌ حين ينتهي شيءٌ أو يحتاج إليك، والمشاريع والإجراءات والأتمتة ووثائق التخصيص كلّها تُحرَّر على ملفّات الخادم نفسها. والاقتران يعمل من الطرفيّة — يرسم wolffish pair phone رمز QR صالحاً للمسح حين تتّسع له النافذة، ويرتدّ إلى الرمز المكتوب من تلقاء نفسه حين لا تتّسع. والهاتف يعكس حالة طرفيّة الخادم في الاتجاه الآخر: فبطاقة الإعدادات ← القنوات ← CLI تقول هل يُحَلّ أمر wolffish على PATH سطح المكتب نفسه، وهل التشغيل التلقائيّ مسجَّل، وأيّ آليّةٍ تمسكه — systemd أو launchd أو schtasks. والتسجيل لدى نظام التشغيل فعلُ سطح المكتب نفسه، فهذا الجهاز يبلّغ عنه ولا يغيّره.
على مُرحِّلٍ مستضافٍ ذاتيّاً، لا يحمل الرمز المكتوب إلا السرّ — أدخل عنوان المُرحِّل في بطاقة المُرحِّل على شاشة الاقتران في الهاتف. أمّا رمز QR فيحمله عنك.

الوضع التجريبي

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

الخروج من التجربة

المخرج الوحيد مقصود: الإعدادات ← البيانات ← إعادة ضبط المصنع لهذا الجهاز، ويؤكَّد بكتابة العبارة FACTORY RESET. يمسح المحادثاتِ والوسائطَ المخزَّنة والإعداداتِ المعكوسة من الهاتف، ويحتفظ بلغتك وسمتك، ولا يمسّ أيَّ سطح مكتبٍ أبداً. التطبيق يعمل على iPhone وأندرويد، بالوضع الرأسي، وثنائيُّ اللغة بالكامل — الإنجليزية والعربية بمرآةِ RTL تامّة؛ وتبديل اللغة يعيد تشغيل التطبيق.