کاربانر

گفتگو با ترمینال

هر پروژه یک صفحه‌ی ترمینال دارد: از برد پروژه، دکمه‌ی «ترمینال». آن‌جا مستقیم با ترمینالِ همان پروژه حرف می‌زنید و جوابش را همان‌جا می‌بینید — همان‌طور که نوشته می‌شود.

این تسک نیست. برای کاری که باید ثبت شود، ردگیری شود و به مشتری گزارش شود، تسک بسازید. ترمینال برای وقتی است که می‌خواهید چیزی را بپرسید، کاری را با هم جلو ببرید، یا بگویید «فهرست تسک‌های باز را بیاور و بگو از کدام شروع کنیم».

حافظه

سشن بین پیام‌ها می‌ماند. چیزی که پنج پیام قبل گفته‌اید، یادش هست. «گفتگوی تازه» سشن را کنار می‌گذارد و ترمینال از صفر شروع می‌کند — دستورالعمل پروژه همیشه همراهش هست، فقط حافظه‌ی گفتگو می‌رود.

آنچه می‌توانید از او بخواهید

در این صفحه — و فقط این صفحه — دستور از خودِ شما می‌آید، پس ترمینال کارِ خواسته‌شده را انجام می‌دهد:

  • «این را تسک کن» → تسک ساخته می‌شود، به نام شما و با مسئولِ «صاحب پروژه».
  • «تسک ۱۲ را ببند» یا «ببرش به بازبینی» → وضعیت عوض می‌شود.
  • «روی تسک ۷ کامنت بگذار که…» → کامنت ثبت می‌شود.

دو چیز عوض نشده و عمداً عوض نمی‌شود:

  • به ابتکار خودش تسک نمی‌سازد. اگر کاری دید که باید تسک شود، می‌گوید و منتظر می‌ماند. تفاوت در این است که چه کسی تصمیم گرفته.
  • خودش را مسئول نمی‌کند. تسکی که این‌جا ساخته می‌شود وارد صف خودکارش نمی‌شود؛ برای آن باید در صفحه‌ی تسک «تأیید و ارجاع به ترمینال» را بزنید. همان دروازه‌ی تأیید است: یک کلیک، تا هیچ کاری بدون تصمیم شما اجرا نشود.

پشت صحنه، هاب برای هر نوبتِ گفتگو یک اجازه‌ی کوتاه‌عمر می‌سازد که به همان پیام شما گره خورده و با پایان همان نوبت باطل می‌شود. بیرون از این صفحه، ترمینال مثل قبل تسک نمی‌سازد.

فرستادن فایل

کنار جعبه‌ی پیام دکمه‌ی پیوست فایل هست. چند فایل را با هم انتخاب کنید (یا چند بار انتخاب کنید — روی هم جمع می‌شوند)، قبل از فرستادن فهرستشان را می‌بینید و می‌توانید هر کدام را بردارید. هر فایل حداکثر ۲۰۰ مگابایت.

فایل‌ها همراه همان پیام می‌روند: ترمینال مسیرشان را در متن پیام می‌بیند و روی ماشین خودش مستقیم بازشان می‌کند — لازم نیست چیزی دانلود کند. پس «این قرارداد را بخوان و خلاصه کن» همان‌طور که انتظار دارید کار می‌کند.

چند نکته:

  • اول پیام ثبت می‌شود، بعد فایل‌ها. اگر آپلود فایلی شکست بخورد، پیام‌تان از بین نمی‌رود و فقط همان فایل گزارش می‌شود.
  • ترمینال تا رسیدن فایل‌ها نوبت را شروع نمی‌کند (حداکثر دو دقیقه صبر می‌کند؛ بعد از آن با هرچه رسیده جلو می‌رود و می‌گوید چه چیزی نرسیده).
  • فایل‌ها مثل بقیه‌ی فایل‌های پروژه در فایل‌منیجر پروژه هم دیده می‌شوند و در سهمیه‌ی فضای کسب‌وکار حساب می‌شوند.
  • فایل بدون متن فرستاده نمی‌شود؛ پیام است که به ترمینال می‌رسد و فایل همراهش.

