أوامر البوت وواجهته

كيف يُدار aipager من Telegram. أربع قنوات للإدخال: أوامر الشرطة المائلة، وأزرار لوحة المفاتيح، ولوحة Mini App، والرسائل الحرة (نص، ملفات، رسائل صوتية).

المصدر على GitHub ↖هذه الصفحة مترجمة عن الإنجليزية؛ إذا اختلفت النسختان، فالنسخة الإنجليزية هي الصحيحة. الإنجليزية

لا يقبل البوت المدخلات إلا من الدردشات المضبوطة؛ لحدود الثقة يُنظر نموذج الأمان.

أوامر الشرطة المائلة#

مسجّلة في aipager/bot/lifecycle.py. تعرضها قائمة الأوامر في Telegram، وتُحدَّث عند بدء aipager وعند كل تغيير في الجلسات.

الأمرالوسائطماذا يفعل
‎/start-الشاشة الرئيسية: جلسات هذه الدردشة، وأين تذهب الرسالة العادية (✍️ الرسائل تذهب إلى x1.)، و🆕 جلسة جديدة و⚙️ الإعدادات، وحين يكون في هذه الدردشة جلسة منتهية يمكن إعادتها، ↩️ استئناف. ويعرض أيضًا لوحة المفاتيح الدائمة.
‎/help-دليل قصير بحسب المهمة (البدء، والتحدث، والتحكم، والإدارة، والإعدادات، وللمشرفين ‎/update)، مع نصيحة أن الضغط على أمر يرسله فورًا: لإضافة نص قبله، الضغط المطوّل عليه (الهاتف) أو Tab (الكمبيوتر). ولمالك التثبيت (الشخص الموجود في الدردشة الخاصة بالتثبيت نفسه مع البوت) فيه أيضًا زر 🐞 الإبلاغ عن مشكلة: يفتح، في تلك الدردشة الخاصة، معاينة لتقرير المشكلة كما سيُرسل بالضبط، مع إرسال وإضافة ملاحظة وإلغاء. لا يُرسل شيء حتى الضغط على إرسال (ما يحتويه التقرير).
‎/app-فتح لوحة Mini App (الجلسات، وعارض التغييرات، والإعدادات).
‎/status-جلسات هذه الدردشة كقائمة يمكن التصرف فيها. كل جلسة تذكر حالتها بالكلمات (⚙️ تعمل ٣:١٢ · Bash: run tests، ⏳ بانتظارك · Bash: make deploy، 💤 جاهزة)، مع ✍️ على الجلسة التي تذهب إليها الرسالة العادية، وسطر ثانٍ فيه النموذج، والسياق، والتكلفة، وما ينتظر (قائمة الانتظار ٣ (في قائمة الانتظار: ١، ملاحظتان))، والوكلاء والأوامر في الخلفية التي تعمل. لكل جلسة صف أزرار: ‎✍️ x1 يرسل رسائلك التالية إليها، و⏹ إيقاف أثناء عملها، وإجابة حين تنتظرك، و⋮ للبقية. وفي الأسفل: 🆕 جديدة، و⚫ المنتهية (n) للجلسات المنتهية (استئنافها أو حذفها أو إزالتها كلها من القائمة؛ تبقى في ‎/resume).
‎/stop [label]اختياريإيقاف المهمة الحالية لجلسة. دون اسم، يوقف الجلسة الوحيدة في هذه الدردشة التي تعمل (حتى لو كانت رسائلك تذهب إلى جلسة أخرى؛ والجلسة التي ما زال وكيلها أو أمرها في الخلفية يعمل تُعدّ عاملة)، ويسأل أيها بقائمة اختيار حين تعمل عدة جلسات، ويقول لا يجري أي عمل الآن. حين لا تعمل أي جلسة. يوقف ‎/stop x1 (أو ‎/x1 stop) الجلسة x1 (أو يرد x1 لا تعمل على شيء الآن. حين لا تعمل). ويحذف أيضًا الرسائل المنتظرة ويذكر في الرد عدد ما حُذف.
‎/now-إرسال الرسائل التي يحتجزها Claude في قائمة انتظار الجلسة النشطة الآن، بدل انتظار نهاية الخطوة الحالية (مفاتيح الإرسال الفوري في Claude Code نفسه، Ctrl+X Ctrl+S). يعمل في أي وقت، حتى حين يكون الإرسال إلى الدردشة موقوفًا أو في الوضع الأدنى؛ ويرد لا توجد رسائل تنتظر في قائمة الانتظار حين لا يحتجز Claude شيئًا. يُنظر إرسال رسالة منتظرة فورًا.
‎/new [name] [first message]كلها اختياريةبدء جلسة. يبدؤها ‎/new x1 فورًا، ويرسل ‎/new x1 fix the tests أيضًا «fix the tests» كأول رسالة. إذا أُرسل وحده (مثلًا بالضغط عليه من القائمة)، يسأل ‎/new عن الاسم، والرسالة التالية المرسلة تُستخدم تمامًا مثل الوسيط، فـ ‎/new ثم x1 fix the tests يعطيان النتيجة نفسها. في المجموعة يكون الرد على البطاقة بالاسم (أو بذكر البوت: ‎@aipagerbot x1)، لأن الرسالة العادية هناك لا تصل إلى البوت. تلك الرسالة التالية فقط: أي إجراء آخر أولًا (صورة، أو أمر آخر، أو رد على رسالة أخرى، أو قالب من لوحة المفاتيح، أو زر آخر) يُعالَج كالمعتاد وتُغلق البطاقة؛ أما ‎/status و‎/settings وقوائم لوحة المفاتيح فتُبقيها مفتوحة. تعرض البطاقة التي تسأل أيضًا الوضع والنموذج والمجلد الذي ستحصل عليه الجلسة، مع أزرار لتغييرها أولًا. كل طريق ينتهي ببطاقة «x1 جاهزة» نفسها: ما حصلت عليه الجلسة، وأن رسالتك التالية تذهب إليها، وأزرار بضغطة واحدة للتبديل إلى وضع آخر أو تغيير النموذج. الجلسات الجديدة تبدأ في الوضع التلقائي للجميع؛ وما يستخدمه ‎/new يُغيَّر في ‎/settings ← الجلسات الجديدة. علامة ! قبل الاسم تبدأ الجلسة في وضع الوصول الكامل، للمشرف (الدوران owner وadmin) أو لشخص في دردشته الخاصة مع البوت يسمح دوره بإرسال الرسائل والرد على Claude (user، لا read_only)؛ ولأي شخص آخر تبدأ في الوضع التلقائي وتذكر البطاقة السبب. الاسم المستخدم يعرض ↩️ الانتقال إليها (حين تعمل تلك الجلسة) أو ♻️ استئناف (حين انتهت)، و🆕 استبدالها بجلسة جديدة و↩️ إلغاء، لمن أرسل ‎/new وحده. البطاقة التي تسأل عن الاسم تنتهي صلاحيتها بعد ١٠ دقائق دون استخدام (⏱ انتهت صلاحية بطاقة الجلسة الجديدة هذه. يمكنك إرسال /new مرة أخرى.). العضو الذي ليس في دوره can_manage (user،‏ read_only) لا يبدأ إلا داخل المجلد الجذر للدردشة: مجلد البطاقة هو المجلد الجذر، وصفحة المجلد تسرده والمجلدات التي داخله مباشرة (دون سطر «المجلد الافتراضي»)، و«مجلد جديد» ينشئ داخل المجلد المختار، والانتقال إليها والاستئناف والاستبدال على جلسة تعمل خارج المجلد الجذر مرفوضة («تعمل هذه الجلسة خارج مجلدك ~/...، لذا لا يمكن لدورك استئنافها أو إعادة تشغيلها أو تغيير وضعها. يمكنك طلب ذلك من مشرف.»).
‎/resume [label]اختيارياستئناف جلسة منتهية بالاسم، أو فتح قائمة اختيار. تعود الجلسة بالوضع الذي كانت فيه. الجلسة التي كانت في وضع الوصول الكامل لا تعود في الوصول الكامل إلا لمشرف أو لشخص في دردشته الخاصة؛ ولأي شخص آخر تعود في الوضع التلقائي ويذكر الرد ذلك (♻️ أُعيد فتح x1 في الوضع التلقائي: وضع الوصول الكامل للمشرفين فقط.). الجلسة التي حفظها aipager أقدم في وضعه التلقائي القديم (الذي كان يعمل دون فحوص) تعود في وضع الوصول الكامل، والمحفوظة في «اسأل» تعود في وضع «اسأل». الجلسة المنتهية تبقى في القائمة GONE_SESSION_MAX_AGE_DAYS يومًا (الافتراضي ١٤) ثم تغادر قائمة الجلسات؛ ولا يُمس سجل محادثة Claude. العضو الذي ليس في دوره can_manage لا يستطيع استئناف جلسة مجلدها خارج المجلد الجذر للدردشة (المالكون والمشرفون يستطيعون)؛ والأمر نفسه لإعادة التشغيل ولكل تبديل للوضع، بما فيه التبديل في المكان بين «اسأل» والتلقائي.
‎/kill [label]اختياريإنهاء جلسة، دائمًا بعد تأكيد: ⏹ إنهاء x1؟ سيتوقف عمل Claude وتُغلق الجلسة. مع [⏹ إنهاء] [إلغاء]. دون اسم، يذهب إلى التأكيد حين تكون في هذه الدردشة جلسة جارية واحدة، وإلا إلى قائمة اختيار بجلسات هذه الدردشة الجارية. وموجود أيضًا في ‎/status ← ⋮ ← ⏹ إنهاء الجلسة.
‎/restart [label]اختياريإعادة تشغيل جلسة بعد تأكيد: يتوقف Claude ويبدأ من جديد، محتفظًا بمحادثته، في الوضع الذي بدأه فيه aipager أو بدّله إليه آخر مرة. الجلسة التي بدأت في الطرفية بـ aipager session تعود في وضع «اسأل» ما لم يُبدَّل وضعها من Telegram منذ ذلك (لا يعرف aipager الوضع الذي بدأتها به الطرفية، ولا يخمّن أبدًا وضعًا أوسع)؛ والأمر نفسه عند استئنافها من Telegram.
‎/rename [label] [new]اختياريإعطاء جلسة اسمًا جديدًا (والجلسات المنتهية أيضًا). يعيد ‎/rename x1 newname التسمية فورًا. ومع كلمات أقل يسأل: مباشرة عن الاسم الجديد حين لا يمكن أن يعني الأمر إلا جلسة واحدة، وإلا بقائمة اختيار (الكلمة الواحدة بعد ‎/rename لا تختار الجلسة، لأنها قد تكون الاسم القديم أو الجديد). في المجموعة يكون الرد على السؤال بالاسم.
‎/delete [label]اختياريحذف جلسة منتهية من القائمة، بعد تأكيد.
‎/diff [label]اختياريعرض git diff لمجلد عمل الجلسة. دون اسم، يعرض الجلسة التي تذهب إليها رسائلك.
‎/clearqueue-حذف كل رسالة لم تأخذها الجلسة النشطة بعد (الرسائل التي يحتجزها aipager والرسائل الموجودة أصلًا في قائمة انتظار Claude) دون إيقاف المهمة الجارية. ويرد بعدد ما حُذف.
‎/mode [label] [ask|auto|full]اختياريعرض وضع الأذونات لجلسة مع زر للتبديل إلى كل وضع آخر: ✍️ x1 في 🤖 الوضع التلقائي. [💬 التبديل إلى وضع «اسأل»] [🔓 التبديل إلى وضع الوصول الكامل]. هناك ثلاثة أوضاع. 💬 وضع «اسأل»: يسأل Claude قبل كل إجراء. 🤖 الوضع التلقائي (الافتراضي): فحص الأمان في Claude Code يشغّل الإجراءات الآمنة ويوقف الخطرة ليكون القرار لك. 🔓 وضع الوصول الكامل: يعمل كل شيء دون أي فحص (‎--dangerously-skip-permissions)؛ ولا يختاره إلا مشرف، أو شخص في دردشته الخاصة مع البوت يسمح دوره بإرسال الرسائل والرد على Claude (user، لا read_only). التلقائي والوصول الكامل لا يغيّران إلا طلبات الإذن الخاصة بـ Claude Code: يظل هوك aipager يطبّق قواعد دور العضو. يبدّل ‎/mode ask و‎/mode auto و‎/mode full أو ‎/mode x1 ask فورًا؛ وكلمة الوضع نفسها بلغة الدردشة تعمل أيضًا، دون كلمة «وضع» (/mode x1 اسأل لـ 💬 وضع «اسأل»، و/mode x1 كامل لـ 🔓 وضع الوصول الكامل). حين يكون لجلسة جارية في هذه الدردشة هذا الاسم بالضبط (جلسة اسمها demander مثلًا)، تسمّي الكلمة الجلسة: ‎/mode demander يعرض وضع تلك الجلسة، و‎/mode x1 demander ما زال يبدّل x1. الكلمات ask وauto وfull تعني الوضع دائمًا، بأي ترتيب (‎/mode x1 ask أو ‎/mode ask x1)؛ ولا تسمّي إحداهما الجلسة إلا حين تكون الكلمتان كلمتي وضع وواحدة منهما فقط اسم جلسة جارية، لذا مع جلسة اسمها full، يبدّلها ‎/mode full ask و‎/mode ask full كلاهما إلى وضع «اسأل»، بينما ‎/mode full وحده يبقى الوضع. التبديل بين «اسأل» والتلقائي يحدث في المكان، دون إعادة تشغيل وفي أي وقت (حتى أثناء عمل Claude): يضغط aipager Shift+Tab في الجلسة كما يُفعل في الطرفية، وتقول البطاقة ⚙️ يجري تبديل x1 إلى 🤖 الوضع التلقائي دون إعادة تشغيل. حتى يبلّغ Claude Code عن الوضع الجديد في خطوته التالية، ثم تعرض النتيجة. إذا لم يكن الوضع التلقائي متاحًا للجلسة (بسبب نموذجها أو خطتها)، تقول البطاقة ذلك وتبقى الجلسة في وضع «اسأل». وليس أثناء عرض الجلسة سؤالًا أو طلب إذن: يلزم الرد عليه أولًا. الانتقال إلى الوصول الكامل يحتاج إلى مشرف (أو شخص في دردشته الخاصة) وتأكيد، ويعيد تشغيل الجلسة (تُحفظ المحادثة)؛ ومغادرة الوصول الكامل تعيد تشغيلها أيضًا، فورًا. الجلسة التي بدأت في الوصول الكامل تُعاد تشغيلها عند كل تبديل، حتى بعد تبديلها إلى «اسأل» أو التلقائي في الطرفية، وكذلك الجلسة التي أبلغت عن الوصول الكامل منذ بدئها (جلسة طرفية بدأت بـ ‎--dangerously-skip-permissions): فهناك قد يدير Shift+Tab الجلسة عائدًا إلى الوصول الكامل. على جلسة تعمل تعرض إعادة التشغيل 🛑 إيقاف وتغيير الوضع / ⏳ ليس الآن. العضو الذي ليس في دوره can_manage لا يستطيع تبديل وضع جلسة مجلدها خارج المجلد الجذر للدردشة، في المكان أو بإعادة تشغيل. الضغط على تبديل يغيّر البطاقة نفسها بدل إرسال رسالة ثانية. ‎/perms هو الاسم القديم وما زال يعمل بالطريقة نفسها.
‎/settings-كيف تبدو جلسات هذه الدردشة وكيف تجيب: اللغة التي يستخدمها aipager، وشكل الرسائل، ومعاينة التغييرات، وتحديث البطاقة في المهام الطويلة، والتنسيق، وطول الإجابة، ومستوى المفردات؛ وبماذا يبدأ ‎/new الجلسة؛ وإعدادات كل جلسة؛ وفي الدردشة الخاصة للمالك، عروض تقارير المشكلات. يُنظر الإعدادات. في المجموعة يستطيع الجميع الاطلاع، وتغيير أي إعداد يحتاج إلى مشرف.
‎/language-اللغة التي يستخدمها aipager لرسائله وأزراره في هذه الدردشة (القائمة نفسها التي في الصف الأول من ‎/settings). كل لغة مذكورة باسمها: English، ثم Español، وРусский (الروسية)، وPortuguês (Brasil)، و简体中文 (الصينية المبسطة)، وFrançais، وDeutsch (الألمانية)، و한국어 (الكورية)، والعربية، وBahasa Indonesia، وУкраїнська (الأوكرانية)، وItaliano، وTürkçe (التركية)، وفارسی (الفارسية)، وTiếng Việt (الفيتنامية). الدردشة الخاصة التي تبدأ بعد هذا الإصدار تتبع لغة تطبيق Telegram لديك؛ والموجودة قبله تبقى بالإنجليزية حتى الاختيار (يُنظر اللغات). في الإسبانية والبرتغالية والفرنسية والإيطالية والإندونيسية تبقى كلمات لوحة مفاتيح الرد status وstop وnew وkill، مثل أوامرها. وتستخدم الألمانية والتركية Status وStop وNeu…‎ وBeenden…‎، وÖzet وStop وOluştur وSonlandır؛ والكلمات الإنجليزية تظل تعمل عند كتابتها. في الفارسية والعربية يُقرأ نص aipager من اليمين إلى اليسار بأرقام فارسية أو عربية؛ وأسماء الجلسات والأوامر وأسماء النماذج والشيفرة تبقى كما هي. تذكر القائمة ما تغيّره: نص aipager نفسه فقط، هنا وفي Mini App؛ جلسات Claude لديك لا تتغير، ويجيب Claude بلغة رسالتك. في المجموعة يستطيع الجميع الاطلاع، وتغييرها يحتاج إلى مشرف. language اسم جلسة محجوز.
‎/whoami-عرض من أنت هنا: في وضع الفريق تسميتك، ودورك في هذه الدردشة والقواعد التي يعطيك إياها.
‎/update-للمشرفين فقط (الدوران owner وadmin، أو دور فيه can_manage). يتحقق من وجود إصدارات أحدث لـ aipager وClaude Code، ثم يحدّث ما له إصدار أحدث بزر واحد. يُنظر التحديث.

تعرض قائمة / جلساتك أولًا (/x1 · التحدث مع x1)، ثم الأوامر الشائعة: new وstatus وstop وnow وresume وmode وsettings وlanguage وhelp (وapp حين يكون Mini App مفعّلًا، في الدردشة الخاصة فقط). أما kill وrestart وrename وdelete وdiff وclearqueue وperms وwhoami وupdate فليست في القائمة لكنها تعمل عند كتابتها؛ وإجراءات الجلسة موجودة أيضًا في ‎/status ← ⋮.

