Web interfaces
وبچت
وضعیت: رابط گفتوگوی SwiftUI در macOS/iOS مستقیماً با WebSocket مربوط به Gateway ارتباط برقرار میکند. هیچ مرورگر تعبیهشده یا سرور استاتیک محلی وجود ندارد.
چیست
- یک رابط گفتوگوی بومی برای Gateway.
- از همان نشستها و قواعد مسیریابی کانالهای دیگر استفاده میکند.
- مسیریابی قطعی: پاسخها همیشه به WebChat بازمیگردند.
- تاریخچه همیشه از Gateway دریافت میشود (بدون پایش فایل محلی). اگر Gateway در دسترس نباشد، WebChat فقطخواندنی است.
شروع سریع
- Gateway را راهاندازی کنید.
- رابط WebChat (برنامه macOS/iOS) یا زبانه گفتوگوی رابط کنترل را باز کنید.
- مطمئن شوید یک مسیر معتبر احراز هویت 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کوتاه شده باشد، رابط کنترل میتواند یک خوانشگر جانبی باز کند و ورودی کاملِ نرمالسازیشده برای نمایش را برحسب تقاضا از طریقchat.message.getدریافت کند، بدون آنکه اندازه پیشفرض محموله تاریخچه افزایش یابد.chat.message.getاز همان شاخه رونوشت و قواعد نمایشchat.historyاستفاده میکند، اما یک ورودی را باmessageIdهدف میگیرد و هنگامی که دیگر امکان بازگرداندن محتوای کامل وجود ندارد، دلیل واقعیِ در دسترس نبودن را برمیگرداند. chat.historyبرای فایلهای نشست فقطافزودنی از شاخه فعال رونوشت پیروی میکند؛ بنابراین شاخههای بازنویسی رهاشده و نسخههای جایگزینشده اعلان در WebChat نمایش داده نمیشوند.- ورودیهای Compaction بهشکل جداکننده «تاریخچه فشردهشده» نمایش داده میشوند که توضیح میدهد رونوشت فشردهشده بهعنوان نقطه وارسی حفظ شده است و کنشی برای بازکردن نقاط وارسی نشست دارد (ایجاد شاخه یا بازیابی، در صورت مجازبودن دسترسیها).
- رابط کنترل مقدار پشتیبان Gateway یعنی
sessionIdرا کهchat.historyبرمیگرداند به خاطر میسپارد و آن را در فراخوانیهای بعدیchat.sendمیگنجاند؛ بنابراین اتصالهای مجدد و تازهسازی صفحه همان گفتوگوی ذخیرهشده را ادامه میدهند، مگر اینکه کاربر نشستی را آغاز یا بازنشانی کند. chat.sendیک کلید همتوانی میگیرد (رابط کنترل از شناسه اجرا استفاده میکند)؛ Gateway درخواستهای تکراریِ دارای همان کلید را حذف میکند، بنابراین ارسالهای مجدد یا تکراریِ در حال انجام برای همان نشست/پیام/پیوستها اجرای دومی ایجاد نمیکنند.- فایلهای راهاندازی فضای کاری و دستورالعملهای در انتظار
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آن را حذف کرده است، و سپس آیا ادغام خوشبینانه انتهای رابط کنترل، وضعیت تحویل محلی را با تصویر لحظهای ماندگارشده جایگزین کرده است.
پاسخهای نهایی اجرای عادی عامل باید ماندگار باشند، زیرا زمان اجرای تعبیهشده، message_end دستیار را مینویسد. هر سازوکار جایگزینی که محموله نهایی تحویلشده را در رونوشت منعکس میکند، ابتدا باید از تکرار نوبت دستیاری که زمان اجرای تعبیهشده قبلاً نوشته است جلوگیری کند.
پنل ابزارهای عاملهای رابط کنترل
- پنل ابزارهای
/agentsدر رابط کنترل، نمایی با عنوان «هماکنون در دسترس» دارد که از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: زبانه گفتوگوی رابط کنترل در مرورگر میتواند در صورت فعالبودن، از سرآیندهای هویت Serve مربوط به Tailscale استفاده کند.gateway.auth.mode: "trusted-proxy": احراز هویت پروکسی معکوس برای کلاینتهای مرورگر پشت یک منبع پروکسی غیر-loopback آگاه از هویت (به احراز هویت پروکسی مورد اعتماد مراجعه کنید).gateway.remote.url،gateway.remote.token،gateway.remote.password: مقصد Gateway راه دور.session.*: ذخیرهسازی نشست و مقادیر پیشفرض کلید اصلی.