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,408 @@
1
+ ---
2
+ summary: "Nodes: pairing, capabilities, permissions, and CLI helpers for canvas/camera/screen/device/notifications/system"
3
+ read_when:
4
+ - Pairing iOS/Android nodes to a gateway
5
+ - Using node canvas/camera for agent context
6
+ - Adding new node commands or CLI helpers
7
+ title: "Nodes"
8
+ ---
9
+
10
+ # Nodes
11
+
12
+ A **node** is a companion device (macOS/iOS/Android/headless) that connects to the Gateway **WebSocket** (same port as operators) with `role: "node"` and exposes a command surface (e.g. `canvas.*`, `camera.*`, `device.*`, `notifications.*`, `system.*`) via `node.invoke`. Protocol details: [Gateway protocol](/gateway/protocol).
13
+
14
+ Legacy transport: [Bridge protocol](/gateway/bridge-protocol) (TCP JSONL;
15
+ historical only for current nodes).
16
+
17
+ macOS can also run in **node mode**: the menubar app connects to the Gateway’s WS server and exposes its local canvas/camera commands as a node (so `Durar nodes …` works against this Mac).
18
+
19
+ Notes:
20
+
21
+ - Nodes are **peripherals**, not gateways. They don’t run the gateway service.
22
+ - Telegram/WhatsApp/etc. messages land on the **gateway**, not on nodes.
23
+ - Troubleshooting runbook: [/nodes/troubleshooting](/nodes/troubleshooting)
24
+
25
+ ## Pairing + status
26
+
27
+ **WS nodes use device pairing.** Nodes present a device identity during `connect`; the Gateway
28
+ creates a device pairing request for `role: node`. Approve via the devices CLI (or UI).
29
+
30
+ Quick CLI:
31
+
32
+ ```bash
33
+ Durar devices list
34
+ Durar devices approve <requestId>
35
+ Durar devices reject <requestId>
36
+ Durar nodes status
37
+ Durar nodes describe --node <idOrNameOrIp>
38
+ ```
39
+
40
+ If a node retries with changed auth details (role/scopes/public key), the prior
41
+ pending request is superseded and a new `requestId` is created. Re-run
42
+ `Durar devices list` before approving.
43
+
44
+ Notes:
45
+
46
+ - `nodes status` marks a node as **paired** when its device pairing role includes `node`.
47
+ - The device pairing record is the durable approved-role contract. Token
48
+ rotation stays inside that contract; it cannot upgrade a paired node into a
49
+ different role that pairing approval never granted.
50
+ - `node.pair.*` (CLI: `Durar nodes pending/approve/reject/rename`) is a separate gateway-owned
51
+ node pairing store; it does **not** gate the WS `connect` handshake.
52
+ - Approval scope follows the pending request's declared commands:
53
+ - commandless request: `operator.pairing`
54
+ - non-exec node commands: `operator.pairing` + `operator.write`
55
+ - `system.run` / `system.run.prepare` / `system.which`: `operator.pairing` + `operator.admin`
56
+
57
+ ## Remote node host (system.run)
58
+
59
+ Use a **node host** when your Gateway runs on one machine and you want commands
60
+ to execute on another. The model still talks to the **gateway**; the gateway
61
+ forwards `exec` calls to the **node host** when `host=node` is selected.
62
+
63
+ ### What runs where
64
+
65
+ - **Gateway host**: receives messages, runs the model, routes tool calls.
66
+ - **Node host**: executes `system.run`/`system.which` on the node machine.
67
+ - **Approvals**: enforced on the node host via `~/.Durar/exec-approvals.json`.
68
+
69
+ Approval note:
70
+
71
+ - Approval-backed node runs bind exact request context.
72
+ - For direct shell/runtime file executions, Durar also best-effort binds one concrete local
73
+ file operand and denies the run if that file changes before execution.
74
+ - If Durar cannot identify exactly one concrete local file for an interpreter/runtime command,
75
+ approval-backed execution is denied instead of pretending full runtime coverage. Use sandboxing,
76
+ separate hosts, or an explicit trusted allowlist/full workflow for broader interpreter semantics.
77
+
78
+ ### Start a node host (foreground)
79
+
80
+ On the node machine:
81
+
82
+ ```bash
83
+ Durar node run --host <gateway-host> --port 18789 --display-name "Build Node"
84
+ ```
85
+
86
+ ### Remote gateway via SSH tunnel (loopback bind)
87
+
88
+ If the Gateway binds to loopback (`gateway.bind=loopback`, default in local mode),
89
+ remote node hosts cannot connect directly. Create an SSH tunnel and point the
90
+ node host at the local end of the tunnel.
91
+
92
+ Example (node host -> gateway host):
93
+
94
+ ```bash
95
+ # Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789
96
+ ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
97
+
98
+ # Terminal B: export the gateway token and connect through the tunnel
99
+ export Durar_GATEWAY_TOKEN="<gateway-token>"
100
+ Durar node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
101
+ ```
102
+
103
+ Notes:
104
+
105
+ - `Durar node run` supports token or password auth.
106
+ - Env vars are preferred: `Durar_GATEWAY_TOKEN` / `Durar_GATEWAY_PASSWORD`.
107
+ - Config fallback is `gateway.auth.token` / `gateway.auth.password`.
108
+ - In local mode, node host intentionally ignores `gateway.remote.token` / `gateway.remote.password`.
109
+ - In remote mode, `gateway.remote.token` / `gateway.remote.password` are eligible per remote precedence rules.
110
+ - If active local `gateway.auth.*` SecretRefs are configured but unresolved, node-host auth fails closed.
111
+ - Node-host auth resolution only honors `Durar_GATEWAY_*` env vars.
112
+
113
+ ### Start a node host (service)
114
+
115
+ ```bash
116
+ Durar node install --host <gateway-host> --port 18789 --display-name "Build Node"
117
+ Durar node restart
118
+ ```
119
+
120
+ ### Pair + name
121
+
122
+ On the gateway host:
123
+
124
+ ```bash
125
+ Durar devices list
126
+ Durar devices approve <requestId>
127
+ Durar nodes status
128
+ ```
129
+
130
+ If the node retries with changed auth details, re-run `Durar devices list`
131
+ and approve the current `requestId`.
132
+
133
+ Naming options:
134
+
135
+ - `--display-name` on `Durar node run` / `Durar node install` (persists in `~/.Durar/node.json` on the node).
136
+ - `Durar nodes rename --node <id|name|ip> --name "Build Node"` (gateway override).
137
+
138
+ ### Allowlist the commands
139
+
140
+ Exec approvals are **per node host**. Add allowlist entries from the gateway:
141
+
142
+ ```bash
143
+ Durar approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
144
+ Durar approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
145
+ ```
146
+
147
+ Approvals live on the node host at `~/.Durar/exec-approvals.json`.
148
+
149
+ ### Point exec at the node
150
+
151
+ Configure defaults (gateway config):
152
+
153
+ ```bash
154
+ Durar config set tools.exec.host node
155
+ Durar config set tools.exec.security allowlist
156
+ Durar config set tools.exec.node "<id-or-name>"
157
+ ```
158
+
159
+ Or per session:
160
+
161
+ ```
162
+ /exec host=node security=allowlist node=<id-or-name>
163
+ ```
164
+
165
+ Once set, any `exec` call with `host=node` runs on the node host (subject to the
166
+ node allowlist/approvals).
167
+
168
+ `host=auto` will not implicitly choose the node on its own, but an explicit per-call `host=node` request is allowed from `auto`. If you want node exec to be the default for the session, set `tools.exec.host=node` or `/exec host=node ...` explicitly.
169
+
170
+ Related:
171
+
172
+ - [Node host CLI](/cli/node)
173
+ - [Exec tool](/tools/exec)
174
+ - [Exec approvals](/tools/exec-approvals)
175
+
176
+ ## Invoking commands
177
+
178
+ Low-level (raw RPC):
179
+
180
+ ```bash
181
+ Durar nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
182
+ ```
183
+
184
+ Higher-level helpers exist for the common “give the agent a MEDIA attachment” workflows.
185
+
186
+ ## Screenshots (canvas snapshots)
187
+
188
+ If the node is showing the Canvas (WebView), `canvas.snapshot` returns `{ format, base64 }`.
189
+
190
+ CLI helper (writes to a temp file and prints `MEDIA:<path>`):
191
+
192
+ ```bash
193
+ Durar nodes canvas snapshot --node <idOrNameOrIp> --format png
194
+ Durar nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
195
+ ```
196
+
197
+ ### Canvas controls
198
+
199
+ ```bash
200
+ Durar nodes canvas present --node <idOrNameOrIp> --target https://example.com
201
+ Durar nodes canvas hide --node <idOrNameOrIp>
202
+ Durar nodes canvas navigate https://example.com --node <idOrNameOrIp>
203
+ Durar nodes canvas eval --node <idOrNameOrIp> --js "document.title"
204
+ ```
205
+
206
+ Notes:
207
+
208
+ - `canvas present` accepts URLs or local file paths (`--target`), plus optional `--x/--y/--width/--height` for positioning.
209
+ - `canvas eval` accepts inline JS (`--js`) or a positional arg.
210
+
211
+ ### A2UI (Canvas)
212
+
213
+ ```bash
214
+ Durar nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
215
+ Durar nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
216
+ Durar nodes canvas a2ui reset --node <idOrNameOrIp>
217
+ ```
218
+
219
+ Notes:
220
+
221
+ - Only A2UI v0.8 JSONL is supported (v0.9/createSurface is rejected).
222
+
223
+ ## Photos + videos (node camera)
224
+
225
+ Photos (`jpg`):
226
+
227
+ ```bash
228
+ Durar nodes camera list --node <idOrNameOrIp>
229
+ Durar nodes camera snap --node <idOrNameOrIp> # default: both facings (2 MEDIA lines)
230
+ Durar nodes camera snap --node <idOrNameOrIp> --facing front
231
+ ```
232
+
233
+ Video clips (`mp4`):
234
+
235
+ ```bash
236
+ Durar nodes camera clip --node <idOrNameOrIp> --duration 10s
237
+ Durar nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
238
+ ```
239
+
240
+ Notes:
241
+
242
+ - The node must be **foregrounded** for `canvas.*` and `camera.*` (background calls return `NODE_BACKGROUND_UNAVAILABLE`).
243
+ - Clip duration is clamped (currently `<= 60s`) to avoid oversized base64 payloads.
244
+ - Android will prompt for `CAMERA`/`RECORD_AUDIO` permissions when possible; denied permissions fail with `*_PERMISSION_REQUIRED`.
245
+
246
+ ## Screen recordings (nodes)
247
+
248
+ Supported nodes expose `screen.record` (mp4). Example:
249
+
250
+ ```bash
251
+ Durar nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
252
+ Durar nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
253
+ ```
254
+
255
+ Notes:
256
+
257
+ - `screen.record` availability depends on node platform.
258
+ - Screen recordings are clamped to `<= 60s`.
259
+ - `--no-audio` disables microphone capture on supported platforms.
260
+ - Use `--screen <index>` to select a display when multiple screens are available.
261
+
262
+ ## Location (nodes)
263
+
264
+ Nodes expose `location.get` when Location is enabled in settings.
265
+
266
+ CLI helper:
267
+
268
+ ```bash
269
+ Durar nodes location get --node <idOrNameOrIp>
270
+ Durar nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
271
+ ```
272
+
273
+ Notes:
274
+
275
+ - Location is **off by default**.
276
+ - “Always” requires system permission; background fetch is best-effort.
277
+ - The response includes lat/lon, accuracy (meters), and timestamp.
278
+
279
+ ## SMS (Android nodes)
280
+
281
+ Android nodes can expose `sms.send` when the user grants **SMS** permission and the device supports telephony.
282
+
283
+ Low-level invoke:
284
+
285
+ ```bash
286
+ Durar nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from Durar"}'
287
+ ```
288
+
289
+ Notes:
290
+
291
+ - The permission prompt must be accepted on the Android device before the capability is advertised.
292
+ - Wi-Fi-only devices without telephony will not advertise `sms.send`.
293
+
294
+ ## Android device + personal data commands
295
+
296
+ Android nodes can advertise additional command families when the corresponding capabilities are enabled.
297
+
298
+ Available families:
299
+
300
+ - `device.status`, `device.info`, `device.permissions`, `device.health`
301
+ - `notifications.list`, `notifications.actions`
302
+ - `photos.latest`
303
+ - `contacts.search`, `contacts.add`
304
+ - `calendar.events`, `calendar.add`
305
+ - `callLog.search`
306
+ - `sms.search`
307
+ - `motion.activity`, `motion.pedometer`
308
+
309
+ Example invokes:
310
+
311
+ ```bash
312
+ Durar nodes invoke --node <idOrNameOrIp> --command device.status --params '{}'
313
+ Durar nodes invoke --node <idOrNameOrIp> --command notifications.list --params '{}'
314
+ Durar nodes invoke --node <idOrNameOrIp> --command photos.latest --params '{"limit":1}'
315
+ ```
316
+
317
+ Notes:
318
+
319
+ - Motion commands are capability-gated by available sensors.
320
+
321
+ ## System commands (node host / mac node)
322
+
323
+ The macOS node exposes `system.run`, `system.notify`, and `system.execApprovals.get/set`.
324
+ The headless node host exposes `system.run`, `system.which`, and `system.execApprovals.get/set`.
325
+
326
+ Examples:
327
+
328
+ ```bash
329
+ Durar nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
330
+ Durar nodes invoke --node <idOrNameOrIp> --command system.which --params '{"name":"git"}'
331
+ ```
332
+
333
+ Notes:
334
+
335
+ - `system.run` returns stdout/stderr/exit code in the payload.
336
+ - Shell execution now goes through the `exec` tool with `host=node`; `nodes` remains the direct-RPC surface for explicit node commands.
337
+ - `nodes invoke` does not expose `system.run` or `system.run.prepare`; those stay on the exec path only.
338
+ - The exec path prepares a canonical `systemRunPlan` before approval. Once an
339
+ approval is granted, the gateway forwards that stored plan, not any later
340
+ caller-edited command/cwd/session fields.
341
+ - `system.notify` respects notification permission state on the macOS app.
342
+ - Unrecognized node `platform` / `deviceFamily` metadata uses a conservative default allowlist that excludes `system.run` and `system.which`. If you intentionally need those commands for an unknown platform, add them explicitly via `gateway.nodes.allowCommands`.
343
+ - `system.run` supports `--cwd`, `--env KEY=VAL`, `--command-timeout`, and `--needs-screen-recording`.
344
+ - For shell wrappers (`bash|sh|zsh ... -c/-lc`), request-scoped `--env` values are reduced to an explicit allowlist (`TERM`, `LANG`, `LC_*`, `COLORTERM`, `NO_COLOR`, `FORCE_COLOR`).
345
+ - For allow-always decisions in allowlist mode, known dispatch wrappers (`env`, `nice`, `nohup`, `stdbuf`, `timeout`) persist inner executable paths instead of wrapper paths. If unwrapping is not safe, no allowlist entry is persisted automatically.
346
+ - On Windows node hosts in allowlist mode, shell-wrapper runs via `cmd.exe /c` require approval (allowlist entry alone does not auto-allow the wrapper form).
347
+ - `system.notify` supports `--priority <passive|active|timeSensitive>` and `--delivery <system|overlay|auto>`.
348
+ - Node hosts ignore `PATH` overrides and strip dangerous startup/shell keys (`DYLD_*`, `LD_*`, `NODE_OPTIONS`, `PYTHON*`, `PERL*`, `RUBYOPT`, `SHELLOPTS`, `PS4`). If you need extra PATH entries, configure the node host service environment (or install tools in standard locations) instead of passing `PATH` via `--env`.
349
+ - On macOS node mode, `system.run` is gated by exec approvals in the macOS app (Settings → Exec approvals).
350
+ Ask/allowlist/full behave the same as the headless node host; denied prompts return `SYSTEM_RUN_DENIED`.
351
+ - On headless node host, `system.run` is gated by exec approvals (`~/.Durar/exec-approvals.json`).
352
+
353
+ ## Exec node binding
354
+
355
+ When multiple nodes are available, you can bind exec to a specific node.
356
+ This sets the default node for `exec host=node` (and can be overridden per agent).
357
+
358
+ Global default:
359
+
360
+ ```bash
361
+ Durar config set tools.exec.node "node-id-or-name"
362
+ ```
363
+
364
+ Per-agent override:
365
+
366
+ ```bash
367
+ Durar config get agents.list
368
+ Durar config set agents.list[0].tools.exec.node "node-id-or-name"
369
+ ```
370
+
371
+ Unset to allow any node:
372
+
373
+ ```bash
374
+ Durar config unset tools.exec.node
375
+ Durar config unset agents.list[0].tools.exec.node
376
+ ```
377
+
378
+ ## Permissions map
379
+
380
+ Nodes may include a `permissions` map in `node.list` / `node.describe`, keyed by permission name (e.g. `screenRecording`, `accessibility`) with boolean values (`true` = granted).
381
+
382
+ ## Headless node host (cross-platform)
383
+
384
+ Durar can run a **headless node host** (no UI) that connects to the Gateway
385
+ WebSocket and exposes `system.run` / `system.which`. This is useful on Linux/Windows
386
+ or for running a minimal node alongside a server.
387
+
388
+ Start it:
389
+
390
+ ```bash
391
+ Durar node run --host <gateway-host> --port 18789
392
+ ```
393
+
394
+ Notes:
395
+
396
+ - Pairing is still required (the Gateway will show a device pairing prompt).
397
+ - The node host stores its node id, token, display name, and gateway connection info in `~/.Durar/node.json`.
398
+ - Exec approvals are enforced locally via `~/.Durar/exec-approvals.json`
399
+ (see [Exec approvals](/tools/exec-approvals)).
400
+ - On macOS, the headless node host executes `system.run` locally by default. Set
401
+ `Durar_NODE_EXEC_HOST=app` to route `system.run` through the companion app exec host; add
402
+ `Durar_NODE_EXEC_FALLBACK=0` to require the app host and fail closed if it is unavailable.
403
+ - Add `--tls` / `--tls-fingerprint` when the Gateway WS uses TLS.
404
+
405
+ ## Mac node mode
406
+
407
+ - The macOS menubar app connects to the Gateway WS server as a node (so `Durar nodes …` works against this Mac).
408
+ - In remote mode, the app opens an SSH tunnel for the Gateway port and connects to `localhost`.
@@ -0,0 +1,98 @@
1
+ ---
2
+ summary: "Location command for nodes (location.get), permission modes, and Android foreground behavior"
3
+ read_when:
4
+ - Adding location node support or permissions UI
5
+ - Designing Android location permissions or foreground behavior
6
+ title: "Location Command"
7
+ ---
8
+
9
+ # Location command (nodes)
10
+
11
+ ## TL;DR
12
+
13
+ - `location.get` is a node command (via `node.invoke`).
14
+ - Off by default.
15
+ - Android app settings use a selector: Off / While Using.
16
+ - Separate toggle: Precise Location.
17
+
18
+ ## Why a selector (not just a switch)
19
+
20
+ OS permissions are multi-level. We can expose a selector in-app, but the OS still decides the actual grant.
21
+
22
+ - iOS/macOS may expose **While Using** or **Always** in system prompts/Settings.
23
+ - Android app currently supports foreground location only.
24
+ - Precise location is a separate grant (iOS 14+ “Precise”, Android “fine” vs “coarse”).
25
+
26
+ Selector in UI drives our requested mode; actual grant lives in OS settings.
27
+
28
+ ## Settings model
29
+
30
+ Per node device:
31
+
32
+ - `location.enabledMode`: `off | whileUsing`
33
+ - `location.preciseEnabled`: bool
34
+
35
+ UI behavior:
36
+
37
+ - Selecting `whileUsing` requests foreground permission.
38
+ - If OS denies requested level, revert to the highest granted level and show status.
39
+
40
+ ## Permissions mapping (node.permissions)
41
+
42
+ Optional. macOS node reports `location` via the permissions map; iOS/Android may omit it.
43
+
44
+ ## Command: `location.get`
45
+
46
+ Called via `node.invoke`.
47
+
48
+ Params (suggested):
49
+
50
+ ```json
51
+ {
52
+ "timeoutMs": 10000,
53
+ "maxAgeMs": 15000,
54
+ "desiredAccuracy": "coarse|balanced|precise"
55
+ }
56
+ ```
57
+
58
+ Response payload:
59
+
60
+ ```json
61
+ {
62
+ "lat": 48.20849,
63
+ "lon": 16.37208,
64
+ "accuracyMeters": 12.5,
65
+ "altitudeMeters": 182.0,
66
+ "speedMps": 0.0,
67
+ "headingDeg": 270.0,
68
+ "timestamp": "2026-01-03T12:34:56.000Z",
69
+ "isPrecise": true,
70
+ "source": "gps|wifi|cell|unknown"
71
+ }
72
+ ```
73
+
74
+ Errors (stable codes):
75
+
76
+ - `LOCATION_DISABLED`: selector is off.
77
+ - `LOCATION_PERMISSION_REQUIRED`: permission missing for requested mode.
78
+ - `LOCATION_BACKGROUND_UNAVAILABLE`: app is backgrounded but only While Using allowed.
79
+ - `LOCATION_TIMEOUT`: no fix in time.
80
+ - `LOCATION_UNAVAILABLE`: system failure / no providers.
81
+
82
+ ## Background behavior
83
+
84
+ - Android app denies `location.get` while backgrounded.
85
+ - Keep Durar open when requesting location on Android.
86
+ - Other node platforms may differ.
87
+
88
+ ## Model/tooling integration
89
+
90
+ - Tool surface: `nodes` tool adds `location_get` action (node required).
91
+ - CLI: `Durar nodes location get --node <id>`.
92
+ - Agent guidelines: only call when user enabled location and understands the scope.
93
+
94
+ ## UX copy (suggested)
95
+
96
+ - Off: “Location sharing is disabled.”
97
+ - While Using: “Only when Durar is open.”
98
+ - Precise: “Use precise GPS location. Toggle off to share approximate location.”