الأوامر التي تعمل على جلسة (‎/stop و‎/mode و‎/kill و‎/restart و‎/rename و‎/delete و‎/diff) تتبع قاعدة واحدة:

  • مع اسم (‎/restart x1) تعمل على تلك الجلسة في هذه الدردشة (يحتاج ‎/rename إلى الاسم القديم والجديد لذلك، يُنظر أعلاه).
  • دون اسم، تعمل على الجلسة الوحيدة التي يمكن أن يعنيها الأمر (الوحيدة التي تعمل لـ ‎/stop، والوحيدة الجارية لـ ‎/kill و‎/restart، والوحيدة المنتهية لـ ‎/delete)، عبر التأكيد المعتاد حين يوجد.
  • وإلا فإنها تعرض قائمة اختيار بجلسات هذه الدردشة التي يناسبها الأمر فقط: الجلسة التي تذهب إليها رسائلك أولًا، معلّمة بـ ✍️، ثم البقية بالاسم، و✖️ إلغاء. اختيار جلسة يؤدي إلى البطاقة نفسها التي تأتي من كتابة اسمها.
  • في المجموعة، دون اسم، لا تعمل إلا على جلستك الحالية، حين يناسبها الأمر؛ وإلا فتعرض دائمًا قائمة الاختيار، حتى مع جلسة واحدة، لأنها قد تخص عضوًا آخر (يُنظر المجموعات).

ينظر ‎/mode و‎/diff أولًا إلى الجلسة التي تذهب إليها رسائلك.

الإعدادات#

يضبط ‎/settings (وتبويب الإعدادات في Mini App، الذي يعرض الخيارات نفسها) كيف تبدو جلسات هذه الدردشة وكيف تجيب. لكل دردشة إعداداتها؛ في المجموعة يستطيع الجميع الاطلاع، وتغيير أي إعداد يحتاج إلى مشرف. في دردشتك الخاصة يمكنك تغييرها بنفسك، أيًّا كان دورك، في Telegram وفي Mini App. الصف المعلّم بـ ✅ مضبوط على غير قيمته الافتراضية (شكل الرسائل يعرض اختياره دائمًا).

الإعدادالخيارات (الافتراضي أولًا)ماذا يفعل
🌐 اللغةتلقائي (لغة Telegram لديك)، في الدردشة الخاصة؛ Englishلغة رسائل aipager وأزراره في هذه الدردشة وفي Mini App، مذكورة باسمها (القائمة نفسها التي في ‎/language). لا تغيّر جلسات Claude لديك: يجيب Claude بلغة رسالتك. المعروض: English، وEspañol، وРусский (الروسية)، وPortuguês (Brasil)، و简体中文 (الصينية المبسطة)، وFrançais، وDeutsch (الألمانية)، و한국어 (الكورية)، والعربية، وBahasa Indonesia، وУкраїнська (الأوكرانية)، وItaliano، وTürkçe (التركية)، وفارسی (الفارسية)، وTiếng Việt (الفيتنامية)؛ ويتبع «تلقائي» لغة تطبيق Telegram لديك (يُنظر اللغات).
🖼 شكل الرسائلبطاقة العمل + إجابة منفصلة؛ الإجابة داخل البطاقة؛ الإجابة فقط، بدل البطاقةكيف تظهر المهمة المنتهية. «بطاقة العمل + إجابة منفصلة» يُبقي البطاقة فوق الإجابة سجلًا لطريقة الوصول إليها؛ و«الإجابة داخل البطاقة» يضع الإجابة في البطاقة؛ و«الإجابة فقط، بدل البطاقة» يحذف البطاقة ويترك الإجابة وحدها. الافتراضي «بطاقة العمل + إجابة منفصلة» (KEEP_FINISHED_CARD=0 يجعله «الإجابة فقط، بدل البطاقة» للدردشات التي لم تختر أبدًا). يُنظر الإجابات.
📝 معاينة التغييرات (diff)إيقاف؛ تشغيل«تشغيل» ينشر كل Write/Edit رسالة diff مستقلة تحت بطاقة العمل. «إيقاف» يُبقي بطاقة واحدة وإجابة واحدة؛ والبطاقة ما زالت تسرد كل تعديل، وفي Mini App عارض للتغييرات.
⏱ تحديث البطاقة في المهام الطويلةتشغيل؛ إيقافمع «تشغيل» تتحدّث بطاقة العمل كل ١٠ ثوانٍ بعد دقيقتين من المهمة، وكل ٣٠ ثانية بعد ١٠ دقائق (لا أبطأ أبدًا، مهما طالت المهمة)، وتتحرك ساعتها عندها بخطوات من ٣٠ ثانية؛ ومع «إيقاف» تبقى وتيرة الدقائق الأولى طوال المهمة (يُنظر حل المشكلات).
✏️ تنسيق بسيطإيقاف؛ تشغيل«تشغيل» يطلب من Claude نصًا عاديًا وقوائم بشرطات فقط: لا جداول ولا كتل شيفرة ولا عناوين ولا خط عريض.
📏 طول الإجابةبلا قاعدة؛ قصيرة جدًا؛ قصيرة؛ متوسطة؛ طويلةيطلب من Claude إجابات بذلك الطول.
🎓 مستوى المفرداتبلا قاعدة؛ كلمات بسيطة؛ عادي؛ متقدميطلب من Claude تلك المفردات.
🎨 المظهرزر الإيقاف، زرّا السماح والرفض، زر App، قائمة الإعداداتشكل أزرار aipager في هذه الدردشة؛ يبدأ كل شيء على «عادي» (شكل Telegram نفسه). لا يسمح Telegram للبوت إلا بتلوين الزر بالأزرق أو الأخضر أو الأحمر، لذا: زر الإيقاف (زر بطاقة العمل والزر تحت سؤال أو طلب إذن) عادي أو أزرق أو أخضر أو أحمر؛ والسماح والرفض عادي أو ملوّن (السماح والسماح دائمًا بالأخضر، والرفض بالأحمر)؛ وزر App (في الرسالة المثبتة وتحت ‎/app) عادي أو أزرق أو أخضر أو أحمر (زر القائمة بجانب مربع الرسالة لا يمكن تلوينه)؛ وقائمة الإعدادات عادي (تعلّم ✅ الخيار الحالي) أو الخيار الحالي بالأزرق أيضًا. للدردشة كلها لا لكل جلسة؛ وفي المجموعة لا يغيّره إلا مشرف. تطبيقات Telegram التي لا تدعم الألوان تعرض كل الأزرار عادية. وفي تبويب الإعدادات في Mini App الخيارات نفسها في قسم خاص بها، المظهر، بعد إعدادات الدردشة، ولكل خيار نقطة ملوّنة.
🆕 الجلسات الجديدةالأذونات (الوضع)، النموذج، المجلدما يبدأ به ‎/new الجلسة حين لا يُختار شيء: وضع «اسأل» أو التلقائي (الافتراضي) أو الوصول الكامل، ونموذج من قائمة النماذج أو النموذج الافتراضي في Claude Code، ومجلد. لا يستطيع اختيار الوصول الكامل هنا إلا مشرف، أو شخص في دردشته الخاصة مع البوت (شاشة الدردشة الخاصة لا تعرضه لأحد غيره)، ولا يسري أبدًا على من لا يحق له استخدامه: تبدأ جلساته في الوضع التلقائي.
👤 إعدادات كل جلسةجلسة، ثم أي إعداد أعلاه باستثناء الجلسات الجديدةقيم خاصة بجلسة واحدة (وأيضًا في ‎/status ← ⋮ ← 👤 إعدادات الجلسة)؛ ⭐ تعلّم الإعداد الذي تتجاوزه، و«استخدام إعداد الدردشة» يزيل التجاوز. وصفحة الجلسة في Mini App تضبط التجاوزات نفسها.
🐞 الإبلاغ عن المشكلاتاسألني؛ إيقاففي الدردشة الخاصة لمالك التثبيت فقط. «اسألني» يسمح لـ aipager بأن يعرض بين حين وآخر إرسال تقرير عن خطأ داخلي واجهه أكثر من مرة (مرة كل ٣ أيام على الأكثر)؛ و«إيقاف» لا يعرض أبدًا (زر «الإبلاغ عن مشكلة» في ‎/help ما زال يعمل). رفض عرضين متتاليين يوقف العروض، ويقول هذا الصف ذلك حينها، مع زر لتفعيلها مجددًا. يُنظر تقارير المشكلات.

طول الإجابة ومستوى المفردات والتنسيق البسيط تصل إلى Claude تعليمةً قصيرة تُضاف إلى كل رسالة من Telegram (يضيفها الهوك، يُنظر الهوكات)، مع استخدام تجاوزات الجلسة نفسها حين توجد.

أيًّا كان الشكل، تنتهي كل بطاقة عمل بسطر حالة جلستها (⏳/‎✅ name · …‎) وتبدأ كل إجابة بسطر نتيجتها (‎💬 name، مع · انتهت (…) حين لا تبقى بطاقة منتهية تعرض الأرقام)؛ وشكل «الإجابة داخل البطاقة» يكدّس الاثنين، كل سطر في قسمه. فوق سطر حالة بطاقة العمل خط فاصل (بخط صغير)، وفي شكل «الإجابة داخل البطاقة» يفصل خط ثانٍ البطاقة المنتهية عن الإجابة. في شكل البطاقة تأتي الإجابة عن قصد بعد البطاقة المنتهية بلحظة، لتُرى البطاقة تقول «انتهت» قبل أن تصل الإجابة تحتها؛ ويمكن ضبط هذا التقدم أو إيقافه بـ FINISH_CARD_GRACE_SECONDS (بالثواني، الافتراضي 0.8؛ و0 يرسل الاثنين معًا). وفي شكل البطاقة لا تبقى بطاقة لمهمة لم تستدعِ أي أداة: تُحذف البطاقة قبل أن تقول «انتهى»، ويحمل السطر الأول من الإجابة الأرقام، كما في شكل «الإجابة فقط، بدل البطاقة».

أوامر كل جلسة#

أمر لكل جلسة جارية، مسجّل باسمها:

الشكلماذا يفعل
‎/<label>‎جعل ‎<label>‎ الجلسة التي تذهب إليها رسائلك. يذكر الرد ذلك مع حالتها ووضعها (✍️ رسائلك الآن تذهب إلى x1 · 💤 جاهزة · 🤖 الوضع التلقائي، ثم «الرسائل التي تُرسل هنا تذهب إلى x1.»)، ويعرض إجابة حين تنتظرك، والزر ⋮ المزيد لقائمتها. الأرقام الكاملة في ‎/status. في المجموعة يقول بدلًا من ذلك «للتحدث مع x1: الرد على رسالة منها (أو ذكر ‎@aipagerbot).»، لأن الرسالة العادية هناك لا تصل إلى البوت (يُنظر المجموعات). و‎/x1@aipagerbot، الذي يرسله Telegram عند اختيار ‎/x1 من قائمة مجموعة، يعمل بالطريقة نفسها.
‎/<label> <prompt>‎إرسال ‎<prompt>‎ مباشرة إلى تلك الجلسة. وتصبح أيضًا الجلسة التي تذهب إليها رسائلك العادية التالية.
‎/<label> stopإيقاف المهمة الحالية لتلك الجلسة.

نتائج ‎/status تأتي من البيانات نفسها التي يعرضها aipager status في سطر الأوامر؛ وقائمة الجلسات نفسها لا تحتاج إلى أي اتصال بـ Telegram.

على الكمبيوتر، يعطي aipager status وaipager session ls كل جلسة حالة واحدة: IDLE أو BUSY أو WAITING (إذن أو سؤال ينتظرك، مع ماهيته حين تُعرف، مثل permission: Bash: make deploy) أو GONE. ومع ‎--json، لكل جلسة أيضًا waiting_kind (permission أو question) وwaiting_summary، وكلاهما null ما لم تكن تنتظر.

اللغات#

يتحدث aipager English وEspañol وРусский وPortuguês (Brasil) و简体中文 وFrançais وDeutsch و한국어 والعربية وBahasa Indonesia وУкраїнська وItaliano وTürkçe وفارسی وTiếng Việt، وكل منها مذكورة باسمها.

  • نص aipager وحده يتغير. اللغة لرسائل aipager وأزراره وبطاقاته وMini App. جلسات Claude لديك لا تتغير، ويجيب Claude بلغة رسالتك. أسماء الجلسات والأوامر وأسماء النماذج والشيفرة تبقى كما هي.
  • ‏‎/language (أو الصف الأول من ‎/settings) يختار لغة الدردشة الحالية. في الدردشة الخاصة هي أيضًا لغتك أنت: الإشعارات المنبثقة التي تظهر لك في المجموعة وMini App لديك تستخدمها.
  • تلقائي (في الدردشات الخاصة فقط) يتبع لغة تطبيق Telegram لديك، ويتبعها من جديد إن تغيّرت. واللغة التي لا يملكها aipager تظهر بالإنجليزية.
  • الدردشات الجديدة والقديمة. الدردشة الخاصة التي تبدأ بعد هذا الإصدار تتبع لغة تطبيق Telegram لديك حتى اختيار لغة، وأول رسالة فيها بلغة غير الإنجليزية يتبعها سطر قصير يذكر ذلك وطريقة تغييره. والدردشة الموجودة من قبل تبقى بالإنجليزية. وإذا كان تطبيق Telegram لديك بلغة يتحدثها aipager، تصلك بطاقة واحدة تعرضها، مع زر إبقاء الإنجليزية؛ وتأتي مرة واحدة، مهما كانت إجابتك.
  • للمجموعات لغة واحدة، يضبطها مشرف في ‎/language؛ وحتى ذلك الحين هي بالإنجليزية. الإشعار المنبثق بعد الضغطة يظهر بلغة من ضغط: اختياره في دردشته الخاصة مع البوت، وإلا لغة تطبيق Telegram لديه لمن انضم بعد هذا الإصدار، وإلا لغة المجموعة. يُنظر المجموعات.
  • من اليمين إلى اليسار. في الفارسية والعربية يُقرأ نص aipager من اليمين إلى اليسار بأرقام فارسية أو عربية. وتتبع بطاقة العمل لغة الدردشة، أيًّا كانت اللغة التي يكتب بها Claude: في دردشة إنجليزية تُقرأ من اليسار إلى اليمين، وفي دردشة فارسية أو عربية من اليمين إلى اليسار، وأي جملة كتبها Claude عليها بالاتجاه الآخر تبقى تُقرأ في اتجاهها. أما الإجابة فتتبع نص Claude: حين يجيب Claude بالفارسية أو العربية في دردشة لغتها تُكتب من اليسار إلى اليمين، تصبح الإجابة كلها رسالة من اليمين إلى اليسار، وسطور aipager نفسه فيها (الوكلاء تحت الإجابة، ومع «الإجابة داخل البطاقة» البطاقة المنتهية فوقها) تقف على اليمين مثل بقيتها وتبقى تُقرأ من اليسار إلى اليمين.
  • كلمات الأوضاع. يقبل ‎/mode كلمة الوضع بلغتك (/mode اسأل)، وتعمل ask وauto وfull دائمًا. وإذا كان لجلسة جارية هذا الاسم بالضبط، تسمّي الكلمة الجلسة بدلًا من ذلك (يُنظر ‎/mode أعلاه).
  • وصف البوت. عند البدء، يكتب aipager وصف البوت (النص الذي يظهر في شاشة الدردشة الفارغة) ووصفه القصير بكل لغة من هذه اللغات، للأشخاص الذين تطبيق Telegram لديهم بتلك اللغة. يعرض Telegram نصًا كهذا بدل النص الذي كتبته في BotFather، لذا لا يضبط aipager شيئًا ما دام لديك نصك الخاص (يُفحص الوصف والوصف القصير كل على حدة). ولا يكتب فوق نصك أبدًا ولا يغيّر أبدًا النص الإنجليزي أو الافتراضي. وحين يكون نصه الحالي مضبوطًا في كل اللغات، لا يسأل البدء Telegram عن شيء. وإلا فإنه يقرأ أولًا نصك في BotFather (قراءة واحدة للوصف وأخرى للوصف القصير): إن كان لديك نص، يتوقف هناك، فمع نصك الخاص لا يكلّف كل بدء إلا تلك القراءات. وإن لم يكن لديك، يقرأ كل لغة ليس فيها نصه الحالي بعد، لذا فاللغة التي كتبت فيها نصك الخاص تُقرأ من جديد عند كل بدء. وإذا كتبت وصفًا في BotFather بعد أن ضبط aipager وصفه، يبقى قرّاء هذه اللغات يرون وصف aipager (يُنظر حل المشكلات).

Mini App#

