durar-ai 2026.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/CHANGELOG.md +5497 -0
  2. package/LICENSE +21 -0
  3. package/README.md +614 -0
  4. package/assets/avatar-placeholder.svg +19 -0
  5. package/assets/chrome-extension/icons/icon128.png +0 -0
  6. package/assets/chrome-extension/icons/icon16.png +0 -0
  7. package/assets/chrome-extension/icons/icon32.png +0 -0
  8. package/assets/chrome-extension/icons/icon48.png +0 -0
  9. package/assets/dmg-background-small.png +0 -0
  10. package/assets/dmg-background.png +0 -0
  11. package/docs/.i18n/README.md +72 -0
  12. package/docs/.i18n/ar-navigation.json +18 -0
  13. package/docs/.i18n/de-navigation.json +18 -0
  14. package/docs/.i18n/es-navigation.json +18 -0
  15. package/docs/.i18n/fr-navigation.json +18 -0
  16. package/docs/.i18n/glossary.ar.json +5 -0
  17. package/docs/.i18n/glossary.de.json +5 -0
  18. package/docs/.i18n/glossary.es.json +5 -0
  19. package/docs/.i18n/glossary.fr.json +5 -0
  20. package/docs/.i18n/glossary.id.json +5 -0
  21. package/docs/.i18n/glossary.it.json +5 -0
  22. package/docs/.i18n/glossary.ja-JP.json +14 -0
  23. package/docs/.i18n/glossary.ko.json +5 -0
  24. package/docs/.i18n/glossary.pl.json +5 -0
  25. package/docs/.i18n/glossary.pt-BR.json +5 -0
  26. package/docs/.i18n/glossary.tr.json +5 -0
  27. package/docs/.i18n/glossary.zh-CN.json +358 -0
  28. package/docs/.i18n/id-navigation.json +18 -0
  29. package/docs/.i18n/it-navigation.json +18 -0
  30. package/docs/.i18n/ja-navigation.json +18 -0
  31. package/docs/.i18n/ko-navigation.json +18 -0
  32. package/docs/.i18n/pl-navigation.json +18 -0
  33. package/docs/.i18n/pt-BR-navigation.json +18 -0
  34. package/docs/.i18n/tr-navigation.json +18 -0
  35. package/docs/.i18n/zh-Hans-navigation.json +544 -0
  36. package/docs/assets/install-script.svg +1 -0
  37. package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
  38. package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
  39. package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
  40. package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
  41. package/docs/assets/macos-onboarding/05-permissions.png +0 -0
  42. package/docs/assets/openclaw-logo-text-dark.png +0 -0
  43. package/docs/assets/openclaw-logo-text-dark.svg +418 -0
  44. package/docs/assets/openclaw-logo-text.png +0 -0
  45. package/docs/assets/openclaw-logo-text.svg +418 -0
  46. package/docs/assets/pixel-lobster.svg +60 -0
  47. package/docs/assets/showcase/agents-ui.jpg +0 -0
  48. package/docs/assets/showcase/bambu-cli.png +0 -0
  49. package/docs/assets/showcase/codexmonitor.png +0 -0
  50. package/docs/assets/showcase/gohome-grafana.png +0 -0
  51. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  52. package/docs/assets/showcase/oura-health.png +0 -0
  53. package/docs/assets/showcase/padel-cli.svg +11 -0
  54. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  55. package/docs/assets/showcase/papla-tts.jpg +0 -0
  56. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  57. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  58. package/docs/assets/showcase/roborock-status.svg +13 -0
  59. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  60. package/docs/assets/showcase/snag.png +0 -0
  61. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  62. package/docs/assets/showcase/wienerlinien.png +0 -0
  63. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  64. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  65. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  66. package/docs/assets/sponsors/blacksmith-light.svg +14 -0
  67. package/docs/assets/sponsors/blacksmith.svg +14 -0
  68. package/docs/assets/sponsors/convex-light.svg +16 -0
  69. package/docs/assets/sponsors/convex.svg +16 -0
  70. package/docs/assets/sponsors/github-light.svg +3 -0
  71. package/docs/assets/sponsors/github.svg +3 -0
  72. package/docs/assets/sponsors/nvidia-dark.svg +9 -0
  73. package/docs/assets/sponsors/nvidia.svg +9 -0
  74. package/docs/assets/sponsors/openai-light.svg +3 -0
  75. package/docs/assets/sponsors/openai.svg +3 -0
  76. package/docs/assets/sponsors/vercel-light.svg +5 -0
  77. package/docs/assets/sponsors/vercel.svg +5 -0
  78. package/docs/auth-credential-semantics.md +80 -0
  79. package/docs/automation/auth-monitoring.md +8 -0
  80. package/docs/automation/clawflow.md +8 -0
  81. package/docs/automation/cron-jobs.md +410 -0
  82. package/docs/automation/cron-vs-heartbeat.md +8 -0
  83. package/docs/automation/gmail-pubsub.md +8 -0
  84. package/docs/automation/hooks.md +303 -0
  85. package/docs/automation/index.md +115 -0
  86. package/docs/automation/poll.md +8 -0
  87. package/docs/automation/standing-orders.md +254 -0
  88. package/docs/automation/taskflow.md +82 -0
  89. package/docs/automation/tasks.md +323 -0
  90. package/docs/automation/troubleshooting.md +8 -0
  91. package/docs/automation/webhook.md +8 -0
  92. package/docs/brave-search.md +103 -0
  93. package/docs/channels/bluebubbles.md +435 -0
  94. package/docs/channels/broadcast-groups.md +442 -0
  95. package/docs/channels/channel-routing.md +139 -0
  96. package/docs/channels/discord.md +1254 -0
  97. package/docs/channels/feishu.md +793 -0
  98. package/docs/channels/googlechat.md +270 -0
  99. package/docs/channels/group-messages.md +84 -0
  100. package/docs/channels/groups.md +410 -0
  101. package/docs/channels/imessage.md +427 -0
  102. package/docs/channels/index.md +50 -0
  103. package/docs/channels/irc.md +252 -0
  104. package/docs/channels/line.md +225 -0
  105. package/docs/channels/location.md +56 -0
  106. package/docs/channels/matrix.md +869 -0
  107. package/docs/channels/mattermost.md +472 -0
  108. package/docs/channels/msteams.md +805 -0
  109. package/docs/channels/nextcloud-talk.md +149 -0
  110. package/docs/channels/nostr.md +252 -0
  111. package/docs/channels/pairing.md +129 -0
  112. package/docs/channels/qqbot.md +193 -0
  113. package/docs/channels/signal.md +337 -0
  114. package/docs/channels/slack.md +681 -0
  115. package/docs/channels/synology-chat.md +185 -0
  116. package/docs/channels/telegram.md +1072 -0
  117. package/docs/channels/tlon.md +290 -0
  118. package/docs/channels/troubleshooting.md +133 -0
  119. package/docs/channels/twitch.md +394 -0
  120. package/docs/channels/whatsapp.md +488 -0
  121. package/docs/channels/zalo.md +254 -0
  122. package/docs/channels/zalouser.md +195 -0
  123. package/docs/ci.md +66 -0
  124. package/docs/cli/acp.md +316 -0
  125. package/docs/cli/agent.md +57 -0
  126. package/docs/cli/agents.md +220 -0
  127. package/docs/cli/approvals.md +136 -0
  128. package/docs/cli/backup.md +84 -0
  129. package/docs/cli/browser.md +233 -0
  130. package/docs/cli/channels.md +131 -0
  131. package/docs/cli/clawbot.md +21 -0
  132. package/docs/cli/completion.md +35 -0
  133. package/docs/cli/config.md +353 -0
  134. package/docs/cli/configure.md +70 -0
  135. package/docs/cli/cron.md +167 -0
  136. package/docs/cli/daemon.md +57 -0
  137. package/docs/cli/dashboard.md +22 -0
  138. package/docs/cli/devices.md +171 -0
  139. package/docs/cli/directory.md +63 -0
  140. package/docs/cli/dns.md +48 -0
  141. package/docs/cli/docs.md +28 -0
  142. package/docs/cli/doctor.md +63 -0
  143. package/docs/cli/flows.md +18 -0
  144. package/docs/cli/gateway.md +307 -0
  145. package/docs/cli/health.md +36 -0
  146. package/docs/cli/hooks.md +337 -0
  147. package/docs/cli/index.md +1836 -0
  148. package/docs/cli/logs.md +59 -0
  149. package/docs/cli/mcp.md +505 -0
  150. package/docs/cli/memory.md +139 -0
  151. package/docs/cli/message.md +300 -0
  152. package/docs/cli/models.md +136 -0
  153. package/docs/cli/node.md +137 -0
  154. package/docs/cli/nodes.md +66 -0
  155. package/docs/cli/onboard.md +171 -0
  156. package/docs/cli/pairing.md +65 -0
  157. package/docs/cli/plugins.md +305 -0
  158. package/docs/cli/qr.md +52 -0
  159. package/docs/cli/reset.md +35 -0
  160. package/docs/cli/sandbox.md +197 -0
  161. package/docs/cli/secrets.md +197 -0
  162. package/docs/cli/security.md +86 -0
  163. package/docs/cli/sessions.md +113 -0
  164. package/docs/cli/setup.md +45 -0
  165. package/docs/cli/skills.md +59 -0
  166. package/docs/cli/status.md +35 -0
  167. package/docs/cli/system.md +71 -0
  168. package/docs/cli/tui.md +30 -0
  169. package/docs/cli/uninstall.md +39 -0
  170. package/docs/cli/update.md +113 -0
  171. package/docs/cli/voicecall.md +34 -0
  172. package/docs/cli/webhooks.md +91 -0
  173. package/docs/concepts/agent-loop.md +168 -0
  174. package/docs/concepts/agent-workspace.md +246 -0
  175. package/docs/concepts/agent.md +129 -0
  176. package/docs/concepts/architecture.md +156 -0
  177. package/docs/concepts/compaction.md +122 -0
  178. package/docs/concepts/context-engine.md +274 -0
  179. package/docs/concepts/context.md +179 -0
  180. package/docs/concepts/delegate-architecture.md +307 -0
  181. package/docs/concepts/dreaming.md +173 -0
  182. package/docs/concepts/features.md +76 -0
  183. package/docs/concepts/markdown-formatting.md +130 -0
  184. package/docs/concepts/memory-builtin.md +105 -0
  185. package/docs/concepts/memory-honcho.md +140 -0
  186. package/docs/concepts/memory-qmd.md +163 -0
  187. package/docs/concepts/memory-search.md +141 -0
  188. package/docs/concepts/memory.md +121 -0
  189. package/docs/concepts/messages.md +161 -0
  190. package/docs/concepts/model-failover.md +349 -0
  191. package/docs/concepts/model-providers.md +799 -0
  192. package/docs/concepts/models.md +255 -0
  193. package/docs/concepts/multi-agent.md +615 -0
  194. package/docs/concepts/oauth.md +225 -0
  195. package/docs/concepts/presence.md +102 -0
  196. package/docs/concepts/queue.md +89 -0
  197. package/docs/concepts/retry.md +69 -0
  198. package/docs/concepts/session-pruning.md +92 -0
  199. package/docs/concepts/session-tool.md +141 -0
  200. package/docs/concepts/session.md +116 -0
  201. package/docs/concepts/soul.md +110 -0
  202. package/docs/concepts/streaming.md +161 -0
  203. package/docs/concepts/system-prompt.md +182 -0
  204. package/docs/concepts/timezone.md +97 -0
  205. package/docs/concepts/typebox.md +307 -0
  206. package/docs/concepts/typing-indicators.md +69 -0
  207. package/docs/concepts/usage-tracking.md +59 -0
  208. package/docs/date-time.md +128 -0
  209. package/docs/debug/node-issue.md +85 -0
  210. package/docs/diagnostics/flags.md +91 -0
  211. package/docs/docs.json +1601 -0
  212. package/docs/gateway/authentication.md +218 -0
  213. package/docs/gateway/background-process.md +131 -0
  214. package/docs/gateway/bonjour.md +179 -0
  215. package/docs/gateway/bridge-protocol.md +89 -0
  216. package/docs/gateway/cli-backends.md +310 -0
  217. package/docs/gateway/configuration-examples.md +631 -0
  218. package/docs/gateway/configuration-reference.md +3618 -0
  219. package/docs/gateway/configuration.md +698 -0
  220. package/docs/gateway/discovery.md +141 -0
  221. package/docs/gateway/doctor.md +494 -0
  222. package/docs/gateway/gateway-lock.md +37 -0
  223. package/docs/gateway/health.md +61 -0
  224. package/docs/gateway/heartbeat.md +443 -0
  225. package/docs/gateway/index.md +367 -0
  226. package/docs/gateway/local-models.md +163 -0
  227. package/docs/gateway/logging.md +113 -0
  228. package/docs/gateway/multiple-gateways.md +120 -0
  229. package/docs/gateway/network-model.md +25 -0
  230. package/docs/gateway/openai-http-api.md +280 -0
  231. package/docs/gateway/openresponses-http-api.md +340 -0
  232. package/docs/gateway/openshell.md +307 -0
  233. package/docs/gateway/pairing.md +138 -0
  234. package/docs/gateway/protocol.md +588 -0
  235. package/docs/gateway/remote-gateway-readme.md +164 -0
  236. package/docs/gateway/remote.md +251 -0
  237. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +141 -0
  238. package/docs/gateway/sandboxing.md +473 -0
  239. package/docs/gateway/secrets-plan-contract.md +116 -0
  240. package/docs/gateway/secrets.md +541 -0
  241. package/docs/gateway/security/index.md +1362 -0
  242. package/docs/gateway/tailscale.md +136 -0
  243. package/docs/gateway/tools-invoke-http-api.md +161 -0
  244. package/docs/gateway/troubleshooting.md +451 -0
  245. package/docs/gateway/trusted-proxy-auth.md +399 -0
  246. package/docs/help/debugging.md +168 -0
  247. package/docs/help/environment.md +165 -0
  248. package/docs/help/faq.md +3244 -0
  249. package/docs/help/index.md +28 -0
  250. package/docs/help/scripts.md +27 -0
  251. package/docs/help/testing.md +640 -0
  252. package/docs/help/troubleshooting.md +372 -0
  253. package/docs/images/configure-model-picker-unsearchable.png +0 -0
  254. package/docs/images/feishu-step2-create-app.png +0 -0
  255. package/docs/images/feishu-step3-credentials.png +0 -0
  256. package/docs/images/feishu-step4-permissions.png +0 -0
  257. package/docs/images/feishu-step5-bot-capability.png +0 -0
  258. package/docs/images/feishu-step6-event-subscription.png +0 -0
  259. package/docs/images/feishu-verification-token.png +0 -0
  260. package/docs/images/groups-flow.svg +52 -0
  261. package/docs/images/mobile-ui-screenshot.png +0 -0
  262. package/docs/index.md +196 -0
  263. package/docs/install/ansible.md +230 -0
  264. package/docs/install/azure.md +311 -0
  265. package/docs/install/bun.md +55 -0
  266. package/docs/install/clawdock.md +106 -0
  267. package/docs/install/development-channels.md +131 -0
  268. package/docs/install/digitalocean.md +129 -0
  269. package/docs/install/docker-vm-runtime.md +142 -0
  270. package/docs/install/docker.md +412 -0
  271. package/docs/install/exe-dev.md +133 -0
  272. package/docs/install/fly.md +504 -0
  273. package/docs/install/gcp.md +412 -0
  274. package/docs/install/hetzner.md +259 -0
  275. package/docs/install/index.md +212 -0
  276. package/docs/install/installer.md +443 -0
  277. package/docs/install/kubernetes.md +192 -0
  278. package/docs/install/macos-vm.md +281 -0
  279. package/docs/install/migrating-matrix.md +349 -0
  280. package/docs/install/migrating.md +112 -0
  281. package/docs/install/nix.md +89 -0
  282. package/docs/install/node.md +144 -0
  283. package/docs/install/northflank.mdx +42 -0
  284. package/docs/install/oracle.md +158 -0
  285. package/docs/install/podman.md +210 -0
  286. package/docs/install/railway.mdx +90 -0
  287. package/docs/install/raspberry-pi.md +159 -0
  288. package/docs/install/render.mdx +165 -0
  289. package/docs/install/uninstall.md +128 -0
  290. package/docs/install/updating.md +142 -0
  291. package/docs/logging.md +389 -0
  292. package/docs/nav-tabs-underline.js +100 -0
  293. package/docs/network.md +69 -0
  294. package/docs/nodes/audio.md +191 -0
  295. package/docs/nodes/camera.md +162 -0
  296. package/docs/nodes/images.md +73 -0
  297. package/docs/nodes/index.md +408 -0
  298. package/docs/nodes/location-command.md +98 -0
  299. package/docs/nodes/media-understanding.md +432 -0
  300. package/docs/nodes/talk.md +92 -0
  301. package/docs/nodes/troubleshooting.md +123 -0
  302. package/docs/nodes/voicewake.md +66 -0
  303. package/docs/perplexity.md +181 -0
  304. package/docs/pi-dev.md +80 -0
  305. package/docs/pi.md +570 -0
  306. package/docs/platforms/android.md +244 -0
  307. package/docs/platforms/digitalocean.md +266 -0
  308. package/docs/platforms/index.md +55 -0
  309. package/docs/platforms/ios.md +223 -0
  310. package/docs/platforms/linux.md +100 -0
  311. package/docs/platforms/mac/bundled-gateway.md +75 -0
  312. package/docs/platforms/mac/canvas.md +125 -0
  313. package/docs/platforms/mac/child-process.md +69 -0
  314. package/docs/platforms/mac/dev-setup.md +107 -0
  315. package/docs/platforms/mac/health.md +34 -0
  316. package/docs/platforms/mac/icon.md +31 -0
  317. package/docs/platforms/mac/logging.md +57 -0
  318. package/docs/platforms/mac/menu-bar.md +81 -0
  319. package/docs/platforms/mac/peekaboo.md +65 -0
  320. package/docs/platforms/mac/permissions.md +50 -0
  321. package/docs/platforms/mac/remote.md +84 -0
  322. package/docs/platforms/mac/signing.md +47 -0
  323. package/docs/platforms/mac/skills.md +40 -0
  324. package/docs/platforms/mac/voice-overlay.md +60 -0
  325. package/docs/platforms/mac/voicewake.md +67 -0
  326. package/docs/platforms/mac/webchat.md +51 -0
  327. package/docs/platforms/mac/xpc.md +61 -0
  328. package/docs/platforms/macos.md +229 -0
  329. package/docs/platforms/oracle.md +305 -0
  330. package/docs/platforms/raspberry-pi.md +420 -0
  331. package/docs/platforms/windows.md +241 -0
  332. package/docs/plugins/agent-tools.md +10 -0
  333. package/docs/plugins/architecture.md +1609 -0
  334. package/docs/plugins/building-extensions.md +10 -0
  335. package/docs/plugins/building-plugins.md +319 -0
  336. package/docs/plugins/bundles.md +292 -0
  337. package/docs/plugins/community.md +149 -0
  338. package/docs/plugins/manifest.md +412 -0
  339. package/docs/plugins/sdk-channel-plugins.md +508 -0
  340. package/docs/plugins/sdk-entrypoints.md +210 -0
  341. package/docs/plugins/sdk-migration.md +359 -0
  342. package/docs/plugins/sdk-overview.md +475 -0
  343. package/docs/plugins/sdk-provider-plugins.md +712 -0
  344. package/docs/plugins/sdk-runtime.md +381 -0
  345. package/docs/plugins/sdk-setup.md +516 -0
  346. package/docs/plugins/sdk-testing.md +263 -0
  347. package/docs/plugins/voice-call.md +466 -0
  348. package/docs/plugins/zalouser.md +78 -0
  349. package/docs/prose.md +134 -0
  350. package/docs/providers/anthropic.md +402 -0
  351. package/docs/providers/bedrock-mantle.md +91 -0
  352. package/docs/providers/bedrock.md +273 -0
  353. package/docs/providers/chutes.md +103 -0
  354. package/docs/providers/claude-max-api-proxy.md +163 -0
  355. package/docs/providers/cloudflare-ai-gateway.md +71 -0
  356. package/docs/providers/deepgram.md +93 -0
  357. package/docs/providers/deepseek.md +53 -0
  358. package/docs/providers/fireworks.md +69 -0
  359. package/docs/providers/github-copilot.md +80 -0
  360. package/docs/providers/glm.md +68 -0
  361. package/docs/providers/google.md +149 -0
  362. package/docs/providers/groq.md +105 -0
  363. package/docs/providers/huggingface.md +193 -0
  364. package/docs/providers/index.md +81 -0
  365. package/docs/providers/kilocode.md +89 -0
  366. package/docs/providers/litellm.md +159 -0
  367. package/docs/providers/minimax.md +281 -0
  368. package/docs/providers/mistral.md +68 -0
  369. package/docs/providers/models.md +56 -0
  370. package/docs/providers/moonshot.md +224 -0
  371. package/docs/providers/nvidia.md +58 -0
  372. package/docs/providers/ollama.md +379 -0
  373. package/docs/providers/openai.md +472 -0
  374. package/docs/providers/opencode-go.md +45 -0
  375. package/docs/providers/opencode.md +68 -0
  376. package/docs/providers/openrouter.md +59 -0
  377. package/docs/providers/perplexity-provider.md +62 -0
  378. package/docs/providers/qianfan.md +90 -0
  379. package/docs/providers/qwen.md +128 -0
  380. package/docs/providers/qwen_modelstudio.md +137 -0
  381. package/docs/providers/sglang.md +115 -0
  382. package/docs/providers/stepfun.md +152 -0
  383. package/docs/providers/synthetic.md +101 -0
  384. package/docs/providers/together.md +70 -0
  385. package/docs/providers/venice.md +282 -0
  386. package/docs/providers/vercel-ai-gateway.md +60 -0
  387. package/docs/providers/vllm.md +103 -0
  388. package/docs/providers/volcengine.md +94 -0
  389. package/docs/providers/xai.md +94 -0
  390. package/docs/providers/xiaomi.md +89 -0
  391. package/docs/providers/zai.md +75 -0
  392. package/docs/reference/AGENTS.default.md +126 -0
  393. package/docs/reference/RELEASING.md +138 -0
  394. package/docs/reference/api-usage-costs.md +198 -0
  395. package/docs/reference/credits.md +30 -0
  396. package/docs/reference/device-models.md +47 -0
  397. package/docs/reference/memory-config.md +421 -0
  398. package/docs/reference/prompt-caching.md +344 -0
  399. package/docs/reference/rpc.md +43 -0
  400. package/docs/reference/secretref-credential-surface.md +148 -0
  401. package/docs/reference/secretref-user-supplied-credentials-matrix.json +607 -0
  402. package/docs/reference/session-management-compaction.md +352 -0
  403. package/docs/reference/templates/AGENTS.dev.md +84 -0
  404. package/docs/reference/templates/AGENTS.md +219 -0
  405. package/docs/reference/templates/BOOT.md +12 -0
  406. package/docs/reference/templates/BOOTSTRAP.md +62 -0
  407. package/docs/reference/templates/CLAUDE.md +1 -0
  408. package/docs/reference/templates/HEARTBEAT.md +14 -0
  409. package/docs/reference/templates/IDENTITY.dev.md +48 -0
  410. package/docs/reference/templates/IDENTITY.md +30 -0
  411. package/docs/reference/templates/SOUL.dev.md +77 -0
  412. package/docs/reference/templates/SOUL.md +45 -0
  413. package/docs/reference/templates/TOOLS.dev.md +25 -0
  414. package/docs/reference/templates/TOOLS.md +47 -0
  415. package/docs/reference/templates/USER.dev.md +19 -0
  416. package/docs/reference/templates/USER.md +24 -0
  417. package/docs/reference/test.md +119 -0
  418. package/docs/reference/token-use.md +197 -0
  419. package/docs/reference/transcript-hygiene.md +151 -0
  420. package/docs/reference/wizard.md +245 -0
  421. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +98 -0
  422. package/docs/security/THREAT-MODEL-ATLAS.md +608 -0
  423. package/docs/security/formal-verification.md +167 -0
  424. package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +9 -0
  425. package/docs/snippets/plugin-publish/minimal-package.json +16 -0
  426. package/docs/start/bootstrapping.md +41 -0
  427. package/docs/start/docs-directory.md +67 -0
  428. package/docs/start/getting-started.md +148 -0
  429. package/docs/start/hubs.md +199 -0
  430. package/docs/start/lore.md +219 -0
  431. package/docs/start/onboarding-overview.md +69 -0
  432. package/docs/start/onboarding.md +92 -0
  433. package/docs/start/openclaw.md +225 -0
  434. package/docs/start/quickstart.md +22 -0
  435. package/docs/start/setup.md +172 -0
  436. package/docs/start/showcase.md +418 -0
  437. package/docs/start/wizard-cli-automation.md +233 -0
  438. package/docs/start/wizard-cli-reference.md +324 -0
  439. package/docs/start/wizard.md +127 -0
  440. package/docs/style.css +37 -0
  441. package/docs/tools/acp-agents.md +837 -0
  442. package/docs/tools/agent-send.md +100 -0
  443. package/docs/tools/apply-patch.md +52 -0
  444. package/docs/tools/brave-search.md +107 -0
  445. package/docs/tools/browser-linux-troubleshooting.md +145 -0
  446. package/docs/tools/browser-login.md +73 -0
  447. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +221 -0
  448. package/docs/tools/browser.md +890 -0
  449. package/docs/tools/btw.md +142 -0
  450. package/docs/tools/capability-cookbook.md +119 -0
  451. package/docs/tools/clawhub.md +348 -0
  452. package/docs/tools/code-execution.md +90 -0
  453. package/docs/tools/creating-skills.md +119 -0
  454. package/docs/tools/diffs.md +434 -0
  455. package/docs/tools/duckduckgo-search.md +102 -0
  456. package/docs/tools/elevated.md +116 -0
  457. package/docs/tools/exa-search.md +127 -0
  458. package/docs/tools/exec-approvals.md +635 -0
  459. package/docs/tools/exec.md +237 -0
  460. package/docs/tools/firecrawl.md +147 -0
  461. package/docs/tools/gemini-search.md +98 -0
  462. package/docs/tools/grok-search.md +102 -0
  463. package/docs/tools/image-generation.md +139 -0
  464. package/docs/tools/index.md +174 -0
  465. package/docs/tools/kimi-search.md +98 -0
  466. package/docs/tools/llm-task.md +119 -0
  467. package/docs/tools/lobster.md +348 -0
  468. package/docs/tools/loop-detection.md +100 -0
  469. package/docs/tools/minimax-search.md +99 -0
  470. package/docs/tools/multi-agent-sandbox-tools.md +373 -0
  471. package/docs/tools/ollama-search.md +100 -0
  472. package/docs/tools/pdf.md +176 -0
  473. package/docs/tools/perplexity-search.md +185 -0
  474. package/docs/tools/plugin.md +348 -0
  475. package/docs/tools/reactions.md +78 -0
  476. package/docs/tools/searxng-search.md +132 -0
  477. package/docs/tools/skills-config.md +133 -0
  478. package/docs/tools/skills.md +377 -0
  479. package/docs/tools/slash-commands.md +322 -0
  480. package/docs/tools/subagents.md +341 -0
  481. package/docs/tools/tavily.md +129 -0
  482. package/docs/tools/thinking.md +102 -0
  483. package/docs/tools/tts.md +452 -0
  484. package/docs/tools/web-fetch.md +159 -0
  485. package/docs/tools/web.md +417 -0
  486. package/docs/tts.md +452 -0
  487. package/docs/vps.md +115 -0
  488. package/docs/web/control-ui.md +318 -0
  489. package/docs/web/dashboard.md +93 -0
  490. package/docs/web/index.md +126 -0
  491. package/docs/web/tui.md +176 -0
  492. package/docs/web/webchat.md +77 -0
  493. package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
  494. package/docs/whatsapp-openclaw.jpg +0 -0
  495. package/durar.mjs +180 -0
  496. package/package.json +1259 -0
  497. package/scripts/npm-runner.mjs +111 -0
  498. package/scripts/postinstall-bundled-plugins.mjs +188 -0
  499. package/skills/1password/SKILL.md +70 -0
  500. package/skills/1password/references/cli-examples.md +29 -0
  501. package/skills/1password/references/get-started.md +17 -0
  502. package/skills/apple-notes/SKILL.md +77 -0
  503. package/skills/apple-reminders/SKILL.md +118 -0
  504. package/skills/bear-notes/SKILL.md +107 -0
  505. package/skills/blogwatcher/SKILL.md +69 -0
  506. package/skills/blucli/SKILL.md +47 -0
  507. package/skills/bluebubbles/SKILL.md +131 -0
  508. package/skills/camsnap/SKILL.md +45 -0
  509. package/skills/canvas/SKILL.md +199 -0
  510. package/skills/clawhub/SKILL.md +77 -0
  511. package/skills/coding-agent/SKILL.md +316 -0
  512. package/skills/discord/SKILL.md +197 -0
  513. package/skills/eightctl/SKILL.md +50 -0
  514. package/skills/gemini/SKILL.md +43 -0
  515. package/skills/gh-issues/SKILL.md +885 -0
  516. package/skills/gifgrep/SKILL.md +79 -0
  517. package/skills/github/SKILL.md +163 -0
  518. package/skills/gog/SKILL.md +116 -0
  519. package/skills/goplaces/SKILL.md +52 -0
  520. package/skills/healthcheck/SKILL.md +245 -0
  521. package/skills/himalaya/SKILL.md +257 -0
  522. package/skills/himalaya/references/configuration.md +184 -0
  523. package/skills/himalaya/references/message-composition.md +199 -0
  524. package/skills/imsg/SKILL.md +122 -0
  525. package/skills/mcporter/SKILL.md +61 -0
  526. package/skills/model-usage/SKILL.md +69 -0
  527. package/skills/model-usage/references/codexbar-cli.md +33 -0
  528. package/skills/model-usage/scripts/model_usage.py +320 -0
  529. package/skills/model-usage/scripts/test_model_usage.py +40 -0
  530. package/skills/nano-pdf/SKILL.md +38 -0
  531. package/skills/node-connect/SKILL.md +142 -0
  532. package/skills/notion/SKILL.md +174 -0
  533. package/skills/obsidian/SKILL.md +81 -0
  534. package/skills/openai-whisper/SKILL.md +38 -0
  535. package/skills/openai-whisper-api/SKILL.md +62 -0
  536. package/skills/openai-whisper-api/scripts/transcribe.sh +88 -0
  537. package/skills/openhue/SKILL.md +112 -0
  538. package/skills/oracle/SKILL.md +125 -0
  539. package/skills/ordercli/SKILL.md +78 -0
  540. package/skills/peekaboo/SKILL.md +190 -0
  541. package/skills/sag/SKILL.md +87 -0
  542. package/skills/session-logs/SKILL.md +151 -0
  543. package/skills/sherpa-onnx-tts/SKILL.md +109 -0
  544. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  545. package/skills/skill-creator/SKILL.md +372 -0
  546. package/skills/skill-creator/license.txt +202 -0
  547. package/skills/skill-creator/scripts/init_skill.py +378 -0
  548. package/skills/skill-creator/scripts/package_skill.py +139 -0
  549. package/skills/skill-creator/scripts/quick_validate.py +159 -0
  550. package/skills/skill-creator/scripts/test_package_skill.py +160 -0
  551. package/skills/skill-creator/scripts/test_quick_validate.py +72 -0
  552. package/skills/slack/SKILL.md +144 -0
  553. package/skills/songsee/SKILL.md +49 -0
  554. package/skills/sonoscli/SKILL.md +65 -0
  555. package/skills/spotify-player/SKILL.md +64 -0
  556. package/skills/summarize/SKILL.md +87 -0
  557. package/skills/taskflow/SKILL.md +149 -0
  558. package/skills/taskflow/examples/inbox-triage.lobster +33 -0
  559. package/skills/taskflow/examples/pr-intake.lobster +32 -0
  560. package/skills/taskflow-inbox-triage/SKILL.md +119 -0
  561. package/skills/things-mac/SKILL.md +86 -0
  562. package/skills/tmux/SKILL.md +170 -0
  563. package/skills/tmux/scripts/find-sessions.sh +112 -0
  564. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  565. package/skills/trello/SKILL.md +108 -0
  566. package/skills/video-frames/SKILL.md +46 -0
  567. package/skills/video-frames/scripts/frame.sh +81 -0
  568. package/skills/voice-call/SKILL.md +45 -0
  569. package/skills/wacli/SKILL.md +72 -0
  570. package/skills/weather/SKILL.md +129 -0
  571. package/skills/xurl/SKILL.md +461 -0