و برعکس: ترمینال هم فایل می‌فرستد. اگر بگویید «یک فایل md بساز و بده به من»، فایل را با karbaner files upload می‌فرستد؛ زیر همان پاسخ با دکمه‌ی دانلود می‌نشیند و لینکش هم در متن می‌آید (لینک با ورود شما در پنل باز می‌شود). این فایل‌ها هم در فایل‌منیجر پروژه و سهمیه‌ی فضا حساب می‌شوند و هرگز به پورتال مشتری نمی‌روند.

پُری سشن و فشرده‌سازی

سشن ترمینال جا دارد ولی بی‌پایان نیست. در نوار بالای گفتگو، بعد از هر پاسخ نوشته می‌شود «سشن: n از m توکن (٪)» — بالای ۷۰٪ زرد می‌شود، بالای ۹۰٪ قرمز. عدد از خودِ انجین می‌آید (دو عدد، همین و بس) و اندازه‌ی context در پایان آخرین نوبت است، نه جمع مصرف نوبت.

وقتی پر شد، دکمه‌ی «فشرده‌سازی» را بزنید. این همان فشرده‌سازیِ خودِ انجین است (در Claude Code: دستور /compact) که به‌شکل یک پیام روی همان سشن می‌رود: انجین تاریخچه‌ی گفتگو را خودش خلاصه می‌کند و سشن همان می‌ماند — چیزی عوض نمی‌شود، فقط حافظه‌ی گفتگو کوچک می‌شود. پاسخِ این نوبت متن ندارد؛ زیرش نوشته می‌شود «گفتگو فشرده شد: از n به m توکن» و نوار سشن با علامت «≈» عددِ تازه را نشان می‌دهد — تقریبی، چون system prompt و ابزارها را نمی‌شمارد؛ با پاسخ بعدی عدد دقیق می‌آید.

انجین وقتی پنجره پر شود خودش هم فشرده می‌کند، بی‌آنکه شما کاری کنید. آن هم پنهان نمی‌ماند: زیر همان پاسخ «گفتگو خودکار فشرده شد: از n به m توکن» می‌آید. (نشانه‌ی دیگرش افتِ ناگهانی نوار سشن بدون تغییر سشن است.)

جزئیاتِ پیش از فشرده‌سازی فقط در خلاصه می‌مانند. آنچه باید بماند، در تسک، کامنت و فایل‌های پروژه بنویسید، نه در حافظه‌ی سشن.

«گفتگوی تازه» چیز دیگری است: سشن واقعاً از صفر شروع می‌شود و ترمینال هیچ‌چیزِ گفتگوی قبلی را ندارد.

مدل و effort

مدل و effortِ ترمینال از تنظیمات پروژه می‌آیند. اگر آن‌ها را عوض کنید، پیامِ بعدی روی همان سشنِ باز با تنظیمِ تازه جواب می‌گیرد — سشن بسته نمی‌شود و حافظه‌ی گفتگو سر جایش می‌ماند (همان کاری که /model در خودِ Claude Code می‌کند). اگر انجین مدلِ تازه را نپذیرد (مثلاً نامش غلط است یا نسخه‌ی انجین روی اجراگر آن را نمی‌شناسد)، همان پاسخ با مدلِ قبلی می‌آید و علتش بالایش نوشته می‌شود.

برای عوض‌کردنِ فقط همین سشن، بی‌آنکه تنظیمِ پروژه دست بخورد، در جعبه‌ی پیام بنویسید:

  • /model نام — مثلاً /model claude-opus-5-5 یا نامِ کوتاهی مثل sonnet. /model default یعنی برگشت به تنظیمِ پروژه.
  • /effort سطح — یکی از low، medium، high، xhigh، max. /effort default یعنی برگشت به تنظیمِ پروژه.

