Gateway
پروتکل Gateway
پروتکل WS مربوط به Gateway، صفحه کنترل واحد + انتقال Node برای OpenClaw است. همه کلاینتها (CLI، رابط وب، برنامه macOS، Nodeهای iOS/Android، Nodeهای بدون رابط) از طریق وبسوکت متصل میشوند و نقش + دامنه خود را در زمان دستدهی اعلام میکنند.
انتقال
- وبسوکت، فریمهای متنی با payloadهای JSON.
- اولین فریم باید یک درخواست
connectباشد. - فریمهای پیش از اتصال به 64 KiB محدود شدهاند. پس از یک دستدهی موفق، کلاینتها
باید محدودیتهای
hello-ok.policy.maxPayloadوhello-ok.policy.maxBufferedBytesرا رعایت کنند. وقتی عیبیابی فعال باشد، فریمهای ورودی بیشازحد بزرگ و بافرهای خروجی کند، پیش از آنکه Gateway فریم متأثر را ببندد یا کنار بگذارد، رویدادهایpayload.largeمنتشر میکنند. این رویدادها اندازهها، محدودیتها، سطحها، و کدهای دلیل ایمن را نگه میدارند. آنها بدنه پیام، محتوای پیوست، بدنه خام فریم، توکنها، کوکیها، یا مقادیر محرمانه را نگه نمیدارند.
دستدهی (اتصال)
Gateway → کلاینت (چالش پیش از اتصال):
{
"type": "event",
"event": "connect.challenge",
"payload": { "nonce": "…", "ts": 1737264000000 }
}
کلاینت → Gateway:
{
"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 → کلاینت:
{
"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
}
}
}
در حالی که Gateway هنوز در حال تکمیل sidecarهای راهاندازی است، درخواست connect میتواند
یک خطای قابلتکرار UNAVAILABLE برگرداند که details.reason روی
"startup-sidecars" و retryAfterMs تنظیم شده است. کلاینتها باید این پاسخ را
در چارچوب بودجه کلی اتصال خود دوباره امتحان کنند، نه اینکه آن را بهعنوان شکست
نهایی دستدهی نمایش دهند.
server، features، snapshot، و policy همگی طبق schema
(src/gateway/protocol/schema/frames.ts) الزامی هستند. auth نیز الزامی است و
نقش/دامنههای مذاکرهشده را گزارش میکند. pluginSurfaceUrls اختیاری است و نامهای
سطح Plugin، مانند canvas، را به URLهای میزبانیشده دارای دامنه نگاشت میکند.
URLهای سطح Plugin دارای دامنه ممکن است منقضی شوند. Nodeها میتوانند
node.pluginSurface.refresh را با { "surface": "canvas" } فراخوانی کنند تا یک
ورودی تازه در pluginSurfaceUrls دریافت کنند. بازآرایی آزمایشی Plugin مربوط به Canvas
از مسیر سازگاری منسوخ canvasHostUrl، canvasCapability، یا
node.canvas.capability.refresh پشتیبانی نمیکند؛ کلاینتهای بومی و Gatewayهای فعلی
باید از سطحهای Plugin استفاده کنند.
وقتی هیچ توکن دستگاهی صادر نشود، hello-ok.auth مجوزهای مذاکرهشده را بدون فیلدهای
توکن گزارش میکند:
{
"auth": {
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
کلاینتهای backend قابلاعتماد همفرآیند (client.id: "gateway-client"،
client.mode: "backend") میتوانند در اتصالهای loopback مستقیم، وقتی با توکن/رمز عبور
مشترک Gateway احراز هویت میکنند، device را حذف کنند. این مسیر برای RPCهای داخلی
صفحه کنترل رزرو شده است و مانع از آن میشود که مبناهای قدیمی جفتسازی CLI/دستگاه،
کار backend محلی مانند بهروزرسانیهای نشست subagent را مسدود کنند. کلاینتهای راهدور،
کلاینتهای دارای مبدأ مرورگر، کلاینتهای Node، و کلاینتهای صریح دارای توکن دستگاه/هویت
دستگاه همچنان از بررسیهای معمول جفتسازی و ارتقای دامنه استفاده میکنند.
وقتی یک توکن دستگاه صادر شود، hello-ok همچنین شامل این مورد است:
{
"auth": {
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
در طول واگذاری bootstrap قابلاعتماد، hello-ok.auth ممکن است ورودیهای نقش محدود
اضافی را نیز در deviceTokens شامل شود:
{
"auth": {
"deviceToken": "…",
"role": "node",
"scopes": [],
"deviceTokens": [
{
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"]
}
]
}
}
برای جریان bootstrap داخلی Node/operator، توکن اصلی Node بهصورت
scopes: [] باقی میماند و هر توکن operator واگذارشده به فهرست مجاز operator مربوط به bootstrap
(operator.approvals، operator.read،
operator.talk.secrets، operator.write) محدود میماند. بررسیهای دامنه bootstrap همچنان
دارای پیشوند نقش میمانند: ورودیهای operator فقط درخواستهای operator را برآورده میکنند،
و نقشهای غیر operator همچنان به دامنههایی زیر پیشوند نقش خودشان نیاز دارند.
نمونه 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": "…"
}
}
}
فریمبندی
- درخواست:
{type:"req", id, method, params} - پاسخ:
{type:"res", id, ok, payload|error} - رویداد:
{type:"event", event, payload, seq?, stateVersion?}
متدهای دارای اثر جانبی به کلیدهای idempotency نیاز دارند (schema را ببینید).
نقشها + دامنهها
برای مدل کامل دامنه operator، بررسیهای زمان تأیید، و معنای secret مشترک، دامنههای operator را ببینید.
نقشها
operator= کلاینت صفحه کنترل (CLI/UI/خودکارسازی).node= میزبان قابلیت (camera/screen/canvas/system.run).
دامنهها (operator)
دامنههای رایج:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config با includeSecrets: true به operator.talk.secrets
(یا operator.admin) نیاز دارد.
متدهای RPC مربوط به Gateway که توسط Plugin ثبت شدهاند ممکن است دامنه operator خودشان را
درخواست کنند، اما پیشوندهای admin هسته رزروشده (config.*، exec.approvals.*، wizard.*،
update.*) همیشه به operator.admin resolve میشوند.
دامنه متد فقط اولین دروازه است. برخی فرمانهای slash که از طریق
chat.send قابلدسترسی هستند، بررسیهای سختگیرانهتر در سطح فرمان را روی آن اعمال میکنند.
برای مثال، نوشتنهای پایدار /config set و /config unset به operator.admin نیاز دارند.
node.pair.approve همچنین افزون بر دامنه پایه متد، یک بررسی دامنه اضافی در زمان تأیید دارد:
- درخواستهای بدون فرمان:
operator.pairing - درخواستهای دارای فرمانهای Node غیر exec:
operator.pairing+operator.write - درخواستهایی که شامل
system.run،system.run.prepare، یاsystem.whichهستند:operator.pairing+operator.admin
قابلیتها/فرمانها/مجوزها (Node)
Nodeها ادعاهای قابلیت را در زمان اتصال اعلام میکنند:
caps: دستههای سطح بالای قابلیت مانندcamera،canvas،screen،location،voice، وtalk.commands: فهرست مجاز فرمانها برای invoke.permissions: toggleهای ریزدانه (مثلاًscreen.record،camera.capture).
Gateway با اینها بهعنوان ادعا برخورد میکند و فهرستهای مجاز سمت سرور را اعمال میکند.
حضور
system-presenceورودیهایی را برمیگرداند که با هویت دستگاه کلیدگذاری شدهاند.- ورودیهای حضور شامل
deviceId،roles، وscopesهستند تا رابطهای کاربری بتوانند برای هر دستگاه حتی وقتی هم بهعنوان operator و هم بهعنوان node متصل میشود، یک ردیف واحد نشان دهند. node.listشامل فیلدهای اختیاریlastSeenAtMsوlastSeenReasonاست. Nodeهای متصل زمان اتصال فعلی خود را با دلیلconnectبهعنوانlastSeenAtMsگزارش میکنند؛ Nodeهای جفتشده همچنین وقتی یک رویداد Node قابلاعتماد metadata جفتسازی آنها را بهروزرسانی میکند، میتوانند حضور پسزمینه پایدار گزارش کنند.
رویداد زندهبودن Node در پسزمینه
Nodeها ممکن است node.event را با event: "node.presence.alive" فراخوانی کنند تا ثبت شود که یک Node جفتشده
در طول بیدارشدن پسزمینه زنده بوده است، بدون اینکه بهعنوان متصل علامتگذاری شود.
{
"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 یک enum بسته است: background، silent_push، bg_app_refresh،
significant_location، manual، یا connect. رشتههای trigger ناشناخته پیش از پایداری، توسط Gateway به
background نرمالسازی میشوند. این رویداد فقط برای نشستهای احرازشده دستگاه Node
پایدار است؛ نشستهای بدون دستگاه یا جفتنشده handled: false برمیگردانند.
Gatewayهای موفق یک نتیجه ساختاریافته برمیگردانند:
{
"ok": true,
"event": "node.presence.alive",
"handled": true,
"reason": "persisted"
}
Gatewayهای قدیمیتر ممکن است همچنان برای node.event مقدار { "ok": true } برگردانند؛ کلاینتها باید آن را
بهعنوان یک RPC تأییدشده در نظر بگیرند، نه بهعنوان پایداری حضور پایدار.
دامنهبندی رویدادهای broadcast
رویدادهای broadcast وبسوکت که از سمت سرور push میشوند، با دامنه gate میشوند تا نشستهای دارای دامنه pairing یا فقط Node، محتوای نشست را بهصورت غیرفعال دریافت نکنند.
- فریمهای chat، agent، و tool-result (از جمله رویدادهای streamed
agentو نتایج tool call) حداقل بهoperator.readنیاز دارند. نشستهای بدونoperator.readاین فریمها را کاملاً رد میکنند. - broadcastهای
plugin.*تعریفشده توسط Plugin بسته به نحوه ثبت آنها توسط Plugin، باoperator.writeیاoperator.admingate میشوند. - رویدادهای وضعیت و انتقال (
heartbeat،presence،tick، چرخه عمر اتصال/قطع اتصال، و غیره) بدون محدودیت باقی میمانند تا سلامت انتقال برای هر نشست احرازشده قابل مشاهده باشد. - خانوادههای ناشناخته رویدادهای broadcast بهصورت پیشفرض با دامنه gate میشوند (fail-closed)، مگر اینکه یک handler ثبتشده صریحاً آنها را آزادتر کند.
هر اتصال کلاینت شماره توالی per-client خودش را نگه میدارد تا broadcastها روی آن socket ترتیب یکنواخت را حفظ کنند، حتی وقتی کلاینتهای مختلف زیرمجموعههای متفاوتی از جریان رویداد را پس از فیلتر دامنه میبینند.
خانوادههای رایج متدهای RPC
سطح عمومی WS گستردهتر از مثالهای دستدهی/auth بالا است. این
یک dump تولیدشده نیست — hello-ok.features.methods یک فهرست discovery محافظهکارانه است
که از src/gateway/server-methods-list.ts بهعلاوه exportهای متد Plugin/channel بارگذاریشده
ساخته شده است. با آن بهعنوان feature discovery برخورد کنید، نه enumeration کامل
src/gateway/server-methods/*.ts.
System and identity
healthsnapshot سلامت Gateway کششده یا تازه probeشده را برمیگرداند.diagnostics.stabilityضبطکننده پایداری تشخیصی محدود اخیر را برمیگرداند. این مورد metadata عملیاتی مانند نام رویدادها، شمارشها، اندازههای byte، خوانشهای memory، وضعیت queue/session، نامهای channel/plugin، و شناسههای session را نگه میدارد. متن chat، بدنههای Webhook، خروجیهای tool، بدنههای خام request یا response، توکنها، کوکیها، یا مقادیر محرمانه را نگه نمیدارد. دامنه خواندن operator لازم است.statusخلاصه Gateway به سبک/statusرا برمیگرداند؛ فیلدهای حساس فقط برای کلاینتهای operator دارای دامنه admin گنجانده میشوند.gateway.identity.getهویت دستگاه Gateway را که توسط جریانهای relay و pairing استفاده میشود برمیگرداند.system-presencesnapshot حضور فعلی دستگاههای operator/Node متصل را برمیگرداند.system-eventیک رویداد سیستم را اضافه میکند و میتواند context حضور را بهروزرسانی/broadcast کند.last-heartbeatآخرین رویداد Heartbeat پایدارشده را برمیگرداند.set-heartbeatsپردازش Heartbeat را روی Gateway toggle میکند.
مدلها و استفاده
models.listکاتالوگ مدلهای مجاز در زمان اجرا را برمیگرداند. برای مدلهای پیکربندیشده در اندازهٔ انتخابگر (agents.defaults.modelsابتدا، سپسmodels.providers.*.models) مقدار{ "view": "configured" }را بفرستید، یا برای کاتالوگ کامل مقدار{ "view": "all" }را بفرستید.usage.statusخلاصههای بازههای استفادهٔ ارائهدهنده/سهمیهٔ باقیمانده را برمیگرداند.usage.costخلاصههای تجمیعی استفادهٔ هزینه را برای یک بازهٔ تاریخی برمیگرداند.doctor.memory.statusآمادگی حافظهٔ برداری / embedding ذخیرهشده در cache را برای workspace عامل پیشفرض فعال برمیگرداند. فقط وقتی فراخوان بهصراحت یک ping زنده به ارائهدهندهٔ embedding میخواهد، مقدار{ "probe": true }یا{ "deep": true }را بفرستید.doctor.memory.remHarnessیک پیشنمایش محدود و فقطخواندنی از harness REM را برای کلاینتهای control-plane راهدور برمیگرداند. این میتواند شامل مسیرهای workspace، قطعههای حافظه، Markdown زمینهدار رندرشده، و نامزدهای deep promotion باشد، بنابراین فراخوانها بهoperator.readنیاز دارند.sessions.usageخلاصههای استفادهٔ هر نشست را برمیگرداند.sessions.usage.timeseriesاستفادهٔ سری زمانی را برای یک نشست برمیگرداند.sessions.usage.logsورودیهای log استفاده را برای یک نشست برمیگرداند.
کانالها و کمککنندههای ورود
channels.statusخلاصههای وضعیت کانال/Plugin داخلی + همراه را برمیگرداند.channels.logoutاز یک کانال/حساب مشخص، در جایی که کانال از خروج پشتیبانی کند، خارج میشود.web.login.startیک جریان ورود QR/web را برای ارائهدهندهٔ کانال web فعلی که قابلیت QR دارد شروع میکند.web.login.waitمنتظر تکمیل آن جریان ورود QR/web میماند و در صورت موفقیت کانال را شروع میکند.push.testیک push آزمایشی APNs را به یک node ثبتشدهٔ iOS میفرستد.voicewake.gettriggerهای wake-word ذخیرهشده را برمیگرداند.voicewake.settriggerهای wake-word را بهروزرسانی میکند و تغییر را پخش میکند.
پیامرسانی و logها
sendRPC مستقیم تحویل خروجی برای ارسالهای هدفگذاریشده بر اساس کانال/حساب/thread در بیرون از runner چت است.logs.tailانتهای log فایل پیکربندیشدهٔ gateway را با کنترلهای cursor/limit و حداکثر byte برمیگرداند.
گفتار و TTS
talk.catalogکاتالوگ فقطخواندنی ارائهدهندگان Talk را برای گفتار، رونویسی streaming، و صدای realtime برمیگرداند. این شامل شناسههای ارائهدهنده، برچسبها، وضعیت پیکربندیشده، شناسههای مدل/صدا که expose شدهاند، حالتهای canonical، transportها، راهبردهای brain، و پرچمهای audio/capability realtime است، بدون اینکه secretهای ارائهدهنده را برگرداند یا پیکربندی سراسری را تغییر دهد.talk.configpayload مؤثر پیکربندی Talk را برمیگرداند؛includeSecretsبهoperator.talk.secrets(یاoperator.admin) نیاز دارد.talk.session.createیک نشست Talk تحت مالکیت Gateway برایrealtime/gateway-relay،transcription/gateway-relay، یاstt-tts/managed-roomایجاد میکند.brain: "direct-tools"بهoperator.adminنیاز دارد.talk.session.jointoken نشست managed-room را اعتبارسنجی میکند، در صورت نیاز eventهایsession.readyیاsession.replacedرا منتشر میکند، و metadata اتاق/نشست را همراه با eventهای Talk اخیر، بدون token متن ساده یا hash token ذخیرهشده، برمیگرداند.talk.session.appendAudioصدای ورودی PCM با base64 را به نشستهای relay realtime و رونویسی تحت مالکیت Gateway اضافه میکند.talk.session.startTurn،talk.session.endTurn، وtalk.session.cancelTurnچرخهٔ عمر نوبت managed-room را با رد نوبت stale پیش از پاک شدن state هدایت میکنند.talk.session.cancelOutputخروجی صوتی assistant را متوقف میکند، عمدتاً برای barge-in کنترلشده با VAD در نشستهای relay Gateway.talk.session.submitToolResultیک فراخوانی ابزار ارائهدهنده را که توسط نشست relay realtime تحت مالکیت Gateway منتشر شده تکمیل میکند.talk.session.closeیک نشست relay، رونویسی، یا managed-room تحت مالکیت Gateway را میبندد و eventهای پایانی Talk را منتشر میکند.talk.modeوضعیت حالت Talk فعلی را برای کلاینتهای WebChat/Control UI تنظیم/پخش میکند.talk.client.createیک نشست ارائهدهندهٔ realtime تحت مالکیت کلاینت را با استفاده ازwebrtcیاprovider-websocketایجاد میکند، در حالی که Gateway مالک پیکربندی، credentialها، دستورالعملها، و سیاست ابزار است.talk.client.toolCallبه transportهای realtime تحت مالکیت کلاینت اجازه میدهد فراخوانیهای ابزار ارائهدهنده را به سیاست Gateway ارسال کنند. نخستین ابزار پشتیبانیشدهopenclaw_agent_consultاست؛ کلاینتها یک run id دریافت میکنند و پیش از ارسال نتیجهٔ ابزار مختص ارائهدهنده، منتظر eventهای عادی چرخهٔ عمر چت میمانند.talk.eventتنها کانال eventهای Talk برای realtime، رونویسی، STT/TTS، managed-room، تلفنی، و آداپتورهای جلسه است.talk.speakگفتار را از طریق ارائهدهندهٔ گفتار Talk فعال تولید میکند.tts.statusوضعیت فعال بودن TTS، ارائهدهندهٔ فعال، ارائهدهندگان fallback، و وضعیت پیکربندی ارائهدهنده را برمیگرداند.tts.providersinventory قابلمشاهدهٔ ارائهدهندگان TTS را برمیگرداند.tts.enableوtts.disableوضعیت ترجیحات TTS را تغییر میدهند.tts.setProviderارائهدهندهٔ ترجیحی TTS را بهروزرسانی میکند.tts.convertتبدیل یکبارهٔ متن به گفتار را اجرا میکند.
Secretها، پیکربندی، بهروزرسانی، و wizard
secrets.reloadSecretRefهای فعال را دوباره resolve میکند و فقط در صورت موفقیت کامل، state secret زمان اجرا را جایگزین میکند.secrets.resolveassignmentهای secret هدفگیریشده به command را برای یک مجموعهٔ command/target مشخص resolve میکند.config.getsnapshot و hash پیکربندی فعلی را برمیگرداند.config.setیک payload پیکربندی اعتبارسنجیشده را مینویسد.config.patchیک بهروزرسانی جزئی پیکربندی را merge میکند.config.applypayload کامل پیکربندی را اعتبارسنجی + جایگزین میکند.config.schemapayload schema زندهٔ پیکربندی را که توسط ابزارهای Control UI و CLI استفاده میشود برمیگرداند: schema،uiHints، نسخه، و metadata تولید، شامل metadata schema مربوط به Plugin + کانال وقتی runtime بتواند آن را load کند. schema شامل metadata فیلدtitle/descriptionاست که از همان برچسبها و متن راهنمای استفادهشده توسط UI مشتق شده، از جمله شاخههای composition برای object تودرتو، wildcard، array-item، وanyOf/oneOf/allOfوقتی مستندات فیلد مطابق وجود داشته باشد.config.schema.lookupیک payload lookup محدود به path را برای یک path پیکربندی برمیگرداند: path نرمالشده، یک node کمعمق schema، hint مطابق +hintPath، و خلاصههای child فوری برای drill-down در UI/CLI. nodeهای lookup schema مستندات کاربرپسند و فیلدهای رایج validation (title،description،type،enum،const،format،pattern، کرانهای numeric/string/array/object، و flagهایی مانندadditionalProperties،deprecated،readOnly،writeOnly) را نگه میدارند. خلاصههای child،key،pathنرمالشده،type،required،hasChildren، بهعلاوهٔhint/hintPathمطابق را expose میکنند.update.runجریان بهروزرسانی gateway را اجرا میکند و فقط وقتی خود بهروزرسانی موفق شده باشد restart زمانبندی میکند؛ فراخوانهایی که نشست دارند میتوانندcontinuationMessageرا وارد کنند تا startup یک نوبت پیگیری agent را از طریق صف ادامهٔ restart از سر بگیرد. بهروزرسانیهای package-manager پس از تعویض package، یک restart بهروزرسانی بدون تعویق و بدون cooldown را اجبار میکنند تا فرایند قدیمی Gateway از tree جایگزینشدهٔdistبه lazy-loading ادامه ندهد.update.statusآخرین sentinel ذخیرهشده در cache برای restart بهروزرسانی را، شامل نسخهٔ در حال اجرای پس از restart وقتی موجود باشد، برمیگرداند.wizard.start،wizard.next،wizard.status، وwizard.cancelwizard راهاندازی اولیه را از طریق WS RPC expose میکنند.
کمککنندههای agent و workspace
agents.listentryهای پیکربندیشدهٔ agent را، شامل مدل مؤثر و metadata زمان اجرا، برمیگرداند.agents.create،agents.update، وagents.deleteرکوردهای agent و سیمکشی workspace را مدیریت میکنند.agents.files.list،agents.files.get، وagents.files.setفایلهای bootstrap workspace را که برای یک agent expose شدهاند مدیریت میکنند.artifacts.list،artifacts.get، وartifacts.downloadخلاصههای artifact مشتقشده از transcript و downloadها را برای scope صریحsessionKey،runId، یاtaskIdexpose میکنند. queryهای run و task، نشست مالک را سمت سرور resolve میکنند و فقط transcript media با provenance مطابق را برمیگردانند؛ sourceهای URL ناامن یا محلی بهجای fetch سمت سرور، downloadهای پشتیبانینشده برمیگردانند.environments.listوenvironments.statusکشف محیط فقطخواندنی Gateway-local و node را برای کلاینتهای SDK expose میکنند.agent.identity.getهویت مؤثر assistant را برای یک agent یا نشست برمیگرداند.agent.waitمنتظر پایان یک run میماند و در صورت موجود بودن، snapshot پایانی را برمیگرداند.
کنترل نشست
sessions.listindex نشست فعلی را، شامل metadata هر ردیفagentRuntimeوقتی backend زمان اجرای agent پیکربندی شده باشد، برمیگرداند.sessions.subscribeوsessions.unsubscribesubscriptionهای event تغییر نشست را برای کلاینت WS فعلی toggle میکنند.sessions.messages.subscribeوsessions.messages.unsubscribesubscriptionهای event مربوط به transcript/message را برای یک نشست toggle میکنند.sessions.previewپیشنمایشهای محدود transcript را برای کلیدهای نشست مشخص برمیگرداند.sessions.describeیک ردیف نشست Gateway را برای یک کلید نشست دقیق برمیگرداند.sessions.resolveیک هدف نشست را resolve یا canonicalize میکند.sessions.createیک entry نشست جدید ایجاد میکند.sessions.sendیک پیام را به یک نشست موجود میفرستد.sessions.steerگونهٔ interrupt-and-steer برای یک نشست فعال است.sessions.abortکار فعال برای یک نشست را abort میکند. فراخوان میتواندkeyبهعلاوهٔrunIdاختیاری را بفرستد، یا برای runهای فعالی که Gateway میتواند به نشست resolve کند، فقطrunIdرا بفرستد.sessions.patchmetadata/overrideهای نشست را بهروزرسانی میکند و مدل canonical resolveشده بهعلاوهٔagentRuntimeمؤثر را گزارش میدهد.sessions.reset،sessions.delete، وsessions.compactنگهداری نشست را انجام میدهند.sessions.getردیف کامل نشست ذخیرهشده را برمیگرداند.- اجرای چت همچنان از
chat.history،chat.send،chat.abort، وchat.injectاستفاده میکند.chat.historyبرای کلاینتهای UI بهصورت display-normalized است: tagهای directive inline از متن قابلمشاهده حذف میشوند، payloadهای XML متن سادهٔ tool-call (شامل<tool_call>...</tool_call>،<function_call>...</function_call>،<tool_calls>...</tool_calls>،<function_calls>...</function_calls>، و blockهای tool-call کوتاهشده) و tokenهای کنترل مدل ASCII/full-width نشتکرده حذف میشوند، ردیفهای assistant با silent-token خالص مانند exactNO_REPLY/no_replyحذف میشوند، و ردیفهای بیشازحد بزرگ میتوانند با placeholderها جایگزین شوند.
Pairing دستگاه و tokenهای دستگاه
device.pair.listدستگاههای paired در انتظار و تأییدشده را برمیگرداند.device.pair.approve،device.pair.reject، وdevice.pair.removeرکوردهای device-pairing را مدیریت میکنند.device.token.rotateیک token دستگاه paired را در محدودههای role تأییدشده و scope فراخوان rotate میکند.device.token.revokeیک token دستگاه paired را در محدودههای role تأییدشده و scope فراخوان revoke میکند.
Pairing، invoke، و کارهای pending مربوط به Node
node.pair.request،node.pair.list،node.pair.approve،node.pair.reject،node.pair.remove، وnode.pair.verifypairing node و verification bootstrap را پوشش میدهند.node.listوnode.describestate مربوط به nodeهای شناختهشده/متصل را برمیگردانند.node.renameبرچسب node paired را بهروزرسانی میکند.node.invokeیک command را به یک node متصل forward میکند.node.invoke.resultنتیجه را برای یک درخواست invoke برمیگرداند.node.eventeventهای منشأگرفته از node را به gateway برمیگرداند.node.pending.pullوnode.pending.ackAPIهای صف node متصل هستند.node.pending.enqueueوnode.pending.drainکار pending بادوام را برای nodeهای offline/disconnected مدیریت میکنند.
خانوادههای تأیید
exec.approval.request،exec.approval.get،exec.approval.list، وexec.approval.resolveدرخواستهای تأیید اجرای یکباره را بههمراه جستوجو/بازپخش تأییدهای در انتظار پوشش میدهند.exec.approval.waitDecisionمنتظر یک تأیید اجرای در انتظار میماند و تصمیم نهایی را برمیگرداند (یا در صورت زمانبر شدن،null).exec.approvals.getوexec.approvals.setsnapshotهای سیاست تأیید اجرای gateway را مدیریت میکنند.exec.approvals.node.getوexec.approvals.node.setسیاست تأیید اجرای محلی node را از طریق فرمانهای relay مربوط به node مدیریت میکنند.plugin.approval.request،plugin.approval.list،plugin.approval.waitDecision، وplugin.approval.resolveجریانهای تأیید تعریفشده توسط plugin را پوشش میدهند.
اتوماسیون، Skills، و ابزارها
- اتوماسیون:
wakeتزریق متن بیدارباش فوری یا heartbeat بعدی را زمانبندی میکند؛cron.list،cron.status،cron.add،cron.update،cron.remove،cron.run،cron.runsکارهای زمانبندیشده را مدیریت میکنند. - Skills و ابزارها:
commands.list،skills.*،tools.catalog،tools.effective،tools.invoke.
خانوادههای رویداد رایج
chat: بهروزرسانیهای چت UI مانندchat.injectو سایر رویدادهای چت مخصوص transcript.session.messageوsession.tool: بهروزرسانیهای transcript/event-stream برای یک جلسه مشترکشده.sessions.changed: نمایه جلسه یا metadata تغییر کرده است.presence: بهروزرسانیهای snapshot حضور سیستم.tick: رویداد دورهای keepalive / زندهبودن.health: بهروزرسانی snapshot سلامت gateway.heartbeat: بهروزرسانی جریان رویداد heartbeat.cron: رویداد تغییر اجرای/job مربوط به cron.shutdown: اعلان خاموششدن gateway.node.pair.requested/node.pair.resolved: چرخه عمر جفتسازی node.node.invoke.request: پخش درخواست invoke مربوط به node.device.pair.requested/device.pair.resolved: چرخه عمر دستگاه جفتشده.voicewake.changed: پیکربندی trigger واژه بیدارباش تغییر کرده است.exec.approval.requested/exec.approval.resolved: چرخه عمر تأیید اجرا.plugin.approval.requested/plugin.approval.resolved: چرخه عمر تأیید plugin.
روشهای کمکی Node
- Nodeها میتوانند
skills.binsرا فراخوانی کنند تا فهرست فعلی فایلهای اجرایی skill را برای بررسیهای auto-allow دریافت کنند.
روشهای کمکی اپراتور
- اپراتورها میتوانند
commands.list(operator.read) را فراخوانی کنند تا موجودی فرمان runtime برای یک agent را دریافت کنند.agentIdاختیاری است؛ برای خواندن workspace پیشفرض agent آن را حذف کنید.scopeکنترل میکند کهnameاصلی کدام سطح را هدف بگیرد:textتوکن فرمان متنی اصلی را بدون/ابتدایی برمیگرداندnativeو مسیر پیشفرضboth، در صورت وجود، نامهای native آگاه از provider را برمیگردانند
textAliasesنامهای مستعار slash دقیق مانند/modelو/mرا حمل میکند.nativeNameوقتی وجود داشته باشد، نام فرمان native آگاه از provider را حمل میکند.providerاختیاری است و فقط بر نامگذاری native بهعلاوه دسترسپذیری فرمان native مربوط به plugin اثر میگذارد.includeArgs=falsemetadata سریالسازیشده آرگومان را از پاسخ حذف میکند.
- اپراتورها میتوانند
tools.catalog(operator.read) را فراخوانی کنند تا کاتالوگ ابزار runtime برای یک agent را دریافت کنند. پاسخ شامل ابزارهای گروهبندیشده و metadata منشأ است:source:coreیاpluginpluginId: مالک plugin وقتیsource="plugin"باشدoptional: آیا ابزار plugin اختیاری است یا نه
- اپراتورها میتوانند
tools.effective(operator.read) را فراخوانی کنند تا موجودی ابزار runtime-effective برای یک جلسه را دریافت کنند.sessionKeyالزامی است.- gateway بهجای پذیرش auth یا context تحویلِ ارائهشده توسط caller، context runtime مورد اعتماد را از جلسه در سمت server استخراج میکند.
- پاسخ در محدوده جلسه است و آنچه گفتوگوی فعال همین حالا میتواند استفاده کند را بازتاب میدهد، شامل ابزارهای core، plugin، و channel.
- اپراتورها میتوانند
tools.invoke(operator.write) را فراخوانی کنند تا یک ابزار در دسترس را از طریق همان مسیر سیاست gateway مانند/tools/invokeفراخوانی کنند.nameالزامی است.args،sessionKey،agentId،confirm، وidempotencyKeyاختیاری هستند.- اگر هم
sessionKeyو همagentIdوجود داشته باشند، agent جلسه resolveشده باید باagentIdمطابقت داشته باشد. - پاسخ یک envelope رو به SDK با فیلدهای
ok،toolName،outputاختیاری، وerrorتایپشده است. رد شدن بهدلیل تأیید یا سیاست، بهجای دور زدن pipeline سیاست ابزار gateway، مقدارok:falseرا در payload برمیگرداند.
- اپراتورها میتوانند
skills.status(operator.read) را فراخوانی کنند تا موجودی skill قابل مشاهده برای یک agent را دریافت کنند.agentIdاختیاری است؛ برای خواندن workspace پیشفرض agent آن را حذف کنید.- پاسخ شامل eligibility، نیازمندیهای مفقود، بررسیهای config، و گزینههای نصب پاکسازیشده بدون افشای مقدارهای خام secret است.
- اپراتورها میتوانند
skills.searchوskills.detail(operator.read) را برای metadata کشف ClawHub فراخوانی کنند. - اپراتورها میتوانند
skills.install(operator.admin) را در دو حالت فراخوانی کنند:- حالت ClawHub:
{ source: "clawhub", slug, version?, force? }یک پوشه skill را در دایرکتوریskills/workspace پیشفرض agent نصب میکند. - حالت installer مربوط به Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }یک action اعلامشدهmetadata.openclaw.installرا روی host مربوط به gateway اجرا میکند.
- حالت ClawHub:
- اپراتورها میتوانند
skills.update(operator.admin) را در دو حالت فراخوانی کنند:- حالت ClawHub یک slug ردیابیشده یا همه نصبهای ردیابیشده ClawHub را در workspace پیشفرض agent بهروزرسانی میکند.
- حالت Config مقدارهای
skills.entries.<skillKey>مانندenabled،apiKey، وenvرا patch میکند.
نماهای models.list
models.list یک پارامتر اختیاری view را میپذیرد:
- حذفشده یا
"default": رفتار runtime فعلی. اگرagents.defaults.modelsپیکربندی شده باشد، پاسخ همان کاتالوگ مجاز است؛ در غیر این صورت پاسخ، کاتالوگ کامل Gateway است. "configured": رفتار بهاندازه picker. اگرagents.defaults.modelsپیکربندی شده باشد، همچنان اولویت دارد. در غیر این صورت پاسخ از مدخلهای صریحmodels.providers.*.modelsاستفاده میکند، و فقط وقتی هیچ ردیف model پیکربندیشدهای وجود نداشته باشد به کاتالوگ کامل fallback میکند."all": کاتالوگ کامل Gateway، با دور زدنagents.defaults.models. از این برای diagnostics و UIهای کشف استفاده کنید، نه pickerهای عادی model.
تأییدهای اجرا
- وقتی یک درخواست exec به تأیید نیاز داشته باشد، gateway رویداد
exec.approval.requestedرا پخش میکند. - clientهای اپراتور با فراخوانی
exec.approval.resolveresolve میکنند (به scopeoperator.approvalsنیاز دارد). - برای
host=node،exec.approval.requestباید شاملsystemRunPlanباشد (argv/cwd/rawCommand/metadata جلسه canonical). درخواستهای فاقدsystemRunPlanرد میشوند. - پس از تأیید، فراخوانیهای forwardشده
node.invoke system.runهمانsystemRunPlancanonical را بهعنوان context معتبر command/cwd/session دوباره استفاده میکنند. - اگر یک caller بین prepare و forward نهایی
system.runتأییدشده،command،rawCommand،cwd،agentId، یاsessionKeyرا تغییر دهد، gateway بهجای اعتماد به payload تغییریافته، اجرا را رد میکند.
fallback تحویل agent
- درخواستهای
agentمیتوانندdeliver=trueرا شامل شوند تا تحویل outbound درخواست شود. bestEffortDeliver=falseرفتار سختگیرانه را حفظ میکند: هدفهای تحویل resolveنشده یا فقط داخلیINVALID_REQUESTبرمیگردانند.bestEffortDeliver=trueوقتی هیچ مسیر قابل تحویل خارجی قابل resolve نباشد، fallback به اجرای فقط-جلسه را مجاز میکند (برای مثال جلسههای internal/webchat یا configهای چند-channel مبهم).
نسخهبندی
PROTOCOL_VERSIONدرsrc/gateway/protocol/version.tsقرار دارد.- clientها
minProtocol+maxProtocolرا میفرستند؛ server ناسازگاریها را رد میکند. - Schemaها + modelها از تعریفهای TypeBox تولید میشوند:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ثابتهای client
client مرجع در src/gateway/client.ts از این defaultها استفاده میکند. مقدارها در
protocol v4 پایدار هستند و baseline مورد انتظار برای clientهای شخص ثالثاند.
| ثابت | پیشفرض | منبع |
|---|---|---|
PROTOCOL_VERSION |
4 |
src/gateway/protocol/version.ts |
| زمانبر شدن درخواست (برای هر RPC) | 30_000 ms |
src/gateway/client.ts (requestTimeoutMs) |
| زمانبر شدن Preauth / connect-challenge | 15_000 ms |
src/gateway/handshake-timeouts.ts (config/env میتواند بودجه server/client جفتشده را افزایش دهد) |
| backoff اولیه reconnect | 1_000 ms |
src/gateway/client.ts (backoffMs) |
| بیشینه backoff مربوط به reconnect | 30_000 ms |
src/gateway/client.ts (scheduleReconnect) |
| clamp تلاش دوباره سریع پس از بستن device-token | 250 ms |
src/gateway/client.ts |
مهلت force-stop پیش از terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
زمانبر شدن پیشفرض stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
فاصله پیشفرض tick (پیش از hello-ok) |
30_000 ms |
src/gateway/client.ts |
| بستهشدن در tick-timeout | code 4000 وقتی سکوت از tickIntervalMs * 2 بیشتر شود |
src/gateway/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
server مقدارهای مؤثر policy.tickIntervalMs، policy.maxPayload،
و policy.maxBufferedBytes را در hello-ok اعلام میکند؛ clientها باید بهجای defaultهای پیش از handshake،
به آن مقدارها پایبند باشند.
Auth
- احراز هویت Gateway با راز مشترک، بسته به حالت احراز هویت پیکربندیشده، از
connect.params.auth.tokenیاconnect.params.auth.passwordاستفاده میکند. - حالتهای دارای هویت، مانند Tailscale Serve
(
gateway.auth.allowTailscale: true) یاgateway.auth.mode: "trusted-proxy"غیر local loopback، بررسی احراز هویت اتصال را بهجایconnect.params.auth.*از سرآیندهای درخواست برآورده میکنند. gateway.auth.mode: "none"برای ورودی خصوصی، احراز هویت اتصال با راز مشترک را کاملاً رد میکند؛ این حالت را روی ورودی عمومی/نامطمئن در معرض دسترس قرار ندهید.- پس از جفتسازی، Gateway یک توکن دستگاه محدود به نقش اتصال
- دامنهها صادر میکند. این مقدار در
hello-ok.auth.deviceTokenبرگردانده میشود و باید برای اتصالهای آینده توسط کلاینت پایدار شود.
- دامنهها صادر میکند. این مقدار در
- کلاینتها باید پس از هر اتصال موفق،
hello-ok.auth.deviceTokenاصلی را پایدار کنند. - اتصال دوباره با آن توکن دستگاه ذخیرهشده باید مجموعه دامنه تأییدشده ذخیرهشده برای همان توکن را نیز دوباره استفاده کند. این کار دسترسی خواندن/کاوش/وضعیت را که قبلاً اعطا شده حفظ میکند و از فروکاهش بیصدای اتصالهای مجدد به یک دامنه ضمنی محدودتر فقط-مدیر جلوگیری میکند.
- مونتاژ احراز هویت اتصال در سمت کلاینت (
selectConnectAuthدرsrc/gateway/client.ts):auth.passwordمستقل است و همیشه هنگام تنظیمشدن ارسال میشود.auth.tokenبهترتیب اولویت پر میشود: ابتدا توکن مشترک صریح، سپس یکdeviceTokenصریح، و بعد یک توکن ذخیرهشده بهازای دستگاه (کلیدشده باdeviceId+role).auth.bootstrapTokenفقط زمانی فرستاده میشود که هیچکدام از موارد بالا یکauth.tokenرا تعیین نکرده باشند. توکن مشترک یا هر توکن دستگاه تعیینشده آن را سرکوب میکند.- ارتقای خودکار یک توکن دستگاه ذخیرهشده در تلاش دوباره یکباره
AUTH_TOKEN_MISMATCHفقط به نقطههای پایانی مورد اعتماد محدود است — loopback، یاwss://باtlsFingerprintپینشده.wss://عمومی بدون پینکردن واجد شرایط نیست.
- ورودیهای اضافی
hello-ok.auth.deviceTokensتوکنهای تحویل بوتاسترپ هستند. آنها را فقط وقتی پایدار کنید که اتصال از احراز هویت بوتاسترپ روی یک انتقال مورد اعتماد مانندwss://یا جفتسازی loopback/محلی استفاده کرده باشد. - اگر یک کلاینت یک
deviceTokenصریح یاscopesصریح ارائه کند، آن مجموعه دامنه درخواستشده توسط فراخواننده مرجع باقی میماند؛ دامنههای کششده فقط وقتی دوباره استفاده میشوند که کلاینت در حال استفاده دوباره از توکن ذخیرهشده بهازای دستگاه باشد. - توکنهای دستگاه را میتوان از طریق
device.token.rotateوdevice.token.revokeچرخاند/باطل کرد (به دامنهoperator.pairingنیاز دارد). device.token.rotateفراداده چرخش را برمیگرداند. این دستور توکن حامل جایگزین را فقط برای فراخوانیهای همان دستگاه که از قبل با همان توکن دستگاه احراز هویت شدهاند بازتاب میدهد، تا کلاینتهای فقط-توکن بتوانند جایگزین خود را پیش از اتصال دوباره پایدار کنند. چرخشهای مشترک/مدیر توکن حامل را بازتاب نمیدهند.- صدور، چرخش، و ابطال توکن به مجموعه نقش تأییدشدهای محدود میماند که در ورودی جفتسازی همان دستگاه ثبت شده است؛ جهش توکن نمیتواند نقش دستگاهی را گسترش دهد یا هدف بگیرد که تأیید جفتسازی هرگز اعطا نکرده است.
- برای نشستهای توکن دستگاه جفتشده، مدیریت دستگاه خود-محدود است مگر اینکه
فراخواننده
operator.adminرا نیز داشته باشد: فراخوانندههای غیرمدیر فقط میتوانند ورودی دستگاه خودشان را حذف/باطل/چرخش کنند. 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)
- رفتار کلاینت برای
AUTH_TOKEN_MISMATCH:- کلاینتهای مورد اعتماد میتوانند یک تلاش دوباره محدود با توکن کششده بهازای دستگاه انجام دهند.
- اگر آن تلاش دوباره شکست بخورد، کلاینتها باید حلقههای اتصال مجدد خودکار را متوقف کنند و راهنمایی اقدام عملگر را نمایش دهند.
هویت دستگاه + جفتسازی
- Nodeها باید یک هویت دستگاه پایدار (
device.id) مشتقشده از اثرانگشت جفتکلید داشته باشند. - Gatewayها توکنها را بهازای دستگاه + نقش صادر میکنند.
- تأییدهای جفتسازی برای شناسههای دستگاه جدید لازم هستند، مگر اینکه تأیید خودکار محلی فعال شده باشد.
- تأیید خودکار جفتسازی حول اتصالهای مستقیم local loopback متمرکز است.
- OpenClaw همچنین یک مسیر خوداتصالی محدود محلیِ بکاند/کانتینر برای جریانهای کمکی راز مشترک مورد اعتماد دارد.
- اتصالهای tailnet یا LAN روی همان میزبان همچنان برای جفتسازی دوردست تلقی میشوند و به تأیید نیاز دارند.
- کلاینتهای WS معمولاً هنگام
connectهویتdeviceرا شامل میکنند (عملگر + Node). تنها استثناهای عملگر بدون دستگاه، مسیرهای اعتماد صریح هستند:gateway.controlUi.allowInsecureAuth=trueبرای سازگاری HTTP ناامن فقط-میزبانمحلی.- احراز هویت موفق واسط کاربری کنترل عملگر با
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(شکستن اضطراری، کاهش امنیت شدید).- RPCهای بکاند
gateway-clientاز مسیر direct-loopback که با توکن/رمز عبور مشترک Gateway احراز هویت شدهاند.
- همه اتصالها باید 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است، که علاوه بر فیلدهای دستگاه/کلاینت/نقش/دامنهها/توکن/nonce،platformوdeviceFamilyرا نیز مقید میکند. - امضاهای قدیمی
v2همچنان برای سازگاری پذیرفته میشوند، اما پینکردن فراداده دستگاه جفتشده همچنان سیاست فرمان را هنگام اتصال دوباره کنترل میکند.
TLS + پینکردن
- TLS برای اتصالهای WS پشتیبانی میشود.
- کلاینتها میتوانند بهصورت اختیاری اثرانگشت گواهی Gateway را پین کنند (به پیکربندی
gateway.tlsبههمراهgateway.remote.tlsFingerprintیا CLI--tls-fingerprintمراجعه کنید).
دامنه
این پروتکل API کامل Gateway را در معرض دسترس قرار میدهد (وضعیت، کانالها، مدلها، گفتوگو،
عامل، نشستها، Nodeها، تأییدها، و غیره). سطح دقیق توسط
طرحوارههای TypeBox در src/gateway/protocol/schema.ts تعریف میشود.