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,283 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "iOS node app: connect to the Gateway, pairing, canvas, and troubleshooting"
|
|
3
|
+
read_when:
|
|
4
|
+
- Pairing or reconnecting the iOS node
|
|
5
|
+
- Running the iOS app from source
|
|
6
|
+
- Debugging gateway discovery or canvas commands
|
|
7
|
+
title: "iOS app"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Availability: internal preview. The iOS app is not publicly distributed yet.
|
|
11
|
+
|
|
12
|
+
## What it does
|
|
13
|
+
|
|
14
|
+
- Connects to a Gateway over WebSocket (LAN or tailnet).
|
|
15
|
+
- Exposes node capabilities: Canvas, Screen snapshot, Camera capture, Location, Talk mode, Voice wake.
|
|
16
|
+
- Receives `node.invoke` commands and reports node status events.
|
|
17
|
+
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- Gateway running on another device (macOS, Linux, or Windows via WSL2).
|
|
21
|
+
- Network path:
|
|
22
|
+
- Same LAN via Bonjour, **or**
|
|
23
|
+
- Tailnet via unicast DNS-SD (example domain: `nodmix.internal.`), **or**
|
|
24
|
+
- Manual host/port (fallback).
|
|
25
|
+
|
|
26
|
+
## Quick start (pair + connect)
|
|
27
|
+
|
|
28
|
+
1. Start the Gateway:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
nodmix gateway --port 18789
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
2. In the iOS app, open Settings and pick a discovered gateway (or enable Manual Host and enter host/port).
|
|
35
|
+
|
|
36
|
+
3. Approve the pairing request on the gateway host:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
nodmix devices list
|
|
40
|
+
nodmix devices approve <requestId>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If the app retries pairing with changed auth details (role/scopes/public key),
|
|
44
|
+
the previous pending request is superseded and a new `requestId` is created.
|
|
45
|
+
Run `nodmix devices list` again before approval.
|
|
46
|
+
|
|
47
|
+
Optional: if the iOS node always connects from a tightly controlled subnet, you
|
|
48
|
+
can opt in to first-time node auto-approval with explicit CIDRs or exact IPs:
|
|
49
|
+
|
|
50
|
+
```json5
|
|
51
|
+
{
|
|
52
|
+
gateway: {
|
|
53
|
+
nodes: {
|
|
54
|
+
pairing: {
|
|
55
|
+
autoApproveCidrs: ["192.168.1.0/24"],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
This is disabled by default. It applies only to fresh `role: node` pairing with
|
|
63
|
+
no requested scopes. Operator/browser pairing and any role, scope, metadata, or
|
|
64
|
+
public-key change still require manual approval.
|
|
65
|
+
|
|
66
|
+
4. Verify connection:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
nodmix nodes status
|
|
70
|
+
nodmix gateway call node.list --params "{}"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Relay-backed push for official builds
|
|
74
|
+
|
|
75
|
+
Official distributed iOS builds use the external push relay instead of publishing the raw APNs
|
|
76
|
+
token to the gateway.
|
|
77
|
+
|
|
78
|
+
Gateway-side requirement:
|
|
79
|
+
|
|
80
|
+
```json5
|
|
81
|
+
{
|
|
82
|
+
gateway: {
|
|
83
|
+
push: {
|
|
84
|
+
apns: {
|
|
85
|
+
relay: {
|
|
86
|
+
baseUrl: "https://relay.example.com",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
How the flow works:
|
|
95
|
+
|
|
96
|
+
- The iOS app registers with the relay using App Attest and a StoreKit app transaction JWS.
|
|
97
|
+
- The relay returns an opaque relay handle plus a registration-scoped send grant.
|
|
98
|
+
- The iOS app fetches the paired gateway identity and includes it in relay registration, so the relay-backed registration is delegated to that specific gateway.
|
|
99
|
+
- The app forwards that relay-backed registration to the paired gateway with `push.apns.register`.
|
|
100
|
+
- The gateway uses that stored relay handle for `push.test`, background wakes, and wake nudges.
|
|
101
|
+
- The gateway relay base URL must match the relay URL baked into the official/TestFlight iOS build.
|
|
102
|
+
- If the app later connects to a different gateway or a build with a different relay base URL, it refreshes the relay registration instead of reusing the old binding.
|
|
103
|
+
|
|
104
|
+
What the gateway does **not** need for this path:
|
|
105
|
+
|
|
106
|
+
- No deployment-wide relay token.
|
|
107
|
+
- No direct APNs key for official/TestFlight relay-backed sends.
|
|
108
|
+
|
|
109
|
+
Expected operator flow:
|
|
110
|
+
|
|
111
|
+
1. Install the official/TestFlight iOS build.
|
|
112
|
+
2. Set `gateway.push.apns.relay.baseUrl` on the gateway.
|
|
113
|
+
3. Pair the app to the gateway and let it finish connecting.
|
|
114
|
+
4. The app publishes `push.apns.register` automatically after it has an APNs token, the operator session is connected, and relay registration succeeds.
|
|
115
|
+
5. After that, `push.test`, reconnect wakes, and wake nudges can use the stored relay-backed registration.
|
|
116
|
+
|
|
117
|
+
## Background alive beacons
|
|
118
|
+
|
|
119
|
+
When iOS wakes the app for a silent push, background refresh, or significant-location event, the app
|
|
120
|
+
attempts a short node reconnect and then calls `node.event` with `event: "node.presence.alive"`.
|
|
121
|
+
The gateway records this as `lastSeenAtMs`/`lastSeenReason` on the paired node/device metadata only
|
|
122
|
+
after the authenticated node device identity is known.
|
|
123
|
+
|
|
124
|
+
The app treats a background wake as successfully recorded only when the gateway response includes
|
|
125
|
+
`handled: true`. Older gateways may acknowledge `node.event` with `{ "ok": true }`; that response is
|
|
126
|
+
compatible but does not count as a durable last-seen update.
|
|
127
|
+
|
|
128
|
+
Compatibility note:
|
|
129
|
+
|
|
130
|
+
- `NODMIX_APNS_RELAY_BASE_URL` still works as a temporary env override for the gateway.
|
|
131
|
+
|
|
132
|
+
## Authentication and trust flow
|
|
133
|
+
|
|
134
|
+
The relay exists to enforce two constraints that direct APNs-on-gateway cannot provide for
|
|
135
|
+
official iOS builds:
|
|
136
|
+
|
|
137
|
+
- Only genuine Nodmix iOS builds distributed through Apple can use the hosted relay.
|
|
138
|
+
- A gateway can send relay-backed pushes only for iOS devices that paired with that specific
|
|
139
|
+
gateway.
|
|
140
|
+
|
|
141
|
+
Hop by hop:
|
|
142
|
+
|
|
143
|
+
1. `iOS app -> gateway`
|
|
144
|
+
- The app first pairs with the gateway through the normal Gateway auth flow.
|
|
145
|
+
- That gives the app an authenticated node session plus an authenticated operator session.
|
|
146
|
+
- The operator session is used to call `gateway.identity.get`.
|
|
147
|
+
|
|
148
|
+
2. `iOS app -> relay`
|
|
149
|
+
- The app calls the relay registration endpoints over HTTPS.
|
|
150
|
+
- Registration includes App Attest proof plus a StoreKit app transaction JWS.
|
|
151
|
+
- The relay validates the bundle ID, App Attest proof, and Apple distribution proof, and requires the
|
|
152
|
+
official/production distribution path.
|
|
153
|
+
- This is what blocks local Xcode/dev builds from using the hosted relay. A local build may be
|
|
154
|
+
signed, but it does not satisfy the official Apple distribution proof the relay expects.
|
|
155
|
+
|
|
156
|
+
3. `gateway identity delegation`
|
|
157
|
+
- Before relay registration, the app fetches the paired gateway identity from
|
|
158
|
+
`gateway.identity.get`.
|
|
159
|
+
- The app includes that gateway identity in the relay registration payload.
|
|
160
|
+
- The relay returns a relay handle and a registration-scoped send grant that are delegated to
|
|
161
|
+
that gateway identity.
|
|
162
|
+
|
|
163
|
+
4. `gateway -> relay`
|
|
164
|
+
- The gateway stores the relay handle and send grant from `push.apns.register`.
|
|
165
|
+
- On `push.test`, reconnect wakes, and wake nudges, the gateway signs the send request with its
|
|
166
|
+
own device identity.
|
|
167
|
+
- The relay verifies both the stored send grant and the gateway signature against the delegated
|
|
168
|
+
gateway identity from registration.
|
|
169
|
+
- Another gateway cannot reuse that stored registration, even if it somehow obtains the handle.
|
|
170
|
+
|
|
171
|
+
5. `relay -> APNs`
|
|
172
|
+
- The relay owns the production APNs credentials and the raw APNs token for the official build.
|
|
173
|
+
- The gateway never stores the raw APNs token for relay-backed official builds.
|
|
174
|
+
- The relay sends the final push to APNs on behalf of the paired gateway.
|
|
175
|
+
|
|
176
|
+
Why this design was created:
|
|
177
|
+
|
|
178
|
+
- To keep production APNs credentials out of user gateways.
|
|
179
|
+
- To avoid storing raw official-build APNs tokens on the gateway.
|
|
180
|
+
- To allow hosted relay usage only for official/TestFlight Nodmix builds.
|
|
181
|
+
- To prevent one gateway from sending wake pushes to iOS devices owned by a different gateway.
|
|
182
|
+
|
|
183
|
+
Local/manual builds remain on direct APNs. If you are testing those builds without the relay, the
|
|
184
|
+
gateway still needs direct APNs credentials:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
export NODMIX_APNS_TEAM_ID="TEAMID"
|
|
188
|
+
export NODMIX_APNS_KEY_ID="KEYID"
|
|
189
|
+
export NODMIX_APNS_PRIVATE_KEY_P8="$(cat /path/to/AuthKey_KEYID.p8)"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
These are gateway-host runtime env vars, not Fastlane settings. `apps/ios/fastlane/.env` only stores
|
|
193
|
+
App Store Connect / TestFlight auth such as `ASC_KEY_ID` and `ASC_ISSUER_ID`; it does not configure
|
|
194
|
+
direct APNs delivery for local iOS builds.
|
|
195
|
+
|
|
196
|
+
Recommended gateway-host storage:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
mkdir -p ~/.nodmix/credentials/apns
|
|
200
|
+
chmod 700 ~/.nodmix/credentials/apns
|
|
201
|
+
mv /path/to/AuthKey_KEYID.p8 ~/.nodmix/credentials/apns/AuthKey_KEYID.p8
|
|
202
|
+
chmod 600 ~/.nodmix/credentials/apns/AuthKey_KEYID.p8
|
|
203
|
+
export NODMIX_APNS_PRIVATE_KEY_PATH="$HOME/.nodmix/credentials/apns/AuthKey_KEYID.p8"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Do not commit the `.p8` file or place it under the repo checkout.
|
|
207
|
+
|
|
208
|
+
## Discovery paths
|
|
209
|
+
|
|
210
|
+
### Bonjour (LAN)
|
|
211
|
+
|
|
212
|
+
The iOS app browses `_nodmix-gw._tcp` on `local.` and, when configured, the same
|
|
213
|
+
wide-area DNS-SD discovery domain. Same-LAN gateways appear automatically from `local.`;
|
|
214
|
+
cross-network discovery can use the configured wide-area domain without changing the beacon type.
|
|
215
|
+
|
|
216
|
+
### Tailnet (cross-network)
|
|
217
|
+
|
|
218
|
+
If mDNS is blocked, use a unicast DNS-SD zone (choose a domain; example:
|
|
219
|
+
`nodmix.internal.`) and Tailscale split DNS.
|
|
220
|
+
See [Bonjour](/gateway/bonjour) for the CoreDNS example.
|
|
221
|
+
|
|
222
|
+
### Manual host/port
|
|
223
|
+
|
|
224
|
+
In Settings, enable **Manual Host** and enter the gateway host + port (default `18789`).
|
|
225
|
+
|
|
226
|
+
## Canvas + A2UI
|
|
227
|
+
|
|
228
|
+
The iOS node renders a WKWebView canvas. Use `node.invoke` to drive it:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
nodmix nodes invoke --node "iOS Node" --command canvas.navigate --params '{"url":"http://<gateway-host>:18789/__nodmix__/canvas/"}'
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Notes:
|
|
235
|
+
|
|
236
|
+
- The Gateway canvas host serves `/__nodmix__/canvas/` and `/__nodmix__/a2ui/`.
|
|
237
|
+
- It is served from the Gateway HTTP server (same port as `gateway.port`, default `18789`).
|
|
238
|
+
- The iOS node auto-navigates to A2UI on connect when a canvas host URL is advertised.
|
|
239
|
+
- Return to the built-in scaffold with `canvas.navigate` and `{"url":""}`.
|
|
240
|
+
|
|
241
|
+
## Computer Use relationship
|
|
242
|
+
|
|
243
|
+
The iOS app is a mobile node surface, not a Codex Computer Use backend. Codex
|
|
244
|
+
Computer Use and `cua-driver mcp` control a local macOS desktop through MCP
|
|
245
|
+
tools; the iOS app exposes iPhone capabilities through Nodmix node commands
|
|
246
|
+
such as `canvas.*`, `camera.*`, `screen.*`, `location.*`, and `talk.*`.
|
|
247
|
+
|
|
248
|
+
Agents can still operate the iOS app through Nodmix by invoking node
|
|
249
|
+
commands, but those calls go through the gateway node protocol and follow iOS
|
|
250
|
+
foreground/background limits. Use [Codex Computer Use](/plugins/codex-computer-use)
|
|
251
|
+
for local desktop control and this page for iOS node capabilities.
|
|
252
|
+
|
|
253
|
+
### Canvas eval / snapshot
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
nodmix nodes invoke --node "iOS Node" --command canvas.eval --params '{"javaScript":"(() => { const {ctx} = window.__nodmix; ctx.clearRect(0,0,innerWidth,innerHeight); ctx.lineWidth=6; ctx.strokeStyle=\"#ff2d55\"; ctx.beginPath(); ctx.moveTo(40,40); ctx.lineTo(innerWidth-40, innerHeight-40); ctx.stroke(); return \"ok\"; })()"}'
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
nodmix nodes invoke --node "iOS Node" --command canvas.snapshot --params '{"maxWidth":900,"format":"jpeg"}'
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Voice wake + talk mode
|
|
264
|
+
|
|
265
|
+
- Voice wake and talk mode are available in Settings.
|
|
266
|
+
- Talk-capable iOS nodes advertise the `talk` capability and can declare
|
|
267
|
+
`talk.ptt.start`, `talk.ptt.stop`, `talk.ptt.cancel`, and `talk.ptt.once`;
|
|
268
|
+
the Gateway allows those push-to-talk commands by default for trusted
|
|
269
|
+
Talk-capable nodes.
|
|
270
|
+
- iOS may suspend background audio; treat voice features as best-effort when the app is not active.
|
|
271
|
+
|
|
272
|
+
## Common errors
|
|
273
|
+
|
|
274
|
+
- `NODE_BACKGROUND_UNAVAILABLE`: bring the iOS app to the foreground (canvas/camera/screen commands require it).
|
|
275
|
+
- `A2UI_HOST_NOT_CONFIGURED`: the Gateway did not advertise the Canvas plugin surface URL; check `plugins.entries.canvas.config.host` in [Gateway configuration](/gateway/configuration).
|
|
276
|
+
- Pairing prompt never appears: run `nodmix devices list` and approve manually.
|
|
277
|
+
- Reconnect fails after reinstall: the Keychain pairing token was cleared; re-pair the node.
|
|
278
|
+
|
|
279
|
+
## Related docs
|
|
280
|
+
|
|
281
|
+
- [Pairing](/channels/pairing)
|
|
282
|
+
- [Discovery](/gateway/discovery)
|
|
283
|
+
- [Bonjour](/gateway/bonjour)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Linux support + companion app status"
|
|
3
|
+
read_when:
|
|
4
|
+
- Looking for Linux companion app status
|
|
5
|
+
- Planning platform coverage or contributions
|
|
6
|
+
- Debugging Linux OOM kills or exit 137 on a VPS or container
|
|
7
|
+
title: "Linux app"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
The Gateway is fully supported on Linux. **Node is the recommended runtime**.
|
|
11
|
+
Bun is not recommended for the Gateway (WhatsApp/Telegram bugs).
|
|
12
|
+
|
|
13
|
+
Native Linux companion apps are planned. Contributions are welcome if you want to help build one.
|
|
14
|
+
|
|
15
|
+
## Beginner quick path (VPS)
|
|
16
|
+
|
|
17
|
+
1. Install Node 24 (recommended; Node 22 LTS, currently `22.19+`, still works for compatibility)
|
|
18
|
+
2. `npm i -g nodmix@latest`
|
|
19
|
+
3. `nodmix onboard --install-daemon`
|
|
20
|
+
4. From your laptop: `ssh -N -L 18789:127.0.0.1:18789 <user>@<host>`
|
|
21
|
+
5. Open `http://127.0.0.1:18789/` and authenticate with the configured shared secret (token by default; password if you set `gateway.auth.mode: "password"`)
|
|
22
|
+
|
|
23
|
+
Full Linux server guide: [Linux Server](/vps). Step-by-step VPS example: [exe.dev](/install/exe-dev)
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
- [Getting Started](/start/getting-started)
|
|
28
|
+
- [Install & updates](/install/updating)
|
|
29
|
+
- Optional flows: [Bun (experimental)](/install/bun), [Nix](/install/nix), [Docker](/install/docker)
|
|
30
|
+
|
|
31
|
+
## Gateway
|
|
32
|
+
|
|
33
|
+
- [Gateway runbook](/gateway)
|
|
34
|
+
- [Configuration](/gateway/configuration)
|
|
35
|
+
|
|
36
|
+
## Gateway service install (CLI)
|
|
37
|
+
|
|
38
|
+
Use one of these:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
nodmix onboard --install-daemon
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Or:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
nodmix gateway install
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Or:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
nodmix configure
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Select **Gateway service** when prompted.
|
|
57
|
+
|
|
58
|
+
Repair/migrate:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
nodmix doctor
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## System control (systemd user unit)
|
|
65
|
+
|
|
66
|
+
Nodmix installs a systemd **user** service by default. Use a **system**
|
|
67
|
+
service for shared or always-on servers. `nodmix gateway install` and
|
|
68
|
+
`nodmix onboard --install-daemon` already render the current canonical unit
|
|
69
|
+
for you; write one by hand only when you need a custom system/service-manager
|
|
70
|
+
setup. The full service guidance lives in the [Gateway runbook](/gateway).
|
|
71
|
+
|
|
72
|
+
Minimal setup:
|
|
73
|
+
|
|
74
|
+
Create `~/.config/systemd/user/nodmix-gateway[-<profile>].service`:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
[Unit]
|
|
78
|
+
Description=Nodmix Gateway (profile: <profile>, v<version>)
|
|
79
|
+
After=network-online.target
|
|
80
|
+
Wants=network-online.target
|
|
81
|
+
|
|
82
|
+
[Service]
|
|
83
|
+
ExecStart=/usr/local/bin/nodmix gateway --port 18789
|
|
84
|
+
Restart=always
|
|
85
|
+
RestartSec=5
|
|
86
|
+
TimeoutStopSec=30
|
|
87
|
+
TimeoutStartSec=30
|
|
88
|
+
SuccessExitStatus=0 143
|
|
89
|
+
KillMode=control-group
|
|
90
|
+
|
|
91
|
+
[Install]
|
|
92
|
+
WantedBy=default.target
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Enable it:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
systemctl --user enable --now nodmix-gateway[-<profile>].service
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Memory pressure and OOM kills
|
|
102
|
+
|
|
103
|
+
On Linux, the kernel chooses an OOM victim when a host, VM, or container cgroup
|
|
104
|
+
runs out of memory. The Gateway can be a poor victim because it owns long-lived
|
|
105
|
+
sessions and channel connections. Nodmix therefore biases transient child
|
|
106
|
+
processes to be killed before the Gateway when possible.
|
|
107
|
+
|
|
108
|
+
For eligible Linux child spawns, Nodmix starts the child through a short
|
|
109
|
+
`/bin/sh` wrapper that raises the child's own `oom_score_adj` to `1000`, then
|
|
110
|
+
`exec`s the real command. This is an unprivileged operation because the child is
|
|
111
|
+
only increasing its own OOM kill likelihood.
|
|
112
|
+
|
|
113
|
+
Covered child process surfaces include:
|
|
114
|
+
|
|
115
|
+
- supervisor-managed command children,
|
|
116
|
+
- PTY shell children,
|
|
117
|
+
- MCP stdio server children,
|
|
118
|
+
- Nodmix-launched browser/Chrome processes.
|
|
119
|
+
|
|
120
|
+
The wrapper is Linux-only and is skipped when `/bin/sh` is unavailable. It is
|
|
121
|
+
also skipped if the child env sets `NODMIX_CHILD_OOM_SCORE_ADJ=0`, `false`,
|
|
122
|
+
`no`, or `off`.
|
|
123
|
+
|
|
124
|
+
To verify a child process:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
cat /proc/<child-pid>/oom_score_adj
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Expected value for covered children is `1000`. The Gateway process should keep
|
|
131
|
+
its normal score, usually `0`.
|
|
132
|
+
|
|
133
|
+
This does not replace normal memory tuning. If a VPS or container repeatedly
|
|
134
|
+
kills children, increase the memory limit, reduce concurrency, or add stronger
|
|
135
|
+
resource controls such as systemd `MemoryMax=` or container-level memory limits.
|
|
136
|
+
|
|
137
|
+
## Related
|
|
138
|
+
|
|
139
|
+
- [Install overview](/install)
|
|
140
|
+
- [Linux server](/vps)
|
|
141
|
+
- [Raspberry Pi](/platforms/raspberry-pi)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway runtime on macOS (external launchd service)"
|
|
3
|
+
read_when:
|
|
4
|
+
- Packaging Nodmix.app
|
|
5
|
+
- Debugging the macOS gateway launchd service
|
|
6
|
+
- Installing the gateway CLI for macOS
|
|
7
|
+
title: "Gateway on macOS"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Nodmix.app no longer bundles Node/Bun or the Gateway runtime. The macOS app
|
|
11
|
+
expects an **external** `nodmix` CLI install, does not spawn the Gateway as a
|
|
12
|
+
child process, and manages a per-user launchd service to keep the Gateway
|
|
13
|
+
running (or attaches to an existing local Gateway if one is already running).
|
|
14
|
+
|
|
15
|
+
## Install the CLI (required for local mode)
|
|
16
|
+
|
|
17
|
+
Node 24 is the default runtime on the Mac. Node 22 LTS, currently `22.19+`, still works for compatibility. Then install `nodmix` globally:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g nodmix@<version>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The macOS app's **Install CLI** button runs the same global install flow the app
|
|
24
|
+
uses internally: it prefers npm first, then pnpm, then bun if that is the only
|
|
25
|
+
detected package manager. Node remains the recommended Gateway runtime.
|
|
26
|
+
|
|
27
|
+
## Launchd (Gateway as LaunchAgent)
|
|
28
|
+
|
|
29
|
+
Label:
|
|
30
|
+
|
|
31
|
+
- `ai.nodmix.gateway` (or `ai.nodmix.<profile>`; legacy `com.nodmix.*` may remain)
|
|
32
|
+
|
|
33
|
+
Plist location (per-user):
|
|
34
|
+
|
|
35
|
+
- `~/Library/LaunchAgents/ai.nodmix.gateway.plist`
|
|
36
|
+
(or `~/Library/LaunchAgents/ai.nodmix.<profile>.plist`)
|
|
37
|
+
|
|
38
|
+
Manager:
|
|
39
|
+
|
|
40
|
+
- The macOS app owns LaunchAgent install/update in Local mode.
|
|
41
|
+
- The CLI can also install it: `nodmix gateway install`.
|
|
42
|
+
|
|
43
|
+
Behavior:
|
|
44
|
+
|
|
45
|
+
- "Nodmix Active" enables/disables the LaunchAgent.
|
|
46
|
+
- App quit does **not** stop the gateway (launchd keeps it alive).
|
|
47
|
+
- If a Gateway is already running on the configured port, the app attaches to
|
|
48
|
+
it instead of starting a new one.
|
|
49
|
+
|
|
50
|
+
Logging:
|
|
51
|
+
|
|
52
|
+
- launchd stdout: `~/Library/Logs/nodmix/gateway.log` (profiles use `gateway-<profile>.log`)
|
|
53
|
+
- launchd stderr: suppressed
|
|
54
|
+
|
|
55
|
+
## Version compatibility
|
|
56
|
+
|
|
57
|
+
The macOS app checks the gateway version against its own version. If they're
|
|
58
|
+
incompatible, update the global CLI to match the app version.
|
|
59
|
+
|
|
60
|
+
## Smoke check
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
nodmix --version
|
|
64
|
+
|
|
65
|
+
NODMIX_SKIP_CHANNELS=1 \
|
|
66
|
+
NODMIX_SKIP_CANVAS_HOST=1 \
|
|
67
|
+
nodmix gateway --port 18999 --bind loopback
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Then:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
nodmix gateway call health --url ws://127.0.0.1:18999 --timeout 3000
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Related
|
|
77
|
+
|
|
78
|
+
- [macOS app](/platforms/macos)
|
|
79
|
+
- [Gateway runbook](/gateway)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Agent-controlled Canvas panel embedded via WKWebView + custom URL scheme"
|
|
3
|
+
read_when:
|
|
4
|
+
- Implementing the macOS Canvas panel
|
|
5
|
+
- Adding agent controls for visual workspace
|
|
6
|
+
- Debugging WKWebView canvas loads
|
|
7
|
+
title: "Canvas"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
The macOS app embeds an agent-controlled **Canvas panel** using `WKWebView`. It
|
|
11
|
+
is a lightweight visual workspace for HTML/CSS/JS, A2UI, and small interactive
|
|
12
|
+
UI surfaces.
|
|
13
|
+
|
|
14
|
+
## Where Canvas lives
|
|
15
|
+
|
|
16
|
+
Canvas state is stored under Application Support:
|
|
17
|
+
|
|
18
|
+
- `~/Library/Application Support/Nodmix/canvas/<session>/...`
|
|
19
|
+
|
|
20
|
+
The Canvas panel serves those files via a **custom URL scheme**:
|
|
21
|
+
|
|
22
|
+
- `nodmix-canvas://<session>/<path>`
|
|
23
|
+
|
|
24
|
+
Examples:
|
|
25
|
+
|
|
26
|
+
- `nodmix-canvas://main/` → `<canvasRoot>/main/index.html`
|
|
27
|
+
- `nodmix-canvas://main/assets/app.css` → `<canvasRoot>/main/assets/app.css`
|
|
28
|
+
- `nodmix-canvas://main/widgets/todo/` → `<canvasRoot>/main/widgets/todo/index.html`
|
|
29
|
+
|
|
30
|
+
If no `index.html` exists at the root, the app shows a **built-in scaffold page**.
|
|
31
|
+
|
|
32
|
+
## Panel behavior
|
|
33
|
+
|
|
34
|
+
- Borderless, resizable panel anchored near the menu bar (or mouse cursor).
|
|
35
|
+
- Remembers size/position per session.
|
|
36
|
+
- Auto-reloads when local canvas files change.
|
|
37
|
+
- Only one Canvas panel is visible at a time (session is switched as needed).
|
|
38
|
+
|
|
39
|
+
Canvas can be disabled from Settings → **Allow Canvas**. When disabled, canvas
|
|
40
|
+
node commands return `CANVAS_DISABLED`.
|
|
41
|
+
|
|
42
|
+
## Agent API surface
|
|
43
|
+
|
|
44
|
+
Canvas is exposed via the **Gateway WebSocket**, so the agent can:
|
|
45
|
+
|
|
46
|
+
- show/hide the panel
|
|
47
|
+
- navigate to a path or URL
|
|
48
|
+
- evaluate JavaScript
|
|
49
|
+
- capture a snapshot image
|
|
50
|
+
|
|
51
|
+
CLI examples:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
nodmix nodes canvas present --node <id>
|
|
55
|
+
nodmix nodes canvas navigate --node <id> --url "/"
|
|
56
|
+
nodmix nodes canvas eval --node <id> --js "document.title"
|
|
57
|
+
nodmix nodes canvas snapshot --node <id>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Notes:
|
|
61
|
+
|
|
62
|
+
- `canvas.navigate` accepts **local canvas paths**, `http(s)` URLs, and `file://` URLs.
|
|
63
|
+
- If you pass `"/"`, the Canvas shows the local scaffold or `index.html`.
|
|
64
|
+
|
|
65
|
+
## A2UI in Canvas
|
|
66
|
+
|
|
67
|
+
A2UI is hosted by the Gateway canvas host and rendered inside the Canvas panel.
|
|
68
|
+
When the Gateway advertises a Canvas host, the macOS app auto-navigates to the
|
|
69
|
+
A2UI host page on first open.
|
|
70
|
+
|
|
71
|
+
Default A2UI host URL:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
http://<gateway-host>:18789/__nodmix__/a2ui/
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### A2UI commands (v0.8)
|
|
78
|
+
|
|
79
|
+
Canvas currently accepts **A2UI v0.8** server→client messages:
|
|
80
|
+
|
|
81
|
+
- `beginRendering`
|
|
82
|
+
- `surfaceUpdate`
|
|
83
|
+
- `dataModelUpdate`
|
|
84
|
+
- `deleteSurface`
|
|
85
|
+
|
|
86
|
+
`createSurface` (v0.9) is not supported.
|
|
87
|
+
|
|
88
|
+
CLI example:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
cat > /tmp/a2ui-v0.8.jsonl <<'EOFA2'
|
|
92
|
+
{"surfaceUpdate":{"surfaceId":"main","components":[{"id":"root","component":{"Column":{"children":{"explicitList":["title","content"]}}}},{"id":"title","component":{"Text":{"text":{"literalString":"Canvas (A2UI v0.8)"},"usageHint":"h1"}}},{"id":"content","component":{"Text":{"text":{"literalString":"If you can read this, A2UI push works."},"usageHint":"body"}}}]}}
|
|
93
|
+
{"beginRendering":{"surfaceId":"main","root":"root"}}
|
|
94
|
+
EOFA2
|
|
95
|
+
|
|
96
|
+
nodmix nodes canvas a2ui push --jsonl /tmp/a2ui-v0.8.jsonl --node <id>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Quick smoke:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
nodmix nodes canvas a2ui push --node <id> --text "Hello from A2UI"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Triggering agent runs from Canvas
|
|
106
|
+
|
|
107
|
+
Canvas can trigger new agent runs via deep links:
|
|
108
|
+
|
|
109
|
+
- `nodmix://agent?...`
|
|
110
|
+
|
|
111
|
+
Example (in JS):
|
|
112
|
+
|
|
113
|
+
```js
|
|
114
|
+
window.location.href = "nodmix://agent?message=Review%20this%20design";
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The app prompts for confirmation unless a valid key is provided.
|
|
118
|
+
|
|
119
|
+
## Security notes
|
|
120
|
+
|
|
121
|
+
- Canvas scheme blocks directory traversal; files must live under the session root.
|
|
122
|
+
- Local Canvas content uses a custom scheme (no loopback server required).
|
|
123
|
+
- External `http(s)` URLs are allowed only when explicitly navigated.
|
|
124
|
+
|
|
125
|
+
## Related
|
|
126
|
+
|
|
127
|
+
- [macOS app](/platforms/macos)
|
|
128
|
+
- [WebChat](/web/webchat)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Gateway lifecycle on macOS (launchd)"
|
|
3
|
+
read_when:
|
|
4
|
+
- Integrating the mac app with the gateway lifecycle
|
|
5
|
+
title: "Gateway lifecycle on macOS"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
The macOS app **manages the Gateway via launchd** by default and does not spawn
|
|
9
|
+
the Gateway as a child process. It first tries to attach to an already-running
|
|
10
|
+
Gateway on the configured port; if none is reachable, it enables the launchd
|
|
11
|
+
service via the external `nodmix` CLI (no embedded runtime). This gives you
|
|
12
|
+
reliable auto-start at login and restart on crashes.
|
|
13
|
+
|
|
14
|
+
Child-process mode (Gateway spawned directly by the app) is **not in use** today.
|
|
15
|
+
If you need tighter coupling to the UI, run the Gateway manually in a terminal.
|
|
16
|
+
|
|
17
|
+
## Default behavior (launchd)
|
|
18
|
+
|
|
19
|
+
- The app installs a per-user LaunchAgent labeled `ai.nodmix.gateway`
|
|
20
|
+
(or `ai.nodmix.<profile>` when using `--profile`/`NODMIX_PROFILE`; legacy `com.nodmix.*` is supported).
|
|
21
|
+
- When Local mode is enabled, the app ensures the LaunchAgent is loaded and
|
|
22
|
+
starts the Gateway if needed.
|
|
23
|
+
- Logs are written to the launchd gateway log path (visible in Debug Settings).
|
|
24
|
+
|
|
25
|
+
Common commands:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
launchctl kickstart -k gui/$UID/ai.nodmix.gateway
|
|
29
|
+
launchctl bootout gui/$UID/ai.nodmix.gateway
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Replace the label with `ai.nodmix.<profile>` when running a named profile.
|
|
33
|
+
|
|
34
|
+
## Unsigned dev builds
|
|
35
|
+
|
|
36
|
+
`scripts/restart-mac.sh --no-sign` is for fast local builds when you don't have
|
|
37
|
+
signing keys. To prevent launchd from pointing at an unsigned relay binary, it:
|
|
38
|
+
|
|
39
|
+
- Writes `~/.nodmix/disable-launchagent`.
|
|
40
|
+
|
|
41
|
+
Signed runs of `scripts/restart-mac.sh` clear this override if the marker is
|
|
42
|
+
present. To reset manually:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
rm ~/.nodmix/disable-launchagent
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Attach-only mode
|
|
49
|
+
|
|
50
|
+
To force the macOS app to **never install or manage launchd**, launch it with
|
|
51
|
+
`--attach-only` (or `--no-launchd`). This sets `~/.nodmix/disable-launchagent`,
|
|
52
|
+
so the app only attaches to an already running Gateway. You can toggle the same
|
|
53
|
+
behavior in Debug Settings.
|
|
54
|
+
|
|
55
|
+
## Remote mode
|
|
56
|
+
|
|
57
|
+
Remote mode never starts a local Gateway. The app uses an SSH tunnel to the
|
|
58
|
+
remote host and connects over that tunnel.
|
|
59
|
+
|
|
60
|
+
## Why we prefer launchd
|
|
61
|
+
|
|
62
|
+
- Auto-start at login.
|
|
63
|
+
- Built-in restart/KeepAlive semantics.
|
|
64
|
+
- Predictable logs and supervision.
|
|
65
|
+
|
|
66
|
+
If a true child-process mode is ever needed again, it should be documented as a
|
|
67
|
+
separate, explicit dev-only mode.
|
|
68
|
+
|
|
69
|
+
## Related
|
|
70
|
+
|
|
71
|
+
- [macOS app](/platforms/macos)
|
|
72
|
+
- [Gateway runbook](/gateway)
|