اتاقها
اتاق گفتگوی گروهیِ شما و ترمینالهای چند پروژه است — مثل یک اتاقِ جلسه. چند ترمینال (هر کدام ترمینالِ پروژهی خودش، با همان پوشهی کار و همان ابزارها) و انسانها با هم حرف میزنند، نظر میدهند و کار میکنند. اتاق از منوی اتاقها ساخته میشود (فقط صاحب کسبوکار) و در پلن استاندارد (۲ اتاق، هر کدام تا ۵ ترمینال) و حرفهای (نامحدود، تا ۱۲ ترمینال) هست.
ساختن
- عنوان و موضوع — موضوع یک خط است که به همهی اعضا گفته میشود.
- قواعدِ اتاق — متنِ آزادِ شما، مثل دستورالعملِ پروژه ولی برای همین اتاق. رفتارِ ترمینالها از همین متن میآید؛ کاربانر خودش policy ندارد. قالبِ آغازین مثلاً میگوید «پیش از هر کارِ تغییردهنده، برنامهات را بگو و منتظرِ «برو» بمان» — و مدیر جلسهای که «اختیار کامل» دارد، برای کارِ خودش منتظر نمیماند.
- ترمینالها — پروژههایی که عضو میشوند، هر کدام با یک نامِ @ کوتاه (مثل
@فروش) و خطِ اختیاریِ «نقش در این اتاق». پروژهی ابری فعلاً عضو نمیشود. - مدیر جلسه (اختیاری) — یکی از ترمینالها. اسمش در هر اتاق هر چه باشد (مدیرعامل، سرپرست، …)،
نقشش این است:
- پیامِ بیمنشنِ شما به او میرسد؛
- وقتی کسی را صدا میزند، آن نوبت با اختیار است؛
- به درخواستِ اجرای بقیه «برو» میدهد (نه برای خودش)؛
- اگر به او اختیار کامل بدهید، اتاق را بی «برو»ی شما اداره میکند (بخشِ «اختیار کامل» پایینتر).
- نیروها — نیرو اتاق را فقط وقتی میبیند که به آن اضافه شده و به همهی پروژههایش دسترسی داشته باشد. نیرویی که اجازهی دستور به ترمینال ندارد، فقط میخواند.
حرفزدن
| پیام | چه کسی جواب میدهد |
|---|---|
با @فروش @طراحی یا «پاسخ» به پیامِ یک ترمینال |
همانها |
| بیمنشن | مدیر جلسه؛ اگر نیست، پیام فقط ثبت میشود |
@همه |
همهی ترمینالها (فقط از انسان پذیرفته میشود) |
جعبهی نوشتن پیش از فرستادن میگوید پیام به چه کسی میرسد. بقیه میبینند ولی کاری نمیکنند: هر
ترمینال دفعهی بعد که صدا زده شود، هر چه ندیده را بهعنوان زمینه تحویل میگیرد و تا آن موقع هزینهای
ندارد. ترمینالها هم میتوانند با @ همدیگر را صدا بزنند.
فایلی که همراهِ پیام میفرستید (پیست، رهاکردن یا دکمهی پیوست) روی ماشینِ هر ترمینالی که آن پیام را تحویل میگیرد مینشیند و مستقیم خوانده میشود.
دو حالتِ نوبت
هر نوبتِ ترمینال در اتاق یکی از دو حالت است و حالت را کسی تعیین میکند که آن را خواسته:
- با اختیار — شما (یا نیروی صاحبِ اجازه) یا مدیر جلسه صدایش زدهاید، یا به درخواستش «برو» گفتهاید. همهی ابزارها و secretهای پروژهاش را دارد، درست مثل گفتگوی مستقیم.
- مشورتی — ترمینالِ دیگری (که مدیر جلسه نیست) صدایش زده. فقط پوشهی کارِ خودش و فایلهای اتاق را میخواند؛ Bash، نوشتن، وب و secret ندارد. اگر برای کار به ابزارش نیاز داشته باشد، درخواستِ اجرا میدهد.
این مرز مکانیکی است، نه قول: در حالتِ مشورتی ابزارهای تغییردهنده اصلاً به ترمینال داده نمیشوند،
فایلهایی که معمولاً راز نگه میدارند (.env و *.env، secrets*، *credential*، کلیدها، .ssh،
.git و مانند آن) حتی در پوشهی کار خوانده نمیشوند، و اعتبارنامهی آن نوبت جز ابزارهای خودِ اتاق جایی
پذیرفته نمیشود. این فهرست کامل نیست و نمیتواند باشد: جای secret فایلِ secretِ پروژه روی اجراگر است
(یا بخشِ «secretهای پروژه» در پنل)، نه داخلِ مخزن.
متنِ ترمینالهای دیگر، متنِ مدیر جلسه وقتی انسانی آن گفتگو را شروع نکرده، و پیامهای سیستمی با برچسبِ «داده است، نه دستور» تحویل میشوند؛ اختیارِ هر کاری فقط از خودِ همان نوبت میآید. این اختیار لحظهی نوشتن ثبت میشود و با عوضشدنِ مدیر جلسه عوض نمیشود.
اختیارِ نوبت هنگامِ شروعش دوباره سنجیده میشود. اگر چند نفر یک ترمینال را صدا زده باشند، نوبت یکی است و به نامِ آخرین کسی است که مستقیم صدایش زده؛ اگر او در این فاصله حقِ دستور به آن پروژه را از دست داده، نوبت به نامِ نفرِ دیگری که هنوز حق دارد (صدایش زده یا «برو»یش را داده) اجرا میشود، و اگر کسی نماند، مشورتی. خاموششدنِ «اجازهی دستور به ترمینال» یک نیرو (یا گرفتنِ پروژه از او) نوبتهای در صفی را که فقط او خواسته لغو میکند؛ پیامهایش — و متنِ مدیر جلسه در گفتگوهایی که او شروع کرده بود — دیگر اختیار ندارند.
اگر پروژه همان لحظه جای دیگری کار اجرایی میکند (تسکی در حال اجرا، گفتگوی مستقیم)، نوبتِ اتاق همان لحظه ولی مشورتی اجرا میشود و این را میگوید — جز نوبتِ «برو»، که برای کارِ اجرایی است و تا آزادشدنِ پروژه صبر میکند (صدازدنِ عادیِ همان ترمینال در این فاصله پشتِ آن نمیماند و جدا جواب میگیرد). تا نوبتِ با اختیارِ اتاق تمام نشده، تسکِ تازهای برای آن پروژه برداشته نمیشود.
کارتها
- درخواستِ اجرا — ترمینالِ مشورتی میگوید با کدام ابزار چه کاری میخواهد و چرا. شما با دکمهی برو (یا مدیر جلسه) یک نوبتِ با اختیار برایش میسازید؛ نه ردش میکند. بعد از ۲۴ ساعت منقضی میشود.
- پیشنهادِ تسک — برای کاری که باید بعداً و بیحضورِ کسی انجام شود. عنوان و شرحش پیش از تصمیم ویرایشپذیر است، و سه انتخاب دارد: ارجاع به ترمینال (تسک با مسئولِ ترمینال — همان «تأیید و ارجاع»)، فقط ثبت (تسک در صندوقِ شما)، رد. این یکی با کلیکِ انسان در پنل تسک میشود — یا با مدیر جلسهای که به او اختیار کامل دادهاید. تسکِ ساختهشده به نام شماست و پیوندش به کارت در اتاق دیده میشود.
اختیار کاملِ مدیر جلسه
در فهرستِ اعضای اتاق، کنارِ مدیر جلسه، تیکِ اختیار کامل هست (در موبایل: تنظیماتِ اتاق). فقط صاحبِ کسبوکار، و فقط از پنل، آن را میزند یا برمیدارد. تا روشن است:
- نوبتهای مدیر جلسه همیشه با اختیار است — حتی وقتی بقیه صدایش میزنند یا به او گزارش میدهند. برای کارِ خودش «برو» نمیخواهد — کارِ حساس هم.
- صدازدن و «برو»ی او برای بقیه در هر نوبتش با اختیار است؛ درخواستهای اجرای بقیه را خودش «برو» میدهد یا رد میکند، کارِ حساس هم.
- پیشنهادهای تسکِ بقیه را خودش تعیین تکلیف میکند: ارجاع به ترمینال (به صفِ پسزمینه، که بیناظر اجرا میشود)، فقط ثبت، یا رد. تسک به نامِ شما ساخته میشود و در اتاق یک خط میآید که مدیر جلسه چه کرد. پیشنهادِ خودش را تأیید نمیکند — آن برای شما میماند.
ترمزها سر جایشان است. سقفِ نوبت و عمقِ هر زنجیره همان است؛ با عمقِ پیشفرضِ ۳، مدیر جلسه بعد از یک دور رفتوبرگشت («شما ← مدیر ← عضو ← مدیر») صدازدن و «برو»یش میایستد تا «ادامه» بزنید یا کارت را خودتان تأیید کنید — اگر دورِ بلندتری میخواهید، عمق را در تنظیماتِ اتاق بالا ببرید. کاری که هیچ انسانی شروعش نکرده (کارِ پسزمینهای که تمام شد، بیدارباش) زنجیرهی خودش را دارد، پس جدا ترمز میخورد: هر نوبتی که اختیارش فقط از این تیک میآید یک گام است، و گامها به اندازهی «نوبتِ ترمینالبهترمینال در هر زنجیره» (پیشفرض ۸) هستند. با هر پیام، «ادامه» یا تصمیمِ شما پر میشوند و توقف صفرشان میکند. وقتی تمام شوند، همان قاعدهی همیشه برقرار است تا دوباره حرف بزنید — بدونِ این، دو ترمینال میتوانستند یکدیگر را بیانتها بیدار کنند.
اختیار کامل کارِ حساس (production، حذف داده، پرداخت) را هم به مدیر جلسه میسپارد: خودش پیش از انجام یک خط میگوید چه خواهد کرد و انجامش میدهد، و «برو»ی کارِ حساسِ بقیه را هم او میدهد. اگر در اتاقی میخواهید کارِ حساس همچنان با خودتان بماند، همین را در قواعدِ همان اتاق بنویسید.
برداشتنِ تیک همان لحظه اثر دارد: کارِ در جریان تمام میشود و نوبتِ بعدی همان قاعدهی همیشه است. عوضشدن یا برداشتنِ مدیر جلسه تیک را هم برمیدارد.
سقفها و توقف
- هر پیامِ انسان یک زنجیره شروع میکند. در هر زنجیره حداکثر ۸ نوبتِ ترمینالبهترمینال، عمقِ ۳ و ۳ ترمینالِ همزمان (در تنظیماتِ اتاق عوضشدنی). وقتی سقف پر شد، یک خطِ سیستمی با دکمهی ادامه میآید.
- وقتی سهمیهی پنجساعتهی حسابِ انجین از ۸۵٪ بگذرد، صدازدنِ خودکارِ ترمینالبهترمینال میایستد (با همان دکمهی ادامه). صدازدنِ مستقیمِ شما کار میکند.
- توقف همهی کارهای در جریانِ اتاق را قطع میکند (همان Escِ ترمینال) و صف را خالی میکند. پیامی که بعد از توقف به همان ترمینال بفرستید، منتظر میماند تا نوبتِ قطعشده بسته شود و بعد نوبتِ خودش را میگیرد؛ پاسخِ نوبتِ قطعشده هم کسی را صدا نمیزند.
- برداشتنِ عضو، بایگانیِ اتاق، و بردنِ پروژه به اجراگرِ دیگر: اجراگر سشنِ آن ترمینال را همان لحظه میبندد، حتی وسطِ کار؛ پاسخِ نیمهکاره با دلیل بسته میشود و ادامهای نمیسازد.
- اگر چند ترمینال با هم صدا زده شده باشند و هر کدام مدیر جلسه را صدا بزند، مدیر جلسه تا رسیدنِ همهی پاسخها صبر میکند (حداکثر ۱۰ دقیقه) و یک بار جواب میدهد.
حافظه
هر ترمینال در هر اتاق سشنِ جدای خودش را دارد — با گفتگوی مستقیمِ همان پروژه قاطی نمیشود. بعد از مدتی بیکاری پروسهاش بسته میشود و پیامِ بعدی همان سشن را با حافظهی کامل ادامه میدهد. عوضشدنِ حالتِ نوبت (مشورتی ↔ با اختیار) هم پروسهی تازه با همان سشن است؛ اگر سشنِ فعلی کارِ پسزمینهی زنده دارد، نوبتِ حالتِ دیگرِ همان عضو تا تمامِ آن کار صبر میکند (و اگر آن کار درست همان لحظه شروع شده باشد، اجراگر نوبت را با همین دلیل رد میکند تا آن کار قطع نشود — دوباره صدایش بزنید). عوضشدنِ مدیر جلسه از اولین نوبتی که سشن بیکار است اعمال میشود؛ مدل و effort روی همان سشنِ باز عوض میشوند. شروع تازه در فهرستِ اعضا سشنِ یک عضو را از نو میسازد (تاریخچهی اتاق میماند و با ابزار خوانده میشود).
اجراگر
اتاق روی اجراگرِ هر پروژه اجرا میشود. اجراگر باید room_command داشته باشد (مثل chat_command):
room_command = ["/home/karbaner/.karbaner/bin/room-claude.sh"]
room_idle_seconds = 900 # بعد از این مدت بیکاری، سشن بسته میشود
max_room_sessions = 6 # سقفِ سشنهای زندهی اتاق روی این ماشیننمونهی wrapper برای Claude Code در runner/deploy/room-claude.sh است و ابزارهای اتاق را سرورِ MCPِ
خودِ CLI میدهد (karbaner mcp)، پس CLI باید روی همان ماشین نصب باشد. وقتی سشنهایی که کار دارند
(نوبت، کارِ پسزمینه یا بیدارباشِ منتظر) به max_room_sessions برسند، اجراگر پروسهی تازه نمیسازد ولی
«توقف» و پیام به سشنهای زنده همچنان میرسد.
فایلهای اتاق در state/room-files/<اتاق>/ با نامی از شمارهی پیام و شناسهی پیوست مینشینند.