@@ -0,0 +1,588 @@
1
+ ---
2
+ summary: "Gateway WebSocket protocol: handshake, frames, versioning"
3
+ read_when:
4
+ - Implementing or updating gateway WS clients
5
+ - Debugging protocol mismatches or connect failures
6
+ - Regenerating protocol schema/models
7
+ title: "Gateway Protocol"
8
+ ---
9
+
10
+ # Gateway protocol (WebSocket)
11
+
12
+ The Gateway WS protocol is the **single control plane + node transport** for
13
+ Durar. All clients (CLI, web UI, macOS app, iOS/Android nodes, headless
14
+ nodes) connect over WebSocket and declare their **role** + **scope** at
15
+ handshake time.
16
+
17
+ ## Transport
18
+
19
+ - WebSocket, text frames with JSON payloads.
20
+ - First frame **must** be a `connect` request.
21
+
22
+ ## Handshake (connect)
23
+
24
+ Gateway → Client (pre-connect challenge):
25
+
26
+ ```json
27
+ {
28
+ "type": "event",
29
+ "event": "connect.challenge",
30
+ "payload": { "nonce": "…", "ts": 1737264000000 }
31
+ }
32
+ ```
33
+
34
+ Client → Gateway:
35
+
36
+ ```json
37
+ {
38
+ "type": "req",
39
+ "id": "…",
40
+ "method": "connect",
41
+ "params": {
42
+ "minProtocol": 3,
43
+ "maxProtocol": 3,
44
+ "client": {
45
+ "id": "cli",
46
+ "version": "1.2.3",
47
+ "platform": "macos",
48
+ "mode": "operator"
49
+ },
50
+ "role": "operator",
51
+ "scopes": ["operator.read", "operator.write"],
52
+ "caps": [],
53
+ "commands": [],
54
+ "permissions": {},
55
+ "auth": { "token": "…" },
56
+ "locale": "en-US",
57
+ "userAgent": "Durar-cli/1.2.3",
58
+ "device": {
59
+ "id": "device_fingerprint",
60
+ "publicKey": "…",
61
+ "signature": "…",
62
+ "signedAt": 1737264000000,
63
+ "nonce": "…"
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ Gateway → Client:
70
+
71
+ ```json
72
+ {
73
+ "type": "res",
74
+ "id": "…",
75
+ "ok": true,
76
+ "payload": { "type": "hello-ok", "protocol": 3, "policy": { "tickIntervalMs": 15000 } }
77
+ }
78
+ ```
79
+
80
+ When a device token is issued, `hello-ok` also includes:
81
+
82
+ ```json
83
+ {
84
+ "auth": {
85
+ "deviceToken": "…",
86
+ "role": "operator",
87
+ "scopes": ["operator.read", "operator.write"]
88
+ }
89
+ }
90
+ ```
91
+
92
+ During trusted bootstrap handoff, `hello-ok.auth` may also include additional
93
+ bounded role entries in `deviceTokens`:
94
+
95
+ ```json
96
+ {
97
+ "auth": {
98
+ "deviceToken": "…",
99
+ "role": "node",
100
+ "scopes": [],
101
+ "deviceTokens": [
102
+ {
103
+ "deviceToken": "…",
104
+ "role": "operator",
105
+ "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"]
106
+ }
107
+ ]
108
+ }
109
+ }
110
+ ```
111
+
112
+ For the built-in node/operator bootstrap flow, the primary node token stays
113
+ `scopes: []` and any handed-off operator token stays bounded to the bootstrap
114
+ operator allowlist (`operator.approvals`, `operator.read`,
115
+ `operator.talk.secrets`, `operator.write`). Bootstrap scope checks stay
116
+ role-prefixed: operator entries only satisfy operator requests, and non-operator
117
+ roles still need scopes under their own role prefix.
118
+
119
+ ### Node example
120
+
121
+ ```json
122
+ {
123
+ "type": "req",
124
+ "id": "…",
125
+ "method": "connect",
126
+ "params": {
127
+ "minProtocol": 3,
128
+ "maxProtocol": 3,
129
+ "client": {
130
+ "id": "ios-node",
131
+ "version": "1.2.3",
132
+ "platform": "ios",
133
+ "mode": "node"
134
+ },
135
+ "role": "node",
136
+ "scopes": [],
137
+ "caps": ["camera", "canvas", "screen", "location", "voice"],
138
+ "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"],
139
+ "permissions": { "camera.capture": true, "screen.record": false },
140
+ "auth": { "token": "…" },
141
+ "locale": "en-US",
142
+ "userAgent": "Durar-ios/1.2.3",
143
+ "device": {
144
+ "id": "device_fingerprint",
145
+ "publicKey": "…",
146
+ "signature": "…",
147
+ "signedAt": 1737264000000,
148
+ "nonce": "…"
149
+ }
150
+ }
151
+ }
152
+ ```
153
+
154
+ ## Framing
155
+
156
+ - **Request**: `{type:"req", id, method, params}`
157
+ - **Response**: `{type:"res", id, ok, payload|error}`
158
+ - **Event**: `{type:"event", event, payload, seq?, stateVersion?}`
159
+
160
+ Side-effecting methods require **idempotency keys** (see schema).
161
+
162
+ ## Roles + scopes
163
+
164
+ ### Roles
165
+
166
+ - `operator` = control plane client (CLI/UI/automation).
167
+ - `node` = capability host (camera/screen/canvas/system.run).
168
+
169
+ ### Scopes (operator)
170
+
171
+ Common scopes:
172
+
173
+ - `operator.read`
174
+ - `operator.write`
175
+ - `operator.admin`
176
+ - `operator.approvals`
177
+ - `operator.pairing`
178
+ - `operator.talk.secrets`
179
+
180
+ `talk.config` with `includeSecrets: true` requires `operator.talk.secrets`
181
+ (or `operator.admin`).
182
+
183
+ Plugin-registered gateway RPC methods may request their own operator scope, but
184
+ reserved core admin prefixes (`config.*`, `exec.approvals.*`, `wizard.*`,
185
+ `update.*`) always resolve to `operator.admin`.
186
+
187
+ Method scope is only the first gate. Some slash commands reached through
188
+ `chat.send` apply stricter command-level checks on top. For example, persistent
189
+ `/config set` and `/config unset` writes require `operator.admin`.
190
+
191
+ `node.pair.approve` also has an extra approval-time scope check on top of the
192
+ base method scope:
193
+
194
+ - commandless requests: `operator.pairing`
195
+ - requests with non-exec node commands: `operator.pairing` + `operator.write`
196
+ - requests that include `system.run`, `system.run.prepare`, or `system.which`:
197
+ `operator.pairing` + `operator.admin`
198
+
199
+ ### Caps/commands/permissions (node)
200
+
201
+ Nodes declare capability claims at connect time:
202
+
203
+ - `caps`: high-level capability categories.
204
+ - `commands`: command allowlist for invoke.
205
+ - `permissions`: granular toggles (e.g. `screen.record`, `camera.capture`).
206
+
207
+ The Gateway treats these as **claims** and enforces server-side allowlists.
208
+
209
+ ## Presence
210
+
211
+ - `system-presence` returns entries keyed by device identity.
212
+ - Presence entries include `deviceId`, `roles`, and `scopes` so UIs can show a single row per device
213
+ even when it connects as both **operator** and **node**.
214
+
215
+ ## Common RPC method families
216
+
217
+ This page is not a generated full dump, but the public WS surface is broader
218
+ than the handshake/auth examples above. These are the main method families the
219
+ Gateway exposes today.
220
+
221
+ `hello-ok.features.methods` is a conservative discovery list built from
222
+ `src/gateway/server-methods-list.ts` plus loaded plugin/channel method exports.
223
+ Treat it as feature discovery, not as a generated dump of every callable helper
224
+ implemented in `src/gateway/server-methods/*.ts`.
225
+
226
+ ### System and identity
227
+
228
+ - `health` returns the cached or freshly probed gateway health snapshot.
229
+ - `status` returns the `/status`-style gateway summary; sensitive fields are
230
+ included only for admin-scoped operator clients.
231
+ - `gateway.identity.get` returns the gateway device identity used by relay and
232
+ pairing flows.
233
+ - `system-presence` returns the current presence snapshot for connected
234
+ operator/node devices.
235
+ - `system-event` appends a system event and can update/broadcast presence
236
+ context.
237
+ - `last-heartbeat` returns the latest persisted heartbeat event.
238
+ - `set-heartbeats` toggles heartbeat processing on the gateway.
239
+
240
+ ### Models and usage
241
+
242
+ - `models.list` returns the runtime-allowed model catalog.
243
+ - `usage.status` returns provider usage windows/remaining quota summaries.
244
+ - `usage.cost` returns aggregated cost usage summaries for a date range.
245
+ - `doctor.memory.status` returns vector-memory / embedding readiness for the
246
+ active default agent workspace.
247
+ - `sessions.usage` returns per-session usage summaries.
248
+ - `sessions.usage.timeseries` returns timeseries usage for one session.
249
+ - `sessions.usage.logs` returns usage log entries for one session.
250
+
251
+ ### Channels and login helpers
252
+
253
+ - `channels.status` returns built-in + bundled channel/plugin status summaries.
254
+ - `channels.logout` logs out a specific channel/account where the channel
255
+ supports logout.
256
+ - `web.login.start` starts a QR/web login flow for the current QR-capable web
257
+ channel provider.
258
+ - `web.login.wait` waits for that QR/web login flow to complete and starts the
259
+ channel on success.
260
+ - `push.test` sends a test APNs push to a registered iOS node.
261
+ - `voicewake.get` returns the stored wake-word triggers.
262
+ - `voicewake.set` updates wake-word triggers and broadcasts the change.
263
+
264
+ ### Messaging and logs
265
+
266
+ - `send` is the direct outbound-delivery RPC for channel/account/thread-targeted
267
+ sends outside the chat runner.
268
+ - `logs.tail` returns the configured gateway file-log tail with cursor/limit and
269
+ max-byte controls.
270
+
271
+ ### Talk and TTS
272
+
273
+ - `talk.config` returns the effective Talk config payload; `includeSecrets`
274
+ requires `operator.talk.secrets` (or `operator.admin`).
275
+ - `talk.mode` sets/broadcasts the current Talk mode state for WebChat/Control UI
276
+ clients.
277
+ - `talk.speak` synthesizes speech through the active Talk speech provider.
278
+ - `tts.status` returns TTS enabled state, active provider, fallback providers,
279
+ and provider config state.
280
+ - `tts.providers` returns the visible TTS provider inventory.
281
+ - `tts.enable` and `tts.disable` toggle TTS prefs state.
282
+ - `tts.setProvider` updates the preferred TTS provider.
283
+ - `tts.convert` runs one-shot text-to-speech conversion.
284
+
285
+ ### Secrets, config, update, and wizard
286
+
287
+ - `secrets.reload` re-resolves active SecretRefs and swaps runtime secret state
288
+ only on full success.
289
+ - `secrets.resolve` resolves command-target secret assignments for a specific
290
+ command/target set.
291
+ - `config.get` returns the current config snapshot and hash.
292
+ - `config.set` writes a validated config payload.
293
+ - `config.patch` merges a partial config update.
294
+ - `config.apply` validates + replaces the full config payload.
295
+ - `config.schema` returns the live config schema payload used by Control UI and
296
+ CLI tooling: schema, `uiHints`, version, and generation metadata, including
297
+ plugin + channel schema metadata when the runtime can load it. The schema
298
+ includes field `title` / `description` metadata derived from the same labels
299
+ and help text used by the UI, including nested object, wildcard, array-item,
300
+ and `anyOf` / `oneOf` / `allOf` composition branches when matching field
301
+ documentation exists.
302
+ - `config.schema.lookup` returns a path-scoped lookup payload for one config
303
+ path: normalized path, a shallow schema node, matched hint + `hintPath`, and
304
+ immediate child summaries for UI/CLI drill-down.
305
+ - Lookup schema nodes keep the user-facing docs and common validation fields:
306
+ `title`, `description`, `type`, `enum`, `const`, `format`, `pattern`,
307
+ numeric/string/array/object bounds, and boolean flags like
308
+ `additionalProperties`, `deprecated`, `readOnly`, `writeOnly`.
309
+ - Child summaries expose `key`, normalized `path`, `type`, `required`,
310
+ `hasChildren`, plus the matched `hint` / `hintPath`.
311
+ - `update.run` runs the gateway update flow and schedules a restart only when
312
+ the update itself succeeded.
313
+ - `wizard.start`, `wizard.next`, `wizard.status`, and `wizard.cancel` expose the
314
+ onboarding wizard over WS RPC.
315
+
316
+ ### Existing major families
317
+
318
+ #### Agent and workspace helpers
319
+
320
+ - `agents.list` returns configured agent entries.
321
+ - `agents.create`, `agents.update`, and `agents.delete` manage agent records and
322
+ workspace wiring.
323
+ - `agents.files.list`, `agents.files.get`, and `agents.files.set` manage the
324
+ bootstrap workspace files exposed for an agent.
325
+ - `agent.identity.get` returns the effective assistant identity for an agent or
326
+ session.
327
+ - `agent.wait` waits for a run to finish and returns the terminal snapshot when
328
+ available.
329
+
330
+ #### Session control
331
+
332
+ - `sessions.list` returns the current session index.
333
+ - `sessions.subscribe` and `sessions.unsubscribe` toggle session change event
334
+ subscriptions for the current WS client.
335
+ - `sessions.messages.subscribe` and `sessions.messages.unsubscribe` toggle
336
+ transcript/message event subscriptions for one session.
337
+ - `sessions.preview` returns bounded transcript previews for specific session
338
+ keys.
339
+ - `sessions.resolve` resolves or canonicalizes a session target.
340
+ - `sessions.create` creates a new session entry.
341
+ - `sessions.send` sends a message into an existing session.
342
+ - `sessions.steer` is the interrupt-and-steer variant for an active session.
343
+ - `sessions.abort` aborts active work for a session.
344
+ - `sessions.patch` updates session metadata/overrides.
345
+ - `sessions.reset`, `sessions.delete`, and `sessions.compact` perform session
346
+ maintenance.
347
+ - `sessions.get` returns the full stored session row.
348
+ - chat execution still uses `chat.history`, `chat.send`, `chat.abort`, and
349
+ `chat.inject`.
350
+ - `chat.history` is display-normalized for UI clients: inline directive tags are
351
+ stripped from visible text, plain-text tool-call XML payloads (including
352
+ `<tool_call>...</tool_call>`, `<function_call>...</function_call>`,
353
+ `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>`, and
354
+ truncated tool-call blocks) and leaked ASCII/full-width model control tokens
355
+ are stripped, pure silent-token assistant rows such as exact `NO_REPLY` /
356
+ `no_reply` are omitted, and oversized rows can be replaced with placeholders.
357
+
358
+ #### Device pairing and device tokens
359
+
360
+ - `device.pair.list` returns pending and approved paired devices.
361
+ - `device.pair.approve`, `device.pair.reject`, and `device.pair.remove` manage
362
+ device-pairing records.
363
+ - `device.token.rotate` rotates a paired device token within its approved role
364
+ and scope bounds.
365
+ - `device.token.revoke` revokes a paired device token.
366
+
367
+ #### Node pairing, invoke, and pending work
368
+
369
+ - `node.pair.request`, `node.pair.list`, `node.pair.approve`,
370
+ `node.pair.reject`, and `node.pair.verify` cover node pairing and bootstrap
371
+ verification.
372
+ - `node.list` and `node.describe` return known/connected node state.
373
+ - `node.rename` updates a paired node label.
374
+ - `node.invoke` forwards a command to a connected node.
375
+ - `node.invoke.result` returns the result for an invoke request.
376
+ - `node.event` carries node-originated events back into the gateway.
377
+ - `node.canvas.capability.refresh` refreshes scoped canvas-capability tokens.
378
+ - `node.pending.pull` and `node.pending.ack` are the connected-node queue APIs.
379
+ - `node.pending.enqueue` and `node.pending.drain` manage durable pending work
380
+ for offline/disconnected nodes.
381
+
382
+ #### Approval families
383
+
384
+ - `exec.approval.request` and `exec.approval.resolve` cover one-shot exec
385
+ approval requests.
386
+ - `exec.approval.waitDecision` waits on one pending exec approval and returns
387
+ the final decision (or `null` on timeout).
388
+ - `exec.approvals.get` and `exec.approvals.set` manage gateway exec approval
389
+ policy snapshots.
390
+ - `exec.approvals.node.get` and `exec.approvals.node.set` manage node-local exec
391
+ approval policy via node relay commands.
392
+ - `plugin.approval.request`, `plugin.approval.waitDecision`, and
393
+ `plugin.approval.resolve` cover plugin-defined approval flows.
394
+
395
+ #### Other major families
396
+
397
+ - automation:
398
+ - `wake` schedules an immediate or next-heartbeat wake text injection
399
+ - `cron.list`, `cron.status`, `cron.add`, `cron.update`, `cron.remove`,
400
+ `cron.run`, `cron.runs`
401
+ - skills/tools: `skills.*`, `tools.catalog`, `tools.effective`
402
+
403
+ ### Common event families
404
+
405
+ - `chat`: UI chat updates such as `chat.inject` and other transcript-only chat
406
+ events.
407
+ - `session.message` and `session.tool`: transcript/event-stream updates for a
408
+ subscribed session.
409
+ - `sessions.changed`: session index or metadata changed.
410
+ - `presence`: system presence snapshot updates.
411
+ - `tick`: periodic keepalive / liveness event.
412
+ - `health`: gateway health snapshot update.
413
+ - `heartbeat`: heartbeat event stream update.
414
+ - `cron`: cron run/job change event.
415
+ - `shutdown`: gateway shutdown notification.
416
+ - `node.pair.requested` / `node.pair.resolved`: node pairing lifecycle.
417
+ - `node.invoke.request`: node invoke request broadcast.
418
+ - `device.pair.requested` / `device.pair.resolved`: paired-device lifecycle.
419
+ - `voicewake.changed`: wake-word trigger config changed.
420
+ - `exec.approval.requested` / `exec.approval.resolved`: exec approval
421
+ lifecycle.
422
+ - `plugin.approval.requested` / `plugin.approval.resolved`: plugin approval
423
+ lifecycle.
424
+
425
+ ### Node helper methods
426
+
427
+ - Nodes may call `skills.bins` to fetch the current list of skill executables
428
+ for auto-allow checks.
429
+
430
+ ### Operator helper methods
431
+
432
+ - Operators may call `tools.catalog` (`operator.read`) to fetch the runtime tool catalog for an
433
+ agent. The response includes grouped tools and provenance metadata:
434
+ - `source`: `core` or `plugin`
435
+ - `pluginId`: plugin owner when `source="plugin"`
436
+ - `optional`: whether a plugin tool is optional
437
+ - Operators may call `tools.effective` (`operator.read`) to fetch the runtime-effective tool
438
+ inventory for a session.
439
+ - `sessionKey` is required.
440
+ - The gateway derives trusted runtime context from the session server-side instead of accepting
441
+ caller-supplied auth or delivery context.
442
+ - The response is session-scoped and reflects what the active conversation can use right now,
443
+ including core, plugin, and channel tools.
444
+ - Operators may call `skills.status` (`operator.read`) to fetch the visible
445
+ skill inventory for an agent.
446
+ - `agentId` is optional; omit it to read the default agent workspace.
447
+ - The response includes eligibility, missing requirements, config checks, and
448
+ sanitized install options without exposing raw secret values.
449
+ - Operators may call `skills.search` and `skills.detail` (`operator.read`) for
450
+ Durar Gateway discovery metadata.
451
+ - Operators may call `skills.install` (`operator.admin`) in two modes:
452
+ - Durar Gateway mode: `{ source: "Durar Gateway", slug, version?, force? }` installs a
453
+ skill folder into the default agent workspace `skills/` directory.
454
+ - Gateway installer mode: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }`
455
+ runs a declared `metadata.Durar.install` action on the gateway host.
456
+ - Operators may call `skills.update` (`operator.admin`) in two modes:
457
+ - Durar Gateway mode updates one tracked slug or all tracked Durar Gateway installs in
458
+ the default agent workspace.
459
+ - Config mode patches `skills.entries.<skillKey>` values such as `enabled`,
460
+ `apiKey`, and `env`.
461
+
462
+ ## Exec approvals
463
+
464
+ - When an exec request needs approval, the gateway broadcasts `exec.approval.requested`.
465
+ - Operator clients resolve by calling `exec.approval.resolve` (requires `operator.approvals` scope).
466
+ - For `host=node`, `exec.approval.request` must include `systemRunPlan` (canonical `argv`/`cwd`/`rawCommand`/session metadata). Requests missing `systemRunPlan` are rejected.
467
+ - After approval, forwarded `node.invoke system.run` calls reuse that canonical
468
+ `systemRunPlan` as the authoritative command/cwd/session context.
469
+ - If a caller mutates `command`, `rawCommand`, `cwd`, `agentId`, or
470
+ `sessionKey` between prepare and the final approved `system.run` forward, the
471
+ gateway rejects the run instead of trusting the mutated payload.
472
+
473
+ ## Agent delivery fallback
474
+
475
+ - `agent` requests can include `deliver=true` to request outbound delivery.
476
+ - `bestEffortDeliver=false` keeps strict behavior: unresolved or internal-only delivery targets return `INVALID_REQUEST`.
477
+ - `bestEffortDeliver=true` allows fallback to session-only execution when no external deliverable route can be resolved (for example internal/webchat sessions or ambiguous multi-channel configs).
478
+
479
+ ## Versioning
480
+
481
+ - `PROTOCOL_VERSION` lives in `src/gateway/protocol/schema.ts`.
482
+ - Clients send `minProtocol` + `maxProtocol`; the server rejects mismatches.
483
+ - Schemas + models are generated from TypeBox definitions:
484
+ - `pnpm protocol:gen`
485
+ - `pnpm protocol:gen:swift`
486
+ - `pnpm protocol:check`
487
+
488
+ ## Auth
489
+
490
+ - Shared-secret gateway auth uses `connect.params.auth.token` or
491
+ `connect.params.auth.password`, depending on the configured auth mode.
492
+ - Identity-bearing modes such as Tailscale Serve
493
+ (`gateway.auth.allowTailscale: true`) or non-loopback
494
+ `gateway.auth.mode: "trusted-proxy"` satisfy the connect auth check from
495
+ request headers instead of `connect.params.auth.*`.
496
+ - Private-ingress `gateway.auth.mode: "none"` skips shared-secret connect auth
497
+ entirely; do not expose that mode on public/untrusted ingress.
498
+ - After pairing, the Gateway issues a **device token** scoped to the connection
499
+ role + scopes. It is returned in `hello-ok.auth.deviceToken` and should be
500
+ persisted by the client for future connects.
501
+ - Clients should persist the primary `hello-ok.auth.deviceToken` after any
502
+ successful connect.
503
+ - Reconnecting with that **stored** device token should also reuse the stored
504
+ approved scope set for that token. This preserves read/probe/status access
505
+ that was already granted and avoids silently collapsing reconnects to a
506
+ narrower implicit admin-only scope.
507
+ - Normal connect auth precedence is explicit shared token/password first, then
508
+ explicit `deviceToken`, then stored per-device token, then bootstrap token.
509
+ - Additional `hello-ok.auth.deviceTokens` entries are bootstrap handoff tokens.
510
+ Persist them only when the connect used bootstrap auth on a trusted transport
511
+ such as `wss://` or loopback/local pairing.
512
+ - If a client supplies an **explicit** `deviceToken` or explicit `scopes`, that
513
+ caller-requested scope set remains authoritative; cached scopes are only
514
+ reused when the client is reusing the stored per-device token.
515
+ - Device tokens can be rotated/revoked via `device.token.rotate` and
516
+ `device.token.revoke` (requires `operator.pairing` scope).
517
+ - Token issuance/rotation stays bounded to the approved role set recorded in
518
+ that device's pairing entry; rotating a token cannot expand the device into a
519
+ role that pairing approval never granted.
520
+ - For paired-device token sessions, device management is self-scoped unless the
521
+ caller also has `operator.admin`: non-admin callers can remove/revoke/rotate
522
+ only their **own** device entry.
523
+ - `device.token.rotate` also checks the requested operator scope set against the
524
+ caller's current session scopes. Non-admin callers cannot rotate a token into
525
+ a broader operator scope set than they already hold.
526
+ - Auth failures include `error.details.code` plus recovery hints:
527
+ - `error.details.canRetryWithDeviceToken` (boolean)
528
+ - `error.details.recommendedNextStep` (`retry_with_device_token`, `update_auth_configuration`, `update_auth_credentials`, `wait_then_retry`, `review_auth_configuration`)
529
+ - Client behavior for `AUTH_TOKEN_MISMATCH`:
530
+ - Trusted clients may attempt one bounded retry with a cached per-device token.
531
+ - If that retry fails, clients should stop automatic reconnect loops and surface operator action guidance.
532
+
533
+ ## Device identity + pairing
534
+
535
+ - Nodes should include a stable device identity (`device.id`) derived from a
536
+ keypair fingerprint.
537
+ - Gateways issue tokens per device + role.
538
+ - Pairing approvals are required for new device IDs unless local auto-approval
539
+ is enabled.
540
+ - Pairing auto-approval is centered on direct local loopback connects.
541
+ - Durar also has a narrow backend/container-local self-connect path for
542
+ trusted shared-secret helper flows.
543
+ - Same-host tailnet or LAN connects are still treated as remote for pairing and
544
+ require approval.
545
+ - All WS clients must include `device` identity during `connect` (operator + node).
546
+ Control UI can omit it only in these modes:
547
+ - `gateway.controlUi.allowInsecureAuth=true` for localhost-only insecure HTTP compatibility.
548
+ - successful `gateway.auth.mode: "trusted-proxy"` operator Control UI auth.
549
+ - `gateway.controlUi.dangerouslyDisableDeviceAuth=true` (break-glass, severe security downgrade).
550
+ - All connections must sign the server-provided `connect.challenge` nonce.
551
+
552
+ ### Device auth migration diagnostics
553
+
554
+ For legacy clients that still use pre-challenge signing behavior, `connect` now returns
555
+ `DEVICE_AUTH_*` detail codes under `error.details.code` with a stable `error.details.reason`.
556
+
557
+ Common migration failures:
558
+
559
+ | Message | details.code | details.reason | Meaning |
560
+ | --------------------------- | -------------------------------- | ------------------------ | -------------------------------------------------- |
561
+ | `device nonce required` | `DEVICE_AUTH_NONCE_REQUIRED` | `device-nonce-missing` | Client omitted `device.nonce` (or sent blank). |
562
+ | `device nonce mismatch` | `DEVICE_AUTH_NONCE_MISMATCH` | `device-nonce-mismatch` | Client signed with a stale/wrong nonce. |
563
+ | `device signature invalid` | `DEVICE_AUTH_SIGNATURE_INVALID` | `device-signature` | Signature payload does not match v2 payload. |
564
+ | `device signature expired` | `DEVICE_AUTH_SIGNATURE_EXPIRED` | `device-signature-stale` | Signed timestamp is outside allowed skew. |
565
+ | `device identity mismatch` | `DEVICE_AUTH_DEVICE_ID_MISMATCH` | `device-id-mismatch` | `device.id` does not match public key fingerprint. |
566
+ | `device public key invalid` | `DEVICE_AUTH_PUBLIC_KEY_INVALID` | `device-public-key` | Public key format/canonicalization failed. |
567
+
568
+ Migration target:
569
+
570
+ - Always wait for `connect.challenge`.
571
+ - Sign the v2 payload that includes the server nonce.
572
+ - Send the same nonce in `connect.params.device.nonce`.
573
+ - Preferred signature payload is `v3`, which binds `platform` and `deviceFamily`
574
+ in addition to device/client/role/scopes/token/nonce fields.
575
+ - Legacy `v2` signatures remain accepted for compatibility, but paired-device
576
+ metadata pinning still controls command policy on reconnect.
577
+
578
+ ## TLS + pinning
579
+
580
+ - TLS is supported for WS connections.
581
+ - Clients may optionally pin the gateway cert fingerprint (see `gateway.tls`
582
+ config plus `gateway.remote.tlsFingerprint` or CLI `--tls-fingerprint`).
583
+
584
+ ## Scope
585
+
586
+ This protocol exposes the **full gateway API** (status, channels, models, chat,
587
+ agent, sessions, nodes, approvals, etc.). The exact surface is defined by the
588
+ TypeBox schemas in `src/gateway/protocol/schema.ts`.