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.
- package/CHANGELOG.md +5497 -0
- package/LICENSE +21 -0
- package/README.md +614 -0
- package/assets/avatar-placeholder.svg +19 -0
- package/assets/chrome-extension/icons/icon128.png +0 -0
- package/assets/chrome-extension/icons/icon16.png +0 -0
- package/assets/chrome-extension/icons/icon32.png +0 -0
- package/assets/chrome-extension/icons/icon48.png +0 -0
- package/assets/dmg-background-small.png +0 -0
- package/assets/dmg-background.png +0 -0
- package/docs/.i18n/README.md +72 -0
- package/docs/.i18n/ar-navigation.json +18 -0
- package/docs/.i18n/de-navigation.json +18 -0
- package/docs/.i18n/es-navigation.json +18 -0
- package/docs/.i18n/fr-navigation.json +18 -0
- package/docs/.i18n/glossary.ar.json +5 -0
- package/docs/.i18n/glossary.de.json +5 -0
- package/docs/.i18n/glossary.es.json +5 -0
- package/docs/.i18n/glossary.fr.json +5 -0
- package/docs/.i18n/glossary.id.json +5 -0
- package/docs/.i18n/glossary.it.json +5 -0
- package/docs/.i18n/glossary.ja-JP.json +14 -0
- package/docs/.i18n/glossary.ko.json +5 -0
- package/docs/.i18n/glossary.pl.json +5 -0
- package/docs/.i18n/glossary.pt-BR.json +5 -0
- package/docs/.i18n/glossary.tr.json +5 -0
- package/docs/.i18n/glossary.zh-CN.json +358 -0
- package/docs/.i18n/id-navigation.json +18 -0
- package/docs/.i18n/it-navigation.json +18 -0
- package/docs/.i18n/ja-navigation.json +18 -0
- package/docs/.i18n/ko-navigation.json +18 -0
- package/docs/.i18n/pl-navigation.json +18 -0
- package/docs/.i18n/pt-BR-navigation.json +18 -0
- package/docs/.i18n/tr-navigation.json +18 -0
- package/docs/.i18n/zh-Hans-navigation.json +544 -0
- package/docs/assets/install-script.svg +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.svg +418 -0
- package/docs/assets/openclaw-logo-text.png +0 -0
- package/docs/assets/openclaw-logo-text.svg +418 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/assets/sponsors/blacksmith-light.svg +14 -0
- package/docs/assets/sponsors/blacksmith.svg +14 -0
- package/docs/assets/sponsors/convex-light.svg +16 -0
- package/docs/assets/sponsors/convex.svg +16 -0
- package/docs/assets/sponsors/github-light.svg +3 -0
- package/docs/assets/sponsors/github.svg +3 -0
- package/docs/assets/sponsors/nvidia-dark.svg +9 -0
- package/docs/assets/sponsors/nvidia.svg +9 -0
- package/docs/assets/sponsors/openai-light.svg +3 -0
- package/docs/assets/sponsors/openai.svg +3 -0
- package/docs/assets/sponsors/vercel-light.svg +5 -0
- package/docs/assets/sponsors/vercel.svg +5 -0
- package/docs/auth-credential-semantics.md +80 -0
- package/docs/automation/auth-monitoring.md +8 -0
- package/docs/automation/clawflow.md +8 -0
- package/docs/automation/cron-jobs.md +410 -0
- package/docs/automation/cron-vs-heartbeat.md +8 -0
- package/docs/automation/gmail-pubsub.md +8 -0
- package/docs/automation/hooks.md +303 -0
- package/docs/automation/index.md +115 -0
- package/docs/automation/poll.md +8 -0
- package/docs/automation/standing-orders.md +254 -0
- package/docs/automation/taskflow.md +82 -0
- package/docs/automation/tasks.md +323 -0
- package/docs/automation/troubleshooting.md +8 -0
- package/docs/automation/webhook.md +8 -0
- package/docs/brave-search.md +103 -0
- package/docs/channels/bluebubbles.md +435 -0
- package/docs/channels/broadcast-groups.md +442 -0
- package/docs/channels/channel-routing.md +139 -0
- package/docs/channels/discord.md +1254 -0
- package/docs/channels/feishu.md +793 -0
- package/docs/channels/googlechat.md +270 -0
- package/docs/channels/group-messages.md +84 -0
- package/docs/channels/groups.md +410 -0
- package/docs/channels/imessage.md +427 -0
- package/docs/channels/index.md +50 -0
- package/docs/channels/irc.md +252 -0
- package/docs/channels/line.md +225 -0
- package/docs/channels/location.md +56 -0
- package/docs/channels/matrix.md +869 -0
- package/docs/channels/mattermost.md +472 -0
- package/docs/channels/msteams.md +805 -0
- package/docs/channels/nextcloud-talk.md +149 -0
- package/docs/channels/nostr.md +252 -0
- package/docs/channels/pairing.md +129 -0
- package/docs/channels/qqbot.md +193 -0
- package/docs/channels/signal.md +337 -0
- package/docs/channels/slack.md +681 -0
- package/docs/channels/synology-chat.md +185 -0
- package/docs/channels/telegram.md +1072 -0
- package/docs/channels/tlon.md +290 -0
- package/docs/channels/troubleshooting.md +133 -0
- package/docs/channels/twitch.md +394 -0
- package/docs/channels/whatsapp.md +488 -0
- package/docs/channels/zalo.md +254 -0
- package/docs/channels/zalouser.md +195 -0
- package/docs/ci.md +66 -0
- package/docs/cli/acp.md +316 -0
- package/docs/cli/agent.md +57 -0
- package/docs/cli/agents.md +220 -0
- package/docs/cli/approvals.md +136 -0
- package/docs/cli/backup.md +84 -0
- package/docs/cli/browser.md +233 -0
- package/docs/cli/channels.md +131 -0
- package/docs/cli/clawbot.md +21 -0
- package/docs/cli/completion.md +35 -0
- package/docs/cli/config.md +353 -0
- package/docs/cli/configure.md +70 -0
- package/docs/cli/cron.md +167 -0
- package/docs/cli/daemon.md +57 -0
- package/docs/cli/dashboard.md +22 -0
- package/docs/cli/devices.md +171 -0
- package/docs/cli/directory.md +63 -0
- package/docs/cli/dns.md +48 -0
- package/docs/cli/docs.md +28 -0
- package/docs/cli/doctor.md +63 -0
- package/docs/cli/flows.md +18 -0
- package/docs/cli/gateway.md +307 -0
- package/docs/cli/health.md +36 -0
- package/docs/cli/hooks.md +337 -0
- package/docs/cli/index.md +1836 -0
- package/docs/cli/logs.md +59 -0
- package/docs/cli/mcp.md +505 -0
- package/docs/cli/memory.md +139 -0
- package/docs/cli/message.md +300 -0
- package/docs/cli/models.md +136 -0
- package/docs/cli/node.md +137 -0
- package/docs/cli/nodes.md +66 -0
- package/docs/cli/onboard.md +171 -0
- package/docs/cli/pairing.md +65 -0
- package/docs/cli/plugins.md +305 -0
- package/docs/cli/qr.md +52 -0
- package/docs/cli/reset.md +35 -0
- package/docs/cli/sandbox.md +197 -0
- package/docs/cli/secrets.md +197 -0
- package/docs/cli/security.md +86 -0
- package/docs/cli/sessions.md +113 -0
- package/docs/cli/setup.md +45 -0
- package/docs/cli/skills.md +59 -0
- package/docs/cli/status.md +35 -0
- package/docs/cli/system.md +71 -0
- package/docs/cli/tui.md +30 -0
- package/docs/cli/uninstall.md +39 -0
- package/docs/cli/update.md +113 -0
- package/docs/cli/voicecall.md +34 -0
- package/docs/cli/webhooks.md +91 -0
- package/docs/concepts/agent-loop.md +168 -0
- package/docs/concepts/agent-workspace.md +246 -0
- package/docs/concepts/agent.md +129 -0
- package/docs/concepts/architecture.md +156 -0
- package/docs/concepts/compaction.md +122 -0
- package/docs/concepts/context-engine.md +274 -0
- package/docs/concepts/context.md +179 -0
- package/docs/concepts/delegate-architecture.md +307 -0
- package/docs/concepts/dreaming.md +173 -0
- package/docs/concepts/features.md +76 -0
- package/docs/concepts/markdown-formatting.md +130 -0
- package/docs/concepts/memory-builtin.md +105 -0
- package/docs/concepts/memory-honcho.md +140 -0
- package/docs/concepts/memory-qmd.md +163 -0
- package/docs/concepts/memory-search.md +141 -0
- package/docs/concepts/memory.md +121 -0
- package/docs/concepts/messages.md +161 -0
- package/docs/concepts/model-failover.md +349 -0
- package/docs/concepts/model-providers.md +799 -0
- package/docs/concepts/models.md +255 -0
- package/docs/concepts/multi-agent.md +615 -0
- package/docs/concepts/oauth.md +225 -0
- package/docs/concepts/presence.md +102 -0
- package/docs/concepts/queue.md +89 -0
- package/docs/concepts/retry.md +69 -0
- package/docs/concepts/session-pruning.md +92 -0
- package/docs/concepts/session-tool.md +141 -0
- package/docs/concepts/session.md +116 -0
- package/docs/concepts/soul.md +110 -0
- package/docs/concepts/streaming.md +161 -0
- package/docs/concepts/system-prompt.md +182 -0
- package/docs/concepts/timezone.md +97 -0
- package/docs/concepts/typebox.md +307 -0
- package/docs/concepts/typing-indicators.md +69 -0
- package/docs/concepts/usage-tracking.md +59 -0
- package/docs/date-time.md +128 -0
- package/docs/debug/node-issue.md +85 -0
- package/docs/diagnostics/flags.md +91 -0
- package/docs/docs.json +1601 -0
- package/docs/gateway/authentication.md +218 -0
- package/docs/gateway/background-process.md +131 -0
- package/docs/gateway/bonjour.md +179 -0
- package/docs/gateway/bridge-protocol.md +89 -0
- package/docs/gateway/cli-backends.md +310 -0
- package/docs/gateway/configuration-examples.md +631 -0
- package/docs/gateway/configuration-reference.md +3618 -0
- package/docs/gateway/configuration.md +698 -0
- package/docs/gateway/discovery.md +141 -0
- package/docs/gateway/doctor.md +494 -0
- package/docs/gateway/gateway-lock.md +37 -0
- package/docs/gateway/health.md +61 -0
- package/docs/gateway/heartbeat.md +443 -0
- package/docs/gateway/index.md +367 -0
- package/docs/gateway/local-models.md +163 -0
- package/docs/gateway/logging.md +113 -0
- package/docs/gateway/multiple-gateways.md +120 -0
- package/docs/gateway/network-model.md +25 -0
- package/docs/gateway/openai-http-api.md +280 -0
- package/docs/gateway/openresponses-http-api.md +340 -0
- package/docs/gateway/openshell.md +307 -0
- package/docs/gateway/pairing.md +138 -0
- package/docs/gateway/protocol.md +588 -0
- package/docs/gateway/remote-gateway-readme.md +164 -0
- package/docs/gateway/remote.md +251 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +141 -0
- package/docs/gateway/sandboxing.md +473 -0
- package/docs/gateway/secrets-plan-contract.md +116 -0
- package/docs/gateway/secrets.md +541 -0
- package/docs/gateway/security/index.md +1362 -0
- package/docs/gateway/tailscale.md +136 -0
- package/docs/gateway/tools-invoke-http-api.md +161 -0
- package/docs/gateway/troubleshooting.md +451 -0
- package/docs/gateway/trusted-proxy-auth.md +399 -0
- package/docs/help/debugging.md +168 -0
- package/docs/help/environment.md +165 -0
- package/docs/help/faq.md +3244 -0
- package/docs/help/index.md +28 -0
- package/docs/help/scripts.md +27 -0
- package/docs/help/testing.md +640 -0
- package/docs/help/troubleshooting.md +372 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-step2-create-app.png +0 -0
- package/docs/images/feishu-step3-credentials.png +0 -0
- package/docs/images/feishu-step4-permissions.png +0 -0
- package/docs/images/feishu-step5-bot-capability.png +0 -0
- package/docs/images/feishu-step6-event-subscription.png +0 -0
- package/docs/images/feishu-verification-token.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +196 -0
- package/docs/install/ansible.md +230 -0
- package/docs/install/azure.md +311 -0
- package/docs/install/bun.md +55 -0
- package/docs/install/clawdock.md +106 -0
- package/docs/install/development-channels.md +131 -0
- package/docs/install/digitalocean.md +129 -0
- package/docs/install/docker-vm-runtime.md +142 -0
- package/docs/install/docker.md +412 -0
- package/docs/install/exe-dev.md +133 -0
- package/docs/install/fly.md +504 -0
- package/docs/install/gcp.md +412 -0
- package/docs/install/hetzner.md +259 -0
- package/docs/install/index.md +212 -0
- package/docs/install/installer.md +443 -0
- package/docs/install/kubernetes.md +192 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-matrix.md +349 -0
- package/docs/install/migrating.md +112 -0
- package/docs/install/nix.md +89 -0
- package/docs/install/node.md +144 -0
- package/docs/install/northflank.mdx +42 -0
- package/docs/install/oracle.md +158 -0
- package/docs/install/podman.md +210 -0
- package/docs/install/railway.mdx +90 -0
- package/docs/install/raspberry-pi.md +159 -0
- package/docs/install/render.mdx +165 -0
- package/docs/install/uninstall.md +128 -0
- package/docs/install/updating.md +142 -0
- package/docs/logging.md +389 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +69 -0
- package/docs/nodes/audio.md +191 -0
- package/docs/nodes/camera.md +162 -0
- package/docs/nodes/images.md +73 -0
- package/docs/nodes/index.md +408 -0
- package/docs/nodes/location-command.md +98 -0
- package/docs/nodes/media-understanding.md +432 -0
- package/docs/nodes/talk.md +92 -0
- package/docs/nodes/troubleshooting.md +123 -0
- package/docs/nodes/voicewake.md +66 -0
- package/docs/perplexity.md +181 -0
- package/docs/pi-dev.md +80 -0
- package/docs/pi.md +570 -0
- package/docs/platforms/android.md +244 -0
- package/docs/platforms/digitalocean.md +266 -0
- package/docs/platforms/index.md +55 -0
- package/docs/platforms/ios.md +223 -0
- package/docs/platforms/linux.md +100 -0
- package/docs/platforms/mac/bundled-gateway.md +75 -0
- package/docs/platforms/mac/canvas.md +125 -0
- package/docs/platforms/mac/child-process.md +69 -0
- package/docs/platforms/mac/dev-setup.md +107 -0
- package/docs/platforms/mac/health.md +34 -0
- package/docs/platforms/mac/icon.md +31 -0
- package/docs/platforms/mac/logging.md +57 -0
- package/docs/platforms/mac/menu-bar.md +81 -0
- package/docs/platforms/mac/peekaboo.md +65 -0
- package/docs/platforms/mac/permissions.md +50 -0
- package/docs/platforms/mac/remote.md +84 -0
- package/docs/platforms/mac/signing.md +47 -0
- package/docs/platforms/mac/skills.md +40 -0
- package/docs/platforms/mac/voice-overlay.md +60 -0
- package/docs/platforms/mac/voicewake.md +67 -0
- package/docs/platforms/mac/webchat.md +51 -0
- package/docs/platforms/mac/xpc.md +61 -0
- package/docs/platforms/macos.md +229 -0
- package/docs/platforms/oracle.md +305 -0
- package/docs/platforms/raspberry-pi.md +420 -0
- package/docs/platforms/windows.md +241 -0
- package/docs/plugins/agent-tools.md +10 -0
- package/docs/plugins/architecture.md +1609 -0
- package/docs/plugins/building-extensions.md +10 -0
- package/docs/plugins/building-plugins.md +319 -0
- package/docs/plugins/bundles.md +292 -0
- package/docs/plugins/community.md +149 -0
- package/docs/plugins/manifest.md +412 -0
- package/docs/plugins/sdk-channel-plugins.md +508 -0
- package/docs/plugins/sdk-entrypoints.md +210 -0
- package/docs/plugins/sdk-migration.md +359 -0
- package/docs/plugins/sdk-overview.md +475 -0
- package/docs/plugins/sdk-provider-plugins.md +712 -0
- package/docs/plugins/sdk-runtime.md +381 -0
- package/docs/plugins/sdk-setup.md +516 -0
- package/docs/plugins/sdk-testing.md +263 -0
- package/docs/plugins/voice-call.md +466 -0
- package/docs/plugins/zalouser.md +78 -0
- package/docs/prose.md +134 -0
- package/docs/providers/anthropic.md +402 -0
- package/docs/providers/bedrock-mantle.md +91 -0
- package/docs/providers/bedrock.md +273 -0
- package/docs/providers/chutes.md +103 -0
- package/docs/providers/claude-max-api-proxy.md +163 -0
- package/docs/providers/cloudflare-ai-gateway.md +71 -0
- package/docs/providers/deepgram.md +93 -0
- package/docs/providers/deepseek.md +53 -0
- package/docs/providers/fireworks.md +69 -0
- package/docs/providers/github-copilot.md +80 -0
- package/docs/providers/glm.md +68 -0
- package/docs/providers/google.md +149 -0
- package/docs/providers/groq.md +105 -0
- package/docs/providers/huggingface.md +193 -0
- package/docs/providers/index.md +81 -0
- package/docs/providers/kilocode.md +89 -0
- package/docs/providers/litellm.md +159 -0
- package/docs/providers/minimax.md +281 -0
- package/docs/providers/mistral.md +68 -0
- package/docs/providers/models.md +56 -0
- package/docs/providers/moonshot.md +224 -0
- package/docs/providers/nvidia.md +58 -0
- package/docs/providers/ollama.md +379 -0
- package/docs/providers/openai.md +472 -0
- package/docs/providers/opencode-go.md +45 -0
- package/docs/providers/opencode.md +68 -0
- package/docs/providers/openrouter.md +59 -0
- package/docs/providers/perplexity-provider.md +62 -0
- package/docs/providers/qianfan.md +90 -0
- package/docs/providers/qwen.md +128 -0
- package/docs/providers/qwen_modelstudio.md +137 -0
- package/docs/providers/sglang.md +115 -0
- package/docs/providers/stepfun.md +152 -0
- package/docs/providers/synthetic.md +101 -0
- package/docs/providers/together.md +70 -0
- package/docs/providers/venice.md +282 -0
- package/docs/providers/vercel-ai-gateway.md +60 -0
- package/docs/providers/vllm.md +103 -0
- package/docs/providers/volcengine.md +94 -0
- package/docs/providers/xai.md +94 -0
- package/docs/providers/xiaomi.md +89 -0
- package/docs/providers/zai.md +75 -0
- package/docs/reference/AGENTS.default.md +126 -0
- package/docs/reference/RELEASING.md +138 -0
- package/docs/reference/api-usage-costs.md +198 -0
- package/docs/reference/credits.md +30 -0
- package/docs/reference/device-models.md +47 -0
- package/docs/reference/memory-config.md +421 -0
- package/docs/reference/prompt-caching.md +344 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +148 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +607 -0
- package/docs/reference/session-management-compaction.md +352 -0
- package/docs/reference/templates/AGENTS.dev.md +84 -0
- package/docs/reference/templates/AGENTS.md +219 -0
- package/docs/reference/templates/BOOT.md +12 -0
- package/docs/reference/templates/BOOTSTRAP.md +62 -0
- package/docs/reference/templates/CLAUDE.md +1 -0
- package/docs/reference/templates/HEARTBEAT.md +14 -0
- package/docs/reference/templates/IDENTITY.dev.md +48 -0
- package/docs/reference/templates/IDENTITY.md +30 -0
- package/docs/reference/templates/SOUL.dev.md +77 -0
- package/docs/reference/templates/SOUL.md +45 -0
- package/docs/reference/templates/TOOLS.dev.md +25 -0
- package/docs/reference/templates/TOOLS.md +47 -0
- package/docs/reference/templates/USER.dev.md +19 -0
- package/docs/reference/templates/USER.md +24 -0
- package/docs/reference/test.md +119 -0
- package/docs/reference/token-use.md +197 -0
- package/docs/reference/transcript-hygiene.md +151 -0
- package/docs/reference/wizard.md +245 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +98 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +608 -0
- package/docs/security/formal-verification.md +167 -0
- package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +9 -0
- package/docs/snippets/plugin-publish/minimal-package.json +16 -0
- package/docs/start/bootstrapping.md +41 -0
- package/docs/start/docs-directory.md +67 -0
- package/docs/start/getting-started.md +148 -0
- package/docs/start/hubs.md +199 -0
- package/docs/start/lore.md +219 -0
- package/docs/start/onboarding-overview.md +69 -0
- package/docs/start/onboarding.md +92 -0
- package/docs/start/openclaw.md +225 -0
- package/docs/start/quickstart.md +22 -0
- package/docs/start/setup.md +172 -0
- package/docs/start/showcase.md +418 -0
- package/docs/start/wizard-cli-automation.md +233 -0
- package/docs/start/wizard-cli-reference.md +324 -0
- package/docs/start/wizard.md +127 -0
- package/docs/style.css +37 -0
- package/docs/tools/acp-agents.md +837 -0
- package/docs/tools/agent-send.md +100 -0
- package/docs/tools/apply-patch.md +52 -0
- package/docs/tools/brave-search.md +107 -0
- package/docs/tools/browser-linux-troubleshooting.md +145 -0
- package/docs/tools/browser-login.md +73 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +221 -0
- package/docs/tools/browser.md +890 -0
- package/docs/tools/btw.md +142 -0
- package/docs/tools/capability-cookbook.md +119 -0
- package/docs/tools/clawhub.md +348 -0
- package/docs/tools/code-execution.md +90 -0
- package/docs/tools/creating-skills.md +119 -0
- package/docs/tools/diffs.md +434 -0
- package/docs/tools/duckduckgo-search.md +102 -0
- package/docs/tools/elevated.md +116 -0
- package/docs/tools/exa-search.md +127 -0
- package/docs/tools/exec-approvals.md +635 -0
- package/docs/tools/exec.md +237 -0
- package/docs/tools/firecrawl.md +147 -0
- package/docs/tools/gemini-search.md +98 -0
- package/docs/tools/grok-search.md +102 -0
- package/docs/tools/image-generation.md +139 -0
- package/docs/tools/index.md +174 -0
- package/docs/tools/kimi-search.md +98 -0
- package/docs/tools/llm-task.md +119 -0
- package/docs/tools/lobster.md +348 -0
- package/docs/tools/loop-detection.md +100 -0
- package/docs/tools/minimax-search.md +99 -0
- package/docs/tools/multi-agent-sandbox-tools.md +373 -0
- package/docs/tools/ollama-search.md +100 -0
- package/docs/tools/pdf.md +176 -0
- package/docs/tools/perplexity-search.md +185 -0
- package/docs/tools/plugin.md +348 -0
- package/docs/tools/reactions.md +78 -0
- package/docs/tools/searxng-search.md +132 -0
- package/docs/tools/skills-config.md +133 -0
- package/docs/tools/skills.md +377 -0
- package/docs/tools/slash-commands.md +322 -0
- package/docs/tools/subagents.md +341 -0
- package/docs/tools/tavily.md +129 -0
- package/docs/tools/thinking.md +102 -0
- package/docs/tools/tts.md +452 -0
- package/docs/tools/web-fetch.md +159 -0
- package/docs/tools/web.md +417 -0
- package/docs/tts.md +452 -0
- package/docs/vps.md +115 -0
- package/docs/web/control-ui.md +318 -0
- package/docs/web/dashboard.md +93 -0
- package/docs/web/index.md +126 -0
- package/docs/web/tui.md +176 -0
- package/docs/web/webchat.md +77 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/durar.mjs +180 -0
- package/package.json +1259 -0
- package/scripts/npm-runner.mjs +111 -0
- package/scripts/postinstall-bundled-plugins.mjs +188 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +199 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +316 -0
- package/skills/discord/SKILL.md +197 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gh-issues/SKILL.md +885 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +163 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +320 -0
- package/skills/model-usage/scripts/test_model_usage.py +40 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/node-connect/SKILL.md +142 -0
- package/skills/notion/SKILL.md +174 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +62 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +88 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +151 -0
- package/skills/sherpa-onnx-tts/SKILL.md +109 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +372 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +139 -0
- package/skills/skill-creator/scripts/quick_validate.py +159 -0
- package/skills/skill-creator/scripts/test_package_skill.py +160 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +72 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/taskflow/SKILL.md +149 -0
- package/skills/taskflow/examples/inbox-triage.lobster +33 -0
- package/skills/taskflow/examples/pr-intake.lobster +32 -0
- package/skills/taskflow-inbox-triage/SKILL.md +119 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +170 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +108 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +129 -0
- 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.”
|