يفتح ‎/app (وزر القائمة في Telegram) لوحة يقدّمها aipager نفسه. وهي مفعّلة افتراضيًا؛ وتُدار بـ aipager miniapp enable|disable|status. يُتحقق من كل طلب بتوقيع initData من Telegram (يُنظر الأمان ← نفق Mini App). ولا تحمّل الصفحة شيئًا من أي مكان آخر: لا خطوط ولا صور ولا سكربتات من مواقع أخرى.

  • الدردشات. يعرض التطبيق دردشة واحدة في كل مرة. إذا كنت في أكثر من دردشة (دردشتك الخاصة ومجموعة مثلًا)، ينقلك صف بأسماء الدردشات في الأعلى بينها؛ ويُفتح التطبيق على دردشتك الخاصة ويتذكر آخر اختيار لك على ذلك الهاتف. كل ما في الأسفل يخص الدردشة المختارة، بدورك فيها. ومع دردشة واحدة لا يظهر الصف. يُنظر المجموعات.
  • الجلسات. جملة واحدة تلخّص الدردشة، مثل «بانتظارك: ١، تعمل: ٢، جاهزة: ٣»، وتحتها ما أُنفق. كل جلسة جارية مربّع فيه حلقة السياق، ومجلدها، ونموذجها، وتكلفتها؛ والجلسات العاملة تتوهج بلون التمييز. والجلسات المنتهية على رف المنتهية القابل للطي. وزر + يبدأ جلسة جديدة.
  • بانتظارك. الجلسة التي تنتظر طلب إذن أو سؤالًا موجودة في شريط كهرماني في الأعلى، تعرض ما تسأل عنه. يعيد الرد في الدردشة إرسال ذلك الطلب، مع أزراره، إلى أسفل الدردشة، مثل زر الرد في الشريط المثبّت، ويكون الرد هناك. إذا كانت الجلسة الوحيدة التي تنتظر، يُغلق التطبيق ليكون الطلب أمامك مباشرة؛ وإلا يبقى مفتوحًا ويقول «أُرسل إلى الدردشة». ويحتاج ذلك إلى صلاحية إرسال الرسائل إلى الجلسة، والنسخة المضغوطة بعد الرد على الطلب أو استبداله تقول «تمت الإجابة بالفعل».
  • صفحة الجلسة. يعرض الرأس حلقة السياق، والحالة («تعمل (٣:١٢)»، «بانتظارك (إذن)»، «جاهزة، آخر نشاط منذ ٥ د»، «انتهت»)، وإيقاف بضغطة واحدة (أثناء العمل أو الانتظار) أو استئناف (بعد الانتهاء). وتحته: الطلب المنتظر مع الرد في الدردشة، وآخر استدعاءات الأدوات شريطًا (الضغط عليه يعرض الخط الزمني كاملًا)، وآخر رد، والحقائق، وعنصر النموذج، وإعدادات الجلسة نفسها، والملفات المتغيرة والخط الزمني. وقائمة ⋮ فيها كل إجراء، مع التأكيدات نفسها كما من قبل.
  • جلسة جديدة. بطاقة موجّهة: الاسم، ثم المكان (مع اقتراحات الأخيرة للمجلدات التي تستخدمها جلساتك، الأحدث أولًا)، ثم النموذج (مع اقتراحات مقترحة)، ثم خيارات أخرى لوضع الأذونات وأسلوب الرد. زر Telegram نفسه في الأسفل مكتوب عليه بدء الجلسة. للعضو الذي ليس في دوره can_manage، لا تعرض خطوة «أين» إلا المجلد الجذر للدردشة والمجلدات التي داخله مباشرة (المجلد الجذر هو الافتراضي، و«مجلد جديد» ينشئ داخل المجلد المختار)؛ والمجلد الذي خارجه يُرفض مع السبب، والاستئناف وإعادة التشغيل وتبديل الوضع لجلسة تعمل خارجه تجيب «تعمل هذه الجلسة خارج مجلدك ~/...، لذا لا يمكن لدورك استئنافها أو إعادة تشغيلها أو تغيير وضعها. يمكنك طلب ذلك من مشرف.»
  • الإعدادات. لغة التطبيق أولًا: لغتك أنت لنص aipager في التطبيق وفي دردشتك الخاصة (الإنجليزية، أو الإسبانية، أو الروسية، أو البرتغالية (البرازيل)، أو الصينية (المبسطة)، أو الفرنسية، أو الألمانية، أو الكورية، أو العربية، أو الإندونيسية، أو الأوكرانية، أو الإيطالية، أو التركية، أو الفارسية، أو الفيتنامية؛ و«تلقائي» يتبع لغة تطبيق Telegram لديك، يُنظر اللغات). يستطيع كل شخص تغيير لغته، ولا تُنشر أبدًا في دردشة، ولا تغيّر جلسات Claude لديك. ثم إعدادات الدردشة (في المجموعة لا يغيّرها إلا مشرف؛ وفي دردشتك الخاصة يمكنك ذلك، أيًّا كان دورك، كما في ‎/settings هناك)، وللمشرف التحديثات، الذي يعكس ‎/update. وللمالك في دردشته الخاصة، يفتح الإبلاغ عن مشكلة صفحته الخاصة: كتابة ملاحظة، ومراجعة التقرير، وإرساله، ورؤية رقم مرجعه دون مغادرة التطبيق (يُنظر تقارير المشكلات).

يتبع التطبيق مظهر Telegram الفاتح أو الداكن عند تبديله، ويوقف حركاته الخفيفة حين يطلب هاتفك تقليل الحركة. كل ما في Mini App يمكن الوصول إليه أيضًا من الدردشة: قائمة ⋮ في لوحة الجلسة فيها الإجراءات نفسها.

تبديل نموذج جلسة جارية#

في صفحة الجلسة الجارية عنصر النموذج يعرض النموذج الذي تبلّغ عنه الجلسة (من سطر الحالة في Claude Code) والقائمة نفسها التي يعرضها منتقي البدء ولوحة مفاتيح النماذج في الدردشة. اختيار نموذج يكتب ‎/model <name>‎ بالضبط في تلك الجلسة، وهو الإدخال نفسه الذي تستخدمه لوحة مفاتيح النماذج في الدردشة، بالقاعدة نفسها عمّن يحق له ذلك (كل من يستطيع إرسال الرسائل إلى الجلسة). يعرض العنصر يجري التغيير… حتى يبلّغ سطر الحالة عن نموذج مختلف، ثم يعرضه؛ وإن لم يتغير شيء خلال ١٥ ثانية فإنه يعرض لم يُؤكَّد (يمكنك التحقق من الجلسة).

  • فقط حين تكون الجلسة جاهزة، لا أثناء عمل Claude ولا حين يكون هناك طلب مفتوح. يشغّل Claude Code الأمر ‎/model فورًا، حتى في منتصف المهمة، لا بعدها، لذا يُرفض التبديل حتى تنتهي المهمة. ولوحة المفاتيح في الدردشة ترفض في الحالات نفسها، بالكلمات نفسها.
  • سؤال Claude Code «Switch model?». عادةً يسأل Claude Code هذا قبل التبديل، لأن الإجابة التالية يجب أن تعيد قراءة المحادثة كلها. مع Claude Code 2.1.251 أو أحدث، يوافق هوك PreModelSwitch في aipager على التبديل الذي كتبه aipager للتو، فلا يُطرح السؤال (يُنظر الهوكات). وكل تبديل آخر ما زال يسأل. مع Claude Code أقدم، أو عند التبديل إلى opusplan أو منه، قد يظهر السؤال مع ذلك. عندها يظهر التبديل لم يُؤكَّد وينتظر السؤال في الطرفية. يلزم الرد عليه هناك قبل إرسال أي شيء آخر إلى الجلسة، وإلا كُتبت رسالتك التالية فيه. وللسبب نفسه، يرفض aipager تبديلًا آخر لتلك الجلسة لمدة دقيقة بعد تبديل لم يُؤكَّد، أو حتى تبلّغ الجلسة عن نموذج جديد.

شريط الحالة المثبّت#

كل دردشة يتحدث فيها aipager (دردشتك الخاصة، وكل نطاق مجموعة) تحصل على رسالة مثبّتة واحدة: شريط الحالة. يعرض شريط Telegram أعلى الدردشة الرسالة بدءًا من سطرها الأول، والأسطر موصولة، لذا يقول ذلك السطر أكثر ما يحتاج إليك:

السطر الأولمتى
⏳ jim بانتظارك - Bash: make deployجلسة تنتظر طلب إذن أو سؤالًا أو طلبًا تفاعليًا؛ و(+٢ أخريان) حين تنتظر جلسات أخرى أيضًا
⚙️ jim (تعمل) / 💤 jim (جاهزة)في الدردشة جلسة جارية واحدة وهي تعمل / جاهزة (🔄 jim (قيد البدء) أثناء بدئها): هذا السطر هو الشريط كله، باستثناء سطر حدود السرعة
⚙️ تعمل: ٢ · جاهزة: ١عدة جلسات، لا تنتظر أي منها: كم منها في كل حالة (تعمل، جاهزة، قيد البدء)؛ و🔄 حين لا تعمل أي منها وواحدة قيد البدء، و💤 حين تكون كلها جاهزة
💤 الكل جاهزلا جلسة جارية

وتحته، فقط ما دام ينطبق، سطر حدود السرعة (🐢 إرسال أبطأ بعد تحذير من Telegram (الساعات الست بعد 429) أو ⏸ تحديث البطاقات متوقف مؤقتًا (حد Telegram في الساعة) / (حدود Telegram) (الوضع الأدنى، يُنظر حل المشكلات))، ثم، حين يكون في الدردشة أكثر من جلسة جارية، ✍️ الرسائل تذهب إلى jim (الجلسة التي تذهب إليها الرسالة العادية في هذه الدردشة، يُنظر أدناه؛ وليس في المجموعة، حيث لكل شخص وجهته) وسطر لكل جلسة مع حالتها: تعمل أو بانتظارك أو جاهزة أو قيد البدء. يذكر الشريط كل جلسة مرة واحدة: الجلسة المنتظرة التي يذكرها السطر الأول لا سطر خاصًا بها، والسطر الأول لا يسرد أبدًا أسماء تكررها الأسطر التي تحته. الجلسة التي ما زال لديها وكلاء يعملون في الخلفية تذكر عددهم في سطرها (أو في السطر الوحيد، مع جلسة واحدة): 💤 jim (جاهزة، وكيل واحد يعمل). والأوامر التي يشغّلها Claude في الخلفية تُعدّ بالطريقة نفسها: (جاهزة، أمر واحد في الخلفية يعمل)، أو (جاهزة، قيد التشغيل: وكيلان، أمر واحد في الخلفية) مع الاثنين. إنه عدد، لا أسماؤها أبدًا، لذا لا يتحرك الشريط إلا حين يتغير العدد. الضغط على الشريط ينقلك إلى الرسالة.

أين تذهب الرسالة العادية. الرسالة التي ليست ردًا تذهب إلى الجلسة التي تحدثت معها هذه الدردشة آخر مرة: آخر جلسة انتقلت إليها بـ ‎/<label>‎، أو أرسلت إليها رسالة، أو بدأتها، أو آخر جلسة أجابتك هنا. والأوامر ‎/mode و‎/clearqueue و‎/diff و‎/now دون اسم تعمل على الجلسة نفسها (و‎/stop يوقف أيّ جلسة تعمل). لكل دردشة وجهتها: الرسالة في دردشة لا تذهب أبدًا إلى جلسة تخص دردشة أخرى. في المجموعة لا يُحسب إلا الرد على البوت، أو الرسالة التي تذكره، أو أمر، أو ضغطة على لوحة مفاتيح المجموعة (يُنظر المجموعات)، ولكل شخص وجهته الخاصة، التي لا تحرّكها إجابة جلسة (يُنظر المجموعات).

أزرار الرسالة المثبّتة:

  • الرد على ‎<label>‎ (زر لكل جلسة منتظرة، ثلاثة على الأكثر) يعيد إرسال طلب تلك الجلسة، مع أزرار الإجابة، إلى أسفل الدردشة، ليمكن الرد دون تمرير. إذا أُجيب عنه في الأثناء يصلك إشعار «تمت الإجابة بالفعل» بدلًا من ذلك، والنسخة (أو الطلب الأصلي) المضغوطة بعد الإجابة عن طلبها في مكان آخر تُرفض بالطريقة نفسها: لا تجيب أبدًا عن طلب لاحق. بعد إعادة تشغيل aipager، يظل الطلب المنتظر يعمل من بطاقة العمل أو من رسالته الخاصة، لكن aipager لم يعد يعرف أي طلب عرضته نسخة أقدم، لذا تُرفض الضغطة على نسخة أعاد الشريط إرسالها قبل إعادة التشغيل بـ «هذا الطلب لم يعد مفتوحًا». يستطيع استخدامه كل من يحق له الرد على الطلب؛ ولا أحد غيره.
  • ‏📱 App يفتح Mini App، في دردشتك الخاصة، ما دام Mini App يعمل.

لا يحمل الشريط ساعة ولا تكلفة ولا نسبة سياق ولا نموذجًا، لذا لا يتغير إلا حين تتغير حالة جلسة. يعدّله aipager (بصمت، دون إشعار) فقط حين يتغير ما يعرضه، مرة كل ٣٠ ثانية على الأكثر لكل دردشة (PINNED_MIN_EDIT_GAP)؛ والتغيير الذي يقع داخل تلك الفجوة يظهر حين تنتهي، ولا يضيع أبدًا. ولا يُعدَّل أبدًا ما دام الإرسال إلى الدردشة موقوفًا، ويلحق بما فات حين يُرفع الإيقاف.

في المجموعة يحتاج البوت إلى صلاحيات المشرف للتثبيت. إذا رُفض التثبيت، يحذف aipager رسالة الحالة التي أرسلها للتو (حتى لا تبقى أبدًا غير مثبّتة في سجل المجموعة) ولا يعرض شريطًا في تلك المجموعة حتى يُعاد تشغيل aipager؛ والأمر نفسه لدردشة ترفض البوت كليًا (طردته، أو حظرته). وإذا حُذفت الرسالة المثبّتة، يرسل aipager رسالة جديدة ويثبّتها، مرة في الساعة على الأكثر لكل دردشة.

لوحة المفاتيح الدائمة#

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

الصفالأزرارملاحظات
الجلساتزر لكل اسم جلسة جاريةتُبنى تلقائيًا من قائمة الجلسات
الإجراءاتالحالة، إيقاف، جديدةاختصارات نصية (إنهاء ما زال يعمل عند كتابته؛ وإنهاء الجلسة في ‎/status ← ⋮)
التنقلالقوالب، الأوامريُفتح Mini App من زر القائمة بجانب خانة الكتابة أو بـ ‎/app، لا من هذه اللوحة

يوجد النموذج › داخل القائمة الفرعية «الأوامر». الضغط على عنصر في قائمة فرعية يرسل رسالة جاهزة أو أمر شرطة مائلة:

  • القوالب: رسائل تتكرر كتابتها، مثل «اكتب اختبارات» و«اشرح الخطة» و«حدث الذاكرة».
  • الأوامر: أوامر الشرطة المائلة التي يتعامل معها Claude Code بنفسه (‎/compact،‏ ‎/clear، وغيرها)، تُكتب فورًا. والأمر أو القالب يسمّي الجلسة التي ذهب إليها (🧹 تم إرسال /clear إلى x1). ومسح المحادثة مرفوض أثناء عمل الجلسة (⚠️ لا يمكن مسح المحادثة والجلسة تعمل).
  • النماذج: تبديلات سريعة للنموذج في الجلسة النشطة. هناك أسماء العائلات المستعارة (sonnet،‏ opus،‏ haiku،‏ fable،‏ opusplan)، التي تعني دائمًا أحدث نموذج في عائلتها، ونماذج مثبّتة (claude-opus-5-5، وclaude-opus-5-5[1m] مع سياق ‎1M، وclaude-sonnet-5-5، وclaude-fable-5-1، وclaude-haiku-5-5). ومنتقيا البدء والجلسة في Mini App يستخدمان القائمة نفسها. يُرفض التبديل أثناء عمل الجلسة أو حين يكون هناك طلب مفتوح. ثم يتغير الرد 🔄 ليعرض النموذج الذي تبلّغ عنه الجلسة، أو يقول إن التبديل لم يُؤكَّد (يُنظر تبديل نموذج جلسة جارية).

لتجاوز التخطيط الافتراضي، يُكتب الملف ‎~/.config/aipager/keyboard.json:

json
{
  "templates": [{"label": "Deploy",  "prompt": "Deploy to staging"}],
  "commands":  [{"label": "Compact", "send": "/compact"}],
  "models":    [{"label": "Sonnet",  "send": "/model sonnet"}]
}

كل قسم مستقل: الأقسام المفقودة تعود إلى القيم الافتراضية المدمجة، فيمكن تجاوز قسم دون ذكر الأقسام الأخرى. وJSON التالف يُتجاهل مع تحذير في السجل. والتغييرات تحتاج إلى إعادة تشغيل aipager.

الأزرار تحت كل رسالة#

معظم ردود البوت تحمل أزرارًا تناسب الموقف:

طلبات الإذن#

حين يطلب Claude تشغيل أداة تحتاج إلى موافقة، تصبح بطاقة العمل طلب إذن:

text
🔐 Bash: List the temp directory
ls -la /tmp

  [✅ السماح]  [❌ رفض]
  [🟢 السماح دائمًا]  [⏹ إيقاف]

تعرض البطاقة الأمر (أو مسار الملف) الحقيقي الذي يطلب Claude تشغيله، تحت وصفه الخاص له: الموافقة تكون على ما يمكن قراءته. الحرف الذي قد يغيّر ترتيب رسم النص (حرف تحكم في الاتجاه في Unicode مثل U+202E، قد يجعل أمرًا يبدو كأمر آخر) يُعرض كعلامة مثل ‎⟨U+202E⟩‎، وتضيف البطاقة عندها ⚠️ في هذا النص حروف مخفية تغيّر اتجاه الكتابة (تظهر بالشكل ⟨U+...⟩). قد يُنفَّذ شيء غير ما يظهر هنا.

  • السماح: الموافقة على هذا الاستدعاء الواحد.
  • رفض: رفضه؛ فلا يشغّل Claude الأداة.
  • السماح دائمًا: الموافقة وإضافة القاعدة الدائمة التي يعرضها Claude («لا تسأل مجددًا عن …»). يظهر الزر فقط حين يعرض Claude قاعدة كهذه؛ ولأمر لا يستطيع اشتقاق قاعدة له (معظم الأوامر المركبة) تحمل البطاقة السماح / الرفض / الإيقاف بدلًا من ذلك، كما تفعل لوصول للقراءة فقط إلى ملف (Read،‏ Grep،‏ Glob) خارج مجلد عمل الجلسة. يضع Claude Code 2.1.259 وما بعده في ذلك الموضع سطر «التبديل إلى الوضع التلقائي» في مربع حوار Bash الخاص به، وسطر «منع القراءة خارج مجلدات العمل من الآن» في مربع حوار القراءة الخارجية، ولـ Write/Edit لا يستطيع اشتقاق قاعدة لكل ملف له، تبديلًا لوضع الأذونات مثل القبول التلقائي لكل تعديلات الملفات (acceptEdits)؛ ولا يختار aipager أيًا منها أبدًا؛ وتغيير الأوضاع يكون عن قصد بـ ‎/mode.
  • إيقاف: إيقاف المهمة بدل الإجابة.

تذهب الإجابة إلى Claude Code عبر هوك الإذن في aipager، الذي ينتظرها حتى ٢٠ ثانية. والطلب الذي يأتي قبل بطاقة العمل (يُرسل عندها رسالة مستقلة، مع السماح والرفض فقط) يُجاب عنه بالطريقة نفسها. وبعد انتهاء ذلك الانتظار، تكتب الأزرار الإجابة في مربع حوار Claude Code نفسه بدلًا من ذلك؛ ويختار الرفض عندها آخر سطر في المربع («No, and tell Claude what to do differently»)، الذي ينهي مهمة Claude مثل الإيقاف، وتقول البطاقة 🚫 jim · مرفوض.

