Gateway
پروتکل Gateway
پروتکل WS مربوط به Gateway، صفحهٔ کنترل واحد و مسیر انتقال Node برای OpenClaw است. کلاینتهای اپراتور و Node (CLI، رابط وب، برنامهٔ macOS، Nodeهای iOS/Android، Nodeهای بدون رابط) از طریق WebSocket متصل میشوند و هنگام دستدهی، یک نقش و دامنه اعلام میکنند.
بستههای npm
این بستهها همراه با چرخههای انتشار OpenClaw عرضه میشوند. در طول عرضهٔ اولیه،
ممکن است npm تا زمان انتشار نخستین نسخهٔ حاوی بسته، E404 را برگرداند.
@openclaw/gateway-protocolطرحوارهها، اعتبارسنجها، نوعهای TypeScript، ابزارهای کمکی سبک برای فریم و خطا و ثابتهای نسخه را منتشر میکند. فایل tarball آن شامل قرارداد ماشینخوانِ تولیدشدهٔprotocol.schema.jsonاست.@openclaw/gateway-clientکلاینت مرجع Node و یک ورودی امن برای مرورگر را در@openclaw/gateway-client/browserمنتشر میکند.
برای راهنمایی دربارهٔ چرخهٔ عمر برنامه، به ساخت کلاینت Gateway مراجعه کنید. برای برنامههایی که بر Gateway بهعنوان یک فرایند فرزند نظارت میکنند، به جاسازی OpenClaw مراجعه کنید.
انتقال و فریمبندی
- WebSocket، فریمهای متنی، محمولههای JSON.
- فریم نخست باید یک درخواست
connectباشد. - فریمهای پیش از اتصال به 64 KiB (
MAX_PREAUTH_PAYLOAD_BYTES) محدودند. پس از دستدهی، ازhello-ok.policy.maxPayloadوhello-ok.policy.maxBufferedBytesپیروی کنید. وقتی عیبیابی فعال باشد، فریمهای ورودی بیشازحد بزرگ و بافرهای خروجی کند، پیش از آنکه Gateway فریم را ببندد یا کنار بگذارد، رویدادهایpayload.largeرا منتشر میکنند. این رویدادها شاملsurface، اندازههای بایتی، محدودیتها و یک کد دلیل امن هستند و هرگز شامل بدنهٔ پیامها، محتوای پیوستها، بایتهای خام فریم، توکنها، کوکیها یا اسرار نمیشوند.
شکل فریمها:
- درخواست:
{type:"req", id, method, params} - پاسخ:
{type:"res", id, ok, payload|error} - رویداد:
{type:"event", event, payload, seq?, stateVersion?}
خطاهای پاسخ از { code, message, details?, retryable?, retryAfterMs? } استفاده میکنند.
کلاینتها باید بر اساس code و details.code شاخهبندی کنند؛ message برای انسان خوانا باقی میماند
و میتواند تغییر کند، مگر آنجا که یادداشت سازگاری خلاف آن را بیان کند. شکستهای
مجوزدهی در سطح متد از code: "FORBIDDEN" در سطح بالا همراه با
جزئیات ساختاریافتهٔ دامنههای مفقود استفاده میکنند:
- دامنهٔ مفقود:
{ code: "MISSING_SCOPE", missingScope, requiredScopes }.requiredScopesمجموعهٔ کامل دامنههای شناختهشده برای عملیات درخواستی است. پیام قدیمیmissing scope: <scope>برای کلاینتهای قدیمیتر حفظ شده است.
کلاینتها باید ابتدا details را بخوانند و از پیام قدیمی فقط بهعنوان
راهکار بازگشتی سازگاری استفاده کنند. readMissingScopeError و readMissingScopeErrorDetails از
@openclaw/gateway-protocol/gateway-error-details صادر میشوند؛ کلاینت Gateway امن برای مرورگر
آنها را دوباره از @openclaw/gateway-client/browser صادر میکند.
طرحوارهها با نامهای GatewayErrorDetailsSchema و
MissingScopeErrorDetailsSchema از @openclaw/gateway-protocol/schema صادر میشوند.
شکستهای دامنهٔ HTTP، شیء MISSING_SCOPE را زیر error.details بازتاب میدهند و
از وضعیت HTTP برابر با 403 استفاده میکنند.
متدهای دارای اثر جانبی به کلیدهای همتوانی نیاز دارند (طرحواره را ببینید).
دستدهی
Gateway یک چالش پیش از اتصال ارسال میکند:
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}کلاینت با connect پاسخ میدهد:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "client": { "id": "cli", "version": "1.2.3", "platform": "macos", "mode": "operator" }, "role": "operator", "scopes": ["operator.read", "operator.write"], "caps": [], "commands": [], "permissions": {}, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-cli/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Gateway با hello-ok پاسخ میدهد:
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}server، features، snapshot، policy و auth همگی برای
HelloOkSchema (packages/gateway-protocol/src/schema/frames.ts) الزامی هستند. auth
نقش/دامنههای مذاکرهشده را حتی زمانی که هیچ توکن دستگاهی صادر نشده باشد گزارش
میکند (شکل بالا). pluginSurfaceUrls اختیاری است و نامهای سطوح Plugin (برای مثال
canvas) را به URLهای میزبانیشده و دارای دامنه نگاشت میکند؛ ممکن است منقضی شود، بنابراین Nodeها
node.pluginSurface.refresh را با { "surface": "canvas" } فراخوانی میکنند تا یک ورودی تازه دریافت کنند.
مسیر منسوخشدهٔ canvasHostUrl / canvasCapability / node.canvas.capability.refresh
پشتیبانی نمیشود؛ از سطوح Plugin استفاده کنید.
appliedConfigHash اختیاریِ اسنپشات، بازبینی پیکربندی مبدأِ حلشدهای است
که زمان اجرای فعال Gateway پذیرفته است. کلاینتها میتوانند آن را با
config.get.configRevisionHash مقایسه کنند تا مشخص شود آیا یک پیکربندی ذخیرهشدهٔ جدیدتر همچنان
به راهاندازی مجدد نیاز دارد یا نه. config.get.hash همچنان بازبینی خام فایل ریشه است که
نگهبانهای تعارض نوشتن پیکربندی از آن استفاده میکنند.
تا زمانی که Gateway هنوز در حال تکمیل فرایندهای جانبی راهاندازی است، connect میتواند یک
خطای قابل تلاش مجددِ UNAVAILABLE همراه با details.reason: "startup-sidecars" و
retryAfterMs برگرداند. بهجای تلقی آن بهعنوان شکست نهایی دستدهی،
در محدودهٔ بودجهٔ اتصال دوباره تلاش کنید.
وقتی توکن دستگاه صادر شود، hello-ok.auth آن را اضافه میکند:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}راهاندازی اولیهٔ داخلی با کد QR/راهاندازی، یک مسیر تحویل به موبایل است. اتصال موفق با کد راهاندازی پایه، یک توکن اصلی Node بهعلاوهٔ یک توکن اپراتور محدود برمیگرداند:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}این تحویل اپراتور عمداً محدود است: برای آغاز چرخهٔ اپراتور موبایل
و راهاندازی بومی، از جمله operator.talk.secrets برای خواندن پیکربندی Talk،
کافی است، اما هیچ دامنهای برای تغییر جفتسازی و هیچ operator.admin ندارد. دسترسی گستردهتر
به جفتسازی/مدیریت به یک جریان جداگانهٔ جفتسازی یا توکنِ تأییدشده نیاز دارد.
hello-ok.auth.deviceTokens را فقط زمانی پایدار ذخیره کنید که احراز هویت راهاندازی اولیه از طریق یک
انتقال مورداعتماد (wss:// یا جفتسازی loopback/محلی) اجرا شده باشد.
کلاینتهای مورداعتمادِ بکاند در همان فرایند (client.id: "gateway-client"،
client.mode: "backend") میتوانند در اتصالهای مستقیم loopback هنگام احراز هویت
با توکن/گذرواژهٔ مشترک Gateway، device را حذف کنند. این مسیر مختص
RPCهای داخلی صفحهٔ کنترل است (برای مثال بهروزرسانی نشستهای عامل فرعی) و مانع از آن میشود
که خطوط پایهٔ قدیمی جفتسازی CLI/دستگاه، کار محلی بکاند را مسدود کنند. کلاینتهای
راهدور، دارای مبدأ مرورگر، Node و کلاینتهای صریحِ توکن دستگاه/هویت دستگاه همچنان
از بررسیهای عادی جفتسازی و ارتقای دامنه عبور میکنند.
نقش Worker و پروتکل بسته
Workerهای ابری از یک ورودی اختصاصی loopback از طریق تونل SSH تحت مالکیت Gateway
و سنجاقشده به کلید میزبان استفاده میکنند. این ورودی فقط هویت Worker را میپذیرد و هرگز
احراز هویت عمومی، رویدادهای Node، RPCهای اپراتور یا متدهای Plugin را هدایت نمیکند. یک connect
سختگیرانه، اعتبارنامهٔ کوتاهعمر و هششده در حالت ذخیره را که به محیط، هش
بسته، دورهٔ مالک، نسخهٔ مجموعهٔ RPC، زمان انقضا و یک نشست تهیپذیر مقید است
اعتبارسنجی میکند؛ همچنین نسخه و مجموعهٔ قابلیتهای فعلی را جداگانه بررسی میکند. موفقیت، حداقل
worker-hello-ok را برمیگرداند؛ مذاکرهٔ قابلیتها مستقل از نسخهٔ عمومی پروتکل
است. فریمها زیر 64 KiB باقی میمانند، بهجز فریم مذاکرهشدهٔ worker.inference.start
که میتواند تا 25 MiB باشد. فهرست مجاز بسته شامل worker.heartbeat،
worker.transcript.commit، worker.live-event، worker.inference.start و
worker.inference.cancel است.
ثبتهای رونوشت از حصارگذاری دورهٔ مالک، اتصال نشست تحت مالکیت Gateway، مقایسهوتعویض برگ پایه و بازپخش پایدار توالی استفاده میکنند؛ Gateway شناسههای ورودی رونوشت و والد را از طریق نویسندهٔ عادی نشست تولید میکند. مالکیت و انقضا در هر RPC دوباره بررسی میشوند.
قابلیتهای کلاینت
کلاینتهای اپراتور میتوانند قابلیتهای اختیاری را در connect.params.caps اعلام کنند:
tool-events: رویدادهای ساختاریافتهٔ چرخهٔ عمر ابزار را میپذیرد.inline-widgets: میتواند نتایج ابزارِ ویجت درونخطی میزبانیشده را رندر کند.
قابلیتهای کلاینت، کلاینت متصل را توصیف میکنند، نه مجوزدهی را. ابزارهای عامل میتوانند قابلیتهای الزامی را اعلام کنند؛ Gateway آن ابزارها را حذف میکند، مگر اینکه همهٔ الزامات در caps کلاینت مبدأ وجود داشته باشند. اجراهای برخاسته از کانال هیچ قابلیت کلاینت Gateway ندارند، بنابراین ابزارهای محدودشده بر اساس قابلیت، حتی وقتی سیاست ابزار صراحتاً آنها را مجاز میکند، در دسترس نیستند.
نمونهٔ اتصال Node
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "client": { "id": "ios-node", "version": "1.2.3", "platform": "ios", "mode": "node" }, "role": "node", "scopes": [], "caps": ["camera", "canvas", "screen", "location", "voice"], "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"], "permissions": { "camera.capture": true, "screen.record": false }, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-ios/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Nodeها ادعاهای قابلیت را هنگام اتصال اعلام میکنند:
caps: دستههای سطح بالا مانندcamera،canvas،screen،location،voice،talk.commands: فهرست مجاز فرمان برای فراخوانی.permissions: کلیدهای جزئی (برای مثالscreen.record،camera.capture).
Gateway این موارد را بهعنوان ادعا در نظر میگیرد و فهرستهای مجاز سمت سرور را اعمال میکند.
نقشها و دامنهها
برای مدل کامل دامنهٔ اپراتور، بررسیهای زمان تأیید و معناشناسی راز مشترک، به دامنههای اپراتور مراجعه کنید.
نقشها:
operator: کلاینت صفحهٔ کنترل (CLI/UI/اتوماسیون).node: میزبان قابلیت (camera/screen/canvas/system.run).worker: میزبان اجرای ابری روی پروتکل اختصاصی و بستهٔ Worker.
دامنههای اپراتور (src/gateway/operator-scopes.ts)، مجموعهٔ کامل بسته:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config همراه با includeSecrets: true به operator.talk.secrets (یا
operator.admin) نیاز دارد. وقتی اسرار گنجانده شدهاند، اعتبارنامهٔ ارائهدهندهٔ فعال Talk را
از talk.resolved.config.apiKey بخوانید؛ talk.providers.<id>.apiKey
شکل مبدأ خود را حفظ میکند و ممکن است یک شیء SecretRef یا رشتهای پوشاندهشده باشد.
متدهای RPC مربوط به Gateway که توسط Plugin ثبت شدهاند میتوانند دامنهٔ اپراتور
خود را درخواست کنند، اما این پیشوندهای رزروشدهٔ هسته همیشه به operator.admin
(src/shared/gateway-method-policy.ts) نگاشت میشوند: config.*، exec.approvals.*،
wizard.*، update.*.
دامنهٔ متد فقط نخستین دروازه است. برخی فرمانهای اسلش که از طریق
chat.send در دسترس قرار میگیرند، بررسیهای سختگیرانهتری در سطح فرمان اعمال میکنند: نوشتن پایدارِ /config set و
/config unset به operator.admin نیاز دارد، حتی برای کلاینتهای Gateway که
از قبل دامنهٔ اپراتور پایینتری دارند.
node.pair.approve افزون بر دامنهٔ پایهٔ متد
(operator.pairing)، یک بررسی دامنهٔ اضافی در زمان تأیید دارد که بر اساس
commands اعلامشدهٔ درخواست در انتظار (src/infra/node-pairing-authz.ts) انجام میشود:
| فرمانهای اعلامشده | دامنههای موردنیاز |
|---|---|
| هیچکدام | operator.pairing |
| فرمانهای عادی | operator.pairing + operator.write |
شامل system.run، system.run.prepare، system.which، browser.proxy، fs.listDir یا system.execApprovals.get/set |
operator.pairing + operator.admin |
قابلیتها/فرمانها/مجوزها (Node)
Nodeها هنگام اتصال، ادعاهای قابلیت را اعلام میکنند:
caps: دستههای سطحبالای قابلیت مانندcamera،canvas،screen،location،voiceوtalk.commands: فهرست مجاز فرمانها برای فراخوانی.permissions: کلیدهای تغییر وضعیت جزئی (برای مثالscreen.record،camera.capture).
Gateway این موارد را بهعنوان ادعا در نظر میگیرد و فهرستهای مجاز را در سمت سرور اعمال میکند.
Nodeهای متصل میتوانند پس از اتصال یا اتصال مجدد موفق، توصیفگرهای اختیاری ابزار Plugin یا MCP را که برای عامل قابلمشاهدهاند با
node.pluginTools.update منتشر کنند. میزبانهای Node بدون رابط برای اعمال تغییرات اعلانی موجودی MCP
دوباره راهاندازی میشوند. این روش بهروزرسانی تنها مسیر انتشار است؛ توصیفگرهای ابزار Plugin در
پارامترهای connect پذیرفته نمیشوند. هر توصیفگر باید از یک name ابزار امن برای ارائهدهنده استفاده کند و
یک command را در فهرست مجاز فرمانهای کنونی Node نام ببرد. Gateway به فرادادهٔ توصیفگر
از Node جفتشده اعتماد میکند، توصیفگرهای خارج از سطح فرمان تأییدشده را فیلتر میکند،
هنگام قطع اتصال Node آنها را حذف میکند و تلاشهای اپراتور برای
تغییر کاتالوگ Node دیگری را رد میکند. برای نادیدهگرفتن توصیفگرهای منتشرشده توسط Node، gateway.nodes.pluginTools.enabled: false
را تنظیم کنید.
میزبانهای Node متصل، کاتالوگ جایگزین کامل مهارتهای خود را با
node.skills.update منتشر میکنند. این روش مخصوص نقش Node تنها مسیر انتشار مهارتهای Node
است؛ مهارتها در پارامترهای connect پذیرفته نمیشوند. هر توصیفگر شامل
نامی امن، توضیح و محتوای محدودشدهٔ SKILL.md است. Gateway آن
محتوا را با بارگذار معمول مهارتها تجزیه میکند، تا زمانی که Node متصل است آن را در نماهای لحظهای مهارت عامل
میگنجاند و هنگام قطع اتصال حذف میکند. برای نادیدهگرفتن مهارتهای منتشرشده توسط Node،
gateway.nodes.allowSkills: false را تنظیم کنید.
حضور
system-presenceورودیهایی را برمیگرداند که بر پایهٔ هویت دستگاه کلیدگذاری شدهاند و شاملdeviceId،rolesوscopesهستند؛ بنابراین رابطهای کاربری میتوانند برای هر دستگاه یک ردیف نمایش دهند، حتی وقتی دستگاه هم بهعنوان اپراتور و هم بهعنوان Node متصل میشود.node.listشاملlastSeenAtMsوlastSeenReasonاختیاری است. Nodeهای متصل زمان اتصال کنونی را با دلیلconnectگزارش میکنند؛ Nodeهای جفتشده همچنین میتوانند حضور پایدار در پسزمینه را از طریق یک رویداد مورداعتماد Node گزارش کنند.
Nodeهای بومی macOS همچنین میتوانند رویدادهای احرازهویتشدهٔ node.presence.activity را
با زمان بیکاری ورودی محدودشده ارسال کنند. Gateway مُهرهای زمانی فعالیت را بر اساس
ساعت خودش استخراج میکند، تازهترین Mac متصل را از طریق node.list و
node.describe ارائه میدهد و بهروزرسانیهای node.presence را برای کلاینتهای دارای دامنهٔ خواندن پخش میکند.
وقتی کاربر اشتراکگذاری فعالیت را غیرفعال میکند، برنامه { "action": "clear" } را ارسال میکند؛
Gateway مُهرهای زمانی را فقط برای همان اتصال احرازهویتشدهٔ دقیق Node پاک میکند.
Gatewayهایی که پیش از این اقدام تأییدشونده هستند، آن را مدیریتنشده برمیگردانند؛ بنابراین Node
مبتنی بر Mac یک بار دوباره متصل میشود و اجازه میدهد پاکسازی هنگام قطع اتصال، وضعیت اتصال قدیمی را حذف کند.
برای رفتار انتخاب، حریم خصوصی، زمینهٔ مدل و مسیریابی اعلانها، به حضور رایانهٔ فعال
مراجعه کنید.
رویداد زندهبودن Node در پسزمینه
Nodeها برای ثبت اینکه یک
Node جفتشده هنگام بیدارشدن در پسزمینه زنده بوده است، بدون علامتگذاری آن بهعنوان متصل، node.event را با event: "node.presence.alive" فراخوانی میکنند:
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger یک شمارش بسته است: background، silent_push، bg_app_refresh،
significant_location، manual، connect. مقادیر ناشناخته به
background (src/shared/node-presence.ts) نرمالسازی میشوند. رویداد فقط برای
نشستهای احرازهویتشدهٔ دستگاه Node پایدار میشود؛ نشستهای بدون دستگاه یا جفتنشده
handled: false را برمیگردانند.
Gatewayهای موفق نتیجهای ساختاریافته برمیگردانند:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Gatewayهای قدیمیتر ممکن است برای node.event فقط { "ok": true } را برگردانند؛ آن را
یک RPC تأییدشده در نظر بگیرید، نه ذخیرهسازی پایدار حضور.
دامنهبندی رویدادهای پخشی
رویدادهای پخشی ارسالشده از سرور با دامنه محدود میشوند تا نشستهای
محدود به جفتسازی یا فقط Node، محتوای نشست را بهطور منفعل دریافت نکنند
(src/gateway/server-broadcast.ts):
- قابهای گفتوگو، عامل و نتیجهٔ ابزار (رویدادهای جریانی
agent، رویدادهای نتیجهٔ ابزار) دستکم بهoperator.readنیاز دارند. نشستهای فاقد آن، این قابها را کاملاً رد میکنند. - پخشهای
plugin.*تعریفشده توسط Plugin بهطور پیشفرض بهoperator.writeیاoperator.adminمحدود میشوند؛ ورودیهای صریحی مانندplugin.approval.requested/plugin.approval.resolvedدر عوض ازoperator.approvalsاستفاده میکنند. - رویدادهای وضعیت/انتقال (
heartbeat،presence،tick، چرخهٔ عمر اتصال/قطع اتصال) بدون محدودیت باقی میمانند تا سلامت انتقال برای همهٔ نشستهای احرازهویتشده قابلمشاهده باشد. - خانوادههای ناشناختهٔ رویداد پخشی بهطور پیشفرض با دامنه محدود میشوند (بسته در صورت خطا)، مگر اینکه یک کنترلکنندهٔ ثبتشده صراحتاً این محدودیت را کاهش دهد.
هر اتصال کلاینت شمارهٔ توالی مختص همان کلاینت را نگه میدارد؛ بنابراین پخشها در آن سوکت بهصورت یکنواخت صعودی مرتب میمانند، حتی وقتی کلاینتهای مختلف زیرمجموعههای متفاوتی از جریان رویداد را پس از فیلتر دامنه میبینند.
خانوادههای روش RPC
hello-ok.features.methods یک فهرست اکتشافی محافظهکارانه است که از
src/gateway/server-methods-list.ts بههمراه خروجیهای روش Plugin/کانال بارگذاریشده
ساخته میشود؛ این فهرست، خروجی تولیدشدهٔ همهٔ روشها نیست و برخی روشها (برای
مثال push.test، web.login.start، web.login.wait، sessions.usage)
عمداً از اکتشاف کنار گذاشته شدهاند، هرچند روشهایی واقعی و قابلفراخوانی
هستند. این را اکتشاف قابلیت در نظر بگیرید، نه فهرست کامل
src/gateway/server-methods/*.ts.
سامانه و هویت
healthنمای لحظهای ذخیرهشده یا تازه بررسیشدهٔ سلامت Gateway را برمیگرداند.diagnostics.stabilityثبتکنندهٔ اخیر، محدود و تشخیصی پایداری را برمیگرداند: نام رویدادها، تعدادها، اندازههای بایتی، خوانشهای حافظه، وضعیت صف/نشست، نامهای کانال/Plugin و شناسههای نشست. بدون متن گفتوگو، بدنههای Webhook، خروجی ابزار، بدنهٔ خام درخواست/پاسخ، توکن، کوکی یا اسرار. بهoperator.readنیاز دارد.statusخلاصهٔ Gateway به سبک/statusرا برمیگرداند؛ فیلدهای حساس فقط برای کلاینتهای اپراتور دارای دامنهٔ مدیریت.gateway.identity.getهویت دستگاه Gateway را که در جریانهای رله و جفتسازی استفاده میشود برمیگرداند.system-presenceنمای لحظهای حضور کنونی دستگاههای اپراتور/Node متصل را برمیگرداند.system-eventیک رویداد سیستمی اضافه میکند و میتواند زمینهٔ حضور را بهروزرسانی/پخش کند.last-heartbeatآخرین رویداد Heartbeat ذخیرهشده را برمیگرداند.set-heartbeatsپردازش Heartbeat را در Gateway فعال یا غیرفعال میکند.gateway.suspend.prepareفقط زمانی یک اجارهٔ کوتاه تعلیق مشارکتی ایجاد میکند که کار رهگیریشدهٔ Gateway بیکار باشد.gateway.suspend.statusآن اجاره را بررسی میکند وgateway.suspend.resumeپس از خروج از حالت انجماد یا عملیات لغوشدهٔ میزبان، آن را آزاد میکند.
مدلها و میزان استفاده
models.listکاتالوگ مدلهای مجاز در زمان اجرا را برمیگرداند. بخش «نماهایmodels.list» را در ادامه ببینید.usage.statusخلاصهٔ بازههای استفاده/سهمیهٔ باقیماندهٔ ارائهدهنده را برمیگرداند.usage.costخلاصهٔ تجمیعی هزینهٔ استفاده را برای یک بازهٔ زمانی برمیگرداند. برای یک عامل،agentIdرا ارسال کنید یا برای تجمیع عاملهای پیکربندیشده،agentScope: "all"را ارسال کنید.doctor.memory.statusآمادگی حافظهٔ برداری / تعبیهٔ ذخیرهشده برای فضای کاری عامل پیشفرض فعال را برمیگرداند.{ "probe": true }یا{ "deep": true }را فقط برای پینگ صریح و زندهٔ ارائهدهندهٔ تعبیه ارسال کنید. برای محدودکردن آمار مخزن Dreaming به فضای کاری یک عامل،{ "agentId": "agent-id" }را ارسال کنید؛ حذف آن باعث تجمیع فضاهای کاری پیکربندیشدهٔ Dreaming میشود.doctor.memory.dreamDiary،doctor.memory.backfillDreamDiary،doctor.memory.resetDreamDiary،doctor.memory.resetGroundedShortTerm،doctor.memory.repairDreamingArtifactsوdoctor.memory.dedupeDreamDiaryمقدار اختیاری{ "agentId": "agent-id" }را میپذیرند؛ اگر حذف شود، روی فضای کاری عامل پیشفرض پیکربندیشده عمل میکنند.doctor.memory.remHarnessیک پیشنمایش محدود و فقطخواندنی از مهار REM را برای کلاینتهای صفحهٔ کنترل راهدور برمیگرداند که شامل مسیرهای فضای کاری، قطعههای حافظه، Markdown زمینهدار رندرشده و نامزدهای ارتقای عمیق است. بهoperator.readنیاز دارد.sessions.usageخلاصهٔ استفاده بهازای هر نشست را برمیگرداند. برای یک عامل،agentIdرا ارسال کنید یا برای فهرستکردن عاملهای پیکربندیشده در کنار هم،agentScope: "all"را ارسال کنید. هر دو روش استفاده،mode: "specific"را با یکtimeZoneاز IANA برای مرزها و بازههای روز تقویمی آگاه از DST میپذیرند.utcOffsetهمچنان برای کلاینتهای قدیمیتر و بهعنوان گزینهٔ جایگزین هنگامی که محیط اجرای Gateway منطقهٔ درخواستی را تشخیص نمیدهد، پشتیبانی میشود.sessions.usage.timeseriesاستفادهٔ سری زمانی را برای یک نشست برمیگرداند.sessions.usage.logsورودیهای گزارش استفاده را برای یک نشست برمیگرداند.
کانالها و کمکابزارهای ورود
channels.statusخلاصهٔ وضعیت کانال/Plugin داخلی و همراه را برمیگرداند.channels.logoutدر صورت پشتیبانی کانال، از یک کانال/حساب مشخص خارج میشود.web.login.startجریان ورود QR/وب را برای ارائهدهندهٔ کنونی کانال وب دارای قابلیت QR آغاز میکند.web.login.waitمنتظر تکمیل آن جریان میماند و در صورت موفقیت، کانال را راهاندازی میکند.push.testیک اعلان آزمایشی APNs به یک Node ثبتشدهٔ iOS ارسال میکند.voicewake.getمحرکهای ذخیرهشدهٔ واژهٔ بیدارباش را برمیگرداند.voicewake.setمحرکهای واژهٔ بیدارباش را بهروزرسانی و تغییر را پخش میکند.
مدیریت Plugin
plugins.list(operator.read) فهرست Pluginهای نصبشده را بههمراه گزینههای رسمی منتخب محلی، اطلاعات عیبیابی، و اینکه آیا حالت نصب فعلی اجازه اعمال تغییرات را میدهد، برمیگرداند.plugins.search(operator.read) خانوادههای کد-Plugin و بسته-Plugin قابلنصب ClawHub را جستوجو میکند. مقدار غیرخالیqueryو مقدار اختیاریlimitاز 1 تا 100 را ارسال کنید.plugins.install(operator.admin) یا یک ورودی کاتالوگ رسمی را با{ source: "official", pluginId }نصب میکند، یا یک بسته ClawHub را با{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }. نصبهای ClawHub بررسیهای اعتماد Gateway، یکپارچگی، و سیاست نصب را حفظ میکنند. نصبهای موفق به راهاندازی مجدد Gateway نیاز دارند.plugins.setEnabled(operator.admin) سیاست فعالبودن یک Plugin نصبشده را با{ pluginId, enabled }تغییر میدهد. پاسخ شامل ورودی کاتالوگ بهروزشده، فراداده راهاندازی مجدد، و هرگونه هشدار انتخاب جایگاه است.plugins.uninstall(operator.admin) یک Plugin نصبشده خارجی را با{ pluginId }حذف میکند: ارجاعهای پیکربندی، رکورد نصب، و فایلهای مدیریتشده. Pluginهای همراه را نمیتوان حذف نصب کرد و فقط میتوان آنها را غیرفعال کرد. پاسخ، اقدامات حذف را فهرست میکند و همیشه به راهاندازی مجدد Gateway نیاز دارد.
پیامرسانی و گزارشها
send، RPC تحویل خروجی مستقیم برای ارسالهای هدفگیریشده بر اساس کانال/حساب/رشته، خارج از اجراکننده چت است.logs.tailدنباله گزارش فایل پیکربندیشده Gateway را با کنترلهای مکاننما/حد و حداکثر بایت برمیگرداند.
پایانه اپراتور
terminal.openیک PTY میزبان را برایagentIdصریح یا عامل پیشفرض آغاز میکند و عامل نهایی، دایرکتوری کاری، پوسته، و وضعیت محدودسازی را برمیگرداند.terminal.input،terminal.resize، وterminal.closeفقط روی نشستهایی عمل میکنند که متعلق به اتصال فراخواننده هستند.terminal.uploadیک فایل base64 تا سقف 16 MiB میپذیرد، آن را در یک دایرکتوری موقت خصوصی 24 ساعته روی Gateway نشست یا میزبان Node جفتشده قرار میدهد، و مسیر مطلق را برمیگرداند. فراخواننده همچنان باید آن مسیر را جایگذاری یا بهنحوی دیگر استفاده کند؛ RPC هرگز ورودی پایانه را نمینویسد یا فرمانی را اجرا نمیکند.- رویدادهای
terminal.dataوterminal.exitفقط به اتصالی جریان مییابند که مالک نشست است. - نشستهایی که اتصالشان قطع میشود، جدا میشوند، نه متوقف: آنها برای
gateway.terminal.detachedSessionTimeoutSecondsقابل اتصال مجدد باقی میمانند (پیشفرض 300؛0توقف هنگام قطع اتصال را بازمیگرداند)، درحالیکه خروجی اخیر در یک بافر محدود سمت سرور انباشته میشود. terminal.listنشستهای قابل اتصال را برمیگرداند؛terminal.attachیک نشست زنده یا جداشده را دوباره به اتصال فراخواننده پیوند میدهد و بافر بازپخش را برمیگرداند (تصاحب به سبک tmux — مالک زنده قبلی،terminal.exitرا با دلیلdetachedدریافت میکند)؛terminal.textبافر را بدون اتصال، بهصورت متن ساده میخواند.- هر متد پایانه به
operator.adminنیاز دارد؛gateway.terminal.enabledباید صراحتاً true باشد. عاملهای کاملاً sandboxشده پذیرفته نمیشوند و تغییر سیاست عامل، PTYهای موجود و درحال اجرا، ازجمله موارد جداشده، را میبندد.
گفتوگو و TTS
talk.catalogکاتالوگ فقطخواندنی ارائهدهندگان گفتوگو را برای گفتار، رونویسی جریانی، و صدای بلادرنگ برمیگرداند: شناسههای استاندارد ارائهدهنده، نامهای مستعار رجیستری، برچسبها، وضعیت پیکربندیشده، نتیجه اختیاریreadyدر سطح گروه، شناسههای مدل/صدای در معرض نمایش، حالتهای استاندارد، انتقالها، راهبردهای مغز، و پرچمهای صوتی/قابلیتی بلادرنگ، بدون بازگرداندن اسرار ارائهدهنده یا تغییر پیکربندی سراسری. Gatewayهای فعلی پس از اعمال انتخاب ارائهدهنده زمان اجرا،readyرا تنظیم میکنند؛ نبود آن در Gatewayهای قدیمیتر را تأییدنشده در نظر بگیرید.talk.configمحموله پیکربندی مؤثر گفتوگو را برمیگرداند؛includeSecretsبهoperator.talk.secrets(یاoperator.admin) نیاز دارد.talk.session.createیک نشست گفتوگوی تحت مالکیت Gateway را برایrealtime/gateway-relay،transcription/gateway-relay، یاstt-tts/managed-roomایجاد میکند. برایstt-tts/managed-room، فراخوانندگانoperator.writeکهsessionKeyرا ارسال میکنند، بایدspawnedByرا نیز برای مشاهده کلید نشست در محدوده ارسال کنند؛ ایجادsessionKeyبدون محدوده وbrain: "direct-tools"بهoperator.adminنیاز دارند.talk.session.joinتوکن نشست اتاق مدیریتشده را اعتبارسنجی میکند، در صورت نیازsession.readyیاsession.replacedرا منتشر میکند، و فراداده اتاق/نشست را بههمراه رویدادهای اخیر گفتوگو برمیگرداند، اما هرگز توکن متن ساده یا هش آن را بازنمیگرداند.talk.session.appendAudioصوت ورودی PCM با کدگذاری base64 را به نشستهای رونویسی و رله بلادرنگ تحت مالکیت Gateway اضافه میکند.talk.session.startTurn،talk.session.endTurn، وtalk.session.cancelTurnچرخه عمر نوبت اتاق مدیریتشده را با رد نوبت منقضی پیش از پاکشدن وضعیت هدایت میکنند.talk.session.cancelOutputخروجی صوتی دستیار را متوقف میکند؛ کاربرد اصلی آن ورود مزاحم کنترلشده با VAD در نشستهای رله Gateway است.talk.session.submitToolResultفراخوانی ابزار ارائهدهنده را که یک نشست رله بلادرنگ تحت مالکیت Gateway منتشر کرده است، تکمیل میکند. درخواست منتظر هر سیگنال تکمیل ناهمگامی میماند که پل ارائهدهنده در معرض نمایش قرار میدهد؛ ارسالهای ناموفق، اجرای پیوندخورده را فعال نگه میدارند و رویداد نتیجه ابزار موفق منتشر نمیکنند. برای خروجی موقت ابزار،options: { willContinue: true }را ارسال کنید؛ یا وقتی پل ارائهدهنده پشتیبانی از سرکوب را اعلام میکند و نتیجه نباید پاسخ دیگری را آغاز کند،options: { suppressResponse: true }را ارسال کنید.talk.session.steerکنترل صوتی اجرای فعال را به یک نشست گفتوگوی مبتنی بر عامل و تحت مالکیت Gateway ارسال میکند:{ sessionId, text, mode? }، که در آنmodeیکی ازstatus،steer،cancel، یاfollowupاست؛ حالت حذفشده بر اساس متن گفتاری دستهبندی میشود.talk.session.closeیک نشست رله، رونویسی، یا اتاق مدیریتشده تحت مالکیت Gateway را میبندد و رویدادهای پایانی گفتوگو را منتشر میکند.talk.modeوضعیت حالت فعلی گفتوگو را برای کلاینتهای WebChat/Control UI تنظیم/پخش میکند.talk.client.createبا استفاده ازwebrtcیاprovider-websocketیک نشست بلادرنگ ارائهدهنده تحت مالکیت کلاینت را ایجاد یا از سر میگیرد، درحالیکه Gateway مالک اعتبارنامهها، دستورالعملها، سیاست ابزار، وvoiceSessionIdبازگرداندهشده است. کلاینتهاsessionKeyرا ارسال میکنند و هنگام جایگزینی انتقال ارائهدهنده طی یک تماس، ازvoiceSessionIdدوباره استفاده میکنند.talk.client.transcriptیک مورد نهاییشده{ role, text }را به نشست عادی عامل اضافه میکند.entryIdالزامی درونvoiceSessionIdهمتوان است؛ تلاشهای مجدد پیامهای رونویسی را تکراری نمیکنند.talk.client.closeنشست صوتی منطقی را پس از نوشتن رونویسیهای در انتظار میبندد. بستن همتوان است و ممکن است خلاصه تماسِ فقطجهش را به آخرین کانال غیر WebChat نشست تحویل دهد.talk.client.toolCallبه انتقالهای بلادرنگ تحت مالکیت کلاینت اجازه میدهد فراخوانیهای ابزار ارائهدهنده را به سیاست Gateway ارسال کنند. نخستین ابزار پشتیبانیشدهopenclaw_agent_consultاست؛ کلاینتها یک شناسه اجرا دریافت میکنند و پیش از ارسال نتیجه ابزار مختص ارائهدهنده، منتظر رویدادهای عادی چرخه عمر چت میمانند. اقدامات پراثر وابسته به صدا،VOICE_CONFIRMATION_REQUIRED:<id>را برمیگردانند تا زمانی که یک گفته نهاییشده بعدی کاربر صراحتاً همان اقدام دقیق را تأیید کند و مشورت بعدیconfirmationIdرا ارائه دهد.talk.client.steerکنترل صوتی اجرای فعال را برای انتقالهای بلادرنگ تحت مالکیت کلاینت ارسال میکند. Gateway اجرای تعبیهشده فعال را ازsessionKeyتشخیص میدهد و بهجای کنارگذاشتن بیصدای هدایت، یک نتیجه ساختیافته پذیرفتهشده/ردشده برمیگرداند.talk.eventکانال واحد رویداد گفتوگو برای آداپتورهای بلادرنگ، رونویسی، STT/TTS، اتاق مدیریتشده، تلفن، و جلسه است.talk.speakگفتار را از طریق ارائهدهنده فعال گفتارِ گفتوگو تولید میکند.tts.statusوضعیت فعالبودن TTS، ارائهدهنده فعال، ارائهدهندگان جایگزین، و وضعیت پیکربندی ارائهدهنده را برمیگرداند.tts.providersفهرست قابلمشاهده ارائهدهندگان TTS را برمیگرداند.tts.enableوtts.disableوضعیت ترجیحات TTS را تغییر میدهند.tts.setProviderارائهدهنده ترجیحی TTS را بهروزرسانی میکند.tts.convertتبدیل یکباره متن به گفتار را اجرا میکند.tts.speak(operator.write) مقدار غیرخالیtextرا با زنجیره پیکربندیشده ارائهدهنده عمومی TTS پردازش میکند و یک کلیپ کامل را بهصورت درونخطی درaudioBase64، بههمراهproviderو فراداده اختیاریoutputFormat،mimeType، وfileExtensionبرمیگرداند. برخلافtts.convert، مسیر محلی Gateway را برنمیگرداند؛ برخلافtalk.speak، به ارائهدهنده گفتوگو نیاز ندارد. متن بیش ازtts.maxTextLengthمقدارINVALID_REQUESTرا برمیگرداند؛ شکستهای تولید مقدارUNAVAILABLEرا برمیگردانند.
اسرار، پیکربندی، بهروزرسانی و راهانداز
secrets.reloadارجاعهای فعال SecretRef را دوباره تفکیک میکند و وضعیت زمان اجرای آگاه از مالک را بهصورت اتمی منتشر میکند. خرابیهای مالک واجد شرایط میتوانند باwarningCountبهصورت تنزل سرد یا کهنه منتشر شوند؛ خرابیهای سختگیرانه یا نگاشتنشده بارگذاری مجدد را رد میکنند و اسنپشات فعال را حفظ میکنند.secrets.resolveانتسابهای رازِ مقصد فرمان را برای یک مجموعه مشخص فرمان/مقصد تفکیک میکند.config.getاسنپشات فعلی پیکربندی روی دیسک،hashخام فایل ریشه،configRevisionHashتفکیکشده وappliedConfigHashاختیاری را برای بازبینی تفکیکشدهای برمیگرداند که زمان اجرای فعال Gateway پذیرفته است.config.setیک محموله پیکربندی اعتبارسنجیشده را مینویسد.config.patchیک بهروزرسانی جزئی پیکربندی را ادغام میکند. جایگزینی مخرب آرایه مستلزم وجود مسیر تحتتأثیر درreplacePathsاست؛ آرایههای تودرتو در ورودیهای آرایه از مسیرهای[]مانندagents.entries.*.skillsاستفاده میکنند.config.applyکل محموله پیکربندی را اعتبارسنجی و جایگزین میکند.config.schemaمحموله زنده طرحواره پیکربندی را که ابزارهای Control UI و CLI استفاده میکنند برمیگرداند: طرحواره،uiHints، نسخه، فراداده تولید و، در صورت بارگذاریپذیر بودن، فراداده طرحواره Plugin و کانال. این محموله شامل فرادادهtitle/descriptionاز همان برچسبها و متن راهنمای رابط کاربری است؛ از جمله شاخههای ترکیبی شیء تودرتو، نویسه عام، عضو آرایه وanyOf/oneOf/allOf، هرگاه مستندات فیلد منطبق وجود داشته باشد.config.schema.lookupیک محموله جستوجوی محدود به مسیر را برای یک مسیر پیکربندی برمیگرداند: مسیر نرمالشده، یک گره کمعمق طرحواره، راهنمای منطبق بههمراهhintPath،reloadKindاختیاری و خلاصه فرزندان بلافصل برای واکاوی در UI/CLI. مقدارreloadKindیکی ازrestart،hotیاnone(src/config/schema.ts) است و برنامهریز بارگذاری مجدد پیکربندی Gateway را برای مسیر درخواستی بازتاب میدهد. گرههای طرحواره جستوجو، مستندات کاربرمحور و فیلدهای رایج اعتبارسنجی (title،description،type،enum،const،format،pattern، کرانهای عدد/رشته/آرایه/شیء،additionalProperties،deprecated،readOnly،writeOnly) را نگه میدارند. خلاصه فرزندان،key،pathنرمالشده،type،required،hasChildren،reloadKindاختیاری و نیزhint/hintPathمنطبق را ارائه میکند.update.runجریان بهروزرسانی Gateway را اجرا میکند و تنها در صورت موفقیت بهروزرسانی، راهاندازی مجدد را زمانبندی میکند؛ فراخوانندههای دارای نشست میتوانندcontinuationMessageرا اضافه کنند تا هنگام راهاندازی، یک نوبت پیگیری عامل از طریق صف ادامه پس از راهاندازی مجدد از سر گرفته شود. بهروزرسانیهای مدیر بسته و بهروزرسانیهای نظارتشده وارسیکارپوشه git از صفحه کنترل، بهجای جایگزینکردن درخت بسته یا تغییر خروجی وارسیکارپوشه/ساخت درون Gateway زنده، از تحویل جداشده به سرویس مدیریتشده استفاده میکنند. یک تحویل آغازشده،ok: trueرا همراه باresult.reason: "managed-service-handoff-started"وhandoff.status: "started"برمیگرداند. دومینupdate.runهمزمان که همان فرایند Gateway آن را مدیریت کند،ok: falseرا همراه باresult.reason: "managed-service-handoff-already-running"وhandoff.status: "already-running"برمیگرداند؛ ادامه آن پذیرفته نمیشود، بنابراین فراخواننده میتواند پس از تکمیل بهروزرسانی فعال دوباره تلاش کند. بهروزرسانهای مستقل CLI و فرایندهای جایگزین Gateway خارج از این محافظ محلی فرایند هستند. تحویلهای دردسترسنبوده یا ناموفق،ok: falseرا همراه باmanaged-service-handoff-unavailableیاmanaged-service-handoff-failedو در صورت نیاز به بهروزرسانی دستی پوسته، بههمراهhandoff.commandبرمیگردانند. دردسترسنبودن یعنی OpenClaw فاقد مرز امن ناظر یا هویت پایدار سرویس است، مانندOPENCLAW_SYSTEMD_UNITبرای systemd. طی یک تحویل آغازشده، نشانگر راهاندازی مجدد ممکن است برای مدت کوتاهیstats.reason: "restart-health-pending"را گزارش کند؛ ادامه تا زمانی بهتأخیر میافتد که CLI، Gateway راهاندازیشده مجدد را تأیید کند و نشانگر نهاییokرا بنویسد.update.statusجدیدترین نشانگر راهاندازی مجدد بهروزرسانی را تازهسازی و برمیگرداند، از جمله نسخه در حال اجرا پس از راهاندازی مجدد، در صورت موجود بودن.wizard.start،wizard.next،wizard.statusوwizard.cancelراهانداز ورود اولیه را از طریق WS RPC ارائه میکنند.
ابزارهای کمکی عامل و فضای کاری
agents.listورودیهای عامل قابلمشاهده برای Gateway را برمیگرداند، از جمله فراداده مؤثر مدل/زمان اجرا وkindمعنایی اختیاری (agentیاsystem). کلاینتها قابلیت دستدهیagent-kindرا اعلام میکنند تا فهرست کامل نوعدار را دریافت کنند؛ کلاینتهای فاقد آن، فهرست قدیمیِ امن برای انتخابگر را بدون ردیفهای سیستمی نگه میدارند. کلاینتهای آگاه از نوع، ردیفهایsystemرا از انتخابگرهای عادی حذف میکنند، اما آنها را در نماهای تشخیصی نگه میدارند. Gatewayهای قدیمیتر v4 ممکن است ردیفهایی بدونkindبرگردانند.agents.create،agents.updateوagents.deleteرکوردهای عامل و سیمکشی فضای کاری را مدیریت میکنند.agents.files.list،agents.files.getوagents.files.setفایلهای راهاندازی اولیه فضای کاری را که برای یک عامل ارائه شدهاند مدیریت میکنند.audit.activity.listدفتر ثبت فعالیت نسخهبندیشده و صرفاً شامل فراداده را برمیگرداند؛audit.listهمچنان RPC اجرای/ابزارِ امن از نظر سازگاری است.agents.workspace.listوagents.workspace.get(operator.read) مرور صفحهبندیشده و فقطخواندنی پوشه فضای کاری یک عامل را برای کلاینتهای حاضر در دامنه اپراتور مورداعتمادِ توصیفشده در دامنههای اپراتور ارائه میکنند. درخواستها فقط مسیرهای نسبی به فضای کاری را میپذیرند؛ خواندنها در ریشه فضای کاری با مسیر واقعی محدود میمانند (گریز از طریق پیوند نمادین و پیوند سخت رد میشود)، سقف اندازه دارند و به متن UTF-8 بههمراه انواع رایج تصویر (base64) محدودند. پاسخها مسیر فضای کاری میزبان را افشا نمیکنند. هیچ عملیات نوشتنی در این فضای نام وجود ندارد.tasks.list،tasks.getوtasks.cancelدفتر ثبت وظایف Gateway را در اختیار کلاینتهای SDK و اپراتور قرار میدهند. RPCهای دفتر ثبت وظایف را در ادامه ببینید.artifacts.list،artifacts.getوartifacts.downloadخلاصهها و بارگیریهای مصنوعات استخراجشده از رونوشت را برای یک دامنه صریحsessionKey،runIdیاtaskIdارائه میکنند. پرسوجوهای اجرا و وظیفه، نشست مالک را در سمت سرور تفکیک میکنند و فقط رسانههای رونوشت با منشأ منطبق را برمیگردانند؛ منابع URL ناامن یا محلی، بهجای واکشی در سمت سرور، بارگیری پشتیبانینشده برمیگردانند.environments.listوenvironments.statusکشف محیط محلی Gateway و Node را حفظ میکنند. کارکنان ابری پیکربندیشده و رکوردهای پایداری که نمایههای پیشین بهجا گذاشتهاند، فرادادهworkerرا باproviderId،leaseIdاختیاری،state،ageMs،idleMsاختیاری وattachedSessionIdsاضافه میکنند. وضعیتهای چرخه عمر کارگر عبارتاند ازrequested،provisioning،bootstrapping،ready،attached،idle،draining،destroying،destroyed،failedوorphaned.environments.create({ profileId, idempotencyKey }) یک کارگر را از نمایه ارائهدهنده Plugin پیکربندیشده تأمین میکند؛ تلاشهای مجدد با همان کلید، عملیات پایدار را دوباره استفاده میکنند.environments.destroy({ environmentId }) برچیدن همتوان تکرار یک محیط کارگر پایدار را درخواست میکند. هر دو بهoperator.adminنیاز دارند، نوشتنهای صفحه کنترل هستند و همان ساختار خلاصه محیط را که پاسخهای وضعیت استفاده میکنند برمیگردانند.agent.identity.getهویت مؤثر دستیار را برای یک عامل یا نشست برمیگرداند.agent.waitتا پایان یک اجرا منتظر میماند و در صورت موجود بودن، اسنپشات پایانی را برمیگرداند.
کنترل نشست
sessions.listنمایهٔ فعلی نشست را برمیگرداند که در صورت پیکربندیشدن بکاند زماناجرای عامل، فرادادهٔagentRuntimeهر ردیف را نیز شامل میشود. هنگامی که جایدهی cloud-worker فعال باشد یا وضعیت بازیابی پایدار وجود داشته باشد، ردیفهای نشست افزون بر این شامل یک وضعیت بستهٔplacement(local،requested،provisioning،syncing،starting،active،draining،reconciling،reclaimedیاfailed) بههمراه فیلدهای مختص آن وضعیت برای محیط، دورهٔ مالک، فضای کاری، بسته، نشانگر ACK یا بازیابی هستند.sessions.subscribeوsessions.unsubscribeاشتراک رویدادهای تغییر نشست را برای کلاینت WS فعلی فعال یا غیرفعال میکنند.sessions.messages.subscribeوsessions.messages.unsubscribeاشتراک رویدادهای رونوشت/پیام را برای یک نشست فعال یا غیرفعال میکنند. برای دریافت رویدادهای پالایششدهٔ چرخهٔ حیاتsession.approvalمربوط به تأییدهایی که مخاطبان ذخیرهشدهٔ آنها دقیقاً آن نشست را شامل میشوند و اتصال بازبین آنها به کلاینت مشترکشونده مجوز میدهد،includeApprovals: trueرا نیز ارسال کنید. سپس پاسخ اشتراک شاملapprovalReplayمعوق و کرانداری میشود؛ وقتیtruncatedنادرست باشد، این مقدار مرجع معتبر است. این انتخاب برای هر فراخوانی اشتراک جداگانه است و ماندگار نیست: اشتراک دوباره در همان نشست بدونincludeApprovals: true، اشتراک تأیید موجود را حذف میکند. افزون بر اختیار عادی خواندن نشست، این انتخاب بهoperator.adminیا در دستگاه جفتشده بهoperator.approvalsنیاز دارد.sessions.previewپیشنمایشهای کراندار رونوشت را برای کلیدهای مشخص نشست برمیگرداند.sessions.describeیک ردیف نشست Gateway را برای یک کلید دقیق نشست برمیگرداند.sessions.resolveیک مقصد نشست را تفکیک یا متعارفسازی میکند.sessions.createیک ورودی نشست جدید ایجاد میکند. مقادیر اختیاریmodelوthinkingLevelمدل اولیه و بازنویسیهای استدلال را بهصورت اتمی ذخیره میکنند.worktree: trueیک worktree مدیریتشده فراهم میکند؛worktreeBaseRef/worktreeNameاختیاری مرجع پایه و نام شاخه را انتخاب میکنند وexecNode(operator.admin) اجرای نشست را به یک میزبان Node متصل میکند. worktree ایجادشده در نتیجه بازگردانده میشود و در ردیف نشست (worktree: { id, branch, repoRoot }) ذخیره میشود. هنگامی که ورودی ایجاد شده اماchat.sendاولیهٔ تودرتوی آن رد شود، نتیجهٔ موفق شاملrunStarted: falseوrunErrorاست؛ کلاینتها میتوانند پرامپت را حفظ کنند و با کلید نشست بازگرداندهشده دوباره تلاش کنند. فراخوانی کهparentSessionKeyرا همراهemitCommandHooks: trueارسال میکند، باید نحوهٔ چرخهٔ حیات یک فرزند متمایز را نیز اعلام کند:succeedsParent: trueوالد را باsession_endپایان میدهد، درحالیکهfalseوالد را فعال نگه میدارد و فقطsession_startفرزند را منتشر میکند. حذفsucceedsParentرفتار قدیمی انتقال والد را برای کلاینتهای موجود حفظ میکند. این نحوهٔ چرخهٔ حیات هم به پیوند والد و هم به قلابهای فرمان نیاز دارد؛ یک انشعاب نمیتواند والد خود را موفق کند. رفتار بازنشانی درجا برای نشست اصلی بدون تغییر است، زیرا هیچ فرزند متمایزی ایجاد نمیشود. ردیفهای جدید از درگاه ایجاد مورداعتماد با منشأ ایجاد یکبارنوشت (createdVia،createdActor،createdAt) مهر میخورند؛ پذیرش یک کلید موجود هرگز آن را دوباره مهر نمیزند. برای کنشگران دارای پروفایل انسانی،createdActor.labelهنگام تصویرسازی ردیف از پروفایل فعلی کاربر تفکیک میشود و هرگز در ورودی نشست ذخیره نمیشود؛ بنابراین تغییر نام پروفایل باعث واگرایی نمیشود. ردیفهای نشست همچنین دارایparentSessionKey(والد پیمایش، ذخیرهشده)،controlOwnerSessionKey(کنترلکنندهٔ زماناجرا هنگام فعالبودن)،forkSource(کلید دقیق منبع + نسل رونوشت برای انشعابها) وpreviousSessionId(نسل قبلی رونوشت زیر همان کلید) هستند.sessions.dispatch(operator.admin) یک نشست محلی موجود OpenClaw را که دارای worktree مدیریتشده و متعلق به نشست است، به یک پروفایل cloud-worker پیکربندیشده منتقل میکند.{ key, profileId, agentId? }را ارسال کنید. وقتی هیچ پروفایل worker پیکربندی نشده باشد، این متد وجود ندارد؛ پیش از تخلیهٔ کار فعال، پذیرش نوبت محلی را میبندد و تنها پس از رسیدن جایدهی به مالکیت worker با وضعیتactiveبازمیگردد. اعزام یکطرفه است؛ بازکشیدن worker به محلی بخشی از این RPC نیست.sessions.groups.list،sessions.groups.put،sessions.groups.renameوsessions.groups.deleteکاتالوگ گروههای سفارشی نشست تحت مالکیت Gateway را مدیریت میکنند (نامها + ترتیب نمایش). عضویت در فیلدcategoryهر نشست باقی میماند؛ تغییر نام و حذف، نشستهای عضو را در سمت سرور بهروزرسانی میکنند.sessions.sendیک پیام به نشست موجود میفرستد.sessions.steerگونهٔ وقفهدادن و هدایتکردن برای یک نشست فعال است.sessions.abortکار فعال یک نشست را لغو میکند.keyرا همراهrunIdاختیاری، یا فقطrunIdرا برای اجراهای فعالی که Gateway میتواند به یک نشست تفکیک کند ارسال کنید. ارائهٔrunIdلغو را به همان اجرا محدود نگه میدارد. در یک درخواست غیرسراسری که فقط کلید دارد،clearQueued: trueرا تنظیم کنید تا صفهای پیگیری و مسیر متعلق به آن نشست نیز کنار گذاشته شوند. فراخوانهای موجودی کهclearQueuedرا حذف میکنند، آن صفها را حفظ میکنند. کلید تحتاللفظیglobalقواعد مالکیت موجودchat.abortوابسته به عامل را حفظ میکند و پاکسازی غیرسراسری صف پیگیری یا مسیر را انجام نمیدهد.sessions.patchفراداده/بازنویسیهای نشست را بهروزرسانی میکند و مدل متعارف تفکیکشده را بههمراهagentRuntimeمؤثر گزارش میدهد. تبار ایجاد (spawnedBy،spawnedWorkspaceDir،spawnedCwd،spawnDepth،subagentRole،subagentControlScope) دیگر بهصورت عمومی قابل وصلهکردن نیست؛ این اطلاعات فقط یکبار توسط مسیرهای ایجاد مورداعتماد نوشته میشوند و درخواستهایی که همچنان آنها را ارسال کنند رد میشوند.sessions.reset،sessions.deleteوsessions.compactنگهداشت نشست را انجام میدهند.sessions.getردیف کامل ذخیرهشدهٔ نشست را برمیگرداند.- اجرای چت همچنان از
chat.history،chat.send،chat.abortوchat.injectاستفاده میکند.chat.historyبرای کلاینتهای رابط کاربری از نظر نمایش نرمالسازی میشود: برچسبهای دستوری درونخطی از متن قابلمشاهده حذف میشوند؛ محتوای XML فراخوانی ابزار در متن ساده (<tool_call>...</tool_call>،<function_call>...</function_call>،<tool_calls>...</tool_calls>،<function_calls>...</function_calls>و بلوکهای کوتاهشدهٔ فراخوانی ابزار) و توکنهای کنترلی ASCII/تمامعرض مدل که نشت کردهاند حذف میشوند؛ ردیفهای دستیار که صرفاً توکن سکوت هستند (دقیقاًNO_REPLY/no_reply) حذف میشوند؛ و ردیفهای بیشازحد بزرگ ممکن است با جاینگهدار جایگزین شوند. chat.message.getخوانشگر افزایشی، کراندار و تمامپیام برای یک ورودی قابلمشاهدهٔ رونوشت است.sessionKey، در صورت وابستهبودن انتخاب نشست به عاملagentIdاختیاری، و یکmessageIdرونوشت که پیشتر از طریقchat.historyارائه شده است را ارسال کنید؛ اگر ورودی ذخیرهشده همچنان در دسترس باشد و بیشازحد بزرگ نباشد، Gateway همان تصویرسازی نرمالشده برای نمایش را بدون سقف کوتاهسازی تاریخچهٔ سبکوزن برمیگرداند.chat.toolTitlesعنوانهای کوتاه هدف را برای فراخوانیهای ابزاری که در Control UI نمایش داده میشوند برمیگرداند (دستهای، حداکثر 24 مورد با ورودیهای کراندار). این قابلیت از طریقgateway.controlUi.toolTitlesانتخابی است (بهطور پیشفرض خاموش)؛ Gatewayهای غیرفعال به{ titles: {}, disabled: true }بدون فراخوانی مدل پاسخ میدهند تا کلاینتها درخواستکردن را متوقف کنند. هنگام فعالبودن، عنوانها از مسیریابی استاندارد مدل کاربردی استفاده میکنند: یکutilityModelکه صریحاً پیکربندی شده باشد (تصمیم اپراتور که مانند همهٔ وظایف کاربردی ممکن است محتوای کراندار وظیفه را به ارائهدهندهٔ انتخابشده بفرستد)، و در غیر این صورت مدل کوچک پیشفرض اعلامشدهٔ ارائهدهندهٔ نشست تا هیچ مقصد خروجی جدیدی بهطور ضمنی ظاهر نشود؛utilityModelخالی آنها را کاملاً غیرفعال میکند. عنوانها هرگز به مدل اصلی بازنمیگردند. نتایج در پایگاه دادهٔ وضعیت هر عامل با کلید نام ابزار + ورودی ذخیرهٔ موقت میشوند، بنابراین مشاهدههای تکراری هرگز هزینهٔ دوباره برای همان فراخوانیها ایجاد نمیکنند.chat.sendمقدار یکنوبتیfastMode: "auto"را میپذیرد تا برای فراخوانیهای مدلی که پیش از آستانهٔ خودکار آغاز میشوند از حالت سریع استفاده کند و سپس فراخوانیهای تلاش مجدد، بازگشت، نتیجهٔ ابزار یا ادامه را که بعدتر آغاز میشوند بدون حالت سریع اجرا کند. آستانه بهطور پیشفرض 60 ثانیه (DEFAULT_FAST_MODE_AUTO_ON_SECONDS) است و میتوان آن را برای هر مدل باagents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondsپیکربندی کرد. فراخوانchat.sendمیتواندfastAutoOnSecondsیکنوبتی را برای بازنویسی آستانه در آن درخواست ارسال کند. برای بازنویسی حالت ذخیرهشدهٔ صف فقط برای این درخواست،queueMode(steer،followup،collectیاinterrupt) را ارسال کنید؛ کنشهای هدایت صریح Control UI ازqueueMode: "steer"استفاده میکنند. کلاینتهای تعاملی میتوانندexpectedLeafEntryIdرا همراه برگ فعال شاخهٔ رونوشت که نمایش میدهند، یاnullرا برای یک رونوشت خالی معتبر ارسال کنند؛ اگر کلاینت دیگری ابتدا شاخهها را جابهجا کرده باشد، Gateway ارسال را باdetails.reason: "active-leaf-changed"رد میکند.
جفتسازی دستگاه و توکنهای دستگاه
device.pair.listدستگاههای جفتشدهٔ در انتظار و تأییدشده را برمیگرداند.device.pair.setupCodeیک کد راهاندازی موبایل و بهطور پیشفرض یک URL دادهٔ QR از نوع PNG ایجاد میکند. بهoperator.adminنیاز دارد و عمداً از کشف اعلامشده حذف شده است. نتیجه شاملsetupCode،qrDataUrlاختیاری،gatewayUrl، برچسب غیرمحرمانهٔauthوurlSourceاست.device.pair.approve،device.pair.rejectوdevice.pair.removeرکوردهای جفتسازی دستگاه را مدیریت میکنند.device.pair.renameیک برچسب اپراتور ({ deviceId, label }) اختصاص میدهد که بر نام نمایشی گزارششده توسط کلاینت اولویت دارد و پس از تعمیر یا تأیید دوبارهٔ دستگاه نیز باقی میماند.device.token.rotateتوکن یک دستگاه جفتشده را در محدودههای نقش تأییدشده و دامنهٔ فراخوان آن تعویض میکند.device.token.revokeتوکن یک دستگاه جفتشده را در محدودههای نقش تأییدشده و دامنهٔ فراخوان آن باطل میکند.
کد راهاندازی یک اعتبارنامهٔ بوتاسترپ کوتاهعمر را در خود دارد. کلاینتها نباید آن را خارج از جریان جفتسازی ثبت یا ذخیره کنند.
جفتسازی Node، فراخوانی و کار در انتظار
node.pair.list،node.pair.approve،node.pair.rejectوnode.pair.removeتأیید قابلیتهای Node را پوشش میدهند.node.pair.requestوnode.pair.verifyدر 2026.7 همراه با مخزن مستقل جفتسازی Node حذف شدند؛ درخواستهای در انتظار هنگام اتصال Nodeها توسط Gateway ایجاد میشوند.node.listوnode.describeوضعیت Nodeهای شناختهشده/متصل را برمیگردانند.node.renameبرچسب یک Node جفتشده را بهروزرسانی میکند.node.invokeیک فرمان را به Node متصل ارسال میکند.node.invoke.resultنتیجهٔ یک درخواست فراخوانی را برمیگرداند.mcp.tools.call.v1فرمان میزبان Node بدون رابط گرافیکی برای فراخوانی یک ابزار MCP محلی Node پیکربندیشده است. این فرمان از طریقnode.invokeمنتقل میشود، مستلزم آن است که Node فرمان را اعلام کند و همچنان مشمول تأیید جفتسازی وgateway.nodes.commands.denyاست.node.eventرویدادهای منشأگرفته از Node را به Gateway بازمیگرداند.node.pluginTools.updateتنها مسیر انتشار برای جایگزینی توصیفگرهای ابزار Plugin/MCP قابلمشاهده برای عامل در Node متصل است؛ پارامترهایconnectآنها را حمل نمیکنند.node.pending.pullوnode.pending.ackAPIهای صف Node متصل هستند.node.pending.enqueueوnode.pending.drainکار پایدار در انتظار را برای Nodeهای آفلاین/قطعشده مدیریت میکنند.
خانوادههای تأیید
approval.historyتأییدهای نهایی را با ترتیب جدیدترین به قدیمیترین برمیگرداند که برای درخواستهای اجرا، Plugin و عامل سیستم بهمدت 30 روز نگهداری میشوند (محدودهoperator.approvals). این متد از صفحهبندی مبتنی بر مکاننما و یک فیلتر اختیاری نوع پشتیبانی میکند؛ تأییدهای در انتظار، ردیفهای تاریخچه نیستند.approval.getوapproval.resolveمتدهای ماندگار تأیید و مستقل از نوع هستند (محدودهoperator.approvals).approval.getیک نمای پاکسازیشده از وضعیت در انتظار یا نهایی نگهداریشده را باurlPathپایدار برمیگرداند؛approval.resolveشناسه متعارف تأیید، یکkindصریح و یک تصمیم را میپذیرد، تفکیک «اولین پاسخ برنده است» را اعمال میکند و همیشه نتیجه متعارف ثبتشده را برمیگرداند.exec.approval.request،exec.approval.get،exec.approval.listوexec.approval.resolveدرخواستهای یکباره تأیید اجرا و نیز جستوجو/بازپخش تأیید در انتظار را پوشش میدهند. آنها آداپتورهای مرز پروتکل روی همان رجیستری ماندگار تأیید هستند.exec.approval.waitDecisionمنتظر یک تأیید اجرای در انتظار میماند و تصمیم نهایی را برمیگرداند (یا در صورت پایان مهلت،null).exec.approvals.getوexec.approvals.setتصویرهای لحظهای خطمشی تأیید اجرای Gateway را مدیریت میکنند.exec.approvals.node.getوexec.approvals.node.setخطمشی تأیید اجرای محلی Node را از طریق فرمانهای رله Node مدیریت میکنند.plugin.approval.request،plugin.approval.list،plugin.approval.waitDecisionوplugin.approval.resolveجریانهای تأیید تعریفشده توسط Plugin را پوشش میدهند.
فرمانهای رابط کاربری کنترل
ui.commandبه یک فراخوانندهoperator.writeاجازه میدهد فرمانهای نوعدار چیدمان و پیمایش را به کلاینتهای متصل رابط کاربری کنترل بفرستد که قابلیتui-commandsرا اعلام میکنند.- فرمانها تقسیم/بستن/تمرکز پنل، نمایش نوار کناری، نمایش و محل اتصال پنل ترمینال/مرورگر و پیمایش نشست را پوشش میدهند.
- پروتکل v1 عمداً فرمان را به همه رابطهای کاربری کنترل متصل و توانمند ارسال میکند. اگر هیچکدام متصل نباشند، درخواست بهجای وانمودکردن به تغییر چیدمان، با
UNAVAILABLEشکست میخورد.
اتوماسیون، Skills و ابزارها
- اتوماسیون:
wakeتزریق متن بیدارباش فوری یا در Heartbeat بعدی را زمانبندی میکند؛cron.get،cron.list،cron.status،cron.add،cron.update،cron.remove،cron.run،cron.runsکارهای زمانبندیشده را مدیریت میکنند. cron.runهمچنان یک RPC از نوع صفگذاری برای اجراهای دستی است. کلاینتهایی که به معناشناسی تکمیل نیاز دارند بایدrunIdبرگشتی را بخوانند وcron.runsرا نظرسنجی کنند.cron.runsیک فیلتر اختیاری و غیرخالیrunIdمیپذیرد تا کلاینتها بتوانند یک اجرای دستی صفشده را بدون رقابت با سایر ورودیهای تاریخچه همان کار دنبال کنند.- Skills و ابزارها:
commands.list،skills.*،tools.catalog،tools.effective،tools.invoke. بخش متدهای کمکی اپراتور را در ادامه ببینید.
خانوادههای رایج رویداد
chat: بهروزرسانیهای گفتوگوی رابط کاربری مانندchat.injectو سایر رویدادهای گفتوگویی که فقط در رونوشت هستند. در پروتکل v4، محمولههای تفاضلیdeltaTextرا حمل میکنند؛messageهمچنان تصویر تجمعی دستیار است. جایگزینیهایی که پیشوند نیستندreplace=trueرا تنظیم میکنند و ازdeltaTextبهعنوان متن جایگزین استفاده میکنند.session.message،session.operation،session.tool: بهروزرسانیهای رونوشت، عملیات در حال اجرای نشست و جریان رویداد برای یک نشست مشترکشده.session.approval: حقیقت پاکسازیشده تأییدهای در انتظار و نهایی برای مشترک یک نشست دقیق که صریحاً انتخاب کرده است. تأییدهای فرزند از مخاطبان نیای ذخیرهشده استفاده میکنند؛ رویدادها هرگز رونوشتها را تغییر نمیدهند یا عاملها را بیدار نمیکنند.sessions.changed: نمایه یا فراداده نشست تغییر کرده است.presence: بهروزرسانی تصویر لحظهای حضور سیستم.tick: رویداد دورهای زندهنگهداشتن/فعالبودن.health: بهروزرسانی تصویر لحظهای سلامت Gateway.heartbeat: بهروزرسانی جریان رویداد Heartbeat.cron: رویداد تغییر اجرا/کار Cron.shutdown: اعلان خاموششدن Gateway.node.pair.requested/node.pair.resolved: چرخه عمر جفتسازی Node.node.invoke.request: پخش همگانی درخواست فراخوانی Node.device.pair.requested/device.pair.resolved: چرخه عمر دستگاه جفتشده.voicewake.changed: پیکربندی محرک واژه بیدارباش تغییر کرده است.config.changed: یک نوشتن پیکربندی ذخیره شد (محموله مسیر پیکربندی، هش تصویر لحظهای جدید و یک مُهر زمانی را حمل میکند — هرگز محتوای پیکربندی را حمل نمیکند). محدود به خواندن اپراتور؛ کلاینتها از طریقconfig.getتازهسازی میکنند.exec.approval.requested/exec.approval.resolved: چرخه عمر تأیید اجرا.plugin.approval.requested/plugin.approval.resolved: چرخه عمر تأیید Plugin.
متدهای کمکی Node
Nodeها میتوانند برای دریافت فهرست کنونی فایلهای اجرایی Skill جهت
بررسیهای مجازسازی خودکار، skills.bins را فراخوانی کنند.
RPC دفترکل ممیزی
audit.activity.list نمایی پایدار و مرتبشده از جدیدترین به قدیمیترین از فراداده چرخه عمر
اجرای عامل، اقدام ابزار و پیامهای انتخابی را در اختیار کلاینتهای اپراتور قرار میدهد. این متد به
operator.read نیاز دارد. پرسوجوها رکوردهای قدیمیتر از 30 روز را حذف میکنند و دفترکل مشترک
SQLite به 100,000 رکورد محدود است. ردیفهای منقضیشده هنگام
راهاندازی Gateway، نگهداری ساعتی و نوشتنهای بعدی حذف میشوند. برای مدل داده و معناشناسی حریم خصوصی،
تاریخچه ممیزی را ببینید.
- پارامترها:
agentId،sessionKeyیاrunIdدقیق و اختیاری؛kindاختیاری ("agent_run"،"tool_action"یا"message")؛statusاختیاری ("started"،"succeeded"،"failed"،"cancelled"،"timed_out"،"blocked"یا"unknown")؛directionپیام اختیاری ("inbound"یا"outbound") وchannelدقیق؛ کرانهای شامل و اختیاریafter/beforeبرحسب میلیثانیه Unix؛limitاختیاری از1تا500؛ و رشته اختیاریcursorاز صفحه پیشین. - نتیجه:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }.
اتحاد نامگذاریشده نتیجه V1 برای اجرای عامل، اقدام ابزار، پیام ورودی
و پیام خروجی شِماهای جداگانه دارد. متمایزکننده eventType بهترتیب
agent_run، tool_action، inbound_message یا outbound_message است؛ kind و
direction پیام برای فیلترکردن و نمایش همچنان در دسترساند. هر رویداد دارای
schemaVersion: 1 صحیح است. ارجاعهای هویت پیام از قالب دقیق
hmac-sha256:v1:<32 hex key id>:<64 hex digest> استفاده میکنند؛ شناسه کنشگر فرستنده کانال
نیز از همان قالب استفاده میکند.
همه گونهها به eventType، schemaVersion، eventId، sequence،
sourceSequence، occurredAt، kind، action، status، actor و
redaction نیاز دارند. فیلدهای هر گونه عبارتاند از:
eventType |
فیلدهای الزامی | فیلدهای اختیاری |
|---|---|---|
agent_run |
agentId، runId؛ kind: "agent_run" |
sessionKey، sessionId، errorCode |
tool_action |
agentId، runId؛ kind: "tool_action" |
sessionKey، sessionId، toolCallId، toolName، errorCode |
inbound_message |
direction: "inbound"، channel، conversationKind، outcome |
agentId، runId، durationMs، resultCount، ارجاعهای هویت، reasonCode، errorCode |
outbound_message |
direction: "outbound"، channel، conversationKind، outcome |
agentId، runId، durationMs، resultCount، ارجاعهای هویت، reasonCode، deliveryKind، failureStage، errorCode |
شمارشهای بسته پیام عبارتاند از:
conversationKind:direct،group،channelیاunknown.outcomeورودی:completed،skippedیاfailed؛reasonCodeاختیاری:duplicate،reply_operation_active،reply_operation_aborted،fast_abort،plugin_bound_handled،plugin_bound_unavailable،plugin_bound_declined،plugin_bound_error،before_dispatch_handled،acp_dispatch_completed،acp_dispatch_failed،acp_dispatch_emptyیاacp_dispatch_aborted.outcomeخروجی:sent،suppressed،failedیاunknown؛reasonCodeاختیاری:cancelled_by_message_sending_hook،cancelled_by_reply_payload_sending_hook،empty_after_message_sending_hook،empty_after_reply_payload_sending_hookیاno_visible_payload. آداپتوری که هیچ هویت پلتفرمی برنمیگرداندunknownاست، زیرا اثر جانبی خارجی را نمیتوان رد کرد.deliveryKind:text،mediaیاother؛failureStage:platform_send،queueیاunknown.
فیلدهای نهایی با یکدیگر همبستهاند و بهطور مستقل اختیاری نیستند:
| گونه | نگاشت نهایی |
|---|---|
| اجرای عامل | started هیچ errorCode ندارد؛ هر وضعیت پایانیافته ناموفق به کد run_* متناظر خود نیاز دارد. |
| اقدام ابزار | started و وضعیت موفق هیچ errorCode ندارند؛ هر وضعیت پایانیافته دیگر به کد tool_* متناظر خود نیاز دارد. |
| پیام ورودی | موفق = completed؛ مسدود = skipped؛ ناموفق = failed بههمراه message_processing_failed. در صورت وجود reasonCode، باید به همان خانواده نهایی تعلق داشته باشد. |
| پیام خروجی | موفق = sent؛ مسدود = suppressed بههمراه reasonCode؛ ناموفق = failed بههمراه errorCode و failureStage؛ ناشناخته = unknown بههمراه failureStage. |
هر رویداد فعالیت شامل شناسه پایدار رویداد، توالی یکنوای دفترکل،
توالی رویداد مبدأ، مُهر زمانی، کنشگر، اقدام، وضعیت، مقدار صحیح
schemaVersion: 1 و redaction: "metadata_only" است. رکوردهای اجرا و ابزار
به منشأ عامل و اجرا نیاز دارند و ممکن است منشأ نشست را نیز شامل شوند. رکوردهای
پیام ممکن است شناسههای عامل و اجرا را شامل شوند، اما عمداً هرگز شامل
sessionKey یا sessionId نیستند؛ بنابراین فیلتر پرسوجوی sessionKey
فقط بر ردیفهای اجرا و ابزار اعمال میشود. رویدادهای ابزار ممکن است شناسه فراخوانی ابزار و نام ابزار را شامل شوند.
رکوردهای پیام از message.inbound.processed یا
message.outbound.finished استفاده میکنند و جهت، کانال، نوع مکالمه،
نتیجه نرمالشده، و نوع تحویل، مرحله شکست، مدتزمان،
تعداد نتایج، کد دلیل و نامهای مستعار کلیددارِ محلیِ نصب برای
حساب/مکالمه/پیام/مقصد را بهصورت اختیاری اضافه میکنند. این نامهای مستعار به
همبستگی کمک میکنند، اما ناشناسسازی نیستند: پایگاه داده وضعیت کلید آنها را در خود دارد،
درحالیکه خروجیهای RPC و CLI آن را ندارند. دفتر کل، پرامپتها، بدنه پیامها،
آرگومانهای ابزار، نتایج ابزار، خروجی فرمان یا متن خام خطا را ذخیره نمیکند.
مقادیر sessionKey مربوط به اجرا/ابزار، بهعنوان فراداده خام همبستگی باقی میمانند و میتوانند
شناسههای حساب پلتفرم یا همتا را در خود جای دهند؛ رکوردهای پیام کلیدهای نشست را حذف میکنند.
برای ردیفهای ورودی، durationMs ارسال اصلی را تا وضعیت نهایی آن اندازهگیری میکند و
resultCount تعداد محمولههای نهاییشده ابزار، بلوک و پاسخِ صفشده را میشمارد. برای
ردیفهای خروجی، durationMs بازه مالکیت تحویل تا تأیید،
نامه مرده یا تطبیق (شامل زمان انتظار در صف) را پوشش میدهد و resultCount
تعداد ارسالهای فیزیکی شناساییشده پلتفرم را میشمارد. deliveryKind، در صورت وجود،
محموله مؤثر پس از هوکها و رندر را توصیف میکند؛ ردیفهای سرکوبشده یا
دارای ابهام ناشی از خرابی، آن را حذف میکنند.
پوشش کنونی پیام شامل پیامهای ورودی پذیرفتهشدهای است که به
ارسال اصلی میرسند، از جمله نتایج تکراری/نهایی هسته. پوشش خروجی برای
هر محموله منطقی پاسخ اصلی که به تحویل پایدار مشترک میرسد، یک ردیف نهایی مینویسد؛
قطعهبندی و پخششدن در آداپتور در resultCount تجمیع میشوند. ارسالهای صفشده
قابلتلاشمجدد یا مبهم، تنها پس از تأیید، نامه مرده یا تطبیق
ثبت میشوند. مسیرهای محلی Plugin و ارسال مستقیم که این
مرزهای مشترک را دور میزنند، هنوز پوشش داده نشدهاند. صف محدود کارگر بهصورت بهترینتلاش
عمل میکند و ممکن است هنگام شکست یا اشباع، رکوردها را حذف کند؛ بنابراین این سطح یک
بایگانی انطباقِ بدون اتلاف نیست.
ثبت بهطور پیشفرض فعال است و از طریق
audit.enabled کنترل میشود. ثبت پیام
بهطور جداگانه با audit.messages کنترل میشود و مقدار پیشفرض آن "off" است. وقتی
ثبت غیرفعال باشد، audit.activity.list همچنان رکوردهای پیشتر نوشتهشده را
تا زمان انقضایشان ارائه میکند.
شِماهای عرضهشده درخواست، نتیجه و AuditEvent مربوط به audit.list
بدون تغییر باقی میمانند و فقط رکوردهای اجرای عامل و کنش ابزار را برمیگردانند. کلاینتهای
اپراتوری جدید باید وقتی Gateway آن را اعلام میکند، audit.activity.list را فراخوانی کنند. Gatewayهای
قدیمیتر ممکن است unknown method: audit.activity.list یا، از آنجا که
مجوزدهی در نسخههای عرضهشده پیش از جستوجوی متد انجام میشد، missing scope: operator.admin را برای یک درخواست با دامنه خواندن گزارش کنند. مورد دوم را تنها زمانی
بهمعنای نبود متد تلقی کنید که متد اعلام نشده باشد. سپس کلاینت میتواند تنها زمانی audit.list
را دوباره امتحان کند که فیلترهایش به پشتیبانی از نوع پیام، جهت یا کانال
نیاز نداشته باشند.
برای پرسوجوهای متنی و خروجیهای محدود JSON از openclaw audit استفاده کنید.
RPCهای دفتر کل وظایف
کلاینتهای اپراتوری، رکوردهای وظایف پسزمینه Gateway را از طریق
RPCهای دفتر کل وظایف (packages/gateway-protocol/src/schema/tasks.ts) بررسی و لغو میکنند. این RPCها
خلاصههای پاکسازیشده وظایف را برمیگردانند، نه وضعیت خام زمان اجرا را.
tasks.listبهoperator.readنیاز دارد.- پارامترها:
statusاختیاری ("queued"،"running"،"completed"،"failed"،"cancelled"یا"timed_out") یا آرایهای از این وضعیتها،agentIdاختیاری،sessionKeyاختیاری،limitاختیاری از1تا500، و رشته اختیاریcursor. - نتیجه:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- پارامترها:
tasks.getبهoperator.readنیاز دارد.- پارامترها:
{ "taskId": string }. - نتیجه:
{ "task": TaskSummary }. - شناسههای وظیفه ناموجود، قالب خطای یافتنشدن Gateway را برمیگردانند.
- پارامترها:
tasks.cancelبهoperator.writeنیاز دارد.- پارامترها:
{ "taskId": string, "reason"?: string }. - نتیجه:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundگزارش میدهد که آیا دفتر کل وظیفه منطبقی داشته است.cancelledگزارش میدهد که آیا زمان اجرا لغو را پذیرفته یا ثبت کرده است.
- پارامترها:
TaskSummary شامل id، status و فراداده اختیاری است: kind،
runtime، title، agentId، sessionKey، childSessionKey، ownerKey،
runId، taskId، flowId، parentTaskId، sourceId، مُهرهای زمانی، پیشرفت،
خلاصه نهایی و متن پاکسازیشده خطا. agentId عاملی را مشخص میکند که
وظیفه را اجرا میکند؛ sessionKey و ownerKey زمینه درخواستکننده و کنترل را
حفظ میکنند.
متدهای کمکی اپراتور
commands.list(operator.read) فهرست فرمانهای زمان اجرا را برای یک عامل دریافت میکند.agentIdاختیاری است؛ برای خواندن فضای کاری عامل پیشفرض آن را حذف کنید.scopeکنترل میکندnameاصلی کدام سطح را هدف بگیرد:textتوکن فرمان متنی اصلی را بدون/ابتدایی برمیگرداند؛nativeو مسیر پیشفرضboth، در صورت وجود، نامهای بومیِ آگاه از ارائهدهنده را برمیگردانند.textAliasesنامهای مستعار دقیق اسلش مانند/modelو/mرا در خود دارد.nativeNameدر صورت وجود، نام فرمان بومیِ آگاه از ارائهدهنده را در خود دارد.providerاختیاری است و فقط بر نامگذاری بومی و دسترسپذیری فرمانهای بومی Plugin اثر میگذارد.includeArgs=falseفراداده سریالشده آرگومان را از پاسخ حذف میکند.
tools.catalog(operator.read) کاتالوگ ابزار زمان اجرا را برای یک عامل دریافت میکند. پاسخ شامل ابزارهای گروهبندیشده و فراداده منشأ است:source:coreیاpluginpluginId: مالک Plugin هنگامی کهsource="plugin"optional: اینکه آیا ابزار Plugin اختیاری است
tools.effective(operator.read) فهرست ابزارِ مؤثر در زمان اجرا را برای یک نشست دریافت میکند.sessionKeyالزامی است.- Gateway بهجای پذیرفتن زمینه احراز هویت یا تحویلِ ارائهشده توسط فراخواننده، زمینه مورداعتماد زمان اجرا را از نشست در سمت سرور استخراج میکند.
- پاسخ، تصویری در دامنه نشست و استخراجشده توسط سرور از فهرست فعال است که ابزارهای هسته، Plugin، کانال و سرور MCP ازپیشکشفشده را شامل میشود.
tools.effectiveبرای MCP فقطخواندنی است: ممکن است کاتالوگ MCP یک نشست گرم را از طریق سیاست نهایی ابزار تصویر کند، اما زمانهای اجرای MCP را ایجاد نمیکند، انتقالها را متصل نمیکند یاtools/listصادر نمیکند. اگر کاتالوگ گرم منطبقی وجود نداشته باشد، پاسخ ممکن است اعلانی مانندmcp-not-yet-connected،mcp-not-yet-listedیاmcp-stale-catalogداشته باشد.- ورودیهای مؤثر ابزار از
source="core"،source="plugin"،source="channel"یاsource="mcp"استفاده میکنند.
tools.invoke(operator.write) یک ابزار موجود را از طریق همان مسیر سیاست Gateway که/tools/invokeاستفاده میکند، فراخوانی میکند.nameالزامی است.args،sessionKey،agentId،confirmوidempotencyKeyاختیاری هستند.- اگر هر دو
sessionKeyوagentIdوجود داشته باشند، عامل نشست حلشده باید باagentIdمطابقت داشته باشد. - پوششدهندههای هستهای مختص مالک مانند
cron،gatewayوnodesبه هویت مالک/مدیر (operator.admin) نیاز دارند، با اینکه خودtools.invokeبرابرoperator.writeاست. - پاسخ یک پوشش رو به SDK با فیلدهای
ok،toolName،outputاختیاری وerrorنوعدار است. ردشدنهای تأیید یا سیاست، بهجای دورزدن پایپلاین سیاست ابزار Gateway،ok:falseرا در محموله برمیگردانند.
skills.status(operator.read) فهرست قابلمشاهده مهارتها را برای یک عامل دریافت میکند.agentIdاختیاری است؛ برای خواندن فضای کاری عامل پیشفرض آن را حذف کنید.- پاسخ شامل واجدشرایطبودن، نیازمندیهای موجودنبوده، بررسیهای پیکربندی و گزینههای پاکسازیشده نصب است، بدون اینکه مقادیر خام محرمانه را افشا کند.
skills.searchوskills.detail(operator.read) فراداده کشف ClawHub را برمیگردانند.skills.upload.begin،skills.upload.chunkوskills.upload.commit(operator.admin) پیش از نصب، یک بایگانی خصوصی مهارت را آماده میکنند. این یک مسیر بارگذاری مدیریتی جداگانه برای کلاینتهای مورداعتماد است، نه جریان معمول نصب مهارت ClawHub، و بهطور پیشفرض غیرفعال است، مگر اینکهskills.install.allowUploadedArchivesفعال باشد.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })یک بارگذاری وابسته به آن نامک و مقدار اجبار ایجاد میکند.skills.upload.chunk({ uploadId, offset, dataBase64 })بایتها را در آفست رمزگشاییشده دقیق اضافه میکند.skills.upload.commit({ uploadId, sha256? })اندازه نهایی و SHA-256 را تأیید میکند. ثبت فقط بارگذاری را نهایی میکند؛ مهارت را نصب نمیکند.- بایگانیهای بارگذاریشده مهارت، بایگانیهای zip حاوی ریشه
SKILL.mdهستند. نام دایرکتوری داخلی بایگانی هرگز مقصد نصب را انتخاب نمیکند.
skills.install(operator.admin) سه حالت دارد:- حالت ClawHub:
{ source: "clawhub", slug, version?, force? }یک پوشه مهارت را در دایرکتوریskills/فضای کاری عامل پیشفرض نصب میکند. - حالت بارگذاری:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }یک بارگذاری ثبتشده را در دایرکتوریskills/<slug>فضای کاری عامل پیشفرض نصب میکند. نامک و مقدار اجبار باید با درخواست اصلیskills.upload.beginمطابقت داشته باشند. مگر اینکهskills.install.allowUploadedArchivesفعال باشد، رد میشود؛ این تنظیم بر نصبهای ClawHub اثر نمیگذارد. - حالت نصبکننده Gateway:
{ name, installId, timeoutMs? }یک کنش اعلامشدهmetadata.openclaw.installرا روی میزبان Gateway اجرا میکند. کلاینتهای قدیمیتر ممکن است همچنانdangerouslyForceUnsafeInstallرا ارسال کنند؛ این فیلد منسوخ شده، فقط برای سازگاری پروتکل پذیرفته میشود و نادیده گرفته میشود. برای تصمیمهای نصب متعلق به اپراتور ازsecurity.installPolicyاستفاده کنید.
- حالت ClawHub:
skills.update(operator.admin) دو حالت دارد:- حالت ClawHub یک نامک ردیابیشده یا همه نصبهای ردیابیشده ClawHub را در فضای کاری عامل پیشفرض بهروزرسانی میکند.
- حالت پیکربندی مقادیر
skills.entries.<skillKey>مانندenabled،apiKeyوenvرا وصله میکند.
نماهای models.list
models.list یک پارامتر اختیاری view میپذیرد
(src/agents/model-catalog-visibility.ts):
- حذفشده یا
"default": اگرagents.defaults.modelPolicy.allowپیکربندی شده باشد، پاسخ کاتالوگ مجاز است، شامل مدلهای کشفشده پویا برای ورودیهایprovider/*. در غیر این صورت، پاسخ کاتالوگ کامل Gateway است. "configured": رفتار با اندازه مناسب انتخابگر. اگرagents.defaults.modelPolicy.allowپیکربندی شده باشد، همچنان اولویت دارد، از جمله کشف در دامنه ارائهدهنده برای ورودیهایprovider/*. بدون فهرست مجاز، پاسخ از ورودیهای صریحmodels.providers.<provider>.modelsاستفاده میکند و فقط وقتی هیچ ردیف مدل پیکربندیشدهای وجود نداشته باشد، به کاتالوگ کامل بازمیگردد."provider-config": فهرستmodels.providers.*.modelsتألیفشده در منبع، مستقل از فهرستهای مجاز انتخابگر. ردیفها قابلیتهای عمومی مدل و دسترسپذیری آگاه از مسیر را شامل میشوند، اما نقاط پایانی ارائهدهنده، اطلاعات احراز هویت و پیکربندی درخواست زمان اجرا را حذف میکنند."all": کاتالوگ کامل Gateway کهagents.defaults.modelPolicy.allowرا دور میزند. برای رابطهای کاربری عیبیابی/کشف استفاده کنید، نه انتخابگرهای معمول مدل.
تأییدهای اجرا
- هنگامی که یک درخواست exec به تأیید نیاز دارد، Gateway آن را پخش میکند:
exec.approval.requested. - کلاینتهای اپراتور با فراخوانی
exec.approval.resolveآن را تعیین تکلیف میکنند (نیازمندoperator.approvals). - برای
host=node،exec.approval.requestباید شاملsystemRunPlan(فرادادهٔ متعارفargv/cwd/rawCommand/نشست) باشد. درخواستهای فاقدsystemRunPlanرد میشوند. - پس از تأیید، فراخوانیهای هدایتشدهٔ
node.invoke system.runاز همانsystemRunPlanمتعارف بهعنوان زمینهٔ معتبر فرمان/cwd/نشست استفاده میکنند. - اگر فراخواننده بین آمادهسازی و هدایت نهایی و تأییدشدهٔ
system.run،command،rawCommand،cwd،agentIdیاsessionKeyرا تغییر دهد، Gateway بهجای اعتماد به محتوای تغییریافته، اجرا را رد میکند.
مسیر جایگزین تحویل عامل
- درخواستهای
agentمیتوانند برای درخواست تحویل خروجی شاملdeliver=trueباشند. bestEffortDeliver=false(مقدار پیشفرض) رفتار سختگیرانه را حفظ میکند: مقصدهای تحویل حلنشده یا صرفاً داخلی،INVALID_REQUESTرا برمیگردانند.bestEffortDeliver=trueهنگامی که هیچ مسیر قابلتحویل خارجی قابل تعیین نباشد، امکان بازگشت به اجرای صرفاً در نشست را فراهم میکند (برای مثال نشستهای داخلی/webchat یا پیکربندیهای چندکانالهٔ مبهم).- هنگامی که تحویل درخواست شده باشد، نتایج نهایی
agentممکن است شاملresult.deliveryStatusباشند و از همان وضعیتهایsent،suppressed،partial_failedوfailedمستندشده برایopenclaw agent --json --deliverاستفاده کنند.
نسخهبندی
PROTOCOL_VERSION،MIN_CLIENT_PROTOCOL_VERSION،MIN_NODE_PROTOCOL_VERSIONوMIN_PROBE_PROTOCOL_VERSIONدرpackages/gateway-protocol/src/version.tsقرار دارند.- کلاینتها
minProtocol+maxProtocolرا ارسال میکنند. کلاینتهای اپراتور و رابط کاربری باید پروتکل جاری را در آن بازه بگنجانند؛ کلاینتها و سرورهای فعلی از پروتکل v4 استفاده میکنند. - کلاینتهای احراز هویتشدهای که هم
role: "node"و همclient.mode: "node"را دارند، میتوانند از پروتکل Node نسخهٔ N-1 (در حال حاضر v3) استفاده کنند. کاوشگرهای سبکِ راهاندازی مجدد از همان بازهٔ N-1 استفاده میکنند. احراز هویت دستگاه، جفتسازی، دامنهها، سیاست فرمان و تأییدهای exec تحت تأثیر این بازهٔ سازگاری قرار نمیگیرند. قابلیتها و فرمانهای Node متعلق به Plugin تا زمانی که Node به پروتکل جاری ارتقا نیابد ارائه نمیشوند، زیرا سطوح میزبانیشدهٔ آنها بخشی از قرارداد N-1 نیستند. - شِماها و مدلها از تعریفهای TypeBox تولید میشوند:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ثابتهای کلاینت
پیادهسازی کلاینت مرجع در packages/gateway-client/src/ قرار دارد
(OpenClaw آن را از طریق نمای نازک src/gateway/client.ts پوشش میدهد). این
مقادیر پیشفرض در سراسر پروتکل v4 پایدارند و خط مبنای مورد انتظار برای
کلاینتهای شخص ثالث هستند.
| ثابت | پیشفرض | منبع |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_NODE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
MIN_PROBE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
| مهلت زمانی درخواست (برای هر RPC) | 30_000 ms |
packages/gateway-client/src/client.ts (requestTimeoutMs) |
| مهلت زمانی پیشاحراز هویت / چالش اتصال | 15_000 ms |
packages/gateway-client/src/timeouts.ts (متغیر محیطی OPENCLAW_HANDSHAKE_TIMEOUT_MS میتواند بودجهٔ سرور/کلاینت جفتشده را افزایش دهد) |
| تأخیر اولیهٔ اتصال مجدد | 1_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| حداکثر تأخیر اتصال مجدد | 30_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| محدودیت تلاش مجدد سریع پس از بستهشدن توکن دستگاه | 250 ms |
packages/gateway-client/src/client.ts |
مهلت توقف اجباری پیش از terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
مهلت زمانی پیشفرض stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
فاصلهٔ زمانی پیشفرض تیک (پیش از hello-ok) |
30_000 ms |
packages/gateway-client/src/client.ts |
| بستهشدن بر اثر پایان مهلت تیک | کد 4000 هنگامی که سکوت از tickIntervalMs * 2 فراتر رود |
packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
سرور مقادیر مؤثر policy.tickIntervalMs،
policy.maxPayload و policy.maxBufferedBytes را در hello-ok اعلام میکند؛ کلاینتها
باید بهجای مقادیر پیشفرض پیش از دستدهی، از این مقادیر پیروی کنند.
کلاینت مرجع به درخواستهای محدود اجازه میدهد هنگامی که
هر درخواست معلق مهلتی دارد، مهلت پیکربندیشدهٔ خود را مدیریت کنند. یک درخواست expectFinal بدون
timeoutMs محدود، هر درخواستی با timeoutMs: null، یا ترکیبی از درخواستهای محدود و
نامحدود، پایشگر تیک را فعال نگه میدارد. اگر رویدادهای ورودی و
پاسخها پس از آستانهٔ پایان مهلت تیک همچنان بیصدا بمانند، کلاینت
سوکت را با کد 4000 میبندد، همهٔ درخواستهای معلق را رد میکند و دوباره متصل میشود. پس از
اتصال مجدد، درخواستهای ردشده را دوباره اجرا نمیکند.
احراز هویت
- احراز هویت Gateway با راز مشترک، بسته به
gateway.auth.modeپیکربندیشده ("none" | "token" | "password" | "trusted-proxy")، ازconnect.params.auth.tokenیاconnect.params.auth.passwordاستفاده میکند. - حالتهای حامل هویت مانند Tailscale Serve (
gateway.auth.allowTailscale: true) یاgateway.auth.mode: "trusted-proxy"غیرِ loopback، بررسی احراز هویت اتصال را بهجایconnect.params.auth.*از طریق سرآیندهای درخواست برآورده میکنند. gateway.auth.mode: "none"با ورودی خصوصی، احراز هویت اتصال با راز مشترک را کاملاً نادیده میگیرد؛ این حالت را روی ورودی عمومی/غیرقابلاعتماد در معرض دسترسی قرار ندهید.- پس از جفتسازی، Gateway یک توکن دستگاه با دامنه محدود به نقش اتصال
و دامنهها صادر میکند که در
hello-ok.auth.deviceTokenبازگردانده میشود. کلاینتها باید پس از هر اتصال موفق آن را ذخیره کنند. - اتصال مجدد با آن توکن دستگاه ذخیرهشده باید مجموعه دامنههای تأییدشده ذخیرهشده برای همان توکن را نیز دوباره استفاده کند. این کار دسترسی خواندن/کاوش/وضعیت را که قبلاً اعطا شده حفظ میکند و مانع از آن میشود که اتصالهای مجدد بیسروصدا به دامنه ضمنی محدودتر و فقط مخصوص مدیر فروکاسته شوند.
- ساخت احراز هویت اتصال در سمت کلاینت (
selectConnectAuthدرpackages/gateway-client/src/client.ts):auth.passwordمستقل است و در صورت تنظیم، همیشه ارسال میشود.auth.tokenبهترتیب اولویت مقداردهی میشود: ابتدا توکن مشترک صریح، سپس یکdeviceTokenصریح، و بعد یک توکن ذخیرهشده برای هر دستگاه (با کلیدdeviceId+role).auth.bootstrapTokenفقط زمانی ارسال میشود که هیچیک از موارد بالاauth.tokenرا تعیین نکرده باشند. توکن مشترک یا هر توکن دستگاه تعیینشدهای آن را سرکوب میکند.- ارتقای خودکار توکن دستگاه ذخیرهشده در تلاش مجدد یکباره
AUTH_TOKEN_MISMATCHفقط به نقاط پایانی قابلاعتماد محدود است: loopback، یاwss://باtlsFingerprintسنجاقشده.wss://عمومی بدون سنجاقکردن واجد شرایط نیست.
- راهاندازی اولیه با کد راهاندازی داخلی،
hello-ok.auth.deviceTokenمربوط به Node اصلی را بههمراه یک توکن اپراتور محدود درhello-ok.auth.deviceTokensبرای تحویل امن به موبایل بازمیگرداند. توکن اپراتور شاملoperator.talk.secretsبرای خواندن پیکربندی بومی Talk است، اما دامنههای تغییر جفتسازی وoperator.adminرا شامل نمیشود. - هنگامیکه راهاندازی اولیه با کد راهاندازیِ غیربنخط در انتظار تأیید است،
جزئیات
PAIRING_REQUIREDشاملrecommendedNextStep: "wait_then_retry"،retryable: trueوpauseReconnect: falseاست. تا زمان تأیید درخواست یا نامعتبرشدن توکن، اتصال مجدد را با همان توکن راهاندازی اولیه ادامه دهید. hello-ok.auth.deviceTokensرا فقط زمانی ذخیره کنید که اتصال از احراز هویت راهاندازی اولیه روی انتقالی قابلاعتماد مانندwss://یا جفتسازی loopback/محلی استفاده کرده باشد.- اگر کلاینت یک
deviceTokenصریح یاscopesصریح ارائه کند، مجموعه دامنه درخواستی فراخواننده همچنان مرجع نهایی است؛ دامنههای ذخیرهشده فقط زمانی دوباره استفاده میشوند که کلاینت از توکن ذخیرهشده همان دستگاه دوباره استفاده کند. - توکنهای دستگاه را میتوان از طریق
device.token.rotateوdevice.token.revokeچرخاند/لغو کرد (نیازمندoperator.pairing). چرخاندن یا لغو توکن Node یا هر نقش غیراپراتور دیگر نیز بهoperator.adminنیاز دارد. device.token.rotateفراداده چرخش را بازمیگرداند. توکن حامل جایگزین را فقط برای فراخوانیهای همان دستگاه که از قبل با توکن همان دستگاه احراز هویت شدهاند بازمیتاباند تا کلاینتهای فقطتوکنی بتوانند پیش از اتصال مجدد، توکن جایگزین خود را ذخیره کنند. چرخشهای مشترک/مدیریتی توکن حامل را بازنمیتابانند.- صدور، چرخش و لغو توکن به مجموعه نقشهای تأییدشده ثبتشده در ورودی جفتسازی آن دستگاه محدود میماند؛ تغییر توکن نمیتواند دامنه را گسترش دهد یا نقش دستگاهی را هدف قرار دهد که تأیید جفتسازی هرگز اعطا نکرده است.
- برای نشستهای توکن دستگاه جفتشده، مدیریت دستگاه به خود دستگاه محدود است، مگر آنکه
فراخواننده
operator.adminرا نیز داشته باشد: فراخوانندگان غیرمدیر فقط میتوانند توکن اپراتورِ ورودی دستگاه خود را مدیریت کنند. مدیریت توکن Node و دیگر توکنهای غیراپراتور، حتی برای دستگاه خود فراخواننده، فقط در اختیار مدیر است. device.token.rotateوdevice.token.revokeهمچنین مجموعه دامنههای توکن اپراتور هدف را در برابر دامنههای نشست فعلی فراخواننده بررسی میکنند. فراخوانندگان غیرمدیر نمیتوانند توکن اپراتوری با دامنه گستردهتر از دامنهای که خود در اختیار دارند بچرخانند یا لغو کنند.- شکستهای احراز هویت شامل
error.details.codeبههمراه راهنمای بازیابی هستند:error.details.canRetryWithDeviceToken(بولی)error.details.recommendedNextStep: یکی ازretry_with_device_token،update_auth_configuration،update_auth_credentials،wait_then_retry،review_auth_configuration(packages/gateway-protocol/src/connect-error-details.ts).
- رفتار کلاینت برای
AUTH_TOKEN_MISMATCH:- کلاینتهای قابلاعتماد میتوانند یک تلاش مجدد محدود با توکن ذخیرهشده همان دستگاه انجام دهند.
- اگر آن تلاش مجدد ناموفق بود، حلقههای اتصال مجدد خودکار را متوقف کنید و راهنمای اقدام اپراتور را نمایش دهید.
AUTH_SCOPE_MISMATCHیعنی توکن دستگاه شناسایی شده، اما نقش/دامنههای درخواستی را پوشش نمیدهد. این مورد را بهعنوان توکن نامعتبر نمایش ندهید؛ از اپراتور بخواهید دوباره جفتسازی کند یا قرارداد دامنه محدودتر/گستردهتر را تأیید کند.
هویت دستگاه و جفتسازی
- Nodeها باید یک هویت پایدار دستگاه (
device.id) مشتقشده از اثر انگشت جفتکلید را شامل شوند. - Gatewayها برای هر دستگاه و نقش، توکن صادر میکنند.
- برای شناسههای دستگاه جدید، تأیید جفتسازی الزامی است، مگر آنکه تأیید خودکار محلی فعال باشد.
- تأیید خودکار جفتسازی بر اتصالهای مستقیم loopback محلی متمرکز است.
- OpenClaw همچنین برای جریانهای کمکی قابلاعتماد با راز مشترک، یک مسیر محدود خوداتصالی محلیِ بکاند/کانتینر دارد.
- اتصالهای tailnet یا LAN روی همان میزبان همچنان برای جفتسازی راهدور محسوب میشوند و به تأیید نیاز دارند.
- کلاینتهای WS معمولاً هنگام
connectهویتdeviceرا ارائه میکنند (اپراتور + Node). تنها استثناهای اپراتور بدون دستگاه، مسیرهای اعتماد صریح هستند:- احراز هویت موفق Control UI اپراتور با
gateway.auth.mode: "trusted-proxy". - RPCهای بکاند
gateway-clientبا loopback مستقیم در مسیر کمکی داخلی رزروشده.
- احراز هویت موفق Control UI اپراتور با
- حذف هویت دستگاه پیامدهایی برای دامنهها دارد. وقتی اتصال اپراتور
بدون دستگاه از طریق یک مسیر اعتماد صریح مجاز میشود، OpenClaw همچنان
دامنههای خوداظهاری را به مجموعهای خالی پاک میکند، مگر آنکه آن مسیر
استثنای نامگذاریشدهای برای حفظ دامنه داشته باشد. سپس روشهای مقید به دامنه با
missing scopeناموفق میشوند. - مسیر کمکی بکاند
gateway-clientبا loopback مستقیم و رزروشده، دامنهها را فقط برای RPCهای داخلی صفحه کنترل محلی حفظ میکند؛ شناسههای سفارشی بکاند از این استثنا برخوردار نیستند. - همه اتصالها باید nonce ارائهشده از سوی سرور یعنی
connect.challengeرا امضا کنند.
عیبیابی مهاجرت احراز هویت دستگاه
برای کلاینتهای قدیمی که هنوز از رفتار امضای پیش از چالش استفاده میکنند، connect
کدهای جزئیات DEVICE_AUTH_* را زیر error.details.code با یک
error.details.reason پایدار بازمیگرداند.
خطاهای رایج مهاجرت:
| پیام | details.code | details.reason | معنا |
|---|---|---|---|
device nonce required |
DEVICE_AUTH_NONCE_REQUIRED |
device-nonce-missing |
کلاینت device.nonce را حذف کرده است (یا خالی ارسال کرده است). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
کلاینت با nonce منقضی/نادرست امضا کرده است. |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
بار داده امضا با بار داده v2 مطابقت ندارد. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
مُهر زمانی امضاشده خارج از انحراف مجاز است. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id با اثر انگشت کلید عمومی مطابقت ندارد. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
قالب/متعارفسازی کلید عمومی ناموفق بوده است. |
هدف مهاجرت:
- همیشه منتظر
connect.challengeبمانید. - بار داده v2 را که nonce سرور را شامل میشود امضا کنید.
- همان nonce را در
connect.params.device.nonceارسال کنید. - بار داده امضای ترجیحی
v3است (buildDeviceAuthPayloadV3درpackages/gateway-client/src/device-auth.ts)، که علاوه بر فیلدهای دستگاه/کلاینت/نقش/دامنهها/توکن/nonce،platformوdeviceFamilyرا نیز مقید میکند. - امضاهای قدیمی
v2برای سازگاری همچنان پذیرفته میشوند، اما سنجاقکردن فراداده دستگاه جفتشده همچنان خطمشی فرمان را هنگام اتصال مجدد کنترل میکند.
TLS و سنجاقکردن
- TLS برای اتصالهای WS پشتیبانی میشود (پیکربندی
gateway.tls). - کلاینتها میتوانند بهصورت اختیاری اثر انگشت گواهی Gateway را از طریق
gateway.remote.tlsFingerprintیا--tls-fingerprintدر CLI سنجاق کنند.
دامنه
این پروتکل API کامل Gateway را ارائه میکند: وضعیت، کانالها، مدلها، گفتوگو،
عامل، نشستها، Nodeها، تأییدها و موارد دیگر. سطح دقیق توسط
طرحوارههای TypeBox که از packages/gateway-protocol/src/schema.ts دوباره صادر شدهاند تعریف میشود.