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,635 @@
1
+ ---
2
+ summary: "Exec approvals, allowlists, and sandbox escape prompts"
3
+ read_when:
4
+ - Configuring exec approvals or allowlists
5
+ - Implementing exec approval UX in the macOS app
6
+ - Reviewing sandbox escape prompts and implications
7
+ title: "Exec Approvals"
8
+ ---
9
+
10
+ # Exec approvals
11
+
12
+ Exec approvals are the **companion app / node host guardrail** for letting a sandboxed agent run
13
+ commands on a real host (`gateway` or `node`). Think of it like a safety interlock:
14
+ commands are allowed only when policy + allowlist + (optional) user approval all agree.
15
+ Exec approvals are **in addition** to tool policy and elevated gating (unless elevated is set to `full`, which skips approvals).
16
+ Effective policy is the **stricter** of `tools.exec.*` and approvals defaults; if an approvals field is omitted, the `tools.exec` value is used.
17
+ Host exec also uses the local approvals state on that machine. A host-local
18
+ `ask: "always"` in `~/.Durar/exec-approvals.json` keeps prompting even if
19
+ session or config defaults request `ask: "on-miss"`.
20
+ Use `Durar approvals get`, `Durar approvals get --gateway`, or
21
+ `Durar approvals get --node <id|name|ip>` to inspect the requested policy,
22
+ host policy sources, and the effective result.
23
+
24
+ If the companion app UI is **not available**, any request that requires a prompt is
25
+ resolved by the **ask fallback** (default: deny).
26
+
27
+ Native chat approval clients can also expose channel-specific affordances on the
28
+ pending approval message. For example, Matrix can seed reaction shortcuts on the
29
+ approval prompt (`✅` allow once, `❌` deny, and `♾️` allow always when available)
30
+ while still leaving the `/approve ...` commands in the message as a fallback.
31
+
32
+ ## Where it applies
33
+
34
+ Exec approvals are enforced locally on the execution host:
35
+
36
+ - **gateway host** → `Durar` process on the gateway machine
37
+ - **node host** → node runner (macOS companion app or headless node host)
38
+
39
+ Trust model note:
40
+
41
+ - Gateway-authenticated callers are trusted operators for that Gateway.
42
+ - Paired nodes extend that trusted operator capability onto the node host.
43
+ - Exec approvals reduce accidental execution risk, but are not a per-user auth boundary.
44
+ - Approved node-host runs bind canonical execution context: canonical cwd, exact argv, env
45
+ binding when present, and pinned executable path when applicable.
46
+ - For shell scripts and direct interpreter/runtime file invocations, Durar also tries to bind
47
+ one concrete local file operand. If that bound file changes after approval but before execution,
48
+ the run is denied instead of executing drifted content.
49
+ - This file binding is intentionally best-effort, not a complete semantic model of every
50
+ interpreter/runtime loader path. If approval mode cannot identify exactly one concrete local
51
+ file to bind, it refuses to mint an approval-backed run instead of pretending full coverage.
52
+
53
+ macOS split:
54
+
55
+ - **node host service** forwards `system.run` to the **macOS app** over local IPC.
56
+ - **macOS app** enforces approvals + executes the command in UI context.
57
+
58
+ ## Settings and storage
59
+
60
+ Approvals live in a local JSON file on the execution host:
61
+
62
+ `~/.Durar/exec-approvals.json`
63
+
64
+ Example schema:
65
+
66
+ ```json
67
+ {
68
+ "version": 1,
69
+ "socket": {
70
+ "path": "~/.Durar/exec-approvals.sock",
71
+ "token": "base64url-token"
72
+ },
73
+ "defaults": {
74
+ "security": "deny",
75
+ "ask": "on-miss",
76
+ "askFallback": "deny",
77
+ "autoAllowSkills": false
78
+ },
79
+ "agents": {
80
+ "main": {
81
+ "security": "allowlist",
82
+ "ask": "on-miss",
83
+ "askFallback": "deny",
84
+ "autoAllowSkills": true,
85
+ "allowlist": [
86
+ {
87
+ "id": "B0C8C0B3-2C2D-4F8A-9A3C-5A4B3C2D1E0F",
88
+ "pattern": "~/Projects/**/bin/rg",
89
+ "lastUsedAt": 1737150000000,
90
+ "lastUsedCommand": "rg -n TODO",
91
+ "lastResolvedPath": "/Users/user/Projects/.../bin/rg"
92
+ }
93
+ ]
94
+ }
95
+ }
96
+ }
97
+ ```
98
+
99
+ ## No-approval "YOLO" mode
100
+
101
+ If you want host exec to run without approval prompts, you must open **both** policy layers:
102
+
103
+ - requested exec policy in Durar config (`tools.exec.*`)
104
+ - host-local approvals policy in `~/.Durar/exec-approvals.json`
105
+
106
+ This is now the default host behavior unless you tighten it explicitly:
107
+
108
+ - `tools.exec.security`: `full` on `gateway`/`node`
109
+ - `tools.exec.ask`: `off`
110
+ - host `askFallback`: `full`
111
+
112
+ Important distinction:
113
+
114
+ - `tools.exec.host=auto` chooses where exec runs: sandbox when available, otherwise gateway.
115
+ - YOLO chooses how host exec is approved: `security=full` plus `ask=off`.
116
+ - In YOLO mode, Durar does not add a separate heuristic command-obfuscation approval gate on top of the configured host exec policy.
117
+ - `auto` does not make gateway routing a free override from a sandboxed session. A per-call `host=node` request is allowed from `auto`, and `host=gateway` is only allowed from `auto` when no sandbox runtime is active. If you want a stable non-auto default, set `tools.exec.host` or use `/exec host=...` explicitly.
118
+
119
+ If you want a more conservative setup, tighten either layer back to `allowlist` / `on-miss`
120
+ or `deny`.
121
+
122
+ Persistent gateway-host "never prompt" setup:
123
+
124
+ ```bash
125
+ Durar config set tools.exec.host gateway
126
+ Durar config set tools.exec.security full
127
+ Durar config set tools.exec.ask off
128
+ Durar gateway restart
129
+ ```
130
+
131
+ Then set the host approvals file to match:
132
+
133
+ ```bash
134
+ Durar approvals set --stdin <<'EOF'
135
+ {
136
+ version: 1,
137
+ defaults: {
138
+ security: "full",
139
+ ask: "off",
140
+ askFallback: "full"
141
+ }
142
+ }
143
+ EOF
144
+ ```
145
+
146
+ For a node host, apply the same approvals file on that node instead:
147
+
148
+ ```bash
149
+ Durar approvals set --node <id|name|ip> --stdin <<'EOF'
150
+ {
151
+ version: 1,
152
+ defaults: {
153
+ security: "full",
154
+ ask: "off",
155
+ askFallback: "full"
156
+ }
157
+ }
158
+ EOF
159
+ ```
160
+
161
+ Session-only shortcut:
162
+
163
+ - `/exec security=full ask=off` changes only the current session.
164
+ - `/elevated full` is a break-glass shortcut that also skips exec approvals for that session.
165
+
166
+ If the host approvals file stays stricter than config, the stricter host policy still wins.
167
+
168
+ ## Policy knobs
169
+
170
+ ### Security (`exec.security`)
171
+
172
+ - **deny**: block all host exec requests.
173
+ - **allowlist**: allow only allowlisted commands.
174
+ - **full**: allow everything (equivalent to elevated).
175
+
176
+ ### Ask (`exec.ask`)
177
+
178
+ - **off**: never prompt.
179
+ - **on-miss**: prompt only when allowlist does not match.
180
+ - **always**: prompt on every command.
181
+ - `allow-always` durable trust does not suppress prompts when effective ask mode is `always`
182
+
183
+ ### Ask fallback (`askFallback`)
184
+
185
+ If a prompt is required but no UI is reachable, fallback decides:
186
+
187
+ - **deny**: block.
188
+ - **allowlist**: allow only if allowlist matches.
189
+ - **full**: allow.
190
+
191
+ ### Inline interpreter eval hardening (`tools.exec.strictInlineEval`)
192
+
193
+ When `tools.exec.strictInlineEval=true`, Durar treats inline code-eval forms as approval-only even if the interpreter binary itself is allowlisted.
194
+
195
+ Examples:
196
+
197
+ - `python -c`
198
+ - `node -e`, `node --eval`, `node -p`
199
+ - `ruby -e`
200
+ - `perl -e`, `perl -E`
201
+ - `php -r`
202
+ - `lua -e`
203
+ - `osascript -e`
204
+
205
+ This is defense-in-depth for interpreter loaders that do not map cleanly to one stable file operand. In strict mode:
206
+
207
+ - these commands still need explicit approval;
208
+ - `allow-always` does not persist new allowlist entries for them automatically.
209
+
210
+ ## Allowlist (per agent)
211
+
212
+ Allowlists are **per agent**. If multiple agents exist, switch which agent you’re
213
+ editing in the macOS app. Patterns are **case-insensitive glob matches**.
214
+ Patterns should resolve to **binary paths** (basename-only entries are ignored).
215
+ Legacy `agents.default` entries are migrated to `agents.main` on load.
216
+ Shell chains such as `echo ok && pwd` still need every top-level segment to satisfy allowlist rules.
217
+
218
+ Examples:
219
+
220
+ - `~/Projects/**/bin/peekaboo`
221
+ - `~/.local/bin/*`
222
+ - `/opt/homebrew/bin/rg`
223
+
224
+ Each allowlist entry tracks:
225
+
226
+ - **id** stable UUID used for UI identity (optional)
227
+ - **last used** timestamp
228
+ - **last used command**
229
+ - **last resolved path**
230
+
231
+ ## Auto-allow skill CLIs
232
+
233
+ When **Auto-allow skill CLIs** is enabled, executables referenced by known skills
234
+ are treated as allowlisted on nodes (macOS node or headless node host). This uses
235
+ `skills.bins` over the Gateway RPC to fetch the skill bin list. Disable this if you want strict manual allowlists.
236
+
237
+ Important trust notes:
238
+
239
+ - This is an **implicit convenience allowlist**, separate from manual path allowlist entries.
240
+ - It is intended for trusted operator environments where Gateway and node are in the same trust boundary.
241
+ - If you require strict explicit trust, keep `autoAllowSkills: false` and use manual path allowlist entries only.
242
+
243
+ ## Safe bins (stdin-only)
244
+
245
+ `tools.exec.safeBins` defines a small list of **stdin-only** binaries (for example `cut`)
246
+ that can run in allowlist mode **without** explicit allowlist entries. Safe bins reject
247
+ positional file args and path-like tokens, so they can only operate on the incoming stream.
248
+ Treat this as a narrow fast-path for stream filters, not a general trust list.
249
+ Do **not** add interpreter or runtime binaries (for example `python3`, `node`, `ruby`, `bash`, `sh`, `zsh`) to `safeBins`.
250
+ If a command can evaluate code, execute subcommands, or read files by design, prefer explicit allowlist entries and keep approval prompts enabled.
251
+ Custom safe bins must define an explicit profile in `tools.exec.safeBinProfiles.<bin>`.
252
+ Validation is deterministic from argv shape only (no host filesystem existence checks), which
253
+ prevents file-existence oracle behavior from allow/deny differences.
254
+ File-oriented options are denied for default safe bins (for example `sort -o`, `sort --output`,
255
+ `sort --files0-from`, `sort --compress-program`, `sort --random-source`,
256
+ `sort --temporary-directory`/`-T`, `wc --files0-from`, `jq -f/--from-file`,
257
+ `grep -f/--file`).
258
+ Safe bins also enforce explicit per-binary flag policy for options that break stdin-only
259
+ behavior (for example `sort -o/--output/--compress-program` and grep recursive flags).
260
+ Long options are validated fail-closed in safe-bin mode: unknown flags and ambiguous
261
+ abbreviations are rejected.
262
+ Denied flags by safe-bin profile:
263
+
264
+ [//]: # "SAFE_BIN_DENIED_FLAGS:START"
265
+
266
+ - `grep`: `--dereference-recursive`, `--directories`, `--exclude-from`, `--file`, `--recursive`, `-R`, `-d`, `-f`, `-r`
267
+ - `jq`: `--argfile`, `--from-file`, `--library-path`, `--rawfile`, `--slurpfile`, `-L`, `-f`
268
+ - `sort`: `--compress-program`, `--files0-from`, `--output`, `--random-source`, `--temporary-directory`, `-T`, `-o`
269
+ - `wc`: `--files0-from`
270
+
271
+ [//]: # "SAFE_BIN_DENIED_FLAGS:END"
272
+
273
+ Safe bins also force argv tokens to be treated as **literal text** at execution time (no globbing
274
+ and no `$VARS` expansion) for stdin-only segments, so patterns like `*` or `$HOME/...` cannot be
275
+ used to smuggle file reads.
276
+ Safe bins must also resolve from trusted binary directories (system defaults plus optional
277
+ `tools.exec.safeBinTrustedDirs`). `PATH` entries are never auto-trusted.
278
+ Default trusted safe-bin directories are intentionally minimal: `/bin`, `/usr/bin`.
279
+ If your safe-bin executable lives in package-manager/user paths (for example
280
+ `/opt/homebrew/bin`, `/usr/local/bin`, `/opt/local/bin`, `/snap/bin`), add them explicitly
281
+ to `tools.exec.safeBinTrustedDirs`.
282
+ Shell chaining and redirections are not auto-allowed in allowlist mode.
283
+
284
+ Shell chaining (`&&`, `||`, `;`) is allowed when every top-level segment satisfies the allowlist
285
+ (including safe bins or skill auto-allow). Redirections remain unsupported in allowlist mode.
286
+ Command substitution (`$()` / backticks) is rejected during allowlist parsing, including inside
287
+ double quotes; use single quotes if you need literal `$()` text.
288
+ On macOS companion-app approvals, raw shell text containing shell control or expansion syntax
289
+ (`&&`, `||`, `;`, `|`, `` ` ``, `$`, `<`, `>`, `(`, `)`) is treated as an allowlist miss unless
290
+ the shell binary itself is allowlisted.
291
+ For shell wrappers (`bash|sh|zsh ... -c/-lc`), request-scoped env overrides are reduced to a
292
+ small explicit allowlist (`TERM`, `LANG`, `LC_*`, `COLORTERM`, `NO_COLOR`, `FORCE_COLOR`).
293
+ For allow-always decisions in allowlist mode, known dispatch wrappers
294
+ (`env`, `nice`, `nohup`, `stdbuf`, `timeout`) persist inner executable paths instead of wrapper
295
+ paths. Shell multiplexers (`busybox`, `toybox`) are also unwrapped for shell applets (`sh`, `ash`,
296
+ etc.) so inner executables are persisted instead of multiplexer binaries. If a wrapper or
297
+ multiplexer cannot be safely unwrapped, no allowlist entry is persisted automatically.
298
+ If you allowlist interpreters like `python3` or `node`, prefer `tools.exec.strictInlineEval=true` so inline eval still requires an explicit approval. In strict mode, `allow-always` can still persist benign interpreter/script invocations, but inline-eval carriers are not persisted automatically.
299
+
300
+ Default safe bins:
301
+
302
+ [//]: # "SAFE_BIN_DEFAULTS:START"
303
+
304
+ `cut`, `uniq`, `head`, `tail`, `tr`, `wc`
305
+
306
+ [//]: # "SAFE_BIN_DEFAULTS:END"
307
+
308
+ `grep` and `sort` are not in the default list. If you opt in, keep explicit allowlist entries for
309
+ their non-stdin workflows.
310
+ For `grep` in safe-bin mode, provide the pattern with `-e`/`--regexp`; positional pattern form is
311
+ rejected so file operands cannot be smuggled as ambiguous positionals.
312
+
313
+ ### Safe bins versus allowlist
314
+
315
+ | Topic | `tools.exec.safeBins` | Allowlist (`exec-approvals.json`) |
316
+ | ---------------- | ------------------------------------------------------ | ------------------------------------------------------------ |
317
+ | Goal | Auto-allow narrow stdin filters | Explicitly trust specific executables |
318
+ | Match type | Executable name + safe-bin argv policy | Resolved executable path glob pattern |
319
+ | Argument scope | Restricted by safe-bin profile and literal-token rules | Path match only; arguments are otherwise your responsibility |
320
+ | Typical examples | `head`, `tail`, `tr`, `wc` | `jq`, `python3`, `node`, `ffmpeg`, custom CLIs |
321
+ | Best use | Low-risk text transforms in pipelines | Any tool with broader behavior or side effects |
322
+
323
+ Configuration location:
324
+
325
+ - `safeBins` comes from config (`tools.exec.safeBins` or per-agent `agents.list[].tools.exec.safeBins`).
326
+ - `safeBinTrustedDirs` comes from config (`tools.exec.safeBinTrustedDirs` or per-agent `agents.list[].tools.exec.safeBinTrustedDirs`).
327
+ - `safeBinProfiles` comes from config (`tools.exec.safeBinProfiles` or per-agent `agents.list[].tools.exec.safeBinProfiles`). Per-agent profile keys override global keys.
328
+ - allowlist entries live in host-local `~/.Durar/exec-approvals.json` under `agents.<id>.allowlist` (or via Control UI / `Durar approvals allowlist ...`).
329
+ - `Durar security audit` warns with `tools.exec.safe_bins_interpreter_unprofiled` when interpreter/runtime bins appear in `safeBins` without explicit profiles.
330
+ - `Durar doctor --fix` can scaffold missing custom `safeBinProfiles.<bin>` entries as `{}` (review and tighten afterward). Interpreter/runtime bins are not auto-scaffolded.
331
+
332
+ Custom profile example:
333
+
334
+ ```json5
335
+ {
336
+ tools: {
337
+ exec: {
338
+ safeBins: ["jq", "myfilter"],
339
+ safeBinProfiles: {
340
+ myfilter: {
341
+ minPositional: 0,
342
+ maxPositional: 0,
343
+ allowedValueFlags: ["-n", "--limit"],
344
+ deniedFlags: ["-f", "--file", "-c", "--command"],
345
+ },
346
+ },
347
+ },
348
+ },
349
+ }
350
+ ```
351
+
352
+ If you explicitly opt `jq` into `safeBins`, Durar still rejects the `env` builtin in safe-bin
353
+ mode so `jq -n env` cannot dump the host process environment without an explicit allowlist path
354
+ or approval prompt.
355
+
356
+ ## Control UI editing
357
+
358
+ Use the **Control UI → Nodes → Exec approvals** card to edit defaults, per‑agent
359
+ overrides, and allowlists. Pick a scope (Defaults or an agent), tweak the policy,
360
+ add/remove allowlist patterns, then **Save**. The UI shows **last used** metadata
361
+ per pattern so you can keep the list tidy.
362
+
363
+ The target selector chooses **Gateway** (local approvals) or a **Node**. Nodes
364
+ must advertise `system.execApprovals.get/set` (macOS app or headless node host).
365
+ If a node does not advertise exec approvals yet, edit its local
366
+ `~/.Durar/exec-approvals.json` directly.
367
+
368
+ CLI: `Durar approvals` supports gateway or node editing (see [Approvals CLI](/cli/approvals)).
369
+
370
+ ## Approval flow
371
+
372
+ When a prompt is required, the gateway broadcasts `exec.approval.requested` to operator clients.
373
+ The Control UI and macOS app resolve it via `exec.approval.resolve`, then the gateway forwards the
374
+ approved request to the node host.
375
+
376
+ For `host=node`, approval requests include a canonical `systemRunPlan` payload. The gateway uses
377
+ that plan as the authoritative command/cwd/session context when forwarding approved `system.run`
378
+ requests.
379
+
380
+ That matters for async approval latency:
381
+
382
+ - the node exec path prepares one canonical plan up front
383
+ - the approval record stores that plan and its binding metadata
384
+ - once approved, the final forwarded `system.run` call reuses the stored plan
385
+ instead of trusting later caller edits
386
+ - if the caller changes `command`, `rawCommand`, `cwd`, `agentId`, or
387
+ `sessionKey` after the approval request was created, the gateway rejects the
388
+ forwarded run as an approval mismatch
389
+
390
+ ## Interpreter/runtime commands
391
+
392
+ Approval-backed interpreter/runtime runs are intentionally conservative:
393
+
394
+ - Exact argv/cwd/env context is always bound.
395
+ - Direct shell script and direct runtime file forms are best-effort bound to one concrete local
396
+ file snapshot.
397
+ - Common package-manager wrapper forms that still resolve to one direct local file (for example
398
+ `pnpm exec`, `pnpm node`, `npm exec`, `npx`) are unwrapped before binding.
399
+ - If Durar cannot identify exactly one concrete local file for an interpreter/runtime command
400
+ (for example package scripts, eval forms, runtime-specific loader chains, or ambiguous multi-file
401
+ forms), approval-backed execution is denied instead of claiming semantic coverage it does not
402
+ have.
403
+ - For those workflows, prefer sandboxing, a separate host boundary, or an explicit trusted
404
+ allowlist/full workflow where the operator accepts the broader runtime semantics.
405
+
406
+ When approvals are required, the exec tool returns immediately with an approval id. Use that id to
407
+ correlate later system events (`Exec finished` / `Exec denied`). If no decision arrives before the
408
+ timeout, the request is treated as an approval timeout and surfaced as a denial reason.
409
+
410
+ ### Followup delivery behavior
411
+
412
+ After an approved async exec finishes, Durar sends a followup `agent` turn to the same session.
413
+
414
+ - If a valid external delivery target exists (deliverable channel plus target `to`), followup delivery uses that channel.
415
+ - In webchat-only or internal-session flows with no external target, followup delivery stays session-only (`deliver: false`).
416
+ - If a caller explicitly requests strict external delivery with no resolvable external channel, the request fails with `INVALID_REQUEST`.
417
+ - If `bestEffortDeliver` is enabled and no external channel can be resolved, delivery is downgraded to session-only instead of failing.
418
+
419
+ The confirmation dialog includes:
420
+
421
+ - command + args
422
+ - cwd
423
+ - agent id
424
+ - resolved executable path
425
+ - host + policy metadata
426
+
427
+ Actions:
428
+
429
+ - **Allow once** → run now
430
+ - **Always allow** → add to allowlist + run
431
+ - **Deny** → block
432
+
433
+ ## Approval forwarding to chat channels
434
+
435
+ You can forward exec approval prompts to any chat channel (including plugin channels) and approve
436
+ them with `/approve`. This uses the normal outbound delivery pipeline.
437
+
438
+ Config:
439
+
440
+ ```json5
441
+ {
442
+ approvals: {
443
+ exec: {
444
+ enabled: true,
445
+ mode: "session", // "session" | "targets" | "both"
446
+ agentFilter: ["main"],
447
+ sessionFilter: ["discord"], // substring or regex
448
+ targets: [
449
+ { channel: "slack", to: "U12345678" },
450
+ { channel: "telegram", to: "123456789" },
451
+ ],
452
+ },
453
+ },
454
+ }
455
+ ```
456
+
457
+ Reply in chat:
458
+
459
+ ```
460
+ /approve <id> allow-once
461
+ /approve <id> allow-always
462
+ /approve <id> deny
463
+ ```
464
+
465
+ The `/approve` command handles both exec approvals and plugin approvals. If the ID does not match a pending exec approval, it automatically checks plugin approvals instead.
466
+
467
+ ### Plugin approval forwarding
468
+
469
+ Plugin approval forwarding uses the same delivery pipeline as exec approvals but has its own
470
+ independent config under `approvals.plugin`. Enabling or disabling one does not affect the other.
471
+
472
+ ```json5
473
+ {
474
+ approvals: {
475
+ plugin: {
476
+ enabled: true,
477
+ mode: "targets",
478
+ agentFilter: ["main"],
479
+ targets: [
480
+ { channel: "slack", to: "U12345678" },
481
+ { channel: "telegram", to: "123456789" },
482
+ ],
483
+ },
484
+ },
485
+ }
486
+ ```
487
+
488
+ The config shape is identical to `approvals.exec`: `enabled`, `mode`, `agentFilter`,
489
+ `sessionFilter`, and `targets` work the same way.
490
+
491
+ Channels that support shared interactive replies render the same approval buttons for both exec and
492
+ plugin approvals. Channels without shared interactive UI fall back to plain text with `/approve`
493
+ instructions.
494
+
495
+ ### Same-chat approvals on any channel
496
+
497
+ When an exec or plugin approval request originates from a deliverable chat surface, the same chat
498
+ can now approve it with `/approve` by default. This applies to channels such as Slack, Matrix, and
499
+ Microsoft Teams in addition to the existing Web UI and terminal UI flows.
500
+
501
+ This shared text-command path uses the normal channel auth model for that conversation. If the
502
+ originating chat can already send commands and receive replies, approval requests no longer need a
503
+ separate native delivery adapter just to stay pending.
504
+
505
+ Discord and Telegram also support same-chat `/approve`, but those channels still use their
506
+ resolved approver list for authorization even when native approval delivery is disabled.
507
+
508
+ For Telegram and other native approval clients that call the Gateway directly,
509
+ this fallback is intentionally bounded to "approval not found" failures. A real
510
+ exec approval denial/error does not silently retry as a plugin approval.
511
+
512
+ ### Native approval delivery
513
+
514
+ Some channels can also act as native approval clients. Native clients add approver DMs, origin-chat
515
+ fanout, and channel-specific interactive approval UX on top of the shared same-chat `/approve`
516
+ flow.
517
+
518
+ When native approval cards/buttons are available, that native UI is the primary
519
+ agent-facing path. The agent should not also echo a duplicate plain chat
520
+ `/approve` command unless the tool result says chat approvals are unavailable or
521
+ manual approval is the only remaining path.
522
+
523
+ Generic model:
524
+
525
+ - host exec policy still decides whether exec approval is required
526
+ - `approvals.exec` controls forwarding approval prompts to other chat destinations
527
+ - `channels.<channel>.execApprovals` controls whether that channel acts as a native approval client
528
+
529
+ Native approval clients auto-enable DM-first delivery when all of these are true:
530
+
531
+ - the channel supports native approval delivery
532
+ - approvers can be resolved from explicit `execApprovals.approvers` or that
533
+ channel's documented fallback sources
534
+ - `channels.<channel>.execApprovals.enabled` is unset or `"auto"`
535
+
536
+ Set `enabled: false` to disable a native approval client explicitly. Set `enabled: true` to force
537
+ it on when approvers resolve. Public origin-chat delivery stays explicit through
538
+ `channels.<channel>.execApprovals.target`.
539
+
540
+ FAQ: [Why are there two exec approval configs for chat approvals?](/help/faq#why-are-there-two-exec-approval-configs-for-chat-approvals)
541
+
542
+ - Discord: `channels.discord.execApprovals.*`
543
+ - Slack: `channels.slack.execApprovals.*`
544
+ - Telegram: `channels.telegram.execApprovals.*`
545
+
546
+ These native approval clients add DM routing and optional channel fanout on top of the shared
547
+ same-chat `/approve` flow and shared approval buttons.
548
+
549
+ Shared behavior:
550
+
551
+ - Slack, Matrix, Microsoft Teams, and similar deliverable chats use the normal channel auth model
552
+ for same-chat `/approve`
553
+ - when a native approval client auto-enables, the default native delivery target is approver DMs
554
+ - for Discord and Telegram, only resolved approvers can approve or deny
555
+ - Discord approvers can be explicit (`execApprovals.approvers`) or inferred from `commands.ownerAllowFrom`
556
+ - Telegram approvers can be explicit (`execApprovals.approvers`) or inferred from existing owner config (`allowFrom`, plus direct-message `defaultTo` where supported)
557
+ - Slack approvers can be explicit (`execApprovals.approvers`) or inferred from `commands.ownerAllowFrom`
558
+ - Slack native buttons preserve approval id kind, so `plugin:` ids can resolve plugin approvals
559
+ without a second Slack-local fallback layer
560
+ - Matrix native DM/channel routing is exec-only; Matrix plugin approvals stay on the shared
561
+ same-chat `/approve` and optional `approvals.plugin` forwarding paths
562
+ - the requester does not need to be an approver
563
+ - the originating chat can approve directly with `/approve` when that chat already supports commands and replies
564
+ - native Discord approval buttons route by approval id kind: `plugin:` ids go
565
+ straight to plugin approvals, everything else goes to exec approvals
566
+ - native Telegram approval buttons follow the same bounded exec-to-plugin fallback as `/approve`
567
+ - when native `target` enables origin-chat delivery, approval prompts include the command text
568
+ - pending exec approvals expire after 30 minutes by default
569
+ - if no operator UI or configured approval client can accept the request, the prompt falls back to `askFallback`
570
+
571
+ Telegram defaults to approver DMs (`target: "dm"`). You can switch to `channel` or `both` when you
572
+ want approval prompts to appear in the originating Telegram chat/topic as well. For Telegram forum
573
+ topics, Durar preserves the topic for the approval prompt and the post-approval follow-up.
574
+
575
+ See:
576
+
577
+ - [Discord](/channels/discord)
578
+ - [Telegram](/channels/telegram)
579
+
580
+ ### macOS IPC flow
581
+
582
+ ```
583
+ Gateway -> Node Service (WS)
584
+ | IPC (UDS + token + HMAC + TTL)
585
+ v
586
+ Mac App (UI + approvals + system.run)
587
+ ```
588
+
589
+ Security notes:
590
+
591
+ - Unix socket mode `0600`, token stored in `exec-approvals.json`.
592
+ - Same-UID peer check.
593
+ - Challenge/response (nonce + HMAC token + request hash) + short TTL.
594
+
595
+ ## System events
596
+
597
+ Exec lifecycle is surfaced as system messages:
598
+
599
+ - `Exec running` (only if the command exceeds the running notice threshold)
600
+ - `Exec finished`
601
+ - `Exec denied`
602
+
603
+ These are posted to the agent’s session after the node reports the event.
604
+ Gateway-host exec approvals emit the same lifecycle events when the command finishes (and optionally when running longer than the threshold).
605
+ Approval-gated execs reuse the approval id as the `runId` in these messages for easy correlation.
606
+
607
+ ## Denied approval behavior
608
+
609
+ When an async exec approval is denied, Durar prevents the agent from reusing
610
+ output from any earlier run of the same command in the session. The denial reason
611
+ is passed with explicit guidance that no command output is available, which stops
612
+ the agent from claiming there is new output or repeating the denied command with
613
+ stale results from a prior successful run.
614
+
615
+ ## Implications
616
+
617
+ - **full** is powerful; prefer allowlists when possible.
618
+ - **ask** keeps you in the loop while still allowing fast approvals.
619
+ - Per-agent allowlists prevent one agent’s approvals from leaking into others.
620
+ - Approvals only apply to host exec requests from **authorized senders**. Unauthorized senders cannot issue `/exec`.
621
+ - `/exec security=full` is a session-level convenience for authorized operators and skips approvals by design.
622
+ To hard-block host exec, set approvals security to `deny` or deny the `exec` tool via tool policy.
623
+
624
+ Related:
625
+
626
+ - [Exec tool](/tools/exec)
627
+ - [Elevated mode](/tools/elevated)
628
+ - [Skills](/tools/skills)
629
+
630
+ ## Related
631
+
632
+ - [Exec](/tools/exec) — shell command execution tool
633
+ - [Sandboxing](/gateway/sandboxing) — sandbox modes and workspace access
634
+ - [Security](/gateway/security) — security model and hardening
635
+ - [Sandbox vs Tool Policy vs Elevated](/gateway/sandbox-vs-tool-policy-vs-elevated) — when to use each