كل ضغطة تُسجَّل في ‎~/.claude/aipager-audit.jsonl وتُكرَّر ردًا من سطر واحد تحت بطاقة العمل: ✅ jim · مسموح · @alice · Bash: List the temp directory (وصف الاستدعاء، أو أمره حين لا وصف له؛ مع دردشة أُعدّت بـ aipager config؛ ومسموح وحدها في الوضع الشخصي).

ما دام طلب (أو AskUserQuestion) ينتظرك، تظهر الجلسة منتظرة، لا جاهزة أبدًا. وإذا نبّه Claude Code إلى خمول الإدخال أثناء ذلك الانتظار، تتلقى الدردشة ⬆️ jim · لا تزال بانتظار إجابتك في الأعلى ردًا على الطلب، مرة واحدة لكل انتظار.

مربعات حوار AskUserQuestion تُعرض بالطريقة نفسها، مع زر لكل خيار (الأربعة الأولى)، وللسؤال الذي يسمح بعدة إجابات، مربعات اختيار ⬜/☑ وزر ✅ إرسال. يُعرض السؤال ووصف كل خيار كاملين، كما في الطرفية. ولا يُختصر إلا النموذج الأطول من أن تحمله رسالة Telegram واحدة: تعرض بطاقة العمل أولًا أسطر أدوات أقل، ثم تنتهي أطول النصوص بين السؤال والأوصاف بـ… عند حدود كلمة.

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

عند ٨٠٪ من السياق تتلقى الدردشة ⚠️ name · امتلأ السياق بنسبة ٨٢٪ - سيُلخَّص تلقائيًا قريبًا مع 📦 تلخيص الآن، الذي يرسل ‎/compact إلى تلك الجلسة. يصل هذا التحذير مرة واحدة في كل محادثة: التلخيص لا يعيده، والمحادثة الجديدة (بعد ‎/clear مثلًا) تتلقاه من جديد.

الأزرار القديمة#

الأزرار التي تعمل على مهمة جارية (الإيقاف، والإنهاء، وإعادة التشغيل، وتبديل ‎/mode و«إيقاف وتغيير الوضع» الخاص به، والاستبدال في ‎/new) مرتبطة بالمهمة التي عُرضت لها. الزر المتبقي من مهمة سابقة لا يغيّر شيئًا، بدل أن يعمل على ما يجري الآن، وكذلك الزر المعروض قبل انتهاء الجلسة ثم استئنافها أو إعادة تشغيلها. يجيب الإنهاء وإعادة التشغيل وتبديل ‎/mode والإيقاف في ‎/status أو في قائمة ‎/stop بـ بدأت x1 عملًا جديدًا - … مع ما يلزم ضغطه أو إرساله مرة أخرى (أو تلك الجلسة انتهت.)؛ ويجيب إيقاف بطاقة العمل بـ تلك المهمة انتهت بالفعل - …، ويعيد «إيقاف وتغيير الوضع» في ‎/mode بطاقته إلى بطاقة ‎/mode تحت ⚠️ بدأت x1 مهمة جديدة، لذا لم يتغير شيء. ويقول الاستبدال في ‎/new في هذه الأثناء بدأت x1 العمل. يمكنك إرسال /new مرة أخرى لاستبدالها. حين بدأت الجلسة مهمة بعد عرض بطاقتها.

أزرار الطلب مرتبطة بذلك الطلب. فبعد الإجابة عنه، في Telegram أو في الطرفية، تجيب تمت الإجابة بالفعل ولا تكتب شيئًا، حتى وطلب آخر للجلسة ما زال مفتوحًا.

زر ⚡ إرسال الآن لا يعمل إلا على الرسالة التي تحته: إذا أخذ Claude تلك الرسالة بالفعل، تجيب الضغطة أخذها Claude بالفعل، ولا ترسل شيئًا، وتزيل أسطر قائمة الانتظار.

الإجابات#

حين تنتهي مهمة، تصل الإجابة كما يحدد شكل الرسائل لديك (يُنظر أدناه والإعدادات). إذا كانت إجابة Claude أطول مما تتسع له رسالة واحدة (نحو ٣٢ كيلوبايت)، تعرض الرسالة ما يتسع تحت ملاحظة 📎 الإجابة الكاملة في الملف أدناه ↓، وتتبعها المهمة كلها (خطواتها والإجابة الكاملة) كملف ‎<name>_full_log.md، يعرضه Telegram دون تطبيق آخر. ويُرفق الملف نفسه حين تضطر بطاقة العمل إلى إسقاط أسطر.

المهمة التي تنتهي بخطأ في واجهة Anthropic البرمجية (الرصيد، أو الازدحام، أو حد عدد الطلبات، أو الشبكة) تعرض ‎⚠️ name · <what went wrong>‎ بدل الإجابة، مع 🔄 إعادة المحاولة، الذي يعيد إرسال آخر رسالة إلى الجلسة نفسها. ما دام الإرسال إلى الدردشة موقوفًا لا تفعل الضغطة شيئًا إطلاقًا (لا تُعاد الرسالة ويبقى الزر)، لذا يُضغط مرة أخرى بعد رفع الحظر.

في شكل البطاقة («بطاقة العمل + إجابة منفصلة») تبقى البطاقة المنتهية فوق الإجابة سجلًا لطريقة الوصول إليها: أسطر أدواتها، وأسطر وكلائها، وما قاله Claude بينها. وتصل الإجابة رسالةً مستقلة (مع إشعار). أما المهمة التي لم تستدعِ أي أداة (لا أداة ولا وكيل ولا أمر في الخلفية ولا سؤال أو طلب إذن) فلن يبقى منها سوى ✅ name · انتهى · Ns، لذلك تُحذف بطاقتها وهي ما زالت تقول «يعمل»، ولا تتحول أبدًا إلى «انتهى»، ويحمل السطر الأول من الإجابة الوقت بدلًا منها (💬 name · انتهت (…)). وإرسال ملف إليك لا يُعدّ هنا استدعاءً لأداة: تأتي الملفات بعد الإجابة. والمهمة التي ليس لها إجابة تُعرض، أو التي انتهت بخطأ في واجهة Anthropic البرمجية، تحتفظ ببطاقتها. وللحصول على رسالة واحدة لكل مهمة، يُختار «الإجابة داخل البطاقة» (تذهب الإجابة إلى البطاقة) أو «الإجابة فقط، بدل البطاقة» (تُحذف البطاقة وتبقى الإجابة وحدها).

لكل مهمة بطاقة عمل واحدة بالضبط. الرسالة المرسلة أثناء مهمة جارية لا تضيف أبدًا بطاقة ثانية لتلك المهمة، والبطاقة التي انتهت مهمتها لا تحتفظ بزر الإيقاف: إذا لم يغلقها شيء (هوك Stop ضائع، أو إعادة تشغيل)، يغلقها aipager بعد ٣٠ ثانية، كما يحدد شكل الرسائل لديك. بعد إعادة تشغيل aipager، تُحفظ البطاقة التي ما زالت مهمتها جارية وتستمر في العد فورًا، ويستمر وقتها من بداية المهمة، وتظهر الجلسة عاملة حتى تنتهي المهمة؛ وأي بطاقة أخرى متبقية من قبل إعادة التشغيل تُغلق («أُعيد تشغيل aipager»، ويُزال الإيقاف). والجلسة التي كانت تنتظر طلب إذن أو سؤالًا واحدًا من Claude تعود منتظرة، لا عاملة: بطاقتها والشريط المثبّت يقولان إنها بانتظارك وأزرار الطلب ما زالت تجيب عنه، ما لم يُظهر سجل المحادثة أنه أُجيب عنه في الطرفية في الأثناء. الأسئلة ذات الأجزاء المتعددة أو الاختيارات المتعددة، والطلبات التي يطرحها وكيل فرعي، تُترك للطرفية. وبمجرد أن يُعرف أن طلبًا انتهى (أُجيب عنه بضغطة أو في الطرفية، أو انتهت مهمته، أو لم تُعِده إعادة التشغيل لأنه أُجيب عنه في الأثناء أو تعذّر حفظه وقراءته من جديد)، تجيب أزرار إجابته القديمة «تمت الإجابة بالفعل» ولا تكتب شيئًا، حتى بعد إعادة التشغيل. أما الطلب الذي لا يجيب عنه أحد فيبقى مفتوحًا ما دام Claude ينتظره. ولا يتوقف aipager عن انتظاره إلا إذا لم يرسل Claude أي خبر خلال ٥ دقائق وأظهرت المحادثة المحفوظة أن الطلب قد مضى (ضاع خبر الإجابة)؛ ومثل هذا الطلب لا يُعرف أنه انتهى، لذا ما زالت أزراره تجيب عن مربع الحوار. والخبر الذي يُحسب هو خبر Claude نفسه وخبر الوكيل الذي طلب: وكيل في الخلفية يعمل وحده لا يُحسب، والمحادثة المحفوظة لا تقول شيئًا عن طلب أحد الوكلاء، الذي ينتظر خبر ذلك الوكيل نفسه.

المهمة التي يبدؤها Claude بنفسه (وكيل في الخلفية يبلّغ بنتيجته عبر ‎<task-notification>‎ حين لا يكون هناك عمل مفتوح) لا تحصل على بطاقة عمل إلا حين تفعل شيئًا: عند أول استدعاء أداة، أو بعد ١٥ ثانية، أيهما أسبق. معظم هذه الاستيقاظات بضع ثوانٍ من «لا جديد»؛ وهي الآن لا تعرض إلا الإجابة. ومؤشر «يكتب…» ما زال يظهر أثناء عملها، والإجابة نفسها تُسلَّم دائمًا: لا شيء يُصفّى بوصفه تافهًا. والمهام التي تبدأ منك، من Telegram أو من الطرفية، ما زالت تحصل على بطاقتها فورًا.

ما دامت الجلسة تعمل، يحصل كل وكيل في الخلفية يطلقه Claude (عبر أداة Agent في Claude Code، وTask في الإصدارات الأقدم) على سطره الخاص في بطاقة العمل: ‎🤖 <type> · <activity> · <elapsed>‎، يعرض نوع الوكيل وما يفعله الآن، ويُحدَّث مع وصول استدعاءات أدواته. بمجرد أن يجري ذلك الوكيل ثلاثة استدعاءات أدوات أو أكثر، تُطوى في زر ▸ N أدوات استُخدمت الخاص به مباشرة تحت سطره، ولا تظهر أبدًا في الخط الزمني للمهمة الرئيسية ولا في أعداد Bash ×N فيها. وحين ينتهي الوكيل، يستقر سطره على ✅ 🤖 <type> · استخدم N أدوات · <elapsed> ويحتفظ بالزر نفسه. والوكيل الذي أطلقه وكيل آخر (مساعد) يذكر قبل نوعه الوكيلَ الذي في رأس سلسلته، ‎🤖 pipeline-runner › ship-tester، إذا كان aipager يعرف من أطلقه لحظة بدئه؛ وتبقى الأسطر بترتيب بدء الوكلاء. ويكتسب مرفق ‎.md المفصّل أعلاه قسم «الوكلاء» يسرد كل وكيل عمل في المهمة، ومدته، وعدد أدواته، والأدوات التي استدعاها.

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

الأمر الذي يشغّله Claude في الخلفية (run_in_background، أو Ctrl+B، أو أمر ينقله Claude Code إلى هناك حين تنتهي مهلته) يحصل على سطره الخاص أثناء عمله: ⏳ أمر في الخلفية: <description> (٣:١٢)، مسمّى بوصف الاستدعاء أو بأول سطر من الأمر. وحين ينتهي يستقر السطر على ✅ أمر في الخلفية: <description> - انتهى (٦:١٢)، أو ❌ ... - انتهى بخطأ (رمز الخروج 1)، أو ⏹ ... - أُوقف (٦:١٢) (أوقفه Claude بـ TaskStop، أو أوقفه Claude Code بسبب ضغط الذاكرة)؛ والأسطر الفاشلة والموقوفة تحتفظ بتلك العلامة على البطاقة المنتهية. المهمة التي تنتهي بينما أمر كهذا ما زال يعمل لم تنتهِ: تنتظر البطاقة حالةً للعمل (🔄 name · لا يزال قيد العمل: أمر واحد في الخلفية · ٤:١٠، أو لا يزال قيد العمل: وكيل واحد (ship-reviewer)، أمر واحد في الخلفية مع وكيل أيضًا)، وحين ينتهي الأمر تستمر متابعة Claude على البطاقة نفسها. الأوامر التي تبدأ داخل وكيل تخص ذلك الوكيل ولا تُعرض. والأمر الذي لا يرى aipager نهايته أبدًا (إعادة تشغيل، أو حدث ضائع) يتوقف عدّه بعد ساعتين (AIPAGER_BG_SHELL_MAX_TRACK، بالثواني): يقول سطره ⏹ ... - لم تُرَ نهايته، والعمل الذي كان ينتظره وحده يُغلق مع ⚠️ name · انتهت (٢:٠٠:٠٤، لا أخبار من الأمر في الخلفية).

حين يطول الخط الزمني لمهمة، تُطوى كل سلسلة أقدم من استدعاءات الأدوات (ثلاثة أو أكثر متتالية، وليست السلسلة الجارية) في زر ▸ N أدوات استُخدمت خاص بها في موضعها، بدل أن تتراكم كاملة أو يقطعها حد طول الرسالة في Telegram؛ والضغط على أي منها يعرضها في مكانها. التعليقات لا تُطوى أبدًا؛ وأحدث نشاط وسطر الحالة ظاهران دائمًا دون ضغط شيء. وسطر الوكيل في الخلفية الذي ما زال يعمل (أو استقر للتو) لا يُطوى هو نفسه أبدًا، بل استدعاءات أدواته فقط، ولا يُطوى أبدًا ما دام هو الشيء الوحيد الواقف بين الخط الزمني والحد. وفقط إذا كان الخط الزمني كبيرًا لدرجة أن كل الطي معًا لا يتسع، يُسقط المحتوى فعلًا من البطاقة؛ وعندها يحمل مرفق ‎.md أعلاه السجل الكامل.

وكلاء ما زالوا يعملون حين تُرسل الإجابة#

يستطيع Claude Code تشغيل وكلاء في الخلفية، والمهمة التي أطلقتهم قد تنتهي وهم يعملون. عندها تنتهي الإجابة بخط فاصل وحالة قصيرة لذلك العمل في الخلفية، على طريقة لوحة الوكلاء في Claude Code نفسه، تُحدَّث ما دام يعمل. وكل ما تحت الخط مكتوب بخط صغير (تذييل Telegram)، فتبرز الإجابة نفسها:

text
⏳ ٥ وكلاء قيد العمل · 🖥 أمر واحد في الخلفية (shell) قيد التشغيل

○ 🤖 pipeline-runner · Writing final.md for the pipeline

- 🤖 ship-tester · Write and run criteria tests
- 🤖 ship-developer · Editing state.py
- 🤖 ship-developer › ship-reviewer · Collect line numbers

‖ 🤖 r2-runner · بانتظار الوكلاء الذين شغّلهم

عندما ينتهي عمل الوكلاء، تُرسل النتيجة إلى هنا.
  • السطر الأول يعدّ. الوكلاء العاملون (أو المنتهون)، وأوامر الخلفية (shells) لهذا العمل الجارية أو المنتهية أو الموقوفة. والأمر في الخلفية ليس إلا عددًا دائمًا، لا أمره أبدًا.
  • سطر لكل وكيل، 🤖 ونوعه بخط عريض، ثم ما يفعله الآن: آخر سطر نص خاص به (كلمات Claude، كما كُتبت، لا تُترجم أبدًا)، وإلا آخر أداة له كعبارة قصيرة تذكر ما يعمل عليه (Reading state.py وWriting final.md وSearching for …‎، أو الوصف الخاص بأمر ما)، وإلا المهمة التي أعطاها Claude للوكيل عند إطلاقه، وإلا آخر أداة له وحدها (Running a command وUsing TodoWrite)، وإلا النوع وحده. لذا يظل وكيلان من النوع نفسه يشغّلان أوامر بلا وصف يعرض كل منهما مهمته. والوكيل الذي توقف لينتظر وكلاء أطلقهم بنفسه يقول بدلًا من ذلك ‖ … بانتظار الوكلاء الذين شغّلهم.
  • الوكلاء في شجرة. الوكلاء الذين أطلقتهم الجلسة هم المستوى الأول. وكل وكيل أطلقه أحدهم، مهما كان عمقه، يُسرد تحته مباشرة، كلٌّ منهم بعد الوكيل الذي أطلقه مباشرة؛ والوكيل الذي أطلقه وكيل من المستوى الثاني يذكر ذلك الوكيل أولًا (ship-developer › ship-reviewer). أما بطاقة العمل فتذكر الوكيل نفسه بعد الوكيل الذي في الرأس (pipeline-runner › ship-reviewer). لا يوجد أبدًا أكثر من مستويين. الوكيل العامل في المستوى الثاني ليس له ○ خاص به: يرسم Telegram هناك نقطة تعداد. والوكيل الذي لا يعرف aipager بعدُ من أطلقه يظهر في المستوى الأول، لا تحت تخمين أبدًا، وينتقل تحت من أطلقه حين يُعرف.
  • ستة أسطر على الأكثر، الوكلاء الذين ما زالوا يعملون أولًا، ثم +N وكلاء آخرين للوكلاء الذين ليس لهم سطر. لا يظهر وكيل أبدًا دون الوكلاء الذين فوقه.
  • الوعد «عندما ينتهي عمل الوكلاء، تُرسل النتيجة إلى هنا.» لا يبقى إلا ما دام وكيل ما زال يعمل. والأوامر في الخلفية لا تحمله أبدًا: خادم التطوير قد لا ينتهي أبدًا.

يستقر سطر كل وكيل وحده حين يتوقف ذلك الوكيل، على ✓ 🤖 Explore · اكتمل (٠:٤٢) (مدة عمل ذلك الوكيل)، ويعدّ السطر الأول تنازليًا. والوكيل الذي يطلقه وكيل مسرود بعد إرسال الإجابة ينضم إلى الحالة تحته في التحديث التالي؛ أما الوكيل الذي تطلقه الجلسة نفسها لاحقًا فيُسرد تحت إجابة لاحقة. وحين ينتهي كل الوكلاء، تفسح الأسطر المجال لسطر واحد، مع المدة من الإجابة إلى نهاية آخر وكيل:

text
✅ انتهى عمل وكيلين (٦:١٢) · 🖥 أمر واحد في الخلفية (shell) قيد التشغيل