جوابش همان لحظه می‌آید، حتی وسطِ کار: نوبتِ در جریان قطع نمی‌شود و از تماسِ بعدیِ انجین با مدلِ تازه ادامه می‌دهد. انتخابِ شما تا وقتی پروسه‌ی سشن باز است می‌ماند — تا «گفتگوی تازه»، تا تغییرِ دوباره‌ی تنظیمِ پروژه، یا تا وقتی سشن بعد از بی‌کاری بسته شود (پیش‌فرض ۳۰ دقیقه؛ پیامِ بعدی با حافظه‌ی کامل ولی با تنظیمِ پروژه ادامه می‌دهد). /model و /effort بدون نام به خودِ انجین می‌رسند و مدل و effortِ جاری را گزارش می‌کنند.

خواندن گفتگوی بلند

هر پیام فقط دو خط اولش را نشان می‌دهد و با «بیشتر» باز می‌شود. تنها استثنا پاسخی است که همین حالا نوشته می‌شود: باز می‌ماند تا تمام شود. صفحه با هر تکه‌ی تازه‌ی پاسخ به‌روز می‌شود ولی اگر بالاتر مشغول خواندن باشید، اسکرول نمی‌پرد.

صفحه فقط ده پیامِ آخر را می‌آورد تا گفتگوی چندصدپیامی هم سبک بماند. به بالای گفتگو که برسید، ده پیامِ قبلی خودکار اضافه می‌شوند (یا با دکمه‌ی «پیام‌های قبلی») و پیامی که داشتید می‌خواندید سر جایش می‌ماند. با فرستادنِ پیامِ تازه، صفحه دوباره به ده پیامِ آخر برمی‌گردد. پاسخی که هنوز در حال نوشتن است همیشه دیده می‌شود، هر قدر هم که قدیمی باشد.

تا وقتی این‌جا هستید، همه‌چیز دستی است

تا صفحه‌ی ترمینال باز است، اجراگر برای این پروژه تسک تازه برنمی‌دارد. دلیلش ساده است: دو ترمینال روی یک پوشه‌ی پروژه نباید هم‌زمان کار کنند. با بستن صفحه، رفتن به صفحه‌ی دیگر یا دکمه‌ی «خروج از ترمینال»، پروژه همان لحظه دوباره خودکار می‌شود. روی برد، تا وقتی در حالت ترمینال هستید، یک نوار زرد همین را می‌گوید و با خروجِ شما (حتی از تب دیگری) همان لحظه می‌رود.

تسکی که از قبل در حال اجرا بوده قطع نمی‌شود؛ فقط در نوار وضعیت گفته می‌شود.

چه چیزی به کاربانر می‌رسد و چه چیزی نه

فقط متنِ خودِ ترمینال — همان چیزی که در کامنت هم می‌نویسد. خروجی ابزارها، دستورهایی که اجرا می‌کند و لاگ کامل روی همان ماشینِ اجراگر می‌مانند و هرگز به کاربانر نمی‌آیند. رمزها و کلیدهای پروژه هم همان‌جا می‌مانند.

قاعده‌ها همان قاعده‌ها هستند

ترمینال در گفتگو هم نمی‌تواند تسک بسازد یا کاری را وارد صف خودش کند؛ اگر کاری پیدا کرد که باید تسک شود، می‌گوید و شما تصمیم می‌گیرید. اگر روی تسکی کار کند، همان‌جا در همان تسک کامنت می‌گذارد تا پنل آینه‌ی حقیقت بماند. در کار حساس (production، حذف داده) اول می‌گوید چه خواهد کرد و منتظر «برو» می‌ماند.

با صدا

کنار جعبه‌ی پیام دکمه‌ی ویس هست: ضبط کنید، تمام کنید، متنش در جعبه می‌نشیند — فرستاده نمی‌شود تا خودتان نگاه کنید و بفرستید. تبدیل صدا خطا دارد و دستوری که غلط به ترمینال برسد بدتر از یک نگاه اضافه است.

زیر هر پاسخ ترمینال دکمه‌ی بشنو هست. اگر می‌خواهید پاسخ‌ها خودشان خوانده شوند، «خواندن خودکار پاسخ‌ها» را بالای گفتگو روشن کنید؛ این ترجیح روی همین مرورگر می‌ماند. (بعضی مرورگرها پخش خودکار را تا اولین کلیک رد می‌کنند — دکمه‌ی بشنو همیشه هست.)

