Web interfaces
وبچت
وضعیت: رابط چت SwiftUI در macOS/iOS مستقیماً با WebSocket متعلق به Gateway ارتباط برقرار میکند. هیچ مرورگر تعبیهشده یا سرور استاتیک محلی وجود ندارد.
چیستی آن
- یک رابط چت بومی برای Gateway.
- از همان نشستها و قواعد مسیریابی کانالهای دیگر استفاده میکند.
- مسیریابی قطعی: پاسخها همیشه به WebChat بازمیگردند.
- تاریخچه همیشه از Gateway دریافت میشود (بدون پایش فایل محلی). اگر Gateway در دسترس نباشد، WebChat فقطخواندنی است.
شروع سریع
- Gateway را راهاندازی کنید.
- رابط WebChat (برنامه macOS/iOS) یا زبانه چت Control UI را باز کنید.
- اطمینان حاصل کنید که یک مسیر معتبر احراز هویت Gateway پیکربندی شده است (بهطور پیشفرض با راز مشترک، حتی روی loopback).
نحوه کار
- رابط کاربری به WebSocket متعلق به Gateway متصل میشود و از متدهای RPC
chat.history، chat.send، chat.injectو chat.message.getاستفاده میکند. chat.historyبرای پایداری محدود شده است: Gateway ممکن است فیلدهای متنی طولانی را کوتاه کند، فرادادههای سنگین را حذف کند و ورودیهای بیشازحد بزرگ را با[chat.history omitted: message too large]جایگزین کند. کلاینتهای API میتوانند برای لغو محدودیت پیشفرض در یک فراخوانی، یکmaxCharsمختص هر درخواست ارسال کنند.- وقتی یک پیام قابلمشاهده دستیار در
chat.historyکوتاه شده باشد، Control UI میتواند یک نمایشگر جانبی باز کند و ورودی کاملِ نرمالسازیشده برای نمایش را در صورت نیاز از طریقchat.message.getدریافت کند، بدون آنکه بار داده پیشفرض تاریخچه افزایش یابد.chat.message.getاز همان شاخه رونوشت و قواعد نمایشchat.historyاستفاده میکند، اما یک ورودی را بر اساسmessageIdهدف میگیرد و اگر دیگر نتوان محتوای کامل را بازگرداند، دلیل واقعی عدم دسترسی را برمیگرداند. chat.historyبرای فایلهای نشست فقطافزودنی، شاخه فعال رونوشت را دنبال میکند؛ بنابراین شاخههای بازنویسی رهاشده و نسخههای جایگزینشده پرامپت در WebChat رندر نمیشوند.- ورودیهای Compaction بهصورت جداکننده «تاریخچه فشردهشده» رندر میشوند که توضیح میدهد رونوشت فشردهشده بهعنوان نقطه بازرسی حفظ شده است و عملی برای بازکردن نقاط بازرسی نشست ارائه میکند (ایجاد شاخه یا بازیابی، در صورت اجازه مجوزها).
- Control UI مقدار پشتیبان Gateway یعنی
sessionIdرا کهchat.historyبرمیگرداند به خاطر میسپارد و آن را در فراخوانیهای بعدیchat.sendقرار میدهد؛ بنابراین اتصالهای مجدد و تازهسازی صفحه همان گفتوگوی ذخیرهشده را ادامه میدهند، مگر اینکه کاربر نشستی را آغاز یا بازنشانی کند. - ارسالهای پیشزمینه همچنین برگ شاخه نمایشدادهشده از تاریخچه رندرشده را بهصورت
expectedLeafEntryIdدربر میگیرند؛ اگر کلاینت دیگری ابتدا شاخه را عوض کرده باشد، Control UI پیام را برای بازبینی نگه میدارد و بهجای ارسال آن به شاخه جدید، رونوشت را تازهسازی میکند. بازپخشهای اتصال مجدد و صندوق خروجی بازیابیشده پس از تطبیق تاریخچه جاری، عمداً این پیششرط را حذف میکنند. chat.sendیک کلید همتوانی میپذیرد (Control UI از شناسه اجرا استفاده میکند)؛ Gateway درخواستهای تکراری با همان کلید را حذف میکند، بنابراین تلاشهای مجدد یا ارسالهای تکراریِ در حال انجام برای همان نشست/پیام/پیوستها اجرای دومی ایجاد نمیکنند.- پاسخدادن به یک پیام مشخص (کلیک راست → Reply) شناسه رونوشت هدف را هنگام
chat.sendبهصورتreplyToIdارسال میکند. Gateway آن پیام را از تاریخچه نشست پیدا میکند و همان فراداده زمینه پاسخِ مستقل از کانال را که پاسخهای Discord استفاده میکنند، تکمیل میکند: عاملهاhas_reply_contextرا بههمراه بلوک نامطمئن «هدف پاسخِ پیام جاری کاربر» شامل برچسب فرستنده و بدنه میبینند. (پرامپتهای Webchat، طبق سیاست موجود پرامپت بایتپایدار برای نشستهای مستقیم webchat، شناسههای ناپایدار گفتوگو مانندreply_to_idرا پنهان نگه میدارند.) اهداف پاسخ بدون شناسه رونوشت ذخیرهشده (برای مثال ارسالهای در انتظار) به یک نقلقول درونخطی در بدنه پیام برمیگردند. - فایلهای راهاندازی فضای کاری و دستورالعملهای در انتظار
BOOTSTRAP.mdاز طریق بخش# Project Contextپرامپت سیستمی عامل ارائه میشوند، نه اینکه در پیام کاربر WebChat کپی شوند. اگر محتوای راهاندازی کوتاه شود، پرامپت سیستمی بهجای آن یک «اعلان زمینه راهاندازی» کوتاه دریافت میکند؛ تعدادهای تفصیلی و گزینههای پیکربندی در سطوح تشخیصی باقی میمانند. - نرمالسازی نمایش در
chat.historyاین موارد را حذف میکند: زمینه فقطزماناجرای OpenClaw، پوششهای پاکت ورودی، برچسبهای درونخطی دستور تحویل مانند[[reply_to_current]]، [[reply_to:<id>]]و [[audio_as_voice]]، بارهای XML فراخوانی ابزار بهصورت متن ساده (<tool_call>، <function_call>، <tool_calls>، <function_calls>، از جمله بلوکهای کوتاهشده) و توکنهای کنترلی افشاشده مدل با نویسههای ASCII یا تمامعرض. ورودیهای دستیار که کل متن قابلمشاهده آنها فقط توکن خاموشNO_REPLYباشد (بدون حساسیت به بزرگی و کوچکی حروف) حذف میشوند. - بارهای پاسخ علامتگذاریشده بهعنوان استدلال (
isReasoning: true) از محتوای دستیار WebChat، متن بازپخش رونوشت و بلوکهای محتوای صوتی کنار گذاشته میشوند تا بارهای صرفاً فکری بهصورت پیام قابلمشاهده دستیار یا صوت قابلپخش ظاهر نشوند. chat.injectیک یادداشت دستیار را مستقیماً به رونوشت میافزاید و آن را برای رابط کاربری پخش میکند (بدون اجرای عامل).- اجراهای لغوشده میتوانند خروجی جزئی دستیار را در رابط کاربری قابلمشاهده نگه دارند. وقتی خروجی بافرشده وجود داشته باشد، Gateway آن متن جزئی را در تاریخچه رونوشت ذخیره میکند و ورودی را با فراداده لغو علامت میزند.
مدل رونوشت و تحویل
WebChat دو مسیر داده جداگانه دارد:
- ردیفهای رونوشت SQLite، رونوشت پایدار مدل/زمان اجرا هستند. در اجراهای عادی عامل، زمان اجرای تعبیهشده OpenClaw پیامهای قابلمشاهده برای مدلِ
user، assistantو toolResultرا از طریق دسترسیدهنده نشست ذخیره میکند. WebChat متن دلخواه مربوط به تحویل، وضعیت یا راهنما را در آن رونوشت نمینویسد. - رویدادهای
ReplyPayloadمتعلق به Gateway تصویر زنده تحویل هستند: برای نمایش WebChat/کانال، جریان بلوکی، برچسبهای دستور، تعبیه رسانه، پرچمهای TTS/صوت و رفتار جایگزین رابط کاربری نرمالسازی شدهاند. این رویدادها خودشان گزارش متعارف نشست نیستند. - چارچوبهایی که به پاسخهای قابلمشاهده از طریق
tools.messageنیاز دارند، همچنان از WebChat بهعنوان مقصد داخلی پاسخِ منبعِ اجرای جاری استفاده میکنند. یکmessage.sendبدون هدف از آن اجرای فعال WebChat در همان چت نمایش داده و در رونوشت نشست منعکس میشود؛ WebChat به یک کانال خروجی قابلاستفاده مجدد تبدیل نمیشود و هرگزlastChannelرا به ارث نمیبرد. - WebChat فقط زمانی ورودیهای رونوشت دستیار را تزریق میکند که Gateway مالک یک پیام نمایشدادهشده خارج از نوبت عادی عامل تعبیهشده باشد:
chat.inject، پاسخهای فرمان غیروابسته به عامل، خروجی جزئی لغوشده و مکملهای رونوشت رسانه مدیریتشده توسط WebChat. - اگر متن زنده دستیار هنگام اجرا ظاهر میشود اما پس از بارگذاری مجدد تاریخچه ناپدید میشود، بهترتیب بررسی کنید: آیا رونوشت SQLite شامل متن دستیار است، آیا تصویر نمایش
chat.historyآن را حذف کرده است، و سپس آیا ادغام انتهای خوشبینانه Control UI وضعیت تحویل محلی را با تصویر لحظهای ذخیرهشده جایگزین کرده است.
پاسخهای نهایی اجرای عادی عامل باید پایدار باشند، زیرا زمان اجرای تعبیهشده message_end دستیار را مینویسد. هر سازوکار جایگزینی که یک بار نهایی تحویلشده را در رونوشت منعکس میکند، باید ابتدا از تکرار نوبت دستیاری که زمان اجرای تعبیهشده قبلاً نوشته است جلوگیری کند.
پنل ابزارهای عاملها در Control UI
- پنل Tools متعلق به
/agentsدر Control UI یک نمای «همین حالا در دسترس» دارد کهtools.effective(sessionKey=...)پشتیبان آن است: تصویری فقطخواندنی و مشتقشده از سرور از موجودی ابزار نشست جاری، شامل ابزارهای هسته، Plugin، تحت مالکیت کانال و سرورهای MCP ازپیشکشفشده. - یک نمای جداگانه ویرایش پیکربندی (با پشتیبانی
tools.catalog) پروفایلها، جایگزینیهای مختص هر عامل و معناشناسی کاتالوگ را پوشش میدهد. - دسترسپذیری زمان اجرا مختص نشست است. تعویض نشستها روی یک عامل یکسان میتواند فهرست «همین حالا در دسترس» را تغییر دهد. اگر سرورهای MCP پیکربندیشده از زمان آخرین کشف متصل نشده یا تغییر نکرده باشند، پنل بهجای راهاندازی بیسروصدای انتقالهای MCP از مسیر خواندن، اعلانی نمایش میدهد.
- ویرایشگر پیکربندی بهمعنای دسترسپذیری زمان اجرا نیست؛ دسترسی مؤثر همچنان از تقدم سیاست (
allow/deny، جایگزینیهای مختص هر عامل و ارائهدهنده/کانال) پیروی میکند.
استفاده از راه دور
- حالت راه دور، WebSocket متعلق به Gateway را از طریق SSH/Tailscale تونل میکند.
- نیازی به اجرای سرور WebChat جداگانه نیست.
مرجع پیکربندی (WebChat)
پیکربندی کامل: پیکربندی
WebChat بخش پیکربندی ذخیرهشدهای ندارد. Gateway از محدودیت نمایش داخلی chat.history استفاده میکند؛ کلاینتهای API میتوانند برای لغو آن در یک فراخوانی، maxChars مختص هر درخواست را ارسال کنند. پیکربندی قدیمی channels.webchat و gateway.webchat بازنشسته شده است؛ برای حذف آن openclaw doctor --fix را اجرا کنید.
گزینههای سراسری مرتبط:
gateway.port، gateway.bind: میزبان/درگاه WebSocket.gateway.auth.mode، gateway.auth.token، gateway.auth.password: احراز هویت WebSocket با راز مشترک.gateway.auth.allowTailscale: زبانه چت Control UI در مرورگر میتواند هنگام فعالبودن، از سرآیندهای هویت Serve متعلق به Tailscale استفاده کند.gateway.auth.mode: "trusted-proxy": احراز هویت پراکسی معکوس برای کلاینتهای مرورگر پشت یک منبع پراکسی غیر-loopback آگاه از هویت (به احراز هویت پراکسی مورد اعتماد مراجعه کنید).gateway.remote.url، gateway.remote.token، gateway.remote.password: هدف Gateway راه دور.session.*: فضای ذخیرهسازی نشست و مقادیر پیشفرض کلید اصلی.