وحين ينتهي ذلك الأمر، ✅ انتهى عمل وكيلين (٦:١٢) · انتهى أمر واحد في الخلفية (shell) (٢:١٣:٠٥) (مدة عمل الأمر؛ وأُوقف حين أُنهي أو أوقفه Claude، وانتهى حين انتهى وحده، فاشلًا أو لا؛ وسطره في البطاقة يقول كيف). والإجابة التي ليس في عملها إلا أمر في الخلفية تعرض 🖥 أمر واحد في الخلفية (shell) قيد التشغيل، الذي يستقر على انتهى أمر واحد في الخلفية (shell) (…) أو أُوقف أمر واحد في الخلفية (shell) (…).

لا تُعدّ إلا أوامر الخلفية الخاصة بعمل الإجابة نفسه: خادم التطوير الذي تركته مهمة سابقة يعمل لا يُكرَّر تحت كل إجابة (والشريط المثبّت ما زال يعدّ كل أمر في الخلفية). ينهي ‎/stop العمل، لكن Escape لا ينهي أمرًا في الخلفية: الأمر الذي ما زال يعمل يبقى في الشريط المثبّت حتى ينتهي، ولا يُعدّ بعد ذلك تحت الإجابات اللاحقة؛ ومتابعته اللاحقة تبدأ عندها مهمة خاصة بها.

تُرسل تلك الإجابة لحظة انتهاء المهمة، رسالةً عادية (مع إشعار) ردًا على رسالتك، وهي النص نفسه الذي تعرضه الطرفية. وتبقى بطاقة العمل فوقها حالةً حية للعمل، في كل شكل: 🔄 name · لا يزال قيد العمل: وكيل واحد (general-purpose) · ١:١٨، مع زر إيقاف الخاص بها. وحين يبلّغ الوكلاء بنتائجهم، تصل إجابة Claude عن ذلك رسالةً جديدة مستقلة؛ ولا تُرسل الإجابة السابقة مرة أخرى أبدًا، حتى مع إعادة تشغيل aipager. والعمل الذي يبلّغ وكلاؤه أكثر من مرة ينتج إجابة لكل بلاغ، تُرسل كل منها حين تُكتب.

الوكيل الذي توقف بينما عمل خاص به في الخلفية ما زال يعمل يُعدّ عاملًا، لأنه يستأنف لاحقًا. والوكيل الذي بدأ وكيلًا خاصًا به ثم توقف لينتظره يُعرف من ذلك البدء (استدعائه هو الذي بدأ الوكيل الآخر): يبقى في الحالة عاملًا، ويُبقي العمل مفتوحًا، حتى يتوقف دون أن يكون أي من وكلائه الخاصين قيد العمل. وإذا لم يستأنف بعد دقيقتين من انتهاء آخرهم، لا يُعدّ قيد العمل بعد ذلك وتبقى الحالة كما عُرضت آخر مرة. ويقول ‎<task-notification>‎ الذي يرسله Claude عن وكيل الشيء نفسه في ملاحظة؛ ويقرؤها aipager حين يبدأ ذلك الإشعار مهمة، وكذلك حين يأخذه Claude في منتصف مهمة جارية ما دامت بطاقة العمل معروضة. وينتظر السطر بضع ثوانٍ قبل أن يظهر منتهيًا، لتتمكن تلك الملاحظة من استعادته أولًا. وتُضاف الحالة في كل شكل، بلغة الدردشة.

كيف تبقى محدّثة. يعدّل aipager الإجابة بصمت، فقط حين يتغير ما تعرضه الحالة، ومرة كل ٣٠ ثانية على الأكثر لكل إجابة (الإجابة نفسها تُحسب الأولى). كل إجابة لها حالة تبقى محدّثة بهذه الطريقة (حتى خمس منتظرة لكل جلسة). التعديلات منخفضة الأولوية: التعديل الذي ترفضه ميزانية الإرسال، أو الذي سيقع والإرسال إلى الدردشة موقوف، لا يُجرى، وتنتظر الحالة تغيّرها التالي. والتعديل الأخير، حين ينتهي كل شيء، يُجرَّب مرة أخرى بعد رفع الإيقاف أو حين ترفضه الميزانية، ثم يُترك. ولا يُجرى أي تعديل على إجابة محذوفة، أو لجلسة انتهت أو أُنهيت، أو حين يجعل الإجابة أطول مما يقبله Telegram (حين تُقص إجابة طويلة يُترك مكان للحالة).

تُترك الحالة كما ظهرت آخر مرة، ولا تتحول أبدًا إلى «انتهى»، حين لا يستطيع aipager معرفة أن العمل انتهى:

  • الوكيل الذي لا يسمع منه aipager شيئًا لمدة ٣٠ دقيقة (AIPAGER_SUBAGENT_SILENCE) لا يُعدّ عاملًا بعد ذلك، لكن الصمت ليس اكتمالًا؛
  • الأمر في الخلفية الذي يعمل أكثر من ساعتين (AIPAGER_BG_SHELL_MAX_TRACK) دون أن تُرى نهايته لا يُعدّ بعد ذلك؛
  • إعادة تشغيل aipager تنسى الإجابات المنتظرة.

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

الإجابة المحتجزة بسبب إيقاف الإرسال، أو المسلّمة نصًا عاديًا بعد فشل الإرسال المنسّق، تُرسل دون الحالة، وكذلك المهمة التي تنتهي دون نص إجابة (رأس فقط).

تأكيد الإنهاء#

يطلب ‎/kill وقائمة اختياره و⋮ ← ⏹ إنهاء الجلسة التأكيد دائمًا:

text
⏹ إنهاء jim؟ سيتوقف عمل Claude وتُغلق الجلسة.

  [⏹ إنهاء]  [إلغاء]

بعد ⏹ إنهاء تقول الرسالة ⏹ أُنهيت jim فوق جلسات هذه الدردشة المتبقية. والتأكيد المضغوط بعد أن بدأت الجلسة عملًا جديدًا يُرفض (بدأت jim عملًا جديدًا - …)، وكذلك التأكيد لجلسة بالاسم نفسه بدأت منذ ذلك الحين.

تثبيت ميزة الرسائل الصوتية (حين لا تكون مثبّتة)#

عند إرسال رسالة صوتية وaipager[voice] غير مثبّتة:

text
⚠️ تحتاج الرسائل الصوتية إلى حزمة اختيارية
   (نحو ٢٠٠ ميغابايت للتثبيت · ونحو ٧٤ ميغابايت للنموذج عند أول استخدام).

  [📦 تثبيت ميزة الرسائل الصوتية]  [إلغاء]

الضغط على التثبيت يشغّل أمر التثبيت المناسب لمثبّتك (uv tool install --reinstall aipager[voice]، أو pipx install --force، أو pip install faster-whisper احتياطًا) مع تعديل للرسالة كل ٥ ثوانٍ يبيّن أنه ما زال يعمل، ثم يعرض زر [🔄 إعادة تشغيل aipager] عند النجاح.

إعادة التشغيل#

🔄 إعادة تشغيل aipager:

  • ‏aipager الذي يعمل كخدمة مستخدم systemd يجدول systemctl --user restart aipager.service منفصلًا بعد ٥ ثوانٍ (بمؤقت دقيق حتى ثانية واحدة)، في خدمة مؤقتة خارج مجموعة عمليات aipager نفسه، لتبقى تعمل بعد خروجه. ويرفض ما دام ملف الخدمة سيُنهي جلساتك (KillMode غير process أو none)، ويطلب تشغيل aipager service install أولًا.
  • ‏macOS، حين يكون وكيل launchd مثبّتًا (‎~/Library/LaunchAgents/com.aipager.daemon.plist): launchctl kickstart -k gui/<uid>/com.aipager.daemon، حتى لـ aipager بدأته بنفسك.
  • وإلا فـ aipager الذي بدأته بنفسك (aipager start)، على Linux حتى حين تكون الخدمة مثبّتة أيضًا: يُنشئ بديلًا منفصلًا ينتظر خروج العملية الأم، ثم يشغّل الأمر نفسه الذي بدأ به aipager (ويذهب خرجه إلى سجل إعادة التشغيل الذاتي). ويتوقف aipager الحالي بشكل نظيف بمجرد أن يبدأ البديل العمل.

لا حاجة إلى SSH. ولإكمال تحديث aipager، يعيد زر 🔄 إعادة التشغيل الآن في بطاقة التحديث تشغيل aipager في مكانه بدلًا من ذلك، في الطرفية نفسها (يُنظر التحديث).

التحديث#

يرد ‎/update (للمشرفين فقط؛ وفي الوضع الشخصي لمالك البوت وحده) بزر واحد، 🔄 التحقق من التحديثات. لا يُبحث عن شيء حتى الضغط عليه. تعدّل الضغطة تلك الرسالة إلى سطر لكل منتج:

  • ‏aipager 1.0.1 ← 1.1.0 حين يوجد إصدار أحدث (الأحدث على PyPI)؛
  • ‏aipager 1.0.1 (أحدث إصدار) حين لا يوجد؛
  • ‏Claude Code 2.1.282 (تعذر التحقق) حين يفشل البحث (الشبكة معطلة، أو مهلة ٥ ثوانٍ، أو لم يُعثر على claude).

يُقارن Claude Code بأحدث إصدار في قناة تحديثه الخاصة (autoUpdatesChannel:‏ latest أو stable أو rc). وتحت الأسطر، بخط صغير، طريقة تثبيت aipager (مثل pipx, from PyPI أو pipx, from local path …‎؛ ودردشات المجموعات لا تعرض المسارات أبدًا).

إذا كان أي شيء أحدث، فهناك زر واحد يحدّث المنتجات التي لها تحديث فقط: تحديث aipager أو تحديث Claude Code أو تحديث الاثنين، مع إلغاء. وحين يُعرض تحديث aipager، تقول الرسالة أيضًا كيف تحدث إعادة التشغيل: إعادة التشغيل: تلقائية، حين لا تجري أي مهمة. أو إعادة التشغيل: يمكنك الضغط على «إعادة التشغيل الآن» بعد التثبيت. (لـ aipager دون خدمة، يُنظر أدناه) أو إعادة التشغيل: يدوية (السبب).

إذا كان إصدار أحدث من aipager مثبتًا بالفعل لكن aipager العامل ما زال القديم (تحديث انتهى دون إعادة تشغيل، أو pip install -U يدويًا)، يقول السطر aipager 1.1.0 مثبت وينتظر إعادة التشغيل (يعمل الآن 1.0.1). وتعرض الرسالة 🔄 إعادة التشغيل الآن بدلًا من تحديث: لا يُعرض «تحديث aipager» أبدًا لإصدار لا يحتاج إلا إلى إعادة تشغيل. ويُفحص الإصدار المثبت بتشغيل المفسّر الذي سيعيد aipager التشغيل فيه، لذا فالإصدار المثبت الذي لا يُحمَّل يقول ذلك (aipager 1.1.0 مثبت لكنه لا يُحمَّل. يمكنك إعادة تثبيته عبر …) ولا يعرض شيئًا. ويظل الإصدار المنشور الأحدث من المثبت يُعرض كتحديث. الإصدار الأحدث من aipager على تثبيت لا يمكن تحديثه من هنا (editable، أو Nix، أو Snap، أو حزمة نظام، أو حاوية، أو تثبيت مستخدم آخر) يُعرض مع السبب ولا يُعرض تحديثه. والأمر نفسه لإصدار أحدث من Claude Code مثبّت بـ npm في مجلد لا يستطيع مستخدمك الكتابة فيه (مثل sudo npm install -g تحت ‎/usr/lib/node_modules)، حيث لا يستطيع claude update إلا الفشل: يقول السطر لا يمكن التحديث من هنا: installed with npm into a folder your user can't write to; run "claude install" once to switch to Claude Code's own installer, then restart aipager. وإذا لم يكن هناك ما يمكن تحديثه، تقول الرسالة «كل شيء بأحدث إصدار.»، أو تذكر أن فحصًا فشل، أو، حين يوجد شيء أحدث لا يمكن تثبيته من هنا، «صدر تحديث، لكن لا يمكن تثبيته من هنا.»، مع زر التحقق مرة أخرى ودون زر تحديث.

لا يبدأ زر التحديث إلا ما عرضه الفحص. إذا كان الفحص أقدم من ١٠ دقائق، أو جرى تحديث آخر منذ ذلك، أو لم تعد الإصدارات تطابق الزر، يطلب إعادة الفحص بدلًا من ذلك. والأزرار من قائمة ‎/update أقدم (تحديث Claude Code / تحديث aipager / الاثنين لكل منتج على حدة) تجيب «هذه القائمة قديمة، يمكنك إرسال ‎/update مرة أخرى» ولا تفعل شيئًا. وكل ضغطة تعيد فحص قاعدة المشرفين.

تحديث Claude Code يشغّل claude update (بمسار مطلق، ومهلة ٥ دقائق) ويبلّغ Claude Code A ← B، أو «بأحدث إصدار بالفعل»، أو الفشل مع آخر مخرجاته. الجلسات الجارية تحتفظ بالإصدار القديم حتى إعادة تشغيلها (‎/restart)؛ ويسردها الرد. لا تُعاد تشغيل أي جلسة نيابة عنك. والجلسات الجديدة تستخدم الإصدار الجديد.

تحديث aipager (تحديث aipager، أو النصف الثاني من تحديث الاثنين، الذي يحدّث Claude Code أولًا):

  1. في تثبيت من PyPI هو بأحدث إصدار بالفعل، يقول ذلك ويتوقف.
  2. إذا كان aipager يستطيع إعادة تشغيل نفسه، ينتظر أولًا حتى لا يبقى شيء قيد التنفيذ: لا جلسة تشغّل مهمة، أو تنتظر سؤالًا، أو تشغّل وكيلًا في الخلفية، أو تعرض بطاقة عمل حية، أو تشغّل أداة، أو تحمل طلب إذن مفتوحًا، ولا إجابات محتجزة تنتظر رفع حد سرعة. تسرد الرسالة ما ينتظره، مع إعادة التشغيل الآن (تخطي الانتظار) وإلغاء. وبعد ١٠ دقائق يسأل مرة أخرى: الانتظار ١٠ د أخرى، إعادة التشغيل الآن، إلغاء. ودون رد لمدة ساعة، يلغي نفسه.
  3. يحدّث عبر المثبّت الذي يملك aipager الجاري (pipx upgrade aipager، أو uv tool upgrade aipager، أو brew upgrade aipager، أو ‎<venv>/bin/python -m pip install --upgrade aipager)، بمسار مطلق، ومهلة ١٠ دقائق. لا إلغاء ما دام المثبّت يعمل.
  4. يتحقق من أن الإصدار الجديد يُستورد في مفسّر جديد. التحديث الفاشل، أو الذي انتهت مهلته، أو الذي لا يُستورد، لا يعيد تشغيل شيء. والتحديث الذي انتهت مهلته أُوقف في منتصفه، لذا تحذّر الرسالة من أن التثبيت قد يكون ناقصًا وتعطي أمر إعادة التثبيت المطلوب تشغيله قبل إعادة التشغيل التالية. مخرجات المثبّت لا تُعرض إلا في الدردشة الخاصة؛ والمجموعة تحصل على «(المخرجات في سجل aipager)».
  5. إذا بدأت مهمة أثناء التحديث، ينتظر مرة أخرى.
  6. يجدول systemctl --user restart aipager.service منفصلًا بعد ٥ ثوانٍ (بمؤقت دقيق حتى ثانية واحدة)، وتقول رسالة الحالة ⏳ ثُبّت aipager A ← B، وتجري إعادة التشغيل…. وأثناء انتظار الخطوة ٥، تقول ⏳ ثُبّت aipager A ← B؛ وسيُعاد التشغيل حين تنتهي المهمة الحالية. بعد إعادة التشغيل، يعدّل aipager الجديد الرسالة نفسها إلى ✅ حُدّث aipager A ← B، وأُعيد ربط N جلسة (و⚠️ لم تعد: … لأي جلسة لم تعد). وإذا حُذفت الرسالة أو لم يعد ممكنًا تعديلها، ينشر النتيجة رسالةً جديدة في الدردشة التي طلبت.

في Mini App، يعرض الإعدادات ← التحديثات «تجري إعادة تشغيل aipager…‎» مع فانوس يدور حتى يجيب aipager الجديد، ثم «تم التحديث إلى B، وأُعيد ربط N جلسة.». ولا يعرض عدًّا تنازليًا أبدًا. وبعد نحو دقيقتين دون رد (لا قبل أن يكون aipager القديم قد استطاع الإبلاغ عن إعادة تشغيل لم تحدث) يقول «لا تزال إعادة التشغيل جارية، يمكنك إعادة فتح التطبيق بعد قليل.». ومع النفق المُدار في aipager، تحافظ إعادة التشغيل بعد التحديث على عنوان التطبيق (يتولى aipager الجديد النفق)، فتصمد الصفحة المفتوحة وتعرض «تم التحديث إلى B». وإذا تعذّر الاحتفاظ بالنفق في النهاية، تقول الصفحة «لا تزال إعادة التشغيل جارية، يمكنك إعادة فتح التطبيق بعد قليل.» بعد نحو دقيقتين. أما التحديث الذي بدأ من aipager لا يملك هذه الميزة (أو مع MINIAPP_KEEP_TUNNEL=0) فما زال يغيّر العنوان: بمجرد أن يتوقف aipager القديم عن الرد تقول الصفحة المفتوحة «أُعيد تشغيل aipager. حين تُعلن الدردشة اكتمال التحديث، يمكنك إعادة فتح التطبيق»؛ والحل إغلاقها وفتحها مجددًا من زر القائمة في الدردشة أو من ‎/app. وتسجيل الدخول في التطبيق يدوم ٥ دقائق، لذا فالصفحة المفتوحة منذ وقت أطول تقول «يمكنك إعادة فتح التطبيق لرؤية نتيجة التحديث.» بدلًا من ذلك.

بعد التحديث لا يعيد aipager تشغيل نفسه إلا حين يعمل كخدمة مستخدم systemd وكان في ملف تلك الخدمة KillMode=process (أو none). ومع KillMode غير آمن يُحدَّث aipager مع ذلك، وتقول الرسالة يلزم إعادة التشغيل: …: يمكنك تشغيل aipager service install أولًا (يسرد الجلسات التي ستُنهيها إعادة التشغيل).

