nodmix 2026.5.25
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 +11573 -0
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/docs/.i18n/README.md +81 -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 +78 -0
- package/docs/.i18n/glossary.de.json +78 -0
- package/docs/.i18n/glossary.es.json +78 -0
- package/docs/.i18n/glossary.fa.json +78 -0
- package/docs/.i18n/glossary.fr.json +78 -0
- package/docs/.i18n/glossary.id.json +78 -0
- package/docs/.i18n/glossary.it.json +78 -0
- package/docs/.i18n/glossary.ja-JP.json +98 -0
- package/docs/.i18n/glossary.ko.json +78 -0
- package/docs/.i18n/glossary.nl.json +78 -0
- package/docs/.i18n/glossary.pl.json +78 -0
- package/docs/.i18n/glossary.pt-BR.json +78 -0
- package/docs/.i18n/glossary.th.json +78 -0
- package/docs/.i18n/glossary.tr.json +78 -0
- package/docs/.i18n/glossary.uk.json +78 -0
- package/docs/.i18n/glossary.vi.json +78 -0
- package/docs/.i18n/glossary.zh-CN.json +1002 -0
- package/docs/.i18n/glossary.zh-TW.json +78 -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/translation-workflow.md +111 -0
- package/docs/.i18n/zh-Hans-navigation.json +542 -0
- package/docs/AGENTS.md +36 -0
- package/docs/announcements/bluebubbles-imessage.md +79 -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/pr/quick-settings-browser-tools.png +0 -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 +124 -0
- package/docs/automation/auth-monitoring.md +11 -0
- package/docs/automation/clawflow.md +12 -0
- package/docs/automation/cron-jobs.md +500 -0
- package/docs/automation/cron-vs-heartbeat.md +11 -0
- package/docs/automation/gmail-pubsub.md +11 -0
- package/docs/automation/hooks.md +365 -0
- package/docs/automation/index.md +135 -0
- package/docs/automation/poll.md +12 -0
- package/docs/automation/standing-orders.md +250 -0
- package/docs/automation/taskflow.md +155 -0
- package/docs/automation/tasks.md +374 -0
- package/docs/automation/troubleshooting.md +12 -0
- package/docs/automation/webhook.md +12 -0
- package/docs/brave-search.md +11 -0
- package/docs/channels/access-groups.md +201 -0
- package/docs/channels/ambient-room-events.md +214 -0
- package/docs/channels/bot-loop-protection.md +131 -0
- package/docs/channels/broadcast-groups.md +472 -0
- package/docs/channels/channel-routing.md +162 -0
- package/docs/channels/clickclack.md +138 -0
- package/docs/channels/discord.md +1762 -0
- package/docs/channels/feishu.md +502 -0
- package/docs/channels/googlechat.md +284 -0
- package/docs/channels/group-messages.md +95 -0
- package/docs/channels/groups.md +519 -0
- package/docs/channels/imessage-from-bluebubbles.md +259 -0
- package/docs/channels/imessage.md +813 -0
- package/docs/channels/index.md +64 -0
- package/docs/channels/irc.md +253 -0
- package/docs/channels/line.md +243 -0
- package/docs/channels/location.md +71 -0
- package/docs/channels/matrix-migration.md +370 -0
- package/docs/channels/matrix-presentation.md +77 -0
- package/docs/channels/matrix-push-rules.md +150 -0
- package/docs/channels/matrix.md +921 -0
- package/docs/channels/mattermost.md +542 -0
- package/docs/channels/msteams.md +1042 -0
- package/docs/channels/nextcloud-talk.md +176 -0
- package/docs/channels/nostr.md +253 -0
- package/docs/channels/pairing.md +214 -0
- package/docs/channels/qqbot.md +309 -0
- package/docs/channels/signal.md +400 -0
- package/docs/channels/slack.md +1564 -0
- package/docs/channels/synology-chat.md +187 -0
- package/docs/channels/telegram.md +1107 -0
- package/docs/channels/tlon.md +296 -0
- package/docs/channels/troubleshooting.md +161 -0
- package/docs/channels/twitch.md +431 -0
- package/docs/channels/wechat.md +171 -0
- package/docs/channels/whatsapp.md +739 -0
- package/docs/channels/yuanbao.md +416 -0
- package/docs/channels/zalo.md +253 -0
- package/docs/channels/zalouser.md +199 -0
- package/docs/ci.md +612 -0
- package/docs/clawhub/publishing.md +96 -0
- package/docs/cli/acp.md +370 -0
- package/docs/cli/agent.md +103 -0
- package/docs/cli/agents.md +232 -0
- package/docs/cli/approvals.md +190 -0
- package/docs/cli/backup.md +97 -0
- package/docs/cli/browser.md +307 -0
- package/docs/cli/channels.md +154 -0
- package/docs/cli/clawbot.md +25 -0
- package/docs/cli/commitments.md +90 -0
- package/docs/cli/completion.md +39 -0
- package/docs/cli/config.md +504 -0
- package/docs/cli/configure.md +77 -0
- package/docs/cli/crestodian.md +332 -0
- package/docs/cli/cron.md +281 -0
- package/docs/cli/daemon.md +67 -0
- package/docs/cli/dashboard.md +33 -0
- package/docs/cli/devices.md +204 -0
- package/docs/cli/directory.md +68 -0
- package/docs/cli/dns.md +53 -0
- package/docs/cli/docs.md +73 -0
- package/docs/cli/doctor.md +237 -0
- package/docs/cli/flows.md +52 -0
- package/docs/cli/gateway.md +567 -0
- package/docs/cli/health.md +43 -0
- package/docs/cli/hooks.md +345 -0
- package/docs/cli/index.md +396 -0
- package/docs/cli/infer.md +364 -0
- package/docs/cli/logs.md +65 -0
- package/docs/cli/mcp.md +529 -0
- package/docs/cli/memory.md +183 -0
- package/docs/cli/message.md +317 -0
- package/docs/cli/migrate.md +290 -0
- package/docs/cli/models.md +224 -0
- package/docs/cli/node.md +177 -0
- package/docs/cli/nodes.md +76 -0
- package/docs/cli/onboard.md +245 -0
- package/docs/cli/pairing.md +77 -0
- package/docs/cli/path.md +502 -0
- package/docs/cli/plugins.md +454 -0
- package/docs/cli/policy.md +418 -0
- package/docs/cli/proxy.md +89 -0
- package/docs/cli/qr.md +56 -0
- package/docs/cli/reset.md +39 -0
- package/docs/cli/sandbox.md +208 -0
- package/docs/cli/secrets.md +202 -0
- package/docs/cli/security.md +124 -0
- package/docs/cli/sessions.md +164 -0
- package/docs/cli/setup.md +59 -0
- package/docs/cli/skills.md +102 -0
- package/docs/cli/status.md +45 -0
- package/docs/cli/system.md +89 -0
- package/docs/cli/tasks.md +111 -0
- package/docs/cli/tui.md +89 -0
- package/docs/cli/uninstall.md +44 -0
- package/docs/cli/update.md +242 -0
- package/docs/cli/voicecall.md +204 -0
- package/docs/cli/webhooks.md +117 -0
- package/docs/cli/wiki.md +256 -0
- package/docs/concepts/active-memory.md +856 -0
- package/docs/concepts/agent-loop.md +185 -0
- package/docs/concepts/agent-runtimes.md +243 -0
- package/docs/concepts/agent-workspace.md +230 -0
- package/docs/concepts/agent.md +136 -0
- package/docs/concepts/architecture.md +154 -0
- package/docs/concepts/channel-docking.md +145 -0
- package/docs/concepts/commitments.md +150 -0
- package/docs/concepts/compaction.md +203 -0
- package/docs/concepts/context-engine.md +306 -0
- package/docs/concepts/context.md +199 -0
- package/docs/concepts/delegate-architecture.md +319 -0
- package/docs/concepts/dreaming.md +261 -0
- package/docs/concepts/experimental-features.md +108 -0
- package/docs/concepts/features.md +91 -0
- package/docs/concepts/mantis-slack-desktop-runbook.md +202 -0
- package/docs/concepts/mantis.md +740 -0
- package/docs/concepts/markdown-formatting.md +139 -0
- package/docs/concepts/memory-builtin.md +146 -0
- package/docs/concepts/memory-honcho.md +144 -0
- package/docs/concepts/memory-qmd.md +271 -0
- package/docs/concepts/memory-search.md +166 -0
- package/docs/concepts/memory.md +258 -0
- package/docs/concepts/message-lifecycle-refactor.md +1128 -0
- package/docs/concepts/messages.md +214 -0
- package/docs/concepts/model-failover.md +385 -0
- package/docs/concepts/model-providers.md +715 -0
- package/docs/concepts/models.md +370 -0
- package/docs/concepts/multi-agent.md +619 -0
- package/docs/concepts/oauth.md +198 -0
- package/docs/concepts/openclaw-sdk.md +323 -0
- package/docs/concepts/parallel-specialist-lanes.md +127 -0
- package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
- package/docs/concepts/presence.md +117 -0
- package/docs/concepts/progress-drafts.md +362 -0
- package/docs/concepts/qa-e2e-automation.md +820 -0
- package/docs/concepts/qa-matrix.md +139 -0
- package/docs/concepts/queue-steering.md +90 -0
- package/docs/concepts/queue.md +122 -0
- package/docs/concepts/retry.md +86 -0
- package/docs/concepts/session-pruning.md +104 -0
- package/docs/concepts/session-tool.md +190 -0
- package/docs/concepts/session.md +164 -0
- package/docs/concepts/soul.md +116 -0
- package/docs/concepts/streaming.md +251 -0
- package/docs/concepts/system-prompt.md +310 -0
- package/docs/concepts/timezone.md +47 -0
- package/docs/concepts/typebox.md +309 -0
- package/docs/concepts/typing-indicators.md +88 -0
- package/docs/concepts/usage-tracking.md +66 -0
- package/docs/date-time.md +126 -0
- package/docs/debug/node-issue.md +90 -0
- package/docs/diagnostics/flags.md +138 -0
- package/docs/docs.json +1832 -0
- package/docs/gateway/authentication.md +239 -0
- package/docs/gateway/background-process.md +147 -0
- package/docs/gateway/bonjour.md +303 -0
- package/docs/gateway/bridge-protocol.md +94 -0
- package/docs/gateway/cli-backends.md +420 -0
- package/docs/gateway/config-agents.md +1514 -0
- package/docs/gateway/config-channels.md +945 -0
- package/docs/gateway/config-tools.md +769 -0
- package/docs/gateway/configuration-examples.md +705 -0
- package/docs/gateway/configuration-reference.md +1393 -0
- package/docs/gateway/configuration.md +737 -0
- package/docs/gateway/diagnostics.md +213 -0
- package/docs/gateway/discovery.md +154 -0
- package/docs/gateway/doctor.md +574 -0
- package/docs/gateway/gateway-lock.md +37 -0
- package/docs/gateway/health.md +73 -0
- package/docs/gateway/heartbeat.md +493 -0
- package/docs/gateway/index.md +383 -0
- package/docs/gateway/local-model-services.md +205 -0
- package/docs/gateway/local-models.md +355 -0
- package/docs/gateway/logging.md +149 -0
- package/docs/gateway/multiple-gateways.md +178 -0
- package/docs/gateway/network-model.md +15 -0
- package/docs/gateway/openai-http-api.md +350 -0
- package/docs/gateway/openresponses-http-api.md +347 -0
- package/docs/gateway/openshell.md +316 -0
- package/docs/gateway/opentelemetry.md +404 -0
- package/docs/gateway/operator-scopes.md +111 -0
- package/docs/gateway/pairing.md +207 -0
- package/docs/gateway/prometheus.md +230 -0
- package/docs/gateway/protocol.md +803 -0
- package/docs/gateway/remote-gateway-readme.md +169 -0
- package/docs/gateway/remote.md +280 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +146 -0
- package/docs/gateway/sandboxing.md +545 -0
- package/docs/gateway/secrets-plan-contract.md +114 -0
- package/docs/gateway/secrets.md +609 -0
- package/docs/gateway/security/audit-checks.md +127 -0
- package/docs/gateway/security/index.md +1326 -0
- package/docs/gateway/security/secure-file-operations.md +76 -0
- package/docs/gateway/tailscale.md +156 -0
- package/docs/gateway/tools-invoke-http-api.md +169 -0
- package/docs/gateway/troubleshooting.md +772 -0
- package/docs/gateway/trusted-proxy-auth.md +451 -0
- package/docs/help/debugging.md +344 -0
- package/docs/help/environment.md +214 -0
- package/docs/help/faq-first-run.md +867 -0
- package/docs/help/faq-models.md +553 -0
- package/docs/help/faq.md +1975 -0
- package/docs/help/gpt55-codex-agentic-parity-maintainers.md +196 -0
- package/docs/help/gpt55-codex-agentic-parity.md +230 -0
- package/docs/help/index.md +39 -0
- package/docs/help/scripts.md +56 -0
- package/docs/help/testing-live.md +580 -0
- package/docs/help/testing-updates-plugins.md +291 -0
- package/docs/help/testing.md +928 -0
- package/docs/help/troubleshooting.md +424 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-get-group-id.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 +233 -0
- package/docs/install/azure.md +315 -0
- package/docs/install/bun.md +59 -0
- package/docs/install/clawdock.md +112 -0
- package/docs/install/development-channels.md +135 -0
- package/docs/install/digitalocean.md +174 -0
- package/docs/install/docker-vm-runtime.md +154 -0
- package/docs/install/docker.md +562 -0
- package/docs/install/exe-dev.md +201 -0
- package/docs/install/fly.md +524 -0
- package/docs/install/gcp.md +418 -0
- package/docs/install/hetzner.md +285 -0
- package/docs/install/hostinger.md +98 -0
- package/docs/install/index.md +221 -0
- package/docs/install/installer.md +455 -0
- package/docs/install/kubernetes.md +196 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-claude.md +165 -0
- package/docs/install/migrating-hermes.md +177 -0
- package/docs/install/migrating.md +137 -0
- package/docs/install/nix.md +112 -0
- package/docs/install/node.md +142 -0
- package/docs/install/northflank.mdx +44 -0
- package/docs/install/oracle.md +218 -0
- package/docs/install/podman.md +210 -0
- package/docs/install/railway.mdx +92 -0
- package/docs/install/raspberry-pi.md +234 -0
- package/docs/install/render.mdx +167 -0
- package/docs/install/uninstall.md +131 -0
- package/docs/install/updating.md +280 -0
- package/docs/logging.md +318 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +72 -0
- package/docs/nodes/audio.md +215 -0
- package/docs/nodes/camera.md +166 -0
- package/docs/nodes/images.md +77 -0
- package/docs/nodes/index.md +439 -0
- package/docs/nodes/location-command.md +102 -0
- package/docs/nodes/media-understanding.md +469 -0
- package/docs/nodes/talk.md +154 -0
- package/docs/nodes/troubleshooting.md +123 -0
- package/docs/nodes/voicewake.md +93 -0
- package/docs/perplexity.md +11 -0
- package/docs/pi-dev.md +82 -0
- package/docs/pi.md +573 -0
- package/docs/plan/codex-context-engine-harness.md +624 -0
- package/docs/plan/ui-channels.md +284 -0
- package/docs/platforms/android.md +285 -0
- package/docs/platforms/digitalocean.md +12 -0
- package/docs/platforms/index.md +60 -0
- package/docs/platforms/ios.md +283 -0
- package/docs/platforms/linux.md +141 -0
- package/docs/platforms/mac/bundled-gateway.md +79 -0
- package/docs/platforms/mac/canvas.md +128 -0
- package/docs/platforms/mac/child-process.md +72 -0
- package/docs/platforms/mac/dev-setup.md +112 -0
- package/docs/platforms/mac/health.md +39 -0
- package/docs/platforms/mac/icon.md +36 -0
- package/docs/platforms/mac/logging.md +62 -0
- package/docs/platforms/mac/menu-bar.md +93 -0
- package/docs/platforms/mac/peekaboo.md +92 -0
- package/docs/platforms/mac/permissions.md +53 -0
- package/docs/platforms/mac/remote.md +123 -0
- package/docs/platforms/mac/signing.md +52 -0
- package/docs/platforms/mac/skills.md +43 -0
- package/docs/platforms/mac/voice-overlay.md +66 -0
- package/docs/platforms/mac/voicewake.md +73 -0
- package/docs/platforms/mac/webchat.md +54 -0
- package/docs/platforms/mac/xpc.md +66 -0
- package/docs/platforms/macos.md +226 -0
- package/docs/platforms/oracle.md +12 -0
- package/docs/platforms/raspberry-pi.md +13 -0
- package/docs/platforms/windows.md +286 -0
- package/docs/plugins/adding-capabilities.md +133 -0
- package/docs/plugins/admin-http-rpc.md +216 -0
- package/docs/plugins/agent-tools.md +13 -0
- package/docs/plugins/architecture-internals.md +1195 -0
- package/docs/plugins/architecture.md +481 -0
- package/docs/plugins/building-extensions.md +13 -0
- package/docs/plugins/building-plugins.md +330 -0
- package/docs/plugins/bundles.md +310 -0
- package/docs/plugins/cli-backend-plugins.md +310 -0
- package/docs/plugins/codex-computer-use.md +293 -0
- package/docs/plugins/codex-harness-reference.md +409 -0
- package/docs/plugins/codex-harness-runtime.md +247 -0
- package/docs/plugins/codex-harness.md +746 -0
- package/docs/plugins/codex-native-plugins.md +276 -0
- package/docs/plugins/community.md +77 -0
- package/docs/plugins/compatibility.md +164 -0
- package/docs/plugins/dependency-resolution.md +143 -0
- package/docs/plugins/google-meet.md +1737 -0
- package/docs/plugins/hooks.md +459 -0
- package/docs/plugins/install-overrides.md +80 -0
- package/docs/plugins/manage-plugins.md +210 -0
- package/docs/plugins/manifest.md +1359 -0
- package/docs/plugins/memory-lancedb.md +385 -0
- package/docs/plugins/memory-wiki.md +529 -0
- package/docs/plugins/message-presentation.md +473 -0
- package/docs/plugins/oc-path.md +166 -0
- package/docs/plugins/plugin-inventory.md +182 -0
- package/docs/plugins/reference/acpx.md +23 -0
- package/docs/plugins/reference/admin-http-rpc.md +23 -0
- package/docs/plugins/reference/alibaba.md +23 -0
- package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
- package/docs/plugins/reference/amazon-bedrock.md +23 -0
- package/docs/plugins/reference/anthropic-vertex.md +19 -0
- package/docs/plugins/reference/anthropic.md +23 -0
- package/docs/plugins/reference/arcee.md +23 -0
- package/docs/plugins/reference/azure-speech.md +23 -0
- package/docs/plugins/reference/bonjour.md +19 -0
- package/docs/plugins/reference/brave.md +23 -0
- package/docs/plugins/reference/browser.md +23 -0
- package/docs/plugins/reference/byteplus.md +19 -0
- package/docs/plugins/reference/canvas.md +19 -0
- package/docs/plugins/reference/cerebras.md +23 -0
- package/docs/plugins/reference/chutes.md +23 -0
- package/docs/plugins/reference/clickclack.md +23 -0
- package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
- package/docs/plugins/reference/codex.md +23 -0
- package/docs/plugins/reference/comfy.md +23 -0
- package/docs/plugins/reference/copilot-proxy.md +19 -0
- package/docs/plugins/reference/deepgram.md +23 -0
- package/docs/plugins/reference/deepinfra.md +23 -0
- package/docs/plugins/reference/deepseek.md +23 -0
- package/docs/plugins/reference/diagnostics-otel.md +19 -0
- package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
- package/docs/plugins/reference/diffs.md +19 -0
- package/docs/plugins/reference/discord.md +23 -0
- package/docs/plugins/reference/document-extract.md +23 -0
- package/docs/plugins/reference/duckduckgo.md +23 -0
- package/docs/plugins/reference/elevenlabs.md +23 -0
- package/docs/plugins/reference/exa.md +23 -0
- package/docs/plugins/reference/fal.md +23 -0
- package/docs/plugins/reference/feishu.md +23 -0
- package/docs/plugins/reference/file-transfer.md +19 -0
- package/docs/plugins/reference/firecrawl.md +23 -0
- package/docs/plugins/reference/fireworks.md +23 -0
- package/docs/plugins/reference/github-copilot.md +23 -0
- package/docs/plugins/reference/google-meet.md +23 -0
- package/docs/plugins/reference/google.md +23 -0
- package/docs/plugins/reference/googlechat.md +23 -0
- package/docs/plugins/reference/gradium.md +23 -0
- package/docs/plugins/reference/groq.md +23 -0
- package/docs/plugins/reference/huggingface.md +23 -0
- package/docs/plugins/reference/imessage.md +23 -0
- package/docs/plugins/reference/inworld.md +23 -0
- package/docs/plugins/reference/irc.md +23 -0
- package/docs/plugins/reference/kilocode.md +23 -0
- package/docs/plugins/reference/kimi.md +23 -0
- package/docs/plugins/reference/line.md +23 -0
- package/docs/plugins/reference/litellm.md +23 -0
- package/docs/plugins/reference/llm-task.md +19 -0
- package/docs/plugins/reference/lmstudio.md +23 -0
- package/docs/plugins/reference/lobster.md +19 -0
- package/docs/plugins/reference/matrix.md +23 -0
- package/docs/plugins/reference/mattermost.md +23 -0
- package/docs/plugins/reference/memory-core.md +19 -0
- package/docs/plugins/reference/memory-lancedb.md +23 -0
- package/docs/plugins/reference/memory-wiki.md +23 -0
- package/docs/plugins/reference/microsoft-foundry.md +19 -0
- package/docs/plugins/reference/microsoft.md +19 -0
- package/docs/plugins/reference/migrate-claude.md +19 -0
- package/docs/plugins/reference/migrate-hermes.md +19 -0
- package/docs/plugins/reference/minimax.md +23 -0
- package/docs/plugins/reference/mistral.md +23 -0
- package/docs/plugins/reference/moonshot.md +23 -0
- package/docs/plugins/reference/msteams.md +23 -0
- package/docs/plugins/reference/nextcloud-talk.md +23 -0
- package/docs/plugins/reference/nostr.md +23 -0
- package/docs/plugins/reference/nvidia.md +23 -0
- package/docs/plugins/reference/oc-path.md +23 -0
- package/docs/plugins/reference/ollama.md +23 -0
- package/docs/plugins/reference/open-prose.md +19 -0
- package/docs/plugins/reference/openai.md +23 -0
- package/docs/plugins/reference/opencode-go.md +23 -0
- package/docs/plugins/reference/opencode.md +23 -0
- package/docs/plugins/reference/openrouter.md +23 -0
- package/docs/plugins/reference/openshell.md +19 -0
- package/docs/plugins/reference/perplexity.md +23 -0
- package/docs/plugins/reference/policy.md +23 -0
- package/docs/plugins/reference/qa-channel.md +23 -0
- package/docs/plugins/reference/qa-lab.md +19 -0
- package/docs/plugins/reference/qa-matrix.md +19 -0
- package/docs/plugins/reference/qianfan.md +23 -0
- package/docs/plugins/reference/qqbot.md +23 -0
- package/docs/plugins/reference/qwen.md +23 -0
- package/docs/plugins/reference/runway.md +23 -0
- package/docs/plugins/reference/searxng.md +19 -0
- package/docs/plugins/reference/senseaudio.md +23 -0
- package/docs/plugins/reference/sglang.md +23 -0
- package/docs/plugins/reference/signal.md +23 -0
- package/docs/plugins/reference/skill-workshop.md +23 -0
- package/docs/plugins/reference/slack.md +23 -0
- package/docs/plugins/reference/stepfun.md +23 -0
- package/docs/plugins/reference/synology-chat.md +23 -0
- package/docs/plugins/reference/synthetic.md +23 -0
- package/docs/plugins/reference/tavily.md +23 -0
- package/docs/plugins/reference/telegram.md +23 -0
- package/docs/plugins/reference/tencent.md +23 -0
- package/docs/plugins/reference/tlon.md +23 -0
- package/docs/plugins/reference/together.md +23 -0
- package/docs/plugins/reference/tokenjuice.md +23 -0
- package/docs/plugins/reference/tts-local-cli.md +19 -0
- package/docs/plugins/reference/twitch.md +23 -0
- package/docs/plugins/reference/venice.md +23 -0
- package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
- package/docs/plugins/reference/vllm.md +23 -0
- package/docs/plugins/reference/voice-call.md +23 -0
- package/docs/plugins/reference/volcengine.md +23 -0
- package/docs/plugins/reference/voyage.md +19 -0
- package/docs/plugins/reference/vydra.md +23 -0
- package/docs/plugins/reference/web-readability.md +19 -0
- package/docs/plugins/reference/webhooks.md +23 -0
- package/docs/plugins/reference/whatsapp.md +23 -0
- package/docs/plugins/reference/xai.md +23 -0
- package/docs/plugins/reference/xiaomi.md +23 -0
- package/docs/plugins/reference/zai.md +23 -0
- package/docs/plugins/reference/zalo.md +23 -0
- package/docs/plugins/reference/zalouser.md +24 -0
- package/docs/plugins/reference.md +138 -0
- package/docs/plugins/sdk-agent-harness.md +339 -0
- package/docs/plugins/sdk-channel-ingress.md +137 -0
- package/docs/plugins/sdk-channel-message.md +458 -0
- package/docs/plugins/sdk-channel-plugins.md +762 -0
- package/docs/plugins/sdk-channel-turn.md +580 -0
- package/docs/plugins/sdk-entrypoints.md +333 -0
- package/docs/plugins/sdk-migration.md +949 -0
- package/docs/plugins/sdk-overview.md +501 -0
- package/docs/plugins/sdk-provider-plugins.md +807 -0
- package/docs/plugins/sdk-runtime.md +676 -0
- package/docs/plugins/sdk-setup.md +550 -0
- package/docs/plugins/sdk-subpaths.md +396 -0
- package/docs/plugins/sdk-testing.md +401 -0
- package/docs/plugins/skill-workshop.md +713 -0
- package/docs/plugins/tool-plugins.md +411 -0
- package/docs/plugins/voice-call.md +943 -0
- package/docs/plugins/webhooks.md +192 -0
- package/docs/plugins/zalouser.md +86 -0
- package/docs/prose.md +137 -0
- package/docs/providers/alibaba.md +158 -0
- package/docs/providers/anthropic.md +344 -0
- package/docs/providers/arcee.md +144 -0
- package/docs/providers/azure-speech.md +119 -0
- package/docs/providers/bedrock-mantle.md +211 -0
- package/docs/providers/bedrock.md +414 -0
- package/docs/providers/cerebras.md +130 -0
- package/docs/providers/chutes.md +153 -0
- package/docs/providers/claude-max-api-proxy.md +188 -0
- package/docs/providers/cloudflare-ai-gateway.md +119 -0
- package/docs/providers/comfy.md +362 -0
- package/docs/providers/deepgram.md +184 -0
- package/docs/providers/deepinfra.md +87 -0
- package/docs/providers/deepseek.md +146 -0
- package/docs/providers/ds4.md +309 -0
- package/docs/providers/elevenlabs.md +130 -0
- package/docs/providers/fal.md +204 -0
- package/docs/providers/fireworks.md +144 -0
- package/docs/providers/github-copilot.md +225 -0
- package/docs/providers/glm.md +137 -0
- package/docs/providers/google.md +472 -0
- package/docs/providers/gradium.md +123 -0
- package/docs/providers/groq.md +180 -0
- package/docs/providers/huggingface.md +235 -0
- package/docs/providers/index.md +102 -0
- package/docs/providers/inferrs.md +272 -0
- package/docs/providers/inworld.md +120 -0
- package/docs/providers/kilocode.md +135 -0
- package/docs/providers/litellm.md +234 -0
- package/docs/providers/lmstudio.md +224 -0
- package/docs/providers/minimax.md +505 -0
- package/docs/providers/mistral.md +235 -0
- package/docs/providers/models.md +65 -0
- package/docs/providers/moonshot.md +413 -0
- package/docs/providers/nvidia.md +140 -0
- package/docs/providers/ollama.md +1180 -0
- package/docs/providers/openai.md +1057 -0
- package/docs/providers/opencode-go.md +123 -0
- package/docs/providers/opencode.md +149 -0
- package/docs/providers/openrouter.md +349 -0
- package/docs/providers/perplexity-provider.md +123 -0
- package/docs/providers/qianfan.md +132 -0
- package/docs/providers/qwen.md +332 -0
- package/docs/providers/runway.md +103 -0
- package/docs/providers/senseaudio.md +68 -0
- package/docs/providers/sglang.md +161 -0
- package/docs/providers/stepfun.md +229 -0
- package/docs/providers/synthetic.md +154 -0
- package/docs/providers/tencent.md +130 -0
- package/docs/providers/together.md +141 -0
- package/docs/providers/venice.md +315 -0
- package/docs/providers/vercel-ai-gateway.md +128 -0
- package/docs/providers/vllm.md +383 -0
- package/docs/providers/volcengine.md +199 -0
- package/docs/providers/vydra.md +180 -0
- package/docs/providers/xai.md +560 -0
- package/docs/providers/xiaomi.md +188 -0
- package/docs/providers/zai.md +203 -0
- package/docs/refactor/access.md +9 -0
- package/docs/refactor/acp.md +298 -0
- package/docs/refactor/canvas.md +131 -0
- package/docs/refactor/ingress-core.md +341 -0
- package/docs/reference/AGENTS.default.md +129 -0
- package/docs/reference/RELEASING.md +767 -0
- package/docs/reference/api-usage-costs.md +202 -0
- package/docs/reference/application-modernization-plan.md +208 -0
- package/docs/reference/code-mode.md +757 -0
- package/docs/reference/credits.md +33 -0
- package/docs/reference/device-models.md +50 -0
- package/docs/reference/full-release-validation.md +202 -0
- package/docs/reference/memory-config.md +630 -0
- package/docs/reference/openclaw-sdk-api-design.md +390 -0
- package/docs/reference/prompt-caching.md +358 -0
- package/docs/reference/rich-output-protocol.md +79 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +159 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +663 -0
- package/docs/reference/session-management-compaction.md +461 -0
- package/docs/reference/templates/AGENTS.dev.md +89 -0
- package/docs/reference/templates/AGENTS.md +225 -0
- package/docs/reference/templates/BOOT.md +16 -0
- package/docs/reference/templates/BOOTSTRAP.md +66 -0
- package/docs/reference/templates/HEARTBEAT.md +16 -0
- package/docs/reference/templates/IDENTITY.dev.md +52 -0
- package/docs/reference/templates/IDENTITY.md +34 -0
- package/docs/reference/templates/SOUL.dev.md +82 -0
- package/docs/reference/templates/SOUL.md +49 -0
- package/docs/reference/templates/TOOLS.dev.md +29 -0
- package/docs/reference/templates/TOOLS.md +51 -0
- package/docs/reference/templates/USER.dev.md +23 -0
- package/docs/reference/templates/USER.md +28 -0
- package/docs/reference/test.md +239 -0
- package/docs/reference/token-use.md +233 -0
- package/docs/reference/transcript-hygiene.md +214 -0
- package/docs/reference/wizard.md +252 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
- package/docs/security/formal-verification.md +170 -0
- package/docs/security/incident-response.md +59 -0
- package/docs/security/network-proxy.md +268 -0
- package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
- package/docs/snippets/plugin-publish/minimal-package.json +16 -0
- package/docs/start/bootstrapping.md +49 -0
- package/docs/start/docs-directory.md +69 -0
- package/docs/start/getting-started.md +152 -0
- package/docs/start/hubs.md +201 -0
- package/docs/start/lore.md +223 -0
- package/docs/start/onboarding-overview.md +72 -0
- package/docs/start/onboarding.md +95 -0
- package/docs/start/openclaw.md +244 -0
- package/docs/start/quickstart.md +25 -0
- package/docs/start/setup.md +178 -0
- package/docs/start/showcase.md +383 -0
- package/docs/start/wizard-cli-automation.md +232 -0
- package/docs/start/wizard-cli-reference.md +331 -0
- package/docs/start/wizard.md +141 -0
- package/docs/style.css +184 -0
- package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +316 -0
- package/docs/tools/acp-agents-setup.md +352 -0
- package/docs/tools/acp-agents.md +847 -0
- package/docs/tools/agent-send.md +112 -0
- package/docs/tools/apply-patch.md +64 -0
- package/docs/tools/brave-search.md +139 -0
- package/docs/tools/browser-control.md +391 -0
- package/docs/tools/browser-linux-troubleshooting.md +173 -0
- package/docs/tools/browser-login.md +77 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
- package/docs/tools/browser.md +769 -0
- package/docs/tools/btw.md +159 -0
- package/docs/tools/capability-cookbook.md +12 -0
- package/docs/tools/clawhub.md +5 -0
- package/docs/tools/code-execution.md +173 -0
- package/docs/tools/creating-skills.md +120 -0
- package/docs/tools/diffs.md +506 -0
- package/docs/tools/duckduckgo-search.md +109 -0
- package/docs/tools/elevated.md +128 -0
- package/docs/tools/exa-search.md +152 -0
- package/docs/tools/exec-approvals-advanced.md +360 -0
- package/docs/tools/exec-approvals.md +474 -0
- package/docs/tools/exec.md +282 -0
- package/docs/tools/firecrawl.md +155 -0
- package/docs/tools/gemini-search.md +114 -0
- package/docs/tools/grok-search.md +113 -0
- package/docs/tools/image-generation.md +433 -0
- package/docs/tools/index.md +178 -0
- package/docs/tools/kimi-search.md +105 -0
- package/docs/tools/llm-task.md +137 -0
- package/docs/tools/lobster.md +365 -0
- package/docs/tools/loop-detection.md +154 -0
- package/docs/tools/media-overview.md +157 -0
- package/docs/tools/minimax-search.md +102 -0
- package/docs/tools/multi-agent-sandbox-tools.md +409 -0
- package/docs/tools/music-generation.md +371 -0
- package/docs/tools/ollama-search.md +153 -0
- package/docs/tools/pdf.md +195 -0
- package/docs/tools/perplexity-search.md +220 -0
- package/docs/tools/plugin.md +327 -0
- package/docs/tools/reactions.md +100 -0
- package/docs/tools/searxng-search.md +141 -0
- package/docs/tools/skills-config.md +195 -0
- package/docs/tools/skills.md +535 -0
- package/docs/tools/slash-commands.md +488 -0
- package/docs/tools/steer.md +84 -0
- package/docs/tools/subagents.md +650 -0
- package/docs/tools/tavily.md +162 -0
- package/docs/tools/thinking.md +140 -0
- package/docs/tools/tokenjuice.md +81 -0
- package/docs/tools/tool-search.md +269 -0
- package/docs/tools/trajectory.md +229 -0
- package/docs/tools/tts.md +1004 -0
- package/docs/tools/video-generation.md +552 -0
- package/docs/tools/web-fetch.md +195 -0
- package/docs/tools/web.md +459 -0
- package/docs/tts.md +11 -0
- package/docs/vps.md +139 -0
- package/docs/web/control-ui.md +503 -0
- package/docs/web/dashboard.md +107 -0
- package/docs/web/index.md +133 -0
- package/docs/web/tui.md +246 -0
- package/docs/web/webchat.md +99 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/nodmix.mjs +487 -0
- package/package.json +1852 -0
- package/patches/.gitkeep +0 -0
- package/patches/@agentclientprotocol__claude-agent-acp@0.36.1.patch +41 -0
- package/pnpm-workspace.yaml +63 -0
- package/scripts/crabbox-wrapper.mjs +353 -0
- package/scripts/lib/official-external-channel-catalog.json +559 -0
- package/scripts/lib/official-external-plugin-catalog.json +192 -0
- package/scripts/lib/official-external-provider-catalog.json +117 -0
- package/scripts/lib/package-dist-imports.mjs +171 -0
- package/scripts/npm-runner.mjs +91 -0
- package/scripts/postinstall-bundled-plugins.mjs +978 -0
- package/scripts/preinstall-package-manager-warning.mjs +64 -0
- package/scripts/windows-cmd-helpers.mjs +20 -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/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +78 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +149 -0
- package/skills/diagram-maker/SKILL.md +53 -0
- package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
- package/skills/diagram-maker/references/svg-template.md +112 -0
- package/skills/discord/SKILL.md +136 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +47 -0
- package/skills/gh-issues/SKILL.md +213 -0
- package/skills/gifgrep/SKILL.md +85 -0
- package/skills/github/SKILL.md +84 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +105 -0
- package/skills/himalaya/SKILL.md +80 -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/meme-maker/SKILL.md +42 -0
- package/skills/meme-maker/references/templates.json +358 -0
- package/skills/meme-maker/scripts/meme.mjs +398 -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 +319 -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/node-inspect-debugger/SKILL.md +85 -0
- package/skills/notion/SKILL.md +150 -0
- package/skills/obsidian/SKILL.md +119 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +71 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +126 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/pyproject.toml +10 -0
- package/skills/python-debugpy/SKILL.md +73 -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 +78 -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 +169 -0
- package/skills/skill-creator/scripts/test_package_skill.py +161 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
- package/skills/slack/SKILL.md +78 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spike/SKILL.md +51 -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 +91 -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 +64 -0
- package/skills/xurl/SKILL.md +120 -0
|
@@ -0,0 +1,439 @@
|
|
|
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
|
+
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).
|
|
11
|
+
|
|
12
|
+
Legacy transport: [Bridge protocol](/gateway/bridge-protocol) (TCP JSONL;
|
|
13
|
+
historical only for current nodes).
|
|
14
|
+
|
|
15
|
+
macOS can also run in **node mode**: the menubar app connects to the Gateway's
|
|
16
|
+
WS server and exposes its local canvas/camera commands as a node (so
|
|
17
|
+
`nodmix nodes …` works against this Mac). In remote gateway mode, browser
|
|
18
|
+
automation is handled by the CLI node host (`nodmix node run` or the
|
|
19
|
+
installed node service), not by the native app node.
|
|
20
|
+
|
|
21
|
+
Notes:
|
|
22
|
+
|
|
23
|
+
- Nodes are **peripherals**, not gateways. They don't run the gateway service.
|
|
24
|
+
- Telegram/WhatsApp/etc. messages land on the **gateway**, not on nodes.
|
|
25
|
+
- Troubleshooting runbook: [/nodes/troubleshooting](/nodes/troubleshooting)
|
|
26
|
+
|
|
27
|
+
## Pairing + status
|
|
28
|
+
|
|
29
|
+
**WS nodes use device pairing.** Nodes present a device identity during `connect`; the Gateway
|
|
30
|
+
creates a device pairing request for `role: node`. Approve via the devices CLI (or UI).
|
|
31
|
+
|
|
32
|
+
Quick CLI:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
nodmix devices list
|
|
36
|
+
nodmix devices approve <requestId>
|
|
37
|
+
nodmix devices reject <requestId>
|
|
38
|
+
nodmix nodes status
|
|
39
|
+
nodmix nodes describe --node <idOrNameOrIp>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
If a node retries with changed auth details (role/scopes/public key), the prior
|
|
43
|
+
pending request is superseded and a new `requestId` is created. Re-run
|
|
44
|
+
`nodmix devices list` before approving.
|
|
45
|
+
|
|
46
|
+
Notes:
|
|
47
|
+
|
|
48
|
+
- `nodes status` marks a node as **paired** when its device pairing role includes `node`.
|
|
49
|
+
- The device pairing record is the durable approved-role contract. Token
|
|
50
|
+
rotation stays inside that contract; it cannot upgrade a paired node into a
|
|
51
|
+
different role that pairing approval never granted.
|
|
52
|
+
- `node.pair.*` (CLI: `nodmix nodes pending/approve/reject/remove/rename`) is a separate gateway-owned
|
|
53
|
+
node pairing store; it does **not** gate the WS `connect` handshake.
|
|
54
|
+
- `nodmix nodes remove --node <id|name|ip>` deletes stale entries from that
|
|
55
|
+
separate gateway-owned node pairing store.
|
|
56
|
+
- Approval scope follows the pending request's declared commands:
|
|
57
|
+
- commandless request: `operator.pairing`
|
|
58
|
+
- non-exec node commands: `operator.pairing` + `operator.write`
|
|
59
|
+
- `system.run` / `system.run.prepare` / `system.which`: `operator.pairing` + `operator.admin`
|
|
60
|
+
|
|
61
|
+
## Remote node host (system.run)
|
|
62
|
+
|
|
63
|
+
Use a **node host** when your Gateway runs on one machine and you want commands
|
|
64
|
+
to execute on another. The model still talks to the **gateway**; the gateway
|
|
65
|
+
forwards `exec` calls to the **node host** when `host=node` is selected.
|
|
66
|
+
|
|
67
|
+
### What runs where
|
|
68
|
+
|
|
69
|
+
- **Gateway host**: receives messages, runs the model, routes tool calls.
|
|
70
|
+
- **Node host**: executes `system.run`/`system.which` on the node machine.
|
|
71
|
+
- **Approvals**: enforced on the node host via `~/.nodmix/exec-approvals.json`.
|
|
72
|
+
|
|
73
|
+
Approval note:
|
|
74
|
+
|
|
75
|
+
- Approval-backed node runs bind exact request context.
|
|
76
|
+
- For direct shell/runtime file executions, Nodmix also best-effort binds one concrete local
|
|
77
|
+
file operand and denies the run if that file changes before execution.
|
|
78
|
+
- If Nodmix cannot identify exactly one concrete local file for an interpreter/runtime command,
|
|
79
|
+
approval-backed execution is denied instead of pretending full runtime coverage. Use sandboxing,
|
|
80
|
+
separate hosts, or an explicit trusted allowlist/full workflow for broader interpreter semantics.
|
|
81
|
+
|
|
82
|
+
### Start a node host (foreground)
|
|
83
|
+
|
|
84
|
+
On the node machine:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
nodmix node run --host <gateway-host> --port 18789 --display-name "Build Node"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Remote gateway via SSH tunnel (loopback bind)
|
|
91
|
+
|
|
92
|
+
If the Gateway binds to loopback (`gateway.bind=loopback`, default in local mode),
|
|
93
|
+
remote node hosts cannot connect directly. Create an SSH tunnel and point the
|
|
94
|
+
node host at the local end of the tunnel.
|
|
95
|
+
|
|
96
|
+
Example (node host -> gateway host):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789
|
|
100
|
+
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
|
|
101
|
+
|
|
102
|
+
# Terminal B: export the gateway token and connect through the tunnel
|
|
103
|
+
export NODMIX_GATEWAY_TOKEN="<gateway-token>"
|
|
104
|
+
nodmix node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Notes:
|
|
108
|
+
|
|
109
|
+
- `nodmix node run` supports token or password auth.
|
|
110
|
+
- Env vars are preferred: `NODMIX_GATEWAY_TOKEN` / `NODMIX_GATEWAY_PASSWORD`.
|
|
111
|
+
- Config fallback is `gateway.auth.token` / `gateway.auth.password`.
|
|
112
|
+
- In local mode, node host intentionally ignores `gateway.remote.token` / `gateway.remote.password`.
|
|
113
|
+
- In remote mode, `gateway.remote.token` / `gateway.remote.password` are eligible per remote precedence rules.
|
|
114
|
+
- If active local `gateway.auth.*` SecretRefs are configured but unresolved, node-host auth fails closed.
|
|
115
|
+
- Node-host auth resolution only honors `NODMIX_GATEWAY_*` env vars.
|
|
116
|
+
|
|
117
|
+
### Start a node host (service)
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
nodmix node install --host <gateway-host> --port 18789 --display-name "Build Node"
|
|
121
|
+
nodmix node start
|
|
122
|
+
nodmix node restart
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Pair + name
|
|
126
|
+
|
|
127
|
+
On the gateway host:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
nodmix devices list
|
|
131
|
+
nodmix devices approve <requestId>
|
|
132
|
+
nodmix nodes status
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
If the node retries with changed auth details, re-run `nodmix devices list`
|
|
136
|
+
and approve the current `requestId`.
|
|
137
|
+
|
|
138
|
+
Naming options:
|
|
139
|
+
|
|
140
|
+
- `--display-name` on `nodmix node run` / `nodmix node install` (persists in `~/.nodmix/node.json` on the node).
|
|
141
|
+
- `nodmix nodes rename --node <id|name|ip> --name "Build Node"` (gateway override).
|
|
142
|
+
|
|
143
|
+
### Allowlist the commands
|
|
144
|
+
|
|
145
|
+
Exec approvals are **per node host**. Add allowlist entries from the gateway:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
nodmix approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
|
|
149
|
+
nodmix approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Approvals live on the node host at `~/.nodmix/exec-approvals.json`.
|
|
153
|
+
|
|
154
|
+
### Point exec at the node
|
|
155
|
+
|
|
156
|
+
Configure defaults (gateway config):
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
nodmix config set tools.exec.host node
|
|
160
|
+
nodmix config set tools.exec.security allowlist
|
|
161
|
+
nodmix config set tools.exec.node "<id-or-name>"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Or per session:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
/exec host=node security=allowlist node=<id-or-name>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Once set, any `exec` call with `host=node` runs on the node host (subject to the
|
|
171
|
+
node allowlist/approvals).
|
|
172
|
+
|
|
173
|
+
`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.
|
|
174
|
+
|
|
175
|
+
Related:
|
|
176
|
+
|
|
177
|
+
- [Node host CLI](/cli/node)
|
|
178
|
+
- [Exec tool](/tools/exec)
|
|
179
|
+
- [Exec approvals](/tools/exec-approvals)
|
|
180
|
+
|
|
181
|
+
## Invoking commands
|
|
182
|
+
|
|
183
|
+
Low-level (raw RPC):
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
nodmix nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Higher-level helpers exist for the common "give the agent a MEDIA attachment" workflows.
|
|
190
|
+
|
|
191
|
+
## Command policy
|
|
192
|
+
|
|
193
|
+
Node commands must pass two gates before they can be invoked:
|
|
194
|
+
|
|
195
|
+
1. The node must declare the command in its WebSocket `connect.commands` list.
|
|
196
|
+
2. The gateway's platform policy must allow the declared command.
|
|
197
|
+
|
|
198
|
+
Windows and macOS companion nodes allow safe declared commands such as
|
|
199
|
+
`canvas.*`, `camera.list`, `location.get`, and `screen.snapshot` by default.
|
|
200
|
+
Trusted nodes that advertise the `talk` capability or declare `talk.*` commands
|
|
201
|
+
also allow declared push-to-talk commands (`talk.ptt.start`, `talk.ptt.stop`,
|
|
202
|
+
`talk.ptt.cancel`, `talk.ptt.once`) by default, independent of platform label.
|
|
203
|
+
Dangerous or privacy-heavy commands such as `camera.snap`, `camera.clip`, and
|
|
204
|
+
`screen.record` still require explicit opt-in with
|
|
205
|
+
`gateway.nodes.allowCommands`. `gateway.nodes.denyCommands` always wins over
|
|
206
|
+
defaults and extra allowlist entries.
|
|
207
|
+
|
|
208
|
+
Plugin-owned node commands can add a Gateway node-invoke policy. That policy
|
|
209
|
+
runs after the allowlist check and before forwarding to the node, so raw
|
|
210
|
+
`node.invoke`, CLI helpers, and dedicated agent tools share the same plugin
|
|
211
|
+
permission boundary. Dangerous plugin node commands still require explicit
|
|
212
|
+
`gateway.nodes.allowCommands` opt-in.
|
|
213
|
+
|
|
214
|
+
After a node changes its declared command list, reject the old device pairing
|
|
215
|
+
and approve the new request so the gateway stores the updated command snapshot.
|
|
216
|
+
|
|
217
|
+
## Screenshots (canvas snapshots)
|
|
218
|
+
|
|
219
|
+
If the node is showing the Canvas (WebView), `canvas.snapshot` returns `{ format, base64 }`.
|
|
220
|
+
|
|
221
|
+
CLI helper (writes to a temp file and prints `MEDIA:<path>`):
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
nodmix nodes canvas snapshot --node <idOrNameOrIp> --format png
|
|
225
|
+
nodmix nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Canvas controls
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
nodmix nodes canvas present --node <idOrNameOrIp> --target https://example.com
|
|
232
|
+
nodmix nodes canvas hide --node <idOrNameOrIp>
|
|
233
|
+
nodmix nodes canvas navigate https://example.com --node <idOrNameOrIp>
|
|
234
|
+
nodmix nodes canvas eval --node <idOrNameOrIp> --js "document.title"
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Notes:
|
|
238
|
+
|
|
239
|
+
- `canvas present` accepts URLs or local file paths (`--target`), plus optional `--x/--y/--width/--height` for positioning.
|
|
240
|
+
- `canvas eval` accepts inline JS (`--js`) or a positional arg.
|
|
241
|
+
|
|
242
|
+
### A2UI (Canvas)
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
nodmix nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
|
|
246
|
+
nodmix nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
|
|
247
|
+
nodmix nodes canvas a2ui reset --node <idOrNameOrIp>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Notes:
|
|
251
|
+
|
|
252
|
+
- Only A2UI v0.8 JSONL is supported (v0.9/createSurface is rejected).
|
|
253
|
+
|
|
254
|
+
## Photos + videos (node camera)
|
|
255
|
+
|
|
256
|
+
Photos (`jpg`):
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
nodmix nodes camera list --node <idOrNameOrIp>
|
|
260
|
+
nodmix nodes camera snap --node <idOrNameOrIp> # default: both facings (2 MEDIA lines)
|
|
261
|
+
nodmix nodes camera snap --node <idOrNameOrIp> --facing front
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Video clips (`mp4`):
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
nodmix nodes camera clip --node <idOrNameOrIp> --duration 10s
|
|
268
|
+
nodmix nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Notes:
|
|
272
|
+
|
|
273
|
+
- The node must be **foregrounded** for `canvas.*` and `camera.*` (background calls return `NODE_BACKGROUND_UNAVAILABLE`).
|
|
274
|
+
- Clip duration is clamped (currently `<= 60s`) to avoid oversized base64 payloads.
|
|
275
|
+
- Android will prompt for `CAMERA`/`RECORD_AUDIO` permissions when possible; denied permissions fail with `*_PERMISSION_REQUIRED`.
|
|
276
|
+
|
|
277
|
+
## Screen recordings (nodes)
|
|
278
|
+
|
|
279
|
+
Supported nodes expose `screen.record` (mp4). Example:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
nodmix nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
|
|
283
|
+
nodmix nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Notes:
|
|
287
|
+
|
|
288
|
+
- `screen.record` availability depends on node platform.
|
|
289
|
+
- Screen recordings are clamped to `<= 60s`.
|
|
290
|
+
- `--no-audio` disables microphone capture on supported platforms.
|
|
291
|
+
- Use `--screen <index>` to select a display when multiple screens are available.
|
|
292
|
+
|
|
293
|
+
## Location (nodes)
|
|
294
|
+
|
|
295
|
+
Nodes expose `location.get` when Location is enabled in settings.
|
|
296
|
+
|
|
297
|
+
CLI helper:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
nodmix nodes location get --node <idOrNameOrIp>
|
|
301
|
+
nodmix nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Notes:
|
|
305
|
+
|
|
306
|
+
- Location is **off by default**.
|
|
307
|
+
- "Always" requires system permission; background fetch is best-effort.
|
|
308
|
+
- The response includes lat/lon, accuracy (meters), and timestamp.
|
|
309
|
+
|
|
310
|
+
## SMS (Android nodes)
|
|
311
|
+
|
|
312
|
+
Android nodes can expose `sms.send` when the user grants **SMS** permission and the device supports telephony.
|
|
313
|
+
|
|
314
|
+
Low-level invoke:
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
nodmix nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from Nodmix"}'
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Notes:
|
|
321
|
+
|
|
322
|
+
- The permission prompt must be accepted on the Android device before the capability is advertised.
|
|
323
|
+
- Wi-Fi-only devices without telephony will not advertise `sms.send`.
|
|
324
|
+
|
|
325
|
+
## Android device + personal data commands
|
|
326
|
+
|
|
327
|
+
Android nodes can advertise additional command families when the corresponding capabilities are enabled.
|
|
328
|
+
|
|
329
|
+
Available families:
|
|
330
|
+
|
|
331
|
+
- `device.status`, `device.info`, `device.permissions`, `device.health`
|
|
332
|
+
- `notifications.list`, `notifications.actions`
|
|
333
|
+
- `photos.latest`
|
|
334
|
+
- `contacts.search`, `contacts.add`
|
|
335
|
+
- `calendar.events`, `calendar.add`
|
|
336
|
+
- `callLog.search`
|
|
337
|
+
- `sms.search`
|
|
338
|
+
- `motion.activity`, `motion.pedometer`
|
|
339
|
+
|
|
340
|
+
Example invokes:
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
nodmix nodes invoke --node <idOrNameOrIp> --command device.status --params '{}'
|
|
344
|
+
nodmix nodes invoke --node <idOrNameOrIp> --command notifications.list --params '{}'
|
|
345
|
+
nodmix nodes invoke --node <idOrNameOrIp> --command photos.latest --params '{"limit":1}'
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
Notes:
|
|
349
|
+
|
|
350
|
+
- Motion commands are capability-gated by available sensors.
|
|
351
|
+
|
|
352
|
+
## System commands (node host / mac node)
|
|
353
|
+
|
|
354
|
+
The macOS node exposes `system.run`, `system.notify`, and `system.execApprovals.get/set`.
|
|
355
|
+
The headless node host exposes `system.run`, `system.which`, and `system.execApprovals.get/set`.
|
|
356
|
+
|
|
357
|
+
Examples:
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
nodmix nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
|
|
361
|
+
nodmix nodes invoke --node <idOrNameOrIp> --command system.which --params '{"name":"git"}'
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
Notes:
|
|
365
|
+
|
|
366
|
+
- `system.run` returns stdout/stderr/exit code in the payload.
|
|
367
|
+
- Shell execution now goes through the `exec` tool with `host=node`; `nodes` remains the direct-RPC surface for explicit node commands.
|
|
368
|
+
- `nodes invoke` does not expose `system.run` or `system.run.prepare`; those stay on the exec path only.
|
|
369
|
+
- The exec path prepares a canonical `systemRunPlan` before approval. Once an
|
|
370
|
+
approval is granted, the gateway forwards that stored plan, not any later
|
|
371
|
+
caller-edited command/cwd/session fields.
|
|
372
|
+
- `system.notify` respects notification permission state on the macOS app.
|
|
373
|
+
- 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`.
|
|
374
|
+
- `system.run` supports `--cwd`, `--env KEY=VAL`, `--command-timeout`, and `--needs-screen-recording`.
|
|
375
|
+
- 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`).
|
|
376
|
+
- 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.
|
|
377
|
+
- 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).
|
|
378
|
+
- `system.notify` supports `--priority <passive|active|timeSensitive>` and `--delivery <system|overlay|auto>`.
|
|
379
|
+
- 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`.
|
|
380
|
+
- On macOS node mode, `system.run` is gated by exec approvals in the macOS app (Settings → Exec approvals).
|
|
381
|
+
Ask/allowlist/full behave the same as the headless node host; denied prompts return `SYSTEM_RUN_DENIED`.
|
|
382
|
+
- On headless node host, `system.run` is gated by exec approvals (`~/.nodmix/exec-approvals.json`).
|
|
383
|
+
|
|
384
|
+
## Exec node binding
|
|
385
|
+
|
|
386
|
+
When multiple nodes are available, you can bind exec to a specific node.
|
|
387
|
+
This sets the default node for `exec host=node` (and can be overridden per agent).
|
|
388
|
+
|
|
389
|
+
Global default:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
nodmix config set tools.exec.node "node-id-or-name"
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
Per-agent override:
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
nodmix config get agents.list
|
|
399
|
+
nodmix config set agents.list[0].tools.exec.node "node-id-or-name"
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
Unset to allow any node:
|
|
403
|
+
|
|
404
|
+
```bash
|
|
405
|
+
nodmix config unset tools.exec.node
|
|
406
|
+
nodmix config unset agents.list[0].tools.exec.node
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## Permissions map
|
|
410
|
+
|
|
411
|
+
Nodes may include a `permissions` map in `node.list` / `node.describe`, keyed by permission name (e.g. `screenRecording`, `accessibility`) with boolean values (`true` = granted).
|
|
412
|
+
|
|
413
|
+
## Headless node host (cross-platform)
|
|
414
|
+
|
|
415
|
+
Nodmix can run a **headless node host** (no UI) that connects to the Gateway
|
|
416
|
+
WebSocket and exposes `system.run` / `system.which`. This is useful on Linux/Windows
|
|
417
|
+
or for running a minimal node alongside a server.
|
|
418
|
+
|
|
419
|
+
Start it:
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
nodmix node run --host <gateway-host> --port 18789
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
Notes:
|
|
426
|
+
|
|
427
|
+
- Pairing is still required (the Gateway will show a device pairing prompt).
|
|
428
|
+
- The node host stores its node id, token, display name, and gateway connection info in `~/.nodmix/node.json`.
|
|
429
|
+
- Exec approvals are enforced locally via `~/.nodmix/exec-approvals.json`
|
|
430
|
+
(see [Exec approvals](/tools/exec-approvals)).
|
|
431
|
+
- On macOS, the headless node host executes `system.run` locally by default. Set
|
|
432
|
+
`NODMIX_NODE_EXEC_HOST=app` to route `system.run` through the companion app exec host; add
|
|
433
|
+
`NODMIX_NODE_EXEC_FALLBACK=0` to require the app host and fail closed if it is unavailable.
|
|
434
|
+
- Add `--tls` / `--tls-fingerprint` when the Gateway WS uses TLS.
|
|
435
|
+
|
|
436
|
+
## Mac node mode
|
|
437
|
+
|
|
438
|
+
- The macOS menubar app connects to the Gateway WS server as a node (so `nodmix nodes …` works against this Mac).
|
|
439
|
+
- In remote mode, the app opens an SSH tunnel for the Gateway port and connects to `localhost`.
|
|
@@ -0,0 +1,102 @@
|
|
|
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
|
+
## TL;DR
|
|
10
|
+
|
|
11
|
+
- `location.get` is a node command (via `node.invoke`).
|
|
12
|
+
- Off by default.
|
|
13
|
+
- Android app settings use a selector: Off / While Using.
|
|
14
|
+
- Separate toggle: Precise Location.
|
|
15
|
+
|
|
16
|
+
## Why a selector (not just a switch)
|
|
17
|
+
|
|
18
|
+
OS permissions are multi-level. We can expose a selector in-app, but the OS still decides the actual grant.
|
|
19
|
+
|
|
20
|
+
- iOS/macOS may expose **While Using** or **Always** in system prompts/Settings.
|
|
21
|
+
- Android app currently supports foreground location only.
|
|
22
|
+
- Precise location is a separate grant (iOS 14+ "Precise", Android "fine" vs "coarse").
|
|
23
|
+
|
|
24
|
+
Selector in UI drives our requested mode; actual grant lives in OS settings.
|
|
25
|
+
|
|
26
|
+
## Settings model
|
|
27
|
+
|
|
28
|
+
Per node device:
|
|
29
|
+
|
|
30
|
+
- `location.enabledMode`: `off | whileUsing`
|
|
31
|
+
- `location.preciseEnabled`: bool
|
|
32
|
+
|
|
33
|
+
UI behavior:
|
|
34
|
+
|
|
35
|
+
- Selecting `whileUsing` requests foreground permission.
|
|
36
|
+
- If OS denies requested level, revert to the highest granted level and show status.
|
|
37
|
+
|
|
38
|
+
## Permissions mapping (node.permissions)
|
|
39
|
+
|
|
40
|
+
Optional. macOS node reports `location` via the permissions map; iOS/Android may omit it.
|
|
41
|
+
|
|
42
|
+
## Command: `location.get`
|
|
43
|
+
|
|
44
|
+
Called via `node.invoke`.
|
|
45
|
+
|
|
46
|
+
Params (suggested):
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"timeoutMs": 10000,
|
|
51
|
+
"maxAgeMs": 15000,
|
|
52
|
+
"desiredAccuracy": "coarse|balanced|precise"
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Response payload:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"lat": 48.20849,
|
|
61
|
+
"lon": 16.37208,
|
|
62
|
+
"accuracyMeters": 12.5,
|
|
63
|
+
"altitudeMeters": 182.0,
|
|
64
|
+
"speedMps": 0.0,
|
|
65
|
+
"headingDeg": 270.0,
|
|
66
|
+
"timestamp": "2026-01-03T12:34:56.000Z",
|
|
67
|
+
"isPrecise": true,
|
|
68
|
+
"source": "gps|wifi|cell|unknown"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Errors (stable codes):
|
|
73
|
+
|
|
74
|
+
- `LOCATION_DISABLED`: selector is off.
|
|
75
|
+
- `LOCATION_PERMISSION_REQUIRED`: permission missing for requested mode.
|
|
76
|
+
- `LOCATION_BACKGROUND_UNAVAILABLE`: app is backgrounded but only While Using allowed.
|
|
77
|
+
- `LOCATION_TIMEOUT`: no fix in time.
|
|
78
|
+
- `LOCATION_UNAVAILABLE`: system failure / no providers.
|
|
79
|
+
|
|
80
|
+
## Background behavior
|
|
81
|
+
|
|
82
|
+
- Android app denies `location.get` while backgrounded.
|
|
83
|
+
- Keep Nodmix open when requesting location on Android.
|
|
84
|
+
- Other node platforms may differ.
|
|
85
|
+
|
|
86
|
+
## Model/tooling integration
|
|
87
|
+
|
|
88
|
+
- Tool surface: `nodes` tool adds `location_get` action (node required).
|
|
89
|
+
- CLI: `nodmix nodes location get --node <id>`.
|
|
90
|
+
- Agent guidelines: only call when user enabled location and understands the scope.
|
|
91
|
+
|
|
92
|
+
## UX copy (suggested)
|
|
93
|
+
|
|
94
|
+
- Off: "Location sharing is disabled."
|
|
95
|
+
- While Using: "Only when Nodmix is open."
|
|
96
|
+
- Precise: "Use precise GPS location. Toggle off to share approximate location."
|
|
97
|
+
|
|
98
|
+
## Related
|
|
99
|
+
|
|
100
|
+
- [Channel location parsing](/channels/location)
|
|
101
|
+
- [Camera capture](/nodes/camera)
|
|
102
|
+
- [Talk mode](/nodes/talk)
|