آینه‌ی ترمینالِ واقعی: سشن زنده

این صفحه همان رفتارِ ترمینالِ زنده روی اجراگر را دارد — همان‌طور که Remote Controlِ خودِ Claude Code یک سشنِ در حال اجرا را از راه دور آینه می‌کند. برای هر پروژه یک پروسه‌ی انجین روی اجراگر زنده می‌ماند و:

  • پیامِ وسطِ کار همان لحظه می‌رسد. لازم نیست تا پایان نوبت صبر کنید؛ پیام تازه بعد از ابزارِ جاری دیده می‌شود و ترمینال همان‌جا رویش کار می‌کند. فقط وقتی اجراگر آفلاین است پیام «در صف» می‌ماند.
  • توقف همان Esc ترمینال است: کارِ جاری همان لحظه متوقف می‌شود، سشن و حافظه می‌مانند و می‌توانید بگویید چه کند.
  • کار پس‌زمینه و بیدارباش ادامه پیدا می‌کنند. اگر ترمینال چیزی را در پس‌زمینه اجرا کند یا بگوید «چند دقیقه دیگر دوباره سر می‌زنم»، با تمام‌شدنش خودش نوبت تازه‌ای می‌سازد و جوابش زیر گفتگو می‌آید (با نشانِ «ادامه‌ی کار»).
  • نوبت سقف زمانی ندارد. کارِ طولانی تا وقتی انجین کار می‌کند ادامه دارد.
  • پروسه‌ای که مدتی کاملاً بی‌کار باشد (نه نوبتی، نه کار پس‌زمینه‌ای، نه بیدارباشی — پیش‌فرض ۳۰ دقیقه) بسته می‌شود؛ پیام بعدی همان سشن را با حافظه‌ی کامل ادامه می‌دهد، دقیقاً مثل بستن و دوباره بازکردنِ ترمینال با --resume. اگر اجراگر وسطِ نوبت ری‌استارت شود، همان نوبت با پیام روشن بسته می‌شود و پیام بعدی از همان سشن ادامه می‌دهد.

ترمینال‌ها — همه‌ی گفتگوها در یک صفحه

اگر پروژه زیاد دارید، صفحه‌ی ترمینال‌ها (در منوی پنل) همه‌ی گفتگوها را مثل یک مسنجر کنار هم می‌گذارد: هر پروژه یک ردیف با چکیده‌ی آخرین پیام و زمانش؛ روی هر ردیف که بزنید همان گفتگو کنارش باز می‌شود و بقیه‌ی ترمینال‌ها همچنان زنده کار می‌کنند. ترتیب با تازه‌ترین تغییر است، پروژه‌ای که همین حالا دارد کار می‌کند نشان «در حال کار» دارد، و پاسخی که هنوز ندیده‌اید یک نقطه‌ی رنگی می‌گیرد تا معلوم باشد کدام را چک نکرده‌اید. روی گوشی، فهرست و گفتگو دو صفحه‌اند و با یک ضربه بین‌شان می‌روید.

باز بودنِ یک گفتگو در این صفحه همان معنای صفحه‌ی ترمینالِ خودِ پروژه را دارد: تا آن‌جا هستید، اجراگر برای همان پروژه تسک تازه برنمی‌دارد؛ بقیه‌ی پروژه‌ها آزادند.

راه‌اندازی روی اجراگر

در runner.toml یک chat_command بگذارید. برای Claude Code، اسکریپت آماده در مخزن هست: runner/deploy/chat-claude.sh — انجین را با --input-format stream-json اجرا می‌کند و اجراگر خودش پیام‌ها را روی stdin می‌نویسد و رویدادها را از stdout می‌خواند (فقط متنِ خودِ مدل به کاربانر می‌رسد). chat_idle_seconds مدتِ بی‌کاری تا بسته‌شدنِ پروسه است. بعد اجراگر را دوباره راه بیندازید. تا این نباشد، صفحه‌ی ترمینال همین را می‌گوید.

پروژه‌های ابری فعلاً گفتگو ندارند.