إعادة التشغيل الآن، دون خدمة. يثبّت aipager الذي لا يعيد تشغيله أي مدير خدمات (aipager start في طرفية أو tmux، أو Docker، أو وكيل launchd على macOS) التحديثَ ثم يعرض يمكنك الضغط على «إعادة التشغيل الآن» لتشغيله (ينتظر aipager حتى لا تجري أي مهمة). مع زر 🔄 إعادة التشغيل الآن. الضغط عليه (للمشرفين فقط، مثل كل أزرار التحديث):

  1. يتحقق من أن aipager المثبت يُحمَّل (⏳ يجري فحص aipager المثبت…)؛ التثبيت المعطوب لا يعيد تشغيل أي شيء، والإصدار نفسه يقول إنه لا شيء يحتاج إلى إعادة تشغيل؛
  2. ينتظر، مثل إعادة التشغيل عبر systemd، حتى لا يبقى شيء قيد العمل، مع إعادة التشغيل الآن (لتخطي الانتظار) وإلغاء؛
  3. يتحقق من التثبيت مرة أخرى، ثم يقول ⏳ ثُبّت aipager A ← B، وتجري إعادة التشغيل… ويوقف aipager بالطريقة النظيفة (كما يفعل Ctrl+C)؛
  4. يشغّل aipager الجديد في مكانه: العملية نفسها، والأمر نفسه، والبيئة والمجلد نفسهما، في نافذة الطرفية أو tmux نفسها (وفي Docker، عملية الحاوية نفسها). وتستمر الجلسات في العمل. ويعدّل aipager الجديد الرسالة إلى ✅ حُدّث aipager A ← B، وأُعيد ربط N جلسة.

الضغطات المرسلة خلال الثواني القليلة لإعادة التشغيل تضيع، كما في أي إعادة تشغيل. والضغط على Ctrl+C أو docker stop أثناء إعادة التشغيل يغلب: يتوقف aipager ولا يبدأ من جديد. وإذا تعذّر تشغيل aipager الجديد في مكانه، تشغّله نسخة منفصلة بعد أن ينتهي القديم (يذهب خرجها إلى سجل إعادة التشغيل الذاتي، aipager.log في مجلد النسخة المثبتة أو ‎/tmp/aipager.log، ويذكر سجل aipager الأمر الذي عليك تشغيله إن لم تعد تلك النسخة)؛ وإذا فشل ذلك أيضًا، أو اختفى المفسّر نفسه، يخرج aipager بالرمز 1 ويقول سجل aipager restart.failed:‎ مع الأمر الذي عليك تشغيله.

حين لا يستطيع aipager إعادة تشغيل نفسه أبدًا، تعطي الرسالة الخطوات الدقيقة لإعدادك بدلًا من زر:

  • طرفية أو tmux: في نافذة الطرفية أو tmux التي يعمل فيها aipager، يمكنك الضغط على Ctrl+C، ثم تشغيل aipager start.
  • ‏macOS: على جهاز Mac، يمكنك تشغيل launchctl kickstart -k gui/<uid>/com.aipager.daemon.
  • ‏Docker: على الكمبيوتر الذي يعمل عليه Docker، يمكنك تشغيل docker restart <container>. (المعرّف القصير للحاوية حين يكون اسم مضيفها معرّفًا)، مع تذكير بأن إعادة إنشاء الحاوية من صورتها تعيد إصدار aipager الموجود في تلك الصورة.

يظهر إعادة التشغيل الآن أيضًا في نتيجة التحقق من التحديثات حين يكون إصدار أحدث من aipager مثبتًا وينتظر، وفي إشعار لمرة واحدة: حين تكون هوكات Claude Code (التي تبدأ من جديد مع كل حدث، من aipager المثبت) تشغّل بالفعل aipager أحدث من العامل، يتلقى المالك رسالة صامتة واحدة لكل إصدار أحدث ولكل تشغيل لـ aipager، ⚠️ تحديث aipager اكتمل نصفه فقط: …، مع الزر. تنتظر هذه الرسالة دقيقتين من أول تشغيل للهوكات بالإصدار الأحدث (إعادة التشغيل مباشرة بعد التثبيت لا تُظهرها أبدًا)، ثم حتى لا تجري أي مهمة في الدردشة الخاصة للمالك. وبعد إعادة التشغيل إلى ذلك الإصدار، يُعدَّل الإشعار إلى ✅ اكتمل تحديث aipager: أصبح aipager يعمل بالإصدار B الآن. دون الزر. وفي Mini App، يعرض الإعدادات ← التحديثات الحالة نفسها سطرًا فوق البطاقة، مع إعادة التشغيل الآن (يسأل أولًا).

في Mini App، التحديثات هي البطاقة الأولى في تبويب الإعدادات: اسمها، والإصدار العامل، وزر صغير التحقق من التحديثات في آخر السطر. فتح تبويب الإعدادات يتحقق وحده (مرة كل عشر دقائق على الأكثر، ولا يحدث أبدًا أثناء تحديث أو إعادة تشغيل aipager؛ والتحقق الذي يفشل هناك لا يقول شيئًا)، والضغط يتحقق دائمًا. وتبقى البطاقة سطرًا هادئًا واحدًا حتى يوجد ما يُفعل: الإصدار الأحدث يأتي بأسطره وبزر التحديث الواحد، و«كل شيء بأحدث إصدار.» سطر واحد بلا زر، والتحديث الجاري أو إعادة التشغيل أو إعادة التشغيل الآن تحتفظ بأزرارها.

لا يجري إلا تحديث واحد في كل مرة، عبر ‎/update، وبطاقة الإعدادات ← التحديثات في Mini App (التحقق نفسه، وزر التحديث الواحد نفسه، والعمل نفسه) وaipager update في سطر الأوامر. ويشمل ذلك الثواني بين «ثُبّت، وتجري إعادة التشغيل…» وإعادة التشغيل نفسها: يجيب ‎/update بأن aipager على وشك إعادة التشغيل، ولا يعرض Mini App أزرارًا، ويرفض زر إعادة تشغيل aipager في ميزة الرسائل الصوتية ما دام تحديث يجري أو ينتظر إعادة التشغيل. وإذا ظل aipager يعمل بعد دقيقتين من جدولة إعادة تشغيله، يوقف مؤقت إعادة التشغيل المنتظر، ويحرر قفل التحديث، ويطلب إعادة تشغيله يدويًا.

إذا توقف aipager بينما يعمل مثبّت، يُعطى المثبّت ٣ ثوانٍ لينتهي ثم يُوقف (وإلا لاستمر في كتابة التثبيت بينما يبدأ aipager التالي). وتقول رسالة الحالة، وبعد إعادة التشغيل رسالة جديدة، إن التثبيت قد يكون ناقصًا وكيف يُصلح.

بمجرد أن يبدأ الإيقاف، لا يُعاد تشغيل شيء ولا يبدأ شيء جديد: تجيب أزرار ‎/update بأن aipager يتوقف، ويجيب Mini App بـ 503، ولا يُشغَّل أي مثبّت أو فحص إصدار. والمثبّت الذي ينتهي خلال ثوانيه الثلاث يُحتسب. تقول رسالة الحالة إن الإصدار الجديد مثبّت ولم يُعَد تشغيل شيء، ويعلن البدء التالي ✅ حُدّث aipager A ← B. وaipager الذي أُوقف بـ aipager service stop يبقى متوقفًا. ونصيب التحديث من الإيقاف لا يتجاوز ٨ ثوانٍ في المجموع.

الرسائل الحرة#

النص#

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

التفاعل على رسالتك يتبعها، كما يتحول لون الرسالة المنتظرة في Claude Code نفسه من الرمادي إلى الأبيض:

  • 👀: سُلّمت إلى الجلسة (أو محتجزة، يُنظر أدناه)، لكن Claude لم يأخذها بعد. والرسالة المرسلة أثناء مهمة جارية تبقى 👀 ما دامت تنتظر في قائمة انتظار Claude.
  • 👍: أخذها Claude: بدأ بها مهمة، أو ضمها إلى المهمة الجارية، أو سلّمها إلى وكيل في الخلفية يعمل.
  • 🤷: لن تُؤخذ أبدًا: رسالة محتجزة حذفها ‎/stop أو ‎/clearqueue أو ‎/kill، أو تعذّر إرسالها عند تحريرها؛ أو رسالة أو أمر ما زال ينتظر حين حذفه ‎/stop أو ‎/clearqueue أو ‎/kill أو انتهاء الجلسة (لا ‎/clear ولا ‎/resume)؛ أو رسالة رفضها Claude Code (يُنظر أدناه). الرسائل التي وضعها Claude في قائمة انتظاره لا تُعلَّم إلا ما دام aipager يرى تلك القائمة (فحص سجل المحادثة الحي يعمل ولا عمل في الخلفية ينتظر)؛ وإلا فتبقى 👀. وEscape في الطرفية يعيد قائمة انتظار Claude إلى حقل الإدخال، حيث قد تُرسل مرة أخرى، لذا فالرسالة المحذوفة بتلك الطريقة تبقى 👀 أيضًا.
  • 👌: أمر من Claude Code نُفّذ (يُنظر أدناه)، أو تأكيد aipager لـ ‎/stop.

التفاعل لا يتحرك إلا إلى الأمام، لذا تحصل الرسالة على ثلاثة على الأكثر، كل منها مرة واحدة. والتفاعل الذي يقع أثناء حظر Telegram بسبب حدود السرعة يُتخطى، ولا يُعاد لاحقًا، وعملية التنظيف الواحدة لا تعلّم إلا أحدث عشر رسائل تحذفها.

أزرار الأوامر (تلخيص المحادثة، ‎/model …‎): إذا ضُغطت والجلسة جاهزة، يحصل الأمر على 👌 فورًا؛ فـ Claude Code يشغّله عند Enter، والأمر المحلي مثل ‎/model لا يطلق أي هوك يمكنه قول ذلك لاحقًا. وإذا ضُغطت أثناء مهمة جارية (لا ‎/model: فهو مرفوض حتى تنتهي المهمة، يُنظر تبديل نموذج جلسة جارية)، يبقى 👀 حتى تنتهي تلك المهمة (عاديًا، أو كتوقف مؤقت لعمل في الخلفية، أو بسبب خطأ في الواجهة البرمجية) ثم 👌؛ وإذا حذفه قبل ذلك ‎/stop أو ‎/clearqueue أو ‎/kill أو انتهاء الجلسة، فلم يعمل أبدًا: 🤷. وحين يضعه Claude Code في قائمة الانتظار كرسالة بدلًا من ذلك، يتبع مسار 👀 ← 👍. والرسالة الصوتية تحصل على التفاعلات نفسها التي للنص بمجرد إرسال نصها.

بطاقة العمل ثم الإجابة تتبعان الرسالة التي استهلكها Claude فعلًا لمهمة (التي بدأ بها حين كانت الجلسة جاهزة، أو التي ضمها إلى المهمة الجارية)، لا مجرد آخر رسالة أرسلتها أبدًا. إرسال متابعة في منتصف المهمة لا «يقفز بالرد» إليها: إذا ضمها Claude إلى الإجابة التي تتكون، تقفز البطاقة إليها لحظة حدوث ذلك؛ وإذا أنهى Claude أولًا ثم أخذها، تبقى الإجابة الأولى تحت الرسالة الأولى وتحصل المتابعة على مهمتها الخاصة، ببطاقتها وإجابتها تحتها.

إذا رفض Claude Code رسالة تمامًا (أمر شرطة مائلة غير معروف، أو أمر مدمج لا يفعل إلا فتح مربع حوار في الطرفية)، لا ينطلق أي هوك، فلا شيء سينهي المهمة التي أعلنها aipager للتو. بعد ٨ ثوانٍ دون أي هوك (PROMPT_HOOK_GRACE_SECONDS) تصبح بطاقة العمل ⚠️ name · لم يستلم Claude Code الرسالة مع شرح من سطر واحد، وتعود الجلسة جاهزة؛ والسبب على الطرفية، والرسالة تحصل على 🤷 (وأمر الشرطة المائلة يحصل على 👌 بدلًا من ذلك: الأمر المدمج الذي يفتح مربع حوار لا يطلق أي هوك أيضًا). ولا يُحكم بهذه الطريقة إلا على رسالة بدأت مهمة؛ والرسالة المنتظرة خلف مهمة جارية تحتفظ بـ 👀 حتى يأخذها Claude أو تُحذف.

ثلاث حالات تُحتجز بدل إرسالها، وتُسلَّم تلقائيًا بعد زوالها:

  • طلب إذن أو سؤال مفتوح، طوال بقائه مفتوحًا (لا حدّ زمنيًا لذلك): وإلا لقُرئ نصك إجابةً عن ذلك المربع. تتلقى رسالتك الأولى عندها ردًا واحدًا تحت الطلب يقول إن Claude لا يزال بانتظار إجابتك (أما الرسائل التالية فتتلقى 👀 فقط). وبمجرد الإجابة، في Telegram أو في الطرفية، تصل الرسائل المحتجزة إلى Claude بالترتيب الذي أُرسلت به ويُحذف ذلك الرد. وإذا انتهت الجلسة والطلب لا يزال مفتوحًا، تُسقط مع 🤷.
  • (وضع الفريق) رسالة شخص آخر ما زالت تنتظر أن تُؤخذ.
  • (وضع الفريق) مهمة شخص آخر جارية، بما في ذلك وكيل في الخلفية بدأته. والمهمة المكتوبة في الطرفية تُحسب للمالك، لذا لا تنضم إليها إلا رسالة المالك (أو، في الدردشة الخاصة، رسالة عضوها).

الحالتان الأخيرتان تُبقيان رسائل أشخاص مختلفين خارج مهمة واحدة، لتعمل كل منها بصلاحيات مرسلها. وإذا انضمت إحداها رغم ذلك (مثل مرسل لا يعرفه aipager، ولا يُحتجز أبدًا)، تعمل المهمة بأشد قواعد كل من فيها (يُنظر المجموعات). وإذا أُوقفت المهمة التي تنتظرها رسالة، أو توقفت بسبب أداة ممنوعة، تُحذف الرسائل المحتجزة مع 🤷.

الرسائل المحتجزة محدودة بـ ٥٠ لكل جلسة وتنتهي صلاحيتها بعد ٢٤ ساعة؛ ويحذفها ‎/clearqueue مع كل ما يحتجزه Claude.

إرسال رسالة منتظرة فورًا#

الرسالة المرسلة بينما يعمل Claude على مهمتك أنت تذهب إلى Claude فورًا (لا يحتجزها aipager) وتنتظر في قائمة انتظار Claude حتى تنتهي الخطوة الحالية. وبمجرد أن تُظهرها قائمة انتظار Claude، يرد aipager تحتها:

text
⏳ في قائمة الانتظار - سيقرؤها Claude بعد هذه الخطوة
[⚡ إرسال الآن]

لكل رسالة منتظرة سطرها الخاص، ويختفي كل سطر، مع 👍 الخاصة به، لحظة أخذ Claude لتلك الرسالة. والرسالة التي يأخذها Claude قبل أن يُرى سجلها في قائمة الانتظار لا تحصل على سطر، بل على 👀 ثم 👍 فقط.

الضغط على ⚡ إرسال الآن (أو إرسال ‎/now) يضغط مفاتيح الإرسال الفوري في Claude Code نفسه (Ctrl+X، ثم Ctrl+S) في تلك الجلسة. عندها يقرأ Claude كل ما في قائمة انتظاره دفعة واحدة، لا الرسالة المضغوطة فقط. وما يحدث للعمل الجاري يقرره Claude Code: الأمر أو الوكيل الجاري يستمر في الخلفية؛ وإذا كان Claude في منتصف كتابة رد، يُقطع ذلك الرد ويُعاد بدؤه مع رسالتك. وأي نوع آخر من الخطوات (أداة أخرى مثلًا) قد يُقطع أيضًا، بعد مهلة قصيرة. وفي بعض الحالات (مثلًا حين تكون مهام الخلفية في Claude Code معطّلة) يعود الإرسال الفوري إلى مجرد إيقاف للخطوة الجارية. كل هذا سلوك الإرسال الفوري في Claude Code نفسه، لا شيء يقرره aipager.

تجيب الضغطة أُرسلت إلى Claude الآن وتختفي كل الأسطر دفعة واحدة، لأن الإرسال الفوري يسلّم Claude كل ما يحتجزه؛ ويزيلها ‎/now بالطريقة نفسها، ولا يأتي سطر للرسائل التي أرسلها «إرسال الآن» (والرسالة المرسلة بعده تحصل على سطرها). وإذا ألغى Claude الخطوة الجارية بدل نقلها إلى الخلفية، فلا يأخذ فورًا إلا أقدم رسالة منتظرة ويقرأ البقية في خطوته التالية؛ وتأتي الإجابة تحت الرسالة التي أخذها، ولا تعمل تلك الرسالة مرة ثانية. وإذا استغرقت المفاتيح أكثر من لحظة للوصول إلى Claude (كمبيوتر مشغول)، تجيب الضغطة يجري الإرسال إلى Claude بدلًا من ذلك؛ ثم يختفي السطر بمجرد وصولها، أو، إن تعذّر توصيلها، يبقى ويقول ⏳ في قائمة الانتظار - لم تصل إلى Claude؛ يمكنك الضغط على «إرسال الآن» مرة أخرى، مع زره، لإمكان الضغط مرة أخرى. ولا تُضغط المفاتيح إلا حين يُظهر سجل محادثة Claude أنه ما زال يحتجز الرسالة؛ وإلا تجيب الضغطة أخذها Claude بالفعل وتزيل السطر. ويُرفض، دون ضغط أي شيء، ما دام طلب إذن أو سؤال مفتوحًا (يمكنك الرد على السؤال المفتوح أولًا)، وما دام Claude ربما فتح للتو طلبًا لم يعرضه aipager بعد (أحداث المهمة الجديدة تُحتجز ما دامت إجابة المهمة السابقة قيد التسليم: غير ممكن الآن، يمكنك المحاولة بعد قليل)، وما دام aipager في منتصف كتابة رسالة أخرى في الجلسة (aipager يكتب رسالة الآن، يمكنك المحاولة بعد قليل). كل من يحق له إرسال الرسائل إلى الجلسة يستطيع استخدام الزر و‎/now؛ أما عضو read_only فلا.

يختفي السطر وحده حين تغادر رسالته قائمة انتظار Claude: يأخذها Claude (ضمًّا إلى المهمة الجارية، أو تسليمًا إلى وكيل في الخلفية، أو بدءًا للمهمة التالية)، أو يعيد Escape في الطرفية قائمة الانتظار إلى حقل الإدخال، أو يحذفها ‎/stop أو ‎/clearqueue أو ‎/kill أو ‎/restart أو إيقاف أمان أو انتهاء الجلسة. وإعادة تشغيل aipager تزيل أي سطر ما زال ظاهرًا.

هذه الأسطر لا تنتظر مدير حدود السرعة أبدًا: تُرسل وتُزال فورًا حتى في دردشة مشغولة أو بطيئة، وفي الوضع الأدنى. فقط ما دام Telegram نفسه أوقف الإرسال إلى الدردشة لا يُرسل أي سطر (و‎/now يظل يعمل عندها)، وإذا طلب Telegram للتو من aipager الإبطاء، ينتظر السطر الثواني القليلة التي طلبها. كل رسالة منتظرة تكلّف طلبًا واحدًا إلى الدردشة لسطرها؛ والأسطر التي تذهب معًا تُزال بطلب واحد.

الملفات#

تُنزَّل الملفات المرفوعة إلى مجلد خاص بالدردشة التي جاءت منها، ‎/tmp/aipager-files/<chat>/‎ (باسم ‎<time>_<file name>‎؛ و‎<chat>‎ اسم مصنوع من معرّف الدردشة وتوكن البوت، لا يكشف معرّف الدردشة). لا يقرأ هذه المجلدات إلا المستخدم الذي يعمل aipager بصفته (0700، والملفات 0600)، ولا تستطيع مهمة عضو في دردشة قراءة الملفات المرفوعة في دردشة أخرى أو البحث فيها أو الكتابة فيها (يُنظر الأمان). الملفات التي سبقت هذا التغيير تبقى في مكانها، مباشرة في ‎/tmp/aipager-files/‎؛ لا يُنقل شيء ولا يُحذف، ويضيّق aipager صلاحية المجلد إلى 0700 عند بدئه، فلا يصل إليها إلا ذلك المستخدم. توكن البوت الجديد يعطي كل دردشة مجلدًا جديدًا، والملفات المرفوعة قبله تبقى في المجلدات القديمة، التي لم تعد مهمة العضو تستطيع قراءتها. مجلد التنزيل الذي يكون رابطًا رمزيًا، أو يملكه مستخدم آخر، يُرفض ويفشل الرفع. ويُعرض المسار على claude: مع تعليق، تكون الرسالة التعليق متبوعًا بالمسار (أو المسارات)؛ ودون تعليق تكون مجرد check this: <path>‎ (أو check these: <paths>‎ للألبوم)، فيُوجَّه claude إلى الملف دون أن يُقال له ما يفعل به. التعليق الذي يبدأ بـ ‎/<label>‎ يختار الجلسة، تمامًا كما يفعل ‎/<label> <prompt>‎ للنص، وتُحذف التسمية من الرسالة: ‎/api وحده يرسل check this: <path>‎ إلى api، و‎/api compare these يرسل compare these <paths>‎ إلى هناك. لا يوجّه إلا ‎/<label>‎ في البداية؛ والشرطة المائلة لاحقًا في التعليق مجرد نص. والتسمية التي لا تجيب عنها أي جلسة تُرفض بـ ⚠️ لا توجد جلسة بهذا الاسم ولا يُرسل شيء. حد تنزيل الملفات في بوتات Telegram البالغ ٢٠ ميغابايت يُطبَّق مسبقًا؛ والملفات الكبيرة جدًا تحصل على رفض واضح قبل أي محاولة تنزيل. والتنزيل الذي يصادف خطأ شبكة عابرًا يُجرَّب حتى ثلاث مرات في المجموع (بانتظار ثانية، ثم ثانيتين) قبل ظهور خطأ، وذلك الخطأ يسمّي الملف. والألبوم (عدة صور أو مستندات مرسلة كرسالة واحدة) يُسلَّم إلى claude رسالةً واحدة (التعليق، ثم كل مسار ملف بالترتيب) بمجرد وصول آخر عنصر فيه؛ وإذا تعذّر تنزيل عنصر، تُرسل البقية، مع ملاحظة واحدة تسمّي العنصر الناقص.

الملفات التي يرسلها Claude#

يستطيع Claude أن يرسل إليك ملفات من جلسته: يكفي أن تطلب ذلك بكلماتك («أرسل لي لقطة الشاشة»، «أرسل لي الصورة الموجودة في ‎~/proj/chart.png»)، أو يرسل ملفًا بنفسه حين يرى أنك تحتاج إليه. يستخدم لذلك أداة SendUserFile في Claude Code (الإصدار 2.1.301 أو أحدث)، وهي متاحة في كل جلسة يبدؤها aipager: يبدأ aipager الجلسة مع CLAUDE_CODE_ATTACHMENTS_BY_PATH=1 ويُخبر Claude بأن الأداة موجودة. الجلسة التي بدأت قبل أن يدعم aipager هذه الميزة لا تحصل على الأداة إلا بعد إعادة تشغيلها: ‎/restart، أو تبديل وضع يُعيد تشغيلها، أو الاستئناف.

  • تصل الملفات بعد إجابة المهمة، ردًّا عليها (أو ردًّا على رسالتك حين لا تكون للمهمة إجابة)، من دون صوت إشعار، وفي دردشة الجلسة نفسها فقط. وما دامت المهمة تعمل، تعرض بطاقة العمل 📎 ملفان قيد الإرسال.
  • يُرسل كل ملف بحسب محتواه لا اسمه: الصورة كصورة إن كانت ضمن حدود الصور في Telegram (١٠ ميغابايت كحد أقصى، ومجموع العرض والارتفاع ١٠٬٠٠٠ كحد أقصى، والضلع الأطول ٢٠ ضعف الأقصر كحد أقصى)، وإلا كملف؛ وملف GIF كصورة متحركة؛ وMP4 كفيديو؛ وMP3 أو M4A كملف صوتي؛ وكل ما عدا ذلك كملف. وحين يطلب Claude مرفقًا عاديًا، يُرسل كل شيء كملف.
  • من ٢ إلى ١٠ صور ومقاطع فيديو تُرسل كألبوم واحد؛ والملفات مع الملفات والصوت مع الصوت؛ والصورة المتحركة وحدها. وإن زاد العدد تُقسَّم بالتساوي (تُرسل ١١ كـ ٦ و٥)، ولا يتجاوز أي ألبوم ٥٠ ميغابايت.
  • التعليق هو ‎💬 <session>‎، ويليه تعليق Claude نفسه في السطر التالي من الرسالة الأولى، بحد أقصى ١٬٠٢٤ حرفًا.
  • يُفحص كل ملف أولًا، للجميع بمن فيهم المالك (الأمان): لا تُرسل أبدًا إعدادات aipager ولا بيانات اعتماد Claude ولا المفاتيح ولا الملفات التي تبدو أسرارًا؛ ويجب أن يكون الملف ملفًا عاديًا غير فارغ وحجمه ٥٠ ميغابايت كحد أقصى؛ ولا يرسل العضو إلا ملفات داخل المجلد الجذر للدردشة. وإن رُفض ملف واحد من طلب ما، لا يُرسل شيء من ذلك الطلب: يعرف Claude السبب ويُخبرك به، وتستمر المهمة.
  • يرسل aipager نسخة خاصة أخذها لحظة قرأ Claude Code الملف، محفوظة في ‎~/.local/state/aipager/outbox/‎ وتُحذف فور إرسالها، أو بعد يوم.
  • لا يضع aipager حدًّا للعدد من عنده: يجري الإرسال بوتيرة حدود Telegram، ويُحسب الألبوم واحدًا لكل ملف. وما دامت الدردشة مكتومة، تنتظر الملفات ثم تصل بعد الإجابة.
  • الملف الذي يتعذّر إرساله يحصل على سطر واحد في الدردشة، مثل ⚠️ تعذّر إرسال report.pdf: رفضه Telegram. والملف الذي لا يجد aipager طلبه في سجل محادثة Claude نفسه لا يحصل على أي سطر (الأمان). والملف الذي يوجد طلبه هناك لكن aipager لا يستطيع ربطه بالمهمة الجارية يحصل على ⚠️ تعذّر إرسال report.pdf: لم يتمكن aipager من التأكد من أن Claude أرسله ضمن هذه المهمة. وتأتي الملفات أيضًا من رسالة ترسلها أثناء عمل Claude فيأخذها بعد ذلك، ومن مهمة يُبقيها hook من نوع Stop مستمرة (‎/goal). ولكل ملف أُرسل أو رُفض أو فشل إرساله سجل خاص في سجل التدقيق.

الرسائل الصوتية#

تمر الرسائل الصوتية عبر faster-whisper (الحزمة الإضافية aipager[voice]). يُحوَّل الصوت إلى نص محليًا، ويُعاد عرضه بالشكل 🎙️ سمعت: …، ويُكتب كأنك كتبته، بما في ذلك اسمًا لـ ‎/new أو لإعادة تسمية منتظرة. والرسالة الصوتية التي تتجاوز حد تنزيل البوت في Telegram البالغ ٢٠ ميغابايت تُرفض. يُنظر الهوكات ← UserPromptSubmit لما يحدث بعد ذلك.


سطر الأوامر: كل الأوامر#

‏aipager <command> --help يعرض القائمة نفسها على كمبيوترك.

الأمرماذا يفعل
aipager configمعالج الإعداد التفاعلي: توكن البوت، والدردشات، والأعضاء والأدوار، وهوكات Claude Code. يُشغَّل مرة أخرى لتغيير أي شيء (يُنظر المجموعات).
aipager setupالإعداد الأول نفسه دون أي سؤال، للسكربتات ووكلاء البرمجة (يُنظر أدناه).
aipager startتشغيل aipager في الواجهة. يرفض البدء ما دام aipager آخر يعمل.
aipager service install [--yes]تثبيت aipager كخدمة خلفية (خدمة مستخدم systemd على Linux، ووكيل launchd على macOS) وتشغيله. يتخطى ‎--yes السؤال حين يختلف ملف الخدمة المثبّت.
aipager service start|stop|status|logs|uninstallتشغيل الخدمة، أو إيقافها، أو عرضها، أو متابعة سجلها، أو إزالتها.
aipager status [--json]aipager وكل جلسة بنظرة واحدة: الحالة، والنموذج، والسياق، والتكلفة، وحالة حدود السرعة في Telegram.
aipager logs [-f] [-n LINES]سجل aipager (journald على Linux، وسجل launchd على macOS): آخر ١٠٠ سطر، أو ‎-n سطر؛ و‎-f للمتابعة.
aipager doctor [--fix] [--safety-check] [--json]فحوص السلامة (يُنظر حل المشكلات). يعرض ‎--fix إصلاح بيانات اعتماد Claude وتثبيت claude الملتبس، بعد السؤال؛ ويطبع ‎--safety-check قواعد الأمان السارية؛ و‎--json للسكربتات (يُنظر أدناه).
aipager session <name> [claude args]بدء جلسة Claude Code باسم ‎<name>‎ تحت dtach في المجلد الحالي، أو الاتصال بها إن كانت تعمل. الوسائط بعد الاسم (أو بعد --) تذهب إلى claude كما هي، مثل ‎--resume. يحتاج إلى aipager يعمل.
aipager session ls [-a] [--json]سرد الجلسات؛ و‎-a يشمل المنتهية. وأيضًا aipager session list.
aipager session kill <name> [-y]إنهاء جلسة، بعد سؤال ما لم يكن ‎-y.
aipager resume [name]إعادة جلسة منتهية مع محادثتها؛ ودون اسم، قائمة اختيار.
aipager miniapp enable [--port PORT] [--url URL]تفعيل Mini App، على ‎127.0.0.1:PORT (الافتراضي 8765)، خلف النفق المُدار أو عنوان https://‎ خاص بك. يسري عند إعادة التشغيل التالية لـ aipager.
aipager miniapp disable|statusإيقافه (عند إعادة التشغيل التالية)، أو عرض إعداداته وعنوانه.
aipager policy validateفحص policy.yaml (وpolicy.d)؛ ويخرج برمز غير صفري عند وجود مشكلة.
aipager updateتحديث aipager عبر المثبّت الذي يملكه (uv،‏ pipx،‏ Homebrew،‏ pip). لا يعيد تشغيل aipager أبدًا؛ إعادة التشغيل تكون يدويًا، أو عبر ‎/update في Telegram، الذي يستطيع ذلك (يُنظر التحديث).
aipager report [--note TEXT]عرض تقرير مشكلة وإرساله عند الموافقة (يُنظر أدناه).
aipager uninstall [-y]إيقاف aipager وإزالته مع إعداده، مع الاحتفاظ ببياناته (يُنظر أدناه).
aipager version،‏ aipager --versionطباعة الإصدار.
aipager help [command]مساعدة لـ aipager أو لأمر واحد.

سطر الأوامر: aipager setup (لوكلاء البرمجة)#

الأقسام أعلاه تصف بوت Telegram. وهذا القسم يصف أمرًا يُشغَّل في طرفية، أو يشغّله سكربت أو وكيل البرمجة لديك: يُعدّ aipager setup برنامج aipager دون أي سؤال ويعطي النتيجة نفسها التي يعطيها التشغيل الأول لـ aipager config.

sh
# 1. إيجاد معرّف الشخص في Telegram (يفتح البوت ويضغط Start)
aipager setup detect-chat --token-file ~/bot-token.txt --json
# 2. بعد أن يؤكد أنه هو، إعداد aipager
aipager setup --token-file ~/bot-token.txt --chat-id 123456789 --service --json
# 3. فحص التثبيت
aipager doctor --json

ما يفعله، بهذا الترتيب: يقرأ توكن البوت، ويتحقق منه لدى Telegram (getMe)، ويفحص كل شيء على هذا الكمبيوتر دون كتابة (الإعداد الموجود، والاعتماديات، و‎~/.claude/settings.json، وهل يعمل aipager)، ويرسل رسالة اختبار واحدة إلى الشخص («aipager is set up for you. ...»)، ولا يكتب إلا بعد ذلك. الملفات المكتوبة، كما يكتبها المعالج:

  • ‏‎~/.config/aipager/aipager.yaml (الصلاحية 0600): bot_token ونطاق دردشة خاصة واحد عضوه الوحيد هو الشخص (label: owner، بدور owner أو admin).
  • ‏‎~/.claude/settings.json: هوكات aipager وstatusLine (يُنسخ الملف الموجود احتياطيًا إلى settings.json.bak.<time>‎ حين يتغير).
  • يحصل سجل التدقيق على سجل grant-owner حين يصبح أحد مالكًا.
  • مع ‎--service، خدمة الخلفية (مثل aipager service install --yes).
  • في تثبيت config.env قديم فقط (لا aipager.yaml بعد)، الترحيل الذي يجريه المعالج: نسخة config.env.bak.<time>‎ (وteam.yaml.bak.<time>‎ حين يوجد team.yaml)، وملف ‎~/.config/aipager/policy.yaml مبدئي حين لا يوجد. أما config.env نفسه فيُترك كما هو.

إذا فشل أي فحص، لا يُرسل شيء ولا يُكتب شيء. وحين يكون aipager يعمل من قبل، يُعاد تحميل تغيير الدردشة أو الدور مباشرة؛ أما توكن البوت الجديد فيحتاج إلى إعادة تشغيل (aipager service stop، ثم aipager service start)، لا يجريها setup بنفسه أبدًا، ويُتخطى ‎--service. وإذا لم يستطع setup معرفة هل يعمل aipager، يتصرف كما لو كان يعمل (التحذير daemon_unknown): لا يثبّت الخدمة عندها أبدًا، فلا يستطيع أبدًا إعادة تشغيل aipager يعمل، وبعد أي تغيير لا يرسل إعادة تحميل ويبلّغ restart_needed: true بدلًا من ذلك.

خيارات aipager setup#

الخيارالمعنى
‎--token-file PATHقراءة توكن البوت من هذا الملف (٤٠٩٦ بايت على الأكثر؛ ولا بأس بنص حول توكن واحد). الملف الذي يستطيع مستخدمون آخرون قراءته يعمل لكنه يعطي التحذير token_file_shared:‏ chmod 600 له، أو حذفه بعد نجاح الإعداد.
‎--token-stdinقراءة توكن البوت من stdin (أنبوب أو ملف معاد توجيهه، لا طرفية أبدًا). يجب أن يُغلق الأنبوب: ينتظر setup نهاية stdin ٣٠ ثانية على الأكثر، ثم يخرج بالرمز 2 مع token_stdin_timeout. كلٌّ من printf '%s\n' "$TOKEN" | aipager setup --token-stdin ...‎ و‎< token.txt يغلقه.
‎--chat-id Nمطلوب. معرّف مستخدم Telegram الرقمي للشخص، وهو أيضًا معرّف دردشته الخاصة. والمجموعات تُضاف بـ aipager config.
‎--role owner|adminدور الشخص (الافتراضي owner).
‎--serviceتثبيت خدمة الخلفية وتشغيلها أيضًا (يُتخطى ما دام aipager يعمل).
‎--forceالسماح باستبدال توكن البوت، أو الدردشة الخاصة للمالك، أو دور تثبيت موجود. ونطاقات المجموعات والدردشات الخاصة الأخرى تبقى.
‎--dry-runتشغيل كل فحص، دون إرسال شيء ودون كتابة شيء، والإبلاغ عما سيتغير.
‎--jsonطباعة كائن JSON واحد بالضبط على stdout؛ وكل ما عداه إلى stderr.

يُعطى واحد بالضبط من ‎--token-file و‎--token-stdin. لا يُقبل التوكن أبدًا قيمةً لخيار: ‎--token و‎--bot-token مرفوضان (token_on_command_line) ولا تُعرض القيمة. والخيارات المختصرة (‎--token-f،‏ ‎--dry) غير مقبولة. لا يسأل setup أي سؤال أبدًا، ولا يحتاج أبدًا إلى طرفية، ولا يقرأ التوكن أبدًا من متغير بيئة.

إعادة التشغيل بالتوكن والدردشة والدور أنفسها لا تغيّر شيئًا وتقول ذلك (unchanged، دون رسالة اختبار). وتوكن أو دردشة أو دور مختلف في تثبيت موجود يخرج بالرمز 6 حتى إضافة ‎--force. وتثبيت config.env القديم يُرحَّل أولًا، كما يفعل المعالج (يعطي الدور admin، لذا يحتاج ‎--role owner فيه إلى ‎--force).

aipager setup detect-chat#

sh
aipager setup detect-chat (--token-file PATH | --token-stdin) [--timeout SECONDS] [--json]

ينتظر أحدث رسالة خاصة إلى البوت (الضغط على Start يرسل واحدة) ويطبع مرسلها: المعرّف، والاسم، واسم المستخدم. لا يحفظ شيئًا، لذا يُعرض الشخص على المستخدم ولا يُشغَّل aipager setup --chat-id إلا بعد تأكيده. لا تُحسب إلا الرسائل المرسلة قبل بدء الأمر بـ ١٠ دقائق على الأكثر. ‎--timeout من 0 إلى 3600 ثانية (الافتراضي 300؛ و0 يعني نظرة واحدة). يقرأ Telegram دون تأكيد أي رسالة، فيبقى ‎/start متاحًا للمعالج ولـ aipager.

ما دام aipager للبوت نفسه يعمل، فإنه يحتجز رسائل البوت، ولا يسجّل الرسائل الخاصة من أشخاص غير مُعدّين بعد. عندها يخرج detect-chat بالرمز 9 (source: "daemon"‎): إيقاف aipager (aipager service stop) وتشغيله مرة أخرى، أو طلب المعرّف الرقمي من الشخص. ومع aipager لبوت مختلف، يقرأ Telegram مباشرة (source: "telegram"‎).

حد: لأن detect-chat لا يؤكد أي رسالة أبدًا، لا يعرض له Telegram إلا أقدم ١٠٠ تحديث غير مقروء خلال آخر ٢٤ ساعة. حين يكون لدى البوت هذا العدد منتظرًا، لا يمكن رؤية ‎/start جديد: عندها تنتهي مهلة detect-chat (الخروج 8) مع التحذير updates_backlog، ولا يفيد الضغط على Start مرة أخرى. البديل طلب معرّف Telegram الرقمي من الشخص (أو تشغيل aipager مرة واحدة، فيقرأ المتراكم ويمسحه).

رموز الخروج#

الرمزerrorالمعنى
0نجاح (installed أو updated أو unchanged أو dry_run، أو detect-chat found).
1config_malformed،‏ ambiguous_install،‏ settings_invalid،‏ test_send_failed،‏ write_failed،‏ service_failed،‏ internal_errorفشل. ambiguous_install: أكثر من دردشة خاصة قد تكون للمالك؛ ويُصلح ذلك في aipager config.
2usage،‏ missing_token_source،‏ token_source_conflict،‏ token_file_unreadable،‏ token_stdin_is_tty،‏ token_stdin_timeout،‏ token_malformed،‏ token_on_command_line،‏ bad_chat_id،‏ bad_role،‏ bad_timeoutمدخلات خاطئة أو ناقصة؛ وfix يسمّي الخيار. الخيار غير المعروف أو الكلمة الخاطئة بعد setup يبلّغ عنها محلل الوسائط (نص عادي، دون JSON)، والخروج أيضًا 2.
3deps_missingdtach أو claude أو aipager-hook أو aipager-statusline ناقص؛ وfix فيه الأوامر. لم يُكتب شيء.
4token_rejectedرفض Telegram التوكن.
5chat_not_started،‏ bot_blockedلم يضغط الشخص على Start في البوت («Open t.me/<bot> and press Start, then run this again.»)، أو حظره. لم يُكتب شيء.
6existing_installتوكن أو دردشة أو دور مختلف مُعدّ من قبل؛ تُضاف ‎--force.
7telegram_unreachableخطأ في الشبكة، أو أجاب Telegram بـ 429 أو ‎5xx.
8detect_timeoutلم يرَ detect-chat أي رسالة خاصة قبل ‎--timeout (مع التحذير updates_backlog حين تخفي ١٠٠ تحديث قديم غير مقروء ما هو أحدث).
9daemon_runningdetect-chat:‏ aipager يعمل ويحتجز رسائل البوت.
10updates_conflictdetect-chat: برنامج آخر يقرأ رسائل هذا البوت.
130interruptedCtrl-C.

حين تفشل عدة فحوص معًا، يتبع الرمز هذا الترتيب: config_malformed،‏ ambiguous_install،‏ existing_install،‏ settings_invalid،‏ deps_missing. ويخرج ‎--dry-run بالرمز الذي كان التشغيل الحقيقي سيحصل عليه من هذه الفحوص.

JSON: aipager setup --json#

كل مفتاح موجود دائمًا؛ والقيمة غير المعروفة بعد هي null.

json
{
  "command": "setup",
  "status": "installed",
  "ok": true,
  "exit_code": 0,
  "error": null,
  "message": "aipager is set up for @example_bot (chat 123456789, role owner). ...",
  "fix": null,
  "dry_run": false,
  "bot_username": "example_bot",
  "chat_id": 123456789,
  "role": "owner",
  "changed": ["bot_token", "owner_dm", "settings_json"],
  "test_message": "sent",
  "deps": {"ok": true, "items": [{"name": "dtach", "found": true, "path": "/usr/bin/dtach", "fix": null}]},
  "settings_json": {"path": "/home/you/.claude/settings.json", "status": "created", "backup": null, "repointed": 0},
  "daemon": {"running": false, "reload": "not_needed", "restart_needed": false},
  "service": {"requested": false, "result": "not_requested"},
  "warnings": [],
  "next_step": "Start aipager with `aipager service install` ..."
}
  • ‏status:‏ installed أو updated أو unchanged أو dry_run أو error.
  • ‏changed: ما تغيّر (أو سيتغير، في التشغيل التجريبي)، بهذا الترتيب: migrated_v1،‏ bot_token،‏ owner_dm،‏ role،‏ settings_json،‏ service.
  • ‏test_message:‏ sent أو not_needed أو skipped_dry_run أو failed أو not_attempted.
  • ‏settings_json.status:‏ created أو patched أو unchanged أو would_change أو not_checked.
  • ‏daemon.reload:‏ reloaded أو refused أو not_reloaded أو not_needed. وrestart_needed قيمته true بعد توكن جديد بينما يعمل aipager، وبعد أي تغيير حين تعذّرت إعادة تحميل aipager أو لم يستطع setup معرفة هل يعمل.
  • ‏service.result:‏ not_requested أو installed أو already_installed أو skipped_daemon_running أو would_install أو failed، أو null حين توقف setup قبله.
  • ‏warnings: كائنات فيها code (token_file_shared،‏ reload_refused،‏ daemon_unknown،‏ audit_write_failed) وmessage.‏ audit_write_failed: كُتب منح المالك، لكن تعذّرت إضافة سجل grant-owner الخاص به إلى سجل التدقيق؛ والسجل بذل للجهد، لذا يبقى رمز الخروج 0.
  • ‏next_step بعد تغيير بينما يعمل aipager تعذّرت إعادة تحميله يطلب إعادة تشغيله (aipager service stop، ثم aipager service start)؛ ولا يذكر توكن البوت إلا حين تغيّر التوكن.
  • مع التحذير daemon_unknown، لا يقول next_step أبدًا إن aipager يعمل. يقول إن setup لم يستطع المعرفة، ويشير إلى aipager doctor --json، ويطلب تشغيل aipager بـ aipager service install أو aipager start إن لم يكن يعمل. وحين تكون إعادة التشغيل لازمة، لا يطلبها إلا إذا كان aipager يعمل، وإلا يطلب تشغيله بالطريقة نفسها.
  • عند الخطأ، تكون status هي error وتقول error وmessage وfix ما الخطأ وما العمل؛ ويكرر next_step قيمة fix. وحين يأتي الخطأ بعد كتابة، تسرد changed ما كُتب، ويضيف المخرج العادي سطر stderr Already written: aipager.yaml, ... (changed: ...).

JSON: aipager setup detect-chat --json#

json
{
  "command": "detect-chat",
  "status": "found",
  "ok": true,
  "exit_code": 0,
  "error": null,
  "message": "Found Ada L (@ada), Telegram id 123456789.",
  "fix": null,
  "bot_username": "example_bot",
  "source": "telegram",
  "candidate": {"id": 123456789, "first_name": "Ada", "last_name": "L", "username": "ada", "date": 1700000000},
  "other_candidates": 0,
  "warnings": [],
  "next_step": "Show this person to the user; once they confirm, run: aipager setup --token-file <path> --chat-id 123456789"
}

‏candidate قيمته null ما لم تكن status هي found. وwarnings فيها كائنات بـ code (token_file_shared،‏ updates_backlog) وmessage. وother_candidates يعدّ الأشخاص الآخرين الذين راسلوا البوت في الدقائق العشر نفسها: حين لا يكون صفرًا، يلزم التأكد من الشخص الصحيح. ويكرر next_step خيار التوكن المستخدم، لا التوكن نفسه أبدًا.

aipager doctor --json#

فحوص aipager doctor ككائن JSON واحد على stdout. ومثل aipager doctor العادي، يقرأ فقط ولا يرسل أي رسالة Telegram. يخرج بالرمز 1 حين يفشل أي فحص، وإلا 0. ولا يمكن جمعه مع ‎--fix أو ‎--safety-check (الخروج 2 مع كائن خطأ).

json
{
  "command": "doctor",
  "version": "1.0.1",
  "ok": true,
  "summary": {"ok": 14, "warn": 1, "fail": 0},
  "checks": [{"key": "token_valid", "status": "ok", "title": "Telegram bot token", "detail": ["@example_bot"], "fix": null}]
}

‏checks بهذا الترتيب، بهذه المفاتيح: config_parses،‏ config،‏ token_valid،‏ chat_reachable،‏ team،‏ role_shell_access،‏ peer_messages،‏ claude،‏ claude_auth،‏ dtach،‏ hook_scripts،‏ settings_json،‏ daemon،‏ service_installed،‏ service_unit_path،‏ miniapp. والفحص الذي يتعطل يحتفظ بمفتاحه مع الحالة warn. النصوص عادية (دون تنسيق)، وكل ما يشبه توكن بوت يُستبدل بـ ‎<redacted>‎.

سطر الأوامر: aipager uninstall#

يوقف aipager uninstall برنامج aipager ويزيل خدمته، ويحذف مجلد الإعداد (‎~/.config/aipager: توكن البوت، والدردشات، والإعدادات) وقائمة الجلسات (‎~/.claude/aipager-sessions.json)، وينظّف ملفات aipager في ‎/tmp، ويزيل تثبيت aipager نفسه. ويسأل أولًا (‎-y يتخطى السؤال).

يحتفظ ببيانات aipager، ليكمل التثبيت الجديد من حيث توقف: ‎~/.local/share/aipager (مجلدات الجلسات، والبرامج المساعدة المنزّلة، وملفات القفل والعلامات)، و‎~/.local/state/aipager (سجلات تقارير المشكلات وحالة اللغة)، و‎~/.claude/aipager-audit.jsonl (سجل إجابات طلبات الإذن)، و‎~/.claude/aipager-flood-state.json (سجل حدود السرعة في Telegram)، و‎~/.claude/aipager-pending-users.json (أشخاص جربوا البوت دون صلاحية) و‎~/aipager-users (المجلدات الجذرية للأعضاء، مع عملهم). وقبل السؤال يسرد ما يوجد منها على كمبيوترك، وفي النهاية يطبع أمر rm -rf الذي يحذفها أيضًا.

ويُخرج أيضًا مدخلات aipager الخاصة من ‎~/.claude/settings.json في Claude Code: الهوكات التي تشغّل aipager-hook وسطر الحالة الذي يشغّل aipager-statusline (سطر الحالة الخاص بك يبقى). كل ما عدا ذلك في الملف يبقى كما كان، ويُحفظ الملف كما كان بجانبه باسم settings.json.bak.<time>‎. إذا كان الملف رابطًا إلى ملف آخر، أو غير مقروء، أو ليس JSON صالحًا، أو ليس بالشكل الذي يقرؤه Claude Code، يُترك كما هو تمامًا ويقول uninstall أي المدخلات يلزم إزالتها يدويًا. والهوك الخاص بك الذي ما زال يذكر aipager-hook أو aipager-statusline (مثل غلاف aipager-hook-capped.sh) يبقى أيضًا، ويسمّيه uninstall. جلسات Claude Code المفتوحة من قبل تستمر في تشغيل الهوكات التي حمّلتها حتى إعادة تشغيلها. ويضيف aipager config المدخلات من جديد بعد إعادة التثبيت. لا يُمس بوت Telegram لديك ولا النسخ الاحتياطية الأقدم settings.json.bak.*‎، ولا skipDangerousModePermissionPrompt (الإعداد الذي يتخطى تحذير Claude Code قبل عمله مع إيقاف فحوص الأذونات)، الذي يضبطه aipager لكن ربما ضبطته أنت أيضًا.

سطر الأوامر: aipager report#

يبني aipager report تقرير مشكلة من النوع نفسه الذي يبنيه زر «الإبلاغ عن مشكلة» في البوت، مما سجّله aipager على هذا الكمبيوتر (بمعلومات أقل عن aipager الجاري: الوضع، والدردشات، والميزات، ومدة التشغيل، والجلسات، وتفاصيل Claude Code تبقى غير معروفة أو فارغة)، ويطبعه كله، ويسأل Send this report? [y/N]. لا يرسله إلا y أو yes؛ وأي شيء آخر، أو غياب الطرفية تمامًا (سكربت، أو أنبوب، أو طرفية جلسة Claude Code)، لا يرسل شيئًا. ويضيف ‎--note "text"‎ ملاحظة لا تتجاوز ٥٠٠ حرف، تظهر في التقرير المطبوع. يخرج بالرمز 0 حين أُرسل التقرير، أو لم يُرسل باختيارك، أو طُبع فقط، وبالرمز 1 حين لم يخرج إرسال وافقت عليه. يُنظر تقارير المشكلات لما يحتويه التقرير وإلى أين يذهب.

الإعدادات من البيئة#

بعض الإعدادات تُقرأ من بيئة aipager بدل aipager.yaml. لخدمة systemd، تُضاف بـ systemctl --user edit aipager تحت ‎[Service]‎ (Environment=STALE_BUSY_TIMEOUT=900)، ثم aipager service stop وaipager service start؛ ولخدمة launchd على macOS، تُضاف إلى EnvironmentVariables في ملف plist (‎~/Library/LaunchAgents/com.aipager.daemon.plist؛ ويعيد aipager service install كتابة ذلك الملف، لذا تُضاف من جديد بعده)؛ ولـ aipager يُبدأ يدويًا، تُضبط قبل aipager start. لا حاجة إلى أي منها للاستخدام العادي.

الإعدادالافتراضيماذا يغيّر
AIPAGER_WHISPER_MODELbaseنموذج التعرف على الكلام للرسائل الصوتية (tiny،‏ base،‏ small،‏ medium، ...): الأكبر أدق وأبطأ.
MINIAPP_PORT8765منفذ Mini App على 127.0.0.1 (وaipager miniapp enable --port يحفظه بدلًا من ذلك).
MINIAPP_ENABLEDمن aipager.yaml0 يوقف Mini App و1 يشغّله، مهما قال aipager.yaml (وaipager miniapp enable|disable يحفظ الاختيار بدلًا من ذلك).
MINIAPP_PUBLIC_URLلا شيءتقديم Mini App على عنوان https://‎ خاص بك بدل النفق المُدار (الأمان).
KEEP_FINISHED_CARD10 يجعل «الإجابة فقط، بدل البطاقة» شكل الرسائل للدردشات التي لم تختر شكلًا في ‎/settings أبدًا.
STALE_BUSY_TIMEOUT7200 (ساعتان)الثواني التي يمكن أن تمضيها جلسة عاملة دون أخبار قبل أن تتلقى الدردشة ملاحظة «لا تزال تعمل (١٢٠ دقيقة بلا أخبار)».
PROMPT_HOOK_GRACE_SECONDS8الثواني قبل أن تُعلَّم رسالة لم يأخذها Claude Code أبدًا بـ «لم يستلم Claude Code الرسالة» (الرسائل الحرة).
FINISH_CARD_GRACE_SECONDS0.8كم تسبق البطاقة المنتهية الإجابة في شكل البطاقة؛ و0 يرسل الاثنين معًا.
GONE_SESSION_MAX_AGE_DAYS14الأيام التي تبقى فيها الجلسة المنتهية في ‎/resume؛ و0 يُبقيها.
STREAM_EDIT_INTERVAL،‏ BUSY_EDIT_INTERVAL1.2، 3.0تحديث بطاقة العمل أثناء تدفق النص وأثناء الهدوء، بالثواني؛ ويبقى حد Telegram لكل دردشة هو الغالب (حل المشكلات).
TYPING_INDICATOR_INTERVAL4.5الثواني بين فقاعات «يكتب…»؛ و0 يوقفها.
TELEGRAM_MAX_RETRY_AFTER90انتظار Telegram، بالثواني، الذي يعامل aipager ما يتجاوزه حدَّ سرعة على أنه حظر (لا يُخفض؛ يُنظر حل المشكلات).
CLAUDE_RICH_SUMMARIES10 يوقف التنسيق الغني للإجابات التي فيها كتل شيفرة (بديل احتياطي من إصدارات أقدم).
AIPAGER_INTERACTIVE_TIMEOUT300الثواني التي يمكن أن ينتظرها طلب إذن أو سؤال دون أخبار من Claude Code قبل أن يفحص aipager المحادثة المحفوظة؛ ولا تُعدّ الجلسة عاملة من جديد إلا إذا أظهرت أن الطلب انتهى (حل المشكلات).
AIPAGER_SUBAGENT_SILENCE1800ثواني الصمت التي يُحذف بعدها وكيل فرعي لم يُرَ توقفه (الهوكات).
AIPAGER_BG_SHELL_MAX_TRACK7200الثواني التي يتوقف بعدها عدّ أمر في الخلفية لم تُرَ نهايته.
AIPAGER_REPORT_PROMPTSمفعّل0 يوقف العروض التلقائية لتقارير المشكلات (تقارير المشكلات).
AIPAGER_CLAUDE_BINلا شيءبرنامج claude المطلوب تشغيله، حين تُثبَّت عدة نسخ (وclaude_path في aipager.yaml يغلب).
AIPAGER_SOCKET_PATH‎$XDG_RUNTIME_DIR/aipager.sockمقبس التحكم في aipager. والجلسات التي يبدؤها aipager تمرّره إلى هوكاتها.
AIPAGER_DEBUGمعطّل1 في بيئة جلسة يجعل aipager-hook وaipager-statusline يطبعان معلومات التشخيص على stderr.
AIPAGER_INSTANCE_DIR،‏ AIPAGER_TELEGRAM_API_BASEلا شيءaipager ثانٍ معزول للاختبار (البنية).

صفحات ذات صلة#